码迷,mamicode.com
首页 > 其他好文 > 详细

生成器

时间:2018-04-28 14:31:07      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:==   协议   需要   object   ros   自动   大括号   一个   ext   

‘‘‘
什么是生成器:
可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(不需__iter__方法了),所以生成器就是可迭代对象.

生成器在python中有2中表现形式:
1 生成器函数: 常规函数的定义,但是,使用yield语句而不是return语句返回结果,yield语句一次返回一个结果
在每个结果中间,挂起函数的状态,以便下一次在它离开的地方继续执行
2 生成器表达式: 列斯与列表推导,但是生成器返回按需产生金额过的一个对象,而不是一次构建一个结果列表
‘‘‘
#1 生成器函数表现形式:
def test():
    yield 1
    yield 2
    yield 3
g = test()
print(g)   #<generator object test at 0x04AAF150>  生成器
print(g.__next__())  #1
print(g.__next__())  #2
print(g.__next__())  #3

#2 生成器表达式表现形式:
t = (i for i in range(10))
print(t)  #<generator object <genexpr> at 0x04B4BC90>   生成器
print(t.__next__()) #0
print(t.__next__()) #1


#三元表达式,判断name等于abc?等于就返回yes 不等于就返回error
name = abc
ret = yes if name == abc else error
print(ret)

#列表解析:
r = [i for i in range(10)]
print(r)   #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

r = [i for i in range(10) if i > 6]  #列表解析中括号改成大括号就是生成器表达式了
print(r)    #[7, 8, 9]
#总结:
#1 列表解析中括号改成大括号就是生成器表达式了
#2 列表解析与生成器表达式都是一种遍历的编程方式,只不过生成器表达式更节省内存(因为没有生成数据,只是一个内存地址,需要时候在生成数据)
print(sum([i for i in range(100000000000000000)]))

生成器

标签:==   协议   需要   object   ros   自动   大括号   一个   ext   

原文地址:https://www.cnblogs.com/ajaxa/p/8966854.html

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