Python——初识生成器
话不多说,直接上代码:
1、
#在Python中,生成器就是一个可迭代对象
#创建一个生成器,生成器不会直接加载到内存,而其余的(如变量之类的)则会直接加载到内存。
a = (x for x in range(5))
print(a)
<generator object <genexpr> at 0x7fa08eeddd58>
print(next(a)) #0
print(next(a)) #1
print(next(a)) #2
print(next(a)) #3
print(next(a)) #4
#如果调用的次数已经用完,再次调用,则会报错
# print(next(a))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
#生成器每次调用的值只出现一次,且只能从头开始调用,不像列表之类的,可以从后往前调出,或者从中间调用,每打印一次,前一个值就会被Python当做垃圾回收。
#因为博主用的是Python3.71版本的,所以使用下面的方法调用报错,如果安装的低版本可以试试下面的方法
# print(a.next())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'generator' object has no attribute 'next'
#在Python2中,调用生成器还可以使用下面的方法
print(a.next())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'generator' object has no attribute 'next'
2、生成器一种两种创建方式,一种就是上面所创建的,还有一种就是下面所要说的:
#接下来我们来说一下生成器的另一种创建方式,首先我们创建一个函数
def one():
print('hello')
yield 'Any' #生成器的另一种创建方式就是使用yield进行创建
print('world')
yield 'Jack'
print(one()) #generator object one at 0x0000015551C0D390>
#第一次只求生成器的值 (1)
a = one()
next(a)
#hello
#这是因为我们只求了第一个生成器的值,但是并没有将其打印出来,其值已经保存在内存了,而出现的hello,是因为我们在函数中打印了hello.
print(next(a))
#hello
#Any
#如果我们要求所有的值,去掉上面的方式(1)接下来我们写一个循环,则会出现我们所写的生成器的值以及print的值,这是因为在上面我们只求yield的值,而下面所求的值则也有在函数中print的值
for i in one():
print(i)
#hello
#Any
#world
#Jack
上面就是我所说的关于生成器的基本知识,如果有问题,欢迎留言,共同进步。