最好的信息来源是官方 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循环的最后部分(你要做某事的地方)位于开头而不是结尾。
回答您的问题:
为了使用这个for循环结构,对象必须是什么类型?
一个可迭代对象。任何能生成(有限的)元素集合的对象。这些包括任何容器,如列表、集合、生成器等。
i和j被分配到对象的元素中的顺序是什么?
它们被分配的顺序与它们从每个列表中生成的顺序完全相同,就好像它们是在嵌套的for循环中(对于您的第一个列表解析,您将获得i的1个元素,然后是来自j的每个值,第二个元素进入i,然后是来自j的每个值,等等)。
可以用不同的for循环结构模拟吗?
可以,上面已经展示过了。
这个for循环可以与类似或不同的结构的for循环嵌套吗?它会是什么样子?
可以,但这不是一个好主意。在这里,例如,给出了一个字符列表的列表:
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]