def add(a,b): return a+b def low(a,b): return a-b def jump(a,b): return a*b def full(a,b): return a/b def quyu(a,b): return a%b def computed(fu,n1,n2): res = fn(n1,n2) return method_map = { 'add':add, 'low'=low, 'jump':jump, 'full':full, 'quyu':quyu, } #根据指令获取计算方法 def get_cp_fn(cmd): if cmd in method_map: return method[cmd] return add #输入有误默认方法处理 while TRUE: cmd = input('cmd: ') if cmd == 'quit': break cp_fn = get_cp_fn(cmd) result = computed(cp_fn,100,20) print(resule)
- 作用:解决由于名字有限,导致名字重复发生冲突
- Built_in:内置名称空间;系统级,一个;随解释器执行而产生,解释器停止而销毁
- Global:全局名称空间;文件级,多个;随所属文件加载而产生,文件运行完毕而销毁
- local:局部名称空间;函数级,多个;随所属函数执行而产生,函数执行完毕而销毁
def fn(): global num num = 20 print(num) #global关键词可以将Local的名字提升为Global的名字 #一个文件中的Global名字就是一个,所以函数内部外部使用的名字都是一个 fn() # 注:一定要调用函数,才能产生名字,并提升 print()
#将函数直接定义到另一个函数内部,就可以使用外部函数中的名字 def outer(): num = 20 def inner(): print(num) #inner就可以直接使用outer中的名字 inner() outer()
-
-
作用:解决同名可以共存的问
#四种作用域 #Built-in:内置作用域,所有文件所有函数 #Global:全局作用域,当前文件所有函数 #Enclosing:嵌套作用域,当前函数与当前函数的内部函数 #Local:局部作用域,当前函数 # 注: # 不同作用域之间名字不冲突,以达到名字的重用 # 查找顺序:Local > Enclosing > Global > Built-in len = 10 def outer(): len = 20 def inner(): len = 30 print('1',len) inner() print('2',len) outer() print('3',len) del len: print('4',len)
- 本质就是函数嵌套(格式稍作改良)
#inner可以使用outer的局部变量:可以将inner定义在outer中 #inner的调用还是在外部:inner函数对象可能被outer返回 #将内部函数对象作为外部函数的返回值,1、可以使用局部变量;2、不改变函数的调用位置 def outer(): num = 10 def inner(): #闭包:closure,定义在函数内部的函数 print(num) return inner fn = outer() #fn = inner fn()
闭包案例:
import time def download(): print('开始下载') time.sleep(2) print('下载完成') data = '下载得到的数据' outer(data) #为闭包传参 def outer(data): def inner(): #保存,播放,删除等操作 print("闭包打印: ",data) inner() download()