【问题标题】:cant break out of Python While loop无法跳出 Python While 循环
【发布时间】:2021-08-29 21:08:47
【问题描述】:

我对 Python 很陌生,所以提前抱歉,如果随机数不在数字列表中,我会尝试跳出 While 循环。 尽管测试了函数的输出并确认一个整数在列表中并且它实际上是一个整数,并且其他方法同时返回 True 和 False,但 While 语句会忽略该值。查看演示代码。

import random,time
list=[i for i in range(10)]
print(list)

print(list[6]*10) # this returns an integer
if list[6]==12/2:
    print('this evaluates as a int')

this=99 # sentry to run the while loop   **** but cant index by

if 10/2 in list:
    print('this also evaluates as an integer')
print(type(list))
print(type(this))
while this not in list:
    this = random.randrange(9)
    print(this,this in list)
    time.sleep(.200)
    list[this] = '*'

>>>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
60
this evaluates as a int
this also evaluates as an integer
<class 'list'>
<class 'int'>
6 True
3 True
4 True

5 对

5 False

【问题讨论】:

  • 您在打印之前重新分配this。因此,您会看到与最后一次在 while 循环中求值的值不同的值。
  • 此外,使用list[this] = '*' 将位置this 上的元素设置为*。所以这些项目将被替换为* 并且this not in list 不能是True
  • 你应该更好地解释你真正想要做什么来帮助你。整个程序对我来说真的没有意义。
  • 我希望 While 循环遍历循环,而 List 中存在整数 0 到 9,我使用“*”删除该整数一旦使用。当列表中没有整数时,我想跳出循环

标签: python-3.x while-loop


【解决方案1】:

当您想跳出循环时,while 循环条件的计算结果应为False。在你的情况下,既然你想在this is not in list时退出,那么将你的条件设置为this in list

这是带有固定条件的代码,请记住,由于列表是直接从循环内部修改的,循环将在一次迭代后终止。

import random, time
list=[i for i in range(10)]
print(list)

this = random.randrange(9)

while this in list:
    this = random.randrange(9)
    print(this, this in list)
    time.sleep(.200)
    list[this] = '*'
    print(list)

如果您不希望循环在一次迭代后终止,您可能需要考虑重新定位表达式list[this] = '*'。 (虽然这个解决方案也可能基于概率在一次迭代后结束)

import random, time
list=[i for i in range(10)]
print(list)

this = random.randrange(9)

while this in list:
    list[this] = '*' # moved here
    print(list)
    this = random.randrange(9)
    print(this, this in list)
    time.sleep(.200)

根据评论编辑

由于目标是用 * 替换整数,直到原始列表中没有整数,这里有一些修改。

当替换的元素数等于原始数组中的项目数时,while 循环退出。尚未替换的索引存储在名为available 的数组中。

import random, time
lst = [i for i in range(10)]
print(lst)

num_replaced = 0
# available = list.copy()
available = list(range(len(lst)))
while num_replaced < len(lst):
    this = random.choice(available)
    available.remove(this) # the index just chosen is no longer available
    lst[this] = '*'
    num_replaced += 1

【讨论】:

  • 我希望 While 循环遍历循环,而 List 中存在整数 0 到 9,我使用“*”删除该整数一旦使用。当列表中没有整数时,我想跳出循环。
  • 如果列表中有重复项,这将不起作用。即使这是原始海报所做的,也不是隐藏内置插件(如list)的好习惯。最好叫它别的名字,并解释原因。
  • 是的,有道理。让available 引用可用索引可能会更好,即available = list(range(len(lst)))
【解决方案2】:

很明显,While 函数存在一个缺陷,它无法正确地看到 True 或 False,感谢那些提出建议的人,但我提出了自己的建议。 我创建了一个哨兵布尔值来将值传递给 While 函数

sentry=True
while sentry:
    this = random.randrange(9)
    print(this,this in list)
    if this not in list:
        sentry=False
    time.sleep(.200)
    list[this] = '*'

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2013-05-06
    • 1970-01-01
    • 2020-04-17
    • 2018-06-13
    • 2015-12-28
    相关资源
    最近更新 更多