zoukankan      html  css  js  c++  java
  • day11 函数嵌套 名称空间 作用域 函数对象 函数对象的应用 闭包函数

    一.函数嵌套

    函数的嵌套调用:在函数内又调用了其他函数

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

    函数的嵌套定义:在函数内又定义其他函数

    def func1():
        print('from func1')
        def func2():
            print('from func2')
    
        print(func2) #<function func1.<locals>.func2 at 0x000001F9316009D8>
        func2()
        func2()
    
    func1()
    
    
    def f1():
        print('f1')
        def f2():
            print('f2')
            def f3():
                print('f3')
            f3()
        f2()
    f1()
    
    '''
    f1
    f2
    f3
    '''

    二.名称空间

    什么是名称空间?

    存放名字与值绑定关系的地方

    名称空间分为三类

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

    2、全局名称空间:文件级别的名字,在执行文件的时候生效,在文件结束或者在文件执行期间则失效

    3、局部名称空间:存放函数内定义的名字(函数的参数以及函数内的名字都存放于局部名称空间),在函数调用时临时生效,函数结束则失效

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

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

    # len='global'
    def f1():
        # len=1
        def f2():
            # len=2
            print(len)
    
        # len = 1,这样可以
        f2()
        len=1#内置名字不要去覆盖,这样会报错
    
    f1()

    三.作用域

    全局作用域:包含的时内置名称空间与全局名称空间的名字

    特点

    1在任何位置都能访问的到

    2该范围内的名字会伴随程序整个生命周期

    局部作用域:包含的时局部名称空间的名字

    特点:

    1、只能在函数内使用

    2、调用函数时生效,调用结束失效

    四.函数对象

    #函数在python中是第一类对象?
    
    #1、可以被引用
    # x=1
    # y=x
    
    # def bar():
    #     print('from bar')
    #
    # f=bar
    # f()
    
    #2、可以当中参数传入
    # x=1
    # def func(a):
    #     print(a)
    #
    # func(x)
    
    
    
    # def bar():
    #     print('from bar')
    #
    # def wrapper(func): #func=bar
    #     func() #bar()
    #
    # wrapper(bar)
    
    
    #3、可以当中函数的返回值
    # x=1
    # def foo():
    #     return x
    #
    # res=foo()
    # print(res)
    
    
    
    # def bar():
    #     print('from bar')
    #
    # def foo(func): #func=<function bar at 0x00000225AF631E18>
    #     return func #return <function bar at 0x00000225AF631E18>
    #
    #
    # # print(bar)
    # f=foo(bar) #f=<function bar at 0x00000225AF631E18>
    # # print(f)
    # f()
    
    
    #4、可以当中容器类型的元素
    # x=1
    # l=[x,]
    #
    # print(l)
    
    # def get():
    #     print('from get')
    #
    # def put():
    #     print('from put')
    #
    # l=[get,put]
    #
    # # print(l)
    # l[0]()

    五.函数对象的应用

    #函数在python中是第一类对象?
    
    #1、可以被引用
    # x=1
    # y=x
    
    # def bar():
    #     print('from bar')
    #
    # f=bar
    # f()
    
    #2、可以当作参数传入
    # x=1
    # def func(a):
    #     print(a)
    #
    # func(x)
    
    # def bar():
    #     print('from bar')
    #
    # def wrapper(func): #func=bar
    #     func() #bar()
    #
    # wrapper(bar)
    
    #3、可以当作函数的返回值
    # x=1
    # def foo():
    #     return x
    #
    # res=foo()
    # print(res)
    
    
    
    # def bar():
    #     print('from bar')
    #
    # def foo(func): #func=<function bar at 0x00000225AF631E18>
    #     return func #return <function bar at 0x00000225AF631E18>
    #
    #
    # # print(bar)
    # f=foo(bar) #f=<function bar at 0x00000225AF631E18>
    # # print(f)
    # f()
    
    
    #4、可以当中容器类型的元素
    # x=1
    # l=[x,]
    #
    # print(l)
    
    # def get():
    #     print('from get')
    #
    # def put():
    #     print('from put')
    #
    # l=[get,put]
    #
    # # print(l)
    # l[0]()
    
    def func():
        print('from func')
    
    #1、func可以被引用
    # f=func
    
    #2、func可以当作参数传给x
    # def bar(x):
    #     print(x)
    #     x()
    #
    # bar(func)
    
    #3、func还可以当作返回值
    # def bar(x): # x=func
    #     return x #return func
    #
    # res=bar(func) #res=func
    # # print(res)
    # res()
    
    
    #4 可以当中容器类型的元素
    def auth():
        print('登陆。。。。。')
    
    def reigster():
        print('注册。。。。。')
    
    def search():
        print('查看。。。。')
    
    def transfer():
        print('转账。。。。')
    
    def pay():
        print('支付。。。。')
    
    dic={
        '1':auth,
        '2':reigster,
        '3':search,
        '4':transfer,
        '5':pay
    }
    
    # print(dic)
    # dic['2']()
    
    def interactive():
        while True:
            print("""
            1 认证
            2 注册
            3 查看
            4 转账
            5 支付
            """)
            choice=input('>>: ').strip()
            if choice in dic:
                dic[choice]()
            else:
                print('非法操作')
    
    
    interactive()
    
    # l=[auth,reigster,search,interactive]
    # print(l)
    

      

    六.闭包函数

    闭指的是定义在函数内部的函数

    !!!作用域关系 在函数定义阶段就规定死了,与调用位置无关

    def outter():
        x=2
        def inner():
            # x=1
            print('from inner',x)
    
        return inner
    
    
    f=outter() #f=inner
    # print(f)
    # x=1111111111111111111
    # f()
    
    
    def foo():
        x=1111111111111111111111111111
        f()
    
    foo()
    

    闭包函数

    1:定义在函数内部的函数

    2:并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数

    def outter():
        name='egon'
        def inner():
            print('my name is %s' %name)
        return inner
    f=outter()
    

    了解:

    为函数体传值得方式

    方式一:

    import requests
    
    def get(url):
        response=requests.get(url)
        if response.status_code == 200:
            print(response.text)
    
    get('https://www.baidu.com')
    

    方式二:

    import requests
    import time
    
    def outter(url): #url='https://www.baidu.com'
    
        # url='https://www.baidu.com'
        def get():
            response=requests.get(url)
            if response.status_code == 200:
                print(response.text)
    
        return get
    
    baidu=outter('https://www.baidu.com')
    python=outter('https://www.python.org')
    
    baidu()
    print('=====================>')
    time.sleep(3)
    
    baidu()
    

      

      

  • 相关阅读:
    FJNU 1151 Fat Brother And Geometry(胖哥与几何)
    FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术)
    FJNU 1159 Fat Brother’s new way(胖哥的新姿势)
    HDU 3549 Flow Problem(最大流)
    HDU 1005 Number Sequence(数列)
    Tickets(基础DP)
    免费馅饼(基础DP)
    Super Jumping! Jumping! Jumping!(基础DP)
    Ignatius and the Princess IV(基础DP)
    Keywords Search(AC自动机)
  • 原文地址:https://www.cnblogs.com/wangmiaolu/p/10027706.html
Copyright © 2011-2022 走看看