引言:
通过上一章节的学习,我们已经能够利用给定的条件计算出连续12个月的折旧了,但是,如果我想要使这个算法能作用到另外一个固定资产,却发现不得复制一下,并且修改资产原值、折旧年限等等变量赋值。那么有没有更便捷的方法呢?本章我们将用python函数来解决这个问题。
01 内置函数
首先我们来看看到底什么是函数?
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。
你已经知道Python提供了许多内置函数,比如print(),input(),round()等,这些函数可以直接在代码中调用过来,下面我们来回忆一下round函数的调用过程。
round(10.2345,2) #内置函数调用
#输出:10.23
输出的10.23,我们称之为函数的返回值。
但是如果你想实现的功能内置函数无法帮你完成,你也可以自己创建函数,这被叫做自定义函数。
02 自定义函数
用一些符号代替变量赋值,等到使用这个算法的时候再把具体的变量金额填充进去,将原先适用于一种情况的算法改造成一个通用的算法,这个过程就叫自定义函数。代替变量叫形参,使用算法叫做调用函数,调用函数时填充的具体金额叫实参。
自定义函数的语法:
#def是定义函数的关键字。
def 函数名(形参) : # 定义函数时指定形参,参数也可以为空。注意冒号
<代码块>
return # return语句不写时,没有返回值
函数名(实参) #调用函数时传递实参
小贴士:程序中函数完成一件事情后,最后给调用者的结果,称为函数的“返回值”,想要在函数中把结果返回给调用者,就需要在函数中使用return。
我们参照函数语法改造上个章节计算12个月固定资产折旧的案例吧:
#计算固定资产折旧函数
def calcdep(amount,year,srate,depope):
#改造的关键是参数设置
scrap= amount* srate
drate=1/year/12
depinc=0
listdep=[]
for i in range(12):
depope+=depinc
depinc= round(amount* drate,2) #本期折旧
netamount=amount- depope-depinc - scrap #固定资产净值
if netamount>0:
depinc = depinc
else:
depinc= round((amount- depope - scrap),2)
listdep.append(depinc)
print ('1-12月折旧额为',listdep)
#有了函数后,就可以重复计算了
calcdep(10000,5,0.05,8333.5)
calcdep(10000,5,0.05,1000)
calcdep(12000,4,0.03,8000)
#1-12月折旧额为 [166.67, 166.67, 166.67, 166.67, 166.67, 166.67, 166.48, 0.0, 0.0, 0.0, 0.0, 0.0]
#1-12月折旧额为 [166.67, 166.67, 166.67, 166.67, 166.67, 166.67, 166.67, 166.67, 166.67, 166.67, 166.67, 166.67]
#1-12月折旧额为 [250.0, 250.0, 250.0, 250.0, 250.0, 250.0, 250.0, 250.0, 250.0, 250.0, 250.0, 250.0]
03 函数的参数
上文中我们已经讲到,调用函数时是可以传递参数的,以下是函数调用时可使用的参数类型:
- 位置参数
- 关键字参数
- 默认参数
- 不定长参数
位置参数
位置参数就是将对应位置的实参传递给对应位置的形参。
第一个实参赋值给第一个形参,第二个实参赋值给第二个形参等等。
def fn(a,b,c) :
print(a,b,c)
fn('甲','乙','丙') #甲 乙 丙
默认参数
定义形参时,可以为形参指定默认值。调用函数时,如果参数的值没有传入,则被认为是默认值,如果用户传递了参数,则默认值没有任何作用。
def fn(a,b,c='丁') :
print(a,b,c)
fn('甲','乙','丙') #甲 乙 丙
fn('甲','乙') #甲 乙 丁
关键字参数
关键字参数,可以不按照形参定义的顺序去传递,而直接根据参数名去传递参数
def fn(a,b,c) :
print(a,b,c)
fn(b='甲',c='乙',a='丙') #丙 甲 乙
可变参数
在定义函数时,可以在形参前边加上一个*,这样这个形参将会获取到不定长的实参
def fn(*a) :
print(a)
fn('甲','乙','丙') #('甲', '乙', '丙')
注意,此时输出的结果有个括号,这是因为传递值到可变参数时,python会将所有的实参保存到一个元组中。
*形参只能接收位置参数,而不能接收关键字参数,如果要接受不定长的关键字参数,可以在参数名前加两个*号。**形参可以接收不定长的关键字参数,并将这些参数统一保存到一个字典中。
def fn(**a) :
print(a)
fn(b='甲',c='乙',a='丙') # {'b': '甲', 'c': '乙', 'a': '丙'}
参数组合
在Python中定义函数,可以用位置参数、默认参数、关键字参数、可变参数,这4种参数都可以组合使用。但是请注意,参数定义的顺序必须是:位置参数、默认参数、关键字参数和可变参数。
def fn(a,b,*c,d,**e) : #位置参数->可变位置参数->关键字参数->可变关键字参数
print(a,b,c,d,e)
fn('甲','乙','丙','丁',d='戊',m='己',n='庚') #甲 乙 ('丙', '丁') 戊 {'m': '己', 'n': '庚'}
04 变量的作用域
让我们先来试一下这段程序。
b = 20
def fn():
a = 10
c = 30
print('a =',a)
print('b =',b) #在函数内部print b 成功
fn()
print('c =',c) #在函数外部print c 失败
运行上述语句,我们发现a和b输出结果,但是c却报错了。这就需要了解从作用域说起了。
作用域指的是变量生效的区域,在Python中一共有两种作用域。
- 全局作用域
- 全局作用域在程序执行时创建,在程序执行结束时销毁
- 所有函数以外的区域都是全局作用域
- 在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问
- 局部/函数作用域
- 局部作用域在函数调用时创建,在调用结束时销毁
- 局部每调用一次就会产生一个新的函数作用域
- 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
变量的查找
- 当我们使用变量时,会优先在当前作用域中寻找该变量,如果有则使用,
- 如果没有则继续去上一级作用域中寻找,如果有则使用,
- 如果依然没有则继续去上一级作用域中寻找,以此类推
- 直到找到全局作用域,依然没有找到,则会抛出异常
这也就解释了,为什么在函数内部print b 成功,在函数外部print c 失败。
global
那么有没有办法修改局部变量的作用域区间,使其在全局范围内可用呢,答案是确定的,可以用global实现。
我们用global改造一下开头的例子:
b = 20
def fn():
global c
a = 10
c = 30
print('a =',a)
print('b =',b) #在函数内部print b 成功
fn()
print('c =',c) #在函数外部print c 成功
声明:我要去上班所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者财码所有,原文出处。若您的权利被侵害,请联系删除。
本文标题:(python在财务中的应用论文)(python 财务应用)
本文链接:https://www.51qsb.cn/article/m8dzw.html