【问题标题】:python "if len(A) is not 0" vs "if A" statementspython "if len(A) is not 0" vs "if A" 语句
【发布时间】:2019-01-09 10:08:00
【问题描述】:

我的同事在条件下使用这种方式

if len(A) is not 0:
    print('A is not empty')

我更喜欢这个

if A:
    print('A is not empty')

什么是 prop-cons 参数?

她的观点是,第一种方式更直接地展示了她真正想要的东西。我的意思是我的路更短。

第一种方法也比我的快 2 倍:

>>> import timeit
>>> timeit.timeit('len(A) is not 0', setup='A=[1,2,3]')
0.048459101999924314
>>> timeit.timeit('bool(A)', setup='A=[1,2,3]')
0.09833707799998592

但是

>>> import timeit
>>> timeit.timeit('if len(A) is not 0:\n  pass', setup='A=[1,2,3]')
0.06600062699999398
>>> timeit.timeit('if A:\n  pass', setup='A=[1,2,3]')
0.011816206999810674 

第二种方式快 6 倍!我很困惑if 的工作原理:-)

【问题讨论】:

  • if len(A) is not 0: 很危险,因为不能保证引用是相同的(isis not 进行引用检查)。 if A 测试真实性(空性)并且是安全的。
  • 在任何情况下都不应该使用is not 0。应该是!=0
  • @vladimirfol:这是特定于实现的。你能在python doc中给我看一个声明吗?它在哪里说保证是一样的?
  • @vladimirfol x = 257; x is 257 失败。 CPython 只实习小整数。
  • @L3viathan:在空闲 (3.6.6) 中,这是True。如果我将语句写在不同的行中,它会失败。

标签: python pep8


【解决方案1】:

PEP 8风格指南很清楚:

对于序列,(字符串,列表,元组),使用空的事实 序列是错误的。

Yes: if not seq:
     if seq:

No:  if len(seq):
     if not len(seq):

【讨论】:

  • 但要小心 Numpy 数组:bool([0])bool([False]) 计算为 Truebool(numpy.array([0]))bool(numpy.array([False])) 计算为 False,所以你应该明确使用 len在这种特殊情况下。
  • 我既同意又不同意,PEP 是一种约定,我们应该注意它,但不是规则。我现在喜欢关注另一种观点:stackoverflow.com/a/64070199/6485445
【解决方案2】:

我认为如果 A = 42,您的同事代码会引发错误

object of type 'int' has no len()

而您的代码只会执行 if 之后的任何内容。

【讨论】:

  • 可以说,如果代码期望是一个列表,这不是问题。
  • 是的,但如果你一直使用这个,我向你保证,有时你会得到一个列表以外的东西作为这个的输入,你可能会失去很多调试一段时间。
  • 好吧,相反,这会由于意外类型而引发可见异常,而不是默默地吞下问题。
  • @StatisticDean 我不确定你说这是好事还是坏事 - 在我看来,一般来说,当你的输入不是你所期望的时候,你希望你的代码出错- 这是支持“同事代码”的一点(尽管 OPs 代码是正确的 python 实现,正如其他答案所说)
  • @Stael 我没有对它的好坏持立场,只是指出其中的区别。一般来说,我同意你的观点,出错总比错误地执行代码要好。
【解决方案3】:

你不是在比较同一件事。 如果你比较这个:

import timeit
print(timeit.timeit('if len(A) is not 0:\n  pass', setup='A=[1,2,3]'))
print(timeit.timeit('if A:\n  pass', setup='A=[1,2,3]'))

您会发现您的方法更快。 另外,您的方法是一种更 Pythonic 的方式。

【讨论】:

  • 哈哈,为什么更快?我想如果进行布尔评估
  • 0.066 对 0.0118 秒!快 6 倍!我现在很困惑if 的工作原理:-)
  • 它更快,因为它使用一个内置函数来计算“len(A) > 0”而不是几个。至少我认为,如果有兴趣,我可以挖掘一下。
【解决方案4】:

1.

if len(A) is not 0:
    print('A is not empty')

2.

if A:
    print('A is not empty')

第一种方式和第二种方式的区别在于,您只能将 len(A) 用于列表、元组、字典等结构,因为它们支持 len() 函数,但不能将 len() 函数用于数据或比如字符、字符串、整数(数字)。

例如:

len(123), len(abc), len(123abc) : 会报错。

但是, 列表 = [1,2,3,4,5]

len(list) 不会引发错误

if A:
    statement  # this is useful while our only concern is that the variable A has some value or not 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 2016-10-25
    • 2015-06-15
    • 2015-09-10
    • 1970-01-01
    • 2016-05-24
    • 2011-03-20
    • 2016-01-13
    相关资源
    最近更新 更多