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('我是被装饰的句子')
>>>使用这几个字装饰 ('我是被装饰的句子',) {}