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

流程控制語句 For、While 是怎么實現的?

開發 前端
for 循環遍歷可迭代對象時,會先拿到對應的迭代器,那如果遍歷的就是一個迭代器呢?答案是依舊調用 __iter__,只不過由于本身就是一個迭代器,所以返回的還是其本身。

楔子

在介紹 if 語句的時候,我們看到了最基本的控制流,其核心就是跳轉。但無論是 if 還是 match,都只能向前跳轉。而接下來介紹的 for、while 循環,指令是可以回退的,也就是向后跳轉。

另外在 if 語句的分支中,無論哪個分支,其指令的跳躍距離都是當前指令與目標指令的距離,相當于向前跳了多少步。那么指令回退時,是不是相當于向后跳了多少步呢?帶著疑問,我們開始今天的內容。

for 控制流

我們看一個簡單的 for 循環的字節碼。

import dis

code_string = """
lst = [1, 2]
for item in lst:
    print(item)
"""

dis.dis(compile(code_string, "<file>", "exec"))

反編譯之后,字節碼指令如下。

0 RESUME                   0
      # 加載常量 1,壓入運行時棧
      2 LOAD_CONST               0 (1)
      # 加載常量 2,壓入運行時棧
      4 LOAD_CONST               1 (2)
      # 將運行時棧的元素彈出,構建長度為 2 的列表,并壓入棧中
      6 BUILD_LIST               2
      # 將上一步構建的列表從棧頂彈出,并用符號 lst 與之綁定
      # 到此 lst = [1, 2] 便完成了
      8 STORE_NAME               0 (lst)
      
      # 從全局名字空間中加載 lst
     10 LOAD_NAME                0 (lst)
      # 獲取對應的迭代器,即 iter(lst)
     12 GET_ITER
      # 開始 for 循環,將里面的元素依次迭代出來
      # 如果循環結束,跳轉到偏移量為 38 的指令,即 END_FOR
>>   14 FOR_ITER                10 (to 38)
      # 用符號 item 和迭代出的元素進行綁定
     18 STORE_NAME               1 (item)

     20 PUSH_NULL
      # 對應 print(item)
     22 LOAD_NAME                2 (print)
     24 LOAD_NAME                1 (item)
     26 CALL                     1
     34 POP_TOP
      # 到此,一次遍歷就結束了,那么向后跳轉 12 個指令
      # 會來到偏移量為 14 的指令,進行下一次遍歷
     36 JUMP_BACKWARD           12 (to 14)
      # 循環結束
>>   38 END_FOR
     40 RETURN_CONST             2 (None)

我們直接從 10 GET_ITER 開始看起,首先 for 循環遍歷的對象必須是可迭代對象,然后會調用它的 __iter__ 方法,得到迭代器。再不斷地調用迭代器的 __next__ 方法,一步一步將里面的值全部迭代出來,當出現 StopIteration 異常時,for 循環捕捉,最后退出。

另外,我們說 Python 里面是先有值,后有變量,for 循環也不例外。循環的時候,先將迭代器中的元素迭代出來,然后再讓變量 item 指向。

因此包含 10 個元素的迭代器,需要迭代 11 次才能結束。因為 for 循環事先是不知道迭代 10 次就能結束的,它需要再迭代一次,發現沒有元素可以迭代、并捕獲拋出的 StopIteration 之后,才能結束。

for 循環遍歷可迭代對象時,會先拿到對應的迭代器,那如果遍歷的就是一個迭代器呢?答案是依舊調用 __iter__,只不過由于本身就是一個迭代器,所以返回的還是其本身。

將元素迭代出來之后,就開始執行 for 循環體的邏輯了。

執行完之后,通過 JUMP_BACKWARD 跳轉到字節碼偏移量為 14、也就是 FOR_ITER 的位置開始下一次循環。這里我們發現它沒有跳到 GET_ITER 那里,所以可以得出結論,for 循環在遍歷的時候只會創建一次迭代器。

下面來看指令對應的具體邏輯:

