10-函数命名空间,作用域,嵌套,闭包

时间:2021-08-14 22:45:54

函数命名空间,作用域,嵌套,闭包

复习:

函数的优点:可读性强,复用性强

函数如何定义:

def 函数名():
    # 函数体
    # return 返回值

所有的函数 只定义不调用就一定不执行,函数需要先定义,后调用

调用函数:

函数名()  # 不接收返回值
返回值 = 函数名() # 接收返回值

return返回值有几种情况:

  • 没有返回值:默认返回None
    •   不写return : 函数内的代码执行完毕自动结束
    •         只写return : 结束一个函数
    •         return None         
  • 返回一个值: 结束了函数且返回一个值
  • 返回多个值:
    •   多个值之间用逗号隔开,接收的时候可以用一个变量接收,这个变量print的时候,就是一个元祖
    •        多个值之间用逗号隔开,也可以用多个变量接收,每个变量的值为对应的值的结果

参数:

  • 形参: 定义参数的时候
    •   位置参数: 必须传
    •        *args  : 动态参数,可以接收多个按位置传入的参数
    •         默认参数: 可以不传----因为在对应的位置的参数有了默认的值了
    •         **kwargs:     动态参数  可以接收多个关键字传入的参数
  • 实参: 调用函数的时候
    •   按照位置传参数
    •        按照关键字传参数
      •   可以混合用,位置参数必须在关键字参数前面
      •         不能对一个参数重复赋值

 新内容

函数的命名空间

有三种:

内置命名空间:python解释器一启动,加载到内存里的变量所在的范围,可以直接调用

全局命名空间: 在函数外部的空间

局部命名空间:在函数内部的空间

函数的作用域:

全局作用域:内置和全局命名空间的变量都属于全局作用域,作用在全局

局部作用域:函数内部的变量属于局部作用域,作用在局部

变量:

全局变量:在函数外部定义的变量,作用范围:整个程序

局部变量:在函数内部定义的变量,作用范围:所在的函数

global ,nolocal , globals,locals,

global : 在函数内部想要修改全局变量的时候,使用global

nolocal:  在嵌套函数中调用上一层函数的变量

globals: 查看全局和内置空间的变量

locals:  查看当前所在空间范围的变量

 嵌套函数

# 函数嵌套的定义
# 内部函数可以使用外部函数的变量
a = 1
def outer():
    a = 1
    def inner():
        a = 2
        def inner2():
            nonlocal  a # 声明了一个上面第一层的局部变量
            a += 1
        inner2()
        print('##a##',a )
    inner()
    print('##2##' , a )
outer()
print('全局a',a)

高阶函数:

需要满足的条件:满足任意一个就行

接收一个或多个函数作为输入

return 返回另一个函数

 递归函数

定义:在函数内部,可以调用其他函数,如果一个函数在内部调用自己本身,

特性:

必须有一个明确的条件

每次进入更深一层递归时,问题规模相比上次递归都应有所减少

递归效率不高,递归层次过多会导致栈溢出