【发布时间】:2014-03-26 20:27:20
【问题描述】:
我正在尝试在 Python 中创建一个简单的“乱码生成器”程序,它会打印一串由字符、空格和末尾的标点符号组成的随机乱码(换句话说,就是一个完整的句子)。它基本上已经可以工作了,但是我遇到了一个奇怪的问题,我无法理解。
尽管我的代码明确限制了任何超过 11 个字符的单词,但我的乱码字符串中的最后一个“单词”总是比应有的长度长。在浏览了上帝的代码之后,我知道有多少次我仍然不知道可能导致这种情况的原因。有趣的是,只有长字符串才会真正引人注目,而短句(最多 50 个字符)看起来基本没问题。
这是我在 Windows powershell 中运行时得到的两个示例输出:
第一个有 50 个字符:
您要打印出多少乱码? 50
Uxlouasieyt uoygigjas eayouiumza gyfejmu th egkyaulheeb。
秒,300 个字符:
您要打印出多少乱码? 300
Yhiaztexj ekkexe iiuiyx itozlyui zao cegyeuyiml aofzyyreet cofi owzycwobla rreyblioca rla tpocnelavj ytpa x eefra gnyoe yfxyhnivme miert ywy ykhi ee gup eui ttuoi oeoyaf uenyecb apluo yli xmy uiyaoneewe jyxymxal y dzaiglu uo eqkiyeiz ke oxayuiayzf yyi iqoezu ekuioyotly viyslaybiiwvymitoeagrejvavihigpyoxawefunodgu!
请注意句子中的最后一个单词如何随着字符串的长度逐渐变长,而所有排除的单词都保持在 11 个字符以内。就好像在 gibberish_list 中添加空格的代码部分在某些时候被忽略了。但是为什么呢?
这是完整的代码:
import random
def gibberishgen():
alphabet_vowels = ['a','e','i','o','u','y',]
alphabet_consonants = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z']
gibberish_list = []
while True:
gibberishamount = raw_input("How many gibberish characters would you like to print out? ")
if gibberishamount.isdigit():
break
else:
print "Please give me a number!"
# fill the gibberish_list with characters
lasttwochars = ['','']
for char in range(1, int(gibberishamount)+1):
nextcharvowel = random.choice(alphabet_vowels)
nextcharconsonant = random.choice(alphabet_consonants)
if lasttwochars[0] in alphabet_consonants and lasttwochars[1] in alphabet_consonants: # because I don't want more than 2 consonants in a row
nextchar = nextcharvowel
else:
roll = random.randint(1,10)
if roll > 5:
nextchar = nextcharvowel
else:
nextchar = nextcharconsonant
gibberish_list.append(nextchar)
lasttwochars.append(nextchar)
lasttwochars.pop(0)
# insert spaces at randomized intervals to separate the "words" from each other
last_whitespace = 0
for index in range(0, len(gibberish_list)+1):
randspace = random.randint(1,10)
if index >= last_whitespace + 3 and randspace <= 2: # make sure words don't get too short on average
gibberish_list.insert(index, ' ')
last_whitespace = index
elif index > last_whitespace + 10: # ...or too long
gibberish_list.insert(index, ' ')
last_whitespace = index
punctlist = ['.', '!', '?']
gibberishstring = ''.join(gibberish_list)
finalstring = gibberishstring.capitalize() + random.choice(punctlist)
print "\n", finalstring, "\n"
gibberishgen()
如果有人向我解释这里发生了什么,我将不胜感激。我学习 python 才两个月,所以是的,很可能我错过了一些应该很明显的东西。
还可以随时指出您发现的任何不好的语法或练习。
【问题讨论】: