zoukankan      html  css  js  c++  java
  • 函数对象/函数的嵌套定义与调用/名称空间和作用域

    一.函数对象

    函数时第一类对象:函数名指向的值可以被当作参数传递

      1.函数名可以被传递

      2.函数名可以被当作参数传递给其他函数

      3.函数名可以当作函数的返回值

      4.函数名可以当作容器类型的参数

    1.函数名可以被传递

    def func():
        print('from func')
    f=func
    f()  # from func
    func()  # from func
    print(id(f))  # 2562541772872
    print(id(func))  # 2562541772872
    def index(args):
        print(args)  # <function func at 0x0000022348E58C80>
        args()
        print('from index')  #   form func
    def func():
        print('form func')  #  from index
    index(func)

    3.函数名可以当作函数的返回值

    def index():
        print('index')
    def func():
        print('func')
        return index
    res = func()  # 将函数func的返回值index赋值给res
    print(res)  # <function index at 0x0000021073B96048>
    print(index)  # <function index at 0x0000021073B96048>
    res()  # index

    4.函数名可以当作容器类型的参数

    sg = """
    1 注册
    2 登陆
    3 购物
    4 支付
    5 转账
    """
    
    def register():
        pass
    def login():
        pass
    def shopping():
        pass
    def pay():
        pass
    def transfer():
        pass
    msg_info = {
        '1':register,
        '2':login,
        '3':shopping,
        '4':pay,
        '5':transfer,
    
    }
    while True:
        print(msg)
        choice = input('请选择功能').strip()
        if choice in msg_info:
            # msg_info.get(choice)()
            msg_info[choice]()
        else:
            print('请输入正确功能编号')
    View Code

    二.函数的嵌套调用和定义

    2.1函数的嵌套调用

    作用:可以将复杂的功能简单化,分成若干小功能

    def max2(x,y):
        if x > y:
            return x
        return y
    def max4(a,b,c,d):
        res=max2(a,b)
        res1=max2(res,c)
        res2=max2(res1,d)
        return res2
    print(max4(1,2,3,4))  # 4

    2.2函数的嵌套定义

    def func():
        def func1():
            deffunc2():
                print('today is a beautiful day')
            func2()
        func1()
    func()
    View Code

    三.名称空间

    定义:存放的是变量名与变量值的内存地址得绑定关系得地方

    名称空间得分类:

      1.内置名称空间

      2.全局名称空间

      3.局部名称空间

    1.内置名称空间:python解释器提前给你定义好的名字(已经存放在内置名称空间中了)

    eg:len, print ,max,min

    2.全局名称空间:文件级别得代码(顶头写的)

    x = 1
    
    if x>p:
        y = 2
    print(y)
    
    while True:
        z = 3

    上述中得x,y,z都是全局名称空间。

    3.局部名称空间:函数体内创建得名字都属于局部空间

    4.名称空间得生命周期:

      4.1内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁

      4.2全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁 

      4.3局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)

    5.名字得查找顺序:首先确定当前位置

              1.站在全局:全局---->内置

              2.站在局部:局部---->全局---->内置

    len = '我是全局名称空间的len'
    def func():
        len = '我是局部名称空间的len'
        print(len)
    func()  # 我是局部名称空间的len
    
    len = '我是全局名称空间的len'
    def func():
        # len = '我是局部名称空间的len'
        print(len)
    func()  # 我是全局名称空间的len
    
    
    # len = '我是全局名称空间的len'
    def func():
        # len = '我是局部名称空间的len'
        print(len)
    func()  # <built-in function len>
    View Code

    ps:函数在定义阶段查找名字的顺序就已经固定了,不会因为函数调用位置变化而变化(*******)

    x = 111  #若此行没有会去内置空间中查找,若内置名称空间没有会报错
    def f1():
        x = 222  # 若此行没有输出为111
        def f2():
            x = 333  # 若此行没有输出为222
            def f3():
                x = 444  # 若此行没有输出为333
                def f4():
                    x = 555  # 若此行没有输出为444
                    print(x) # 输出为555
                f4()
            f3()
        f2()
    f1()

     练习题:

    x=111
    def outer():
        def inner():
            print('from inner',x)
        return inner
    f=outer()
    x = 222
    f()  # from inner 222
    
    x=111
    def outer():
        def inner():
            print('from inner',x)
        return inner
    f=outer()
    def func():
        x=333
        f()
    func()  # from inner 111
    
    
    x=111
    def outer():
        def inner():
            print('from inner',x)
            x = 66666666
        return inner
    f=outer()
    f()  # 报错  因为在索要寻找的名字在本层有不必去外层寻找,但是在输出之前x还未定义
    View Code

    四.作用域

    作用域的分类:

      1.全局作用域:全局有效(包含内置名称空间和全局名称空间)

      2.局部作用域:局部有效(局部名称空间)

    2个修改指令globa和nonlocal

    global:可以在局部修改全局不可变的变量

    x = 1  # 不可变类型
    def func():
        global x,username  # 修改全局变量 而不是创建局部名称空间
        x = 999
    func()
    print(x)  # 999

    ps:若要修改可变类型可直接修改,如果想修改多个可以在global后添加多个,中间用逗号隔开

    nonlocal:在局部修改局部变量

    def func():
        x = 1
        def index():
            nonlocal x  # 若想修改多个在nonlocal后添加中间用逗号隔开
            x = 2
        index()
        print(x)
    func()  # 2
    View Code
  • 相关阅读:
    DOM
    js中字符串常规操作
    placeholer改变默认灰色
    css重置reset.css
    倒计时跳转
    手机中间四位用*代替
    animation
    过渡
    flex布局
    css3几个新属性
  • 原文地址:https://www.cnblogs.com/z929chongzi/p/11164818.html
Copyright © 2011-2022 走看看