2015-09-22 118 views
2

我的Python技能非常基本,這就是爲什麼你要通過一個可怕的混亂。使用循環創建一個隨機語句生成器

基本上,我想用文本文件來製作一個單詞列表。每個文件都有自己的單詞類型(名詞,動詞等)。然後,我想隨機從該列表中挑選單詞,並將它們填充到隨機句子模板中的適當位置,類似於Mad Libs。我的問題是當我嘗試將所有東西都放入循環中。每次我都會得到一個隨機模板,但我無法弄清楚如何隨時隨地選擇隨機選擇的單詞。

這是讀取文件並將其內容添加到列表的功能,這似乎工作正常。

def get_Noun(): 
    infile = open('Noun.txt', 'r') 
    nouns = infile.readlines() 
    infile.close() 

    index = 0 
    while index < len(nouns): 
     nouns[index] = nouns[index].rstrip('\n') 
     index += 1 
    Noun = random.choice(nouns) 
    return Noun 

接下來是我的兩個句話模板功能,以及隨機選擇其中的一個功能:

Noun = get_Noun() 
Noun2 = get_Noun() 
def Cake(): 
    get_Noun() 
    print("The", Noun, "is a", Noun2) 

def XistheNew(): 
    get_Noun() 
    print(Noun, "is the new", Noun2) 

def get_Sentence(): 
    num = random.randrange(1, 3) 
    if num == 1: 
     Cake() 
    elif num == 2: 
     XistheNew() 

最後,我控制整個事情循環。我想過把它變成另一個「主要」功能,但這似乎沒有任何區別。

while sp == '': 
    get_Sentence() 
    sp = input('') 

我想要發生的是一個新的句子,每次按下回車鍵都會彈出一個全新的單詞。

這是輸出的一個例子,如果我運行循環四次:

犛牛是新的青蛙

犛牛是新的青蛙

犛牛是一隻青蛙

犛牛是新來的蛤蟆

的senten選擇的ce似乎是隨機的,但這些詞不會改變。我怎樣才能解決這個問題?我知道我的代碼非常混亂而且有些愚蠢,但是我一旦能夠讓這件事情起作用,我就打算修復它。我非常感謝任何幫助。就像我說的,我是一個完整的小菜,如果可能的話,這麼簡單的答案是值得讚賞的。

回答

0

除了提供我想你的情況指出你的代碼更改

def Cake(): 
    print("The", get_noun(), "is a", get_noun()) 

def XistheNew(): 
    print(get_noun(), "is the new", get_noun()) 

def get_Sentence(): 
    num = random.randrange(1, 3) 
    if num == 1: 
     Cake() 
    elif num == 2: 
     XistheNew() 

這樣當Cake()XistheNew()被稱爲一個新的名詞,從你的方法創建的所有答案get_noun()

注:我將您的名詞變爲小寫。像Vikram鏈接的那樣,Python編碼風格有一個約定。

建立在什麼朱利安說你會添加另一個方法加載文件

nouns = load_nouns() 

def load_nouns(): 
    infile = open('Noun.txt', 'r') 
    nouns = infile.readlines() 
    infile.close() 
    return nouns 

def get_noun(): 
    index = 0 
    while index < len(nouns): 
     nouns[index] = nouns[index].rstrip('\n') 
     index += 1 
    noun = random.choice(nouns) 
    return noun 

這樣你的文件沒有加載每次調用get_noun()時間,讓你的整個文件看起來像這樣

nouns = load_nouns() 

def load_nouns(): 
    infile = open('Noun.txt', 'r') 
    nouns = infile.readlines() 
    infile.close() 
    return nouns 

def get_noun(): 
    index = 0 
    while index < len(nouns): 
     nouns[index] = nouns[index].rstrip('\n') 
     index += 1 
    noun = random.choice(nouns) 
    return noun 

def Cake(): 
    print("The", get_noun(), "is a", get_noun()) 

def XistheNew(): 
    print(get_noun(), "is the new", get_noun()) 

def get_Sentence(): 
    num = random.randrange(1, 3) 
    if num == 1: 
     Cake() 
    elif num == 2: 
     XistheNew() 

希望這會有幫助

0

你只在程序初始化

嘗試有像這樣一個新的功能分配nounnoun2一次:

def set_nouns(): 
    noun = get_noun() 
    noun2 = get_noun() 

,然後調用set_nouns(),而不是get_noun()Cake()XistheNew()功能。

另外,請仔細閱讀python style guide

0

添加到維克拉姆的回答是:

您get_noun功能每次relaods你的整個文件,這是一種浪費。 考慮有一個函數可以將單詞(只有一次)加載到列表中,然後從該列表中隨機選擇一個函數。

最後:用choose_noun()替換所有的名詞和名詞2。

0

只是對維克拉姆的(正確的)答案闡述,問題是這些行:

Noun = get_Noun() 
Noun2 = get_Noun() 

他們創建了兩個變量,NounNoun2,然後運行get_Noun兩次,結果分配給這些變量。

然後,在該行:

print("The", Noun, "is a", Noun2) 

...你是不是重新運行get_Noun。這裏,NounNoun2是對前面創建的兩個字符串的引用,而不是get_Noun方法。在這一點上,程序不關心你最初創建這些變量的方式,它只是重新使用它們的值。

要使get_Noun函數再次運行,必須每次都明確地再次調用它,例如,就像Vikram的回答一樣。爲了說明這一點,這也將工作:

print("The", get_Noun(), "is a", get_Noun()) 

該行調用函數到處都需要一個新的隨機值。

相關問題