知识体系
第10关:实操用函数编写程序

知识点
项目需求:
制作一个工作量计算器
梳理关键信息
已知信息:1个标准项目,需要1个人80个工时完成
想要达到的目标有2个: 工时计算和人力计算。即明确项目规模的前提下,如果已知人力数量,预估所需工时数;如果已知工时期限,预估所需人力数量。(这里面有一个需要注意的问题就是:项目规模和工时可以有小数形式,但人力必须取整且是向上取整)
数学公式
# 工时计算公式(举例)
size = 1.5
number = 2
time = size * 80 / number
# 人力计算公式(举例)
size = 0.5
time = 20.0
number = size * 80 / time
1.0版:
能用就好 直接编写一个带参数函数完成计算功能。程序写出来大概长这个结构:
# 工时计算
def estimated_time(size,number):
……(计算过程)
# 人力计算
def estimated_number(size,time):
……(计算过程)
estimated_time(参数1,参数2)
estimated_number(参数1,参数2)
意思是说:把计算过程写好,封装到函数里,然后需要计算的时候直接调用函数,然后运行程序就能完成计算。
%.1f 含义是: %f的意思是格式化字符串为浮点型,%.1f的意思是格式化字符串为浮点型,并保留1位小数
2.0版:
稍作改良 如何改善以实现“人数的向上取整?”
根据解题思路:
1、达到人数上的向上取整。即当算出来的结果为需要10.1人时,显示结果为需要11个人。
2、需要的知识(已有知识/百度查询新方法)
已有知识:除数取整后+1即可。除数取整用“//"
新知识:使用.ceil()函数
具体用法是:.ceil()函数是math函数附属的一部分,所以写法是math.ceil()
import math
def estimated_number(size,time):
number = math.ceil(size * 80 / time)
简化代码
还是遵循上面“如何解题”的方法:
思路:用一个函数写出来,但是会自动区分到底是要工时数还是人力数即可 要想实现这样的效果,我们需要解决一个问题:应该怎么传递参数,才能让函数estimated(参数……)自动区分并完成工时计算和人力计算?
利用已掌握的知识,使用判断语句 接下来需要设置条件,让条件1代表人力计算,条件2代表工时计算
import math
def estimated(size=1,number=None,time=None):
# 人力计算:如果参数中填了时间,没填人数,就计算人力
if (number == None) and (time != None):
number = math.ceil(size * 80 / time)
print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number))
# 工时计算:如果参数中填了人数,没填时间,就计算工时
elif (number != None) and (time == None):
time = size * 80 / number
print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
# 调用函数的时候,传递两个参数,会自动计算出第三个参数
estimated(size=1.5,number=2)
estimated(size=0.5,time=20.0)
3.0版:
精细打磨 制作出有问有答的“可以交互运行”的程序
方法1:使用input()
import math
def estimated(size=1,number=None,time=None):
if (number == None) and (time != None):
number = math.ceil(size * 80 / time)
print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number))
elif (number != None) and (time == None):
time = size * 80 / number
print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
choice = input('请选择计算类型:(1-人力计算,2-工时计算)')
if choice == '2':
size = float(input('请输入项目大小:(1代表标准大小,可以输入小数)'))
number = int(input('请输入人力数量:(请输入整数)'))
time = None
estimated(size,number,time)
elif choice == '1':
size = float(input('请输入项目大小:(1代表标准大小,可以输入小数)'))
number = None time = float(input('请输入工时数量:(可以输入小数)'))
estimated(size,number,time)
方法2:用函数封装代码 函数封装代码的格式:
import math
# 采集信息的函数
def myinput():
choice = input('请选择计算类型:(1-工时计算,2-人力计算)')
if choice == '1':
size = float(input('请输入项目大小:(1代表标准大小,请输入小数)'))
number = int(input('请输入人力数量:(请输入整数)'))
time = None
return size,number,time # 这里返回的数据是一个元组
if choice == '2':
size = float(input('请输入项目大小:(1代表标准大小,请输入小数)'))
number = None
time = float(input('请输入工时数量:(请输入小数)'))
return size,number,time # 这里返回的是一个元组
# 完成计算的函数
def estimated(my_input):
# 把元组中的数据取出来
size = my_input[0]
number = my_input[1]
time = my_input[2]
# 人力计算
if (number == None) and (time != None):
number = math.ceil(size * 80 / time)
print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number))
# 工时计算
elif (number != None) and (time == None):
time = size * 80 / number
print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
# 主函数
def main():
my_input = myinput()
estimated(my_input)
# 调用主函数
main()
这样写的好处是:之所以写成“子函数+主函数”的代码结构,也是因为每个不同的功能封装在单独的函数代码中,方便后续修改、增删。
again()函数
功能: “让程序循环运行,直到用户选择结束”
具体操作如下:
import math
# 变量key代表循环运行程序的开关
key = 1
# 采集信息的函数
def myinput():
choice = input('请选择计算类型:(1-工时计算,2-人力计算)')
if choice == '1':
size = float(input('请输入项目大小:(1代表标准大小,请输入小数)'))
number = int(input('请输入人力数量:(请输入整数)'))
time = None
return size,number,time # 这里返回的数据是一个元组
if choice == '2':
size = float(input('请输入项目大小:(1代表标准大小,请输入小数)'))
number = None
time = float(input('请输入工时数量:(请输入小数)'))
return size,number,time # 这里返回的是一个元组
# 完成计算的函数
def estimated(my_input):
# 把元组中的数据取出来
size = my_input[0]
number = my_input[1]
time = my_input[2]
# 人力计算
if (number == None) and (time != None):
number = math.ceil(size * 80 / time)
print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number))
# 工时计算
elif (number != None) and (time == None):
time = size * 80 / number
print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
# 询问是否继续的函数
def again():
# 声明全局变量key,以便修改该变量
global key
a = input('是否继续计算?继续请输入y,输入其他键将结束程序。')
if a != 'y':
# 如果用户不输入'y',则把key赋值为0
key = 0
# 主函数
defmain():
print('欢迎使用工作量计算小程序!')
while key == 1:
my_input = myinput()
estimated(my_input)
again()
print('感谢使用工作量计算小程序!')
main()
网友评论