while 循环不会永远 work/loops |初学者问题
While loop doesn't work/loops forever | Beginner question
以下是我对这个问题的尝试解决方案: 彩票中的头等奖是通过将 1 到 30 之间的三个数字与按相同顺序抽取的三个随机数相匹配而获得的。当一个球被抽出时,它会在抽出另一个球之前被放回机器中。在抽取一个球之前,机器中总是有 30 个球,玩家可以多次选择同一个球。每周抽奖一次。编写一个函数,以三个数字为参数,抽取三个介于 1 和 30 之间的随机数和 returns 赢得大奖所需的周数。 (例如,选择的号码:17、12、25 必须匹配:球一是 17,球二是 12,球三是 25。)
我的尝试:
import random
chosen = []
for i in range(0, 3, 1):
chosen.append(input("Please input your lucky number: "))
drawn_numbers = []
count = 0
week_count = 0
print("Your chosen numbers are: {}, {}, {}".format(chosen[0], chosen[1], chosen[2]))
while count != 3:
for i in range(0, 3, 1):
random_number = random.randint(1, 30)
drawn_numbers.append(random_number)
for i in range(0, 3, 1):
if drawn_numbers[i] in chosen:
count += 1
week_count += 1
drawn_numbers = []
print("It took you {} weeks to win.".format(week_count))
出于某种原因,while 循环忽略了 count += 1
部分并永远循环随机生成的 drawn_numbers 列表。
显然我的循环有问题,但我看不到它 D:
关于如何使该循环工作的一些建议会很好。谢谢
您是否检查过您的 if 语句是否变为真?
一个想法是,选择的可能包括字符串值作为数字。试试 运行:
print(type(chosen[0]))
这应该是一个整数。通过以下方式修复:
chosen.append(int(input("Please input your lucky number: ")))
首先 - 欢迎来到 Python 的世界!
你有几个错误:
input function returns a string and not an int。意思是,您尝试在 if drawn_numbers[i] in chosen
中隐式进行的比较 永远不会 为真,因此 count
始终为 0 并且您陷入了无限循环。
假设您已修复上述错误,您仍然有机会 count
在循环评估时永远不会达到 3。考虑以下情况:
- 用户输入数字
[1, 2, 3]
drawn_numbers
是[1, 2, 4]
- 因此,
count
现在将是 2
while
条件是count != 3
是True
因此循环继续。
- 再次抽取的号码是
[1, 2, 4]
count
现在是4
- 以后
count
只会增加,永远不会等于3
!
你知道这是怎么回事吗?尝试在循环开始时(内部)重置 count
!
-
a lottery is won by matching three numbers ... in the same order
但是您实施的比较仅在列表中查找 存在,而不是逐个元素进行比较。
因此,一个有效的(不是以最 Pythonic 方式编写的)版本将是:
import random
chosen = []
for i in range(0, 3, 1):
chosen.append(int(input("Please input your lucky number: "))) # notice the int cast
drawn_numbers = []
count = 0
week_count = 0
print("Your chosen numbers are: {}, {}, {}".format(chosen[0], chosen[1], chosen[2]))
while count != 3:
count = 0 # notice that count is reset here
for i in range(0, 3, 1):
random_number = random.randint(1, 30)
drawn_numbers.append(random_number)
for i in range(0, 3, 1):
if drawn_numbers[i] == chosen[i]: # notice that we compare the elements in the same location
count += 1
week_count += 1
drawn_numbers = []
print("It took you {} weeks to win.".format(week_count))
如果您有兴趣,这里有一个更 Pythonic 的方式:
import random
chosen = [int(input("Please input your lucky number: ")) for _ in range(3)]
print(f'Your chosen numbers are: {chosen}')
matched = False
week_count = 0
while not matched:
drawn_numbers = [random.randint(1, 30) for _ in range(3)]
matched = drawn_numbers == chosen
week_count += 1
print(f"It took you {week_count} weeks to win.")
您可能会在其中发现一些对您来说可能是新的功能,但我强烈建议您掌握它们:
- List comprehension
range(3)
等同于 range(0, 3, 1)
- Formatting string literals
==
运算符实际上是逐个元素地比较两个列表!
有趣的旁注:运行 这个没有顺序限制的代码导致等待赢得彩票的时间大大减少了 :)
以下是我对这个问题的尝试解决方案: 彩票中的头等奖是通过将 1 到 30 之间的三个数字与按相同顺序抽取的三个随机数相匹配而获得的。当一个球被抽出时,它会在抽出另一个球之前被放回机器中。在抽取一个球之前,机器中总是有 30 个球,玩家可以多次选择同一个球。每周抽奖一次。编写一个函数,以三个数字为参数,抽取三个介于 1 和 30 之间的随机数和 returns 赢得大奖所需的周数。 (例如,选择的号码:17、12、25 必须匹配:球一是 17,球二是 12,球三是 25。)
我的尝试:
import random
chosen = []
for i in range(0, 3, 1):
chosen.append(input("Please input your lucky number: "))
drawn_numbers = []
count = 0
week_count = 0
print("Your chosen numbers are: {}, {}, {}".format(chosen[0], chosen[1], chosen[2]))
while count != 3:
for i in range(0, 3, 1):
random_number = random.randint(1, 30)
drawn_numbers.append(random_number)
for i in range(0, 3, 1):
if drawn_numbers[i] in chosen:
count += 1
week_count += 1
drawn_numbers = []
print("It took you {} weeks to win.".format(week_count))
出于某种原因,while 循环忽略了 count += 1
部分并永远循环随机生成的 drawn_numbers 列表。
显然我的循环有问题,但我看不到它 D:
关于如何使该循环工作的一些建议会很好。谢谢
您是否检查过您的 if 语句是否变为真?
一个想法是,选择的可能包括字符串值作为数字。试试 运行:
print(type(chosen[0]))
这应该是一个整数。通过以下方式修复:
chosen.append(int(input("Please input your lucky number: ")))
首先 - 欢迎来到 Python 的世界!
你有几个错误:
input function returns a string and not an int。意思是,您尝试在
if drawn_numbers[i] in chosen
中隐式进行的比较 永远不会 为真,因此count
始终为 0 并且您陷入了无限循环。假设您已修复上述错误,您仍然有机会
count
在循环评估时永远不会达到 3。考虑以下情况:- 用户输入数字
[1, 2, 3]
drawn_numbers
是[1, 2, 4]
- 因此,
count
现在将是2
while
条件是count != 3
是True
因此循环继续。- 再次抽取的号码是
[1, 2, 4]
count
现在是4
- 以后
count
只会增加,永远不会等于3
!
你知道这是怎么回事吗?尝试在循环开始时(内部)重置
count
!- 用户输入数字
-
a lottery is won by matching three numbers ... in the same order
但是您实施的比较仅在列表中查找 存在,而不是逐个元素进行比较。
因此,一个有效的(不是以最 Pythonic 方式编写的)版本将是:
import random
chosen = []
for i in range(0, 3, 1):
chosen.append(int(input("Please input your lucky number: "))) # notice the int cast
drawn_numbers = []
count = 0
week_count = 0
print("Your chosen numbers are: {}, {}, {}".format(chosen[0], chosen[1], chosen[2]))
while count != 3:
count = 0 # notice that count is reset here
for i in range(0, 3, 1):
random_number = random.randint(1, 30)
drawn_numbers.append(random_number)
for i in range(0, 3, 1):
if drawn_numbers[i] == chosen[i]: # notice that we compare the elements in the same location
count += 1
week_count += 1
drawn_numbers = []
print("It took you {} weeks to win.".format(week_count))
如果您有兴趣,这里有一个更 Pythonic 的方式:
import random
chosen = [int(input("Please input your lucky number: ")) for _ in range(3)]
print(f'Your chosen numbers are: {chosen}')
matched = False
week_count = 0
while not matched:
drawn_numbers = [random.randint(1, 30) for _ in range(3)]
matched = drawn_numbers == chosen
week_count += 1
print(f"It took you {week_count} weeks to win.")
您可能会在其中发现一些对您来说可能是新的功能,但我强烈建议您掌握它们:
- List comprehension
range(3)
等同于range(0, 3, 1)
- Formatting string literals
==
运算符实际上是逐个元素地比较两个列表!
有趣的旁注:运行 这个没有顺序限制的代码导致等待赢得彩票的时间大大减少了 :)