10产品 - 图1

笔记

10产品 - 图2

根据要求写公式

10产品 - 图3

print

10产品 - 图4

10产品 - 图5

10产品 - 图6

10产品 - 图7

import math

人力计算

def estimated_number(size,time):

  1. number = math.ceil(size * 80 / time)
  2. print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number))

调用人力计算函数

estimated_number(1,60)

10产品 - 图8

10产品 - 图9

  1. import math
  2. def estimated(types,size,other):
  3. # 人力计算
  4. if types == 1:
  5. number = math.ceil(size * 80 / other)
  6. print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,other,number))
  7. # 工时计算
  8. elif types == 2:
  9. time = size * 80 / other
  10. print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,other,time))
  11. estimated(1, 1.5, 2)
  12. # 结果:项目大小为1.5个标准项目,如果需要在2.0个工时完成,则需要人力数量为:60人
  13. estimated(2, 1.5, 2)
  14. # 结果:项目大小为1.5个标准项目,使用2个人力完成,则需要工时数量为:60.0个

10产品 - 图10

v

  1. import math
  2. def estimated(size=1,number=None,time=None):
  3. if (number == None) and (time != None):
  4. number = math.ceil(size * 80 / time)
  5. print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number))
  6. elif (number != None) and (time == None):
  7. time = size * 80 / number
  8. print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
  9. '请选择计算类型:(1-人力计算,2-工时计算)'
  10. '请输入项目大小:(1代表标准大小,可以输入小数)'
  11. '请输入人力数量:(请输入整数)'
  12. '请输入工时数量:(请输入小数)'

10产品 - 图11

10产品 - 图12

define

run

10产品 - 图13

10产品 - 图14

ai:

import math

def estimated_number(size, time):

  1. number = math.ceil(size * 80 / time)
  2. print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' % (size, time, number))

def again():

  1. while True:
  2. user_input = input("是否继续计算?输入y继续,输入n结束:")
  3. if user_input.lower() == 'y':
  4. return True
  5. elif user_input.lower() == 'n':
  6. return False
  7. else:
  8. print("输入错误,请重新输入。")

while True:

  1. size = float(input("请输入项目大小(以标准项目为单位):"))
  2. time = float(input("请输入完成项目所需的工时数:"))
  3. estimated_number(size, time)
  4. if not again():
  5. break

10产品 - 图15

请直接运行并体验代码

import math

变量key代表循环运行程序的开关

key = 1

采集信息的函数

def myinput():

  1. choice = input('请选择计算类型:(1-工时计算,2-人力计算)')
  2. if choice == '1':
  3. size = float(input('请输入项目大小:(1代表标准大小,请输入小数)'))
  4. number = int(input('请输入人力数量:(请输入整数)'))
  5. time = None
  6. return size,number,time
  7. # 这里返回的数据是一个元组
  8. if choice == '2':
  9. size = float(input('请输入项目大小:(1代表标准大小,请输入小数)'))
  10. number = None
  11. time = float(input('请输入工时数量:(请输入小数)'))
  12. return size,number,time
  13. # 这里返回的是一个元组

完成计算的函数

def estimated(my_input):

  1. # 把元组中的数据取出来
  2. size = my_input[0]
  3. number = my_input[1]
  4. time = my_input[2]
  5. # 人力计算
  6. if (number == None) and (time != None):
  7. number = math.ceil(size * 80 / time)
  8. print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number))
  9. # 工时计算
  10. elif (number != None) and (time == None):
  11. time = size * 80 / number
  12. print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))

询问是否继续的函数

def again():

  1. # 声明全局变量key,以便修改该变量
  2. global key
  3. a = input('是否继续计算?继续请输入y,输入其他键将结束程序。')
  4. if a != 'y':
  5. # 如果用户不输入'y',则把key赋值为0
  6. key = 0

主函数

def main():

  1. print('欢迎使用工作量计算小程序!')
  2. while key == 1:
  3. my_input = myinput()
  4. estimated(my_input)
  5. again()
  6. print('感谢使用工作量计算小程序!')

