装饰器&闭包&递归函数&指针

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递归

posted on 2018-04-22 15:17  chen_2987  阅读(135)  评论(0)    收藏  举报

导航