笔记
控制结构
- 程序流程图
用规定的一系列图形、流程线和文字说明算法中的基本操作和控制流程。
流程图的基本元素包括:表示相应操作的框、带箭头的流程线、框内外必要的文字说明。
任何算法(程序)都可以由顺序结构、选择结构和循环结构这三种基本解否来组合实现。
Python不提供直到型循环语句。
- 简单分支
PM2.5指数分级程序功能IPO模式描述
输入:接受外部输入PM2.5值
处理:空气质量分级算法
输出:打印空气质量提醒
#空气质量提醒
def main():
PM=eval(input("What is today's PM2.5?"))
if PM>75:
print("Unhealthy! Be careful!")
if PM<35:
print("Good! Go out for running!")
main()
import math
def main():
print("Let us finds the solutions to a quadratic\n")
a,b,c=eval(input("Please enter the coefficients(a,b,c): "))
delta=b*b-4*a*c
if a==0:
x=-b/c
print('\nThere is a solution',x)
elif delta==0:
x=-b/(2*a)
print("\nThere is a double root at",x)
elif delta<0:
print("The equation has no real roots!")
else:
discRoot=math.sqrt(delta)
root1=(-b+discRoot)/(2*a)
root2=(-b-discRoot)/(2*a)
print("\nThe solutions are:",root1,root2)
main()
- 异常处理
-Python使用try…except…,可使程序不因运行错误而崩溃
try:
<body>
except <ErrorType1>:
<handler1>
except <ErrorType2>:
<handler2>
except:
<handler0>
如:
while True:
try:
x=int(input("Please enter a number: "))
break
except ValueError:
print("Oops! That was no valid number. Try again...")
-Python的异常处理语句还可以使用else和finally关键字
try:
<body>
except <ErrorType1>:
<handler1>
except <ErrorType2>:
<handler2>
except:
<handler0>
else:
<process_else>
finally:
<process_finally>
else和finally是可选的非必须项,但是else必须出现在finally之前。
try内无异常产生则执行else语句,finally表示无论是否发生异常,这些语句都必须执行。
def main():
try:
number1,number2=eval(input("Enter two numbers, separated by a comma:"))
result=number1/number2
except ZeroDivisionError:
print("Division by zero!")
except SyntaxError:
print("A comma may be missing in the input")
except:
print("Something wrong in the input")
else:
print("No exceptions, the result is",result)
finally:
print("executing the final clause")
main()
异常处理语句
-try…except可以捕捉任何类型的错误。
-对于二次方程,还会有其他可能的错误,如:输入非数值类型(NameError),输入无效的表达式(syntaxError)等。
-此时可以用一个try语句配多个except来实现。
#异常处理全部情况
import math
def main():
print("This program finds the real solutions to a quadratic.\n")
try:
a,b,c=eval(input("Please enter the coefficients(a,b,c): "))
discRoot=math.sqrt(b*b-4*a*c)
root1=(-b+discRoot)/(2*a)
root2=(-b-discRoot)/(2*a)
print("\nThe solutions are:",root1,root2)
except ValueError as exc0bj:
if str(exc0bj)=="math domain error":
print("\nNo real roots!")
else:
print("You didn't give me the right number of coefficients.")
except NameError:
print("\nYou didn't enter three numbers.")
except TypeError:
print("\nYour inputs were not all numbers.")
except SyntaxError:
print("\nYour input was not in the correct form. Missing comma?")
except:
print("\nSomething went wrong, sorry!")
main()
- 三者最大实例分析
以找到三个数字中最大者的程序设计为例
输入:三个数值
处理:三者最大算法
输出:打印最大值
策略1:通盘比较
将每一个值与其他所有值比较以确定最大值
if x1>=x2 and x1>=x3:
max=x1
elif x2>=x1 and x2>=x3:
max=x2
else:
max=x3
比较的数值少,则比较简单;比较的数值多起来就很麻烦了。
策略2:决策树
决策树方法可以避免冗余比较
if x1>=x2:
if x1>=x3:
max=x1
else:
max=x3
else:
if x2>=x3:
max=x2
else:
max=x3
效率高,但结构复杂
策略3:顺序处理
逐个扫描每个值,保留最大者
max=x1
if x2>max:
max=x2
if x3>max:
max=x3
效率高,简洁
策略4:Python
Python终极解决方案
def main():
x1,x2,x3=eval(input("Please enter three values: "))
print("The largest value is",max(x1,x2,x3))
main()
- 基本循环结构
for循环
-Python可以使用for语句循环遍历整个序列的值
for<var>in<sequence>:
<body>
-在for循环中,循环变量var遍历了队列中的每一个值,循环语句体为每个值执行一次。
>>> words=["cat","window","defensestrate"]
>>> for w in words:
print(w,len(w))
cat 3
window 6
defensestrate 13
for循环求平均值
-平均数计算程序的IPO
输入:待输入数字个数,数字
处理:平均数算法
输出:平均值
-通用设计方案
输入数字的个数n
将sum初始化为0
循环n次:
输入数字x
将x加入sum中
将sum/n作为平均数输出出来
#for循环计算平均值
n=eval(input("How many number?"))
sum=0.0
for i in range(n):
x=eval(input("Enter a number >>"))
sum=sum+x
print("\nThe average is",sum / n)
for循环-缺点
-程序开始时必须提供输入数字总数
-大规模数字求平均值需要用户现数清楚个数
-for循环需要提供固定循环次数
-Python提供了另一种循环模式即无限循环,不需要提前知道循环次数
无限循环
-语法:while语句
while <condition>:
<body>
-while语句中 <condition>
是布尔表达式
-<body>
是一条或多条语句
-当条件<condition>
为真时,循环体重复执行
-当条件<condition>
为假时,循环终止
-条件总是在循环顶部被判断,即在循环体执行之前,这种结构又被称为前侧循环
i=0 #无限循环开始时要初始化
while i <= 10:
print(i)
i=i+1
-如果循环体忘记累加i,条件判断一直为真,循环体将一直执行,这既是所谓的死循环程序
-这时Ctrl+c来终止一个程序
for/while中的break用法
sum=0
number=0
while number<20:
number+=1
sum+=number
if sum >100:
break #跳出while循环
print("The number is ",number)
print("The sum is ",sum)
for/while中的continue用法
-continue语句,其作用为结束本次循环。及跳出循环体下面尚未执行的语句,对于while循环,继续求解循环条件。而对于for循环程序流程接着遍历循环列表。
-continue语句和break语句的区别
-continue语句只结束本次循环,而不终止整个循环的执行。
-break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
for num in range(2,10):
if num % 2 ==0:
print("Found an even number",num)
continue
print("Found a number",num)
>>>
Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9
for/while中的else用法
for n in range(2,10):
for x in range(2,n):
if n%x==0:
print(n,'equal',x,'*',n//x)
break
else:
#loop fell through without finding a factor
print(n,'is a prime number')
>>>
2 is a prime number
3 is a prime number
4 equal 2 * 2
5 is a prime number
6 equal 2 * 3
7 is a prime number
8 equal 2 * 4
9 equal 3 * 3
- 通用循环构造方法
交互式循环
-是无限循环的一种
-允许用户通过交互的方式重复程序的特定部分
def main():
sum=0.0
count=0
moredata="yes"
while moredata[0]=="y":
x=eval(input("Enter a number >>"))
sum=sum+x
count=count+1
moredata=input("Do you have more numbers(yes or no)?")
print("\nThe average of the numbers is ",sum/count)
main()
优点是不需要用户自己记数,缺点是提示语多的令人反感!
哨兵循环
-执行循环直到遇到特定的值,循环语句才终止执行的循环结构设计方法
-哨兵循环是求平均数的更好方案
-设定一个哨兵值作为循环终止的标志
-任何值都可以做哨兵,但要与实际数据有所区别
伪码如下:
接收第一个数据
while这个数据不是哨兵
程序执行相关语句
接收下一个数据项
哨兵循环版本1代码
def main():
sum=0.0
count=0
x=eval(input("Enter a number (negative to quit)>>"))
while x>=0:
sum=sum+x
count=count+1
x=eval(input("Enter a number (negative to quit)>>"))
print("\n The average of the numbers is",sum/count)
main()
缺点是不能计算负数
哨兵循环版本2代码
伪码如下:
初始化sum为0
初始化count为0
接受输入的字符串数据,xStr
While xStr非空
将xStr转换为数字x
count值加1
接受下个字符串数据,xStr
输出sum/count
def main():
sum=0.0
count=0
xStr=input("Enter a number (<Enter> to quit)>>")
while xStr!='':
x=eval(xStr)
sum=sum+x
count=count+1
xStr=input("Enter a number (<Enter> to quit)>>")
print("\n The average of the numbers is",sum/count)
main()
文件循环
-面向文件的方法是数据处理的的典型应用
-之前求平均数的数字都是用户输入的,如果几百个数求平均,输入苦难且容易出错
-可以事先将数据录入到文件,便于编辑修改
文件循环代码for
def main():
fileName=input("What file is the numbers in?")
infile = open(filename,'r')
sum=0
count=0
for line in infile:
sum=sum+eval(line)
count=count+1
print("\nThe average of the numbers is",sum/count)
main()
Python中采用readline()方法的end-of-file循环模式
line=infile.readline()
while line!='':
#处理每一行
line=infile.readline()
readline将文件的一行读取到字符串中,在文件尾部readline返回一个空字符串作为哨兵值
文件循环代码while
循环嵌套
-决策和循环相互嵌套可以事先复杂算法
-之前实例中文件每行只存一个数字,这一次数字以逗号分隔出现在文件的同一行上
def main():
fileName=input("What file is the numbers in?")
infile = open(filename,'r')
sum=0.0
count=0
line=infile.readline()
while line!='':
#为line中的值更新其count和sum
for xStr in line.split(","):
sum=sum+eval(line)
count=count+1
line=infile.readline()
print("\nThe average of the numbers is",sum/count)
main()
- 死循环和嵌套循环
死循环的使用
-死循环并非一无是处,C语言中死循环while true或while1是单片机编程的普遍用法,死循环一直运行,等待中断程序发生然后去处理中断程序。
-在Python中也可用死循环完成特定功能
后测循环
-假设程序需要用户输入一个非负数
-如果输入错误,重新提示用户输入直到得到一个有效值
伪代码如下:
重复执行以下语句
接受外部输入数据,知道外部输入为负为止。
实现:
-Python没有后测循环语句,但是可通过while间接实现
number=-1
while number<0:
number=eval(input("Enter a positive number: "))
-设定一个初值,让循环至少执行一次,相当于后测循环。
实现:
-break语句可以用来实现后测循环
while True:
number=eval(input("Enter a positive number: "))
if x>0:break
#如果数字有效则跳出循环
- 布尔表达式
-条件语句和循环语句都使用布尔表达式作为条件
-布尔值为真或假,以False和True表示
布尔操作符:and,or,not
-布尔运算符and和or用于组合两个布尔表达式,并产生一个布尔结果
<expr>and<expr>
<expr>or<expr>
not运算符计算一个布尔表达式的反
not<expr>
a or not b and c =等价于=(a or ((not b) and c))
壁球比赛计分例子
-假设:scoreA和scoreB代表2个壁球选手的分数
-规则:只要一个选手达到了15分,本场比赛就结束
ScoreA==15 or scoreB==15
-此程序中构造一种循环条件,对游戏结束条件取反,只要比赛还没有结束有就一直进行下去
while not(scoreA==15 or scoreB==15):
#比赛继续
壁球比赛计分例子
-规则1:只要一个选手达到了15分,本场比赛结束;如果一方打了7分而另一方一分未得时,比赛也会结束。
a==15 or b==15 or (a==7 and b==0) or (b==7 and a==0)
-规则2:需要一个团队赢得至少两份才算赢,即其中一个队已经达到了15分,而且分数差异至少为2时比赛结束(排球)
(a>=15 and a-b>=2) or (b>=15 and b-a>=2)
(a>=15 or b>=15) and abs(a-b)>=2#更简洁
布尔代数
-布尔表达式遵循特定的代数定律,这些规律被称为布尔逻辑或布尔代数
-布尔代数规则
-任何数据和true进行or操作都是真
a or true==true
-and和or操作都符合分配律
a or (b and c)==(a or b) and (a or c)
a and (b or c)==(a and b) or (a and c)
-not操作符具有负负抵消的特性
not(not a)==a
-德摩根定律,not放进表达式后,and和or运算符之间发生的变化
not(a or b)==(not a) and (not b)
not(a and b)==(not a) or (not b)
布尔表达式作为决策
-回顾交互式循环,只要用户响应一个”Y”程序就继续。
为了让用户输入一个大写或小写,可以使用以下的循环
while response[0] ==”y” or response[0] ==”Y”
不能写成:
while response[0] ==”y” or ”Y” #这里是一个无限循环,因为Y为非空,则恒满足。
-对于数字(整型和浮点型)的零值被认为是false,热河非零值都是true
-bool类型仅仅是一个特殊的函数,可以通过计算表达式true+true的值来测试一下。
Python的布尔运算符是短路运算符,从左到右依次扫描表达式,一旦知道结果立刻返回
作业
#第一题
h,w=eval(input("请输入身高体重:"))
BMI=w/(h*h)
if BMI<=18.5:
print("国际标准:偏瘦;国内标准:偏瘦")
elif BMI>18.5 and BMI<=24:
print("国际标准:正常;国内标准:正常")
elif BMI>24 and BMI<=25:
print("国际标准:正常;国内标准:偏胖")
elif BMI>25 and BMI<=28:
print("国际标准:偏胖;国内标准:偏胖")
elif BMI>28 and BMI<=30:
print("国际标准:偏胖;国内标准:肥胖")
else:
print("国际标准:肥胖;国内标准:肥胖")
#第二题
score=eval(input("请输入分数:"))
if score >= 60.0:
grade="D"
elif score >= 70.0:
grade="C"
elif score >= 80.0:
grade="B"
elif score >= 90.0:
grade="A"
print("等级是:",grade)
请输入分数:80
等级是: D
不符合逻辑,因为80也符合>60这个条件,如果从上往下读程序则之间满足>60的条件,会出错。
修改:
score=eval(input("请输入分数:"))
if score >= 90.0:
grade="A"
elif score >= 80.0:
grade="B"
elif score >= 70.0:
grade="C"
elif score >= 60.0:
grade="D"
print("等级是:",grade)
或者
score=eval(input("请输入分数:"))
if score >= 90.0:
grade="A"
elif score >= 80.0 and score<90:
grade="B"
elif score >= 70.0 and score<80:
grade="C"
elif score >= 60.0 and score<70:
grade="D"
print("等级是:",grade)
① 简单分支
② 异常处理
③ 基本循环
④ break,continue语句
⑤ else语句
⑥ 文件循环
⑦ 嵌套循环
⑧ 布尔表达式