11 项目实操:使用函数完成项目

目的:

学会用函数编写程序

明确项目目标

互联网公司有两种角色,产品经理、程序员。产品经理提开发需求给程序员,然后程序员开发出满足需求功能的程序

今天我们来做个模拟,我们扮演“程序员”接到“产品经理”需求,并完成开发的过程。

11 项目实操:使用函数完成项目

需求文档是这样子的:

11 项目实操:使用函数完成项目

看过了需求文档,产品经理又跟你嘱咐:

11 项目实操:使用函数完成项目

分析过程,拆解项目

尝试倒推计算公式

11 项目实操:使用函数完成项目

逐步执行,代码实现

版本1.0:能用就好

我们可以直接编写一个带参数函数完成计算功能

11 项目实操:使用函数完成项目
# size,number,time
def estimated_time(size,number):
    time=size*80/number
    print('%.1f个工程,人数为%d,需要%.1f天可以完成' % (size,number,time))
def estimated_number(size,time):
    number=size*80/time
    print('%.1f个工程,天数为%.1f,需要%d个人可以完成' % (size,time,number))

estimated_time(1.5,2)
estimated_number(0.5,20)

版本2.0:稍作改良

产品经理拿走了版本1的代码,过了几天,他又回来跟你反馈计算公式有点问题:

11 项目实操:使用函数完成项目

那问题来了,要怎么调整代码,才能实现产品经理的需求对人数向上取整呢?也就是计算结果是1.5人的时候,取整数2,计算结果3.8人的时候,取整数4,计算结果10.1人的时候,取整数11……

方法一:

我们可以直接寻找新知识,在搜索引擎中搜索“python 取整”,就能找到向上取整的函数。

11 项目实操:使用函数完成项目
11 项目实操:使用函数完成项目

方法二:

另一种方式:如果你想起了这个知识,那么在第三步,我们可以找到一个切入点:如果人数不是整数(余数不为零),就把人数用int()函数转化为整数,然后再加1。

11 项目实操:使用函数完成项目

解决了计算问题后,产品经理又过来找你,这次他的需求是期望你简化代码:

11 项目实操:使用函数完成项目

解法一:

11 项目实操:使用函数完成项目

这里的代码用到了默认参数的相关知识。在调用函数的时候,我们可以给指定的参数赋值,那剩余的参数就会是默认值(也就是在定义函数的那行定义了他们的默认值)。比如estimated(size=1.5,time=20.0),给size和time赋值,那剩下的number就默认为None。

解法二:

我们还可以这样设置三个参数来实现相同的效果:

11 项目实操:使用函数完成项目
11 项目实操:使用函数完成项目

版本3.0:精细打磨

11 项目实操:使用函数完成项目
11 项目实操:使用函数完成项目
11 项目实操:使用函数完成项目

如果要优化上面代码的结构的话,要怎么优化?可以创建一个主函数,用来调用几个子函数。一起来温习一下上个关卡的代码:

用图片来表示的话,是这样的:

11 项目实操:使用函数完成项目

如图所示,我们可以把每个独立的功能封装到每个单独的函数中,然后用一个主函数打包这些单独的函数,最后再调用主函数。

11 项目实操:使用函数完成项目

在这里,myinput()函数负责跟用户采集信息,estimated()函数负责完成计算,而main()函数把其他两个函数打包放在一起并传递了参数。所以只要调用main()函数就能让整个程序跑起来

比如我们想要加一个功能“让程序循环运行,直到用户选择结束”。那么,就可以在程序中加上一个again函数。

提示:1.需要新增变量和改造主函数;2.用到的知识是判断和循环;3.对代码进行调整是正常的(即不要期待总能一次成功)。

最终代码:

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  

# 主函数
def main():
    print('欢迎使用工作量计算小程序!')
    while key == 1:
        my_input = myinput()
        estimated(my_input)
        again()
    print('感谢使用工作量计算小程序!')

main()

课后练习:

和电脑玩一个剪刀石头布的游戏:电脑随机出拳,我们可选择出什么。

题目讲解

首先,我们要让双方选择出拳,才能判断胜负。
我们可以设置变量computer_choice代表电脑的出拳选择,设置变量user_choice代表你的出拳选择。
电脑的出拳,我们可以使用random.choice()来随机选择;我们的出拳,可以手动输入我们出拳的类型。
另外,判断下输入:当输入的内容不是石头剪刀布时,电脑会提醒'输入有误,请重新出拳',并重新出拳。
请根据已经设置好的代码,补充代码,让代码符合上面的要求。

你和电脑已经对自己要出的拳进行了选择,接下来,我们需要知道双方的出拳类型。
请使用print()函数补充亮拳的结果。

在前面两步,电脑和你已经选择完出拳的类型并亮拳后,只差最后一步:根据结果判断胜负。
请将代码补充完整,并运行几次试试是否正确判断。

import random


# 出拳

punches = ['石头','剪刀','布']

computer_choice = random.choice(punches)

user_choice = ''

user_choice = input('请出拳:(石头、剪刀、布)')  # 请用户输入选择

while user_choice not in punches:  # 当用户输入错误,提示错误,重新输入

    print('输入有误,请重新出拳')

    user_choice = input()



# 亮拳

print('————战斗过程————')

print('电脑出了:%s' % computer_choice)

print('你出了:%s' % user_choice)



# 胜负

print('—————结果—————')

if user_choice == computer_choice:  # 使用if进行条件判断

    print('平局!')

elif (user_choice == '石头' and computer_choice == '剪刀') or (user_choice == '剪刀' and computer_choice == '布') or (user_choice == '布' and computer_choice == '石头'):

    print('你赢了!')

else:

    print('你输了!')

发布者:LJH,转发请注明出处:https://www.ljh.cool/7812.html

(0)
上一篇 2022年9月12日 下午4:06
下一篇 2022年9月13日 上午1:13

相关推荐

发表回复

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