python 多任务-协程(十五-2)

二、生成器:是一个特殊的迭代器

  (2.1) 列表推导式和for循环迭代

# #列表推导式
list1=[i for i in range(1,11)]
print(list1)
#for循环迭代
for i in list1:
    print(i)

(2.2)生成器的第一种: 列表推导式外面的中括号改成括号

list2=(i for i in range(1,101))
print(list2) #不是元组,而是一个生成器对象.
#for循环迭代
for i in list2:
    print(i)

(2.3)生成器的第二种: 一个函数里面拥有一个关键字 yield

          def

          -函数 : 不在类里面,然后内部代码没有关键字yield

          -方法 : 在类里面是方法

          -生成器模板: 只需要内部拥有关键字yield,就成了生成器模板

案例:使用生成器模板演示斐波那契数列:1,1,2,3,5,8,13,21,34,55,89....

def fun_bo(position): #想拿第几位参数;
    #初始化值
    a,b=1,1
    #循环变量
    i=0
    #while循环
    while i<position:
        # print(a) #打印
        return a
        a,b=b,a+b  #赋值
        i+=1 #改变初值

print(fun_bo(10))

   说明:修改返回return, 但只返回1 、 原因:return: 一旦被执行, 整个函数直接结束

   解决:使用生成器模板来解决这个问题

# 生成器模板
def fun_bo(position): #想拿第几位参数;
    #初始化值
    a,b=1,1
    #循环变量
    i=0
    #while循环
    while i<position:
        # return a
        #换成yield
        yield a
        a,b=b,a+b  #赋值
        i+=1 #改变初值

#生成器对象
result=fun_bo(10)
# for循环迭代取值  next函数 >>> __next__方法得到他的返回值
f1=next(result)
f2=next(result)
f3=next(result)
print(f1,f2,f3)

print('-'*30)
for i in result:
  print(i,end=' ')

小结:

迭代器: 模板里面拥有
    (1) __iter__方法
    (2) __next__方法
生成器: 因为他内部既没有
    (1) __iter__
    (2) __next__
但是能够完成迭代器能够做到的事情,所以是特殊的迭代器

(2.4)关键字 yield作用:

    1.类似return, 可以返回数据出去。
    2.跟return又不同,不会直接结束整个代码的运行
    3.执行到yield,会暂停,再次启动的时候,从哪里暂停,就从哪里开始
    4.用next函数去触发生成器模板,调用生成器.....

 yield可以暂停挂起机制

生成器模板
def fun_bo(position):
    print('---------1---------')
    a,b=1,1
    i=0
    while i<position:
        print('---------2---------')
        yield  a  # 生成器模板被调用一次,执行了yield的,那么就进行了暂停,
        print('---------3---------')
        a,b=b,a+b
        i+=1
        print('---------4---------')

#生成器对象
result = fun_bo(10)
#手动next取值
f1 = next(result)  # 第一次启动生成器模板, 在yield执行之后进行了暂停
print(f1)
print("*" *40)

# 第二次调用生成器模板
f2 = next(result)  # 第二次启动生成器模板, 在yield执行之后进行了暂停
print(f2)
print("*" *40)

# 第三次调用生成器模板
f3 = next(result)  # 第三次启动生成器模板, 在yield执行之后进行了暂停
print(f3)

说明:生成器模板首次被启动,是从头开始执行,在执行了yield之后,暂停挂起 之后再次调用,就从暂停位置开始,不再从头调用.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值