• 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()
  • 相关阅读:
    UDP and netstat
    UDP learn by Python3
    UDP headers and checksum
    routetrace
    IPv4 headers
    Commands for IP
    IP checksum
    POJ 3667 Hotel 线段树处理区间信息
    【枚举】Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) Div2C题
    二分图最大匹配模板 HDU1083
  • 原文地址:https://www.cnblogs.com/surpass123/p/12567453.html
Copyright © 2020-2023  润新知