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