使用循环制作随机句子生成器

时间:2015-09-22 00:32:37

标签: python random

我的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('')

我想要发生的是每次点击输入时都会弹出一个全新单词的新句子。

如果我运行循环四次,这是输出的示例:

  牦牛是新的青蛙

     牦牛是新的青蛙

     

牦牛是青蛙

     牦牛是新的青蛙

选择的句子似乎是随机的,但单词不会改变。我怎样才能解决这个问题?我知道我的代码非常混乱,有些愚蠢,但是我计划在我能让这一件事起作用之后解决它。我非常感谢任何帮助。就像我说的那样,我是一个完整的菜鸟,如果可能的话,我们会很感激。

4 个答案:

答案 0 :(得分:0)

您只是在程序初始化时分配nounnoun2

尝试使用这样的新功能:

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

然后在set_nouns()get_noun()函数中调用Cake()而不是XistheNew()

另外,请仔细阅读python style guide

答案 1 :(得分:0)

添加到Vikram的回答:

你的get_noun函数每次都会重新下载你的整个文件,这是一种浪费。 考虑使用一个函数将你的单词(只有一次)加载到一个列表,然后是一个从该列表中随机选择的函数。

最后:用choose_noun()替换所有Noun和Noun2。

答案 2 :(得分:0)

只是详细说明维克拉姆(正确)的答案,问题是这些问题:

Noun = get_Noun()
Noun2 = get_Noun()

他们创建了两个变量NounNoun2,然后运行get_Noun两次并将结果分配给这些变量。

然后,在行中:

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

......你没有重新运行get_Noun。这里,NounNoun2是对先前创建的两个字符串的引用,get_Noun方法。此时,程序并不关心您最初如何创建这些变量,它只是重新使用它们的值。

要让get_Noun函数再次运行,您每次都必须再次显式调用它,例如就像维克拉姆的回答一样。为了说明这一点,这也可行:

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

该行在任何地方调用函数需要新的随机值。

答案 3 :(得分: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编码风格有一个惯例。

在Julien所说的基础上,你将添加另一种加载文件的方法

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()

希望这有帮助