Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是什么导致一个代码块循环而另一个不循环?_Python_Python 2.7 - Fatal编程技术网

Python 是什么导致一个代码块循环而另一个不循环?

Python 是什么导致一个代码块循环而另一个不循环?,python,python-2.7,Python,Python 2.7,因此,作为使用python的学习任务,我将创建一个基本的tic-tac-toe程序 我的问题在这两段代码之间: letter = '' while (letter != 'X' or letter != 'O'): letter = raw_input("Player 1 select your letter (X or O)") letter = letter.upper() if letter == 'X': return ['X','O'] else: re

因此,作为使用python的学习任务,我将创建一个基本的tic-tac-toe程序

我的问题在这两段代码之间:

letter = ''
while (letter != 'X' or letter != 'O'):
    letter = raw_input("Player 1 select your letter (X or O)")
    letter = letter.upper()
if letter == 'X':
    return ['X','O']
else:
    return ['O','X']

正如您所看到的,代码块之间只有一个区别,特别是每个代码块的第二行

不管用户输入什么,第一块代码都会卡在循环中,不断询问用户想要什么字母

第二块代码按预期工作

你能解释一下为什么我理解第一个代码中的行与第二个代码中的行是一样的吗


谢谢。

看看条件
信!='或字母!='O'
。这种情况从字面上讲永远不会是错误的。你的意思可能是
,而不是


如果
字母
既不是
'X'
也不是
'O'
,则该条件显然为真(通过第一次测试满足)。如果是
'O'
,则条件仍然为真,第一次测试仍然满足。而唯一的另一种可能性,
字母=='X'
也是正确的,通过第二次测试满足。

查看条件
字母!='或字母!='O'
。这种情况从字面上讲永远不会是错误的。你的意思可能是
,而不是


如果
字母
既不是
'X'
也不是
'O'
,则该条件显然为真(通过第一次测试满足)。如果是
'O'
,则条件仍然为真,第一次测试仍然满足。而唯一的另一种可能性,
字母=='X'
也是正确的,通过第二次测试得到了满足。

这是基本逻辑,通过实践你会更擅长

letter != 'X' or letter != 'O'
想象一封信——任何一封信。让我们首先选择
'X'
。它不满足
字母!='的第一个表达式X'
,但它确实满足
字母!='的第二个表达式O'
。现在让我们试试
'O'
。满足第一个表达式,但不满足第二个表达式。现在,用
'X'
'O'
以外的任何字符来尝试它,比如
'N'
。这两个表达式都满足。无论您选择什么,条件都将得到满足,循环将始终执行

letter == 'X' or letter == 'O'
这里,只有
'X'
满足第一个表达式,只有
'O'
满足第二个表达式。没有其他值将满足该条件。这意味着只有当字母
'X'
'O'
时,循环才会执行

第一个代码块可以按如下方式修复:

letter != 'X' and letter != 'O'
这意味着,如果字母不是
'X'
,并且字母不是
'O'
,则将执行循环<代码>'X'
'O'
将停止执行

您也可以使用此条件:

letter not in 'XO'
如果
字母
不是该字符串的成员,则将执行循环。请注意,如果
字母
按字面意思是
'XO'
,则会出现这种情况-如果您不信任用户,则应进行调整:

letter not in {'X', 'O'}

它稍微大一点,但如果您希望有多个字符输入的可能性,它也会更安全。

这是基本逻辑,通过实践您会更擅长

letter != 'X' or letter != 'O'
想象一封信——任何一封信。让我们首先选择
'X'
。它不满足
字母!='的第一个表达式X'
,但它确实满足
字母!='的第二个表达式O'
。现在让我们试试
'O'
。满足第一个表达式,但不满足第二个表达式。现在,用
'X'
'O'
以外的任何字符来尝试它,比如
'N'
。这两个表达式都满足。无论您选择什么,条件都将得到满足,循环将始终执行

letter == 'X' or letter == 'O'
这里,只有
'X'
满足第一个表达式,只有
'O'
满足第二个表达式。没有其他值将满足该条件。这意味着只有当字母
'X'
'O'
时,循环才会执行

第一个代码块可以按如下方式修复:

letter != 'X' and letter != 'O'
这意味着,如果字母不是
'X'
,并且字母不是
'O'
,则将执行循环<代码>'X'
'O'
将停止执行

您也可以使用此条件:

letter not in 'XO'
如果
字母
不是该字符串的成员,则将执行循环。请注意,如果
字母
按字面意思是
'XO'
,则会出现这种情况-如果您不信任用户,则应进行调整:

letter not in {'X', 'O'}
它稍微大一点,但如果您希望有多个字符输入的可能性,它也会更安全。

问题是
(字母!='X'或字母!='O')
不等同于
(字母=='X'或字母='O')

假设
字母
等于
'X'

  • 然后
    (字母=='X'或字母=='O')
    为true,因此
    not(字母=='X'或字母=='O')
    为false,您将跳出while循环
  • 但是
    (字母!='X'或字母!='O')
    是正确的,因为
    字母!='O'
    为真
一般来说,
非(A或B)
不等同于
非A或非B
问题在于
(字母!='X'或字母!='O')
不等同于
非(字母=='X'或字母='O')

假设
字母
等于
'X'

  • 然后
    (字母=='X'或字母=='O')
    为true,因此
    not(字母=='X'或字母=='O')
    为false,您将跳出while循环
  • 但是
    (字母!='X'或字母!='O')
    是正确的,因为
    字母!='O'
    为真
更一般地说,
not(A或B)
不等同于
not A或not B

,因为从逻辑上讲,not(X或Y)不等同于not X或not Y