2020_10_12_函数进阶

函数的返回值

返回值就是从函数内容传递到函数外部的数据(默认情况下函数内部产生的新数据,在函数外部不能使用)

怎么确定函数返回值
1)
python中每个函数都有返回值,返回值是什么就看执行函数体的时候遇到的return关键字后面的数据是什么
如果没有遇到return,返回值就是None。
(希望作为返回值的数据在函数结束的时候放在return后面)

2)return的作用
遇到return会确定函数返回值并且直接结束函数

怎么在函数外部获取函数返回值?
函数调用表达式的值就是函数的返回值,所以在函数的外部获取函数调用表达式的值就是在获取函数的返回值

1)没有返回值的函数
def func1(a, b):
# a = 10, b = 20
print(a+b)

result1 = func1(10, 20)
print(f’result1:{result1}’)

2)有一个返回值的函数
def func2(a, b):
# a=100, b=200
return a+b # return 300
print(’=======’)

result2 = func2(100, 200)
print(f’result2:{result2}’)

3)有多个返回值的函数
def func3(a, b):
return a+b, a*b

result3 = func3(11, 22)
print(f’result3:{result3}’) # (33, 242)

re1, re2 = func3(10, 20)
print(f’re1:{re1}, re2:{re2}’)

练习:定义一个函数,可以求多个数的和以及平均值
def operation(*nums):
if not nums:
return None, None
return sum(nums), sum(nums)/len(nums)

print(operation(1, 2, 3, 4, 5))

*的作用:
1)打包
a, *b = 1, 2, 3, 4, 5
2)解包
c = [10, 20, 30]
print(*c) # print(10, 20, 30)

全局变量和局部变量

按照变量的作用域不同将变量分为全局和局部两种

1)全局变量
定义在函数和类外面的变量就是全局变量
作用域:从定义开始到文件结束的任意位置都可以使用

a就是全局变量
a = 100

for x in range(3):
print(f’循环内:{a}’)

def func1():
print(f’函数内部:{a}’)

func1()

b是全局变量
for b in range(3):

c是全局变量
c = ‘hello’
print(f’循环内部b:{b}’)

print(f’循环外部b:{b}’)
print(f’循环外部c:{c}’)

def func2():
print(f’函数内部b:{b}’)
print(f’函数内部c:{c}’)

func2()

2)局部变量
定义在函数内部的变量就是局部变量
作用域:从定义开始到函数结束

补充:函数调用过程内存的变化
每次调用一个函数的时候系统会自动在栈区间开辟一个临时的内存空间,用来保存在函数中产生的数据(定义的变量),当函数调用结束后这块内存会自动释放(销毁)

d是局部变量
def func3():
d = 123
print(f’函数内部d:{d}’)

func3()
print(f’函数外部d:{d}’) # 报错!

函数的形参也是局部变量
def func4(e, f=100):
print(e, f)

func4(200)
print(f’函数外部:{e}’)
print(f’函数外部:{f}’)

2.global和nonlocal
1). global
只能在函数体中使用;功能:在函数中定义全局变量
global 变量名
变量名 = 数据

2)nonlocal
功能:在局部的局部中修改一个局部变量的值
nonlocal 变量名
变量名 = 数据

1)global
全局变量m
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:{n}’)
print(f’函数外部p:{p}’)

2)nonlocal(了解)
def func6():
t = 100

def func7():
nonlocal t
t = 200
print(f’函数中的函数t:{t}’)

func7()
print(f’函数中的t:{t}’)

func6()

匿名函数

匿名函数的本质是函数,在定义的时候不需要函数名(一般情况下不会使用匿名函数,在调用实参高阶函数的时候用的比较多)

语法:
函数名 = lambda 形参列表:返回值

相当于:
def 函数名(形参列表):
return 返回值

定义一个函数求两个数的和
def _(num1, num2):
return num1+num2
sum1 = lambda num1, num2: num1+num2

print(sum1(10, 20))
print(sum1(num2=3, num1=2))

练习:写一个匿名函数,获取两个数中较大的那个数
函数名 = lambda 形参列表:返回值
max1 = lambda num1, num2=20: num1 if num1 > num2 else num2
print(max1(100, 9))
print(max1(1, 9))
print(max1(3))

def max1(num1, num2=20):
return num1 if num1 > num2 else num2

func1 = lambda x: print(x)
print(func1(100))

实参高阶函数

1.函数就是变量
python中定义函数其实就是在定义一个类型是function的变量,其中函数名就是变量名。
普通变量能做的事情函数都可以做

1)函数就是变量
a = 10
b = ‘abc’
c = [10, 20, 30]
d = {‘a’: 10, ‘b’: 20}
e = lambda x: x*2
print(f’a:{type(a)}, d:{type(d)}, e:{type(e)}’)

def e2(x):
return x*2

print(f’e2:{type(e2)}’)

2)变量能做的函数都可以做
x = 100

def func1(n1, n2):
return n1*n2

a.变量可以给另外一个变量赋值
y = x
print(y+2)

z = func1
print(z(2, 3))

b.变量可以列表的元素
list1 = [10, 20, x]
print(list1)
print(list1[-1]*2)

list2 = [10, 20, func1]
print(list2)
print(list2[-1](4, 5)) # 20

c.变量可以重新赋值
x = ‘abc’
print(x[0])

func1 = 200
print(func1*3)

e.变量可以作为函数的参数
def func2(t):
pass

func2(x)
func2(func1)

f = lambda num1=0, num2=0: num1 - num2

def func4(f):
print(f(10, 20) * 2)

func4(f)

猜你喜欢

转载自blog.csdn.net/xdhmanan/article/details/109035803