在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()