1.返回值
1)返回值
1)作用:将函数内的数据传递到函数外面
2)什么是返回值:返回值就是return后面的值(怎么确定返回值);就是函数调用表达式的值(怎么获取返回值)
a.return: return是函数体中的关键字
返回返回值(确定函数返回值):return 表达式 -表达式的值就是函数的返回值
结束函数:执行函数体的时候如果遇到return,函数直接结束
b.函数调用表达式:调用函数的语句
3)怎么确定函数返回值:看执行函数体的时候会不会遇到return,如果遇到return,return后面是什么返回值就是什么;
如果没有遇到return,返回值就是None
4)怎么获取函数返回值:获取函数调用表达式的值
5)多个返回值
python支持一个函数有多个返回值;return 值1,值2,值3...
# 多个返回值
def func1(x, y, z):
sum1 = x + y + z
return sum1, sum1 * 2
2)初学者确定函数返回值的方式:看实现函数的功能会不会产生新的数据,一般将新的数据作为返回值返回
2.变量的作用域
1)变量的作用域:变量可以使用的范围
1)全局变量:没有声明在函数里或类里面的变量就是全局变量;
作用域 - 从声明开始到文件(程序)结束任何地方都可以使用
2)局部变量:声明在函数中的变量就是局部变量;
作用域 - 从声明开始到函数结束的任何地方都可以使用
3)为什么局部变量不能在函数外面使用:
当调用函数的时候,系统会自动为这个函数在栈区间开辟一个临时的内存区域,用来保存存在函数中声明的变量(形参也是);
当函数调用结束后,这个临时的内存区域会自动销毁,里面的变量也会消失。
print('===全局变量实例一=========')
a = 10 # a是全局变量
print('循环外面a', a)
for x in range(3):
print('循环里面a', a)
b = 3
# x是全局变量
print('循环外面x', x)
# b是全局变量
print(b)
print('====局部变量实例======')
# xx是局部变量
def func2(xx):
# aa是局部变量
aa = 10
print('函数里面aa:', aa)
func2(10)
# print(aa) # NameError: name 'aa' is not defined
2)global和nonlocal
global和nonlocal只能在函数体中使用
1)global:在函数中声明/修改全局变量,就在变量赋值前加‘global 变量名’(必须掌握)
2)nonlocal:想要在局部的局部中修改局部变量的值,就使用nonlocal
print('======global实例===========')
a1 = 100 # 声明全局变量a1
def func4():
# a1 = 200 # 声明局部变量a1
# 在函数中修改一个全局变量的值
global a1
a1 = 200
print(a1) # 200
# 2.直接在函数中声明一个全局变量
global b1
b1 = 'aq'
func4()
print(a1)
print(b1)
print('=====nonlocal实例=======')
def func5():
a2 = 10
print(a2)
def func6():
nonlocal a2
a2 = 100
print('func6', a2)
func6()
print('func5', a2)
func5()
3.匿名函数
1)什么是匿名函数
匿名函数就是没有名字的函数,本质函数。除了声明的语法和普通函数不同,其他几乎都一样。
1)声明匿名函数
a.语法
lambda 形参列表:返回值
b.说明
lambda - 关键字
形参列表 - 和普通函数的形参列表一样
: - 固定写法
返回值 - 函数体,相当于普通函数中的return
def _(形参列表):
return 返回值
2)匿名函数的调用
函数(实参列表)
注意:参数类型说明的语法在匿名函数中不能用
3)匿名函数和普通函数的关系
匿名函数能做的普通函数都能做,普通函数能做到的匿名函数不一定能做到
匿名函数在函数功能简单的情况下,代码更简洁
# 写一个匿名函数求两个数的和
func1 = lambda x, y: x+y
sum1 = func1(1, 2)
"""
def func1(x,y):
return x+y
"""
print(sum1)
func3 = lambda *nums, **kwargs: sum(nums)
num3 = func3(1, 2, 6)
print(num3)
# 练习:写一个匿名函数,判断指定的年是否是闰年
func4 = lambda years: '是' if (years % 4 == 0 and years % 100 != 0) or (years % 400 == 0) else '不是'
year = func4(2000)
print(year)
4.递归函数
1)什么是递归函数
声明函数的时候,调用自己的函数就是递归函数;循环能做的事情递归都可以做(死循环不行)
结论:解决循环问题的时候,能不用递归就不用,因为他会消耗额外的内存和cpu资源
2)怎么写递归函数
1)找临界值(让循环结束的条件),在这儿必须让函数结束(return)
2)找关系:找f(n)与f(n-1)的关系(当次循环和上次循环的关系)
3)假设函数的功能已经实现,通过f(n-1)去实现f(n)的功能
# 用递归实现:1+2+3...+n
def sum1(n):
# 1.找临界值
if n == 1:
return 1
# 2.找关系
return sum1(n-1) + n
print(sum1(100))
# 用递归实现:求斐波那契数列中的第n个数
def fib(n):
if n == 1 or n == 2:
return 1
# 关系:f(n)=f(n-1)+f(n-2)
return fib(n-1) + fib(n-2)
print(fib(18))
def print_n(n):
if n == 1:
print('*')
return
print_n(n-1)
print('*'*n)
print_n(3)