如果在Python中使用len(list)

6

我正在将一段Python代码翻译成C语言,以便利用HPC系统中的并行性(这是一个痛苦的过程),但我遇到了原始程序员在Python中使用的条件语句,让我感到困惑。

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

if len(f)是什么意思?我在网上没有找到这种用法惯例。我想这可能是一种不好的编程习惯。

如有帮助,将不胜感激!


11
<> 已经被弃用,请使用 != 替代。 - Martijn Pieters
3个回答

23
在Python中,被认为是“空”的值,例如数字0,在布尔上下文中被认为是False,否则为True。
因此,如果f的长度不为零,则len(f)为True,否则为False。如果f是标准的Python序列类型,则代码可以简化为:
if f: alim = f[-1]

因为相同的规则也适用于序列;空的为False,长度非零则为True。(请注意,这并不一定适用于非内置的序列类型,只适用于以这种方式实现了__bool__的序列类型。)
请参阅Python文档中的Truth Value Testing以获取所有重要细节。
请注意,<>已被弃用;您应该使用!=代替。

假设 len(f)f 具有相同的真值,这样安全吗?当然这取决于 f - Awalias
1
@Awalias:如果它是一种自定义序列类型,则不能安全地做出那种假设。 - Martijn Pieters
@Awalias -- 如果 f 实现了自定义的 __nonzero__ (__bool__ py3k),那么它们可能是不同的,但这是一个罕见的情况。 - mgilson
2
当然,这取决于f是否是我创建的一个类,并且我重写了__len__以返回4...那就不一样了。但是如果我真的这么做了,那我应该被打。 - pcalcao
1
@pcalcao -- 如果您没有使用过__nonzero__,那么它将保持不变。 - mgilson

10
在大多数情况下,if len(f):if f: 的含义相同...原因是如果 f 没有长度,则返回 0,这是一个假值。 实际上,真值测试实际上检查对象的长度(__len__),在某些情况下会检查 非零值

7
这个

标签

if len(f)

would translate to:

if len(f) != 0

在这种情况下,由于len(f)永远不会是负数,

if len(f) > 0

严格来说,只有 != 0,但由于您不能拥有负长度序列,因此它在功能上并不相关。 - Silas Ray
@sr2222,我已经澄清了答案。在这里它们是等价的,因为示例是len,而且我包含它是因为len > 0更易读。 - askewchan
@sr2222 -- 但是你能有一个负长度的对象吗?文档说结果应该是一个大于等于0的整数,但我不知道这是否被强制执行或只是期望... - mgilson
@mgilson 是的,当然,可能会有一个不符合规范的对象从__len__返回一个负数。或者是一个字符串。或者是一个数据库连接对象。 - Silas Ray
@StevenRumbalski 这个问题是关于将代码转换成 C,而不是使旧的 Python 代码更具有 Python 风格。 - askewchan
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接