码迷,mamicode.com
首页 > 编程语言 > 详细

Python全栈day18(三元运算,列表解析,生成器表达式)

时间:2018-01-15 20:22:59      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:说明   name   定义   通用   类型   ret   []   对象   __iter__   

一,什么是生成器

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

 

二,生成器分类在python中的表现形式

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

def test():
    yield 1
    yield 2

g=test()
print(g)
print(g.__next__())
print(g.__next__())

<generator object test at 0x000001D40CF6F3B8>
1
2

  不同于return可以yield多个值,因为是可迭代对象所以有next方法

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

  

三,三元表达式,如果表达式成立返回前面的值否则返回后面的值day18-7.py

name=‘zhangsan‘
print(‘SB‘ if name == ‘zhangsan‘ else ‘帅哥‘)

  

四,列表表达式,举例说明 day18-8.py 

#使用for循环实现生鸡蛋
egg_list=[]
for i in range(10):
    egg_list.append(‘鸡蛋%s‘ %i)

print(egg_list)

#使用列表表达式生鸡蛋
l=[‘鸡蛋%s‘%i for i in range(10) ]
print(l)

[‘鸡蛋0‘, ‘鸡蛋1‘, ‘鸡蛋2‘, ‘鸡蛋3‘, ‘鸡蛋4‘, ‘鸡蛋5‘, ‘鸡蛋6‘, ‘鸡蛋7‘, ‘鸡蛋8‘, ‘鸡蛋9‘]
[‘鸡蛋0‘, ‘鸡蛋1‘, ‘鸡蛋2‘, ‘鸡蛋3‘, ‘鸡蛋4‘, ‘鸡蛋5‘, ‘鸡蛋6‘, ‘鸡蛋7‘, ‘鸡蛋8‘, ‘鸡蛋9‘]

  使用for循环和列表表达式生成是结果是一样的

  使用三元表达式加一个if判断条件(三元表达式可以是三元也可以是二元,但是不能是四元)

l=[‘鸡蛋%s‘%i for i in range(10) if i>5]
print(l)

[‘鸡蛋6‘, ‘鸡蛋7‘, ‘鸡蛋8‘, ‘鸡蛋9‘]

  以上使用表达式生成的列表直接在内存中,可以使用生成器表达式

egg_list=[‘鸡蛋%s‘%i for i in range(10)]
laomuji=(‘鸡蛋%s‘%i for i in range(10))
print(laomuji)
print(next(laomuji))    #next的本质就是调用__next__
print(laomuji.__next__())
print(next(laomuji))

<generator object <genexpr> at 0x000001D39C97F3B8>
鸡蛋0
鸡蛋1
鸡蛋2

  PS:不能无限制的next因为定义生成器的时候定义了范围0-9所以最多到鸡蛋9

 

  总结:

  1,把列表解析的[]换成()得到的就是生成器表达式

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

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

print(sum(x ** 2 for x in range(4)))

14

  

Python全栈day18(三元运算,列表解析,生成器表达式)

标签:说明   name   定义   通用   类型   ret   []   对象   __iter__   

原文地址:https://www.cnblogs.com/minseo/p/8289223.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!