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 object at 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生成器的主要内容,如果未能解决你的问题,请参考以下文章

postman 自动生成 curl 代码片段

Apollo Codegen 没有找到生成代码的操作或片段

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

vscode代码片段生成vue模板

常用python日期日志获取内容循环的代码片段