日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python面试必须要看的15个问题

發布時間:2024/7/5 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python面试必须要看的15个问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題1

到底什么是Python?你可以在回答中與其他技術進行對比(也鼓勵這樣做)。

答案

下面是一些關鍵點:

  • Python是一種解釋型語言。這就是說,與C語言和C的衍生語言不同,Python代碼在運行之前不需要編譯。其他解釋型語言還包括PHP和Ruby。
  • Python是動態類型語言,指的是你在聲明變量時,不需要說明變量的類型。你可以直接編寫類似x=111和x="I'm a string"這樣的代碼,程序不會報錯。
  • Python非常適合面向對象的編程(OOP),因為它支持通過組合(composition)與繼承(inheritance)的方式定義類(class)。Python中沒有訪問說明符(access specifier,類似C++中的public和private),這么設計的依據是“大家都是成年人了”。
  • 在Python語言中,函數是第一類對象(first-class objects)。這指的是它們可以被指定給變量,函數既能返回函數類型,也可以接受函數作為輸入。類(class)也是第一類對象。
  • Python代碼編寫快,但是運行速度比編譯語言通常要慢。好在Python允許加入基于C語言編寫的擴展,因此我們能夠優化代碼,消除瓶頸,這點通常是可以實現的。numpy就是一個很好地例子,它的運行速度真的非常快,因為很多算術運算其實并不是通過Python實現的。
  • Python用途非常廣泛——網絡應用,自動化,科學建模,大數據應用,等等。它也常被用作“膠水語言”,幫助其他語言和組件改善運行狀況。
  • Python讓困難的事情變得容易,因此程序員可以專注于算法和數據結構的設計,而不用處理底層的細節。

為什么提這個問題

如果你應聘的是一個Python開發崗位,你就應該知道這是門什么樣的語言,以及它為什么這么酷。以及它哪里不好。

問題2

補充缺失的代碼

def print_directory_contents(sPath):""" 這個函數接受文件夾的名稱作為輸入參數, 返回該文件夾中文件的路徑, 以及其包含文件夾中文件的路徑。 """ # 補充代碼

答案

def print_directory_contents(sPath):import os for sChild in os.listdir(sPath): sChildPath = os.path.join(sPath,sChild) if os.path.isdir(sChildPath): print_directory_contents(sChildPath) else: print sChildPath

特別要注意以下幾點:

  • 命名規范要統一。如果樣本代碼中能夠看出命名規范,遵循其已有的規范。
  • 遞歸函數需要遞歸并終止。確保你明白其中的原理,否則你將面臨無休無止的調用棧(callstack)。
  • 我們使用os模塊與操作系統進行交互,同時做到交互方式是可以跨平臺的。你可以把代碼寫成sChildPath = sPath + '/' + sChild,但是這個在Windows系統上會出錯。
  • 熟悉基礎模塊是非常有價值的,但是別想破腦袋都背下來,記住Google是你工作中的良師益友。
  • 如果你不明白代碼的預期功能,就大膽提問。
  • 堅持KISS原則!保持簡單,不過腦子就能懂!

為什么提這個問題

  • 說明面試者對與操作系統交互的基礎知識
  • 遞歸真是太好用啦

問題3

閱讀下面的代碼,寫出A0,A1至An的最終值。

A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5))) A1 = range(10) A2 = [i for i in A1 if i in A0] A3 = [A0[s] for s in A0] A4 = [i for i in A1 if i in A3] A5 = {i:i*i for i in A1} A6 = [[i,i*i] for i in A1]

答案

A0 = {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4} A1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] A2 = [] A3 = [1, 3, 2, 5, 4] A4 = [1, 2, 3, 4, 5] A5 = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81} A6 = [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]

為什么提這個問題

  • 列表解析(list comprehension)十分節約時間,對很多人來說也是一個大的學習障礙。
  • 如果你讀懂了這些代碼,就很可能可以寫下正確地值。
  • 其中部分代碼故意寫的怪怪的。因為你共事的人之中也會有怪人。

問題4

Python和多線程(multi-threading)。這是個好主意碼?列舉一些讓Python代碼以并行方式運行的方法。

答案

