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

Python 高级技巧

时间:2019-02-28 13:21:02      阅读:175      评论:0      收藏:0      [点我收藏+]

标签: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执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。——廖雪峰

 

Python 高级技巧

标签:strong   str   概念   推导   nbsp   range   span   高级   函数   

原文地址:https://www.cnblogs.com/owenqing/p/10449571.html

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