代码之家  ›  专栏  ›  技术社区  ›  RhythmInk

嵌套函数调用始终在一起

  •  1
  • RhythmInk  · 技术社区  · 7 年前

    我有几个函数可以保存程序使用的各种全局变量。它们总是一起调用的,因此我创建了一个函数来调用它们,如下所示:

    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() 在我的主循环中使用时,看起来更好更像蟒蛇。

    我不确定哪一个更像蟒蛇或者更有效,所以任何建议都是值得赞赏的。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Prune    7 年前

    这种集群的最终目的是服务于代码的可读性和可维护性。因为您的业务流程要求将这三个函数按顺序调用为一个易于命名的流程步骤 save machine ,将其包装在函数中是非常有意义的。这不仅更像是蟒蛇,它在几乎所有的应用程序中都有同样的意义,不管语言是什么。

    这将消除调用程序中的混乱,并减少以后在处理此步骤时出错的开发机会。在您的调用程序中,您已经将大约10行代码减少到只有一行——函数调用。

        2
  •  1
  •   flakes    7 年前

    转发输入没有问题。能够将相关的语句组合在一起首先是拥有方法的全部意义。

    一般来说,在编写这样的代码时,我会从以下心态开始。两次可能是巧合,但三次是一种模式。也就是说,如果你写同一段代码的次数超过了两次,其中唯一改变的是输入变量,那么是时候做一个函数了。

    让我们从代码开始 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)