Python

注意最后一段

注意最后一段。

生成器(generator)可避免生成列表占用内存,但也要看情况。这样的代码:

with file('pc2-chars') as fd:

    rare = ( c for c in fd.read() if c>='a' and c<='z' )

                      # ^^^^^^^^^ bad

print ''.join(rare)

虽然rare是个生成器,但是定义它时要执行fd.read(),把文件内容存在内存中。可以在定义rare后紧接着执行fd.read(),发现返回空值,这证明在定义rare时执行了fd.read(),文件指针到了末尾。

为避免在定义rare时就生成列表,占用内存空间,可以改为如下代码:

with file('pc2-chars') as fd:

    rare = ( c for line in fd for c in line if c>='a' and c<='z' )

    print ''.join(rare)

#   ^^^^^ the file must be open when print rare

这样定义rare时并不读文件内容,只有在下面''.join(rare)遍历rare时才遍历文件内容。同样可以在定义rare后紧接着执行fd.read(),返回所有文件内容,这证明在定义rare时未执行fd.read(),文件指针还在开头。

这种情况下,最后的print语句必须在with的上下文里面,也就是文件必须打开着才能print出来rare,而不能像开头一样关闭文件后执行print

file类是个context manager,定义了__enter____exit__,但是open函数没有定义。所以with file('foo') as fd:是可以保证文件关闭的,但是with open('foo') as fd:是不能保证的。

在Windows下,安装了官方Python后,.py文件就设置和Python关联了。在命令行下不需要python foo.py来执行,而直接foo.py就可以执行了。这样可以达到和Linux下相媲美的体验。

Ubuntu下pygobject的文档python-gobject-2-dev包里,是用apt-file search class-gobject.html找到的。

时间

有datetime和time的module:

获得某日开始的Unix时间:

import time

import datetime

time.mktime(datetime.date(2012, 9, 27).timetuple())

EOF