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

Python進階——如何正確使用yield?

開發 后端
這篇文章,我們就來看一下 yield 的運行流程,以及在開發中哪些場景適合使用 yield。

[[387650]]

 在 Python 開發中,yield 關鍵字的使用其實較為頻繁,例如大集合的生成,簡化代碼結構、協程與并發都會用到它。

但是,你是否真正了解 yield 的運行過程呢?

這篇文章,我們就來看一下 yield 的運行流程,以及在開發中哪些場景適合使用 yield。

生成器

如果在一個方法內,包含了 yield 關鍵字,那么這個函數就是一個「生成器」。

生成器其實就是一個特殊的迭代器,它可以像迭代器那樣,迭代輸出方法內的每個元素。

如果你還不清楚「迭代器」是什么,可以參考我寫的這篇文章:Python進階——迭代器和可迭代對象有什么區別?

我們來看一個包含 yield 關鍵字的方法: 

  1. # coding: utf8  
  2. # 生成器  
  3. def gen(n):  
  4.     for i in range(n):  
  5.         yield i  
  6. g = gen(5)      # 創建一個生成器  
  7. print(g)        # <generator object gen at 0x10bb46f50>  
  8. print(type(g))  # <type 'generator'>  
  9. # 迭代生成器中的數據  
  10. for i in g:  
  11.     print(i)   
  12. # Output:  
  13. # 0 1 2 3 4 

注意,在這個例子中,當我們執行 g = gen(5) 時,gen 中的代碼其實并沒有執行,此時我們只是創建了一個「生成器對象」,它的類型是 generator。

然后,當我們執行 for i in g,每執行一次循環,就會執行到 yield 處,返回一次 yield 后面的值。

這個迭代過程是和迭代器最大的區別。

換句話說,如果我們想輸出 5 個元素,在創建生成器時,這個 5 個元素其實還并沒有產生,什么時候產生呢?只有在執行 for 循環遇到 yield 時,才會依次生成每個元素。

此外,生成器除了和迭代器一樣實現迭代數據之外,還包含了其他方法:

  •  generator.__next__():執行 for 時調用此方法,每次執行到 yield 就會停止,然后返回 yield 后面的值,如果沒有數據可迭代,拋出 StopIterator 異常,for 循環結束
  •  generator.send(value):外部傳入一個值到生成器內部,改變 yield 前面的值
  •  generator.throw(type[, value[, traceback]]):外部向生成器拋出一個異常
  •  generator.close():關閉生成器

通過使用生成器的這些方法,我們可以完成很多有意思的功能。

__next__

先來看生成器的 __next__ 方法,我們看下面這個例子。 

  1. # coding: utf8  
  2. def gen(n):  
  3.     for i in range(n):  
  4.         print('yield before')  
  5.         yield i  
  6.         print('yield after')  
  7. g = gen(3)      # 創建一個生成器  
  8. print(g.__next__())  # 0  
  9. print('----')  
  10. print(g.__next__())  # 1  
  11. print('----')  
  12. print(g.__next__())  # 2  
  13. print('----')  
  14. print(g.__next__())  # StopIteration  
  15. # Output:  
  16. # yield before  
  17. # 0  
  18. # ----  
  19. # yield after  
  20. # yield before  
  21. # 1  
  22. # ----  
  23. # yield after  
  24. # yield before  
  25. # 2  
  26. # ----  
  27. # yield after  
  28. # Traceback (most recent call last):  
  29. #   File "gen.py", line 16, in <module>  
  30. #     print(g.__next__())  # StopIteration  
  31. # StopIteration 

在這個例子中,我們定義了 gen 方法,這個方法包含了 yield 關鍵字。然后我們執行 g = gen(3) 創建一個生成器,但是這次沒有執行 for 去迭代它,而是多次調用 g.__next__() 去輸出生成器中的元素。

