生成器
这个老师的课
这个老师的网页
获取系列有规律但是个数不确定的数据
使用迭代器的时候可以使用一个不会产生异常的迭代器, 实际记录的是生成的数据的方式, 不是实际的数据
使用迭代器的时候这一个规则的改变不方便, 需要加一个专门的方法
还有就是如果需要大量的数据, 而实际使用的时候只用其中一部分, 会浪费大量的空间
生成器是一个记录生成数据的方式, 而不是实际的数据的方式, 实际是一个特殊的迭代器
实际定义
方法一
只需要把一个列表的生成[]
改为()
nums = [x for x in range(5)]
nums2 = (x for x in range(5))
print(type(nums))
print(type(nums2))
print(nums)
print(nums2)
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py" <class 'list'> <class 'generator'> [0, 1, 2, 3, 4] <generator object <genexpr> at 0x000002431C7B2110>
方法二
有时候这一个推导比较复杂, 不能使用for循环实现
这时候可以使用一个函数生成一个生成器
这一个函数返回的时候使用的不是return, 而是使用yeild, 下一次调用的时候会从yeild返回的位置
def fib_generator():
num1 = 1
num2 = 1
while True:
temp_num = num1
num1, num2 = num2, num1 + num2
yield temp_num
这个代码块的返回值是一个生成器, 这一个生成器第一次执行会从def开始直到yield, 调用next的时候会返回yield后面的数值
fib = fib_generator() print(fib) print(next(fib)) print(next(fib)) print(next(fib)) print(next(fib)) print(next(fib))
<generator object fib_generator at 0x000002342F7D2110> 1 1 2 3 5
这一个迭代器执行结束的时候会产生一个异常StopIteration, 如果是使用一个return, 返回的值会成为这一个异常的参数, 可以使用try语句进行捕获
def fib_generator():
num1 = 1
num2 = 2
temp_num = num1
num1, num2 = num2, num1 + num2
yield temp_num
temp_num = num1
num1, num2 = num2, num1 + num2
yield temp_num
temp_num = num1
num1, num2 = num2, num1 + num2
yield temp_num
return "结束了!!!"
fib = fib_generator()
print(next(fib))
print(next(fib))
print(next(fib))
try:
print(next(fib))
except StopIteration as ret:
print(ret.value)
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py" 1 2 3 结束了!!!
send唤醒
除了使用next还可以使用send发送一个数据给迭代器
def fib_generator():
num1 = 1
num2 = 2
temp_num = num1
num1, num2 = num2, num1 + num2
num = yield temp_num
print("get ", num)
temp_num = num1
num1, num2 = num2, num1 + num2
num = yield temp_num
print("get ", num)
temp_num = num1
num1, num2 = num2, num1 + num2
num = yield temp_num
print("get ", num)
return "结束了!!!"
fib = fib_generator()
print(fib.send(None))
print(fib.send(2))
print(fib.send(3))
try:
print(fib.send(4))
except StopIteration as ret:
print(ret.value)
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py" 1 get 2 2 get 3 3 get 4 结束了!!!