Это может помочь «развернуть» петли в выражении генератора и записать их как независимые петли for
. Для этого вы берете все операторы for (variable) in (iterable)
и помещаете их в отдельные строки в том же порядке, но перемещаете вещь с фронта на тело самого внутреннего для цикла. Как это, в общем:
thing for a in a_list for b in b_list for c in c_list
становится
for a in a_list:
for b in b_list:
for c in c_list:
thing
за исключением того, что, когда вы делаете выражение генератора, все thing
s автоматически войдет в список или словарь или любой другой. В вашем случае,
dict((fn(i+1), code)
for i, code in enumerate('FGHJKMNQUVXZ')
for fn in (int, str))
становится
for i, code in enumerate('FGHJKMNQUVXZ'):
for fn in (int, str):
(fn(i+1), code)
кроме того, что все кортежи будут преобразованы в dict
.
Как объясняют другие ответы, вы можете отслеживать выполнение этих двух циклов for
. Во-первых, внешний контур устанавливает i
в 0
и code
к 'F'
, и в том, что внутренний цикл устанавливает fn
к int
, а затем str
, так что вы получите
int(0+1, 'F')
str(0+1, 'F')
, после чего переходит к следующему i
и code
.
мне это нравится способ объяснения путем преобразования кода! Если бы это был я, я мог бы использовать только два уровня в общем вступлении, чтобы оставаться близко к вопросу, а также избегать 'a_list' в пользу' a_seq' или 'a_iterable' (список такой конкретный) - но это не я; -) – Dilettant
@ Dilettant Я хотел использовать другое количество уровней, чтобы показать, как техника обобщается. Вы правы, что что-то вроде 'a_iter', вероятно, было бы лучшим именем, но я полагал, что это не слишком важно, потому что ученики на этом уровне не слишком обеспокоены различиями между списками и итерами. –
Спасибо за продуманную обратную связь, и я разделяю намерение, поскольку обобщение - это именно то, что есть - я часто удивляюсь, что именно попадает в глаза учащегося и что происходит от него - особенно. при обучении :-) – Dilettant