2016-09-26 32 views
1

我卡上可能簡單的問題: 使用與選擇函數時,好像所有的人都被執行,而只有一個應該。 例子:的Python:執行列出的所有函數調用隨機選擇

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!'} 
+0

當你寫'{self.fields [ 「晨報」]:PrintStrings()}',它會調用'PrintStrings()'。創建'function'列表的整體執行 – njzk2

+0

順便說一句 - 目前被稱爲'Text'變量應改爲被命名爲'text';請參閱[PEP-8,Python風格指南](https://www.python.org/dev/peps/pep-0008/)。 –

回答

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()都在同一個迭代。

+0

是的,我曾嘗試過,但它打印的對象,而不是字符串。我試過str(),沒有運氣。 更新後的字符串:{「早上好!」:<在0x7f28f7a96d70功能PrintStrings>} – user1473508

+0

@ user1473508,你需要做的是*通話*您所選擇的功能,** **後選擇它。你原來的問題是通過調用它造成* *前,你選擇了它(這將導致即使是功能沒有選擇要調用),您在您的評論以上是由不調用它在所有引起所述的問題。 –

+0

@Charles我不確定要關注。 – user1473508

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功能。