迭代器
- 可迭代(Iterable):直接作用于for循环的变量
- 迭代器(Iterator):不但可以作用于for循环,还可以被next调用
- list是典型的可迭代对象,但不是迭代器
- 通过isinstance判断是否为迭代器或者是否可迭代。
- iterable和iterator可以转换
- 通过iter函数
# 可迭代
l = [ i for i in range(10)]
# l是可迭代的,但不是迭代器
for idx in l:
print(idx)
# range是个迭代器
for i in range(5):
print(i)
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
# isinstance案例
# 判断某个变量是否是一个实例
# 判断是否可迭代
from collections import Iterable
ll = [1,2,3,4,5]
print(isinstance(ll, Iterable))
from collections import Iterator
print(isinstance(ll, Iterator))
True
False
# iter函数
s = 'i love wangxiaojing'
print(isinstance(s, Iterable))
print(isinstance(s, Iterator))
s_iter = iter(s)
print(isinstance(s_iter, Iterable))
print(isinstance(s_iter, Iterator))
True
False
True
True
生成器
- generator: 一边循环一边计算下一个元素的机制/算法
- 需要满足三个条件:
- 每次调用都生产出for循环需要的下一个元素或者
- 如果达到最后一个后,爆出StopIteration异常
- 可以被next函数调用
- 如何生成一个生成器
- 直接使用
- 如果函数中包含yield,则这个函数就叫生成器
- next调用函数,遇到yield返回
# 直接使用生成器
L = [x*x for x in range(5)] # 放在中括号中是列表生成器
g = (x*x for x in range(5))# 放在小括号中就是生成器
print(type(L))
print(type(g))
<class 'list'>
<class 'generator'>
# 函数案例
def odd():
print("Step 1")
print("Step 2")
print("Step 3")
return None
odd()
Step 1
Step 2
Step 3
# 生成器的案例
# 在函数odd中,yield负责返回
def odd():
print("Step 1")
yield 1
print("Step 2")
yield 2
print("Step 3")
yield 3
# odd() 是调用生成器
g = odd()
one = next(g)
print(one)
two = next(g)
print(two)
three = next(g)
print(three)
Step 1
1
Step 2
2
Step 3
3
上述代码执行过程如下图所示:
斐波那契数列示例:
# for循环调用生成器
def fib(max):
n, a, b = 0, 0, 1 # 注意写法
while n < max:
print(b)
a,b = b, a+b # 注意写法
n += 1
return 'Done'
fib(5)
1
1
2
3
5
'Done'
# 斐波那契额数列的生成器写法
def fib(max):
n, a, b = 0, 0, 1 # 注意写法
while n < max:
yield b
a,b = b, a+b # 注意写法
n += 1
#需要注意,爆出异常是的返回值是return的返回值
return 'Done'
g = fib(5)
for i in range(6):
rst = next(g)
print(rst)
1
1
2
3
5
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-19-51ae2dbd94ff> in <module>()
12
13 for i in range(6):
---> 14 rst = next(g)
15 print(rst)
StopIteration: Done
ge = fib(10)
'''
生成器的典型用法是在for中使用
比较常用的典型生成器就是range
'''
for i in ge: #在for循环中使用生成器
print(i)
1
1
2
3
5
8
13
21
34
55
关于迭代器和生成器也是较为常用的,需要掌握和区分好程序运行时的流程。