日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)

發布時間:2025/6/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day11 - 15(装饰器、生成器、迭代器、内置函数、推导式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

day11:裝飾器(裝飾器形成、裝飾器作用、@語法糖、原則、固定模式)

  • 裝飾器形成:最簡單的、有返回值的、有一個參數的、萬能參數

  • 函數起的作用:裝飾器用于在已經完成的函數前后增加功能
  • 語法糖:使代碼變得簡單
  • 原則:開放封閉原則,因為已經發布的源碼不可以輕易修改,所以使用裝飾器在原來的基礎上增加功能呢個
  • 固定模式、萬能參數、有返回值
  • 1 import time 2 def timmer(func): 3 def inner(*args,**kwargs): 4 start = time.time() 5 time.sleep(1) 6 ret = func(*args,**kwargs) 7 end = time.time() - start 8 return ret,end 9 return inner 10 11 12 @timmer 13 def func(i): 14 print(i) 15 return '***:%s' %i 16 17 res = func('w') 18 n,t = res 19 print(n,t) 固定模式  
  • 練習題
  • 編寫裝飾器、為多個函加上認證功能()
    1 FLAG = False 2 def timmer(func): 3 global FALG 4 def inner (*args,**kwargs): 5 start = time.time() 6 if FLAG: 7 res = func() 8 else: 9 res = '登錄失敗' 10 return res 11 return inner 12 13 def Login(): 14 login_user = input('請輸入賬號:') 15 login_pass = input('請輸入密碼:') 16 with open('user.txt','r',encoding='utf-8') as f: 17 for i in f: 18 if 'login_user' in i: 19 user_name,user_pass = '|'.join(i) 20 break 21 if login_user == user_name and login_pass == user_pass: 22 global FLAG 23 FLAG = True 24 else: 25 print('登錄失敗') 26 continue 27 28 29 @timmer 30 def func(a,b): 31 print(a,b) 32 return '***:%s;***%s' %(a,b) 33 34 while 1: 35 command = input('請輸入操作序號:]\n1:登錄\n2:執行') 36 if command == '1': 37 Logon() 38 elif command == '2': 39 func() 40 else: 41 print('您的輸入有誤,請重新輸入') 42 continue 第一題

    ?

  • 編寫裝飾器,為多個函數加上記錄調用功能,要求每次調用函數都將被調用的函數名稱寫入文件

  • 編寫下載網頁內容的函數,要求功能是:用戶傳入一個url,函數返回下載頁面的結果

  • 為題目3編寫裝飾器,實現緩存網頁內容的功能:
  • ?

    day12:裝飾器的進階(wraps模塊、進階)

  • wraps模塊
  • 作用:當一個函數被裝飾后,使用__name__ 和 __doc__查看函數相關信息時,會查看裝飾器的相關信息,wraps的作用就是查看信息時查看的是被點用函數的相關信息
  • 例子:
    1 from functools import wraps 2 3 4 def timmer(func): 5 @wraps(func) 6 def inner(*args,**kwargs): 7 """這個是inner""" 8 res = func(*args,**kwargs) 9 return res 10 return inner 11 12 13 @timmer 14 def func1(a,b): 15 """這個是func1""" 16 print(a,b) 17 return '%s *** %s' % (a,b) 18 19 20 print(func1.__name__) 21 print(func1.__doc__) wraps例子
  • 裝飾器進階
  • 多個函數怎么同時決定是否使用裝飾器
    1 from functools import wraps 2 FLAGE = True 3 4 def timmer(flage): 5 def wrapper(func): 6 @wraps(func) 7 def inner(*args,**kwargs): 8 if flage: 9 print('裝飾前被執行前做的事') 10 res = func(*args,**kwargs) 11 print('裝飾器被執行后做的事') 12 return res 13 else: 14 res = func(*args,**kwargs) 15 return res 16 return inner 17 return wrapper 18 19 20 @timmer(FLAGE) 21 def func1(a,b): 22 print('執行了,收到了%s 和 %s' %(a,b)) 23 print(func1.__name__) 24 return 'Ok' 25 26 27 @timmer(FLAGE) 28 def func2(a,b): 29 print('執行了,收到了%s 和 %s' %(a,b)) 30 print(func2.__name__) 31 return 'Ok' 32 33 34 print(func1('','')) 35 print(func2('Python','蟒蛇')) 多個函數同時裝飾
  • 一個函數被多個裝飾器調用
    1 def wrapper1(func): 2 def inner(*args,**kwargs): 3 print('wrapper1 start') 4 res = func(*args,**kwargs) 5 print(res) 6 print('wrapper1 end') 7 return res 8 return inner 9 10 11 def wrapper2(func): 12 def inner(*args,**kwargs): 13 print('wrapper2 start') 14 res = func(*args,**kwargs) 15 print(res) 16 print('wrapper2 end') 17 return res 18 return inner 19 20 21 def wrapper3(func): 22 def inner(*args,**kwargs): 23 print('wrapper3 start') 24 res = func(*args,**kwargs) 25 print(res) 26 print('wrapper3 end') 27 return res 28 return inner 29 30 31 @wrapper3 32 @wrapper2 33 @wrapper1 34 35 def func(): 36 print(func.__name__) 37 return 'Func執行完了' 38 39 40 41 print(func()) 一個函數被多個裝飾器調用

    ?

  • day13:(迭代器、生成器)

  • 迭代器
  • 從容其中一個一個取值,會把所有數據拿到
  • 節省內存
  • 迭代器協議和可迭代協議
  • 可以被for循環的都是可迭代的
  • 可迭代的內部都有__iter__方法
  • 只要是迭代器,一定可以迭代
  • 可迭代的.__iter__()就可以獲取一個迭代器
  • 迭代器中的__next__()方法可以一個一個的獲取值
  • 檢驗迭代器和可迭代的方法
    1 from collections import Iterable 2 from collections import Iterator 3 print(isinstance([],Iterable)) 4 print(isinstance([],Iterator)) 檢驗方法

    ?

  • 生成器
  • 只要含有yield關鍵字的函數都是生成器函數
  • yield不能和return共用且需要寫在函數內
  • 簡單的一個生成器
    1 def generator(): 2 print(1) 3 yield 'a' 4 5 6 # 取值 7 ret = generator() 8 print(ret.__next__()) 簡單生成器

    ?

  • day14:(生成器函數進階、表達式、各種推導式)

  • 生成器進階
  • send:獲取下一個值的效果和next基本一致,第一次不能用send
  • 例子
  • 獲取平均值
    1 def average(): 2 sum = 0 3 count = 0 4 avg = 0 5 while True: 6 num = yield avg 7 sum += num # 10 8 count += 1 # 1 9 avg = sum/count 10 11 avg_g = average() 12 print(avg_g.__next__()) 13 avg1 = avg_g.send(10) 14 avg1 = avg_g.send(20) 15 avg1 = avg_g.send(30) 16 print(avg1) 獲取平均值

    ?

  • 預激活生成器,就是使用裝飾器,讓send可以第一次使用
    1 def init(func): #裝飾器 2 def inner(*args, **kwargs): 3 g = func(*args, **kwargs) #g = average() 4 g.__next__() 5 return g 6 return inner 7 8 @init 9 def average(): 10 sum = 0 11 count = 0 12 avg = 0 13 while True: 14 num = yield avg 15 sum += num # 10 16 count += 1 # 1 17 avg = sum/count 18 19 20 avg_g = average() #===> inner 21 ret = avg_g.send(10) 22 print(ret) 23 ret = avg_g.send(20) 24 print(ret) 預激生成器的裝飾器

    ?

  • 小技巧
    1 def generator(): 2 a = 'abcde' 3 b = '12345' 4 for i in a: 5 yield i 6 for i in b: 7 yield i 8 def generator(): 9 a = 'abcde' 10 b = '12345' 11 yield from a 12 yield from b 13 14 g = generator() 15 for i in g: 16 print(i) 小技巧

    ?

  • 生成器表達式
    g = (i for i in range(10)) print(g) for i in g:print(i)

    ?

  • 各種推導式
    1 # 列表: 2 ret = [i*i for i in (1,2,3,4) if i%3 == 0] 3 print(ret) 4 例子: 5 找到嵌套列表中名字含有兩個‘e’的所有名字 6 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], 7 ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] 8 ret = [name for lst in names for name in lst if name.count('e') ==2] # 列表 9 ret = (name for lst in names for name in lst if name.count('e') ==2) # 字典 10 for i in ret: 11 print(i) 12 13    14 # 字典: 15 mcase = {'a': 10, 'b': 34} 16 mcase_frequency = {mcase[k]: k for k in mcase} 17 print(mcase_frequency) 18 19 #集合推導式,自帶結果去重功能 20 squared = {x**2 for x in [1, -1, 2]} 21 print(squared) 各種推導式

    ?

  • day15:(面試題、內置函數)

  • 面試題
    一、 def demo():for i in range(4):yield ig=demo()g1=(i for i in g) g2=(i for i in g1)print(list(g)) print(list(g1)) print(list(g2))二、 def add(n,i):return n+idef test():for i in range(5):yield ig=test() for n in [1,10,5]:g=(add(n,i) for i in g)print(list(g))

    ?

  • 內置函數:https://www.processon.com/view/link/5c35f503e4b0641c83d55651
  • ?

    轉載于:https://www.cnblogs.com/-xuan/p/10246188.html

    總結

    以上是生活随笔為你收集整理的day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。