Найкращим джерелом інформації є офіційний навчальний посібник Python щодо розуміння списку . Означення списку майже такі ж, як і для циклів (звичайно, будь-яке розуміння списку може бути записане у вигляді циклу 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)]
Це точно так само, як це вкладено для циклу (і, як говорить підручник, зауважте, як порядок для і якщо вони однакові).
>>> 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 присвоюються елементам об’єкта?
Вони призначаються в такому ж порядку, як і генеровані з кожного списку, як якщо б вони були вкладеними для циклу (для вашого першого розуміння ви отримаєте 1 елемент для i, а потім кожне значення j, 2-й елемент в i, то кожне значення від j тощо)
Чи може це моделювати інша для структури циклу?
Так, вже показано вище.
Чи може це для циклу вкладати подібну чи іншу структуру для циклу? А як би це виглядало?
Звичайно, але це не чудова ідея. Ось, наприклад, наводить список списків символів:
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]