Python 的 and-or 技巧

布尔上下文

在 Python 中,可以在布尔上下文中使用几乎所有类型的表达式。通常的数据类型的“空值”都为 False。

  • None 为假值
  • 数值 00.0 等为假值
  • 空串 "" 为假值
  • 空列表 [] 为假值
  • 空元组 () 为假值
  • ...

逻辑演算

在 Python 中,and 和 or 按照下面的规则执行布尔逻辑演算:

对于 and,从左到右运算:

  • 如果所有表达式都为真,则 and 返回最后一个表达式。
  • 否则,and 返回第一个假值。

对于 or,从左到右运算:

  • 如果有一个为真,则 or 立刻返回该值。
  • 否则,or 返回最后一个表达式。
  • or 找到第一个真值后会忽略计算剩余的表达式。

注意到:返回的并不是布尔值,而是其中某个参与比较的表达式值。

and-or 技巧

在 C 中,表达式 bool ? a : b 表示当 bool 为真时结果为 a,其它值则为 b。在 Python 中可以使用 and-or 实现类似的功能。

((test and [x]) or [y])[0]

在这个 Python 表达式中,如果 test 为真,则返回 x,否则返回 y。

这里使用列表将 x 和 y 括起来是为了防止 x 为空值的情况,比如想要实现:“如果 test 为真,则取 0,如果 test 为假,则取 1”,如果不将 0 括起来则为:

(test and 0) or 1

不论 test 是真是假,都只会返回 1。

Example:

有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。比如f(13)= 6,现在f(1)=1,
#算出f(n)=n的n是什么?

1 def count(n):
2      return n and str(n).count('1') + count(n-1) or 0

用迭代方法简单解决此问题。

这里就重新利用了and-or技巧,程序用一行完全代替了一个条件语句。

 

posted on 2013-05-21 21:12  micky.zhou  阅读(323)  评论(0编辑  收藏  举报

导航