Python while循环条件未约束print语句的原因及重复判断疑问
Python while循环条件未约束print语句的原因及重复判断疑问
我刚学Python没几天,跟着freecodecamp的while循环猜词游戏教程做,想在每次猜错后打印"Wrong answer!"。
最开始我写的代码是这样的:
secret_word = "giraffe" guess = "" guess_count = 0 guess_limit = 3 out_of_guesses = False while guess != secret_word and not (out_of_guesses): if guess_count < guess_limit: guess = input("Enter guess: ") guess_count += 1 print("Wrong answer!") else: out_of_guesses = True if out_of_guesses: print("Out of Guesses, YOU LOSE!") else: print("Correct!")
虽然每次猜错都会打印,但猜对之后也会打印"Wrong answer!",接着才显示"Correct!"。我一开始试着把print("Wrong answer!")移到while循环里的其他行,还试过在if里加break,但都不管用。
直到修改成下面的代码,猜对就不会再打印错误提示了:
secret_word = "giraffe" guess = "" guess_count = 0 guess_limit = 3 out_of_guesses = False while guess != secret_word and not (out_of_guesses): if guess_count < guess_limit: guess = input("Enter guess: ") guess_count += 1 if guess == secret_word: print("Correct!") if guess != secret_word: print("Wrong answer!") else: out_of_guesses = True print("Out of Guesses, YOU LOSE!")
我有两个疑问:
- 为什么明明while循环已经有
guess != secret_word的条件了,还得再写一遍if guess != secret_word:来判断才不会在猜对时打印错误提示? - 为什么第一个代码里就算加了break,猜对之后还是会打印"Wrong answer!"?
问题1解答:while循环条件管的是“进不进循环”,不管“循环内做什么”
你可能搞混了while循环条件的作用——它只负责判断当前是否具备进入循环的资格,而不是控制循环内部代码的执行逻辑。
举个具体的流程:当你输入正确答案的那一次循环:
- 上一轮的guess是错误的,所以while的条件
guess != secret_word成立,你顺利进入了这次循环 - 你输入了正确的"giraffe",guess变量被更新为正确值
- guess_count加1
- 第一个代码里没有任何判断,直接执行
print("Wrong answer!")——因为while的条件是进入循环前判断的,进入之后不管你这次输入对不对,都会走到这个print语句。
而修改后的代码,在拿到新的guess后,先检查这次的输入是否正确,再决定打印什么。这时候while的条件只是让你能进入循环(因为上一次的guess是错的),但这次输入是对的,所以错误提示的print就不会被触发了。
问题2解答:break加的位置不对,print已经先执行了
你得理清楚第一个代码的执行顺序:当你输入正确答案时,代码是按这个步骤走的:
- 输入正确的guess → guess变量更新为正确值
- guess_count +=1 → 计数加1
print("Wrong answer!")→ 这一步已经跑完了!- 回到while循环的条件判断,发现guess等于secret_word,退出循环
- 最后执行print("Correct!")
如果你要加break,必须在print语句之前先判断guess是否正确,不然break根本拦不住已经要执行的print。比如你要是改成这样:
guess = input("Enter guess: ") guess_count +=1 if guess == secret_word: break # 猜对直接跳出循环,不会走到下面的print print("Wrong answer!")
这时候猜对就不会打印错误提示了。但你之前可能没加这个前置判断就直接加break,或者把break放在了print之后,那自然没用——因为print已经执行过了才break。
备注:内容来源于stack exchange,提问作者user29472044
相关产品推荐
相关产品推荐

