Python语言程序设计MOOC-07周 程序设计方法与面向对象程序设计

2020-06-21

在MOOC上,学习了北京理工大学嵩天老师的Python语言程序设计,此为学习笔记记录,备查,备翻阅复习。

计算思维

本质就是抽象和自动化。

实证思维(物理学科)、逻辑思维(数学学科)、计算思维(计算机学科)。

以体育竞技分析贯穿本章的讲解。

自顶向下的设计

从顶层开始分解为一个一个的底部问题进行解决。

总问题–分解为小问题–逐一解决小问题–汇总解决总问题。

第一阶段:程序的顶层设计为,定义主函数,然后通过函数名称隐藏程序的细节。以体育竞技分析为例:

def main():
    printIntro()
    probA, proB, n = getInputs()
    winsA, winsB = simNGames(n, probA, probB)
    PrintSummary(winsA, winsB)

第二阶段;

完成函数的细节,对于复杂的步骤可以再用子函数名称隐藏细节。

第三阶段:GameOver()函数

自底向上的执行

从底层模块开始一个一个进行测试。

  • 单元测试:采用import的方法,从底向上依次测试程序的每个函数
import mathSim

matchSim.gameOver(0,0)

matchSim.gameOver(15,3)

软件开发方法基础

软件是能够完成特定功能和性能的可执行计算机程序。

软件工程:就是将工程化应用于软件开发,以延长软件的生命周期,缩短开发周期。

软件开发模式

  • 瀑布模式
  • 螺旋模式
  • 敏捷开发方法:以人为核心 迭代 循序渐进,就是将一个大项目分成一个个可以运行的小项目,自底向上开发。Scrum是一个流行的敏捷开发框架。

面向过程程序设计

以程序执行过程为设计流程的设计方法,是最自然的程序设计方法,又称为结构化编程。

  • 第一步 分析程序从输入到输出的各个步骤
  • 2.按照执行过程从前到后编写程序
  • 3.将高耦合部分封装为模块或者函数
  • 调试程序

面向过程是最自然的程序设计思路。

以跟踪铅球的运行轨迹的程序设计代码为例

# shot_1
from math import sin, cos, radians
def main():   
    angle = eval(input("Enter the launch angle (in degrees):"))
    vel = eval(input("Enter the initial velocity (in meters/sec):"))
    h0 = eval(input("Enter the initial height (in meters):"))
    time = eval(input("Enter the time interval: "))
 
    xpos = 0
    ypos = h0
 
    theta = radians(angle)
    xvel = vel * cos(theta)
    yvel = vel * sin(theta)     
 
    while ypos >= 0:
        xpos = xpos + time * xvel
        yvell = yvel - time * 9.8
        ypos = ypos + time * (yvel + yvell)/2.0
        yvel = yvell
    print("\nDistance traveled:{0:0.1f}meters.".format(xpos))
     
if __name__ == "__main__":
    main()

面向对象程序设计

对象是这个概念的关键。

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

这个对象有怎样的状态?

有怎样的行为?

类:某种类型集合的描述

属性:是类本身的一些特性

方法 是类所能实现的行为。

类的定义,使用class关键字。定义时先用init初始化对象。

以找出一班学生中成绩绩点最高值,并返回这个成绩的学生是谁。

# 找到GPA最高的学生
 
class Student:
    def __init__(self, name, hours, qpoints):
        self.name = name
        self.hours = float(hours)
        self.qpoints = float(qpoints)
     
    def getName(self):
        return self.name
     
    def getHours(self):
        return self.hours
     
    def getQPoints(self):
        return self.qpoints
     
    def gpa(self):
        return self.qpoints/self.hours
     
def makeStudent(infoStr):
    name, hours, qpoints = infoStr.split("\t")
    return Student(name, hours, qpoints)
     
def main():
    # 打开输入文件
    filename = input("Enter name the grade file: ")
    infile = open(filename, 'r')
    # 设置文件中第一个学生的记录为best
    best = makeStudent(infile.readline())
 
    # 处理文件剩余行数据
    for line in infile:
        # 将每一行数据转换为一个记录
        s = makeStudent(line)
        # 如果该学生是目前GPA最高的,则记录下来
        if s.gpa() > best.gpa():
            best = s
    infile.close()
 
    # 打印GPA成绩最高的学生信息
    print("The best student is:", best.getName())
    print("hours:", best.getHours())
    print("GPA:", best.gpa())
 
if __name__ == '__main__':
    main()

面向对象程序设计的基本步骤:

  • 根据功能,抽象业务模块
  • 构建独立的业务模块,利用封装 继承 多态等抽象业务需求。
  • 编写程序
  • 以对象为单位输入参数 开展测试。

面向对象的程序设计方法实例2

解决跟踪铅球运行轨迹的问题。这个实例很好,可以与上面通过面向过程的设计方法的程序进行对比。是两种不同的程序设计思路。都值得借鉴和学习。

from math import sin, cos, radians
 
class Projectile:#定义一个对象 Projectile 投射体
    def __init__(self, angle, velocity, height):
        #根据给定的发射角度、初始速度和位置创建一个投射体对象
        self.xpos = 0.0
        self.ypos = height
        theta = radians(angle)
        self.xvel = velocity * cos(theta)
        self.yvel = velocity * sin(theta)
 
    def update(self, time):
        #更新投射体的状态
        self.xpos = self.xpos + time * self.xvel
        yvell = self.yvel - 9.8 * time
        self.ypos = self.ypos + time * (self.yvel + yvell) / 2.0
        self.yvel = yvell
 
    def getY(self):
        #返回投射体的角度
        return self.ypos
 
    def getX(self):
        #返回投射体的距离
        return self.xpos
    
    
# shot_2
from Projectile import *
 
def getInputs():
    a = eval(input("Enter the launch angle (in degrees):"))
    v = eval(input("Enter the initial velocity (in meters/sec):"))
    h = eval(input("Enter the initial height (in meters):"))
    t = eval(input("Enter the time interval: "))
    return a,v,h,t
 
def main():
    angle,vel,h0,time = getInputs()
    shot = Projectile(angle,vel,h0)
    while shot.getY() >=0:
        shot.update(time)
    print("\nDistance traveled:{0:0.1f}meters.".format(shot.getX()))
   
if __name__ == "__main__":
    main()