函数高级篇
1.函数嵌套
1)嵌套定义
在函数内定义另外一个函数
def func(): print('嵌套定义') def func1(): print('这是一个嵌套函数') def func2(): print('第二层级嵌套函数') func2() # 只能在函数内调用嵌套的函数 # 嵌套函数只能在当前函数处在的层级进行调用 func1() func()
2)嵌套调用
函数内调其它函数
def max(x,y): if x > y: return x else: return y def func(x): print(x) func(max(10,20))
2.名称空间
1)定义:
存储变量名和变量值的绑定关系
2)分为三类:
a.内置名称空间
内置名:Python解释器自带的,如print等内置方法名
作用时间:在打开解释器时生效,关闭时失效
作用域:整个Python解释器,具有全局特性
b.全局名称空间
全局名:文件级别的名字
作用时间:Python脚本执行时候生效,文件结束或者文件执行期间被删除的时候失效
作用域:整个脚本范围内
c.局部名称空间
局部名:函数内部的名字
作用时间:函数调用时生效,结束调用时失效
作用域:函数内部
要点:
名称查询顺序:
局部名称空间 > 全局名称空间 > 内置名称空间
3.作用域
1)全局作用域
范围:内置名称空间、全局名称空间
特点:
a.在任何位置都可以访问
b.该范围内的名字会伴随着整个生命周期
2)局部作用域
范围:包含的事局部名称空间的名字
特点:
a.只在函数内使用
b.调用函数时生效,调用结束时失效
4.函数对象
函数在Python是第一对象,可以被引用
1)函数可以被引用
def func(): pass f = func # 函数的内存地址赋值给其他变量
2)函数可以当做参数传入
def bar(x): print(x) bar(func)
3)函数可以被当做返回值返回(函数的返回值可以是任意类型)
def bar(x): return x # 返回func函数的内存地址 bar(func)
4)可以当做任何容器类型的元素
def auth(): print('认证...') def register(): print('注册...') def search(): print('查看...') def transfer(): print('转账...') # 后续需要添加先功能可直接将定义好的功能函数名!!!加到字典中 # 无序大量更改交互函数的代码 func_dict = { '1':auth, '2':register, '3':search, '4':transfer } def interaction(): while True: print(''' 用户交互: 1 认证 2 注册 3 查看 4 转账 输入quit退出 ''') choice = input('选择操作>>').strip() if choice in func_dict: func_dict[choice]() elif choice == 'quit': break else: print('非法操作...') # 函数调用 interaction() # 将函数的内存地址赋值给列表 l = [auth,register,search,interaction]
5.函数闭包
1)定义
a.定义在函数的函数
b.并且该函数包含对外部函数作用域中名字的引用
2)闭
指定义在函数内部的函数
作用域关系在函数定义时已经定义好,与函数在哪里被调用无关!!!
def outer(): def inner(): x = 10 print('from inner...',x) # 将函数的内存地址返回给outer return inner # 函数的返回值赋值给全局变量outer # 相当于把inner的内存地址复制给一个全局变量 return_inner = outer() # 间接调用了inner() x = 100 return_inner() # 与调用位置无关,输出 x 依旧为原函数内x的值 def bar(): x = 99 return_inner() bar()
闭包高级使用:装饰器
http://www.cnblogs.com/mdzzbojo/p/8669485.html