zoukankan      html  css  js  c++  java
  • day12 生成器

    # -*- coding: utf-8 -*-
    # @Time:
    # @Auther: kongweixin
    # @File:
    # 需求造一个数量巨大的数据类型


    # 如何得到自定义的迭代器(生成器):
    # 在函数内一旦存在yield关键字,调用函数并不会执行函数体代码(yield可以返回多次值 与return返回值差不多)
    # 会返回一个生成器对象,生成器即自定义的迭代器
    """

    def func():
    print('第一次')
    yield 1
    print('第二次')
    yield 2
    print('第三次')
    yield 3
    print('第四次')



    g=func()#生成器(自定义的迭代器)
    print(g)
    # 生成器就是迭代器
    g.__iter__()
    g.__next__()



    # 会触发函数体代码的运行,然后遇到yield停下来,将yield后的值,
    # 当做本次调用的结果返回
    res1=g.__next__()
    print(res1)#返回值1


    res2=g.__next__()
    print(res2)#返回值2

    res3=g.__next__()
    print(res3)#返回值3

    res4=g.__next__()#没值了就报错



    # 调用len()
    # len('aaa') #本质就是 'aaa'.__len__()

    # 同理如下:
    # next(g) # g.__next__()

    # iter(可迭代对象) # 可迭代对象.__iter__()

    """
    """
    # 应用案列#产生多个个值
    def my_range(start,stop,step=1):
    # print('start...')
    while start < stop:
    yield start
    start+=step
    # print('end....')


    g=my_range(1,5,2) # 1 3
    print(next(g))
    print(next(g))
    print(next(g))#取干净了就会报错

    # 用for循环

    for n in my_range(1,7,2):
    print(n)


    """


    # 总结yield:
    # 有了yield关键字,我们就有了一种自定义迭代器的实现方式。
    # yield可以用于返回值,但不同于return,函数一旦遇到return就结束了,
    # 而yield可以保存函数的运行状态挂起函数,用来返回多次值

    # !!!我们可以编写装饰器来完成为所有表达式形式yield对应生成器的初始化操作,如下:!!!

    def init(func):
    def wrapper(*args,**kwargs):
    g=func(*args,**kwargs)
    next(g)
    return g
    return wrapper

    @init
    def eater():
    # print('Ready to eat')
    while True:
    food=yield
    print('get the food: %s, and start to eat' %food)


    g=eater()
    g.send("狗腿") #用于给food传参


    # 表达式形式的yield也可以用于返回多次值,即变量名=yield 值的形式,如下:
    # !!!! 变量名 = yield + 值 !!!!

    def eater():
    print("Ready to eat")
    food_list=[]
    while True:
    food=yield food_list
    food_list.append(food)

    e=eater()
    next(e)
    e.send("骨头")
    e.send("吃鸡")
    e.send('蒸熊掌')
    e.send('蒸羊羔')
    print(e.send('蒸鹿尾儿'))
  • 相关阅读:
    JPA唯一索引更新删除的问题
    java8时间类的一些封装
    windows 下面必备软件
    YAPI工具在SpringMVC下的使用需要注意的一些问题
    软件
    sublime常用快捷键
    nio学习
    springboot集成rabbitmq的一些坑
    maven子项目的springboot配置
    RabbitMQ 学习
  • 原文地址:https://www.cnblogs.com/kwkk978113/p/13301854.html
Copyright © 2011-2022 走看看