zoukankan      html  css  js  c++  java
  • day19---生成器

    一、生成器与yield


    若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象

    def my_range(start, stop, step=1):
        while abs(start - stop) > 0:
            try:
                yield start
                start += step
            except StopIteration:
                break
    
    
    for i in my_range(1, 8):
        print(i)

    生成器从本质上来说,是一个迭代器(自定义)

    # my_range.__iter__
    # my_range.__next__

    二、yield表达式的应用


    来吧,春哥开始吃包子了,go

    # def dog(name):
    #     print('狗哥:{},开始吃东西了!'.format(name))
    #     while 1:
    #         x = yield
    #         print('狗哥:{}吃了{}'.format(name,x))
    #
    # g = dog('jiangchun')
    # g.send(None) # 等同于next(g)
    #
    # g.send(['一根骨头','aaa'])
    # # g.send('肉包子')
    # # g.send('一同泔水')
    # # g.close()
    # # g.send('1111') # 关闭之后无法传值

    针对表达式形式的yield,生成器对象必须事先被初始化一次,让函数挂起在food=yield的位置,等待调用g.send()方法为函数体传值,g.send(None)等同于next(g)。

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

    def dog(name):
        food_list=[]
        print('道哥%s准备吃东西啦...' %name)
        while True:
            # x拿到的是yield接收到的值
            x = yield food_list # x = '肉包子'
            print('道哥%s吃了 %s' %(name,x))
            food_list.append(x) # ['一根骨头','肉包子']
    #
    # g=dog('alex')
    # res=g.send(None)  # next(g)
    # print(res)
    #
    # res=g.send('一根骨头')
    # print(res)
    #
    # res=g.send('肉包子')
    # print(res)
    # # g.send('一同泔水')

    三、三元表达式、列表生成式、生成器表达式


    (1)三元表达式

    # flag = True
    # while flag:
    #     _continue = input('是否继续(y,n):').strip()

    # flag = False if _continue.lower() == 'n' else True

    (2)列表生成式

    l = ['alex_dsb', 'lxx_dsb', 'wxx_dsb', "xxq_dsb", 'egon']
    
    # new_l=[name for name in l if name.endswith('dsb')]

    (3)字典生成式

    # items=[('name','egon'),('age',18),('gender','male')]
    # res={k:v for k,v in items if k != 'gender'}
    # print(res)

    (4)集合生成式

    # keys=['name','age','gender']
    # set1={key for key in keys}
    # print(set1,type(set1))

    (5)生成器表达式

    f = open('user.txt', mode='r', encoding='utf-8')
    g = (line.strip('
    ').split(' ') for line in f)
    f.close()
  • 相关阅读:
    数据系统与分布式(二) 分布式数据系统(复制与分片)
    数据系统和分布式(一)数据系统基础
    可执行文件(ELF)的装载与进程
    HTTPS协议
    后台开发 缓存, 数据库, 高并发等等
    Golang中new和make的区别
    吴恩达:机器学习里面的作业1遇到的
    笔记——操作系统导论:环境配置
    笔记——操作系统导论:第二章
    Games 101 作业1代码解析
  • 原文地址:https://www.cnblogs.com/surpass123/p/12567453.html
Copyright © 2011-2022 走看看