python-函数对象应用
Posted guyanzhi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-函数对象应用相关的知识,希望对你有一定的参考价值。
---恢复内容开始---
1、函数对象
在面向对象编程中,一切皆对象。所以函数也可以当作对象来操作。
比如将函数func1作为参数传给func2内部、或将func1在func2内返回(return)、将函数作为列表的元素,字典的vaule ......等
注意这些操作中,作为对象的func1是没有加()的,也就是作为一个对象,被当作值使用,而不是直接调用执行func1内的代码。
这就是函数对象的概念。
运用这个概念,可以简单的写一个函数字典:
def register(): print("register......") def auth(): print("login....") def check(): print("checking....") func_dict = {"1": register, "2": auth, "3": check} while True: func_list = ["注册", "登录", "查看"] for i, item in enumerate(func_list, start=1): print(i, item) cmd = input(" inpput cmdmand>>") if func_dict.get(cmd): func_dict.get(cmd)() else: print("输入有误")
既然函数是对象,函数的操作都可以在其他函数内操作,比如定义和调用:
def open_door(): print("打开冰箱门") def putin(): print("把大象放进冰箱") def close_door(): print("关上冰箱门") close_door() putin() open_door()
2、名称空间和作用域
名称空间(命名空间)有如下几种:
名称空间:存储 名称与内存地址绑定体(名称与地址的映射) 的空间,它有三种:
内置名称空间(Built-in):存放python自带的名称与值的绑定体,len、 print、 sum等内置方法的名字,注意关键字比如if、while...不存放在其中
在python解释器启动时创建,一直保留直到解释器退出。
全局名称空间(Global):当打开一个文件然后执行时,全局名称空间记录了文件中定义的变量,包括此文件中定义的函数、类、其他导入的模块、模块级的变量与常量。
在.py文件被加载时创建,通常一直保留直到文件执行结束,python解释器退出销毁
局部名称空间(Local):每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量。
在函数被调用时才被创建,但函数返回结果或抛出异常时被删除。(每一个递归函数都拥有自己的命名空间)。
此外,如果函数多层嵌套,介于全局和局部间,还有当前所在层函数的名称空间,比如函数嵌套定义时,putin()函数有自己的名称空间,也可以看作局部名称空间,只不过
它的子函数close_door()还有自己的局部名称空间(Local),即,局部是相对的。
名称空间的加载顺序:内置======》全局======》局部
名称空间的访问顺序:局部===逐层往上===》全局====》内置
作用域,即名称空间的作用范围,有Global广义化为—— 全局+内置名称空间、Local—— 局部名称空间
可以用 print(global()) 和在局部用print(local()) 查看当前位置的作用域内都有哪些"名称”。
还可以用 global 变量名 的方式,将变量声明为全局变量。nonlocal 变量名,将会声明:之后在当前作用域使用这个变量,将会引用外层(优先上一层)变量,但引用不到全局。
函数的作用域在定义时就固定了,与之后调用函数的位置无关!!!!
函数的作用域在定义时就固定了,与之后调用函数的位置无关!!!!
函数的作用域在定义时就固定了,与之后调用函数的位置无关!!!!
3、闭包函数
定义在一个函数func1内的函数func2,在返回内部函数func2时,不是单纯返回此函数的地址,还将函数中访问到的本层和上一层(非全局)名称与值的映射一起返回了。
4、装饰器
为什么用:有开闭原则限制
---恢复内容结束---