main()

内容

2 练习 - 和电脑玩石头剪刀布

10产品 - 图16

哈喽,你如约而至,我很开心!

10产品 - 图17

这一关,是我们的第2个项目实操关卡:学会用函数编写程序。

10产品 - 图18

还记得项目1里那个文字版小游戏吗?在那之后,你又挑战了一个思维关卡和一个知识关卡。想必现在的你,对项目实操更胸有成竹了吧。

10产品 - 图19

项目2的难度和项目1基本相似,不过从我们学完函数开始,我们就有能力做出一点有用的程序了——项目2将带大家做一个迷你的实用程序。

10产品 - 图20

这次的项目实操,不仅是对基础知识的巩固,也是思维层面的练习。在我看来,每一个项目都是一次试炼,试的是对知识的掌握程度,炼的是解决问题的思路。

10产品 - 图21

这次的项目实操流程,和项目1是一模一样的:

10产品 - 图22

10产品 - 图23

接下来,我们一步一步来推进这个项目的实现吧。

明确项目目标

10产品 - 图24

10产品 - 图25

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

10产品 - 图26

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

10产品 - 图27

10产品 - 图28

需求文档是这样子的:

10产品 - 图29

10产品 - 图30

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

10产品 - 图31

10产品 - 图32

“敏捷开发”是互联网的常态。刚刚当“程序员”的第一天,你就接到了这么急的需求,那该怎么办呢?我们来分析一下。

分析过程,拆解项目

10产品 - 图33

10产品 - 图34

我们的任务是制作一个工作量计算器,虽然产品经理的需求很急,但我们不要着急开发,应该先梳理清楚这是一个什么需求,要做出的程序(产品)功能如何。毕竟,磨刀不误砍柴工。

10产品 - 图35

既然是个计算器程序,那就是要输入信息后能计算出结果。为了搞清楚计算过程,我们需要根据案例倒推出计算公式。

10产品 - 图36

我们先梳理一下需求文档中的关键信息:

10产品 - 图37

10产品 - 图38

那么现在请你尝试倒推计算公式,写在下面的代码区吧: 已完成课堂练习 重做 分享 main.py 1 # 注:size代表项目大小,number代表人数,time代表工时数量 2 3 # 工时计算 4 size = 1.5 5 number = 2 6 time = (20sizenumber) 7 print(‘项目大小为1.5个标准项目,使用2个人力完成,则需要工时数量为:’,time) 8 9 # 人力计算 10 size = 0.5 11 time = 20.0 12 number = (80*size/time) 13 print(‘项目大小为0.5个标准项目,如果需要在20.0个工时完成,则需要人力数量为:’,int(number)) 终端

10产品 - 图39

老师的答案是这样的:(这个公式粗略看来没有太大问题,不过后续编程时还需要打磨一下) 1 2 3 4 5 6 7 8 9

10产品 - 图40

我们已经搞清楚了核心计算过程,接下来我们得拆分一下阶段版本。

10产品 - 图41

因为产品经理提到需求非常急,要赶快做出能用的程序,后续再迭代改良。所以,我们把程序版本大致规划成三个阶段:

10产品 - 图42

10产品 - 图43

明确了每一阶段的任务后,接下来就是好戏开场,让我们开始逐步用代码实现功能!

逐步执行,代码实现

10产品 - 图44

10产品 - 图45

让我们先一起来攻克版本1.0:

版本1.0:能用就好

10产品 - 图46

10产品 - 图47

要做一个“能用就好”的最基本的程序,我们可以直接编写一个带参数函数完成计算功能。程序写出来大概长这个结构: 1 2 3 4 5 6 7 8 9 10

10产品 - 图48

也就是说,把计算过程写好,封装到函数里,然后需要计算的时候直接调用函数,然后运行程序就能完成计算。

10产品 - 图49

我们刚才总结的计算公式是这样的: 1 2 3 4 5

10产品 - 图50

现在请你来完善一下代码(注意,在函数中不但要完成计算,还需要用print语句把计算结果展示出来哦):

