装饰器&闭包&递归函数&指针
1.简单装饰器:
#!/usr/bin/env python # encoding: utf-8 ##__________________________________________python简单的装饰器______________________________________________ def log(func): def wrapper(): func()#调用相当于chen() print('最后执行') print('执行顺序') return wrapper#把函数名返回给chen(),此时chen()= wrapper() @log #相当于log(chen) def chen(): print ('2013-12-25') print('python不难啊') chen()#调用chen()相当于调用wrapper() ###_________________________________________多个装饰器的使用方式______________________________________________ import time def deco01(func): def wrapper(*args, **kwargs): print("this is deco01") startTime = time.time() func(*args, **kwargs) endTime = time.time() msecs = (endTime - startTime)*1000 print("time is %d ms" %msecs) print("deco01 end here") return wrapper def deco02(func): def wrapper(*args, **kwargs): print("this is deco02") func(*args, **kwargs) print("deco02 end here") return wrapper def deco03(func): def wrapper(*args, **kwargs): print("this is deco03") func(*args, **kwargs) print("deco03 end here") return wrapper @deco01 @deco02 @deco03#先执行第三个装饰器(先解析deco01,但先执行deco03) def func(a,b):#经过装饰器后会有三个值 wrapper print("hello,here is a func for add :") time.sleep(1) print("result is %d" %(a+b)) if __name__ == '__main__': f = func f(3,4) #func() ###___________________________________________________带有固定参数的装饰器________________________________________________ import time def deco(f): def wrapper(a,b): print('函数执行前') f(a,b)#跳转到f print('函数执行后') test=dalan('test123')#装饰器中调用其他没装饰的函数 print(test) print('装饰器-开始执行') return wrapper #返回wrapper函数名给f @deco #相当于deco(f) def f(a,b):#相当于wrapper print("f函数内") time.sleep(1) print("result is %d" %(a+b)) def dalan(a): return a*3 if __name__ == '__main__': f(3,4) #______________________________________________装饰器不固定参数__________________________________________________________ #!/usr/bin/env python # encoding: utf-8 def log(func): def wrapper(*a,**b): print('执行函数前执行') result= func(*a,**b)#调用相当于chen() print('获取sdk类型{}'.format(sdk_type)) print('函数执行后',result) print('执行顺序') return wrapper#把函数名返回给chen(),此时chen()= wrapper() @log def chen(*a,**b): if job_flow_id<5: print ('条件成立') return 'if-------888' elif job_flow_id>5 and job_flow_id<20: print('条件不成立') return 'elif-------888' else: print(package_name) print(a) print(*a) print(b) print(*b) print('都没有符合的') return 'else-------888' print('都不会执行这句的') device,package_name,pkg_id,job_flow_id,sdk_type='test123','com.dalan.android','6568',20007,'menmbersdk' #调用chen函数(同时传入list和字符串) #aa=chen(['123','uuuuuu','ppppppppppp'],device=device,package_name=package_name,pkg_id=pkg_id,job_flow_id=job_flow_id,sdk_type=sdk_type) #调用chen函数(只传字符串) aa=chen(device=device,package_name=package_name,pkg_id=pkg_id,job_flow_id=job_flow_id,sdk_type=sdk_type) #______________________________________________装饰器带参数和判断________________________________________________________ def log(func): def wrapper(a): print('执行函数前执行') return func(a)#调用相当于chen() print('最后执行') print('执行顺序') return wrapper#把函数名返回给chen(),此时chen()= wrapper() @log def chen(a): if a<5: print ('条件成立') return 'if-------888' elif a>5 and a<20: print('条件不成立') return 'elif-------888' else: print('都没有符合的') return 'else-------888' print('都不会执行这句的') aa=chen(100)#调用chen()相当于调用wrapper() print(aa) #__________________________________________修饰符带参数________________________________________________________________ # 1、带参数的装饰器 def wrapper_out(parameter,name): print(parameter) print(name) def wrapper(func): def inner(*args, **kwargs): ret = func(*args, **kwargs) return ret return inner return wrapper """ @wrapper_out('企鹅') 分析解读: 当函数执行到带参数装饰器 @wrapper_out('企鹅') 这句时,分两步执行: 1.执行wrapper_out('企鹅')这个函数,把相应的参数'微信'传给parameter,并且得到返回值wrapper函数名 2.将@与wrapper结合,得到我们之前熟悉的标准版的装饰器,按照装饰器的执行流程执行。 """ @wrapper_out('企鹅','123456') def qq(): print('成功登录企鹅!') qq() #________________________________无固定参数的装饰器_______________________________________________________________________ import time def deco(f): def wrapper(*args, **kwargs): f(*args, **kwargs)# *,**表示接受任意参数 print('333333333333333') print('开始执行') return wrapper @deco def f(a,b): print("f函数on") time.sleep(1) print("result is %d" %(a+b)) @deco def f2(a,b,c): print("f2函数 on") time.sleep(1) print("result is %d" %(a+b+c)) if __name__ == '__main__': f2(3,4,5) #f(3,4)
闭包:
#!/usr/bin/env python # encoding: utf-8 ''' 闭包定义:当一个函数定义在另一个函数内,且使用到了外部函数的参数,整个代码块称为闭包。 闭包必须满足的条件: 1.必须有一个内嵌函数 2.内嵌函数必须引用外部函数中的变量 3.外部函数返回值必须是内嵌函数 ''' #____________________________________________________闭包1_________________________________________________________________________________ def outer(x): def inner(y): nonlocal x x+=y return x return inner a = outer(10)#调用outer()函数 把10传到x,返回inner给a print(a(1))#此时a指向inner print(a(3)) #_____________________________________________________闭包2__________________________________________________________________________________ def num(chen): #定义函数 def num_in(nim_in): #定义函数 return chen+nim_in#返回两个参数的和。 return num_in #返回内部函数的引用。(变量名) a = num(100) #使用num(chen)将函数num(100)接收,并赋值给a,只不过这个返回值是一个函数的引用。等于 a = num_in,注意这里接收的不光是函数本身,还有已经传递的参数。 b = a(100) #此时a就是num_in,并传递一个参数100给num_in(nim_in),返回值给b print(b) ''' 注意:当一个函数定义在另一个函数内,且使用到了外部函数的参数,整个代码块称为闭包。当外部参数确定时,内部函数参数可以反复调用。 ''' #______________________________________________________闭包3__________________________________________________________________________________ def foo(): name = "chenwei" # 定义了一个foo函数内部的局部变量 def bar(): print(name) # 在bar函数内部引用了其外部函数foo的局部变量name return bar func = foo() func() ''' bar在foo函数的代码块中定义。我们称bar是foo的内部函数。 在bar的局部作用域中可以直接访问foo局部作用域中定义的name变量。 简单的说,这种内部函数可以使用外部函数变量的行为,就叫闭包。 '''
函数递归:
#!/usr/bin/env python # encoding: utf-8 ''' 递归:在调用一个函数的过程中,直接或间接地调用了函数本身这个就叫递归 性质: 递归一定要控制递归的层数,当符合某一条件时要终止递归 几乎所有的递归都能用 while 循环来代替 递归的优缺点: 优点:递归可以把问题简单化,让思路更为清晰,代码更简洁 缺点:递归因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果 ''' ###__________________________________________________________递归函数1_____________________________________________________________________ # ###直接调用自己: # def func(): # print('from func') # func() # # func() # # # ###间接调用自己 # def foo(): # print('from foo') # bar() # # def bar(): # print('from bar') # foo() # # foo() ''' 递归需要有控制退出条件,不然会把报错 ''' ###_________________________________________________________递归函数2_________________________________________________________________________ def fx(n): print("递归进入第", n, "层") if n == 3: return fx(n + 1) print("递归退出第", n, '层') fx(1) print("程序结束") # 递归进入第 1 层 # 递归进入第 2 层 # 递归进入第 3 层 # 递归退出第 2 层 # 递归退出第 1 层 # 程序结束 ###________________________________________递归函数3___________________________________________________________________________________________ def normal_recursion(n): if n == 1: return 1 else: return n + normal_recursion(n-1) print(normal_recursion(5)) # 5 + normal_recursion(4) # 5 + 4 + normal_recursion(3) # 5 + 4 + 3 + normal_recursion(2) # 5 + 4 + 3 + 2 + normal_recursion(1) # 5 + 4 + 3 + 3 # 5 + 4 + 6 # 5 + 10 # # 15 ###____________________________________________________可用于函数内调用本身函数______________________________________________________________ def fun(a): if a==0: print('The End!') return a else: print('a: ', a) a = a-1 fun(a) print('递归后还会向下执行') fun(1)#数字越大递归次数越多
指针函数:
#!/usr/bin/env python # -*- coding: utf-8 -*- #_______________________________________指针函数____________________________________ def minus(a, b): '''求两数之差''' return a - b def compute(a, b, fun): print('fun位指针,指向函数名:',fun) print('compute:a={},b={}'.format(a,b)) result = fun(a, b)#相当于调用minux() print(result) if __name__ == "__main__": fun = minus#把fun指向minus compute(5, 1, fun)
#______________________________文件指针_______________________________________________ with open(r'C:\Users\test.txt', mode='rb') as f: f.read(2) # 文件指针读到第二字节 f.seek(4, 1) # 从指针当前位置再往右移动4字节 print(f.tell()) print(f.read().decode('utf-8')) # b模式下,将读出的二进制码进行解码。 # 注:当指针移动到某字符中间位置时,打印内容会报错 ''' https://www.cnblogs.com/liusijun113/p/10027738.html '''
相关连接:
https://www.jianshu.com/p/ee333fb99366 ...................................................................................................................Python之递归与闭包
https://blog.csdn.net/m0_57787326/article/details/123005076 .................................................................................带参数的装饰器
https://www.cnblogs.com/liuxiaowei/p/7262428.html ...................................................................................................python递归
https://blog.csdn.net/ruanxingzi123/article/details/82658669.....................................................................................python递归
浙公网安备 33010602011771号