5. python练习题5-存款、收益率计算

news2024/11/28 22:50:05

5. python练习题5-存款、收益率计算

【目录】

文章目录

  • 5. python练习题5-存款、收益率计算
    • 1. 目标任务
    • 2. 解题思路
    • 3. 知识回顾
      • 3.1 Python赋值运算符
      • 3.2 列表的append函数
      • 3.3 round()函数—保留小数点位数
      • 3.4 `f`格式化字符串
      • 3.5 列表求和方法
    • 4. 程序代码
      • 4.1 使用循环结构实现
      • 4.2 使用函数递归调用实现

【正文】

1. 目标任务

假设每月存100元到一个年利率为6%的储蓄账户。

即月利率=0.06/12=0.005。

第一个月后,账户的存款金额为:100*(1+0.005)=100.5

第二个月后,账户的存款金额为:(100+100.5)*(1+0.005)=201.5025

第三个月后,账户的存款金额为:(100+201.5025)*(1+0.005)=303.01001

请编写程序计算:

5个月后,该储蓄账户的存款金额是多少,要求保留5位小数。

计算总体收益相对总体本金的收益率(此收益率值:总收益/总本金),要求以百分数形式显示,保留2位小数。

2. 解题思路

每个月的账户存款金额以及收益率的计算方法题目已经说得很清楚了。

根据题目要求,我们需要设置一些相关的变量:

  1. total_deposit:账户存款总额 初始化为0
  2. wage:每个月打进去的金额=100
  3. monthly_rate:月利率=0.005
  4. month_num:总月份数量=5
  5. rate:收益率

总共求5个月后的数据,而每个月的计算模式都是一样的,因此必然需要一个循环迭代的过程。

最后的收益率计算,总体本金很简单,就是5个月打入的资金总额,也即100*5=500元。

而总体收益为每个月利息的总和,每一轮迭代,能求得每个月的利息。

由于每个月的利息是变动的,因此,我们还需要提供一个变量来存储每个月的月利息数据

这个变量可以设置为一个浮点数,在每轮迭代中自加该月利息;

也可以设置为一个列表,在每轮迭代中把该月利息追加进去,最后把列表求和,即:

  1. income:每个月累计利息 初始化为0; 或:
    income_list:存放每个月利息的列表 初始化为空列表[ ]

由于每个月的计算模式都是一样的,因此,我们可以使用循环结构(for循环或while循环),或者函数递归调用的方式来实现这个循环迭代的过程。

在使用函数递归调用方式情况下,还需要预先设置正在迭代第几次的变量i,即:

  1. i:正在迭代第几次 初始化为0

3. 知识回顾

3.1 Python赋值运算符

在这里插入图片描述

上图列出了python所有赋值运算符及其实例,

本例中我们将用到其中的加法赋值运算符:+=,

包括存款金额的自加、月份的自加,以及月利息的自加。

【代码示例】

sum = 0 
sum = sum + 2
print(sum)

【终端输出】

2

【+=代码示例】

sum = 0 
sum += 2
print(sum)

【终端输出】

2

sum = sum + 2 等同于 sum +=2

赋值运算符能使代码更简洁。

写法就是省略一个sum,并把赋值运算符(加减乘除等)移动等号的左边。

3.2 列表的append函数

列表的append( )函数的作用是向列表的末尾添加元素。

【语法】

列表名.append(要增加的元素)

在这里插入图片描述

【代码示例】

# 向列表的末尾添加元素

# 创建列表 name_list
name_list = ['张三', '李四']

# 用 append() 给列表 name_list 添加一个元素 '王五'
# 列表名.append(要增加的元素)
name_list.append('王五')

# 输出 name_list 列表
print(name_list)

【终端输出】

['张三', '李四', '王五']

3.3 round()函数—保留小数点位数

round函数用于设置保留小数点位数,并返回相应的四舍五入的值。

【语法】

round(要格式化的数,保留的小数位数)

保留的小数位数是可选参数,如果没有设置,则四舍五入取值,返回的是整数。

【代码示例】

# 保留3位小数

print(round(3.1415926, 3))

