天天看點

二十、冒泡算法,遞歸,裝飾器

1.冒泡算法

l1=[33,2,10,1,565,23,333,898,4,21,65,45,75,33,11,77,333]
for j in range(1,len(l1)):
    #print (j)
    for i in range(len(l1) - j):
       
        if l1[i] > l1[i + 1]:
            temp = l1[i]
            l1[i] = l1[i + 1]
            l1[i + 1] = temp
print(l1)
---------------------------
[1, 2, 4, 10, 11, 21, 23, 33, 33, 45, 65, 75, 77, 333, 333, 565, 898]
-------------------------------------------------------------------------------------------
2.遞歸
           
#擷取斐波那契數列第10個數
def f5(depth,a1,a2):
    #print (depth)
    if depth == 10:
        return a1
    a3=a1+a2
    r=f5(depth+1,a2,a3)
    return r
m=f5(1,0,1)
print (m)
           
-------------------------------------------------------------------------------------------
3.裝飾器:為了不改變原函數的情況下,在執行該函數之前或者之後執行一些東西
  隻要函數應用裝飾器,那麼函數就被重新定義,重新定義為裝飾器内容函數
           
def outer(func):
    #func=f1()
    def inner():

        print ("hello")
        print("hello")
        print("hello")
        #執行舊的f1函數,r為None
        r=func()
        print("end")
        print("end")
        print("end")
        return r
    return inner
    #f1新=inner()
@outer
'''
1.到@時,執行outer函數,并且将下面的函數名當做參數
2.将outer的傳回值重新指派給f1,f1=outer的傳回值
'''
def f1():
    print ("F1")
def f2():
    print ("F2")
def f3():
    print ("F3")
def f4():
    print ("F4")

f1()
------------------------------------------------
           

   hello

   hello

   hello

   F1

   end

   end

   end

------------------------------------------------------------------------------------------------------------

如果加上一個參數

def outer(func):
    #func=f1()
    def inner(x,y):

        print ("hello")
        print("hello")
        print("hello")
        #執行舊的f1函數,r為None
        r=func(x,y)
        print("end")
        print("end")
        print("end")
        return r
    return inner
    #f1新=inner()

'''
1.到@時,執行outer函數,并且将下面的函數名當做參數
2.将outer的傳回值重新指派給f1,f1=outer的傳回值
'''
@outer
def f1(a1,a2):
    print ("F1")
    return a1+a2
def f2():
    print ("F2")
def f3():
    print ("F3")
def f4():
    print ("F4")
f1(1,2)
---------------------------------------
           

   hello

   hello

   hello

   F1

   end

   end

   end

------------------------------------------------------------------------------------------------------------

如果加上多個參數,每個函數參數不一樣,萬能裝飾器

def outer(func):
    #func=f1()
    def inner(*x,**y):

        print ("hello")
        print("hello")
        print("hello")
        #執行舊的f1函數,r為None
        r=func(*x,**y)
        print("end")
        print("end")
        print("end")
        return r
    return inner
    #f1新=inner()

'''
1.到@時,執行outer函數,并且将下面的函數名當做參數
2.将outer的傳回值重新指派給f1,f1=outer的傳回值
'''
@outer
def f1(a1,a2):
    print ("F1")
    return a1+a2
@outer
def f2(a):
    print ("F2")
@outer
def f3(a,b,c):
    print ("F3")
def f4():
    print ("F4")
# f5=outer(f1)
# print (f5)
# result=f5()
# print (result)
f1(1,2)
f2(1)
f3(1,1,1)
------------------------------------
           

   hello

   hello

   hello

   F1

   end

   end

   end

   hello

   hello

   hello

   F2

   end

   end

   end

   hello

   hello

   hello

   F3

   end

   end

   end

------------------------------------------------------------------------------------------------------------

多個裝飾器修飾一個函數:

def outer(func):
    #func=f1()
    def inner(*x,**y):
        print ("123")
        #執行舊的f1函數,r為None
        r=func(*x,**y)
        print("456")
        return r
    return inner
    #f1新=inner()
def outer_a(func):
    #func=f1()
    def inner(*x,**y):
        print ("666")
        #執行舊的f1函數,r為None
        r=func(*x,**y)
        print("888")
        return r
    return inner

'''
1.到@時,執行outer函數,并且将下面的函數名當做參數
2.将outer的傳回值重新指派給f1,f1=outer的傳回值
'''
@outer_a
@outer
def f1(a1,a2):
    print ("F1")
    return a1+a2
#@outer
def f2(a):
    print ("F2")
#@outer
def f3(a,b,c):
    print ("F3")
def f4():
    print ("F4")
f1(1,2)
-----------------------------------------
           

   666

   123

   F1

   456

   888