TARGET(GET_ITER) {
    // 獲取棧頂元素,即上一步壓入的列表指針
    PyObject *iterable = stack_pointer[-1];
    PyObject *iter;
    #line 2255 "Python/bytecodes.c"
    // 調用 PyObject_GetIter,獲取對應的迭代器
    // 這個函數在介紹迭代器的時候已經說過了
    // 等價于 iter = type(iterable).__iter__(iterable)
    iter = PyObject_GetIter(iterable);
    #line 3216 "Python/generated_cases.c.h"
    Py_DECREF(iterable);
    #line 2258 "Python/bytecodes.c"
    if (iter == NULL) goto pop_1_error;
    #line 3220 "Python/generated_cases.c.h"
    // 將迭代器 iter 設置為棧頂元素
    stack_pointer[-1] = iter;
    DISPATCH();
}

當創建完迭代器之后,就正式進入 for 循環了。所以從 FOR_ITER 開始,進入了虛擬機層面上的 for 循環。

源代碼中的 for 循環,在虛擬機層面也一定對應著一個相應的循環控制結構。因為無論進行怎樣的變換,都不可能在虛擬機層面利用順序結構來實現源碼層面上的循環結構,這也可以看作是程序的拓撲不變性。

因此源代碼是宏觀的,虛擬機執行字節碼是微觀的,盡管兩者的層級不同,但本質上等價的,是程序從一種形式到另一種形式的等價轉換。

我們來看一下 FOR_ITER 指令對應的具體實現:

TARGET(FOR_ITER) {
    // ...
    // 從棧頂獲取迭代器對象(指針)
    PyObject *iter = stack_pointer[-1];
    PyObject *next;
    #line 2304 "Python/bytecodes.c"
    // ...
    // 調用迭代器類型對象的 tp_iternext,將迭代器內的元素迭代出來
    next = (*Py_TYPE(iter)->tp_iternext)(iter);
    // 如果 next 為 NULL,說明迭代出現異常
    if (next == NULL) {
        // 如果異常還不是 StopIteration,那么跳轉到 error 標簽
        if (_PyErr_Occurred(tstate)) {
            if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
                goto error;
            }
            monitor_raise(tstate, frame, next_instr-1);
            _PyErr_Clear(tstate);
        }
        // 否則說明是 StopIteration,那么證明迭代完畢
        Py_DECREF(iter);
        STACK_SHRINK(1);
        /* Jump forward oparg, then skip following END_FOR instruction */
        // 跳轉到 END_FOR 標簽
        JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1);
        DISPATCH();
    }
    #line 3297 "Python/generated_cases.c.h"
    // 到這里說明 next != NULL,證明迭代出元素了,那么壓入運行時棧
    STACK_GROW(1);
    stack_pointer[-1] = next;
    next_instr += 1;
    DISPATCH();
}

在將迭代出來的元素壓入運行時棧之后,會執行 STORE_NAME。然后虛擬機將沿著字節碼指令的順序一條一條地執行下去,從而完成輸出的動作。

但是我們知道,for 循環中肯定會有指令回退的動作。從字節碼中也看到了,for 循環遍歷一次之后,會再次跳轉到 FOR_ITER,而跳轉所使用的指令就是 JUMP_BACKWARD。

TARGET(JUMP_BACKWARD) {
    PREDICTED(JUMP_BACKWARD);
    #line 2151 "Python/bytecodes.c"
    assert(oparg < INSTR_OFFSET());
    JUMPBY(-oparg);
    #line 3033 "Python/generated_cases.c.h"
    CHECK_EVAL_BREAKER();
    DISPATCH();
}

我們看到它調用了 JUMPBY,這個宏在介紹 if 語句的時候說過。

// Python/ceval_macros.h

// 從字節碼的起始位置向前跳轉 x 個指令
#define JUMPTO(x)       (next_instr = _PyCode_CODE(frame->f_code) + (x))
// 從 next_instr 處(指向當前待執行的指令)向前跳轉 x 個指令
#define JUMPBY(x)       (next_instr += (x))

因為參數是 -oparg,所以相當于向后跳轉了 oparg 個指令,從而實現指令回退,繼續下一輪循環。

但天下沒有不散的宴席,隨著迭代的進行,for 循環總有退出的那一刻,而這個退出的動作只能落在 FOR_ITER 的身上。在 FOR_ITER 指令執行的過程中,如果遇到了 StopIteration,就意味著迭代結束了。

這個結果將導致虛擬機會將迭代器從運行時棧中彈出,同時執行一個 JUMPBY 動作,向前跳躍,在字節碼的層面是向下,也就是偏移量增大的方向。

while 控制流

看完了 for,再來看看 while,并且我們還要分析兩個關鍵字:break、continue。

import dis

