python学习day23笔记

今日内容

函数对象

函数是第一类对象

1.函数可以被赋值
def foo():
    print('hello world')
f = foo
f()

2.函数可以当做参数传给另一个函数
def foo():
    print('hello world')
def func(f):
    f()
func(foo)  # --> f = foo --> f() = foo()

3.函数可以当做函数的返回值
def foo():
    print('hello world')
def func(f):
    return f
res = func(foo)  # res指向foo函数内存地址

4.函数可以当做容器类型的元素
def foo():
    print('hello world')
l = [foo]
l[0]()  # 执行foo函数

# 优雅的用函数可以被当做容器类型的特性来替代多分支的if判断
def dl():
    print('登录'.center(50,'*'))
def zc():
    print('注册'.center(50,'*'))
dict1 = {
    '0':['退出',exit],
    '1':['登录',dl],
    '2':['注册',zc],
}
while True:
    for i in dict1:
        print(f'{i}   {dict1[i][0]}')
    choice = input('请输入命令编号>>>').strip()
    if choice in dict1:
        dict1[choice][1]()
    else:
        print('输入有误请重新输入')

函数嵌套

函数的嵌套调用

在调用一个函数的过程中,该函数内部又动用了其他函数
作用:可以将大工程打散成为一个个小函数,类似于拼高达
def max1(a,b):
    if a>b:
        return a
    if a<b:
        return b
def max2(a,b,c,d):
    res1 = max1(a,b)
    res2 = max1(res1,c)
    res3 = max1(res2,d)
    print(res3)
max2(654,846,1235,846)

函数的嵌套定义

在函数内又定义了其他函数
特点:函数内是封闭的,外面调用不到里面的参数
def a(a,mode=0):
    def b(a):
        return a*10
    def c(a):
        return a*20
    if mode == 0:
        return b(a)
    elif mode == 1:
        return c(a)
res = a(10,1)
print(res)

名称空间与作用域

名称空间

Namespace:存放名字与内存地址绑定关系的地方
名称空间分为三大类:
    内置名称空间:放的是python自带的名字,例如print\len\input
    全局名称空间:放的是顶级的名字,如下x\y\foo
        生命周期:运行python文件则立即产生,python文件运行完毕则结束
        x = 111
        if 10 > 3:
            y = 222
        def foo():
            z = 333
    局部名称空间:放的是函数内的名字,如上z
        生命周期:调用函数则产生,函数调用完毕则销毁
快捷名:内置->b  全局->g  局部到自己所在局部的局部中间的全部->e  自己所在的局部的局部->l
重要结论1:名字的查找优先级  局部->全局->内置  基于自己当前的位置向外查找
重要结论2:名称空间的嵌套关系是以函数定义为准生成的,与调用位置无关
  
例1:
def foo():
    print(len)
len = 100
def bar():
    len = 666
    foo()
bar()  # 输出100

例2:
x = 100
def f1():
    print(x)
    x = 222
f1()  # 报错  原因:函数先定义,定义过程中在函数内发现x,所以在函数内找,此时语法错误

例3:
x = 1
def f1():
    x = 2
    def f2():
        x = 3
        print(x)
    f2()
f1()

global关键字

global关键字:引用全局变量
    
x = 1
def f1():
    x = 2
    def f2():
        global x  # 把全局变量引用进来,修改则直接修改全局变量x
        x = 3
        print(x)
    f2()
f1()

nonlocal关键字

nonlocal关键字:引用上一级函数变量,只找函数层面,如果函数层面没有则报错
    
x = 1
def f1():
    x = 2
    def f2():
        nonlocal x  # 把上级函数变量引用进来,修改则直接修改上级函数变量x
        x = 3
        print(x)
    f2()
f1()

作用域

全局作用域:全局存活,全局有效
    内置名称空间,全局名称空间
局部作用域:临时存活,局部有效
    局部名称空间

闭包函数

闭包函数:函数对象+函数嵌套定义+名称空间与作用域
    
闭函数:定义在函数内部的函数  
包函数:内部函数引用了一个外层函数的名字
    
# 如何将闭函数在全局环境使用
def foo():
    x = 111
    def wrapper():
        print(x)
    return wrapper
x = 222
f = foo()
f()  # =wrapper()  得到111

闭包的函数的作用:闭包函数是一种为函数体传参的方法
为函数体传参方案一:直接使用形参
def wrapper(x):
    print(x)
wrapper(111)
wrapper(222)
wrapper(333)

为函数体传参方案二:
def outter(x):
    def wrapper():
        print(x)
    return wrapper  # 再使wrapper()回到顶级
posted @ 2021-07-05 20:34  麋鹿的麋  阅读(49)  评论(0)    收藏  举报