第二章 第8节 闪电快递
明确项目目的
分析流程,拆解项目
# 配送次数计算公式
size = 2
person = 2
num = size * 100 / 20/person
# 配送员数计算公式
size = 0.6
num = 1
person = size *100 /20/ num
3.1 逐步执行,代码实现
# 配送次数计算
def calculate_num(size,person):
#配送次数计算过程
……
# 配送员数计算
def calculate_person(size,num):
#配送员数计算过程
……
calculate_num(参数1,参数2)
calculate_person(参数1,参数2)
# 配送次数计算
def calculate_num(size,person):
#配送次数计算过程
num = size * 100 / 20/person
print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次:' %(size,person,num))
# 快递员数计算
def calculate_person(size,num):
#快递员数计算过程
person = size *100 /20/ num
print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(size,num,person))
calculate_num(2,2)
calculate_person(0.6,1)
3.2 再改进
无论小数点之后是点几,都要向上进一取整数。也就是1.5转成2,1.9转成2,1.1转成2,即对人数需要向上取整。
发现:向上取整是math.ceil(), 括号内放数字。
也就是使用math.ceil()方法,就能把数字向上取整。并且在开始位置,有一句import math, 怎么有些似曾相识. 在上个项目实战中,我们使用随机数,也用过import math代码。
import math
# 配送次数计算
def calculate_num(size,person):
#配送次数计算过程
num = math.ceil(size * 100 / 20/person)
print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次:' %(size,person,num))
# 快递员数计算
def calculate_person(size,num):
#快递员数计算过程
person = math.ceil(size *100 /20/ num)
print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(size,num,person))
calculate_num(1.5,2)
calculate_person(0.5,1)
BOSS朋友需要使用两个函数才能计算配送次数,计算配送员数,有没有办法能够让她使用一个函数就能完成功能。
# 工作量计算函数
def calculate_job(参数……):
……
# 调用工作量计算函数
calculate_job(参数……)
# 工作量计算函数
def calculate_job(参数……):
if 条件1:
......#计算配送员数
elif 条件2:
......#计算配送次数
# 调用工作量计算函数
calculate_job(参数……)
import math
# 配送调配计算
# 设置默认参数
def calculate_job(size=1,person=None,num=None):
if(person !=None)and(num==None):
#配送次数计算过程
num = math.ceil(size * 100 / 20/person)
print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(size,person,num))
elif(person==None)and(num!=None):
#快递员数计算过程
person = math.ceil(size *100 /20/ num)
print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(size,num,person))
calculate_job(size=1.5,person=2)
calculate_job(size=0.5,num=1)
但是,我们在调用函数的时候,你还要输入参数名与参数值,太麻烦,我们能不能有个简单方法。
import math
# 配送调配计算
# 设置默认参数
def calculate_job(types,size,other):
if types ==1:
#配送次数计算过程
num = math.ceil(size * 100 / 20/other)
print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(size,other,num))
elif types==2:
#快递员数计算过程
person = math.ceil(size *100 /20/ other)
print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(size,other,person))
calculate_job(1,1.5,2)
calculate_job(2,0.5,1)
3.3 精细化
BOSS朋友不想每次都去调用函数,才能计算结果,那就给她整个交互过程。
import math
types = int(input('请选择需要计算的工作:1-配送次数计算,2-快递员数计算,请选择:'))
sizes = float(input('请输入项目大小:1代表标准,还可以输入其他倍数或小数'))
if types ==1:
others = int(input('请输入投入的快递员数,请输入整数'))
else:
others = int(input('请输入快递次数,请输入整数'))
# 配送调配计算
# 设置默认参数
def calculate_job(types,sizes,others):
print('计算结果如下')
if types ==1:
#配送次数计算过程
num = math.ceil(sizes * 100 / 20/others)
print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(sizes,others,num))
elif types==2:
#快递员数计算过程
person = math.ceil(sizes *100 /20/ others)
print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(sizes,others,person))
calculate_job(types,sizes,others)
当我们选择计算配送次数, 项目大小为2.2倍,快递员数为1时。 计算工时:需要配送次数 = 2.2*100/20/1 ,得到的结果应该是11次,可是打印出来却是12次。
python江湖中的除法,会将数字都转换二进制再进行计算,得到的结果是一个二进制,造成数字增加。
import math
print(2.2*100/20)
print(math.ceil(2.2*100/20))
import math
print(round(2.2*100/20,2))
round()函数是python中提供解决小数的保留问题。此函数格式round(x ,n) x表示小数,n表示需要保留的小数位。
import math
types = int(input('请选择需要计算的工作:1-配送次数计算,2-快递员数计算,请选择'))
sizes = float(input('请输入项目大小:1代表标准,还可以输入其他倍数或小数'))
if types ==1:
others = int(input('请输入投入的快递员数,请输入整数'))
else:
others = int(input('请输入快递次数,请输入整数'))
# 配送调配计算
# 设置默认参数
def calculate_job(types,sizes,others):
print('计算结果如下')
if types ==1:
#配送次数计算过程
num = math.ceil(round((sizes * 100 / 20/others),2))
print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(sizes,others,num))
elif types==2:
#快递员数计算过程
person = math.ceil(round((sizes *100 /20/ others),2))
print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(sizes,others,person))
calculate_job(types,sizes,others)
按照函数封装代码的思想,我们现在代码写的很杂。
江湖箴言:创建一个主函数,用来调用其他子函数。
import math
def BOSS_input():
# 输入内容
types = int(input('请选择需要计算的工作:1-配送次数计算,2-快递员数计算,请选择'))
sizes = float(input('请输入项目大小:1代表标准,还可以输入其他倍数或小数'))
if types ==1:
others = int(input('请输入投入的快递员数,请输入整数'))
else:
others = int(input('请输入快递次数,请输入整数'))
return types,sizes,others #这里返回一个数组
#计算工作量
def calculate_job(data_input):
#获取参数数值
types = data_input[0]
sizes = data_input[1]
others = data_input[2]
print('计算结果如下')
if types ==1:
#配送次数计算过程
num = math.ceil(round((sizes * 100 / 20/others),2))
print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(sizes,others,num))
elif types==2:
#快递员数计算过程
person = math.ceil(round((sizes *100 /20/ others),2))
print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(sizes,others,person))
#主函数
def res():
data_input = BOSS_input()
calculate_job(data_input)
#调用主函数
res()
课后练习
1. 通过自己方法,完成向上取整. 用户输入1.1,变成2 用户输入1.5,变成2 用户输入1.9,变成2
2. 出租车车费计算方式如下:1、打车距离在3公里以内,只收起步价15元。2、距离在3公里~15公里,每1公里加3元。3、距离超过15公里后,每1公里加5元。请完成计价函数。
0 条评论