2013-06-05 166 views
0

我在互联网上找到了下面的代码并试图理解它。如何阅读此代码

不知道我们如何在循环中稍后分配值时使用i值。

还进一步感激,如果有人能解释一下它的工作原理是如何分配的,即回每次迭代

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

它应该更好,因为我在范围内(65,70)}''ds = {chr(i):range(i,i + 5)。为什么要创建一个生成器然后字典,当你可以直接创建一个字典? – Billiska

+3

@Billiska:因为直到Python 2.7才引入dict comprehensions。 – Blender

+0

'pprint'在这里并不重要。 – Elazar

回答

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) 

一个快速intoduction见this article

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做。