我們看到,當執行 g.__next__()時,代碼就會執行到 yield 處,然后返回 yield 后面的值,如果繼續調用 g.__next__(),注意,你會發現,這次執行的開始位置,是上次 yield 結束的地方,并且它還保留了上一次執行的上下文,繼續向后迭代。

這就是使用 yield 的作用,在迭代生成器時,每一次執行都可以保留上一次的狀態,而不是像普通方法那樣,遇到 return 就返回結果,下一次執行只能再次重復上一次的流程。

生成器除了能保存狀態之外,我們還可以通過其他方式,改變其內部的狀態,這就是下面要講的 send 和 throw 方法。

send

上面的例子中,我們只展示了在 yield 后有值的情況,其實還可以使用 j = yield i 這種語法,我們看下面的代碼: 

  1. # coding: utf8  
  2. def gen():  
  3.     i = 1  
  4.     while True:  
  5.         j = yield i  
  6.         i *= 2  
  7.         if j == -1:  
  8.             break 

此時如果我們執行下面的代碼: 

  1. for i in gen():  
  2.     print(i)  
  3.     time.sleep(1) 

輸出結果會是 1 2 4 8 16 32 64 ... 一直循環下去, 直到我們殺死這個進程才能停止。

這段代碼一直循環的原因在于,它無法執行到 j == -1 這個分支里 break 出來,如果我們想讓代碼執行到這個地方,如何做呢?

這里就要用到生成器的 send 方法了,send 方法可以把外部的值傳入生成器內部,從而改變生成器的狀態。

代碼可以像下面這樣寫: 

  1. g = gen()   # 創建一個生成器  
  2. print(g.__next__())  # 1  
  3. print(g.__next__())  # 2  
  4. print(g.__next__())  # 4  
  5. # send 把 -1 傳入生成器內部 走到了 j = -1 這個分支  
  6. print(g.send(-1))   # StopIteration 迭代停止 

當我們執行 g.send(-1) 時,相當于把 -1 傳入到了生成器內部,然后賦值給了 yield 前面的 j,此時 j = -1,然后這個方法就會 break 出來,不會繼續迭代下去。

throw

外部除了可以向生成器內部傳入一個值外,還可以傳入一個異常,也就是調用 throw 方法: 

  1. # coding: utf8  
  2. def gen():  
  3.     try:  
  4.         yield 1  
  5.     except ValueError:  
  6.         yield 'ValueError'  
  7.     finally:  
  8.         print('finally')   
  9. g = gen()   # 創建一個生成器  
  10. print(g.__next__()) # 1  
  11. # 向生成器內部傳入異常 返回ValueError  
  12. print(g.throw(ValueError))   
  13. # Output:  
  14. # 1  
  15. # ValueError  
  16. # finally 

這個例子創建好生成器后,使用 g.throw(ValueError) 的方式,向生成器內部傳入了一個異常,走到了生成器異常處理的分支邏輯。

close

生成器的 close 方法也比較簡單,就是手動關閉這個生成器,關閉后的生成器無法再進行操作。 

  1. >>> g = gen()  
  2. >>> g.close() # 關閉生成器  
  3. >>> g.__next__() # 無法迭代數據  
  4. Traceback (most recent call last):  
  5.   File "<stdin>", line 1, in <module>  
  6. StopIteration 

close 方法我們在開發中使用得比較少,了解一下就好。

使用場景

了解了 yield 和生成器的使用方式,那么 yield 和生成器一般用在哪些業務場景中呢?

下面我介紹幾個例子,分別是大集合的生成、簡化代碼結構、協程與并發,你可以參考這些使用場景來使用 yield。

大集合的生成

如果你想生成一個非常大的集合,如果使用 list 創建一個集合,這會導致在內存中申請一個很大的存儲空間,例如想下面這樣: 

  1. # coding: utf8  
  2. def big_list():  
  3.     result = []  
  4.     for i in range(10000000000):  
  5.         result.append(i)  
  6.     return result  
  7. # 一次性在內存中生成大集合 內存占用非常大  
  8. for i in big_list():  
  9.     print(i) 

