生成器

'''
什么是生成器:
可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(不需__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]


#send使用

def te():

    with open('a.txt','r',encoding='utf-8') as f:
for i in f:
result = yield i
print(result) #打印t.send(None) 传递过来的值

t = te()
ak = t.__next__()
t.send(None) #会她node 这个值传递给result = yield i

print(ak)

 

def f():
print('打印第一次')
ret = yield '返回数据1'
print(ret)

print('打印第一次')
yield '返回数据2'

ye = f()
ye.__next__()

C = ye.send('发射send数据') #send就相当于执行了一次__next__()方法,并且把内容传递给了上次yeild
print(C)


#总结:
#1 列表解析中括号改成大括号就是生成器表达式了
#2 列表解析与生成器表达式都是一种遍历的编程方式,只不过生成器表达式更节省内存(因为没有生成数据,只是一个内存地址,需要时候在生成数据)
print(sum([i for i in range(100000000000000000)]))
原文地址:https://www.cnblogs.com/ajaxa/p/8966854.html