[英]Else statement in Python not working properly
想知道是否有人可以帮助我修复带有错误消息的最后一个 else 语句。 如果我输入任何不是 YyNn 的内容,它会起作用,但是,如果我输入 YyNn,错误消息仍然会出现。 我整晚都在研究它,我觉得我错过了明显的答案 - 但它让我发疯了。 将不胜感激对此的解决方案。 非常感谢。
import random
score = 0
def rollAllDice():
values=random.randint(1,6), random.randint(1,6), random.randint(1,6), random.randint(1,6), random.randint(1,6)
print("You rolled 5 dice. The values are:")
print("Die 1:", values[0])
print("Die 2:", values[1])
print("Die 3:", values[2])
print("Die 4:", values[3])
print("Die 5:", values[4])
return values
myDice=rollAllDice()
def allSame(myDice):
result = myDice[0] == myDice[1] and myDice[0] == myDice[2] and myDice[0] == myDice[3] and myDice[0] == myDice[4]
len(set(myDice)) == 1
return result
def diceReroll(myDice):
if allSame(myDice):
if keepDie1[0] in 'YyNn':
die1 = random.randint(1,6)
elif keepDie2[1] in 'YyNn':
die2 = random.randint(1,6)
elif keepDie3[2] in 'YyNn':
die3 = random.randint(1,6)
elif keepDie4[3] in 'YyNn':
die4 = random.randint(1,6)
elif keepDie5[4] in 'YyNn':
die5 = random.randint(1,6)
else: # < ---- the else statement I need help on.
print("I'm sorry. Please only enter Y or N.")
keepDie1=input("\nWould you like to reroll die 1? [Y/N]: ")
keepDie2=input("Would you like to reroll die 2? [Y/N]: ")
keepDie3=input("Would you like to reroll die 3? [Y/N]: ")
keepDie4=input("Would you like to reroll die 4? [Y/N]: ")
keepDie5=input("Would you like to reroll die 5? [Y/N]: ")
diceReroll(myDice)
我冒昧地对您的代码进行了一些假设。 如果你觉得我走得太远,请在评论中告诉我,我会根据你的需要折射答案。
if/else 循环的基本问题是缩进(正如其他人在评论中已经提到的)。 但我认为您遇到此问题的真正原因在于您的代码结构。 因此,我建议您进行两项更改,以隔离用户输入并删除有问题的 if/else 子句。
首先,您正在验证骰子滚动逻辑中的输入,因此具有 if/else 循环:
if allSame(myDice):
if keepDie1[0] in 'YyNn':
die1 = random.randint(1,6)
elif keepDie2[1] in 'YyNn':
die2 = random.randint(1,6)
elif keepDie3[2] in 'YyNn':
die3 = random.randint(1,6)
elif keepDie4[3] in 'YyNn':
die4 = random.randint(1,6)
elif keepDie5[4] in 'YyNn':
die5 = random.randint(1,6)
else: # < ---- the else statement I need help on.
print("I'm sorry. Please only enter Y or N.")
正如@Selcuk 所指出的,这里的 else 部分缩进严重,导致您收到该错误消息。 此函数已经包含您的应用程序逻辑,它根本不应该处理用户输入验证。
我建议您将用户输入部分重写为一个单独的函数(对用户提示消息的更改称为 f 字符串。如果您不明白,可以查找它):
def diceRerollPrompt(diceNumber):
while True:
prompt = input(f'Would you like to reroll die {diceNumber}? [Y/N]: ').upper()
if prompt in 'YN':
return prompt
else:
print("I'm sorry. Please only enter Y or N.")
keepDie1=diceRerollPrompt(1)
keepDie2=diceRerollPrompt(2)
keepDie3=diceRerollPrompt(3)
keepDie4=diceRerollPrompt(4)
keepDie5=diceRerollPrompt(5)
这段代码会反复要求用户输入字符,直到我们的用户输入 yYn 或 N。它确保如果用户输入错误,则立即通知用户他/她的输入是错误的。 您还可以
allSame()
代码与错误输入隔离,无需在业务逻辑中编写大量验证,从而大大简化了allSame()
函数。 您和用户的双赢。
之后,您可以简单地删除有问题的 if/else 循环并像这样更改您的diceReroll
函数:
def diceReroll(myDice):
if allSame(myDice):
if keepDie is 'Y':
die1 = random.randint(1,6)
elif keepDie2 is 'Y':
die2 = random.randint(1,6)
elif keepDie3 is 'Y':
die3 = random.randint(1,6)
elif keepDie4 is 'Y':
die4 = random.randint(1,6)
elif keepDie5 is 'Y':
die5 = random.randint(1,6)
请注意,我冒昧地将
YyNn
更改为Y
因为如果用户说不,您不想重新掷骰子,对吗?
完整解决方案如下
import random
score = 0
def rollAllDice():
values=random.randint(1,6), random.randint(1,6), random.randint(1,6), random.randint(1,6), random.randint(1,6)
print("You rolled 5 dice. The values are:")
print("Die 1:", values[0])
print("Die 2:", values[1])
print("Die 3:", values[2])
print("Die 4:", values[3])
print("Die 5:", values[4])
return values
myDice=rollAllDice()
def allSame(myDice):
result = myDice[0] == myDice[1] and myDice[0] == myDice[2] and myDice[0] == myDice[3] and myDice[0] == myDice[4]
len(set(myDice)) == 1
return result
def diceReroll(myDice):
if allSame(myDice):
if keepDie1 is 'Y':
die1 = random.randint(1,6)
elif keepDie2 is 'Y':
die2 = random.randint(1,6)
elif keepDie3 is 'Y':
die3 = random.randint(1,6)
elif keepDie4 is 'Y':
die4 = random.randint(1,6)
elif keepDie5 is 'Y':
die5 = random.randint(1,6)
def diceRerollPrompt(diceNumber):
while True:
# if you want to use the simple string concatenation:
# prompt = input('Would you like to reroll die ' + diceNumber +'? [Y/N]: ').upper()
prompt = input(f'Would you like to reroll die {diceNumber}? [Y/N]: ').upper()
if prompt in 'YN':
return prompt
else:
print("I'm sorry. Please only enter Y or N.")
keepDie1=diceRerollPrompt(1)
keepDie2=diceRerollPrompt(2)
keepDie3=diceRerollPrompt(3)
keepDie4=diceRerollPrompt(4)
keepDie5=diceRerollPrompt(5)
diceReroll(myDice)
'''
@Simas 的出色回应。
我只想指出,除非所有 5 个骰子都相同,否则您将永远无法重新掷骰子。 原因是在allSame
您使用的是逻辑and
运算符。 根据定义,所有条件都必须为真,才能返回真。 因此,即使得到 1 个 false,它也会返回 false。 所以在diceReroll
,第一个if
条件总是会评估为false
。 也许这就是您想要的,但是如果是这种情况,您不应该询问用户是否想要重新滚动任何内容。 通过将and
s 更改为or
s,您将得到这样的行为,即只有第一个骰子等于至少一个其他骰子时,骰子重新滚动才会起作用。 (不确定len(set(mydice)) == 1
是什么...它似乎是一个布尔语句,但没有通过and
or or
连接到前一个语句)
并且使用当前的if-elif
结构,只有第一个具有“Y”的骰子才会被重新掷骰子,因为在评估它之后,它会忽略其余的骰子。 因此,这可能更适合作为一系列if
语句。 此外,所有keepDie
x 都需要在括号中包含 0,否则您会得到一个越界的索引。
def diceReroll(myDice):
if allSame(myDice):
if keepDie1[0] is 'Y':
die1 = random.randint(1, 6)
print(die1)
if keepDie2[0] is 'Y':
die2 = random.randint(1, 6)
print(die2)
if keepDie3[0]is 'Y':
die3 = random.randint(1, 6)
print(die3)
if keepDie4[0] is 'Y':
die4 = random.randint(1, 6)
print(die4)
if keepDie5[0] is 'Y':
die5 = random.randint(1, 6)
print(die5)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.