明确项目目的
先来看一下项目需求:
分析流程,拆解项目
我们的任务就是做一个“快递配送调配程序”,虽然这朋友要的比较着急,但是我们也不着急于编程开发,应该先梳理清楚需求,做出的程序功能达到什么样的效果。
计算器,首先配送站BOSS要输入信息,然后自动计算出结果。为了搞清楚计算过程,我们得到计算公式。
梳理需求,得到下图结果:
# 注:size代表集装箱大小,person代表快递员人数,num代表配送次数
# 配送次数计算
size = 2
person = 2
num = size*100/20
print('2个标准集装箱大的快递项目,使用2快递员配送,则需要配送次数:',int(num))
# 快递员数计算
size = 0.6
num = 1
person = 0.6*100/20
print('0.6个标准集装箱大的快递项目,1次配送完毕,则需要配送员数:',int(person))
# 配送次数计算公式
size = 2
person = 2
num = size * 100 / 20/person
# 配送员数计算公式
size = 0.6
num = 1
person = size *100 /20/ num
我们已经搞定了计算公式,接下来我们拆分一下阶段版本。
因为这BOSS朋友着急,先做出程序,以后再优化吧。所以,我们把程序版本大致规划成3个阶段。
逐步执行,代码实现
先来解决1.0版本。
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(参数1,参数2)
calculate_person(参数1,参数2)
%f是字符串格式化,格式字符串为浮点数,%.1f的意思是格式话字符串为浮点数,并且保留一位小数。
你看,一个快递配送调配程序就已经完成了,给BOSS朋友送去吧。
3.2 再改进
那么问题来了,无论小数点之后是点几,都要向上进一取整数。也就是1.5转成2,1.9转成2,1.1转成2,即对人数需要向上取整。
发现:向上取整是math.ceil(), 括号内放数字。
也就是使用math.ceil()方法,就能把数字向上取整。并且在开始位置,有一句import math, 怎么有些似曾相识. 在上个项目实战中,我们使用随机数,也用过import math代码。
我们使用math.ceil()将我们的小数进行向上取整吧。
现在解决了项目bug,感觉应该可以了。
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(参数……)
要想实现这样效果,我们怎么传递参数,才能让函数区分是【计算配送次数】还是【计算配送员数】。
当然选B啦。区分两种情况,当然用条件判断啊。
既然用条件判断,我们的代码就可以写成:
# 工作量计算函数
def calculate_job(参数……):
if 条件1:
......#计算配送员数
elif 条件2:
......#计算配送次数
# 调用工作量计算函数
calculate_job(参数……)
OK,现在问题又进了一步。也就是解决条件1与条件2,计算工作量即可。
还有一个问题,就是参数如何设置。
昨天在学习函数时,设置过默认参数,而函数调用时,还能替换掉默认参数,我们就利用函数的特性来解决这个问题。
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)
OK,现在这个程序已经可以运行了。
但是,我们在调用函数的时候,你还要输入参数名与参数值,太麻烦,我们能不能有个简单方法。
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朋友只输入内容即可, 使用input()函数
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)
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))
2.2*100/20 ------------->11.000000000000002
math.ceil(2.2*100/20) ------------->12
明明可以整除的,造成还存在小数部分,然后向上取整后得到12。
那么有没有办法可以改变。
有, 我们使用math中的round函数。
import math
print(round(2.2*100/20,2))
round()函数是python中提供解决小数的保留问题。此函数格式round(x ,n) x表示小数,n表示需要保留的小数位。
我们保留小数2位,将round加入到我们的案例方法中。
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)
BOSS朋友是不是可以输入了。
但是,按照函数封装代码的思想,我们现在代码写的很杂。
那我们把它优化一下?
怎么优化呢?创建一个主函数,用来调用其他子函数。
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()
在这里函数BOSS_input()负责收集BOSS朋友输入的数据;函数calculate_job()负责计算工作量.函数res()负责调用两个函数,传入参数.只要调用res()函数,就能让整个程序跑起来。
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,变成2
用户输入1.5,变成2
用户输入1.9,变成2
不使用math.ceil()函数,自己制作一个向上取整的函数。
def rounding(num):
if num%1==0:
return int(num)
else:
data = int(num)+1
return data
num=float(input('请输入数字:'))
num1 = rounding(num)
print(num1)
出租车车费计算方式如下:1、打车距离在3公里以内,只收起步价15元。2、距离在3公里~15公里,每1公里加3元。3、距离超过15公里后,每1公里加5元。请完成计价函数。
今天需要和BOSS朋友去吃饭,我们一起打车去市中心,我们想写一个程序,输入坐车公里数,就能自动计算车费。 出租车车费计算方式如下:
import math
distance = math.ceil(float(input("请输入坐车公里数:")))
def texi(distance):
if distance<=3:
price=15
elif 3<distance<=15:
price=15+(distance-3)*3
elif distance>15:
price=15+12*3+(distance-15)*5
print('本次打车费用为:%d元'%price)
texi(distance)