Python并不支持真正意義上的多線程。Python中提供了多線程包,但是如果你想通過多線程提高代碼的速度,使用多線程包并不是個好主意。Python中有一個被稱為Global Interpreter Lock(GIL)的東西,它會確保任何時候你的多個線程中,只有一個被執行。線程的執行速度非常之快,會讓你誤以為線程是并行執行的,但是實際上都是輪流執行。經過GIL這一道關卡處理,會增加執行的開銷。這意味著,如果你想提高代碼的運行速度,使用threading包并不是一個很好的方法。

不過還是有很多理由促使我們使用threading包的。如果你想同時執行一些任務,而且不考慮效率問題,那么使用這個包是完全沒問題的,而且也很方便。但是大部分情況下,并不是這么一回事,你會希望把多線程的部分外包給操作系統完成(通過開啟多個進程),或者是某些調用你的Python代碼的外部程序(例如Spark或Hadoop),又或者是你的Python代碼調用的其他代碼(例如,你可以在Python中調用C函數,用于處理開銷較大的多線程工作)。

為什么提這個問題

因為GIL就是個混賬東西(A-hole)。很多人花費大量的時間,試圖尋找自己多線程代碼中的瓶頸,直到他們明白GIL的存在。

問題5

你如何管理不同版本的代碼?

答案

版本管理!被問到這個問題的時候,你應該要表現得很興奮,甚至告訴他們你是如何使用Git(或是其他你最喜歡的工具)追蹤自己和奶奶的書信往來。我偏向于使用Git作為版本控制系統(VCS),但還有其他的選擇,比如subversion(SVN)。

為什么提這個問題

因為沒有版本控制的代碼,就像沒有杯子的咖啡。有時候我們需要寫一些一次性的、可以隨手扔掉的腳本,這種情況下不作版本控制沒關系。但是如果你面對的是大量的代碼,使用版本控制系統是有利的。版本控制能夠幫你追蹤誰對代碼庫做了什么操作;發現新引入了什么bug;管理你的軟件的不同版本和發行版;在團隊成員中分享源代碼;部署及其他自動化處理。它能讓你回滾到出現問題之前的版本,單憑這點就特別棒了。還有其他的好功能。怎么一個棒字了得!

問題6

下面代碼會輸出什么:

def f(x,l=[]): for i in range(x): l.append(i*i) print l f(2) f(3,[3,2,1]) f(3)

答案

[0, 1] [3, 2, 1, 0, 1, 4] [0, 1, 0, 1, 4]

呃?

第一個函數調用十分明顯,for循環先后將0和1添加至了空列表l中。l是變量的名字,指向內存中存儲的一個列表。第二個函數調用在一塊新的內存中創建了新的列表。l這時指向了新生成的列表。之后再往新列表中添加0、1、2和4。很棒吧。第三個函數調用的結果就有些奇怪了。它使用了之前內存地址中存儲的舊列表。這就是為什么它的前兩個元素是0和1了。

不明白的話就試著運行下面的代碼吧:

l_mem = []l = l_mem # the first call for i in range(2): l.append(i*i) print l # [0, 1] l = [3,2,1] # the second call for i in range(3): l.append(i*i) print l # [3, 2, 1, 0, 1, 4] l = l_mem # the third call for i in range(3): l.append(i*i) print l # [0, 1, 0, 1, 4]

問題7

“猴子補丁”(monkey patching)指的是什么?這種做法好嗎?

答案

“猴子補丁”就是指,在函數或對象已經定義之后,再去改變它們的行為。

舉個例子:

import datetime datetime.datetime.now = lambda: datetime.datetime(2012, 12, 12)

大部分情況下,這是種很不好的做法 - 因為函數在代碼庫中的行為最好是都保持一致。打“猴子補丁”的原因可能是為了測試。mock包對實現這個目的很有幫助。

為什么提這個問題

答對這個問題說明你對單元測試的方法有一定了解。你如果提到要避免“猴子補丁”,可以說明你不是那種喜歡花里胡哨代碼的程序員(公司里就有這種人,跟他們共事真是糟糕透了),而是更注重可維護性。還記得KISS原則碼?答對這個問題還說明你明白一些Python底層運作的方式,函數實際是如何存儲、調用等等。

另外:如果你沒讀過mock模塊的話,真的值得花時間讀一讀。這個模塊非常有用。

