归纳整理Python中的控制流语句的知识点

发表于 5年以前  | 总阅读数:385 次

程序流

Python 解释器在其最简单的级别,以类似的方式操作,即从程序的顶端开始,然后一行一行地顺序执行程序语句。例如,清单 1 展示了几个简单的语句。当把它们键入 Python 解释器中(或者将它们保存在一个文件中,并作为一个 Python 程序来执行)时,读取语句的顺序是从左到右。 当读到一个行结束符(比如换行符)时,Python 解释器就前进到下一行并继续,直到没有了代码行。
清单 1. 一个简单的 Python 程序


    >>> i = 1
    >>> type(i)
    <type 'int'>
    >>> l = [0, 1, 2, 3, 4]
    >>> l * i
    [0, 1, 2, 3, 4]

在本例中,语句以简单的顺序一个接一个。但是情况并不总是线性的。考虑一个个人的例子。您今天早上醒来,听了交通或天气报告(或者两者都听了)。根据交通报告,您可能选择了一条不同的上班路线;或者类似地,根据天气报告,您为周末计划了不同的活动。您的对策并不简单;根据您所获得的信息,生活的自然顺序迂回而曲折。

Python 像大多数编程语言一样,通过使用流控制语句,也可以以这种方式操作。在 Python 中,有 3 种基本的流控制语句:

  1. if 语句,它基于测试表达式的结果执行一个特定的语句块。
  2. while 循环,它当一个测试表达式为 true 时执行一个语句块。
  3. for 循环,它对一个语句块执行一定次数。

这个列表相当简单,并且您可能从其他编程语言认识了这些流控制语句。但是您可能在想,语句块 是什么意思呢。在清单 1 中,您看到了几个简单的语句,包括一个变量初始化、一个方法调用(type 方法)和一个乘法操作。这些语句执行一个简单的操作,因此把它们叫做简单语句。

Python 也具有复合语句,即相关语句形成的语句组,其中包括简单和(可能)附加的复杂语句。例如,根据表达式的值(对个人来说,可能是对"今天的天气晴朗吗"之类问题的答案),一个复合语句可能执行不同的操作或者对一个操作重复多次。这一描述似乎有些类似于前一段的流控制描述。当然应该类似,因为流控制语句就是复合语句。

一个复合语句包括一个流控制指令,后跟一个冒号(:),然后再是一个程序语句块。语句块由一个或多个简单语句和复合语句组成。清单 2 中提供了一个简单的伪代码例子。
清单 2. 一个伪代码例子展示了简单语句和复杂语句


    simple statement one
    compound statement one:
      simple statement two
      simple statement three
      compound statement two:
        simple statement four
    simple statement five

该语法看起来既熟悉又陌生,并且两种感觉来自相同的事情:缩进。在列大纲或步骤时,您可能会使用不同级别的缩进来分隔每一项,使得列出来的东西更加清晰可读。Python 遵循这一模型,使用缩进来分隔代码块与程序的其余部分。其他编程语言使用特殊的字符来区分代码块,比如基于 C 的语言中的花括号({ 和 })。这些其他语言也鼓励程序员使用缩进,以改善程序的可读性。

另一方面,Python 需要缩进以指示代码块。如果没有正确地缩进,Python 解释器会抛出异常。可以使用制表符来标记缩进,但是一般推荐使用空格。(为了一致性,我总是使用 4 个空格来缩进代码块。)理由很简单:空格字符只有一种解释方式。另一方面,制表符可以有不同的解释方式,根据所使用的平台或工具,可以解释为 2 个、4 个、6 个甚至 8 个空格。
增强程序可读性

缩进要求可能是 Python 的一个基本指导原则 ―― Python 程序应该易于读和理解 ―― 的最佳例子。但是这就跟工具一样,顽固分子也可能会编写晦涩的 Python 代码。例如,螺丝起子是用来起螺丝的,但是有时您也可能用来打开油漆盖子。

两个其他特性有助于编写易读的 Python 程序,并且这两者都遵循前面所用的书的比喻。首先,书中的行不会延伸到页面外面,都有固定的长度。其次,书中的行不是以特殊符号(比如分号)结束。这两个特性都贯穿于编写 Python 程序的过程中。

如果某个程序行太长,可以在文件中的下一物理行继续这一行。没有硬性规定一个代码行应该多长。但是一般限制为 80 个字符,这容易适合大多数显示器的一个打印页面。有几种方式来扩展超过一行的代码语句:

  • 三引号字符串可以扩展到多个行。
  • 括号中的表达式可以扩展到多个行。
  • 可以使用继续字符(\)来在多行分割语句。