這種場景,我們使用生成器就能很好地解決這個問題。

因為生成器只有在執行到 yield 時才會迭代數據,這時只會申請需要返回元素的內存空間,代碼可以這樣寫: 

  1. # coding: utf8  
  2. def big_list():  
  3.     for i in range(10000000000):  
  4.         yield i  
  5. # 只有在迭代時 才依次生成元素 減少內存占用  
  6. for i in big_list():  
  7.     print(i) 

簡化代碼結構

我們在開發時還經常遇到這樣一種場景,如果一個方法要返回一個 list,但這個 list 是多個邏輯塊組合后才能產生的,這就會導致我們的代碼結構變得很復雜: 

  1. # coding: utf8  
  2. def gen_list():  
  3.     # 多個邏輯塊 組成生成一個列表  
  4.     result = []  
  5.     for i in range(10):  
  6.         result.append(i)  
  7.     for j in range(5):  
  8.         result.append(j * j)  
  9.     for k in [100, 200, 300]:  
  10.         result.append(k)  
  11.     return result    
  12. for item in gen_list():  
  13.     print(item) 

這種情況下,我們只能在每個邏輯塊內使用 append 向 list 中追加元素,代碼寫起來比較啰嗦。

此時如果使用 yield 來生成這個 list,代碼就簡潔很多: 

  1. # coding: utf8  
  2. def gen_list():  
  3.     # 多個邏輯塊 使用yield 生成一個列表  
  4.     for i in range(10):  
  5.         yield i  
  6.     for j in range(5):  
  7.         yield j * j  
  8.     for k in [100, 200, 300]:  
  9.         yield k     
  10. for item in gen_list():  
  11.     print(i) 

使用 yield 后,就不再需要定義 list 類型的變量,只需在每個邏輯塊直接 yield 返回元素即可,可以達到和前面例子一樣的功能。

我們看到,使用 yield 的代碼更加簡潔,結構也更清晰,另外的好處是只有在迭代元素時才申請內存空間,降低了內存資源的消耗。

協程與并發

還有一種場景是 yield 使用非常多的,那就是「協程與并發」。

如果我們想提高程序的執行效率,通常會使用多進程、多線程的方式編寫程序代碼,最常用的編程模型就是「生產者-消費者」模型,即一個進程 / 線程生產數據,其他進程 / 線程消費數據。

在開發多進程、多線程程序時,為了防止共享資源被篡改,我們通常還需要加鎖進行保護,這樣就增加了編程的復雜度。

在 Python 中,除了使用進程和線程之外,我們還可以使用「協程」來提高代碼的運行效率。

什么是協程?

簡單來說,由多個程序塊組合協作執行的程序,稱之為「協程」。

而在 Python 中使用「協程」,就需要用到 yield 關鍵字來配合。

可能這么說還是太好理解,我們用 yield 實現一個協程生產者、消費者的例子: 

  1. # coding: utf8  
  2. def consumer():  
  3.     i = None  
  4.     while True:  
  5.         # 拿到 producer 發來的數據  
  6.         j = yield i   
  7.         print('consume %s' % j)  
  8. def producer(c):  
  9.     c.__next__()  
  10.     for i in range(5):  
  11.         print('produce %s' % i)  
  12.         # 發數據給 consumer  
  13.         c.send(i)  
  14.     c.close()  
  15. c = consumer()  
  16. producer(c)   
  17. # Output:  
  18. # produce 0  
  19. # consume 0  
  20. # produce 1  
  21. # consume 1  
  22. # produce 2  
  23. # consume 2  
  24. # produce 3  
  25. # consume 3  
  26. ... 

