精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python編程中的反模式

開發 前端 后端
這篇文章收集了我在Python新手開發者寫的代碼中所見到的不規范但偶爾又很微妙的問題。本文的目的是為了幫助那些新手開發者渡過寫出丑陋的Python代碼的階段……

這篇文章收集了我在Python新手開發者寫的代碼中所見到的不規范但偶爾又很微妙的問題。本文的目的是為了幫助那些新手開發者渡過寫出丑陋的Python代碼的階段。為了照顧目標讀者,本文做了一些簡化(例如:在討論迭代器的時候忽略了生成器和強大的迭代工具itertools)。

對于那些新手開發者,總有一些使用反模式的理由,我已經嘗試在可能的地方給出了這些理由。但通常這些反模式會造成代碼缺乏可讀性、更容易出bug且不符合Python的代碼風格。如果你想要尋找更多的相關介紹資料,我極力推薦The Python TutorialDive into Python

迭代

  • range的使用

Python編程新手喜歡使用range來實現簡單的迭代,在迭代器的長度范圍內來獲取迭代器中的每一個元素:

  1. for i in range(len(alist)):  
  2.     print alist[I] 

應該牢記:range并不是為了實現序列簡單的迭代。相比那些用數字定義的for循環,雖然用range實現的for循環顯得很自然,但是用在序列的迭代上卻容易出bug,而且不如直接構造迭代器看上去清晰:

  1. for item in alist:  
  2.     print item 

range的濫用容易造成意外的大小差一(off-by-one)錯誤,這通常是由于編程新手忘記了range生成的對象包括range的***個參數而不包括第二個,類似于java中的substring和其他眾多這種類型的函數。那些認為沒有超出序列結尾的編程新手將會制造出bug:

  1. # 迭代整個序列錯誤的方法  
  2. alist = ['her''name''is''rio']  
  3. for i in range(0, len(alist) - 1): # 大小差一(Off by one)!  
  4.     print i, alist[I] 

不恰當地使用range的常見理由:
1. 需要在循環中使用索引。這并不是一個合理的理由,可以用以下方式代替使用索引:

  1. for index, value in enumerate(alist):  
  2.     print index, value 

2. 需要同時迭代兩個循環,用同一個索引來獲取兩個值。這種情況下,可以用zip來實現:

  1. for word, number in zip(words, numbers):  
  2.     print word, number 

3. 需要迭代序列的一部分。在這種情況下,僅需要迭代序列切片就可以實現,注意添加必要的注釋注明用意:

  1. for word in words[1:]: # 不包括***個元素  
  2.     print word 

有一個例外:當你迭代一個很大的序列時,切片操作引起的開銷就比較大。如果序列只有10個元素,就沒有什么問題;但是如果有1000萬個元素時,或者在一個性能敏感的內循環中進行切片操作時,開銷就變得非常重要了。這種情況下可以考慮使用xrange代替range [1]。

在用來迭代序列之外,range的一個重要用法是當你真正想要生成一個數字序列而不是用來生成索引:

  1. # Print foo(x) for 0<=x<5  
  2. for x in range(5):  
  3.     print foo(x) 
  • 正確使用列表解析

如果你有像這樣的一個循環:

  1. # An ugly, slow way to build a list  
  2. words = ['her''name''is''rio']  
  3. alist = []  
  4. for word in words:  
  5.     alist.append(foo(word)) 

你可以使用列表解析來重寫:

  1. words = ['her''name''is''rio']  
  2. alist = [foo(word) for word in words] 

為什么要這么做?一方面你避免了正確初始化列表可能帶來的錯誤,另一方面,這樣寫代碼讓看起來很干凈,整潔。對于那些有函數式編程背景的人來說,使用map函數可能感覺更熟悉,但是在我看來這種做法不太Python化。

其他的一些不使用列表解析的常見理由:

1. 需要循環嵌套。這個時候你可以嵌套整個列表解析,或者在列表解析中多行使用循環:

  1. words = ['her''name''is''rio']  
  2. letters = []  
  3. for word in words:  
  4.     for letter in word:  
  5.         letters.append(letter) 

使用列表解析:

  1. words = ['her''name''is''rio']  
  2. letters = [letter for word in words  
  3.                   for letter in word] 

