Python零基础先修课第三周

Python零基础先修课第三周

笔记

控制结构

  1. 程序流程图
    用规定的一系列图形、流程线和文字说明算法中的基本操作和控制流程。
    流程图的基本元素包括:表示相应操作的框、带箭头的流程线、框内外必要的文字说明。
    在这里插入图片描述

任何算法(程序)都可以由顺序结构、选择结构和循环结构这三种基本解否来组合实现。
Python不提供直到型循环语句。
在这里插入图片描述

  1. 简单分支
    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()
  1. 异常处理
    -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. 三者最大实例分析
    以找到三个数字中最大者的程序设计为例
    输入:三个数值
    处理:三者最大算法
    输出:打印最大值
    策略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()
  1. 基本循环结构
    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
  1. 通用循环构造方法
    交互式循环
    -是无限循环的一种
    -允许用户通过交互的方式重复程序的特定部分
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()
  1. 死循环和嵌套循环
    死循环的使用
    -死循环并非一无是处,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
    	#如果数字有效则跳出循环
  1. 布尔表达式
    -条件语句和循环语句都使用布尔表达式作为条件
    -布尔值为真或假,以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语句
⑥ 文件循环
⑦ 嵌套循环
⑧ 布尔表达式
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值