4 函数的定义及使用

简介: 4 函数的定义及使用

1. 定义函数


函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,函数能提高应用的模块性,和代码的重复利用率 一般格式如下: def 函数名(参数列表): 函数体

#一般情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的
#实例:计算单利债券本利和函数
#输入债券面值、年利率、期限
def Count(value, rate, time):  #定义单利债券计算本利和函数
    return value * (1+time*rate)    
v = 100
r = 0.1
t = 5
print("债券面值 =", v, " 年利率 =", r, " 期限 =", t ,"单利本利和", Count(v,r,t))
债券面值 = 100  年利率 = 0.1  期限 = 5 单利本利和 150.0


如上例,在金融中有许多计算题目均可以通过编写代码方便快捷的计算结果


在python中,需要注意一切皆对象这个概念,则有了传可变对象和不可变对象的区别


#传可变对象
def addlist(list1):
   list1.append(['Financial','data','analysis']) #传修改可变对象的值
   print ("The result in function is: ", list1)
# 调用addlist函数
list1 = [2021,9,14]
addlist(list1)
The result in function is:  [2021, 9, 14, ['Financial', 'data', 'analysis']]
print ("The result in outside the function: ", list1)
#传入函数的和在末尾添加新内容的对象用的是同一个引用,所以得到以下的值:
The result in outside the function:  [2021, 9, 14, ['Financial', 'data', 'analysis']]


由此可以看到函数内外的list值是一致的


#传不可变对象
def modifyStr(a):
    a = 'Financial'#重新赋值
    print ("The result in function is: ", a)
b = 'data'
modifyStr(b)
The result in function is:  Financial
print ("The result in function is: ", b)
The result in function is:  data

与上一个例子不同函数内外的值是不一致的在 modifySt(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身,所以还是原来传入的值data


通过以上两个例子,我们能发现,如果传入是可变对象的,则传入的值可以改变,如果不可变的则不能改变,传递的只是a的值,没有影响a对象本身。


对于传不可变对象比如在 modifySt(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身,所以还是原来传入的值'data'。


数值,字符串,元组属于不可变数据类型,列表,字典和集合属于可变数据类型。


2. 参数


以下是调用函数时可使用的正式参数类型:


  • 必需参数
  • 关键字参数
  • 默认参数
  • 可变长参数


2.1 必需参数


必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样,如果不同则会报错。

# def printstr(str):
#    print(str)
# # 因为在函数中定义需要参数传入,所以在调用 printstr 函数时,不加参数会报错
# printstr()


2.2 关键字参数


可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple,而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict,关键字参数的功能就是拓展函数功能

def stock(name, code, **kw): #这里的**kw就是关键字参数,可以不用传入或者传入一个或者多个参数
    print('name:', name, 'code:', code, 'other:', kw)
stock('伟创电气','688698')  #不用传入关键字参数
stock('火星人','300894',date_='2020/12/11')
stock('中瓷电子','003031',date_='2020/12/11',price=4.45)
name: 伟创电气 code: 688698 other: {}
name: 火星人 code: 300894 other: {'date_': '2020/12/11'}
name: 中瓷电子 code: 003031 other: {'date_': '2020/12/11', 'price': 4.45}


2.3 默认参数


调用函数时,如果没有传递参数,则会使用默认参数。

#实例:计算单利债券本利和函数,默认年利率为0.2
#输入债券面值、年利率、期限
def Count(value, time, rate=0.2):  #定义单利债券计算本利和函数
    print("债券面值 =", value, " 年利率 =", rate, " 期限 =", time )
    print("单利本利和", value * (1+time*rate))
    return value * (1+time*rate)    
v = 100
r = 0.1
t = 5
#调用Count函数
print('传入参数的时候')
Count( value=100, time=5, rate=0.1)#传入参数0.1的时候
print('不传参数的时候')
Count( value=100,time=5 )#不传参数的时候
传入参数的时候
债券面值 = 100  年利率 = 0.1  期限 = 5
单利本利和 150.0
不传参数的时候
债券面值 = 100  年利率 = 0.2  期限 = 5
单利本利和 200.0
200.0


2.4 可变长参数


参数以一个星号开头的代表着一个任意长度的元组(tuple),可以接收连续一串参数,如上面代码里传的是1,2,3或者更多。 参数以两个星号开头的代表着一个字典,参数的形式是“key=value”,接受连续任意多个参数

#一个*开头
def printinfo(arg, *kw):
   print ("output:")
   print (arg)
   print (kw)
# 调用printinfo 函数
printinfo(1,2,3,4,5,6)
output:
1
(2, 3, 4, 5, 6)
#两个*开头
def printinfo(arg, **kw):
   print ("output:")
   print (arg)
   print (kw)
# 调用printinfo 函数
printinfo(1,a=2,b=3)#因为传入的是字典,所以不能是printinfo(1,2,3),需要以“key=value"的形式
output:
1
{'a': 2, 'b': 3}


2.5 变量作用域


Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。作用域的相关知识在Python中很容易掉坑,所以大家学习的时候需要注意


Python中一共有四种作用域:


  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内建作用域


以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。


#在 def/class/lambda内进行赋值,就变成了其局部的作用域,局部作用域会覆盖全局作用域,但不会影响全局作用域
a = 1  #全局的
def printinfo():
    a = 2 #局部的
    return a
print(printinfo())
print(a)
2
1


Task


list1 = [-0.0054,0.0077,0.0024,0.0087,0.0038] list1为一组收益率

list1 = [-0.0054,0.0077,0.0024,0.0087,0.0038]


1. 定义一个求解算术平均收益率的函数


# 方法1
def avg1(data):
    sum=0
    for i in range(len(data)):
        sum=data[i]+sum    
    return sum/len(data)
print(avg1(list1))
0.00344
# 方法2
def avg2(data):
    return sum(data)/len(data)
print(avg2(list1))
0.00344
# 方法3
import numpy as np
def avg3(data):
    return np.mean(np.array(data))
print(avg3(list1))
0.00344


2. 运用lambda函数求解算数平均收益率


from functools import reduce
print(reduce(lambda x, y: x + y, list1)/len(list1))
0.00344

END


目录
相关文章
|
9月前
|
C++
C++中类的定义与使用
C++中类的定义与使用
247 2
|
5月前
|
Python
定义函数
定义函数。
50 4
|
5月前
|
Shell
如何定义变量
【9月更文挑战第4天】
95 11
|
6月前
【函数】函数的声明和定义
【函数】函数的声明和定义
139 1
|
7月前
|
存储 编译器
C 中的变量定义
【7月更文挑战第2天】C 中的变量定义。
40 3
|
9月前
|
存储 Java C#
怎样定义函数
怎样定义函数
91 2
|
9月前
|
存储 Python
函数的定义
函数的定义
|
9月前
|
存储 Serverless Python
定义函数的方法
在编程中,函数是一个非常重要的概念。函数是一段可以重复使用的代码,它接受输入(称为参数),执行一系列操作,然后可能返回一些输出。通过定义函数,我们可以提高代码的可读性、可维护性和复用性。本文将介绍如何定义函数,并附上相应的代码示例。
81 1
|
9月前
|
Serverless Python
为什么要定义函数
为什么要定义函数
259 1
|
9月前
枚举变量的定义
【2月更文挑战第4天】枚举变量的定义。
94 6