10产品 - 图51

完善代码的过程中,我们会用到第一个项目末尾提到的知识点:格式化字符串。

10产品 - 图52

已完成课堂练习 重做 分享 main.py 1 # 工时计算 2 def estimated_time(size,number): 3 time = size * 80 / number 4 return time 5 6 # 人力计算 7 def estimated_number(size,time): 8 number = size * 80 / time 9 return number 10 11 # 调用工时计算函数 12 estimated_time(1.5,2) 13 # 调用人力计算函数 14 estimated_number(0.5,20) 终端

10产品 - 图53

你来运行一下老师的答案吧: 已完成课堂练习 重做 分享 main.py 1 # 无需修改代码,直接运行即可 2 3 # 工时计算 4 def estimated_time(size,number): 5 time = size * 80 / number 6 print(‘项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个’ %(size,number,time)) 7 8 # 人力计算 9 def estimated_number(size,time): 10 number = size * 80 / time 11 print(‘项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人’ %(size,time,number)) 12 13 # 调用工时计算函数 14 estimated_time(1.5,2) 15 # 调用人力计算函数 16 estimated_number(0.5,20) 终端

10产品 - 图54

注:%f的意思是格式化字符串为浮点型%.1f的意思是格式化字符串为浮点型,并保留1位小数

10产品 - 图55

到这里,“工作量计算器”的最基本版本就制作完成了,你把它交付给了产品经理。

版本2.0:稍作改良

10产品 - 图56

10产品 - 图57

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

10产品 - 图58

10产品 - 图59

产品经理把运行结果展示给你看:

10产品 - 图60

10产品 - 图61

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

10产品 - 图62

在第8关编程学习的两大瓶颈我们提到,写代码时碰到问题是正常的。它是一个“执行→遇到问题→解决问题→继续执行”的循环,不过相信这个循环总有break的时刻——因为问题终究会被解决!

10产品 - 图63

10产品 - 图64

所以在这里,也请你思考一下怎么独自解决这个问题。你即可以上网搜索新知识,也可以思考已有知识能否解决这个问题。如果做不出也没关系,我会在后面提供答案。

10产品 - 图65

请调整以下代码,让计算结果满足产品经理的需求: 已完成课堂练习 重做 分享 main.py 1 import math 2 3 def round_up(number): 4 return math.ceil(number) 5 6 7 # 人力计算 8 def estimated_number(size,time): 9 number = round_up(size * 80 / time) 10 print(‘项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人’ %(size,time,number)) 11 12 # 调用人力计算函数 13 estimated_number(1,60) 终端

10产品 - 图66

我们用第8关解决问题的流程给大家演示一下这个问题的两种解决思路。

10产品 - 图67

10产品 - 图68

第一步定位问题我们已经完成了:代码的计算过程应该对对人数向上取整。也就是计算结果是1.5人的时候,取整数2,计算结果3.8人的时候,取整数4,计算结果10.1人的时候,取整数11……

10产品 - 图69

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

10产品 - 图70

10产品 - 图71

10产品 - 图72

接下来的三到五步很简单,代码很快就出来了,请你运行体验一下: 已完成课堂练习 重做 分享 main.py 1 import math 2 3 # 人力计算 4 def estimated_number(size,time): 5 number = math.ceil(size * 80 / time) 6 print(‘项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人’ %(size,time,number)) 7 8 # 调用人力计算函数 9 estimated_number(1,60) 终端

10产品 - 图73

其中import math是因为使用ceil()函数需要导入math模块,就像第7关小游戏项目中,使用randint()函数(随机整数)需要导入random模块。我们会在第15关详细讲解关于“模块”的来龙去脉,现在你只需要读懂代码含义即可。

10产品 - 图74

这个问题的解决还有另一种方式,在第二步的时候,你也可以运用已有知识解决。

10产品 - 图75

有一个计算符不太常用,不知道你是否还记得:可以用%做取余数运算,比如print(5%4)的结果是1(5除以4余数为1)。

