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()
    

      

      

  • 相关阅读:
    LeetCode24-Swap_Pairs
    LeeCode
    LeetCode3-Longest_Substring_Without_Repeating_Characters
    治愈 JavaScript 疲态的学习计划【转载】
    前端冷知识集锦[转载]
    知道这20个正则表达式,能让你少写1,000行代码[转载]
    关于简历和面试【整理自知乎】
    正念冥想方法
    一些职场经验【转载自知乎】
    犹太复国计划向世界展现了一个不一样的民族——观《犹太复国血泪史》有感
  • 原文地址:https://www.cnblogs.com/wangmiaolu/p/10027706.html
Copyright © 2011-2022 走看看