python装饰器+递归+冒泡排序详解编程语言

冒泡排序 

li = [33, 2, 10, 1,23,23523,5123,4123,1,2,0] 
for k in range(1,len(li)): 
    for i in range(len(li) - k):#当这个for执行完时,最大值被放在了最后一个,所以下次判断时就可以不 
        if li[i] > li[i + 1]: #比较最后一个,所以在这里range的循环就应该少一次,所以k就加一,为了完成 
            temp = li[i]  #所有的数的比较,所以再建立一个for循环,把k作为变量,循环的范围是1到len(li) 
            li[i] = li[i + 1] 
            li[i + 1] = temp 
 
print(li)

 

 

递归 

斐波纳挈数列

    def f4(a1,a2) 
        if a1>10000: 
            return 
        print(a1) 
        #a1 = 0,a2 = 1,a3 = 1 
        #a1 = 1,a2 = 1,a3 = 2 
        a3 = a1 + a2 
        f4(a2,a3) 
         
    f4(0,1)

 

第十个斐波纳挈数

    def f1(taller,a1,a2): 
        if taller == 10: 
            return a1 
        a3 = a1 + a2 
        r = f1(taller + 1,a2,a3) 
        return r feo = f1(1,0,1) print(feo)

 

 

 

装饰器

 

    def outer(func): 
        def inner(): 
            print("hello") 
            print("hello") 
            print("hello") 
            r = func() print("end") print("end") print("end") return r return inner #1、执行outer函数,并且将其下面的的函数名,当作参数 #2、将outer的返回值重新赋值给f1(f1 = outer的返回值) #新f1函数 = inner 执行f1就相当于执行inner()  @outer def f1(): print("F1") def f2(): print("F2") def f3(): print("F3") def f4(): print("F4") f1() f2() f3() f4()

结果:
  hello
  hello
  hello
  F1
  end
  end
  end
  F2
  F3
  F4

如果有两个函数名一样的函数,在执行这个函数时,会执行下面那个函数,因为python解释器是从上往下
把代码(函数)放入内存的,所以,同样的函数名会指向最后一个函数。

装饰器的本质是将原函数封装到另一个函数里面,让装饰器里面的函数等于新函数(f1)

 

 

    def outer(func): 
        def inner(): 
            print("hello") 
            print("hello") 
            print("hello") 
            r = func() print("end") print("end") print("end") return r return inner #首先,@outer的意思是让它下面的函数当作装饰器的参数,让装饰器函数的返回值等于f1,而装饰器的返回值为 #inner函数,所以执行f1()函数就是执行inner() 函数,再把inner的返回值赋给f1 [email protected] = outer(f1)  @outer def f1(): print("F1") f1()

 

1、定义装饰器,函数

2、应用装饰器

只要函数应用装饰器,那么函数就被重新定义,重新定义为:装饰器的内层函数

带有参数的装饰器

    def outer(func): 
        def inner(a1,a2): 
            print("hello") 
            print("hello") 
            print("hello") 
            r = func(a1,a2) 
            print("end") 
            print("end") 
            print("end") 
            return r 
        return inner 
 
    @outer 
    def f1(a1,a2): 
        print(a1+a2)

 

接收任意参数的装饰器

    def outer(func): 
        def inner(*a1,**a2):#这里的*a1可以接收多个参数 
            print("hello") 
            print("hello") 
            print("hello") 
            r = func(*a1,**a2)#这里的*a1,**a1可以接收多个参数,在执行函数是会自动把相应位置的参数传给他 
            print("end")  #a1=>*a1=>*a1=>a1,a2=>*a1=>*a1=>a2,python有自带优化机制 
            print("end") 
            print("end") 
            return r 
        return inner 
 
    @outer 
    def f0(a1): 
        print(a1) 
 
 
    @outer 
    def f1(a1, a2): 
        print(a1 + a2) 
 
    @outer 
    def f2(a1, a2, a3): 
        print(a1 + a2 + a3) 
 
    @outer 
    def f3(a1, a2, a3, a4): 
        print(a1 + a2 + a3 + a4) 
 
 
    @outer 
    def f4(a1, a2, a3, a4, a5): 
        print(a1 + a2 + a3 + a4 + a5) 
 
 
    f0(1) 
    f1(1,2) 
    f2(1,2,3) 
    f3(1,2,3,4) 
    f4(1,2,3,4,5)

*a1接受参数放到元组里
**a2接收字典类参数放到字典里

一个函数添加多个装饰器 


    def outer(func): 
        def inner(*a1,**a2): 
            print("hello")                [email protected] = outer(f1) 
            r = func(*a1,**a2) 
            print("end") 
            return r             
        return inner       
                               
    def outer2(func):             
        def inner(*a1,**a2):        
            print("gg")              
            r = func(*a1,**a2)             
            return r                     
        return inner                     
                                         
    @outer2  #在上面的装饰器先输出 
    @outer 
    def f1(a1, a2): 
        print(a1 + a2) 
 
    f1(1,2)
#首先,把f1函数传到outer里面,outer里面的func代指f1函数,而f1函数就是outer函数的返回值,而outer函数的返回值为inner函数,所以执行f1函数,就是执行outer里的inner函数,[email protected]@outer上面就是相当于给f1装饰的函数outer装饰一次,
outer2把outer函数当作func参数,而outer2的返回值为outer2的inner函数,当执行outer函数时,会执行outer2的inner函数,而inner函数中的func又执行了outer函数,而outer函数的返回值为outer函数的inner函数,在outer2里的inner函数里
执行func函数,就是执行了outer函数的返回值,就是执行了outer函数的inner函数,而outer函数里的inner函数有执行了f1函数,所以最后先输出最上面那个装饰器,然后是下面那个装饰器,这就是装饰器的原理

结果: gg
hello
3
end

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/12372.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论