Python_生成器和迭代器
# 生成器
生成器可以节省内存!
# 得到生成器的方式
# 通过列表推导式得到
用小括号括起来得到生成器
g = (x*3 for x in range(100))
print(type(g))
>> <class 'generator'>
# 借助函数得到
- 函数中使用
yield
关键字得到生成器,通过return
返回报错内容
举例生成斐波那契数列并演示报错提示
def fib(length):
a, b = 0, 1
n = 0
while n < length:
yield a
a, b = b, a+b
n += 1
return "没有更多的元素!"
g = fib(10)
for i in range(11):
print(g.__next__())
>> 0
1
1
2
3
5
8
13
21
34
Traceback (most recent call last):
File "E:/Desktop/python/pythonpractice/Generator.py", line 14, in <module>
print(g.__next__())
StopIteration: 没有更多的元素!
# 得到元素的方法
# .__next__()
g = (x*3 for x in range(100))
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
>> 0
3
6
9
# next(generator)
函数
g = (x*3 for x in range(100))
print(g.__next__())
print(next(g))
>> 0
3
# .send(value)
- 第一次必须发送
None
.send(value)
向每次生成器调用中传值
def gen():
i = 0
while i < 5:
temp = yield i
print('temp:',temp)
i += 1
return "没有更多的数据"
g = gen()
print(g.send(None))
print(g.send('嘻嘻'))
print(g.send('哈哈'))
>> 0
temp: 嘻嘻
1
temp: 哈哈
2
# 应用
携程
# 迭代器
- 可以被
next()
函数调用并不断返回下一个值的对象成为迭代器:Iterator - 可迭代的 不一定 就是迭代器(e.g. list是可迭代,但不是迭代器)
- 可以使用
iter()
将可迭代类型转换为迭代器 - 生成器属于迭代器的一种
编辑 (opens new window)
上次更新: 2023/08/09, 13:21:24