【问题标题】:Using a loop to make a random sentence generator使用循环制作随机句子生成器
【发布时间】:2015-09-22 00:32:36
【问题描述】:

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

我想要发生的是每次我按回车时都会弹出一个带有全新单词的新句子。

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

牦牛是新青蛙

牦牛是新青蛙

牦牛是青蛙

牦牛是新青蛙

选择的句子似乎是随机的,但单词并没有改变。我怎样才能解决这个问题?我知道我的代码非常混乱而且有点白痴,但我计划在我能让这件事正常工作时修复它。我真的很感激任何帮助。就像我说的那样,我是一个完全的菜鸟,所以如果可能的话,我们很感激简单的答案。

【问题讨论】:

    标签: python random


    【解决方案1】:

    除了提供的所有答案之外,我想在您的情况下指出您将代码更改为

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

    希望对你有帮助

    【讨论】:

      【解决方案2】:

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

      尝试使用这样的新功能:

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

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

      另外,请阅读python style guide

      【讨论】:

        【解决方案3】:

        补充维克拉姆的回答:

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

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

        【讨论】:

          【解决方案4】:

          只是为了详细说明维克拉姆的(正确)答案,问题在于以下几行:

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

          那一行在需要新随机值的地方调用函数

          【讨论】:

            猜你喜欢
            • 2014-02-14
            • 2019-01-04
            • 1970-01-01
            • 2017-08-18
            • 2013-11-19
            • 2021-04-30
            • 1970-01-01
            • 2011-02-12
            • 1970-01-01
            相关资源
            最近更新 更多