在Python中列表推导或生成器expression式的续行

你应该如何分解很长的列表理解?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long] 

我也曾经在某个地方看到,那些不喜欢用'\'来分解线条的人,却从来不明白为什么。 这背后的原因是什么?

 [x for x in (1,2,3) ] 

工作正常,所以你可以做任何你喜欢的。 我个人比较喜欢

  [something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long] 

\为什么不被人们理解是因为它出现在一行的末尾 ,或者不突出,或者需要额外的填充,当行长度改变时这个填充必须被修正:

 x = very_long_term \ + even_longer_term_than_the_previous \ + a_third_term 

在这种情况下,使用parens:

 x = (very_long_term + even_longer_term_than_the_previous + a_third_term) 

我不反对:

 variable = [something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long] 

在这种情况下你不需要\ 总的来说,我认为人们会避免\因为它有点丑,但是如果不是线上的最后一件事情(确保没有空白),就会产生问题。 尽pipe如此,我认为使用它比使用它好得多,这是为了保持线条的长度。

由于在上面的例子中没有必要使用\ ,或者使用括号expression式,所以我甚至觉得我甚至需要使用它。

在处理多个数据结构列表的情况下,您还可以使用多个缩进。

 new_list = [ { 'attribute 1': a_very_long_item.attribute1, 'attribute 2': a_very_long_item.attribute2, 'list_attribute': [ { 'dict_key_1': attribute_item.attribute2, 'dict_key_2': attribute_item.attribute2 } for attribute_item in a_very_long_item.list_of_items ] } for a_very_long_item in a_very_long_list if a_very_long_item not in [some_other_long_item for some_other_long_item in some_other_long_list ] ] 

注意它是如何使用if语句过滤到另一个列表的。 将if语句放在自己的行中也很有用。