zoukankan      html  css  js  c++  java
  • python 之 函数 生成器

    5.10 生成器

    函数内有yield关键字,再调用函数就不会立刻执行函数体代码,会得到一个返回值,该返回值就是生成器,生成器本质就是迭代器

    def chicken():
        print('=====>first')
        yield 1
        print('=====>sencond')
        yield 2
        print('=====>third')
        yield 3
    obj=chicken()
    #生成器本质就是迭代器,也就是说生成器的玩法其实就是迭代器的玩法
    print(obj.__iter__() is obj)
    res=obj.__next__()
    print(res)
    ​
    res1=obj.__next__()
    print(res1)
    ​
    res2=obj.__next__()
    print(res2)

    1、iter_obj=obj.iter(),拿到迭代器 2、出发iter_obj.next(),拿到该方法的返回值,赋值给item 3、周而复始,直到函数内不在有yield,即取值完毕 4、for会检测到StopIteration异常,结束循环

    yield功能: 1、提供了一种自定义迭代器的方式 2、yield可以返回多次值

    def chicken():
        print('=====>first')
        yield 1
        print('=====>sencond')
        yield 2
        print('=====>third')
        yield 3
    ​
    obj=chicken()
    for item in obj:
         print(item)

    range()

    def my_range(start,stop,step=1):
        n=start
        while n < stop:
            yield n #yield 4
            n+=step #5
    obj=my_range(3,7,2) #3,5,
    print(obj.__next__())
    print(obj.__next__())
    print(obj.__next__())
    print(obj.__next__())
    print(obj.__next__())
    def my_range(start,stop,step=1):
        n=start
        while n < stop:
            yield n #yield 5
            n+=step #2
    for item in my_range(5,10,2):
        print(item)

    5.10.1 生成器之yield的表达式形式

    def eat(name):
        print('%s ready to eat' %name)
        food_list=[]
        while True:
            food=yield food_list # food='骨头'
            food_list.append(food) #food_list=['泔水','骨头']
            print('%s start to eat %s' %(name,food))
    dog1=eat('alex')
    1、必须初始化一次,让函数停在yield的位置
    res0=dog1.__next__()
    print(res0)
    接下来的事,就是喂狗,send有两方面的功能
    1、给yield传值
    2、同__next__的功能
    res1=dog1.send('泔水')
    print(res1)
    res2=dog1.send('骨头')
    print(res2)
    res3=dog1.send('shit')
    print(res3)
  • 相关阅读:
    Unity 3D 一个简单的角色控制脚本
    Unity3D 纹理偏移(TextureOffset)浅析
    递归函数的原理
    彻底搞定 C/C++ 指针
    zygote的分裂
    SystemServer分析
    Zygote原理学习
    Vmware Linux虚拟机磁盘扩容方法
    Ubuntu12.04 64bit版本下载Android源码完整教程
    Android2.2源码属性服务分析
  • 原文地址:https://www.cnblogs.com/mylu/p/11019820.html
Copyright © 2011-2022 走看看