Python 使用';如果';在列表中

Python 使用';如果';在列表中,python,list,list-comprehension,Python,List,List Comprehension,我正在努力 有一些代码对我来说似乎无关,但这家伙似乎比我高出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行结束 如果我删

我正在努力

有一些代码对我来说似乎无关,但这家伙似乎比我高出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行结束

如果我删除该子句,改用
[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'>

它包括这两个空字符串作为列表的成员。

如果行
正在检查“truthy”值,则当检查时确定为
False
True
。例如,空字符串
'
与空列表(
[]
)、字典(
{}
)、元组(
()
)、
0
)一起被视为
False
。基本上,
如果第
行是以下内容的较短版本:

return [line for line in text.splitlines() if line != '']

简短回答:它从结果中过滤出空字符串

在Python中,列表理解的形式如下:

[<expr> for <vars> in <iterable> <filters-and-iterators>]
[适用于中]
其中,
为以下序列:

  • in的
    形式的迭代器;及
  • 过滤
    形式的如果
  • Python将评估。只有在表达式具有truthiness
    True
    的情况下,它才会传递该元素:如果过滤器是最后一步,这意味着将其添加到列表中;如果过滤器不是最后一步,则进一步处理(例如,处理下一个迭代器或过滤器)。否则它将忽略该项

    str
    ing
    具有真实性
    True
    当且仅当字符串至少包含一个字符时。这意味着这里我们过滤掉非空字符串

    自定义类的真实性可以通过重写
    \uuuuu bool\uuuuu
    魔术函数来实现,或者如果缺少该函数,Python将查看
    \uuu len\uuuuu
    是否返回非零值

    None
    False
    始终具有真实性
    False
    True
    具有真实性
    True
    ,列表、集合、字典、元组和字符串等集合具有真实性
    True
    当且仅当它们至少包含一个元素时。如果数值不为零,则数值通常具有真实性
    True
    (因此负数也具有真实性
    True


    程序员可以自由地为自定义类本身实现真实性(如上所述),尽管考虑这里的示例通常是一个好主意,因此将非空视为集合的真实性。

    过滤掉非空元素。只有满足if的元素才会放入列表中。这应该在任何理解教程中都会涉及。@Carcigenicate我认为他们很困惑,因为
    if行
    似乎没有实际情况。这种混淆的根源是
    truthy
    值。OP我建议你读一下:它简短易懂,
    truthy
    值可能非常有用convenient@RobbieMilejczak嗯,如果是这样的话,应该说得更清楚。这样就改变了整个问题。但我怀疑,不管是哪一个,都有一个可用的复制品。
    [<expr> for <vars> in <iterable> <filters-and-iterators>]