在 Python 中,不需要使用特殊字符(或符号)来指示语句的结束。这与有些语言不同。例如,基于 C 的语言使用分号(;)来指示代码行的结束。然而,有时候需要在一行放多个程序语句,例如初始化变量时。在这样的情况下,可以使用分号来分隔单个语句。

清单 3 中演示了这两种技术。
清单 3. 演示 Python 的可读性技术


    >>> i1 = 10 ; i2 = 20 ; i3 = 30
    >>>
    >>> b = ((i1 < 20) and
    ...   (i2 < 30) and
    ...   (i3 < 40))
    >>> b
    True
    >>>
    >>> b = (i1 < 20) and \
    ...   (i2 < 30) and \
    ...   (i3 < 40)
    >>> 
    >>> b
    True

注意清单 3 中扩展到多个行的程序语句是如何缩进以改善可读性的。在本例中,缩进不是强制性的,就跟一个复合语句一样。但是正如您所见,缩进改善了程序的外观,因而强烈推荐进行缩进。

if 语句

最简单的流控制语句是 if 语句,它的基本语法在清单 4 中的伪代码中演示了。if 语句在一个布尔表达式计算为 True 时执行一个程序语句块。if 语句支持一个可选的 else 子句,指示当布尔表达式计算为 False 时应该处理的程序语句块。
清单 4. if 语句的基本语法


    if(expression one):
      # Action to take if expression one evaluates True
    else:
      # Action to take if all expression one evaluates False

如果您使用过其他编程语言,那么该语法看起来可能既熟悉又陌生。相似之处在于 if 语句的一般格式、名称、用于确定如何分支语句执行流的表达式的计算,以及用于处理当表达式计算为 False 时的情况的 else 子句。但是有两个方面是完全特定于 Python 的:带有冒号字符的 if 和 else 语句的终止,以及 if 和 else 块中语句的缩进。正如所提到的,这两个特征是 Python 中流控制语句所必需的。

在清单 5 中,一个简单的 if/else 条件测试一个给定的数字是奇数还是偶数,并打印出结果。
清单 5. 一个简单的 if 语句例子


    >>> i = 8
    >>> if(i % 2):
    ...   print "Odd Number"
    ... else:
    ...   print "Even Number"
    ... 
    Even Number

一个似乎有些混乱的地方是 if 语句后面每一行前面的三个点(...)。当键入 if 语句和终止的冒号,并按键盘上的回车键时,Python 解释器就知道您输入了一个复合语句。因此,它就将提示符从三个大于符号(>>>)改为三个点(...)。因为 Python 需要缩进以错开当表达式计算为 True 或 False 时应该执行的语句块,所以两个 print 语句都缩进了 4 个空格。

if 语句(以及本文后面讨论的 elif 子句和 while 循环)中的表达式可以很复杂。它可以包括多个使用 Python 中支持的不同关系运算符的子表达式。而子表达式又可使用 and、or 和 not 逻辑运算符组合起来。本系列的第一篇文章"探索 Python,第 1 部分:Python 的内置数值类型",包含更多关于布尔表达式和 Python 中不同关系和逻辑运算符的信息。

至此,已经看到了 if 语句可以如何用于根据一个特定布尔表达式的值,来执行两个程序语句块中的其中一个。然而在有些情况下,可能需要更多的选择。幸运的是,Python 提供了 if 语句的一个简单扩展。提供的解决方案非常简单:给 else 子句添加一个额外的 if 语句。结果是一个 else if 语句,简写为 elif,如清单 6 所示。
清单 6. 使用 elif 语句


    >>> i = -8
    >>> if(i > 0):
    ...   print "Positive Integer"
    ... elif(i < 0):
    ...   print "Negative Integer"
    ... else:
    ...   print "Zero"
    ... 
    Negative Integer

本例只包含一个 elif 语句,而实际中可根据程序需要包含任意多个。尽管它不是最优的解决方案,但是多个 elif 语句可以用于模拟其他一些语言中的 switch case 语句。

while 循环

Python 中的第二种流控制语句是 while 循环,它在一个表达式计算为 True 时执行一个程序语句块。while 循环与 if 语句一样,支持一个可选的 else 子句,其中包含一个当表达式计算为 False 时执行的程序语句块。但是对于 while 循环,这意味着在循环终止后,else 子句中的代码被执行一次(参见清单 7 中的伪代码)。
清单 7. while 循环的伪代码


    while (expression):
      # statements to execute while loop expression is True
    else:
      # statements to execute when loop expression is False

