资讯专栏INFORMATION COLUMN

Python基础之控制结构

liaosilzu2007 / 3405人阅读

摘要:基础之控制结构学习目标代码块与缩进条件语句语句语句的嵌套断言循环循环循环中断循环控制语句综合嵌套列表解析式基础相关链接学习目标是简洁易学面向对象的编程语言。

0. 学习目标

Python 是简洁、易学、面向对象的编程语言。它不仅拥有强大的原生数据类型,也提供了简单易用的控制语句。在《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. 条件语句

以上示例语句都是逐条执行的,但实际应用中让程序选择执行特定的语句块是必备的。这时布尔类型就派上用场了。
用作布尔表达式时,标准值 FalseNone、数值 0、空序列(如空字符串、空元组和空字典等)都被视为假,而其他值均被视为真。这意味着任何 Python 值都可解释为真值,但 TrueFalse 为标准真值。在 C 语言中,标准真值为 0 (表示假)和 1 (表示真)。实际上,TrueFalse 是 0 和 1 的别名,其作用是完全相同的:

>>> bool("")False>>> bool([0])True>>> bool("Hello world")True>>> True == 1True>>> True + 23

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

# test_bool.pystring_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 = Falseprint(flag)

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

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

在上述例子中,Python 会检查用户输入答案,如果输入为 A,则打印 “Right!”,否则,会执行else 分支打印 “Error!”。
要检查多个条件,可使用 elifelifelse 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_blockelif second_condition:    second_blockelif third_condition:    third_blockelse:    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 "", line 1, in <module>AssertionError

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

>>> assert mail_2.endswith(".com")," Email must end with .com "Traceback (most recent call last):  File "", 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 = 0while 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 0The square of 2 equals 4The square of 4 equals 16The square of 6 equals 36The square of 8 equals 64

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

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)

程序输出结果如下:

153370371407

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}

Python基础相关链接

Python基础之变量与内置数据类型
Python基础之输入、输出与高阶赋值
Python基础之控制结构

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125089.html

相关文章

  • 软件测试需要学什么?50W+的测试工程师需要掌握哪些技能?

    摘要:协议学习常见请求方法学习和学习接口的基本概念接口文档认识接口测试用例编写接口测试工具使用软件测试自动化进阶性能测试性能测试的技术要求很高,不仅仅要对性能测试的指标测试分类测试设计有很深刻的理解。 ...

    wushuiyong 评论0 收藏0
  • Python基础使用期物处理并发

    摘要:本文重点掌握异步编程的相关概念了解期物的概念意义和使用方法了解中的阻塞型函数释放的特点。一异步编程相关概念阻塞程序未得到所需计算资源时被挂起的状态。 导语:本文章记录了本人在学习Python基础之控制流程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、掌握异步编程的相关概念;2、了解期物future的概念、意义和使用方法;3、了解Python...

    asoren 评论0 收藏0
  • Python基础输入、输出与高阶赋值

    摘要:基础之输入输出与高阶赋值学习目标输入输出与注释获取用户输入格式化输出基本方法格式化函数注释高阶赋值语句赋值运算符并行赋值序列解包链式赋值学习目标是简洁易学面向对象的编程语言。 ...

    Astrian 评论0 收藏0
  • Python爬虫Scrapy学习(基础篇)

    摘要:下载器下载器负责获取页面数据并提供给引擎,而后提供给。下载器中间件下载器中间件是在引擎及下载器之间的特定钩子,处理传递给引擎的。一旦页面下载完毕,下载器生成一个该页面的,并将其通过下载中间件返回方向发送给引擎。 作者:xiaoyu微信公众号:Python数据科学知乎:Python数据分析师 在爬虫的路上,学习scrapy是一个必不可少的环节。也许有好多朋友此时此刻也正在接触并学习sc...

    pkhope 评论0 收藏0

发表评论

0条评论

liaosilzu2007

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<