函数的创建和调用
-
什么是函数
函数就是执行特定任务和以完成特定功能的一段代码 -
为什么需要函数
服用代码
隐藏实现细节
提高可维护性
提高可读性便于调试 -
函数的创建
def 函数名 ([输入参数]):
函数体
[return xxx]
---- def func(key1, key2, key3…):
---- def func(key1, key2=value2…):
- 函数的调用
函数名([实际参数])
---- func(arg1, arg2, arg3…) #会按照前后顺序对应到函数参数
----func(key1=arg1, key2=arg2…) #指定了key,可不按顺序对应
----如果混用,所有位置参数必在前,关键字参数必在后
-
函数的参数传递
位置实参:根据形参对应的位置进行实参传递
关键字实参:根据形参名称进行实参传递
如果是不可变对象,在函数体内的修改不会影响实参的值,
如果是可变对象,在函数体内的修改会影响实参的值 -
函数的返回值
函数返回多个值时,结果为元组 -
函数的参数定义
个数可变的位置参数
#定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
#使用 *args 定义个数可变的位置形参
#结果为一个元组
个数可变的关键字形参
#定义函数时,无法实现确定传递的关键字实参的个数时,使用可变的关键字形参
#使用 **args 定义个数可变的关键字形参
#结果为一个字典
---- def func(*args): #不带key的多个无名参数
---- def func(**kwargs): #key=val形式的多个命名参数
-
调用函数的参数:解包
对于有多个参数的函数,可以单个序列或字典“解包”对应到每个参数
---- func(*aseq) #序列解包对应到每个位置参数
---- func(**adict) #字典解包对应到每个关键字参数 -
变量的作用域
程序代码能访问该变量的区域
根据变量的有效范围可分为:
–局部变量:在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明,这个变量就会成为全局变量
–全局变量:函数体外定义的变量,可作用于函数内外
函数作为参数:map函数
-
有时候,需要对列表中每个元素做一个相同的处理,得到新列表
–例如所有数据乘以3
–例如所有字符串转换为整数
–例如两个列表对应值相加num = [10, 20, 40, 80, 160]
lst = [2, 4, 6, 8, 10]
def mul3(a):
return a * 3
print(list( map(mul3, num) )) -
map(func, list1, list2 …) #函数func有几个参数,后面就跟几个列表
def atob(a, b):
return a + 1.0/b
print(list( map(atob, num, lst) ))
函数表达式:lambda运算符
-
有时候函数只用一次,其名称也就不重要,可以无须费神去def一个
-
Lambda表达式可以返回一个匿名函数
lambda <参数表>:<表达式>
–lambda x: x * 3
–lambda x, y: x + 1.0/y
函数作为参数:reduce函数
- reduce函数对列表进行滚动式处理,最终得到一个值
- 例如,累加,累乘等等
- reduce(func, list)
– 相当于:func(func(func(l0, l1), l2), l3)… - reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
– 相当于:((((1+2)+3)+4)+5)
>>>> from functools import reduce
>>>> reduce(lambda x, y: max(x, y), [2, 3, 7, 1, 4, 5])
>>>> 7
函数作为参数:filter函数
- filter函数对数据集中的对象逐个调用func
– 如果结果为真,则保留这个对象
– 否则抛弃这个对象
>>>> list(filter(lambda x: x % 2 == 0, range(100)))
>>>> list(filter(lambda x: len(x)>3, [“hello”, “am”, “bye”, “good”]))
>>>> [‘hello’, ‘good’]
函数值缓存:lru_cache装饰器
-
来着functools模块的lru_cache装饰器
-
对产生大量重复计算的递归函数自动提供函数值缓存
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
if n == 1:
return 0
elif n == 2:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)print(fibonacci(100))