問題8

這兩個參數是什么意思:*args,**kwargs?我們為什么要使用它們?

答案

如果我們不確定要往函數中傳入多少個參數,或者我們想往函數中以列表和元組的形式傳參數時,那就使要用*args;如果我們不知道要往函數中傳入多少個關鍵詞參數,或者想傳入字典的值作為關鍵詞參數時,那就要使用**kwargs。args和kwargs這兩個標識符是約定俗成的用法,你當然還可以用*bob和**billy,但是這樣就并不太妥。

下面是具體的示例:

def f(*args,**kwargs): print args, kwargs l = [1,2,3] t = (4,5,6) d = {'a':7,'b':8,'c':9} f() f(1,2,3) # (1, 2, 3) {} f(1,2,3,"groovy") # (1, 2, 3, 'groovy') {} f(a=1,b=2,c=3) # () {'a': 1, 'c': 3, 'b': 2} f(a=1,b=2,c=3,zzz="hi") # () {'a': 1, 'c': 3, 'b': 2, 'zzz': 'hi'} f(1,2,3,a=1,b=2,c=3) # (1, 2, 3) {'a': 1, 'c': 3, 'b': 2} f(*l,**d) # (1, 2, 3) {'a': 7, 'c': 9, 'b': 8} f(*t,**d) # (4, 5, 6) {'a': 7, 'c': 9, 'b': 8} f(1,2,*t) # (1, 2, 4, 5, 6) {} f(q="winning",**d) # () {'a': 7, 'q': 'winning', 'c': 9, 'b': 8} f(1,2,*t,q="winning",**d) # (1, 2, 4, 5, 6) {'a': 7, 'q': 'winning', 'c': 9, 'b': 8} def f2(arg1,arg2,*args,**kwargs): print arg1,arg2, args, kwargs f2(1,2,3) # 1 2 (3,) {} f2(1,2,3,"groovy") # 1 2 (3, 'groovy') {} f2(arg1=1,arg2=2,c=3) # 1 2 () {'c': 3} f2(arg1=1,arg2=2,c=3,zzz="hi") # 1 2 () {'c': 3, 'zzz': 'hi'}

為什么提這個問題

有時候,我們需要往函數中傳入未知個數的參數或關鍵詞參數。有時候,我們也希望把參數或關鍵詞參數儲存起來,以備以后使用。有時候,僅僅是為了節省時間。

問題9

下面這些是什么意思:@classmethod,?@staticmethod,?@property?

回答背景知識

這些都是裝飾器(decorator)。裝飾器是一種特殊的函數,要么接受函數作為輸入參數,并返回一個函數,要么接受一個類作為輸入參數,并返回一個類。@標記是語法糖(syntactic sugar),可以讓你以簡單易讀得方式裝飾目標對象。

@my_decorator def my_func(stuff): do_things Is equivalent to def my_func(stuff): do_things my_func = my_decorator(my_func)

你可以在本網站上找到介紹裝飾器工作原理的教材。

真正的答案

@classmethod,?@staticmethod和@property這三個裝飾器的使用對象是在類中定義的函數。下面的例子展示了它們的用法和行為:

