生成器
生成器:是一种特殊的迭代器,迭代器不一定是生成器,生成器一定是迭代器
【1】生成器创建方式
# 创建方式一
# (1)列表生成式:列表
num_list = ([i for i in range(10)])
print(num_list,type(num_list)) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
# (2)元组生成式:生成器
num_tuple = (i**2 for i in range(10))
print(num_tuple,type(num_tuple))
#查看元组生成器里面的数据: 类型强转
print(list(num_tuple)) #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 生成器也能用 __next__()方法,因为生成器是一种特殊的迭代器
print(num_tuple.__next__())
【2】yield关键字
-
使用yield关键字定义一个生成器函数时,生成器函数中的yield语句会暂停函数执行并返回一个值,下一次调用该函数时会继续执行并返回下一个值。
def my_generator(): yield 1 yield 2 yield 3 my_generator = my_generator() print(next(my_generator)) print(next(my_generator)) print(next(my_generator))
-
向yield传值的前提 必须卡在使用这个值的前面的yield上面
def chifan():
print('开始吃饭了')
while True:
food = yield
print(f'得到的食物是 :>>>{food},开始吃饭:>>> {food}')
my_chifan = chifan()
print(next(my_chifan))
print(my_chifan.send('水煮鱼'))#send方法只能传一个位置参数,不能传两个,如果想传多个,可以考虑可变数据类型:字典/列表/元组/集合
【3】用生成器实现for循环
def my_range_one(start, end, step=1):
if end < start:
print(f'开始值不能大于结束值!')
while start < end:
yield start
start += step
my_range = my_range_one(start=1, end=10, step=1)
print(next(my_range))
print(next(my_range))
print(next(my_range))
for i in my_range_one(start=1, end=10, step=1):
print(i)
def my_range(start, stop, step=1):
print('start...')
while start < stop:
yield start
start += step
print('end...')
标签:生成器,yield,start,range,print,my
From: https://www.cnblogs.com/dhyuan/p/17917218.html