【问题标题】:Can you change function names a in while loop - python3你可以在while循环中更改函数名称吗 - python3
【发布时间】:2020-10-22 19:13:02
【问题描述】:

我想知道您是否可以在 while 循环中更改函数名称?例如,如果我有 X 个函数,称为 function1、function2、function3、functionX,我可以使用循环数跟踪器执行该函数吗?像这样的:

def function1():
    do this

def function2():
    do that

def function3():
    do something

def...

i = 1

while i <= X:
    function(i)
    i += 1

显然这不起作用,但有没有办法让它起作用?

编辑: 我是 python 新手,所以我想尝试做一个简单的项目,而不是看教程。我正在尝试制作一个“刽子手”游戏。根据正确或错误答案,需要循环来绘制衣架和零件。每个函数都有绘制下一步的代码。循环中有一个 if 语句,如果用户回答错误的字母,则应该使用 function(i)(取决于用户错过的次数)。

谢谢!

【问题讨论】:

  • 这几乎可以肯定是一个 XY 问题。如果你解释了为什么你想这样做,有人可能会建议正确的模式
  • 此外,“循环号码跟踪器”听起来您应该使用for 循环,而不是while
  • 对不起,堆栈溢出和 python 的新手。将编辑我的问题,以便更清楚。谢谢!
  • 为什么会有一堆函数名为function0 - functionN?最好的解决方案是简单地将这些函数放入一个容器中,例如list,然后遍历该列表。
  • @juanpa.arrivillaga - 是的,将函数存储在列表中做到了,谢谢!

标签: python python-3.x python-2.7 function while-loop


【解决方案1】:

您可以将它们全部放在一个列表中并按索引调用它们。那么你就不用担心它们叫什么了,只需要关心它们应该被调用的顺序,这对你来说似乎是最重要的。

def function1():
    print('function 1')


def function2():
    print('function 2')


def function3():
    print('function 3')

functions = [function1, function2, function3]


i = 1

while i <= 3:

    functions[i-1]() #note the () to call the function

    i += 1

【讨论】:

    【解决方案2】:

    你可以使用 评估(“函数1()”) 运行 function1,这样您就可以在每次 for 循环运行时更改字符串。

    【讨论】:

    • 虽然这在技术上是可行的,但使用 eval 几乎总是一个糟糕设计的标志。
    【解决方案3】:

    您可以将函数分配给 python 中的变量。然后可以用另一个函数覆盖这个变量。可以在这里看到一个例子:

    
    def fn1(x):
       return x
    
    def fn2(x):
       return x*2
    
    
    test = fn1
    print(test(4)) # prints 4
    
    test = fn2
    print(test(4)) # prints 8
    

    将此应用于您的示例,我们可以创建一个包含所有函数的数组,您可以遍历索引或字典,其中键是您的 id,值是您的函数:

    def function1(args):
        do this
    
    def function2(args):
        do that
    
    def function3(args):
        do something
    
    myfunctions = {'1':function1,'2':function2, etc...}
    
    i = 1
    while i <= len(myfunctions):
        myfunctions[str(i)](args)
        i += 1
    

    或使用列表方法:

    def function1(args):
        do this
    
    def function2(args):
        do that
    
    def function3(args):
        do something
    
    myfunctions = [function1,function2, etc...]
    
    for i in range(myfunctions):
        myfunctions[i](args)
    

    我会说,如果你运行所有函数 0:X 列表方法会更简单,但如果你有数据告诉你运行键值字典会更容易。

    在理想情况下,您将拥有一个根据其输入执行不同操作的函数。

    关于 eval 的注意事项根据其他答案,使用 eval 也可以,但是为了提高效率和良好的编码习惯,最好尽量避免!

    【讨论】:

      【解决方案4】:

      在你的情况下,当一个函数跟随另一个函数时,我会做这样的事情:

      def function1():
          do this
          return function2
      
      def function2():
          do that
          return function3
      
      def function3():
          do something
          return fail?
      
      def...
      
      function = function1
      i = 1
      while i <= X:
          function = function()
          i += 1
      

      其中总是有一个 function 被调用,但它会将每次迭代更改为下一次迭代。

      首先,我想提出与其他人相同的建议,即在列表或字典中编写函数并迭代它们。但我认为返回下一个函数更适合您的情况。

      【讨论】:

      • 谢谢,我用列表尝试了其他答案,效果很好,但我也会尝试你的解决方案
      【解决方案5】:

      第一件事:如果可以的话,你应该吗?

      第二件事:是的,你可以,但可能不应该。

      def function1():
          return 1
      
      def function2():
          return 2
      
      # ...
      
      i, num = 1, 2 # num can be as much as you have defined functions
      while i < num + 1:
          print(globals()[f'function{i}']())
          i += 1
      
      # out
      # 1
      # 2
      

      也许你应该看看lambda expressionsglobals

      @Alon的回答中所述,您也可以eval。但请记住,这两种解决方案都是糟糕的设计造成的,我再说一遍:有能力不是这样做的好理由

      【讨论】:

      • 使用globals() 也是不好的设计
      • 是的,这就是为什么我写了“记住两个解决方案都是糟糕的设计”,就像“我给出的解决方案使用@987654327 @ 来自糟糕的设计。问题是:使用返回相似结果的相似名称函数本身就是糟糕的设计。
      • 公平,你是对的。 stackoverflow会有“回答问题的最佳实践”吗?我只看了“如何提问”。
      • 哈哈哈,是的,我明白了。我正在学习工程学,所以大多数时候人们来寻求解决方案,而不是学习如何处理和更好地解决问题。在访问 stackoverflow 时我应该改变这种心态。
      • 从我收集到的情况来看,人们只是发布东西而不考虑它,这非常可悲。早期怎么样?
      猜你喜欢
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多