昨天主要了解了下生成器,用文档测下lines:
def lines(file): for line in file: yield line yield '\n' for i in lines(sys.stdin): if i: print i print '---'
测试文档test_input.txt:
hello how are you how do you do fine
执行:
输出结果test_output.txt:
hello --- --- how are you --- how do you do --- --- fine --- ---
这里可以注意到hello后面有个换行,然后再是“---”。个人认为原因如下:
首先,test_input.txt实际上是一个list:
test_input = ['hello\n','\n','how areyou\n','how do you do\n','\n','fine']
其次,print打印出的东西自带换行效果:
print ‘1’ print ‘2’
执行效果为:
即先打印出1,然后换行,再打印2,再换行,最后执行结束。
在test_output.txt中也是这样:
先打印’hello\n’,然后换行,然后打印‘---’,再打印’\n’,再换行,再打印‘---’。。。
接下来看生成器blocks:
def blocks(file): block = [] for line in lines(file): if line.strip(): block.append(line) elif block: yield ''.join(block).strip() block = [] test_input = ['hello\n','\n','how are you\n','how do you do\n','\n','fine'] for i in blocks(test_input): if i: print i print '---'
执行结果:
strip()的功能为删除字符串中的’\n’等空白字符(只删除首尾的!!!,中间的不删,比如’\nhello\nhello’.strip(),返回的结果为’hello\nhello),并返回结果。append为再之后添加,’’.join的意思是将block中的各元素用’’连接起来,返回连接后的字符串.
执行流程:
首先是line = ’hello\n’,lines.strip()为True,经过if后,block的值为’hello\n’。之后line = ’\n’,if中的line.strip()返回的是False,进入elif,block的值是’hello\n’,返回hello并置空block。之后line = ‘how are you\n’,if中判断为True,block为’how are you\n’,再然后line = ‘how do you do\n’,if中判断仍为True,此时block为:[‘how
are you\n’,’how do youdo\n’],再之后line = ‘\n’,if中判断为False,进入elif,’’.join(block)执行后返回的值为’how are you\nhow do youdo\n’,执行strip()后返回’how are you\nhow do you do’(这里要注意,strip()只删除字符串首尾的空白字符,不会删除字符串中间的):
综上,
test_input = [‘hello\n‘,‘\n‘,‘how areyou\n‘,‘how do you do\n‘,‘\n‘,‘fine‘] 经过生成器blocks后,生成的结果应该是:
[‘hello’,how are you\nhow do you do’,’fine’]
也就是将输入的文本返回块