为什么“使用过滤器时返回s和s.strip()”有效?

时间:2017-08-21 14:33:19

标签: python list filter short-circuiting

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

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

我不知道为什么会这样。 我知道:x和y如果x为假,则为x,否则为y。 首先是返回'A'和'A'.strip()。 但这显示在python IDLE

>>>'A' is True
False
>>>'A' is False
False

因此。 not_empty('A')返回'A',对吧? 'A'不是真的,为什么结果呢?

为什么

  

not_empty('')
  ''

''也是假的。

>>>' ' is True
False
>>>' ' is False
False

2 个答案:

答案 0 :(得分:4)

将您的filter功能翻译成一个好的' for循环:

old = ['A', '', 'B', None, 'C', '  ']
new = []

for i in old:
    if i and i.strip():
        new.append(i)

print(new)

输出:

['A', 'B', 'C']

为什么会发生这种情况是因为if会评估表达式的真实性

您应该知道所有可迭代(包括空字符串''),0False0.0都已评估到表达式中的False。有一些空格字符串,当被剥离时,会被缩减为空字符串,这些字符串也会被评估为False

遍历每个元素,这就是你的程序运行的方式:

Initial
old = ['A', '', 'B', None, 'C', '  ']
new = []

Iteration 1
i = 'A'
'A' and 'A'.strip() is evaluated to True
new = ['A']

Iteration 2
i = ''
'' is evaluated to False (short circuit)
new = ['A']

Iteration 3 (same as 1)
i = 'B'
...
new = ['A', 'B']

Iteration 4
i = None
None is evaluated to False
new = ['A', 'B']

Iteration 5 (same as 1, 3)
i = 'C'
...
new = ['A', 'B', 'C']

Iteration 6
i = '  '
' ' is True but ' '.strip() is False
new = ['A', 'B', 'C']

Final
new = ['A', 'B', 'C']

答案 1 :(得分:1)

首先让我们做一些基本的调试。

"A" and "A".strip()打印" A"到shell

现在为什么这样做。好吧,让我们查看and的工作原理

see here

" A and B如果A则返回A is False,否则返回B"

因为"A"不是0Falsenot_empty将返回"A".strip()。 现在 "A".strip()=="A", 因此not_empty会返回"A"

同样,当调用filter时,它将应用函数并检查结果,除非剥离列表为空,否则它不会获得False。因此,它会给你[' A',' B'' C']。