生成器
1.什么是生成器
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
print(L) #[0, 2, 4, 6, 8]
G = ( x*2 for x in range(5)) # 得到一个 生成器
print(G) # <generator object <genexpr> at 0x023FEF30>
# 生成器 的遍历 next(G)
print(next(G)) # 0
print(next(G)) # 2
print(next(G)) # 4
print(next(G)) # 6
print(next(G)) # 8
print(next(G)) # StopIteration Error
2.创建生成器方法
n = 0
a,b = 0,1
while n<times:
print(b)
a,b = b, a+b
n += 1
return 'done'
fib(10)
# 1 1 2 3 5 8 13 21 34 55
yield 的作用就是把一个函数变成一个 generator;
当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成
在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。
yield 生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()才开始执行
(在 for 循环中会自动调用 next())
每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行
闭包
1.函数引用
def test1():
print("--- in test1 func----")
test1() # 调用函数
ret = test1 # 引用函数
print('test1 id = %s' % id(test1))
print('ret id = %s' % id(ret))
ret() # #通过引用调用函数
迭代器
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用 isinstance() 判断一个对象是否是 Iterator(迭代器) 对象:
In [56]: from collections import Iterator
In [57]: isinstance((x for x in range(10)), Iterator)
Out[57]: True
In [58]: isinstance([], Iterator)
Out[58]: False
In [59]: isinstance({}, Iterator)
Out[59]: False
In [60]: isinstance('abc', Iterator)
Out[60]: False
In [61]: isinstance(100, Iterator)
Out[61]: False
网友评论