打赏

Python基础(16)——生成器、三元运算、列表解析

生成器

一种可以暂停的迭代,函数的return 换成了yield 函数在返回第一次结果后是挂起状态,下一次执行__next__()情况下继续返回下次的结果

生成器这种数据类型自动实现迭代器协议(其他数据类型需要执行内部的__iter__()函数才能实现迭代器协议),那么意味着生成器就是直接可以用的可迭代对象

生成器实现:1、函数内yield代替return  2、生成器表达式:类似于列表推导式,但是生成器返回按需要产生的一个结果,并不是一个结果列表 

三元表达式

name = 'alex'
res = 'sb' if name =='alex' else 'shuai'

其中if name=='alex' 为第一元 ,返回值sb为第二元,else后面为第三元

列表解析

a = [i for i in range(10) if i >5]

for 一元,返回值i  二元,if 为三元   ,最多就三元 ,没有四元表达式,外面加[]就是列表解析,返回一个列表,缺点就是生成的就是列表都会放到内存中,如果数据过多影响性能

a = [i for i in range(10) if i >5]
print(a)

b = (i for i in range(10) if i >5)
print(b)

其中a的结果是返回一个列表[6, 7, 8, 9]

而b的结果是返回一个生成器<generator object <genexpr> at 0x0000011BD8C41750>   区别就是把[]换成了()由返回列表变成了返回生成器迭代对象

在处理运算的时候 sum(i for i in range(1000000000000000000000000) if i>5)  这样就不占内存,如果是把列表放进去就有可能崩溃,内存占满。做这个加法的运算,算出结果会非常慢,但是不死机,所以计算机总是出银河几亿次的计算机

回到生成器函数

函数内部加yield  返回的是生成器对象generator,想要取值必须   test.__next__()这样才能取到值,yield可以想象每次返回值后都设置了一个断点,然后下次再接着断点再返回

为什么要用生成器函数,场景?有先后顺序的事件,比如先做饭才能有饭吃再吃饭,需要有个过程,迭代的过程

优点:延迟计算,一次返回一个结果,不会生成所有结果,大数据处理非常有用,机器不会卡死;生成器可提高代码可读性。生成器只能正向的进行不能返回(这里要小心,因为后面的函数要使用前面的迭代器的时候,迭代器已经走完了,所以是什么都没有,但不报错),迭代就只能迭代一次。

def xiadan():
    ret = []
    for i in range(100):
        ret.append('鸡蛋%s'%i)
        return ret

上面是不使用迭代器  ,下面是使用迭代器的代码

def xiadan1():
    for i in range(100):
        yield '鸡蛋%s'%i

生产者和消费者模型

s = yield     yield赋值给s 

send 传的值只能给上一个yield 赋值, 如果自己是第一个就要赋值None ,所以前面必须有个__next__()的过程

 

posted on 2019-06-28 10:55  大有哥  阅读(187)  评论(0)    收藏  举报

导航