code_string = """
a = 0
while a < 10:
    a += 1
    if a == 5:
        continue
    if a == 7:
        break
    print(a)
"""

dis.dis(compile(code_string, "<file>", "exec"))

看一下它的指令:

0 RESUME                   0
       
      # a = 0
      2 LOAD_CONST               0 (0)
      4 STORE_NAME               0 (a)
      
      # 比較 a < 10
>>    6 LOAD_NAME                0 (a)
      8 LOAD_CONST               1 (10)
     10 COMPARE_OP               2 (<)
      # 如果 a < 10 為假,說明循環結束
      # 跳轉到偏移量為 80 的指令
     14 POP_JUMP_IF_FALSE       32 (to 80)
      
      # 到這里說明 while 條件成立,進入循環體
      # 執行 a += 1
>>   16 LOAD_NAME                0 (a)
     18 LOAD_CONST               2 (1)
     20 BINARY_OP               13 (+=)
     24 STORE_NAME               0 (a)
      
      # 比較 a == 5
     26 LOAD_NAME                0 (a)
     28 LOAD_CONST               3 (5)
     30 COMPARE_OP              40 (==)
      # 如果 a == 5 為假,跳轉到偏移量為 38 的指令
     34 POP_JUMP_IF_FALSE        1 (to 38)
      # 否則說明 a == 5 為真,執行 continue
      # 由于 continue 是立即進入下一輪循環
      # 所以向后跳轉到偏移量為 6 的指令
      # 所以在虛擬機的層面,continue 就是一個跳轉指令
     36 JUMP_BACKWARD           16 (to 6)
      
      # 比較 a == 7
>>   38 LOAD_NAME                0 (a)
     40 LOAD_CONST               4 (7)
     42 COMPARE_OP              40 (==)
      # 如果 a == 7 為假,跳轉到偏移量為 50 的指令
     46 POP_JUMP_IF_FALSE        1 (to 50)
      # 否則說明 a == 7 為真,執行 break
      # 而 break 是跳出循環,并且循環的下面也沒有代碼了
      # 所以直接 RETURN_CONST
     48 RETURN_CONST             5 (None)
      
      # print(a)
>>   50 PUSH_NULL
     52 LOAD_NAME                1 (print)
     54 LOAD_NAME                0 (a)
     56 CALL                     1
     64 POP_TOP
      
      # print(a) 結束后應該跳轉到 while a < 10 處,進行下一輪循環
      # 但這里又執行了 a < 10
     66 LOAD_NAME                0 (a)
     68 LOAD_CONST               1 (10)
     70 COMPARE_OP               2 (<)
     74 POP_JUMP_IF_FALSE        1 (to 78)
      # 如果為假,然后跳轉到 a += 1 處,因此整體效果和直接跳轉到 while 處是等價的
     76 JUMP_BACKWARD           31 (to 16)
>>   78 RETURN_CONST             5 (None)
>>   80 RETURN_CONST             5 (None)

有了 for 循環,再看 while 循環就簡單多了,整體邏輯和 for 高度相似,當然里面還結合了 if。

剛才說了,盡管源代碼和字節碼的層級不同,但本質上是等價的,是程序從一種形式到另一種形式的等價轉換。在源碼中能看到的,在字節碼當中也能看到。比如源代碼中的 continue 會跳轉到循環所在位置,那么在字節碼中自然也會對應一個跳轉指令。

小結

以上我們就探討了 Python 的兩種循環,總的來說沒什么難度,本質上還是跳轉。只不過相對 if 只能向前跳轉,循環還可以向后跳轉。

責任編輯:武曉燕 來源: 古明地覺的編程教室
相關推薦

2024-11-01 16:05:26

2010-05-11 12:53:58

Unix awk

2009-09-04 10:42:56

C#流程控制語句

2010-07-19 10:11:58

Perl流程控制語句

2015-07-23 15:17:37

JavaScript循環語句

2011-08-24 16:36:00

T-SQL

2017-05-31 17:09:52

LinuxShell命令

2024-06-06 09:09:41

SQL循環控制命令

2011-08-23 13:36:11

T-SQL查詢流程控制語句

2016-08-29 20:51:16

awkLinux開源

2009-12-15 09:56:51

Ruby流程控制

2011-09-08 13:53:31

Node.js

2010-03-18 16:37:13

Python 程序流程

2021-05-27 09:30:51

Java流程控制

