Python控制结构详解:条件、循环与列表推导式实战

Cora
Cora
发布时间:2026-10-15 | 4人浏览过
原创

本文深入解析Python控制结构,涵盖代码块缩进规范、if/elif/else条件分支、while与for循环机制,以及break和continue控制流。重点讲解assert断言、水仙花数算法实现及九九乘法表案例,并详细介绍列表、字典推导式的语法与嵌套应用,帮助开发者掌握Python核心编程逻辑。

0. 学习目标

Python是一门简洁且易于学习的面向对象编程语言,不仅具备强大的原生数据类型,还提供了直观的控制语句。在《Python基础教程》系列中,前文已介绍内置原生数据类型及程序与用户交互的输入输出方式。本节旨在全面讲解Python的控制语句,为后续学习奠定坚实基础,完整覆盖数据结构与算法所需的Python基础知识及核心思想,并辅以实战示例与详细解析。

  • 理解并掌握 Python 条件语句与循环语句
  • 掌握 Python 条件语句与循环语句的复杂嵌套以及列表解析式

1. 代码块与缩进

代码块是一组执行语句,Python中所有控制结构定义代码块的语法一致,既可用于满足特定条件时执行(如if语句),也可用于重复执行代码(如循环)。Python通过缩进(空格或制表符)来界定代码块。使用冒号(:)标识后续为代码块,且同一代码块内各行缩进量必须保持一致(通常每级缩进4个空格):


if condition is True:
    print('this is a block')
    print('another line of this block')
print('escaped the previous block')

在定义函数体和类体时,同样遵循上述代码块缩进原则。

2. 条件语句

前述示例均为逐条执行,实际应用中需让程序根据条件选择执行特定语句块,此时布尔类型至关重要。

在布尔表达式中,标准值False、None、数值0以及空序列(如空字符串、空元组、空字典等)均被视为假(False),其余值均被视为真(True)。这意味着任何Python值均可解释为真值,但True和False是标准真值。与C语言中0表示假、1表示真不同,Python中True和False实际上是0和1的别名,作用完全相同:


>>> bool('')
False
>>> bool([0])
True
>>> bool('Hello world')
True
>>> True == 1
True
>>> True + 2
3

程序运行时,Python会自动将任意值转换为布尔值,无需显式转换:


# test_bool.py
string_test = 'Hello world'
if string_test:
    print('Automatic conversion ')

上述脚本执行结果如下,表明Python执行了自动转换:

Automatic conversion

需要注意的是,虽然值转换为真值后可能相等,例如 bool({}) == bool([]) == False,但本身它们并不相等,即 {} != []:


>>> bool({}) == bool([])
True
>>> {} == []
False

2.1 if 语句

条件语句(也称if语句)能够有条件地执行代码。如果条件(if和冒号之间的表达式)为真,则执行后续代码块;如果条件为假,则不执行:


if flag == True:
    flag = False
print(flag)

上述if语句称为单路分支结构。如果flag为True,则将其变为False,再打印flag值。另一种条件结构称为二元分支(也称if...else语句):


answer = input('Please enter your answer: ')
if answer == 'A':
    print('Right!')
else:
    print('Error!')

在上述例子中,Python会检查用户输入答案,如果输入为A,则打印“Right!”,否则,会执行else分支打印“Error!”。

要检查多个条件,可使用elif,elif是else if的缩写,可以将其理解为包含条件的else子句:


num = int(input('Please enter a number: ')) 
if num > 0: 
    print('The number is positive') 
elif num < 0: 
    print('The number is negative') 
else: 
    print('The number is zero') 

需要注意的是,在使用elif时,最后的else是必需的,它用来在所有分支条件都不满足的情况下提供默认分支。

上述三种条件结构可以用以下流程图表示:

综上,我们可以总结出Python中,条件语句的最一般形式:


if first_condition:
    first_block
elif second_condition:
    second_block
elif third_condition:
    third_block
