互联网公司有两种角色,产品经理、程序员。产品经理提开发需求给程序员,然后程序员开发出满足需求功能的程序。
我们来做个模拟,我们扮演“程序员”接到“产品经理”需求,并完成开发的过程。
【明确项目】
【拆解项目】
为了搞清楚计算过程,我们需要根据案例倒推出计算公式。
尝试倒推计算公式:
(这个公式粗略看来没有太大问题,不过后续编程时还需要打磨一下)
【逐步执行】
【版本1.0:能用就好】
要做一个“能用就好”的最基本的程序,我们可以直接编写一个带参数函数完成计算功能。程序写出来大概长这个结构:
我们会用到第一个项目末尾提到的知识点:格式化字符串。
注:%f的意思是格式化字符串为浮点型,%.1f的意思是格式化字符串为浮点型,并保留1位小数。
【版本2.0:稍作改良】
要怎么调整代码,才能实现产品经理的需求对人数向上取整呢?也就是计算结果是1.5人的时候,取整数2,计算结果3.8人的时候,取整数4,计算结果10.1人的时候,取整数11……
思路1:
思路2:
可以用%做取余数运算,比如print(5%4)的结果是1(5除以4余数为1)。
切入点:如果人数不是整数(余数不为零),就把人数用int()函数转化为整数,然后再加1。
在这里,用第一种方法代码更简洁。
解决了计算问题后,产品经理又过来找你,这次他的需求是期望你简化代码:
第一步,我们可以先想象一下预期效果:
要想实现这样的效果,我们需要解决一个问题:应该怎么传递参数,才能让函数estimated(参数……)自动区分并完成工时计算和人力计算?
要区分两种不同的计算方式,当然用条件判断语句啦。
继续完善一下预期的代码结构:
现在的问题又推进了一步:该如何设置条件,让条件1代表人力计算,条件2代表工时计算?
这个问题有多种解法,关键点是利用参数设置条件。
方法1:
在调用函数的时候,我们可以给指定的参数赋值,那剩余的参数就会是默认值(也就是在定义函数的那行定义了他们的默认值)。
方法2:
我们还可以这样设置三个参数来实现相同的效果:
【版本3.0:精细打磨】
现在我们又拿到了新的需求:制作出“可以交互运行”的程序。
想让程序可以交互,显然要用input和print语句。
到这里,程序基本已经完成了。不过,为了展示用函数封装代码的精髓,我想再问大家一个问题:
如果要优化上面代码的结构的话,要怎么优化?
答案是:可以创建一个主函数,用来调用几个子函数。
之所以写成“子函数+主函数”的代码结构,也是因为每个不同的功能封装在单独的函数代码中,方便后续修改、增删。
比如我们想要加一个功能“让程序循环运行,直到用户选择结束”。那么,就可以在程序中加上一个again函数。
提示:1.需要新增变量和改造主函数;2.用到的知识是判断和循环;3.对代码进行调整是正常的(即不要期待总能一次成功)。
【课后练习】
练习要求:
和电脑玩一个剪刀石头布的游戏:电脑随机出拳,我们可选择出什么。
【双方出拳】
首先,我们要让双方选择出拳,才能判断胜负。
我们可以设置变量computer_choice代表电脑的出拳选择,设置变量user_choice代表你的出拳选择。
电脑的出拳,我们可以使用random.choice()来随机选择;我们的出拳,可以手动输入我们出拳的类型。
另外,判断下输入:当输入的内容不是石头剪刀布时,电脑会提醒'输入有误,请重新出拳',并重新出拳。
【双方亮拳】
你和电脑已经对自己要出的拳进行了选择,接下来,我们需要知道双方的出拳类型。
请使用print()函数补充亮拳的结果。
注:使用字符串格式化!
【判断胜负】
在前面两步,电脑和你已经选择完出拳的类型并亮拳后,只差最后一步:根据结果判断胜负。
胜负分为三种情况:
两方出拳一致:平局;
你出石头,电脑出剪刀;你出剪刀,电脑出布;你出布,电脑出石头:你获胜;
其他情况:你输了。