【终端输出】

3.142

3.4 f格式化字符串

【代码示例】

# f格式化字符串

name = "安迪"
city = "云南"
school = "复旦大学"
print(f"大家好,我叫{name},来自{city},毕业于{school}!")

【终端输出】

大家好,我叫安迪,来自云南,毕业于复旦大学!

【编写思路】

  1. 我们要输出的内容是:大家好,我叫安迪,来自云南,毕业于复旦大学!

  2. 把要格式化的内容用英文大括号加变量名{变量名}替换:

    安迪替换为大括号加变量名{name}。

    云南替换为大括号加变量名{city}。

    复旦大学替换为大括号加变量名{school}。

    格式化模板为:“大家好,我叫{name},来自{city},毕业于{school}!”

  3. 添加格式化符号f。

53.Python的f格式化字符串

3.5 列表求和方法

【使用sum()函数】

list1 = [1, 2, 3, 4, 5]
sum_result = sum(list1)
print(sum_result) # 输出:15

【终端输出】

15

【使用循环遍历列表并累加】

list2 = [1, 2, 3, 4, 5]
sum_result = 0
for num in list2:
    sum_result += num
print(sum_result) # 输出:15

【终端输出】

15

4. 程序代码

4.1 使用循环结构实现

【代码示例】

# 初始化账户存款金额变量为0
total_deposit=0

# 设置每月打入金额变量为100
wage=100

# 设置每月利率为0.005
monthly_rate=0.005

# 设置总月份数为5
month_num=5

# 初始化利息总数为0
income=0

# 设置for循环,循环次数为总月份数
for i in range(month_num):

    # 存款金额在现有总数上加上每月打入金额
    total_deposit += wage

    # 计算本月利息
    monthly_income=total_deposit*monthly_rate

    # 利息总数加上本月利息
    income+=monthly_income

    # 存款金额再加上本月利息
    total_deposit+=monthly_income

# 计算最后的总收益率,以百分数形式显示,保留2位小数
rate=f'{round(income/(5*wage)*100,2)}%'

# 打印最后的存款金额
print(f'{month_num}个月后账户的存款金额:{round(total_deposit,5)}元')

# 打印收益率
print(f'收益率:{rate}')

【终端输出】

5个月后账户的存款金额:507.55019元
收益率:1.51%

【解析】

这里采用一个浮点数变量income来存放利息总数,相应的在循环体中就需要将其自加赋值。

用保留2位小数的百分数形式显示收益率时,需要在计算得到的收益率基础上乘以100,

再使用round()函数将其保留2位小数,最后拼接上一个%字符。

我们也可以使用列表来存放每月利息的:

【代码示例】

# 初始化账户存款金额变量为0
total_deposit=0

# 设置每月打入金额变量为100
wage=100

# 设置每月利率为0.005
monthly_rate=0.005

# 设置总月份数为5
month_num=5

# 初始化每月利息存放列表为空[]
income_list=[]

# 设置for循环,循环次数为总月份数
for i in range(month_num):

    # 存款金额在现有总数上加上每月打入金额
    total_deposit += wage

    # 计算本月利息
    monthly_income=total_deposit*monthly_rate

    # 把本月利息追加进存放月利息的列表income_list
    income_list.append(monthly_income)

    # 存款金额再加上本月利息
    total_deposit+=monthly_income

# 计算最后的总收益率,以百分数形式显示,保留2位小数
rate=f'{round(sum(income_list)/(5*wage)*100, 2)}%'

# 打印最后的存款金额
print(f'{month_num}个月后账户的存款金额:{round(total_deposit,5)}元')

# 打印收益率
print(f'收益率:{rate}')

【终端输出】

5个月后账户的存款金额:507.55019元
收益率:1.51%

5个月后账户的存款金额:507.55019元

收益率:1.51%

【解析】

这里采用一个列表income_list来存放每月利息,

相应的在循环体中需要对其使用append()方法把该月利息追加进列表,

最后在计算收益率时还需要使用sum()函数对列表元素求和得到利息总数。

4.2 使用函数递归调用实现