這個程序的執行流程如下:

  1.  c = consumer() 創建一個生成器對象
  2.  producer(c) 開始執行,c.__next()__ 會啟動生成器 consumer 直到代碼運行到 j = yield i 處,此時 consumer 第一次執行完畢,返回
  3.  producer 函數繼續向下執行,直到 c.send(i) 處,這里利用生成器的 send 方法,向 consumer 發送數據
  4.  consumer 函數被喚醒,從 j = yield i 處繼續開始執行,并且接收到 producer 傳來的數據賦值給 j,然后打印輸出,直到再次執行到 yield 處,返回
  5.  producer 繼續循環執行上面的過程,依次發送數據給 cosnumer,直到循環結束
  6.   最終 c.close() 關閉 consumer 生成器,程序退出

在這個例子中我們發現,程序在 producer 和 consumer 這 2 個函數之間來回切換執行,相互協作,完成了生產任務、消費任務的業務場景,最重要的是,整個程序是在單進程單線程下完成的。

這個例子用到了上面講到的 yield、生成器的 __next__、send、close 方法。如果不好理解,你可以多看幾遍這個例子,最好自己測試一下。

我們使用協程編寫生產者、消費者的程序時,它的好處是:

  •  整個程序運行過程中無鎖,不用考慮共享變量的保護問題,降低了編程復雜度
  •  程序在函數之間來回切換,這個過程是用戶態下進行的,不像進程 / 線程那樣,會陷入到內核態,這就減少了內核態上下文切換的消耗,執行效率更高

所以,Python 的 yield 和生成器實現了協程的編程方式,為程序的并發執行提供了編程基礎。

Python 中的很多第三方庫,都是基于這一特性進行封裝的,例如 gevent、tornado,它們都大大提高了程序的運行效率。

總結

總結一下,這篇文章我們主要講了 yield 的使用方式,以及生成器的各種特性。

生成器是一種特殊的迭代器,它除了可以迭代數據之外,在執行時還可以保存方法中的狀態,除此之外,它還提供了外部改變內部狀態的方式,把外部的值傳入到生成器內部。

利用 yield 和生成器的特性,我們在開發中可以用在大集成的生成、簡化代碼結構、協程與并發的業務場景中。

Python 的 yield 也是實現協程和并發的基礎,它提供了協程這種用戶態的編程模式,提高了程序運行的效率。 

 

責任編輯:龐桂玉 來源: Python中文社區 (ID:python-china)
相關推薦

2012-11-23 14:25:10

IBMdW

2010-02-03 15:40:37

Python函數

2010-03-04 13:37:20

Python yiel

2021-02-20 09:27:36

Python編程語言機器學習

2018-12-05 09:00:00

RedisRedis Strea數據庫

2022-09-07 08:58:58

Node.js框架

2017-07-28 10:05:58

Pythonyieldgenerator

2019-11-14 16:23:07

MySQL索引數據庫

2010-01-18 17:23:55

函數

2010-01-18 17:23:55

函數

2023-12-26 11:56:14

Go通道編程

2022-11-23 08:00:00

開發Regulator調試

2010-02-03 17:42:30

2010-02-22 14:13:38

安裝Python

2010-02-03 14:15:18

Python 開發

2010-02-22 10:06:17

Python調用

2011-04-27 16:38:31

投影機

2017-08-30 17:47:35

MySql索引

2020-12-29 05:34:48

Scrapy網頁源代碼

2020-08-19 08:39:05

中間件前端設計模式
點贊
收藏

51CTO技術棧公眾號

