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

Python Yield Generator詳解

開發 后端 開發工具
本文將由淺入深詳細介紹yield以及generator,包括以下內容:什么generator,生成generator的方法,generator的特點,generator基礎及高級應用場景,generator使用中的注意事項。本文不包括enhanced generator即pep342相關內容。

Python Yield Generator詳解

本文將由淺入深詳細介紹yield以及generator,包括以下內容:什么generator,生成generator的方法,generator的特點,generator基礎及高級應用場景,generator使用中的注意事項。本文不包括enhanced generator即pep342相關內容。

generator基礎

在python的函數(function)定義中,只要出現了yield表達式(Yield expression),那么事實上定義的是一個generator function, 調用這個generator function返回值是一個generator。這根普通的函數調用有所區別,For example:

  1. def gen_generator(): 
  2.  
  3.     yield 1 
  4.  
  5.   
  6.  
  7. def gen_value(): 
  8.  
  9.     return 1 
  10.  
  11.      
  12.  
  13. if __name__ == '__main__'
  14.  
  15.     ret = gen_generator() 
  16.  
  17.     print ret, type(ret)    #<generator object gen_generator at 0x02645648> <type 'generator'
  18.  
  19.     ret = gen_value() 
  20.  
  21.     print ret, type(ret)    # 1 <type 'int' 

從上面的代碼可以看出,gen_generator函數返回的是一個generator實例,generator有以下特別:

  • 遵循迭代器(iterator)協議,迭代器協議需要實現__iter__、next接口
  • 能過多次進入、多次返回,能夠暫停函數體中代碼的執行

下面看一下測試代碼:

  1. >>> def gen_example(): 
  2.  
  3. ...     print 'before any yield' 
  4.  
  5. ...     yield 'first yield' 
  6.  
  7. ...     print 'between yields' 
  8.  
  9. ...     yield 'second yield' 
  10.  
  11. ...     print 'no yield anymore' 
  12.  
  13. ... 
  14.  
  15. >>> gen = gen_example() 
  16.  
  17. >>> gen.next()    # ***次調用next 
  18.  
  19. before any yield 
  20.  
  21. 'first yield' 
  22.  
  23. >>> gen.next()    # 第二次調用next 
  24.  
  25. between yields 
  26.  
  27. 'second yield' 
  28.  
  29. >>> gen.next()    # 第三次調用next 
  30.  
  31. no yield anymore 
  32.  
  33. Traceback (most recent call last): 
  34.  
  35.   File "<stdin>", line 1, in <module> 
  36.  
  37. StopIteratio  

調用gen example方法并沒有輸出任何內容,說明函數體的代碼尚未開始執行。當調用generator的next方法,generator會執行到yield 表達式處,返回yield表達式的內容,然后暫停(掛起)在這個地方,所以***次調用next打印***句并返回“first yield”。 暫停意味著方法的局部變量,指針信息,運行環境都保存起來,直到下一次調用next方法恢復。第二次調用next之后就暫停在***一個yield,再次調用next()方法,則會拋出StopIteration異常。

因為for語句能自動捕獲StopIteration異常,所以generator(本質上是任何iterator)較為常用的方法是在循環中使用:

  1. def generator_example(): 
  2.  
  3.     yield 1 
  4.  
  5.     yield 2 
  6.  
  7.   
  8.  
  9. if __name__ == '__main__'
  10.  
  11.     for e in generator_example(): 
  12.  
  13.         print e 
  14.  
  15.         # output 1 2  

generator function產生的generator與普通的function有什么區別呢?

  1. function每次都是從***行開始運行,而generator從上一次yield開始的地方運行
  2. function調用一次返回一個(一組)值,而generator可以多次返回
  3. function可以被無數次重復調用,而一個generator實例在yield***一個值 或者return之后就不能繼續調用了

在函數中使用Yield,然后調用該函數是生成generator的一種方式。另一種常見的方式是使用generator expression,For example:

  1. >>> gen = (x * x for x in xrange(5)) 
  2.  
  3. >>> print gen 
  4.  
  5. <generator object <genexpr> at 0x02655710>  

