八、函数中变量的作用域:
1、全局变量与局部变量:
(1) 同一级的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
(2) 定义在函数内部的变量拥有一个局部作用域,定义在函数外的相当于这个函数的全局作用域。局部作用域
可以访问全局作用域,反之不行。
2、局部作用域修改全局变量:
(1)可变数据类型:对于可变类型的全局变量来说,要在函数中修改可以不使用global声明。
(2)不可变数据类型:对于不可变类型的全局变量来说,要在函数中修改需要global声明。
a = 1
def func():
global a
a = 2
print(a) 2
func()
print(a) 2
九、匿名函数(lambda表达式):
1、lambda 来创建匿名函数规则:
lambda匿名函数的表达式规则是:lambda 行参列表: 表达式
●lambda只是一个表达式,函数体比def简单很多。
●lambda与Javascript不同的是,python中匿名函数与非匿名函数需要使用不同的语法
●lambda的主体是一个表达式,而不是一个代码块,所以不能写太多的逻辑进去。
●lambda函数拥有自己的命名空间,且不能访问自有 型参列表 之外或全局命名空间里的参数。
●lambda定义的函数的返回值就是表达式的返回值,不需要return语句块
●lambda表达式的主要应用场景就是赋值给变量、作为参数传入其它函数
2、与列表解析混合实例:
注意:列表解析属于表达式,其得到的结果是列表,列表解析并不是函数。
list1 = [1,2,3,4,5,6,7]
func1 = lambda list:[i for i in list if i > 3] # 赋值函数名
func1(list1) # 没有结果 ,需要打印返回值
print(func1(list1)) # [4, 5, 6, 7]
列表解析:
print([i for i in list if i > 3]) # [4, 5, 6, 7]
十、递归函数:
1、特性:
- (1)递归函数本质:一句话,自己调用自己 并且 等待 最深层 的 返回值。
- (2)递归函数的适用场景 :大量 动态次数 递进式 重复代码
- (2)递归函数一定有极限值。
- (3)递归函数倒着来计算极限值(第一项)。
2、简单例子:
3、代码:
题目:求未知层数的嵌套列表中所有元素的和:
list1 = [1,2,3,5,[1,2,3,[10,10,[3,4,5],10],4],6,7]
def list_sum(list_):
num = 0
for once in list_:
if type(once) == list:
num += list_sum(once) -------------- 递归下一层并等待返回值
else:
num += once
return num
print(list_sum(list1))
================================== 斐波那契数列 =====================================================
def feibo(day):
if day == 1:
return 1
if day == 2:
return 1
return feibo(day -1) + feibo(day -2)
# print(feibo(9))
list1 = [feibo(x) for x in range(1,11)] -------- 列表解析
----------------- 返回值解析---------
return feibo(day -1) + feibo(day -2)
feibo(5) = feibo(4) + feibo(3) >>>>> feibo(3) + feibo(2) + feibo(2) + feibo(1) >>>
feibo(2) + feibo(1) + feibo(2) + feibo(2) + feibo(1) == 5 即找到最里面的return值