我一直在看一段非常棘手的python代码。我知道答案,但是我不明白为什么答案就是它。
def f(x):
return x
def g(x, y):
if x(y): # does x(3) == True?
return not y # is != 3 == False?
return y
x = 3
x = g(f, x)
f = g(f, 0)
因此,据我所知,第一次调用g(x,y)
时变量x的值解析为False。我很困惑为什么这是因为下面的行:
if x(y)
这会从f(x)
内部调用g(x,y)
,并将3传递给它。然后f(x)
再次返回3,这将以某种方式触发return not y
。在这种情况下,x(3)
是否等于True
?这是为什么?然后,下一次调用f(x)
并传递0时,将触发return y
。这是否意味着x(0)
是False
?另外,not y
的值是什么,因为有人告诉我它是False
,但我不知道not 3
的值是如何False
。如果我的询问方式令人困惑,我真的很抱歉,但是我不确定该怎么做。任何帮助深表感谢!
答案 0 :(得分:1)
0和1分别类似于布尔值False
和True
。
您可以像这样测试它:
>>> bool(0)
False
>>> bool(1)
True
实际上每个不为零的数字都是真实的:
>>> bool(3)
True
再次确认数字not
(非零)产生False
(不是True
= False
):
>>> not True
False
>>> not 3
False
答案 1 :(得分:0)
当您使用if
之类的if x
语句时,Python实际上会检查bool(x)
的值。 bool
由“ dunder方法” __bool__
实现,该方法在具有您所观察到的行为的整数上实现:
In [1]: bool(1)
Out[1]: True
In [2]: bool(2)
Out[2]: True
In [3]: bool(0)
Out[3]: False
当然,如您所料:
In [4]: bool(True)
Out[4]: True
In [5]: bool(False)
Out[5]: False
此规则相当笼统。 None
,0
,[]
,{}
,一般的空容器等都是“假的”,而其他任何东西都是“真实的”。
In [6]: bool(None)
Out[6]: False
In [7]: bool([])
Out[7]: False
但是
In [9]: bool([0])
Out[9]: True
答案 2 :(得分:0)
这些示例可能会有所帮助。基本上,当您传递g(f,0)时,它返回false,因此它返回y,而不是(不是y)。其他任何数字均为true,因此不传递y,任何数字均为false。希望对您有所帮助。
In [7658]: not True
Out[7658]: False
In [7659]: not False
Out[7659]: True
In [7660]: not 0
Out[7660]: True
In [7661]: not 1
Out[7661]: False
In [7662]: not 3
Out[7662]: False
In [7673]: g(f, 0)
Out[7673]: 0
答案 3 :(得分:0)
int为0,浮点数为0.0,一个空列表/元组/ dict / set,一个空字符串或字节,一个None在Python中都是Falsy,这意味着它们被评估为False。除此之外,还有其他。对于整数,任何非零整数都是Truthy。
因此在以下代码中:
if x:
print('yay')
else:
print('nay')
如果x
是上面概述的Falsy值之一,则将始终打印“否”。对于任何非伪造x
,将始终打印“是”。