zoukankan      html  css  js  c++  java
  • 函数对象、名称空间和作用域

    一、函数对象

    函数的名字就是函数对象,它在python中是第一类对象,函数名指向的是函数的内存地址。

    1.1 函数对象的作用:

    1、函数名可以被引用

    def bar():
        print('from bar')
    f=bar
    f()

    2、函数名可以当作参数传入

    def bar():
        print('from bar)
    def wrapper(func):  #func=bar
        func()
    wrapper(bar)

    3、可以当函数的返回值

    def bar():
        print('from bar')
    def foo(func):
        return func
    #print(bar)
    f = foo(bar)    #      f ---> bar
    #print(f)
    f()

    4、函数名可以作为容器类型的元素

    def get():
        print('from get')
    def put():
        print('from put')
    l = [get,put]
    #print(l)
    l[0]()

    1.2 函数对象的应用

    可以优雅地取代if分支

    二、函数嵌套

    作用:让内层函数封闭起来,不让外部直接调用

    2.1 函数的嵌套调用:

    在函数内又调用其他函数,将复杂并且小的功能,在函数内部调用,解决代码结构清晰问题

    def max1(x,y):
        if x > y:
            return x
        else:
            return y
    def max2(x,y,z):
        res1 = max1(x,y)
        res2 = max1(res1,z)
        return res2
    print(max2(11,199,2))

    2.2 函数的嵌套定义:

    例1:
    def func1():
        print('from func1')
        def func2():
            print('from func2')
        func2()
    func1()

    三、名称空间

    名称空间:存放名字与值绑定关系的地方,如果你想访问一个变量值,必须要先访问对应的名称空间

    名称空间的分类:

    内置名称空间:存放python解释器自带的名字。
    在启动python解释器时就生效,关闭就失效

    全局名称空间:文件级别(顶头写的名字)的名字。
    在执行文件时生效,在文件结束或者在文件执行期间被删除的就失效

    def func():  #func是全局的
        pass
    
    if 10>3:    
        y =333   #y 是全局的

    局部名称空间:存放函数内定义的名字(函数的参数以及函数内的名字都存放于局部内存空间)。
    在调用当前函数时临时生效,函数体代码执行结束时失效。

    加载顺序:内置名称空间 -->>全局名称空间-->>局部名称空间
    名称空间的查找顺序:局部名称空间-->>全局名称空间-->>内置名称空间

    len = 'global'
    def f1():
        # len = 1
        def f2():
            # len = 2
            print(len)
        len = 1
        f2()
    f1()

    四、作用域

    作用域:名称空间发挥作用的范围

    作用域的分类:

    1、全局作用域:包含的是内置名称空间与全局名称空间的名字
    特点: 只要程序一直执行,永久存活,若程序结束,则销毁

    2、局部作用域:包含的是局部名称空间的名字
    特点:只能在函数内使用,调用函数时生效,调用结束失效

    补充:
    1、global:声明全局变量

    def index():
        global x  #声明X是全局变量
        x=2
        print(x)
    index()
    print(x)

    2、nonlocal:在局部名称空间声明局部变量,在局部修改外部(上层函数)的变量

    def index():
        x=1
        def func():
            nonlocal x
            x=2
    
        func()
        print(x)
    index()
  • 相关阅读:
    设计模式之-简单工厂模式
    C# 汉语转拼音
    深入理解DIP、IoC、DI以及IoC容器
    C# 各种帮助类大全
    C# TCP多线程服务器示例
    【AtCoder】AGC004
    【AtCoder】ARC061
    【AtCoder】CODE FESTIVAL 2016 qual A
    【AtCoder】AGC005
    【AtCoder】CODE FESTIVAL 2016 qual B
  • 原文地址:https://www.cnblogs.com/wddxx/p/13666827.html
Copyright © 2011-2022 走看看