Python 中的 For 循环:初学指南

举报
Tiamo_T 发表于 2021/10/01 20:43:28 2021/10/01
【摘要】 Python 中的 for 循环是编写灵活且干净的 Python 程序时应该注意的主要结构之一。Python for 循环是一个控制流语句,它允许迭代一个序列(例如一个字符串、列表、元组、字典、集合、字符串)。for 语句为序列中的每个项目执行特定的代码块。这里,我们将介绍许多与 Python 中的 for 循环相关的概念,这些概念不仅可以让您对循环有基本的了解,还可以更深入地了解它们的工作...

Python 中的 for 循环是编写灵活且干净的 Python 程序时应该注意的主要结构之一。

Python for 循环是一个控制流语句,它允许迭代一个序列(例如一个字符串、列表、元组、字典、集合、字符串)。for 语句为序列中的每个项目执行特定的代码块。

这里,我们将介绍许多与 Python 中的 for 循环相关的概念,这些概念不仅可以让您对循环有基本的了解,还可以更深入地了解它们的工作方式。

让我们开始吧!

在 Python 中使用 For 循环遍历列表

首先,我们将看到如何使用 for 循环来遍历 Python 序列的项目。

for 循环的通用语法是:

for {item} in {sequence}:
    {code_block}

在循环的每一次迭代的代码块被使用所执行的内部的for循环的序列。一旦序列中没有更多项目,for 循环就会结束。

如果出现特定条件,循环的执行甚至可能在序列结束之前结束,我们将在本教程的后面部分看到这一点……

下面是一个 for 循环的例子:

animals = ['lion', 'tiger', 'giraffe']

for animal in animals:
    print(animal)

输出是:

lion
tiger
giraffe

可以使用breakcontinue语句修改 for 循环的行为。

在 Python For 循环中使用 Break 和 Continue

break 语句停止执行 for 循环并在循环后继续执行代码

animals = ['lion', 'tiger', 'giraffe']

for animal in animals:
    if animal == 'tiger':
        break
    else:
        print(animal)

我们使用if else 语句跳出循环或根据条件打印列表项。

输出如下,因为 for 循环的执行在列表的第二个元素处中断:

lion

在我们前面的例子中,我们也可以省略 else 语句:

for animal in animals:
    if animal == 'tiger':
        break
    print(animal)

continue 语句跳过 for 循环中的当前迭代并从循环的下一次迭代继续执行代码

让我们在前面的例子中用 continue 替换 break ,看看会发生什么:

for animal in animals:
    if animal == 'tiger':
        continue
    print(animal)

这次我们的代码还打印了列表的第三个元素,因为 continue 语句会跳过第二次迭代,但不会像 break 语句那样退出循环:

lion
giraffe

For 循环应用于元组和集合

Python for 循环实现的强大之处在于它可以应用于任何类型的序列,例如元组或集合。

元组

animals = ('lion', 'tiger', 'giraffe')

for animal in animals:
    print(animal)

集合

animals = {'lion', 'tiger', 'giraffe'}

for animal in animals:
    print(animal)

您可以看到我们编写 for 循环的方式不会随着列表、元组或集合而改变。

考虑到集合是无序 和无索引的,改变的一件事是将代码应用于集合时的输出。

在继续在您的机器上运行代码以查看 tuple 和 set 之间的区别之前。

For 循环应用于字符串

字符串也是一个序列,它是一个字符序列。

因此,您还可以将 for 循环应用于字符串:

website = 'codefather.tech'

for character in website:
    print(character)

这是输出:

c
o
d
e
f
a
t
h
e
r
.
t
e
c
h

打印语句会在字符串的每个字符后自动添加一个换行符。

如果我们想在没有换行符的情况下打印每个字符怎么办?

没有换行符的Python 中打印字符串,您可以将 end= 参数传递给 print() 函数。

在这种情况下,我们将删除换行符并在每个字符之间留一个空格:

website = 'codefather.tech'

for character in website:
    print(character, end=' ')

这次的输出是:

c o d e f a t h e r . t e c h 

现在让我们转向另一种数据类型……

For 循环应用于字典

想知道 for 循环如何与字典一起使用?

让我们一探究竟吧!

user_details = {'name': 'Claudio', 'nationality': 'italian'}

for user_detail in user_details:
    print(user_detail)

当你运行它时,你会回来......

name
nationality

...只是字典的键。

所以从这里我们可以打印键和值:

for user_detail in user_details:
    print(user_detail, ":", user_details[user_detail])


[output]
name : Claudio
nationality : italian

让我们尝试一些不同的东西:

for key, value in user_details:
    print(name, nationality)

嗯……它不起作用……

Traceback (most recent call last):
   File "/opt/python/codefather/for_loop.py", line 55, in 
     for name, nationality in user_details:
