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

    '                                                                           生成器
    ''

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

    2、为什么要有生成器?
    生成器是一种自定义迭代器的方式

    3、如何用生成器


    '''



    # def func():
    # print('first1')
    # print('first2')
    # print('first3')
    # yield 1 #暂停
    # print('second1')
    # print('second2')
    # print('second3')
    # yield 2 #暂停
    # print('third')
    # yield 3 #暂停
    # print('fourth')
    #
    # g=func() #生成的是生成器
    # print(g) #打印出的是生成器及地址
    # print(g.__iter__().__iter__().__iter__() is g) #生成器iter后的结果还是其本身。
    # res1=next(g) #调用生成器,才执行函数体代码,直到遇到yield后暂停。
    # print('第一次的返回值:',res1) #返回一个返回值。
    #
    # print('='*100)
    # res2=next(g)
    # print('第二次的返回值:',res2)
    #
    # print('='*100)
    # res3=next(g)
    # print('第三次的返回值:',res3)
    #
    # print('='*100)
    # res4=next(g)
    # print('第三次的返回值:',res4)

    # for item in g: #g=iter(g) #item=next(g) #for循环把g变成了生成器,然后item再执行next的功能,取下一个值,迭代下去。
    # print(item)

    # i=range(1,1000)
    # for item in range(1,10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000):
    # print(item) #不管in后面有多少个值,都变成生成器,依次迭代下去,节省内存,同时电脑也不会卡


    #取range范围里的值,再加步长。
    # 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)) #next一次,执行一次,拿到一个返回值,直到把里面的值全部取完。
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))

    # for item in g:
    # print(item) #用for循环其实就是把上面的操作进行了一遍


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

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


    # 了解知识
    # yield 值
    # x=yield
    # x= yield 值

    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')

    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)
    #




    #三元表达式
    # 条件成立时的返回值 if 条件 else 条件不成立时的返回值

    # def max2(x,y):
    # if x > y:
    # return x
    # else:
    # return y
    # x=10
    # y=20
    # res=x if x > y else y #中间写条件,左边写条件成立的值,右边写else成立的条件
    # print(res)

    # 例如:
    # name='alex'
    # res='sb'if name=='alex' else 'nb'
    # print(res)

    # 列表生成式
    # l=[item**2 for item in range(1,11)] #for循环出来的每一个值,写在前面,再加上所需要的条件,比如取出的值都算出它的平方
    # print(l)

    # 例如把下面列表中的名字后面都加一个SB
    # 方法一:利用把值加到空列表的方法
    # names=['alex','wxx','lxx']

    # l=[]
    # for name in names:
    # l.append(name + 'SB')
    # names=l

    # 方法二:用列表生成式
    # names=[name+'SB' for name in names]
    # print(names) #直接生成列表,把所需的条件加到for循环的左边。

    #把下面除了egon,其他人后面都加上SB 的两种方法:
    # names=['alex','wxx','egon','lxx','zhangmingyan']
    # l=[]
    # for name in names:
    # if name != 'egon':
    # l.append(name + 'SB')
    # names=l
    #方法二,用列表生成式的方法,左边写要实现的情况,右边写成立的条件
    # names=[name+'SB' for name in names if name != 'egon']
    # print(names)


    # l=[item**2 for item in range(1,5) if item > 2]
    # print(l)

    #把下面列表里的名字全都换成大写
    # names=['egon','alex_sb','wupeiqi','yuanhao']
    # names=[name.upper() for name in names]
    # print(names)
    # names=['egon','alex_sb','wupeiqi','yuanhao']
    #
    #统计列表中不是以sb结尾的名字的长度。
    # nums=[len(name) for name in names if not name.endswith('sb')]
    # print(nums)


    #字典生成式
    # s1='hello'
    # l1=[1,2,3,4,5]

    # res=zip(s1,l1) # zip()可以吧两个可迭代对象,对应一一的配对,然后加入列表。列表里面是一个个小元祖[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('o', 5)]
    # print(res) #打印出的是一个内存地址
    # print(list(res)) #打印出[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('o', 5)]


    # keys=['name','age','sex']
    # values=['egon',18,'male']

    # res=zip(keys,values)
    # print(list(res)) #[('name', 'egon'), ('age', 18), ('sex', 'male')]
    # print(list(res))
    # d={}
    # for k,v in zip(keys,values): # zip()可以吧两个可迭代对象,对应一一的配对,然后加入列表。里面是一个个小元祖
    # d[k]=v #k,v是解压缩
    # print(d)

    # keys=['name','age','sex']
    # values=['egon',18,'male']
    # d={k:v for k,v in zip(keys,values)} #吧字典的key和value取出来后,再生成一个字典。
    # print(d)

    # info={'name': 'egon', 'age': 18, 'sex': 'male'}

    # keys=info.keys()
    # print(keys)
    # iter_keys=keys.__iter__()
    # values=info.values()
    # print(values)
    #列表生成式
    # d={k:v for k,v in zip(keys,values)}
    # print(d)

    # s={i for i in range(10)}
    # print(s,type(s)) #生成的是集合的形式{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} <class 'set'>



    # 生成器表达式
    # g=(i for i in range(10))
    # # print(g) #打印出一个生成器
    #
    # print(next(g)) #next执行一下取一个值
    # print(next(g))


    # nums=[11,22,33,44,55]
    # print(max(nums))

    # with open('a.txt',encoding='utf-8') as f:
    # nums=(len(line) for line in f) #外面加小括号,是刚造出来的列表,什么代码都不执行,要next才能执行代码,如果换成【】自动就在列表内,列表本来就有值的。
    # print(max(nums))
    # print(max(nums))
    # print(max(nums))


    # 题目:从文件中统计出每一行长度最长的并且打印出来。
    # with open('a.txt','rt') as f:
    # nums=[len(line)for line in f] #最好不要用[],是因为,如果文件里的内容很大,很容易就把内存撑爆
    # print(nums)
    # print(sum(nums))
    #因为上面的方法,很容易内存撑爆,所以,我们把[]换成(),因为小()其实造出来的是一个生成器
    # with open('a.txt',encoding='utf-8') as f:
    # nums=(len(line) for line in f) #外面加小括号,是刚造出来的列表,什么代码都不执行,要next才能执行代码,如果换成【】自动就在列表内,列表本来就有值的。
    # print(max(nums)) #上面如果打印nums,其实打印出的是一个生成器。执行max()的时候是把nums变成迭代器,然后再执行next的功能。
    # # print(max(nums))
    # # print(max(nums))



    l=['egg%s' %i for i in range(100)]
    print(l)

    g=('egg%s' %i for i in range(1000000000000))
    # print(g)
    print(next(g)) #执行一次next,取一个值egg0
    print(next(g)) #再取下一个值egg1
  • 相关阅读:
    用户态和内核态
    04 _ 如何利用事务消息实现分布式事务?
    03 _ 消息模型:主题和队列有什么区别
    01 _ 为什么需要消息队列?
    洛谷P2257 YY的GCD
    HDU2669 Romantic (扩展欧几里德)
    CQOI2015 选数
    A. Pride
    测试开发进阶——python-java——appium003——Desired Capabilities —— 自动化常用方法——面试整理
    HDU 5050
  • 原文地址:https://www.cnblogs.com/fxc-520520/p/9178766.html
Copyright © 2011-2022 走看看