一 函数对象
在面向对象编程中 一切皆对象
函数是第一类对象 也就是说可以把函数的内存地址当作一种变量值去使用
而变量值:
l 可以被引用
ll 可以当作参数传递
lll 返回值可以是函数的
lv 可以当作容器类型的元素
so,函数可以(不加()时)作为一个对象,被当作值使用,而不是直接调用执行函数内代码。
这就是函数对象的概念,运用这个概念,可以简单的写一个函数字典:
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):65 #enumerate是将(可遍历的数据对象)列表组合为一个索引序列,同时列出数据和数据下标,通常用在for循环中 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() 嵌套调用
三 空间名称
名称空间namespace:存放 名字与值内存地址绑定关系 的地方
1.内置名称空间(Built-in):存放python自带的名称与值的绑定体,len、 print、 sum等内置方法的名字,注意关键字比如if、while...不存放在其中
产生:在python解释器启动时创建
销毁:python解释器退出时关闭
2.全局名称空间(Global):当打开一个文件然后执行时,全局名称空间记录了文件中定义的变量,包括此文件中定义的函数、类、其他导入的模块、模块级的变量与常量。
产生:在.py文件被加载时创建,通常一直保留直到文件执行结束
销毁:python解释器执行python程序完毕后退出销毁
3.局部名称空间(Local):每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的参数、内部定义的局部变量。
产生:在函数被调用时才被创建
销毁:但函数返回结果或抛出异常时被删除。(每一个递归函数都拥有自己的命名空间)。
如果函数多层嵌套,介于全局和局部间,还有当前所在层函数的名称空间,比如函数嵌套定义时,putin()函数有自己的名称空间,也可以看作局部名称空间,只不过
它的子函数close_door()还有自己的局部名称空间(Local),即,局部是相对的。
名称空间的加载顺序:内置======》全局======》局部
名称空间的访问顺序:局部===逐层往上===》全局====》内置
四、作用域:名称空间的作用范围
Global广义化为—— 全局+内置名称空间
Local—— 局部名称空间。可以用 print(global()) 和在局部用print(local()) 查看当前位置的作用域内都有哪些"名称”。
还可以用 global 变量名 的方式,将变量声明为全局变量。nonlocal 变量名,将会声明:之后在当前作用域使用这个变量,将会引用外层(优先上一层)变量,但引用不到全局。
函数的作用域在定义时就固定了,与之后调用函数的位置无关!!!!
函数的作用域在定义时就固定了,与之后调用函数的位置无关!!!!
函数的作用域在定义时就固定了,与之后调用函数的位置无关!!!!
五、闭包
定义在一个函数func1内的函数func2,在返回内部函数func2时,不是单纯返回此函数的地址,还将函数中访问到的本层和上一层(非全局)名称与值的映射一起返回了。