ValueError: too many values to unpack (expected 2)

我们得到了太多的值来解包错误。

为了使它工作,我们必须使用字典 items() 方法,这是该方法为我们的字典返回的内容:

print(user_details.items())
dict_items([('name', 'Claudio'), ('nationality', 'italian')])

让我们将它应用于我们的 for 循环以从字典中取回键和值:

for key, value in user_details.items():
    print(key, ":", value)

[output]
name : Claudio
nationality : italian

这样就对了.

Python 中的 For Else 循环

如果您编写 Python 程序,则可以将 else 子句与 for 循环一起使用。

如下:

animals = ['lion', 'tiger', 'giraffe']

for animal in animals:
    print(animal)
else:
    print("For loop executed")

当与 for 循环一起使用时,else 子句中的代码会在 for 循环完成后执行唯一的例外是 break 语句停止循环的执行。

lion
tiger
giraffe
For loop executed

现在看看当与 for 循环一起使用时,break 语句如何改变 else 子句的行为:

animal_to_find = 'tiger'

for animal in animals:
    if animal == animal_to_find:
        print(animal_to_find,"found")
        break
else:
    print("Animal not found")

输出是:

tiger found

当 break 语句停止执行 for 循环时,else 子句中的代码不会被执行。

如果没有执行break语句,我们来确认一下else块是否被执行:

animal_to_find = 'elephant'

for animal in animals:
    if animal == animal_to_find:
        print(animal_to_find,"found")
        break
else:
    print("Animal not found")

我们程序的输出证实:

Animal not found

带索引的 For 循环

到目前为止,我们看到的 for 循环与其他编程语言(如 C)中使用的 for 循环非常不同,后者在循环定义中存在索引。

Python 还允许在执行 for 循环时跟踪序列的索引。

一种方法是使用range() 内置函数(准确地说,正如这里所解释的,严格来说并不是一个函数)。

for 循环中使用range之前让我们找出 range() 返回什么:

>>> print(range(10))
range(0, 10)
>>> print(list(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print(list(range(1,10)))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print(list(range(1,10,2)))
[1, 3, 5, 7, 9] 

第一个打印语句并没有告诉我们太多信息,因此要找出 range() 返回的内容,我们可以将其转换为列表。

我们可以看到:

  • range(10) 返回 0 到 9 之间的数字(不包括 10)。
  • range(1,10) 返回 1 到 9 之间的数字。
  • range(1,10,2) 只返回从 1 到 9 的奇数,因为我们传递了第三个参数(step)。

range 函数默认返回一个从 0 开始的数字序列以 1 为增量,以传递给函数的数字减 1 结束 。可以自定义起始值和增量(步长)。

考虑到 range() 生成一系列数字,我们可以使用它来生成列表(或元组、或集合等)的索引,作为 for 循环的一部分。

为此,我们使用range 函数和 len 函数

animals = ['lion', 'tiger', 'giraffe']

for index in range(len(animals)):
    print(animals[index])

尝试确认输出是您期望的输出。

在 for 循环中跟踪序列索引的另一种方法是使用Python enumerate

Python 中的嵌套 For 循环

在某些情况下,您可能需要在另一个 for 循环中使用 for 循环。

这就是我们所说的嵌套 for 循环

为了解释这一点,我们将定义一个矩阵(基本上是一个包含数字的列表列表):

matrix = [[1,2,3],[4,5,6]]

for row in matrix:
    for value in row:
        if value == 2:
            print("Number 2 found in the matrix")

[output]
Number 2 found in the matrix

外循环一次选择一行,内循环遍历每一行中的值。

另一种选择是使用 range() 函数来跟踪矩阵的行和列:

for row in range(len(matrix)):
    for column in range(len(matrix[row])):
        print("Row:",row,"Column:",column,"Value:",matrix[row][column])

在这种情况下,我们跟踪行和列的索引,因此我们可以打印它们:

Row: 0 Column: 0 Value: 1
Row: 0 Column: 1 Value: 2
Row: 0 Column: 2 Value: 3
Row: 1 Column: 0 Value: 4
Row: 1 Column: 1 Value: 5
Row: 1 Column: 2 Value: 6

在嵌套循环中使用索引时要小心,实际上很容易错误地使用无效索引,如下例所示。这些错误并不总是很容易找到:

for row in range(len(matrix)):
    for column in range(len(row)):
        print("Row:",row,"Column:",column,"Value:",matrix[row][column])

此代码返回以下错误:

Traceback (most recent call last):
   File "/opt/python/codefather/for_loop.py", line 103, in 
     for column in range(len(row)):
 TypeError: object of type 'int' has no len()

你能看到错误在哪里吗?

我会把它留给你去发现......🙂

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。