generator應用

generator基礎應用

為什么使用generator呢,最重要的原因是可以按需生成并“返回”結果,而不是一次性產生所有的返回值,況且有時候根本就不知道“所有的返回值”。比如對于下面的代碼:

  1. RANGE_NUM = 100 
  2.  
  3.     for i in [x*x for x in range(RANGE_NUM)]: # ***種方法:對列表進行迭代 
  4.  
  5.         # do sth for example 
  6.  
  7.         print i 
  8.  
  9.   
  10.  
  11.     for i in (x*x for x in range(RANGE_NUM)): # 第二種方法:對generator進行迭代 
  12.  
  13.         # do sth for example 
  14.  
  15.         print i  

在上面的代碼中,兩個for語句輸出是一樣的,代碼字面上看來也就是中括號與小括號的區別。但這點區別差異是很大的,***種方法返回值是一個列表,第二個方法返回的是一個generator對象。隨著RANGE_NUM的變大,***種方法返回的列表也越大,占用的內存也越大;但是對于第二種方法沒有任何區別。

我們再來看一個可以“返回”無窮多次的例子:

  1. def fib(): 
  2.  
  3.     a, b = 1, 1 
  4.  
  5.     while True
  6.  
  7.         yield a 
  8.  
  9.         a, b = b, a+b  

這個generator擁有生成無數多“返回值”的能力,使用者可以自己決定什么時候停止迭代。

generator高級應用

使用場景一:

Generator可用于產生數據流, generator并不立刻產生返回值,而是等到被需要的時候才會產生返回值,相當于一個主動拉取的過程(pull),比如現在有一個日志文件,每行產生一條記錄,對于每一條記錄,不同部門的人可能處理方式不同,但是我們可以提供一個公用的、按需生成的數據流。

  1. def gen_data_from_file(file_name): 
  2.  
  3.     for line in file(file_name): 
  4.  
  5.         yield line 
  6.  
  7.   
  8.  
  9. def gen_words(line): 
  10.  
  11.     for word in (w for w in line.split() if w.strip()): 
  12.  
  13.         yield word 
  14.  
  15.   
  16.  
  17. def count_words(file_name): 
  18.  
  19.     word_map = {} 
  20.  
  21.     for line in gen_data_from_file(file_name): 
  22.  
  23.         for word in gen_words(line): 
  24.  
  25.             if word not in word_map: 
  26.  
  27.                 word_map[word] = 0 
  28.  
  29.             word_map[word] += 1 
  30.  
  31.     return word_map 
  32.  
  33.   
  34.  
  35. def count_total_chars(file_name): 
  36.  
  37.     total = 0 
  38.  
  39.     for line in gen_data_from_file(file_name): 
  40.  
  41.         total += len(line) 
  42.  
  43.     return total 
  44.  
  45.      
  46.  
  47. if __name__ == '__main__'
  48.  
  49.     print count_words('test.txt'), count_total_chars('test.txt' 

上面的例子來自08年的PyCon一個講座。gen_words gen_data_from_file是數據生產者,而count_words count_total_chars是數據的消費者。可以看到,數據只有在需要的時候去拉取的,而不是提前準備好。另外gen_words中 (w for w in line.split() if w.strip()) 也是產生了一個generator。

使用場景二:

一些編程場景中,一件事情可能需要執行一部分邏輯,然后等待一段時間、或者等待某個異步的結果、或者等待某個狀態,然后繼續執行另一部分邏輯。比如微服務架構中,服務A執行了一段邏輯之后,去服務B請求一些數據,然后在服務A上繼續執行。或者在游戲編程中,一個技能分成分多段,先執行一部分動作(效果),然后等待一段時間,然后再繼續。對于這種需要等待、而又不希望阻塞的情況,我們一般使用回調(callback)的方式。下面舉一個簡單的例子:

  1. def do(a): 
  2.  
  3.      print 'do', a 
  4.  
  5.      CallBackMgr.callback(5, lambda a = a: post_do(a)) 
  6.  
  7. def post_do(a): 
  8.  
  9.     print 'post_do', a  

這里的CallBackMgr注冊了一個5s后的時間,5s之后再調用lambda函數,可見一段邏輯被分裂到兩個函數,而且還需要上下文的傳遞(如這里的參數a)。我們用yield來修改一下這個例子,yield返回值代表等待的時間。

  1. @yield_dec 
  2.  
  3. def do(a): 
  4.  
  5.      print 'do', a 
  6.  
  7.      yield 5 
  8.  
  9.      print 'post_do', a  

這里需要實現一個YieldManager, 通過yield_dec這個decrator將do這個generator注冊到YieldManager,并在5s后調用next方法。Yield版本實現了和回調一樣的功能,但是看起來要清晰許多。下面給出一個簡單的實現以供參考:

  1. # -*- coding:utf-8 -*- 
  2.  
  3. import sys 
  4.  
  5. # import Timer 
  6.  
  7. import types 
  8.  
  9. import time 
  10.  
  11.   
  12.  
  13. class YieldManager(object): 
  14.  
  15.     def __init__(self, tick_delta = 0.01): 
  16.  
  17.         self.generator_dict = {} 
  18.  
  19.         # self._tick_timer = Timer.addRepeatTimer(tick_delta, lambda: self.tick()) 
  20.  
  21.   
  22.  
  23.     def tick(self): 
  24.  
  25.         cur = time.time() 
  26.  
  27.         for gene, t in self.generator_dict.items(): 
  28.  
  29.             if cur >= t: 
  30.  
  31.                 self._do_resume_genetator(gene,cur) 
  32.  
  33.   
  34.  
  35.     def _do_resume_genetator(self,gene, cur ): 
  36.  
  37.         try: 
  38.  
  39.             self.on_generator_excute(gene, cur) 
  40.  
  41.         except StopIteration,e: 
  42.  
  43.             self.remove_generator(gene) 
  44.  
  45.         except Exception, e: 
  46.  
  47.             print 'unexcepet error', type(e) 
  48.  
  49.             self.remove_generator(gene) 
  50.  
  51.   
  52.  
  53.     def add_generator(self, gen, deadline): 
  54.  
  55.         self.generator_dict[gen] = deadline 
  56.  
  57.   
  58.  
  59.     def remove_generator(self, gene): 
  60.  
  61.         del self.generator_dict[gene] 
  62.  
  63.   
  64.  
  65.     def on_generator_excute(self, gen, cur_time = None): 
  66.  
  67.         t = gen.next() 
  68.  
  69.         cur_time = cur_time or time.time() 
  70.  
  71.         self.add_generator(gen, t + cur_time) 
  72.  
  73.   
  74.  
  75. g_yield_mgr = YieldManager() 
  76.  
  77.   
  78.  
  79. def yield_dec(func): 
  80.  
  81.     def _inner_func(*args, **kwargs): 
  82.  
  83.         gen = func(*args, **kwargs) 
  84.  
  85.         if type(gen) is types.GeneratorType: 
  86.  
  87.             g_yield_mgr.on_generator_excute(gen) 
  88.  
  89.   
  90.  
  91.         return gen 
  92.  
  93.     return _inner_func 
  94.  
  95.   
  96.  
  97. @yield_dec 
  98.  
  99. def do(a): 
  100.  
  101.     print 'do', a 
  102.  
  103.     yield 2.5 
  104.  
  105.     print 'post_do', a 
  106.  
  107.     yield 3 
  108.  
  109.     print 'post_do again', a 
  110.  
  111.   
  112.  
  113. if __name__ == '__main__'
  114.  
  115.     do(1) 
  116.  
  117.     for i in range(1, 10): 
  118.  
  119.         print 'simulate a timer, %s seconds passed' % i 
  120.  
  121.         time.sleep(1) 
  122.  
  123.         g_yield_mgr.tick()  

注意事項:

(1)Yield是不能嵌套的!

  1. def visit(data): 
  2.  
  3.     for elem in data: 
  4.  
  5.         if isinstance(elem, tuple) or isinstance(elem, list): 
  6.  
  7.             visit(elem) # here value retuened is generator 
  8.  
  9.         else
  10.  
  11.             yield elem 
  12.  
  13.              
  14.  
  15. if __name__ == '__main__'
  16.  
  17.     for e in visit([1, 2, (3, 4), 5]): 
  18.  
  19.         print e  

上面的代碼訪問嵌套序列里面的每一個元素,我們期望的輸出是1 2 3 4 5,而實際輸出是1 2 5 。為什么呢,如注釋所示,visit是一個generator function,所以第4行返回的是generator object,而代碼也沒這個generator實例迭代。那么改改代碼,對這個臨時的generator 進行迭代就行了。

  1. def visit(data): 
  2.  
  3.     for elem in data: 
  4.  
  5.         if isinstance(elem, tuple) or isinstance(elem, list): 
  6.  
  7.             for e in visit(elem): 
  8.  
  9.                 yield e 
  10.  
  11.         else
  12.  
  13.             yield elem  

或者在python3.3中 可以使用yield from,這個語法是在pep380加入的:

  1. def visit(data): 
  2.  
  3.      for elem in data: 
  4.  
  5.          if isinstance(elem, tuple) or isinstance(elem, list): 
  6.  
  7.              yield from visit(elem) 
  8.  
  9.          else
  10.  
  11.              yield elem  

(2)generator function中使用return

在python doc中,明確提到是可以使用return的,當generator執行到這里的時候拋出StopIteration異常。

  1. def gen_with_return(range_num): 
  2.  
  3.     if range_num < 0: 
  4.  
  5.         return 
  6.  
  7.     else
  8.  
  9.         for i in xrange(range_num): 
  10.  
  11.             yield i 
  12.  
  13.   
  14.  
  15. if __name__ == '__main__'
  16.  
  17.     print list(gen_with_return(-1)) 
  18.  
  19.     print list(gen_with_return(1))  

但是,generator function中的return是不能帶任何返回值的。

  1. def gen_with_return(range_num): 
  2.  
  3.      if range_num < 0: 
  4.  
  5.          return 0 
  6.  
  7.      else
  8.  
  9.          for i in xrange(range_num): 
  10.  
  11.              yield i  

上面的代碼會報錯:SyntaxError: ‘return’ with argument inside generator

參考

  • http://www.dabeaz.com/generators-uk/
  • https://www.python.org/dev/peps/pep-0380/
  • http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do
  • http://stackoverflow.com/questions/15809296/python-syntaxerror-return-with-argument-inside-generator 
責任編輯:龐桂玉 來源: Python開發者
相關推薦

2013-01-30 10:12:14

Pythonyield

2023-12-25 14:50:39

Python迭代器

2012-11-23 14:25:10

IBMdW

2021-03-15 12:23:24

Pythonyield代碼

2010-03-04 13:37:20

Python yiel

2021-05-13 09:11:11

PythonGo編程

2020-10-25 20:05:29

Pythonyield開發

2021-04-22 21:15:38

Generator函數生成器

2022-03-03 08:30:41

GeneratorES6函數

2023-12-11 13:59:00

YieldPython生成器函數

2024-11-19 13:20:55

2024-12-13 08:02:10

PythonGenerator懶加載

2009-06-29 08:59:05

hbm的generat

2009-06-29 08:58:06

Hibernate的g

2019-08-29 09:11:38

Pythonyield語法

2009-07-02 09:32:47

generator子元Hibernate

2009-12-18 11:37:54

Ruby關鍵字yiel

2024-03-01 19:35:54

Mybatis開發

2010-03-17 18:38:53

Java編程語言

2020-04-20 08:22:41

SOC安全工具網絡攻擊
點贊
收藏

51CTO技術棧公眾號

99精品欧美一区二区蜜桃免费 | 亚洲精品色婷婷福利天堂| 人人妻人人澡人人爽欧美一区双 | 亚洲精品美女在线| 91欧美视频在线| 青春草视频在线| 91香蕉视频黄| 亚洲自拍高清视频网站| 国产精品乱子伦| 97精品一区二区| 精品欧美一区二区三区精品久久| 六月丁香婷婷在线| 污视频网站在线免费| 久久久www成人免费毛片麻豆| 成人免费看片视频| 4438国产精品一区二区| 综合日韩在线| 亚洲天堂网站在线观看视频| 午夜性福利视频| 欧美国产日韩电影| 黄色一区二区在线| 干日本少妇视频| 高清性色生活片在线观看| 国产福利91精品一区二区三区| 日本精品视频网站| 国产无码精品在线播放| 五月精品视频| 色悠悠国产精品| 中文字幕免费高清| 久久影视三级福利片| 欧美日韩视频在线第一区| 久久综合色视频| av在线app| 国产精品进线69影院| 久久国产精品-国产精品| 国产高清免费在线观看| 蜜桃91丨九色丨蝌蚪91桃色| 欧亚精品中文字幕| 国产成人无码精品亚洲| 国产一区清纯| 欧美高清激情视频| 免费人成年激情视频在线观看| 日韩精品永久网址| 一区二区三区日韩在线| 少妇毛片一区二区三区| 伦理一区二区| 亚洲国产精品女人久久久| 粗大的内捧猛烈进出视频| 国产精品白丝久久av网站| 欧美色男人天堂| 日本久久久久久久久久久久| 欧美二三四区| 在线亚洲一区二区| 亚洲成人av免费看| 精品123区| 欧美日韩一区二区在线观看视频| 婷婷丁香激情网| 久久91视频| 在线成人小视频| xxxx在线免费观看| 久久精品九色| 精品精品国产高清a毛片牛牛 | av男人天堂网| 国产精品自拍一区| 官网99热精品| 午夜影院免费体验区| wwwwxxxxx欧美| 日本一区二区在线视频| www在线免费观看| 国产精品成人一区二区三区夜夜夜 | 九九九九九九精品| 性猛交xxxx| 久久久久国色av免费看影院| 日韩欧美亚洲在线| 日本在线www| 亚洲综合丁香婷婷六月香| 国产真人做爰毛片视频直播| 久热在线观看视频| 欧美伊人久久久久久久久影院| 欧美午夜aaaaaa免费视频| www一区二区三区| 精品国产sm最大网站免费看| 日韩 中文字幕| 日韩精品一区二区三区免费观看| 成人97在线观看视频| 国产精品第二十页| 美国一区二区三区在线播放 | 国产精品va在线播放我和闺蜜| 91porny九色| 国产又黄又大久久| 九色91在线视频| 在线看黄色av| 亚洲一区二区在线观看视频| 国产淫片av片久久久久久| 亚洲男男av| 亚洲精品98久久久久久中文字幕| 性の欲びの女javhd| 综合久久亚洲| 国产精品99久久99久久久二8| 一级黄色小视频| 波多野结衣在线aⅴ中文字幕不卡| 日韩视频在线播放| 波多野结衣在线观看| 91福利视频久久久久| 国产精品19p| 欧美日韩激情| 久久久女女女女999久久| 国产91av在线播放| 不卡欧美aaaaa| 国产奶头好大揉着好爽视频| 性爽视频在线| 日韩欧美视频一区| 999久久久国产| 免费久久99精品国产自在现线| 91精品视频专区| 猫咪在线永久网站| 亚洲大片免费看| 久久久精品视频国产| 国产麻豆精品久久| 97成人精品区在线播放| 99视频国产精品免费观看a| 国产欧美精品一区二区色综合朱莉| 成年人视频网站免费| 成人片免费看| 亚洲精品wwwww| 国产亚洲精品码| 国产曰批免费观看久久久| 色综合666| 精品国产免费人成网站| 亚洲国产成人在线视频| 黄色一级视频免费观看| 精品在线亚洲视频| 天堂精品视频| av高清一区| 亚洲女成人图区| 久久久午夜影院| 大美女一区二区三区| 国产精品久久久影院| 国产日韩中文在线中文字幕| 日韩亚洲精品电影| 亚洲一级片免费看| 国产精品少妇自拍| 国产91色在线观看| 久久精品播放| 国产日韩中文字幕在线| 91caoporm在线视频| 色诱亚洲精品久久久久久| 日韩成人av一区二区| 亚洲伦伦在线| 精品久久久久久中文字幕动漫| 欧美寡妇性猛交xxx免费| 日韩欧美一区二区在线视频| 最新一区二区三区| 国产福利视频一区二区三区| 欧美高清中文字幕| 久草在线综合| 欧美孕妇孕交黑巨大网站| 青草久久伊人| 色一区在线观看| 国产成人免费观看网站| 美女视频网站黄色亚洲| 影音先锋欧美资源| 日韩成人久久| 91精品国产91久久久久福利| 外国精品视频在线观看 | 久久偷拍免费视频| 久久久久久黄| 亚洲 国产 日韩 综合一区| 亚洲国产91视频| 欧美激情国产高清| 日韩国产福利| 欧美日本国产一区| 久久无码精品丰满人妻| 97久久精品人人爽人人爽蜜臀| 成人久久久久久久久| 日本黄色精品| 99久久久久国产精品免费| 波多一区二区| 在线视频欧美日韩精品| 99精品在线看| 懂色av影视一区二区三区| 最近中文字幕在线mv视频在线| 日韩av电影天堂| 狠狠干视频网站| 婷婷亚洲成人| 91免费高清视频| 久草在线资源站手机版| 色综久久综合桃花网| 亚洲精品免费在线观看视频| 一本一道久久a久久精品| 欧美福利在线视频| 99热这里都是精品| 高清av免费看| 国产日韩欧美| 中文字幕制服丝袜在线| 日韩有码一区| 96成人在线视频| 456成人影院在线观看| 久久99精品国产99久久6尤物| 免费成人av电影| 日韩欧美的一区| 中国女人一级一次看片| 亚洲午夜电影在线| 天天色天天综合| 91麻豆免费观看| 真实乱偷全部视频| 日本视频免费一区| 18禁网站免费无遮挡无码中文 | 中文欧美在线视频| 日韩中文字幕观看| 欧美一卡2卡三卡4卡5免费| 三级网站在线播放 | 久久久久久亚洲av无码专区| 一区二区成人在线| 五月婷婷欧美激情| 91美女视频网站| av免费观看不卡| 九九视频精品免费| www日韩视频| 国产精品久久国产愉拍| 欧美日韩视频免费| 久久精品久久久| 亚洲欧美电影在线观看| 亚洲精品一级二级三级| 国产午夜一区二区三区| 欧美 日韩精品| 亚洲精品字幕| 国产女主播自拍| 午夜久久久久| 久久久久久久免费视频| 久久网站免费观看| 天堂资源在线亚洲资源| 中文有码一区| 欧美日韩在线高清| 伊人久久大香线蕉无限次| 九九九九久久久久| 免费成人蒂法| 久久99精品久久久久久水蜜桃| 成人春色在线观看免费网站| 99精彩视频| 91成人入口| 福利视频一区二区三区| 伊人www22综合色| av资源一区二区| 99re8这里有精品热视频免费| 91成人在线看| 亚洲超碰在线观看| 成人黄色片视频网站| 在线播放一区二区精品视频| 91黄在线观看| 精品一区二区三区亚洲| av观看久久| 激情亚洲另类图片区小说区| 国产伦精品一区| 老司机精品在线| 免费电影一区| 日韩国产在线| 精品一区二区三区毛片| 国产精品成人一区二区网站软件| 男人添女荫道口喷水视频| 一区在线视频观看| 动漫av网站免费观看| 美女精品网站| 一本色道久久亚洲综合精品蜜桃| 精品一区二区三区在线播放| 无码人妻一区二区三区在线视频| 国产精品一二三区在线| 国产香蕉精品视频| 91最新地址在线播放| 国产亚洲精品熟女国产成人| 中文字幕电影一区| 麻豆一区产品精品蜜桃的特点| 亚洲电影一级黄| 中文字幕一区二区三区四区欧美| 欧美日韩国产小视频| 亚洲精品国产suv一区| 日韩精品在线视频美女| porn亚洲| 欧美黄色三级网站| 日韩新的三级电影| 91精品在线播放| 青青草原在线亚洲| 亚洲一区二区三区加勒比| 亚洲欧美一级二级三级| 日本三级免费网站| 激情综合网最新| 色哟哟无码精品一区二区三区| wwwwww.欧美系列| 刘亦菲国产毛片bd| 午夜久久久久久久久久一区二区| 国产精华7777777| 欧美不卡123| 韩日在线视频| 欧美激情手机在线视频| 欧美片第1页| 91视频免费进入| 国产欧美日韩在线观看视频| 一二三四中文字幕| 天堂一区二区在线免费观看| 杨幂一区二区国产精品| 国产色一区二区| 九九视频在线观看| 欧美在线一二三| 欧美 日韩 人妻 高清 中文| 在线激情影院一区| 不卡视频观看| 91人人爽人人爽人人精88v| 亚洲色图美女| 日本精品久久久久久久久久| 麻豆精品一区二区综合av| 中文字幕在线播放一区| 日韩理论片在线| 国产男人搡女人免费视频| 亚洲国产精品成人av| 黄色网在线看| 国产精品精品国产| 网曝91综合精品门事件在线| 日韩久久久久久久久久久久| 久久国产精品一区二区| 免费观看av网站| 亚洲国产乱码最新视频| 国产熟女一区二区三区四区| 亚洲性av在线| 一区二区三区电影大全| 成人免费视频网站入口| 亚洲欧美日韩高清在线| 91制片厂毛片| 国产亚洲精品bt天堂精选| 色婷婷av国产精品| 亚洲国产成人精品久久久国产成人一区| av中文字幕在线观看| 91久久精品国产| 999国产精品视频| 在线观看国产一级片| 国产午夜精品一区二区| 日韩视频在线观看一区| 精品亚洲aⅴ在线观看| 老色鬼在线视频| 国产在线一区二区三区四区| 国产综合视频| 国产情侣久久久久aⅴ免费| 亚洲一卡二卡三卡四卡无卡久久| 国产麻豆91视频| 久久久国产精品x99av| 95精品视频| 激情图片qvod| 国产精品白丝av| 国产第一页在线播放| 亚洲福利视频网站| 黄在线观看免费网站ktv| 九九久久99| 日韩精品久久理论片| 国产三级黄色片| 欧美精选午夜久久久乱码6080| 337p日本欧洲亚洲大胆鲁鲁| 国产精品午夜视频| 国产国产精品| 粗大的内捧猛烈进出视频| 亚洲电影激情视频网站| 免费人成在线观看网站| 国产精品久久久久av| 欧美aaaa视频| 四川一级毛毛片| 午夜精品久久一牛影视| 视频三区在线观看| 国产成人精品亚洲精品| 久久国产成人午夜av影院宅| 午夜福利123| 亚洲国产乱码最新视频| 国产视频第一区| 91热福利电影| 在线亚洲激情| 天堂在线中文视频| 日韩三级视频中文字幕| а√天堂中文在线资源8| 秋霞久久久久久一区二区| 久久精品国产精品亚洲精品| 麻豆一区产品精品蜜桃的特点| 日韩黄色高清视频| 福利视频一区| 屁屁影院ccyy国产第一页| wwwwww.欧美系列| 国产伦精品一区二区三区免.费| 久久久久久久久久久久av| 性欧美lx╳lx╳| 国产精品嫩草影视| 精品人伦一区二区三区蜜桃免费| 99中文字幕一区| 国产嫩草一区二区三区在线观看| 日本最新不卡在线| 国产亚洲精久久久久久无码77777| 亚洲性av网站| 国产欧美一区二区三区米奇| 色免费在线视频| 精品免费在线视频| 久草中文在线| 欧美日韩精品不卡| 成人亚洲精品久久久久软件| 国产成人精品亚洲| 91国语精品自产拍在线观看性色|