52周存钱挑战/52周存钱挑战(4)

去社区提问

简介:52周存钱挑战4.0版本,让程序实现的功能更加丰富和符合实际应用场景。

案例描述

又见面啦~欢迎来到今天的课堂。

这节课请你跟我一起完成52周存钱挑战4.0版本。在实际使用过程中,用户可能会有不同的需求。

比如二丫希望快速攒够出去旅游的钱,愿意牺牲最近几次聚餐和买口红衣服的开销,决定第一周攒800元,每周递增100元,共用五周攒够旅游经费。

还有些同学属于细水长流的类型,比如胖虎同学的计划是每周攒5元,再以每周递增5元的方式存钱60周。

为了满足用户的不同需求,在这个版本中,存钱挑战小程序将可以灵活设置每周存款数、增加的存款数以及存款周数。

案例分析

话不多说现在开始行动~

先提一个小问题:Python中实现输入功能的方法是什么?

input()函数是连接现实世界和代码世界的大门,括号中需要输入提示语,提醒用户输入相关信息:

  1. money_per_week = input('请输入每周存入的金额:')
  2. increase_money = input('请输入每周的递增金额:')
  3. total_week = input('请输入总共的周数:')

由于input()函数输入的内容都是字符串类型,但金额和周数信息都应该是数字类型,所以还需要对输入的变量进行类型转换:

  1. money_per_week = float(input('请输入每周存入的金额:'))
  2. increase_money = float(input('请输入每周的递增金额:'))
  3. total_week = int(input('请输入总共的周数:'))

用上面的三行代码替换原本的变量定义,就能实现用户自由设置存款计划的要求了~

下面来运行这段代码看看结果:

  1. # 导入模块
  2. import math
  3. money_per_week = float(input('请输入每周存入的金额:'))
  4. increase_money = float(input('请输入每周的递增金额:'))
  5. total_week = int(input('请输入总共的周数:'))
  6. saving = 0 # 账户累计
  7. money_list = [] # 记录每周存款数的列表
  8. for week in range(total_week):
  9. # 向列表添加元素
  10. money_list.append(money_per_week)
  11. #存钱操作
  12. saving = math.fsum(money_list)
  13. # 输出信息
  14. print('第{}周,存入{}元,账户累计{}元'.format(week+1, money_per_week, saving))
  15. # 更新下一周的存钱金额
  16. money_per_week += increase_money

现在我们程序的功能就比以前更加灵活了,支持用户定制自己的攒钱计划。完成任务,可以下课了!~

下课怎么可能来的这么快?小板凳坐稳,还有下一项任务等着你。

还记得我们在之前课程讲过函数的概念吗?它可以把一系列完成同一任务的代码集合起来,包装成一个整体,在需要时随时取出来使用。

就好像炒菜用的‘宫保鸡丁调料包’、‘鱼香肉丝调料包’,从外部看起来你只知道它的功能是做宫保鸡丁,使用者可以不用了解其中糖盐等调料的具体占比是多少。

知道功能—->拿来使用,就成功了~

在这个案例中,我们可以把繁杂的计算存款金额这一步封装成函数。先来复习一下定义函数的基本语法:

函数包含了几个重点内容,分别是:函数名、参数列表、函数体、返回值列表。

我们定义函数save_money_in_n_weeks,用来计算n周内的存款金额;

参数列表是计算过程所用到的变量,当然需要包含‘每周存入金额’、‘递增金额’、‘总周数’这三项必要信息。

  1. def save_money_in_n_weeks(money_per_week,increase_money,total_week):

函数体中就是函数所执行的具体操作了,我们可以偷个小懒,从之前的代码中提取出计算存款金额的部分放进函数体。

  1. def save_money_in_n_weeks(money_per_week,increase_money,total_week):
  2. """
  3. 计算n周内的存款金额
  4. """
  5. money_list = [] # 记录每周存款数的列表
  6. for i in range(total_week):
  7. money_list.append(money_per_week)
  8. saving = math.fsum(money_list)
  9. # 输出信息
  10. print('第{}周,存入{}元,账户累计{}元'.format(i + 1, money_per_week, saving))
  11. # 更新下一周的存钱金额
  12. money_per_week += increase_money

利用return语句将计算出的存钱金额saving做为返回值返回给主函数。

  1. def save_money_in_n_weeks(money_per_week,increase_money,total_week):
  2. """
  3. 计算n周内的存款金额
  4. """
  5. money_list = [] # 记录每周存款数的列表
  6. for i in range(total_week):
  7. money_list.append(money_per_week)
  8. saving = math.fsum(money_list)
  9. # 输出信息
  10. print('第{}周,存入{}元,账户累计{}元'.format(i + 1, money_per_week, saving))
  11. # 更新下一周的存钱金额
  12. money_per_week += increase_money
  13. return saving

这样我们就完成了函数的定义。

函数的调用就更简单了,直接写函数名和括号中的参数就可以啦~

