python——生成器

 

 

 

 

生成器

 

1.  生成器(generator):一边循环一边计算的机制。用生成器不必创建一个完整的list,这样就可以节省大量的空间。

 

2.  创建一个生成器有很多种方法。

 

第一种:把一个列表生成式的【】改为(),即可创建一个生成器

>>> L=[x*x for x in range(1,11)]
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> g=(x*x for x in range(1,11))
>>> g
<generator object <genexpr> at 0x000001F191BC15F0>

  

如果要将生成器中的元素一个一个的打印出来,可以用 next()函数获得 generator 的下一个返回值

>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
100
>>> next(g)
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    next(g)
StopIteration

  

因为 generator 是可迭代对象,也可以用迭代的方法将其中的元素打印出来

>>> g=(x*x for x in range(1,11))
>>> for n in g:
	print(n)

	
1
4
9
16
25
36
49
64
81
100

  

第二种:用函数来创建,例如,斐波那契数列,1,1,2,3,5,8,13,,,,

 

用函数实现:

>>> def fib(max):
	n,a,b=0,0,1#这里n=0,a=0,b=1
	while n<max:
		print(b)
		a,b=b,a+b#这里a=b,b=a+b
		n=n+1
	return 'done'

>>> fib(6)
1
1
2
3
5
8
'done'

  

将上述函数中的 print(b)改为 yield b,就可实现 generator的定义了

>>> def fib(max):
	n,a,b=0,0,1
	while n<max:
		yield b
		a,b=b,a+b
		n=n+1
	return 'done'

>>> f=fib(6)
>>> f
<generator object fib at 0x000001F191BC15F0>

可以用迭代的方法打印:

>>> for n in fib(6):
	print(n)

	
1
1
2
3
5
8

也可以用 next()函数一个一个的打印:

>>> f=fib(5)
>>> f
<generator object fib at 0x000001F191C2EF90>
>>> next(f)
1
>>> next(f)
1
>>> next(f)
2
>>> next(f)
3
>>> next(f)
5
>>> next(f)
     
SyntaxError: invalid character in identifier

  

函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用 next() 的时候执行,遇到 yield 语句返回,再次执行时从上次返回的 yield 语句处继续执行

 

3.  generator的工作原理,它是在 for 循环的过程中不断计算出下一个元素,并在适当的条件结束 for 循环。对于函数改成的  generator 来说,遇到 return 语句或者执行到函数体最后一行语句,就是结束generator的指令, for 循环随之结束。

 

posted @ 2020-12-26 10:34  CannedDream  阅读(103)  评论(0编辑  收藏  举报