3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

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

python

python123动物重量排序_python进阶

發布時間:2025/3/8 python 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python123动物重量排序_python进阶 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

面向對象oopclass Student(object):

def __init__(self,name,score)

self.name = name

self.score = score

def print_score(self)

print('%s: %s' % (self.name,self.score))

給對象發消息實際上就是調用對象對應的關聯函數,我們稱之為對象的方法(Method)。面向對象的程序寫出來就像這樣:

bart = Student(‘zhangyuang’,90)

lisa = Student(‘janvier’,90)

bart.print_score()

lisa.print_score()

類和實例class Student(object):

pass

class后面緊接著是類名,即Student,類名通常是大寫開頭的單詞,緊接著是(object),表示該類是從哪個類繼承下來的,繼承的概念一行再講。通常,如果沒有合適的繼承類,就使用object類,這是所有類最終都會繼承的類。

定義好了Student類,就可以根據Student類創建出Student的實例,創建實例是通過類名+()實現

>>> bart = Student()

>>> bart

>>> Studeng

可以看到,變量bart指向的就是一個Student的實例,后面的0x10a67a590

是內存地址,每個object的地址都不一樣,而Student本身則是一個類。

可以自由的給一個實例變量綁定屬性

>>> bart.name = 'zhangyuang'

>>> bart.name

'zhangyuang'

由于類可以起到模版的作用,因此在創建實例的時候,把一些我們認為必須綁定的屬性強制天蝎進去。通過定義一個特殊的init方法,在創建實例的時候,就把name,score等屬性綁上去:

>>> class Student(object):

def __init__(self,name,score):

self.name = name

self.score = score

注意到init方法的第一個參數永遠是self.表示創建的實例本身,因此,在init方法內部,就可以把各種屬性綁定到self,因為self就指向創建的實例本身。

有了init方法,在創建實例的時候,就不能傳入空的參數了,必須傳入與init方法匹配的參數,但self不需要傳,Python解釋器自己會把實例變量傳進去:

>>> bart = Student('zhangyuang','90')

>>> bart.name

'zhangyuang'

>>> bart.score

90

數據封裝

面向對象編程的一個重要特點就是數據封裝。在上面的Student類中,每個實例就擁有各自的name和score這些數據。我們可以通過函數來訪問這些數據,比如打印一個學生的成績:

>>> def print_score(std):

print('%s: %s' % (std.name,std.score))

>>> print_score(bart)

zhangyuang:90

但是既然Student實例本身就擁有這些數據,要訪問這些數據就沒有必要從外面的函數去訪問,可以直接在Student類的內部定義訪問數據的函數,這樣,就把“數據”給封裝起來了。這些封裝數據的函數是和Student類本身是關聯起來的,我們稱之為類的方法:

class Student(object):

def init(self,name,score):

self.name = name

self.score = score

def print_score(self):

print(‘%s: %s’ % (self.name,self.score))

要定義一個方法,除了第一個參數是self外,其他和普通函數一樣。要調用一個方法,只需要在實例變量上直接調用,除了self不用傳遞,其他參數正常傳入。

>>> bart.print_score()

zhangyuang: 90

封裝的另一個好處是可以給Student類增加新的方法,比如get_grade:

class Student(object):

def get_grade(self):

if self.score >= 90:

return ‘a’

elif self .score >= 60:

return ‘b’

else:

return ‘c’

>>>bart.get_grade()

'c'

訪問限制

如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加兩個下劃線,在python中,實例的變量名如果以開頭就變成了一個私有變量(private),只有內部可以訪問,外部不能訪問。

class Student(object):

def init(self,name,score):

self.name = name

self.score = score

def print_score(self):

print(‘%s: %s’ % (self.name,self.score))

改完后,對于外部代碼來說,沒什么變動但是已經無法從外部訪問實例變量.name和實例變量.score了

>>> bart = Student('zhangyuang',90)

>>> bart.__name

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'Student' object has no attribute '__name'

這樣就確保了外部代碼不能隨意修改對象內部的狀態,這樣通過訪問限制的保護,代碼更加健壯。如果外部代碼要獲取name和score怎么辦?可以給Student類增加get_name和get_score這樣的方法

class Student(object):

def get_name(self):

return self.name

def get_score(self)

return self.score

如果又要允許外部代碼修改score怎么辦?可以再給Student類增加set_score方法:

class Student(object):

def set_score(self,score):

self.score = score

你也許會問,原先那種直接通過bart.score = 59也可以修改啊,為什么要定義一個方法大費周折?因為在方法中,可以對參數做檢查,避免傳入無效的參數:

class Student(object):

def set_score(self,score):

if 0<=score<=100:

self.score = score

else:

raise ValueError(‘bad score’)

需要注意的是,在Python中,變量名類似xxx的,也就是以雙下劃線開頭,并且以雙下劃線結尾的,是特殊變量,特殊變量是可以直接訪問的,不是private變量,所以,不能用name、score這樣的變量名。

有些時候,你會看到以一個下劃線開頭的實例變量名,比如_name,這樣的實例變量外部是可以訪問的,但是,按照約定俗成的規定,當你看到這樣的變量時,意思就是,“雖然我可以被訪問,但是,請把我視為私有變量,不要隨意訪問”。

繼承和多態

在OOP程序設計中,當我們定義一個class的時候,可以從某個現有的class繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。

比如,我們已經編寫了一個名為Animal的class,有一個run()方法可以直接打印:

class Animal(object):

def run(self):

print(‘Animal is running’)

當我們需要編寫Dog和Cat類時,就可以直接從Animal繼承:

class Dog(Animal):

pass

class Cat(Animal):

pass

對于Dog來說,Animal就是它的父類,對于Animal來說,Dog就是它的子類。cat和Dog類似。

繼承有什么好處?最大的好處是子嘞獲得了父類的全部功能。由于Animal實現了run()方法,因此Dog Cat作為它的子類,什么事也沒干就擁有了run()方法。

dog = Dog()

dog.run()

cat = Cat()

cat.run()

Animal is running

當然也可以對子類增加一些方法,

class Dog(Animal):

def run(self):

print(‘dog is running’)

def eat(slef)

print(‘eating meat’)

繼承的第二個好處需要我們對代碼做一點改進。你看到了,無論是dog還是cat它們run()的時候,顯示的都是Animal is running 符合邏輯的做法是分別顯示dog is running 和 cat is running因此對Dog類和Cat類做如下改進

class Dog(Animal):

def run(self):

print('Dog is running...')

class Cat(Animal):

def run(self):

print('Cat is running...')

當子類和父類都存在相同的run()方法時,我們說,子類的run()覆蓋了父類的run(),在代碼運行的時候,總是會調用子類的run()。這樣,我們就獲得了繼承的另一個好處:多態。

要理解什么是多態,我們首先要對數據類型再作一點說明。當我們定義一個class的時候,我們實際上就定義了一種數據類型。我們定義的數據類型和Python自帶的數據類型,比如str、list、dict沒什么兩樣:

a = list() # a是list類型

b = Animal() # b是Animal類型

c = Dog() # 是Dog類型

判斷一個變量是否是某個類型可以用istance()判斷

>>> isintance(a,list)

True

>>> isinstance(b,Animal)

True

>>> isinstance(c,Dog)

True

>>> isinstance(c,Animal)

True

看來b不僅是Dog類型還是Animal類型

>>> b =Animal()

>>> isinstance(b,Dog)

False

Dog可以看成Animal,但Animal不可以看成Dog

要理解多態的好處,我們還需要再編寫一個函數,這個函數接受一個Animal類型的變量

def run_twice(animal):

animal.run()

animal.run()

當我們傳入Animal的實例時,run_twice()就打印出:

>>> run_twice(Animal())

Animal is running...

Animal is running...

當我們傳入Dog的實例時,run_twice()就打印出:

>>> run_twice(Dog())

Dog is running...

Dog is running...

當我們傳入Cat的實例時,run_twice()就打印出:

>>> run_twice(Cat())

Cat is running...

Cat is running...

看上去沒啥意思,但是仔細想想,現在,如果我們再定義一個Tortoise類型,也從Animal派生: class Tortoise(Animal):

def run(self):

print(‘tortoise is running’)

當我們調用run_twice()時,傳入Tortoise的實例:

>>> run_twice(Tortoise())

Tortoise is running slowly...

Tortoise is running slowly...

你會發現,新增一個Animal的子類,不必對run_twice()做任何修改,實際上,任何依賴Animal作為參數的函數或者方法都可以不加修改地正常運行,原因就在于多態。

多態的好處就是,當我們需要傳入Dog、Cat、Tortoise……時,我們只需要接收Animal類型就可以了,因為Dog、Cat、Tortoise……都是Animal類型,然后,按照Animal類型進行操作即可。由于Animal類型有run()方法,因此,傳入的任意類型,只要是Animal類或者子類,就會自動調用實際類型的run()方法,這就是多態的意思:

對于一個變量,我們只需要知道它是Animal類型,無需確切地知道它的子類型,就可以放心地調用run()方法,而具體調用的run()方法是作用在Animal、Dog、Cat還是Tortoise對象上,由運行時該對象的確切類型決定,這就是多態真正的威力:調用方只管調用,不管細節,而當我們新增一種Animal的子類時,只要確保run()方法編寫正確,不用管原來的代碼是如何調用的。這就是著名的“開閉”原則:

靜態語言 vs 動態語言

對于靜態語言(例如Java)來說,如果需要傳入Animal類型,則傳入的對象必須是Animal類型或者它的子類,否則,將無法調用run()方法。

對于Python這樣的動態語言來說,則不一定需要傳入Animal類型。我們只需要保證傳入的對象有一個run()方法就可以了:

class Timer(object):

def run(self):

print('Start...')

這就是動態語言的“鴨子類型”,它并不要求嚴格的繼承體系,一個對象只要“看起來像鴨子,走起路來像鴨子”,那它就可以被看做是鴨子。

Python的“file-like object“就是一種鴨子類型。對真正的文件對象,它有一個read()方法,返回其內容。但是,許多對象,只要有read()方法,都被視為“file-like object“。許多函數接收的參數就是“file-like object“,你不一定要傳入真正的文件對象,完全可以傳入任何實現了read()方法的對象。

獲取對象的信息

使用type()

判斷對象類型,使用type()函數

基本類型都可以用type()

>>> type(123)

>>> type('str')

>>> type(None)

如果一個變量指向函數或者類,也可以用type()判斷

>>> type(abs)

>>> type(a)

但是type()函數返回的是什么類型呢?它返回對應的Class類型。如果我們要在if語句中判斷,就需要比較兩個變量的type類型是否相同

>>> type(123) == type(456)

True

>>> type(123) == int

True

>>> type('abc') = type('123')

True

>>> type('abc') == str

True

>>> type('abc') == type(123)

False

判斷基本數據類型可以直接寫int,str等,但如果要判斷一個對象是否是函數怎么辦?可以使用types模塊中定義的常量

>>> import types

>>> def fn():

pass

>>> type(fn) == types.FunctionType

True

>>> type(abs) == type.BuiltinFunctionType

True

>>> type(lambda x:x) == type.LambdaType

True

>>> type((x for x in range(10))) == types.GeneratorType

True

使用isinstance()

對于class的繼承關系來說,使用type()就很不方便。我們要判斷class的類型可以使用isinstance()函數

我們回顧上次的例子,如果繼承關系是:

object->Animal->Dog->Husky

那么,isinstance()就可以告訴我們一個對象是否是某種類型。先創建3種類型的對象。

>>> a = Animal()

>>> d= Dog()

>>> h = Husky()

然后,判斷:

>>> isinstance(h,Husky)

True

>>> isinstance(h,Dog)

True

h雖然自身是Husky類型,但由于Husky是從Dog繼承襲來的,所以h也還是Dog類型。換句話說,isinstance()判斷的是一個對象是否是該類型本身,或者位于該類型的父繼承鏈上。

并且還可以判斷一個變量是否是某些類型中的一種,比如下面的代碼就可以判斷是否是list或者tuple:

>>> isinstance([1,2,3],(list,tuple))

True

>>> isinstance((1,2,3),(list,tuple))

True

使用dir()

如果要獲得一個對象的所有屬性和方法,可以使用dir()函數,它返回一個包含字符串的list,比如,獲得一個str對象的所有屬性和方法:

>>> dir('ABC')

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

類似xxx的屬性和方法在Python中都是有特殊用途的,比如len方法返回長度。在Python中,如果你調用len()函數試圖獲取一個對象的長度,實際上,在len()函數內部,它自動去調用該對象的len()方法,所以,下面的代碼是等價的:

>>> len('abc')

3

>>> 'abc'.__len__()

3

我們自己寫的類如果也想用len(obj)的話,就自己寫一個len()方法

>>> class MyDog(object):

def __len__(self):

return 100

dog = myDog()

len(dog)

100

剩下的都是普通屬性或方法,比如lower()返回小寫的字符串

>>> 'ABC'.low()

'abc'

僅僅把屬性和方法列出來是不夠的,配合getattr(),setattr()以及hasattr()我們可以直接操作一個對象的狀態

>>> class MyObject(object):

def __init__(self)

self.x = 9

def power(self):

return self.x * self .x

>>> obj = MyObject()

緊接著可以測試該對象的屬性

>>> hasattr('obj','x') # 有屬性'x'嗎

True

>>> obj.x

9

>>> hasattr(obj,'y') # 有屬性'y'嗎

False

>>> setattr(obj,'y',19) # 設置屬性'y'

>>> hasattr(obj,'y') # 有屬性'y'嗎

True

>>> getattr(obj,'y') # 獲取屬性'y'

19

>>> obj.y

19

可以傳入一個default參數,如果屬性不存在,就返回默認值:

>>> getattr(obj,'z',404) # 獲取屬性'z',如果不存在返回默認值404

404

也可以獲得對象的方法

>>> hasattr(obj,'power') # 有屬性'power'嗎

True

>>> getattr(obj,'power') # 獲取屬性'power'

>

>>> fn = getattr(obj,'power') # 獲取屬性'power'并復制到變量fn

>>> fn()

81

小結

通過內置的一系列函數,我們可以對任意一個Python對象進行剖析,拿到其內部的數據。要注意的是,只有在不知道對象信息的時候,我們才會去獲取對象信息。如果可以直接寫:

sum = obj.x + obj.y

就不要寫:

sum = getattr(obj, 'x') + getattr(obj, 'y')

一個正確的用法的例子如下:

def readImage(fp):

if hasattr(fp,’read’)

return readData(fp)

return None

假設我們希望從文件流fp中讀取圖像,我們首先要判斷fp對象是否存在read方法,如果存在,則該對象是一個流,如果不存在,則無法讀取。hasattr()就派上了用場。

請注意,在python這類動態語言中,根據鴨子類型有read()方法不代表該fp對象就是一個文件流,它也可能是網絡流,也可能是內存中的一個字節流,但只要read()方法返回的是有效的圖像數據,就不影響讀取圖像功能。

實例屬性和類屬性

由于python是動態語言,根據類創建的實例可以任意綁定屬性。

由給實例綁定屬性的方法是通過實例變量,或者通過self變量

class Student(object):

def init(self,name):

self.name = name

s = Student(‘zhangyuang’)

s.score = 90

但是,如果Student類本身需要綁定一個屬性呢?可以直接在class中定義屬性,這種屬性是類屬性。歸Student類所有:

class Student(object):

name = ‘Student’

當我們定義了一個類屬性后,這個屬性雖然歸類所有,但類的所有實例都可以訪問到。

>>> class Student(object):

name = 'Student'

>>> s = Student()

>>> print(s.name) # 因為實例并沒有name屬性,所以會繼續查找class的name屬性

Student

>>> print(Student.name)

Student

>>> s.name = 'zhangyuang'

>>> print(s.name)

zhangyuang

>>> print(Student.name)

Student

>>> del s.name

>>> print(s.name)

Student

從上面的例子可以看出,在編寫程序的時候,千萬不要把實例屬性和類屬性使用相同的名字,因為相同名稱的實例屬性將屏蔽掉類屬性,但是當你刪除實例屬性后,再使用相同的名稱,訪問到的將是類屬性。

使用slots

正常情況下,當我們定義了一個class創建了一個class的實例后,我們可以給該實例綁定任何屬性和方法。

class Student(object):

pass

然后嘗試給實例綁定一個屬性:

>>> s = Student()

>>> s.name = 'zhangyuang'

>>> print(s.name)

zhangyuang

還可以嘗試給實例綁定一個方法:

>>> def set_age(self,age):

self.age = age

>>> from types import MethodType

>>> s.set_age = MethodType(set_age,s)

>>> s.set_age(19)

>>> s.age

25

但是,給一個實例綁定的方法,對另一個實例是不起作用的:

>>> s2 = Student()

>>> s2.set_age(19)

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'Student' object has no attribute 'set_age'

為了給所有實例都綁定方法,可以給class綁定方法

>>> def set_score(self,score):

self.score = score

>>> Student.set_score = set_score

通常情況下,上面的set_score方法可以直接定義在class中,但動態綁定允許我們在程序運行的過程中動態給class加上功能,這在靜態語言中很難實現。

使用slots

但是,如果我們想要限制實例的屬性怎么辦?比如,只允許對Student實例添加name和age屬性

為了達到限制目的,python允許在定義class的時候定義一個特殊的slots變量,來限制該class實例能添加的屬性 class Student(object):

slots = (‘name’,’age’)

然后我們試試

>>> s = Student()

>>> s.name = 'zhangyuang'

>>> s.age = 19

>>> s.score = 90

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'Student' object has no attribute 'score'

由于’score’沒有被放到slots中,所以不能綁定score屬性,試圖綁定score將得到AttributeError的錯誤。

使用slots要注意,slots定義的屬性僅對當前類實例起作用,對繼承的子類是不起作用的

>>> class collegestudent(Student):

pass

>>> g = collegestudent()

>>> g.score = 99

除非在子類中也定義slots,這樣,子類實例允許定義的屬性就是自身的slots加上父類的slots。

在綁定屬性時,如果我們直接把屬性暴露出去,雖然寫起來很簡單,但是沒辦法檢查參數,導致可以把成績隨便改:

s = Student()

s.score = 9999

這顯然不和邏輯。為了限制score的范圍,可以通過一個set_score()方法來設置成績,再通過一個get_score()來獲取成績,這樣在set_score()方法里就可以檢查參數:

class Student(object):

def get_score(self):

return self.score

def set_score(self,value):

if not isinstance(value,int):

raise ValueError(‘score must be an integer’)

if value < 0 or value > 100:

raise ValueError(‘score must between 0~100!’)

現在,對任意的Student實例進行操作,就不能隨心所欲地設置score了:

>>> s = Student()

>>> s.set_score(60)

>>> s.get_score()

60

>>> s.set_score(9999)

Traceback (most recent call last):

...

ValueError: score must between 0 ~ 100!

但是,上面的調用方法又略顯復雜,沒有直接用屬性這么直接簡單。

