• 生成器


    '''

    1 什么是生成器?
    在函数内但凡出现yield关键字,再调用函数就不会执行函数体代码。调用函数会返回一个值,该值称之为生成器
    生成器本质就是迭代器

    2、为什么要有生成器?
    可以自定义一个迭代器,即生成器
    生成器是一种自定义迭代器的方式
    生成器都是迭代器

    3、如何用生成器


    '''

    def func():
    print('first1')
    print('first2')
    print('first3')
    yield 1 #暂停
    print('second1')
    print('second2')
    print('second3')
    yield #暂停
    print('third')
    yield 3 #暂停
    print('fourth')

    func() # 调用函数,无事发生,函数体代码根本不会执行。

    g=func() # 调用函数,返回的是一个生成器对象,不经过next()方法不会输出值。
    print(g) # <generator object func at 0x00000146EE4A1F68>
    print(next(g)) # 函数体执行,并且返回了1,并且暂停在了yield 1
    print(next(g)) # 函数体从yield 1 开始执行,到yield停下,yield返回值为None
    print(g.__iter__().__iter__().__iter__() is g) # True
    res1=next(g)
    print('第一次的返回值:',res1)

    print('='*100)
    res2=next(g)
    print('第二次的返回值:',res2)

    print('='*100)
    res3=next(g)
    print('第三次的返回值:',res3)

    g = func()
    print('='*100)
    res4=next(g)
    print('第三次的返回值:',res4)

    for item in g: #g=iter(g) #item=next(g) next(g) 从g里取出一个返回值
    print(item) # 会循环取出剩余的值 item 就是next取出的值(包括执行print部分)

    i=range(1,1000) # 只是一个可迭代的对象
    print(type(i)) # <class "range">
    print(len(i)) # 999
    print(i) # range(1,1000)
    for item in range(1,100): # 列表把range(1,100)变成一个迭代器对象
    print(item)


    def my_range(start,stop,step=1):
    while start < stop:
    yield start # 暂停
    start+=step
    g=my_range(1,5,2) #1 3


    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))

    for item in g:
    print(item)


    总结yield的功能
    1、提供一种自定义迭代器的方式
    2、yield可以暂停住函数,并返回值

    yield VS return
    相同点:都是用在函数内,都可以返回值,没有类型限制,没有个数限制
    不同点:return只能返回一次值,yield可以返回多次值


    了解知识
    yield 值
    就是单纯的返回一个值
    x=yield
    可以接受send进来的值并赋值给x
    x= yield 值
    返回值为x 并且可以接受send进来的值

    def dog(name):
    food_list=[]
    print('狗哥 %s 准备开吃' %name)
    while True:
    food=yield food_list #暂停 food=yield='一桶泔水'
    print('狗哥[%s]吃了<%s>' %(name,food))
    food_list.append(food)


    alex_dog=dog('alex')

    print(type(alex_dog))
    print(alex_dog)
    <class 'generator'>
    <generator object dog at 0x000001C014E41F68>

    res1=next(alex_dog) # 初始化,即让狗准备好
    print(res1)
    next(alex_dog) # 等同于alex_dog.send(None)

    next(alex_dog)

    res2=alex_dog.send(('一泡翔','咖啡伴侣'))
    print(res2)

    res3=alex_dog.send('一桶泔水')
    print(res3)




  • 相关阅读:
    POJ 1860
    Notepad++ 经常使用快捷键 (MEMO)
    SpringMVC现实
    krpano漫游加方向性3D声音(这篇文章已被移到krpano中国网站 krpano360.com)
    DFS PKU 1562
    Java中间(三十五)-----Java详细设置(一个):请指定初始容量设置
    HDU 5052 Yaoge’s maximum profit 光秃秃的树链拆分 2014 ACM/ICPC Asia Regional Shanghai Online
    智课雅思词汇---二十五、-ate
    新东方雅思词汇---8.3、apt
    新东方雅思词汇---7.4、cap
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9178021.html
Copyright © 2020-2023  润新知