1.函数对象复习 一、函数对象:把函数的内存地址当作一种变量值去使用 1.引用 x = 10 y = x def func1(): print('from func') func1 = 函数的内址 func2 = func1 func2() 2.可以当作参数传给另外的函数 def func1(): print('from func') def bar(xxx): print(xxx) xxx() bar(func1) 3.可以当作一个函数的返回值 def func1(): print('from func') def bar(): return func1 f = bar() f() 4.可以当作容器类型的元素 def func1(): print('from func') l=[func1] print(l) l[0]() def register(): print('注册') def login(): print('登录') def shopping(): print('购物') def pay(): print('支付') func_dic={ '1':register, '2':login, '3':shopping, '4':pay } while True: print(''' 0 退出 1 注册 2 登录 3 购物 4 支付 ''') choice=input('>>>: ').strip() if choice == '0':break if choice in func_dic: func_dic[choice]() else: print('输入错误的指令') 2.函数嵌套复习 函数嵌套定义 def outter(): def inner(): pass x = 10 y = 20 from math import pi def circle(radius,mode=0): def perimiter(radius): return 2 * pi *radius def area(radius): return pi *(radius **2) if mode == 0: return perimiter(radius) elif mode == 1: return area(radius) circle(10,0) 函数嵌套调用 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 3.名称空间与作用域 1)什么是名称空间namespaces 存放名字与值内存地址绑定关系的地方 2)为何要有名称空间 3)如何用名称空间 内置名称空间 全局名称空间 局部名称空间 4)总结结论: 1.查找名字的顺序是从当前位置往外查找 2.名称空间的嵌套关系是在函数定义阶段就固定死的与调用位置无关 def outter(): x = 11111 def inner(): print(x) return inner f = outter() def foo(): x = 222222222 f() foo() 1 = [] def func(): l.append(111) l.append(2222) func() print(1) def f1(): y = 1111 def f2(): x = 3333 def f3(): nonlocal y y = 2222 4.闭包函数 1.什么是闭包函数 闭函数:该函数一定是定义在函数内的函数 包函数:该内部函数包含对外层函数作用域名字的引用 def outter(): x = 111 def inner(): print(x) return inner f = outter() x = 2222 f() 2.为何要用闭包函数 3.如何用 为函数体传值的方案一:直接以参数的形式传入 def f(x): print(x) f(10) f(11) 为函数体传值的方案二:直接以参数的形式传入 def outter(x): def f(): print(x) return f fff=outter(10) fff() fff1=outter(11) fff1() def outter(x): #x=10 def f(): print(x) return f xxx=outter(10) yyy=outter(11) print(xxx) 5.装饰器 1.什么是装饰器 装饰器指的是为被装饰对象添加新功能的工具 装饰器本身可以是任意可调用对象 被装饰对象本身也可以是任意可调用对象 2.为何要用装饰器 开放封闭原则:对修改封闭,对扩展开发 装饰器的实现原则: 1.不能修改被装饰对象的源代码 2.不能修改被装饰对象的调用方式 装饰器的目的: 就是在遵循原则1和2的前提为被装饰对象添加新功能 3.如何用 part1 import time def index(): time.sleep(l) print('welcome to index page') def wrapper(): start=time.time() func() stop=time.time() print('run time is %s' %(stop-start)) wrapper() part2 import time def outter(func): #func=最原始那个index的内存地址 def wrapper(*args,**kwargs): start=time.time() res=func(*args,**kwargs)#最原始那个index的内存地址 stop=time.time() print('run time is %s' %(stop-start)) return res return wrapper @outter#index=outter(index)#index=outter(最原始那个index的内存地址) def index(): time.sleep(1) print('welcome to index page') return 1234 @outter #home=outter(home) def home(name): time.sleep(1) print('welcome %s to home page' %name) res=index() #wrapper的内存地址() print('返回值',res) home('egon') 小练习 import time def auth(func): #func=index def wrapper(*args,**kwargs): name=input('name>>>:').strip() pwd=input('pwd>>>:').strip() if name == 'egon' and pwd == '123': print('login successfull') res=func(*args,**kwargs) return res else: print('user or pwd error') return wrapper def outter(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return wrapper return wrapper @outter def index(): time.sleep(1) print('welcome to index page') return 1234 index()
来源:https://www.cnblogs.com/Nayami-L/p/10066199.html