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
答案 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
会评估表达式的真实性。
您应该知道所有空可迭代(包括空字符串''
),0
,False
和0.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
的工作原理
" A and B
如果A
则返回A is False
,否则返回B
"
因为"A"
不是0
或False
,not_empty
将返回"A".strip()
。
现在
"A".strip()=="A"
,
因此not_empty
会返回"A"
同样,当调用filter
时,它将应用函数并检查结果,除非剥离列表为空,否则它不会获得False
。因此,它会给你[' A',' B'' C']。