国产一区二区久久久| 久久九九国产精品怡红院 | 欧美黄页免费| 亚洲另类色综合网站| 久久精品成人一区二区三区蜜臀| 成人免费毛片东京热| 日韩欧美美女在线观看| 欧美日本精品一区二区三区| 色噜噜狠狠色综合网| 午夜精品一区二| 亚洲成人一区| 亚洲天堂免费观看| 香蕉视频1024| 欧美videos粗暴| 天天av天天翘天天综合网| 亚洲三区四区| 欧美中文在线| 国产大陆a不卡| 欧美在线观看一区二区三区| 黑鬼狂亚洲人videos| 一区二区三区视频免费观看| 欧美一级黄色录像| 邪恶网站在线观看| 香蕉伊大人中文在线观看| 亚洲女女做受ⅹxx高潮| 青青草原成人| 亚洲欧美自偷自拍| 久久视频一区| 97精品在线视频| 青草草在线视频| 999久久久亚洲| 国产一区二区精品丝袜| 理论片大全免费理伦片| 国产一区二区三区国产精品| 一区二区三区欧美亚洲| 国产91av视频在线观看| 久草视频视频在线播放| 99精品在线观看视频| 亚洲综合在线做性| 日韩av男人天堂| 午夜精品国产| 欧美xxxx做受欧美.88| 亚洲女同二女同志奶水| 久久91精品| 亚洲精品短视频| 伊人久久一区二区三区| www国产精品| 欧美哺乳videos| 国产精品欧美性爱| 一区二区三区四区视频免费观看| 欧美性生交大片免费| 18禁免费观看网站| 日韩av一卡| 欧美午夜片在线免费观看| 国产特级淫片高清视频| 超碰超碰人人人人精品| 欧美日韩中国免费专区在线看| 亚洲欧洲精品一区二区| 成人av毛片| 国产精品久久网站| 黄色一级片网址| 久草在线网址| 国产精品人成在线观看免费| 韩国精品一区二区三区六区色诱| 国产又粗又猛又色又| 久久se精品一区二区| 91免费人成网站在线观看18| 国产后入清纯学生妹| 久久精品官网| 国产精品青草久久久久福利99| 日本学生初尝黑人巨免费视频| 欧美国产美女| 欧美另类xxx| 日韩精品久久久久久久| 在线中文字幕第一区| 欧美黑人狂野猛交老妇| 国产一级做a爱片久久毛片a| 久久久久久一区二区| 国产精品入口福利| 国产黄色av片| wwww国产精品欧美| 一区二区三区四区国产| 欧美1—12sexvideos| 色综合天天做天天爱| 99在线免费视频观看| www.成人爱| 欧美精品久久一区| 久久免费精品国产| 成人羞羞视频播放网站| 欧美激情综合色| 国产精品欧美综合| 成人综合婷婷国产精品久久免费| 亚洲永久在线观看| 蜜桃免费在线| 亚洲黄色av一区| 黄色片一级视频| 亚洲女色av| 91精品国产欧美一区二区成人| 一个色综合久久| 精品日产乱码久久久久久仙踪林| 欧美tk—视频vk| 久久精品aⅴ无码中文字字幕重口| 国产精品日本一区二区不卡视频 | 国产视频在线观看视频| 99综合电影在线视频| 正在播放一区二区三区| 涩涩视频在线| 91精品国产综合久久精品性色| 日韩av片专区| 日韩美女毛片| 欧美激情第6页| 在线观看亚洲国产| 91视频国产资源| 男人天堂a在线| 韩国精品视频在线观看| 亚洲免费电影一区| 国产真实夫妇交换视频| 另类综合日韩欧美亚洲| 久久av免费一区| 久久免费电影| 欧美一区二区人人喊爽| 极品尤物一区二区| 91精品一区国产高清在线gif| 久久91精品国产91久久久| 免费观看一级视频| 视频一区国产视频| 久久国产欧美精品| 成人超碰在线| 日韩欧美色综合网站| 99鲁鲁精品一区二区三区| 老色鬼久久亚洲一区二区| 激情视频在线观看一区二区三区| 男操女在线观看| 精品成人av一区| 三级a三级三级三级a十八发禁止| 欧美高清一级片| www.欧美三级电影.com| 奴色虐av一区二区三区| 久久免费电影网| 国产奶头好大揉着好爽视频| 96av在线| 欧美日韩一区二区三区高清| 公肉吊粗大爽色翁浪妇视频| 视频一区中文字幕国产| 青娱乐一区二区| 欧美成人精品三级网站| www香蕉视频| 亚洲国产另类精品专区| 亚洲男女在线观看| 亚洲精品1234| 免费久久久一本精品久久区| av片哪里在线观看| 精品美女在线播放| 国产午夜小视频| 97国产一区二区| 毛片av免费在线观看| 精品国产aⅴ| 国产女人18毛片水18精品| 天堂av一区二区三区| 欧美日韩国产综合视频在线观看中文 | 亚洲久久久久久| 亚洲精品三级| 日本三级中国三级99人妇网站| 97超碰资源站在线观看| 在线中文字幕一区| 蜜桃av免费观看| 国产精品主播直播| 亚洲欧美精品在线观看| 少妇高潮一区二区三区99| 亚洲精品一区二区三区不| 青青草视频在线观看免费| 国产日韩一级二级三级| 九九九九九九九九| 亚洲人成久久| 国产精品中出一区二区三区| 筱崎爱全乳无删减在线观看| 亚洲视频在线免费观看| 国产美女免费视频| 亚洲欧美综合色| 白嫩情侣偷拍呻吟刺激| 日产国产欧美视频一区精品| 潘金莲一级淫片aaaaa免费看| 国产一区二区色噜噜| 欧美日本中文字幕| 青青久草在线| 欧美日韩国产天堂| 懂色av蜜臀av粉嫩av永久| 国产成人综合自拍| 国产福利一区视频| 欧美日韩一卡| 日韩国产在线一区| 超碰成人97| 成人xxxx视频| 天堂中文在线播放| 亚洲欧美日韩精品久久奇米色影视| 中文字幕一区二区三区精品| 国产精品热久久久久夜色精品三区| 亚洲最大综合网| 精品无人区麻豆乱码久久久| 亚洲精品免费av| 七七成人影院| 日韩成人在线电影网| 91美女精品网站| 欧美性黄网官网| 久久婷婷一区二区| kk眼镜猥琐国模调教系列一区二区| 国产精品又粗又长| 亚洲人挤奶视频| 国产91精品入口17c| av在线资源| 久久天天躁狠狠躁夜夜av| 精品人妻av一区二区三区| 欧美性大战久久久久久久蜜臀| 懂色av粉嫩av浪潮av| 久久综合久久综合久久综合| 国产天堂在线播放| 天天影视综合| 秋霞在线观看一区二区三区| 99精品视频在线免费播放 | 成人免费视频视频在| h1515四虎成人| 欧洲亚洲妇女av| 3344国产永久在线观看视频| 亚洲欧美日韩精品久久奇米色影视| 在线观看免费中文字幕| 亚洲人亚洲人成电影网站色| 日韩不卡av在线| 2023国产精品自拍| 国产精品麻豆入口| 成人动漫av在线| 2025中文字幕| 国产91露脸合集magnet| 黄色a级片免费| 亚洲国产精品久久久天堂| 五码日韩精品一区二区三区视频| 天堂av一区| 亚洲一区国产精品| 国产一区二区av在线| 欧美在线观看网址综合| 国产91在线视频蝌蚪| 久久精品国产2020观看福利| 在线免费看av| 日韩亚洲国产中文字幕| 欧美激情免费| 久久综合色影院| 欧美日韩视频精品二区| 欧美一区二区三区小说| av观看在线免费| 欧美成人精品福利| 人人妻人人澡人人爽精品日本| 欧美日韩一区二区三区在线看 | 四虎影成人精品a片| 91麻豆产精品久久久久久| 精品人妻一区二区三区日产乱码卜| 九九热在线视频观看这里只有精品| 黄色大片中文字幕| 一本不卡影院| 成年人视频在线免费| 激情综合自拍| 欧美色图另类小说| 国产精品xvideos88| 久久综合久久网| 午夜一级在线看亚洲| 午夜欧美福利视频| 韩国欧美国产一区| 中国特级黄色片| 2021国产精品久久精品| 亚洲自拍偷拍图| 亚洲视频香蕉人妖| 黄网站免费在线| 91九色02白丝porn| 国产免费视频一区二区三区| 精品女同一区二区| 免费成人av电影| 亚洲欧美日韩爽爽影院| 香蕉视频国产在线观看| 久久999免费视频| 91高清在线观看视频| 国内精品久久久久久| 户外露出一区二区三区| 欧美综合激情网| 亚洲精品一区av| 国产日韩av在线播放| 91精品导航| 色阁综合av| 伊人久久综合| 国产精品999视频| 男人的天堂久久精品| 15—17女人毛片| 不卡的av在线| 午夜激情视频在线播放| 精品国产999| 国产精品欧美激情在线| 精品五月天久久| 久久天堂电影| 色综合男人天堂| 成人精品国产| 久久精品99| 欧美久久影院| 99热一区二区| 久久综合色综合88| 亚洲第一综合网| 国产精品系列在线| 欧美一区二区三区四| 91精品国产色综合久久不卡电影| av无码精品一区二区三区宅噜噜| 日韩欧美一级精品久久| av在线日韩国产精品| 91精品国产91久久久久久不卡 | 亚洲国产99| 午夜视频在线网站| 久久综合精品国产一区二区三区 | 三级av免费观看| 97精品久久久午夜一区二区三区| www在线观看免费视频| 亚洲一区二区美女| 国产精品熟女久久久久久| 亚洲人成人99网站| а√天堂中文资源在线bt| 成人精品久久一区二区三区| 2020国产精品极品色在线观看| 久久久水蜜桃| av成人天堂| 亚洲精品第二页| 久久久九九九九| 精品91久久久| 欧美日韩成人一区| 国产女人在线观看| 欧美精品生活片| 日韩av一卡| 国产伦精品一区二区三区四区视频| 九一精品国产| 欧美韩国日本在线| 92国产精品观看| 日韩中文字幕在线观看视频| 亚洲国产日韩欧美在线动漫| 91sp网站在线观看入口| 国产成人精品网站| 国产最新精品| 超碰在线97免费| 中文幕一区二区三区久久蜜桃| 国产一卡二卡在线| 亚洲国内高清视频| а√在线中文网新版地址在线| 国产精品香蕉国产| 日本中文字幕在线| 久久字幕精品一区| 美国黄色a级片| 色综合久久久久网| av高清一区二区| 欧美俄罗斯性视频| 国产精品传媒| 国产l精品国产亚洲区久久| 久久成人av少妇免费| 少妇人妻丰满做爰xxx| 日韩欧美一区在线| 国产福利电影在线播放| 久久久久无码国产精品一区| 男人的天堂亚洲在线| 亚洲人成人无码网www国产| 欧美专区亚洲专区| 日本在线www| 91香蕉视频在线下载| 最新国产乱人伦偷精品免费网站| 手机免费av片| 一区二区三区在线播放| 熟妇高潮一区二区高潮| 国产成人福利视频| 秋霞在线一区| 国产福利一区视频| 中文字幕亚洲一区二区va在线| 国产一级片免费在线观看| 一区三区二区视频| 日本免费久久| 宅男噜噜99国产精品观看免费| 日本视频一区二区三区| 久久99久久99精品免费看小说| 欧美曰成人黄网| av软件在线观看| 999在线免费观看视频| 99在线精品视频在线观看| 无码人妻精品一区二区三| 日本韩国一区二区三区| 中文字幕伦理免费在线视频| 久久综合久久久| 丝袜亚洲另类欧美| 国产探花在线免费观看| 欧美一区二区三区系列电影| 美女高潮在线观看| 国产麻豆电影在线观看| 久久综合网色—综合色88| av免费观看网址| 国产精品免费观看在线| 精品动漫3d一区二区三区免费| 国产a级片视频| 欧美写真视频网站| 国产精品xx| 波多野结衣 作品| 成人在线视频首页| 中文字幕 国产|