5

列表和字典理解功能强大且快速,但它们可能难以阅读。我的心理阅读缓冲区很快就会填满,尤其是当它们嵌套得很深时。有没有办法让这些更具可读性?

4

2 回答 2

12

你是对的。;) 它们可能难以阅读,这也使它们难以编写和调试。让我们以以下示例 dict 理解为例:

current_team = dict((k,v) for k,v in list(team.items()) for player in v[‘player’] if player['year'] == 2013)

太多年的 C 和 Java 编程使我难以阅读。理解在逻辑上被分解成不同的部分,但我仍然需要真正盯着它来分解它。

要记住的关键是理解是一个表达式,而不是一个语句。因此,您可以用括号括住表达式,然后使用隐式换行添加换行符,根据其嵌套级别组织表达式:

current_players = (dict((k,v)
    for k,v in list(team.items())
        for player in v['player']
            if player['year'] == 2013))

这里更清楚的是“<a href="http://www.python.org/dev/peps/pep-0202/" rel="nofollow">最后一个索引变化最快,就像嵌套的 for 循环一样。 ”</p>

您甚至可以添加空行和注释:

current_players = (dict((k,v)            # dict comprehension:

    for k,v in list(team.items())        #   let’s filter the team member dict...
        for player in v['player']        #   for players...
            if player['year'] == 2013))  #   who are playing this year

需要注意的一点:Python 语言参考说“续行的缩进并不重要”。所以你可以使用任何形式的缩进来提高可读性,但是解释器不会做任何额外的检查。

于 2013-06-05T23:54:26.783 回答
1

另一种方法是保持理解的力量,但在生成器上构建生成器以删除嵌套,然后使用内置的list//等...... set-dict类似于:

{k:v for k, v in enumerate(range(10)) if v % 2 == 0}

可以分解为:

with_idx = enumerate(range(10))
is_even = (el for el in with_idx if el[1] % 2 == 0)
as_dict = dict(is_even)

这实际上更冗长,但是如果您将类似的逻辑应用于嵌套级别,那么实际上确实更有意义。

于 2013-06-06T18:02:24.697 回答