案例描述
52周存钱法,即52周阶梯式存钱法,是国际上非常流行的存钱方法。
按照52周存钱法,存钱的人必须在一年52周内,每周递周10元
例子:
第一周存10元,第二周存20元,第三周存30元,一直到第52周存520元,这样一年下来会有多少钱呢?
10+20+30+40+…+520 = 13780
项目实现
通过5个课时来编写该程序,在编写代码过程中功能逐渐增加,在编写代码过程中学习新的知识点。
V1.0——使用while循环实现基本功能
代码如下:
def main():
"""
主函数
"""
# 每周存入的金额
money_per_week = 10
# 记录周数
i = 1
# 递增的金额
increase_money = 10
# 总共的周数
total_week = 52
# 账户总计
saving = 0
while i <= total_week:
saving += money_per_week
# 输出信息
print('第{}周,存入{}元,账户累计{}元'.format(i, money_per_week, saving))
# 更新下一周的存钱金额
money_per_week += increase_money
i += 1
if __name__ == '__main__':
main()
V2.0——新增功能:记录每周存入的钱数
使用列表数据结构来存储每周存入的钱数;
使用append()方法,将每周存入的钱数追加到列表中;
导入math库,使用math库中的方法fsum()直接计算列表中元素值得总和。
代码如下:
import math
def main():
"""
主函数
"""
# 每周存入的金额
money_per_week = 10
# 记录周数
i = 1
# 递增的金额
increase_money = 10
# 总共的周数
total_week = 52
# 账户总计
saving = 0
# 定义记录每周存入钱数的列表
money_list = []
while i <= total_week:
money_list.append(money_per_week)
saving = math.fsum(money_list)
# 输出信息
print('第{}周,存入{}元,账户累计{}元'.format(i, money_per_week, saving))
# 更新下一周的存钱金额
money_per_week += increase_money
i += 1
if __name__ == '__main__':
main()
列表和math库的相关内容如下
- 列表(list)是有序的元素集合
- 可通过索引访问单个元素,如l[0],l[-1]
- 可通过区间索引访问子列表内容,如l[1:4],l[4:]
- 列表中每个元素的类型可以不同
操作列表常用方法如下表所示:
| 列表操作符 | 含义 |
|---|---|
| list1 + list2 | 合并(连接)两个列表 |
| list1 * n | 重复n次列表内容 |
| len(list1) | 返回列表长度(元素个数) |
| x in list1 | 检查元素x是否在列表(list1)中 |
| list1.append(x) | 将x添加到列表末尾 |
| list1.sort() | 对列表元素排序 |
| list1.reverse() | 将列表元素逆序 |
| list1.index(x) | 返回第一次出现元素x的索引值 |
| list1.insert(i, x) | 在位置i处插入新元素x |
| list1.count(x) | 返回元素x在列表中的数量 |
| list1.remove(x) | 删除列表中第一次出现的元素x |
| list1.pop(i) | 取出列表中i位置上的元素,并将其删除 |
math库中相关方法如下表:
| 函数 | 含义 |
|---|---|
| math.pi | 圆周率 |
| math.ceil(x) | 对x向上取整 |
| math.floor(x) | 对x向下取整 |
| math.pow(x, y) | x的y次方 |
| math.sqrt(x) | x的平方根 |
| math.fsum(list1) | 对集合内的元素求和 |
| … | … |
更多方法详见python官方网站:https://docs.python.org/3/library/math.html
V3.0——新增功能:使用循环直接计数
使用for循环来直接计数,配合range()方法一起使用
- 使用for语句可以循环遍历整个序列的内容
for < x > in < list1 >:
<body>
- 循环变量x在每次循环时,被赋值成对应的元素内容
- 与while循环的区别
- for循环的次数固定,即所遍历的序列长度
- while为无限循环
- range(n) 返回一个可迭代的对象
- list(range(n))将迭代类型转换为列表类型
for循环的优点:不需要再额外的定义循环变量
代码如下:
import math
def main():
"""
主函数
"""
# 每周存入的金额
money_per_week = 10
# 递增的金额
increase_money = 10
# 总共的周数
total_week = 52
money_list = []
# 使用for循环
for i in range(total_week):
money_list.append(money_per_week)
saving = math.fsum(money_list)
# 输出信息
print('第{}周,存入{}元,账户累计{}元'.format(i + 1, money_per_week, saving))
# 更新下一周的存钱金额
money_per_week += increase_money
if __name__ == '__main__':
main()
V4.0——新增功能:灵活设置每周的存款数,增加的存款数以及存款周数
为了使得该程序具有良好的用户交互性并且实用,用户执行程序后让用户输入每周存款数、每次增加的存款数以及存款总周数,根据用户输入的数据进行计算,获得用户指定存款周数可存款总数。
代码如下:
import math
def save_money_in_n_week(input_str):
"""
计算用户在指定的周内的存钱数
"""
input_list = input_str.split(' ')
try:
# 每周存入的金额
money_per_week = float(input_list[0])
# 递增的金额
increase_money = float(input_list[1])
# 总共的周数
total_week = int(input_list[2])
money_list = []
for i in range(total_week):
money_list.append(money_per_week)
# 更新下一周的存钱金额
money_per_week += increase_money
saving = math.fsum(money_list)
return saving
except TypeError:
print('您输入的内容有误,请重新输入')
except ValueError:
print('请您输入正确的值')
except IndexError:
print('您输入的值过少')
except:
print('程序异常')
def main():
"""
主函数
"""
print('请输入存钱初始值(元),每月递增值(元),存钱周数(周) 以空格分割')
input_str = input()
saving = save_money_in_n_week(input_str)
print('总存款金额', saving)
if __name__ == '__main__':
main()
python中函数的参数传递
- 函数通过参数与调用程序传递信息
- 变量的作用范围
- 局部,函数内的变量作用范围只在函数内
- 全局,函数外的变量,在所有函数中都能使用,global
- 函数的形参只接收实参的值,给形参赋值并不影响实参
V5.0——新增功能:根据用户输入的日期,判断是一年中的第几周,然后输出相应的存款金额
在该版本代码中引入datetime库,使用其中的strptime()方法来将输入的日期字符串解析为datetime;
转换完成的datetime调用isocalendar()获取到用户输入的日期所在周数;
根据周数获取到相应存款总额。
代码如下:
import math
import datetime
def save_money_in_n_week(input_str):
"""
计算用户在指定的周内的存钱数
"""
input_list = input_str.split(' ')
try:
# 每周存入的金额
money_per_week = float(input_list[0])
# 递增的金额
increase_money = float(input_list[1])
# 总共的周数
total_week = int(input_list[2])
money_list = []
saved_money_list = []
for i in range(total_week):
money_list.append(money_per_week)
saving = math.fsum(money_list)
saved_money_list.append(saving)
# 更新下一周的存钱金额
money_per_week += increase_money
return saved_money_list
except TypeError:
print('您输入的内容有误,请重新输入')
except ValueError:
print('请您输入正确的值')
except IndexError:
print('您输入的值过少')
except:
print('程序异常')
def main():
"""
主函数
"""
print('请输入存钱初始值(元),每月递增值(元),存钱周数(周) 以空格分割')
input_str = input()
saved_money_list = save_money_in_n_week(input_str)
# 输入格式为yyyy/mm/dd的日期
input_date_str = input('请输入日期(yyyy/mm/dd):')
# 使用datetime库中的函数将输入的字符串格式的日期转换为日期格式
input_date = datetime.datetime.strptime(input_date_str, '%Y/%m/%d')
# 使用isocalendar()函数获取到用户输入的日期是哪一周
week_num = input_date.isocalendar()[1]
try:
print('第{}周的总存款:{}元'.format(week_num, saved_money_list[week_num - 1]))
except IndexError:
print('您输入的日期所在周超过了总的存款周数,请输入正确的值')
if __name__ == '__main__':
main()
datetime库简单介绍
- 处理时间的标准函数库datetime
- datetime.now()获取当前日期和时间
- 字符串 --> datetime
- datetime.strptime(),解析时间字符串为datetime类型
- datetime --> 字符串
- datetime.strftime(),格式化datetime为字符串显示
- isocalendar()返回年,周数以及周几
版权声明:本文为demo_Tong原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。