0

我在 Internet 上找到了以下代码并试图理解它。

不知道我们如何在循环中稍后为 i 赋值时使用 value 。

如果有人能解释它是如何工作的,也就是为每次迭代分配回

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

2 回答 2

10

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

生成器表达式生成一系列key, value对,dict()构造函数使用它来构建字典。您可以将代码阅读为具有与以下相同的结果:

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

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

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

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

在生成器表达式以及(列表、字典或集合)推导中,您可以使用多个嵌套循环,并添加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)

请参阅本文以快速入门。

于 2013-06-05T23:45:25.597 回答
2

它使用生成器表达式创建元组的迭代器,然后将其传递给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做什么。

于 2013-06-05T23:48:52.913 回答