'如果'后面没有条件陈述

时间:2016-03-06 12:45:32

标签: python if-statement conditional

我正在经历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

7 个答案:

答案 0 :(得分:7)

if语句将内置的 bool() 函数应用于后面的表达式。在您的情况下,if语句中的代码块仅在bool(word_list)True时运行。

Python中的不同对象在布尔上下文中评估为TrueFalse。这些物品被认为是“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。
  • 空字符串是Falsy。
  • 长度>= 1的列表是Truthy。
  • 空名单是Falsy。
  • 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_listlist,当您将其用于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块。 Nonemylist。 (如果0(){}mylist等,也会执行;但app.use(methodOverride);不太可能给出app.use(methodOverride('_method'));那些)

答案 4 :(得分:3)

在python中查看{docner}的Truth Value Testing文档页面。阅读本文后,您应该清楚了解自己的情况。以下是便于访问的相关部分。

  

5.1。真值测试

     

可以测试任何对象的真值,以便在ifwhile中使用   condition 或以下布尔运算的操作数。下列   值被视为错误:

     
      
  • None
  •   
  • False
  •   
  • 任何数字类型的零,例如00.00j
  •   
  • 任何空序列,例如''() []
  •   
  • 任何空映射,例如{}
  •   
  • 用户定义的类的实例,如果类定义了__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,空序列,空集,空字母,0False0.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

  1. 关键字False(显然!)
  2. 关键字无
  3. 数字0(0,0.0 ......)
  4. 空序列(元组,列表,字符串)
  5. 空映射(字典)
  6. 所有其他表达式评估为True。

    那么,if语句的作用是将if关键字后面的表达式评估为 True False ,然后相应地采取行动。

    因此,在您的具体示例中,如果word_list符合上述任何一种情况,则会被视为False,否则将被视为True。

    [#] reference