D18-07三元运算,列表解析,生成器

什么是生成器

可以理解为一种数据类型,这中数据类型自动实现了迭代器协议(其他的数据类型需要调用iter方法),所以生成器就是可迭代对象。

python有两种不用的方式提供生成器

1,生产器函数:常规函数定义,但是使用yield语句而不是return语句返回结果,yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从他们离开的地方继续执行。

2,生成器表达式:类似于列表推到,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

生成器的优点

使用生成器对延迟的操作提供了支持,所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果,这也是生成器的主要好处。

小结:

1,可迭代对象

2,实现了延迟计算,节省内存

3,生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算内存的好处,其余的可迭代对象没有这个优势。

 

 

三元运算

name = 'liu'
#如果判断name = liu 则返回shuaige
res = 'shuaige' if name =='liu' else 'a'
print(res)
打印结果:
shuaige
egg_list=[]
for i in range(10):
    egg_list.append('人造蛋%s'%i+'号')
print(egg_list)
#可以优化为以下三元运算
l = ['人造蛋%s'%i+'号' for i in range(10)]
l1 = ['人造蛋%s'%i+'号' for i in range(10) if i>6]
print(l)
print(l1)
打印结果
['人造蛋0号', '人造蛋1号', '人造蛋2号', '人造蛋3号', '人造蛋4号', '人造蛋5号', '人造蛋6号', '人造蛋7号', '人造蛋8号', '人造蛋9号']
['人造蛋0号', '人造蛋1号', '人造蛋2号', '人造蛋3号', '人造蛋4号', '人造蛋5号', '人造蛋6号', '人造蛋7号', '人造蛋8号', '人造蛋9号']
['人造蛋7号', '人造蛋8号', '人造蛋9号']

  

#生成器表达式
laomuji = ('人造蛋%s'%i+'号' for i in range(3)) #生成器表达式 圆括号
print(laomuji)
print(laomuji.__next__())
print(laomuji.__next__())
print(laomuji.__next__())
输出结果
人造蛋0号
人造蛋1号
人造蛋2号

  

总结:

1、把列表解析的[]换乘()即为生成器表达式

2、列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存。

3、python不但使用迭代器协议让for循环变得更加通用,大部分内置函数也是使用迭代器协议访问对象的,例如sum函数式py的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以我们可以直接这样计算一系列值的和

 

print(sum(list(range(100)))) 求和计算

 

posted @ 2018-09-04 15:36  犀利的攻城狮  阅读(138)  评论(0)    收藏  举报