注意:在有多個循環的列表解析中,循環有同樣的順序就像你并沒有使用列表解析一樣。

2. 你在循環內部需要一個條件判斷。你只需要把這個條件判斷添加到列表解析中去:

  1. words = ['her''name''is''rio''1''2''3']  
  2. alpha_words = [word for word in words if isalpha(word)] 

一個不使用列表解析的合理的理由是你在列表解析里不能使用異常處理。如果迭代中一些元素可能引起異常,你需要在列表解析中通過函數調用轉移可能的異常處理,或者干脆不使用列表解析。

性能缺陷

  • 在線性時間內檢查內容

在語法上,檢查list或者set/dict中是否包含某個元素表面上看起來沒什么區別,但是表面之下卻是截然不同的。如果你需要重復檢查某個數據結構里是否包含某個元素,***使用set來代替list。(如果你想把一個值和要檢查的元素聯系起來,可以使用dict;這樣同樣可以實現常數檢查時間。)

  1. # 假設以list開始  
  2. lyrics_list = ['her''name''is''rio']  
  3.    
  4. # 避免下面的寫法  
  5. words = make_wordlist() # 假設返回許多要測試的單詞  
  6. for word in words:  
  7.     if word in lyrics_list: # 線性檢查時間  
  8.         print word, "is in the lyrics" 
  9.    
  10. # ***這么寫  
  11. lyrics_set = set(lyrics_list) # 線性時間創建set  
  12. words = make_wordlist() # 假設返回許多要測試的單詞  
  13. for word in words:  
  14.     if word in lyrics_set: # 常數檢查時間  
  15.         print word, "is in the lyrics" 

[譯者注:Python中set的元素和dict的鍵值是可哈希的,因此查找起來時間復雜度為O(1)。]

應該記住:創建set引入的是一次性開銷,創建過程將花費線性時間即使成員檢查花費常數時間。因此如果你需要在循環里檢查成員,***先花時間創建set,因為你只需要創建一次。

#p#

變量泄露

  • 循環 

通常說來,在Python中,一個變量的作用域比你在其他語言里期望的要寬。例如:在Java中下面的代碼將不能通過編譯:

  1. // Get the index of the lowest-indexed item in the array  
  2. // that is > maxValue  
  3. for(int i = 0; i < y.length; i++) {  
  4.     if (y[i] > maxValue) {  
  5.         break;  
  6.     }  
  7. }  
  8. // i在這里出現不合法:不存在i  
  9. processArray(y, i); 

然而在Python中,同樣的代碼總會順利執行且得到意料中的結果:

  1. for idx, value in enumerate(y):  
  2.     if value > max_value:  
  3.         break 
  4.    
  5. processList(y, idx) 

這段代碼將會正常運行,除非子y為空的情況下,此時,循環永遠不會執行,而且processList函數的調用將會拋出NameError異常,因為idx沒有定義。如果你使用Pylint代碼檢查工具,將會警告:使用可能沒有定義的變量idx。

解決辦法永遠是顯然的,可以在循環之前設置idx為一些特殊的值,這樣你就知道如果循環永遠沒有執行的時候你將要尋找什么。這種模式叫做哨兵模式。那么什么值可以用來作為哨兵呢?在C語言時代或者更早,當int統治編程世界的時候,對于需要返回一個期望的錯誤結果的函數來說為通用的模式為返回-1。例如,當你想要返回列表中某一元素的索引值:

  1. def find_item(item, alist):  
  2.     # None比-1更加Python化  
  3.     result = -1 
  4.     for idx, other_item in enumerate(alist):  
  5.         if other_item == item:  
  6.             result = idx  
  7.             break 
  8.    
  9.     return result 

通常情況下,在Python里None是一個比較好的哨兵值,即使它不是一貫地被Python標準類型使用(例如:str.find [2])

  •  外作用域

Python程序員新手經常喜歡把所有東西放到所謂的外作用域——python文件中不被代碼塊(例如函數或者類)包含的部分。外作用域相當于全局命名空間;為了這部分的討論,你應該假設全局作用域的內容在單個Python文件的任何地方都是可以訪問的。

