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)

posted @ 2018-06-07 18:56  Marcki  阅读(309)  评论(0编辑  收藏  举报