函数进阶
一、函数的返回值
-
什么是返回值?
返回值就是从函数内部传递到函数外部的数据(Python中的每个函数都可以传递一个数据到函数外部)。
-
怎么确定一个函数的返回值(怎么在函数的内部将数据传递到函数的外部)?
return后面的值就是函数的返回值(执行函数体的是如果遇到return,return后面的就是函数的返回值)。
-
怎么在函数外部获取返回值?
获取函数调用表达式的值就是获取这个函数的返回值。
函数调用表达式:就是调用函数的语句。
-
什么时候使用返回值?
如果实现函数的功能,产生了新的数据,就将新的数据作为函数的返回值返回。
1)return确定返回值。
def func1(a,b): result=a+b # 30 return result # return 30
注意:
a、return后面放需要返回的数据;
b、 一个函数只有一个返回值(一个函数最多只能有一个return函数);如果想要把多个数据作为函数的返回值,可以在一个return后面写多个数据。
c、return除了可以返回数据,还可以提前结束函数(执行函数体的时候如果遇到return,函数直接结束)。
2)获取函数返回值
函数调用表达式的值就是函数的返回值,所以返回值能干的事情,函数调用表达式都可以做。
二、变量作用域
-
变量作用域 —— 变量在定义完成后可以适用的范围。
根据变量作用域的不同,可以将变量分为全局变量和局部变量。
-
全局变量和局部变量
1)全局变量 —— 没有定义在函数里面或者类里面的变量都是全局变量
作用域:从定义开始,到程序结束。(程序结束前的任何位置都可以使用)。
a = 10 # a是全局变量 for i in range(5): print(f'循环里面a:{a}')
2)局部变量 —— 定义在函数中的变量就是局部变量(形参也是局部变量定义在类中的变量是属性)
作用域:从定义开始到函数结束。
# c和d是局部变量 def func3(c): d=30 print(f'函数里面c和d:{c},{d}')
-
不同变量的存储方式
全局变量默认保存在全局栈区间(程序结束的时候才会被释放)。
局部变量默认是保存在函数对应的临时栈区间中(函数对应的临时栈区间,创建函数的时候会创建出来,函数调用结束会自动释放)。
在函数定义变量的时候,可以在定义变量前加global,让函数中定义变量可以保存在全局栈区间。
如果想要在函数里面修改一个全局变量的值,必须先用global对变量进行声明。
def change_name(): global name name = '小花' print(f'函数里面name:{name}') change_name() print(f'函数外面:{name}')
三、函数参数的确定
-
调用函数的时候,实参到底应该给什么样的数据,由什么决定?
由函数在函数体中的使用方式决定。
-
实参高阶函数 —— 函数的参数是函数
如果一个参数是函数,传参有两种方法:1)用普通函数的函数名;2)使用函数名。
def func7(x): # x=temp2 print(x(10)+20) # print(temp2(10)+20) --> print(19+20) def temp2(m): return 19 func7(temp2)
四、匿名函数
-
匿名函数
匿名函数的本质还是函数,但是他只能实现简单的功能(一行语句就能实现它的功能)。
函数名 = lambda 形参列表:返回值 如: sum2 = lambda num1,num2 : num1+num2 相当于: def 函数名(形参列表): return 返回值
-
匿名函数的应用
在给实参高阶函数传参的时候,可以使用普通函数函数名,也可以使用匿名函数(能用匿名函数就用匿名函数,不行才用普通函数)。
1)普通函数调用
def func1(x): print(x(10,20)+10) def temp1(m,n): return 12.3 func1(temp1)
2)匿名函数调用
def func1(x): print(x(10,20)+10) func1(lambda m,n:12)
五、常用实参高阶函数
-
max、min、sorted
1)max序列 —— 直接比较序列中的元素的大小,求出最大值。
2)max(序列,key=函数) —— 按照函数指定的比较规则比较元素的大小,求出最大值
函数的要求: a、有且只有一个参数(这个参数代表序列中的每个元素);
b、需要一个返回值(返回值是比较对象 - 将参数看成元素,在这个地方来描述比较对象和元素之间的关系 )。# 示例1:求nums中值最大的元素 nums = [18,23,67,90,56,49] result = max(nums,key=lambda item:item) print(result)
注意:min、sorted与max的用法类似。
-
map —— 基于原来序列中的元素创建一个新的序列
1)map(函数,序列) - 根据函数制定的规则,将指定序列中的元素转换成新序列中的元素。
函数的要求:
a、有且只有一个参数(参数代表后面序列中的元素);
b、有返回值(返回值对应的就是新序列中的元素)。2)map(函数,序列1,序列2)
函数的要求:a、有且只有2个参数(分别代表后面两个序列中的元素)。
3)map(函数,序列1,序列2,序列3,…)
#基于names、ages和scores,创建学生列表: names = ['stu1', 'stu2', 'stu3', 'stu4'] ages = [23, 34, 19, 22] scores = [82, 67, 89, 66] # [{'name': 'stu1', 'age': 23, 'score': 82}, .....] result3=map(lambda item1,item2,item3:{'name':item1,'age':item2,'score':item3},names,ages,scores) print(list(result3))
-
reduce —— 将序列中所有的元素通过制定的规则合并成一个数据
reduce(函数,序列,默认值)
函数的要求:
a、有且只有两个参数(第一个参数指向默认值,第二个参数指向序列中的每个元素)。
b、需要一个返回值(描述合并方式,说清楚最后的结果是初始值和序列中元素进行什么样的操作得到的)。注意:reduce使用之前要先导入。
from functools import reduce # 示例4:求所有元素合并成一个字符串'2378927812' nums=[23,78,92,78,12] result = reduce(lambda i,item:i+str(item),nums,'') print(result)