Python全栈-day10-函数2

时间:2022-05-25 03:27:27

函数高级篇

1.函数嵌套

  1)嵌套定义

    在函数内定义另外一个函数

def func():
    print('嵌套定义')
    def func1():
        print('这是一个嵌套函数')
        def func2():
            print('第二层级嵌套函数')
        func2()
     # 只能在函数内调用嵌套的函数
     # 嵌套函数只能在当前函数处在的层级进行调用
    func1()
func()

  2)嵌套调用

    函数内调其它函数

def max(x,y):
    if x > y:
        return x
    else:
        return y
def func(x):
    print(x)
func(max(10,20))

2.名称空间

  1)定义:

    存储变量名和变量值的绑定关系

  2)分为三类:

    a.内置名称空间

      内置名:Python解释器自带的,如print等内置方法名

      作用时间:在打开解释器时生效,关闭时失效

      作用域:整个Python解释器,具有全局特性

    b.全局名称空间

      全局名:文件级别的名字

      作用时间:Python脚本执行时候生效,文件结束或者文件执行期间被删除的时候失效

      作用域:整个脚本范围内

    c.局部名称空间

      局部名:函数内部的名字

      作用时间:函数调用时生效,结束调用时失效

      作用域:函数内部

要点:

  名称查询顺序:

    局部名称空间  >  全局名称空间  >  内置名称空间

3.作用域

    1)全局作用域

      范围:内置名称空间、全局名称空间

      特点:

        a.在任何位置都可以访问

        b.该范围内的名字会伴随着整个生命周期

    2)局部作用域

      范围:包含的事局部名称空间的名字

      特点:

        a.只在函数内使用

        b.调用函数时生效,调用结束时失效

4.函数对象

  函数在Python是第一对象,可以被引用

  1)函数可以被引用

def func():
    pass
f = func      # 函数的内存地址赋值给其他变量

  2)函数可以当做参数传入

def bar(x):
    print(x)
bar(func)

  3)函数可以被当做返回值返回(函数的返回值可以是任意类型

def bar(x):
    return x  # 返回func函数的内存地址
bar(func)

  4)可以当做任何容器类型的元素

def auth():
    print('认证...')
def register():
    print('注册...')
def search():
    print('查看...')
def transfer():
    print('转账...')

# 后续需要添加先功能可直接将定义好的功能函数名!!!加到字典中
# 无序大量更改交互函数的代码
func_dict = {
    '1':auth,
    '2':register,
    '3':search,
    '4':transfer
}
def interaction():
    while True:
        print('''
        用户交互:
        1 认证
        2 注册
        3 查看
        4 转账
        输入quit退出
        ''')
        choice = input('选择操作>>').strip()
        if choice in func_dict:
            func_dict[choice]()
        elif choice == 'quit':
            break
        else:
            print('非法操作...')

# 函数调用
interaction()

# 将函数的内存地址赋值给列表
l = [auth,register,search,interaction]

5.函数闭包

  1)定义

    a.定义在函数的函数

    b.并且该函数包含对外部函数作用域中名字的引用

  2)闭

    指定义在函数内部的函数

    作用域关系在函数定义时已经定义好,与函数在哪里被调用无关!!!

def outer():
    def inner():
        x = 10
        print('from inner...',x)
    # 将函数的内存地址返回给outer
    return inner

# 函数的返回值赋值给全局变量outer
# 相当于把inner的内存地址复制给一个全局变量
return_inner = outer()

# 间接调用了inner()
x = 100
return_inner()      # 与调用位置无关,输出 x 依旧为原函数内x的值

def bar():
    x = 99
    return_inner()
bar()

 

闭包高级使用:装饰器
  http://www.cnblogs.com/mdzzbojo/p/8669485.html