遍历整个列表

您通常希望遍历列表中的所有条目,对每个条目执行相同的任务。 例如,在游戏中,您可能希望将屏幕上的每个元素移动相同的量。 在数字列表中,您可能希望对每个元素执行相同的统计操作。 或者您可能想要显示网站文章列表中的每个标题。 当你想对列表中的每一项执行相同的操作时,你可以使用 Python 的 for 循环。

假设我们有一个魔术师的名字列表,我们想打印出列表中的每个名字。 我们可以通过从列表中单独检索每个名称来做到这一点,但这种方法可能会导致几个问题。 首先,用一长串名字来做这件事是重复的。 此外,每次列表的长度发生变化时,我们都必须更改我们的代码。 使用 for 循环让 Python 在内部管理这些问题,从而避免了这两个问题。

让我们使用 for 循环打印出魔术师列表中的每个名字:

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(magician)

我们首先定义一个列表,就像我们在第 3 章中所做的那样。然后我们定义一个 for 循环。 这一行告诉 Python 从列表 magicians 中提取一个名字,并将它与变量 magician 相关联。 接下来,我们告诉 Python 打印刚刚分配给魔术师的名字。 然后 Python 重复最后两行,对列表中的每个名称重复一次。 将此代码理解为“对于魔术师列表中的每个魔术师,打印魔术师的名字”可能会有所帮助。 输出是列表中每个名称的简单打印输出:

alice
david
carolina

深入研究循环

循环很重要,因为它是计算机自动执行重复性任务的最常见方式之一。 例如,在我们在 magicians.py 中使用的简单循环中,Python 最初读取循环的第一行:

for magician in magicians:

这一行告诉 Python 从列表 magicians 中检索第一个值并将其与变量 magician 相关联。 第一个值是 'alice' 。 Python 然后读取下一行:

print(magician)

Python 打印 magician 的当前值,它仍然是 'alice' 。 因为列表包含更多值,Python 返回到循环的第一行:

for magician in magicians:

Python 检索列表中的下一个名称 'david' ,并将该值与变量 magician 相关联。 Python 然后执行以下行:

print(magician)

Python 再次打印 magician 的当前值,现在是 'david'。 Python 使用列表中的最后一个值 'carolina' 再次重复整个循环。 因为列表中没有更多值,Python 移至程序的下一行。 在这种情况下,for 循环之后什么也没有,所以程序结束。

当您第一次使用循环时,请记住,无论列表中有多少项,都会为列表中的每个项目重复执行一组步骤。 如果列表中有一百万个项目,Python 会重复这些步骤一百万次——而且通常非常快。

还请记住,在编写自己的 for 循环时,您可以为将与列表中的每个值相关联的临时变量选择任何名称。 但是,选择一个有意义的名称来代表列表中的单个项目会很有帮助。 例如,这是为猫列表、狗列表和一般项目列表启动 for 循环的好方法:

for cat in cats:
for dog in dogs:
for item in list_of_items:

这些命名约定可以帮助您了解在 for 循环中对每个项目执行的操作。 使用单数和复数名称可以帮助您识别一段代码是处理列表中的单个元素还是处理整个列表。

在 for 循环中执行更多的操作

您几乎可以对 for 循环中的每个项目执行任何操作。 让我们在前面的例子的基础上向每个魔术师打印一条消息,告诉他们他们表演了一个很棒的把戏:

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(f"{magician.title()}, that was a great trick!")

这段代码的唯一区别是我们向每位魔术师发送消息的地方,从魔术师的名字开始。 第一次通过循环时,magician 的值为 “alice”,因此 Python 以名称 “Alice” 开始第一条消息。 第二次通过时,消息将以 “David” 开头,第三次通过时,消息将以 “Carolina” 开头。

输出显示列表中每个魔术师的个性化消息:

Alice, that was a great trick!
David, that was a great trick!
Carolina, that was a great trick!

您还可以在 for 循环中编写任意多行代码。 在 magicians 中 for magician 行之后的每个缩进行都被认为在循环内,并且每个缩进行都为列表中的每个值执行一次。 因此,您可以对列表中的每个值做任意多的工作。 让我们在消息中添加第二行,告诉每位魔术师我们期待他们的下一个魔术:

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(f"{magician.title()}, that was a great trick!")
    print(f"I can't wait to see your next trick, {magician.title()}.\n")

因为我们缩进了对 print() 的两次调用,所以每一行都会为列表中的每个魔术师执行一次。 第二个 print() 调用中的换行符("\n")在每次通过循环后插入一个空行。 这会为列表中的每个人创建一组整齐分组的消息:

Alice, that was a great trick!
I can't wait to see your next trick, Alice.

David, that was a great trick!
I can't wait to see your next trick, David.

Carolina, that was a great trick!
I can't wait to see your next trick, Carolina.

您可以在 for 循环中使用任意多行。 在实践中,您经常会发现在使用 for 循环时对列表中的每个项目执行许多不同的操作很有用。

在 for 循环结束后执行一些操作

for 循环执行完毕后会发生什么? 通常,您会想要总结一个输出块或继续您的程序必须完成的其他工作。 for 循环之后没有缩进的任何代码行都将执行一次而不重复。 给魔术师团写个感谢,感谢他们的精彩表演。 为了在打印完所有个人消息后显示此组消息,我们将感谢消息放在 for 循环之后,没有缩进:

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(f"{magician.title()}, that was a great trick!")
    print(f"I can't wait to see your next trick, {magician.title()}.\n")

print("Thank you, everyone. That was a great magic show!")

正如您之前看到的,对列表中的每个魔术师的前两次 print() 调用重复一次。 然而,因为最后一行没有缩进,它只打印一次:

Alice, that was a great trick!
I can't wait to see your next trick, Alice.

David, that was a great trick!
I can't wait to see your next trick, David.

Carolina, that was a great trick!
I can't wait to see your next trick, Carolina.

Thank you, everyone. That was a great magic show!

当您使用 for 循环处理数据时,您会发现这是总结对整个数据集执行的操作的好方法。 例如,您可以使用 for 循环通过运行角色列表并在屏幕上显示每个角色来初始化游戏。 然后,您可以在此循环之后编写一些额外的代码,在所有角色都被绘制到屏幕后显示一个“立即播放”按钮。