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