def isItEven2(n):
if (n%2 == 0):
print('true it is even')
else:
print('false it is not even')
def isInCenter2(n):
if (n>100):
print('true it is center')
else:
print('false it is not center')
def seatLocation2(n):
if isItEven2(n) and not isInCenter2(n):
print 'check1'
return "Right"
elif not isItEven2(n) and not isInCenter2(n):
print 'check2'
return "Left"
else:
return "Center"
def seatLocation3(n):
if not isInCenter2(n) and isItEven2(n):
print 'check1'
return "Right"
elif not isInCenter2(n) and not isItEven2(n):
print 'check2'
return "Left"
else:
return "Center"
seatLocation2(n)
和seatLocation3(n)
表现不同,有人能告诉我为什么seatLocation2(n)和seatLocation3(n)的输出有所不同吗?真的花了很多时间来搞清楚。
以下是示例输出
致电seatLocation2(2)
时的输出:
true it is even
true it is even
false it is not center
check2
并在致电seatLocation3(2)
时输出:
false it is not center
true it is even
false it is not center
true it is even
check2
Out[1043]: 'Left'
我知道我使用了print,所以我得到None值,所以最好使用return将值传递给其他函数。我只想解释执行过程中遵循的步骤。
答案 0 :(得分:1)
您需要从True
和False
函数返回一些内容(isItEven2
/ isInCenter2
)。
def isItEven2(n):
if (n%2 == 0):
print('true it is even')
return True
else:
print('false it is not even')
return False
def isInCenter2(n):
if (n>100):
print('true it is center')
return True
else:
print('false it is not center')
return False
答案 1 :(得分:0)
当您从函数返回None时,它将被解释为False。在您的情况下,无论' n'的价值如何,函数的第二个条件&seat;座位2(n)'和seatlocation3(n)将被执行,因为你不是两个' isItEven'和' isItCenter'。这足以解释代码流。
代码流将精确地遵循以下步骤:
函数seatlocation2(n)被称为
在if条件中调用isItEven()函数,结果为False(因为没有),因此条件不会被执行。
当前逻辑流
已废弃所有其他条件答案 2 :(得分:0)
理解两种seatLocation
方法的执行差异的关键点是理解两个概念:
None
,在条件中评估为False
condition1 and condition2
,而condition1
为负数,则永远不会费心找出condition2
是什么,因为最终结果将始终为负数好的,在你的代码中,函数总是返回None
(或False
可以这么说),所以当单步执行seatLocation2(2)
时,我们得到:< / p>
if isItEven2(2) and not isInCenter(2)
isItEven2(2)
来打印&#34;这是偶数&#34; None
,这是假的,因此它会突破if elif not isItEven2(2) and not isInCenter2(2)
not isItEven2(2)
来打印&#34;这是偶数&#34; None
这是假的,但它被否定(not
)所以仍然可以成为True
not isInCenter2(2)
打印&#34;假它不是中心&#34; None
这是假的,但是否定(not
)为真if
块
另一方面,如果我们按照seatLocation3(2)
进行操作,则会出现这样的情况:
if not isInCenter2(2) and isItEven2(2)
not isInCenter2(2)
打印&#34;假它不在中心&#34; None
,因此我们必须继续进行测试isItEven2(2)
打印&#34;如果它是偶数&#34; elif not isInCenter2(2) and not isItEven2(2)
not isInCenter2(2)
打印&#34;假它不在中心&#34; None
,因此我们必须继续进行测试not isItEven2(2)
打印&#34;如果它是偶数&#34; 所以他们确实表现得相同,这意味着你的两个函数都会返回None
,但是由于你左边或右边的not
不一样,看起来他们行为不端。但是当你有类似False and ...
的东西时,做布尔短路,第二部分永远不会被执行。