class MyClass(object):def __init__(self): self._some_property = "properties are nice" self._some_other_property = "VERY nice" def normal_method(*args,**kwargs): print "calling normal_method({0},{1})".format(args,kwargs) @classmethod def class_method(*args,**kwargs): print "calling class_method({0},{1})".format(args,kwargs) @staticmethod def static_method(*args,**kwargs): print "calling static_method({0},{1})".format(args,kwargs) @property def some_property(self,*args,**kwargs): print "calling some_property getter({0},{1},{2})".format(self,args,kwargs) return self._some_property @some_property.setter def some_property(self,*args,**kwargs): print "calling some_property setter({0},{1},{2})".format(self,args,kwargs) self._some_property = args[0] @property def some_other_property(self,*args,**kwargs): print "calling some_other_property getter({0},{1},{2})".format(self,args,kwargs) return self._some_other_property o = MyClass() # 未裝飾的方法還是正常的行為方式,需要當前的類實例(self)作為第一個參數。 o.normal_method # <bound method MyClass.normal_method of <__main__.MyClass instance at 0x7fdd2537ea28>> o.normal_method() # normal_method((<__main__.MyClass instance at 0x7fdd2537ea28>,),{}) o.normal_method(1,2,x=3,y=4) # normal_method((<__main__.MyClass instance at 0x7fdd2537ea28>, 1, 2),{'y': 4, 'x': 3}) # 類方法的第一個參數永遠是該類 o.class_method # <bound method classobj.class_method of <class __main__.MyClass at 0x7fdd2536a390>> o.class_method() # class_method((<class __main__.MyClass at 0x7fdd2536a390>,),{}) o.class_method(1,2,x=3,y=4) # class_method((<class __main__.MyClass at 0x7fdd2536a390>, 1, 2),{'y': 4, 'x': 3}) # 靜態方法(static method)中除了你調用時傳入的參數以外,沒有其他的參數。 o.static_method # <function static_method at 0x7fdd25375848> o.static_method() # static_method((),{}) o.static_method(1,2,x=3,y=4) # static_method((1, 2),{'y': 4, 'x': 3}) # @property是實現getter和setter方法的一種方式。直接調用它們是錯誤的。 # “只讀”屬性可以通過只定義getter方法,不定義setter方法實現。 o.some_property # 調用some_property的getter(<__main__.MyClass instance at 0x7fb2b70877e8>,(),{}) # 'properties are nice'

問題10

閱讀下面的代碼,它的輸出結果是什么?

class A(object):def go(self): print "go A go!" def stop(self): print "stop A stop!" def pause(self): raise Exception("Not Implemented") class B(A): def go(self): super(B, self).go() print "go B go!" class C(A): def go(self): super(C, self).go() print "go C go!" def stop(self): super(C, self).stop() print "stop C stop!" class D(B,C): def go(self): super(D, self).go() print "go D go!" def stop(self): super(D, self).stop() print "stop D stop!" def pause(self): print "wait D wait!" class E(B,C): pass a = A() b = B() c = C() d = D() e = E() # 說明下列代碼的輸出結果 a.go() b.go() c.go() d.go() e.go() a.stop() b.stop() c.stop() d.stop() e.stop() a.pause() b.pause() c.pause() d.pause() e.pause()

答案

輸出結果以注釋的形式表示:

a.go() # go A go!b.go() # go A go! # go B go! c.go() # go A go! # go C go! d.go() # go A go! # go C go! # go B go! # go D go! e.go() # go A go! # go C go! # go B go! a.stop() # stop A stop! b.stop() # stop A stop! c.stop() # stop A stop! # stop C stop! d.stop() # stop A stop! # stop C stop! # stop D stop! e.stop() # stop A stop! a.pause() # ... Exception: Not Implemented b.pause() # ... Exception: Not Implemented c.pause() # ... Exception: Not Implemented d.pause() # wait D wait! e.pause() # ...Exception: Not Implemented

為什么提這個問題

因為面向對象的編程真的真的很重要。不騙你。答對這道問題說明你理解了繼承和Python中super函數的用法。

問題11

閱讀下面的代碼,它的輸出結果是什么?

class Node(object):def __init__(self,sName): self._lChildren = [] self.sName = sName def __repr__(self): return "<Node '{}'>".format(self.sName) def append(self,*args,**kwargs): self._lChildren.append(*args,**kwargs) def print_all_1(self): print self for oChild in self._lChildren: oChild.print_all_1() def print_all_2(self): def gen(o): lAll = [o,] while lAll: oNext = lAll.pop(0) lAll.extend(oNext._lChildren) yield oNext for oNode in gen(self): print oNode oRoot = Node("root") oChild1 = Node("child1") oChild2 = Node("child2") oChild3 = Node("child3") oChild4 = Node("child4") oChild5 = Node("child5") oChild6 = Node("child6") oChild7 = Node("child7") oChild8 = Node("child8") oChild9 = Node("child9") oChild10 = Node("child10") oRoot.append(oChild1) oRoot.append(oChild2) oRoot.append(oChild3) oChild1.append(oChild4) oChild1.append(oChild5) oChild2.append(oChild6) oChild4.append(oChild7) oChild3.append(oChild8) oChild3.append(oChild9) oChild6.append(oChild10) # 說明下面代碼的輸出結果 oRoot.print_all_1()