下面我们把用户输入和函数调用的代码补充完毕再来运行程序查看结果:

  1. import math
  2. def save_money_in_n_weeks(money_per_week, increase_money, total_week):
  3. """
  4. 计算n周内的存款金额
  5. """
  6. money_list = [] # 记录每周存款数的列表
  7. for i in range(total_week):
  8. money_list.append(money_per_week)
  9. saving = math.fsum(money_list)
  10. # 输出信息
  11. print('第{}周,存入{}元,账户累计{}元'.format(i + 1, money_per_week, saving))
  12. # 更新下一周的存钱金额
  13. money_per_week += increase_money
  14. return saving
  15. money_per_week = float(input('请输入每周的存入的金额:')) # 每周的存入的金额
  16. increase_money = float(input('请输入每周的递增金额:')) # 递增的金额
  17. total_week = int(input('请输入总共的周数:')) # 总共的周数
  18. # 调用函数
  19. saving = save_money_in_n_weeks(money_per_week, increase_money, total_week)
  20. print('总存款金额', saving)

函数通过参数与调用程序传递信息,为了让思路更清晰,我再来带你梳理一下程序的执行过程。

  • 程序正常执行用户输入功能的代码,遇到函数调用暂停
  • 程序将参数传递给函数的参数
  • 执行函数体
  • 返回函数结果,回到调用处继续执行

下面有个小问题考考你,下面这段代码的运行结果是什么?

  1. def f(a,b):
  2. c=a+b
  3. a=1
  4. b=2
  5. c=0
  6. f(a,b)
  7. print(c)

有些同学可能会脱口而出,不就是3吗,这么简单的问题!现在请你点击‘运行’键,看看结果究竟是什么:

代码练习:

编程区

  1. def f(a,b):
  2. c=a+b
  3. a=1
  4. b=2
  5. c=0
  6. f(a,b)
  7. print(c)

终端区

惊奇地发现答案居然是0。这…这这是怎么回事?

这里就引出了一个重要的知识,那就是变量的作用范围

函数内的变量作用范围只在函数内部。就好像穿水晶鞋的灰姑娘,只有12点前才能拥有马车、华丽的礼服,而到了12点这一切就都消失不见了。

同样,函数内的变量只有在函数体里面说话才算数,离开了函数就相当于灰姑娘故事里的时钟走到了午夜12点,一切美好都会华丽丽地消失~

  1. def f(a,b):
  2. c=a+b
  3. a=1
  4. b=2
  5. c=0
  6. f(a,b)
  7. print(c)

这段代码中在执行函数前定义了变量c=0;当执行到函数f时,函数体内又定义了一个变量c,它的值等于两个参数的和。

这两个c就是班里两个重名的同学,虽然名字相同但却是截然不同的两个个体。我们姑且称函数体内的c为小c,外部的为大c。

当执行完函数体中的代码时,函数内的小c就被敲响了12点的钟声,烟消云散了,只留下一开始定义的大c独自美丽。

因此最后执行print(c)时,会得到结果0。

在这里我们就称只作用在函数内部的变量为局部变量

与之对应的还有全局变量的概念,它是指函数外,在所有函数中都能使用的变量,我们来看一个例子:

代码练习:

编程区

  1. def f(a,b):
  2. global c
  3. c = a+b
  4. a=1
  5. b=2
  6. c=0
  7. f(a,b)
  8. print(c)

终端区

这次的变量c依然定义在函数之外,是一个全局变量,在函数中想要使用它的时候,要记得写上关键字global。这样一来我们就可以在函数内直接操作c,函数体内外的c就是同一个变量。

下面我们来做一个小练习,思考下面这段代码的运行结果:

代码练习:

编程区

  1. def ave_grade(math,chinese,english):
  2. global grade
  3. grade = (math+chinese+english)/3
  4. name = '小明'
  5. math = 99
  6. chinese = 98
  7. english = 97
  8. grade = 60
  9. ave_grade(math,chinese,english)
  10. # 打印结果
  11. print('{}的平均分是{}'.format(name,grade))

终端区

这里的变量grade也是一个全局变量,计算平均分的函数中用global声明后,这个函数就拥有了grade的使用权,可以操控和改变它了~

本关总结
  • input()函数 变量类型转换

input()函数实现人机交互,输入的内容为字符串类型。

字符串类型转换:

int()整型

float()浮点型

  • 变量的作用范围

局部,函数内的变量作用范围只在函数内部

全局,函数外的变量,在所有函数中都能使用,global关键字。

下节预告

下节课程是52周存钱挑战的最后一关内容,我们将实现的功能是:根据用户输入的日期,判断出是一年中的第几周,然后输出相应的存款金额。

我会为你介绍新的Python模块~用来处理时间数据,记得准时围观哦。

想获取课程资料和更多朋友一起交流学习,欢迎添加班主任微信,我们下节课不见不散~

扫描二维码添加班主任

52周存钱挑战 1/3

52周存钱挑战(4)

1.0x

恭喜完成本课时的学习!
坚持学习

行动力超过

累计学习

学习下一课时