2013-06-05 4 views
0

Я нашел ниже код в Интернете и пытаясь понять его.Как читать этот код

Не знаете, как мы можем использовать значение для i, когда ему назначается значение позже в цикле.

далее также признателен, если кто-то может объяснить, как это работает, т.е. снова присваивается для каждой итерации

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

Он должен быть лучше, чем 'ds = {chr (i): range (i, i + 5) для i в диапазоне (65,70)}'. Зачем создавать генератор, а затем dict, когда вы можете напрямую создать dict? – Billiska

+3

@Billiska: Потому что неполадки dict не были введены до Python 2.7. – Blender

+0

'pprint' здесь не имеет отношения. – Elazar

ответ

10

Вы смотрите на generator expression. Часть до 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 comprehension, а также:

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) 

См 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'} 

кроме этого, единственное, что вам нужно знать, чтобы понять, что выражение это то, что chr и range делать.