【问题标题】:Break loop with variable - Python带变量的中断循环 - Python
【发布时间】:2018-06-26 09:27:58
【问题描述】:

我想以更紧凑的形式编写我的循环。当我有这种形式的代码时,一切正常:

a=-1
while a <0:
    user_move()
    if (nastede[1]==X) and (nastede[2]==X) and (nastede[3]==X):
        print("Game Over")
        break

print("END")

但是当我尝试使用这种形式的代码时,我的循环并没有中断:

y=(nastede[1] and nastede[2] and nastede[3])

a=-1
while a <0:
    user_move()
    if y == X:
        print("Game Over")
        break

print("END")

为什么在第二种情况下我的循环不会与 nastede[] 内的 y 中断?

更改后(所有代码):

nastede=[" ", " ", " ", " ", " ", " ", " ", " ", " "]
X="X"

def list_global():
    global nastede
    print(" ",nastede[0],"| ",nastede[1]," | ",nastede[2]," ")
    print("---------------")
    print(" ",nastede[3],"| ",nastede[4]," | ",nastede[5]," ")
    print("---------------")
    print(" ",nastede[6],"| ",nastede[7]," | ",nastede[8]," ")

def user_move():
    a=-1
    while a<0:
        move_hum=int(input("Write a number from 1 to 8 ?\n"))
        if (nastede[move_hum] != X) and (nastede[move_hum] != O):
            nastede[move_hum] = "X"
            list_global()
            break
        else:
            print("Write different number")


a=-1
while a <0:
    user_move()
    if all(map(lambda x: x == X, nastede)):
        print("Game Over")
        break

print("END")

【问题讨论】:

  • 这是你的完整代码吗?
  • 在第二个例子中y 只包含一个布尔值
  • 你为什么要重新定义all?默认情况下你可以直接使用它。
  • 是的,现在我明白了。我从我的代码中删除了重新定义“全部”。但是循环仍然没有中断,也许你在我的代码中看到了更多错误的东西?
  • 我添加了整个代码。我将非常感谢您的帮助

标签: python loops tuples break


【解决方案1】:

您的条件y=(nastede[1] and nastede[2] and nastede[3]) 将绑定yTrue,除非XTrue,否则也不会按您的预期进行评估。

更好地使用all 结合map

...
if all(map(lambda x: x == X, nestede))
...

你有一个minimal example

编辑: 由于all 检查所有这些代码都会失败,因为您只检查从索引13,为此使用slice

...
if all(map(lambda x: x == X, nestede[1:4]))
...

记住python切片不包含尾[x,y)

【讨论】:

  • def all(iterable): for element in iterable: if not element: return False return True a=-1 while a &lt;0: user_move() if if all(map(lambda x: x == X, nastede)): print("Game Over") break 当我尝试以这种形式使用代码时 ^,Python 仍然不会中断循环。也许我必须在 lambda 中改变一些东西?但我读了这些python-course.eu/lambda.php,看起来都不错。
  • @MaddieGraham,你能用那个代码更新你的问题吗?我在那里看到了一些严重的问题,但没有正确的身份我无法确认。
  • @MaddieGraham,编辑应该解释为什么它不起作用。
【解决方案2】:

(nastede[1]==X) and (nastede[2]==X) and (nastede[3]==X)(nastede[1] and nastede[2] and nastede[3]) 不一样。在第一条语句中,每个值都需要等于 X 才能获得真实值。但是在第二个代码中,如果所有值都是真实的,即使它们不等于X,那么表达式将返回True

【讨论】:

    【解决方案3】:

    也更好:

    ....
    if all(i == X for i in nestede):
    ...
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多