Main
Main
文章目录
  1. 1.动态创建类
  2. 2.’_ slots _’
  3. 3.生成器-generator
  4. 4.迭代器
  5. 5.闭包
  6. 6.装饰器

Python3笔记-高级

1.动态创建类

使用type动态创建类, 语法

1
type(类名, (父类名称,), {属性})

  • 定义一个Test类
    1
    2
    3
    4
    5
    #定义一个Test类
    class Test():
    pass
    #使用type
    Test = type('Test', (), {})
  • 创建一个带有属性的类
    1
    2
    3
    4
    5
    Test = type('Test', (), {'name':'peiqi'})

    #翻译为
    class Test(object):
    name='peiqi'
  • 创建带有方法的类
    1
    2
    3
    4
    5
    6
    #首先定义一个方法
    def say():
    print('hello python')

    #然后跟定义属性一样的方式
    Test = type('Test', (), {'say':say})

2.’_ slots _’

限制动态给类添加属性。仅对当前实例起作用,对继承的子类不起作用

1
2
class person(object):
__slots__ = ('name', 'age') #只允许对person实例添加name, age属性。

3.生成器-generator

一边循环一遍计算的机制.
特点:
01.节约内存
02.迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的

  • 创建方法1
    1
    2
    3
    4
    5
    6
    g1 = (x for x in range(100)) #注意与列表的区别。列表是使用[],而这是使用()
    #使用next或者for循环输出
    next(g1) #next() 函数获得生成器的下一个返回值。当生成器没有更多的元素时,会抛出StopIteration异常

    for x in g1:
    print(x)
  • 创建方法2–函数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #以斐波拉契数列(Fibonacci)为例。除第一个和第二个数外,任意一个数都可由前两个数相加得到
    #1, 1, 2, 3, 5, 8, 13, 21, 34, ...

    #要把函数变成生成器。只需要把print(b) 改为 yield b 即可
    def fib(times):
    s = 0,
    a,b = 0, 1
    while s < times:
    print(b) #yield b
    a, b = b, a+b
    s = s+1
    return 'None'

生成器都是Iterator对象,但list\ dict\ str虽然是Iterable,却不是Iterator.
把 list、dict、str 等 Iterable 变成 Iterator 可以使用 iter() 函数

4.迭代器

可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)。

可迭代对象

1
2
#一类是集合数据类型,如 list\tuple\dict\set\str
#一类是generator,包括生成器和带yield的generator function

可以使用isinstance()判断一个对象是否是Iterable对象

1
2
3
4
5
6
7
from collections import Iterable

isinstance([], Iterable)
True

isinstance('abc', Iterable)
True

凡是可作用于for循环的对象都是Iterable类型
凡是可作用于next()函数的对象都是Iterator类型
集合数据类型如list、dict、str等都是Iterable但不是 Iterator, 可以通过iter()函数获得一个Iterator对象

5.闭包

函数内部函数对外部函数变量的引用(非全局变量),则称内部函数和这个变量为闭包。

1
2
3
4
5
6
7
def sum(number1):
def sum2(number2):
return number1 + number2
return sum2

res = sum(100) #100 传递给number1
print(res(10)) #10 传递给number2

6.装饰器

可以在不改变原函数的基础上对函数进行扩展。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#(闭包)
def log(func):
def wapper():
print('heiheihei')
func()
return wapper

@log
def cat():
print("猫吃鱼")

#打印结果:
#heiheihei
#猫吃鱼

  • 无参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def log(func):
    def wapper():
    print('...')
    func()
    return wapper

    @log
    def say():
    print('hello python')
  • 有参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    def log(func):
    def wapper(text):
    print('do something ...')
    func(text)
    return wapper

    @log
    def say(text):
    print(text)
  • 不定长参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def log(func):
    def wapper(*args, **kwargs):
    print('do something...')
    func(args, kwargs)
    return wapper

    @log
    def say(*args, **kwargs):
    print('do something..')
  • 装饰器带参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def log_args(name='log'):
    def log(func):
    def wapper(*args, **kwargs):
    print('do something...')
    func(args, kwargs)
    return wapper

    @log('say')
    def say(*args, **kwargs):
    print('do something..')
支持一下
  • 微信扫一扫
  • 支付宝扫一扫