使用random.shuffle随机填充函数列表

时间:2018-01-12 01:58:29

标签: python list typeerror

我有一些功能:

exec(index + 1);

我想把它们放在一个列表中,随机播放它们,然后连续给它们打电话:

def feeling():
    ...

def homesick():
    ...

def miss():
     ...

我的想法就是调用每个函数:

import random
prompts = [feeling, homesick, miss]

但这会抛出一个

random.shuffle(prompts)()

我做错了什么,怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

您有一项任务是随机选择其中一项功能。这是一个小型演示,你正在做什么,但是正确。

>>> f = [sum, max, min]
>>> random.shuffle(f)
>>> f.pop()([1, 2, 3])   # looks like we picked max. Alternatively, `f[0](...)`
3 

或者,如果它只是你想要的一个功能,则根本不需要使用random.shuffle。请改用random.choice

>>> random.choice(f)([1, 2, 3])
>>> 3

为什么会出现错误

正如文档所述,

random.shuffle执行 inplace 改组。

>>> y = list(range(10))
>>> random.shuffle(y)
>>> y
[6, 3, 4, 1, 5, 8, 9, 0, 7, 2]

因此,当您调用该函数时,不会得到任何回报。换句话说,期望None作为回报。

此外,在对象上调用()会调用其__call__方法。由于NoneType个对象没有这样的方法,因此TypeError会出错。对于可调用的对象,您需要 -

class Foo:
    def __init__(self, x):
        self.x = x
    def __call__(self, y):
        return self.x + y

>>> f = Foo(10)
>>> f(20)
30

作为练习,请尝试删除__call__并重新运行代码。致电f(20)会给您带来同样的错误。