2013-04-09 85 views
2

我正在翻译Python代码到C,以便利用HPC系统上可用的并行(这是一个痛苦的过程),我遇到了Python中的条件原始程序员使我困惑如果len(列表)在Python

if rnum <> current_res: 
     alim = 0 
     if len(f): alim = f[-1] 

如果len(f)满足怎么办?我无法在网上找到这种使用这种方式的惯例。我想这是一个糟糕的编程习惯。

任何帮助将不胜感激!

+9

'<>'早已弃用。改用'!='。 – 2013-04-09 14:53:58

回答

12

在Python中,被视为'空'的值(例如数字0)在布尔上下文中被视为False,否则为True。

因此,如果f有长度,则len(f)为真,否则为空。如果f是一个标准的Python序列类型则代码可以被简化为:

if f: alim = f[-1] 

因为这同样适用于子序列;空是假的,具有非零长度意味着它是真的。

有关所有重要细节,请参阅Python文档中的Truth Value Testing

请注意,<>已被弃用;你应该真的使用!=来代替。

+0

谢谢你的帮助! – mjswartz 2013-04-09 15:03:58

+0

假设'len(f)'与f具有相同的真值是否安全?当然这取决于'f' – Awalias 2013-04-09 15:04:39

+0

@Awalias:**如果**是自定义序列类型,那么做出这样的假设是不安全的。 – 2013-04-09 15:05:53

7

在大多数情况下if len(f):将是同样的事情if f: ......

的原因是因为如果f没有长度,它将返回0这是一个falsy值。其实,真理实际测试检查对象的长度(__len__under some circumstances.

4

if len(f) 

将转化:

if len(f) != 0 

或在这种情况下,由于len(f)从不为负,

if len(f) > 0 
+0

严格地说,只有'!= 0',但由于不能有负长度序列,所以它在功能上并不相关。 – 2013-04-09 14:58:40

+0

@ sr2222,我已经澄清了答案。它们在这里是等价的,因为这个例子是'len',并且我把它包含了,因为'len> 0'更具可读性。 – askewchan 2013-04-09 15:01:37

+0

@ sr2222 - 但是否可以有一个负长度的其他对象?文档说结果*应该是一个'integer> = 0',但我不知道这意味着它被强制执行或者只是预期... – mgilson 2013-04-09 15:01:39