国科大Python编程基础--Chapter04流程控制

一、概述

任何算法(程序)都可以由顺序结构、选择结构和循环结构这三种基本结构组合来实现。

之前编写的程序都是顺序结构的,即依次执行程序中的每条语句。

但实际的程序并非如此简单,经常要用到条件判断或反复执行某一个程序段,这就要用到选择结构和循环结构。

本章介绍条件语句、循环语句及跳转语句。

二、条件语句

  • 条件语句能够改变Python程序的执行流程,是执行这个代码块还是另一个代码块。
  • 凡是需要判断来确定下一步如何执行的程序都要使用条件语句。

1、if/else语句

(1)单分支

  • 格式:
if <condition>:
    statements

在这里插入图片描述

  • 功能:如果条件表达式的值为真,则执行其后的语句序列。

例4-1:判断用户的输入,如果输入的数值大于0,则在屏幕上显示“正数”。
在这里插入图片描述

(2)双分支

  • 格式:
if <condition>:
    statements1
else:
    statements2

在这里插入图片描述

  • 功能:如果“条件表达式”的判断结果为真,则执行语句序列1;否则,执行语句序列2。

例4-2:判断用户的输入,如果输入的数值大于0,则在屏幕上显示“正数”;否则在屏幕上显示“不是正数”。
在这里插入图片描述
在这里插入图片描述

2、if语句嵌套

if 语句内还可以使用if语句,这样就构成了if语句的嵌套。

  • 格式:
if <condition1>:
    if <condition2>:
         statements1
    else:
         statements2
else:
    if  <condition3>:
        statements3
    else:
         statements4
    …

例4-3:将考试分数转换为等级(使用嵌套if)
在这里插入图片描述

3、多分支

  • 格式:
if <condition1>:
	<case1 statements>
elif <condition2>:
	<case2 statements>
elif <condition2>:
	<case3 statements>
……
[else:
	<default statements>]
  • Python依次判断每个条件,寻找条件为True的分支,并执行该分支下的语句序列;如果没有任何条件成立,else下面的语句序列被执行,else子句是可选项。

  • 可以方便地替代if语句嵌套。

例4-4:将考试分数转换为等级(使用多分支if-elif-else)
在这里插入图片描述

4、条件表达式

  • Python也有类似于C++的条件表达式,其格式为:
  <表达式1>  if  <表达式2>  else  <表达式3>
  • 功能:先计算表达式2的值,如果其值为真,则表达式1的值就是整个表达式的值;否则表达式3的值就是整个表达式的值。

例4-5:求两个数a和b中较大值
在这里插入图片描述

课堂练习一

说明:
Python 2.x中硬性规定,字符串比整型数大,但Python 3.x这两种类型不能比较,需要转换为同一类型。

三、循环语句

循环用于重复地执行代码块。

Python中有两种主要的循环:for循环和while循环。

for循环通常比while循环更容易使用,也不那么容易出错,但没有while循环灵活。

1、for循环

  • 格式:
   for <var> in <sequence>: 
        <statements>
  • 功能:循环变量var遍历序列中的每一个值,循环的语句体为每个值执行一次。序列可以是字符串、列表、元组、字典等数据结构。

例4-6:输出序列中的内容及长度
在这里插入图片描述

说明:

  • for循环经常与range()函数一起使用,range()函数返回一个range类,类似于列表,for循环可以遍历其中的元素。
  • range()函数格式:range(start,stop[,step]),参数start表示列表开始值,默认为0;参数stop表示列表结束值,不能缺省,循环到stop-1停止;参数step表示步长,默认值为1。

例4-7:for循环示例
在这里插入图片描述
在这里插入图片描述

例4-8:求1+2+3+…+100
在这里插入图片描述

2、while循环

  • 格式:
while <condition>:
    <statements>
  • 功能:当条件表达式为真时,依次执行while中的语句,直到循环表达式的值为假。
    在这里插入图片描述

例4-9:求1+2+3+…+100
在这里插入图片描述

3、for循环和while循环比较

一般来说,固定次数的循环问题使用for循环和while循环都可以解决,而循环次数不固定的循环问题只能使用while循环解决。

例4-10:分别使用for和while循环计算n!
for循环
在这里插入图片描述
while循环
在这里插入图片描述

例4-11:计算已知个数数字的总和
for循环
在这里插入图片描述

while循环
在这里插入图片描述

在这里插入图片描述

例4-12:计算未知个数数字的总和
计算未知个数数字的总和就无法使用for循环完成了,只能使用while循环。
在这里插入图片描述
在这里插入图片描述

4、循环嵌套

  • 与条件语句相同,循环也可以嵌套。

例4-13:输出乘法九九表。
在这里插入图片描述
在这里插入图片描述

若希望输出结果如下,如何修改程序?
在这里插入图片描述

四、跳转语句及循环中的else语句

  • 与C、C++类似,在Python中除了提供顺序执行、选择控制和循环控制语句外,还提供了一类跳转语句。这类语句的总体功能是中断当前某段程序的执行,并跳转到程序的其他位置继续执行。
  • Python的跳转语句有:break语句和continue语句。
  • 此外,与其他高级语言不同,Python的循环语句还可以搭配使用else语句。

跳转语句的作用及区别

  • break语句的作用是:结束当前正在执行的循环(for、while),转而执行这些结构后面的语句。
  • continue语句的作用是:结束当前正在执行的这一次循环(for、while),接着执行下一次循环。即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
  • continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环,不再进行条件判断。

