函數高級小結

1、閉包函數

def f1():
    x = 10
    def f2():
        print(x)  # 10
        
x = 1000
f1()  # 10
print(x)  # 1000
def f1():
    x = 10
    def f2():
        print(x)  # 10
    return f2

f = f1()  # f2

f()  # f2()
  • 把函數和變量一塊兒打包拿出去了
def f1(x):
    def f2():
        print(x)  # 10
    return f2

f3 = f1(10)  # f2
f3()  # f2()  # 10
f3()  # 10
f3()  # 10

f4 = f1(5)
f4()  # 5
f4()  # 5

2、裝飾器

  • 不改變函數體代碼,而且不改變函數調用方式,它本質就是一個函數
def f1(x):
    def f2():
        print(x)  # 10
    return f2

f2 = f1()
f2()  # f2()
  • 完善裝飾器
def login_deco(func):
    def wrapper(*args,**kwargs):
        login_judge = login()
        if login_judge:
            res = func(*args,**kwargs)
            return res
    return wrapper

@login_deco
def shopping():
    pass

# shopping = deco(shopping)
# shopping()

3、三層裝飾器

def sanceng(x,y):
    def login_deco(func):
        print(x,y)
        def wrapper(*args,**kwargs):
            login_judge = login()
            if login_judge:
                res = func(*args,**kwargs)
                return res
        return wrapper
   return login_deco

@sanceng(10,20)
def shopping():
    pass

day20
# shopping = login_deco(shopping)
# shopping()

4、迭代器

  1. 可迭代對象:具備iter方法的對象(Python中一切皆對象)
  2. 迭代器對對象:具備iter和next方法
  • 迭代器對象必定是可迭代對象,可迭代對象不必定是迭代器對象(f)

5、三元表達式

6、列表推導式

7、字典生成式

8、生成器表達式

9、生成器

自定義的迭代器,函數內部使用yield關鍵,有yield關鍵字的函數只要調用,這個調用後的函數就是生成器編程

  • yield:接收函數返回值,可是會繼續執行函數體代碼
  • return:接收函數返回值,可是會終止函數
def f1():
    yield 1
    
g = f1()  # 變成生成器

for i in g:
    print(i)  # 1

一10、遞歸

遞歸本質上就是函數調用函數自己,必須得有結束條件,而且在遞歸的過程當中,問題的規模必須都不斷縮小閉包

10.1 二分搜索

def find_num(num,lis):

    if len(lis) == 1 and lis[0] != num:
        print('沒找到')
        return

    mid_ind = int(len(lis) / 2)  # 中間索引
    mid_num = lis[mid_ind]  # 中間值

    if num < mid_num:
        lis = lis[:mid_ind]
        find_num(num,lis)
    elif num > mid_num:
        lis = lis[mid_ind + 1:]
        find_num(num, lis)
    else:
        print('find')

lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
find_num(20,lis)

11、匿名函數

lamdbda 參數 : 邏輯代碼app

  • 匿名函數使用一次就失效了,通常不單獨使用,與max最大值/min最小值/sorted排序/map映射/filter過濾 連用
max(dic,key=lambda name: dic[name])
max(dic)

max(lis/se/tup)
  • 內置函數(有空看一看,沒空抄一抄)

12、面向過程編程

相似於工廠的流水線,機械式的一步一步完成一個項目,把完成步驟具體細分,這樣步驟與步驟之間互不干涉函數

缺點:擴展性差,只要有一個步驟斷了,項目就崩潰了
優勢:清晰優雅code

相關文章
相關標籤/搜索