1.迭代器
class Fib:
'''生成菲波拉稀数列的迭代器'''
def __init__(self, max):
self.max = max
def __iter__(self):
self.a = 0
self.b = 1
return self
def __next__(self):
fib = self.a
if fib > self.max:
raise StopIteration
self.a, self.b = self.b, self.a + self.b
return fib
==> iter() 方法能返回任何实现了 next() 方法的对象。 在本例(甚至大多数例子)中,
iter() 仅简单返回 self , 因为该类实现了自己的
next() 方法。
==>当 next() 方法抛出 StopIteration 异常, 这是给调用者表示迭代用完了的信号。
==》 for 循环调用 iter(fib_inst) , 它返回迭代器
==》 for 循环调用 next(fib_iter) , 它又调用 fib_iter 对象的 next() 方法,产生下一个菲波拉稀计算并返回值
使用
for n in Fib(1000):
... print(n, end=' ')
一个读取遍历文件的例子
class LazyRules:
rules_filename = 'plural6‐rules.txt'
def __init__(self):
self.pattern_file = open(self.rules_filename,encoding='utf‐8')
self.cache = []
def __iter__(self):
self.cache_index = 0
return self
def __next__(self):
self.cache_index += 1
if len(self.cache) >= self.cache_index:
return self.cache[self.cache_index ‐ 1]
if self.pattern_file.closed:
raise StopIteration
line = self.pattern_file.readline()
if not line:#文件结尾了
self.pattern_file.close()
raise StopIteration
pattern, search, replace = line.split(None, 3)
funcs = build_match_and_apply_functions(
pattern, search, replace)
self.cache.append(funcs)
return funcs
rules = LazyRules()
问题:
==》文件长时间打开,应该使用seek() 方法重新定位
2.文件读取
一行行读取,注意encoding必须指定,否则可能会报错
with open('examples/favorite‐people.txt', encoding='utf‐8') as a_file:
for a_line in a_file:
line_number += 1
print('{:>4} {}'.format(line_number, a_line.rstrip()))
追加写
with open('test.log', mode='a', encoding='utf‐8') as a_file: ③
a_file.write('and again')
二进制文件的读取
an_image = open('examples/beauregard.jpg', mode='rb')
重定向
import sys
class RedirectStdoutTo:
def __init__(self, out_new):
self.out_new = out_new
def __enter__(self):
self.out_old = sys.stdout
sys.stdout = self.out_new
def __exit__(self, *args):
sys.stdout = self.out_old
print('A')
with open('out.log', mode='w', encoding='utf‐8') as a_file, RedirectStdoutTo(a_file):
print('B')
print('C')
..................
you@localhost:~/diveintopython3/examples$ python3 stdout.py
A
C
you@localhost:~/diveintopython3/examples$ cat out.log B