之前一直以为Python中andor 这两个表达式的返回值是True 或者 False,今早帮同学解答问题时才发现之前的理解是错误的。同学遇到的问题如下:

def not_empty(str):
    return str and str.strip()

list(filter(not_empty,['A','B',None,'C','  ']))

她不理解的是not_empty函数为什么要这样写,我最初的解答为:

  • strNone,则返回False
  • strNonestr.strip()为空串''则返回False,否则返回True

但是尝试运行几个示例之后,发现not_empty返回值并不是bool类型,而是两个操作数其中的一个。于是查阅Python3官方文档,找到了合理地解释:

1. Boolean Operators

Click Link

2. Truth Value Testing

Click Link

3. filter

Click Link

4. 解释

str and str.strip() 相当于 if str then str.strip() else str,所以not_empty返回的是两个操作数其中的某一个,记为valuefilter然后会对返回值用if value进行判断。至于if表达式如何判断,见上述的真值规则

(完)