python-高级编程(迭代器 生成器 装饰器 语法糖)

python迭代器与生成器

关于迭代器,也就是可迭代的对象
通常构造的迭代语句是for,例如

for i in range(1,11):
    print(i)

这里的range(1,11)可以看成一个迭代器,一个可供迭代的容器
关于迭代器python 有两个内置函数

iter()  和  next()

对一个可迭代的容器调用iter()就可以得到一个迭代器
注意(字典 ,字符串,元组,列表)都是可迭代的容器

list=[1,2,3,4,5]
t=iter(list)
print(next(t))

这里面的t就是一个迭代器对象
对于迭代器对象,可以使用for或者while配合next()遍历

a='srting'
t=iter(a)
try:
    while True:
        print(next(t))
except:
    pass

关于生成器
在python中使用了yield的函数都叫生成器
最著名的斐波拉契数列可以很好的解释,看代码

斐波拉契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…
这个数列从第3项开始,每一项都等于前两项之和

import sys
def feibolaqi(n):
    a,b,counter=0,1,0        #counter 变量用于控制数列的大小不超过n
    while True:
        if(counter > n):     #如果counter 大于 所给的n值,直接return 不再循环
            return 
        yield a              #yield 返回a的值,并回调函数继续执行 
        a,b=b,a+b            #a=b b=a+b
        counter+=1
        
f=feibolaqi(10)     #生成10个数,执行完成后生成了一个迭代器 f
while True:
    try:
        print(next(f),end=' ')
    except:
        sys.exit()

通过上面的脚本可以清楚的看到yield的作用,以及它和return的不同

python装饰器 语法糖

装饰器是python中一个特有的变动,它可是使得函数的修改变得比较容易和清晰
在此之前你要明白内部函数,闭包的概念

内部函数也叫内嵌函数,说明白点就是函数的嵌套,像这样

def fun1(x):
    def fun2(y):
        print(x*y)

>fun1(2)(2)
>4

func2就叫做内部函数

那么闭包的概念是 在内部函数里对外部变量进行引用,这样一个内部函数就被
称为是闭包

很明显,在fun2()中用到了fun1()中的x变量

所以我们认为fun2是一个闭包

下面我们来创造一个装饰器:

def logger(func):   #可以接受被装饰函数
    def addinfor(*args,**kwargs):
        print("使用这几个字装饰 %s %s" % (args,kwargs))
        return func(*args,**kwargs)
    return addinfor

上面已经构造了一个名为 logger 的装饰器(函数)

它的主要装饰目的是将 被装饰函数传递过来的各自变量 加上 "使用这几个字装饰“ 这几个字 成为一个新的字符串

下面构造一个被装饰的函数

def test(strings):
    return string

test('我是被装饰的句子')

好了,那么如何 让 test函数 被logger 装饰?
可以 生成一个装饰版本的函数,如下

def logger(func):   #可以接受被装饰函数
    def addinfor(*args,**kwargs):
        print("使用这几个字装饰 %s %s" % (args,kwargs))
        return func(*args,**kwargs)
    return addinfor

def test(strings):
    return strings
    
>>>使用这几个字装饰 ('我是被装饰的句子',) {}

还可以使用语法糖

def logger(func):   #可以接受被装饰函数
    def addinfor(*args,**kwargs):
        print("使用这几个字装饰 %s %s" % (args,kwargs))
        return func(*args,**kwargs)
    return addinfor

@logger      #@ + 装饰器函数
def test(strings):
    return strings

test('我是被装饰的句子')

>>>使用这几个字装饰 ('我是被装饰的句子',) {}

猜你喜欢

转载自blog.csdn.net/wszsdsd/article/details/84502623
今日推荐