2020-11-13 10:29:37

流程控制語句

2021-05-27 05:27:22

流程控制Rust

2025-07-01 08:20:00

JUC包Java并發

2022-07-27 08:31:28

SQL開發控制

2010-05-11 12:17:51

Unix awk

2013-12-13 15:48:52

Lua腳本語言
點贊
收藏

51CTO技術棧公眾號

久久精品中文字幕一区二区三区 | 日批视频免费播放| 亚洲精品电影| 亚洲精品国产拍免费91在线| 欧美精品aaaa| 羞羞网站在线看| 91丝袜高跟美女视频| 国产精品电影久久久久电影网| 国产又粗又猛又爽又黄的视频小说| 少妇精品在线| 欧美日韩精品一区二区天天拍小说 | 狠狠狠综合7777久夜色撩人| 国产乱码精品一品二品| 欧美制服第一页| 中文字幕在线2021| 欧美男gay| 亚洲成人精品视频在线观看| 亚洲美女性囗交| 日韩伦理在线一区| 亚洲综合一二区| 在线视频福利一区| 你懂的在线网址| 成人一区二区三区中文字幕| 成人国产精品一区二区| 高清乱码免费看污| 国产一区久久| 久久中国妇女中文字幕| 潮喷失禁大喷水aⅴ无码| 欧美顶级毛片在线播放| 日韩欧美精品在线| 婷婷激情综合五月天| 日韩av超清在线观看| 亚洲一级二级在线| 亚洲黄色网址在线观看| a中文在线播放| 国产三级一区二区| 久久综合婷婷综合| 天堂在线视频观看| 成人污污视频在线观看| 亚洲直播在线一区| 国产男女裸体做爰爽爽| 麻豆91在线播放免费| 国产成人在线一区| 日韩欧美国产亚洲| 亚洲国产激情| 久久久久久久久久久91| 久久免费视频99| 悠悠资源网久久精品| 欧美激情视频网| 久久影院一区二区| 亚洲网址在线| 久久视频这里只有精品| 精品无码国产污污污免费网站| 亚洲欧美成人vr| 亚洲男子天堂网| av电影网站在线观看| 国产亚洲一区二区三区啪| 亚洲精品一区中文| 91成年人网站| 色天天久久综合婷婷女18| 在线国产精品视频| 岛国片在线免费观看| 婷婷亚洲五月色综合| 超碰91人人草人人干| 国产va在线播放| 激情综合自拍| 欧洲亚洲免费在线| 精品乱码一区内射人妻无码 | 欧美性猛交xxxx乱大交91| 91成人福利社区| 欧美r级在线观看| 国产精品一级黄片| 欧美日韩精品在线一区| 色婷婷综合成人av| 免费中文字幕在线观看| 一区二区国产精品| 国产精品6699| 99国产精品久久久久久久成人 | 国产偷倩在线播放| 欧美视频在线视频| 日本人视频jizz页码69| 国产精品99久久免费| 欧美成人精品3d动漫h| 国产视频久久久久久| 欧美精选视频在线观看| 久久国产精品电影| 中文字幕精品三级久久久| 男女性色大片免费观看一区二区| 91亚洲国产精品| 日色在线视频| 亚洲精品国产视频| 免费观看日韩毛片| 91麻豆精品一二三区在线| 亚洲国产成人在线视频| 欧美成人国产精品一区二区| 亚洲电影在线一区二区三区| 欧美自拍大量在线观看| 国产人妻精品一区二区三| 久久人人97超碰com| 成人午夜免费剧场| 午夜av成人| 亚洲成人精品av| 暗呦丨小u女国产精品| 亚洲一区二区三区四区五区午夜 | 国产口爆吞精一区二区| 97超碰欧美中文字幕| 国产高潮呻吟久久久| 中文字幕在线高清| 日韩欧美的一区二区| 日韩av片在线| 亚洲裸体俱乐部裸体舞表演av| 91精品国产综合久久久久久蜜臀| 天堂中文在线8| 亚洲综合在线免费观看| 欧美成人三级在线播放| 伊人久久大香线蕉综合网站| 欧美激情伊人电影| 国产一区二区女内射| 久久天天做天天爱综合色| 麻豆传媒网站在线观看| 另类一区二区| 亚洲一级免费视频| 在线能看的av| 日本女人黄色片| 亚洲伦理久久| 中文字幕亚洲欧美| 亚洲第一网站在线观看| 99久久婷婷国产综合精品电影| 制服诱惑一区| 欧美男男gaygay1069| 亚洲午夜未满十八勿入免费观看全集| 国产第一页在线播放| 国产麻豆9l精品三级站| 一本一生久久a久久精品综合蜜| 欧美一级大片| 亚洲美女性视频| 国产成人一级片| 91丝袜国产在线播放| 青青草视频在线免费播放| 91嫩草精品| 欧美精品久久久久久久| 黄色美女一级片| 亚洲国产视频a| 成人做爰www看视频软件| 一区二区亚洲| 久久久久网址| 成人美女视频| 亚洲午夜av久久乱码| 久久精品视频2| 欧美激情综合五月色丁香小说| 福利在线一区二区三区| 国产一区二区精品久| 国产精品18久久久久久麻辣| 福利在线观看| 欧美日韩国产高清一区二区三区 | 亚洲天堂网中文字| 亚洲精品视频三区| 欧美日本三区| 国模精品娜娜一二三区| 亚洲国产欧美日本视频| 伊人伊成久久人综合网站| 男人添女人下面高潮视频| 999精品视频在线观看| 欧美成年人在线观看| 国产高清第一页| 亚洲6080在线| av网站免费在线播放| 日本在线不卡一区| 正在播放91九色| 波多野结衣一区二区三区免费视频| 欧美极品少妇xxxxⅹ裸体艺术| 婷婷开心激情网| 欧美伊人久久久久久久久影院| 长河落日免费高清观看| 国产精品系列在线播放| 777777av| 欧洲grand老妇人| 97人人模人人爽人人喊38tv| 免费高潮视频95在线观看网站| 国产午夜精品视频| 亚洲av无码片一区二区三区| 精品久久久久久久中文字幕| 91视频免费看片| 粉嫩蜜臀av国产精品网站| 国产网站免费在线观看| 午夜激情久久| 精品久久久久久一区二区里番| 日韩精品影院| 欧美黑人一区二区三区| 国产污视频在线| 精品日本一线二线三线不卡| www.国产毛片| 亚洲综合色成人| 成人性生交大片免费看无遮挡aⅴ| 国产精品资源在线| 无码精品国产一区二区三区免费| 久久精品影视| 欧美一区二区视频在线| 日韩免费一级| 国产精品三级久久久久久电影| 成人性生交大片免费看网站| 中文字幕日韩专区| 三区在线观看| 精品日韩99亚洲| 91无套直看片红桃| 色综合久久中文综合久久牛| 麻豆国产尤物av尤物在线观看| 国产日韩欧美精品一区| 亚洲综合自拍网| 国产米奇在线777精品观看| 色婷婷综合久久久久中文字幕| 黄色日韩精品| 4444在线观看| 羞羞色午夜精品一区二区三区| 蜜桃av色综合| 欧美中文一区| www.av一区视频| 国产精品国产亚洲精品| 国产精品视频久久| 亚洲欧美电影| 97视频免费在线观看| 亚洲第一图区| 欧美成人一二三| 黄视频在线观看网站| 尤物精品国产第一福利三区| 全色精品综合影院| 日韩风俗一区 二区| 亚洲国产成人精品一区二区三区| 欧美日韩国产综合一区二区 | 欧美日韩一区在线观看视频| 精品一区二区男人吃奶| 国产传媒一区二区| 91成人午夜| 2022国产精品| 66精品视频在线观看| av免费观看久久| 日韩视频1区| 91九色对白| 亚洲va欧美va人人爽成人影院| 91社区国产高清| 疯狂欧洲av久久成人av电影| 成人激情电影一区二区| 成人国产精品入口免费视频| 国产精品27p| 99久久久国产精品免费调教网站| 国产精品激情av电影在线观看| 我爱我色成人网| 国产精品激情自拍| 欧美一区二区三区婷婷| 成人免费视频网| 日韩精品一区国产| 精品一卡二卡三卡四卡日本乱码| 露出调教综合另类| 欧美精品欧美精品| 欧美久久精品一级c片| 中文字幕一区二区三区最新| 亚洲国产一区二区三区在线播放| av磁力番号网| 狠狠综合久久| 国产免费黄色av| 久久一综合视频| 日韩肉感妇bbwbbwbbw| 久久超碰97人人做人人爱| 两性午夜免费视频| 成人午夜av在线| 美女脱光内衣内裤| 国产精品国产三级国产有无不卡| 成人免费毛片xxx| 亚洲成人精品一区二区| 极品国产91在线网站| 欧美久久一二区| 亚洲女同志亚洲女同女播放| 日韩电影中文字幕在线| 自拍视频在线免费观看| 欧美精品在线第一页| 9999热视频在线观看| 国产成人福利网站| 少妇高潮一区二区三区99| 国产91一区二区三区| 欧美激情在线精品一区二区三区| 亚州欧美一区三区三区在线| 欧美日韩视频一区二区三区| 欧美视频第一区| 国产酒店精品激情| 亚洲av综合一区二区| 亚洲少妇中出一区| 国产成人无码精品久在线观看| 欧美日韩一级片在线观看| 亚洲a视频在线观看| 亚洲片av在线| 欧美黑人猛交的在线视频| 国产成人在线一区| 国产精品白浆| 亚洲精品视频一区二区三区| 亚洲国产导航| 蜜桃福利午夜精品一区| 久久你懂得1024| 久久久久久久久久综合| 欧美性受极品xxxx喷水| 人妻少妇一区二区三区| 久久久电影免费观看完整版| 中文字幕在线免费观看视频| 99porn视频在线| 日韩国产综合| 成人免费在线小视频| 国产一区在线观看麻豆| 人妻少妇无码精品视频区| 午夜日韩在线观看| www国产在线| 色婷婷综合久久久久| 欧美电影h版| 精品国产乱码久久久久久丨区2区| 亚洲成人国产| 午夜激情av在线| 久久久久9999亚洲精品| 日韩手机在线观看| 日韩欧美色综合| 成年人黄视频在线观看| 国产精品美女网站| 色综合综合网| 黑鬼大战白妞高潮喷白浆| 99久久精品国产一区| 中文字幕影音先锋| 欧美亚洲禁片免费| 欧美挠脚心网站| 欧美亚洲另类在线| 久久动漫网址| 中文字幕无码精品亚洲资源网久久| 国产精品一区久久久久| 中国一级片在线观看| 欧美日韩精品一区二区| 国产黄色免费在线观看| 日本中文字幕成人| 国产伦精品一区二区三区视频 | 日韩国产中文字幕| 国产无遮挡裸体视频在线观看| 99久久久精品免费观看国产| 欧美一区二区三区免费看| 在线观看中文av| 一区二区理论电影在线观看| 国产sm主人调教女m视频| 九九精品在线播放| 亚洲va欧美va人人爽成人影院| 人妻激情另类乱人伦人妻| 国产不卡视频在线播放| 久草视频免费在线| 亚洲成人三级在线| 中文在线免费视频| 日本欧洲国产一区二区| 蜜桃传媒麻豆第一区在线观看| 中国1级黄色片| 777精品伊人久久久久大香线蕉| 蜜桃视频在线观看免费视频网站www| 成人免费视频97| 狠狠色丁香久久综合频道 | 国产精品国产三级国产三级人妇 | 国产情侣在线视频| 日韩经典第一页| 日韩精品专区| 91免费网站视频| 福利一区在线观看| 婷婷激情五月网| 最近中文字幕mv在线一区二区三区四区| 日韩黄色三级| 欧美精品卡一卡二| 久久综合九色综合欧美98| 看黄色一级大片| 久青草国产97香蕉在线视频| 国产精品久av福利在线观看| 女人另类性混交zo| 最新国产の精品合集bt伙计| 高清国产mv在线观看| 7m精品福利视频导航| 成人羞羞网站入口免费| 国产伦精品一区二区三区妓女下载| 亚洲国产视频a| 在线日本中文字幕| 国产高清一区二区三区| 日韩精品一二三| 久草成人在线视频| 国产亚洲福利一区| 最新国产精品精品视频| 男女av免费观看| 亚洲女与黑人做爰| 天堂中文在线资| 亚洲一区二区三| 国产日韩一区二区三区在线播放| 亚洲午夜精品久久久久久高潮| 日韩一级成人av| 欧美影视资讯| 日韩a级在线观看| 国产精品乱码人人做人人爱 | 久久综合中文字幕| 国产精品免费无遮挡| 2021国产精品视频| 伊人成综合网| 亚洲图片另类小说| 亚洲二区中文字幕| 97久久中文字幕| 日韩一级免费在线观看|