Лучший источник информации - официальный учебник Python по составлению списков . Понимание списков почти такое же, как и циклы for (конечно, любое понимание списка может быть записано в виде цикла for), но они часто быстрее, чем использование цикла for.
Взгляните на этот более длинный список из учебника ( if
часть фильтрует понимание, только части, которые передают оператор if, передаются в последнюю часть понимания списка (здесь (x,y)
):
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Он точно такой же, как и этот вложенный цикл for (и, как сказано в руководстве, обратите внимание, что порядок for и if одинаков).
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Основное различие между пониманием списка и циклом for заключается в том, что последняя часть цикла for (где вы что-то делаете) идет в начале, а не в конце.
На ваши вопросы:
Какого типа должен быть объект, чтобы использовать эту структуру цикла?
Итерацию . Любой объект, который может генерировать (конечный) набор элементов. К ним относятся любой контейнер, списки, наборы, генераторы и т. Д.
В каком порядке i и j присваиваются элементам в объекте?
Они назначаются в том же порядке, в котором они генерируются из каждого списка, как если бы они были во вложенном цикле for (для вашего первого понимания вы получите 1 элемент для i, затем каждое значение из j, 2-й элемент в i, затем каждое значение из j и т. д.)
Можно ли смоделировать это с помощью другой структуры цикла for?
Да, уже показано выше.
Можно ли вложить этот цикл for в аналогичную или другую структуру цикла for? А как бы это выглядело?
Конечно, но это не лучшая идея. Вот, например, список списков персонажей:
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]