案例4——52周存钱挑战

案例描述

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版权协议,转载请附上原文出处链接和本声明。