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

去社区提问

简介:本节课我们将完成5.0版本的周存钱挑战小程序,为它增加输入日期自动判断的新功能。

案例描述

又见面啦~

今天是存钱挑战案例的最后一小节课程。我们要继续给程序增加新功能,使它可以根据用户输入的日期,自动判断出是一年中的第几周,然后输出相应存款金额。

好了,话不多说,赶快进入案例分析时间吧。

案例分析

实现这个小目标需要分两个步骤:

  1. 判断用户输入的日期是一年中的第几周。
  2. 根据周数得到存钱金额。

于是我们开动机智的小脑瓜,步骤1的问题解决起来好像有些复杂,年份分为平年闰年,每个月的天数不同,要根据输入的日期判断周数貌似暂时没有比较简单的解决思路。

相比之下,步骤2就显得十分简单。之前我们介绍过列表的相关知识,每周的存款金额可以存放在列表中,直接从列表中提取相关数据就可以了。

不如我们先把简单的步骤解决,再花时间处理复杂的要求(战术性迂回前进)。

先来回顾一下上节课的代码:

  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)

列表money_list[]中记录了每周存款数,例如以第一周10元,每周递增10元的方式攒钱5周,money_list中的信息如下:

这时候如果我们想知道第二周存入了多少钱,只需要取出列表中的第二个元素。

同样地,每周的累计金额也可以存储在列表中,这样当我们需要查看金额时,就能访问列表中的元素得到结果。

定义一个列表saved_money_list,用来存储每周累计金额。

  1. saved_money_list=[]

变量saving在循环中经过一次次累加,得到最终存钱总数。在循环中把它的值添加到刚才创建的列表saved_money_list,就可以记录每周的存款金额。

把相应的代码添加到函数中,这时候返回值应该是记录账户累计的列表。

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

主程序还需要用户提供‘查看第几周累计金额’的信息,根据这个信息从列表中访问元素,打印出结果。

用变量week_num接收用户输入的信息,周数应该是整型数据,别忘记对它类型转换:

  1. week_num = int(input('请问您想查看第几周的账户累计金额?'))

我们通过索引的方式访问列表中的元素,列表的索引值从0开始

获取第1周存款累计金额,列表访问元素索引值:0

获取第2周存款累计金额,列表访问元素索引值:1

获取第3周存款累计金额,列表访问元素索引值:2

……

找到规律了吗~周数week_num-1就是列表中对应周数累计金额的索引值。saved_money_list[week_num-1]获取元素。

用格式化输出的方法打印结果:

  1. print('第{}周的存款:{}元'.format(week_num, saved_money_list[week_num - 1]))

把代码补充完整,运行看看效果:

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

恭喜大家取得了阶段性胜利,撒花庆祝~(虽然下面还有更严峻的考验在等着我们)

如何根据用户输入的日期,判断这个日期是一年中的第几周?

要像课程开始说的,先根据年份判断平年闰年,再把不同月份的天数加在一起,最后计算出周数…这么复杂的一系列操作又要多出几十行代码。

现在就不得不提到Python神通广大的模块了。我们不止一次讲过Python的优点之一在于它有丰富的模块,可以帮助我们解决各种各样的问题。

处理时间的标准函数库datetime就是我们今天要认识的新朋友。

datetime.now()方法可以获取当前日期和时间,使用之前还是别忘记要用一行import导入模块:

  1. import datetime
  2. datetime.datetime.now()

就是这么简单方便~程序为我们获取了当下的时间。使用type()来查看一下数据的类型:

代码练习:

编程区

  1. print(type(datetime.datetime.now()))

终端区

用户输入要用到input()函数,输入的数据是字符串类型,需要把字符串类型的数据转换为datetime标准格式,方便后续获取周数信息。

解析时间类型的字符串,可以使用datetime.strptime()方法。

但是时间输入有很多格式,例如常见的有:2021/02/03或者2021-02-03。

我们可以在datetime.strptime()的参数中告诉程序,应该按照哪种格式来解析字符串。

