我正在通过Norvig's BASIC interpreter implemented in Python。
有一些代码似乎与我无关,但这个人似乎超出了我的100级,所以我更有可能无法理解而不是写了不必要的东西。
def lines(text):
"A list of the non-empty lines in a text."
return [line for line in text.splitlines() if line]
#return [zaa for zaa in text.splitlines()]
列表理解 - 为什么它以if line
结束?
如果我删除该子句,改为使用[zaa for zaa in text.splitlines()]
,我仍然认为如果我传递文本甚至空白行,该函数是否有效。
foo ="""mike\nnew\nbar"""
bar ="\n\n"
print lines(foo)
print lines(bar)
what = lines(bar)
print(type(what))
['mike', 'new', 'bar']
[]
<type 'list'>
我必须误解某些东西 - 我无法理解何时评估if line
,更不用说正确处理输入的必要性。
编辑:找到缺少if line
会导致错误结果的示例:
bar ="""one
two
three
five
seven"""
#bar = ""
print lines(bar)
['one', 'two', 'three', '', 'five', '', 'seven']
它包含这两个空字符串作为列表的成员。
答案 0 :(得分:8)
if line
正在检查&#34; truthy&#34;值,选中时确定为False
或True
的字符。例如,空字符串''
被视为False
,空列表([]
),字典({}
),元组(()
),{ {1}}和0
。基本上,None
是较短版本:
if line
答案 1 :(得分:2)
简短回答:从结果中过滤掉空字符串。
在Python中,列表理解的形式为:
[<expr> for <vars> in <iterable> <filters-and-iterators>]
其中<filters-and-iterators>
是序列:
for <vars> in <iterable>
形式的迭代器;和if <expr>
Python将评估的 真实性 。只有在表达式具有真实性 True
的情况下,它才会传递该元素:如果过滤器是最后一步,则意味着将其添加到列表中;如果过滤器不是最后一步,则进一步处理(例如处理下一个迭代器或过滤器)。否则它将忽略该项目。
str
真实性 True
当且仅当字符串包含至少一个字符时。所以这意味着我们过滤掉非空字符串。
可以通过覆盖__bool__
魔术函数来实现自定义类的真实性,或者如果它丢失,Python将查看__len__
是否返回非零值。
None
和False
始终保持真实性False
,True
具有真实性True
,列表,集合,词典,元组和字符串等集合具有真实性{ {1}}当且仅当这些包含至少一个元素时。如果数值非零,则数值通常具有真实性True
(因此负数也具有真实性True
)。
程序员可以自由地为自定义类本身实现真实性(如上所述),尽管将这里的示例考虑在内并因此将非空虚视为集合的真实性通常是个好主意。