每月的数据计算都遵循相似的模式,因此,可以考虑使用函数递归调用的方式来解决问题。

递归函数知识可参考如下链接:
58.Python的递归函数

在使用函数递归调用方法时,需要注意以下几点:

  1. 递归函数体中的代码需要满足程序逐层级深入的循环往复调用要求,能解决每一层级的问题需求。

  2. 递归函数体中提供往下级继续调用的,必须是该递归函数本身。

  3. 递归函数的参数设置和传递的合理准确是递归调用成功的关键。

  4. 递归函数体中必须设置停止、退出函数调用的正确且有效的条件,否则很可能导致无限调用使程序崩溃的情况。

  5. 初始调用时若需要获取函数的最终返回值,则必须保证每一层级都能准确返回数据给上一层调用。

【代码示例】

# 初始化账户存款金额变量为0
total_deposit=0

# 设置每月打入金额变量为100
wage=100

# 设置每月利率为0.005
monthly_rate=0.005

# 设置总月份数为5
month_num=5

# 初始化每月利息存放列表为空[]
income_list=[]

# 设置正在迭代第几次,初始化为0
i = 0

# 设置递归函数,参数为迭代次数
def caculate(i):

    # 当在函数内部用自加方式修改全局变量时,需要用gloabal进行声明
    global total_deposit

    # 当i达到设定的总月份数时,终止函数调用
    if i==month_num:

        # 必须返回
        return

    # 存款金额在现有总数上加上每月打入金额
    total_deposit += wage

    # 计算本月利息
    monthly_income=total_deposit*monthly_rate

    # 把本月利息追加进存放月利息的列表income_list
    income_list.append(monthly_income)

    # 存款金额再加上本月利息
    total_deposit+=monthly_income

    # 迭代次数加1
    i+=1

    # 进行下一轮函数调用,把更新的迭代次数传入
    caculate(i)

# 调用递归函数
caculate(i)

# 计算最后的总收益率,以百分数形式显示,保留2位小数
rate=f'{round(sum(income_list)/(5*wage)*100,2)}%'

# 打印最后的存款金额
print(f'{month_num}个月后账户的存款金额:{round(total_deposit,5)}元')

# 打印收益率
print(f'收益率:{rate}')

【终端输出】

5个月后账户的存款金额:507.55019元
收益率:1.51%

【解析】

这里我们创建了一个进行每月数据计算的递归函数caculate,参数为每轮迭代的次数。

存款金额total_deposit是一个浮点数据类型的全局变量,

因此在函数中修改其值时,需要先在函数中使用global语句进行声明。

注意,尽管存放月利息的列表income_list同样也是全局变量,也在函数中修改了数据,

但由于作为可变数据类型的列表,其append()方法是直接在原列表追加元素而没有新建列表,

income_list变量的内存地址并没有发生变化,因此不需要做global语句的声明。

另外,由于一开始的i值只是作为参数把值传入递归函数,

而函数中的i则是函数的局部变量,在递归调用之间进行传递,

并非作为全局变量的一开始的i变量,自然也无需global语句声明。

递归函数体中提供了终止函数调用的判断条件if i==month_num,满足该条件时return返回,

这样将能有效的终止函数调用,避免出现无限调用使程序崩溃的情况。

我们也可以采用不设置total_deposit为全局变量,而把它作为参数传递给递归函数,

这样将能避免使用global语句声明:

【代码示例】

# 初始化账户存款金额变量为0
total_deposit=0

# 设置每月打入金额变量为100
wage=100

# 设置每月利率为0.005
monthly_rate=0.005

# 设置总月份数为5
month_num=5

# 初始化每月利息存放列表为空[]
income_list=[]

# 设置正在迭代第几次,初始化为0
i=0

