易截截图软件、单文件、免安装、纯绿色、仅160KB

[Python 学习]2.5版yield之学习心得

  shhgs 发布了关于《 Py 2.5 what's new 之 yield

之后,原来我不是特别关注 yield 的用法,因为对于2.3中加入的yield相对来说功能简单,它是作为一个 generator
不可缺少的一条语句,只要包含它的函数即是一个 generator 。但在2.3中,generator
不能重入,不能在运行过程中修改,不能引发异常,你要么是顺序调用,要么就创建一个新的 generator。而且 generator 中的
yield 只是一个语句。但到了 2.5 版之后,情况发生了很在的变化。
在 shhgs 的文章中对于 yield 并没有做太多的描述,也因此让我在理解上产生了许多问题,于是我仔细地研究了 What's new
和 PEP 342
文档,有了一些体会,描述在下面。
这里不说为什么要对 yield 进行修改,只说功能。
1. yield 成为了表达式,它不再是语句,但可以放在单独的行上。原文:
Redefine "yield" to be an expression, rather than a statement. The
current yield statement would become a yield expression whose value is
thrown away.
可以看到,如果你还是写成语句形式的话,其实还是一个表达式,只是它的值被扔掉了。
那么一个 yield 表达式可以这样写:
x = yield i
y = x + (yield x)
那么这种机制到底是如何工作的呢?在2.3版很容易理解,你完全可以把 yield 语句理解为一个 "return" 语句,只不过
"return" 完后,函数并不结束,而是断续运行,直到再次遇到 yield 语句。那么到了 2.5 版不仅仅是一个 "return"
语句那么简单了,让我们看完下面关于 send() 的说明再描述它吧。
2. 增加了 send(msg) 方法,因此你可以使用它向 generator 发送消息。原文:
Add a new send() method for generator-iterators, which resumes the
generator and "sends" a value that becomes the result of the current
yield-expression. The send() method returns the next value yielded by
the generator, or raises StopIteration if the generator exits without
yielding another value.
执行一个 send(msg) 会恢复 generator 的运行,然后发送的值将成为当前
yield 表达式的返回值
。然后 send() 会返回下一个被 generator yield 的值,如果没有下一个可以 yield 的值则引发一个异常。
那么可以看过这其实包含了一次运行,从将msg赋给当前被停住的 yield 表达式开始,到下一个 yield 语句结束,然后返回下


相关文档:

Python中的对象、变量及引用

  在Python中,我们执行表达式 a = 3,Python会怎样操作呢?
1、首先会创建一个对象表示值3
2、如果变量a不存在,创建变量a
3、把变量a连接到表示3的对象
在Python中,变量和对象存储在不同的地方,通过指针连接起来...
一个变量总是和对象连接起来,不存在不和对象连接的变量,但是大的对象可能连接到别的对象。 ......

Python之全局变量

应该尽量避免使用全局变量。不同的模块都可以自由的访问全局变量,可能会导致全局变量的不可预知性。对全局变量,如果程序员甲修改了_a的值,程序员乙同时也要使用_a,这时可能导致程序中的错误。这种错误是很难发现和更正的。 
全局变量降低了函数或模块之间的通用性,不同的函数或模块都要依赖于全局变量。同样,全 ......

Python PAMIE示例

 转自:http://blog.chinaunix.net/u3/103146/showart_2058891.html
Python这种脚本语言的强大功能越来越被广大的程序员所重视,这种之前在国内流行度不高的语言近来气势高涨。各种第三方模块层出不穷。
 
本文介绍的便是一种能非常方便操作IE的第三方工具,PAMIE,他能让你如同写JS一样来操作IE浏览器。包括自 ......

用python的cmd模块写一个简单的shell

 from cmd import *
class MyShell(Cmd):
    def preloop(self):
        print "print this line before entering the loop"
            
    def postloop(self):
&nb ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号