码迷,mamicode.com
首页 > 编程语言 > 详细

Python生成器

时间:2020-03-18 11:46:23      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:extension   rgs   占用   列表生成式   ack   lock   tar   内存   开始   

生成器与列表生成式的区别

列表生成式是根据生成式,将整个列表计算出来并填充到内存,以供程序使用。

例如,以下的列表生成式会在内存中分配一段空间,并将生成的列表放到内存中,然后使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:\Users\focks.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\ptvsd_launcher.py", line 48, in
main(ptvsdArgs)
File "c:\Users\focks.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\lib\python\old_ptvsd\ptvsd__main__.py", line 432, in
main
run()
File "c:\Users\focks.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\lib\python\old_ptvsd\ptvsd__main__.py", line 316, in
run_file
runpy.run_path(target, run_name=‘main‘)
File "C:\Users\focks\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 263, in run_path
return _run_module_code(code, init_globals, run_name,
File "C:\Users\focks\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 96, in _run_module_code
_run_code(code, mod_globals, init_globals,
File "C:\Users\focks\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 86, in _run_code
exec(code, run_globals)
File "c:\Users\focks\OneDrive\blog\post\Python\code\生成器.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生成器

标签:extension   rgs   占用   列表生成式   ack   lock   tar   内存   开始   

原文地址:https://www.cnblogs.com/focksor/p/pythonGenerator.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!