代码改变世界

IronPython0.9.2发布了 —— Generator Expression简介

2005-09-26 11:20  FantasySoft  阅读(2191)  评论(3编辑  收藏

        又是时候来关注一下IronPython开发的进展了。上个星期四(9月22日),IronPython0.9.2发布了,大家可以在Workspace中下载到这个最新的版本。我们从Workspace首页上那长长的List of fixed bugs可以看出,这次新版本的发布可谓进步不小啊!IronPython0.9.2除了修复了很多bugs之外,还有两个非常重要的改进:支持了Generator Expressions(PEP 289)Decorators for Functions and Methods(PEP 318)
        Generator Expressions和Decorators都是在Python2.4才支持的新特性。其中Generator Expression是一个容易理解的概念,从
字面去看你或许就能猜出它的作用是什么。在探讨Generator Expression之前,我们先来看一个很简单的例子:

>>> l = [x*2 for x in range(5)]
>>>
 l
[
02468
]
>>> sum([x*2 for x in range(5
)])
20   "虽然你只需要一个总和,但是这种方式仍然会在内存中创建一个完整的list"


在这个例子当中,变量l是List类型,它的item则依据中括号里面的表达式来生成。通过这样的方式,我们可以很轻松地创建我们所需要的对
象集合。其实,中括号里面的表达式就是一个Generator Expression,但是在Python2.4以前,并不存在Generator类型,因此Generator Expression只是生成List item过程的中间产物,我们并没有办法去引用它。再回到以上的例子中来,这种生成list item的方式虽然方便,但是在很多时候并不高效,因为你不一定需要一个完整的list,你可能需要的是list中某几个item或者说某个生成数列的和(如例子中的最后一个表达式)。你可以设想一下,如果表达式中的range激增至数千,不管你是否需要一个完整的list,这样的方式都会在内存中为你创建之,你会不会觉得这样做真的很浪费内存呢?在这样的背景下,Generator Expression就应运而生了。定义一个Generator Expression的方式很简单,将以上例子中的中括号换成小括号即可:

>>> g = (x*2 for x in range(5))
>>>
 g
<generator object at 0x000000000000002F>

>>> sum(g)
20


现在g的类型就是Generator了,然后调用sum函数获得该数列的总和,而在这个例子当中并没有创建一个完整的list。Generator
Expression不仅减少了内存的开销,还提供iterator的functionality,我们可以通过调用next()方法来获得由generator生成的item。例如:

>>> g = (x*2 for x in range(5))
>>>
 g.next()
0

>>> g.next()
2

>>> g.next()
4

       
        Generator Expression的特性就讲到这里了,而Decorators是一个比较复杂的概念,偶了解得也颇少,就不在这里作探讨了。再罗嗦一句,Decorators可是Python中一个非常有用的特性哦,有兴趣的朋友不妨去研究一下。