答案

oRoot.print_all_1()會打印下面的結果:

<Node 'root'> <Node 'child1'> <Node 'child4'> <Node 'child7'> <Node 'child5'> <Node 'child2'> <Node 'child6'> <Node 'child10'> <Node 'child3'> <Node 'child8'> <Node 'child9'>

oRoot.print_all_1()會打印下面的結果:

<Node 'root'> <Node 'child1'> <Node 'child2'> <Node 'child3'> <Node 'child4'> <Node 'child5'> <Node 'child6'> <Node 'child8'> <Node 'child9'> <Node 'child7'> <Node 'child10'>

為什么提這個問題

因為對象的精髓就在于組合(composition)與對象構造(object construction)。對象需要有組合成分構成,而且得以某種方式初始化。這里也涉及到遞歸和生成器(generator)的使用。

生成器是很棒的數據類型。你可以只通過構造一個很長的列表,然后打印列表的內容,就可以取得與print_all_2類似的功能。生成器還有一個好處,就是不用占據很多內存。

有一點還值得指出,就是print_all_1會以深度優先(depth-first)的方式遍歷樹(tree),而print_all_2則是寬度優先(width-first)。有時候,一種遍歷方式比另一種更合適。但這要看你的應用的具體情況。

問題12

簡要描述Python的垃圾回收機制(garbage collection)。

答案

這里能說的很多。你應該提到下面幾個主要的點:

  • Python在內存中存儲了每個對象的引用計數(reference count)。如果計數值變成0,那么相應的對象就會小時,分配給該對象的內存就會釋放出來用作他用。
  • 偶爾也會出現引用循環(reference cycle)。垃圾回收器會定時尋找這個循環,并將其回收。舉個例子,假設有兩個對象o1和o2,而且符合o1.x == o2和o2.x == o1這兩個條件。如果o1和o2沒有其他代碼引用,那么它們就不應該繼續存在。但它們的引用計數都是1。
  • Python中使用了某些啟發式算法(heuristics)來加速垃圾回收。例如,越晚創建的對象更有可能被回收。對象被創建之后,垃圾回收器會分配它們所屬的代(generation)。每個對象都會被分配一個代,而被分配更年輕代的對象是優先被處理的。

問題13

將下面的函數按照執行效率高低排序。它們都接受由0至1之間的數字構成的列表作為輸入。這個列表可以很長。一個輸入列表的示例如下:[random.random() for i in range(100000)]。你如何證明自己的答案是正確的。

def f1(lIn):l1 = sorted(lIn) l2 = [i for i in l1 if i<0.5] return [i*i for i in l2] def f2(lIn): l1 = [i for i in lIn if i<0.5] l2 = sorted(l1) return [i*i for i in l2] def f3(lIn): l1 = [i*i for i in lIn] l2 = sorted(l1) return [i for i in l1 if i<(0.5*0.5)]

答案

按執行效率從高到低排列:f2、f1和f3。要證明這個答案是對的,你應該知道如何分析自己代碼的性能。Python中有一個很好的程序分析包,可以滿足這個需求。

import cProfile lIn = [random.random() for i in range(100000)] cProfile.run('f1(lIn)') cProfile.run('f2(lIn)') cProfile.run('f3(lIn)')

為了向大家進行完整地說明,下面我們給出上述分析代碼的輸出結果:

>>> cProfile.run('f1(lIn)') 4 function calls in 0.045 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.009 0.009 0.044 0.044 <stdin>:1(f1) 1 0.001 0.001 0.045 0.045 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 1 0.035 0.035 0.035 0.035 {sorted} >>> cProfile.run('f2(lIn)') 4 function calls in 0.024 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.008 0.008 0.023 0.023 <stdin>:1(f2) 1 0.001 0.001 0.024 0.024 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 1 0.016 0.016 0.016 0.016 {sorted} >>> cProfile.run('f3(lIn)') 4 function calls in 0.055 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.016 0.016 0.054 0.054 <stdin>:1(f3) 1 0.001 0.001 0.055 0.055 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 1 0.038 0.038 0.038 0.038 {sorted}

為什么提這個問題