對于定義整個模塊都需要去訪問的在文件頂部聲明的常量,外作用域顯得非常強大。給外作用域中的任何變量使用有特色的名字是明智的做法,例如,使用IN_ALL_CAPS 這個常量名。 這將不容易造成如下bug:

  1. import sys  
  2.    
  3. # See the bug in the function declaration?  
  4. def print_file(filenam):  
  5.     """Print every line of a file.""" 
  6.     with open(filename) as input_file:  
  7.         for line in input_file:  
  8.             print line.strip()  
  9.    
  10. if __name__ == "__main__":  
  11.     filename = sys.argv[1]  
  12.     print_file(filename) 

如果你看的近一點,你將看到print_file函數的定義中用filenam命名參數名,但是函數體卻引用的卻是filename。然而,這個程序仍然可以運行得很好。為什么呢?在print_file函數里,當一個局部變量filename沒有被找到時,下一步是在全局作用域中去尋找。由于print_file的調用在外作用域中(即使有縮進),這里聲明的filename對于print_file函數是可見的。

那么如何避免這樣的錯誤呢?首先,在外作用域中不是IN_ALL_CAPS這樣的全局變量就不要設置任何值[3]。參數解析***交給main函數,因此函數中任何內部變量不在外作用域中存活。

這也提醒人們關注全局關鍵字global。如果你只是讀取全局變量的值,你就不需要全局關鍵字global。你只有在想要改變全局變量名引用的對象時有使用global關鍵字的必要。你可以在這里獲取更多相關信息this discussion of the global keyword on Stack Overflow

代碼風格

  • 向PEP8致敬

PEP 8是Python代碼的通用風格指南,你應該牢記在心并且盡可能去遵循它,盡管一些人有充分的理由不同意其中一些細小的風格,例如縮進的空格個數或使用空行。如果你不遵循PEP8,你應該有除“我只是不喜歡那樣的風格”之外更好的理由。下邊的風格指南都是從PEP8中摘取的,似乎是編程者經常需要牢記的。

  • 測試是否為空

如果你要檢查一個容器類型(例如:列表,詞典,集合)是否為空,只需要簡單測試它而不是使用類似檢查len(x)>0這樣的方法:

  1. numbers = [-1, -2, -3]  
  2. # This will be empty  
  3. positive_numbers = [num for num in numbers if num > 0]  
  4. if positive_numbers:  
  5.     # Do something awesome 

如果你想在其他地方保存positive_numbers是否為空的結果,可以使用bool(positive_number)作為結果保存;bool用來判斷if條件判斷語句的真值。

  • 測試是否為None 

如前面所提到,None可以作為一個很好的哨兵值。那么如何檢查它呢?

如果你明確的想要測試None,而不只是測試其他一些值為False的項(如空容器或者0),可以使用:

  1. if x is not None:  
  2.     # Do something with x 

如果你使用None作為哨兵,這也是Python風格所期望的模式,例如在你想要區分None和0的時候。

如果你只是測試變量是否為一些有用的值,一個簡單的if模式通常就夠用了:

  1. if x:  
  2.     # Do something with x 

例如:如果期望x是一個容器類型,但是x可能作另一個函數的返回結果值變為None,你應該立即考慮到這種情況。你需要留意是否改變了傳給x的值,否則可能你認為True或0. 0是個有用的值,程序卻不會按照你想要的方式執行。

譯者注:

  • [1] 在Python2.x 中 range生成的是list對象,xrange生成的則是range對象;Python 3.x 廢除了xrange,range生成的統一為range對象,用list工廠函數可以顯式生成list;
  • [2] string.find(str)返回str在string中開始的索引值,如果不存在則返回-1;
  • [3] 在外作用于中不要給函數中的局部變量名設置任何值,以防止函數內部調用局部變量時發生錯誤而調用外部作用域中的同名變量。

本文由 伯樂在線 - 小磊 翻譯自 lignos

責任編輯:林師授 來源: 伯樂在線
相關推薦

2012-02-02 09:21:39

編程

2021-04-20 22:09:13

Python編程語言

2015-10-10 11:23:17

Java常量反模式

2015-09-22 10:56:13

Java反模式

2011-05-24 09:30:26

Findbugs

2022-11-03 15:36:44

事件響應反模式系統

2012-04-10 10:04:26

并行編程

2021-10-29 05:53:51

前端測試開發代碼

2025-07-14 07:10:00

