day10 函数进阶
1.函数的返回值
1.1什么是返回值
返回值就是从函数内部传递到函数外部的数据(默认情况下函数内部产生的新数据,在函数外部不能使用)
1.2怎么确定函数返回值
1)python中每个函数都有返回值,默认情况下是None,返回值是什么就看执行函数体的时候遇到的return关键字后面的数据是什么;
如果没有遇到return,返回值就是None。
(希望作为返回值的数据就在函数结束的时候放在return后面)
2)return的作用
遇到return会确定函数返回值并且直接提前结束函数
1.3怎么在函数外部获取返回值
函数调用表达式的值就是函数的返回值,所以在函数的外部获取函数调用表达式的值就是在获取函数的返回值。
1)没有返回值
def func1(a, b):
print(a + b)
result = func1(10, 20)
print(f'result:{result}') # result:None
2)有一个返回值
def func2(a, b):
return a + b
print(a + b)
result = func2(10, 20)
print(result) # 30
3)有多个返回值的函数
def func3(a, b):
return a + b, a * b
result3 = func3(11, 22)
print(result3) # (33, 242)
re1, re2 = func3(10, 20)
print(re1, re2) # 30 200
re1, re2 = [1, 2]
print(re1, re2) # 1 2
练习:定义一个函数,可以求多个数的和以及平均值
def sum_mean(*num):
if not num:
return None, None
return sum(num), sum1/len(num)
sum1, mean = sum_mean()
print(sum1, mean)
补充*的作用:
1)打包
a, *b = 1, 2, 3, 4, 5
2)解包
c = [10, 20, 30]
print(*c) # 10 20 30
print(c) # [10, 20, 30]
2.全局变量和局部变量
2.1什么是全局变量和局部变量
按照变量的作用域不同将变量分为全局和局部两种
1)全局变量
定义在函数和类外面的变量就是全局变量
作用域:从定义开始到文件结束的任意位置都可以使用
a全局变量
a = 100
for x in range(3):
print(a)
def func1():
print(a)
b,c全局变量
for b in range(3):
c = 'hello'
print(b)
print(b)
def func2():
print(b)
print(c)
func2()
2)局部变量
定义在函数内部的变量就是局部变量
作用域:从定义开始到函数结束
def func3():
d = 1823
print(d)
补充:函数调用过程内存的变化
每次调用一个函数的时候系统会自动在栈区间开辟一个临时的内存空间,用来保存在函数中产生的数据(定义的变量),当函数调用结束后这块内存会自动释放(销毁)
函数形参也是局部变量
2.2 global和nonlocal
1)global
只能在函数体中使用;功能:在函数中定义全局变量
global 变量名
变量名 = 数据
2)nonlocal
功能:在局部的局部中修改一个局部变量的值
nonlocal 变量名
变量名 = 数据
m = 100
n = 10
def func5():
# 在定义一个新的局部变量m
m = 200
print(f'函数内部m:{m}')
global n
n = 100 # n是全局变量,任意位置都可以
global p
p = 300
func5()
print(f'函数外部m:{m}')
print(f'函数内部{n}')
2)nonlocal
def func6():
t = 100
def func7():
nonlocal t
t = 200
print(f'函数中的函数t:{t}')
func7()
print(f'函数中的t:{t}')
func6() # 没加nonlocal 函数中的函数t:200 函数中的t:100
func6() # 函数中的函数t:200 函数中的t:200
3.匿名函数
3.1匿名函数
匿名函数的本质就是函数;在定义的时候不需要函数名(一般情况下不会使用函数名,在调用实参高阶函数的时候用的比较多)
语法:
函数名 = lambda 形参列表:返回值
相当于:
def (形参列表):
return 返回值
sum1 = lambda num1, num2: print(num1 + num2)
sum1(10, 20)
max1 = lambda num1, num2: num1 if num1 > num2 else num2
a = max1(10, 20)
print(a)
4.实参高阶函数
4.1函数就是变量
python中定义函数其实就是在定义一个类型是function的变量,其中函数名就是变量名
普通变量能做的事情函数都能做
1)函数就是变量
e = lambda x: 2*x
print(type(e)) # <class 'function'>
2)变量能做的函数都可以做
x = 100
def func1(n1, n2):
return n1*n2
a.变量可以给另外一个变量赋值
y = x
print(y+2)
z = func1
print(type(z))
print(z(2, 3))
b.变量可以作为列表的元素
list1 = [10, 20, func1]
print(list1) # [10, 20, <function func1 at 0x00000195E03F78B0>]
print(list1[-1](4, 5)) # 20
c.变量可以重新赋值
x = 'abc'
print(x[0])
func1 = 200
print(func1*3)
print(type(func1)) # <class 'int'>
e.变量可以作为函数的参数
def func2(t):
pass
def func3(f):
f()
def func4(f):
print(f(10, 20)*2)
def func5(num1, num2):
return [num1, num2]
def func6(num1, num2):
return num1*num2
e = lambda *n: n
func4(e)
print('======')
func4(func5)
func4(func6)