定位并避免代碼瓶頸是非常有價值的技能。想要編寫許多高效的代碼,最終都要回答常識上來——在上面的例子中,如果列表較小的話,很明顯是先進行排序更快,因此如果你可以在排序前先進行篩選,那通常都是比較好的做法。其他不顯而易見的問題仍然可以通過恰當的工具來定位。因此了解這些工具是有好處的。

問題14

你有過失敗的經歷嗎?

錯誤的答案

我從來沒有失敗過!

為什么提這個問題

恰當地回答這個問題說明你用于承認錯誤,為自己的錯誤負責,并且能夠從錯誤中學習。如果你想變得對別人有幫助的話,所有這些都是特別重要的。如果你真的是個完人,那就太糟了,回答這個問題的時候你可能都有點創意了。

問題15

你有實施過個人項目嗎?

真的?

如果做過個人項目,這說明從更新自己的技能水平方面來看,你愿意比最低要求付出更多的努力。如果你有維護的個人項目,工作之外也堅持編碼,那么你的雇主就更可能把你視作為會增值的資產。即使他們不問這個問題,我也認為談談這個話題很有幫助。

總結

以上是生活随笔為你收集整理的Python面试必须要看的15个问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久精品国产亚洲AV成人婷婷 | 亚洲一区免费视频 | 激情免费av| 国产99久久久国产精品成人免费 | 亚洲国产网站 | 99国产精品久久久久久久久久久 | 激情网页 | 日韩一区二区三区四区五区六区 | 狠狠干夜夜草 | 人人妻人人澡人人爽精品欧美一区 | 免费观看黄色的网站 | 国产一级视频在线播放 | 人妻在线一区二区三区 | 国产69精品久久 | 国产欧美一区二区三区视频在线观看 | 中文字幕一区二区三区精品 | 亚洲影院在线 | 777精品久无码人妻蜜桃 | 福利电影一区二区 | 国产黄片毛片 | 国产成人传媒 | 天天夜碰日日摸日日澡性色av | 一级在线 | 青青久久久 | 人妻人人澡人人添人人爽 | 久久最新 | 久久久看| 五月婷婷丁香六月 | 亚洲天堂2021av| h视频免费在线观看 | 久久久国产视频 | 激情开心站 | 最新日韩在线视频 | 在线伊人 | av网在线播放 | 精品第一页| 色婷五月天 | 国产日韩一区二区在线 | 精品亚洲国产成人av制服丝袜 | 欧美一区不卡 | 欧美大片免费观看网址 | 四虎新网址 | 日韩欧美一区二区三区 | 成人精品综合 | 四虎永久免费 | 希岛婚前侵犯中文字幕在线 | 天堂视频一区 | 免费国产| 国产精品久久久不卡 | 毛片免费在线观看视频 | 国产一区免费视频 | 亚洲精品伦理 | 亚洲激情在线播放 | 色涩涩| 久久精选 | 国产99久久九九精品无码免费 | 乌克兰性极品xxxhd | 狠色综合| 日本视频黄 | 天天射天天爽 | 美女性高潮视频 | 奇米二区 | 国产精品久久久久久久久久久久久久久久久久 | 久久久久国产 | 久久香蕉综合 | 亚洲国产毛片aaaaa无费看 | 中文字幕一区二区三区人妻 | 国产三级小视频 | 天堂av在线网 | av无遮挡 | 欧美午夜精品一区二区 | 国产性猛交普通话对白 | 欧美激情影院 | 色在线影院 | 伊人成年网| 蜜臀国产AV天堂久久无码蜜臀 | 精品在线99 | 欧美少妇色图 | 精品欧美乱码久久久久久 | 欧美激情69 | 免费观看美女裸体网站 | 69精品无码成人久久久久久 | 九色国产 | 精品一级少妇久久久久久久 | 亚洲欧洲免费 | 深爱激情av| 奇米色777 | 在线免费观看黄视频 | 中文字幕精品视频在线观看 | 四虎久久 | 激情文学8888 | 日本不卡一区二区三区在线观看 | 国产青青在线 | 一区二区三区欧美精品 | 极品国产在线 | 国产刺激对白 | 免费播放黄色片 | 小镇姑娘国语版在线观看免费 | 日韩视频中文字幕在线观看 |