10产品 - 图76

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

10产品 - 图77

照这个思路,写出的代码是这个样子:

已完成课堂练习

重做 分享 main.py 1 import math 2 3 # 人力计算 4 def estimated_number(size,time): 5 if (size * 80 % time) != 0: 6 number = int(size * 80 / time) + 1 7 else: 8 number = size * 80 / time 9 print(‘项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人’ %(size,time,number)) 10 11 # 调用人力计算函数 12 estimated_number(1,60) 终端

10产品 - 图78

在这里,用第一种方法代码更简洁。所以我们采用方法1,把之前的代码汇总到一起: 已完成课堂练习 重做 分享 main.py 1 import math 2 3 # 工时计算 4 def estimated_time(size,number): 5 time = size * 80 / number 6 print(‘项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个’ %(size,number,time)) 7 8 # 人力计算 9 def estimated_number(size,time): 10 number = math.ceil(size * 80 / time) 11 print(‘项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人’ %(size,time,number)) 12 13 # 调用工时计算函数 14 estimated_time(1.5,2) 15 # 调用人力计算函数 16 estimated_number(1,60) 终端

10产品 - 图79

看完了两种解题思路后,请你在这停留片刻。想一想:你在写代码时碰到问题的第一反应是什么?是找助教?还是思考已有知识是否可以解决问题?亦或是上搜索引擎查寻找答案?

10产品 - 图80

第一种方式可能更直接便捷,不过,老师并不建议你这么做。

10产品 - 图81

这样做相当于你放弃了一次机会,一次可以独立解决问题的机会。同时,也放弃了独立解决问题可以带来的能力上的提升和成功后的愉悦。

10产品 - 图82

所以,希望你开始学会克制,克制提问的冲动,把握解决问题的机会,让每一个问题都成为你成长路上坚实的阶梯。就算是同样从助教那得到帮助,先尝试自己去解决问题的人肯定也能从帮助中更好地理解和吸收。

10产品 - 图83

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

10产品 - 图84

10产品 - 图85

我们继续用解决问题的流程来处理这个问题。

10产品 - 图86

10产品 - 图87

第一步,我们可以先想象一下预期效果: 1 2 3 4 5 6

10产品 - 图88

要想实现这样的效果,我们需要解决一个问题:应该怎么传递参数,才能让函数estimated(参数……)自动区分并完成工时计算人力计算

10产品 - 图89

同学们可以思考一下如何用学过的知识解决这个问题。

单选题

请选出你觉得对这个问题最有帮助的知识:

A.

条件判断语句

B.

循环语句

C.

字符串拼接

D.

参数传递

答案是A

10产品 - 图90

答错了,答案是A。我们虽然需要用到参数传递的知识,但只靠参数传递并不能区分两种不同的计算方式,所以条件判断语句更为重要。

10产品 - 图91

既然要用到条件判断语句,我们可以继续完善一下预期的代码结构: 1 2 3 4 5 6 7 8 9

10产品 - 图92

所以,现在的问题又推进了一步:该如何设置条件,让条件1代表人力计算,条件2代表工时计算?

10产品 - 图93

这个问题有多种解法,关键点是利用参数设置条件。我先跟你演示一种:(请留意代码注释) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

10产品 - 图94

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

10产品 - 图95

你来运行体验一下:

已完成课堂练习

重做 分享 main.py 1 import math 2 3 # 为函数设置了三个参数,并都带有默认参数 4 def estimated(size=1,number=None,time=None): 5 # 人力计算:如果参数中填了时间,没填人数,就计算人力 6 if (number == None) and (time != None): 7 number = math.ceil(size * 80 / time) 8 print(‘项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人’ %(size,time,number)) 9 # 工时计算:如果参数中填了人数,没填时间,就计算工时 10 elif (number != None) and (time == None): 11 time = size * 80 / number 12 print(‘项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个’ %(size,number,time)) 13 14 # 调用函数的时候,传递两个参数,会自动计算出第三个参数 15 estimated(size=1.5,number=2) 16 estimated(size=0.5,time=20.0) 终端

