问题描述
我是学习 Python 的新手,我想知道我的程序无法运行的原因。生成工作完美,但它尝试检测字母 D 的部分并没有停止脚本并打印完成。
这是我的代码:
import random
import string
import sys
import time
def get_random_string(length):
while True:
letters = string.ascii_lowercase
result_str = ''.join(random.choice(letters) for i in range(length))
time.sleep(1) #Basically stops the program from using 100% of my cpu.
print("GENErating: ",result_str)
if result_str == d:
print("TASK COMPLETED! ")
get_random_string(1)
解决方法
您创建了一个无限循环,并且您检查的条件实际上从未达到,因为它不在循环内。
- 您需要缩进
if
块,此时您会得到一个NameError
,因为d
不是一个已定义的变量。 - 您实际上要做的是与字符串
"d"
进行比较,因此我们可以将其更改为该字符串。 - 在此之后输入
break
或return
也有帮助,这样它在找到后实际上会退出。 - 此外,与其进行相等比较,不如使用
startswith
以便在使length
大于 1 时循环仍会退出。 - 现在您的搜索实际上将退出,您可以摆脱
time.sleep
调用,因为您的代码不会锁定,因此它可以运行得更快。 - 最后,为了灵活起见,您也可以将搜索目标设为参数。
因此:
import random
import string
def get_random_string(length,target):
while True:
letters = string.ascii_lowercase
result_str = ''.join(random.choice(letters) for i in range(length))
print("GENERATING:",result_str)
if result_str.startswith(target):
print("TASK COMPLETED!")
break
get_random_string(1,"d")
,
我相信你只需要缩进 if 块。 以这种方式编写的 if 语句位于无限 while 循环之后,因此永远不会到达。
只需将其重写为:
import random
import string
import sys
import time
def get_random_string(length):
while True:
letters = string.ascii_lowercase
result_str = ''.join(random.choice(letters) for i in range(length))
time.sleep(1) #Basically stops the program from using 100% of my CPU.
print("GENERATING: ",result_str)
if result_str == "d":
print("TASK COMPLETED! ")
return
get_random_string(1)
还可以考虑,如果参数长度大于 1,那么 result_str
永远不会等于 "d"
(它将是一个包含多个字母的字符串)并且您将陷入困境无限循环。