2016-08-16 2 views
1

Я готовлюсь к экзамену, и я решил начать выпуск экзаменов. Одно из требований - понять, что делает код. Но у меня проблемы с этой аннотацией.Понимание порядка оценки вложенных списков

Я не понимаю, какая структура этого вложенного цикла и какой цикл выполняется в первую очередь.

n = 10 
p = [q for q in range(2, n) if q not in [r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]] 
print(p) 

Может кто-нибудь помочь мне понять, пожалуйста?

+1

Помогает ли [это] (http://stackoverflow.com/questions/18072759/python-nested-list-comprehension)? – Pureferret

+0

пишут их как обычные петли, и вы сможете легко понять это. –

ответ

1

Она начинается с оценки:

[r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)] 

, которая сводится к:

[r for r in range(4, 10, 2)] 

так range(2, int(n * 0.5)) сводится к списку с одним элементом [2], который используется в качестве значения i в for r in range(i * 2, n, i) заявление. Таким образом, внутреннее понимание списка оценивается как [4, 6, 8].

Затем внешний контур for q in range(2, n) выполняется и возвращает те элементы из списка [2, 3, ..., 9], которые не входят в ранее построенном списке т.е. [4, 6, 8] с:

# range(2, n) -> [2, 3, ..., 9] 
q for q in range(2, n) if q not in [..previously constructed list]  
+0

в порядке Я получаю это кристально ясно сейчас!Благодарю спасибо спасибо – Nancy

0

Как правило, самые внутренние петли будут выполнены в первую очередь.

Имея это в виду, давайте разберем проблему вниз:

[r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)] 

n**0.5 является 3.xxx, поэтому range(2, int(n**0.5)) фактически диапазон (2, 3), что 2 (см range для получения дополнительной информации) ,

Таким образом, i будет 2, несмотря ни на что.

r in range(i * 2, n, i) выглядит довольно просто сейчас, т будет находиться в диапазоне от 4 до 10 (исключен), используя стадию 2. Возможные значения: 4, 6 и 8.

проблема становится:

p = [q for q in range(2, n) if q not in [4, 6, 8]] 

В основном это все нечетные числа от 2 до 10 (исключая), плюс номер 2.

-1

Я собираюсь дать вам небольшой совет, который поможет вам в этом, если вам трудно понять внутренние циклы, запустите этот код:

resultA = [] 
for x in ['x1', 'x2', 'x3']: 
    for y in ['y1', 'y2', 'y3']: 
     for z in ['z1', 'z2', 'z3']: 
      resultA.append(''.join([x, y, z])) 

print resultA 

resultB = [''.join([x, y, z]) 
      for x in ['x1', 'x2', 'x3'] 
      for y in ['y1', 'y2', 'y3'] 
      for z in ['z1', 'z2', 'z3'] 
      ] 

print resultB 

print resultA == resultB 

После того, как вы поняли этот код списки постижения становится второй натурой, то просто вернуться к исходному коду, и вы не будете иметь никаких проблем с ним :)

0

Это эквивалентно:

list_i=[] 
for i in range(2, int(n**0.5)): 
    for r in range(i*2, n, i): 
     list_i.append(r) 
res=[] 
for q in range(2, n) : 
    if q not in list_i: 
     res.append(q) 

print res 
Смежные вопросы