有沒有既能檢查參數,又可以用類似屬性這樣簡單的方式來訪問類的變量呢?

還記得裝飾器(decorator)可以給函數動態加上功能嗎?對于類的方法,裝飾器一樣起作用,[email?protected]�屬性調用:

class Student(object):

@property

def score(self):

return self._score

@score.setter

def score(self,value):

if not isinstance(value, int):

raise ValueError(‘score must be an integer!’)

if value < 0 or value > 100:

raise ValueError(‘score must between 0 ~ 100!’)

self._score = value

@property的實現比較復雜,我們先考慮如何使用。把一個getter方法變成屬性,[email?protected]@[email?protected],負責把一個setter方法變成屬性賦值,于是我們就擁有一個可控的屬性操作

>>> s = Student()

>>> s.score = 60

>>> s.score

60

>>> s.score = 9999

Traceback (most recent call last):

...

ValueError: score must between 0 ~ 100!

[email?protected],[email?protected]�不是直接暴露的,而是通過getter和setter方法來實現

還可以定義只讀屬性,只定義getter不定義setter方法就是一個只讀屬性

class Student(object):

@property

def birth(self):

return self._birth

@birth.setter

def birth(self,value):

self._birth = value

@property

def age(self):

return 2017-self._birth

上面的birth是可讀寫屬性,而age就是一個只讀屬性,因為age可以根據birth和當前時間計算出來。

多重繼承

繼承是面向對象編程的一個重要方式,因為通過繼承,子類就可以擴展父類的功能。

多重繼承

class Animal(object):

pass

# 大類:

class Mammal(Animal):

pass

class Bird(Animal):

pass

# 各種動物

class Dog(Mammal):

pass

class Bat(Mammal):

pass

class Parrot(bird):

pass

class Ostrich(Bird):

pass

現在,我們要給動物再加上Runnable和Flyable的功能,只需要預先定義好Runnable和Flyable的類

class Runnable(object):

def run(self):

print(‘running’)

class Flyable(object):

def flu(self):

print(‘flying’)

對于需要runnable的動物,就多繼承一個runnable,例如Dog:

class Dog(Mammal,Runnable):

pass

對于需要Flyable功能的動物,就多繼承一個flyable例如bat

class Bat(Mammal,Flyable):

pass

通過多重繼承,一個子類就可以同時獲得多個父類的所有功能。

MixIn

在設計類的繼承關系時,通常主線都是單一繼承下來的,例如Ostrich繼承自Bird。但是如果需要混入額外的功能。通過多重繼承就可以實現。比如讓Ostrich除了繼承自Bird外再同時繼承Runnable。這種設計通常稱為MixIn.

為了更好地看出繼承關系。我們把Runnable和Flyable改為RunnableMIxIn和FlyableMixIn。類似的,你還可以定義出肉食動物CarnivorousMixIn和植食動物HerbivoresMixIn,讓某個動物同時擁有好幾個MixIn:

class Dog(Mammal,RunnableMixIn,CarnivorousMixIn):

pass

MixIn的目的就是給一個類增加多個功能,這樣在設計類的時候,我們優先考慮通過多重繼承來組合多個MixIn的功能,而不是設計多層次的復雜的繼承關系。

Python自帶的很多庫也使用了MixIn。舉個例子,Python自帶了TCPServer和UDPServer這兩類網絡服務,而要同時服務多個用戶就必須使用多進程或多線程模型,這兩種模型由ForkingMixIn和ThreadingMixIn提供。通過組合,我們就可以創造出合適的服務來。

比如編寫一個多進程模式的TCP服務定義如下:

class MyTCPServer(TCPServer,ForkingMixIn):

pass

編寫一個多進程模式的UDP服務,定義如下:

class MyUDPServer(UDPServer,ThreadingMixIn):

pass

定制類

看到類似slots這種形如xxx的變量或者函數名就要注意,這些python是有特殊用途的。

slots我們已經知道怎么用了,len()方法我們也知道是為了讓class作用與len()函數。

除此之外,Python的class中還有許多這樣特殊的函數幫助我們定制類。

str

我們先定義一個Student類,打印一個實例:

>>> class Student(object):

def __init__(self,name):

self.name = name

>>> print(Student('zhangyuang'))

打印出一堆<__main__.student object="" at="">不好看。

怎么才能打印的好看呢?只需要定義好str()方法,返回一個好看的字符串就可以了:

>>> class Student(object):

def __init__(self,name):

self.name = name

def __str__(self):

return 'Student object (name: %s)' % self.name

>>> print(Student('zhangyuang'))

Student object (name: zhangyuang)

但是細心的朋友會發現直接敲變量不用print,打印出來的實例還是不好看:

>>> s = Student('zhangyuang')

>>> s

這是因為直接顯示變量調用的str(),而是repr(),兩者的區別是str()返回用戶看到的字符串,而repr()返回程序開發者看到的字符串,也就是說repr()是為調試服務的。解決辦法是再定義一個repr()。但是通常str()和repr()代碼都是一樣的,所以,有個偷懶的寫法:

class Student(object):

def init(self,name):

self.name = name

def str(self):

