美文网首页“老奶奶”的python学习笔记
“老奶奶”的python学习笔记(10)

“老奶奶”的python学习笔记(10)

作者: 菁_在路上 | 来源:发表于2019-11-29 15:12 被阅读0次

知识体系

第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()

相关文章

网友评论

    本文标题:“老奶奶”的python学习笔记(10)

    本文链接:https://www.haomeiwen.com/subject/ooqgwctx.html