10.2生成器

生成器

列表表达式回顾ide

# -*-coding:utf-8 -*-
__date__ = '2018/3/5'
__author__ = 'xiaojiaxin'
__file_name__ = '生成器'

#a1=[x*2 for x in range(10000000000)] #所有加载至内存,列表表达式

生成器建立的两种方法函数

a=(x*2 for x in range(5))
print(a)
# <generator object <genexpr> at 0x000000E29B512990>
#里面没有值!!!!生成器只是一个对象

生成器执行的两种方法code

#就好比说列表和元组等都是菜,想吃就直接吃,生成器只是一个厨师,他会作菜,可是你要吃哪道菜,他才会去加载那一道菜

#第一种方法:使用内置方法
print(a.__next__())
#0
print(a.__next__())
#2
print(a.__next__())
#4

#第二种方法:使用next()方法
print(next(a))  #等价于Python2.x  a.next()
#6
print(next(a))
#8

# print(next(a))    #报警:中止迭代
# #StopIteration
# print(next(a))

#生成器就是一个可迭代对象(iteration迭代)
#for内部对b作了next()调用,以前的数据做为垃圾回收了
#for循环检测是否还有数据,及时结束next()调用
b=(x for x in range(10))
for i in b:   #for内部对b作了next()调用,以前的数据做为垃圾回收了
    print(i)  #for循环检测是否还有数据,及时结束next()调用
#生成器一共两种建立方式
#第一种:(x for x in range(5))
#第二种:yield

生成器函数与普通函数的区别对象

def foo():
    print("haha")
    return 1
foo()
#haha
print(foo())   #执行函数,并返回返回值
#haha
#1
print(foo)
# <function foo at 0x000000A30D962E18>
def fou():
    print("123")
    yield 2    #只要有yield就是生成器对象

    print("456")
    yield 4

fou()
#      #空表示没有执行fou()函数
print(fou())   #不执行函数,不返回函数返回值
# <generator object fou at 0x00000092754D2A40>
print(fou)
# <function fou at 0x000000A823DBD158>

#fou()是一个生成器对象
#有一个yield就只有一道菜,有多个yield就有多道菜

next(fou())   #执行fou()生成器对象
#123
next(fou())

你们对内容有任何问题,欢迎留言,定在第一时间解答,谢谢你们!内存