return (‘Student object(name = %s’) % self.name

repr = str

iter

如果一個類想被用于for….in循環類似list或tuple那樣,就必須實現一個iter()方法,該方法返回一個迭代對象,然后python的for循環就會不斷調用該迭代對象的next()方法拿到循環的下一個值,直接遇到StpIteration錯誤時退出。

我們以斐波那契數列為例

class Fib(object):

def init(self):

self.a,self.b = 0,1

def iter(self):

return self #實例本身就是迭代對象,故返回自己

def next(self):

self.a,self.b = self.b,self.a + self.b #計算下一個值

if self.a > 100000:

raise StopIteration()

return self.a

>>> for n in Fib():

print(n)

1

1

2

3

5

....

46368

getitem

Fib實例雖然能作用于for循環看起來和list有點像但是把它當list來用還是不行的

>>> Fib()(5)

Traceback (most recent call last):

File "", line 1, in

TypeError: 'Fib' object does not support indexing

要表現的像list那樣按照下標取出元素需要實現getitem()方法

class Fib(object):

def getitem(self,n):

a,b = 1,1

for x in range(n):

a,b = b,a+b

return a

>>> f = Fib()

>>> f[0]

1

>>> f[2]

2

但是list有個神奇的切片方法:

>>> list(range(100))[5:10]

[5,6,7,8,9]

對于Fib卻報錯。原因是getitem()傳入的參數可能是一個int也可能是一個切片對象silce,所以要做判斷

class Fib(object):

def getitem(self,n):

if isinstance(n,int): # n是索引

a,b = 1,1

for x in range(n):

a,b = b,a+b

return a

if isinstance(n,slice): # n是切片

start = n.start

stop = n.stop

if start is None:

start = 0

a,b = 1,1

L = []

for x i range(stop):

if x>=start:

L.append(a)

a,b = b,a+b

return L

>>> f = Fib()

>>> f[0:5]

[1,1,2,3,5]

>>> f[:10]

[1,1,2,3,.....,21,34,55]

正常情況下當我們調用類的方法或屬性如果不存在就會報錯要避免這個錯誤,除了可以加上改屬性外,python還有另一個機制,那就是寫一個getattr()方法動態返回一個屬性

class Student(object):

def init(self):

self.name = ‘zhangyuang’

def getattr(self,attr):

if attr == ‘score’:

return 99

if attr == ‘age’

return lambda:25

>>> s.score

99

>>> s.age()

25

注意只有在沒有找到屬性的情況下,才調用getattr()已有的屬性比如name不會在getattr()中查找。

此外注意到任意調用如s.abc都會返回None這是因為我們定義的getattr默認返回的就是None。要讓class只響應特定幾個屬性就要按照約定拋出AttributeError錯誤

class Student(object):

def getattr(self,attr):

if attr == ‘age’:

return lambda:25

raise AttributeError(‘’Student’object has no attribute ’%s’’ % attr)

這實際上可以把一個類的所有屬性和方法調用全部動態化處理了,不需要任何特殊手段。

這種完全動態調用的特性有什么實際作用呢?作用就是,可以針對完全動態的情況作調用。

舉個例子:

現在很多網站都搞REST API,比如新浪微博、豆瓣啥的,調用API的URL類似:

利用完全動態的getattr,我們可以寫出一個鏈式調用:

class Chain(object):

def __init__(self,path=''):

self._path = path

def __getattr__(self,path):

return Chain('%s/%s' % (self._path,path))

def __str__(self):

return self.path

__repr__ = __str__

>>> Chain().status.user.timeline.list

'/status/user/timeline/list'

這樣,無論API怎么變,SDK都可以根據URL實現完全動態的調用,而且,不隨API的增加而改變!

還有些REST API會把參數放到URL中,比如GitHub的API:

GET /users/:user/repos

調用時,需要把:user替換為實際用戶名。如果我們能寫出這樣的鏈式調用:

Chain().users('michael').repos

一個對象實例可以有自己的屬性和方法,當我們調用實例方法時,我們用instance.method()來調用。能不能直接在實例本身上調用呢,在python中,答案是肯定的。

任何類只需要定義一個call()方法就可以直接對實例進行調用

class Student(object):

def init(self,name):

self.name = name

def call(self):

print(‘My name si %s’ %self.name)

>>> s = Student('zhangyuang')

s()

My name is zhangyuang

通過callable()函數,我們就可以判斷一個對象是否是“可調用”對象。

>>> callable(Student())

True

>>> callable('str')

false

使用枚舉類

當我們需要定義常量時,一個辦法是用大寫變量通過整數來定義,例如月份

JAN = 1

FEB = 2

MAr = 3

好處是簡單,缺點是類型是int,并且仍然是變量。

更好的放啊是為了這樣的枚舉類型定義一個class類型,然后每個常量都是class的一個唯一實例。python提供Enum類來實現這個功能。

from enum import Enum

Month = Enum(‘Month’,(‘Jab’,’Feb’…..,’Nov’,’Dec’))

這樣我們就獲得了Month類型的枚舉類,可以直接使用Month.Jan來引用一個常量或者枚舉它的所有成員

for name,member in Month.members.items():

print(name,”=>”,member,’,’,member.value)

value屬性則是自動賦給成員的int常量,默認從1開始計數。

如果需要更精確地控制枚舉類型,可以從Enum派生出自定義類

from enum import Enum,unique

@unique

class weekday(Enum):

Sun = 0

Mon = 1

Tue = 2

@unique裝飾器可以幫助我們檢查保證沒有重復值。

訪問這些枚舉類型可以有若干種方法:

>>> day1 = weekday.Mon

>>> print(day1)

weekday.Mon

>>> print(weekday.Mon.value)

1

>>> print(weekday(1))

weekday.Mon

使用元類

type()

動態語言和靜態語言最大的不同,就是函數和類的定義,不是編譯時定義的,而是運行時動態創建的。

比方說我們要定義一個Hello的class就寫一個hello.py模塊:

class Hello(object):

def hello(self,name = ‘world’):

print(‘Hello,%s’ % name)

當python解釋器載入hello模塊時,就會依次執行該模塊的所有語句,執行結果就是動態創建出一個Hello的class對象

>>> from hello import Hello

>>> h = Hello()

>>> h.hello()

Hello,world

>>> print(type(Hello))

>>> print(type(h))

type()函數可以查看一個類或者變量的類型,Hello是一個class它的類型就是type(),而h是一個實例,它的類型就是class Hello

我們說class的定義是運行時動態創建的,而創建class的方法就是使用type()函數。type()函數既可以返回一個對象的類型,又可以創建出新的類型,比如我們可以通過type()函數創建出Hello類而無需通過class Hello(object)…的定義

>>> def fn(self,name='world'): #先定義函數

print('hello %s' % name)

>>> Hello = type('Hello',(object,),dict(hello = fn))#創建Hello class

>>> h = Hello()

>>> h.hello()

Hello,world

>>> print(type(Hello))

>>> print(type(h))

要創建一個class對象,type()函數依次傳入3個參數:

1、class名稱

2、繼承的父類集合,注意python支持多重繼承,如果只有一個父類,別忘了tuple的單元素寫法

3、class的方法名稱與函數綁定,這里我們把fn綁定到方法名hello上。

錯誤處理

程序運行的過程中,如果發生了錯誤,可以事先約定返回一個錯誤代碼,這樣,就可以知道是否有錯,以及出錯的原因。在操作系統提供的調用中,返回錯誤碼非常常見。比如打開文件的函數open(),成功時返回文件描述符(就是一個整數),出錯時返回-1。

用錯誤碼來表示是否出錯十分不便,因為函數本身應該返回的正常結果和錯誤碼混在一起,造成調用者必須用大量的代碼來判斷是否出錯:

def foo():

r = some_function()

if r == (-1):

return (-1)

# do something

return r

def bar():

r = foo()

if r == (-1):

print('Error')

else:

pass

一旦出錯還要一級一級上報,直到某個函數可以處理該錯誤(比如,給用戶輸出一個錯誤信息)

所以高級語言通常都內置了一套try…except…finally…的錯誤處理機制,python也不例外

try

讓我們用一個例子來看看try的機制

try:

print(‘try’)

r = 10 / 0

print(‘result:’,r)

except ZeroDivisionError as e:

print(‘except:’,e)

finally:

print(‘finally…’)

print(‘end’)

當我們認為某些代碼可能會出錯時,就可以用try來運行這段代碼,如果執行出錯則后續代碼不會執行,而是直接跳轉至錯誤處理代碼即except語句塊,執行完except后,如果有finally語句塊,則執行finally語句塊,至此執行完畢。

上面的代碼在計算10/0時會產生一個除法運算錯誤:

try…

except: division by zero

finally

END

從輸出可以看到,當錯誤發生時,后續語句print(‘result’,r)except由于補貨到ZeroDivisionError,因此被執行。最后,finally語句被執行。然后程序繼續按照流程往下走。

如果把除數0改成2,則執行結果如下:

try…

result:5

finally

END

由于沒有錯誤發生時,所以except語句塊不會被執行,但是finally如果有,則一定會被執行(可以沒finally語句)。

你還可以猜測,錯誤應該有很多種類,如果發生不同類型的錯誤,應該由不同的except語句塊出爐。沒錯,可以有多個except來補貨不同類型的錯誤

try:

print(‘try…’)

r = 10/int(‘a’)

print(‘result’,r)

except ValueError as e:

print(‘ValueError:’e)

except ZeroDivisionError as e:

print(‘ZeroDivisionError:’,e)

finally:

print(‘finally’)

print(‘END’)

int()函數可能會拋出ValueError,所以我們用一個expcept捕獲ValueError,用另一個except捕獲ZeroDivisionError

此外,如果沒有錯誤發生,可以在except語句塊后面加一個else當作沒有錯誤發生時,會自動執行else語句

try:

print(‘try…’)

r = 10/int(‘2’)

print(‘result:’r)

except ValueError as e:

print(‘ValueError:’,e)

except ZeroDivisionError as e:

print(‘ZeroDivisionError:’,e)

else:

print(‘no error’)

finally:

print(‘finally’)

print(‘END’)

python的錯誤其實也是class,所有的錯誤類型都繼承自BaseException,所以在使用except時需要注意的是它不但捕獲該類型的錯誤,還把其子類也一網打盡

try:

foo()

except ValueError as e:

print(‘ValueError’)

except UnicodeError as e:

print(‘UnicodeError’)

第二個except永遠也捕獲不到UnicodeError,因為UnicodeError是ValueError的子類,如果有也被第一個except給捕獲了。

python所有的錯誤都是從BaseException類派生的,常見的錯誤類型和繼承關系看這里:https://docs.python.org/3/library/exceptions.html#exception-hierarchy

使用try…except捕獲錯誤還有一個好處就是可以跨越多層調用,比如函數main()調用foo(),bar()調用foo(),foo()出錯了就可以在main()捕獲到就可以處理

# err.py

def foo(s):

return 10/int(s)

def bar(s)

return foo(s) * 2

def main():

try:

bar('0')

except Exception as e:

print('Error:',e)

finally:

print('finally')

調用堆棧

如何錯誤沒有被捕獲它就會一直往上拋,最后被python解釋器捕獲,打印一個錯誤信息然后程序退出

$ python3 err.py

Traceback (most recent call last):

File “err.py”, line 11, in main()

File “err.py”, line 9, in main

bar(‘0’)

File “err.py”, line 6, in bar

return foo(s) * 2

File “err.py”, line 3, in foo

return 10 / int(s)

ZeroDivisionError: division by zero

logging模塊可以記錄錯誤信息import logging

def foo(s):

return 10/int(s)

def bar(s):

return foo(s) * 2

def main():

try:

bar('0')

exception Exception as e:

logging.exception(e)

main()

print('END')

同樣是出錯但程序打印完錯誤信息后會繼續執行并正常退出

$ python3 err_logging.py

ERROR:root:division by zero

Traceback (most recent call last):

File “err_logging.py”, line 13, in main

bar(‘0’)

File “err_logging.py”, line 9, in bar

return foo(s) * 2

File “err_logging.py”, line 6, in foo

return 10 / int(s)

ZeroDivisionError: division by zero

END

拋出錯誤

如果要拋出錯誤,首先根據需要可以定義一個錯誤的class選擇好繼承關系,然后用raise語句拋出一個錯誤

# err_raise.py

class FooError(ValueError):

pass

def foo(s):

n = int(s)

if n == 0:

raise FooError('invalid valye: %s' % s)

return 10/n

foo('0')

$ python3 err_raise.py

Traceback (most recent call last):

File "err_throw.py", line 11, in

foo('0')

File "err_throw.py", line 8, in foo

raise FooError('invalid value: %s' % s)

__main__.FooError: invalid value: 0

只有在必要的時候才定義我們自己的錯誤類型,如果可以選擇python已有的內置錯誤類型(ValueError,TypeError)盡量使用內置類型

最后我們來看另一種錯誤處理方式。

# err_reraise.py

def foo(s):

n = int(s)

if n == 0:

raise ValueError('invalid value:%s' %s)

return 10/n

def bar():

try:

foo('0')

except ValueError as e:

print('ValueError')

raise

在bar()函數中,我們明明已經捕獲了錯誤,但是,打印一個ValueError!后,又把錯誤通過raise語句拋出去了,這不有病么?

其實這種錯誤處理方式不但沒病,而且相當常見。捕獲錯誤目的只是記錄一下,便于后續追蹤。但是,由于當前函數不知道應該怎么處理該錯誤,所以,最恰當的方式是繼續往上拋,讓頂層調用者去處理。好比一個員工處理不了一個問題時,就把問題拋給他的老板,如果他的老板也處理不了,就一直往上拋,最終會拋給CEO去處理。

調試

第一種方法簡單粗暴,就使用print()把可能有問題的變量打印出來

def foo(s):

n = int(s)

print(‘>>> n = %d’ % n)

return 10/n

def main():

foo(‘0’)

main()

執行后在輸出中查找打印的變量值

$ python3 err.py

>>> n = 0

Traceback (most recent call last):

...

ZeroDivisionError: integer division or modulo by zero

用print()最大的壞處是將來還得刪掉它,想想程序里到處都是print(),運行結果也會包含很多垃圾信息。

斷言

凡是用print()來輔助查看的地方都可以用斷言(assert)來替代。

def foo(s):

n = int(s)

assert n!=0,’n is zero’

return 10/n

def main():

foo(‘0’)

assert的意思是,表達式n!=0應該是True否則根據程序運行的邏輯,后面的代碼肯定會出錯。如果斷言失敗,assert語句本身就會拋出AssertionError:

$ python3 err.py

Traceback (most recent call last):

AssertionError: n is zero!

程序中如果導出充斥著assert和print()相比也好不到哪去。不過啟動python解釋器時可以用-O參數來關閉assert

$ python3 -O err.py

Traceback (most recent call last):

ZeroDivisionError: division by zero

關閉后,你可以把所有的assert語句當成pass來看

logging

把print()替換成logging是第3種方式,和assert相比logging不僅會拋出錯誤,而且可以輸出到文件

impoet logging

s = ‘0’

n = int(s)

logging.info(‘n = %d’ % n)

print(10/n)

logging.info()就可以輸出一段文本。運行,發現除了ZeroDivisionError沒有任何信息。怎么回事?別急,在import logging之后添加一行配置再試試

import logging

logging.basicConfig(level=logging.INFO)

看到輸出了:

$ python3 err.py

INFO:root: n = 0

Traceback (most recent call last):

File “err.py”, line 8, in print(10 / n)

ZeroDivisionError: division by zero

這就是logging的好處,它允許你指定記錄信息的級別,有debug,info,warning,error等幾個級別,當我們指定level=INFO時,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。這樣一來,你可以放心地輸出不同級別的信息,也不用刪除,最后統一控制輸出哪個級別的信息。

logging的另一個好處是通過簡單的配置,一條語句可以同時輸出到不同的地方,比如console和文件。

pdb

第4種方式是啟動python的調試器pdb,讓程序以單步方式運行,可以隨時查看運行狀態。

# err.py

s = '0'

n = int(s)

print(10/n)

然后啟動

python3 -m pdb err.py

> /Users/zhangyuang/Desktop/python - python3/samples/debug/err.py(2)()

-> s = '0'

以參數-m pdb啟動后,pdb定位到下一步要執行的代碼-> s = ‘0’輸入命令1來查看代碼

(pdb)1

1 #err.py

2 -> s = ‘0’

3 n = int(s)

4 print(10/n)

輸入命令n可以單步執行代碼

(pdb)n

> /Users/zhangyuang/Desktop/python - python3/samples/debug/err.py(3)()

-> n = int(s)

>/Users/zhangyuang/Desktop/python - python3/samples/debug/err.py(4)()

-> print(10/n)

任何時候都可以輸入命令p變量名來查看變量

(pdb) p s

‘0’

(pdb) p n

0

輸入命令q結束調試,退出程序

(pdb) q

這種通過pdb在命令行調試的方法理論上是萬能的,但實在太麻煩了,如果有一千行代碼要運行到第999行得敲多少命令啊。還好我們有另一種方法

pdb.set_trace

這個方法也是用pdb,但是不需要單步執行,我們只需要import pdb,然后在可能出錯的地方放一個pdb.set_trace(),就可以設置一個斷點

#err.py

import pdb

s = '0'

n = int(s)

pdb.set_trace() #運行到這里會自動暫停

print(10/n)

運行代碼程序會自動在pdb.set_trace()暫停并進入pdb調試環境可以使用命令p查看變量或者用命令c繼續運行

$ python3 err.py

>/Users/zhangyuang/Desktop/python - python3/samples/debug/err.py(7)()

-> print(10/n)

(pdb) p n

0

(pdb) c

Traceback (most recent call last):

File "err.py", line 7, in

print(10 / n)

ZeroDivisionError: division by zero

這個方式比直接啟動pdb單步調試效率要高很多,但也高不到哪

IDE

如果要比較爽地設置斷點、單步執行,就需要一個支持調試功能的IDE。目前比較好的Python IDE有PyCharm:

另外,Eclipse加上pydev插件也可以調試Python程序。

單元測試

如果你聽說過“測試驅動開發”(TDD:Test-Driven Development),單元測試就不陌生

單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。

比如對abs(),我們可以編寫出以下幾個測試用例:

1、輸入正數,比如1、1.2、0.99,期待返回值與輸入相同

2、輸入負數,比如-1、-1.2、-0.99期待返回值與輸入相反;

3、輸入0期待返回0

4、輸入非數值類型,比如None、[]、{}期待拋出TypeError

把上面的測試用例放到一個測試模塊里,就是一個完整的單元測試。

如果單元測試通過說明我們測試的這個函數能夠正常工作。如果測試不通過,要么函數有Bug要么測試條件輸入不正確,總之需要修復使單元測試能夠通過。

單元測試通過后有什么意義呢?如果我們對abs()函數代碼做了修改,只需要再跑一遍單元測試,如果通過,說明我們的修改不會對abs()函數原有的行為造成影響,如果測試不通過,說明我們的修改與原有行為不一致,要么修改代碼,要么修改測試。

這種以測試為驅動的開發模式最大的好處就是確保一個程序模塊的行為符合我們設計的測試用例。在將來修改的時候,可以極大程度地保證該模塊行為仍然是正確的。

我們來編寫一個Dict類,這個類的行為和dict一致,但是可以通過屬性來訪問。

>>> d = Dict(a=1,b=2)

>>> d['a']

1

>>> d.a

1

mydict.py代碼如下

class Dict(dict):

def init(self,kw):

super().init(kw)

def getattr(self,key):

try:

return self[key]

except KeyError:

raise AttributeError(r”‘Dict’object has no attribute ‘%s’” % key)

def setattr(self,key,value):

self[key] = value

為了編寫單元測試,我們需要引入Python自帶的unittest模塊,編寫mydict_test.py如下

import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

def test_init(self):

d = Dict(a=1,b=’test’)

self.assertEqual(d.a,1)

self.assertEqul(d.b,’test’)

self.assertTrue(isinstance(d,dict))

def test_key(self):

d = Dict()

d[‘key’] = ‘value’

self.assertEqual(d.key,’value’)

def test_attr(self):

d = Dict()

d.key = ‘value’

self.assertTrue(‘key’ in d)

self.assertEqual(d[‘key’],’value’)

def test_keyerror(self):

d = Dict()

with self.assertRaises(KeyError):

value = d[‘empty’]

def test_attrerror(self):

d = Dict()

with self.assertRaises(AttributeError):

value = d.empty

編寫單元測試時,我們需要編寫一個測試類,從unittest.TestCase繼承

以test開頭的方法就是測試方法,不以test開頭的方法不認為是測試方法,測試的時候不會執行。對每一類測試都需要編寫一個test_xxx()方法。由于unittest.TestCase提供了很多內置的條件判斷,我們只需要調用這些方法就可以斷言輸出是否是我們所期望的。最常用的斷言就是assertEqual():

self.assertEqual(abs(-1),1) #斷言函數返回的結果與1相等

另一種重要的斷言就是期待拋出指定類型的Error,比如通過d[‘empty’]訪問不存在的key時斷言會拋出KeyError:

with self.assertRaises(KeyError):

value = d[‘empty’]

而通過d.empty訪問不存在的key時,我們期待拋出AttributeError:

with self.assertRaises(AttributeError):

value = d.empty

運行單元測試

一旦編寫好單元測試,我們就可以運行單元測試。最簡單的運行方法是在mydict_test.py的最好加上兩行代碼

if name == ‘main‘

unittest.main()

這樣就可以把mydict_test,py當作正常的python腳本運行

$ python3 mydict_test.py

另一種方法是在命令行通過參數-m unittest直接運行單元測試

$ python3 -m unittest mydict_test

........

----------------------------

Ran 5 tests in 0.000s

ok

這是推薦的做法,因為這樣可以一次批量運行很多單元測試,并且有很多工具可以自動來運行這些單元測試。

setUP與testDown

可以在單元測試中編寫兩個特殊的setUp()和tearDown()方法。這兩個方法會分別在每調用一個測試方法的前后分別被執行。

setUp()和testDown()方法有什么用呢?設想你的測試需要啟動一個

數據庫,這時就可以在setUp()方法中連接數據庫,在testDown()方法中關閉數據庫,這樣不必在每個測試方法中重復相同的代碼

class TestDict(unittest.TestCase):

def setUp(self):

print(‘setUp…’)

def tearDown(self):

print(‘tearDown…’)

小結

單元測試可以有效的測試某個程序模塊的行為,是未來重構代碼的信心保證

單元測試的測試用例要覆蓋常用的輸入組合、邊界條件和異常。

單元測試代碼要非常簡單,如果測試代碼太復雜那么測試代碼本身就可能有BUG

單元測試通過了并不意味著程序就沒有bug了但是不通過程序肯定有bug

IO編程

文件讀寫

讀文件

要以讀文件的模式打開一個文件使用python內置的open()函數,傳入文件名和標識符:

>>> f = open('./test.txt','r')

標識符’r’表示讀,如果文件不存在open()函數就會拋出一個IOError的錯誤并且給出錯誤碼和詳細信息。

如果文件打開成功接下來調用read()方法可以一次讀取文件的全部內容,python把內容讀到內存用一個str對象表示

>>> f.read()

'IO test'

最后一步是調用close()方法關閉文件,文件使用完畢后必須關閉因為文件對象會占用操作系統的資源并且操作系統同一時間能打開的文件數量也是有限的。

>>> f.close()

由于文件讀寫時都有可能產生IOError,一旦出錯后面的f.close()就不會調用。所以為了保證無論是否出現

try:

f = open(‘./test.txt’,’r’)

print(f.read())

finally:

if f:

f.close()

但是每次都這么寫實在是太繁瑣了,所以python引入了with語句來自動幫我們調用close()方法

with open(‘./test.txt’,’r’) as f:

print(r.read())

這和前面的try…finally是一樣的但是代碼更加簡潔并且不必調用f.close()方法。調用read()會一次性讀取文件的全部內容如果文件有10G內存就爆了,所以要保險起見可以反復調用read(size)方法每次最多讀取size個字節的內容。另外,調用readline() 可以每次讀取一行內容,調用readlines()一次讀取所有內容并按行返回list。因此,要根據需求決定怎么調用。如果文件很小,read()一次性讀取最方便;如果不能確定文件大小,反復調用read(size)比較保險;如果是配置文件,調用readlines()最方便 for line in f.readlines():

print(line.strip()) #把末尾的’n’刪掉

file-like Object

像open()函數返回的這種有個read()方法的對象在python中統稱為file-like Object除了file外還可以是內存的字節流,網絡流,自定義流等等。file-like Object不要求從特定類繼承,只要寫個read()方法就行。

StringIO就是在內存中創建的file-like Object,常用作臨時緩沖

二進制文件

前面講的默認都是讀取文本文件,并且是UTF-8編碼的文本文件。要讀取二進制文件,比如圖片視頻用’rb’模式打開文件即可

>>> f = open('./test.jpg','rb')

>>> f.read()

b 'xffxd8xffxe1x00x18Exifx00x00...' #十六進制表示的字節

字符編碼

要讀取非UTF-8編碼的文本文件,需要給open()函數傳入encoding參數,例如讀取GBK編碼的文件

>>> f = open('./gbk.test','r',encoding='gbk')

>>> f.read()

'測試'

遇到有些編碼不規范的文件你可能會遇到UnicodeDecodeError,因為在文本文件中可能夾雜了一些非法編碼的字符。遇到這種情況,open()函數還接受一個errors參數,表示如果遇到編碼錯誤后如何處理。最簡單的方式是直接忽略

>>> f = open('./gbk.txt','r',encoding='gbk',errors='ignore')

寫文件

寫文件和讀文件是一樣的,唯一區別是調用open()函數時,傳入標識符’w’或者’wb’表示寫文本文件或寫二進制文件

>>> f = open('./test.txt','w')

>>> f.write('hello,world')

>>> f.close()

你可以反復調用write()來寫入文件,但是無比要調用f.close()來關閉文件。當我們寫文件時,操作系統往往不會立刻把數據寫入磁盤而是放到內存緩存起來,空閑的時候再慢慢寫入。只有調用close()方法,操作系統才保證把沒有寫入的數據全部寫入磁盤。忘記調用close()的后果是數據可能只寫了一部分到磁盤剩下的丟失了。所以,還是用with語句來的保險

with open(‘./test.txt’,’w’) as f:

f.write(‘hello world’)

要寫入特定編碼的文本文件,請給open()函數傳入encoding參數,將字符串轉換為指定編碼

StringIO和BytesIO

StringIO

很多時候數據讀寫不一定是文件,也可以在內存中讀寫。

StringIO顧名思義就是在內存中讀寫str

要把str寫入StringIO,我們需要先創建一個StringIO然后像寫文件一樣寫入即可

>>> from io import StringIO

>>> f = StringIO()

>>> f.write('hello')

5

>>> f.write('')

1

>>> f.write('world!')

6

>>> print(f.getvalue())

hello world

getvalue()方法用于獲得寫入后的str

要讀取StringIO,可以用一個str初始化StringIO,然后像讀文件一樣讀取

>>> from io import StringIO

>>> f = StringIO('hellonHInGoodbye')

>>> while True:

s = f.readline()

if s == '':

break

print(s.strip())

Hello

HI

Goodbye

BytesIO

StringIO操作的只能str如果要操作二進制數據,就需要使用BytesIO

BytesIO實現在內存中讀寫bytes,我們創建一個BytesIO,然后寫入一些bytes

>>> from io import BytesIO

>>> f = BytesIO()

>>> f.write('中文'.encode('utf-8'))

6

>>> print(f.getvalue())

b'xe4xb8xadxe6x96x87'

請注意,寫入的不是str而是經過UTF-8編碼的bytes

和StringIO類似可以用一個bytes初始化BytesIO然后像讀文件一樣讀取

>>> from io import BytesIO

>>> f = BytesIO(b'xe4xb8xadxe6x96x87')

>>> f.read()

b'xe4xb8xadxe6x96x87'

小結

StringIO和BytesIO是在內存中操作str和bytes的方法,是的和讀寫文件具有一致的借口。

操作文件和目錄

如果我們要操作文件、目錄可以在命令行下面輸入操作系統提供的各種命令來完成。比如dir、cp等命令。

如果要在python程序中執行這些目錄和文件的操作怎么辦?其實操作系統提供的命令只是簡單的調用了操作系統提供的借口函數,python內置的os模塊也可以直接調用操作系統提供的接口函數。

打開python交互式命令行

>>> import os

>>> os.name #操作系統類型

'posix'

如果是posix,說明系統是Linux、unix或MacOSX,如果是nt,就是windows系統。

要獲取詳細的系統信息,可以調用uname()函數:

>>> os.uname()

posix.uname_result(sysname='Darwin', nodename='zhangyuangdeMBP', release='16.0.0', version='Darwin Kernel Version 16.0.0: Mon Aug 29 17:56:20 PDT 2016; root:xnu-3789.1.32~3/RELEASE_X86_64', machine='x86_64')

注意uname()函數在windows上不提供,也就是說os模塊的某些函數是跟操作系統相關的

環境變量

在操作系統中定義的環境變量全部保存在os.environ這個變量中

>>> os.environ

environ({'TERM_PROGRAM': 'Apple_Terminal', 'TERM': 'xterm-256color', 'SHELL': '/bin/bash', 'TMPDIR': '/var/folders/g7/n76jd7897_s0xtyqlssfk9y00000gn/T/', 'Apple_PubSub_Socket_Render': '/private/tmp/com.apple.launchd.YKTDBWScTk/Render', 'TERM_PROGRAM_VERSION': '377', 'TERM_SESSION_ID': '50F4527E-810B-4A61-807C-3D9C8E2B345C', 'USER': 'zhangyuang', 'SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.zdqC9KFAal/Listeners', '__CF_USER_TEXT_ENCODING': '0x1F5:0x19:0x34', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', 'PWD': '/Users/zhangyuang/Desktop/github/Learn_python', 'LANG': 'zh_CN.UTF-8', 'XPC_FLAGS': '0x0', 'XPC_SERVICE_NAME': '0', 'HOME': '/Users/zhangyuang', 'SHLVL': '1', 'LOGNAME': 'zhangyuang', '_': '/usr/local/bin/python3', 'OLDPWD': '/Users/zhangyuang/Desktop/github', '__PYVENV_LAUNCHER__': '/usr/local/bin/python3'})

要獲取某個環境變量的值,可以調用os.environ.get(‘key’)

>>> os.environ.get('PATH')

'/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin'

>>> os.environ.get('x','default')

'default'

操作文件和目錄

操作文件和目錄的函數一部分方法放在os模塊中,一部分放在os.path模塊中,這一點要注意一下。查看、創建和刪除目錄可以這么調用

#查看當前目錄絕對路徑

>>> os.path.abspath('.')

'/Users/zhangyuang/Desktop/github/Learn_python'

#在某個目錄下創建一個新目錄,首先把新目錄的完整路徑表示出來

>>> os.path.join('/Users/zhangyuang','testdir')

'/Users/zhangyuang/testdir'

#然后創建一個目錄

>>> os.mkdir('/Users/zhangyuang/testdir')

#刪掉一個目錄

>>> os.rmdir('/User/zhangyuang/testdir')

把兩個路徑合成一個時,不要直接拼字符串,而是要通過os.path.join()函數,這樣可以正確處理不同操作系統的路徑分隔符。在Linux/Unix/Mac下,os.path.join()返回這樣的字符串

part-1/part-2

而windows下會返回這樣的字符串:

part-1part-2

同樣的道理,要拆分路徑時也不要直接去拆字符串,而要通過os.path.split()函數,這樣可以把一個路徑拆分為兩部分,后一部分總是最后級別的目錄或文件名

>>> os.path.split('/Users/zhangyuang/testdir/file.txt')

('/Users/zhangyuang/testdir','file.txt')

os.path.splitext()可以讓你得到文件擴展名很多時候非常方便

>>> os.path.splitext('/path/to/file.txt')

('/path/to/file','.txt')

這些合并、拆分路徑的函數并不要求目錄和文件要真實存在,它們只對字符串進行操作。文件操作使用下面的函數。假定當前目錄下有一個test.txt文件

#對文件重命名

>>> os.rename('test.txt','test.py')

#刪除文件

>>> os.remove('test.py')

但是復制文件的函數居然在os模塊中不存在!原因是復制文件并非由操作系統提供的系統調用。理論上我們通過上一節的讀寫文件可以完成文件復制,只不過要多寫很多代碼。幸運的是shutil模塊提供了copyfile()函數,你還可以在shutil模塊中找到很多實用函數,它們可以看作是os模塊的補充。

利用python來過濾文件。比如我們要列出當前目錄下的所有目錄

>>> [x for x in os.listfir('.') if os.path.isdir(x)]

['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications', 'Desktop', ...]

要列出所有.py文件

>>> [x for x in os.listdir('x') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']

['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py'

序列化

在程序運行的過程中最難過,所有的變量都是在內存中,比如定義一個dict

d = dict(name=’zhangyuang’,age=19,score=99)

可以隨時修改變量,比如把name改成janvier,但是一旦程序結束,變量所占用的內存就被操作系統回收。如果沒有把修改后的janvier存儲到磁盤上,下次重新運行程序,變量又被初始化為zhangyuang

我們把變量從內存中變成可存儲或可傳輸的過程稱之為序列化,在python中叫pickling,在其他語言中也被稱為serialization,marshalling,flattening等等,都是一個意思。

序列化之后,就可以把序列化后的內容寫入磁盤,或者通過網絡傳輸到別的機器中。

反過來,把變量內容從序列化的對象重新讀到內存里稱之為反敘黎話,即unpicking。python提供了pickle模塊來實現序列化。

首先,我們嘗試把一個對象序列化并寫入文件

>>> import pickle

>>> d = dict(name='zhangyuang,age=19,score=99')

>>> pickle.dumps(d)

b'x80x03}qx00(Xx03x00x00x00ageqx01Kx14Xx05x00x00x00scoreqx02KXXx04x00x00x00nameqx03Xx03x00x00x00Bobqx04u.'

pickle.dumps()方法把任意對象序列化成一個bytes,然后就可以把這個bytes寫入文件。或者用另一個方法pickle.dump直接把序列化后寫入一個file-like Object:

>>> f = open('dump.txt','wb')

>>> pickle.dump(d,f)

>>> f.close()

看看寫入dump.txt的內容,亂七八糟,這些都是python保存的對象內部信息。

當我們要把對象從磁盤讀到內存時,可以先把內容讀到一個bytes,然后用pickle.loads()方法反序列化出對象,也可以直接用pickle.load()方法從一個file-like Object中直接反序列化對象。我們打開另一個python命令行來反序列化剛才保存的對象

>>> f = open('dump.txt','rb')

>>> d = pickle.load(f)

>>> f.close()

>>> d

{'name':'zhangyuang','score':'99','age':'19'}

變量的內容又回來了,當然,這個變量和原來的變量是完全不相干的對象,它們只是內容相同而已。

JSON

如果我們要在不同的編程語言之間傳遞對象,就必須把對象序列化為標準格式,比如XML,但更好的方法是序列化為JSON,因為JSON表示出來就是一個字符串,可以被所有語言讀取,也可以方便地存儲到磁盤或者通過網絡傳輸。JSON不僅是標準格式,并且比XML更快,而且可以直接在Web頁面中讀取,非常方便。JSON表示的對象就是標準的JavaScript語言的對象,JSON和Python內置的數據類型對應如下:

JSON類型 Python類型

{} dict

[] list

“string” str

123.56 int或float

true/false True/False

null None

python內置的json模塊提供了非常完善的Python對象到JSON格式的轉換。

我們先看看如何把python對象變成一個JSON

>>> import json

>>> d = dict(name='zhangyuang',age=20,score=99)

>>> json.dumps(d)

'{"age":20,"score":99,"name":"zhangyuang"}'

dumps()方法返回一個str,內容就是標準的JSON。類似的dump()方法可以直接把JSON寫入一個file-like Object。要把JSON反序列化為python對象,用loads()或者對應的load()方法,前者把JSON的字符串反序列化,后者從file-like Object中讀取字符串并反序列化:

>>> json_str = '{"age":20,"name":"zhangyuang","score":99}'

>>> json.loads(json_str)

{'age':20,'score':99,"name":'zhangyuang'}

由于JSON標準規定JSON編碼是UTF-8所以我們總是能正確的在Python的str與JSON的字符串之間轉換。

JSON進階

Python的dict對象可以直接序列化為JSON的{},不過很多時候我們更喜歡用class表示對象,比如定義Student類,然后序列化

import json

class Student(object):

def init(self,name,age,score):

self.name = name

self.age = age

self.score = score

s = Student(‘zhangyuang’,19,99)

print(json.dumps(s))

運行代碼,毫不留情地得到一個TypeError:

Traceback (most recent call last):

TypeError: <__main__.student object="" at=""> is not JSON serializable

錯誤的原因是Student對象不是一個可序列化為JSON的對象,如果連class的實例對象都無法序列化為JSON這肯定不合理。別急,我們仔細看看dumps()方法的參數列表,發現除了第一個必須的obj參數外,dumps()還提供了一大堆可選參數https://docs.python.org/3/library/json.html#json.dumps

這些可選參數就是讓我們來定制JSON序列化。前面的代碼之所以無法把Student類實例序列化為JSON,是因為 默認情況下,dumps()方法不知道如何將Student實例變為一個JSON的{}對象。

可選參數default就是把任意一個對象編程一個可序列化為JSON的對象,我們只需要為Student專門寫一個轉換函數,再把函數傳進去即可:

def student2dict(std):

return {

‘name’: std.name

‘age’: std.age

‘score’: std.score

}

這樣Student實例首先被student2dict函數轉換成dict,然后再順利序列化為JSON:

>>> print(json.dumps(s,default = student2dict))

{"age":19,"name":"zhangyuang","score":99}

不過下次如果遇到一個Teacher類的實例,照樣無法序列化為JSON,我們可以偷個懶,把任意class的實例變為dict:

print(json.dumps(s,default = lambda obj:obj.dict))

因為通常class的實例都有一個dict屬性,它就是一個dict,用來存儲實例變量。也有少數例外,比如定義了slots的class。同樣的道理,如果我們要把JSON反序列化為一個Student對象實例,loads()方法首先轉換出一個dict對象,然后我們傳入的object_hook函數負責把dict轉換為Student實例:

def dict2student(d):

return Student(d[‘name’],d[‘age’],d[‘score’])

運行結果如下

>>> json_str = '{"age":20,"score":99,"name":"zhangyuang"}'

打印出的是反序列化對象的Student實例對象

小結

python語言特定的序列化模塊是pickle,但如果要把序列化搞得通用、更符合web標準,就可以使用json模塊。json模塊的dumps()和loads()函數是定義的非常好的接口的典范。當我們使用時,只需要傳入一個必須的參數。但是當默認的序列化機制不滿足我們的要求時,我們又可以傳入更多的參數來定制序列化的規則,即做到了接口簡單易用,又做到了充分的擴展性和靈活性。

進程和線程

多進程

要讓python程序實現多進程,我們先了解操作系統的相關知識。Unix/Linux操作系統提供了一個fork()系統調用。它非常特殊。普通的函數調用,調用一次返回一次,但是fork()調用一次返回兩次,因為操作系統自動把當前進程(稱為父進程)復制了一份(稱為子進程)然后分別在父進程和子進程內返回。子進程永遠返回0,而父進程返回子進程的ID。這樣做的理由是,一個父進程可以fork出很多子進程,所以父進程要記下每個子進程的ID,而子進程只需要調用getppid()就可以拿到父進程的ID。

python的os模塊封裝了常見的系統調用,其中就包括fork(),可以在python中輕松創建子進程

import os

print(‘Process(%s) start…’ % os.getpid())

# only works on Unix/Linux/Mac

pid = os.fork()

if pid == 0:

print('i am child process (%s) and my parent is %s' % (os.getpid(),os.getppid()))

else:

print('i (%s) just created a child process(%s)' %(os.getpid(),pid))

運行結果如下:

process(876)start

i(876)just created a child process(877)

i am child process(877) and my parent is 876

有了fork調用,一個進程在接到新任務時就可以復制出一個子進程來處理新任務,常見的Apache服務器就是由父進程監聽端口,每當有新的http請求,就fork()出子進程來處理新的http請求

正則表達式

d匹配一個數字

w匹配一個字母或數字

‘00d’可以匹配’007’但無法匹配’00A’

‘ddd’可以匹配’010’

‘wwd’可以匹配’py3’

.可以匹配任意字符

‘py.’可以匹配’pyc’,’pyo’,’py!’

*表示匹配任意個字符(包括0個)

+表示至少一個字符

?表示0個或1個字符

{n}表示n個字符,{n,m}表示n-m個字符

來看一個復雜的例子:d{3}s+d{3,8}

我們從左到右解讀一下

1、d{3}表示匹配3個數字,例如’010’

2、s可以匹配一個空格(也包括Tab等空白符),所以s+表示至少有一個空格,例如匹配’ ‘,’ ‘

3、d{3,8}表示3-8個數字例如’1234567’

綜合起來,上面的正則表達式可以匹配以任意個空格隔開的帶區號的電話號碼。

如果要匹配’010-12345’這樣的號碼?由于’-‘是特殊字符,在正則表達式要用’’轉義,所以上面的正則是d{3}-d{3,8}

但是仍然無法匹配’010 - 12345’因為帶有空格。

進階

要做更精確的匹配,可以用[]表示范圍比如

1、[0-9a-zA-Z_]可以匹配一個數字、字母或者下劃線

2、[0-9a-zA-Z_]可以匹配至少由一個數字、字母或者下劃線組成的字符串,比如’a100’,’0Z’,’Py3000’

3、[a-zA-Z][0-9a-zA-Z_]*可以匹配由字母或下劃線開頭,后接任意個由一個數字、字母或者下劃線組成的字符串,也就是Python合法的變量

4、[a-zA-Z_][0-9a-zA-Z_]{0,19}更精確的限制變量的長度時1-20個字符(前面1個字符,后面最多19個字符)

A|B可以匹配A或B,所以(P|p)ython可以匹配’Python’或者’python’

^表示行開頭,^d表示以數字開頭

$表示行結尾,d$表示以數字結尾

你可能注意到了,py也可以匹配’python’,但是加上^py$酒變成了整行匹配只能匹配’py’了

re模塊

Python提供re模塊,包含所有正則表達式的功能。由于Python的字符串本身也用轉義所以要特別注意

s = ‘ABC-001’ #python字符串

#對應的正則表達式字符串變成

# 'ABC-001'

因此我們強烈建議使用Python的r前綴就不用考慮轉義的問題了

s = r’ABC-001’

#對應的正則表達式字符串不變

#'ABC-001'

先看看如何判斷正則表達式如何匹配

>>> import re

>>> re.match(r'^d{3}-d{3-8}$','010-12345')

>>> re.match(r'^d{3}-d{3-8}$','010 12345')

>>>

match()方法判斷是否匹配,如果匹配成功返回一個Match對象,否則返回None。

常見的判斷方法就是:

test = ‘用戶輸入的字符串’

if re.match(r’正則表達式’,test):

print(‘ok’)

else:

print(‘failed’)

切分字符串

用正則表達式切分字符串比固定的字符更靈活,請看正常的切分代碼

>>> 'a b c'.split('')

['a','b','','','c']

嗯,無法識別連續的空格,用正則表達式試試

>>> re,split(r's+','a b c')

['a','b','c']

無論多少個空格都可以正常分割。加入,試試

>>> re.split(r'[s,]+','a,b,c d')

['a','b','c','d']

再加入;試試

>>> re.split(r'[s,;]+','a,b;;c d')

['a','b','c','d']

分組

除了簡單的判斷是否匹配之外,正則表達式還有提取字串的強大功能。用()表示要提取的分組。比如:

^(d{3})-(d{3,8})$分別定義了兩個組,可以直接從匹配的字符串中提取出區號和本地號碼

>>> m = re.match(r'^(d{3})-(d{3-8})$','010-12345')

>>> m

>>> m.group(0)

'010-12345'

>>> m.group(1)

'010'

>>> m.group(2)

'12345'

如果正則表達式定義了組,就可以在Match對象上用group()方法提取出字串來。注意到group(0)永遠是原始字符串、group(1),group(2)表示第1,2個字串

提取字串非常有用來看一下更兇殘的例子:

>>> t = '19:05:30'

>>> m = re.macth(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)

>>> m.groups()

('19','05','30')

這個正則表達式可以直接識別合法的時間。到那時有時候用正則表達式也無法做到完全驗證,比如識別日期對于2-3-,4-31這樣的非法日期還是識別不了,這時候需要程序配合識別。

貪婪匹配

最后需要指出的是,正則匹配默認是貪婪匹配也就是匹配盡可能多的字符。

>>> re.macth(r'^(d+)(0*)$','102300').groups()

('102300','')

由于d+采用貪婪匹配,直接把后買呢0全部匹配了,結果0*只能匹配空字符串了。必須讓d+采用非貪婪匹配(也就是盡可能少匹配)此啊能把后面的0匹配出來,加個?就可以讓d+采用非貪婪匹配

>>> re.match(r'^(d+?)(0*)$','102300').groups()

('1023','00')

datetime

獲取當前日期和時間

>>> from datetime import datetime

>>> now = datetime.now() #獲取當前datetime

>>> print(now)

2015-05-18 16:23:23.192343

>>> print(type(now))

獲取指定日期和時間

要指定某個日期和時間,我們直接用參數構造一個datetime:

>>> from datetime import datetime

>>> dt = datetime(2015,4,19,12,20)

print(dt)

2015-04-19 12:20:00

datetime轉換為timestamp

在計算機中,時間上實際上是用數字表示的。我們把1970年1月1日00:00:00 UTC +00:00時區的時刻稱為epochtime,計為0(1970年以前的時間timestamp為負數),當前時間就是相對于epoch time的秒數,稱為timestamp

你可以認為

timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00

timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00

可見timestamp的值與時區毫無關系,因為timestamp一旦確定,其UTC時間就確定了,轉換到任意時區的時間也是完全確定的,這就是為什么計算機存儲的當前時間是以timestamp表示的,因為全球各地的計算機在任意時刻的timestamp都是完全相同的

把一個datetime類型轉換為timestamp只需要簡單調用timestamp()方法:

>>> from datetime import datetime

>>> dt = datetime(2015,4,19,12,20) #用指定日期創建datetime

>>> dt.timestamp()

1429417200.0

注意python的timestamp是一個浮點數。如果有小數位,小數位表示毫秒數

某些編程語言(如java和javascript)的timestamp使用整數表示毫秒數,這種情況下只需要把timestamp除以1000就得到python的浮點表示方法。

timestamp轉換為datetime

要把timestamp轉換為datetime,使用datetime提供的fromtimestamp()方法

>>> from datetime import datetime

>>> t = 1429417200.0

>>> print(datetime.fromtimestamp(t))

2015-04-19 12:20:00

注意到timestamp是一個浮點數,它沒有時區的概念,而datetime是有時區的。上述轉換是在timestamp和本地時間做轉換。

本地時間是指當前操作系統設定的時區。例如北京時區是東8區,則本地時間

2015-04-19 12:20:00

實際上就是UTC+8:00時區的時間

2015-04-19 12:20:00 UTC+8:00

timestamp也可以直接被轉換到UTC標準時區的時間

>>> from datetie import datetime

>>> t = 1429417200.0

>>> print(datetime.fromtimestamp(t))#本地時間

2015-04-19 12:20:00

>>> print(datetime.utcfromtimestamp(t))

2015-04-19 04:20:00

str轉為datetime

很多時候,用戶輸入的日期和時間是字符串,要處理日期和時間,首先必須把str轉換datetime。轉換方法是通過datetime.strptime()實現,需要一個日期和時間的格式化字符串

>>> from datetime import datetime

>>> cday = datetime.strptime('2015-6-1 18:19:59','%Y-%m-%d %H:%M:%s')

>>> print(cday)

2015-06-01 18:19:59

datetime轉換為str

如果已經有了datetime對象,要把它格式化為字符串顯示給用戶,就需要轉換為str,轉換方法是通過strftime()實現的,同樣需要一個日期和時間的格式化字符串

>>> from datetime import datetime

>>> now = datetime.now()

>>> print(now.strftime(%a,%b,%d %H:%M))

Mon,May 05 16:28

datetime加減

對日期和時間進行加減實際上就是把datetime往后或往前計算,得到新的datetime。加減可以直接用+和-運算符,不過需要導入timedelta這個類

>>> from datetime import datetime,timedelta

>>> now = datetime.now()

>>> now

datetime.datetime(2015,5,18,16,57,3,540997)

>>> now + timedelta(hours=10)

datetime.datetime(2015,5,19,2,57,3,540997)

>>> now - timedelta(days=1)

datetime.datetime(2015,5,17,16,57,3,540997)

>>> now + timedelta(days=2,hour=12)

datetime.datetime(2015,5,21,4,57,3,540997)

可見使用timedelta你可以很容易的算出前幾天和后幾天的時刻

本地時間轉換為UTC時間

本地時間是指系統設定時區的時間,例如北京時間是UTC+8:00時區的時間 而UTC時間指UTC+0:00時區的時間。一個datetime類型有一個時區屬性tzinfo,但默認為None,所以無法區分這個datetime到底是哪個時區,除非強行給datetime設置一個時區

>>> from datetime import datetime,timedelta,timezone

>>> tz_utc_8 = timezone(timedelta(hours=8))#創建時區UTC+8:00

>>> now = datetime.now()

小結

datetime表示的時間需要時區信息才能確定一個特定的時間,否則只能視為本地時間。

如果要存儲datetime,最佳方法是將其轉換為timestamp再存儲,因為timestamp的值與時區完全無關

collections

collections是python內建的一個集合模塊,提供了許多有用的集合類。

namedtuple

我們知道tuple可以表示不變的集合,例如一個點的二維坐標就可以表示成:

>>> p = (1,2)

但是,看到(1,2),很難看出這個tuple是用來表示一個坐標的。定義一個class又小題大做了,這時,namedtuple就爬上了用場

>>> from collections import namedtuple

>>> Point = namedtuple('Point',['x','y'])

>>> p = Point(1,2)

>>> p.x

1

>>> p.y

2

namedtuple是一個函數,它用來創建一個自定義的tuple對象,并且規定了tuple元素的個數,并可以用屬性而不是索引來引用tuple的某個元素

這樣以來,我們用namedtuple可以很方便的定義一種數據類型,它具備tuple的不變性,又可以根據屬性來引用,可以驗證創建的Point對象是tuple的一種子類

>>> isinstance(p,Point)

True

>>> isinstance(p,tuple)

True

類似的,如果要用坐標和半徑表示一個圓,也可以用namedtuple定義

# namedtuple('名稱',[屬性list])

Circle = namedtuple('Circle',['x','y','r'])

deque

使用list存儲數據時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性存儲,訪問量大的時候,插入和刪除效率很低。

deque是為了高效實現插入和刪除操作的雙向列表,適用于隊列和棧:

>>> from collections import deque

>>> q = deque(['a','b','c'])

>>> q.append('x')

>>> q.appendleft('y')

>>> q

deque(['y','a','b','c','x'])

deque除了實現list的append()和pop()外,還支持appendleft()和popleft()這樣就可以非常高效的往頭部添加或刪除元素。

defaultdict

使用dict時,如果引用的key不存在,就會拋出KeyError.如果希望key不存在時,返回一個默認值,就可以用defaultdict:

>>> from collections import defaultdict

>>> dd = defaultdict(lambda: 'N/A')

>>> dd['key1'] = 'abc'

>>> dd['key1']

'abc'

>>> dd['key2']

'N/A'

OrderedDict

使用dict時,Key是無序的。在對dict做迭代時,我們無法確定Key的順序。如果要保持Key的順序,可以用OrderedDict:

>>> from collections import OrderedDict

>>> d = dict([('a',1),('b',2),('c',3)])

>>> d

{'a':1,'c':3,'b':2}

>>> od = OrderedDict([('a',1),('b',2),('c',3)])

>>> od

OrderedDict([('a',1),('b',2),('c',3)])

注意,OrderedDict的Key會按照插入的順序排列,不是Key本身排序

>>> od = OrderedDict()

>>> od['z'] = 1

>>> od['y'] = 2

>>> od['x'] = 3

>>> list(od.keys())

['z','y','x']

Counter

Counter是一個簡單的計數器,例如,統計字符出現的個數

>>> from collections import Counter

>>> c = Counter()

>>> for ch in 'programming'

c[ch] = c[ch] + 1

>>> c

Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})

base64

base64是一種用64個字符來表示任意二進制數據的方法。

用記事本打開exe、jpg、pdf這些文件時,我們都會看到一大堆亂碼,因為二進制文件包含很多無法打印和顯示的字符,所以,如果要讓記事本這樣的文本處理軟件能處理二進制數據,就需要一個二進制到字符串的轉換方法。Base64是一種最常見的二進制編碼方法。Base的原理很簡單,首先準備一個包含64個字符的數組

[‘A’,’B’,’C’,….,’a’,’b’,’c’……,’0’,’1’…’+’,’/‘]

然后對二進制數據進行處理,每3個字節一組一共是3*8=24bit,劃分為4組,魅族正好6個bit.

這樣我們得到4個數字作為索引,然后查表獲得相應的4個字符,就是編碼后的字符串。所以Base編碼會把3字節的二進制數據編碼為4個字節的文本數據,長度增加33%,好處是編碼后的文本數據可以在郵件正文、網頁等直接顯示。如果要編碼的二進制數據不是3的倍數,最后會剩下1個或2個字節怎么辦?Base用x00字節在末尾補足后,再在編碼的末尾加上1個或2個=號,表示補了多少字節,解碼的時候會自動去掉。

python內置的base64可以直接進行base64的編解碼

>>> import base64

>>> base64.b64encode(b'binaryx00string')

b'YmluYXJ5AHN0cmluZw=='

>>> base64.b64decode(b'YmluYXJ5AHN0cmluZw==')

b'binaryx00string'

由于標準的Base64編碼后可能出現的字符+和/,在URL中就不能直接作為參數,所以又有一種”url safe”的base64編碼,其實就是把字符+和/分別變成-和_

>>> base64.b64encode(b'ixb7x1dxfbxefxff')

b'abcd++//'

>>> base64.urlsafe_b64encode(b'ixb7x1dxfbxefxff')

b'abcd--__'

>>> base64.urlsafe_b64decode('abcd--__')

b'ixb7x1dxfbxefxff'

HTMLParser

如果我們要編寫一個搜索引擎,第一步是用爬蟲把目標網站的頁面抓下來,第二步就是解析該HTML頁面,到底是新聞、圖片還是視頻。

假設第一步已經完成了,第二步應該如何解析HTML呢?

HTML本質是XML的子集,但是HTMl的語法沒有XML那么嚴格,所以不能用標準的DO們或SAX來解析HTML。

好在python提供了HTMLParser來解析HTML,只需簡單幾行代碼:

>>> from html.parser import HTMLParser

>>> from hrml.entities import name2codepoint

class MyHTMLParser(HTMLParser):

def handle_starttag(self,tag,attrs):

print('' % tag)

def handle_endtag(self,tag):

print('%s>' % tag)

def handle_startendtag(self,tag,attrs):

print('' % tag)

def handle_data(self,data):

print(data)

def handle_comment(self,data):

print('')

def handle_entityref(self,name):

print('&%s;' % name)

def handle_charref(self,name):

print('%s;' % name)

parser = MyHTMLPaeser()

paser.feed('''

Some html HTML?tutorial...
END

''')

feed()方法可以多次調用,也就是不一定一次把整個HTML字符串都塞進去,可以一部分一部分塞進去。

特殊字符有兩種,一種是英文表示的?,一種是數字表示的?,這兩種字符都可以通過Parser解析出來。

urllib

urillib提供了一系列用于操作URL的功能。

Get

urllib的request模塊可以非常方便的抓取URL內容,也就是發送一個GET請求到指定的頁面,然后返回HTTP響應:

例如,對豆瓣的一個URLhttps://api.douban.com/v2/book/2129650進行抓取,并返回響應

from urllib import request

with request.urlopen(‘https://api.douban.com/v2/book/2129650')as f:

data = f.read();

print(‘Status:’,f.status,f.reason)

for k,v in f.getheaders():

print(‘%s: %s’ % (k,v))

print(‘Data:’,data.decode(‘utf-8’))

可以看到HTTP響應頭和JSON數據

Status: 200 OK

Server: nginx

Date: Tue, 26 May 2015 10:02:27 GMT

Content-Type: application/json; charset=utf-8

Content-Length: 2049

Connection: close

Expires: Sun, 1 Jan 2006 01:00:00 GMT

Pragma: no-cache

Cache-Control: must-revalidate, no-cache, private

X-DAE-Node: pidl1

Data: {“rating”:{“max”:10,”numRaters”:16,”average”:”7.4”,”min”:0},”subtitle”:””,”author”:[“廖雪峰編著”],”pubdate”:”2007-6”,”tags”:[{“count”:20,”name”:”spring”,”title”:”spring”}…}

如果我們想要模擬瀏覽器發送GET請求,就需要使用Request對象,通過往Request對象添加HTTp頭,我們就可以把請求偽裝成瀏覽器。例如,模擬iphone6去請求豆瓣首頁

from urllib import request

req = request.Request(‘http://www.douban.com/‘)

req.add_header(‘User-Agent’, ‘Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25’)

with request.urlopen(req) as f:

print(‘Status:’,f.status,f.reason)

for k,v in f.getheaders():

print(‘%s: %s’ % (k,v))

print(‘Data:’,f.read().decode(‘utf-8’))

這樣豆瓣會返回適合iphone的移動版網頁:

Post

如果要以POST發送一個請求,只需要把參數data以bytes形式傳入。

我們模擬一個微博登錄,先讀取登陸的郵箱和口令,然后按照weibo.cn的登陸頁格式以username=xxx&password=xxx的編碼傳入:

from urllib import request,parse

print(‘Login to weibo.cn…’)

email = input(‘Email:’)

passwd = input(‘Password:’)

login_data = parse.urlencode([

(‘username’,email),

(‘password’,passwd),

(‘client_id’,’’),

(‘savestate’,’1’)

(‘ec’,’’),

(‘pagerefer’,’https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F‘)

])

req = request.Request(‘https://passport.weibo.cn/sso/login‘)

req.add_header(‘Origin’,’https://passport.weobo.cn‘)

req.add_header(‘User-Agent’, ‘Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25’)

req.add_header(‘Referer’, ‘https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F‘)

with request.urlopen(req,data=login_data.encode(‘utf-8’)) as f:

print(‘Status:’,f.status,f.reason)

for k,v in f.getheaders():

print(‘%s: %s’ % (k,v))

print(‘Data:’,f.read().decode(‘utf-8’))

如果登陸成功,我們獲得的響應如下:

Status:200 ok

Server: nginx/1.2.0

Set-Cookie: SSOLoginState=1432620126; path=/; domain=weibo.cn

Data: {“retcode”:20000000,”msg”:””,”data”:{…,”uid”:”1658384301”}}

如果登陸失敗,我們獲得的響應如下:

Data: {“retcode”:50011015,”msg”:”u7528u6237u540du6216u5bc6u7801u9519u8bef”,”data”:{“username”:[email?protected],”errline”:536}}

Handler

如果還需要更復雜的控制,比如通過一個Proxy去訪問網站,我們需要利用ProxyHandler來處理,實例代碼如下:

proxy_handler = urllib.request.ProxyHandler({‘http’: ‘http://www.example.com:3128/'})

proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()

proxy_auth_handler.add_password(‘realm’, ‘host’, ‘username’, ‘password’)

opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)

with opener.open(‘http://www.example.com/login.html‘) as f:

pass

總結

以上是生活随笔為你收集整理的python123动物重量排序_python进阶的全部內容,希望文章能夠幫你解決所遇到的問題。

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

成人动漫在线观看 | 久久久久成人片免费观看蜜芽 | 亚洲中文字幕在线观看 | 一本无码人妻在中文字幕免费 | 小鲜肉自慰网站xnxx | 99精品久久毛片a片 | 国产免费无码一区二区视频 | 人人妻人人澡人人爽人人精品 | 久久这里只有精品视频9 | 日日天日日夜日日摸 | 国产成人亚洲综合无码 | 亚洲综合色区中文字幕 | 76少妇精品导航 | 国产成人无码av一区二区 | 18黄暴禁片在线观看 | 国产av一区二区三区最新精品 | 色老头在线一区二区三区 | 亚洲日本va中文字幕 | 强伦人妻一区二区三区视频18 | 日韩 欧美 动漫 国产 制服 | 午夜精品久久久内射近拍高清 | 日本大乳高潮视频在线观看 | 午夜精品久久久内射近拍高清 | 伊人久久大香线蕉av一区二区 | 亚洲精品www久久久 | 久在线观看福利视频 | 装睡被陌生人摸出水好爽 | 久久无码专区国产精品s | 亚洲精品国产第一综合99久久 | 成人免费视频视频在线观看 免费 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 日本精品人妻无码免费大全 | 日韩精品无码一本二本三本色 | 性生交片免费无码看人 | 精品一区二区三区无码免费视频 | 亚洲人成网站免费播放 | 一区二区三区乱码在线 | 欧洲 | 啦啦啦www在线观看免费视频 | 国产精品久久国产三级国 | 日日摸日日碰夜夜爽av | 综合激情五月综合激情五月激情1 | 亚洲国产成人a精品不卡在线 | 欧美激情综合亚洲一二区 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 巨爆乳无码视频在线观看 | 亚洲第一无码av无码专区 | 亚洲国产精品美女久久久久 | 成人精品天堂一区二区三区 | 成人欧美一区二区三区黑人 | 国产亚洲精品久久久久久大师 | 国产色在线 | 国产 | 国产9 9在线 | 中文 | 俄罗斯老熟妇色xxxx | 国产特级毛片aaaaaaa高清 | 香港三级日本三级妇三级 | 人人澡人摸人人添 | 强辱丰满人妻hd中文字幕 | 午夜肉伦伦影院 | 99久久精品日本一区二区免费 | 亚洲中文字幕无码一久久区 | 国产精品成人av在线观看 | aⅴ在线视频男人的天堂 | 精品日本一区二区三区在线观看 | a在线观看免费网站大全 | 久久精品中文字幕大胸 | 人人妻人人藻人人爽欧美一区 | 国产无遮挡又黄又爽又色 | 无码国内精品人妻少妇 | 成人无码影片精品久久久 | 老太婆性杂交欧美肥老太 | aa片在线观看视频在线播放 | 大色综合色综合网站 | 成人无码精品1区2区3区免费看 | 男女猛烈xx00免费视频试看 | 国产国语老龄妇女a片 | 精品无码一区二区三区爱欲 | 亚洲国产精品一区二区美利坚 | 欧美性生交xxxxx久久久 | 伊人久久婷婷五月综合97色 | 亚洲成a人片在线观看日本 | 最新国产乱人伦偷精品免费网站 | 荫蒂被男人添的好舒服爽免费视频 | 国产九九九九九九九a片 | 国产莉萝无码av在线播放 | 久久 国产 尿 小便 嘘嘘 | 东京无码熟妇人妻av在线网址 | 久久久精品国产sm最大网站 | 国产高清av在线播放 | 黑人巨大精品欧美一区二区 | 色综合久久久久综合一本到桃花网 | 中文字幕日韩精品一区二区三区 | 久久久中文字幕日本无吗 | 天天av天天av天天透 | 动漫av网站免费观看 | 少妇无套内谢久久久久 | 澳门永久av免费网站 | 亚洲熟妇自偷自拍另类 | 午夜成人1000部免费视频 | 亚洲综合色区中文字幕 | 精品无码一区二区三区的天堂 | 国产凸凹视频一区二区 | 人妻与老人中文字幕 | 最新版天堂资源中文官网 | 欧美 日韩 亚洲 在线 | 四虎国产精品一区二区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 成在人线av无码免观看麻豆 | 好爽又高潮了毛片免费下载 | 日本在线高清不卡免费播放 | 一本精品99久久精品77 | 免费无码一区二区三区蜜桃大 | 亚洲欧美中文字幕5发布 | 国产疯狂伦交大片 | 国产熟妇高潮叫床视频播放 | 久久久精品456亚洲影院 | 麻豆成人精品国产免费 | 人妻少妇被猛烈进入中文字幕 | 欧美熟妇另类久久久久久不卡 | 午夜精品久久久内射近拍高清 | 亚洲の无码国产の无码影院 | 日本精品高清一区二区 | 国产区女主播在线观看 | 久久综合网欧美色妞网 | 成 人 免费观看网站 | 欧美阿v高清资源不卡在线播放 | 色一情一乱一伦一视频免费看 | 玩弄人妻少妇500系列视频 | 久久99精品久久久久久动态图 | 国产性生交xxxxx无码 | 成人女人看片免费视频放人 | 高中生自慰www网站 | 性开放的女人aaa片 | 成 人影片 免费观看 | 内射白嫩少妇超碰 | 奇米影视888欧美在线观看 | 学生妹亚洲一区二区 | 国产成人无码av片在线观看不卡 | 欧美成人午夜精品久久久 | 欧洲精品码一区二区三区免费看 | 夜夜躁日日躁狠狠久久av | 又黄又爽又色的视频 | 久久精品人人做人人综合试看 | 在线a亚洲视频播放在线观看 | 亚洲欧美综合区丁香五月小说 | 一二三四在线观看免费视频 | 色窝窝无码一区二区三区色欲 | 国产绳艺sm调教室论坛 | 中文字幕色婷婷在线视频 | 乱人伦人妻中文字幕无码久久网 | 国产成人综合在线女婷五月99播放 | 国产免费久久精品国产传媒 | 一本色道婷婷久久欧美 | 中文字幕乱妇无码av在线 | 国产麻豆精品一区二区三区v视界 | 一本大道久久东京热无码av | 无码人妻av免费一区二区三区 | 亚洲一区二区三区香蕉 | 女人高潮内射99精品 | 精品厕所偷拍各类美女tp嘘嘘 | 大地资源网第二页免费观看 | 国内精品人妻无码久久久影院 | 无码毛片视频一区二区本码 | 亚洲小说图区综合在线 | 婷婷五月综合缴情在线视频 | 亚洲日韩av一区二区三区中文 | 亚洲中文字幕在线无码一区二区 | 又色又爽又黄的美女裸体网站 | 久久久久久亚洲精品a片成人 | 啦啦啦www在线观看免费视频 | 亚洲另类伦春色综合小说 | 大地资源网第二页免费观看 | 小sao货水好多真紧h无码视频 | 97久久国产亚洲精品超碰热 | 免费人成在线视频无码 | 久久人人97超碰a片精品 | 成在人线av无码免观看麻豆 | 日本一本二本三区免费 | 精品乱码久久久久久久 | 日日噜噜噜噜夜夜爽亚洲精品 | 领导边摸边吃奶边做爽在线观看 | 真人与拘做受免费视频一 | 香港三级日本三级妇三级 | 无码一区二区三区在线观看 | 人妻夜夜爽天天爽三区 | 天干天干啦夜天干天2017 | 激情五月综合色婷婷一区二区 | 亚洲色在线无码国产精品不卡 | 久久精品国产一区二区三区 | 亚洲色欲久久久综合网东京热 | 欧美 丝袜 自拍 制服 另类 | 午夜熟女插插xx免费视频 | 亚洲色www成人永久网址 | 亚洲精品一区二区三区四区五区 | 国产三级精品三级男人的天堂 | 无码任你躁久久久久久久 | 国产综合久久久久鬼色 | 日韩少妇内射免费播放 | 国产精品亚洲专区无码不卡 | 国产精品亚洲а∨无码播放麻豆 | 久久久亚洲欧洲日产国码αv | 久久综合久久自在自线精品自 | 午夜时刻免费入口 | 欧美色就是色 | 久久国语露脸国产精品电影 | 亚洲成色在线综合网站 | 色综合视频一区二区三区 | 最新国产乱人伦偷精品免费网站 | 亚洲中文字幕无码中字 | 影音先锋中文字幕无码 | 一二三四在线观看免费视频 | 日本精品少妇一区二区三区 | 精品国产乱码久久久久乱码 | 对白脏话肉麻粗话av | 国产激情精品一区二区三区 | 国产成人精品视频ⅴa片软件竹菊 | 黄网在线观看免费网站 | 国产亚洲精品久久久ai换 | 欧美三级a做爰在线观看 | 东京热无码av男人的天堂 | 久久99精品国产麻豆蜜芽 | 无码人妻丰满熟妇区毛片18 | 日日碰狠狠躁久久躁蜜桃 | 一个人看的视频www在线 | 亚洲成熟女人毛毛耸耸多 | 亚洲大尺度无码无码专区 | 亚洲日韩av一区二区三区中文 | 亚洲 日韩 欧美 成人 在线观看 | 国产香蕉尹人综合在线观看 | 国产麻豆精品精东影业av网站 | 亚洲热妇无码av在线播放 | 欧美第一黄网免费网站 | 精品国产一区二区三区av 性色 | 精品人妻中文字幕有码在线 | 亚洲国产一区二区三区在线观看 | 日产国产精品亚洲系列 | 亚洲日韩乱码中文无码蜜桃臀网站 | 欧美性生交xxxxx久久久 | 欧美高清在线精品一区 | 欧美熟妇另类久久久久久多毛 | 国产午夜福利100集发布 | 午夜不卡av免费 一本久久a久久精品vr综合 | 装睡被陌生人摸出水好爽 | 老太婆性杂交欧美肥老太 | 国产精华av午夜在线观看 | 成熟女人特级毛片www免费 | 乌克兰少妇xxxx做受 | 国产精品美女久久久 | 成 人影片 免费观看 | 欧美日韩亚洲国产精品 | 欧美人妻一区二区三区 | 无码人妻出轨黑人中文字幕 | 精品国产aⅴ无码一区二区 | 久久亚洲精品成人无码 | 水蜜桃av无码 | 精品无码国产自产拍在线观看蜜 | 日韩 欧美 动漫 国产 制服 | 国产三级久久久精品麻豆三级 | 特黄特色大片免费播放器图片 | 国产成人一区二区三区别 | 国产一区二区不卡老阿姨 | a片在线免费观看 | 人妻尝试又大又粗久久 | 无码中文字幕色专区 | 樱花草在线社区www | 四虎影视成人永久免费观看视频 | 国产精品久久久午夜夜伦鲁鲁 | 国产成人无码午夜视频在线观看 | 无码人妻av免费一区二区三区 | 丝袜美腿亚洲一区二区 | 99er热精品视频 | 欧美国产亚洲日韩在线二区 | 精品久久久无码中文字幕 | 中国女人内谢69xxxxxa片 | 精品一区二区不卡无码av | 国产口爆吞精在线视频 | 国产成人久久精品流白浆 | 精品久久久中文字幕人妻 | 国产色xx群视频射精 | 老子影院午夜伦不卡 | 欧美喷潮久久久xxxxx | 成人av无码一区二区三区 | 色欲人妻aaaaaaa无码 | 国产综合在线观看 | 国产精品第一国产精品 | 亚洲一区二区观看播放 | 国产精品无码一区二区桃花视频 | 丁香花在线影院观看在线播放 | 色欲久久久天天天综合网精品 | 成人试看120秒体验区 | 国产成人无码区免费内射一片色欲 | 国产精品第一区揄拍无码 | 极品嫩模高潮叫床 | 久久久成人毛片无码 | 欧美野外疯狂做受xxxx高潮 | 色五月五月丁香亚洲综合网 | 国产精品美女久久久网av | 色婷婷香蕉在线一区二区 | 亚洲第一网站男人都懂 | 丰满少妇弄高潮了www | 国产午夜福利亚洲第一 | 成人试看120秒体验区 | 亚洲色大成网站www | 亚洲中文字幕在线观看 | 丝袜人妻一区二区三区 | 成人一区二区免费视频 | 四十如虎的丰满熟妇啪啪 | 动漫av网站免费观看 | 老司机亚洲精品影院 | 日本丰满熟妇videos | 久久人妻内射无码一区三区 | 无码国产色欲xxxxx视频 | 麻豆md0077饥渴少妇 | 中文字幕无码日韩专区 | 久久综合九色综合欧美狠狠 | 欧美性生交活xxxxxdddd | 无码人妻精品一区二区三区下载 | 人人妻在人人 | 中文字幕无码人妻少妇免费 | 久久久精品人妻久久影视 | 国内精品人妻无码久久久影院 | 欧美精品一区二区精品久久 | 久久国产精品精品国产色婷婷 | 中文字幕人成乱码熟女app | 久久国产劲爆∧v内射 | 亚洲国产欧美在线成人 | 成人无码精品一区二区三区 | 精品成人av一区二区三区 | 国产极品视觉盛宴 | 图片区 小说区 区 亚洲五月 | 亚洲精品中文字幕乱码 | 女人色极品影院 | 精品人妻av区 | 免费无码肉片在线观看 | 久精品国产欧美亚洲色aⅴ大片 | 久久国产精品二国产精品 | 久久99热只有频精品8 | 天天摸天天透天天添 | 亚洲码国产精品高潮在线 | 亚洲精品久久久久久一区二区 | 蜜桃视频韩日免费播放 | 熟妇人妻无码xxx视频 | 中文字幕无码人妻少妇免费 | 亚洲男人av香蕉爽爽爽爽 | 成 人影片 免费观看 | 久久久久成人片免费观看蜜芽 | 伊人色综合久久天天小片 | 99久久精品日本一区二区免费 | 一本久道久久综合狠狠爱 | 曰本女人与公拘交酡免费视频 | 欧洲精品码一区二区三区免费看 | 精品久久8x国产免费观看 | 亚洲中文字幕在线无码一区二区 | 国产极品美女高潮无套在线观看 | 1000部夫妻午夜免费 | 99在线 | 亚洲 | 国产亚洲人成在线播放 | 曰韩少妇内射免费播放 | 国产莉萝无码av在线播放 | 久久久中文字幕日本无吗 | 色婷婷综合激情综在线播放 | 国产午夜亚洲精品不卡下载 | 日韩精品a片一区二区三区妖精 | 欧美人与善在线com | 久久99久久99精品中文字幕 | 国产在线精品一区二区高清不卡 | 日韩亚洲欧美中文高清在线 | 国产人妻人伦精品 | 男人扒开女人内裤强吻桶进去 | 日韩精品乱码av一区二区 | 国产办公室秘书无码精品99 | 国产成人一区二区三区别 | 奇米影视7777久久精品人人爽 | 午夜免费福利小电影 | 成人动漫在线观看 | 中文字幕 亚洲精品 第1页 | 无码精品国产va在线观看dvd | 欧美国产亚洲日韩在线二区 | 亚洲国产精品久久久天堂 | 日韩亚洲欧美中文高清在线 | 精品亚洲成av人在线观看 | 人妻少妇精品无码专区二区 | 精品欧美一区二区三区久久久 | 亚洲成a人片在线观看无码 | 无码人中文字幕 | 高清不卡一区二区三区 | 精品国产精品久久一区免费式 | 亚洲国产欧美日韩精品一区二区三区 | 日韩欧美群交p片內射中文 | 国产乱人无码伦av在线a | 中文精品无码中文字幕无码专区 | 精品乱码久久久久久久 | 久久久亚洲欧洲日产国码αv | 日日躁夜夜躁狠狠躁 | 亚洲色www成人永久网址 | 无码人妻少妇伦在线电影 | 在线视频网站www色 | 亚洲中文字幕乱码av波多ji | 国产精品成人av在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 两性色午夜免费视频 | 香港三级日本三级妇三级 | 熟妇人妻无乱码中文字幕 | 99精品视频在线观看免费 | 精品国产精品久久一区免费式 | 5858s亚洲色大成网站www | 一本加勒比波多野结衣 | 狂野欧美性猛xxxx乱大交 | 色狠狠av一区二区三区 | 麻豆蜜桃av蜜臀av色欲av | 国内揄拍国内精品少妇国语 | 久久久中文久久久无码 | 色偷偷人人澡人人爽人人模 | 美女扒开屁股让男人桶 | 强伦人妻一区二区三区视频18 | 图片区 小说区 区 亚洲五月 | 亚洲国产精品无码一区二区三区 | 亚洲人成人无码网www国产 | 欧美野外疯狂做受xxxx高潮 | 亚洲国产精品无码一区二区三区 | 色情久久久av熟女人妻网站 | 东京热男人av天堂 | 无码帝国www无码专区色综合 | 国产成人无码午夜视频在线观看 | 午夜无码区在线观看 | 九九在线中文字幕无码 | 精品 日韩 国产 欧美 视频 | 精品久久综合1区2区3区激情 | 精品国产成人一区二区三区 | 熟妇女人妻丰满少妇中文字幕 | 亚洲高清偷拍一区二区三区 | 欧美熟妇另类久久久久久不卡 | 中文无码精品a∨在线观看不卡 | 亚洲中文无码av永久不收费 | 久久这里只有精品视频9 | 人妻熟女一区 | 久久久久亚洲精品男人的天堂 | 久久午夜无码鲁丝片午夜精品 | 永久免费精品精品永久-夜色 | 久久久久久av无码免费看大片 | 亚洲欧洲日本无在线码 | 日本一卡2卡3卡四卡精品网站 | 国产电影无码午夜在线播放 | 精品成在人线av无码免费看 | 青青青爽视频在线观看 | 男女爱爱好爽视频免费看 | 天干天干啦夜天干天2017 | ass日本丰满熟妇pics | 成熟妇人a片免费看网站 | 久久精品丝袜高跟鞋 | 日本va欧美va欧美va精品 | 一个人免费观看的www视频 | 97精品人妻一区二区三区香蕉 | 激情综合激情五月俺也去 | 国产精品久久久久影院嫩草 | 99久久无码一区人妻 | 天天拍夜夜添久久精品大 | 99久久人妻精品免费一区 | 人妻中文无码久热丝袜 | 国产人妻精品一区二区三区 | 国产亚洲精品久久久ai换 | 2019nv天堂香蕉在线观看 | 精品国产麻豆免费人成网站 | 免费视频欧美无人区码 | 欧美日韩在线亚洲综合国产人 | 亚洲国产一区二区三区在线观看 | 无码av免费一区二区三区试看 | 亚洲国产精品成人久久蜜臀 | 牲欲强的熟妇农村老妇女视频 | 九九在线中文字幕无码 | 激情亚洲一区国产精品 | 国产人妻精品一区二区三区不卡 | 成熟妇人a片免费看网站 | 强辱丰满人妻hd中文字幕 | 亚洲精品一区二区三区在线 | 露脸叫床粗话东北少妇 | 在线播放免费人成毛片乱码 | 久久久精品456亚洲影院 | 少妇一晚三次一区二区三区 | 国产精品无码一区二区三区不卡 | 粉嫩少妇内射浓精videos | 人人妻人人藻人人爽欧美一区 | 草草网站影院白丝内射 | www国产亚洲精品久久久日本 | 蜜臀aⅴ国产精品久久久国产老师 | 中文字幕无码日韩欧毛 | 在线欧美精品一区二区三区 | 国产精品亚洲一区二区三区喷水 | 国产激情一区二区三区 | 无人区乱码一区二区三区 | 丰满人妻翻云覆雨呻吟视频 | 国产美女精品一区二区三区 | 狠狠躁日日躁夜夜躁2020 | 在教室伦流澡到高潮hnp视频 | 丰满肥臀大屁股熟妇激情视频 | 成人毛片一区二区 | 中文字幕无码免费久久99 | 久热国产vs视频在线观看 | 国产激情综合五月久久 | 呦交小u女精品视频 | 国产在线aaa片一区二区99 | 免费人成在线视频无码 | 亚洲一区二区三区香蕉 | 国产精品国产三级国产专播 | 无码帝国www无码专区色综合 | 国产三级精品三级男人的天堂 | 乱人伦人妻中文字幕无码久久网 | 久久久久久九九精品久 | 久久久久成人片免费观看蜜芽 | 亚洲狠狠色丁香婷婷综合 | 欧洲欧美人成视频在线 | 国产乱人伦av在线无码 | 久久久精品人妻久久影视 | 亚洲欧洲中文日韩av乱码 | 亚洲欧美色中文字幕在线 | 国产 精品 自在自线 | 一本大道久久东京热无码av | 欧美 日韩 亚洲 在线 | 玩弄少妇高潮ⅹxxxyw | 国产色视频一区二区三区 | 国产精品无码一区二区桃花视频 | 国产精品久久久久7777 | 玩弄中年熟妇正在播放 | 中文字幕日韩精品一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 狠狠色色综合网站 | 日本一区二区三区免费高清 | 真人与拘做受免费视频一 | 精品久久久久久人妻无码中文字幕 | 欧美放荡的少妇 | 精品国产aⅴ无码一区二区 | 日韩精品无码免费一区二区三区 | 成在人线av无码免观看麻豆 | 亚洲精品成人av在线 | 中文毛片无遮挡高清免费 | 亚洲熟熟妇xxxx | 亚洲精品一区二区三区在线观看 | 亚洲码国产精品高潮在线 | 国产成人一区二区三区在线观看 | 久在线观看福利视频 | 亚洲国产精品成人久久蜜臀 | 亚洲一区二区三区在线观看网站 | 国产亚av手机在线观看 | 人妻尝试又大又粗久久 | 爽爽影院免费观看 | 97精品国产97久久久久久免费 | 国产精品嫩草久久久久 | 成人一在线视频日韩国产 | 日韩精品一区二区av在线 | 亚洲一区二区三区含羞草 | 日本精品人妻无码免费大全 | 亚洲成a人片在线观看无码3d | 一个人看的www免费视频在线观看 | 乱人伦人妻中文字幕无码 | 在线欧美精品一区二区三区 | 欧美国产亚洲日韩在线二区 | 在线播放免费人成毛片乱码 | 国产熟女一区二区三区四区五区 | 亚拍精品一区二区三区探花 | 亚洲中文字幕成人无码 | 久久精品成人欧美大片 | 亚洲日韩中文字幕在线播放 | 扒开双腿疯狂进出爽爽爽视频 | 国产sm调教视频在线观看 | 欧美日韩一区二区综合 | 性生交大片免费看l | 麻豆果冻传媒2021精品传媒一区下载 | 国产性生交xxxxx无码 | 美女毛片一区二区三区四区 | 精品久久久久久人妻无码中文字幕 | 2020久久香蕉国产线看观看 | 国产精品美女久久久久av爽李琼 | 亚洲国产成人av在线观看 | 久久久av男人的天堂 | 亚洲精品久久久久avwww潮水 | 在线成人www免费观看视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产成人精品一区二区在线小狼 | 中文字幕乱码人妻二区三区 | 波多野结衣aⅴ在线 | 蜜臀av在线播放 久久综合激激的五月天 | 亚洲国产精品美女久久久久 | 又大又硬又爽免费视频 | 搡女人真爽免费视频大全 | 大屁股大乳丰满人妻 | 国产两女互慰高潮视频在线观看 | 内射后入在线观看一区 | 国产亚洲美女精品久久久2020 | 久热国产vs视频在线观看 | 西西人体www44rt大胆高清 | 午夜免费福利小电影 | 亚洲欧美日韩成人高清在线一区 | 国产精品丝袜黑色高跟鞋 | 成人动漫在线观看 | 强伦人妻一区二区三区视频18 | 日本熟妇人妻xxxxx人hd | 国产激情无码一区二区app | 人人妻人人澡人人爽人人精品浪潮 | 国产人妻精品一区二区三区不卡 | 国产黄在线观看免费观看不卡 | 麻豆蜜桃av蜜臀av色欲av | 宝宝好涨水快流出来免费视频 | 国产人成高清在线视频99最全资源 | 成人动漫在线观看 | 少妇被黑人到高潮喷出白浆 | 爱做久久久久久 | 鲁大师影院在线观看 | 国产成人综合在线女婷五月99播放 | 国产在线无码精品电影网 | 亚洲国产精品无码久久久久高潮 | 久久久成人毛片无码 | 人妻有码中文字幕在线 | 日韩人妻系列无码专区 | 国产69精品久久久久app下载 | 欧美人与牲动交xxxx | 蜜臀aⅴ国产精品久久久国产老师 | 在线观看免费人成视频 | 亚洲成av人片天堂网无码】 | www成人国产高清内射 | 久久综合色之久久综合 | 久久99精品国产.久久久久 | 亚洲高清偷拍一区二区三区 | 欧美黑人性暴力猛交喷水 | 夜精品a片一区二区三区无码白浆 | 国产午夜视频在线观看 | 欧美日韩一区二区免费视频 | 亚洲高清偷拍一区二区三区 | 久久99精品国产麻豆蜜芽 | 国内精品一区二区三区不卡 | 国产九九九九九九九a片 | 人人妻人人藻人人爽欧美一区 | 国产精品人人爽人人做我的可爱 | 色综合视频一区二区三区 | 久久人人97超碰a片精品 | 又湿又紧又大又爽a视频国产 | 免费乱码人妻系列无码专区 | 波多野结衣高清一区二区三区 | 亚洲男人av天堂午夜在 | 国产成人人人97超碰超爽8 | 亚洲国产成人av在线观看 | 亚洲精品一区二区三区婷婷月 | 欧美激情综合亚洲一二区 | 熟女体下毛毛黑森林 | 日韩精品乱码av一区二区 | ass日本丰满熟妇pics | 亚洲日本va中文字幕 | 色婷婷久久一区二区三区麻豆 | 内射老妇bbwx0c0ck | 亚洲国产午夜精品理论片 | 日日摸日日碰夜夜爽av | 国产亚洲欧美在线专区 | 鲁鲁鲁爽爽爽在线视频观看 | 超碰97人人做人人爱少妇 | 久久国产精品精品国产色婷婷 | 蜜桃无码一区二区三区 | 国内精品久久久久久中文字幕 | 国产精品久久久久久久影院 | 精品人妻中文字幕有码在线 | 四十如虎的丰满熟妇啪啪 | 国产热a欧美热a在线视频 | 亚洲国产精品久久人人爱 | 99国产欧美久久久精品 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产精品嫩草久久久久 | 国产激情精品一区二区三区 | 欧美熟妇另类久久久久久多毛 | 理论片87福利理论电影 | 巨爆乳无码视频在线观看 | 日日麻批免费40分钟无码 | 欧美人妻一区二区三区 | 亚洲国产成人av在线观看 | 少妇无码吹潮 | 激情国产av做激情国产爱 | 欧美人与善在线com | 亚洲色欲色欲欲www在线 | 亚洲理论电影在线观看 | 成人欧美一区二区三区 | 亚洲高清偷拍一区二区三区 | 国产午夜亚洲精品不卡下载 | 日日夜夜撸啊撸 | 亚洲乱码中文字幕在线 | 青青青手机频在线观看 | 亚洲欧洲中文日韩av乱码 | 少妇一晚三次一区二区三区 | 精品国偷自产在线视频 | 国产欧美熟妇另类久久久 | 无码人妻精品一区二区三区不卡 | 狠狠色欧美亚洲狠狠色www | 永久免费观看美女裸体的网站 | 国产舌乚八伦偷品w中 | www国产亚洲精品久久久日本 | 国产成人无码a区在线观看视频app | 亚洲精品一区二区三区在线 | 久久久久亚洲精品中文字幕 | 亚洲精品中文字幕久久久久 | 日本欧美一区二区三区乱码 | 永久免费观看国产裸体美女 | 日韩精品一区二区av在线 | 日本一卡二卡不卡视频查询 | 啦啦啦www在线观看免费视频 | 波多野结衣aⅴ在线 | 无码乱肉视频免费大全合集 | 久久久成人毛片无码 | 黄网在线观看免费网站 | 黑人大群体交免费视频 | 久久国内精品自在自线 | 麻豆国产97在线 | 欧洲 | 大肉大捧一进一出视频出来呀 | 精品久久久久久人妻无码中文字幕 | 亚洲の无码国产の无码影院 | 午夜熟女插插xx免费视频 | 国产97色在线 | 免 | 亚洲熟妇色xxxxx欧美老妇 | 人妻熟女一区 | 国产两女互慰高潮视频在线观看 | 少妇无码吹潮 | 一本久道久久综合狠狠爱 | 学生妹亚洲一区二区 | 国产高清不卡无码视频 | 中文无码成人免费视频在线观看 | 欧美高清在线精品一区 | 亚洲啪av永久无码精品放毛片 | 少妇性l交大片欧洲热妇乱xxx | 毛片内射-百度 | 国产无遮挡又黄又爽免费视频 | 亚洲爆乳精品无码一区二区三区 | 国产人妻久久精品二区三区老狼 | 奇米影视888欧美在线观看 | 午夜精品一区二区三区在线观看 | 色一情一乱一伦一视频免费看 | 成人免费无码大片a毛片 | 免费国产黄网站在线观看 | 国产人妻精品午夜福利免费 | 久久久久久亚洲精品a片成人 | 国产一区二区三区日韩精品 | 国精产品一区二区三区 | 极品嫩模高潮叫床 | 正在播放老肥熟妇露脸 | 亚洲人成人无码网www国产 | 樱花草在线社区www | 中文字幕无码热在线视频 | 欧美老人巨大xxxx做受 | 99久久精品午夜一区二区 | 日韩人妻无码一区二区三区久久99 | 欧美国产日韩亚洲中文 | 丰满妇女强制高潮18xxxx | 亚洲爆乳精品无码一区二区三区 | 国产在线无码精品电影网 | 久久亚洲日韩精品一区二区三区 | 精品国产福利一区二区 | 国产人妻精品一区二区三区不卡 | 18黄暴禁片在线观看 | 成人试看120秒体验区 | 中文字幕无码热在线视频 | 国产三级久久久精品麻豆三级 | 内射后入在线观看一区 | 亚洲精品无码人妻无码 | 国产精品久久久久影院嫩草 | 中文字幕乱妇无码av在线 | 国产精品国产三级国产专播 | 亚洲欧洲日本综合aⅴ在线 | 日本一卡二卡不卡视频查询 | 国产精品久久国产精品99 | 男人扒开女人内裤强吻桶进去 | 国产偷抇久久精品a片69 | 99久久婷婷国产综合精品青草免费 | 久久精品视频在线看15 | 中文字幕无码av激情不卡 | 四虎国产精品免费久久 | 成年美女黄网站色大免费视频 | 亚洲最大成人网站 | 成人一区二区免费视频 | 国产午夜福利100集发布 | 四虎永久在线精品免费网址 | 久久99精品国产.久久久久 | 丝袜 中出 制服 人妻 美腿 | 亚洲高清偷拍一区二区三区 | 正在播放老肥熟妇露脸 | 国产卡一卡二卡三 | 大地资源中文第3页 | 色一情一乱一伦一视频免费看 | 中国女人内谢69xxxx | 久久伊人色av天堂九九小黄鸭 | 国内揄拍国内精品少妇国语 | 亚洲精品国产品国语在线观看 | 国产情侣作爱视频免费观看 | 亚洲国产欧美国产综合一区 | 精品人人妻人人澡人人爽人人 | 黑人粗大猛烈进出高潮视频 | 久久zyz资源站无码中文动漫 | 精品国产一区二区三区四区 | 国产内射爽爽大片视频社区在线 | 亚洲国产精品久久人人爱 | 曰韩无码二三区中文字幕 | 蜜桃臀无码内射一区二区三区 | 日本高清一区免费中文视频 | 亚洲自偷自偷在线制服 | 欧美35页视频在线观看 | 久久精品人妻少妇一区二区三区 | 99久久婷婷国产综合精品青草免费 | 四十如虎的丰满熟妇啪啪 | 亚洲国产综合无码一区 | 中文精品无码中文字幕无码专区 | 成人无码精品一区二区三区 | 亚洲 另类 在线 欧美 制服 | 暴力强奷在线播放无码 | 无码av免费一区二区三区试看 | 久久精品人人做人人综合试看 | 欧美老人巨大xxxx做受 | 日韩在线不卡免费视频一区 | 欧美变态另类xxxx | 97无码免费人妻超级碰碰夜夜 | 色欲av亚洲一区无码少妇 | 亚洲午夜无码久久 | 无码帝国www无码专区色综合 | 免费人成在线观看网站 | 久久 国产 尿 小便 嘘嘘 | 亚洲精品一区国产 | 国产猛烈高潮尖叫视频免费 | 免费无码一区二区三区蜜桃大 | 久久婷婷五月综合色国产香蕉 | 欧美阿v高清资源不卡在线播放 | 无码精品国产va在线观看dvd | 精品厕所偷拍各类美女tp嘘嘘 | 欧美成人高清在线播放 | 亚洲国产精品毛片av不卡在线 | 国产色精品久久人妻 | 久久亚洲精品中文字幕无男同 | 强辱丰满人妻hd中文字幕 | 亚洲无人区一区二区三区 | 成人欧美一区二区三区 | 国产无av码在线观看 | 午夜精品一区二区三区在线观看 | 粗大的内捧猛烈进出视频 | 欧美大屁股xxxxhd黑色 | 欧美人与物videos另类 | 久久人人爽人人爽人人片ⅴ | 亚洲区欧美区综合区自拍区 | 国产人妻精品午夜福利免费 | 国产成人无码av片在线观看不卡 | 久久久久se色偷偷亚洲精品av | 日韩成人一区二区三区在线观看 | 人人妻人人澡人人爽欧美一区九九 | 亚洲国产精品一区二区第一页 | 大胆欧美熟妇xx | 精品日本一区二区三区在线观看 | 日韩人妻无码中文字幕视频 | 国产精品久久久久久久9999 | 精品国产福利一区二区 | 天堂亚洲免费视频 | 久久亚洲日韩精品一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲а∨天堂久久精品2021 | 又粗又大又硬毛片免费看 | 亚洲精品久久久久久久久久久 | 亚洲日韩中文字幕在线播放 | 西西人体www44rt大胆高清 | 又大又紧又粉嫩18p少妇 | 最近中文2019字幕第二页 | 免费无码av一区二区 | 少妇人妻偷人精品无码视频 | 黑人巨大精品欧美一区二区 | 亚洲精品综合一区二区三区在线 | 亚洲成色www久久网站 | 美女张开腿让人桶 | 蜜桃视频插满18在线观看 | 日日夜夜撸啊撸 | 人妻天天爽夜夜爽一区二区 | 在线观看欧美一区二区三区 | 少女韩国电视剧在线观看完整 | 久久国产精品萌白酱免费 | 小sao货水好多真紧h无码视频 | 日本乱偷人妻中文字幕 | 无码国产激情在线观看 | 久久精品中文字幕一区 | 粉嫩少妇内射浓精videos | 少妇人妻av毛片在线看 | 国产女主播喷水视频在线观看 | 国产成人人人97超碰超爽8 | 无人区乱码一区二区三区 | 正在播放东北夫妻内射 | 久久亚洲国产成人精品性色 | 国产成人综合在线女婷五月99播放 | 日本一卡二卡不卡视频查询 | 国产精品理论片在线观看 | 亚洲日本在线电影 | 99久久久国产精品无码免费 | 国产成人无码av在线影院 | 久久久婷婷五月亚洲97号色 | 亚欧洲精品在线视频免费观看 | 国产成人无码av片在线观看不卡 | 亚洲第一网站男人都懂 | 在线精品国产一区二区三区 | 欧美日韩色另类综合 | 国产舌乚八伦偷品w中 | 在线观看国产一区二区三区 | 日本熟妇人妻xxxxx人hd | av无码久久久久不卡免费网站 | 色综合久久久无码网中文 | 四虎永久在线精品免费网址 | 日韩 欧美 动漫 国产 制服 | 又大又硬又爽免费视频 | 久久aⅴ免费观看 | 久久99精品久久久久久动态图 | 久久精品国产日本波多野结衣 | 亚洲精品久久久久中文第一幕 | 一本一道久久综合久久 | 在线观看免费人成视频 | 国产内射爽爽大片视频社区在线 | 中文字幕人妻丝袜二区 | 国产成人综合美国十次 | 岛国片人妻三上悠亚 | 国产偷抇久久精品a片69 | 国产av久久久久精东av | 色一情一乱一伦一视频免费看 | 亚洲精品一区二区三区四区五区 | 国产精品va在线观看无码 | 国产精品怡红院永久免费 | 色综合久久久久综合一本到桃花网 | 丰满诱人的人妻3 | 久久天天躁夜夜躁狠狠 | 人妻少妇精品无码专区二区 | 亚洲s码欧洲m码国产av | 国产精品久久久午夜夜伦鲁鲁 | 国产激情无码一区二区 | 精品无码国产自产拍在线观看蜜 | 国产精品-区区久久久狼 | 精品久久8x国产免费观看 | 在线播放亚洲第一字幕 | 在线观看欧美一区二区三区 | 免费男性肉肉影院 | 亚洲精品无码人妻无码 | 免费无码一区二区三区蜜桃大 | 亚洲成色www久久网站 | 人人爽人人爽人人片av亚洲 | 亚洲一区二区观看播放 | 在线精品国产一区二区三区 | 伊在人天堂亚洲香蕉精品区 | 亚洲欧美精品aaaaaa片 | 内射巨臀欧美在线视频 | 欧美日本日韩 | 少妇性荡欲午夜性开放视频剧场 | 人人妻人人澡人人爽欧美一区 | 中文字幕人成乱码熟女app | 无码午夜成人1000部免费视频 | 国产亚洲美女精品久久久2020 | 性色欲网站人妻丰满中文久久不卡 | 麻花豆传媒剧国产免费mv在线 | 妺妺窝人体色www在线小说 | 国产精品va在线播放 | 国产极品美女高潮无套在线观看 | 久久亚洲中文字幕无码 | 亚洲精品美女久久久久久久 | 麻豆国产丝袜白领秘书在线观看 | 7777奇米四色成人眼影 | 久久午夜无码鲁丝片秋霞 | 欧美阿v高清资源不卡在线播放 | 东京热无码av男人的天堂 | 欧美老妇与禽交 | 国产欧美亚洲精品a | 麻豆精品国产精华精华液好用吗 | 无码国产乱人伦偷精品视频 | 亚洲乱码中文字幕在线 | 久久99精品久久久久婷婷 | 国内少妇偷人精品视频 | 国产午夜无码视频在线观看 | 西西人体www44rt大胆高清 | 亚洲成av人在线观看网址 | 成在人线av无码免费 | 国产成人精品视频ⅴa片软件竹菊 | 鲁大师影院在线观看 | 日欧一片内射va在线影院 | 午夜福利不卡在线视频 | 欧美人妻一区二区三区 | 亚洲精品久久久久久一区二区 | 亚洲一区二区三区香蕉 | 成人免费无码大片a毛片 | 国产黄在线观看免费观看不卡 | 欧美老熟妇乱xxxxx | 久久久久亚洲精品中文字幕 | 牲欲强的熟妇农村老妇女视频 | 成人毛片一区二区 | 欧美大屁股xxxxhd黑色 | 99久久无码一区人妻 | 精品人妻人人做人人爽夜夜爽 | 日韩少妇白浆无码系列 | 国产乱人伦av在线无码 | 久久无码中文字幕免费影院蜜桃 | 国产av无码专区亚洲awww | 99久久精品国产一区二区蜜芽 | 强奷人妻日本中文字幕 | 人人妻人人澡人人爽人人精品 | 人人妻人人澡人人爽人人精品 | 免费无码av一区二区 | 奇米影视7777久久精品人人爽 | 国产麻豆精品精东影业av网站 | 国产高清av在线播放 | 狂野欧美性猛xxxx乱大交 | 无码人妻久久一区二区三区不卡 | 欧美黑人乱大交 | 美女张开腿让人桶 | 国产高清不卡无码视频 | 丰满岳乱妇在线观看中字无码 | 无人区乱码一区二区三区 | 欧美刺激性大交 | 性开放的女人aaa片 | 97无码免费人妻超级碰碰夜夜 | 国产精品久免费的黄网站 | 亚洲国产精品一区二区第一页 | 欧美日本日韩 | 中文字幕无码热在线视频 | 无码福利日韩神码福利片 | 午夜肉伦伦影院 | 国产莉萝无码av在线播放 | 女人和拘做爰正片视频 | 亚洲成av人综合在线观看 | 精品一区二区三区无码免费视频 | 久久综合色之久久综合 | 久久人人爽人人爽人人片av高清 | 好男人社区资源 | 久久精品国产一区二区三区 | 中文字幕日韩精品一区二区三区 | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲の无码国产の无码步美 | 日本乱人伦片中文三区 | 久久精品国产精品国产精品污 | 亚洲色成人中文字幕网站 | 美女扒开屁股让男人桶 | 性色欲网站人妻丰满中文久久不卡 | 精品国偷自产在线 | 人妻少妇被猛烈进入中文字幕 | 久久国产精品萌白酱免费 | 丰满人妻翻云覆雨呻吟视频 | 色欲人妻aaaaaaa无码 | 精品一区二区不卡无码av | 国产极品视觉盛宴 | 亚洲 欧美 激情 小说 另类 | 亚洲国产精品成人久久蜜臀 | 内射欧美老妇wbb | 亚洲色偷偷男人的天堂 | 色爱情人网站 | 欧美性猛交xxxx富婆 | 国产亚洲精品久久久久久国模美 | 欧美日韩色另类综合 | 任你躁在线精品免费 | 激情亚洲一区国产精品 | 丰满人妻被黑人猛烈进入 | 少妇无码av无码专区在线观看 | 国内精品人妻无码久久久影院 | 激情内射亚州一区二区三区爱妻 | 俄罗斯老熟妇色xxxx | 一本久道久久综合婷婷五月 | 99久久精品国产一区二区蜜芽 | 亚洲va中文字幕无码久久不卡 | 丝袜美腿亚洲一区二区 | 特黄特色大片免费播放器图片 | 在线a亚洲视频播放在线观看 | 久久久久免费精品国产 | 日韩人妻少妇一区二区三区 | 欧美日本精品一区二区三区 | 特黄特色大片免费播放器图片 | 人妻人人添人妻人人爱 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产午夜精品一区二区三区嫩草 | 国内少妇偷人精品视频 | 亚洲成av人片在线观看无码不卡 | 好屌草这里只有精品 | 综合人妻久久一区二区精品 | 18禁止看的免费污网站 | 少妇性l交大片欧洲热妇乱xxx | 精品无码av一区二区三区 | 无码免费一区二区三区 | 亚洲码国产精品高潮在线 | 六十路熟妇乱子伦 | 久久人人爽人人爽人人片ⅴ | 97夜夜澡人人双人人人喊 | 亚拍精品一区二区三区探花 | 久久久久人妻一区精品色欧美 | 国产无套粉嫩白浆在线 | 午夜不卡av免费 一本久久a久久精品vr综合 | 色综合久久久无码中文字幕 | 中文字幕无线码免费人妻 | 亚洲无人区午夜福利码高清完整版 | 国产午夜视频在线观看 | 国产xxx69麻豆国语对白 | аⅴ资源天堂资源库在线 | 无码人妻少妇伦在线电影 | 欧美日韩一区二区三区自拍 | 露脸叫床粗话东北少妇 | 人妻少妇精品视频专区 | 久久午夜无码鲁丝片秋霞 | 久久久av男人的天堂 | 国产午夜福利亚洲第一 | 亚洲欧美国产精品专区久久 | 夫妻免费无码v看片 | 人妻少妇精品久久 | 国产美女精品一区二区三区 | 国产成人午夜福利在线播放 | 日韩欧美成人免费观看 | 中文字幕人妻无码一区二区三区 | 亚洲熟女一区二区三区 | 2019nv天堂香蕉在线观看 | 国产综合色产在线精品 | 俺去俺来也www色官网 | 国产精品久久久午夜夜伦鲁鲁 | 天天综合网天天综合色 | 精品国产乱码久久久久乱码 | 国产av无码专区亚洲awww | 国产人妻人伦精品1国产丝袜 | 免费观看又污又黄的网站 | 无码av免费一区二区三区试看 | 精品久久8x国产免费观看 | 国产精品美女久久久久av爽李琼 | 女高中生第一次破苞av | 国产黄在线观看免费观看不卡 | 377p欧洲日本亚洲大胆 | 宝宝好涨水快流出来免费视频 | 无码吃奶揉捏奶头高潮视频 | 狠狠色噜噜狠狠狠7777奇米 | 久久久久国色av免费观看性色 | 疯狂三人交性欧美 | 亚洲一区二区三区国产精华液 | 红桃av一区二区三区在线无码av | 亚洲欧美中文字幕5发布 | 少妇高潮喷潮久久久影院 | 久久亚洲中文字幕精品一区 | 成人片黄网站色大片免费观看 | 熟女俱乐部五十路六十路av | 少妇高潮一区二区三区99 | 波多野结衣一区二区三区av免费 | 婷婷六月久久综合丁香 | 理论片87福利理论电影 | 人人妻人人澡人人爽精品欧美 | 欧美日韩一区二区免费视频 | 欧美色就是色 | 国产成人综合美国十次 | 天干天干啦夜天干天2017 | 女人被爽到呻吟gif动态图视看 | 在线欧美精品一区二区三区 | 精品国产一区二区三区av 性色 | av人摸人人人澡人人超碰下载 | 毛片内射-百度 | 国产又爽又黄又刺激的视频 | 国产激情综合五月久久 | 精品无人国产偷自产在线 | 精品日本一区二区三区在线观看 | 国产香蕉尹人视频在线 | 最近免费中文字幕中文高清百度 | 7777奇米四色成人眼影 | 一二三四在线观看免费视频 | 人妻与老人中文字幕 | 一本久久伊人热热精品中文字幕 | 扒开双腿吃奶呻吟做受视频 | 高清无码午夜福利视频 | 伊人久久婷婷五月综合97色 | 久久久精品人妻久久影视 | 麻豆精品国产精华精华液好用吗 | 日日夜夜撸啊撸 | 亚洲人成网站色7799 | 荫蒂添的好舒服视频囗交 | 伊人久久婷婷五月综合97色 | 亚洲一区二区三区 | 亚洲自偷自偷在线制服 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国内丰满熟女出轨videos | 欧洲精品码一区二区三区免费看 | 国产激情精品一区二区三区 | 国产精品资源一区二区 | 免费人成在线视频无码 | 日韩在线不卡免费视频一区 | 中文字幕+乱码+中文字幕一区 | 亚洲成a人一区二区三区 | 荫蒂添的好舒服视频囗交 | 亚洲综合无码久久精品综合 | 国产真实乱对白精彩久久 | 无码国产激情在线观看 | 无码人妻久久一区二区三区不卡 | 午夜免费福利小电影 | 国产精品无套呻吟在线 | av香港经典三级级 在线 | 国产国产精品人在线视 | 乱人伦中文视频在线观看 | 国产三级精品三级男人的天堂 | 国产精品无码久久av | 国产女主播喷水视频在线观看 | 鲁鲁鲁爽爽爽在线视频观看 | 精品偷拍一区二区三区在线看 | 国产两女互慰高潮视频在线观看 | 激情爆乳一区二区三区 | 日本丰满护士爆乳xxxx | 久久精品女人天堂av免费观看 | 激情内射日本一区二区三区 | 无码人妻精品一区二区三区不卡 | 青青青爽视频在线观看 | 一本久道久久综合狠狠爱 | 日本熟妇乱子伦xxxx | 精品偷自拍另类在线观看 | 久久伊人色av天堂九九小黄鸭 | 青春草在线视频免费观看 | 亚洲欧美日韩成人高清在线一区 | 色欲久久久天天天综合网精品 | 亚洲男女内射在线播放 | 国精品人妻无码一区二区三区蜜柚 | 午夜精品久久久久久久 | 真人与拘做受免费视频一 | 亚洲国产午夜精品理论片 | 无码帝国www无码专区色综合 | 久久久久国色av免费观看性色 | 亚洲国产日韩a在线播放 | 成年美女黄网站色大免费全看 | 国产人妻精品一区二区三区不卡 | 精品亚洲韩国一区二区三区 | 精品国产一区二区三区av 性色 | 亚洲国产精品无码久久久久高潮 | 国产精品无码一区二区桃花视频 | 99久久精品午夜一区二区 | 最近的中文字幕在线看视频 | 狂野欧美激情性xxxx | 日韩人妻少妇一区二区三区 | 狠狠亚洲超碰狼人久久 | 日本熟妇人妻xxxxx人hd | 麻豆国产97在线 | 欧洲 | 久久 国产 尿 小便 嘘嘘 | 精品乱码久久久久久久 | 国产网红无码精品视频 | 久久久久久av无码免费看大片 | 野外少妇愉情中文字幕 | 自拍偷自拍亚洲精品10p | 亚洲爆乳精品无码一区二区三区 | 久久精品女人天堂av免费观看 | 熟女俱乐部五十路六十路av | 俄罗斯老熟妇色xxxx | av无码不卡在线观看免费 | 99久久精品无码一区二区毛片 | 精品少妇爆乳无码av无码专区 | 久久综合网欧美色妞网 | 久久97精品久久久久久久不卡 | 中文字幕久久久久人妻 | 高清国产亚洲精品自在久久 | 无码人中文字幕 | 国产香蕉尹人视频在线 | 帮老师解开蕾丝奶罩吸乳网站 | 天天综合网天天综合色 | 极品嫩模高潮叫床 | 国产国产精品人在线视 | 久久精品人人做人人综合 | 奇米影视888欧美在线观看 | √天堂中文官网8在线 | www国产亚洲精品久久久日本 | 成在人线av无码免观看麻豆 | 色综合久久久无码中文字幕 | 国产真实伦对白全集 | 久久综合给合久久狠狠狠97色 | 久久久久国色av免费观看性色 | 狂野欧美性猛xxxx乱大交 | 亚洲a无码综合a国产av中文 | 国产亚洲精品精品国产亚洲综合 | 成人女人看片免费视频放人 | 国产午夜亚洲精品不卡 | 又大又硬又黄的免费视频 | 未满小14洗澡无码视频网站 | 午夜福利不卡在线视频 | 18精品久久久无码午夜福利 | 一本色道久久综合狠狠躁 | 日韩无套无码精品 | 亚洲无人区午夜福利码高清完整版 | 久久精品国产一区二区三区肥胖 | 99久久精品午夜一区二区 | 久久精品丝袜高跟鞋 | 在线欧美精品一区二区三区 | 澳门永久av免费网站 | 免费看少妇作爱视频 | 67194成是人免费无码 | 国产精品第一国产精品 | 天海翼激烈高潮到腰振不止 | 国产成人无码av片在线观看不卡 | 丰满岳乱妇在线观看中字无码 | 天天躁夜夜躁狠狠是什么心态 | 日韩av无码一区二区三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 性色欲情网站iwww九文堂 | 国产精品久久精品三级 | 国产精品国产三级国产专播 | 亚洲成a人一区二区三区 | 久久99精品久久久久久动态图 | 亚洲一区二区三区国产精华液 | 熟女体下毛毛黑森林 | 秋霞特色aa大片 | 欧美人与禽猛交狂配 | 丝袜 中出 制服 人妻 美腿 | 97人妻精品一区二区三区 | 久久久中文字幕日本无吗 | 在线a亚洲视频播放在线观看 | 中国女人内谢69xxxxxa片 | 中文字幕 亚洲精品 第1页 | 亚洲精品成a人在线观看 | 少妇一晚三次一区二区三区 | 狠狠躁日日躁夜夜躁2020 | 国产绳艺sm调教室论坛 | 久久国产精品二国产精品 | 日韩av无码中文无码电影 | 妺妺窝人体色www婷婷 | 色婷婷久久一区二区三区麻豆 | 狂野欧美性猛xxxx乱大交 | 亚洲精品一区二区三区婷婷月 | 免费视频欧美无人区码 | 男女性色大片免费网站 | 亚洲国产精品无码久久久久高潮 | 影音先锋中文字幕无码 | 欧美亚洲日韩国产人成在线播放 | 日欧一片内射va在线影院 | 少妇无码av无码专区在线观看 | 最新国产乱人伦偷精品免费网站 | 99久久精品无码一区二区毛片 | 亚洲人成网站在线播放942 | 国产艳妇av在线观看果冻传媒 | 欧美黑人乱大交 | 国精产品一品二品国精品69xx | 成人影院yy111111在线观看 | 国产精品无码成人午夜电影 | 久久综合色之久久综合 | 成熟妇人a片免费看网站 | 亚洲中文字幕久久无码 | 国产人妻精品午夜福利免费 | 国产乱码精品一品二品 | 国产精品理论片在线观看 | 亚洲人成影院在线观看 | 欧美阿v高清资源不卡在线播放 | www国产精品内射老师 | 一本久道久久综合婷婷五月 | 2020久久超碰国产精品最新 | 天海翼激烈高潮到腰振不止 | 中国大陆精品视频xxxx | 伊在人天堂亚洲香蕉精品区 | 女人被爽到呻吟gif动态图视看 | 中文字幕无码日韩欧毛 | 亚洲а∨天堂久久精品2021 | 18精品久久久无码午夜福利 | 亚洲成在人网站无码天堂 | 一本色道婷婷久久欧美 | 中文字幕无码日韩专区 | 亚洲成色www久久网站 | 亚洲欧美日韩国产精品一区二区 | а√天堂www在线天堂小说 | 动漫av一区二区在线观看 | 无码人妻黑人中文字幕 | 国产精品手机免费 | 国产乱子伦视频在线播放 | 国产午夜福利亚洲第一 | 久久久久人妻一区精品色欧美 | 国产精品亚洲а∨无码播放麻豆 | 国产精品资源一区二区 | 日本熟妇人妻xxxxx人hd | 国产亚洲日韩欧美另类第八页 | 乌克兰少妇性做爰 | 久青草影院在线观看国产 | 免费无码午夜福利片69 | 日日噜噜噜噜夜夜爽亚洲精品 | 捆绑白丝粉色jk震动捧喷白浆 | 久久 国产 尿 小便 嘘嘘 | 免费观看黄网站 | 日韩 欧美 动漫 国产 制服 | 亚洲熟悉妇女xxx妇女av | 无码成人精品区在线观看 | 亚洲一区二区三区偷拍女厕 | 一个人看的视频www在线 | 中文久久乱码一区二区 | 永久黄网站色视频免费直播 | 免费乱码人妻系列无码专区 | 久久久久久国产精品无码下载 | 国内精品一区二区三区不卡 | 日本护士毛茸茸高潮 | 日本熟妇大屁股人妻 | 永久黄网站色视频免费直播 | 性生交大片免费看l | 人妻少妇精品无码专区动漫 | 毛片内射-百度 | 欧美乱妇无乱码大黄a片 | 中文字幕无码免费久久9一区9 | 日韩人妻系列无码专区 | 自拍偷自拍亚洲精品10p | 98国产精品综合一区二区三区 | 免费人成在线观看网站 | 一区二区传媒有限公司 | 精品国产一区二区三区四区在线看 | 亚洲 激情 小说 另类 欧美 | 在线播放亚洲第一字幕 | 成人亚洲精品久久久久软件 | 狠狠色噜噜狠狠狠狠7777米奇 | 妺妺窝人体色www在线小说 | 午夜精品久久久久久久 | 日本丰满护士爆乳xxxx | 成人精品天堂一区二区三区 | 国产精品无套呻吟在线 | 76少妇精品导航 | 无人区乱码一区二区三区 | 欧美成人高清在线播放 | 人妻少妇精品无码专区二区 | 日本精品人妻无码免费大全 | 国内精品久久久久久中文字幕 | 欧美日本免费一区二区三区 | 给我免费的视频在线观看 | 三上悠亚人妻中文字幕在线 | 日本护士毛茸茸高潮 | 精品亚洲成av人在线观看 | 日本熟妇大屁股人妻 | 人人妻人人藻人人爽欧美一区 | 久久综合久久自在自线精品自 | 国产婷婷色一区二区三区在线 | 色综合久久久久综合一本到桃花网 | 亚洲一区二区三区国产精华液 | 玩弄中年熟妇正在播放 | 98国产精品综合一区二区三区 | 中文无码成人免费视频在线观看 | 成人精品视频一区二区 | 黑人玩弄人妻中文在线 | 东京热一精品无码av | 老熟妇乱子伦牲交视频 | 久久久久久av无码免费看大片 | 少妇性l交大片欧洲热妇乱xxx | 综合人妻久久一区二区精品 | 成年女人永久免费看片 | 久久午夜无码鲁丝片秋霞 | 日本一区二区三区免费高清 | 国产成人综合在线女婷五月99播放 | 麻豆av传媒蜜桃天美传媒 | 国产 浪潮av性色四虎 | 人人妻人人澡人人爽欧美精品 | 狠狠色丁香久久婷婷综合五月 | 久久精品国产精品国产精品污 | 亚洲精品国产第一综合99久久 | 国产成人无码av片在线观看不卡 | 午夜精品久久久内射近拍高清 | 99久久精品国产一区二区蜜芽 | 亚洲日韩中文字幕在线播放 | 亚洲精品国产精品乱码不卡 | 国产在线无码精品电影网 | 人人爽人人爽人人片av亚洲 | 图片小说视频一区二区 | 一本大道伊人av久久综合 | 国产亚av手机在线观看 | 国产精品永久免费视频 | 精品成在人线av无码免费看 | 国内老熟妇对白xxxxhd | 丰满人妻一区二区三区免费视频 | 在线播放亚洲第一字幕 | 性欧美牲交在线视频 | 国产精品香蕉在线观看 | 小鲜肉自慰网站xnxx | 美女扒开屁股让男人桶 | 国产sm调教视频在线观看 | 一区二区三区高清视频一 | 波多野结衣av一区二区全免费观看 | 国产精品福利视频导航 | 亚洲中文字幕无码中文字在线 | 久久综合狠狠综合久久综合88 | 日韩亚洲欧美中文高清在线 | 亚洲色大成网站www国产 | 亚洲国产一区二区三区在线观看 | 亚洲aⅴ无码成人网站国产app | 亚洲精品成人av在线 | 无码人妻少妇伦在线电影 | 亚洲精品一区二区三区四区五区 | 日韩av无码一区二区三区不卡 | 久久人人爽人人人人片 | 国产一区二区三区精品视频 | 欧美老妇交乱视频在线观看 | 亚洲成在人网站无码天堂 | 狠狠色色综合网站 | 正在播放东北夫妻内射 | 又粗又大又硬又长又爽 | 天天拍夜夜添久久精品 | 天天拍夜夜添久久精品 | 亚洲精品中文字幕 | 性生交大片免费看l | 无码人妻黑人中文字幕 | 欧美乱妇无乱码大黄a片 | 国产97色在线 | 免 | 久久综合给合久久狠狠狠97色 | 女人被爽到呻吟gif动态图视看 | 亚洲人成影院在线观看 | 18黄暴禁片在线观看 | 国产精品高潮呻吟av久久 | 色婷婷香蕉在线一区二区 | 十八禁视频网站在线观看 | 国产精品人人妻人人爽 | 国产精品18久久久久久麻辣 | 国产熟妇高潮叫床视频播放 | 天下第一社区视频www日本 | 日韩欧美中文字幕在线三区 | 欧美日韩综合一区二区三区 | 亚洲第一网站男人都懂 | 俺去俺来也www色官网 | 国产精品久久久久久亚洲毛片 | 国产精品怡红院永久免费 | 久久久久成人精品免费播放动漫 | 精品厕所偷拍各类美女tp嘘嘘 | 国产精品久久久av久久久 | 亚洲精品综合五月久久小说 | 精品国产福利一区二区 | 综合网日日天干夜夜久久 | 中文字幕人妻无码一区二区三区 | 老子影院午夜精品无码 | 图片区 小说区 区 亚洲五月 | 欧美日韩精品 | 欧美黑人巨大xxxxx | 老头边吃奶边弄进去呻吟 | 福利一区二区三区视频在线观看 | 亚洲精品美女久久久久久久 | 亚洲欧美日韩国产精品一区二区 | 狠狠色欧美亚洲狠狠色www | 午夜男女很黄的视频 | 久久成人a毛片免费观看网站 | 精品人妻av区 | 一本加勒比波多野结衣 | 大乳丰满人妻中文字幕日本 | 国产精品第一区揄拍无码 | 国产精品高潮呻吟av久久4虎 | 日本免费一区二区三区最新 | 久久综合九色综合欧美狠狠 | 国产精品久久精品三级 | 亚洲精品综合一区二区三区在线 | 国产熟妇高潮叫床视频播放 | 亚洲国产高清在线观看视频 | 久久久亚洲欧洲日产国码αv | 亚洲s色大片在线观看 | 成 人 免费观看网站 | 久久久精品欧美一区二区免费 | 国内老熟妇对白xxxxhd | 久久久精品成人免费观看 | 天海翼激烈高潮到腰振不止 | 国产亚洲美女精品久久久2020 | 精品国产乱码久久久久乱码 | 福利一区二区三区视频在线观看 | 亚洲色www成人永久网址 | 国产精品久久久久久久影院 | 天天爽夜夜爽夜夜爽 | 国产av人人夜夜澡人人爽麻豆 | 久久亚洲精品中文字幕无男同 | 中文字幕无码乱人伦 | 中文字幕久久久久人妻 | 免费人成网站视频在线观看 | 欧美性黑人极品hd | 国产成人无码av一区二区 | 牲欲强的熟妇农村老妇女 | 日本一卡二卡不卡视频查询 | 亚洲精品国产精品乱码视色 | 成人免费视频视频在线观看 免费 | 小鲜肉自慰网站xnxx | 中文字幕乱码人妻二区三区 | 日本www一道久久久免费榴莲 | 日本一卡二卡不卡视频查询 | 亚洲国产精品久久久久久 | 日韩成人一区二区三区在线观看 | 亚洲国产精品久久久久久 | 亚洲码国产精品高潮在线 | 免费视频欧美无人区码 | 国产av人人夜夜澡人人爽麻豆 | av无码不卡在线观看免费 | 亚洲成a人片在线观看无码 | 国产人妻久久精品二区三区老狼 | 中文无码成人免费视频在线观看 | 色综合久久久久综合一本到桃花网 | 成人免费视频在线观看 | 亚洲色大成网站www国产 | 激情亚洲一区国产精品 | 亚洲成av人片在线观看无码不卡 | 无码乱肉视频免费大全合集 | 久久精品成人欧美大片 | 亚洲欧美日韩综合久久久 | 男女性色大片免费网站 | 少妇的肉体aa片免费 | 人妻无码αv中文字幕久久琪琪布 | 婷婷综合久久中文字幕蜜桃三电影 | 日本免费一区二区三区最新 | 免费男性肉肉影院 | 又黄又爽又色的视频 | 男女超爽视频免费播放 | 一本大道久久东京热无码av | 欧美丰满熟妇xxxx | 澳门永久av免费网站 | 亚洲经典千人经典日产 | 亚洲精品一区三区三区在线观看 | 亚洲一区二区三区国产精华液 | 欧美精品免费观看二区 | 精品久久久中文字幕人妻 | a片免费视频在线观看 | 激情内射日本一区二区三区 | 久久亚洲国产成人精品性色 | 中文毛片无遮挡高清免费 | 亚洲区小说区激情区图片区 | 国产高潮视频在线观看 | 我要看www免费看插插视频 | 国产免费久久精品国产传媒 | 中文精品久久久久人妻不卡 | 精品亚洲韩国一区二区三区 | 国产亚洲精品久久久久久国模美 | 久久久久se色偷偷亚洲精品av | 中文字幕精品av一区二区五区 | 欧美老妇与禽交 | 99久久99久久免费精品蜜桃 | 国产精品无码永久免费888 | 久久国产劲爆∧v内射 | 精品国产乱码久久久久乱码 | 亚洲aⅴ无码成人网站国产app | 久久精品国产大片免费观看 | 无码成人精品区在线观看 | 亚洲综合在线一区二区三区 | 亚洲人成人无码网www国产 | 日本高清一区免费中文视频 | 欧美黑人巨大xxxxx | 国产精品高潮呻吟av久久 | aa片在线观看视频在线播放 | 99久久婷婷国产综合精品青草免费 | 最近免费中文字幕中文高清百度 | 无码午夜成人1000部免费视频 | 夜夜影院未满十八勿进 | 成人试看120秒体验区 | 小泽玛莉亚一区二区视频在线 | 国产激情艳情在线看视频 | 亚洲日本一区二区三区在线 | 欧美野外疯狂做受xxxx高潮 | 中文字幕人成乱码熟女app | 少妇无套内谢久久久久 | 蜜桃av抽搐高潮一区二区 | 国产免费观看黄av片 | 亚洲色欲久久久综合网东京热 | 亚洲爆乳精品无码一区二区三区 | 欧美成人午夜精品久久久 | 欧美大屁股xxxxhd黑色 | 狠狠色噜噜狠狠狠7777奇米 | 一本久久a久久精品vr综合 | 欧美性生交活xxxxxdddd | 露脸叫床粗话东北少妇 | 无码人妻丰满熟妇区五十路百度 | 久久精品女人的天堂av | 亚洲小说春色综合另类 | 国产精品亚洲五月天高清 | 精品无码av一区二区三区 | 久久精品视频在线看15 | 国产无套内射久久久国产 | 久精品国产欧美亚洲色aⅴ大片 | 沈阳熟女露脸对白视频 | 国产麻豆精品一区二区三区v视界 | 老熟妇乱子伦牲交视频 | 亚洲精品一区三区三区在线观看 | 狠狠噜狠狠狠狠丁香五月 | 国产九九九九九九九a片 | 伊人久久婷婷五月综合97色 | 欧美第一黄网免费网站 | 久久国产36精品色熟妇 | 国产特级毛片aaaaaaa高清 | 一本久久伊人热热精品中文字幕 | 老司机亚洲精品影院 | 日本一卡2卡3卡四卡精品网站 | 蜜桃视频韩日免费播放 | 5858s亚洲色大成网站www | 精品熟女少妇av免费观看 | 国产熟妇另类久久久久 | 色综合天天综合狠狠爱 | 日韩视频 中文字幕 视频一区 | 18黄暴禁片在线观看 | 亚洲人成影院在线无码按摩店 | 东京热男人av天堂 | 久久伊人色av天堂九九小黄鸭 | 久久久精品456亚洲影院 | 久久久成人毛片无码 | 亚洲国产欧美在线成人 | 装睡被陌生人摸出水好爽 | 国产乱人偷精品人妻a片 | 六月丁香婷婷色狠狠久久 | 国产真实伦对白全集 | 美女黄网站人色视频免费国产 | 99久久人妻精品免费二区 | 国产日产欧产精品精品app | 熟女俱乐部五十路六十路av |