【问题标题】:'if' not followed by conditional statement'if' 后面没有条件语句
【发布时间】:2016-06-20 00:20:42
【问题描述】:

我正在浏览 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

【问题讨论】:

  • FWIW,你不是第一个被 Learn Python The Hard Way 弄糊涂的人;它呈现信息的顺序还有很多不足之处。见LPTHW Complaints。我想你最好还是坚持下去,因为你已经走了这么远,但你可能希望查看替代教程。
  • 我也不喜欢作者的方法,他攻击任何他自己不喜欢的想法的方式。例如,关于在本书开头使用 python 版本 2 和 3。不过,我并不是要用我的这种评论来激怒任何人!
  • @Shadowfax 你真的不是。不得不说。 :)
  • 有关布尔值为False 的空列表(或其他容器对象)的更多信息,请参阅Best way to check if a list is empty

标签: python if-statement conditional


【解决方案1】:

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'

正如疯狂物理学家所说,即使列表中的 None 元素也意味着它不是空的:

word_list = [None]
bool(word_list) # True

【讨论】:

  • 我实际上的意思是列表本身是None 将评估为Falseif 正在执行两项检查。你比我领先一步。
【解决方案2】:

if 块所需的只是可以评估为 True 或 False 的东西。条件直接计算其中之一,但还有其他可以转换的对象。要查看任何给定对象是什么,您可以使用bool

>>> mylist = []
>>> bool(mylist)
False
>>> mylist = [4, 3, 6]
>>> bool(mylist)
True

你看,如果列表为空,则为 False,否则为 True。因此,如果word_list 为非空,则将评估if word_list: 块。如果字符串为空,则字符串也为 False,否则为 True。元组、字典、集合也是如此。对于数字,0 和 0.0 是 False,但任何其他数字都是 True。一个相当常见的参数是None,它的计算结果为False,因此如果mylist 为空或mylist 为@987654330,则将执行if not mylist: 块。 @。 (如果mylist0(){} 等,它也会被执行;但不太可能给mylist 这些)

【讨论】:

  • @MadPhysicist:好的;我加了。
  • 我的意思是他正在检查该列表是否不是Noneif 确实在执行两次检查。
  • @MadPhysicist:它正在执行任意数量的检查。它还将针对0(){} 等进行评估。不过,我更清楚地表明None 是一个可能的参数。
  • 使用列表参数,只有两个。此外,所有对象都可以转换。
  • None 不是列表参数,所以不是。列表参数只有一个。 None 的唯一特殊之处在于它通常用于代替普通参数。我不认为我与所有对象都可以转换相矛盾。我只是举了一些例子。
【解决方案3】:

他正在检查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"

在上面的代码中,只会打印第一个sn-p。

请参阅以下参考:https://docs.python.org/2/library/stdtypes.html#truth-value-testing

【讨论】:

    【解决方案4】:

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

    Python 中的不同对象在布尔上下文中计算为 TrueFalse。这些对象被认为是“真”或“假”。例如:

    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 的字符串是真实的。
    • 空字符串是 Falsy。
    • 长度为>= 1 的列表是真实的。
    • 空列表是 Falsy。
    • None 是假的。

    所以:if word_list 将评估为 True 如果它是一个非空列表。但是,如果它是一个空列表或None,它将评估为False

    【讨论】:

      【解决方案5】:

      在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】:

        在 Python 中,每个 表达式都可以计算为布尔值(即 True 或 False)。

        以下基本表达式的计算结果为 False

        1. 关键字 False(显然!)
        2. 关键字无
        3. 数字 0 (0, 0.0 ... )
        4. 空序列(元组、列表、字符串)
        5. 空映射(字典)

        所有其他表达式的计算结果为 True。

        因此,if 语句所做的是将 if 关键字后面的表达式评估为 TrueFalse,然后采取相应的行动。

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

        [#] reference

        【讨论】:

          【解决方案7】:

          查看此文档页面,了解 Python 中的 Truth Value Testing。阅读本文后,您应该清楚地了解自己的情况。这是方便访问的相关部分。

          5.1。真值检验

          可以测试任何对象的真值,用于ifwhile 条件 或作为以下布尔运算的操作数。下列 值被认为是错误的:

          • None
          • False
          • 任何数字类型的零,例如,00.00j
          • 任何空序列,例如''()[]
          • 任何空映射,例如{}
          • 用户定义类的实例,如果该类定义了__bool__()__len__() 方法,当该方法返回整数零或boolFalse

          所有其他值都被认为是真——所以许多类型的对象总是真。

          再次阅读第一句(粗体),并注意第四条规则中的粗体部分。这与您的问题有关。

          因此,根据第四条规则,如果您的word_list 为空,则条件评估为False,否则评估为True


          我知道您信任文档,但这里有一个代码 sn-p,实际上 可以自己测试真值。 (我知道做这种事没必要,但我总是很想亲眼看看)

          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)
          

          最后,为了测试最后一条语句所以许多类型的对象总是正确的,只需分别从 dummy_length_zerodummy_bool_False 类中删除 __len__()__bool__() 方法的实现,并检查真相。

          【讨论】:

            猜你喜欢
            • 2022-11-05
            • 2021-11-30
            • 1970-01-01
            • 1970-01-01
            • 2023-02-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多