单选题

我来考考你。调用函数estimated(time=70.0),输出的结果将是多少?

A.

1

B.

2

C.

11

D.

报错

答案是B

10产品 - 图96

答错了!答案是B。调用函数estimated(time=70.0),将默认size=1 , number=None,因为参数中填了时间没填人数(number=None),就计算人数。计算人数的时候,向上取整,所以答案为B。

10产品 - 图97

对这道题有疑问的同学,可以返回上一个代码块,点击【重做】按钮,加入estimated(time=70.0)语句执行一下看看。

10产品 - 图98

刚才提到“合并成一个函数”这个问题不止一种解法。比如说,我们还可以这样设置三个参数来实现相同的效果:

10产品 - 图99

10产品 - 图100

感兴趣的同学可以练习一下,将以下代码修改成刚才提到的第二种解决方案: 已完成课堂练习 重做 分享 main.py 1 import math 2 3 # 为函数设置了三个参数,并都带有默认参数 4 def estimated(size=1,number=None,time=None): 5 # 人力计算:如果参数中填了时间,没填人数,就计算人力 6 if (number == None) and (time != None): 7 number = math.ceil(size * 80 / time) 8 print(‘项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人’ %(size,time,number)) 9 # 工时计算:如果参数中填了人数,没填时间,就计算工时 10 elif (number != None) and (time == None): 11 time = size * 80 / number 12 print(‘项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个’ %(size,number,time)) 13 14 # 调用函数的时候,传递两个参数,会自动计算出第三个参数 15 estimated(size=1.5,number=2) 16 estimated(size=0.5,time=20.0) 终端

10产品 - 图101

老师的答案是这样的: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

10产品 - 图102

你把“稍作改良”的代码交给了产品经理。不过,这事还没完。

版本3.0:精细打磨

10产品 - 图103

10产品 - 图104

产品经理拿走了版本2的代码,过了几天,他又回来跟你反馈:

10产品 - 图105

10产品 - 图106

10产品 - 图107

现在我们又拿到了新的需求:制作出“可以交互运行”的程序。

10产品 - 图108

想让程序可以交互,显然要用input和print语句,这些都是我们曾经学过的。

单选题

接下来,你是想独立完成这个任务,还是想跟随我完成这个任务?

A.

我想独立尝试(推荐)

B.

我想跟随完成

10产品 - 图109

没问题。那我们一起来完成这个任务。

10产品 - 图110

为了方便,我们先把可能用到的编程素材组织一下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

10产品 - 图111

这里的思路是,先让用户输入选择计算类型,然后再用条件判断语句来区分不同的类型——用户输入1代表人力计算,用户输入2代表工时计算。

10产品 - 图112

当用户选择了计算类型后,再分别使用input函数采集数据,最后调用estimated()函数完成计算。

10产品 - 图113

以这样的思路,我们的代码框架就出来了。请继续在这个代码框架下填充剩余代码吧:

已跳过课堂练习

重做 分享 main.py 1 import math 2 3 def estimated(size=1,number=None,time=None): 4 if (number == None) and (time != None): 5 number = math.ceil(size * 80 / time) 6 print(‘项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人’ %(size,time,number)) 7 elif (number != None) and (time == None): 8 time = size * 80 / number 9 print(‘项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个’ %(size,number,time)) 10 11 choice = input(‘请选择计算类型:(1-人力计算,2-工时计算)’) 12 if choice == ‘1’: 13 size = float(input(‘请输入项目大小:(1代表标准大小,可以输入小数)’)) 14 number = int(input(‘请输入人力数量:(请输入整数)’)) 15 time = None 16 estimated(size,number,time) 17 elif choice == ‘2’: 18 size = float(input(‘请输入项目大小:(1代表标准大小,可以输入小数)’)) 终端

10产品 - 图114

怎么样?老师的答案是这样的,你可以运行体验一下:

已完成课堂练习

