首页 > 技术文章 > 生成器

chvv 2018-02-01 22:03 原文


##生成器
#在Python中,这种.边循环.边计算的机制,称为生成器:generator。
#不必创建完整的list,从⽽节省⼤量的空间
# 要创建⼀个⽣成器,有很多种⽅法。第⼀种⽅法很简单,只要把⼀个列表⽣成式的[] 改成()

L = [x for x in range(5)]
print(L) #[0, 1, 2, 3, 4]

L = (x for x in range(5))
print(L) #<generator object <genexpr> at 0x000001F2736538E0>

print(next(L)) #0
print(L.__next__()) #1
print(L.__next__()) #2

#
生成器函数 # Python中提供的生成器: # 1. # 生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行 # 2. # 生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表 # # 生成器Generator: #   本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现) #   特点:惰性运算, 开发者自定义 def generator(): print(1) return 'a' ret = generator() print(ret) #1 a #只要含有yield关键字的函数都是生成器函数 # yield不能和return共用且需要写在函数内 def generator(): print(1) yield 'a' # #生成器函数 : 执行之后会得到一个生成器作为返回值 ret = generator() print(ret) ##<generator object generator at 0x0000020DBAC8A0F8> print(ret.__next__()) #1 a print("==============") def generator(): print(1) yield 'a' print(2) yield 'b' yield 'c' g = generator() # for i in g: # print(i) print("||||||||||||") ret = g.__next__() print(ret) #1 a ret = g.__next__() print(ret) #2 b ret = g.__next__() print(ret) #c #娃哈哈%i def wahaha(): for i in range(2000000): yield '娃哈哈%s'%i g = wahaha() g1 = wahaha() print(g.__next__()) #g和g1没有关系 print(g1.__next__()) g = wahaha() count = 0 for i in g: count +=1 print(i) if count > 50: break print('*******',g.__next__()) for i in g: count +=1 print(i) if count > 100: break def demo(): for i in range(4): yield i g=demo() g1=(i for i in g) g2=(i for i in g1) print(list(g1)) #[0, 1, 2, 3] print(list(g2)) #[]

 

def test1():
    list1 = [1,2,3,4,5,6]
    for i in list1:
        yield i

g = test1()
print(g.__next__()) #1
print(g.__next__()) #2


def test2():
    for i in range(5):
        yield "编号%s"%i

g1 = test2()
print(g1.__next__())
print(g1.__next__())
print("==========")

for i in g1:
    print(i)
#结果
'''
编号0
编号1
==========
编号2
编号3
编号4
'''

 

推荐阅读