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

2024-04-25 23:44:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我陷入了一个可能很简单的问题: 当对函数使用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!'}

Tags: 函数textselffieldsisdefresultgood
2条回答

抛开一些奇怪的数据结构选择,您正在调用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()。你知道吗

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

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函数。你知道吗

相关问题 更多 >