else:
    fourth_block

每个条件都是一个布尔表达式,每个代码块包含一个或多个满足条件时要执行的语句。如果第一个条件为真,则执行第一个代码块,而不会评估其他条件。如果第一个条件失败,则继续判断第二个条件,以此类推。if语句可以包括任意数量的elif子句(也可以为0个),最后一个else子句是可选的。

2.2 if 语句的嵌套

条件结构支持嵌套,即在if语句中调用任意数量的if语句:


if alcohol < 20:
    print('Does not constitute drinking behavior!')
else:
    if alcohol > 80:
        print('Already meet drinking and driving standards!')
    else:
        print('Has reached the standard for drunk driving!')

上述程序所表达的逻辑可以用流程图表示:

2.3 断言

为了让程序在错误条件出现时立即中止,Python还提供了类似if语句的关键字:assert,使用此关键字可以要求某些条件必须得到满足。assert语句类似检查点,当我们知道程序的执行必须满足特定条件,才能正确地运行时,使用assert语句可以及时终止程序运行,类似网站注册时邮箱格式正确性的检查:


>>> mail_1 = 'test123456789@gmail.com'
>>> assert mail_1.endswith('.com')
>>> mail_2 = 'test123456789@gmail.con'
>>> assert mail_2.endswith('.com')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

为了说明程序终止的原因,可以在assert语句后添加说明字符串:


>>> assert mail_2.endswith('.com'),' Email must end with .com '
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError:  Email must end with .com

3. 循环

我们已经学习了如何在条件为真(或假)时执行代码块,但如何重复操作代码块多次呢?例如,打印1—100内的所有的偶数。我们当然可以写出50行print语句,但如果是这样,我们就不需要Python了。

Python提供了两种不同的循环结构。while循环允许对布尔条件进行重复测试,直到条件不能得到满足。for循环提供了遍历序列的迭代(例如字符串的字符、列表的元素或给定范围内的数字等)。

3.1 while 循环

while语句会在给定条件为真时重复执行代码块。例如,在下面的示例中,变量number被初始化为0,并且在while循环中,它每迭代一次就递增1,每次执行循环体前,首先进行条件判断,因此直到number等于5时结束循环:


number = 0
while number < 5:
    print('A total of {} time(s)'.format(number))
    number += 1

程序运行结果如下:

A total of 0 time(s)

A total of 1 time(s)

A total of 2 time(s)

A total of 3 time(s)

A total of 4 time(s)

3.2 for 循环

while语句可用于在条件为真时反复执行代码块,但有时候我们可能需要为序列中每个元素执行代码块。

为了介绍for循环,我们首先要了解可迭代对象,可迭代对象是可使用for循环进行遍历的对象,对于现阶段,我们可以只需将可迭代对象视为序列即可。 for语句可以用于遍历一个序列中的每个元素:


fruits = ['apple', 'orange', 'banana', 'lemon']
for fruit in fruits:
    print(fruit)

for语句将列表fruits中的每一个值依次赋给变量fruit。然后,代码块就会被执行。for语句的常见用法是在一定的值范围内进行有限次数的迭代。

我们已经在介绍数据类型list时,简单的介绍过内置函数range用于创建范围,range语法类似于切片,包含起始位置,但不包含结束位置。实际上,如果只提供了一个位置,将把这个位置视为结束位置,而起始位置为0。同时也可以为range函数提供步长参数,在范围内每隔若个元素提取一个元素:


for i in range(0, 10, 2):
    print('The square of {} equals {}'.format(i, i**2))

程序的输出结果如下:

The square of 0 equals 0

The square of 2 equals 4

The square of 4 equals 16

The square of 6 equals 36

The square of 8 equals 64

使用for循环还可以遍历字典,默认情况下,是遍历字典的键,如果需要遍历所有的值或键-值对,就需要用到字典的values和items方法了:


