如何阅读此代码

时间:2013-06-05 23:41:24

标签: python python-2.7

我在互联网上找到了以下代码并尝试理解它。

我不知道如果在循环中稍后赋值,我们如何使用值。

如果有人可以解释它是如何工作的,即每次迭代都分配回来,那么

还要进一步理解

>>> import pprint
>>> ds = dict((chr(i), range(i, i+5)) for i in range(65,70))

2 个答案:

答案 0 :(得分:10)

您正在查看generator expressionfor之前的部分在for表达式定义的循环中执行。

生成器表达式生成key, value对序列,dict()构造函数用于构建字典。您可以将代码读取为具有相同的结果:

ds = {}
for i in range(65, 70):
    ds[chr(i)], range(i, i+5)

在Python 2.7和Python 3中,您也可以使用dict comprehension

ds = {chr(i): range(i, i+5) for i in range(65,70)}

结果会是一样的;你定义key: value表达式来从循环中构建字典。

在生成器表达式以及(list,dict或set)理解中,您可以使用多个嵌套循环,并添加if语句来过滤数据。这些是以嵌套顺序定义的;最外面的循环首先:

result = [i ** 2 for foo in range(10) if foo % 2 == 0 for i in range(foo)]

可以理解为:

result = []
for foo in range(10):
    if foo % 2 == 0:
        for i in range(foo):
            result.append(i ** 2)

请参阅this article进行快速介绍。

答案 1 :(得分:2)

它使用generator expression来创建元组的迭代器,然后将其传递给dict构造函数以构建新的字典。如果你通过将生成器转换为列表来查看生成器正在做什么,它会有所帮助:

>>> list((chr(i), range(i, i+5)) for i in range(65,70))
[('A', [65, 66, 67, 68, 69]), ('B', [66, 67, 68, 69, 70]), ('C', [67, 68, 69, 70, 71]), ('D', [68, 69, 70, 71, 72]), ('E', [69, 70, 71, 72, 73])]

请记住,如果您传递dict元组列表,则每个元组的第一个元素将用作键,第二个元素将用作值:

>>> dict([('key1', 'val1'), ('key2', 'val2')])
{'key2': 'val2', 'key1': 'val1'}

除此之外,理解该表达式唯一需要知道的是chrrange所做的事情。