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

上面就是我所说的关于生成器的基本知识,如果有问题,欢迎留言,共同进步。

posted @ 2018-11-11 11:02  Xa_L  阅读(53)  评论(0编辑  收藏  举报