fruits = {'apple': 5.0, 'orange': 3.5, 'banana': 4.0}
for k in fruits:
    print(k, 'corresponds to', fruits[k])

上示代码等价于:


fruits = {'apple': 5.0, 'orange': 3.5, 'banana': 4.0}
for k, v in fruits.items():
    print(k, 'corresponds to', v)

3.3 中断循环

通常,循环会不断地执行代码块,直到条件为假或迭代完序列中的所有元素。但有时,我们可能需要开始新迭代(跳到下一次迭代开头,并不结束循环)或直接结束循环。

🔍 break

要结束循环,可使用break,假设要找到最大的三位水仙花数(每个位上的数字的3次幂之和等于它本身的三位数),可以从999开始向下迭代,找到一个水仙花数后,无需继续迭代,直接跳出循环:


for i in range(999, 99, -1):
    b = i % 10
    t = (i // 10) % 10
    h = i // 100
    if b ** 3 + t ** 3 + h ** 3 == i:
        print(i)
        break

运行此程序,将在打印407后结束,在上述示例中,可以看到通过将range的步长设置为负数,让range反向迭代。

常规的while循环会在循环开头时进行判断用来结束循环,但有时我们想要循环在循环体中结束,这时就需要用到while True/break语法了,使用while True可以使循环永不结束,然后在循环体内使用if语句,当if语句的条件得到满足时调用break结束循环,例如在登陆界面中,只有用户输入了正确的用户名才能进行下一步操作:


users = ['root', 'admin', 'user_1']
while True:
    user = input('Please enter your name: ')
    if user in users:
        break
    print('User does not exist!')
print('The user name is correct!')

🔍 continue

当指定语句continue时,它结束当前迭代,并跳到下一次迭代开头。这基本上意味着跳过循环体中余下的语句,但不结束循环,例如计算所有水仙花数,如果使用语句continue,则可以写为:


for i in range(100, 1000):
    b = i % 10
    t = (i // 10) % 10
    h = i // 100
    if b ** 3 + t ** 3 + h ** 3 != i:
        continue
    print(i)

程序输出结果如下:

153

370

371

407

4. 控制语句综合嵌套

控制语句可以进行复杂的综合嵌套,可以通过打印九九乘法表来综合使用控制语句:


for i in range(1, 10):
    for j in range(1, 10):
        if i > j:
            print('{} * {} = {}'.format(i, j, i*j), end = '\t')
        elif i == j:
            print('{} * {} = {}'.format(i, j, i*j))
        else:
            continue

5. 列表解析式

列表推导是利用列表创建新列表的方式,列表推导的工作原理类似于for循环:


>>> [i**2 for i in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

在列表推导中也可以进行嵌套,例如添加更多的for循环和if语句:


>>> [[i, j] for i in range(10) for j in range(10) if i % 3 == 0 and j % 4 == 0]
[[0, 0], [0, 4], [0, 8], [3, 0], [3, 4], [3, 8], [6, 0], [6, 4], [6, 8], [9, 0], [9, 4], [9, 8]]

等价于:


new_list = []
for i in range(10):
    for j in range(1):
        if i % 3 == 0 and j % 4 == 0:
            new_list.append([i, j])

除了列表推导式外,还可以使用花括号来执行字典推导:


>>> print({i: i**3 for i in range(10)})
{0: 0, 1: 1, 2: 8, 3: 27, 4: 64, 5: 125, 6: 216, 7: 343, 8: 512, 9: 729} 

注意:

1、循环也是以冒号(:)结尾

2、条件为各种算术表达式,

a) 当为真时,循环体语句组 1,重复执行

b) 当为假是,循环体语句组 2,停止执行

3、如果循环体忘记累计,条件判断一直为真,则为死循环。循环体一直实行。

a) 死循环有时候经常被用来构建无限循环

b) 可以使用 ctrl+c 终止,或者停止 IDE

总结

到此这篇关于Python基础教程之控制结构的文章就介绍到这了,更多相关Python控制结构内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表