重做 分享 main.py 1 # 直接运行体验代码即可 2 3 import math 4 5 def estimated(size=1,number=None,time=None): 6 if (number == None) and (time != None): 7 number = math.ceil(size * 80 / time) 8 print(‘项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人’ %(size,time,number)) 9 elif (number != None) and (time == None): 10 time = size * 80 / number 11 print(‘项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个’ %(size,number,time)) 12 13 choice = input(‘请选择计算类型:(1-人力计算,2-工时计算)’) 14 if choice == ‘2’: 15 size = float(input(‘请输入项目大小:(1代表标准大小,可以输入小数)’)) 16 number = int(input(‘请输入人力数量:(请输入整数)’)) 17 time = None 18 estimated(size,number,time) 终端

10产品 - 图115

到这里,程序基本已经完成了。不过,为了展示用函数封装代码的精髓,我想再问大家一个问题:

10产品 - 图116

如果要优化上面代码的结构的话,要怎么优化?先想想,看能不能回想起来,上个关卡我们学过的。

10产品 - 图117

答案是:可以创建一个主函数,用来调用几个子函数。一起来温习一下上个关卡的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

10产品 - 图118

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

10产品 - 图119

10产品 - 图120

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

10产品 - 图121

你可以按照这个思路改造上面的代码:

已完成课堂练习

重做 分享 main.py 1 # 先将下面的代码改造成两个子函数和一个主函数,并调用主函数。 2 3 import math 4 5 def estimated(size=1,number=None,time=None): 6 if (number == None) and (time != None): 7 number = math.ceil(size * 80 / time) 8 print(‘项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人’ %(size,time,number)) 9 elif (number != None) and (time == None): 10 time = size * 80 / number 11 print(‘项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个’ %(size,number,time)) 12 13 choice = input(‘请选择计算类型:(1-人力计算,2-工时计算)’) 14 if choice == ‘2’: 15 size = float(input(‘请输入项目大小:(1代表标准大小,可以输入小数)’)) 16 number = int(input(‘请输入人力数量:(请输入整数)’)) 17 time = None 18 estimated(size,number,time) 终端

10产品 - 图122

改造好了吧?看下参考代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

10产品 - 图123

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

已完成课堂练习

重做 分享 main.py 1 # 请直接运行体验的代码 2 import math 3 4 # 采集信息的函数 5 def myinput(): 6 choice = input(‘请选择计算类型:(1-工时计算,2-人力计算)’) 7 if choice == ‘1’: 8 size = float(input(‘请输入项目大小:(1代表标准大小,请输入小数)’)) 9 number = int(input(‘请输入人力数量:(请输入整数)’)) 10 time = None 11 return size,number,time 12 # 这里返回的数据是一个元组 13 if choice == ‘2’: 14 size = float(input(‘请输入项目大小:(1代表标准大小,请输入小数)’)) 15 number = None 16 time = float(input(‘请输入工时数量:(请输入小数)’)) 17 return size,number,time 18 # 这里返回的是一个元组 终端

10产品 - 图124

之所以写成“子函数+主函数”的代码结构,也是因为每个不同的功能封装在单独的函数代码中,方便后续修改、增删。

10产品 - 图125

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

10产品 - 图126

你可以先试试,看是否能够自己完成这个函数的添加(注:可以复制到本地改造,完成后再复制上来)。

10产品 - 图127

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

已完成课堂练习

重做 分享 main.py 1 import math 2 3 def myinput(): 4 choice = input(‘请选择计算类型:(1-人力计算,2-工时计算)’) 5 if choice == ‘1’: 6 size = float(input(‘请输入项目大小:(1代表标准大小,请输入小数)’)) 7 number = None 8 time = float(input(‘请输入工时数量:(请输入小数)’)) 9 return size,number,time 10 elif choice == ‘2’: 11 size = float(input(‘请输入项目大小:(1代表标准大小,请输入小数)’)) 12 number = int(input(‘请输入人力数量:(请输入整数)’)) 13 time = None 14 return size,number,time 15 16 def estimated(my_input): 17 size = my_input[0] 18 number = my_input[1] 终端

