亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Python函數(shù)進(jìn)階:參數(shù)、閉包、裝飾器與遞歸調(diào)試避坑

Python函數(shù)進(jìn)階:參數(shù)、閉包、裝飾器與遞歸調(diào)試避坑 寫代碼寫到第6章基本都會(huì)撞上“函數(shù)”這道坎。前面幾章無非是變量、判斷、循環(huán)寫出來的腳本像一條直線從上跑到下能出結(jié)果就算贏。等到代碼量過了兩三百行同樣的校驗(yàn)邏輯被復(fù)制到第五個(gè)地方改一個(gè)字段名要全局搜索十幾處這時(shí)候才意識(shí)到Python函數(shù)不是為了考試才存在的語(yǔ)法糖它是把一條直線折成一張網(wǎng)的第一根折痕。我見過的多數(shù)問題包括參數(shù)默認(rèn)值踩的坑、閉包里變量取到的值不對(duì)、裝飾器把函數(shù)名字改沒了都不是“不會(huì)寫函數(shù)”而是“把函數(shù)當(dāng)成代碼塊沒把它當(dāng)成對(duì)象和契約”。這篇內(nèi)容我會(huì)從參數(shù)、作用域、返回值、裝飾器、遞歸到調(diào)試拆分把自己和身邊人實(shí)際踩過的坑按順序攤開講適合剛學(xué)完基礎(chǔ)語(yǔ)法、正準(zhǔn)備動(dòng)手寫第一個(gè)稍大一點(diǎn)項(xiàng)目的人也適合寫到中途突然覺得代碼開始失控、想回頭補(bǔ)課的人。讀完你至少能判斷什么樣的重復(fù)值得抽函數(shù)、參數(shù)該怎么設(shè)計(jì)才不給未來的自己挖坑、為什么有些bug只有把函數(shù)拆開才看得見。1. 函數(shù)不是把代碼裝進(jìn)盒子它是控制復(fù)雜度的最小單位1.1 從一段被我刪掉的重復(fù)代碼說起前陣子接手一個(gè)內(nèi)部用的小工具兩千多行代碼塞在一個(gè)腳本里其中有個(gè)用戶輸入校驗(yàn)的段落連續(xù)出現(xiàn)了六次每次長(zhǎng)十來行判斷字段是否為空、長(zhǎng)度是否超限、編號(hào)是否符合預(yù)期格式。六段代碼幾乎一模一樣唯一區(qū)別是第二段多了一句把結(jié)果寫進(jìn)日志。改需求的時(shí)候那位作者改了其中四處漏了兩處于是同樣一條非法輸入從A入口進(jìn)會(huì)被拒絕從B入口進(jìn)就直接寫進(jìn)了存儲(chǔ)層。這種問題不是水平問題是函數(shù)沒有被當(dāng)作隔離帶使用。抽函數(shù)這件事真正的價(jià)值不在于少打幾行字而在于制造一道邊界邊界外面的人只關(guān)心“給我輸入我還你一個(gè)結(jié)果”邊界里面的實(shí)現(xiàn)怎么改、日志怎么寫、異常怎么轉(zhuǎn)外面的人不需要知道。六段重復(fù)代碼抽成一個(gè)validate_user_payload(payload)改需求的時(shí)候只需要?jiǎng)右惶幝└牡目赡苄灾苯託w零。這就是我常說的函數(shù)的第一職責(zé)是收斂變化點(diǎn)把最容易變的那部分圈起來。但反過來說我見過另一種極端有人把每個(gè)if判斷都抽成一個(gè)只有一行return的函數(shù)整個(gè)文件變成四十個(gè)小函數(shù)互相調(diào)用讀起來的跳轉(zhuǎn)成本比原來還高。函數(shù)的粒度應(yīng)該由“變化的可能性”決定而不是由“代碼行數(shù)”決定。一段十行的代碼如果半年都不會(huì)改重復(fù)兩次也沒什么一段三行的代碼如果被六個(gè)入口依賴那就必須抽。1.2 語(yǔ)法塊、對(duì)象、命名空間函數(shù)的三副面孔多數(shù)教程講函數(shù)只講第一副面孔一個(gè)可以傳參、可以返回的語(yǔ)法塊。真正決定你能不能寫好Python函數(shù)的是另外兩副。第一副是對(duì)象。在Python里def語(yǔ)句執(zhí)行完函數(shù)名就綁定到一個(gè)函數(shù)對(duì)象上跟a 1綁定整數(shù)沒有任何本質(zhì)區(qū)別。這意味著函數(shù)可以賦值給變量、放進(jìn)列表、當(dāng)參數(shù)傳給另一個(gè)函數(shù)、作為返回值返回。裝飾器、回調(diào)、策略表這些東西之所以能成立全靠這一條。很多人看到裝飾器覺得玄其實(shí)就是“函數(shù)當(dāng)參數(shù)、函數(shù)當(dāng)返回值”兩個(gè)動(dòng)作疊在一起。第二副是命名空間。函數(shù)體被調(diào)用時(shí)才產(chǎn)生一個(gè)局部命名空間函數(shù)返回后這個(gè)空間就銷毀。函數(shù)里的變量默認(rèn)不會(huì)污染外面這既是優(yōu)點(diǎn)也是坑的來源——你在函數(shù)里對(duì)一個(gè)外層列表做了append外層確實(shí)變了因?yàn)楦牡氖菍?duì)象但你在函數(shù)里寫x x 1外層的x紋絲不動(dòng)因?yàn)橹皇侵匦陆壎艘粋€(gè)新名字。這兩件事看起來像一回事實(shí)際差得遠(yuǎn)第3節(jié)會(huì)展開。def touch_list(lst): lst.append(1) # 改的是外部那個(gè)列表對(duì)象本身 def rebind_number(n): n n 1 # 只是把局部名字n重新指向了一個(gè)新整數(shù) data [] num 0 touch_list(data) rebind_number(num) print(data, num) # [1] 01.3 什么時(shí)候該抽函數(shù)什么時(shí)候抽了更糟我的判斷標(biāo)準(zhǔn)很土但用了很多年當(dāng)你需要給這段代碼寫注釋解釋“它在干什么”的時(shí)候這段代碼就該有一個(gè)名字了。注釋是對(duì)名字的替代如果這段邏輯有一個(gè)準(zhǔn)確的名字那就用函數(shù)名承擔(dān)說明職責(zé)別讓注釋散落在正文里。反過來以下幾種情況我傾向于不抽或者晚抽只在一個(gè)地方用、且邏輯與調(diào)用點(diǎn)強(qiáng)耦合、拆開后需要傳五六個(gè)參數(shù)才能工作。這種“參數(shù)搬運(yùn)”說明拆錯(cuò)了位置邊界沒找對(duì)。純粹為了減少行數(shù)而抽比如把print包一層。這種分層沒有帶來任何信息量讀的人還要多點(diǎn)一次跳轉(zhuǎn)。抽出來的函數(shù)名字叫process_data、handle_info、do_check這類——名字模糊說明你自己也沒想清楚它的職責(zé)這種函數(shù)遲早會(huì)變成新的意大利面。一個(gè)實(shí)用原則函數(shù)名如果是動(dòng)詞加名詞且能一句話說清它輸入什么、輸出什么、副作用是什么才算合格的名字。如果一句話說不完多半是職責(zé)太多。真正值得抽的通常是這幾種輸入校驗(yàn)、格式轉(zhuǎn)換、與外部交互讀寫文件、發(fā)請(qǐng)求、以及那些你已經(jīng)在腦子里默認(rèn)“這塊是獨(dú)立的”的邏輯。前三種是變化最頻繁的地方最后一種是認(rèn)知最清晰的地方。2. 參數(shù)設(shè)計(jì)默認(rèn)值、可變對(duì)象與那些星號(hào)2.1 默認(rèn)參數(shù)在 def 執(zhí)行的那一刻就求值了這是Python函數(shù)參數(shù)里最容易被忽略的機(jī)制。很多人的直覺是“每次調(diào)用時(shí)重新算一遍默認(rèn)值”實(shí)際上默認(rèn)值是在函數(shù)定義被執(zhí)行時(shí)求值一次之后一直復(fù)用那個(gè)對(duì)象。對(duì)不可變對(duì)象數(shù)字、字符串、元組、None沒什么影響對(duì)可變對(duì)象就是災(zāi)難。import time def log(msg, tstime.time()): print(f[{ts:.0f}] {msg}) time.sleep(1) log(第一條) time.sleep(1) log(第二條)兩條日志的時(shí)間戳一模一樣。因?yàn)閠ime.time()在定義log的時(shí)候就算完了后續(xù)所有調(diào)用都在用這個(gè)舊值。想要每次調(diào)用取當(dāng)前時(shí)間必須寫成tsNone然后在函數(shù)體里判斷。這個(gè)坑和可變默認(rèn)參數(shù)是同一個(gè)根源只是表現(xiàn)形式更隱蔽因?yàn)樗粓?bào)錯(cuò)只是數(shù)據(jù)不對(duì)。2.2 可變默認(rèn)參數(shù)每個(gè)人都該親手踩一次的坑def add_item(item, bucket[]): bucket.append(item) return bucket print(add_item(a)) # [a] print(add_item(b)) # [a, b] 期望是 [b]原因很直接[]這個(gè)列表在def執(zhí)行時(shí)創(chuàng)建了一次掛在函數(shù)對(duì)象上所有沒用第二個(gè)參數(shù)的調(diào)用共享它。默認(rèn)值實(shí)際上存在add_item.__defaults__里打印一下就看得見。正確寫法是雙段式這也是PEP 8推薦的慣用法def add_item(item, bucketNone): if bucket is None: bucket [] bucket.append(item) return bucket注意這里必須是is None而不是if not bucket。如果調(diào)用方傳進(jìn)來一個(gè)空列表not bucket為真你會(huì)新建一個(gè)列表調(diào)用方傳進(jìn)來的那個(gè)就不會(huì)被修改行為反了。這種“看起來能跑、邊界情況下錯(cuò)”的寫法比直接報(bào)錯(cuò)更難排查。寫法是否安全說明def f(x, a[])否所有調(diào)用共享同一個(gè)列表def f(x, a{})否字典同理且更隱蔽def f(x, aNone) 判空重建是推薦寫法def f(x, a())是元組不可變但無法追加元素用途有限def f(x, afrozenset())是需要集合語(yǔ)義時(shí)的安全選擇有一點(diǎn)值得補(bǔ)充如果你確實(shí)想用共享狀態(tài)做緩存那用可變默認(rèn)參數(shù)反而是個(gè)技巧但必須寫注釋說明這是故意的并且給它一個(gè)好名字比如_cache{}。沒有注釋的共享狀態(tài)在代碼評(píng)審里一律按bug處理。2.3 *args 和 **kwargs 什么時(shí)候真的需要兩個(gè)星號(hào)很多人學(xué)完就忘了或者反過來走到哪都用。它們真正的適用場(chǎng)景其實(shí)很窄包裝或轉(zhuǎn)發(fā)。你要在調(diào)用某個(gè)已有函數(shù)前后加點(diǎn)東西計(jì)時(shí)、日志、重試但你不想關(guān)心它到底收幾個(gè)參數(shù)。這時(shí)候def wrapper(*args, **kwargs)是唯一不破壞兼容性的寫法。參數(shù)數(shù)量本身是開放的。比如一個(gè)批量執(zhí)行函數(shù)run_all(*tasks)一個(gè)配置合并函數(shù)merge(**overrides)。給裝飾器傳參。def retry(times3, delay1.0)返回一個(gè)真正的裝飾器這層結(jié)構(gòu)必須用嵌套函數(shù)。不適合的場(chǎng)景也很明確如果你明知道函數(shù)只接收name和age就別寫def create(**kwargs)。這種寫法會(huì)讓IDE的補(bǔ)全、類型檢查、以及調(diào)用方對(duì)參數(shù)的理解全部失效出錯(cuò)只能在運(yùn)行時(shí)暴露。我評(píng)審代碼時(shí)看到這種簽名第一反應(yīng)是問“你到底想接收什么”。還有一個(gè)細(xì)節(jié)*args拿到的是元組**kwargs拿到的是字典而且順序在Python 3.7是有保證的按傳入順序。如果你需要把kwargs原樣傳給下一個(gè)函數(shù)直接用func(**kwargs)解包不要自己拼。2.4 斜杠和星號(hào)把調(diào)用方式鎖死Python 3.8 之后函數(shù)簽名里可以出現(xiàn)/和*用來限定參數(shù)只能按位置傳、或只能按關(guān)鍵字傳。def transfer(amount, /, account, *, memo): ...這里的含義是amount只能按位置傳account位置或關(guān)鍵字都行memo只能用關(guān)鍵字傳。這個(gè)語(yǔ)法看起來古怪實(shí)際解決的是參數(shù)名不能隨便改的問題——如果一個(gè)參數(shù)被設(shè)計(jì)成僅位置你就可以放心把它改名為amt而不擔(dān)心有調(diào)用方在用amount傳參。標(biāo)準(zhǔn)庫(kù)和很多三方庫(kù)里大量使用這個(gè)技巧做演進(jìn)。日常寫業(yè)務(wù)代碼我的建議是關(guān)鍵參數(shù)盡量只允許關(guān)鍵字傳遞用*隔開。像send_mail(to, subject, body, cc, bcc, retry)這種簽名調(diào)用時(shí)寫成send_mail(a, b, c, True, False, 3)半年后沒人看得懂。改成def send_mail(to, subject, body, *, ccNone, bccNone, retry3)調(diào)用方必須寫retry3可讀性立刻不一樣。3. 作用域與閉包變量到底被誰(shuí)改了3.1 LEGB 不是背誦口訣是查找順序局部Local、外層函數(shù)Enclosing、全局Global、內(nèi)置Built-in這個(gè)順序背起來容易用起來出問題的地方在于Python在編譯函數(shù)體時(shí)就決定了每個(gè)名字是局部還是全局不是運(yùn)行時(shí)才判斷。count 0 def bump(): print(count) # 這里會(huì)直接拋 UnboundLocalError count count 1因?yàn)楹瘮?shù)體里出現(xiàn)了count ...這個(gè)賦值編譯器把count標(biāo)記為局部變量。于是第一行print(count)去找局部變量發(fā)現(xiàn)還沒賦值直接報(bào)錯(cuò)。這個(gè)錯(cuò)誤信息叫UnboundLocalError: local variable count referenced before assignment幾乎每個(gè)學(xué)函數(shù)的人都撞過而且看錯(cuò)誤信息完全猜不到原因。記住一句話就夠了函數(shù)里只要對(duì)某個(gè)名字做過賦值它就是局部的除非你顯式聲明 global 或 nonlocal。3.2 閉包保存的是綁定不是值閉包指的是內(nèi)層函數(shù)引用了外層函數(shù)的局部變量并且外層函數(shù)返回后這些變量依然存活。這個(gè)概念本身不難難的是它的一個(gè)推論閉包捕獲的是變量本身不是捕獲那一刻的值。變量后來變了閉包里讀到的也變。funcs [lambda: i for i in range(3)] print([f() for f in funcs]) # [2, 2, 2]三個(gè)lambda都捕獲同一個(gè)i循環(huán)結(jié)束時(shí)i是2。修復(fù)方式有兩種第一種是借助默認(rèn)參數(shù)在定義時(shí)求值funcs [lambda ii: i for i in range(3)] # [0, 1, 2]第二種是用functools.partial可讀性更好一些from functools import partial def make(i): return i funcs [partial(make, i) for i in range(3)]同一個(gè)機(jī)制在按鈕回調(diào)、事件綁定、異步任務(wù)提交里反復(fù)出現(xiàn)癥狀都是“所有回調(diào)都用了最后一個(gè)值”。認(rèn)出這個(gè)模式比記住修復(fù)方法更重要。順帶說一句閉包在Python里是有實(shí)際用處的不是炫技。典型場(chǎng)景是做帶狀態(tài)的計(jì)數(shù)器或者帶配置的函數(shù)工廠def make_counter(start0): n start def counter(): nonlocal n n 1 return n return counter這里的nonlocal是必須的否則n 1會(huì)讓n變成內(nèi)層函數(shù)的局部變量又觸發(fā) UnboundLocalError。3.3 global 和 nonlocal 該用到什么程度我的態(tài)度比較保守global在業(yè)務(wù)代碼里基本不該出現(xiàn)它意味著你要從一個(gè)函數(shù)深處改全局狀態(tài)這種耦合遲早會(huì)咬人。真要共享狀態(tài)用參數(shù)傳、用返回值接、或者用類封裝都比改全局變量好。nonlocal的情況要好一些因?yàn)樗拗圃谇短缀瘮?shù)之間影響范圍可控前面那個(gè)計(jì)數(shù)器就是合理的用例。但同樣一旦嵌套超過兩層nonlocal的追蹤成本就上來了我一般會(huì)把狀態(tài)改成一個(gè)小的類或者dataclasses實(shí)例。經(jīng)驗(yàn)判斷如果你需要寫global才能讓函數(shù)工作先別寫回頭看看這個(gè)變量是不是該作為參數(shù)傳進(jìn)去或者該作為返回值帶出來。90%的情況能改掉。模塊級(jí)別的常量全大寫那種讀是可以的改就免了。4. 返回值設(shè)計(jì)None、異常還是哨兵值4.1 多返回值是元組解包前先想清楚return a, b看起來像返回兩個(gè)值實(shí)際是返回一個(gè)元組。這帶來一個(gè)常見問題調(diào)用方寫x, y get_pair()如果函數(shù)在某條分支上只return None解包就會(huì)拋TypeError: cannot unpack non-iterable NoneType object。這類錯(cuò)誤通常出現(xiàn)在異常分支跑正常流程永遠(yuǎn)測(cè)不出來。我的做法是要么所有分支都返回相同結(jié)構(gòu)的元組要么干脆不返回元組。如果某條分支實(shí)在沒結(jié)果返回(None, None)而不是None至少解包不會(huì)炸。還有一個(gè)語(yǔ)法細(xì)節(jié)常被誤解def f(): return 這個(gè)字符串永遠(yuǎn)不會(huì)被返回 def g(): return ( 括號(hào)里的內(nèi)容會(huì)被返回 )return后面換行語(yǔ)句就結(jié)束了下面的東西是死代碼。而括號(hào)里的內(nèi)容可以跨行因?yàn)槔ㄌ?hào)構(gòu)成了隱式的續(xù)行。寫多返回值時(shí)長(zhǎng)元組拆行記得用括號(hào)包起來。4.2 什么情況下該拋異常而不是返回 None這是函數(shù)設(shè)計(jì)里最影響長(zhǎng)期維護(hù)的一個(gè)決定。我的判斷標(biāo)準(zhǔn)只有一條“查不到”和“出錯(cuò)了”是兩種不同的事。查詢類操作查不到是正常業(yè)務(wù)結(jié)果返回None或空集合。比如find_user(uid)找不到用戶None合理。參數(shù)不合法、前置條件不滿足、外部依賴失敗這些屬于異常直接raise。千萬(wàn)不要用返回-1、返回ERROR、返回False來表達(dá)“出錯(cuò)了”。調(diào)用方永遠(yuǎn)會(huì)忘記判斷而raise至少會(huì)在出錯(cuò)的地方炸掉不會(huì)帶著錯(cuò)誤數(shù)據(jù)繼續(xù)往下跑。哨兵值sentinel是第三種選擇適用于“None也是一個(gè)合法返回值”的場(chǎng)景_MISSING object() def lookup(store, key): if key in store: return store[key] return _MISSING value lookup(data, name) if value is not _MISSING: ...用object()創(chuàng)建一個(gè)獨(dú)一無二的標(biāo)記比用None或者字符串__missing__安全得多因?yàn)椴豢赡苡袠I(yè)務(wù)數(shù)據(jù)恰好等于它。4.3 函數(shù)簽名本身就是文檔一個(gè)函數(shù)對(duì)外暴露的信息除了名字就是簽名參數(shù)名、默認(rèn)值、類型注解、返回類型。我見過很多函數(shù)注釋寫了五行簽名卻是def handle(a, b, cNone, dFalse)讀者還得讀函數(shù)體才知道dTrue是什么意思。類型注解不是必須的但在稍大的項(xiàng)目里投入產(chǎn)出比很高from typing import Optional, Sequence from dataclasses import dataclass dataclass class Result: ok: bool message: str items: Sequence[str] () def parse_records(raw: str, *, strict: bool False) - Result: ...這里的注解有三個(gè)作用編輯器的補(bǔ)全和跳轉(zhuǎn)能用上調(diào)用方不看實(shí)現(xiàn)就知道傳什么strict前面有個(gè)*調(diào)用時(shí)必須寫名字不會(huì)被誤傳。這三條加起來比寫十行注釋都有用。5. 把函數(shù)當(dāng)對(duì)象用裝飾器、高階函數(shù)與回調(diào)5.1 函數(shù)是對(duì)象的四個(gè)具體表現(xiàn)這句話被說濫了落到實(shí)際操作上到底是哪四條第一函數(shù)可以賦值給另一個(gè)名字alias original兩者指向同一個(gè)函數(shù)對(duì)象。第二函數(shù)可以作為參數(shù)傳給另一個(gè)函數(shù)sorted(items, keylen)里的key就是。第三函數(shù)可以作為返回值這是閉包和裝飾器的基礎(chǔ)。第四函數(shù)可以有屬性func.tag v2是合法的雖然少用。理解這四條之后很多“黑魔法”就變得平淡了。比如策略表def by_name(item): return item[name] def by_score(item): return -item[score] STRATEGIES { name: by_name, score: by_score, } sorter STRATEGIES.get(sort_key, by_name) items.sort(keysorter)這比寫一長(zhǎng)串 if/elif 好維護(hù)得多新增排序方式只要往字典里加一行不需要改調(diào)用邏輯。缺點(diǎn)是如果某個(gè)策略需要額外參數(shù)比如升序降序純函數(shù)就不夠用了需要換成functools.partial或者小對(duì)象。5.2 手寫一個(gè)裝飾器以及為什么必須加 wraps裝飾器的本質(zhì)是“接收函數(shù)、返回新函數(shù)”。最簡(jiǎn)版本import time def timing(func): def wrapper(*args, **kwargs): start time.perf_counter() result func(*args, **kwargs) cost time.perf_counter() - start print(f{func.__name__} 耗時(shí) {cost*1000:.1f} ms) return result return wrapper timing def slow_job(n): time.sleep(n) return n這段能跑但有個(gè)副作用slow_job.__name__變成了wrapper__doc__也沒了。用functools.wraps修一下from functools import wraps def timing(func): wraps(func) def wrapper(*args, **kwargs): ... return wrapperwraps(func)會(huì)把原函數(shù)的__name__、__doc__、__module__、__qualname__、__annotations__和__dict__復(fù)制到新函數(shù)上。不寫這個(gè)日志里的函數(shù)名全是 wrapper調(diào)試時(shí)根本分不清是哪個(gè)函數(shù)打的。帶參數(shù)的裝飾器要多包一層這是很多人第一次寫會(huì)繞暈的地方def retry(times3, delay0.5): def decorator(func): wraps(func) def wrapper(*args, **kwargs): last None for _ in range(times): try: return func(*args, **kwargs) except Exception as e: last e time.sleep(delay) raise last return wrapper return decorator三層結(jié)構(gòu)記法最外層收裝飾器自己的參數(shù)中間層收被裝飾的函數(shù)最內(nèi)層是真正的替換函數(shù)。寫的時(shí)候數(shù)一下括號(hào)層級(jí)基本不會(huì)錯(cuò)。注意裝飾器堆疊時(shí)執(zhí)行順序是“離函數(shù)近的先包離函數(shù)遠(yuǎn)的先執(zhí)行外層邏輯”。兩個(gè)裝飾器寫反了行為可能完全不同尤其是涉及異常處理和計(jì)時(shí)的組合。5.3 lambda 和 map/filter 的適用邊界lambda唯一的正當(dāng)用途是邏輯只有一行、并且只在這里用一次。典型的就是sorted(keylambda x: x[1])、max(items, keylambda r: r.score)。超過一行、或者需要命名就老老實(shí)實(shí)寫def起一個(gè)有意義的名字。map和filter在Python里其實(shí)不如列表推導(dǎo)式好用因?yàn)橥茖?dǎo)式能直接表達(dá)條件、能做嵌套、可讀性更好nums [1, 2, 3, 4, 5] # 不推薦 list(map(lambda n: n * 2, filter(lambda n: n % 2 0, nums))) # 推薦 [n * 2 for n in nums if n % 2 0]map真正有價(jià)值的地方是配合已有函數(shù)用不用寫lambdalist(map(str.strip, lines))、list(map(int, parts))。這時(shí)候它比推導(dǎo)式短也不損失可讀性。至于filter我基本不用[x for x in xs if cond(x)]就夠了。6. 遞歸、調(diào)試與把函數(shù)拆開排查6.1 遞歸的兩個(gè)必要條件與深度限制遞歸寫錯(cuò)無非兩種忘了終止條件無限循環(huán)直到棧溢出或者終止條件寫錯(cuò)結(jié)果偏了一位。Python 默認(rèn)的遞歸深度限制是 1000可以用sys.getrecursionlimit()查但我不建議隨便調(diào)大——Python 沒有尾遞歸優(yōu)化每一層調(diào)用都真實(shí)占棧幀調(diào)到一萬(wàn)層基本就是賭機(jī)器不死。def flatten(items): out [] for it in items: if isinstance(it, list): out.extend(flatten(it)) else: out.append(it) return out print(flatten([1, [2, [3, [4]]], 5])) # [1, 2, 3, 4, 5]這個(gè)例子里終止條件是“遇到非列表元素就直接收進(jìn)結(jié)果”遞歸條件是“遇到列表就下去一層”。寫遞歸的時(shí)候我習(xí)慣先寫終止條件再寫遞歸調(diào)用順序反了很容易漏。如果數(shù)據(jù)層級(jí)可能很深比如解析嵌套很深的配置用顯式棧的迭代版本更穩(wěn)def flatten_iter(items): stack list(reversed(items)) out [] while stack: cur stack.pop() if isinstance(cur, list): stack.extend(reversed(cur)) else: out.append(cur) return out或者用生成器加yield from寫法更簡(jiǎn)潔也天然帶惰性求值。6.2 用函數(shù)拆分把 bug 逼到角落里排查問題的效率很大程度取決于函數(shù)切得夠不夠細(xì)。一個(gè)兩百行的函數(shù)出了錯(cuò)你只能一行行讀切成八個(gè)二十行的函數(shù)你可以寫個(gè)臨時(shí)腳本單獨(dú)調(diào)用中間那一個(gè)輸入一份構(gòu)造好的數(shù)據(jù)直接看它返回什么。我的排查順序一般是先確認(rèn)輸入。在函數(shù)入口打印或者用breakpoint()停下看參數(shù)到底長(zhǎng)什么樣。很多“邏輯錯(cuò)誤”其實(shí)是上游傳了個(gè)空列表或者字符串。再看返回值。在每個(gè)return前面打印一次確認(rèn)走到的是哪條分支。同一個(gè)函數(shù)有五個(gè)return報(bào)錯(cuò)時(shí)你根本不知道從哪出去的。如果中間狀態(tài)復(fù)雜把可疑的那一段臨時(shí)抽成獨(dú)立函數(shù)單獨(dú)測(cè)。這一步很關(guān)鍵耦合在長(zhǎng)函數(shù)里的邏輯無法隔離驗(yàn)證。最后才去懷疑庫(kù)和外部依賴。順序反了會(huì)浪費(fèi)大量時(shí)間。順帶推薦一個(gè)習(xí)慣函數(shù)里盡量只做一件事尤其不要“邊計(jì)算邊寫文件”。把副作用挪到調(diào)用方函數(shù)本身保持純輸入輸出測(cè)試成本會(huì)低一個(gè)數(shù)量級(jí)。6.3 一組函數(shù)相關(guān)的報(bào)錯(cuò)對(duì)照下面這些錯(cuò)誤信息學(xué)函數(shù)這章的時(shí)候基本都會(huì)撞一遍。能讀懂它們調(diào)錯(cuò)速度會(huì)快很多。報(bào)錯(cuò)信息典型原因處理方向NameError: name x is not defined變量沒定義、拼寫錯(cuò)誤、或者定義在另一個(gè)函數(shù)里檢查作用域確認(rèn)變量在當(dāng)前位置可見UnboundLocalError函數(shù)內(nèi)某處對(duì)變量賦值導(dǎo)致編譯器判定為局部變量加global/nonlocal或改名避開TypeError: f() missing 1 required positional argument少傳了必填參數(shù)檢查簽名和調(diào)用處必要時(shí)給默認(rèn)值TypeError: f() got an unexpected keyword argument關(guān)鍵字參數(shù)名拼錯(cuò)或該參數(shù)是僅位置的對(duì)照def行核對(duì)名字TypeError: f() takes 2 positional arguments but 3 were given多傳了位置參數(shù)通常是把關(guān)鍵字參數(shù)寫成了位置形式給后面的參數(shù)加名字TypeError: cannot unpack non-iterable NoneType object函數(shù)某條分支返回了 None調(diào)用方按元組解包統(tǒng)一各分支返回結(jié)構(gòu)RecursionError: maximum recursion depth exceeded缺終止條件或遞歸分支沒有收斂補(bǔ)基礎(chǔ)情形或改成迭代SyntaxError: non-default argument follows default argument有默認(rèn)值的參數(shù)寫在了無默認(rèn)值參數(shù)前面調(diào)整參數(shù)順序把帶默認(rèn)值的放后面最后一行那個(gè)錯(cuò)誤值得單獨(dú)說一句def f(a1, b)是語(yǔ)法錯(cuò)誤但def f(a, b1)沒問題。這條規(guī)則和調(diào)用時(shí)的“位置參數(shù)必須在關(guān)鍵字參數(shù)前”是同源的記住“有默認(rèn)值的往后靠”就不會(huì)錯(cuò)。把這幾節(jié)的內(nèi)容串起來看函數(shù)這塊真正的難點(diǎn)從來不是語(yǔ)法。def、return、*args、裝飾器符號(hào)這些半小時(shí)就能背完。真正花時(shí)間的是那些需要寫夠代碼量才會(huì)浮現(xiàn)的問題默認(rèn)值被共享、閉包捕獲到最后一個(gè)值、異常分支返回了 None 導(dǎo)致解包炸掉、長(zhǎng)函數(shù)里根本定位不到出錯(cuò)的那一行。我自己寫代碼這些年最有用的兩個(gè)習(xí)慣都和函數(shù)有關(guān)——一個(gè)是給每個(gè)函數(shù)寫清楚它的輸入輸出契約寧可在簽名上多花五分鐘另一個(gè)是看到重復(fù)就抽但抽之前先問自己“這段邏輯以后會(huì)一起變嗎”。這兩個(gè)習(xí)慣幫我省下的排查時(shí)間比學(xué)任何高級(jí)語(yǔ)法都多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色情综合网| 99re6久热只有精品6在线直播| 91久久免费视频互動交流| 91视频综合在线| 69丨亚洲丨精品丨入口免费播放| 激情天天视频| 青娱乐 成人娱乐在线| 欧美变态激情网| 日韩天天综合| 91精品久久久久五月天精品| 丁香五月激情网| 日本一天色道久久久精品视频| 亚洲精品97久久中文字幕| 三级色影综合网| 男女激烈网站最新| 深爱五月天| 东北老熟女| 天天肏夜夜肏| 欧美天天影院| 日本道久久综合色色| 图色综合网| 国产丁香精品露脸视频| 伊人久久在线视频观看| 国产高清1234区| 中文字幕欧美精品亚洲日韩蜜臀| 精品亚洲国产成人AV制服丝袜| 久久嫩草国产成人一区| 狠狠久久手机视频精品| 91 在线亚洲| 亚州Av天美传媒| 免费观看网黄| 欧美午夜视频| 国产精品久久久久无码Av网曝门| laoshunv91| 羞涩视频| 欧美色偷拍| 九九九九一区| 中文字幕一区av| 国产精品对白自产拍| 一级特级aaaa毛片免费观看| 欧美亚洲色的图| 国产亚洲欧美每日在线| 青青草密桃在线播放| 日日夜夜摸| 高清不卡一二三区视频......| 国产免费内射视频| 婷婷五月天丁香花| 91欧美网| 精品无人区麻豆乱码久久久| 日本成熟少妇A∨网站| 性色高清在线| 欧美黄片视频在线观看免费 | 欧美一二三级精品在线| 日本一片一区| 无码人妻精品一区二区三区99不卡 | 欧美日韩国产人人| 成人5码视频| 91天天c| 秋霞午夜成人福利片片| 中文字幕av乱伦| 亚洲成成熟女人综合一区二区| 精品区9| 骚货操死你| 亚州少妇| 中文字幕在线高清男人的天堂| 国产乱子伦久久精品综合一区二区三| 亚洲天堂人妻一区二区| 国产特级毛片AAAAAA高潮流水 | 亚洲一区二区在线观看91| 开心五月天激情网| 成人无码电影在线观看网| 色97综合中文字幕| 丁香六月婷| 少妇综合| 天天日天天舔东京热| 欧美五十路熟| 四虎在线视频| 天天淫人人妻日日色| 午夜亚洲国产理论秋霞| 亚洲风情在线观看| 天天肏美女| 国产 亚洲 丝袜 制服| 999久久久国产精品| 久草热制服丝袜在线观看| 精品久久久久久亚洲| 亚洲激情综合另类男同| 韩国免费播放一级毛片| 国产久9| 夜夜操av亚洲一区二区| 天天色天天干天天爱| 国产精品伦理| 狠狠做深爱婷婷久久二区| 国产精品成人蜜臀AV在线| 精品一区二区三区18| 黄总AV色图| 国产亚洲在线观看| 福利色色| 高清无码 国产精品| 国产成人亚洲精品无码最新在线| av2014 日韩在线中文字幕| 99re这里| 日韩电影天堂视频二区三区| 二区熟妇韩日| 青苹果影院男人的天堂| 国产欧美日韩在线观看麻豆传媒公司| 亚欧成人综合影院| 91熟女丨老女人| 精吧天堂| 精品免费一区二区三区在线亚洲人成| 国产精品老师| 色丁香五月婷婷| 国产亚洲精品A在线观看下载| 亚洲一区二区AV| 日本欧美色| 久九九九九九九热| 亚洲天堂性爱| 青青欧美在线| 精品久久久久瑟瑟| 久久夜色一区二区| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 欧美亚洲韩国视频十五区 | 精品久久久九九九孕妇| 亚洲av夫妻操穴网| 久久久艹艹艹| 国产欧美一区二区| 偷窥自拍亚洲色图| 黑人中出21连凳花野真衣| 大奶啊啊好爽| 97人肏| 伊人97超碰| 夜夜操2028| 色婷婷av在线观看| 综合激情97 | 美美91成人国产精品欧美精品久久久久久久 | 国产91精品在线免费| 东京热男人天堂| 躁躁躁日日躁2020| 很很操在线| 久久久久夜夜夜夜| 青娱乐国产剧情av一区| 高清无码久操视频| 91欧美大片| 日日爱99| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 人人操人人摸人| 激情小说成人日本无码一| 全免费a敌肛交毛片免费| 亚洲国产ⅴ高清在线观看| 8x福利精品第一福利视频导航| 天天操人人操狠狠插| 口爆欧美91| 中文字幕丝袜美腿| 911av网站免费观看| 国产一区二区久久| 亚洲熟妇丝袜在线观看| 国产天天骚| 神马久久中文字幕| 天堂九九九九九九九九九| 亚洲春色激情小说| 撸撸成人在线视频| 大香蕉日韩欧美| 久久久久白虎| 久久成年片色大黄全免费网站| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 青青草男人天堂| 天操天操夜操夜月月年年操操| 精品人妻一区二区三区蜜桃视频| 国语对白露脸XXXXXX| 国内亚洲高清无码| 国产区性爱在线视频秋霞豆| 九九久久九九久久| 中国小夫妻勾搭露脸淫荡对白| 啊嗯嗯啊好大好爽| 国产午夜在线观看| 国产精品久久伊人| 欧美精品 - 91爱爱| 蜜桃臀一区二区三区久久| 人妻少妇精品| 国产高清无码一区三区二区| 久久99久久99精品免视看婷婷| 97 亚洲 日韩 欧美 在线| 偷拍在线观看视频| 神马午夜久久| 婷婷亚洲五月***久久| 精品国产乱码久久久久久久久1 | 99在线啪| 五月丁香六月激情综合| 亚洲日本大香蕉1| 日韩本不卡视频在线观看| 免费久久一级毛片大黄| 99热官网| 国产乱伦性爱区| 一区二区三区 日韩欧美| av天天在线观看| 蜜臀th| 啊啊啊在线观看| 日韩,欧美,中文在线| 一区二区 韩日AV| 久湿久久| AV和黑人在线播放| 91人妻丝袜无码| 91精品国产长腿丝袜美女| 91伊人久| 亚洲 欧美 91| AV女资源| 国产亚洲精品自在线亚洲情侣| 口爆欧美91| 亚洲毛片久久| 亚洲操逼视频网站| 日韩一级二级三级免费看完整版国语版 | 国产后入精品| 亚洲色婷婷综合久久一区二区三区| 都市久久精品激情亚洲| 亚洲高清视频在线观看| 日夜伊人网| 熟女人妇一区二区三区| 白丝少妇一区二区| 中文字幕乱码人妻二区三区| 嗯嗯嗯不要不要免费视频| 加勒比综合88| 国产蜜臀精品一区免费尤物| 91精品国产一区三一| 日本3级一区二区免费| 久久久99999久网站| 91久热这里只有精品| 99久久网站| 九九九九免费视频| 国产辣妈在线视频福利| 伊人97超碰| 91热色| 国产一级137片内射麻豆| 五月激情在线| 99少妇| 亚洲欧美日韩夜夜| 青青草中出视频 | 精品少妇999| 日日夜夜狠狠| 久久无码精品| 五月激情小说| 91bbbbbb| 天天综合91在线| 国产精品禁久久久精品| 国产精品午夜高潮呻吟久久av| 欧美综合狠| 天天色综合图片| 四季AV一区二区凹凸精品小说| 色欧美综合| 欧美精品三区| 精品国产乱码久久久久A| 欧美韩日精品99综合| 亚洲美女自拍偷拍视频| 99精品在线| 亚洲精品aa久久伊人| 日韩AV一区二区三区三州三州| 加勒比海色香蕉婷婷| 亚洲操操操| 亚洲国产成人精品女人久久久| 日韩美脚一区二区网站| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 日本九九久久99播| 高潮毛片无遮挡高清免费| 吉川爱美98堂在线| 操逼片国产| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 男人天堂网手机版婷婷| 无色无码| 亚洲黄色AV电影| 五月婷婷五月天| 97超碰久久| 一区中文字幕二区日韩| 国产精品婬乱一级毛片彝族| 精品九区| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 操逼啊啊啊91| 青青草五月份天| 亚洲欧美精品福利在线| 可免费观看的av毛片中日美韩| 麻豆AV短剧| 福利操逼| 男人精品区| 欧洲乱码一区二区| 亚洲一本色道中文无码aV天美| 96超碰网| 男人久久精品| 亚洲AV永久无码一区仙野| 亚洲日韩美女丝袜美腿人妻视频| 久久九九一区二区三区成人| 日韩人妻 中文字幕| 午夜在线播放| 久久久99999久网站| 女人高潮大叫一级毛片| 熟妇乱伦一区二区| 九九九草| www.99视频| 亚洲欧美色图小说| 91高清欧美| 粉嫩国产精品久久久| 成人八戒网站| 91综合色噜噜| 尤物AV免费网站| av情色影音| 天天操天天舔| 一级二级三级黑人无码| 91精品人妻一品二品三品| 亚洲天堂另类小说男人| 午夜一区| 亚洲av综合色区无码一| 亚洲欧美情色| 大白逼三四级| 亚洲综合骚逼| 天色综合网| 色呦呦呦在线观看视频| 少妇被c 黄 免费观看| 91在线丝袜| 搡老女人老妇女老妇老熟女怎么读| 成年人一级黄色毛片大全在线观看| 日本成人在线不卡一区二区三区| 密臀国产在线| 亚欧美综合网。| 欧美精品成人亚洲| 香蕉久久国产AV一区二区| 日本不卡高清视频| 天天射天天操天天干天天吃2018| 亚洲乱妇p22| 蜜桃视频啊啊啊啊| 国产天天看| 青青草视频这里只有精品| 日本中文字幕在线视频| 极品尤物自安慰| 秋霞免费无码视频日韩A片| av天堂电影网| 伊香蕉综合久久久久久久噜噜噜| 爱妻综合网| 曰本91情色| 美女啊啊啊啊pc| 亚洲欧洲另类| 天天日天天爽| 国产精品久久成人免费| 亚洲成a人片在线观看中文!!!| 香港澳门日本三级网站| 91精品国产91久久福利| 百度百度日本操逼| 色综合一区二区三区| 大逼色网站| 欧美色图小说综合| 日本加勒比无码专区一二三| 亚洲射综合网| 九九拍拍精品视频在线播放 | 成人国产二区三区在线,男女精品。| 欧美色日| 亚洲国产中文字幕| 天天日骚逼熟女| 综合九九| 91美女高潮| 99热国产| 久热精品在线| 深夜激情| AV女优男人的天堂| 亚洲丝袜少妇在线| 96超碰网| 高颜值美女口爆高潮浪叫| 大白逼三四级| 哈哈操 大香蕉| 欧美午夜熟妇黑人精品91| 激情另类激情| 欧美姓爱综合网| 亚洲在饯| 天天干人人看综合| 日韩中文字幕国产| 最新的亚洲无吗| 九九久久一区二区伦理| A片 AV一级在线播放观看免费| 日韩成人性爱电影在线播放| 啪啪91| 蜜臀av在线播放一区二区三区| 91麻豆天美国产欧美| 热天堂一区二区| 亚洲熟妇无码一区二区三区| 国产AV人人夜夜澡人人爽麻豆| 97超碰国产亚洲精品| 九九九成人| 97超碰色| 国产精品极品美女视频| 精品人妻一区二区三区四区不卡在| 四虎在线观看视频| 啪啪啪精品| 日本视频一区二区三区| 99热久| 热久久91婷婷| 自拍视频大全亚洲专媒视频/一区二区三区| 国产欧美日韩臀| 午夜精品人妻二区三区| 91这里只有精品| 91亚洲色人| 伊人黄色视频免费观看| 97超碰国产精品| 嗯~啊~快点 死我视频| 欧美性爱一区| 欧美综色欧| 久久永久无码人妻视频| 国语精品内射在线观看| 九九九九久久久| 日韩二三区| 免费国产| 人人操人人操人人人操| 午夜男女爽爽爽在线视频 | 国产少妇高潮| 91高潮| 久久首页| 91xingse| 亚洲色图第四色| 成人青青草原伊人| 久久久一区二区三区三州| 午夜福利免费精品视频| 欧美天堂日韩三级国产传媒| 熟妇一区,二区,三区。| 亚洲综合影院| 日日操天天操| 国产熟女自拍| 国产丝袜欧美在线视频| 色香蕉影院| 91最新综合| 大香蕉2017| 久久中文字幕一区不卡| 丰满人妻一区二区三区免费,| 黑人精品久久97| 偷拍片久久| 超碰97人妻自拍| 中文字幕超碰CAO| 天久久久噜噜噜久久国产精品爽爽| 懂色中文一区二区三区| 久久色人体| 色噜噜狠狠色综无码久久| 夜夜操美女| 超碰日本97美女人妻人人玩人人爱| 久久久一区二区| 91av熟女人妻| 69超碰综合| 亚洲美腿丝袜香蕉影视欧美成人| 成全在线观看免费观看| 国产有码一区| 人妻欧美| 丰满人妻-区二区三区免费| 97久久精品不卡| 人人操人人摸人人看人人干| 三上制服丝AV| 人妻色偷色噜| 欧美日韩夜夜| 大香久久| 最新欧美色网| 91成人无码| 五月丁香婷婷综合网| 激情四射婷婷六月天| 国产福利视频精品视频| wwe 天天干.com| 神马久久久久久| 亚洲综合另类| 午夜一区| 92福利社视频| 亚洲97在线| 精品一区二区三区蜜桃臀赵总 | 人妻黑丝袜电影| 亚洲无码成人精品| 少妇一区二区三区在线观看| 污色区网站| 肥臀熟女福利视频一区二区| 亚洲高清自拍| 婷婷伊人一区| 日韩强奸av| 久久免费老司机精品| 97综合国产| 天天综合91在线| 久久久久久九九九| 久久a久久| 国产精品久久久吖| 欧美72网页| 中文精品一区二去| 亚洲综合大片| 九热视频| 91在线免费精品视频| 伊人大香蕉在线| 色综合国产在线观看| 亚洲欧美九九九| 欧美黄色片在线播放| 我爱搞逼综合网| 成人福利视频网| 高颜值美女口爆高潮浪叫| 久久久久久人妻| 亚洲男人天堂网| 99九九久久| 欧美91视频| 欧美精品欧美精品系列| 婷婷爱五月| 很很操在线| 欧美午夜视频| 无遮挡猛进视频免费无限观看| 九七超碰人人乐| 激激五月| 国内毛片婷婷六月色| 97欧美色| 午夜情侣自拍网站| 国产熟女乱论| 97在线视频网站| 啊a一区在线| 精品成人亚洲午夜电影| 亚洲日本大香蕉1| www.激情| 人人干黄色| 久久久内射良家| 九九av| 黄片免费日韩| 日产精品久久久一区二区| 午夜久久一区二区无码中出| 殴美在线AⅤ| 久艹日日日| 天天操天天日天天干| 另类小说五月天| 日产欧美电影一区二区三区| 久久9免费视频| 免费看美国人人爽,人人操| 免费精品人妻一区二区三| 97国产|免费| 日韩国产十八禁| 1024人妻| 亚洲一本色道中文无码aV天美| 91伊人| 啊嗯嗯啊好大好爽| 日韩伦理视频| 操逼操逼逼操操逼91| 中文字幕欧美日韩三级| 男人的天堂日韩| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 国产精品在线一区二区| 97亚洲一区| 精品v日韩欧美国产| 欧美色就是色| 噜噜噜亚洲精| 97热视频在线观看| 99999精品成人| 大香蕉综合| 久久成人午夜精品影院| 天天综合91| 四虎av在线| 久久久久大香青草精品综合| 偷拍欧美激情| 伊人久久大香大香线蕉中文| 一级黄色性爱A级片| 国产午夜精品在线观看| 日本三级精品| 97超碰资源网| 97玖玖超碰| 亚洲天堂中文字幕无码男同| 日韩在线观看中文字幕视频| 国产精品久久久久久久毛片1| 日韩欧美大片免费高清啪啪| 亚洲熟女av中文字幕| 色九九九九九九| 日本淫穴在线| 欧美亚洲厕所精品偷拍91| 欧美日韩免费专区在线| 男人的天堂亚洲| 静品嫩模一区二区| 性爱av在线免费观看| 韩国黄片aaaa| 午夜视频好爽啊| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 少好三P| 成人七区| 嗯~啊~轻一点 视频| 啊啊啊啊操死我了| 欧美无圣光在线| 嗯嗯,啊啊,国产精品| 中文字幕在线观看视频www| 免费a在线播放v| 青娱乐国产精品| 一区二区三区探花在线观看| 波多野42部无码喷潮在线观看 | 亚洲激情综合另类| 精品78| 久久啊啊啊| 五月天伊人网| 亚洲欧美不卡线| 国产福利精品98视频| 张柏芝国产一区在线观看| 嗯嗯啊啊好爽| 欧美激情久操网| 中文AV制服乱伦| 久久精品国产亚洲5555| 国产日韩精品suv| 一本色道综合久久欧美| 午夜无遮挡男女啪啪视频| A一区片| 色翁荡息又大又硬又粗又爽| 97精品熟女少妇一区| 亚洲色 国产 欧美 日韩| 岛国色情视频在线观看| 婷婷激情综合网| 欧美激情综合| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 1769一区二区| 色婷婷丁香| 日韩97超碰中文字幕| 日韩精品人妻系列无码天堂| 97精品97久久| 少妇贴图| 9国产超碰| 色操逼网| 婷婷丁香六月| 福利风月五月天影院| 亚洲情色在线| 久久久久久久久9| 精品少妇99| 刺激精品视频| 亚洲中文字幕有码视频一区二区三区| 久久曰曰| 九九九久| 亚洲一区中文精品| 大香蕉专区| av九九| 欧美熟妇乱码在线一区| 91欧美性| 色逼综合| 99婷婷一区二区| 国产精品探花在线| 欧美亚洲日本激情在线| 78综合网| 日韩色图 一区二区| 97欧美日韩| 精品福利| 3P乱轮视频| 一区二区三区精品黑丝白丝酒店对鸡| 97精品第3页| 欧美日韩色| 国产91av在线播放| 五月婷婷色色| 330dv亚洲成年视频网| 97操b| 天天色黄色影院天天操| 五月天社区| 天天内射| 伊人热综合| 97人人模人人爽人人| 中文字幕乱碼在线| 老熟女综合网| 强被迫伦姧在线观看无码网站| 黑人精品成人一区二区三区| 色爱综合网欧美| 天天操妹子| 欧美人妻精品一区二区| 91电影色诱| 97资源久久| 精品久久人妻成人网| 中文在线久久字幕| 97日韩欧美| 亚洲精品a人片在线观看视| 你草精品在线视频| 啊啊啊啊好爽好舒服一区二区易域| 色色色欧美| 亚洲综合小视频小说在线观看| 亚洲高清91| 久久一区二区三区入口| 精品无码一二三四区| 一二三区操逼国产91| www.久久久久| 撸撸成人在线视频| 日韩性爱一级片| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 欧美综合色图网| 国产欧美日韩一区二区三区| 刺激性视频黄页| 中欧人妻丝袜中文字幕| 丁香五月成人| 综合色区偷拍| 久久久97| 欧美操逼录像国产黄色国产| 国产懂色精品国产av| 大乔未久88一区| 少妇厨房愉情理伦片bd在线观看| 67914在线精品观看| 亚洲欧美首页| 偷拍 欧美 日韩| 色男人色天堂东京热| 久久久国产精品亚洲精品| 丰满人妻一区二区三区性色| 国产四虎在线| 欧美Ⅴ性爱| 国产精品亚洲四五区在线观看| 五月天亚洲色图| 麻豆2区1区天美| 麻豆区久久久久亚| 欧美性爱精品一区二区| 一区超碰一区| 亚洲欧美中文日韩视频中国语| 蜜汁欧美| 99热精品在线播放| 欧美东京热青青草| 国产精品久久久视频| 密乳视频在线| 第四色色综合91| 综合久久久久久久久91| 成人一区二区三区四区| a天堂视频| 中文字幕精品专区搜索结果91| 亚洲图片偷拍视频区| 超碰97综合网| 激情五月综合| 亚洲无码精品AV久久久| 91亚洲欧美色图| 日韩av不卡在线看| 玖玖资源中文字幕制服丝袜| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 欧洲站一级二级三级h| 大香蕉综合在线| 欧美亚洲特P| 大奶啊啊好爽| 久久av无码| 亚洲男人的天堂网| 熟女被操视频网址| 欧美色图91| 第四色亚洲色图| 操逼免费视频无码国产| 97超碰国产亚洲精品| 日韩免费人妻色情网站| 国产强奸AV在线| 亚洲性少妇| 国产99 中文字幕日韩小视频| 国产区在线| 国产精品视频电影| 国产精品无码久久久久2028| 综合亚洲欧美| 日本一片一区| 99精品成人免费看| 亚洲一区日韩精品中文字幕| 69久久久久久久久久久久久| 亚欧性爱在线无码| 亚洲av无码成电影在线播放| 国产中午字一暮区| 91亚洲黑人| 国产精品久久久久久久久久梁医生| 人妻少妇久久中文| 日韩有码一区三区| 日本十八禁免费看污网站| 精品无av| 东北女人被操| 91粉嫩萝控精品福利网站_精品影音先锋国 | 国产精品午夜高潮呻吟久久av| av天堂加勒比| 1二区9| 九九99精品| 台湾一区国产高清在线| 四虎精品永久在线观看| 91成人在线| 99久久九九| 无码操逼网| 久久东京热久久| 欧美91丝袜| 爱射综合| 国产精选三级在线观看| 激情黄色片在线观看| 大干人妻| 久久亚洲天天做| 丁香五月天堂网| 91网九色蝌蚪操熟女| 欧洲综合色| 亚熟hd视频在线| 亚洲精品久| 久久婷婷六月综合| 亚洲中文一区二区三区| 日韩性爱啪啪视频| 欧综合网| 色一区二区三区综合| 人妻人人澡人人爽人人| 97国产色综合| 91久操| 一本色道综合久久欧美| 友优传媒精品在线一区二区| 99re6在线视频精品免费完整版安卓版| 国产白嫩精品久久| 中文字幕av色| 色玖玖| 在线观看综合精品亚洲| 中文字幕亚洲永久精品| 自拍内地三级在线观看| 97久久国产| 久久亚洲日韩熟女精品| 91伊人久久在线| 亚洲欧美日产国产91毛片| 操我啊啊啊啊啊| 看日韩美女二区三区免费操逼视频| 国产中文字幕曰本毛片| 中国大陆国产高清AⅤ毛片| 国产辣妈在线视频福利| 激情五月天中文字幕色| 欧洲久久一二线| 粉嫩av一区二区三区天美传媒| 日本高清一本二本免费不卡| 久久久久久裸体| 久久综合久色欧美综合狠狠| 九一精品牛牛一区二区| 色欲人妻一区二区在线| 欧美狠狠弄| 超碰97资源中文字幕| 欧美日韩黄色片一区二区三区四区人与兽做爱| 嗯啊不要在线观看嗯啊| 99热66| 色哟哟的毛片| 激情五月激情综合网| 91欧美| 亚洲 欧美 91| 九九热免费国产视频婷婷伊人| 丁香婷婷啪啪| 91视频国品一二三区| 欧美成人精品A片免费一区99| 91精品国产高清久久久久久,亚洲成人 | 黑人精品久久97| 久久久国产精品亚洲精品| 亚洲精品1区| 久久精品人妻一区二区| daxiangjiao你懂的| 黑人干亚洲| 色一区二区三区综合| 好湿好紧视频| 欧美色图 色综合图| 国产精品扒开腿做爽爽爽视频| 97亚洲综合影院| 少妇一级无码精品| 超碰97中文| 欧美特大AA级黄片| 天天操天天射天天日| 中文字幕亚洲热播人妻| 综合欧美日韩在线观看| 亚洲五月婷婷| 91暧暧| 日本东京热大香蕉a片| 91老熟女老女人国产老太| 久久久91福利姬| 欧美韩日精品99综合| 亚洲天堂2020| 看免费的黄片| 免费作爱一级视频| 无码99| 久草资源欧美在线视频| 天天综合网~91综合网| 欧美激情在线观看视频| 人妻夜夜爽天天爽三区麻豆AV网站| 亚洲国产成人7777| 91人妻尻屄视频| 久久久久成人蜜桃精品| 男生女生啊啊啊啊| 91国产美女丝袜足交精品视频| 亚洲在钱| 久久超碰97| 在线a v| 激情丁香五月婷婷| 久久男人网| 91精品操美女| 免费a v| 91快色色色色色| 丰满人妻-区二区三区免费| 少妇与黑人高潮在线| 精吧天堂| 国产呦精品系列在线观看| 午夜偷拍久久熟女| 精品妇女一区二区三区| 91视频成人福利网站在线一区 | 2024黄色视频| 成人午夜小视频手机在线看| 爱爱动态120秒| 亚洲欧美日韩国产丝袜自拍中文| 色噜噜人妻av中文字幕| 中文字幕,人妻,日韩| 日本三级R| 久久做97| 亚洲av资源| 欧美黑人精品在线播放| 96AV精品| KK色在线影院| 91性高朝久久久久久久久| 五月天玖玖资源站| 91九九九逼| 97国产超碰| 秋霞免费AV| 国产超碰在线一区| 大香蕉99999| 91c色| 亚洲日韩青青草色月| 97 国产精品| 精品毛片av一区二区| 欧美日韩色图片| AV久日| 综合久久久久久久久91| AV九九| 无码操逼天堂| 欧美一二三级精品在线| 97九色人妻| 国产精品伦理| 强奸乱伦中文字幕AV| 日日夜夜骚| 男人在线天堂| 99色热| 精国久久一区二区三区98| 久久成年片色大黄全免费网站| 天天爽天天爽| 五月天九九日国产精品一区二区三区| 午夜乱轮操逼视频免费看| 欧美三级不卡| 伊人操| 日本三级中国三级99人妇网站| 色婷婷A V一二三四区麻豆综合| 久综合国内精品自在自线| 熟女啪啪视频| 久久久久久九九九| 六月天婷婷| 后入精品| 超碰在线国产| 国产久9| 午夜高清成人在线视频| 综合激情一一91| 国产一区二区三区久久久精品| 综合网~91综合网| 少妇综合| 熟女一区二区| 国产精品成久久久久午夜午夜| 亚洲欧洲国产综合av| 偷拍欧美亚洲| 色噜噜人妻丝袜a∨先锋影| 天天影视之亚洲综合网| 免费伦费视频在线观看| 性九九九九九九| 两性色网| 人人妻天天做天天爽| 国产a级午夜毛片| 国产中午字一暮区| 性爱1区| 超碰欧美COM| 亚洲AV免费在线| 久久粉色| 亚洲欲色9532548967一区| 国产三级片在线观看| 久久天天摸| 操国产逼| 热天堂一区二区| 人人爱人人乐人人操| 精品久久久久黄少妇| 青草草免费网站av| 丰满精品人妻少妇久久字幕| 日本Xx性爱| 大香交| 国模无码一区二区三区在线| 中文字幕熟女人妻丝袜丝| www.久久久久| 中文字幕三四区| 91殴美大片| 粉嫩不卡一区二区性爱| 亚洲九九视频| 亚洲.欧美.丝袜.中文.综合| 久久精品国产亚洲AV清纯| 91丝袜激情在线| 嫖老熟女A片一二三区| 亚洲天天自拍| 啊嗯好大视频在线观看| 特级特黄一级毛片免费| 在线观看午夜婷婷久久久久清性观看| 日本亚洲熟女视频| 日韩超碰97| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 91综合中文字幕| 久久熟女人| 欧美aaaaaaa| 久夜操| 97硬碰| 国产精品自在自拍视频| 亚洲图片欧美色| 青青草日本中文字幕| 亚洲精品日日夜夜52| 日韩亚洲欧美中文字幕| 最新精品久久蜜桃 | 色噜噜狠狠色综无码久久合欧美| 亚洲人体视频在线观看| 欧美大干日韩| 人妻天天夜夜爽一区二区| 日韩欧美午夜一区二区| 欧美日本不卡在线| yiren97| 亚洲AV无码国产精品久久久久| 久草加勒比一区在线| 亚洲 另类 丝袜 自拍 动漫| 成人 日韩欧美一区| 小视频国产| 婷婷午夜清品久久久久久久性色视频观| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 91ise欧美| 三级三级三级a级全黄三| 妇女一区二区三区| 色狠狠综合噜一二三区| 亚洲强奸乱伦影视网| 91操操操操| 一区超碰一区| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 欧美色图校园春色| 欧州激情视频在线一区二区| 色色国产| 在线一道啪| 亚洲成人ab| 偷拍五区| 玖玖爱综合| 激情婷婷| 太久视频| 男女猛烈无遮掩视频免费软件| 免费视频观看60秒| av久日| 亚洲射综合网| 一级免费啪啪片| 日日操丁香五月天| 思思热一热婷婷热一热| 五月天精品| 欧美人妻精品一区二区| 蜜乳AV免费观看| 色综合天天爱去电影网| 欧美高清在线| 97在线观视频免费观看| 一区二区三区四区五区高清无码永久视频| 人妻人人操| 久久久久亚洲Aⅴ无码| 综合久久久久久久久91| 日韩99999| 97欧美色| Aa东京男人的天堂| 好看的久久不射无码影视影院| 91精品电影18| 人人天天欧洲| 五月婷婷色| 久久九色| 国产偷拍自拍在线视频| 97在线视频观看网站| 免费观看成人www精品视频| 操碰97| 香蕉99秘 一区精品蜜桃臀| 欧美色老汉| 日本黄色天堂| 亚洲欧美日韩电影网站一区| 成人精品一区二区三区| 看黑丝美女操逼青青网站| 日韩一级二级在线| 久久久久性熟视频| 嗯嗯嗯啊啊啊在线免费观看| 天天日夜夜| 亚洲色吧网| 久久久久免费少妇| 综合网欧美在线| 日本狠狠干| 97九色人妻| 欧美激情总合网| 久久99黄色卞西瓜| 亚洲天堂性爱| 亚州成人A√| 99热这里只有精| 九九成人| 亚洲春色激情小说| 91亚洲黑人| 色呦呦、国产精品| 超碰色中文| 97精品综合久久网| 欧美91网站| 激情情色五月天| 久9爱经典视频| 日本幼女18+| 欧洲综合色| 97干97色| 午夜舔阴达高潮视频免费看| 囯产精品久久久久久久久久梁医生| 中英熟女操女| 成人性爱AV在线免费观看| 亚洲 日本 国产 综合| 婷婷激情五月天小说网| 中文字幕av乱伦| 久久婷婷五月天| 亚洲AV无码| 另类专区在线观看| 日本狂喷奶水在线播放212| 国产无码高清操逼视频| 免费的很黄很污的全部视频| 日韩欧美午夜视频在线| 丁香五月影院| 野狼激情网| 精品然女一区二区| 秋霞福利网| 成人性交午夜免费片| 亚洲加勒比久久日本道| 成人无码电影在线观看网| 青娱乐欧美激情一区二区| 日本护士高潮| 99热免费| 97 超碰 人人做 人人爱| 校园春色亚洲无码| 麻豆一区二区三区在线看 | 欧美亚洲手机在线| 97香蕉网| 中文字幕欧美丝袜07资源| 亚洲天天做日日做天天谢日日| 伊人久久综合影院| AA丁香综合激情| 99久热| 东北老女人的激情视频| 男人天堂综合| 精品夜夜澡人妻无码AV| 成人久久久| 视频在线观看免费一区二区三区 | 无套内射性感少妇视频| 亚洲色天堂日韩中| 九九自拍伦理| 亚洲男人天堂网站| 伊人久久综合影院精品久久久| 日韩欧美成人性爱在线| 色婷婷狠狠| 青青草啪啪网| 99热大香蕉伊在线| 天天噜| 日本www操操操| 国产剧情一区在线观看| 综合网97| 精品国产a∨一区天美传媒| 日本十八禁免费看污网站| 国产 丝袜 欧美中文 另类| 青娱乐亚洲热| 欧美色图99| 成人av福利在线观看| 欧美躁死她一区二区| 超碰天天操| 中国一级αV| 日本一级性爱| 日韩情色AV| 精品亚洲天堂| 国产福利影视| 色色99| 欧美色涩| 国产亚洲女v在线观看| 欧美男女午夜啪啪| 蜜桃精品视频一区二区三区| 好色综合| 亚洲操操操| 日本黄色天堂| 高潮毛片无遮挡高清免费| 亚洲国产第一页综合视频| 玖色av| 日韩亚洲精品一区二区| 岛国AV一区二区电影| 色综合大香蕉| 国产成人免费观看在线视频| 成人日韩中文字幕| 欧美在线天堂| 欧美日韩性爱操大逼| 欧美中字二区| 一区二区视频在看| 日韩性爱电影一区| 亚洲黄色网址| 人妻性爱一区二区| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 久久久国产成人一区二区三区在线| 97 亚洲 日韩 欧美 在线|