zoukankan      html  css  js  c++  java
  • python之函数的对象、函数嵌套,名称空间与作用

    一.函数的对象

        函数是第一类对象的含义是函数可以被当做数据处理

    1.引用

    2.当作参数传给一个函数

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

    4.可以当作容器类型的元素

    def pay():

        print(‘支付。。’)

    def withdraw():

        print(‘取款。。’)

    def transfer():

        print(‘转账。。’)

    defcheck_balance():

        print(‘检查余额’)

    def shopping():

        print(‘购物。。’)

    func_dic={  '1':pay,

                        '2':withdraw,
                        '3':transfer,
                        '4':check_balance,
                        '5':shopping

    }

    while True:

    msg="""

            1.支付

            2.取款

            3.转账

            4.查看余额

            5.购物

            6.退出“”

        print(msg)

       choice=input(‘>>:’).strip

       if choice == ‘5’:break

       if choice not in func_dic:

        print(‘输入的指令不存在’)

            continue    

        func_dic[choice]()

    二.函数嵌套

        嵌套定义:

    def f1():
            def f2():
            print('from f2')
        f2()

    f1()

    嵌套调用:

    # def max2(x,y):
    #     if x > y:
    #         return x
    #     else:
    #         return y
    #
    # def max4(a,b,c,d):
    #     res1=max2(a,b)
    #     res2=max2(res1,c)
    #     res3=max2(res2,d)
    #     return res3
    #

    # print(max4(1,2,3,4))

    三.名称空间与作用域

        1.名称空间namespaces

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

        2.名称空间分为三大类

            内置名称空间:

                作用:存放python解释器自带的名字

                生命周期:

                        在解释器启动时生效,在解释器关闭时失效

                全局名称空间:

                   作用:除了内置的与局部的名字外,其余都是全局名字

                    生命周期:

                        在文件执行时生效,在文件执行完毕失效

                        例如:x,func,y,l,都是

                         x=1

                        def func():

                        l=[1,2]

                    局部名称空间:

                        作用:用于存放函数调用期间函数体产生的名字

                        生命周期:

                            在文件执行过程

                            调用某个函数才会临时生效,在函数执行完毕后失效

            三种名称空间的加载顺序是:

                内置-》全局-》局部

        名称空间就是用来存放名字与值的绑定关系,所以但凡要查找名字,一定是从三者之一找到,查找顺序

        从当前所在是位置到这查找,如果当前所在的位置是局部名称空间

        则查找顺序是:

                局部-》全局-》内置

                不能跨函数找对象

    3.作用域:

        域指的是区域、范围,作用域即作用的范围

        全局作用范围,全局作用域(内置名称空间与全局名称空间)

                全局有效,全局存活

        局部作用范围,局部作用域(局部名称空间)

                局部有效,临时存活

       作用域关系是在函数定义阶段就固定死了,但凡调用函数都需要跑到定义阶段去找作用域关系

           当前函数从里往外一层一层找,找不到就找全局

    # 在局部如果想要修改全局的可变类型,不需要借助任何声明,可以直接修改

    # 在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量就可以直接修改了

        nonlocal从当前位置就近修改局部内的的值

        # x=1
    # def f1():
    #     # x=33333
    #     def f2():
    #         # x=22222222
    #         def f3():
    #             nonlocal x
    #             x=20000000000
    #         f3()
    #         print(x)
    #     f2()
    #
    # f1()
    # print(x)

  • 相关阅读:
    51nod1693 水群
    51nod 1158 全是1的最大子矩阵
    poj1192 最优连通子集(树形dp)
    51nod 1051 最大子矩阵和(dp)
    codeforces723 D. Lakes in Berland(并查集)
    51nod 1065 最小正子段和
    poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)
    51nod 1050 循环数组最大子段和
    hdu4781 Assignment For Princess(构造)
    51nod 1043 幸运号码(数位dp)
  • 原文地址:https://www.cnblogs.com/Marcki/p/10111966.html
Copyright © 2011-2022 走看看