10产品 - 图128

完成了吗?看下参考代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

10产品 - 图129

你可以运行体验一下:

已完成课堂练习

重做 分享 main.py 1 # 请直接运行并体验代码 2 3 import math 4 5 # 变量key代表循环运行程序的开关 6 key = 1 7 8 # 采集信息的函数 9 def myinput(): 10 choice = input(‘请选择计算类型:(1-工时计算,2-人力计算)’) 11 if choice == ‘1’: 12 size = float(input(‘请输入项目大小:(1代表标准大小,请输入小数)’)) 13 number = int(input(‘请输入人力数量:(请输入整数)’)) 14 time = None 15 return size,number,time 16 # 这里返回的数据是一个元组 17 if choice == ‘2’: 18 size = float(input(‘请输入项目大小:(1代表标准大小,请输入小数)’)) 终端

10产品 - 图130

到这里,这一关就要收尾了。在本关我们模拟了“程序员”接“产品经理”需求的过程,开发出了一个迷你产品“工作量计算器”。同时,我们也对函数知识、解决问题的知识做了复习。最后,还给大家展示了“子函数+主函数”的编程结构。

10产品 - 图131

不过,随着我们编写的代码规模越大,越容易犯错。编程中的报错(俗称bug)让人最为恼火,特别是当程序运行不通过而你又定位不到问题的时候。

10产品 - 图132

下一关,我会给你讲如何调试(debug,即解决bug)的技巧,让头发少掉,让痛苦更轻,也更快过去。

10产品 - 图133

