标签:strong str 概念 推导 nbsp range span 高级 函数
(一)生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。这个其实是惰性求值,数据不是全部一下子载入到内存中,而是一个一个来。
g = (i for i in range(10)) print(g) # 把列表推导的圆括号换成方括号就变成了一个生成器 # <generator object <genexpr> at 0x000001AA11DD3D68>
我可以通过 next(g) 方法访问元素,在访问完所有的元素后会抛出一个异常。但是这种使用方法几乎不被推荐。正确的做法是用 yield 编写一个生成器函数,最后返回一个可迭代对象,然后用 for 循环来调用。
1 def my_range(n):
2 i = 0
3 while i != n:
4 i += 1
5 yield i # 协程
6
7
8 r = my_range(10) # 返回一个可迭代对象
9 for i in r:
10 print(i)
yield 这种处理方式其实是协程,这个有点像系统终中断。协程,又称微线程,纤程。英文名Coroutine。协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。——廖雪峰
标签:strong str 概念 推导 nbsp range span 高级 函数
原文地址:https://www.cnblogs.com/owenqing/p/10449571.html