【ADS-1】【python基础-3】函数封装与面向对象
目录
- 1 实战
- 2 知识点
前言
第一阶段:Python基础夯实
- 基本语法与数据结构(列表、字典、集合)
- 函数定义与面向对象编程
- 文件操作与异常处理
- 必备库:NumPy、Pandas基础操作
第二阶段:ADS领域专用库学习
…
第三阶段:…
学习目标
- 学会用函数封装代码块,提高代码的可读性和可复用性。
- 用类来抽象现实世界实体(如车辆、传感器),更加规范易用。
1 实战
实践任务1:体会函数封装的好处
- 封装:将上一篇博客更新车辆位置的代码封装成一个函数update_vehicle_position(vehicle_list)。
- 参数与返回值:编写一个函数calculate_distance(point1, point2),接收两个点的坐标(列表或元组),返回它们的欧氏距离。这可用于计算两车距离。
- 默认参数:编写一个创建车辆的函数create_vehicle(id, position, speed=0.0),速度默认为0。
# 封装
def update_vehicle_position(vehicle_list):for vehicle in vehicle_list:vehicle['position'][0] += vehicle['speed'] * 1return vehicle_list
# ceshi
car1 = {'id': 1, 'position': [1, 1], 'speed': 10}
car2 = {'id': 2, 'position': [2, 2], 'speed': 20}
car3 = {'id': 3, 'position': [3, 3], 'speed': 30}
cars = [car1, car2, car3]
res = update_vehicle_position(cars)
print(res)
[{'id': 1, 'position': [11, 1], 'speed': 10}, {'id': 2, 'position': [22, 2], 'speed': 20}, {'id': 3, 'position': [33, 3], 'speed': 30}]
# 欧氏距离:两个n维坐标的点之间的直线距离
import math
def calculate_distance(point1, point2):tmp = 0for i in range(len(point1)):tmp += (point1[i] - point2[i]) ** 2return math.sqrt(tmp)
# ceshi
p1 = [1, 2, 3]
p2 = [4, 5, 6]
res = calculate_distance(p1, p2)
print(res)
5.196152422706632
# 前面车辆的信息都是手动定义的,为了提高效率,可以抽象为一个函数
def create_vehicle(id, position, speed=0.0):return {'id': id, 'position': position, 'speed': speed}
# cheshi
car1 = create_vehicle(1, [1,1], 10)
car2 = create_vehicle(2, [2,2], 20)
car3 = create_vehicle(3, [3,3], 30)
car = [car1, car2, car3]
print(car)
[{'id': 1, 'position': [1, 1], 'speed': 10}, {'id': 2, 'position': [2, 2], 'speed': 20}, {'id': 3, 'position': [3, 3], 'speed': 30}]
实践任务2:体会变量定义+函数定义 与 定义类的属性和方法 的区别。
- 定义类:定义一个Vehicle类,其__init__方法初始化id、位置、速度等属性。
- 方法:为Vehicle类添加一个update_position(self, time_delta=1.0)方法,根据时间步长更新自身位置。
- 实例化:创建Vehicle类的实例(对象),并调用其方法。
# 定义类
class Vehicle:def __init__(self, id, position, speed=0):self.id = idself.position = positionself.speed = speed# 添加一个方法def update_position(self, time_delta=2):self.position[0] += self.speed * time_delta
# ceshi
# 实例化
v1 = Vehicle(1, [1, 1], 10)
print(v1.id)
print(v1.position)
# 调用方法
v1.update_position()
print(v1.position)
1
[1, 1]
[21, 1]
实战项目:重构交通场景模拟
- 使用Car类来定义车辆,并实例化两个车。
- 将模拟循环(如模拟10个时间步长)也封装成一个函数run_simulation(car_list, steps)。
- 运行模拟,观察车辆位置变化。
class Car:def __init__(self, id, position, speed=0):self.id = idself.position = positionself.speed = speed
c1 = Car(1, [1, 1], 10)
c2 = Car(2, [2, 2], 20)def run_simulation(car_list, steps):for i in range(len(steps)):print(f'----开始第{i + 1}次模拟----')for j in range(len(car_list)):car = car_list[j]car.position[0] += car.speed * steps[j]print(f'第{j}辆车移动到了{car.position}处')# ceshi
import random
cars = [c1, c2]
steps = []
for i in range(10):steps.append(random.randint(-10, 10))
run_simulation(cars, steps)
----开始第1次模拟----
第0辆车移动到了[51, 1]处
第1辆车移动到了[2, 2]处
----开始第2次模拟----
第0辆车移动到了[101, 1]处
第1辆车移动到了[2, 2]处
----开始第3次模拟----
第0辆车移动到了[151, 1]处
第1辆车移动到了[2, 2]处
----开始第4次模拟----
第0辆车移动到了[201, 1]处
第1辆车移动到了[2, 2]处
----开始第5次模拟----
第0辆车移动到了[251, 1]处
第1辆车移动到了[2, 2]处
----开始第6次模拟----
第0辆车移动到了[301, 1]处
第1辆车移动到了[2, 2]处
----开始第7次模拟----
第0辆车移动到了[351, 1]处
第1辆车移动到了[2, 2]处
----开始第8次模拟----
第0辆车移动到了[401, 1]处
第1辆车移动到了[2, 2]处
----开始第9次模拟----
第0辆车移动到了[451, 1]处
第1辆车移动到了[2, 2]处
----开始第10次模拟----
第0辆车移动到了[501, 1]处
第1辆车移动到了[2, 2]处
2 知识点
- 求平方根(import math)和取随机数(import random)都得导入对应模块。
- 求平方根:math.sqrt()
- 取随机数:random.randint(-10,10),取[-10, 10]范围内的随机数
- 定义类:class Vehicle,类名一般首字母大写
- 定义类的属性可以类比于普通的定义变量
- 定义类的方法可以类比于普通的定义函数
- 只不过定义类是面向对象的思想,定义变量和函数是面向过程的思想。