Python 3 程序设计
上QQ阅读APP看书,第一时间看更新

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 菜鸟教程首页