1.5 Python编程方法与应用
1.5.1 程序设计方法
程序是完成一定功能的指令的集合,用于解决特定的计算问题。按照软件工程的思想,程序设计可以分为分析、设计、实现、测试、运行等阶段。结构化程序设计是一种典型的程序设计方法,是程序设计的基础思想,它是把一个复杂程序逐级分解成若干个相互独立的程序,然后再对每个程序进行设计与实现。
程序在具体实现上遵循了一定的模式,典型的程序设计模式是IPO模式,也就是程序由输入(Input)、处理(Process)、输出(Output)3部分组成。输入是程序设计的起点,有文件输入、网络输入、交互输入、参数输入等多种方式;输出是程序展示运算成果的方式,包括文件输出、网络输出、控制台输出、图表输出等。处理部分是编程的核心,包括数据处理与赋值,而更重要的是算法。例如,给定两点的坐标,求两点的距离,需要一个公式,这个公式就是一个算法;再如,求三角形面积的公式也是一个算法。更多的算法则需要用户去设计,例如,从一组数据中查找某一数据的位置,这需要根据数据的特点,由用户设计算法。
除了IPO模式,程序中应当有足够的注释,以加强程序的可读性;通过调试来进一步完善程序,这些都是程序设计中不可缺少的环节。
从上面的介绍中可以看出,使用计算机编程解决计算问题包括下面几个重要步骤:分析问题、设计算法、编写程序、调试运行。其中,与程序设计语言和具体语法有关的步骤是编写程序及调试运行。在解决计算问题的过程中,编写程序只是其中的一个环节。在此之前,分析问题、设计算法都是重要的步骤,只有经过这些步骤,一个计算问题才能在设计方案中得以解决,这个过程可以看作是思维的创造过程。编写程序和调试测试则是对解决方案的计算机实现,属于技术实现过程。
1.5.2 程序示例
前面已经介绍了程序文件的建立和执行过程,下面给出9个简单的Python程序,方便读者了解Python的基本知识点,这些程序涉及IDLE环境下交互执行程序、程序的分支与循环结构、函数等内容。
读者可以通过查阅文档了解这些程序,也可以忽略这些程序的具体语法含义,大致读懂程序即可。学习这些程序将有助于提高读者学习后续章节的效率。
例1-1 根据圆的半径计算圆的周长和面积。
1 #ex0101.py 2 # 计算圆形的面积和周长 3 r = 3.2 4 area = 3.14*r*r 5 perimeter= 2*3.14*r 6 print("圆形的面积:{:.2f},周长:{:.2f}".format(area,perimeter))
本例知识点主要集中在第2章。
程序的第1行和第2行是注释,程序的名字和功能,注释语句不运行,可以书写任何描述或代码。
程序的第3行是赋值语句,将值3.2送给一个变量r,r是半径。
程序的第4行和第5行,用公式π×r×r和2×π×r计算圆的面积和周长。该行是程序的核心,是程序的算法实现。
第6行是打印语句,程序的运行结果是“圆形的面积:32.15,周长:20.10”。
按程序设计的IPO模式,该段代码没有明显的输入,而是采用赋值输入的形式,处理(或算法)是求圆面积和周长的公式,输出是一条打印语句。具体的语法细节请读者查阅相关文档。
例1-2 在IDLE交互方式下,根据圆的半径计算圆的周长和面积。
>>> r = 3.2 >>> area = 3.14*r*r >>> print("圆形的面积:{:.2f}".format(area)) 圆形的面积:32.15 >>> perimeter= 2*3.14*r >>> print("圆形的半径:{:.2f},周长:{:.2f}".format(r,perimeter)) 圆形的半径:3.20,周长:20.10
从上述程序可以看出,每行输入语句结束后,代码立即执行。
例1-3 输入三角形三条边,用海伦公式计算三角形的面积。
1 #ex0103.py 2 # 输入三角形三条边,用海伦公式计算三角形的面积s 3 import math 4 a=eval(input("请输入a边长:")) 5 b=eval(input("请输入b边长:")) 6 c=eval(input("请输入c边长:")) 7 p = (a + b + c) / 2 8 s = math.sqrt(p * (p - a) * (p - b) * (p - c)) 9 print("三角形的面积是{:.2f}".format(s))
本例知识点主要集中在第3章和第5章。
第3行导入math模块。导入math模块后,可以使用第8行的math.sqrt()方法,这个方法是求平方根的方法。
第4行至第6行使用input()函数接受用户的键盘输入,并使用eval()函数将输入转换为数值类型,从而可以参与数学运算。
第7行是计算赋值语句,计算三条边的和除以2,送给变量p。
第8行是程序的核心代码,用海伦公式计算三角形的面积,并送给变量s。
第9行是打印语句,输出程序的运行结果。
在例1-3中,如果输入的数据不是数值,如输入a11、ab等形式,则运行时会产生错误,为避免这种情况发生,例1-4进行了改进,进行了异常处理。读者如果无法读懂该程序,可以在学习完异常处理后继续读该程序。
例1-4 输入三角形三条边,用海伦公式计算三角形的面积,并对输入数据进行异常处理。
1 #ex0104.py 2 ''' 3 输入三角形三条边,用海伦公式计算三角形的面积s 4 对三边进行了异常处理 5 ''' 6 import math 7 try: 8 a=eval(input("请输入a边长:")) 9 b=eval(input("请输入b边长:")) 10 c=eval(input("请输入c边长:")) 11 p = (a + b + c) / 2 12 s = math.sqrt(p * (p - a) * (p - b) * (p - c)) 13 print("三角形的面积是{:.2f}".format(s)) 14 except NameError: 15 print("请输入正数数值")
本例知识点主要集中在第8章异常处理部分。程序运行结果如下,当我们输入数据错误时,系统会给出提示“请输入正数数值”。
>>> 请输入a边长:8 请输入b边长:e4 请输入正数数值 >>>
在例1-4中,如果输入的数据(三角形的三条边长度)不符合构成三角形的条件时,需要做出处理。
例1-5 用海伦公式计算三角形的面积,判断构成三角形的条件。
1 #ex0105.py 2 ''' 3 输入三角形三条边,用海伦公式计算三角形的面积s 4 在对三边进行异常处理的基础上,判断三条边是否符合三角形条件 5 ''' 6 import math 7 try: 8 a=eval(input("请输入a边长:")) 9 b=eval(input("请输入b边长:")) 10 c=eval(input("请输入c边长:")) 11 except NameError: 12 print("请输入正数数值") 13 if a<0 or b<0 or c<0: 14 print("输入数据不可以为负数") 15 elif a+b<=c or a+c<=b or b+c<=a: 16 print("不符合两边之和大于第三边原则") 17 else: 18 p = (a + b + c) / 2 19 s = math.sqrt(p * (p - a) * (p - b) * (p - c)) 20 print("三角形的面积是{:.2f}".format(s))
本例知识点主要集中在第3章和第8章。上面的代码用分支语句判断三条边构成三角形的条件,其运行结果如下,分支语句将在第4章学习。
>>> 请输入a边长:1 请输入b边长:2 请输入c边长:3 不符合两边之和大于第三边原则 >>>
例1-6 给出用列表保存的一组数据,求数据的平均值。
1 #ex0106.py 2 lst=[89,5,-34,23.1] 3 total=sum(lst) 4 number=len(lst) 5 print("列表lst的平均值是",total/number)
例1-7 给出用列表保存的一组成绩数据,统计不及格的人数和最高分。
1 #ex0107.py 2 lst=[89,45,23.1,98,33] 3 #notpass为不及格人数,maxscore为最高分 4 notpass =maxscore= 0 5 for item in lst: 6 if maxscore<item: 7 maxscore=item 8 if item<60: 9 notpass+=1 10 print("最高分是{},不及数人数是{}".format(maxscore,notpass))
本例知识点主要集中在第3章和第4章,遍历列表实现数据统计。
例1-8 用函数式统计列表中的不及格人数和最高分。
#ex0108.py lst=[89,45,23.1,98,33] maxscore=max(lst) #最高分 lst2=filter(lambda x:x<60,lst) #不及格数据的序列 notpass=len(list(lst2)) #不及格人数 print("最高分是{},不及数人数是{}".format(maxscore,notpass))
例1-9 文本文件中保存了一组用逗号分隔的成绩数据,统计不及格的人数和最高分。(文本文件是file.txt,内容是“89,45, 23.1,98,33,56,98”)
1 #ex0109.py 2 file=open("file.txt",'r') 3 s1=file.read() 4 file.close() 5 lst=s1.split(',') 6 lst2=[] 7 for item in lst: 8 lst2.append(eval(item)) 9 #print(lst2) 10 #notpass为不及格人数,maxscore为最高分 11 notpass =maxscore= 0 12 for item in lst2: 13 if maxscore<item: 14 maxscore=item 15 if item<60: 16 notpass+=1 17 print("最高分是{},不及格人数是{}".format(maxscore,notpass))
本例知识点主要集中在第7章。代码第2行至第4行的功能是读取文件内容;第5行至第8行的功能是拆分字符串和解析字符串内容(转换为数字);最后,完成数据统计功能。
1.5.3 Python的帮助文档
我们在读程序的过程中,不可避免的会遇到一些问题,这些问题可以通过Python的帮助文档解决。Python的帮助文档提供了语言及标准模块的详细参考信息,是学习和使用Python不可或缺的工作。
在IDLE环境下,选择[Help]/[Python Docs]命令或按F1键,可以启动Python文档,如图1-17所示。如果要查找一些数学函数的使用方法,可以按图1-18所示的步骤进行查找,也可以通过关键词查找。
图1-17 Python文档初始界面
图1-18 查找math模块中的函数
除使用Python内置的帮助文档外,菜鸟教程中的Python也给出了众多的帮助信息,适合初学者学习参考,如图1-19所示。
图1-19 菜鸟教程首页