理解了 if 语句之后,while 循环理解起来就相当简单了。但是一定要知道,循环一直要执行到表达式计算为 False。这意味着循环体中执行的程序语句必须要改变表达式的值,否则循环将无法结束。如清单 8 所示。
清单 8. while 循环的一个简单例子


    >>> i = 0 ; x = 10
    >>> while(x > 0):
    ...   i+=1 ; x -= 1
    ... else:
    ...   print i, x
    ... 
    10 0

该例演示了几件事情。首先,它在一行中组合了变量初始化和变量修改:在本例中是 i 和 x 变量。其次,分别使用缩写形式的运算符 += 和 -= 来递增 i 的值和递减 x 的值。在本例中,循环开始时 x 的值为 10。每通过一次循环,x 的值就递减 1。最后,x 的值为 0,此时循环退出,并执行 else 子句中的代码,打印出两个变量的值。

while 循环(与本文后面介绍的 for 循环一样)支持三种附加语句:

  1. continue
  2. break
  3. pass

continue 和 break 语句分别用于在 while 循环中继续下一次循环或中断循环。这两个语句通常放在 if 语句体中,以便由一个特殊的条件触发 continue 或 break 操作。break 语句的一个特殊特性是,它完全中断循环,并跳转到循环下面的任一个 else 子句。

pass 语句什么都不做。它用作一个占位符,即在需要一个语句,但是程序逻辑不需要操作时使用。清单 9 中演示了这三种语句。
清单 9. 使用 continue、break 和 pass 语句


    >>> i = 1
    >>> while(i < 1000):
    ...   i *= 5
    ...   if(i % 25):
    ...     continue
    ...   if not (i % 125): 
    ...     break
    ...   if not (i % 1000):
    ...     pass
    ... else:
    ...   print i
    ... 
    >>> print i
    125

这个虚构的例子一直循环到变量 i 大于或等于 1,000。在循环中,将 i 乘以 5,然后测试 i 是否被 25 整除。记住,您只在表达式为 True 时执行 if 语句体。该表达式在当变量 i 不能被 25 整除时计算为 True。(在 Python 表达式中,非零数被计算为布尔值 True。)

循环体中的下一个语句是第二个 if 语句,它测试变量 i 是否能被 125 整除,但是该表达式前面加了一个 not 运算符。因此,当变量 i 的值能被 125 整除时执行第二个 if 语句体。此时,break 语句导致程序执行中断 while 循环,跳转到 else 子句。

最后一个 if 语句永远不会执行,只是用于演示如何在程序中编写 pass 语句。在后续文章中,将会介绍 pass 语句更相关的一些情况。

通过跟踪程序的逻辑流可以看到,第一次通过循环后,变量 i 的值变为 5。第一个 if 语句计算为 True,因为 5 不能被 25 整除。这就会第二次进入 while 循环,这次变量 i 变成了 25。现在第一个 if 语句计算为 False,因为 25 能被 25 整除。第二个和第三个 if 语句也计算为 False,意味着第三次进入循环。这次变量 i 变成了 125,并且第一个 if 语句计算为 False。

但是第二个 if 语句计算为 True,因为变量 i 能被 125 整除(并且 not 运算符将结果 0 转换成布尔值 True)。这导致执行 break 语句,中断循环。else 子句永远不被执行,所以直到显式使用 print 语句之前不会输出任何东西。

for 循环

Python 中的 for 循环很特殊,与 Python 编程语言中内置的容器数据类型紧密相关。当您在现实生活中有一个容器对象(比如书包)时,您通常想要看它所包含的东西。在编写 Python 程序时也是这样的。当需要对某件事情做一定的次数时(就像针对容器中的每一项一样),可使用 for 循环。清单 10 中的伪代码格式演示了 for 循环。
清单 10. for 循环的伪代码


    for item in container:
      # action to repeat for each item in the container
    else:
      # action to take once we have finished the loop.

由于 Python 容器类型的丰富特性,for 循环非常强大。本质上,for 循环涉及到一个迭代器(iterator),用于在集合中逐项移动。本系列的下一篇文章将更加详细地介绍 for 循环,以及如何正确地将它与不同容器类型一起使用。

控制流

本文介绍了三种 Python 程序语句:if 语句、while 循环和 for 循环。这三种语句通过选择执行哪些语句,或者通过多次执行一组语句,让您可以改变程序流。在后续文章中将大量用到这些语句。复合语句的特性引入了 Python 程序中的适当缩进特性,这使得 Python 程序易于读和理解。

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237231次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8065次阅读
 目录