# 设置递归函数,参数为迭代次数和存款金额
def caculate(i,total_deposit_):

    # 当i达到设定的总月份数时,终止函数调用
    if i==month_num:

        # 计算最后的总收益率,以百分数形式显示,保留2位小数
        rate = f'{round(sum(income_list) / (5 * wage) * 100, 2)}%'

        # 打印最后的存款金额
        print(f'{month_num}个月后账户的存款金额:{round(total_deposit_, 5)}元')

        # 打印收益率
        print(f'收益率:{rate}')

        # 必须返回
        return

    # 存款金额在现有总数上加上每月打入金额
    total_deposit_ += wage

    # 计算本月利息
    monthly_income=total_deposit_*monthly_rate

    # 把本月利息追加进存放月利息的列表income_list
    income_list.append(monthly_income)

    # 存款金额再加上本月利息
    total_deposit_+=monthly_income

    # 迭代次数加1
    i+=1

    # 进行下一轮函数调用,把更新的迭代次数和当前存款金额传入
    caculate(i,total_deposit_)

# 调用递归函数
caculate(i,total_deposit)

【终端输出】

5个月后账户的存款金额:507.55019元
收益率:1.51%

【解析】

可以看到,我们把最后打印输出的语句调整到函数体之中当满足终止调用条件的时候来执行,

同时函数中的total_deposit替换成了total_deposit_(在最后加了一个下划线字符),

改名并不是必需的,只是为了更清晰的与total_deposit变量来做区分,

total_deposit始终都是作为一个全局变量的存在,只不过在最初始调用时将其值传入递归函数而已。

而total_deposit_作为函数的参数,在函数之间的递归调用过程中始终是函数的一个局部变量,

其值的变化并不会影响total_deposit全局变量的值。

那么假如我们仍然把打印输出存款金额的语句放到程序末尾的话,将打印出total_deposit一直固定不变的初始值0。

有同学可能会问,如果一定要在最后打印输出呢?

实际上这个问题的本质,就是在最开始调用递归函数时需要获取调用最终返回的数据,

那怎么实现呢?我们可以看看应该如何修改上面的代码:

【代码示例】

# 初始化账户存款金额变量为0
total_deposit=0

# 设置每月打入金额变量为100
wage=100

# 设置每月利率为0.005
monthly_rate=0.005

# 设置总月份数为5
month_num=5

# 初始化每月利息存放列表为空[]
income_list=[]

# 设置正在迭代第几次,初始化为0
i=0

# 设置递归函数,参数为迭代次数和存款金额
def caculate(i,total_deposit_):

    # 当i达到设定的总月份数时,终止函数调用
    if i==month_num:

        # 同时必须返回此时的迭代次数和存款金额的值
        return i,total_deposit_

    # 存款金额在现有总数上加上每月打入金额
    total_deposit_ += wage

    # 计算本月利息
    monthly_income=total_deposit_*monthly_rate

    # 把本月利息追加进存放月利息的列表income_list
    income_list.append(monthly_income)

    # 存款金额再加上本月利息
    total_deposit_+=monthly_income

    # 迭代次数加1
    i+=1

    # 进行下一轮函数调用,把更新的迭代次数和当前存款金额传入
    # 同时把下一轮函数返回的数据返回给上一层调用
    return caculate(i,total_deposit_)

# 调用递归函数,并用i,total_deposit两个变量来接收调用最终返回的数据
i,total_deposit=caculate(i,total_deposit)

# 计算最后的总收益率,以百分数形式显示,保留2位小数
rate = f'{round(sum(income_list) / (5 * wage) * 100, 2)}%'

# 打印最后的存款金额
print(f'{month_num}个月后账户的存款金额:{round(total_deposit, 5)}元')

# 打印收益率
print(f'收益率:{rate}')

【终端输出】

5个月后账户的存款金额:507.55019元
收益率:1.51%

【解析】

我们在前面说明函数递归调用所需要注意的几点,其中最后一点就是:

  1. 初始调用时若需要获取函数的最终返回值,则必须保证每一层级都能准确返回数据给上一层调用。

在上一个例子当中,当满足终止调用的条件时,我们只是做了简单的return,

这样只是返回到上层调用,只起到了终止继续调用的作用,而并没有把执行结果数据进行返回。

在这个例子中,我们除了终止调用之外,还向上层调用返回了调用结束时我们所需要的数据,

