美文网首页
生成器、闭包以及迭代器

生成器、闭包以及迭代器

作者: YU不忘初心 | 来源:发表于2018-07-01 21:18 被阅读0次

生成器

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

相关文章

网友评论

      本文标题:生成器、闭包以及迭代器

      本文链接:https://www.haomeiwen.com/subject/gtrhuftx.html