我有几个函数可以保存程序使用的各种全局变量。它们总是一起被调用,因此我创建了一个函数来调用它们,如下所示:
def save_reflector(rf):
with open('reflector.txt.',mode='w') as f:
for num in rf:
f.write(str(num)+'\n')
def save_rotors(r1,r2,r3,rpos1,rpos2,rpos3):
with open('rotors.txt.',mode='w') as f:
f.write(str(rpos1)+'\n')
for num in r1:
f.write(str(num)+'\n')
f.write(str(rpos2)+'\n')
for num in r2:
f.write(str(num)+'\n')
f.write(str(rpos3)+'\n')
for num in r3:
f.write(str(num)+'\n')
def save_wiring(wr):
with open('wiring.txt.',mode='w') as f:
for num in wr:
f.write(str(num)+'\n')
def save_machine(r1,r2,r3,rpos1,rpos2,rpos3,wr,rf,v = None):#use v for verbose option
if v is not None:
print('Saving rotors...')
save_rotors(r1,r2,r3,rpos1,rpos2,rpos3)
print('Saving wiring...')
save_wiring(wr)
print('Saving reflector')
save_reflector(rf)
print('Machine Successfully saved')
else:
save_rotors(r1,r2,r3,rpos1,rpos2,rpos3)
save_wiring(wr)
save_reflector(rf)
因此,我总是一起调用这些函数,而不是分开调用。这就是为什么我想到只有on函数才能调用所有这些函数。但这要求我从外部函数到内部函数两次传递变量(这可能效率较低?),当我只键入所有变量时,这并不是完全必要的。但是,在我的主循环中使用save_machine()
时,它看起来更好,也更Python化。
我不确定哪个更pythonic或更有效,所以任何建议都会受到赞赏。
答案 0 :(得分:1)
此群集的最终目的是提高代码的可读性和可维护性。由于您的业务流程要求将这三个功能作为易于命名的流程步骤save machine
依次调用,因此将其包装在一个功能中是很有意义的。这不仅是Pythonic,而且在几乎所有应用程序中都具有相同的含义,而与语言无关。
这消除了调用程序的混乱,并减少了以后的开发在处理此步骤时出错的机会。您已将调用程序中的大约十行编码减少为仅一行(即函数调用)。
答案 1 :(得分:1)
转发输入没有错。能够将相关语句组合在一起是首先要有方法的全部要点。
通常在编写这样的代码时,我会从以下思路开始。 2个事件可能是巧合,但3个是模式。也就是说,如果您编写同一段代码两次以上,唯一改变的是输入变量,那么该是创建函数的时候了。
让我们以代码for num in rf: ...
开头。我到处都能看到。让我们将该逻辑移至其自己的方法:
def write_r(f, r):
for num in r:
f.write(str(num)+'\n')
def save_reflector(rf):
with open('reflector.txt.',mode='w') as f:
write_r(f, rf)
def save_wiring(rf):
with open('wiring.txt.',mode='w') as f:
write_r(f, rf)
现在只需一点点工作,就可以使save_rotors
处理n
对输入
def save_rotors(r_list, rpos_list):
with open('rotors.txt.',mode='w') as f:
with r, rpos in zip(r_list, rpos_list)
f.write(str(rpos)+'\n')
write_r(f, r)
您的主要方法仍然相同:
def save_machine(r1,r2,r3,rpos1,rpos2,rpos3,wr,rf,v = None):
...
save_rotors([r1,r2,r3],[rpos1,rpos2,rpos3])
save_wiring(wr)
save_reflector(rf)