- 生成器
如果使用yield语句,可以让函数生成一个结果序列,而不仅仅是一个值,例如:
def countdown(n):
print('Counting down!')
while n>0:
yield n #生成一个值(n)
n=n-1
for i in countdown(5):
print(i)
任何使用yield的函数都称为生成器。调用生成器函数将创建一个对象,该对象通过连续调用__next()__生成结果序列。但手动调用太过麻烦,这时候,会使用一个for循环,如上图所示。
生成器是基于处理管道,流或数据流编写程序的一种极其强大的方式。例如下面的生成器函数模拟了常用于监控日志文件的UNIX tail -f命令的行为:
# tail一个文件(如tail -f)
import time
def tail(f):
f.seek(0,2) #移动到EOF
while True:
line=f.readline() #尝试读取一个新的文本行
if not line(): #如果没有内容,再次休眠,并再次尝试
time.sleep(0.1)
continue
yield line
下面的生成器,用于在很多行中查找特定的子字符串:
def grep(lines,searchtext):
for line in lines:
if searchtext in line:yield line
下面的例子,将以上两个生成器合并在一起,创建了一个简单的处理管道:
#UNIX "tail -f | grep python"命令的python实现
wwwlog=tail(open('access-log'))
pylines=grep(wwwlog,'python')
for line in pylines:
print(line)
生成器的微妙之处在于,他经常和其他可迭代的对象,(如列表或文件)混合在一起,特别是在编写如:for item in s 这样的语句时,s可以表示项目的列表,文件的各行,生成器函数的结果,或者可支持迭代的其他任何对象。能够在s中插入不同的对象,这在创建可扩展的程序时,可以发挥巨大的作用。
2. 对象与类
程序中使用的所有值都是对象。对象由内部数据和各种方法组成,这种方法会执行与这些数据相关的各种操作,例如:
items =[37,42] #创建一个列表对象,
items.append(73) # 调用append()方法
dir()函数可以列出对象上的可用方法,是进行交互式试验的有用工具。