gpt4 book ai didi

python - 避免 Python 代码中的代码重复

转载 作者:行者123 更新时间:2023-11-28 20:10:52 25 4
gpt4 key购买 nike

考虑以下 Python 片段:

af=open("a",'r')
bf=open("b", 'w')

for i, line in enumerate(af):
if i < K:
bf.write(line)

现在,假设我要处理 KNone 的情况,所以写入会一直持续到文件的末尾。我现在正在做

if K is None:
for i, line in enumerate(af):
bf.write(line)
else:
for i, line in enumerate(af):
bf.write(line)
if i==K:
break

这显然不是处理此问题的最佳方式,因为我正在复制代码。有没有更综合的方法可以处理这个问题?自然的事情会是让 if/break 代码仅在 K 不是 None 时出现,但这涉及到像 Lisp 宏那样动态地编写语法,Python 做不到的。澄清一下,我不关心具体的案例(我选择它的部分原因是它的简单性),就像学习一般知识一样我可能不熟悉的技术。

更新:阅读人们发布的答案并进行更多实验后,这里有更多评论。

如上所述,我一直在寻找可以推广的通用技术,我认为@Paul 的回答,即使用 iterrools 中的 takewhile,最适合这个问题。作为奖励,它也比我上面列出的幼稚方法快得多;我不确定为什么。我不是很熟悉 itertools,虽然我看过几次。在我看来,这是一个函数式编程的案例为了胜利! (有趣的是,itertools 的作者曾经征求关于删除 takewhile 的反馈。请参阅线程开头 http://mail.python.org/pipermail/python-list/2007-December/522529.html 。)我在上面简化了我的情况,实际情况是有点乱-我正在循环中写入两个不同的文件。所以代码看起来更像:

for i, line in enumerate(af):
if i < K:
bf.write(line)
cf.write(line.split(',')[0].strip('"')+'\n')

鉴于我发布的示例,@Jeff 合理地建议在 KNone 的情况下,我只复制文件。由于在实践中无论如何我都在循环,所以这样做并不是一个明确的选择。但是,takewhile 可以毫不费力地泛化到这种情况。我还有另一个在这里没有提到的用例,并且也能够在那里使用 takewhile,这很好。第二个例子看起来像(逐字)

i=0
for line in takewhile(illuminacond, af):
line_split=line.split(',')
pid=line_split[1][0:3]
out = line_split[1] + ',' + line_split[2] + ',' + line_split[3][1] + line_split[3][3] + ',' \
+ line_split[15] + ',' + line_split[9] + ',' + line_split[10]
if pid!='cnv' and pid!='hCV' and pid!='cnv':
i = i+1
of.write(out.strip('"')+'\n')
tf.write(line)

在这里我可以使用条件

if K is None:
illuminacond = lambda x: x.split(',')[0] != '[Controls]'
else:
illuminacond = lambda x: x.split(',')[0] != '[Controls]' and i < K

根据@Paul 的原始示例。但是,尽管代码有效,但我对从外部范围获取 i 这一事实并不完全满意。有更好的方法吗?或者也许它应该是一个单独的问题。无论如何,感谢所有回答我问题的人。向@Jeff 致敬,他提出了一些不错的建议。

最佳答案

for i, line in enumerate(af):  
if K is None or i < K:
bf.write(line)
else:
break

关于python - 避免 Python 代码中的代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5863272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com