day-11函数进阶 学习总结
一.匿名函数
语法:
lambda 形参列表:返回值
相当于
def(形参列表):
return 返回值
如何调用匿名函数 - 在匿名函数前加变量
函数名(变量) = lambda 形参列表:返回值
匿名函数的本质:匿名函数还是函数;普通函数中的绝大部分内容,匿名函数都支持。
二. 变量作用域
1. 变量作用域 - 变量的使用范围
根据变量作用域不同,可以将变量分为:全局变量、局部变量
1.1 全局变量
定义在函数或者类外面的变量就是全局变量(没有定义在函数里或者类里的变量就是全局变量)
作用域:从定义开始到程序结束
1.2 局部变量
定义在函数里面的变量就是局部变量(形参也是局部变量)。
作用域:从定义开始到函数结束
2. global关键字
变量能不能使用,看的是使用的时候内存中有没有。
定义全局变量的时候,全局变量保存在全局栈区间,程序结束后才会被自动释放;
局部变量是保存在函数对应的临时栈区间中,函数调用结束后就会被自动释放。
global是函数体中的关键字,可以再函数体中修饰变量,让变量在使用和保存的时候都在全局栈区间中进行。
- 函数中修改全局变量的值
2) 直接在函数中定义全局变量
三、高阶函数
1. 函数就是变量
python中定义函数其实就是在定义一个类型为function的变量,函数名就是变量。
变量能做的事情,函数都可以做
2.高阶函数
- 实参高阶函数 - 函数的参数是函数
- 返回值高阶函数 - 函数的返回值是函数
四、常用的实参高阶函数
1. max、min、sorted、sort等 - 参数key要求是一个函数
函数名(序列,key=函数) - 按照函数制定的比较规则来获取序列中最大的元素
例如:max(序列,key=函数)
函数的要求:1.参数 - 有且只有一个参数,这个参数代表前面序列中的每个元素
2.返回值 - 有一个返回值,返回值就是比较对象
注意:如果一个函数的参数就是函数,这个参数就有两种传值方式:a.普通函数的函数名 b.匿名函数
例如:获取nums中各个位数之和最小的元素
nums = [1002, 908, 99, 76, 502]
result = min(nums,key=lambda item:eval('+'.join(str(item))))
print(result)
result = min(nums,key=sum2)
print(result)
2. map
2.1 map(函数,序列) - 按照函数指定的规则将原序列转换为新的序列,返回值是map对象 - 本质是序列
函数要求:a.参数:有且只有一个参数;参数代表后面序列中的元素
b.返回值:有一个返回值;返回值就是新序列中的元素
2.2 map(函数,序列1,序列2)
函数要求:a.参数:有且只有两个函数,分别代表后面两个序列的元素
b.返回值:有一个返回值;返回值就是新序列中的元素
2.3 map(函数,序列1,序列2,序列3)
函数要求:a.参数:有且只有3个函数;分别代表后面三个序列的元素
b.返回值:有一个返回值;返回值就是新序列中的元素
例如:获取nums中所有元素的个位数
nums = [129,21,22,56,14,93]
# [9,1,2,6,4,3]
result = list(map(lambda item:item % 10,nums))
print(result)
3. reduce
reduce(函数,序列,初始值) - 按照函数指定的规则将序列中所有的元素合并成一个数据。
函数的要求:
参数:有且只有两个参数,第一个参数指向初始值,第二个参数代表序列中的每个元素
返回值:有一个返回值;描述初始值和元素之间的合并方式
# 将message中的数字相加 20+5+6.98 -> 31.89
from functools import reduce
message = ['你好', 20, '30', 5, 6.89, 'hello']
result = reduce(lambda i,item:i + item if type(item) in (int,float) else i + 0,message,0)
print(result)