Python生成器
Posted focksor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python生成器相关的知识,希望对你有一定的参考价值。
生成器与列表生成式的区别
列表生成式是根据生成式,将整个列表计算出来并填充到内存,以供程序使用。
例如,以下的列表生成式会在内存中分配一段空间,并将生成的列表放到内存中,然后使l
指向该列表。这样,如果我们需要的元素足够多,内存将会被占满。为了解决这个问题,python中可以使用生成器generator
来提供所需要的元素。
l = [x for x in range(10)]
生成器是惰性计算的,可以将其理解为一种计算规则
,python根据生成器的规则
可以从第一个元素开始,不断计算出下一个符合规则的元素,而这些元素在没有被使用之前是不占用内存的,也就是说,生成器可以将所有
符合规则的元素推导出来,相比列表生成式的可能需要无限大的内存,生成器无疑是很好的解决方案。
最简单的生成器
将列表生成式两侧的[]替换为(),就可以创建一个生成器了。
g = (x*x for x in range(10))
print("查看g的类型:")
print(g)
print("使用next()获取g的下一个元素")
print(g.next())
print(g.next())
print(g.next())
print("对g进行迭代")
for i in g:
print(i)
print("迭代将会消耗所有的元素,所以下行会报错,因为已经没有继续可生成的元素了")
print(g.next())
查看g的类型:
<generator objectat 0x000001896F551900>
使用next()获取g的下一个元素
0
1
4
对g进行迭代
9
16
25
36
49
64
81
迭代将会消耗所有的元素,所以下行会报错,因为已经没有继续可生成的元素了
Traceback (most recent call last):
File "c:Usersfocks.vscodeextensionsms-python.python-2020.2.64397pythonFilesptvsd_launcher.py", line 48, in
main(ptvsdArgs)
File "c:Usersfocks.vscodeextensionsms-python.python-2020.2.64397pythonFileslibpythonold_ptvsdptvsd__main__.py", line 432, in
main
run()
File "c:Usersfocks.vscodeextensionsms-python.python-2020.2.64397pythonFileslibpythonold_ptvsdptvsd__main__.py", line 316, in
run_file
runpy.run_path(target, run_name=‘main‘)
File "C:UsersfocksAppDataLocalProgramsPythonPython38lib unpy.py", line 263, in run_path
return _run_module_code(code, init_globals, run_name,
File "C:UsersfocksAppDataLocalProgramsPythonPython38lib unpy.py", line 96, in _run_module_code
_run_code(code, mod_globals, init_globals,
File "C:UsersfocksAppDataLocalProgramsPythonPython38lib unpy.py", line 86, in _run_code
exec(code, run_globals)
File "c:UsersfocksOneDrivelogpostPythoncode生成器.py", line 24, in
print(next(g))
StopIteration
生成器函数
def fib(max):
n, a, b = 0, 0, 1
while n < max:
# 当调用next()函数的时候,每当执行到yield便return一个值
yield b
# 下次再调用next()函数时,程序从yield后一句开始继续执行
a, b = b, a + b
n = n + 1
f = fib(6)
for i in f:
print(i)
1
1
2
3
5
8
以上是关于Python生成器的主要内容,如果未能解决你的问题,请参考以下文章