【问题标题】:Random word generator in PythonPython中的随机词生成器
【发布时间】:2020-05-15 16:17:21
【问题描述】:

编辑:进行了一些更改 - 现在程序结束了,但仍然没有输出任何内容。

import random

dict = open("british-english")
word_list = dict.readlines()

def generate():
    global word_list
    prompt = random.choice(word_list)
    if len(prompt) < 3:
        generate()
    else:
        return prompt

generate()



print(prompt)

我编写了以下代码,尝试从我在 linux 机器上找到的 brisih-english 文本文件中生成三个或更多字母的随机单词。我已将该文件复制到与 .py 文件相同的目录中。当我在终端中运行程序时,我没有得到任何输出,但程序似乎无限运行。我仍然是这方面的初学者,但这似乎是一个如此简单的程序,我想知道我可能会错过什么。我已经运行了一些测试来打印列表的不同元素,以确保我可以访问这些单词,效果很好。

import random

#list contains 101,825 elements
dict = open("british-english")
word_list = dict.readlines()

prompt = ""

def generate():
    global dict
    i = random.randint(0, 101824)
    prompt = word_list[i]
    return prompt

while len(prompt) < 3:
    generate()

print(prompt)

【问题讨论】:

  • 提示:global dict 行在generate 中做了什么?考虑到这一点,当检查条件len(prompt) &lt; 3 时,您期望prompt 的值是多少,为什么? len 的值是多少?
  • 我认为 global 是函数访问主体中定义的变量所必需的。我希望 len(prompt) 返回字母 i.i 的数量。字符串的长度。我错了吗?
  • 顺便说一句:要随机选择word_list 元素之一,只需使用random.choice。这样,您不必担心列表有多长,并且如果文件更改,代码也不会中断。此外,您可以先从列表中删除短单词,而不是重复直到找到足够长的单词。
  • 刚刚意识到我不再需要函数内部的 dict - 在早期版本中,我认为函数内部有 readlines 位。
  • 现在,请注意您当前的代码如何显示global prompt?因此,generate 是否访问全局变量prompt?现在,while 循环呢?它在函数内部吗?那么,是不是使用了全局变量呢?

标签: python random word generate


【解决方案1】:
prompt = ""

这是一个全局变量。

def generate():
    global dict
    i = random.randint(0, 101824)
    prompt = word_list[i]
    return prompt

因为这段代码没有global prompt,因此全局变量prompt没有prompt = word_list[i]修改。

while len(prompt) < 3:
    generate()

每次循环时,generate 的值return 都会被忽略,因为没有对该值进行任何处理。 len(prompt) 继续使用上面的 "" 值,小于 3 个字符;因此循环不能中断。

不应为此使用全局变量。相反,您应该编写实际使用返回值的代码。例如:

prompt = generate()
while len(prompt) < 3:
    prompt = generate()

如果将这些行放在另一个函数中,它们将继续工作,因为它们采用从 generate() 返回的值并为其指定一个可以在本地使用的名称。


注意generate 确实使用了全局变量word_list,尽管也没有global word_list。您确实会自动获得对全局变量的只读访问权限。但如果有同名的局部变量,则优先使用。

【讨论】:

  • 我觉得我现在终于了解全局变量了。非常感谢 - 我的代码现在可以按照我的意愿运行!
【解决方案2】:

这是由于您的 while 循环初始化为空,因此大小为 0。您在此处声明的生成函数仅定义了该函数,除非您调用它,否则它不会执行。因此,如果您打算在开始循环之前调用 generate ,则可以在 while 循环之前调用一次。

【讨论】:

  • 感谢您的回答。我不确定我是否完全理解,但我在 while 循环之前添加了一个新行来调用该函数,我仍然得到相同的结果。我的想法是我在开头设置了 prompt = "" ,所以 len > 3,导致 while 循环开始并调用函数 - 我错了吗?
猜你喜欢
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
相关资源
最近更新 更多