例4-14:计算未知个数数字的总和(利用break语句)
在这里插入图片描述

例4-15:输出1~100之间的不能被7整除的数。
在这里插入图片描述
执行结果
在这里插入图片描述

循环中的else语句

  • 在Python语言中else可与循环搭配使用;
  • else:后的表达式在for循环列表遍历完毕后或while条件语句不满足的情况下执行;
  • 如果循环语句中出现else语句,则它是循环语句的组成部分。

例4-16:判断一个数是否为素数
在这里插入图片描述

在这里插入图片描述

课堂练习二:

五、综合实例

1、求三个数的最大值

策略1:通盘比较

即将每一个值与其他所有值比较以确定最大值。

在这里插入图片描述
在这里插入图片描述

存在问题:

  • 本例只有三个值,较简单
  • 如果是五个值比较,表达式包含四个and,较复杂
  • 每个表达式结果没有被互相利用,效率低(x1与x2比较了两次)

说明:

  • eval()函数功能十分强大,其基本功能为:将字符串str当成有效的表达式来求值并返回计算结果。

例如:
在这里插入图片描述

策略2:决策树

决策树方法可以避免冗余比较;
先判断x1>x2,如果成立再判断x1>x3,否则判断x2>x3;
虽然效率高,但设计三个数据以上比较的方案时,复杂性会爆炸性地增长 。
在这里插入图片描述

源程序:
在这里插入图片描述

策略3:顺序处理

  • 逐个扫描每个值,保留最大者;
  • 以max变量保存当前最大值,完成最后一个扫描时,max就是最大值;
  • 这种方法处理更大规模问题时非常有效(如借助循环可求得n个数据的最大值)。

源程序:
在这里插入图片描述

策略4:Python内置函数max()

  • max(iterable[, key=func]) -> value
  • max(a, b, c, ...[, key=func]) -> value

With a single iterable argument, return its largest item.
With two or more arguments, return the largest argument.

源程序:
在这里插入图片描述

2、求任意非负数的平方根

没有精确算法,常用的近似算法有:

  • 穷举法
  • 二分法
  • 牛顿—拉夫逊算法

穷举法

  • 取较小的步长生成猜测值(顺序地);
  • 检查是否足够接近结果。
  • 反复执行上述步骤。
    在这里插入图片描述
    执行结果
    在这里插入图片描述

在穷举法中,步长可以取任意小数值,但是:

  • 如果步长太小了,程序执行会花较长时间
  • 如果步长太大了,可能会跳过最近似的答案

还有更有效的方法。

二分法

  • 根据数学定义,x的平方根位于0—x之间。

  • 尽管在穷举法中,我们从0开始进行猜测,但实际上可以取这个范围的中间值。
    在这里插入图片描述

  • 如果幸运,这个答案即最近似的结果。

  • 如果猜测值不足够近似,太大或太小怎么办?

  • 如果g**2>x,则g太大,现在应查找:
    在这里插入图片描述

  • 如果新的g,例如g**2<x,则g太小了,应查找:
    在这里插入图片描述

  • 每次减少值的范围的一半。
    在这里插入图片描述
    在这里插入图片描述

关于二分法算法的说明:

  • 二分查找算法从根本上减少了计算时间;
  • 二分查找算法必须用于有序的数据。

牛顿—拉夫逊算法(即用该算法猜测新值)

  • 通常,求一个变量多项式的根的近似算法为:
    在这里插入图片描述

  • 求r使得p®=0

  • 例如,求25的平方根,即求p(x)=x2-25的根,则牛顿近似公式为:
    在这里插入图片描述

  • 具体到本例,近似公式为:g-(g^2-25)/2g

在这里插入图片描述

在这里插入图片描述

3、编写猜秘密数的程序

  • 由用户想一个0—100之间的整数(包括0,不包括100),由计算机来猜。由用户给一个输入,是低了还是高了,使用二分查找算法,计算机将猜到用户的秘密数。

执行过程(设用户想的秘密数是83):
在这里插入图片描述

在这里插入图片描述

4、π的计算

  • 圆周率π是一个无理数,没有任何一个精确公式能够计算π值, π的计算只能采用近似算法。
  • 国际公认的PI值计算采用蒙特卡洛方法。
  • 蒙特卡洛(Monte Carlo)方法,又称随机抽样或统计试验方法。当所求解问题是某种事件出现的概率,或某随机变量期望值时,可以通过某种“试验”的方法求解。
  • 简单说,蒙特卡洛是利用随机试验求解问题的方法。

应用蒙瑞特卡罗方法求解π的步骤:

  • 首先构造一个单位正方形和1/4圆。
  • 随机向单位正方形和圆结构抛洒大量点,对于每个点,可能在圆内或者圆外,当随机抛点数量达到一定程度,圆内点将构成圆的面积,全部抛点将构成正方形面积。圆内点数除以总点数就是面积之比,即π /4。随机点数量越大,得到的π值越精确。
    在这里插入图片描述

π计算问题的IPO表示:

  • 输入:抛点的数量
  • 处理:对于每个抛洒点,计算点到圆心的距离,通过距离判断该点在圆内或是圆外。统计在圆内点的数量
  • 输出: π值

源程序及结果:
在这里插入图片描述


整理不易🚀🚀,关注和收藏后拿走📌📌欢迎留言🧐👋📣✨
欢迎专注我的公众号:AdaCoding 和 Github:AdaCoding123
在这里插入图片描述

  • 31
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值