📌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