day12学习总结
1. 返回值
- 函数的返回值
-
返回值就是从函数内容传递到函数外部的数据(python中的每个函数都可以传递一个数据到函数的外部)
-
怎么确定一个函数的返回值:return后面的值就是函数的返回值(执行函数体的如果是遇到return,return后面的值就是函数的返回值)
-
怎么在函数外部获取函数返回值
-
获取函数调用表达式的值就是获取这个函数的返回值
-
函数调用表达式 - 调用函数的语句
-
函数调用表达式的值就是函数的返回值,所有返回值能干的事,函数调用表达式都可以做。
def func1(a,b): result = a + b return result # return后面放需要返回的数据 func1(20,30) print(func1(10,20)) # 30 print(func1(10,20)*3) # 90
-
-
什么时候使用返回值
- 如果实现函数的功能,产生了新的数据,就将新的数据作为函数的返回值返回。
-
注意
-
return后面放需要返回的数据。
-
一个函数只有一个返回值(一个函数最多只能有一个return有效);如果想要把多个数据作为函数的返回值返回,可以在一个return后面写多个数据
-
return除了可以返回数据,还会提前结束函数(执行函数体的时候如果遇到return,函数直接结束)
def func2(a,b): result1 = a + b result2 = a * b return result1,result2 # 相当于返回了一个元组 s1,s2 = func2(4,5) print(s1,s2) # 9 20 # return除了可以返回数据,还会提前结束函数(执行函数体的时候如果遇到return,函数直接结束) def func3(): print("----") #打印 print("++++") #打印 return print("****") # 不打印 func3()
-
-
2. 变量作用域
-
全局变量和局部变量
-
全局变量:没有定义在函数里面或者类里面的变量都是全局变量
- 作用域:从定义开始,到程序结束(程序结束前的任何位置都可以使用)
-
局部变量:定义在函数中的变量就是局部变量(定义在类中的变量是属性)
- 作用域:从定义开始到函数结束(形参也是局部变量)
for x in range(3): b = 5 # x和b是全局变量 def func1(c): d = 30 print(f"函数里面c和d:{c},{d}") # c和d是局部变量 func1(5) print(c,d) # 报错, 函数外不能用局部变量
-
-
不同变量的存储方式
-
全局变量默认保存在全局栈区间(程序结束的时候才会释放)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j1IKJLSU-1659455304806)(C:\Users\wuson\AppData\Roaming\Typora\typora-user-images\image-20220802184747925.png)]
-
局部变量默认保存在函数对应的临时栈区间中(函数对应的临时栈区间,创建函数的时候会创建出来,函数调用结束后会自动释放)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uBjA83yN-1659455304809)(C:\Users\wuson\AppData\Roaming\Typora\typora-user-images\image-20220802184913658.png)]
-
-
global
-
在定义变量前加global关键字,可以让函数中定义变量可以保存在全局栈
区间name = "小明" def change_name(): global name name = "小红" print(f"函数里面的:{name}") change_name() print(f"函数外面的:{name}")
-
3. 实参高阶函数
-
定义:函数的参数就是函数
def func7(x): # x = temp print(x(10)+20) # x(10) == temp(10)返回值19,+20,=39 def temp(m): return 19 func7(temp) # 39
-
两种传参方法:
- 使用普通函数的函数名
- 使用匿名函数
-
匿名函数
-
语法 :
语法 - 函数名 = lambda 形参列表:返回值 相当于: def 函数名(形参列表): return 返回值 # 本质:还是函数,但是它只能实现简单的功能(一行语句就能实现它的功能)
-
-
匿名函数的应用
-
在给实参高阶函数传参的时候,可以使用的范围普通函数函数名,也可以使用匿名函数(能用匿名函数就是用匿名函数,不行才用普通函数)
def func2(x): print(x(10,20)+10) func2(lambda m,n:12.3) # 22.3
-
4. 常用的实参高阶函数
-
max,min,sorted
-
语法1: max/min/sorted(序列) - 直接比较序列中元素本身的大小,求出最大(小,)值或者排序
-
语法2: max/min/sorted(序列,key=函数) - 按照函数指定的比较规则比较元素的大小,求出最大(小)值或者排序
-
函数的要求:
- 有且只有一个参数(这个参数代表序列中的每个元素)
- 需要一个返回值(返回值是比较对象 - 将参数看成元素,在这个地方来描述比较对象和元素之间的关系。)
# 求nums中值最大的元素 nums = [18,32,45,75,74,35] result = max(nums,key=lambda item:item) print(result) # 75 # 求nums中各个位数之和最大的元素 nums = [102, 19, 48, 221, 52] result4 = max(nums,key=lambda item:sum([int(x) for x in str(item)])) print(result4) # 48
-
-
map
-
语法1:map(函数,序列) - 根据函数指定的规则,将指定序列中的元素转换成新序列中的元素
-
函数的要求:
-
有且只有一个参数(代表后面序列中的元素)
-
有返回值(返回对应的就是新序列中的元素)
-
-
-
语法2: map(函数,序列1,序列2,…)
- 函数的要求:
- 有且只有N个参数(代表后面N个序列中的元素)
- 有返回值(返回对应的就是新序列中的元素)
# 将nums中所有的元素乘以10 nums = [82, 67, 89, 6617, 90, 23, 71] result8 = map(lambda item:item * 10,nums) print(list(result8)) # [820, 670, 890, 66170, 900, 230, 710] # 基于scores创建一个列表,列表中元素根据nums中元素确定为'及格'或者'不及格' scores = [82, 67, 89, 66, 90, 23, 71] result9 = map(lambda item:"及格" if item>=60 else "不及格",scores) print(list(result9)) # ['及格', '及格', '及格', '及格', '不及格', '及格']
- 函数的要求:
-
-
reduce
-
reduce - 将序列中所有的元素通过指定的规则合并成一个数据
-
注意:reduce使用之前需要先导入
-
语法:reduce(函数,序列,默认值)
-
函数的要求:
- 有且只有两个参数(第一个参数指向默认值,第二个参数指向序列中的每个元素)
- 需要一个返回值(描述合并方式,说清楚最后的结果是初始值和序列中元素进行什么样的操作得到的)
# 求nums中所有的元素的和 nums = [10,20,30,40] result11 = reduce(lambda i,item:i+item,nums,0) print(result11) # 100 # 将nums1中的所有数字合并到一起 nums1 = [10,20,30,40] result12 = reduce(lambda i,item:i+str(item),nums1,"") print(result12)
-
-