另外,每轮的调用也都需要往上层返回结果数据,因此,进行下一轮调用的语句需要在前面加上return进行返回。

就像剥洋葱一样一层层剥开,又一层层合上。

到了最后,我们必须要用两个变量来接收调用最终返回的两个数据,才能在函数外部的代码末尾正确打印输出。

这是正确使用递归函数所特别要注意的地方!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1577628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【强化学习的数学原理-赵世钰】课程笔记(二)贝尔曼公式

【强化学习的数学原理-赵世钰】课程笔记(二)贝尔曼公式 一. 内容概述 1. 第二章主要有两个内容 (1)一个核心概念:状态值(state value):从一个状态出发,沿着一个策略我…

linux安装dubboAdmin

1.环境准备: jdk-8u391-linux-x64apache-maven-3.9.6apache-tomcat-8.5.100 2.安装注册中心zookeeper zookeeper的安装看我的另一篇文章,安装完成后保持启动状态 linux安装Zookeeper的详细步骤-CSDN博客 3.安装dubboadmin 源码下载地址:R…

隔离放大器 分类 及说明

无源传感器隔离配电及信号采集传输 ●前置放大、电桥等电路配置电源方便采集信号 ●PLC、DCS现场模拟信号隔离、采集 ●直流电流/电压信号的隔离、转换及放大 ●模拟信号地线干扰抑制及数据隔离、采集 ●工业现场信号隔离及长线传输 ●仪器仪表与传感器信号收发 ●电力监控、医…

【Django开发】0到1美多商城项目md教程第6篇:账号登录,1. 用户名登录逻辑分析【附代码文档】

美多商城完整教程(附代码资料)主要内容讲述:欢迎来到美多商城!,项目准备。展示用户注册页面,创建用户模块子应用。用户注册业务实现,用户注册前端逻辑。图形验证码,图形验证码接口设…

Windows:IntelliJ IDEA Ultimate 安装 PHP 插件

在 IntelliJ IDEA Ultimate 中安装 PHP 插件,支持PHP开发调试 首先,进入File > Setting: 再次选择Plugins,然后选择上面的 Marketplace。 在搜索栏中输入 PHP,然后单击左侧的 Install 进行安装就可以了。 安装成功…

SD-WAN组成及关键技术解析

云桥通SD-WAN作为下一代网络连接技术,由控制平面、数据平面和管理平面三部分组成,共同构建了灵活、可管理和高效的网络架构。 1、控制平面: 控制平面负责决策制定和流量管理,在云桥通SD-WAN网络中扮演关键角色。基于软件定义网络…

转圈游戏——快速幂

目录 题目 思路 代码 题目 思路 每个小朋友移动一次的位置为,移动 q 次的位置则为。那么题目要求移动 ,最后的位置为 。 但 的范围是,而总的移动次数是 。时间复杂度是在,因此是一定不能硬算的,肯定会超时。那么该…

【架构七】Hadoop

什么是Hadoop? Hadoop是一个存储系统计算框架的软件大数据处理框架。 Hadoop的核心,说白了就是HDFS和MapReduce,HDFS为海量数据提供了存储,而MapReduce为海量数据提供了计算框架。HBase是一个分布式的、面向列的开源数据库。属于Nosql。 …

微信小程序之事件

1、什么是事件 UI界面的程序需要和用户互动,例如用户可能会点击你界面上某个按钮,又或者长按某个区域,这类反馈应该通知给开发者的逻辑层,需要将对应的处理状态呈现给用户。 有些时候程序上的“行为反馈”不一定是用户主动触发的&…

详解简单的shell脚本 --- 命令行解释器【Linux后端开发】

首先附上完整代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> //命令行解释器 //shell 运行原理&#xff1a;通过让子进程执行命令&#xff0c;父进…

计算机体系结构(1) 介绍和基础

为了跟上我们组学习的进度&#xff0c;打好体系结构的基础&#xff0c;接下来我会持续的学习计算机体系结构的知识。参考的课程是 苏黎世联邦理工 ETH Zurich&#xff1a;Digital Design and Computer Architect Lecture 1: Introduction and Basics_哔哩哔哩_bilibili 这一…

