生成器

发布时间 2023-12-29 08:48:29作者: dhyuannn

生成器

生成器:是一种特殊的迭代器,迭代器不一定是生成器,生成器一定是迭代器

【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...')