簡體   English   中英

Python 中的 Else 語句無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM