我正在尝试构建一个随机单词生成器,随机选择一个辅音和元音结构(例如,' cvvc'可能是'意思是')。它不起作用。我在调试器中运行它时的问题是在while循环结束时的最后两行。
import random
vowelsList = ['a','e','i','o','u']
constonentsList = ['b','c','d','f','g','h','j','k','l','p','q','r','s','t','u','v','w','x','y','z','th','ch','sh','st','ck']
n = random.randint(1,2)
word = ''
struct = ''
length = 0
x = True
len_con = len(constonentsList)
len_vow = len(vowelsList)
length = 0
while x:
if n == 1:
word += constonentsList[random.randint(0,len_con - 1)]
struct += 'c'
length += 1
elif n == 2:
word += vowelsList[random.randint(0,len_vow - 1)]
struct += 'v'
length += 1
n = random.randint(0,2)
if (length >= 3 & n == 0): #If the word is more than 3 letters and n == 0, don't continue
x = False
print(word)
print(struct)
print(length)
答案 0 :(得分:1)
您的代码实际上正在运行,尽管只是公正的。长度反映了您产生的辅音和元音的数量,但生成的单词可能会更长,因为您包含两个字母的辅音,如th
和sh
。但是,还有待改进。
&
运算符没有按照您的想法执行。这是binary bitwise operator;它以整数设置二进制标志:
>>> 1 & 1
1
>>> 2 & 1
3
您希望使用and
operator来执行布尔逻辑AND 测试:
if length >= 3 and n == 0:
对于布尔值,使用&
恰好工作,因为布尔类型会使运算符重载,以便仍然返回布尔值。
您可以使用random.choice()
function大大简化您的程序,并将终止测试移至while
循环条件。 length
变量是多余的;你可以在这里使用len(struct)
:
import random
import string
vowels = 'aeiou'
consonants = [c for c in string.ascii_lowercase if c not in vowels]
consonants += ['th','ch','sh','st','ck']
n = random.randint(1, 2)
word = ''
struct = ''
while len(struct) < 3 or n: # minimum length 3
if n == 1:
word += random.choice(consonants)
struct += 'c'
elif n == 2:
word += random.choice(vowels)
struct += 'v'
n = random.randint(0, 2)
print(word)
print(struct)
print(len(struct))