生成器是一个可迭代的对象,可以对可迭代的对象进行便利,比如字符串、列表等,都是可迭代对象
def f(n):
for i in range(n):
yield i
特点:
1、当调用这个函数的时候,函数内部的代码并不立马执行,这个函数只是返回一个生成器对象
2、当使用for进行迭代的时候,函数内的代码才会被执行
yield与return的区别:
1、return的时候这个函数的局部变量就都销毁了
2、所有return是得到所有结果之后的返回
3、yield是产生一个可以恢复的函数(生成器),恢复了局部变量
4、生成器只有在调用next()时才运行函数生成一个结果
5、return 不能出现在生成器中
yield版本的MD5:
1 #!/usr/bin/env python 2 3 import os 4 import sys 5 import hashlib 6 7 def md5sum(f): 8 m = hashlib.md5() 9 with open(f) as fd: 10 while True: 11 data = fd.read(4096) 12 if data: 13 m.update(data) 14 else: 15 break 16 return m.hexdigest() 17 18 def file_md5(dirpath): 19 pathobj = os.walk(dirpath) 20 for roots,dirs,files in pathobj: 21 for file in files: 22 filename = os.path.join(roots,file) 23 md5 = md5sum(filename) 24 yield "%s %s" % ( md5,filename) 25 26 def main(): 27 try: 28 dirpath = sys.argv[1] 29 except IndexError as e: 30 sys.exit('need one dirctory') 31 if os.path.isfile(dirpath): 32 sys.exit('Please input a directory') 33 for info in file_md5(dirpath): 34 print info 35 36 37 if __name__ == '__main__': 38 main()