Python:随机选择执行列出的所有函数调用

时间:2016-09-26 19:50:13

标签: python random choice

我坚持一个可能很简单的问题: 当使用函数选择时,似乎所有这些都被执行而只有一个应该执行。 例如:

from ordereddict import OrderedDict
from random import choice

def PrintStrings():
    Text = choice(["Gutentag!", "Ni hao!", "Hola!"])
    print "Chosen Text is:", Text
    return Text

class Greeting():
    fields = OrderedDict([
         ("Morning",     "Hi"),
         ("Afternoon",   "Good Afternoon!"),
         ("Evening",     "Good Evening!"),
    ])

    def change(self):
        self.fields["Morning"] = "Good morning!"

    def changerandom(self, n = 1): 
        function=[
                    {self.fields["Morning"]: PrintStrings()},
                    {self.fields["Afternoon"]: PrintStrings()},
                    {self.fields["Evening"]: PrintStrings()},
                 ]
        result = {}
        for i in range(n):
            result.update(choice(function))
            print "Updated string:",result
            return result

text = Greeting()
text.change()
text.changerandom()

运行此脚本时,我得到所有3

                    {self.fields["Morning"]: PrintStrings()},
                    {self.fields["Afternoon"]: PrintStrings()},
                    {self.fields["Evening"]: PrintStrings()},

执行,但不应该。 该脚本返回:

Chosen Text is: Ni hao!
Chosen Text is: Gutentag!
Chosen Text is: Hola!
Updated string: {'Good morning!': 'Hola!'}

预期结果是:

Chosen Text is: Hola!
Updated string: {'Good morning!': 'Hola!'}

2 个答案:

答案 0 :(得分:0)

抛开一些奇怪的数据结构选择,你在function调用一个函数。删除括号'将该函数作为对象传递。

PrintStrings() - > PrintStrings

这是获得所需输出的可能解决方案:

def changerandom(self, n = 1): 
    result = {}
    for i in range(n):
        key_choice = Greeting.fields[choice(Greeting.fields.keys())]
        result[key_choice] = PrintStrings()
        print "Updated string:", result
        return result

通过这种方法,我们获取随机密钥,并在同一次迭代中调用PrintStrings()

答案 1 :(得分:0)

对象将为您提供仅在序列化时运行代码的方法,而不是实例化:

class PrintStrings(object):
    def __init__(self):
        self.text = None
    def __str__(self):
        if self.text is None:
            text = choice(["Gutentag!", "Ni hao!", "Hola!"])
            print "Chosen Text is:", text
        return text
    def __repr__(self):
        return str(self)

您的其余代码可以按原样使用,此类替换您的PrintStrings函数。