我的代码中有这个功能:
def load_fasta(filename):
f = open(filename)
return (seq.group(0) for seq in re.finditer(r">[^>]*", f.read()))
这将使文件无限期打开,这不是一个好习惯。生成器耗尽时如何关闭文件?我想我可以将生成器表达式扩展为带有yield语句的for循环,然后关闭文件。我尽可能经常尝试使用函数式编程(仅作为学习练习)。有没有不同的方法来做到这一点?
答案 0 :(得分:1)
使用yield
代替单个生成器表达式。
def load_fasta(filename):
with open(filename) as f:
for seq in re.finditer(r">[^>]*", f.read()):
yield seq.group(0)
for thing in load_fasta(filename):
...
with
语句将在for
循环完成后关闭文件。请注意,由于您无论如何都要将整个文件读入内存,因此您只需使用
def load_fasta(filename):
with open(filename) as f:
data = f.read()
for seq in re.finditer(r">[^>]*", data):
yield seq.group(0)