python"如果len(A)不是0"vs"如果A"语句

vla*_*fol 7 python pep8

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

if len(A) is not 0:
    print('A is not empty')
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个

if A:
    print('A is not empty')
Run Code Online (Sandbox Code Playgroud)

什么是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
Run Code Online (Sandbox Code Playgroud)

>>> 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 
Run Code Online (Sandbox Code Playgroud)

第二种方式快6倍!我很困惑如何if工作:-)

Mik*_*mov 14

PEP 8风格指南很明确:

对于序列,(字符串,列表,元组),请使用空序列为假的事实.

Yes: if not seq:
     if seq:

No:  if len(seq):
     if not len(seq):
Run Code Online (Sandbox Code Playgroud)

  • 但要小心 Numpy 数组:当“bool([0])”和“bool([False])”计算结果为“True”、“bool(numpy.array([0]))”和“bool(numpy.array([0]))”时array([False]))` 的计算结果为 `False`,因此在这种特殊情况下您应该显式使用 `len`。 (2认同)

Sta*_*ean 3

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

object of type 'int' has no len()
Run Code Online (Sandbox Code Playgroud)

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

  • 可以说,如果代码“期望”一个列表,那就不是问题了。 (2认同)
  • 好吧,相反,这会由于意外的类型而引发明显的异常,而不是默默地吞掉问题。 (2认同)