我正在经历Zed的"Learn Python The Hard Way"而我正在参加ex49。我对他给出的以下代码感到很困惑:
def peek(word_list):
if word_list: # this gives me trouble
word = word_list[0]
return word[0]
else:
return None
if
陈述的条件给我带来麻烦,如评论。我不确定这意味着什么,因为word_list
是一个对象,而不是条件语句。 word_list
本身如何遵循if
?
答案 0 :(得分:7)
if
语句将内置的 bool()
函数应用于后面的表达式。在您的情况下,if
语句中的代码块仅在bool(word_list)
为True
时运行。
Python中的不同对象在布尔上下文中评估为True
或False
。这些物品被认为是“Truthy”。或者' Falsy'。例如:
In [180]: bool('abc')
Out[180]: True
In [181]: bool('')
Out[181]: False
In [182]: bool([1, 2, 4])
Out[182]: True
In [183]: bool([])
Out[183]: False
In [184]: bool(None)
Out[184]: False
以上是以下事实的例子:
>= 1
的字符串是Truthy。>= 1
的列表是Truthy。None
是Falsy。所以:如果if word_list
是非空列表,True
将评估为None
。但是,如果它是空列表或False
,它将评估为<property>
<name>fs.trash.interval</name>
<value>5</value>
</property>
。
答案 1 :(得分:6)
他正在检查word_list
是否为空。如果列表为空并且在条件语句中使用它,则将其计算为False。否则,它将被评估为True。
word_list = ['some value']
if word_list:
# list is not empty do some stuff
print "I WILL PRINT"
word_list = []
if word_list:
# list is empty
print "I WILL NOT PRINT"
在上面的代码中,只会打印第一个代码段。
请参阅以下参考:https://docs.python.org/2/library/stdtypes.html#truth-value-testing
答案 2 :(得分:5)
word_list
是list
,当您将其用于if语句条件时,检查word_list
是否为空:
word_list = []
bool(word_list) # False
if word_list :
print "I'm not empty" # would not printed
word_list = ['a']
bool(word_list) # True
if word_list :
print word_list[0] # 'a'
正如Mad Physicist所说,即使列表中没有元素也意味着它不是空的:
word_list = [None]
bool(word_list) # True
答案 3 :(得分:5)
if
块所需要的只是可以评估为True或False的内容。条件直接评估其中一个,但还有其他对象可以转换。要查看任何给定对象是什么,可以使用bool
:
>>> mylist = []
>>> bool(mylist)
False
>>> mylist = [4, 3, 6]
>>> bool(mylist)
True
你看,如果列表为空,则列表为False,否则为True。因此,如果if word_list:
为非空,则将评估word_list
块。如果字符串为空,则字符串也为False,否则为True。元组,词典,集合也是如此。对于数字,0和0.0为False,但任何其他数字为True。给函数指出它自己的值的一个相当常见的参数是None
,其计算结果为False,因此如果if not mylist:
为空,或者如果mylist
为空,则执行mylist
块。 None
是mylist
。 (如果0
为()
,{}
,mylist
等,也会执行;但app.use(methodOverride);
不太可能给出app.use(methodOverride('_method'));
那些)
答案 4 :(得分:3)
在python中查看{docner}的Truth Value Testing文档页面。阅读本文后,您应该清楚了解自己的情况。以下是便于访问的相关部分。
5.1。真值测试
可以测试任何对象的真值,以便在
if
或while
中使用 condition 或以下布尔运算的操作数。下列 值被视为错误:
None
False
- 任何数字类型的零,例如
0
,0.0
,0j
。- 任何空序列,例如
''
,()
,[]
。- 任何空映射,例如
{}
。- 用户定义的类的实例,如果类定义了
__bool__()
或__len__()
方法,当该方法返回整数零或bool
时 价值False
。所有其他值都被认为是真的 - 因此许多类型的对象始终为真。
再次阅读第一句话(粗体),并注意第四条规则中的粗体部分。这与你的问题有关。
因此,根据第4条规则,如果您的word_list
为空,则条件评估为False
,否则评估为True
。
我知道你信任文档,但这里有一个代码片段,实际为自己测试真值。 (我知道做这样的事情是不必要的,但我总是试图用自己的眼睛看待事情)
def test_truth_value(arg):
# ANY object can be evaluated for truth or false in python
if arg: # or to be more verbose "if arg is True"
print("'{}' is True".format(arg))
else:
print("'{}' is False".format(arg))
class dummy_length_zero():
def __len__(self):
return 0
def __str__(self):
return 'instance of class: "dummy_length_zero"'
class dummy_bool_False():
def __bool__(self):
return False
def __str__(self):
return 'instance of class: "dummy_bool_False"'
obj_dummy_0 = dummy_length_zero()
obj_dummy_false = dummy_bool_False()
args = [None, False, 0, 0.0, 0j, '', (), [], {}, obj_dummy_0, obj_dummy_false]
for arg in args:
test_truth_value(arg)
最后,要测试最后一个语句,以便多种类型的对象始终为真,只需从__len__()
中删除__bool__()
或dummy_length_zero
方法的实现或分别为dummy_bool_False
课,并检查真相。
答案 5 :(得分:2)
在python中,一切都有一个隐式的布尔值。将任何对象直接放在if
语句中与if bool(word_list):
相同(但比Pythonic更多)。 None
,空序列,空集,空字母,0
,False
,0.0
都评估为False
。大多数其他对象评估为True
。这使if word_list:
成为在访问第一个元素之前确保列表不是None
或为空的最Pythonic方式。表达同样事物的漫长道路是if word_list is not None and len(word_list) > 0:
。
答案 6 :(得分:2)
在Python中, 每个 表达式都可以计算为布尔值(即True或False)。
以下基本表达式评估为False
所有其他表达式评估为True。
那么,if语句的作用是将if关键字后面的表达式评估为 True 或 False ,然后相应地采取行动。
因此,在您的具体示例中,如果word_list
符合上述任何一种情况,则会被视为False,否则将被视为True。
[#] reference