第二章 第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 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注