迭代器
- 迭代器可以记住遍历位置的对象
- list、tuple、dict都只是可以迭代的对象,不是迭代器,所以要创建一个迭代器
- 迭代器的俩个基本方法 iter() 和 next()
- iter() 用于创建一个迭代器、next() 输出当前位置的对象,只能往前不能后退
- 从一个简单的例子开始,list 输出前俩个元素
#!/usr/bin/python3
num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(num) #创建迭代器
print(next(it))
print(next(it))
#输出结果
1
2
- 如何用于for循环呢
#!/usr/bin/python3
num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(num)
for x in it:
print(x)
#输出结果
1
2
3
4
5
6
7
8
9
- 使用next()方法来遍历呢
- next()遍历到最后的时候会抛出StopIteration异常,捕获然后跳出循环
#!/usr/bin/python3
num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(num)
while True:
try:
print(next(it))
except StopIteration:
break
#输出结果 同上
生成器
- 生成器是迭代器的一种
- 使用yield函数 就像单步调试一样记住当前执行的位置,使用next()之后会从原来的位置继续执行。
- 先来个简单的例子看下怎么使用
#!/usr/bin/python3
def foo():
while True:
yield 4
print('end....')
f = foo()
print(next(f))
print('中间')
print(next(f))
#输出结果
4
中间
end....
4
- 使用def 定一个了一个函数foo,单独看这个函数while循环一直是true,这里先把yield 看成return返回4
- f = foo() 将函数赋值给了f
- 执行print(next(f)) 会先输出4
- 由于使用了yield 所以函数不会继续执行
- 那就执行print('中间') 输出了 ‘中间’
- print(next(f)) 这次再次执行会在原来的执行位置继续执行 print('end....')
- 最后while继续执行输出 4
总结一下:其实从例子完全可以看出, yield会返回一个结果,并且记住当前执行的位置,通过使用next() 会在原来执行的位置继续执行程序。
来一个稍微复杂点的,使用生成器实现斐波那契数列
#!/usr/bin/python3
def foo(n):
a, b, item = 0, 1, 1
while True:
if(item > n):
return
yield b
a, b = b, a+b
item+=1
f = foo(10)
while True:
try:
print(next(f))
except StopIteration:
print('end...')
break
#输出结果
1
1
2
3
5
8
13
21
34
55
end...