遍历
普通的 for 循环
1 | >>>i = 0 |
for 循环使用 enumerate
1 | >>>seq = ['one', 'two', 'three'] |
for 循环使用 range
range() 创建一个整数列表
1 | for i in range(5): |
迭代器
迭代就是遍历,一个实现了__iter__方法和__next__方法的对象,就是迭代器。
1 | 手写一个迭代器: __init__初始化变量; __next__处理变量; __iter__返回self |
生成器
利用迭代器,我们可以在每次迭代获取数据(通过 next()方法)时按照特定的规律进行生成。但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。为了达到记录当前状态,并配合 next()函数进行迭代使用,我们可以采用更简便的语法,即生成器(generator)。生成器是一类特殊的迭代器。
创建生成器 1
要创建一个生成器, 方法有很多, 第一种方法很简单, 只要把列表的[]改成()就可以了
1 | L = [x*2 for x in range(5)] |
创建生成器 2
简单的来说, 只要在 def 中有 yield 关键字的就称为生成器
函数会保存 yield 标记的变量, next()唤醒生成器, 获取到 yield 标记的变量
除了 next(), 还可以使用 send()唤醒, send()相比 next()的优势是可以传参, next()等价于 send(None)
但是第一次唤醒只能是 next()或者 send(None), 不能传一个非 none 值给一个未启动的生成器, 这点区别于 PHP
当执行 next()时,第 1 个 yield 到第二个 yield 之间的的语法被执行。然后返回第二个 yield 标记的值