函数------作用域、匿名函数,高阶函数、递归
一、名称空间
顾名思义就是存放名字的地方;举例:若变量X=1,1存放在内存中,是存放名字X与1绑定关系的地方。
名称空间有三种:
1.locals:函数内的名称空间,包括局部变量和形参
2.globals:全局变量,函数定义锁在模块的名字空间
3.builtins: 内置模块的名字空间
二、作用于的查找顺序
LEGB顺序
locals--->enclosing(外部嵌套函数的名称空间)--->globals--->builtins
一、作用域
全局作用域:全局存活,全局有效;局部作用域:局部存活,局部有效。
1.python中函数就是一个作用域,局部变量是放在其作用域中的
2.函数定义完成时,作用域已经生成,作用域会一层一层往上找
age = 12 def func(): age = 22 def func1(): print(age) return func1 # 函数名可以是返回值 val = func() val() >>>>>22
global 声明变量(全局)
nonlocal 修改函数外层函数包含的变量对应的值(不可变类型)【一层一层往外找】
二、匿名函数
1.节省代码量
2.只支持简单的语境(三元运算)
应用场景:用于临时调用一次的场景;更多的是与其他函数配合使用。
def func(x,y): if x > y: return x*y else: return x/y print(func(6,3)) >>>>18 func1 = lambda x,y:x*y if x > y else x/y # 声明一个函数,调用时需要赋值 print(func1(6,3)) >>>>18
三、高阶函数
变量可以指向函数,函数的参数可以接受变量,那么一个函数就可以接受另一个函数作为参数,这种函数就称为高阶函数。
只需要满足其中任意一个条件,就可以称为高阶函数:
1.接受一个或者多个函数作为输入
2.return 返回另一个函数
四、递归介绍
4.1 函数在调用时,调用自己。递归的本质就是循环。
def func(n): print(n) func(n+1) func(1)
递归的两个阶段:
回溯:一层一层的调用下去
递推:满足某种结束条件,结束递归调用,然后一层一层返回
4.2 递归的作用
# 阶乘的演示 def func(n): if n == 1: return 1 return n * func(n-1) print(func(4))
def func(n): v = int(n / 2) print(v) if v == 0: return None func(v) func(10)
4.3 特点:
1.必须有一个结束条件,要不就会变成死循环,最终撑爆系统
2.每一次进入更深一层次的递归时,问题规模相比比上一次递归都应有所减少
3.递归执行效果不高,递归层次过多会导致栈溢出
4.4 尾递归优化
定义:上一层或者下一层循环一本层循环没有应用关系的
def func(n): print(n) return func(n+1) func(1)