BioXCell,1H6--InVivoMAb anti-canine CD34

1H6单克隆抗体与犬CD34发生反应。CD34是一种I型单体唾液酸粘蛋白样糖蛋白&#xff0c;存在于许多干细胞群体中。CD34由骨髓和外周血中的造血祖细胞以及一些间充质干细胞、基质细胞、胚胎成纤维细胞、肿瘤细胞和成人血管内皮细胞表达。CD34经常被用作量化用于造血干细胞移植后该…

根证书和中间证书安装配置

下载根证书 根证书是建立信任链的基础。一旦客户端安装了根证书&#xff0c;它即可验证由该根证书签发的所有证书。这使得客户端可以信任与该根证书相关的所有服务器和应用程序&#xff0c;从而建立起一个完整的信任链。 如果您的业务用户通过浏览器访问您的Web业务&#xff…

【uniapp】个推H5号码认证一键登录(附代码)

前言 最近在做APP、h5产品&#xff0c;登陆注册成了难题。邮箱验证多数人不会使用&#xff0c;还是短信方便点&#xff0c;短信可以采用号码认证和验证码的方式&#xff0c;前者稍微便宜的&#xff0c;关于性价比和上手程度我推荐个推&#xff0c; 于是有了今天这篇案例记录&a…

低代码如何集成多平台(企业微信、钉钉、飞书)SDK,且听我细细道来

前言 我们是一家做低代码产品开发的公司&#xff0c;我司的低代码产品支持在多个平台环境内使用&#xff1a;有钉钉、企业微信、微信、飞书、Web浏览器&#xff08;如谷歌&#xff09;&#xff0c;后续还会接入更多平台。面对这么多平台&#xff0c;每个平台的SDK可能一致&…

磁盘类型与IOPS性能指标

目录 1.磁盘的访问模式 2.磁盘分类 2.1 HDD机械磁盘 2.1.1 机械磁盘性能 2.1.2 IOPS 2.1.3 提升IOPS性能手段 2.1.4 RAID技术 RAID 0 RAID 1 RAID 5 RAID 6 RAID 10 RAID 50 RAID总结 2.2 SSD固态硬盘 2.2.1 查看磁盘调度算法 2.2.2 修改磁盘调度算法 2.2.3 …

lottery-攻防世界

题目 flag在这里要用钱买&#xff0c;这是个赌博网站。注册个账号&#xff0c;然后输入七位数字&#xff0c;中奖会得到相应奖励。 githacker获取网站源码 &#xff0c;但是找到了flag文件但是没用。 bp 抓包发现api.php&#xff0c;并且出现我们的输入数字。 根据题目给的附…

DNFOMP:杂乱环境中自动驾驶汽车导航的动态神经场最优运动规划器

DNFOMP&#xff1a;杂乱环境中自动驾驶汽车导航的动态神经场最优运动规划器 附赠自动驾驶学习资料和量产经验&#xff1a;链接 摘要 本文介绍了DNFOMP&#xff1a;杂乱环境中自动驾驶汽车导航的动态神经场最优运动规划器。动态变化环境中的运动规划是自动驾驶中最复杂的挑战之…

RA8900CE计时芯片介绍及开发方案

计时芯片 就是一个需要连接32.768k晶振的RTC芯片 规格书阅读 首先我们先读懂这个芯片是怎么用的。 引脚表 封装是这样的&#xff0c;一共10个引脚。 基本上一看这个引脚表就知道大概。 T1和T2是工厂测试的&#xff0c;不用管。 SCL和SDA是IIC通讯用的。 FOUT和FOE就是链…

文献速递:深度学习胰腺癌诊断--胰腺肿瘤的全端到端深度学习诊断

Title 题目 Fully end-to-end deep-learning-based diagnosis of pancreatic tumors 胰腺肿瘤的全端到端深度学习诊断 01 文献速递介绍 胰腺癌是最常见的肿瘤之一&#xff0c;预后不良且通常是致命的。没有肿瘤的患者只需要进一步观察&#xff0c;而胰腺肿瘤的诊断需要紧…