下一关见!
  1. # 工时计算公式
  2. size = 1.5
  3. number = 2
  4. time = size * 80 / number
  5. # 人力计算公式
  6. size = 0.5
  7. time = 20.0
  8. number = size * 80 / time
  1. # 工时计算
  2. def estimated_time(size,number):
  3. ……(计算过程)
  4. # 人力计算
  5. def estimated_number(size,time):
  6. ……(计算过程)
  7. estimated_time(参数1,参数2)
  8. estimated_number(参数1,参数2)
  1. # 工时计算公式
  2. time = size * 80 / number
  3. # 人力计算公式
  4. number = size * 80 / time
  1. # 工作量计算函数
  2. def estimated(参数……):
  3. ……
  4. # 调用工作量计算函数
  5. estimated(参数……)
  1. # 工作量计算函数
  2. def estimated(参数……):
  3. if 条件1:
  4. ……(人力计算)
  5. elif 条件2:
  6. ……(工时计算)
  7. # 调用工作量计算函数
  8. estimated(参数……)
  1. import math
  2. # 为函数设置了三个参数,并都带有默认参数)
  3. def estimated(size=1,number=None,time=None):
  4. # 人力计算:如果参数中填了时间,没填人数,就计算人力
  5. if (number == None) and (time != None):
  6. number = math.ceil(size * 80 / time)
  7. print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number))
  8. # 工时计算:如果参数中填了人数,没填时间,就计算工时
  9. elif (number != None) and (time == None):
  10. time = size * 80 / number
  11. print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
  12. # 调用函数的时候,传递两个参数,会自动计算出第三个参数
  13. estimated(size=1.5,number=2)
  14. estimated(size=0.5,time=20.0)
  1. import math
  2. def estimated(types,size,other):
  3. # 人力计算
  4. if types == 1:
  5. number = math.ceil(size * 80 / other)
  6. print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,other,number))
  7. # 工时计算
  8. elif types == 2:
  9. time = size * 80 / other
  10. print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,other,time))
  11. estimated(1, 1.5, 2)
  12. # 结果:项目大小为1.5个标准项目,如果需要在2.0个工时完成,则需要人力数量为:60人
  13. estimated(2, 1.5, 2)
  14. # 结果:项目大小为1.5个标准项目,使用2个人力完成,则需要工时数量为:60.0个
  1. import math
  2. def estimated(size=1,number=None,time=None):
  3. if (number == None) and (time != None):
  4. number = math.ceil(size * 80 / time)
  5. print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number))
  6. elif (number != None) and (time == None):
  7. time = size * 80 / number
  8. print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
  9. '请选择计算类型:(1-人力计算,2-工时计算)'
  10. '请输入项目大小:(1代表标准大小,可以输入小数)'
  11. '请输入人力数量:(请输入整数)'
  12. '请输入工时数量:(请输入小数)'
  1. def div(num1, num2):
  2. growth = (num1 - num2) / num2
  3. percent = str(growth * 100) + '%'
  4. return percent
  5. def warning():
  6. print('Error: 你确定上个月一毛钱都不赚不亏吗?')
  7. def main():
  8. while True:
  9. num1 = float(input('请输入本月所获利润'))
  10. num2 = float(input('请输入上月所获利润'))
  11. if num2 == 0:
  12. warning()
  13. continue
  14. else:
  15. print('本月的利润增长率:' + div(num1,num2))
  16. break
  17. main()
  1. import math
  2. # 采集信息的函数
  3. def myinput():
  4. choice = input('请选择计算类型:(1-工时计算,2-人力计算)')
  5. if choice == '1':
  6. size = float(input('请输入项目大小:(1代表标准大小,请输入小数)'))
  7. number = int(input('请输入人力数量:(请输入整数)'))
  8. time = None
  9. return size,number,time
  10. # 这里返回的数据是一个元组
  11. if choice == '2':
  12. size = float(input('请输入项目大小:(1代表标准大小,请输入小数)'))
  13. number = None
  14. time = float(input('请输入工时数量:(请输入小数)'))
  15. return size,number,time
  16. # 这里返回的是一个元组
  17. # 完成计算的函数
  18. def estimated(my_input):
  19. # 把元组中的数据取出来
  20. size = my_input[0]
  21. number = my_input[1]
  22. time = my_input[2]
  23. # 人力计算
  24. if (number == None) and (time != None):
  25. number = math.ceil(size * 80 / time)
  26. print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number))
  27. # 工时计算
  28. elif (number != None) and (time == None):
  29. time = size * 80 / number
  30. print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
  31. # 主函数
  32. def main():
  33. my_input = myinput()
  34. estimated(my_input)
  35. # 调用主函数
  36. main()
  1. import math
  2. # 变量key代表循环运行程序的开关
  3. key = 1
  4. # 采集信息的函数
  5. def myinput():
  6. choice = input('请选择计算类型:(1-工时计算,2-人力计算)')
  7. if choice == '1':
  8. size = float(input('请输入项目大小:(1代表标准大小,请输入小数)'))
  9. number = int(input('请输入人力数量:(请输入整数)'))
  10. time = None
  11. return size,number,time
  12. # 这里返回的数据是一个元组
  13. if choice == '2':
  14. size = float(input('请输入项目大小:(1代表标准大小,请输入小数)'))
  15. number = None
  16. time = float(input('请输入工时数量:(请输入小数)'))
  17. return size,number,time
  18. # 这里返回的是一个元组
  19. # 完成计算的函数
  20. def estimated(my_input):
  21. # 把元组中的数据取出来
  22. size = my_input[0]
  23. number = my_input[1]
  24. time = my_input[2]
  25. # 人力计算
  26. if (number == None) and (time != None):
  27. number = math.ceil(size * 80 / time)
  28. print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number))
  29. # 工时计算
  30. elif (number != None) and (time == None):
  31. time = size * 80 / number
  32. print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
  33. # 询问是否继续的函数
  34. def again():
  35. # 声明全局变量key,以便修改该变量
  36. global key
  37. a = input('是否继续计算?继续请输入y,输入其他键将结束程序。')
  38. if a != 'y':
  39. # 如果用户不输入'y',则把key赋值为0
  40. key = 0
  41. # 主函数
  42. def main():
  43. print('欢迎使用工作量计算小程序!')
  44. while key == 1:
  45. my_input = myinput()
  46. estimated(my_input)
  47. again()
  48. print('感谢使用工作量计算小程序!')
  49. main()

end