【问题标题】:Python 3: How to run functions with parameter in random order?Python 3:如何以随机顺序运行带有参数的函数?
【发布时间】:2016-10-10 13:04:02
【问题描述】:

我知道如何运行没有参数的函数。在这种情况下,我想运行具有随机顺序参数的函数?

它显示了结果,但不是随机的,并且有一些错误:请帮助我更正我的代码。谢谢你:)

import random
def hi(name):
    print('a ' + name)

def howold(old, name):
    print( name + 'is ' + old + "years old")

def howmuch(money):
    print(money + ' dollars')


functions = [hi('John'),howold('20', 'John'),howmuch('50')]
random.shuffle(functions)
for i in functions:
    i()

【问题讨论】:

  • 您的函数直接在functions = [hi('John'),howold('20', 'John'),howmuch('50')] 行中调用。因此它们会打印一条消息并返回无。然后你的列表是 [None, None, None] 并且你尝试调用 None(),这不起作用。
  • @S.deMelo 很好。由于某种原因,我没有发现正在调用该方法。最初看起来该函数正在与字符串进行比较。
  • @S.deMelo 将其作为答案发布
  • @idjaw: dkasak 和伏羲做了,有一个解决方案
  • @S.deMelo 您错过了积累互联网积分的机会! :P

标签: python function random


【解决方案1】:

试试这样的:

functions = [(hi, ['John']), (howold, ['20', 'John']), (howmuch, ['50'])]

random.shuffle(functions)
for func, args in functions:
    func(*args)

【讨论】:

    【解决方案2】:

    您的 functions 列表包含已评估函数的结果,而不是循环中没有参数的部分应用函数(以便您可以使用 i() 调用它们)。

    您可以使用 lambdas 生成不带参数的新函数,如下所示:

    functions = [lambda: hi('John'),
                 lambda: howold('20', 'John'),
                 lambda: howmuch('50')]
    random.shuffle(functions)
    
    for f in functions:
        f()
    

    【讨论】:

      【解决方案3】:

      当这行执行时:

      functions = [hi('John'),howold('20', 'John'),howmuch('50')]
      

      Python 将依次调用您的 3 个函数 hi()howold() 然后 howmuch(),然后将它们的结果存储在名为 functions 的列表中。所以所有print() 都会在那个时候运行。这就是为什么,正如您所说,“它显示了结果但不是随机的”。由于您的所有函数都不会返回任何内容,因此您的 functions 将等于 [None, None, None]

      然后是下面的代码:

      random.shuffle(functions)
      for i in functions:
          i()
      

      将尝试执行 None()。这将产生一个错误,正如你所说的“有一些错误”:这个错误是TypeError: 'NoneType' object is not callable

      如何解决:例如使用functools.partial()

      from functools import partial
      functions = [partial(hi, 'John'), partial(howold, '20', 'John'), partial(howmuch, '50')]
      random.shuffle(functions)
      for i in functions:
          i()
      

      官方文档在这里:https://docs.python.org/2/library/functools.html#functools.partial

      【讨论】:

        【解决方案4】:

        在你的循环中,i 是一个函数而不是一个字符串,因此将它与一个字符串进行比较是行不通的,你最终会陷入 else 中。而是使用if i.__name__ == 'hi

        【讨论】:

          猜你喜欢
          • 2017-02-18
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-15
          • 1970-01-01
          相关资源
          最近更新 更多