Циклы for должны быть такими же, как если бы вы записали их «обычным» способом:
for row in table:
for cell in row:
print(cell)
Так что, когда вы извлекаете это в понимание списка, вы оставляете циклы как есть (кроме удаления ":") и просто потяните последнее выражение в начало:
# you can actually "abuse" list comprehensions to have short
# loops like this, even if you don't care about the list being
# generated. It's generally not a great practice though
[print(cell) for row in table for cell in row]
Я признаю, что это немного сбивает с толку, когда вы просто читаете код слева направо.Вы просто должны помнить, чтобы сначала прочитать циклы, а затем оператор начала идет в конце.Я предполагаю, что это могло быть реализовано как
[for row in table for cell in row cell]
, но я думаю, что это выглядит еще более запутанным;Труднее сказать, где заканчивается второй цикл и начинается оператор внутри него.В конце концов, это дизайнерское решение, хотя я уверен, что некоторые люди сочтут тот или иной подход более интуитивным.