2023-10-30 18:59:38

REST API開發

2020-09-14 08:30:44

Kubernetes容器

2025-06-04 08:15:00

Python編程代碼

2023-09-13 11:58:17

云原生反模式

2013-12-18 16:12:26

多核編程

2013-12-18 16:32:27

多核編程同步模式

2025-07-15 02:11:00

模型語言反模式

2021-01-11 05:37:54

倉儲模式接口

2019-11-07 15:07:30

微服務模式反模式

2024-04-24 13:45:00

2016-08-04 14:41:21

架構java服務端開發
點贊
收藏

51CTO技術棧公眾號

中文字幕亚洲高清| 蜜臀av粉嫩av懂色av| 秋霞午夜在线观看| 国产一区二区不卡在线| 久久久久久成人精品| 中文文字幕文字幕高清| 先锋欧美三级| 亚洲另类中文字| 日韩经典中文字幕| 国产精品入口免费软件| 超碰最新在线| 久久久久久久综合日本| 成人免费网站在线观看| 91视频啊啊啊| 日韩成人在线电影| 精品久久久久久久久中文字幕| 日本在线成人一区二区| 亚洲香蕉在线视频| 国产一区二区高清| 久久99精品久久久久久噜噜| 免费观看a级片| 精品精品国产三级a∨在线| 精品视频免费看| 少妇高潮喷水在线观看| 国产原创视频在线观看| 国产欧美日韩卡一| 精品视频第一区| 超碰在线人人干| 精品一二三四在线| 国产精品精品视频一区二区三区| 免费在线观看黄色av| 久久日文中文字幕乱码| 亚洲欧美日韩高清| www.男人天堂| 日韩精品三级| 91麻豆精品国产91久久久资源速度| 国产a级片免费观看| 91美女主播在线视频| 一区二区在线看| 黄色一级片网址| h网站视频在线观看| 久久在线观看免费| 久久久一本精品99久久精品| 色一情一乱一区二区三区| 国产精品一区二区在线看| 成人免费淫片视频软件| 伊人网av在线| 男男成人高潮片免费网站| 国产mv免费观看入口亚洲| 可以免费看的av毛片| 99热这里只有成人精品国产| 欧美精品福利在线| 国产亚洲精久久久久久无码77777| 国产高清一区二区| 久久香蕉国产线看观看网| 2014亚洲天堂| 欧美~级网站不卡| 欧美老妇交乱视频| 久久精品免费在线| 亚洲午夜电影| 18久久久久久| 一级黄色在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美13videosex性极品| 午夜电影一区二区| 亚洲人成无码www久久久| 欧美va视频| 制服丝袜激情欧洲亚洲| 在线观看你懂的视频| 波多野结衣在线一区二区| 亚洲国模精品一区| 欧美黄色激情视频| 99久久婷婷这里只有精品| 麻豆国产va免费精品高清在线| 九九在线观看视频| 亚洲一区区二区| 国产精品高潮粉嫩av| 国产精品国产三级国产普通话对白| 国产一区在线不卡| 精品国产乱码久久久久| 国产美女性感在线观看懂色av| 国产精品欧美一区喷水| 亚洲中文字幕无码一区二区三区| 91探花在线观看| 欧美在线|欧美| 熟妇女人妻丰满少妇中文字幕| 加勒比久久高清| 亚洲一区二区久久久| 永久免费看mv网站入口| 一区二区久久| 国产在线拍偷自揄拍精品| 成人av手机在线| 国产无人区一区二区三区| 亚洲第一精品区| 国产三级电影在线播放| 欧美日韩午夜精品| 国产麻豆剧传媒精品国产| 希岛爱理av免费一区二区| www.日本久久久久com.| 国产系列精品av| 久久精品久久99精品久久| 国产精品久久国产三级国电话系列| 日韩精品视频无播放器在线看| 国产精品区一区二区三区| 无码粉嫩虎白一线天在线观看 | 91精品一区二区| 亚洲av成人无码网天堂| 亚洲日本青草视频在线怡红院| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 一区二区三区| 亚洲另类图片色| 久久婷婷一区二区| 久久精品二区亚洲w码| 久久福利电影| 天堂av资源在线观看| 欧美午夜电影一区| 人妻丰满熟妇av无码久久洗澡 | 欧美1区2区3区4区| 久久亚洲成人精品| 亚洲特级黄色片| 久久久亚洲午夜电影| 婷婷五月综合缴情在线视频| 国产精品日本一区二区不卡视频| 亚洲人精品午夜在线观看| 国产精品第56页| 国产成人免费高清| 久久免费视频2| 国产精品麻豆成人av电影艾秋| 亚洲精品久久久久久久久久久久久| 日本福利片在线观看| 麻豆精品一区二区综合av| 玛丽玛丽电影原版免费观看1977| 18aaaa精品欧美大片h| 欧美一级一级性生活免费录像| 国产一二三四视频| 免费高清在线一区| 日韩免费中文专区| 日本综合久久| 国产一区二区三区直播精品电影| 在线视频一区二区三区四区| 91亚洲国产成人精品一区二三 | 免费久久99精品国产| 欧美精品一区二区三区在线看午夜| 电影在线观看一区| 亚洲精品二三区| 国产精品老女人| 99精品视频在线免费观看| 日韩伦理在线免费观看| 久久365资源| 91高清视频免费观看| 男男激情在线| 欧美午夜电影一区| 一级免费黄色录像| 国产精品亚洲一区二区三区在线 | 91精品国产高清一区二区三区 | 欧美阿v一级看视频| 97超碰资源| 国产伦久视频在线观看| 亚洲男人天堂网| 久久久999久久久| 国产精品女上位| 污免费在线观看| 1024成人| 欧美中日韩免费视频| 91欧美精品| 久久久成人精品| 亚洲国产www| 天天色综合成人网| a级片在线观看| 久久精品国产网站| 国产精品igao激情视频| 久久久伦理片| 国产成人精品视频在线| 精产国品自在线www| 欧美xingq一区二区| 日操夜操天天操| 国产精品午夜春色av| 中文字幕在线视频一区二区| 亚洲国产高清一区二区三区| 免费久久久一本精品久久区| 免费成人黄色网| 欧美精品成人91久久久久久久| 免费在线看v| 91精品国产高清一区二区三区 | 手机成人av在线| 岛国av一区| 国产精品久久久久久久久久尿| 国产原创视频在线观看| 亚洲精品日韩久久久| 一区二区国产欧美| 黄色精品在线看| 一本一本久久a久久| 成人av高清在线| 天天色综合社区| 99成人在线| 中文字幕av日韩精品| 欧美亚洲国产日韩| 成人激情免费在线| 永久免费毛片在线播放| 久久五月天色综合| 国产精品一区二区婷婷| 精品欧美一区二区久久| 日韩av免费播放| 性感美女久久精品| 东方av正在进入| 国产午夜精品一区二区三区视频| 佐佐木明希电影| 久久99国产精品久久99| 欧美性久久久久| 欧美日本不卡| 宅男av一区二区三区| 亚洲人挤奶视频| 99精彩视频| 日韩专区视频| 国产精品久久久久久久久久三级| av影院在线| 不卡av日日日| 国产福利片在线| 国产丝袜高跟一区| 日本黄色一区二区三区| 欧美一区二区三区免费视频| 中文字幕人妻互换av久久| 婷婷中文字幕综合| 久久免费小视频| 亚洲人一二三区| 精品一区二区6| 欧美—级在线免费片| www.自拍偷拍| 91色视频在线| 中文在线永久免费观看| 高清免费成人av| 少妇极品熟妇人妻无码| 精品一区在线看| 三上悠亚在线一区| 日韩精品电影在线观看| 免费裸体美女网站| 99精品热视频只有精品10| 777av视频| 99在线|亚洲一区二区| 97视频久久久| 在线一区视频| 久在线观看视频| 国产欧美大片| 黄色一级一级片| 视频在线观看国产精品| 91蝌蚪视频在线观看| 日日骚欧美日韩| 中文字幕天天干| 久久99精品久久只有精品| 中文字幕 日韩 欧美| 美女视频网站久久| 三区视频在线观看| 国产精品77777| 欧美性生交xxxxx| 不卡一区在线观看| 特级西西人体wwwww| 久久久久综合网| 成人黄色a级片| **网站欧美大片在线观看| 国产一区二区精彩视频| 一区二区三区免费| 日本一级一片免费视频| 色综合色狠狠综合色| 中文有码在线播放| 欧美丰满美乳xxx高潮www| 99久久亚洲精品日本无码| 欧美成人官网二区| 四虎电影院在线观看| 亚洲人成欧美中文字幕| 天堂аⅴ在线地址8| 欧美理论片在线观看| 成入视频在线观看| 国产成人啪精品视频免费网| 青草综合视频| 国产精品手机视频| 欧美裸体在线版观看完整版| 在线一区亚洲| 国产午夜久久| 青青草原国产在线视频| 高清久久久久久| 怡红院一区二区三区| 亚洲精品乱码久久久久| 狠狠人妻久久久久久| 欧美日韩国产色站一区二区三区| 亚洲第一黄色片| 国产一区二区美女视频| 最新国产在线拍揄自揄视频| 欧美专区日韩视频| 亚洲一区二区av| 精品午夜一区二区| 国产精品久久久久无码av| 久色视频在线播放| 精品一区二区免费看| 国产一级黄色录像| 亚洲欧洲三级电影| 最新中文字幕一区| 日韩欧美黄色影院| 成人高清网站| 性色av一区二区三区免费| 四虎精品永久免费| 免费99视频| 欧美日本中文| 国内国产精品天干天干| 91网站在线播放| 麻豆chinese极品少妇| 欧美在线一区二区三区| 三级av在线免费观看| 欧美日韩精品在线观看| 国产sm主人调教女m视频| 亚洲天堂第一页| 超碰高清在线| 亚洲一区亚洲二区| 成人精品影院| 国产福利视频在线播放| 成人深夜福利app| √天堂中文官网8在线| 日本久久电影网| 香蕉视频911| 久久99热精品| 国产亚洲精aa在线看| 亚洲欧美日韩在线综合| 久久久久国产一区二区| 欧美肉大捧一进一出免费视频 | 国产九色在线播放九色| 欧美成人精品二区三区99精品| 久久精品视频观看| 国产女精品视频网站免费| 国产成人影院| 日韩av在线综合| 久久久欧美精品sm网站| 91av在线免费视频| 亚洲娇小xxxx欧美娇小| 丁香花视频在线观看| 成人黄色片视频网站| 亚洲综合五月| 成人高清在线观看视频| 亚洲视频一区在线观看| 91麻豆成人精品国产免费网站| 国产亚洲在线播放| 高清成人在线| 亚洲电影网站| 久久99精品久久久久久国产越南| 中文字幕免费在线看线人动作大片| 色老汉一区二区三区| 国产在线日本| 国产精品96久久久久久| av一区二区高清| 午夜国产一区二区三区| 国产精品不卡视频| 国产精品区在线观看| 欧美大尺度在线观看| 亚洲午夜精品| 奇米影视亚洲色图| 2023国产精品视频| 亚洲av无码精品一区二区| 中文国产亚洲喷潮| 色成人综合网| 黄网站色视频免费观看| 粉嫩蜜臀av国产精品网站| 日韩污视频在线观看| 亚洲男人的天堂网站| 国产成人福利夜色影视| 中文一区一区三区免费| 成人免费视频免费观看| 日韩三级视频在线| 亚洲视频免费一区| 久久国产三级| 男人天堂av片| www精品美女久久久tv| 中文字幕 欧美激情| 欧美成人午夜激情视频| 三级小说欧洲区亚洲区| www.色就是色| 亚洲最大色网站| 欧美日韩国产综合视频| 国产欧美日韩中文字幕在线| 欧美另类视频| av电影在线不卡| 欧美一区二区三区成人| 综合日韩av| 一区二区三区四区五区视频| 成人精品视频一区二区三区| 亚洲不卡在线视频| 久久精品电影网| 欧美一区 二区| 三上悠亚av一区二区三区| 亚洲成av人影院| 成av人电影在线观看| 国产精品手机视频| 久久激五月天综合精品| 日本熟妇色xxxxx日本免费看| 一区二区福利视频| 97久久综合精品久久久综合| 一本久道综合色婷婷五月| 亚洲精品免费在线观看| 国产一区二区三区福利| 超碰97国产在线| 美女一区二区久久| 日韩欧美一级视频| 欧美久久精品午夜青青大伊人|