datetime.strtime()有两个参数,第一个参数是待解析字符串,第二个参数是字符串格式。来看个简单的例子:

  1. input_date_str = input('请输入日期(yyyy/mm/dd):')
  2. input_date = datetime.datetime.strptime(input_date_str, '%Y/%m/%d')

年月日之间用/分隔,大写Y代表年份用4位数字表示,如果写为%y/%m/%d,则年份用两位数字表示。

  1. input_date_str = input('请输入日期(yy/mm/dd):')
  2. input_date = datetime.datetime.strptime(input_date_str, '%y/%m/%d')

请你思考,如果用户输入2021-02-03的日期格式,应该怎么书写呢?

  1. input_date_str = input('请输入日期(yy-mm-dd):')
  2. input_date = datetime.datetime.strptime(input_date_str, '%y-%m-%d')

相信你一定答对了~下面我们就能用标准格式的时间来获取周数。

用到的是isocalander()方法:

代码练习:

编程区

  1. import datetime
  2. date_str = '2021/02/03'
  3. input_date = datetime.datetime.strptime(date_str, '%Y/%m/%d')
  4. # 打印结果
  5. print(input_date.isocalendar())

终端区

isocalendar()方法,返回了三个值,分别代表年份、周数、星期几。但在案例中我们只需要其中的周数信息,如何把它提取出来呢?

周数在返回值的第二个位置上,索引值从0开始,索引值1就能获取第二个位置上的内容:

  1. import datetime
  2. date_str = '2021/02/03'
  3. input_date = datetime.datetime.strptime(date_str, '%Y/%m/%d')
  4. week_num = input_date.isocalendar()[1]

把代码补充进程序中~运行查看结果:

  1. import math
  2. import datetime
  3. def save_money_in_n_weeks(money_per_week, increase_money, total_week):
  4. """
  5. 计算n周内的存款金额
  6. """
  7. money_list = [] # 记录每周存款数的列表
  8. saved_money_list = [] # 记录每周账户累计
  9. for i in range(total_week):
  10. money_list.append(money_per_week)
  11. saving = math.fsum(money_list)
  12. saved_money_list.append(saving)
  13. # 输出信息
  14. # print('第{}周,存入{}元,账户累计{}元'.format(i + 1, money_per_week, saving))
  15. # 更新下一周的存钱金额
  16. money_per_week += increase_money
  17. return saved_money_list
  18. money_per_week = float(input('请输入每周的存入的金额:')) # 每周的存入的金额
  19. increase_money = float(input('请输入每周的递增金额:')) # 递增的金额
  20. total_week = int(input('请输入总共的周数:')) # 总共的周数
  21. # 调用函数
  22. saved_money_list = save_money_in_n_weeks(money_per_week, increase_money, total_week)
  23. input_date_str = input('请输入日期(yyyy/mm/dd):')
  24. input_date = datetime.datetime.strptime(input_date_str, '%Y/%m/%d')
  25. week_num = input_date.isocalendar()[1]
  26. print('第{}周的存款:{}元'.format(week_num, saved_money_list[week_num - 1]))
本关总结

到这里我们就完成了52周存钱挑战的全部课程~下面一起来回顾一下今天的重点吧。

datetime:处理时间的标准函数库

datetime.now()获取当前日期和时间

字符串->datetime

datetime.strptime() 解析时间字符串

isocalendar()返回年,周数,星期几

下节预告

恭喜你完成了52周存钱挑战的案例学习~通过这个例子我们学会了很多Python语法知识,我为你做了一个小结:

从下节课开始我们将进入更加有趣的全新案例!

除了列表外,Python中还有哪些操作可以处理组合数据?

它们之间的区别与联系是什么?

下节课为你揭晓~

想获取课程资料,与更多同学一起交流学习,欢迎扫描二维码添加班主任老师微信,我们下节课再见!

扫描二维码添加班主任

已经添加班主任的同学无需重复扫码,直接联系对应老师就可以哦。

52周存钱挑战 1/3

52周存钱挑战(5)

1.0x

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

行动力超过

累计学习

学习下一课时