繁体   English   中英

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

[英]Using a loop to make a random sentence generator

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

我想发生的事情是,每当我按下Enter键时,就会弹出一个带有全新单词的新句子。

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

y牛是新来的青蛙

y牛是新来的青蛙

牛是青蛙

y牛是新来的青蛙

选择的句子似乎是随机的,但单词不会改变。 我怎样才能解决这个问题? 我知道我的代码非常混乱而且有些愚蠢,但是我计划一旦我能使这件事正常工作就对其进行修复。 我非常感谢您的帮助。 就像我说的,我是一个完整的菜鸟,因此,如果可能的话,我们欢迎您提供简单的答案。

你只分配nounnoun2在程序初始化一次

尝试具有如下新功能:

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

然后调用set_nouns()代替get_noun()在你的Cake()XistheNew()函数。

另外,请通读python样式指南

添加到Vikram的答案中:

您的get_noun函数每次都会重新整理整个文件,这很浪费。 考虑具有一个将单词(仅一次)加载到列表中的函数,然后再从该列表中随机选择一个函数。

最后:用choose_noun()替换所有名词和名词2。

为了详细说明Vikram的(正确)答案,问题在于以下几行:

Noun = get_Noun()
Noun2 = get_Noun()

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

然后,在该行中:

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

...您不会重新运行get_Noun 在这里, NounNoun2是对先前创建的两个字符串的引用, 而不是get_Noun方法的get_Noun 在这一点上,该程序不在乎您最初如何创建这些变量,而只是重新使用它们的值。

为了使get_Noun函数再次运行,您必须每次都明确地再次调用它,例如在Vikram的答案中。 为了说明这一点,这也将起作用:

print("The", get_Noun(), "is a", get_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()

这样,当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()

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM