Python 程序设计语言 笔记(七)

原文地址:https://blog.csdn.net/longteng007/article/details/51227923

第六周 程序设计方法与面向对象程序设计(OOP)

      7.1 程序设计方法

           (1)计算思维:计算思维的本质:抽象、自动化

                                                                实证思维、逻辑思维、计算思维

                                          程序设计中的计算思维:    理解问题的计算特性

                                                                                   将计算抽象为计算问题

                                                                                   程序设计实现问题的自动求解

              计算机通过模拟计算过程提供一般情况下无法获得的信息

              【例】体育竞技分析

                     【IPO】 输入:两个球员的能力值,比赛次数

                                  处理:模拟比赛的过程

                                  输出:球员获胜场次及概率

              (2)自顶向下的设计:

基本思想:将算法表达为一系列小问题

                     为每个小问题设计接口

                     通过将算法表达为接口关联的多个小问题来细化算法

                     为每个小问题重复上述过程

              【例】体育竞技分析程序的顶层设计

                     第一阶段:设计基本功能函数,只考虑接口(输入和返回)

                     第二阶段:分别设计printIntro()、getInputs()

simNGames(n, probA, probB) → 核心

PrintSummary(winsA, winsB)函数的函数体

                     第三阶段:simNGames()函数继续分解出simOneGame()函数

              (3)自底向上的执行:     从底层模块开始一个一个进行测试

小规模:直接运行

中等规模:底层开始逐步上升

大规模:高级软件测试方法

              【例】体育竞技分析的测试:从第三阶段开始对函数逐个进行测试


  
  
  1. 程序 7.1
  2. # 体育竞技分析程序的设计
  3. from random import *
  4. def main():
  5. printIntro() # 输出程序介绍信息
  6. probA,probB,n = getInputs() # 获取输入
  7. winsA,winsB = simNGames(n, probA, probB) # 模拟比赛并计算胜次和胜率
  8. PrintSummary(winsA, winsB) # 输出结果
  9. def printIntro():
  10. print( "体育竞技分析程序\n")
  11. print( "本程序用以模拟两个对手之间的胜次及胜率\n")
  12. print( "需要获取用户两个对手的能力系数(0~1)和模拟次数\n")
  13. def getInputs():
  14. a = eval(input( "请输入A的能力系数:"))
  15. b = eval(input( "请输入B的能力系数:"))
  16. n = eval(input( "请问您要模拟多少次比赛?:"))
  17. return a,b,n
  18. def simNGames(n, probA, probB):
  19. A = 0
  20. B = 0 # 胜次
  21. for i in range(n):
  22. scoreA,scoreB = simOneGame(probA,probB)
  23. if scoreA > scoreB:
  24. A = A + 1
  25. else:
  26. B = B + 1
  27. return A,B
  28. def simOneGame(probA, probB):
  29. A = 0
  30. B = 0
  31. serving = "A" # 发球方
  32. while not gameOver(A,B): # 判断是否达到15场比赛结束
  33. if serving == "A":
  34. if random() < probA:
  35. A = A + 1
  36. else:
  37. serving = "B"
  38. else:
  39. if random() < probB:
  40. B = B + 1
  41. else:
  42. serving = "A"
  43. return A,B
  44. def gameOver(A,B):
  45. return A == 15 or B == 15
  46. def PrintSummary(winsA, winsB):
  47. n = winsA + winsB
  48. print( '模拟次数:%d'%n)
  49. print( '选手A的胜次:{0}({1:0.1%})'.format(winsA,winsA/n))
  50. print( '选手B的胜次:{0}({1:0.1%})'.format(winsB,winsB/n))
  51. if __name__ == '__main__':
  52. main()


【运行结果】

体育竞技分析程序

 

本程序用以模拟两个对手之间的胜次及胜率

 

需要获取用户两个对手的能力系数(0~1)和模拟次数

 

请输入A的能力系数:0.65

请输入B的能力系数:0.6

请问您要模拟多少次比赛?:3000

模拟次数:3000

选手A的胜次:2027(67.6%)

选手B的胜次:973(32.4%)

 

7.2 软件开发方法

       常见的软件开发模式:瀑布模式、螺旋模式、快速原型模式

喷泉模式、混合模式、敏捷开发模式

              (1)瀑布模式:


              (2)螺旋模式:

 

              (3)敏捷开发模式: 以人为核心、迭代、循序渐进

                                                 多个相互联系、独立运行的小项目

                                                 软件一直处于可使用的状态

                     优点:    自底向上、逐步有序、遵循软件客观规律

迭代增量开发、能提高开发效率

                     典型过程:    [1]产品形成共识

                                          [2]建立和维护产品需求列表进行优先级排序

                                          [3]筛选需求进入本轮迭代开发

                                          [4]细化需求,完成本轮开发

                                          [5]每日站立会议

(任务看板:未完成、正在做、已完成的工作状态)

                                          [6]现场验收和反馈

                                          [7]从第三步进行下一轮迭代

       7.3 面向对象程序设计(OOP)

              对象包含两种特征:状态行为

              类:某种类型集合的描述,如:人类

              属性:类本身的特性,如:姓名、身高、体重

              方法:类所能实现的行为,如:吃饭、走路、睡觉等方法

              步骤:① 根据功能,抽象业务对象

                       ② 构建独立的业务模块,利用封装,继承,多态等抽象业务需求

                       ③ 编写程序

                       ④ 以对象为单位输入参数,开展测试

              类的定义:

classclassname[(父类名)]:

[成员函数及成员变量]

                 _init_构造函数:初始化对象

                     _del_析构函数:销毁对象

       【例】学生成绩计算

       【说明】学生评估:学分和平均绩点GPA,GPA计算以4分为准则,如:

                     3学分课程,学生得“A”,量分数为3*4=12,找到最高者

程序7.3


  
  
  1. # 找到GPA最高的学生
  2. class Student:
  3. def __init__(self, name, hours, qpoints):
  4. self.name = name
  5. self.hours = float(hours)
  6. self.qpoints = float(qpoints)
  7. def getName(self):
  8. return self.name
  9. def getHours(self):
  10. return self.hours
  11. def getQPoints(self):
  12. return self.qpoints
  13. def gpa(self):
  14. return self.qpoints/self.hours
  15. def makeStudent(infoStr):
  16. name, hours, qpoints =infoStr.split( "\t")
  17. return Student(name, hours, qpoints)
  18. def main():
  19. # 打开输入文件
  20. filename = input( "Enter name the gradefile: ")
  21. infile = open(filename, 'r')
  22. # 设置文件中第一个学生的记录为best
  23. best = makeStudent(infile.readline())
  24. # 处理文件剩余行数据
  25. for line in infile:
  26. # 将每一行数据转换为一个记录
  27. s = makeStudent(line)
  28. # 如果该学生是目前GPA最高的,则记录下来
  29. if s.gpa() > best.gpa():
  30. best = s
  31. infile.close()
  32. # 打印GPA成绩最高的学生信息
  33. print( "The best student is:", best.getName())
  34. print( "hours:", best.getHours())
  35. print( "GPA:", best.gpa())
  36. if __name__ == '__main__':
  37. main()

【运行结果】

Enter name thegrade file: students.dat

The best studentis: Li Si

hours: 100.0

GPA: 4.0

       7.4 面向对象的特点

              (1)封装: 抽象对象,打包数据和操作。

对象的实现与使用独立,支持代码复用。

              (2)多态: 对象怎么回应消息,用同一函数名启用不同的方法,具有较高灵活性。

                                   例:图形对象列表,列表包括Circle,Rectangle, Polygon

                                          使用相同的代码,画出列表中所有图形:

                                          forobj in objects:

                                                 obj.draw(win)

              (3)继承: 一个类可以借用另一个类的行为,可避免操作重复,提高代码复用性。

                                   例:员工信息系统:类Employee    → SalariedEmployee 子类

                                                        homeAddress()方法   ↘ HourlyEmployee

猜你喜欢

转载自blog.csdn.net/qq_36369267/article/details/82831638