国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

Python基礎語言學習筆記總結(精華)

 更新時間:2017年11月14日 11:58:05   作者:李小小小偉  
給大家分享一篇關于Python基礎學習內容的學習筆記整理總結篇,里面匯集了學習Python基礎語言的難點和技巧,分享給大家。

以下是Python基礎學習內容的學習筆記的全部內容,非常的詳細,如果你對Python語言感興趣,并且針對性的系統(tǒng)學習一下基礎語言知識,下面的內容能夠很好的滿足你的需求,如果感覺不錯,就收藏以后慢慢跟著學習吧。

一、變量賦值及命名規(guī)則

① 聲明一個變量及賦值

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# _author_soloLi
name1="solo"
name2=name1
print(name1,name2)
name1 = "hehe"
print(name1,name2)

#name1的值為hehe,name2的值為solo

② 變量命名的規(guī)則

1、變量名只能是 字母、數(shù)字或下劃線的任意組合
2、變量名的第一個字符不能是數(shù)字
3、以下關鍵字不能聲明為變量名['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global','if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']

二、字符編碼

python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill)

ASCII:最多只能用 8位來表示(一個字節(jié)),即:2**8 = 256,所以,ASCII碼最多只能表示 256 個符號。顯然ASCII碼無法將世界上的各種文字和符號全部表示。

Unicode:它為每種語言中的每個字符設定了統(tǒng)一并且唯一的二進制編碼,規(guī)定雖有的字符和符號最少由 16 位來表示(2個字節(jié)),即:2 **16 = 65536,注:此處說的的是最少2個字節(jié),可能更多。

UTF-8:是對Unicode編碼的壓縮和優(yōu)化,他不再使用最少使用2個字節(jié),而是將所有的字符和符號進行分類:ascii碼中的內容用1個字節(jié)保存、歐洲的字符用2個字節(jié)保存,東亞的字符用3個字節(jié)保存...
注:python2.x版本,默認支持的字符編碼為ASCll python3.x版本,默認支持的是Unicode,不用聲明字符編碼可以直接顯示中文。

 擴展:字符編碼和轉碼,bytes和str區(qū)別

    Python 3最重要的新特性大概要算是對文本和二進制數(shù)據(jù)作了更為清晰的區(qū)分。文本總是Unicode,由str類型表示,二進制數(shù)據(jù)則由bytes類型表示。Python 3不會以任意隱式的方式混用str和bytes(類似int和long之間自動轉換),正是這使得兩者的區(qū)分特別清晰。你不能拼接字符串和字節(jié)包,也無法在字節(jié)包里搜索字符串(反之亦然),也不能將字符串傳入?yún)?shù)為字節(jié)包的函數(shù)(反之亦然)。這是件好事。不管怎樣,字符串和字節(jié)包之間的界線是必然的,下面的圖解非常重要,務請牢記于心:

字符串可以編碼成字節(jié)包,而字節(jié)包可以解碼成字符串:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-solo
msg = "里約奧運"
print(msg.encode("utf-8"))           #如果不指定編碼格式,默認為utf-8
#b'\xe9\x87\x8c\xe7\xba\xa6\xe5\xa5\xa5\xe8\xbf\x90'
print(b'\xe9\x87\x8c\xe7\xba\xa6\xe5\xa5\xa5\xe8\xbf\x90'.decode("utf-8"))
#里約奧運

為什么要進行編碼和轉碼?

  由于每個國家電腦的字符編碼格式不統(tǒng)一(列中國:GBK),同一款軟件放到不同國家的電腦上會出現(xiàn)亂碼的情況,出現(xiàn)這種情況如何解決呢?! 當然由于所有國家的電腦都支持Unicode萬國碼,那么我們可以把Unicode為跳板,先把字符編碼轉換為Unicode,在把Unicode轉換為另一個國家的字符編碼(例韓國),則不會出現(xiàn)亂碼的情況。當然這里只是轉編碼集并不是翻譯成韓文不要弄混了。

① Python3.0進行編碼轉換(默認Unicode編碼)

name = "腳本之家"           #此時name為Unicode編碼
name1 = name.encode("utf-8")   #Unicode轉為UTF-8
name2 = name1.decode("utf-8")   #UTF-8轉為Unicode
name3 = name.encode("gbk")    #Unicode轉為GBK
name4 = name3.decode("gbk")   #GBK轉為Unicode

② Python2.0中的編碼轉換(默認ascii編碼)

① 聲明字符編碼(utf-8)
# -*- coding:utf-8 -*-
name = "李偉"          #ascii碼里是沒有字符“你好”的,此時的name為uft-8
name1 = name.decode("utf-8")  #UTF-8轉為Unicode
name2 = name1.encode("gbk")   #Unicode轉為gbk
② 使用默認字符編碼(ascii)
name = "nihao"       #英文字符,且第二行字符聲明去掉,此刻name為ascii碼
name1 = name.decode("ascii")   #ascii碼轉為unicode
name2 = name1.encode("utf-8") #unicode轉為utf-8
name3 =name1.encode("gbk")   #unicode轉為gbk

三、用戶交互及字符串拼接

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# _author_soloLi
# python2.X與python3.X區(qū)別:  python2.X raw_input = python3.X input
# 提示用戶輸入姓名、年齡、工作、工資并以信息列表的形式打印出
name = input("Please input your name:")
age = int(input("Please input your age:")) #str強制轉換為int
job = input("Please input your job:")
salary = input("Please input your salary:")
info1 = '''
------------ Info of %s ---------
Name:%s
Age:%d
Job:%s
Salary:%s
''' %(name,name,age,job,salary)   #%s檢測數(shù)據(jù)類型為字符串,%d檢測數(shù)據(jù)類型為整數(shù),%f檢測數(shù)據(jù)類型為浮點數(shù) 強制
print(info1)
# info2 = '''
# ------------ Info of {_Name} ---------
# Name:{_Name}
# Age:{_Age}
# Job:{_Job}
# Salary:{_Salary}
# ''' .format(_Name=name,
#       _Age=age,
#       _Job=job,
#       _Salary=salary)
# print(info2)
# info3 = '''
# ------------ Info of {0} ---------
# Name:{0}
# Age:{1}
# Job:{2}
# Salary:{3}
# ''' .format(name,age,job,salary)
# print(info3)

對比分析:
1、% :無法同時傳遞一個變量和元組,又是要加()來保證不拋出typeerror異常
2、+ :每增加一個一個+就會開辟一塊新的內存空間
3、.fomat :不會出現(xiàn)上述問題,有時使用為了兼容Python2版本。如使用logging庫

四、循環(huán)語句(if、while、for、三元運算)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# _author_soloLi
################## if語句 ######################
# A = 66
#
# B = int(input("請輸入0-100的幸運數(shù)字:"))
#
# if B == A:           #母級頂格寫
#   print ("恭喜你猜對了!")  #子級強制縮進寫
# elif B > A :
#   print ("猜小了")
# else:
#   print ("猜大了")


################## while語句 ######################
# A = 66
# count = 0          # 設置初始值count=0
#
# while count < 3 :
#
#   B = int(input("請輸入0-100的數(shù)字:"))
#
#   if B == A:
#     print ("恭喜你猜對了!")
#     break
#   elif B > A :
#     print ("猜大了")
#   else:
#     print ("猜小了")
#   count += 1
# else:
#   print ("你猜的次數(shù)太多了!")


################## for語句 ######################
A = 66
i=1
for i in range(3):# while判斷count是否小于3,如果小于3則:
  print("i=",i)
  B = int(input("請輸入0-100的數(shù)字:"))
  if B == A:
    print ("恭喜你猜對了!")
    break
  elif B > A :
    print ("猜小了")
  else:
    print ("猜大了")
  i+=1
else:
  print ("你猜的次數(shù)太多了!")


################## 三元運算 ######################
 # esult = 值1 if 條件 else 值2
 # 如果條件成立,那么將 “值1” 賦值給result變量,否則,將“值2”賦值給result變量


五、基本數(shù)據(jù)類型

一、整型
如: 18、73、84
類型常用功能:

abs(x)   #返回絕對值
x+y,x-y,x*y,x/y #加減乘除
x/y     #取商,浮點數(shù)相除保留余數(shù)
x//y    #取商,浮點數(shù)相除余數(shù)為0
x%y     #取余
x**y     #冪次方
cmp(x,y)  #兩個數(shù)比較,返回True或False相等則為0
coerce(x,y) #強制把兩個數(shù)生成一個元組
divmod(x,y) #相除得到商和余數(shù)組成的元組
float(x)  #轉換為浮點型
str(x)   #轉換為字符串
hex(x)   #轉換為16進制
oct(x)   #轉換8進制

更多功能:

class int(object):
  """
  int(x=0) -> int or long
  int(x, base=10) -> int or long
  
  Convert a number or string to an integer, or return 0 if no arguments
  are given. If x is floating point, the conversion truncates towards zero.
  If x is outside the integer range, the function returns a long instead.
  
  If x is not a number or if base is given, then x must be a string or
  Unicode object representing an integer literal in the given base. The
  literal can be preceded by '+' or '-' and be surrounded by whitespace.
  The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to
  interpret the base from the string as an integer literal.
  >>> int('0b100', base=0)
  """
  def bit_length(self): 
    """ 返回表示該數(shù)字的時占用的最少位數(shù) """
    """
    int.bit_length() -> int
    
    Number of bits necessary to represent self in binary.
    >>> bin(37)
    '0b100101'
    >>> (37).bit_length()
    """
    return 0

  def conjugate(self, *args, **kwargs): # real signature unknown
    """ 返回該復數(shù)的共軛復數(shù) """
    """ Returns self, the complex conjugate of any int. """
    pass

  def __abs__(self):
    """ 返回絕對值 """
    """ x.__abs__() <==> abs(x) """
    pass

  def __add__(self, y):
    """ x.__add__(y) <==> x+y """
    pass

  def __and__(self, y):
    """ x.__and__(y) <==> x&y """
    pass

  def __cmp__(self, y): 
    """ 比較兩個數(shù)大小 """
    """ x.__cmp__(y) <==> cmp(x,y) """
    pass

  def __coerce__(self, y):
    """ 強制生成一個元組 """ 
    """ x.__coerce__(y) <==> coerce(x, y) """
    pass

  def __divmod__(self, y): 
    """ 相除,得到商和余數(shù)組成的元組 """ 
    """ x.__divmod__(y) <==> divmod(x, y) """
    pass

  def __div__(self, y): 
    """ x.__div__(y) <==> x/y """
    pass

  def __float__(self): 
    """ 轉換為浮點類型 """ 
    """ x.__float__() <==> float(x) """
    pass

  def __floordiv__(self, y): 
    """ x.__floordiv__(y) <==> x//y """
    pass

  def __format__(self, *args, **kwargs): # real signature unknown
    pass

  def __getattribute__(self, name): 
    """ x.__getattribute__('name') <==> x.name """
    pass

  def __getnewargs__(self, *args, **kwargs): # real signature unknown
    """ 內部調用 __new__方法或創(chuàng)建對象時傳入?yún)?shù)使用 """ 
    pass

  def __hash__(self): 
    """如果對象object為哈希表類型,返回對象object的哈希值。哈希值為整數(shù)。在字典查找中,哈希值用于快速比較字典的鍵。兩個數(shù)值如果相等,則哈希值也相等。"""
    """ x.__hash__() <==> hash(x) """
    pass

  def __hex__(self): 
    """ 返回當前數(shù)的 十六進制 表示 """ 
    """ x.__hex__() <==> hex(x) """
    pass

  def __index__(self): 
    """ 用于切片,數(shù)字無意義 """
    """ x[y:z] <==> x[y.__index__():z.__index__()] """
    pass

  def __init__(self, x, base=10): # known special case of int.__init__
    """ 構造方法,執(zhí)行 x = 123 或 x = int(10) 時,自動調用,暫時忽略 """ 
    """
    int(x=0) -> int or long
    int(x, base=10) -> int or long
    
    Convert a number or string to an integer, or return 0 if no arguments
    are given. If x is floating point, the conversion truncates towards zero.
    If x is outside the integer range, the function returns a long instead.
    
    If x is not a number or if base is given, then x must be a string or
    Unicode object representing an integer literal in the given base. The
    literal can be preceded by '+' or '-' and be surrounded by whitespace.
    The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to
    interpret the base from the string as an integer literal.
    >>> int('0b100', base=0)
    # (copied from class doc)
    """
    pass

  def __int__(self): 
    """ 轉換為整數(shù) """ 
    """ x.__int__() <==> int(x) """
    pass

  def __invert__(self): 
    """ x.__invert__() <==> ~x """
    pass

  def __long__(self): 
    """ 轉換為長整數(shù) """ 
    """ x.__long__() <==> long(x) """
    pass

  def __lshift__(self, y): 
    """ x.__lshift__(y) <==> x<<y """
    pass

  def __mod__(self, y): 
    """ x.__mod__(y) <==> x%y """
    pass

  def __mul__(self, y): 
    """ x.__mul__(y) <==> x*y """
    pass

  def __neg__(self): 
    """ x.__neg__() <==> -x """
    pass

  @staticmethod # known case of __new__
  def __new__(S, *more): 
    """ T.__new__(S, ...) -> a new object with type S, a subtype of T """
    pass

  def __nonzero__(self): 
    """ x.__nonzero__() <==> x != 0 """
    pass

  def __oct__(self): 
    """ 返回改值的 八進制 表示 """ 
    """ x.__oct__() <==> oct(x) """
    pass

  def __or__(self, y): 
    """ x.__or__(y) <==> x|y """
    pass

  def __pos__(self): 
    """ x.__pos__() <==> +x """
    pass

  def __pow__(self, y, z=None): 
    """ 冪,次方 """ 
    """ x.__pow__(y[, z]) <==> pow(x, y[, z]) """
    pass

  def __radd__(self, y): 
    """ x.__radd__(y) <==> y+x """
    pass

  def __rand__(self, y): 
    """ x.__rand__(y) <==> y&x """
    pass

  def __rdivmod__(self, y): 
    """ x.__rdivmod__(y) <==> divmod(y, x) """
    pass

  def __rdiv__(self, y): 
    """ x.__rdiv__(y) <==> y/x """
    pass

  def __repr__(self): 
    """轉化為解釋器可讀取的形式 """
    """ x.__repr__() <==> repr(x) """
    pass

  def __str__(self): 
    """轉換為人閱讀的形式,如果沒有適于人閱讀的解釋形式的話,則返回解釋器課閱讀的形式"""
    """ x.__str__() <==> str(x) """
    pass

  def __rfloordiv__(self, y): 
    """ x.__rfloordiv__(y) <==> y//x """
    pass

  def __rlshift__(self, y): 
    """ x.__rlshift__(y) <==> y<<x """
    pass

  def __rmod__(self, y): 
    """ x.__rmod__(y) <==> y%x """
    pass

  def __rmul__(self, y): 
    """ x.__rmul__(y) <==> y*x """
    pass

  def __ror__(self, y): 
    """ x.__ror__(y) <==> y|x """
    pass

  def __rpow__(self, x, z=None): 
    """ y.__rpow__(x[, z]) <==> pow(x, y[, z]) """
    pass

  def __rrshift__(self, y): 
    """ x.__rrshift__(y) <==> y>>x """
    pass

  def __rshift__(self, y): 
    """ x.__rshift__(y) <==> x>>y """
    pass

  def __rsub__(self, y): 
    """ x.__rsub__(y) <==> y-x """
    pass

  def __rtruediv__(self, y): 
    """ x.__rtruediv__(y) <==> y/x """
    pass

  def __rxor__(self, y): 
    """ x.__rxor__(y) <==> y^x """
    pass

  def __sub__(self, y): 
    """ x.__sub__(y) <==> x-y """
    pass

  def __truediv__(self, y): 
    """ x.__truediv__(y) <==> x/y """
    pass

  def __trunc__(self, *args, **kwargs): 
    """ 返回數(shù)值被截取為整形的值,在整形中無意義 """
    pass

  def __xor__(self, y): 
    """ x.__xor__(y) <==> x^y """
    pass

  denominator = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  """ 分母 = 1 """
  """the denominator of a rational number in lowest terms"""

  imag = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  """ 虛數(shù),無意義 """
  """the imaginary part of a complex number"""

  numerator = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  """ 分子 = 數(shù)字大小 """
  """the numerator of a rational number in lowest terms"""

  real = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  """ 實屬,無意義 """
  """the real part of a complex number"""

int

int

二、長整型
如:2147483649、9223372036854775807
類型常用功能:

#長整型功能與整形基本類似

class long(object):
  """
  long(x=0) -> long
  long(x, base=10) -> long
  
  Convert a number or string to a long integer, or return 0L if no arguments
  are given. If x is floating point, the conversion truncates towards zero.
  
  If x is not a number or if base is given, then x must be a string or
  Unicode object representing an integer literal in the given base. The
  literal can be preceded by '+' or '-' and be surrounded by whitespace.
  The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to
  interpret the base from the string as an integer literal.
  >>> int('0b100', base=0)
  4L
  """
  def bit_length(self): # real signature unknown; restored from __doc__
    """
    long.bit_length() -> int or long
    
    Number of bits necessary to represent self in binary.
    >>> bin(37L)
    '0b100101'
    >>> (37L).bit_length()
    """
    return 0

  def conjugate(self, *args, **kwargs): # real signature unknown
    """ Returns self, the complex conjugate of any long. """
    pass

  def __abs__(self): # real signature unknown; restored from __doc__
    """ x.__abs__() <==> abs(x) """
    pass

  def __add__(self, y): # real signature unknown; restored from __doc__
    """ x.__add__(y) <==> x+y """
    pass

  def __and__(self, y): # real signature unknown; restored from __doc__
    """ x.__and__(y) <==> x&y """
    pass

  def __cmp__(self, y): # real signature unknown; restored from __doc__
    """ x.__cmp__(y) <==> cmp(x,y) """
    pass

  def __coerce__(self, y): # real signature unknown; restored from __doc__
    """ x.__coerce__(y) <==> coerce(x, y) """
    pass

  def __divmod__(self, y): # real signature unknown; restored from __doc__
    """ x.__divmod__(y) <==> divmod(x, y) """
    pass

  def __div__(self, y): # real signature unknown; restored from __doc__
    """ x.__div__(y) <==> x/y """
    pass

  def __float__(self): # real signature unknown; restored from __doc__
    """ x.__float__() <==> float(x) """
    pass

  def __floordiv__(self, y): # real signature unknown; restored from __doc__
    """ x.__floordiv__(y) <==> x//y """
    pass

  def __format__(self, *args, **kwargs): # real signature unknown
    pass

  def __getattribute__(self, name): # real signature unknown; restored from __doc__
    """ x.__getattribute__('name') <==> x.name """
    pass

  def __getnewargs__(self, *args, **kwargs): # real signature unknown
    pass

  def __hash__(self): # real signature unknown; restored from __doc__
    """ x.__hash__() <==> hash(x) """
    pass

  def __hex__(self): # real signature unknown; restored from __doc__
    """ x.__hex__() <==> hex(x) """
    pass

  def __index__(self): # real signature unknown; restored from __doc__
    """ x[y:z] <==> x[y.__index__():z.__index__()] """
    pass

  def __init__(self, x=0): # real signature unknown; restored from __doc__
    pass

  def __int__(self): # real signature unknown; restored from __doc__
    """ x.__int__() <==> int(x) """
    pass

  def __invert__(self): # real signature unknown; restored from __doc__
    """ x.__invert__() <==> ~x """
    pass

  def __long__(self): # real signature unknown; restored from __doc__
    """ x.__long__() <==> long(x) """
    pass

  def __lshift__(self, y): # real signature unknown; restored from __doc__
    """ x.__lshift__(y) <==> x<<y """
    pass

  def __mod__(self, y): # real signature unknown; restored from __doc__
    """ x.__mod__(y) <==> x%y """
    pass

  def __mul__(self, y): # real signature unknown; restored from __doc__
    """ x.__mul__(y) <==> x*y """
    pass

  def __neg__(self): # real signature unknown; restored from __doc__
    """ x.__neg__() <==> -x """
    pass

  @staticmethod # known case of __new__
  def __new__(S, *more): # real signature unknown; restored from __doc__
    """ T.__new__(S, ...) -> a new object with type S, a subtype of T """
    pass

  def __nonzero__(self): # real signature unknown; restored from __doc__
    """ x.__nonzero__() <==> x != 0 """
    pass

  def __oct__(self): # real signature unknown; restored from __doc__
    """ x.__oct__() <==> oct(x) """
    pass

  def __or__(self, y): # real signature unknown; restored from __doc__
    """ x.__or__(y) <==> x|y """
    pass

  def __pos__(self): # real signature unknown; restored from __doc__
    """ x.__pos__() <==> +x """
    pass

  def __pow__(self, y, z=None): # real signature unknown; restored from __doc__
    """ x.__pow__(y[, z]) <==> pow(x, y[, z]) """
    pass

  def __radd__(self, y): # real signature unknown; restored from __doc__
    """ x.__radd__(y) <==> y+x """
    pass

  def __rand__(self, y): # real signature unknown; restored from __doc__
    """ x.__rand__(y) <==> y&x """
    pass

  def __rdivmod__(self, y): # real signature unknown; restored from __doc__
    """ x.__rdivmod__(y) <==> divmod(y, x) """
    pass

  def __rdiv__(self, y): # real signature unknown; restored from __doc__
    """ x.__rdiv__(y) <==> y/x """
    pass

  def __repr__(self): # real signature unknown; restored from __doc__
    """ x.__repr__() <==> repr(x) """
    pass

  def __rfloordiv__(self, y): # real signature unknown; restored from __doc__
    """ x.__rfloordiv__(y) <==> y//x """
    pass

  def __rlshift__(self, y): # real signature unknown; restored from __doc__
    """ x.__rlshift__(y) <==> y<<x """
    pass

  def __rmod__(self, y): # real signature unknown; restored from __doc__
    """ x.__rmod__(y) <==> y%x """
    pass

  def __rmul__(self, y): # real signature unknown; restored from __doc__
    """ x.__rmul__(y) <==> y*x """
    pass

  def __ror__(self, y): # real signature unknown; restored from __doc__
    """ x.__ror__(y) <==> y|x """
    pass

  def __rpow__(self, x, z=None): # real signature unknown; restored from __doc__
    """ y.__rpow__(x[, z]) <==> pow(x, y[, z]) """
    pass

  def __rrshift__(self, y): # real signature unknown; restored from __doc__
    """ x.__rrshift__(y) <==> y>>x """
    pass

  def __rshift__(self, y): # real signature unknown; restored from __doc__
    """ x.__rshift__(y) <==> x>>y """
    pass

  def __rsub__(self, y): # real signature unknown; restored from __doc__
    """ x.__rsub__(y) <==> y-x """
    pass

  def __rtruediv__(self, y): # real signature unknown; restored from __doc__
    """ x.__rtruediv__(y) <==> y/x """
    pass

  def __rxor__(self, y): # real signature unknown; restored from __doc__
    """ x.__rxor__(y) <==> y^x """
    pass

  def __sizeof__(self, *args, **kwargs): # real signature unknown
    """ Returns size in memory, in bytes """
    pass

  def __str__(self): # real signature unknown; restored from __doc__
    """ x.__str__() <==> str(x) """
    pass

  def __sub__(self, y): # real signature unknown; restored from __doc__
    """ x.__sub__(y) <==> x-y """
    pass

  def __truediv__(self, y): # real signature unknown; restored from __doc__
    """ x.__truediv__(y) <==> x/y """
    pass

  def __trunc__(self, *args, **kwargs): # real signature unknown
    """ Truncating an Integral returns itself. """
    pass

  def __xor__(self, y): # real signature unknown; restored from __doc__
    """ x.__xor__(y) <==> x^y """
    pass

  denominator = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  """the denominator of a rational number in lowest terms"""

  imag = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  """the imaginary part of a complex number"""

  numerator = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  """the numerator of a rational number in lowest terms"""

  real = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  """the real part of a complex number"""

long

long

注:跟C語言不同,Python的長整數(shù)沒有指定位寬,即:Python沒有限制長整數(shù)數(shù)值的大小,但實際上由于機器內存有限,我們使用的長整數(shù)數(shù)值不可能無限大。自從Python2.2起,如果整數(shù)發(fā)生溢出,Python會自動將整數(shù)數(shù)據(jù)轉換為長整數(shù),所以如今在長整數(shù)數(shù)據(jù)后面不加字母L也不會導致嚴重后果

三、浮點型
如:3.14、2.88

類型常用功能:

#浮點型功能與整形基本類似

class float(object):
  """
  float(x) -> floating point number
  
  Convert a string or number to a floating point number, if possible.
  """
  def as_integer_ratio(self):  
    """ 獲取改值的最簡比 """
    """
    float.as_integer_ratio() -> (int, int)

    Return a pair of integers, whose ratio is exactly equal to the original
    float and with a positive denominator.
    Raise OverflowError on infinities and a ValueError on NaNs.

    >>> (10.0).as_integer_ratio()
    (10, 1)
    >>> (0.0).as_integer_ratio()
    (0, 1)
    >>> (-.25).as_integer_ratio()
    (-1, 4)
    """
    pass

  def conjugate(self, *args, **kwargs): # real signature unknown
    """ Return self, the complex conjugate of any float. """
    pass

  def fromhex(self, string):  
    """ 將十六進制字符串轉換成浮點型 """
    """
    float.fromhex(string) -> float
    
    Create a floating-point number from a hexadecimal string.
    >>> float.fromhex('0x1.ffffp10')
    2047.984375
    >>> float.fromhex('-0x1p-1074')
    -4.9406564584124654e-324
    """
    return 0.0

  def hex(self):  
    """ 返回當前值的 16 進制表示 """
    """
    float.hex() -> string
    
    Return a hexadecimal representation of a floating-point number.
    >>> (-0.1).hex()
    '-0x1.999999999999ap-4'
    >>> 3.14159.hex()
    '0x1.921f9f01b866ep+1'
    """
    return ""

  def is_integer(self, *args, **kwargs): # real signature unknown
    """ Return True if the float is an integer. """
    pass

  def __abs__(self):  
    """ x.__abs__() <==> abs(x) """
    pass

  def __add__(self, y):  
    """ x.__add__(y) <==> x+y """
    pass

  def __coerce__(self, y):  
    """ x.__coerce__(y) <==> coerce(x, y) """
    pass

  def __divmod__(self, y):  
    """ x.__divmod__(y) <==> divmod(x, y) """
    pass

  def __div__(self, y):  
    """ x.__div__(y) <==> x/y """
    pass

  def __eq__(self, y):  
    """ x.__eq__(y) <==> x==y """
    pass

  def __float__(self):  
    """ x.__float__() <==> float(x) """
    pass

  def __floordiv__(self, y):  
    """ x.__floordiv__(y) <==> x//y """
    pass

  def __format__(self, format_spec):  
    """
    float.__format__(format_spec) -> string
    
    Formats the float according to format_spec.
    """
    return ""

  def __getattribute__(self, name):  
    """ x.__getattribute__('name') <==> x.name """
    pass

  def __getformat__(self, typestr):  
    """
    float.__getformat__(typestr) -> string
    
    You probably don't want to use this function. It exists mainly to be
    used in Python's test suite.
    
    typestr must be 'double' or 'float'. This function returns whichever of
    'unknown', 'IEEE, big-endian' or 'IEEE, little-endian' best describes the
    format of floating point numbers used by the C type named by typestr.
    """
    return ""

  def __getnewargs__(self, *args, **kwargs): # real signature unknown
    pass

  def __ge__(self, y):  
    """ x.__ge__(y) <==> x>=y """
    pass

  def __gt__(self, y):  
    """ x.__gt__(y) <==> x>y """
    pass

  def __hash__(self):  
    """ x.__hash__() <==> hash(x) """
    pass

  def __init__(self, x):  
    pass

  def __int__(self):  
    """ x.__int__() <==> int(x) """
    pass

  def __le__(self, y):  
    """ x.__le__(y) <==> x<=y """
    pass

  def __long__(self):  
    """ x.__long__() <==> long(x) """
    pass

  def __lt__(self, y):  
    """ x.__lt__(y) <==> x<y """
    pass

  def __mod__(self, y):  
    """ x.__mod__(y) <==> x%y """
    pass

  def __mul__(self, y):  
    """ x.__mul__(y) <==> x*y """
    pass

  def __neg__(self):  
    """ x.__neg__() <==> -x """
    pass

  @staticmethod # known case of __new__
  def __new__(S, *more):  
    """ T.__new__(S, ...) -> a new object with type S, a subtype of T """
    pass

  def __ne__(self, y):  
    """ x.__ne__(y) <==> x!=y """
    pass

  def __nonzero__(self):  
    """ x.__nonzero__() <==> x != 0 """
    pass

  def __pos__(self):  
    """ x.__pos__() <==> +x """
    pass

  def __pow__(self, y, z=None):  
    """ x.__pow__(y[, z]) <==> pow(x, y[, z]) """
    pass

  def __radd__(self, y):  
    """ x.__radd__(y) <==> y+x """
    pass

  def __rdivmod__(self, y):  
    """ x.__rdivmod__(y) <==> divmod(y, x) """
    pass

  def __rdiv__(self, y):  
    """ x.__rdiv__(y) <==> y/x """
    pass

  def __repr__(self):  
    """ x.__repr__() <==> repr(x) """
    pass

  def __rfloordiv__(self, y):  
    """ x.__rfloordiv__(y) <==> y//x """
    pass

  def __rmod__(self, y):  
    """ x.__rmod__(y) <==> y%x """
    pass

  def __rmul__(self, y):  
    """ x.__rmul__(y) <==> y*x """
    pass

  def __rpow__(self, x, z=None):  
    """ y.__rpow__(x[, z]) <==> pow(x, y[, z]) """
    pass

  def __rsub__(self, y):  
    """ x.__rsub__(y) <==> y-x """
    pass

  def __rtruediv__(self, y):  
    """ x.__rtruediv__(y) <==> y/x """
    pass

  def __setformat__(self, typestr, fmt):  
    """
    float.__setformat__(typestr, fmt) -> None
    
    You probably don't want to use this function. It exists mainly to be
    used in Python's test suite.
    
    typestr must be 'double' or 'float'. fmt must be one of 'unknown',
    'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be
    one of the latter two if it appears to match the underlying C reality.
    
    Override the automatic determination of C-level floating point type.
    This affects how floats are converted to and from binary strings.
    """
    pass

  def __str__(self):  
    """ x.__str__() <==> str(x) """
    pass

  def __sub__(self, y):  
    """ x.__sub__(y) <==> x-y """
    pass

  def __truediv__(self, y):  
    """ x.__truediv__(y) <==> x/y """
    pass

  def __trunc__(self, *args, **kwargs): # real signature unknown
    """ Return the Integral closest to x between 0 and x. """
    pass

  imag = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  """the imaginary part of a complex number"""

  real = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  """the real part of a complex number"""

 float

float

四、字符串
如:'wupeiqi'、'alex'、'solo'

類型常用功能:

name = "my name is solo"
print(name.capitalize())      #首字母大寫
#My name is solo
print(name.count("l"))       #統(tǒng)計字符串出現(xiàn)某個字符的個數(shù)
#2
print(name.center(30,"-"))     #打印30個字符,不夠的-補齊
#--------my name is solo--------
print(name.ljust(30,"-"))      #打印30個字符,不夠的-補齊,字符串在左邊
#my name is solo----------------
print(name.endswith("solo"))     #判斷字符串是否以solo結尾
#True
print(name[name.find("na"):])    #find尋找na所在的索引下標 字符串也可以切片
#name is solo
print("5.3".isdigit())       #判斷字符是否為整數(shù)
#False
print("a_1A".isidentifier())    #判斷是不是一個合法的標識符(變量名)
#True
print("+".join(["1","2","3"]))   #把join后的內容加入到前面字符串中,以+為分割符
#1+2+3
print("\nsolo".strip())       #去換行符
#solo
print("1+2+3+4".split("+"))    #以+為分隔符生成新的列表,默認不寫為空格
#['1', '2', '3', '4']
name = "my name is {name} and i an {year} old"
print(name.format(name="solo",year=20)
#my name is solo and i an 20 old
print(name.format_map({"name":"solo","year":20}))      #很少用
#my name is solo and i an 20 old
p = str.maketrans("abcdefli","12345678")     #轉換 一一對應
print("lianzhilei".translate(p))
#781nzh8758
class str(basestring):
  """
  str(object='') -> string
  
  Return a nice string representation of the object.
  If the argument is a string, the return value is the same object.
  """
  def capitalize(self): 
    """ 首字母變大寫 """
    """
    S.capitalize() -> string
    
    Return a copy of the string S with only its first character
    capitalized.
    """
    return ""

  def center(self, width, fillchar=None): 
    """ 內容居中,width:總長度;fillchar:空白處填充內容,默認無 """
    """
    S.center(width[, fillchar]) -> string
    
    Return S centered in a string of length width. Padding is
    done using the specified fill character (default is a space)
    """
    return ""

  def count(self, sub, start=None, end=None): 
    """ 子序列個數(shù) """
    """
    S.count(sub[, start[, end]]) -> int
    
    Return the number of non-overlapping occurrences of substring sub in
    string S[start:end]. Optional arguments start and end are interpreted
    as in slice notation.
    """
    return 0

  def decode(self, encoding=None, errors=None): 
    """ 解碼 """
    """
    S.decode([encoding[,errors]]) -> object
    
    Decodes S using the codec registered for encoding. encoding defaults
    to the default encoding. errors may be given to set a different error
    handling scheme. Default is 'strict' meaning that encoding errors raise
    a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
    as well as any other name registered with codecs.register_error that is
    able to handle UnicodeDecodeErrors.
    """
    return object()

  def encode(self, encoding=None, errors=None): 
    """ 編碼,針對unicode """
    """
    S.encode([encoding[,errors]]) -> object
    
    Encodes S using the codec registered for encoding. encoding defaults
    to the default encoding. errors may be given to set a different error
    handling scheme. Default is 'strict' meaning that encoding errors raise
    a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and
    'xmlcharrefreplace' as well as any other name registered with
    codecs.register_error that is able to handle UnicodeEncodeErrors.
    """
    return object()

  def endswith(self, suffix, start=None, end=None): 
    """ 是否以 xxx 結束 """
    """
    S.endswith(suffix[, start[, end]]) -> bool
    
    Return True if S ends with the specified suffix, False otherwise.
    With optional start, test S beginning at that position.
    With optional end, stop comparing S at that position.
    suffix can also be a tuple of strings to try.
    """
    return False

  def expandtabs(self, tabsize=None): 
    """ 將tab轉換成空格,默認一個tab轉換成8個空格 """
    """
    S.expandtabs([tabsize]) -> string
    
    Return a copy of S where all tab characters are expanded using spaces.
    If tabsize is not given, a tab size of 8 characters is assumed.
    """
    return ""

  def find(self, sub, start=None, end=None): 
    """ 尋找子序列位置,如果沒找到,返回 -1 """
    """
    S.find(sub [,start [,end]]) -> int
    
    Return the lowest index in S where substring sub is found,
    such that sub is contained within S[start:end]. Optional
    arguments start and end are interpreted as in slice notation.
    
    Return -1 on failure.
    """
    return 0

  def format(*args, **kwargs): # known special case of str.format
    """ 字符串格式化,動態(tài)參數(shù),將函數(shù)式編程時細說 """
    """
    S.format(*args, **kwargs) -> string
    
    Return a formatted version of S, using substitutions from args and kwargs.
    The substitutions are identified by braces ('{' and '}').
    """
    pass

  def index(self, sub, start=None, end=None): 
    """ 子序列位置,如果沒找到,報錯 """
    S.index(sub [,start [,end]]) -> int
    
    Like S.find() but raise ValueError when the substring is not found.
    """
    return 0

  def isalnum(self): 
    """ 是否是字母和數(shù)字 """
    """
    S.isalnum() -> bool
    
    Return True if all characters in S are alphanumeric
    and there is at least one character in S, False otherwise.
    """
    return False

  def isalpha(self): 
    """ 是否是字母 """
    """
    S.isalpha() -> bool
    
    Return True if all characters in S are alphabetic
    and there is at least one character in S, False otherwise.
    """
    return False

  def isdigit(self): 
    """ 是否是數(shù)字 """
    """
    S.isdigit() -> bool
    
    Return True if all characters in S are digits
    and there is at least one character in S, False otherwise.
    """
    return False

  def islower(self): 
    """ 是否小寫 """
    """
    S.islower() -> bool
    
    Return True if all cased characters in S are lowercase and there is
    at least one cased character in S, False otherwise.
    """
    return False

  def isspace(self): 
    """
    S.isspace() -> bool
    
    Return True if all characters in S are whitespace
    and there is at least one character in S, False otherwise.
    """
    return False

  def istitle(self): 
    """
    S.istitle() -> bool
    
    Return True if S is a titlecased string and there is at least one
    character in S, i.e. uppercase characters may only follow uncased
    characters and lowercase characters only cased ones. Return False
    otherwise.
    """
    return False

  def isupper(self): 
    """
    S.isupper() -> bool
    
    Return True if all cased characters in S are uppercase and there is
    at least one cased character in S, False otherwise.
    """
    return False

  def join(self, iterable): 
    """ 連接 """
    """
    S.join(iterable) -> string
    
    Return a string which is the concatenation of the strings in the
    iterable. The separator between elements is S.
    """
    return ""

  def ljust(self, width, fillchar=None): 
    """ 內容左對齊,右側填充 """
    """
    S.ljust(width[, fillchar]) -> string
    
    Return S left-justified in a string of length width. Padding is
    done using the specified fill character (default is a space).
    """
    return ""

  def lower(self): 
    """ 變小寫 """
    """
    S.lower() -> string
    
    Return a copy of the string S converted to lowercase.
    """
    return ""

  def lstrip(self, chars=None): 
    """ 移除左側空白 """
    """
    S.lstrip([chars]) -> string or unicode
    
    Return a copy of the string S with leading whitespace removed.
    If chars is given and not None, remove characters in chars instead.
    If chars is unicode, S will be converted to unicode before stripping
    """
    return ""

  def partition(self, sep): 
    """ 分割,前,中,后三部分 """
    """
    S.partition(sep) -> (head, sep, tail)
    
    Search for the separator sep in S, and return the part before it,
    the separator itself, and the part after it. If the separator is not
    found, return S and two empty strings.
    """
    pass

  def replace(self, old, new, count=None): 
    """ 替換 """
    """
    S.replace(old, new[, count]) -> string
    
    Return a copy of string S with all occurrences of substring
    old replaced by new. If the optional argument count is
    given, only the first count occurrences are replaced.
    """
    return ""

  def rfind(self, sub, start=None, end=None): 
    """
    S.rfind(sub [,start [,end]]) -> int
    
    Return the highest index in S where substring sub is found,
    such that sub is contained within S[start:end]. Optional
    arguments start and end are interpreted as in slice notation.
    
    Return -1 on failure.
    """
    return 0

  def rindex(self, sub, start=None, end=None): 
    """
    S.rindex(sub [,start [,end]]) -> int
    
    Like S.rfind() but raise ValueError when the substring is not found.
    """
    return 0

  def rjust(self, width, fillchar=None): 
    """
    S.rjust(width[, fillchar]) -> string
    
    Return S right-justified in a string of length width. Padding is
    done using the specified fill character (default is a space)
    """
    return ""

  def rpartition(self, sep): 
    """
    S.rpartition(sep) -> (head, sep, tail)
    
    Search for the separator sep in S, starting at the end of S, and return
    the part before it, the separator itself, and the part after it. If the
    separator is not found, return two empty strings and S.
    """
    pass

  def rsplit(self, sep=None, maxsplit=None): 
    """
    S.rsplit([sep [,maxsplit]]) -> list of strings
    
    Return a list of the words in the string S, using sep as the
    delimiter string, starting at the end of the string and working
    to the front. If maxsplit is given, at most maxsplit splits are
    done. If sep is not specified or is None, any whitespace string
    is a separator.
    """
    return []

  def rstrip(self, chars=None): 
    """
    S.rstrip([chars]) -> string or unicode
    
    Return a copy of the string S with trailing whitespace removed.
    If chars is given and not None, remove characters in chars instead.
    If chars is unicode, S will be converted to unicode before stripping
    """
    return ""

  def split(self, sep=None, maxsplit=None): 
    """ 分割, maxsplit最多分割幾次 """
    """
    S.split([sep [,maxsplit]]) -> list of strings
    
    Return a list of the words in the string S, using sep as the
    delimiter string. If maxsplit is given, at most maxsplit
    splits are done. If sep is not specified or is None, any
    whitespace string is a separator and empty strings are removed
    from the result.
    """
    return []

  def splitlines(self, keepends=False): 
    """ 根據(jù)換行分割 """
    """
    S.splitlines(keepends=False) -> list of strings
    
    Return a list of the lines in S, breaking at line boundaries.
    Line breaks are not included in the resulting list unless keepends
    is given and true.
    """
    return []

  def startswith(self, prefix, start=None, end=None): 
    """ 是否起始 """
    """
    S.startswith(prefix[, start[, end]]) -> bool
    
    Return True if S starts with the specified prefix, False otherwise.
    With optional start, test S beginning at that position.
    With optional end, stop comparing S at that position.
    prefix can also be a tuple of strings to try.
    """
    return False

  def strip(self, chars=None): 
    """ 移除兩段空白 """
    """
    S.strip([chars]) -> string or unicode
    
    Return a copy of the string S with leading and trailing
    whitespace removed.
    If chars is given and not None, remove characters in chars instead.
    If chars is unicode, S will be converted to unicode before stripping
    """
    return ""

  def swapcase(self): 
    """ 大寫變小寫,小寫變大寫 """
    """
    S.swapcase() -> string
    
    Return a copy of the string S with uppercase characters
    converted to lowercase and vice versa.
    """
    return ""

  def title(self): 
    """
    S.title() -> string
    
    Return a titlecased version of S, i.e. words start with uppercase
    characters, all remaining cased characters have lowercase.
    """
    return ""

  def translate(self, table, deletechars=None): 
    """
    轉換,需要先做一個對應表,最后一個表示刪除字符集合
    intab = "aeiou"
    outtab = "12345"
    trantab = maketrans(intab, outtab)
    str = "this is string example....wow!!!"
    print str.translate(trantab, 'xm')
    """

    """
    S.translate(table [,deletechars]) -> string
    
    Return a copy of the string S, where all characters occurring
    in the optional argument deletechars are removed, and the
    remaining characters have been mapped through the given
    translation table, which must be a string of length 256 or None.
    If the table argument is None, no translation is applied and
    the operation simply removes the characters in deletechars.
    """
    return ""

  def upper(self): 
    """
    S.upper() -> string
    
    Return a copy of the string S converted to uppercase.
    """
    return ""

  def zfill(self, width): 
    """方法返回指定長度的字符串,原字符串右對齊,前面填充0。"""
    """
    S.zfill(width) -> string
    
    Pad a numeric string S with zeros on the left, to fill a field
    of the specified width. The string S is never truncated.
    """
    return ""

  def _formatter_field_name_split(self, *args, **kwargs): # real signature unknown
    pass

  def _formatter_parser(self, *args, **kwargs): # real signature unknown
    pass

  def __add__(self, y): 
    """ x.__add__(y) <==> x+y """
    pass

  def __contains__(self, y): 
    """ x.__contains__(y) <==> y in x """
    pass

  def __eq__(self, y): 
    """ x.__eq__(y) <==> x==y """
    pass

  def __format__(self, format_spec): 
    """
    S.__format__(format_spec) -> string
    
    Return a formatted version of S as described by format_spec.
    """
    return ""

  def __getattribute__(self, name): 
    """ x.__getattribute__('name') <==> x.name """
    pass

  def __getitem__(self, y): 
    """ x.__getitem__(y) <==> x[y] """
    pass

  def __getnewargs__(self, *args, **kwargs): # real signature unknown
    pass

  def __getslice__(self, i, j): 
    """
    x.__getslice__(i, j) <==> x[i:j]
          
          Use of negative indices is not supported.
    """
    pass

  def __ge__(self, y): 
    """ x.__ge__(y) <==> x>=y """
    pass

  def __gt__(self, y): 
    """ x.__gt__(y) <==> x>y """
    pass

  def __hash__(self): 
    """ x.__hash__() <==> hash(x) """
    pass

  def __init__(self, string=''): # known special case of str.__init__
    """
    str(object='') -> string
    
    Return a nice string representation of the object.
    If the argument is a string, the return value is the same object.
    # (copied from class doc)
    """
    pass

  def __len__(self): 
    """ x.__len__() <==> len(x) """
    pass

  def __le__(self, y): 
    """ x.__le__(y) <==> x<=y """
    pass

  def __lt__(self, y): 
    """ x.__lt__(y) <==> x<y """
    pass

  def __mod__(self, y): 
    """ x.__mod__(y) <==> x%y """
    pass

  def __mul__(self, n): 
    """ x.__mul__(n) <==> x*n """
    pass

  @staticmethod # known case of __new__
  def __new__(S, *more): 
    """ T.__new__(S, ...) -> a new object with type S, a subtype of T """
    pass

  def __ne__(self, y): 
    """ x.__ne__(y) <==> x!=y """
    pass

  def __repr__(self): 
    """ x.__repr__() <==> repr(x) """
    pass

  def __rmod__(self, y): 
    """ x.__rmod__(y) <==> y%x """
    pass

  def __rmul__(self, n): 
    """ x.__rmul__(n) <==> n*x """
    pass

  def __sizeof__(self): 
    """ S.__sizeof__() -> size of S in memory, in bytes """
    pass

  def __str__(self): 
    """ x.__str__() <==> str(x) """
    pass

str

str

五、列表


如:[11,22,33,44,55]、['wupeiqi', 'alex','solo']
1、創(chuàng)建列表:

#兩種創(chuàng)建方式
name_list = ['alex', 'seven', 'eric']
name_list = list(['alex', 'seven', 'eric'])

2、列表類常用功能:
① 切片

name_list = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
print(name_list[0:3])    #取下標0至下標3之間的元素,包括0,不包括3
#['Alex', 'Tenglan', 'Eric']
print(name_list[:3])    #:前什么都不寫,表示從0開始,效果跟上句一樣
#['Alex', 'Tenglan', 'Eric']
print(name_list[3:])    #:后什么不寫,表示取值到最后
#['Rain', 'Tom', 'Amy']
print(name_list[:])     #:前后都不寫,表示取值所有
#['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy']
print(name_list[-3:-1])   #從-3開始到-1,包括-3,不包括-1
#['Rain', 'Tom']
print(name_list[1:-1])   #從1開始到-1,下標有正有負時,正數(shù)在前負數(shù)在后
#['Tenglan', 'Eric', 'Rain', 'Tom']
print(name_list[::2])    #2表示,每個1個元素,就取一個
#['Alex', 'Eric', 'Tom']
#注:[-1:0] [0:0] [-1:2] 都是空

② 追加

name_list = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
name_list.append("new")     #append追加,加到最后,只能添加一個
print(name_list)
#['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', 'new']

③ 插入

name_list = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
name_list.insert(3,"new")     #insert插入,把"new"加到下標3的位置
print(name_list)

④ 修改

name_list = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
name_list[2] = "solo"        #把下標2的字符串換成solo
print(name_list)

⑤ 刪除

#3種刪除方式
name_list = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
del name_list[3]           #del刪除,指定要刪除的下標
print(name_list)
#['Alex', 'Tenglan', 'Eric', 'Tom', 'Amy']
name_list.remove("Tenglan")     #remove刪除,指定要刪除的字符
print(name_list)
#['Alex', 'Eric', 'Tom', 'Amy']
name_list.pop()            #pop刪除,刪除列表最后一個值
print(name_list)
#['Alex', 'Eric', 'Tom']

⑥ 擴展

name_list = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
age_list = [11,22,33]
name_list.extend(age_list)        #extend擴展,把列表age_list添加到name_list列表
print(name_list)

⑦ 拷貝

name_list = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
copy_list = name_list.copy()        #copy拷貝,對列表進行復制
print(copy_list)
#注:之后會整理深淺copy的詳細區(qū)分

⑧ 統(tǒng)計

name_list = ["Alex","Tenglan","Eric","Amy","Tom","Amy"]
print(name_list.count("Amy"))        #count統(tǒng)計,統(tǒng)計列表Amy的個數(shù)
#2

⑨ 排序和翻轉

name_list = ["Alex","Tenglan","Eric","Rain","Tom","Amy","1","2","3"]
name_list.sort()               #sort排序,對列表進行排序
print(name_list)
#['1', '2', '3', 'Alex', 'Amy', 'Eric', 'Rain', 'Tenglan', 'Tom']
name_list.reverse()              #reverse翻轉,對列表進行翻轉
print(name_list)
#['Tom', 'Tenglan', 'Rain', 'Eric', 'Amy', 'Alex', '3', '2', '1']

⑩ 獲取下標

name_list = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
print(name_list.index("Tenglan"))       #index索引,獲取字符的下標
#1

六、元組

如:(11,22,33,44,55)、('wupeiqi', 'alex','lzl')

1、創(chuàng)建元組:

#5種創(chuàng)建方式
age = 11,22,33,44,55      #直接寫數(shù)字或者字符串,默認創(chuàng)建類型元組 字符串類型用引號'solo'
#輸出: (11, 22, 33, 44, 55)  
age = (11,22,33,44,55)     #常見命名方式,()指定類型元組
#輸出: (11, 22, 33, 44, 55)
age = tuple((11,22,33,44,55))  #tuple 以類的方式創(chuàng)建(()) 雙括號 里面的()不可去掉
#輸出: (11, 22, 33, 44, 55)
age = tuple([11,22,33,44,55])  #同(()) 效果一樣 很少用 忘記它
#輸出: (11, 22, 33, 44, 55)
age = tuple({11,22,33,44,55})  #({})創(chuàng)建的元組,隨機排列 沒卵用
#輸出: (33, 11, 44, 22, 55)

2、元組類常用功能:

##count        #統(tǒng)計元組字符出現(xiàn)的次數(shù)   
name = ('wupeiqi', 'alex','solo')
print(name.count('alex'))       
# 1
##index       #查看字符串所在的索引位置
name = ('wupeiqi', 'alex','solo')
print(name.index('solo'))        
# solo

七、字典 無序


如:{'name': 'wupeiqi', 'age': 18} 、{'host': 'solo.solo.solo.solo', 'port': 80}
注:字典一種key:value 的數(shù)據(jù)類型,也稱鍵值對。字典dict是無序的,key值必須是唯一的,不能有重復。循環(huán)時,默認循環(huán)的是key
 1、創(chuàng)建字典

#兩種創(chuàng)建方式:
info_dic = {'stu1101': "TengLan Wu",'stu1102': "LongZe Luola",'stu1103': "XiaoZe Maliya",}
print(info_dic)
#{'stu1102': 'LongZe Luola', 'stu1101': 'TengLan Wu', 'stu1103': 'XiaoZe Maliya'}
info_dic = dict({'stu1101': "TengLan Wu",'stu1102': "LongZe Luola",'stu1103': "XiaoZe Maliya",})
print(info_dic)
#{'stu1102': 'LongZe Luola', 'stu1101': 'TengLan Wu', 'stu1103': 'XiaoZe Maliya'}

2、字典類常用功能:

① 增加

info_dic = {'stu1101': "TengLan Wu",'stu1102': "LongZe Luola",'stu1103': "XiaoZe Maliya",}
info_dic['stu1104'] = "JingKong Cang"      #增加
print(info_dic)

② 修改

info_dic = {'stu1101': "TengLan Wu",'stu1102': "LongZe Luola",'stu1103': "XiaoZe Maliya",}
info_dic["stu1101"] = "Jingkong Cang"     #有相應的key時為修改,沒有為增加
print(info_dic)

 

③ 刪除

#3種刪除方式
info_dic = {'stu1101': "TengLan Wu",'stu1102': "LongZe Luola",'stu1103': "XiaoZe Maliya",}
info_dic.pop('stu1101')            #pop刪除,指定刪除的key
print(info_dic)
#{'stu1103': 'XiaoZe Maliya', 'stu1102': 'LongZe Luola'}
del info_dic['stu1102']           #del刪除,指定刪除的key
print(info_dic)
#{'stu1103': 'XiaoZe Maliya'}
info_dic = {'stu1101': "TengLan Wu",'stu1102': "LongZe Luola",'stu1103': "XiaoZe Maliya",}
info_dic.popitem()               #隨機刪除,沒卵用
print(info_dic)
#{'stu1101': 'TengLan Wu', 'stu1103': 'XiaoZe Maliya'}

 

④ 查找value值

info_dic = {'stu1101': "TengLan Wu",'stu1102': "LongZe Luola",'stu1103': "XiaoZe Maliya",}
print(info_dic.get('stu1102'))   #get查找,通過key查找value值
#LongZe Luola
print(info_dic['stu1102'])     #通過key直接查找,但是如果輸入查找的key不存在的話,就會報錯,get則不會
#LongZe Luola

 

⑤ 字典多級嵌套

  "歐美":{
    "www.youporn.com": ["很多免費的,世界最大的","質量一般"],
    "www.pornhub.com": ["很多免費的,也很大","質量比yourporn高點"],
    "letmedothistoyou.com": ["多是自拍,高質量圖片很多","資源不多,更新慢"],
    "x-art.com":["質量很高,真的很高","全部收費,屌比請繞過"]
  },
  "日韓":{
    "tokyo-hot":["質量怎樣不清楚,個人已經(jīng)不喜歡日韓范了","聽說是收費的"]
  },
  "大陸":{
    "1024":["全部免費,真好,好人一生平安","服務器在國外,慢"]
  }
}
 
av_catalog["大陸"]["1024"][1] += ",可以用爬蟲爬下來"
print(av_catalog["大陸"]["1024"])
#['全部免費,真好,好人一生平安', '服務器在國外,慢,可以用爬蟲爬下來']

⑥ 循環(huán)

info_dic = {'stu1101': "TengLan Wu",'stu1102': "LongZe Luola",'stu1103': "XiaoZe Maliya",}
for stu_nu in info_dic:
  print(stu_nu,info_dic[stu_nu])    #循環(huán)默認提取的是key
#stu1103 XiaoZe Maliya
#stu1101 TengLan Wu
#stu1102 LongZe Luola
for k,v in info_dic.items():       #先把dict生成list,數(shù)據(jù)量大的時候費時,不建議使用
  print(k,v)
#stu1103 XiaoZe Maliya
#stu1101 TengLan Wu
#stu1102 LongZe Luola

八、集合
如:{'solo', 33, 'alex', 22, 'eric', 'wupeiqi', 11}
注:集合是一個無序的,不重復的數(shù)據(jù)組合。去重性,把一個列表變成集合,就自動去重了。關系測試,測試兩組數(shù)據(jù)之前的交集、差集、并集
1、創(chuàng)建集合

 

#標準創(chuàng)建方式
info_set = set(["alex","wupeiqi","eric","solo",11,22,33])
print(info_set,type(info_set))
#{33, 11, 'wupeiqi', 'solo', 'alex', 'eric', 22} <class 'set'>

2、集合類常用功能
① 添加

#添加的兩種方式
set_1 = set(["alex","wupeiqi","eric","solo"])
set_1.add(11)             #add只能添加一個元素
print(set_1)
#{'alex', 'solo', 'eric', 11, 'wupeiqi'}
set_1 = set(["alex","wupeiqi","eric","solo"])
set_1.update([11,22,33])
print(set_1)              #update可以添加多個元素
#{33, 11, 'alex', 'wupeiqi', 'eric', 22, 'solo'}

② 刪除

#刪除的三種方式
set_1 = set(["alex","wupeiqi","eric","solo",11,22,33])
set_1.remove("alex")          #remove 刪除指定元素
print(set_1)
#{'eric', 33, 'solo', 11, 22, 'wupeiqi'}
set_1.pop()               #pop 隨機刪除元素
print(set_1)
#{33, 'wupeiqi', 11, 22, 'solo'}
set_1.discard("solo")          #discard 刪除指定元素,與remove區(qū)別在于,如果元素不存在也不會報錯
set_1.discard(55)
print(set_1)
#{33, 'wupeiqi', 11, 22}

3、集合關系測試
① 交集

set_1 = set(["alex","wupeiqi","eric","solo",11,22,33])
set_2 = set([11,22,33,44,55,66])
print(set_1.intersection(set_2))      #intersection 取兩個set的交集 set_1和set_2可以互換位置
#{33, 11, 22}

② 并集

set_1 = set(["alex","wupeiqi","eric","solo",11,22,33])
set_2 = set([11,22,33,44,55,66])
print(set_1.union(set_2))           #union 取兩個set集合的并集 set_1和set_2可以互換位置
#{33, 66, 11, 44, 'eric', 55, 'solo', 22, 'wupeiqi', 'alex'}

③ 差集

set_1 = set(["alex","wupeiqi","eric","solo",11,22,33])
set_2 = set([11,22,33,44,55,66])
print(set_1.difference(set_2))         #difference 取兩個set集合的差集 set_1有但是set_2沒有的集合
#{'solo', 'eric', 'wupeiqi', 'alex'}

④ 子集、父集

set_1 = set(["alex","wupeiqi","eric","solo",11,22,33])
set_2 = set([11,22,33,44,55,66])
set_3 = set([11,22,33])
print(set_1.issubset(set_2))           #issubset 子集
#False
print(set_1.issuperset(set_3))          #issuperset 父集
#True

⑤ 對稱差集

set_1 = set(["alex","wupeiqi","eric","solo",11,22,33])
set_2 = set([11,22,33,44,55,66])
print(set_1.symmetric_difference(set_2))      #symmetric_difference 對稱差集=兩個集合并集減去合集
#{66, 'solo', 'eric', 'alex', 55, 'wupeiqi', 44}

⑥ 運算符做關系測試

set_1 = set(["alex","wupeiqi","eric","solo",11,22,33])
set_2 = set([11,22,33,44,55,66])
set_union = set_1 | set_2      # 并集
set_intersection = set_1 & set_2  # 交集
set_difference = set_1 - set_2   # 差集
set_symmetric_difference = set_1 ^ set_2 # 對稱差集

六、模塊初識

Python有大量的模塊,從而使得開發(fā)Python程序非常簡潔。類庫有包括三中:
① 、Python內部提供的模塊
②、業(yè)內開源的模塊
③、程序員自己開發(fā)的模塊:Python腳本的名字不要與模塊名相同

1、sys模塊(系統(tǒng)內置)
① sys.argv 用來捕獲執(zhí)行python腳本時傳入的參數(shù)
② sys.stdin 標準信息輸入
③ sys.stdout 標準定向輸出
④ sys.stdout.flush 強制刷新標準輸出緩存

import time
import sys
for i in range(5):
  print(i),
  sys.stdout.flush()
  time.sleep(1)
# 這樣設計是為了打印一個數(shù)每秒五秒鐘,但如果您運行它,因為它是現(xiàn)在(取決于您的默認系統(tǒng)緩沖),
# 你可能看不到任何輸出 CodeGo.net,直到再一次全部,你會看到0 1 2 3 4打印到屏幕上。
# 這是輸出被緩沖,除非你sys.stdout之后每print你不會看到從輸出中取出sys.stdout.flush()網(wǎng)上看到的差別

2、os模塊(與系統(tǒng)進行交互)
① os.dir、os.popen調用當前系統(tǒng)命令

3、platform模塊(識別當前運行的系統(tǒng))

七、運算符
1、算數(shù)運算:

2、比較運算:

3、賦值運算:

4、邏輯運算:

5、成員運算:

6、身份運算:

7、位運算:

8、運算符優(yōu)先級:

八、深淺拷貝剖析
1、對象賦值(創(chuàng)建列表變量Alex,變量包含子列表,通過變量Alex給變量solo賦值,然后對變量Alex的元素進行修改,此時solo會有什么變化呢?)

import copy           #import調用copy模塊
 
Alex = ["Alex", 28, ["Python", "C#", "JavaScript"]]
solo = Alex            #直接賦值
 
#  修改前打印
print(id(Alex))
print(Alex)
print([id(adr) for adr in Alex])
# 輸出: 7316664
#    ['Alex', 28, ['Python', 'C#', 'JavaScript']]
#    [2775776, 1398430400, 7318024]
print(id(solo))
print(solo)
print([id(adr) for adr in solo])
# 輸出: 7316664
#    ['Alex', 28, ['Python', 'C#', 'JavaScript']]
#    [2775776, 1398430400, 7318024]
 
#  對變量進行修改
Alex[0]='Mr.Wu'
Alex[2].append('CSS')
print(id(Alex))
print(Alex)
print([id(adr) for adr in Alex])
# 輸出: 7316664
#    ['Mr.Wu', 28, ['Python', 'C#', 'JavaScript', 'CSS']]
#    [5170528, 1398430400, 7318024]
print(id(solo))
print(solo)
print([id(adr) for adr in solo])
# 輸出: 7316664
#    ['Mr.Wu', 28, ['Python', 'C#', 'JavaScript', 'CSS']]
#    [5170528, 1398430400, 7318024]

初始條件: Alex = ["Alex", 28, ["Python", "C#", "JavaScript"]]
對象賦值: solo = Alex           #直接賦值
對象賦值結果:solo = ["Alex", 28, ["Python", "C#", "JavaScript"]]
對象賦值時是進行對象引用(內存地址)的傳遞,被賦值的變量并沒有開辟新內存,兩個變量共用一個內存地址

修改對象賦值:solo = ['Mr.Wu', 28, ['Python', 'C#', 'JavaScript', 'CSS']]
str是不可變類型,所以當修改元素Alex為Mr.Wu時,內存地址發(fā)生改變;list是可變類型,元素['Python', 'C#', 'JavaScript', 'CSS']修改完后,內存地址沒有改變

2、淺拷貝(創(chuàng)建列表變量Alex,變量包含子列表,通過copy模塊的淺拷貝函數(shù)copy()對變量Alex進行拷貝,當對Alex進行操作時,此時solo會如何變化?)

import copy           #import調用copy模塊
Alex = ["Alex", 28, ["Python", "C#", "JavaScript"]]
solo = copy.copy(Alex)            #通過copy模塊里面的淺拷貝函數(shù)copy()
#  修改前打印
print(id(Alex))
print(Alex)
print([id(adr) for adr in Alex])
# 輸出: 10462472
#    ['Alex', 28, ['Python', 'C#', 'JavaScript']]
#    [5462752, 1359960768, 10463232]
print(id(solo))
print(solo)
print([id(adr) for adr in solo])
# 輸出: 10201848
#    ['Alex', 28, ['Python', 'C#', 'JavaScript']]
#    [5462752, 1359960768, 10463232]
#  對變量進行修改
Alex[0]='Mr.Wu'
Alex[2].append('CSS')
print(id(Alex))
print(Alex)
print([id(adr) for adr in Alex])
# 輸出: 10462472
#    ['Mr.Wu', 28, ['Python', 'C#', 'JavaScript', 'CSS']]
#    [10151264, 1359960768, 10463232]
print(id(solo))
print(solo)
print([id(adr) for adr in solo])
# 輸出: 10201848
#    ['Alex', 28, ['Python', 'C#', 'JavaScript', 'CSS']]
#    [5462752, 1359960768, 10463232]

初始條件: Alex = ["Alex", 28, ["Python", "C#", "JavaScript"]]
淺拷貝: solo = copy.copy(Alex)         #通過copy模塊里面的淺拷貝函數(shù)copy()
淺拷貝結果: solo = ["Alex", 28, ["Python", "C#", "JavaScript"]]
淺拷貝時變量solo新建了一塊內存(10201848),此內存記錄了list中元素的地址;對于list中的元素,淺拷貝會使用原始元素的引用(內存地址)

修改淺拷貝: solo = ['Mr.Wu', 28, ['Python', 'C#', 'JavaScript', 'CSS']]
str是不可變類型,所以當修改元素Alex為Mr.Wu時,內存地址發(fā)生改變;list是可變類型,元素['Python', 'C#', 'JavaScript', 'CSS']修改完后,內存地址沒有改變

3、深拷貝(創(chuàng)建列表變量Alex,變量包含子列表,通過copy模塊的深拷貝函數(shù)deepcopy()對變量Alex進行拷貝,當對Alex進行操作時,此時solo會如何變化?)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-Lian
#  深拷貝
import copy           #import調用copy模塊
 
Alex = ["Alex", 28, ["Python", "C#", "JavaScript"]]
solo = copy.deepcopy(Alex)            #通過copy模塊里面的深拷貝函數(shù)deepcopy()
 
#  修改前打印
print(id(Alex))
print(Alex)
print([id(adr) for adr in Alex])
# 輸出: 6202712
#    ['Alex', 28, ['Python', 'C#', 'JavaScript']]
#    [4086496, 1363237568, 6203472]
print(id(solo))
print(solo)
print([id(adr) for adr in solo])
# 輸出: 6203032
#    ['Alex', 28, ['Python', 'C#', 'JavaScript']]
#    [4086496, 1363237568, 6203512]
 
#  對變量進行修改
Alex[0]='Mr.Wu'
Alex[2].append('CSS')
print(id(Alex))
print(Alex)
print([id(adr) for adr in Alex])
# 輸出: 6202712
#    ['Mr.Wu', 28, ['Python', 'C#', 'JavaScript', 'CSS']]
#    [5236064, 1363237568, 6203472]
print(id(solo))
print(solo)
print([id(adr) for adr in solo])
# 輸出: 6203032
#    ['Alex', 28, ['Python', 'C#', 'JavaScript']]
#    [4086496, 1363237568, 6203512]

初始條件: Alex = ["Alex", 28, ["Python", "C#", "JavaScript"]]
深拷貝: solo = copy.deepcopy(Alex) #通過copy模塊里面的深拷貝函數(shù)deepcopy()
深拷貝結果: solo = ["Alex", 28, ["Python", "C#", "JavaScript"]]
深拷貝時變量solo新建了一塊內存(10201848),此內存記錄了list中元素的地址;但是,對于list中第三個元素(['Python', 'C#', 'JavaScript'])重新生成了一個地址(6203512),此時兩個變量的第三個元素的內存引用地址不同

修改深拷貝: solo = ['Mr.Wu', 28, ['Python', 'C#', 'JavaScript', 'CSS']]
str是不可變類型,所以當修改元素Alex為Mr.Wu時,內存地址發(fā)生改變;list是可變類型,元素['Python', 'C#', 'JavaScript', 'CSS']修改完后,內存地址沒有改變,但是Alex和solo在第三個元素引用的本就不同

4、對于拷貝有一些特殊情況
(1)對于非容器類型(如數(shù)字、字符串、和其他'原子'類型的對象)沒有拷貝這一說
(2)也就是說,對于這些類型,"obj is copy.copy(obj)" 、"obj is copy.deepcopy(obj)"
(3)如果元祖變量只包含原子類型對象,則不能深拷貝
①為什么要拷貝?
答:當進行修改時,想要保留原來的數(shù)據(jù)和修改后的數(shù)據(jù)
②數(shù)字字符串 和 集合 在修改時的差異? (深淺拷貝不同的終極原因)
答:在修改數(shù)據(jù)時:
               數(shù)字字符串:在內存中新建一份數(shù)據(jù)
               集合:修改內存中的同一份數(shù)據(jù)
③對于集合,如何保留其修改前和修改后的數(shù)據(jù)?
答:在內存中拷貝一份
④對于集合,如何拷貝其n層元素同時拷貝?
答:深拷貝

 

九、文件操作

(1)打開文件: 文件句柄 = file('文件路徑', '模式')
python中打開文件有兩種方式,即:open(...) 和 file(...) ,本質上前者在內部會調用后者來進行文件操作,推薦使用 open。
1、打開文件的模式:
  r, 只讀模式【默認】
  w,只寫模式【不可讀;不存在則創(chuàng)建;存在則刪除內容;】
  a, 追加模式【不可讀;不存在則創(chuàng)建;存在則只追加內容;】
2、"+" 同時讀寫某個文件:
  r+,可讀寫文件?!究勺x;可寫;可追加】
  w+,寫讀
  a+,追加讀

總結1:r+模式下,如果在.write()進行寫入內容前,有print()輸出,則要寫的內容會從文件尾部開始寫入,使用的是讀、追加模式;如果在.write()進行寫入內容前,是seek()移動光標,則要寫的內容會從移動到的光標開始進行寫入,會把原來的內容覆蓋掉,而不是整體后移,這點要記??;如果在.write()進行寫入內容前,既沒有print()也沒有seek()光標移動,這種情況之前想的的情況,就是r+讀寫模式能先寫后讀嗎?r+模式下默認光標在文件的首部,此時會直接從文件開頭進行寫入,效果等同于seek(0)。關于最后一點,參考a+模式。
總結2:讀寫模式一定要先寫后讀嗎?能不能先讀后寫? 如果先讀的話,由于用的是w+模式打開的文件,打開后會清空原文件內容,所有讀取的到東西是空的。另W+模式后期用的很少,了解即可,包括a+追加讀這種模式;另w+模式下,光標會跟隨文件寫入移到到文件末尾,不用seek移到光標的話,打印內容為空
注:w+模式下,關于.write()跟seek()和print()的關系與r+模式下是一樣一樣的。w+打開文件后先清空,然后追加寫,如果.write()前有seek()的話會從光標位置覆蓋寫。
總結3:通過上面的程序可以得出,a+模式下光標位置為文件末尾,如果要print()的話要結合seek()進行使用;另外與r+、w+不同的是,.write()與seek()沒有關系,只能寫內容到文件末尾,一直都是追加模式!

小結

3、"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)
  rU
  r+U
4、"b"表示處理二進制文件(如:FTP發(fā)送上傳ISO鏡像文件,linux可忽略,windows處理二進制文件時需標注)
  rb 二進制讀
  wb 二進制寫(ab也一樣)
  ab
(2)文件操作常用功能:
1、read()、readline()、readlines()的區(qū)別
  print(info_file.read()) #read參數(shù),讀取文件所有內容
  print(info_file.readline()) #readline,只讀取文章中的一行內容
  print(info_file.readlines()) #readlines,把文章內容以換行符分割,并生成list格式,數(shù)據(jù)量大的話不建議使用
2、seek、tell光標
  data = info_file.read() #默認光標在起始位置,.read()讀取完后,光標停留到文件末尾
  print(info_file.tell()) #tell 獲取當前的光標位
  info_file.seek(0) #seek 移動光標到文件首部
3、文件循環(huán)
  for index,line in enumerate(info_file.readlines()): #先把文件內容以行為分割生成列表,數(shù)據(jù)量大不能用
  for line in info_file: #建議使用方法,每讀取一行,內存會把之前的空間清空,不會占用太多內存
4、flush 刷新
  sys.stdout.flush() #flush 強制刷新緩存到內存的數(shù)據(jù)寫入硬盤
5、truncate 截斷
  truncate跟光標位置無關,從文件首部開始截取字符;如果是truncate(0)會把文件清空
6、with 語句
  為了避免打開文件后忘記關閉,可以通過管理上下文,即:
    with open('log','r') as f:
    ...
如此方式,當with代碼塊執(zhí)行完畢時,內部會自動關閉并釋放文件資源。在Python 2.7 后,with又支持同時對多個文件的上下文進行管理,即:
    with open('log1') as obj1, open('log2') as obj2:
    pass 
(3)文件修改方式:
1、把文件讀取到內存當中,對內存進行修改,把修改后的內容寫入到原文件(舊內容被清空)
2、如果在硬盤上直接寫,會進行覆蓋,硬盤上不能進行插入,原來的內容不會整體后移,而是直接覆蓋掉
3、把文件讀取到內存當中,對內存進行修改,把修改的內容另存為新的文件(舊文件保留)
 ?、?另存方式
  ② r+模式
 ?、?a+模式

十、函數(shù)

①格式

def 函數(shù)名(參數(shù)):
      ....
      函數(shù)體
      ....
      return 返回值
  函數(shù)名()

②形參:  def func(name): // name 叫做函數(shù)func的形式參數(shù),簡稱:形參
③實參:  func("solo") // 'solo' 叫做函數(shù)func的實際參數(shù),簡稱:實參
④默認參數(shù): def stu_register(name,age,course,country="CN") // 位置參數(shù)
⑤關鍵參數(shù): stu_register(age=22,name='lzl',course="python")  // 關鍵參數(shù)必須放在位置參數(shù)之后
⑥動態(tài)參數(shù)/非固定參數(shù)(*args 和 **kwargs):

(1)*args:*args會把多傳入的實參變成一個元組的類型;即使傳入的是list類型也會變成元組,成為元組中的一個元素;另函數(shù)中有*args與其他形參的時候,*args一定要寫到其 他形參的后面,否則傳入的實參都會被傳入到*args當中打印成元組;還有如果沒有多出傳入的實參即*args沒有值的時候,*args為空,不會報錯。
(2)**kwargs:**kwargs會把多出的a=b這種類型的實參打印成字典的類型(要區(qū)分開與關鍵參數(shù)的區(qū)別,關鍵參數(shù)的實參有對應的形參),被當成多余的實參傳入到了*args里面,所以**kwargs的值才為空,分別用*inf_list和**info_dict的方式傳入到*args、**kwargs當中(stu_register("lzl",*info_list,**info_dict) //傳入列表和字典)
總結:*args必須放到**kwargs前面(規(guī)定);位置參數(shù)一定要放到關鍵參數(shù)之前(規(guī)定);默認參數(shù)不能跟*args、**kwargs一塊存在(會報錯)。

⑦return 返回值: 如果不執(zhí)行return,函數(shù)的默認返回值為None;當函數(shù)執(zhí)行到return時,函數(shù)結束執(zhí)行
⑧局部變量: name = "Alex Li" #定義變量name

def change_name(name):
name = "金角大王,一個有Tesla的男人"  #函數(shù)內部更改變量
函數(shù)內部對變量進行更改后,生效范圍僅限于函數(shù)內部,對外部變量沒有影響,這種變量稱為局部變量;函數(shù)內部也可以讓變量全局生效,需要加參數(shù)global,這種情況很少用。

⑨遞歸函數(shù): 如果一個函數(shù)在內部調用自身本身,這個函數(shù)就是遞歸函數(shù)
條件: 有結束條件、更深一層遞歸規(guī)模比上次遞歸有所減少、效率不高,遞歸層次過多會導致棧溢出

寫一個遞歸:
       def func(n1,n2):    #獲取斐波那契數(shù)列100之前的數(shù)字
         if n1 > 100:
           return
         print(n1)
         n3 = n1 + n2
         func(n2,n3)
       func(0,1)

⑩匿名函數(shù):不需要顯式的指定函數(shù)

#普通函數(shù)        #換成匿名函數(shù)
def calc(n):      calc = lambda n:n**n
return n**n     print(calc(10)
print(calc(10))

⑪高階函數(shù): 變量可以指向函數(shù),函數(shù)的參數(shù)能接收變量,那么一個函數(shù)就可以接收另一個函數(shù)作為參數(shù),這種函數(shù)就稱之為高階函數(shù)。

def add(x,y,f):
return f(x) + f(y)
res = add(3,-6,abs)
print(res)

⑫內置函數(shù)

⑬函數(shù)的調用順序:被調用函數(shù)要在執(zhí)行之前被定義

#函數(shù)錯誤的調用方式
def func():           #定義函數(shù)func()
  print("in the func")
  foo()            #調用函數(shù)foo()
func()             #執(zhí)行函數(shù)func()
def foo():           #定義函數(shù)foo()
  print("in the foo")

#函數(shù)正確的調用方式
def func():           #定義函數(shù)func()
  print("in the func")
  foo()            #調用函數(shù)foo()
def foo():           #定義函數(shù)foo()
  print("in the foo")
func()             #執(zhí)行函數(shù)func()

⑭高階函數(shù):1、某一函數(shù)當做參數(shù)傳入另一個函數(shù)中。2、函數(shù)的返回值包含一個或多個函數(shù)

⑮內嵌函數(shù):在一個函數(shù)體內創(chuàng)建另外一個函數(shù)(內嵌函數(shù)中定義的函數(shù)在全局中是無法直接執(zhí)行的)

⑯裝飾器:本質是函數(shù)(裝飾其他函數(shù)),為其他函數(shù)添加附加功能的。
遵循原則: 1.不能修改被裝飾函數(shù)的源代碼 2.不能修改被裝飾函數(shù)的調用方式
組成:裝飾器由高階函數(shù)+內嵌函數(shù)組成

⑰生成器:調用時才會生成相應數(shù)據(jù)的機制,稱為生成器:generator

應用:可通過yield實現(xiàn)在單線程的情況下實現(xiàn)并發(fā)運算的效果(協(xié)程)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-solo
import time
def consumer(name):
  print("%s 準備吃包子啦!" %name)
  while True:
    baozi = yield      #yield的作用:保存當前狀態(tài)并返回
 
    print("包子[%s]來了,被[%s]吃了!" %(baozi,name))
def producer(name):
  c = consumer('A')      
  c2 = consumer('B')    
  c.__next__()        #c.__next__()等同于next(c)
  c2.__next__()        #next()作用:調用yield,不給yield傳值
  print("老子開始準備做包子啦!")
  for i in range(10):
    time.sleep(1)
    print("%s做了2個包子!"%(name))
    c.send(i)        #send()作用:調用yield,給yield傳值
    c2.send(i)
producer("solo")

協(xié)程

 

可迭代對象:可以直接作用于for循環(huán)的對象:Iterable
可以直接作用于for循環(huán)的數(shù)據(jù)類型有:1、集合數(shù)據(jù)類型,如list、tuple、dict、set、str等;2、生成器,包括generator和帶yield的generator function;
可以用isinstance()去判斷一個對象是否是Iterable對象

from collections import Iterable
print(isinstance([], Iterable))
# True

迭代器:可以被next()函數(shù)調用并不斷返回下一個值的對象稱為迭代器:Iterator。
用isinstance()判斷一個對象是否是Iterator對象

from collections import Iterator
print(isinstance([], Iterator))
# True
小結:
1、凡是可作用于for循環(huán)的對象都是Iterable類型;
2、凡是可作用于next()函數(shù)的對象都是Iterator類型,它們表示一個惰性計算的序列;
3、集合數(shù)據(jù)類型如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函數(shù)獲得一個Iterator對象;
4、Python的for循環(huán)本質上就是通過不斷調用next()函數(shù)實現(xiàn)的
for x in [1, 2, 3, 4, 5]:
pass
首先獲得Iterator對象:
it = iter([1, 2, 3, 4, 5])
# 循環(huán):
while True:
  try:
    # 獲得下一個值:
    x = next(it)
  except StopIteration:
    # 遇到StopIteration就退出循環(huán)
    break

等價效果(迭代器)

十一、常用模塊

(一)、導入模塊:導入模塊的本質就是把python文件解釋一遍;導入包的本質就是把包文件下面的init.py文件運行一遍

(二)、常用模塊:

(1)time和datatime模塊
時間相關的操作,時間有三種表示方式:1、時間戳 1970年1月1日之后的秒,即:time.time()
2、格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
3、結構化時間 元組包含了:年、日、星期等... time.struct_time 即:time.localtime()

import time
print(time.time())       #時間戳
#1472037866.0750718
print(time.localtime())    #結構化時間
#time.struct_time(tm_year=2016, tm_mon=8, tm_mday=25, tm_hour=8, tm_min=44, tm_sec=46, tm_wday=3, tm_yday=238, tm_isdst=0)
print(time.strftime('%Y-%m-%d'))  #格式化的字符串
#2016-08-25
print(time.strftime('%Y-%m-%d',time.localtime()))
#2016-08-25
print(time.gmtime())      #結構化時間
#time.struct_time(tm_year=2016, tm_mon=8, tm_mday=25, tm_hour=3, tm_min=8, tm_sec=48, tm_wday=3, tm_yday=238, tm_isdst=0)
print(time.strptime('2014-11-11', '%Y-%m-%d')) #結構化時間
#time.struct_time(tm_year=2014, tm_mon=11, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=315, tm_isdst=-1)
print(time.asctime())
#Thu Aug 25 11:15:10 2016
print(time.asctime(time.localtime()))
#Thu Aug 25 11:15:10 2016
print(time.ctime(time.time()))
#Thu Aug 25 11:15:10 2016

time模塊
import datetime
print(datetime.date)  #表示日期的類。常用的屬性有year, month, day
#<class 'datetime.date'>
print(datetime.time)  #表示時間的類。常用的屬性有hour, minute, second, microsecond
#<class 'datetime.time'>
print(datetime.datetime)    #表示日期時間
#<class 'datetime.datetime'>
print(datetime.timedelta)    #表示時間間隔,即兩個時間點之間的長度
#<class 'datetime.timedelta'>
print(datetime.datetime.now())
#2016-08-25 14:21:07.722285
print(datetime.datetime.now() - datetime.timedelta(days=5))
#2016-08-20 14:21:28.275460

datetime模塊
import time

str = '2017-03-26 3:12'
str2 = '2017-05-26 13:12'
date1 = time.strptime(str, '%Y-%m-%d %H:%M')
date2 = time.strptime(str2, '%Y-%m-%d %H:%M')
if float(time.time()) >= float(time.mktime(date1)) and float(time.time()) <= float(time.mktime(date2)):
  print 'cccccccc'


import datetime

str = '2017-03-26 3:12'
str2 = '2017-05-26 13:12'
date1 = datetime.datetime.strptime(str,'%Y-%m-%d %H:%M')
date2 = datetime.datetime.strptime(str2,'%Y-%m-%d %H:%M')
datenow = datetime.datetime.now()
if datenow <date1:
  print 'dddddd'

時間比較

時間比較

(2)andom模塊:生成隨機數(shù)(驗證碼)

#random隨機數(shù)模塊
import random
print(random.random())   #生成0到1的隨機數(shù)
#0.7308387398872364
print(random.randint(1,3)) #生成1-3隨機數(shù)
#3
print(random.randrange(1,3)) #生成1-2隨機數(shù),不包含3
#2
print(random.choice("hello")) #隨機選取字符串
#e
print(random.sample("hello",2))   #隨機選取特定的字符
#['l', 'h']
items = [1,2,3,4,5,6,7]
random.shuffle(items)
print(items)
#[2, 3, 1, 6, 4, 7, 5]

生成隨機數(shù)
import random
checkcode = ''
for i in range(4):
  current = random.randrange(0,4)
  if current != i:
    temp = chr(random.randint(65,90))
  else:
    temp = random.randint(0,9)
  checkcode += str(temp)
print(checkcode)
#51T6

驗證碼

(3)os模塊:用于提供系統(tǒng)級別的操作(比如目錄、路徑等的操作)

import os
os.getcwd() #獲取當前工作目錄,即當前python腳本工作的目錄路徑
os.chdir("dirname") #改變當前腳本工作目錄;相當于shell下cd
os.curdir #返回當前目錄: ('.')
os.pardir #獲取當前目錄的父目錄字符串名:('..')
os.makedirs('dirname1/dirname2')  #可生成多層遞歸目錄
os.removedirs('dirname1')  # 若目錄為空,則刪除,并遞歸到上一級目錄,如若也為空,則刪除,依此類推
os.mkdir('dirname')  # 生成單級目錄;相當于shell中mkdir dirname
os.rmdir('dirname')  #刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當于shell中rmdir dirname
os.listdir('dirname')  #列出指定目錄下的所有文件和子目錄,包括隱藏文件,并以列表方式打印
os.remove() # 刪除一個文件
os.rename("oldname","newname") # 重命名文件/目錄
os.stat('path/filename') # 獲取文件/目錄信息
os.sep  #輸出操作系統(tǒng)特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep  #輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep  #輸出用于分割文件路徑的字符串
os.name  #輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix'
os.system("bash command") #運行shell命令,直接顯示
os.environ #獲取系統(tǒng)環(huán)境變量
os.path.abspath(path) #返回path規(guī)范化的絕對路徑
os.path.split(path) #將path分割成目錄和文件名二元組返回
os.path.dirname(path) # 返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) # 返回path最后的文件名。如何path以/或\結尾,那么就會返回空值。即os.path.split(path)的第二個元素
os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) #如果path是絕對路徑,返回True
os.path.isfile(path) #如果path是一個存在的文件,返回True。否則返回False
os.path.isdir(path) #如果path是一個存在的目錄,則返回True。否則返回False
os.path.join(path1[, path2[, ...]]) # 將多個路徑組合后返回,第一個絕對路徑之前的參數(shù)將被忽略
os.path.getatime(path) #返回path所指向的文件或者目錄的最后存取時間
os.path.getmtime(path) #返回path所指向的文件或者目錄的最后修改時間

os模塊

(4)sys模塊:用于提供對解釋器相關的操作(比如退出程序、版本信息等)

import sys
sys.argv      #命令行參數(shù)List,第一個元素是程序本身路徑
sys.exit(n)    #退出程序,正常退出時exit(0)
sys.version    # 獲取Python解釋程序的版本信息
sys.maxint     #最大的Int值
sys.path      #返回模塊的搜索路徑,初始化時使用PYTHONPATH環(huán)境變量的值
sys.platform   #返回操作系統(tǒng)平臺名稱
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]

sys模塊

(5)shutil模塊:高級的(文件、文件夾、壓縮包)處理模塊 (比如文件的拷貝、壓縮等)

① shutil.copyfileobj 將文件內容拷貝到另一個文件中,可以部分內容

def copyfileobj(fsrc, fdst, length=16*1024):
  """copy data from file-like object fsrc to file-like object fdst"""
  while 1:
    buf = fsrc.read(length)
    if not buf:
      break
    fdst.write(buf)

shutil.copyfileobj
import shutil
f1 = open("fsrc",encoding="utf-8")
f2 = open("fdst",encoding="utf-8")
shutil.copyfile(f1,f2)
#把文件f1里的內容拷貝到f2當中

② shutil.copyfile 文件拷貝

def copyfile(src, dst):
  """Copy data from src to dst"""
  if _samefile(src, dst):
    raise Error("`%s` and `%s` are the same file" % (src, dst))
  for fn in [src, dst]:
    try:
      st = os.stat(fn)
    except OSError:
      # File most likely does not exist
      pass
    else:
      # XXX What about other special files? (sockets, devices...)
      if stat.S_ISFIFO(st.st_mode):
        raise SpecialFileError("`%s` is a named pipe" % fn)
  with open(src, 'rb') as fsrc:
    with open(dst, 'wb') as fdst:
      copyfileobj(fsrc, fdst)

shutil.copyfile
import shutil
shutil.copyfile("f1","f2")
#把文件f1里的內容拷貝到f2當中

③ shutil.copymode(src, dst) 僅拷貝權限。內容、組、用戶均不變

def copymode(src, dst):
  """Copy mode bits from src to dst"""
  if hasattr(os, 'chmod'):
    st = os.stat(src)
    mode = stat.S_IMODE(st.st_mode)
    os.chmod(dst, mode)

shutil.copymode

④ shutil.copystat(src, dst) 拷貝狀態(tài)的信息,包括:mode bits, atime, mtime, flags

def copystat(src, dst):
  """Copy all stat info (mode bits, atime, mtime, flags) from src to dst"""
  st = os.stat(src)
  mode = stat.S_IMODE(st.st_mode)
  if hasattr(os, 'utime'):
    os.utime(dst, (st.st_atime, st.st_mtime))
  if hasattr(os, 'chmod'):
    os.chmod(dst, mode)
  if hasattr(os, 'chflags') and hasattr(st, 'st_flags'):
    try:
      os.chflags(dst, st.st_flags)
    except OSError, why:
      for err in 'EOPNOTSUPP', 'ENOTSUP':
        if hasattr(errno, err) and why.errno == getattr(errno, err):
          break
      else:
        raise

shutil.copystat

⑤ shutil.copy(src, dst) 拷貝文件和權限

def copy(src, dst):
  """Copy data and mode bits ("cp src dst").

  The destination may be a directory.

  """
  if os.path.isdir(dst):
    dst = os.path.join(dst, os.path.basename(src))
  copyfile(src, dst)
  copymode(src, dst)

shutil.copy

⑥ shutil.copy2(src, dst) 拷貝文件和狀態(tài)信息

def copy2(src, dst):
  """Copy data and all stat info ("cp -p src dst").

  The destination may be a directory.

  """
  if os.path.isdir(dst):
    dst = os.path.join(dst, os.path.basename(src))
  copyfile(src, dst)
  copystat(src, dst)

shutil.copy2

⑦ shutil.copytree(src, dst, symlinks=False, ignore=None) 遞歸的去拷貝文件 拷貝多層目錄

def ignore_patterns(*patterns):
  """Function that can be used as copytree() ignore parameter.

  Patterns is a sequence of glob-style patterns
  that are used to exclude files"""
  def _ignore_patterns(path, names):
    ignored_names = []
    for pattern in patterns:
      ignored_names.extend(fnmatch.filter(names, pattern))
    return set(ignored_names)
  return _ignore_patterns
def copytree(src, dst, symlinks=False, ignore=None):
  """Recursively copy a directory tree using copy2().

  The destination directory must not already exist.
  If exception(s) occur, an Error is raised with a list of reasons.

  If the optional symlinks flag is true, symbolic links in the
  source tree result in symbolic links in the destination tree; if
  it is false, the contents of the files pointed to by symbolic
  links are copied.

  The optional ignore argument is a callable. If given, it
  is called with the `src` parameter, which is the directory
  being visited by copytree(), and `names` which is the list of
  `src` contents, as returned by os.listdir():

    callable(src, names) -> ignored_names

  Since copytree() is called recursively, the callable will be
  called once for each directory that is copied. It returns a
  list of names relative to the `src` directory that should
  not be copied.

  XXX Consider this example code rather than the ultimate tool.

  """
  names = os.listdir(src)
  if ignore is not None:
    ignored_names = ignore(src, names)
  else:
    ignored_names = set()

  os.makedirs(dst)
  errors = []
  for name in names:
    if name in ignored_names:
      continue
    srcname = os.path.join(src, name)
    dstname = os.path.join(dst, name)
    try:
      if symlinks and os.path.islink(srcname):
        linkto = os.readlink(srcname)
        os.symlink(linkto, dstname)
      elif os.path.isdir(srcname):
        copytree(srcname, dstname, symlinks, ignore)
      else:
        # Will raise a SpecialFileError for unsupported file types        copy2(srcname, dstname)
    # catch the Error from the recursive copytree so that we can
    # continue with other files
    except Error, err:
      errors.extend(err.args[0])
    except EnvironmentError, why:
      errors.append((srcname, dstname, str(why)))
  try:
    copystat(src, dst)
  except OSError, why:
    if WindowsError is not None and isinstance(why, WindowsError):
      # Copying file access times may fail on Windows
      pass
    else:
      errors.append((src, dst, str(why)))
  if errors:
    raise Error, errors

shutil.copytree

⑧ shutil.rmtree(path[, ignore_errors[, onerror]]) 遞歸的去刪除文件

def rmtree(path, ignore_errors=False, onerror=None):
  """Recursively delete a directory tree.

  If ignore_errors is set, errors are ignored; otherwise, if onerror
  is set, it is called to handle the error with arguments (func,
  path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
  path is the argument to that function that caused it to fail; and
  exc_info is a tuple returned by sys.exc_info(). If ignore_errors
  is false and onerror is None, an exception is raised.

  """
  if ignore_errors:
    def onerror(*args):
      pass
  elif onerror is None:
    def onerror(*args):
      raise
  try:
    if os.path.islink(path):
      # symlinks to directories are forbidden, see bug #1669
      raise OSError("Cannot call rmtree on a symbolic link")
  except OSError:
    onerror(os.path.islink, path, sys.exc_info())
    # can't continue even if onerror hook returns
    return
  names = []
  try:
    names = os.listdir(path)
  except os.error, err:
    onerror(os.listdir, path, sys.exc_info())
  for name in names:
    fullname = os.path.join(path, name)
    try:
      mode = os.lstat(fullname).st_mode
    except os.error:
      mode = 0
    if stat.S_ISDIR(mode):
      rmtree(fullname, ignore_errors, onerror)
    else:
      try:
        os.remove(fullname)
      except os.error, err:
        onerror(os.remove, fullname, sys.exc_info())
  try:
    os.rmdir(path)
  except os.error:
    onerror(os.rmdir, path, sys.exc_info())

shutil.rmtree

⑨ shutil.move(src, dst) 遞歸的去移動文件

def move(src, dst):
  """Recursively move a file or directory to another location. This is
  similar to the Unix "mv" command.

  If the destination is a directory or a symlink to a directory, the source
  is moved inside the directory. The destination path must not already
  exist.

  If the destination already exists but is not a directory, it may be
  overwritten depending on os.rename() semantics.

  If the destination is on our current filesystem, then rename() is used.
  Otherwise, src is copied to the destination and then removed.
  A lot more could be done here... A look at a mv.c shows a lot of
  the issues this implementation glosses over.

  """
  real_dst = dst
  if os.path.isdir(dst):
    if _samefile(src, dst):
      # We might be on a case insensitive filesystem,
      # perform the rename anyway.      os.rename(src, dst)
      return

    real_dst = os.path.join(dst, _basename(src))
    if os.path.exists(real_dst):
      raise Error, "Destination path '%s' already exists" % real_dst
  try:
    os.rename(src, real_dst)
  except OSError:
    if os.path.isdir(src):
      if _destinsrc(src, dst):
        raise Error, "Cannot move a directory '%s' into itself '%s'." % (src, dst)
      copytree(src, real_dst, symlinks=True)
      rmtree(src)
    else:
      copy2(src, real_dst)
      os.unlink(src)

shutil.move

⑩ shutil.make_archive(base_name, format,...) 創(chuàng)建壓縮包并返回文件路徑,例如:zip、tar
base_name: 壓縮包的文件名,也可以是壓縮包的路徑。只是文件名時,則保存至當前目錄,否則保存至指定路徑,
        如:www                        =>保存至當前路徑
        如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
format: 壓縮包種類,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要壓縮的文件夾路徑(默認當前目錄)
owner: 用戶,默認當前用戶
group: 組,默認當前組
logger: 用于記錄日志,通常是logging.Logger對象

def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,
         dry_run=0, owner=None, group=None, logger=None):
  """Create an archive file (eg. zip or tar).

  'base_name' is the name of the file to create, minus any format-specific
  extension; 'format' is the archive format: one of "zip", "tar", "bztar"
  or "gztar".

  'root_dir' is a directory that will be the root directory of the
  archive; ie. we typically chdir into 'root_dir' before creating the
  archive. 'base_dir' is the directory where we start archiving from;
  ie. 'base_dir' will be the common prefix of all files and
  directories in the archive. 'root_dir' and 'base_dir' both default
  to the current directory. Returns the name of the archive file.

  'owner' and 'group' are used when creating a tar archive. By default,
  uses the current owner and group.
  """
  save_cwd = os.getcwd()
  if root_dir is not None:
    if logger is not None:
      logger.debug("changing into '%s'", root_dir)
    base_name = os.path.abspath(base_name)
    if not dry_run:
      os.chdir(root_dir)

  if base_dir is None:
    base_dir = os.curdir

  kwargs = {'dry_run': dry_run, 'logger': logger}

  try:
    format_info = _ARCHIVE_FORMATS[format]
  except KeyError:
    raise ValueError, "unknown archive format '%s'" % format

  func = format_info[0]
  for arg, val in format_info[1]:
    kwargs[arg] = val

  if format != 'zip':
    kwargs['owner'] = owner
    kwargs['group'] = group

  try:
    filename = func(base_name, base_dir, **kwargs)
  finally:
    if root_dir is not None:
      if logger is not None:
        logger.debug("changing back to '%s'", save_cwd)
      os.chdir(save_cwd)

  return filename

源碼

源碼

shutil 對壓縮包的處理是調用 ZipFile 和 TarFile 兩個模塊來進行的,詳細:

import zipfile

# 壓縮
z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()

# 解壓
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall()
z.close()

zipfile 壓縮解壓

zipfile 壓縮解壓

zipfile 壓縮解壓
import tarfile

# 壓縮
tar = tarfile.open('your.tar','w')
tar.add('/Users/wupeiqi/PycharmProjects/bbs2.zip', arcname='bbs2.zip')
tar.add('/Users/wupeiqi/PycharmProjects/cmdb.zip', arcname='cmdb.zip')
tar.close()

# 解壓
tar = tarfile.open('your.tar','r')
tar.extractall() # 可設置解壓地址
tar.close()

tarfile 壓縮解壓

tarfile 壓縮解壓

tarfile 壓縮解壓
class ZipFile(object):
  """ Class with methods to open, read, write, close, list zip files.

  z = ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=False)

  file: Either the path to the file, or a file-like object.
     If it is a path, the file will be opened and closed by ZipFile.
  mode: The mode can be either read "r", write "w" or append "a".
  compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib).
  allowZip64: if True ZipFile will create files with ZIP64 extensions when
        needed, otherwise it will raise an exception when this would
        be necessary.

  """

  fp = None          # Set here since __del__ checks it

  def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=False):
    """Open the ZIP file with mode read "r", write "w" or append "a"."""
    if mode not in ("r", "w", "a"):
      raise RuntimeError('ZipFile() requires mode "r", "w", or "a"')

    if compression == ZIP_STORED:
      pass
    elif compression == ZIP_DEFLATED:
      if not zlib:
        raise RuntimeError,\
           "Compression requires the (missing) zlib module"
    else:
      raise RuntimeError, "That compression method is not supported"

    self._allowZip64 = allowZip64
    self._didModify = False
    self.debug = 0 # Level of printing: 0 through 3
    self.NameToInfo = {}  # Find file info given name
    self.filelist = []   # List of ZipInfo instances for archive
    self.compression = compression # Method of compression
    self.mode = key = mode.replace('b', '')[0]
    self.pwd = None
    self._comment = ''

    # Check if we were passed a file-like object
    if isinstance(file, basestring):
      self._filePassed = 0
      self.filename = file
      modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
      try:
        self.fp = open(file, modeDict[mode])
      except IOError:
        if mode == 'a':
          mode = key = 'w'
          self.fp = open(file, modeDict[mode])
        else:
          raise
    else:
      self._filePassed = 1
      self.fp = file
      self.filename = getattr(file, 'name', None)

    try:
      if key == 'r':
        self._RealGetContents()
      elif key == 'w':
        # set the modified flag so central directory gets written
        # even if no files are added to the archive
        self._didModify = True
      elif key == 'a':
        try:
          # See if file is a zip file
          self._RealGetContents()
          # seek to start of directory and overwrite
          self.fp.seek(self.start_dir, 0)
        except BadZipfile:
          # file is not a zip file, just append
          self.fp.seek(0, 2)

          # set the modified flag so central directory gets written
          # even if no files are added to the archive
          self._didModify = True
      else:
        raise RuntimeError('Mode must be "r", "w" or "a"')
    except:
      fp = self.fp
      self.fp = None
      if not self._filePassed:
        fp.close()
      raise

  def __enter__(self):
    return self

  def __exit__(self, type, value, traceback):
    self.close()

  def _RealGetContents(self):
    """Read in the table of contents for the ZIP file."""
    fp = self.fp
    try:
      endrec = _EndRecData(fp)
    except IOError:
      raise BadZipfile("File is not a zip file")
    if not endrec:
      raise BadZipfile, "File is not a zip file"
    if self.debug > 1:
      print endrec
    size_cd = endrec[_ECD_SIZE]       # bytes in central directory
    offset_cd = endrec[_ECD_OFFSET]     # offset of central directory
    self._comment = endrec[_ECD_COMMENT]  # archive comment

    # "concat" is zero, unless zip was concatenated to another file
    concat = endrec[_ECD_LOCATION] - size_cd - offset_cd
    if endrec[_ECD_SIGNATURE] == stringEndArchive64:
      # If Zip64 extension structures are present, account for them
      concat -= (sizeEndCentDir64 + sizeEndCentDir64Locator)

    if self.debug > 2:
      inferred = concat + offset_cd
      print "given, inferred, offset", offset_cd, inferred, concat
    # self.start_dir: Position of start of central directory
    self.start_dir = offset_cd + concat
    fp.seek(self.start_dir, 0)
    data = fp.read(size_cd)
    fp = cStringIO.StringIO(data)
    total = 0
    while total < size_cd:
      centdir = fp.read(sizeCentralDir)
      if len(centdir) != sizeCentralDir:
        raise BadZipfile("Truncated central directory")
      centdir = struct.unpack(structCentralDir, centdir)
      if centdir[_CD_SIGNATURE] != stringCentralDir:
        raise BadZipfile("Bad magic number for central directory")
      if self.debug > 2:
        print centdir
      filename = fp.read(centdir[_CD_FILENAME_LENGTH])
      # Create ZipInfo instance to store file information
      x = ZipInfo(filename)
      x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH])
      x.comment = fp.read(centdir[_CD_COMMENT_LENGTH])
      x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET]
      (x.create_version, x.create_system, x.extract_version, x.reserved,
        x.flag_bits, x.compress_type, t, d,
        x.CRC, x.compress_size, x.file_size) = centdir[1:12]
      x.volume, x.internal_attr, x.external_attr = centdir[15:18]
      # Convert date/time code to (year, month, day, hour, min, sec)
      x._raw_time = t
      x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F,
                   t>>11, (t>>5)&0x3F, (t&0x1F) * 2 )

      x._decodeExtra()
      x.header_offset = x.header_offset + concat
      x.filename = x._decodeFilename()
      self.filelist.append(x)
      self.NameToInfo[x.filename] = x

      # update total bytes read from central directory
      total = (total + sizeCentralDir + centdir[_CD_FILENAME_LENGTH]
           + centdir[_CD_EXTRA_FIELD_LENGTH]
           + centdir[_CD_COMMENT_LENGTH])

      if self.debug > 2:
        print "total", total


  def namelist(self):
    """Return a list of file names in the archive."""
    l = []
    for data in self.filelist:
      l.append(data.filename)
    return l

  def infolist(self):
    """Return a list of class ZipInfo instances for files in the
    archive."""
    return self.filelist

  def printdir(self):
    """Print a table of contents for the zip file."""
    print "%-46s %19s %12s" % ("File Name", "Modified  ", "Size")
    for zinfo in self.filelist:
      date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time[:6]
      print "%-46s %s %12d" % (zinfo.filename, date, zinfo.file_size)

  def testzip(self):
    """Read all the files and check the CRC."""
    chunk_size = 2 ** 20
    for zinfo in self.filelist:
      try:
        # Read by chunks, to avoid an OverflowError or a
        # MemoryError with very large embedded files.
        with self.open(zinfo.filename, "r") as f:
          while f.read(chunk_size):   # Check CRC-32
            pass
      except BadZipfile:
        return zinfo.filename

  def getinfo(self, name):
    """Return the instance of ZipInfo given 'name'."""
    info = self.NameToInfo.get(name)
    if info is None:
      raise KeyError(
        'There is no item named %r in the archive' % name)

    return info

  def setpassword(self, pwd):
    """Set default password for encrypted files."""
    self.pwd = pwd

  @property
  def comment(self):
    """The comment text associated with the ZIP file."""
    return self._comment

  @comment.setter
  def comment(self, comment):
    # check for valid comment length
    if len(comment) > ZIP_MAX_COMMENT:
      import warnings
      warnings.warn('Archive comment is too long; truncating to %d bytes'
             % ZIP_MAX_COMMENT, stacklevel=2)
      comment = comment[:ZIP_MAX_COMMENT]
    self._comment = comment
    self._didModify = True

  def read(self, name, pwd=None):
    """Return file bytes (as a string) for name."""
    return self.open(name, "r", pwd).read()

  def open(self, name, mode="r", pwd=None):
    """Return file-like object for 'name'."""
    if mode not in ("r", "U", "rU"):
      raise RuntimeError, 'open() requires mode "r", "U", or "rU"'
    if not self.fp:
      raise RuntimeError, \
         "Attempt to read ZIP archive that was already closed"

    # Only open a new file for instances where we were not
    # given a file object in the constructor
    if self._filePassed:
      zef_file = self.fp
      should_close = False
    else:
      zef_file = open(self.filename, 'rb')
      should_close = True

    try:
      # Make sure we have an info object
      if isinstance(name, ZipInfo):
        # 'name' is already an info object
        zinfo = name
      else:
        # Get info object for name
        zinfo = self.getinfo(name)

      zef_file.seek(zinfo.header_offset, 0)

      # Skip the file header:
      fheader = zef_file.read(sizeFileHeader)
      if len(fheader) != sizeFileHeader:
        raise BadZipfile("Truncated file header")
      fheader = struct.unpack(structFileHeader, fheader)
      if fheader[_FH_SIGNATURE] != stringFileHeader:
        raise BadZipfile("Bad magic number for file header")

      fname = zef_file.read(fheader[_FH_FILENAME_LENGTH])
      if fheader[_FH_EXTRA_FIELD_LENGTH]:
        zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH])

      if fname != zinfo.orig_filename:
        raise BadZipfile, \
            'File name in directory "%s" and header "%s" differ.' % (
              zinfo.orig_filename, fname)

      # check for encrypted flag & handle password
      is_encrypted = zinfo.flag_bits & 0x1
      zd = None
      if is_encrypted:
        if not pwd:
          pwd = self.pwd
        if not pwd:
          raise RuntimeError, "File %s is encrypted, " \
            "password required for extraction" % name

        zd = _ZipDecrypter(pwd)
        # The first 12 bytes in the cypher stream is an encryption header
        # used to strengthen the algorithm. The first 11 bytes are
        # completely random, while the 12th contains the MSB of the CRC,
        # or the MSB of the file time depending on the header type
        # and is used to check the correctness of the password.
        bytes = zef_file.read(12)
        h = map(zd, bytes[0:12])
        if zinfo.flag_bits & 0x8:
          # compare against the file type from extended local headers
          check_byte = (zinfo._raw_time >> 8) & 0xff
        else:
          # compare against the CRC otherwise
          check_byte = (zinfo.CRC >> 24) & 0xff
        if ord(h[11]) != check_byte:
          raise RuntimeError("Bad password for file", name)

      return ZipExtFile(zef_file, mode, zinfo, zd,
          close_fileobj=should_close)
    except:
      if should_close:
        zef_file.close()
      raise

  def extract(self, member, path=None, pwd=None):
    """Extract a member from the archive to the current working directory,
      using its full name. Its file information is extracted as accurately
      as possible. `member' may be a filename or a ZipInfo object. You can
      specify a different directory using `path'.
    """
    if not isinstance(member, ZipInfo):
      member = self.getinfo(member)

    if path is None:
      path = os.getcwd()

    return self._extract_member(member, path, pwd)

  def extractall(self, path=None, members=None, pwd=None):
    """Extract all members from the archive to the current working
      directory. `path' specifies a different directory to extract to.
      `members' is optional and must be a subset of the list returned
      by namelist().
    """
    if members is None:
      members = self.namelist()

    for zipinfo in members:
      self.extract(zipinfo, path, pwd)

  def _extract_member(self, member, targetpath, pwd):
    """Extract the ZipInfo object 'member' to a physical
      file on the path targetpath.
    """
    # build the destination pathname, replacing
    # forward slashes to platform specific separators.
    arcname = member.filename.replace('/', os.path.sep)

    if os.path.altsep:
      arcname = arcname.replace(os.path.altsep, os.path.sep)
    # interpret absolute pathname as relative, remove drive letter or
    # UNC path, redundant separators, "." and ".." components.
    arcname = os.path.splitdrive(arcname)[1]
    arcname = os.path.sep.join(x for x in arcname.split(os.path.sep)
          if x not in ('', os.path.curdir, os.path.pardir))
    if os.path.sep == '\\':
      # filter illegal characters on Windows
      illegal = ':<>|"?*'
      if isinstance(arcname, unicode):
        table = {ord(c): ord('_') for c in illegal}
      else:
        table = string.maketrans(illegal, '_' * len(illegal))
      arcname = arcname.translate(table)
      # remove trailing dots
      arcname = (x.rstrip('.') for x in arcname.split(os.path.sep))
      arcname = os.path.sep.join(x for x in arcname if x)

    targetpath = os.path.join(targetpath, arcname)
    targetpath = os.path.normpath(targetpath)

    # Create all upper directories if necessary.
    upperdirs = os.path.dirname(targetpath)
    if upperdirs and not os.path.exists(upperdirs):
      os.makedirs(upperdirs)

    if member.filename[-1] == '/':
      if not os.path.isdir(targetpath):
        os.mkdir(targetpath)
      return targetpath

    with self.open(member, pwd=pwd) as source, \
       file(targetpath, "wb") as target:
      shutil.copyfileobj(source, target)

    return targetpath

  def _writecheck(self, zinfo):
    """Check for errors before writing a file to the archive."""
    if zinfo.filename in self.NameToInfo:
      import warnings
      warnings.warn('Duplicate name: %r' % zinfo.filename, stacklevel=3)
    if self.mode not in ("w", "a"):
      raise RuntimeError, 'write() requires mode "w" or "a"'
    if not self.fp:
      raise RuntimeError, \
         "Attempt to write ZIP archive that was already closed"
    if zinfo.compress_type == ZIP_DEFLATED and not zlib:
      raise RuntimeError, \
         "Compression requires the (missing) zlib module"
    if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED):
      raise RuntimeError, \
         "That compression method is not supported"
    if not self._allowZip64:
      requires_zip64 = None
      if len(self.filelist) >= ZIP_FILECOUNT_LIMIT:
        requires_zip64 = "Files count"
      elif zinfo.file_size > ZIP64_LIMIT:
        requires_zip64 = "Filesize"
      elif zinfo.header_offset > ZIP64_LIMIT:
        requires_zip64 = "Zipfile size"
      if requires_zip64:
        raise LargeZipFile(requires_zip64 +
                  " would require ZIP64 extensions")

  def write(self, filename, arcname=None, compress_type=None):
    """Put the bytes from filename into the archive under the name
    arcname."""
    if not self.fp:
      raise RuntimeError(
         "Attempt to write to ZIP archive that was already closed")

    st = os.stat(filename)
    isdir = stat.S_ISDIR(st.st_mode)
    mtime = time.localtime(st.st_mtime)
    date_time = mtime[0:6]
    # Create ZipInfo instance to store file information
    if arcname is None:
      arcname = filename
    arcname = os.path.normpath(os.path.splitdrive(arcname)[1])
    while arcname[0] in (os.sep, os.altsep):
      arcname = arcname[1:]
    if isdir:
      arcname += '/'
    zinfo = ZipInfo(arcname, date_time)
    zinfo.external_attr = (st[0] & 0xFFFF) << 16L   # Unix attributes
    if compress_type is None:
      zinfo.compress_type = self.compression
    else:
      zinfo.compress_type = compress_type

    zinfo.file_size = st.st_size
    zinfo.flag_bits = 0x00
    zinfo.header_offset = self.fp.tell()  # Start of header bytes

    self._writecheck(zinfo)
    self._didModify = True

    if isdir:
      zinfo.file_size = 0
      zinfo.compress_size = 0
      zinfo.CRC = 0
      zinfo.external_attr |= 0x10 # MS-DOS directory flag
      self.filelist.append(zinfo)
      self.NameToInfo[zinfo.filename] = zinfo
      self.fp.write(zinfo.FileHeader(False))
      return

    with open(filename, "rb") as fp:
      # Must overwrite CRC and sizes with correct data later
      zinfo.CRC = CRC = 0
      zinfo.compress_size = compress_size = 0
      # Compressed size can be larger than uncompressed size
      zip64 = self._allowZip64 and \
          zinfo.file_size * 1.05 > ZIP64_LIMIT
      self.fp.write(zinfo.FileHeader(zip64))
      if zinfo.compress_type == ZIP_DEFLATED:
        cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
           zlib.DEFLATED, -15)
      else:
        cmpr = None
      file_size = 0
      while 1:
        buf = fp.read(1024 * 8)
        if not buf:
          break
        file_size = file_size + len(buf)
        CRC = crc32(buf, CRC) & 0xffffffff
        if cmpr:
          buf = cmpr.compress(buf)
          compress_size = compress_size + len(buf)
        self.fp.write(buf)
    if cmpr:
      buf = cmpr.flush()
      compress_size = compress_size + len(buf)
      self.fp.write(buf)
      zinfo.compress_size = compress_size
    else:
      zinfo.compress_size = file_size
    zinfo.CRC = CRC
    zinfo.file_size = file_size
    if not zip64 and self._allowZip64:
      if file_size > ZIP64_LIMIT:
        raise RuntimeError('File size has increased during compressing')
      if compress_size > ZIP64_LIMIT:
        raise RuntimeError('Compressed size larger than uncompressed size')
    # Seek backwards and write file header (which will now include
    # correct CRC and file sizes)
    position = self.fp.tell()    # Preserve current position in file
    self.fp.seek(zinfo.header_offset, 0)
    self.fp.write(zinfo.FileHeader(zip64))
    self.fp.seek(position, 0)
    self.filelist.append(zinfo)
    self.NameToInfo[zinfo.filename] = zinfo

  def writestr(self, zinfo_or_arcname, bytes, compress_type=None):
    """Write a file into the archive. The contents is the string
    'bytes'. 'zinfo_or_arcname' is either a ZipInfo instance or
    the name of the file in the archive."""
    if not isinstance(zinfo_or_arcname, ZipInfo):
      zinfo = ZipInfo(filename=zinfo_or_arcname,
              date_time=time.localtime(time.time())[:6])

      zinfo.compress_type = self.compression
      if zinfo.filename[-1] == '/':
        zinfo.external_attr = 0o40775 << 16  # drwxrwxr-x
        zinfo.external_attr |= 0x10      # MS-DOS directory flag
      else:
        zinfo.external_attr = 0o600 << 16   # ?rw-------
    else:
      zinfo = zinfo_or_arcname

    if not self.fp:
      raise RuntimeError(
         "Attempt to write to ZIP archive that was already closed")

    if compress_type is not None:
      zinfo.compress_type = compress_type

    zinfo.file_size = len(bytes)      # Uncompressed size
    zinfo.header_offset = self.fp.tell()  # Start of header bytes
    self._writecheck(zinfo)
    self._didModify = True
    zinfo.CRC = crc32(bytes) & 0xffffffff    # CRC-32 checksum
    if zinfo.compress_type == ZIP_DEFLATED:
      co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
         zlib.DEFLATED, -15)
      bytes = co.compress(bytes) + co.flush()
      zinfo.compress_size = len(bytes)  # Compressed size
    else:
      zinfo.compress_size = zinfo.file_size
    zip64 = zinfo.file_size > ZIP64_LIMIT or \
        zinfo.compress_size > ZIP64_LIMIT
    if zip64 and not self._allowZip64:
      raise LargeZipFile("Filesize would require ZIP64 extensions")
    self.fp.write(zinfo.FileHeader(zip64))
    self.fp.write(bytes)
    if zinfo.flag_bits & 0x08:
      # Write CRC and file sizes after the file data
      fmt = '<LQQ' if zip64 else '<LLL'
      self.fp.write(struct.pack(fmt, zinfo.CRC, zinfo.compress_size,
         zinfo.file_size))
    self.fp.flush()
    self.filelist.append(zinfo)
    self.NameToInfo[zinfo.filename] = zinfo

  def __del__(self):
    """Call the "close()" method in case the user forgot."""
    self.close()

  def close(self):
    """Close the file, and for mode "w" and "a" write the ending
    records."""
    if self.fp is None:
      return

    try:
      if self.mode in ("w", "a") and self._didModify: # write ending records
        pos1 = self.fp.tell()
        for zinfo in self.filelist:     # write central directory
          dt = zinfo.date_time
          dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
          dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
          extra = []
          if zinfo.file_size > ZIP64_LIMIT \
              or zinfo.compress_size > ZIP64_LIMIT:
            extra.append(zinfo.file_size)
            extra.append(zinfo.compress_size)
            file_size = 0xffffffff
            compress_size = 0xffffffff
          else:
            file_size = zinfo.file_size
            compress_size = zinfo.compress_size

          if zinfo.header_offset > ZIP64_LIMIT:
            extra.append(zinfo.header_offset)
            header_offset = 0xffffffffL
          else:
            header_offset = zinfo.header_offset

          extra_data = zinfo.extra
          if extra:
            # Append a ZIP64 field to the extra's
            extra_data = struct.pack(
                '<HH' + 'Q'*len(extra),
                1, 8*len(extra), *extra) + extra_data

            extract_version = max(45, zinfo.extract_version)
            create_version = max(45, zinfo.create_version)
          else:
            extract_version = zinfo.extract_version
            create_version = zinfo.create_version

          try:
            filename, flag_bits = zinfo._encodeFilenameFlags()
            centdir = struct.pack(structCentralDir,
            stringCentralDir, create_version,
            zinfo.create_system, extract_version, zinfo.reserved,
            flag_bits, zinfo.compress_type, dostime, dosdate,
            zinfo.CRC, compress_size, file_size,
            len(filename), len(extra_data), len(zinfo.comment),
            0, zinfo.internal_attr, zinfo.external_attr,
            header_offset)
          except DeprecationWarning:
            print >>sys.stderr, (structCentralDir,
            stringCentralDir, create_version,
            zinfo.create_system, extract_version, zinfo.reserved,
            zinfo.flag_bits, zinfo.compress_type, dostime, dosdate,
            zinfo.CRC, compress_size, file_size,
            len(zinfo.filename), len(extra_data), len(zinfo.comment),
            0, zinfo.internal_attr, zinfo.external_attr,
            header_offset)
            raise
          self.fp.write(centdir)
          self.fp.write(filename)
          self.fp.write(extra_data)
          self.fp.write(zinfo.comment)

        pos2 = self.fp.tell()
        # Write end-of-zip-archive record
        centDirCount = len(self.filelist)
        centDirSize = pos2 - pos1
        centDirOffset = pos1
        requires_zip64 = None
        if centDirCount > ZIP_FILECOUNT_LIMIT:
          requires_zip64 = "Files count"
        elif centDirOffset > ZIP64_LIMIT:
          requires_zip64 = "Central directory offset"
        elif centDirSize > ZIP64_LIMIT:
          requires_zip64 = "Central directory size"
        if requires_zip64:
          # Need to write the ZIP64 end-of-archive records
          if not self._allowZip64:
            raise LargeZipFile(requires_zip64 +
                      " would require ZIP64 extensions")
          zip64endrec = struct.pack(
              structEndArchive64, stringEndArchive64,
              44, 45, 45, 0, 0, centDirCount, centDirCount,
              centDirSize, centDirOffset)
          self.fp.write(zip64endrec)

          zip64locrec = struct.pack(
              structEndArchive64Locator,
              stringEndArchive64Locator, 0, pos2, 1)
          self.fp.write(zip64locrec)
          centDirCount = min(centDirCount, 0xFFFF)
          centDirSize = min(centDirSize, 0xFFFFFFFF)
          centDirOffset = min(centDirOffset, 0xFFFFFFFF)

        endrec = struct.pack(structEndArchive, stringEndArchive,
                  0, 0, centDirCount, centDirCount,
                  centDirSize, centDirOffset, len(self._comment))
        self.fp.write(endrec)
        self.fp.write(self._comment)
        self.fp.flush()
    finally:
      fp = self.fp
      self.fp = None
      if not self._filePassed:
        fp.close()

ZipFile

ZipFile 源碼

ZipFile 源碼
class TarFile(object):
  """The TarFile Class provides an interface to tar archives.
  """

  debug = 0          # May be set from 0 (no msgs) to 3 (all msgs)

  dereference = False     # If true, add content of linked file to the
                # tar file, else the link.

  ignore_zeros = False    # If true, skips empty or invalid blocks and
                # continues processing.

  errorlevel = 1       # If 0, fatal errors only appear in debug
                # messages (if debug >= 0). If > 0, errors
                # are passed to the caller as exceptions.

  format = DEFAULT_FORMAT   # The format to use when creating an archive.

  encoding = ENCODING     # Encoding for 8-bit character strings.

  errors = None        # Error handler for unicode conversion.

  tarinfo = TarInfo      # The default TarInfo class to use.

  fileobject = ExFileObject  # The default ExFileObject class to use.

  def __init__(self, name=None, mode="r", fileobj=None, format=None,
      tarinfo=None, dereference=None, ignore_zeros=None, encoding=None,
      errors=None, pax_headers=None, debug=None, errorlevel=None):
    """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to
      read from an existing archive, 'a' to append data to an existing
      file or 'w' to create a new file overwriting an existing one. `mode'
      defaults to 'r'.
      If `fileobj' is given, it is used for reading or writing data. If it
      can be determined, `mode' is overridden by `fileobj's mode.
      `fileobj' is not closed, when TarFile is closed.
    """
    modes = {"r": "rb", "a": "r+b", "w": "wb"}
    if mode not in modes:
      raise ValueError("mode must be 'r', 'a' or 'w'")
    self.mode = mode
    self._mode = modes[mode]

    if not fileobj:
      if self.mode == "a" and not os.path.exists(name):
        # Create nonexistent files in append mode.
        self.mode = "w"
        self._mode = "wb"
      fileobj = bltn_open(name, self._mode)
      self._extfileobj = False
    else:
      if name is None and hasattr(fileobj, "name"):
        name = fileobj.name
      if hasattr(fileobj, "mode"):
        self._mode = fileobj.mode
      self._extfileobj = True
    self.name = os.path.abspath(name) if name else None
    self.fileobj = fileobj

    # Init attributes.
    if format is not None:
      self.format = format
    if tarinfo is not None:
      self.tarinfo = tarinfo
    if dereference is not None:
      self.dereference = dereference
    if ignore_zeros is not None:
      self.ignore_zeros = ignore_zeros
    if encoding is not None:
      self.encoding = encoding

    if errors is not None:
      self.errors = errors
    elif mode == "r":
      self.errors = "utf-8"
    else:
      self.errors = "strict"

    if pax_headers is not None and self.format == PAX_FORMAT:
      self.pax_headers = pax_headers
    else:
      self.pax_headers = {}

    if debug is not None:
      self.debug = debug
    if errorlevel is not None:
      self.errorlevel = errorlevel

    # Init datastructures.
    self.closed = False
    self.members = []    # list of members as TarInfo objects
    self._loaded = False  # flag if all members have been read
    self.offset = self.fileobj.tell()
                # current position in the archive file
    self.inodes = {}    # dictionary caching the inodes of
                # archive members already added

    try:
      if self.mode == "r":
        self.firstmember = None
        self.firstmember = self.next()

      if self.mode == "a":
        # Move to the end of the archive,
        # before the first empty block.
        while True:
          self.fileobj.seek(self.offset)
          try:
            tarinfo = self.tarinfo.fromtarfile(self)
            self.members.append(tarinfo)
          except EOFHeaderError:
            self.fileobj.seek(self.offset)
            break
          except HeaderError, e:
            raise ReadError(str(e))

      if self.mode in "aw":
        self._loaded = True

        if self.pax_headers:
          buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy())
          self.fileobj.write(buf)
          self.offset += len(buf)
    except:
      if not self._extfileobj:
        self.fileobj.close()
      self.closed = True
      raise

  def _getposix(self):
    return self.format == USTAR_FORMAT
  def _setposix(self, value):
    import warnings
    warnings.warn("use the format attribute instead", DeprecationWarning,
           2)
    if value:
      self.format = USTAR_FORMAT
    else:
      self.format = GNU_FORMAT
  posix = property(_getposix, _setposix)

  #--------------------------------------------------------------------------
  # Below are the classmethods which act as alternate constructors to the
  # TarFile class. The open() method is the only one that is needed for
  # public use; it is the "super"-constructor and is able to select an
  # adequate "sub"-constructor for a particular compression using the mapping
  # from OPEN_METH.
  #
  # This concept allows one to subclass TarFile without losing the comfort of
  # the super-constructor. A sub-constructor is registered and made available
  # by adding it to the mapping in OPEN_METH.

  @classmethod
  def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs):
    """Open a tar archive for reading, writing or appending. Return
      an appropriate TarFile class.

      mode:
      'r' or 'r:*' open for reading with transparent compression
      'r:'     open for reading exclusively uncompressed
      'r:gz'    open for reading with gzip compression
      'r:bz2'   open for reading with bzip2 compression
      'a' or 'a:' open for appending, creating the file if necessary
      'w' or 'w:' open for writing without compression
      'w:gz'    open for writing with gzip compression
      'w:bz2'   open for writing with bzip2 compression

      'r|*'    open a stream of tar blocks with transparent compression
      'r|'     open an uncompressed stream of tar blocks for reading
      'r|gz'    open a gzip compressed stream of tar blocks
      'r|bz2'   open a bzip2 compressed stream of tar blocks
      'w|'     open an uncompressed stream for writing
      'w|gz'    open a gzip compressed stream for writing
      'w|bz2'   open a bzip2 compressed stream for writing
    """

    if not name and not fileobj:
      raise ValueError("nothing to open")

    if mode in ("r", "r:*"):
      # Find out which *open() is appropriate for opening the file.
      for comptype in cls.OPEN_METH:
        func = getattr(cls, cls.OPEN_METH[comptype])
        if fileobj is not None:
          saved_pos = fileobj.tell()
        try:
          return func(name, "r", fileobj, **kwargs)
        except (ReadError, CompressionError), e:
          if fileobj is not None:
            fileobj.seek(saved_pos)
          continue
      raise ReadError("file could not be opened successfully")

    elif ":" in mode:
      filemode, comptype = mode.split(":", 1)
      filemode = filemode or "r"
      comptype = comptype or "tar"

      # Select the *open() function according to
      # given compression.
      if comptype in cls.OPEN_METH:
        func = getattr(cls, cls.OPEN_METH[comptype])
      else:
        raise CompressionError("unknown compression type %r" % comptype)
      return func(name, filemode, fileobj, **kwargs)

    elif "|" in mode:
      filemode, comptype = mode.split("|", 1)
      filemode = filemode or "r"
      comptype = comptype or "tar"

      if filemode not in ("r", "w"):
        raise ValueError("mode must be 'r' or 'w'")

      stream = _Stream(name, filemode, comptype, fileobj, bufsize)
      try:
        t = cls(name, filemode, stream, **kwargs)
      except:
        stream.close()
        raise
      t._extfileobj = False
      return t

    elif mode in ("a", "w"):
      return cls.taropen(name, mode, fileobj, **kwargs)

    raise ValueError("undiscernible mode")

  @classmethod
  def taropen(cls, name, mode="r", fileobj=None, **kwargs):
    """Open uncompressed tar archive name for reading or writing.
    """
    if mode not in ("r", "a", "w"):
      raise ValueError("mode must be 'r', 'a' or 'w'")
    return cls(name, mode, fileobj, **kwargs)

  @classmethod
  def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
    """Open gzip compressed tar archive name for reading or writing.
      Appending is not allowed.
    """
    if mode not in ("r", "w"):
      raise ValueError("mode must be 'r' or 'w'")

    try:
      import gzip
      gzip.GzipFile
    except (ImportError, AttributeError):
      raise CompressionError("gzip module is not available")

    try:
      fileobj = gzip.GzipFile(name, mode, compresslevel, fileobj)
    except OSError:
      if fileobj is not None and mode == 'r':
        raise ReadError("not a gzip file")
      raise

    try:
      t = cls.taropen(name, mode, fileobj, **kwargs)
    except IOError:
      fileobj.close()
      if mode == 'r':
        raise ReadError("not a gzip file")
      raise
    except:
      fileobj.close()
      raise
    t._extfileobj = False
    return t

  @classmethod
  def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
    """Open bzip2 compressed tar archive name for reading or writing.
      Appending is not allowed.
    """
    if mode not in ("r", "w"):
      raise ValueError("mode must be 'r' or 'w'.")

    try:
      import bz2
    except ImportError:
      raise CompressionError("bz2 module is not available")

    if fileobj is not None:
      fileobj = _BZ2Proxy(fileobj, mode)
    else:
      fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel)

    try:
      t = cls.taropen(name, mode, fileobj, **kwargs)
    except (IOError, EOFError):
      fileobj.close()
      if mode == 'r':
        raise ReadError("not a bzip2 file")
      raise
    except:
      fileobj.close()
      raise
    t._extfileobj = False
    return t

  # All *open() methods are registered here.
  OPEN_METH = {
    "tar": "taropen",  # uncompressed tar
    "gz": "gzopen",  # gzip compressed tar
    "bz2": "bz2open"  # bzip2 compressed tar
  }

  #--------------------------------------------------------------------------
  # The public methods which TarFile provides:

  def close(self):
    """Close the TarFile. In write-mode, two finishing zero blocks are
      appended to the archive.
    """
    if self.closed:
      return

    if self.mode in "aw":
      self.fileobj.write(NUL * (BLOCKSIZE * 2))
      self.offset += (BLOCKSIZE * 2)
      # fill up the end with zero-blocks
      # (like option -b20 for tar does)
      blocks, remainder = divmod(self.offset, RECORDSIZE)
      if remainder > 0:
        self.fileobj.write(NUL * (RECORDSIZE - remainder))

    if not self._extfileobj:
      self.fileobj.close()
    self.closed = True

  def getmember(self, name):
    """Return a TarInfo object for member `name'. If `name' can not be
      found in the archive, KeyError is raised. If a member occurs more
      than once in the archive, its last occurrence is assumed to be the
      most up-to-date version.
    """
    tarinfo = self._getmember(name)
    if tarinfo is None:
      raise KeyError("filename %r not found" % name)
    return tarinfo

  def getmembers(self):
    """Return the members of the archive as a list of TarInfo objects. The
      list has the same order as the members in the archive.
    """
    self._check()
    if not self._loaded:  # if we want to obtain a list of
      self._load()    # all members, we first have to
                # scan the whole archive.
    return self.members

  def getnames(self):
    """Return the members of the archive as a list of their names. It has
      the same order as the list returned by getmembers().
    """
    return [tarinfo.name for tarinfo in self.getmembers()]

  def gettarinfo(self, name=None, arcname=None, fileobj=None):
    """Create a TarInfo object for either the file `name' or the file
      object `fileobj' (using os.fstat on its file descriptor). You can
      modify some of the TarInfo's attributes before you add it using
      addfile(). If given, `arcname' specifies an alternative name for the
      file in the archive.
    """
    self._check("aw")

    # When fileobj is given, replace name by
    # fileobj's real name.
    if fileobj is not None:
      name = fileobj.name

    # Building the name of the member in the archive.
    # Backward slashes are converted to forward slashes,
    # Absolute paths are turned to relative paths.
    if arcname is None:
      arcname = name
    drv, arcname = os.path.splitdrive(arcname)
    arcname = arcname.replace(os.sep, "/")
    arcname = arcname.lstrip("/")

    # Now, fill the TarInfo object with
    # information specific for the file.
    tarinfo = self.tarinfo()
    tarinfo.tarfile = self

    # Use os.stat or os.lstat, depending on platform
    # and if symlinks shall be resolved.
    if fileobj is None:
      if hasattr(os, "lstat") and not self.dereference:
        statres = os.lstat(name)
      else:
        statres = os.stat(name)
    else:
      statres = os.fstat(fileobj.fileno())
    linkname = ""

    stmd = statres.st_mode
    if stat.S_ISREG(stmd):
      inode = (statres.st_ino, statres.st_dev)
      if not self.dereference and statres.st_nlink > 1 and \
          inode in self.inodes and arcname != self.inodes[inode]:
        # Is it a hardlink to an already
        # archived file?
        type = LNKTYPE
        linkname = self.inodes[inode]
      else:
        # The inode is added only if its valid.
        # For win32 it is always 0.
        type = REGTYPE
        if inode[0]:
          self.inodes[inode] = arcname
    elif stat.S_ISDIR(stmd):
      type = DIRTYPE
    elif stat.S_ISFIFO(stmd):
      type = FIFOTYPE
    elif stat.S_ISLNK(stmd):
      type = SYMTYPE
      linkname = os.readlink(name)
    elif stat.S_ISCHR(stmd):
      type = CHRTYPE
    elif stat.S_ISBLK(stmd):
      type = BLKTYPE
    else:
      return None

    # Fill the TarInfo object with all
    # information we can get.
    tarinfo.name = arcname
    tarinfo.mode = stmd
    tarinfo.uid = statres.st_uid
    tarinfo.gid = statres.st_gid
    if type == REGTYPE:
      tarinfo.size = statres.st_size
    else:
      tarinfo.size = 0L
    tarinfo.mtime = statres.st_mtime
    tarinfo.type = type
    tarinfo.linkname = linkname
    if pwd:
      try:
        tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0]
      except KeyError:
        pass
    if grp:
      try:
        tarinfo.gname = grp.getgrgid(tarinfo.gid)[0]
      except KeyError:
        pass

    if type in (CHRTYPE, BLKTYPE):
      if hasattr(os, "major") and hasattr(os, "minor"):
        tarinfo.devmajor = os.major(statres.st_rdev)
        tarinfo.devminor = os.minor(statres.st_rdev)
    return tarinfo

  def list(self, verbose=True):
    """Print a table of contents to sys.stdout. If `verbose' is False, only
      the names of the members are printed. If it is True, an `ls -l'-like
      output is produced.
    """
    self._check()

    for tarinfo in self:
      if verbose:
        print filemode(tarinfo.mode),
        print "%s/%s" % (tarinfo.uname or tarinfo.uid,
                 tarinfo.gname or tarinfo.gid),
        if tarinfo.ischr() or tarinfo.isblk():
          print "%10s" % ("%d,%d" \
                  % (tarinfo.devmajor, tarinfo.devminor)),
        else:
          print "%10d" % tarinfo.size,
        print "%d-%02d-%02d %02d:%02d:%02d" \
           % time.localtime(tarinfo.mtime)[:6],

      print tarinfo.name + ("/" if tarinfo.isdir() else ""),

      if verbose:
        if tarinfo.issym():
          print "->", tarinfo.linkname,
        if tarinfo.islnk():
          print "link to", tarinfo.linkname,
      print

  def add(self, name, arcname=None, recursive=True, exclude=None, filter=None):
    """Add the file `name' to the archive. `name' may be any type of file
      (directory, fifo, symbolic link, etc.). If given, `arcname'
      specifies an alternative name for the file in the archive.
      Directories are added recursively by default. This can be avoided by
      setting `recursive' to False. `exclude' is a function that should
      return True for each filename to be excluded. `filter' is a function
      that expects a TarInfo object argument and returns the changed
      TarInfo object, if it returns None the TarInfo object will be
      excluded from the archive.
    """
    self._check("aw")

    if arcname is None:
      arcname = name

    # Exclude pathnames.
    if exclude is not None:
      import warnings
      warnings.warn("use the filter argument instead",
          DeprecationWarning, 2)
      if exclude(name):
        self._dbg(2, "tarfile: Excluded %r" % name)
        return

    # Skip if somebody tries to archive the archive...
    if self.name is not None and os.path.abspath(name) == self.name:
      self._dbg(2, "tarfile: Skipped %r" % name)
      return

    self._dbg(1, name)

    # Create a TarInfo object from the file.
    tarinfo = self.gettarinfo(name, arcname)

    if tarinfo is None:
      self._dbg(1, "tarfile: Unsupported type %r" % name)
      return

    # Change or exclude the TarInfo object.
    if filter is not None:
      tarinfo = filter(tarinfo)
      if tarinfo is None:
        self._dbg(2, "tarfile: Excluded %r" % name)
        return

    # Append the tar header and data to the archive.
    if tarinfo.isreg():
      with bltn_open(name, "rb") as f:
        self.addfile(tarinfo, f)

    elif tarinfo.isdir():
      self.addfile(tarinfo)
      if recursive:
        for f in os.listdir(name):
          self.add(os.path.join(name, f), os.path.join(arcname, f),
              recursive, exclude, filter)

    else:
      self.addfile(tarinfo)

  def addfile(self, tarinfo, fileobj=None):
    """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is
      given, tarinfo.size bytes are read from it and added to the archive.
      You can create TarInfo objects using gettarinfo().
      On Windows platforms, `fileobj' should always be opened with mode
      'rb' to avoid irritation about the file size.
    """
    self._check("aw")

    tarinfo = copy.copy(tarinfo)

    buf = tarinfo.tobuf(self.format, self.encoding, self.errors)
    self.fileobj.write(buf)
    self.offset += len(buf)

    # If there's data to follow, append it.
    if fileobj is not None:
      copyfileobj(fileobj, self.fileobj, tarinfo.size)
      blocks, remainder = divmod(tarinfo.size, BLOCKSIZE)
      if remainder > 0:
        self.fileobj.write(NUL * (BLOCKSIZE - remainder))
        blocks += 1
      self.offset += blocks * BLOCKSIZE

    self.members.append(tarinfo)

  def extractall(self, path=".", members=None):
    """Extract all members from the archive to the current working
      directory and set owner, modification time and permissions on
      directories afterwards. `path' specifies a different directory
      to extract to. `members' is optional and must be a subset of the
      list returned by getmembers().
    """
    directories = []

    if members is None:
      members = self

    for tarinfo in members:
      if tarinfo.isdir():
        # Extract directories with a safe mode.
        directories.append(tarinfo)
        tarinfo = copy.copy(tarinfo)
        tarinfo.mode = 0700
      self.extract(tarinfo, path)

    # Reverse sort directories.
    directories.sort(key=operator.attrgetter('name'))
    directories.reverse()

    # Set correct owner, mtime and filemode on directories.
    for tarinfo in directories:
      dirpath = os.path.join(path, tarinfo.name)
      try:
        self.chown(tarinfo, dirpath)
        self.utime(tarinfo, dirpath)
        self.chmod(tarinfo, dirpath)
      except ExtractError, e:
        if self.errorlevel > 1:
          raise
        else:
          self._dbg(1, "tarfile: %s" % e)

  def extract(self, member, path=""):
    """Extract a member from the archive to the current working directory,
      using its full name. Its file information is extracted as accurately
      as possible. `member' may be a filename or a TarInfo object. You can
      specify a different directory using `path'.
    """
    self._check("r")

    if isinstance(member, basestring):
      tarinfo = self.getmember(member)
    else:
      tarinfo = member

    # Prepare the link target for makelink().
    if tarinfo.islnk():
      tarinfo._link_target = os.path.join(path, tarinfo.linkname)

    try:
      self._extract_member(tarinfo, os.path.join(path, tarinfo.name))
    except EnvironmentError, e:
      if self.errorlevel > 0:
        raise
      else:
        if e.filename is None:
          self._dbg(1, "tarfile: %s" % e.strerror)
        else:
          self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename))
    except ExtractError, e:
      if self.errorlevel > 1:
        raise
      else:
        self._dbg(1, "tarfile: %s" % e)

  def extractfile(self, member):
    """Extract a member from the archive as a file object. `member' may be
      a filename or a TarInfo object. If `member' is a regular file, a
      file-like object is returned. If `member' is a link, a file-like
      object is constructed from the link's target. If `member' is none of
      the above, None is returned.
      The file-like object is read-only and provides the following
      methods: read(), readline(), readlines(), seek() and tell()
    """
    self._check("r")

    if isinstance(member, basestring):
      tarinfo = self.getmember(member)
    else:
      tarinfo = member

    if tarinfo.isreg():
      return self.fileobject(self, tarinfo)

    elif tarinfo.type not in SUPPORTED_TYPES:
      # If a member's type is unknown, it is treated as a
      # regular file.
      return self.fileobject(self, tarinfo)

    elif tarinfo.islnk() or tarinfo.issym():
      if isinstance(self.fileobj, _Stream):
        # A small but ugly workaround for the case that someone tries
        # to extract a (sym)link as a file-object from a non-seekable
        # stream of tar blocks.
        raise StreamError("cannot extract (sym)link as file object")
      else:
        # A (sym)link's file object is its target's file object.
        return self.extractfile(self._find_link_target(tarinfo))
    else:
      # If there's no data associated with the member (directory, chrdev,
      # blkdev, etc.), return None instead of a file object.
      return None

  def _extract_member(self, tarinfo, targetpath):
    """Extract the TarInfo object tarinfo to a physical
      file called targetpath.
    """
    # Fetch the TarInfo object for the given name
    # and build the destination pathname, replacing
    # forward slashes to platform specific separators.
    targetpath = targetpath.rstrip("/")
    targetpath = targetpath.replace("/", os.sep)

    # Create all upper directories.
    upperdirs = os.path.dirname(targetpath)
    if upperdirs and not os.path.exists(upperdirs):
      # Create directories that are not part of the archive with
      # default permissions.
      os.makedirs(upperdirs)

    if tarinfo.islnk() or tarinfo.issym():
      self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname))
    else:
      self._dbg(1, tarinfo.name)

    if tarinfo.isreg():
      self.makefile(tarinfo, targetpath)
    elif tarinfo.isdir():
      self.makedir(tarinfo, targetpath)
    elif tarinfo.isfifo():
      self.makefifo(tarinfo, targetpath)
    elif tarinfo.ischr() or tarinfo.isblk():
      self.makedev(tarinfo, targetpath)
    elif tarinfo.islnk() or tarinfo.issym():
      self.makelink(tarinfo, targetpath)
    elif tarinfo.type not in SUPPORTED_TYPES:
      self.makeunknown(tarinfo, targetpath)
    else:
      self.makefile(tarinfo, targetpath)

    self.chown(tarinfo, targetpath)
    if not tarinfo.issym():
      self.chmod(tarinfo, targetpath)
      self.utime(tarinfo, targetpath)

  #--------------------------------------------------------------------------
  # Below are the different file methods. They are called via
  # _extract_member() when extract() is called. They can be replaced in a
  # subclass to implement other functionality.

  def makedir(self, tarinfo, targetpath):
    """Make a directory called targetpath.
    """
    try:
      # Use a safe mode for the directory, the real mode is set
      # later in _extract_member().
      os.mkdir(targetpath, 0700)
    except EnvironmentError, e:
      if e.errno != errno.EEXIST:
        raise

  def makefile(self, tarinfo, targetpath):
    """Make a file called targetpath.
    """
    source = self.extractfile(tarinfo)
    try:
      with bltn_open(targetpath, "wb") as target:
        copyfileobj(source, target)
    finally:
      source.close()

  def makeunknown(self, tarinfo, targetpath):
    """Make a file from a TarInfo object with an unknown type
      at targetpath.
    """
    self.makefile(tarinfo, targetpath)
    self._dbg(1, "tarfile: Unknown file type %r, " \
           "extracted as regular file." % tarinfo.type)

  def makefifo(self, tarinfo, targetpath):
    """Make a fifo called targetpath.
    """
    if hasattr(os, "mkfifo"):
      os.mkfifo(targetpath)
    else:
      raise ExtractError("fifo not supported by system")

  def makedev(self, tarinfo, targetpath):
    """Make a character or block device called targetpath.
    """
    if not hasattr(os, "mknod") or not hasattr(os, "makedev"):
      raise ExtractError("special devices not supported by system")

    mode = tarinfo.mode
    if tarinfo.isblk():
      mode |= stat.S_IFBLK
    else:
      mode |= stat.S_IFCHR

    os.mknod(targetpath, mode,
         os.makedev(tarinfo.devmajor, tarinfo.devminor))

  def makelink(self, tarinfo, targetpath):
    """Make a (symbolic) link called targetpath. If it cannot be created
     (platform limitation), we try to make a copy of the referenced file
     instead of a link.
    """
    if hasattr(os, "symlink") and hasattr(os, "link"):
      # For systems that support symbolic and hard links.
      if tarinfo.issym():
        if os.path.lexists(targetpath):
          os.unlink(targetpath)
        os.symlink(tarinfo.linkname, targetpath)
      else:
        # See extract().
        if os.path.exists(tarinfo._link_target):
          if os.path.lexists(targetpath):
            os.unlink(targetpath)
          os.link(tarinfo._link_target, targetpath)
        else:
          self._extract_member(self._find_link_target(tarinfo), targetpath)
    else:
      try:
        self._extract_member(self._find_link_target(tarinfo), targetpath)
      except KeyError:
        raise ExtractError("unable to resolve link inside archive")

  def chown(self, tarinfo, targetpath):
    """Set owner of targetpath according to tarinfo.
    """
    if pwd and hasattr(os, "geteuid") and os.geteuid() == 0:
      # We have to be root to do so.
      try:
        g = grp.getgrnam(tarinfo.gname)[2]
      except KeyError:
        g = tarinfo.gid
      try:
        u = pwd.getpwnam(tarinfo.uname)[2]
      except KeyError:
        u = tarinfo.uid
      try:
        if tarinfo.issym() and hasattr(os, "lchown"):
          os.lchown(targetpath, u, g)
        else:
          if sys.platform != "os2emx":
            os.chown(targetpath, u, g)
      except EnvironmentError, e:
        raise ExtractError("could not change owner")

  def chmod(self, tarinfo, targetpath):
    """Set file permissions of targetpath according to tarinfo.
    """
    if hasattr(os, 'chmod'):
      try:
        os.chmod(targetpath, tarinfo.mode)
      except EnvironmentError, e:
        raise ExtractError("could not change mode")

  def utime(self, tarinfo, targetpath):
    """Set modification time of targetpath according to tarinfo.
    """
    if not hasattr(os, 'utime'):
      return
    try:
      os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime))
    except EnvironmentError, e:
      raise ExtractError("could not change modification time")

  #--------------------------------------------------------------------------
  def next(self):
    """Return the next member of the archive as a TarInfo object, when
      TarFile is opened for reading. Return None if there is no more
      available.
    """
    self._check("ra")
    if self.firstmember is not None:
      m = self.firstmember
      self.firstmember = None
      return m

    # Read the next block.
    self.fileobj.seek(self.offset)
    tarinfo = None
    while True:
      try:
        tarinfo = self.tarinfo.fromtarfile(self)
      except EOFHeaderError, e:
        if self.ignore_zeros:
          self._dbg(2, "0x%X: %s" % (self.offset, e))
          self.offset += BLOCKSIZE
          continue
      except InvalidHeaderError, e:
        if self.ignore_zeros:
          self._dbg(2, "0x%X: %s" % (self.offset, e))
          self.offset += BLOCKSIZE
          continue
        elif self.offset == 0:
          raise ReadError(str(e))
      except EmptyHeaderError:
        if self.offset == 0:
          raise ReadError("empty file")
      except TruncatedHeaderError, e:
        if self.offset == 0:
          raise ReadError(str(e))
      except SubsequentHeaderError, e:
        raise ReadError(str(e))
      break

    if tarinfo is not None:
      self.members.append(tarinfo)
    else:
      self._loaded = True

    return tarinfo

  #--------------------------------------------------------------------------
  # Little helper methods:

  def _getmember(self, name, tarinfo=None, normalize=False):
    """Find an archive member by name from bottom to top.
      If tarinfo is given, it is used as the starting point.
    """
    # Ensure that all members have been loaded.
    members = self.getmembers()

    # Limit the member search list up to tarinfo.
    if tarinfo is not None:
      members = members[:members.index(tarinfo)]

    if normalize:
      name = os.path.normpath(name)

    for member in reversed(members):
      if normalize:
        member_name = os.path.normpath(member.name)
      else:
        member_name = member.name

      if name == member_name:
        return member

  def _load(self):
    """Read through the entire archive file and look for readable
      members.
    """
    while True:
      tarinfo = self.next()
      if tarinfo is None:
        break
    self._loaded = True

  def _check(self, mode=None):
    """Check if TarFile is still open, and if the operation's mode
      corresponds to TarFile's mode.
    """
    if self.closed:
      raise IOError("%s is closed" % self.__class__.__name__)
    if mode is not None and self.mode not in mode:
      raise IOError("bad operation for mode %r" % self.mode)

  def _find_link_target(self, tarinfo):
    """Find the target member of a symlink or hardlink member in the
      archive.
    """
    if tarinfo.issym():
      # Always search the entire archive.
      linkname = "/".join(filter(None, (os.path.dirname(tarinfo.name), tarinfo.linkname)))
      limit = None
    else:
      # Search the archive before the link, because a hard link is
      # just a reference to an already archived file.
      linkname = tarinfo.linkname
      limit = tarinfo

    member = self._getmember(linkname, tarinfo=limit, normalize=True)
    if member is None:
      raise KeyError("linkname %r not found" % linkname)
    return member

  def __iter__(self):
    """Provide an iterator object.
    """
    if self._loaded:
      return iter(self.members)
    else:
      return TarIter(self)

  def _dbg(self, level, msg):
    """Write debugging output to sys.stderr.
    """
    if level <= self.debug:
      print >> sys.stderr, msg

  def __enter__(self):
    self._check()
    return self

  def __exit__(self, type, value, traceback):
    if type is None:
      self.close()
    else:
      # An exception occurred. We must not call close() because
      # it would try to write end-of-archive blocks and padding.
      if not self._extfileobj:
        self.fileobj.close()
      self.closed = True
# class TarFile

TarFile

TarFile 源碼

TarFile 源碼

(6)json 和 pickle模塊:文件只能存二進制或字符串,不能存其他類型,所以用到了用于序列化的兩個模塊

(7)shelve模塊:shelve模塊內部對pickle進行了封裝,shelve模塊是一個簡單的k,v將內存數(shù)據(jù)通過文件持久化的模塊,可以持久化任何pickle可支持的python數(shù)據(jù)格式 (可以存儲數(shù)據(jù)、獲取數(shù)據(jù)、給數(shù)據(jù)重新賦值)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-solo
import shelve
# k,v方式存儲數(shù)據(jù)
s = shelve.open("shelve_test") # 打開一個文件
tuple = (1, 2, 3, 4)
list = ['a', 'b', 'c', 'd']
info = {"name": "lzl", "age": 18}
s["tuple"] = tuple # 持久化元組
s["list"] = list
s["info"] = info
s.close()
# 通過key獲取value值
d = shelve.open("shelve_test") # 打開一個文件
print(d["tuple"]) # 讀取
print(d.get("list"))
print(d.get("info"))
# (1, 2, 3, 4)
# ['a', 'b', 'c', 'd']
# {'name': 'lzl', 'age': 18}
d.close()
# 循環(huán)打印key值
s = shelve.open("shelve_test") # 打開一個文件
for k in s.keys():       # 循環(huán)key值
  print(k)
# list
# tuple
# info
s.close()
# 更新key的value值
s = shelve.open("shelve_test") # 打開一個文件
s.update({"list":[22,33]})   #重新賦值或者s["list"] = [22,33]
print(s["list"])
#[22, 33]
s.close()

(8)xml模塊:xml是實現(xiàn)不同語言或程序之間進行數(shù)據(jù)交換的協(xié)議,跟json差不多,但json使用起來更簡單(通過<>節(jié)點來區(qū)別數(shù)據(jù)結構)

<?xml version="1.0"?><data>
  <country name="Liechtenstein">
    <rank updated="yes">2</rank>
    <year>2008</year>
    <gdppc>141100</gdppc>
    <neighbor name="Austria" direction="E"/>
    <neighbor name="Switzerland" direction="W"/>
  </country>
  <country name="Singapore">
    <rank updated="yes">5</rank>
    <year>2011</year>
    <gdppc>59900</gdppc>
    <neighbor name="Malaysia" direction="N"/>
  </country>
  <country name="Panama">
    <rank updated="yes">69</rank>
    <year>2011</year>
    <gdppc>13600</gdppc>
    <neighbor name="Costa Rica" direction="W"/>
    <neighbor name="Colombia" direction="E"/>
  </country></data>

文件
import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)
#遍歷xml文檔
for child in root:
  print(child.tag, child.attrib)
  for i in child:
    print(i.tag,i.text)
#只遍歷year 節(jié)點
for node in root.iter('year'):
  print(node.tag,node.text)
#修改
for node in root.iter('year'):
  new_year = int(node.text) + 1
  node.text = str(new_year)
  node.set("updated","yes")
tree.write("xmltest.xml")
#刪除node
for country in root.findall('country'):
  rank = int(country.find('rank').text)
  if rank > 50:
   root.remove(country)
tree.write('output.xml')

###########自己創(chuàng)建xml文檔
import xml.etree.ElementTree as ET 
new_xml = ET.Element("namelist")
name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
age = ET.SubElement(name,"age",attrib={"checked":"no"})
sex = ET.SubElement(name,"sex")
sex.text = '33'
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = '19'
et = ET.ElementTree(new_xml) #生成文檔對象
et.write("test.xml", encoding="utf-8",xml_declaration=True)
ET.dump(new_xml) #打印生成的格式

操作

(9)configparser模塊:用于生成和修改配置文檔(很少在程序中修改配置文件)

(10)hashlib模塊:用于加密相關的操作,3.x里代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

import hashlib
m = hashlib.md5()
m.update(b"Hello")
m.update(b"It's me")
print(m.digest())
m.update(b"It's been a long time since last time we ...")
print(m.digest()) #2進制格式hash
print(len(m.hexdigest())) #16進制格式hash
'''
def digest(self, *args, **kwargs): # real signature unknown
  """ Return the digest value as a string of binary data. """
  pass
def hexdigest(self, *args, **kwargs): # real signature unknown
  """ Return the digest value as a string of hexadecimal digits. """
  pass
'''
import hashlib 
# ######## md5 ########
hash = hashlib.md5()
hash.update('admin')
print(hash.hexdigest())
# ######## sha1 ########
hash = hashlib.sha1()
hash.update('admin')
print(hash.hexdigest())
# ######## sha256 ########
hash = hashlib.sha256()
hash.update('admin')
print(hash.hexdigest())
# ######## sha384 ########
hash = hashlib.sha384()
hash.update('admin')
print(hash.hexdigest())
# ######## sha512 ########
hash = hashlib.sha512()
hash.update('admin')
print(hash.hexdigest())

hashlib
import hmac
h = hmac.new('wueiqi')
h.update('hellowo')
print h.hexdigest()

(11)re模塊:用于對python的正則表達式的操作;匹配(動態(tài)模糊的匹配);關鍵是匹配條件

'.'   默認匹配除\n之外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行
'^'   匹配字符開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$'   匹配字符結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*'   匹配*號前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 結果為['abb', 'ab', 'a']
'+'   匹配前一個字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb']
'?'   匹配前一個字符1次或0次
'{m}'  匹配前一個字符m次
'{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb']
'|'   匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC'
'(...)' 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c
'[a-z]' 匹配a到z任意一個字符
'[^()]' 匹配除()以外的任意一個字符 
'\A'  只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z'  匹配字符結尾,同$
'\d'  匹配數(shù)字0-9
'\D'  匹配非數(shù)字
'\w'  匹配[A-Za-z0-9]
'\W'  匹配非[A-Za-z0-9]
'\s'  匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t' 
'(?P<name>...)' 分組匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
結果{'province': '3714', 'city': '81', 'birthday': '1993'}

正則表達式

①、match:從起始位置開始去匹配

#match
import re               
obj = re.match('\d+', '123uua123sf')    #從第一個字符開始匹配一個到多個數(shù)字
print(obj)                
#<_sre.SRE_Match object; span=(0, 3), match='123'>
if obj:                  #如果有匹配到字符則執(zhí)行,為空不執(zhí)行
  print(obj.group())          #打印匹配到的內容
#123

②、search:最前面去匹配(不一定是最開始位置),匹配最前

#search
import re
obj = re.search('\d+', 'a123uu234asf')   #從數(shù)字開始匹配一個到多個數(shù)字
print(obj)
#<_sre.SRE_Match object; span=(1, 4), match='123'>
if obj:                  #如果有匹配到字符則執(zhí)行,為空不執(zhí)行
  print(obj.group())          #打印匹配到的內容
#123
import re
obj = re.search('\([^()]+\)', 'sdds(a1fwewe2(3uusfdsf2)34as)f')   #匹配最里面()的內容
print(obj)
#<_sre.SRE_Match object; span=(13, 24), match='(3uusfdsf2)'>
if obj:                  #如果有匹配到字符則執(zhí)行,為空不執(zhí)行
  print(obj.group())          #打印匹配到的內容
#(3uusfdsf2)

③、group與groups的區(qū)別

#group與groups的區(qū)別
import re
a = "123abc456"
b = re.search("([0-9]*)([a-z]*)([0-9]*)", a)
print(b)
#<_sre.SRE_Match object; span=(0, 9), match='123abc456'>
print(b.group())
#123abc456
print(b.group(0))
#123abc456
print(b.group(1))
#123
print(b.group(2))
#abc
print(b.group(3))
#456
print(b.groups())
#('123', 'abc', '456')

④、findall上述兩中方式均用于匹配單值,即:只能匹配字符串中的一個,如果想要匹配到字符串中所有符合條件的元素,則需要使用 findall;findall沒有group 用法

#findall
import re
obj = re.findall('\d+', 'a123uu234asf')   #匹配多個
if obj:                  #如果有匹配到字符則執(zhí)行,為空不執(zhí)行
  print(obj)               #生成的內容為列表
#['123', '234']

⑤、sub:用于替換匹配的字符串

#sub
import re
content = "123abc456"
new_content = re.sub('\d+', 'ABC', content)
print(new_content)
#ABCabcABC

⑥、split:根據(jù)指定匹配進行分組(分割)

#split
import re
content = "1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )"
new_content = re.split('\*', content)    #用*進行分割,分割為列表
print(new_content)
#['1 - 2 ', ' ((60-30+1', '(9-2', '5/3+7/3', '99/4', '2998+10', '568/14))-(-4', '3)/(16-3', '2) )'] 
content = "'1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'"
new_content = re.split('[\+\-\*\/]+', content)
# new_content = re.split('\*', content, 1)
print(new_content)
#["'1 ", ' 2 ', ' ((60', '30', '1', '(9', '2', '5', '3', '7', '3', '99', '4', '2998', '10', '568', '14))',
# '(', '4', '3)', '(16', '3', "2) )'"]
inpp = '1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))'
inpp = re.sub('\s*','',inpp)        #把空白字符去掉
print(inpp)
new_content = re.split('\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)', inpp, 1)
print(new_content)
#['1-2*((60-30+', '-40-5', '*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']

(12)urllib模塊:提供了一系列用于操作URL的功能(利用程序去執(zhí)行各種HTTP請求。如果要模擬瀏覽器完成特定功能,需要把請求偽裝成瀏覽器。偽裝的方法是先監(jiān)控瀏覽器發(fā)出的請求,再根據(jù)瀏覽器的請求頭來偽裝,User-Agent頭就是用來標識瀏覽器的。)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-solo
import urllib.request
def getdata():
  url = "http://www.baidu.com"
  data = urllib.request.urlopen(url).read()
  data = data.decode("utf-8")
  print(data)
getdata()

###urlopen返回的類文件對象支持close、read、readline、和readlines方法

 

十二、面向對象

面向過程編程:通過代碼的層層堆積來實現(xiàn)功能。不易迭代和維護。
函數(shù)式編程:將某功能代碼封裝到函數(shù)中,僅調用函數(shù)即可
面向對象編程:利用“類”和“對象”來創(chuàng)建各種模型來實現(xiàn)對真實世界的描述;使用面向對象編程的原因一方面是因為它可以使程序的維護和擴展變得更簡單,并且可以大大提高程序開發(fā)效率 ,另外,基于面向對象的程序可以使它人更加容易理解你的代碼邏輯,從而使團隊開發(fā)變得更從容。

#經(jīng)典類
class A():
  def __init__(self):
    print("A")
class B(A):
  pass
class C(A):
  def __init__(self):
    print("C")
class D(B,C):
  pass
obj = D()
#A
#新式類
class A(object):
  def __init__(self):
    print("A")
class B(A):
  pass
class C(A):
  def __init__(self):
    print("C")
class D(B,C):
  pass
obj = D()
#C

經(jīng)典類、新式類

#屬性方法
class Flight(object):
  def __init__(self, name):
    self.flight_name = name
  def checking_status(self):
    print("checking flight %s status " % self.flight_name)
    return 1
  @property
  def flight_status(self):
    status = self.checking_status()
    if status == 0:
      print("flight got canceled...")
    elif status == 1:
      print("flight is arrived...")
    elif status == 2:
      print("flight has departured already...")
    else:
      print("cannot confirm the flight status...,please check later")
  @flight_status.setter # 修改   執(zhí)行修改操作時觸發(fā)
  def flight_status(self, status):
    status_dic = {
    0: "canceled",
    1:"arrived",
    2: "departured"
    }
    print("\033[31;1mHas changed the flight status to \033[0m", status_dic.get(status))
  @flight_status.deleter # 刪除
  def flight_status(self):
    print("status got removed...")
f = Flight("CA980")
f.flight_status = 0 # 觸發(fā)@flight_status.setter 只執(zhí)行setter裝飾的代碼
del f.flight_status # 觸發(fā)@flight_status.deleter 只執(zhí)行deleter裝飾的代碼

#執(zhí)行相應的操作,觸發(fā)相應的裝飾器,此時不會再觸發(fā)原來的屬性,只執(zhí)行裝飾器下面的代碼,需要做相應的操作可在代碼塊里添加(修改,刪除);只是觸發(fā)了而已,裝飾器并沒有做什么操作

航班查詢

類的特殊成員方法:
① __doc__  表示類的描述信息

#__doc__
class Foo:
  """ 描述類信息,這是用于看片的神奇 """
  def func(self):
    pass
print(Foo.__doc__)
# 描述類信息,這是用于看片的神奇

② __module__ 和 __class__
__module__ 表示當前操作的對象在哪個模塊
__class__ 表示當前操作的對象的類是什么

# __module__ 和 __class__
class Foo:
  """ 描述類信息,這是用于看片的神奇 """
  def func(self):
    pass
A = Foo()
print(A.__module__)
print(A.__class__)
# __main__
# <class '__main__.Foo'>

③ __init__ 構造方法,通過類創(chuàng)建對象時,自動觸發(fā)執(zhí)行

④ __del__析構方法,當對象在內存中被釋放時,自動觸發(fā)執(zhí)行

⑤ __call__ 對象后面加括號,觸發(fā)執(zhí)行
注:__init__的執(zhí)行是由創(chuàng)建對象觸發(fā)的,即:對象 = 類名() ;而對于 __call__ 方法的執(zhí)行是由對象后加括號觸發(fā)的,即:對象() 或者 類()()

# __call__
class Foo:
  def __init__(self):
    pass
  def __call__(self, *args, **kwargs):
    print('__call__')
obj = Foo() # 執(zhí)行 __init__
obj() # 執(zhí)行 __call__
#__call__

⑥ __dict__ 查看類或對象中的所有成員

class Province:
  country = 'China'
  def __init__(self, name, count):
    self.name = name
    self.count = count
  def func(self, *args, **kwargs):
    print('func')
# 獲取類的成員,即:靜態(tài)字段、方法、
print(Province.__dict__)
# 輸出:{'__init__': <function Province.__init__ at 0x0054D588>, '__dict__': <attribute '__dict__' of 'Province' objects>,
# '__doc__': None, 'func': <function Province.func at 0x0054D4B0>, '__weakref__': <attribute '__weakref__' of 'Province' objects>,
# 'country': 'China', '__module__': '__main__'}
obj1 = Province('HeBei', 10000)
print(obj1.__dict__)
# 獲取 對象obj1 的成員
# 輸出:{'count': 10000, 'name': 'HeBei'}

⑦ __str__ 如果一個類中定義了__str__方法,那么在打印 對象 時,默認輸出該方法的返回值

#__str__
class Foo:
  def __str__(self):
    return 'solo'
obj = Foo()
print(obj)       #輸出__str__返回值 而不是內存地址
# 輸出:solo

⑧ __getitem__、__setitem__、__delitem__
用于索引操作,如字典。以上分別表示獲取、設置、刪除數(shù)據(jù)

#__getitem__、__setitem__、__delitem__
class Foo(object):
  def __getitem__(self, key):
    print('__getitem__', key)
  def __setitem__(self, key, value):
    print('__setitem__', key, value)
  def __delitem__(self, key):
    print('__delitem__', key)
obj = Foo()
result = obj['k1'] # 自動觸發(fā)執(zhí)行 __getitem__
obj['k2'] = 'solo' # 自動觸發(fā)執(zhí)行 __setitem__
del obj['k1']
# __getitem__ k1
# __setitem__ k2 solo
# __delitem__ k1

⑨ __new__ \ __metaclass__

 print type(f) # 輸出:<class '__main__.Foo'>       表示,obj 對象由Foo類創(chuàng)建
2 print type(Foo) # 輸出:<type 'type'>              表示,F(xiàn)oo類對象由 type 類創(chuàng)建

f對象是Foo類的一個實例,F(xiàn)oo類對象是 type 類的一個實例,即:Foo類對象 是通過type類的構造方法創(chuàng)建

是由 type 類實例化產(chǎn)生那么問題來了,類默認是由 type 類實例化產(chǎn)生,type類中如何實現(xiàn)的創(chuàng)建類?類又是如何創(chuàng)建對象?
答:類中有一個屬性 __metaclass__,其用來表示該類由 誰 來實例化創(chuàng)建,所以,我們可以為 __metaclass__ 設置一個type類的派生類,從而查看 類 創(chuàng)建的過程

class MyType(type):
  def __init__(self, what, bases=None, dict=None):
    print("--MyType init---")
    super(MyType, self).__init__(what, bases, dict)
  def __call__(self, *args, **kwargs):
    print("--MyType call---")
    obj = self.__new__(self, *args, **kwargs)
    self.__init__(obj, *args, **kwargs)
class Foo(object):
  __metaclass__ = MyType
  def __init__(self, name):
    self.name = name
    print("Foo ---init__")
  def __new__(cls, *args, **kwargs):
    print("Foo --new--")
    return object.__new__(cls)
# 第一階段:解釋器從上到下執(zhí)行代碼創(chuàng)建Foo類
# 第二階段:通過Foo類創(chuàng)建obj對象
obj = Foo("solo")

反射:通過字符串映射或修改程序運行時的狀態(tài)、屬性、方法。 有以下4個方法
① hasattr(obj,str) 判斷一個對象obj里是否有對應的str字符串的方法
② getattr(obj,str) 根據(jù)字符串去獲取obj對象里的對應的方法的內存地址

class Foo(object):
  def __init__(self,name):
    self.name = name
  def func(self):
    print("func",self.name)
obj = Foo("alex")
str = "func"
print(hasattr(obj,str))  # 檢查是否含有成員 有沒有obj.str屬性
if hasattr(obj,str):
  getattr(obj,str)()   #getattr(obj,str) = obj.str
# True
# func alex

③ setattr(obj,'y','z') obj.y = z 通過字符串添加屬性

def bulk(self):
  print("%s is yelling"%self.name)
class Foo(object):
  def __init__(self,name):
    self.name = name
  def func(self):
    print("func",self.name)
obj = Foo("alex")
str = "talk"
print(hasattr(obj,str))  # 檢查是否含有成員 有沒有obj.str屬性
if hasattr(obj,str):
  getattr(obj,str)()   # getattr(obj,str) = obj.str
else:
  setattr(obj,str,bulk)  # setattr(obj,str,bulk 相當于 obj.str = bulk
  getattr(obj,str)()
# False
# alex is yelling

④ delattr(obj,str) 刪除obj.str 通過字符串刪除屬性

class Foo(object):
  def __init__(self,name):
    self.name = name
  def func(self):
    print("func",self.name)
obj = Foo("alex")
str = "name"
if hasattr(obj,str):
  delattr(obj,str)   # 刪除屬性obj.str
print(obj.name)
# Traceback (most recent call last):
#  File "C:/Users/L/PycharmProjects/s14/preview/Day7/main.py", line 40, in <module>
#   print(obj.name)
# AttributeError: 'Foo' object has no attribute 'name'

相關文章

  • pyqt5 實現(xiàn)多窗口跳轉的方法

    pyqt5 實現(xiàn)多窗口跳轉的方法

    今天小編就為大家分享一篇pyqt5 實現(xiàn)多窗口跳轉的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 用python 批量更改圖像尺寸到統(tǒng)一大小的方法

    用python 批量更改圖像尺寸到統(tǒng)一大小的方法

    下面小編就為大家分享一篇用python 批量更改圖像尺寸到統(tǒng)一大小的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Python類的動態(tài)修改的實例方法

    Python類的動態(tài)修改的實例方法

    這篇文章主要介紹了Python類的動態(tài)修改的實例方法的相關資料,需要的朋友可以參考下
    2017-03-03
  • Python虛擬環(huán)境管理的全指南

    Python虛擬環(huán)境管理的全指南

    在現(xiàn)代軟件開發(fā)中,依賴管理 是一個不可回避的話題,對于Python開發(fā)者而言,不同項目往往依賴不同版本的第三方庫,為了解決這一問題,Python社區(qū)提供了虛擬環(huán)境,本文將從 概念、常用工具、命令實踐、最佳實踐 等多個方面,系統(tǒng)地介紹Python虛擬環(huán)境的使用與管理
    2025-10-10
  • 詳解Python中的正則表達式

    詳解Python中的正則表達式

    正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。本文給大家?guī)砹藀ython中的正則表達式,感興趣的朋友一起看看吧
    2018-07-07
  • Python實現(xiàn)E-Mail收集插件實例教程

    Python實現(xiàn)E-Mail收集插件實例教程

    這篇文章主要給大家介紹了關于Python實現(xiàn)E-Mail收集插件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2019-02-02
  • python字符串常用方法

    python字符串常用方法

    這篇文章主要介紹了python字符串常用方法,find、count、replace、split、startswith、endswith等多種方法,需要的朋友可以參考一下文章得具體內容,希望對你有所幫助
    2021-10-10
  • Python語音合成的項目實戰(zhàn)(PyQt5+pyttsx3)

    Python語音合成的項目實戰(zhàn)(PyQt5+pyttsx3)

    本文主要介紹了Python語音合成的項目實戰(zhàn)(PyQt5+pyttsx3),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • python實現(xiàn)微信自動發(fā)送教程

    python實現(xiàn)微信自動發(fā)送教程

    這篇文章主要介紹了python實現(xiàn)微信自動發(fā)送教程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-09-09
  • 基于Python制作IP查詢網(wǎng)站

    基于Python制作IP查詢網(wǎng)站

    這篇文章主要為大家詳細介紹了如何使用python快速做一個簡易查內網(wǎng)IP網(wǎng)站,通過電腦訪問網(wǎng)站就知道自己的IP地址,感興趣的小伙伴可以了解下
    2024-10-10

最新評論

老师让我插进去69AV| 夜色撩人久久7777| eeuss鲁片一区二区三区| 精品亚洲中文字幕av| yy96视频在线观看| 亚洲精品久久视频婷婷| 狠狠的往里顶撞h百合| 桃色视频在线观看一区二区| 欧美亚洲自偷自拍 在线| 中文字幕人妻一区二区视频| 在线视频自拍第三页| 青青青青青青草国产| 97少妇精品在线观看| 97人妻总资源视频| 抽查舔水白紧大视频| 欧美地区一二三专区| 亚洲欧美一区二区三区爱爱动图 | 久久久制服丝袜中文字幕| 人人人妻人人澡人人| 国产无遮挡裸体免费直播视频| 欧美天堂av无线av欧美| 日本女人一级免费片| 久久永久免费精品人妻专区 | 久久机热/这里只有| 精品高跟鞋丝袜一区二区| 天天做天天干天天舔| 亚洲熟女女同志女同| 午夜精品久久久久麻豆影视| 97少妇精品在线观看| 亚洲国产在人线放午夜| 超黄超污网站在线观看| 中文字幕日韩精品就在这里| 40道精品招牌菜特色| 青青青青青操视频在线观看| 免费一级黄色av网站| 天天日天天添天天爽| 国产V亚洲V天堂无码欠欠| 高潮视频在线快速观看国家快速| 91人妻精品久久久久久久网站| 婷婷综合亚洲爱久久| 夜夜骑夜夜操夜夜奸| 97精品成人一区二区三区| 99av国产精品欲麻豆| 国产91嫩草久久成人在线视频| 国产精品人妻一区二区三区网站| 亚洲欧美激情国产综合久久久| 日本三极片中文字幕| 免费在线播放a级片| 国产在线自在拍91国语自产精品| 亚洲国产精品久久久久久6| 中文字幕日本人妻中出| 人妻丰满熟妇综合网| 青青青国产片免费观看视频| 天天操天天干天天艹| 人妻久久无码中文成人| 亚洲卡1卡2卡三卡四老狼| 青青草在观免费国产精品| 扒开让我视频在线观看| 人妻少妇亚洲一区二区| 国产精品久久久久久久精品视频| 国产精品手机在线看片| 日韩人妻丝袜中文字幕| 免费在线看的黄网站| 在线免费观看日本伦理| 亚洲伊人色一综合网| 女同性ⅹxx女同hd| av手机免费在线观看高潮| 青娱乐在线免费视频盛宴| 在线观看911精品国产| 青青青艹视频在线观看| 亚洲 自拍 色综合图| 日本熟妇色熟妇在线观看| 亚洲偷自拍高清视频| 亚洲精品国产在线电影| 欧美少妇性一区二区三区| 精品久久婷婷免费视频| 999久久久久999| 国产高清在线在线视频| 丝袜肉丝一区二区三区四区在线看| 国内自拍第一页在线观看| 在线亚洲天堂色播av电影| 日本美女性生活一级片| 国产高清97在线观看视频| 很黄很污很色的午夜网站在线观看 | 看一级特黄a大片日本片黑人| 国产黄色a级三级三级三级| 欧美久久久久久三级网| 成人免费毛片aaaa| 国产一级麻豆精品免费| 桃色视频在线观看一区二区| 久久久极品久久蜜桃| 91 亚洲视频在线观看| 最新中文字幕免费视频| 91麻豆精品久久久久| 久草视频中文字幕在线观看| 欧美aa一级一区三区四区| 性感美女高潮视频久久久| 一区二区在线观看少妇| 中英文字幕av一区| av在线免费观看亚洲天堂| 手机看片福利盒子日韩在线播放| 大鸡吧插逼逼视频免费看| 亚洲欧美成人综合在线观看| 啊啊啊想要被插进去视频| 中文字幕午夜免费福利视频| 日本人竟这样玩学生妹| 成人免费公开视频无毒| 亚洲第17页国产精品| 精品91高清在线观看| 91精品激情五月婷婷在线| 视频一区二区三区高清在线| 2020久久躁狠狠躁夜夜躁| 男女啪啪视频免费在线观看| 阴茎插到阴道里面的视频| 熟女国产一区亚洲中文字幕| 黄色片一级美女黄色片| 操日韩美女视频在线免费看| 伊人日日日草夜夜草| 亚洲最大黄了色网站| 自拍偷拍亚洲欧美在线视频| 成人资源在线观看免费官网| 国产av一区2区3区| 都市家庭人妻激情自拍视频| 人妻自拍视频中国大陆| 国产午夜亚洲精品麻豆| 99国内小视频在现欢看| 久久久精品999精品日本| 精品av久久久久久久| 亚洲国产免费av一区二区三区 | 国内自拍第一页在线观看| 免费在线福利小视频| 中文字幕一区二区三区蜜月| 中文字幕—97超碰网| 91啪国自产中文字幕在线| 精品久久久久久久久久久久人妻| 午夜在线观看岛国av,com| 91福利视频免费在线观看| 动色av一区二区三区| 最新中文字幕乱码在线| 青青青激情在线观看视频| 国产麻豆国语对白露脸剧情 | 啊啊啊想要被插进去视频| 亚洲青青操骚货在线视频| 一区二区视频视频视频| 伊人情人综合成人久久网小说 | 孕妇奶水仑乱A级毛片免费看| 亚洲 清纯 国产com| 最新日韩av传媒在线| 美味人妻2在线播放| yy96视频在线观看| 亚洲午夜高清在线观看| 成人精品视频99第一页| 护士特殊服务久久久久久久| 在线新三级黄伊人网| 91精品资源免费观看| 天天综合天天综合天天网| 大香蕉日本伊人中文在线| 夫妻在线观看视频91| 美女福利视频导航网站| 午夜激情久久不卡一区二区| 97欧洲一区二区精品免费| 在线观看欧美黄片一区二区三区 | 成人高清在线观看视频| 青青青青青青青青青青草青青 | 91精品资源免费观看| 美女福利写真在线观看视频| 色伦色伦777国产精品| 激情色图一区二区三区| 搡老妇人老女人老熟女| 人人爱人人妻人人澡39| 97超碰最新免费在线观看| 亚洲美女自偷自拍11页| 午夜久久香蕉电影网| av视屏免费在线播放| 亚洲国产第一页在线观看| 无码日韩人妻精品久久| 色综合久久久久久久久中文| 天天日天天透天天操| 精品一区二区三区三区色爱| 青娱乐最新视频在线| 在线观看的黄色免费网站| 亚洲国产精品中文字幕网站| 天天日天天天天天天天天天天| 亚洲午夜福利中文乱码字幕| 国产av自拍偷拍盛宴| 熟女俱乐部一二三区| 久久午夜夜伦痒痒想咳嗽P| 亚洲一区二区三区av网站| 黄色黄色黄片78在线| 喷水视频在线观看这里只有精品| 综合页自拍视频在线播放| 日本人妻欲求不满中文字幕| 懂色av蜜桃a v| 中文字母永久播放1区2区3区| 熟女国产一区亚洲中文字幕| 99热99这里精品6国产| 91人妻精品一区二区久久| 日辽宁老肥女在线观看视频| 亚洲av成人免费网站| 天天操天天干天天插| 青青青青爽手机在线| 国产视频一区二区午夜| 99精品国自产在线人| 天天日天天鲁天天操| 亚洲一区二区久久久人妻| 亚洲福利天堂久久久久久| 久久久久久性虐视频| 99国产精品窥熟女精品| 中文字幕+中文字幕| 在线免费观看靠比视频的网站| 91精品国产麻豆国产| 大陆精品一区二区三区久久| 男大肉棒猛烈插女免费视频| 福利视频网久久91| 成人国产影院在线观看| 97人人妻人人澡人人爽人人精品| 久久机热/这里只有| 视频一区 视频二区 视频| 精品美女福利在线观看| 91p0rny九色露脸熟女| 亚洲精品av在线观看| 亚洲av黄色在线网站| 精品视频一区二区三区四区五区| 一级黄色av在线观看| 天天干天天操天天插天天日| 日本乱人一区二区三区| 粉嫩小穴流水视频在线观看| 9国产精品久久久久老师| 欧美视频一区免费在线| 最新97国产在线视频| 国产精品欧美日韩区二区| 午夜精品在线视频一区| 狠狠躁夜夜躁人人爽天天久天啪| 99热这里只有精品中文| 亚洲 人妻 激情 中文| 亚洲国产40页第21页| 亚洲av一妻不如妾| 91人妻精品一区二区在线看| 97人妻无码AV碰碰视频| 久草视频首页在线观看| 日本丰满熟妇BBXBBXHD| 青青青青青青草国产| 国产成人精品久久二区91| 一区二区三区久久中文字幕| 亚洲人成精品久久久久久久| 热久久只有这里有精品| 日本少妇的秘密免费视频| 热久久只有这里有精品| 超碰97人人澡人人| 精品人人人妻人人玩日产欧| 青青青爽视频在线播放| 国产又粗又猛又爽又黄的视频美国| 一区二区三区精品日本| 日本成人不卡一区二区| 欧美日韩激情啪啪啪| 熟女人妻三十路四十路人妻斩| 在线观看亚洲人成免费网址| 亚洲最大免费在线观看| 在线播放国产黄色av| 国产大学生援交正在播放| 精品美女在线观看视频在线观看| 久草视频首页在线观看| 不戴胸罩引我诱的隔壁的人妻| 偷拍自拍福利视频在线观看| 久草福利电影在线观看| 亚洲嫩模一区二区三区| 91在线免费观看成人| 毛片一级完整版免费| 成人免费公开视频无毒| 激情啪啪啪啪一区二区三区 | 91国内视频在线观看| 日日夜夜大香蕉伊人| 天堂女人av一区二区| 亚洲av无硬久久精品蜜桃| 国产精品国产三级国产午| 青青青国产免费视频| 日本xx片在线观看| 最新国产精品网址在线观看| 强行扒开双腿猛烈进入免费版 | 东京热男人的av天堂| av在线免费中文字幕| 91欧美在线免费观看| 大黑人性xxxxbbbb| 日韩三级电影华丽的外出| 狠狠躁狠狠爱网站视频| 精品欧美一区二区vr在线观看| 又色又爽又黄的美女裸体| 毛片一级完整版免费| 午夜精品在线视频一区| 97国产在线观看高清| 亚洲高清国产一区二区三区| 亚洲 中文 自拍 另类 欧美| 99精品国产免费久久| 欧美另类一区二区视频| 亚洲2021av天堂| 免费观看理论片完整版| 偷拍自拍亚洲视频在线观看| 中文字幕人妻av在线观看| jiuse91九色视频| 精品av久久久久久久| 国产精品免费不卡av| 国产一区二区三免费视频| 亚洲另类综合一区小说| 福利片区一区二体验区| 日本www中文字幕| 91破解版永久免费| 午夜激情精品福利视频| 国产精品伦理片一区二区| 国产精品精品精品999| 91免费黄片可看视频| 99人妻视频免费在线| 极品丝袜一区二区三区| 久久精品在线观看一区二区| 蜜臀av久久久久蜜臀av麻豆| 国产日韩欧美视频在线导航| 超碰在线中文字幕一区二区| 青春草视频在线免费播放| 欧美一区二区三区啪啪同性| 中文字幕午夜免费福利视频| 日本精品美女在线观看| 大鸡巴操b视频在线| 制丝袜业一区二区三区| 91色老99久久九九爱精品| 国产揄拍高清国内精品对白| 精品少妇一二三视频在线| 2021最新热播中文字幕| 久青青草视频手机在线免费观看| 日本福利午夜电影在线观看| 一区二区熟女人妻视频| 国产黄网站在线观看播放| 97人人妻人人澡人人爽人人精品| 天天摸天天日天天操| 五十路熟女人妻一区二区9933 | 97人妻总资源视频| 任我爽精品视频在线播放| 国产精品久久综合久久| 在线视频国产欧美日韩| 亚洲视频乱码在线观看| 直接能看的国产av| 中文字幕在线免费第一页| 91精品啪在线免费| 爱有来生高清在线中文字幕| 黄色av网站免费在线| 在线观看国产免费麻豆| 人妻熟女中文字幕aⅴ在线| av天堂中文免费在线| 日韩一区二区电国产精品| 伊人开心婷婷国产av| 天天日天天干天天插舔舔| mm131美女午夜爽爽爽| av中文字幕在线导航| 在线观看免费视频色97| 久久99久久99精品影院| 97a片免费在线观看| 亚洲无线观看国产高清在线| 青青青青青操视频在线观看| 抽查舔水白紧大视频| 啊慢点鸡巴太大了啊舒服视频| 内射久久久久综合网| 在线观看的a站 最新| 亚洲精品中文字幕下载| 一区二区三区美女毛片| 啪啪啪18禁一区二区三区| 亚洲国产精品久久久久蜜桃| 五十路熟女av天堂| 馒头大胆亚洲一区二区| 色噜噜噜噜18禁止观看| 老司机午夜精品视频资源| 美女福利视频导航网站| 国产av一区2区3区| 欧美精品中文字幕久久二区| 91小伙伴中女熟女高潮| 视频在线免费观看你懂得| 久久精品国产亚洲精品166m| 青青草精品在线视频观看| 色在线观看视频免费的| 日韩一个色综合导航| 日本美女成人在线视频| 精品国产在线手机在线| 直接能看的国产av| 99久久超碰人妻国产| 免费在线黄色观看网站| 日本特级片中文字幕| 中文 成人 在线 视频| 亚洲 中文 自拍 另类 欧美| 97精品人妻一区二区三区精品 | 在线免费观看亚洲精品电影 | 超级av免费观看一区二区三区| 成人高清在线观看视频| 亚洲熟女综合色一区二区三区四区| 老司机免费福利视频网| 天堂资源网av中文字幕| 国产三级片久久久久久久| www骚国产精品视频| 天码人妻一区二区三区在线看| 亚洲精品福利网站图片| 中文字幕中文字幕人妻| 亚洲av可乐操首页| 日比视频老公慢点好舒服啊| 久久久超爽一二三av| 欧美色呦呦最新网址| 激情五月婷婷免费视频| 亚洲免费在线视频网站| 91国内精品久久久久精品一| 青青草原网站在线观看| 天天做天天干天天舔| 亚洲美女美妇久久字幕组| 欧美日韩在线精品一区二区三| 91老熟女连续高潮对白| 黑人3p华裔熟女普通话| 精彩视频99免费在线| 在线观看av2025| av中文字幕福利网| 中文字幕在线乱码一区二区| 亚洲av一妻不如妾| 五十路熟女人妻一区二| 久久www免费人成一看片| 中文字幕一区二区亚洲一区| 欧美黑人性暴力猛交喷水| 亚洲另类图片蜜臀av| 亚洲高清视频在线不卡| 干逼又爽又黄又免费的视频| 国产清纯美女al在线| av手机在线观播放网站| 天天躁夜夜躁日日躁a麻豆| 久久香蕉国产免费天天| 欧美一区二区中文字幕电影| 91小伙伴中女熟女高潮| 精品91高清在线观看| 93视频一区二区三区| 国产精品手机在线看片| 高清成人av一区三区| 十八禁在线观看地址免费| 99热国产精品666| 欧美成人猛片aaaaaaa| 啪啪啪18禁一区二区三区| 国产视频在线视频播放| 亚洲高清国产拍青青草原| 亚洲成a人片777777| 国产精品污污污久久| 国产白嫩美女一区二区| 青青青国产片免费观看视频| 久久麻豆亚洲精品av| 午夜国产免费福利av| 国产精品久久综合久久| 高清一区二区欧美系列| 亚洲伊人久久精品影院一美女洗澡| 国产又色又刺激在线视频| 精品suv一区二区69| 人妻丝袜诱惑我操她视频| 人妻少妇精品久久久久久| 在线观看视频 你懂的| 狠狠躁夜夜躁人人爽天天久天啪| 熟女妇女老妇一二三区| 欧洲精品第一页欧洲精品亚洲| 97色视频在线观看| 红杏久久av人妻一区| 亚洲一区二区三区uij| 午夜在线精品偷拍一区二| 国产欧美精品不卡在线| 在线免费观看日本片| 中文字幕最新久久久| 亚洲欧美另类手机在线| 三级av中文字幕在线观看| 色天天天天射天天舔| 国产片免费观看在线观看| 天天干天天日天天干天天操| 久久久久久久精品成人热| 国内自拍第一页在线观看| 天天干天天操天天爽天天摸| 国产日韩精品免费在线| 综合一区二区三区蜜臀| 国产1区,2区,3区| 亚洲成a人片777777| 久久h视频在线观看| 1769国产精品视频免费观看| 2020av天堂网在线观看| 久久久麻豆精亚洲av麻花| 一区二区免费高清黄色视频| 成人亚洲精品国产精品| 久草视频中文字幕在线观看| 亚洲精品亚洲人成在线导航| 韩国三级aaaaa高清视频| 激情人妻校园春色亚洲欧美| 在线免费观看视频一二区| 黄色视频成年人免费观看| 福利片区一区二体验区| 日辽宁老肥女在线观看视频| 精品一区二区三四区| 亚洲人人妻一区二区三区| 视频 一区二区在线观看| 亚洲男人的天堂a在线| 人人爽亚洲av人人爽av| 国产剧情演绎系列丝袜高跟| 久久尻中国美女视频| av日韩在线免费播放| 亚洲欧美另类手机在线| 一级a看免费观看网站| 国产视频一区二区午夜| 天天做天天干天天操天天射| 色狠狠av线不卡香蕉一区二区| 经典av尤物一区二区| 偷拍自拍亚洲视频在线观看| 伊人开心婷婷国产av| 成人国产小视频在线观看| 狍和女人的王色毛片| 久久精品国产亚洲精品166m| 久久久精品精品视频视频| 乱亲女秽乱长久久久| 伊人成人综合开心网| 888欧美视频在线| 欧美一区二区三区四区性视频| 免费69视频在线看| 国产精品国产三级麻豆| 国产1区,2区,3区| 在线视频这里只有精品自拍| 99re6热在线精品| 国产视频网站一区二区三区| 男人天堂最新地址av| 在线观看的a站 最新| 天天操天天爽天天干| 天天干天天操天天摸天天射| 少妇一区二区三区久久久| 日韩影片一区二区三区不卡免费| 天天操天天干天天插| 国产品国产三级国产普通话三级| 亚洲国产美女一区二区三区软件 | 男人操女人的逼免费视频| 中文字幕国产专区欧美激情| 天天干天天操天天插天天日| 黑人巨大的吊bdsm| 日韩精品二区一区久久| 男女啪啪视频免费在线观看| 国产精品视频男人的天堂| 亚洲最大黄 嗯色 操 啊| 中文字幕免费在线免费| 久久麻豆亚洲精品av| 美女大bxxxx内射| 全国亚洲男人的天堂| 国产精品久久久久网| 日本xx片在线观看| 国内精品在线播放第一页| 中文字幕+中文字幕| 99热这里只有精品中文| 最新国产精品网址在线观看| 天天日天天透天天操| 国产福利在线视频一区| 九色porny九色9l自拍视频| 在线观看国产网站资源| 亚洲精品三级av在线免费观看| 天天干天天操天天摸天天射| 大白屁股精品视频国产| 新97超碰在线观看| 自拍偷区二区三区麻豆| 久久久久久久亚洲午夜综合福利| 水蜜桃一区二区三区在线观看视频| 青草亚洲视频在线观看| 亚洲1区2区3区精华液| 在线观看免费视频网| 人妻素人精油按摩中出| 色婷婷六月亚洲综合香蕉| 超鹏97历史在线观看| 亚洲变态另类色图天堂网| 成人综合亚洲欧美一区| 国产精品一二三不卡带免费视频 | 男生舔女生逼逼视频| 男女第一次视频在线观看| 91久久综合男人天堂| 午夜在线一区二区免费| 亚洲欧美另类手机在线| 黄色片年轻人在线观看| 巨乳人妻日下部加奈被邻居中出| 午夜激情高清在线观看| 欧美日韩v中文在线| 日韩欧美国产一区不卡| 大胸性感美女羞爽操逼毛片| 免费一级特黄特色大片在线观看 | 黄色三级网站免费下载| 一区二区三区精品日本| 日辽宁老肥女在线观看视频| 99精品视频在线观看婷婷| 国产精品人妻66p| 熟女视频一区,二区,三区| 端庄人妻堕落挣扎沉沦| 免费男阳茎伸入女阳道视频| 亚洲va天堂va国产va久| 天堂va蜜桃一区入口| 啪啪啪啪啪啪啪啪av| av手机在线观播放网站| 91传媒一区二区三区| 视频二区在线视频观看| 91国内精品自线在拍白富美| 国产91精品拍在线观看| 亚洲国产精品久久久久久6| 日辽宁老肥女在线观看视频| 91免费观看在线网站| 天天日天天操天天摸天天舔| 2020韩国午夜女主播在线| 2021最新热播中文字幕| 亚洲熟女女同志女同| 国产午夜亚洲精品麻豆| 91精品国产综合久久久蜜| 成年人免费看在线视频| 91精品国产高清自在线看香蕉网| 欧美黄片精彩在线免费观看| 欧美另类一区二区视频| 天天操,天天干,天天射| av中文字幕电影在线看| 久久综合老鸭窝色综合久久| 亚洲伊人久久精品影院一美女洗澡| 麻豆精品成人免费视频| 日本少妇精品免费视频| 熟女人妻在线中出观看完整版| 日本啪啪啪啪啪啪啪| 97人妻夜夜爽二区欧美极品| 国产福利小视频二区| 老师啊太大了啊啊啊尻视频| 日韩a级黄色小视频| 传媒在线播放国产精品一区| 97精品综合久久在线| 色哟哟在线网站入口| 久久久制服丝袜中文字幕| 欧亚乱色一区二区三区| 亚洲国产最大av综合| 98视频精品在线观看| 一区二区三区美女毛片| tube69日本少妇| 国产+亚洲+欧美+另类| 国产精品三级三级三级| av日韩在线观看大全| 美女福利写真在线观看视频| 欧美一区二区三区乱码在线播放| 亚洲偷自拍高清视频| 大肉大捧一进一出好爽在线视频| 日韩精品中文字幕播放| 欧美怡红院视频在线观看| av在线免费中文字幕| 青青青青爽手机在线| 亚洲第一伊人天堂网| 欧美日本aⅴ免费视频| 国产中文字幕四区在线观看| 女生被男生插的视频网站| 天天日天天干天天搡| 亚洲欧洲一区二区在线观看| 成人国产激情自拍三区| 很黄很污很色的午夜网站在线观看| 99热色原网这里只有精品| 清纯美女在线观看国产| 欧美男人大鸡吧插女人视频| 成人动漫大肉棒插进去视频| 大黑人性xxxxbbbb| 最新日韩av传媒在线| 51国产偷自视频在线播放| 青青热久免费精品视频在线观看| 超级av免费观看一区二区三区| 精品亚洲中文字幕av | 日本性感美女写真视频| 人人人妻人人澡人人| 中文字幕第一页国产在线| 在线视频免费观看网| 不卡日韩av在线观看| 日本五十路熟新垣里子| 亚洲天堂av最新网址| 国产 在线 免费 精品| 国产福利小视频二区| 男女啪啪视频免费在线观看| 大鸡巴操b视频在线| 日韩特级黄片高清在线看| 日本乱人一区二区三区| 男人和女人激情视频| 2021年国产精品自拍| 日本高清在线不卡一区二区| 日本五十路熟新垣里子| 国产精品久久久久久久女人18| 综合激情网激情五月五月婷婷| 天天操天天干天天插| 亚洲av男人的天堂你懂的| 精品久久久久久高潮| 国产精品久久9999| 91 亚洲视频在线观看| 在线国产日韩欧美视频| 亚洲免费va在线播放| 天天日天天透天天操| 在线观看视频网站麻豆| av一本二本在线观看| 黑人变态深video特大巨大| 欧美香蕉人妻精品一区二区| 护士特殊服务久久久久久久| 99热国产精品666| 国产片免费观看在线观看| 精品黑人巨大在线一区| 亚洲 欧美 自拍 偷拍 在线| 国产又粗又猛又爽又黄的视频美国| 国产精品中文av在线播放| 色狠狠av线不卡香蕉一区二区| 久久精品国产999| 精品一区二区三区三区88| 亚洲少妇人妻无码精品| 大鸡巴操娇小玲珑的女孩逼| 国产在线免费观看成人| 狠狠嗨日韩综合久久| 欧美精品 日韩国产| 经典av尤物一区二区| 91精品综合久久久久3d动漫| 十八禁在线观看地址免费| 日韩伦理短片在线观看| 亚洲第一伊人天堂网| 国产午夜无码福利在线看| 啪啪啪18禁一区二区三区| 欧美亚洲国产成人免费在线| 人人妻人人爽人人添夜| 亚洲av色图18p| 在线观看视频网站麻豆| 国产黄色片在线收看| 自拍偷区二区三区麻豆| 动漫av网站18禁| 中文字幕日韩精品就在这里| 99热久久这里只有精品| 欧美黄色录像免费看的| 91精品啪在线免费| 看一级特黄a大片日本片黑人| 免费观看污视频网站| 久碰精品少妇中文字幕av| 一区二区三区视频,福利一区二区| 福利视频网久久91| 自拍 日韩 欧美激情| 一区二区三区久久中文字幕| 人妻素人精油按摩中出| 在线视频免费观看网| 日韩美女搞黄视频免费| 精品suv一区二区69| 一本一本久久a久久精品综合不卡| 100%美女蜜桃视频| 精品av国产一区二区三区四区 | 农村胖女人操逼视频| 1769国产精品视频免费观看| 国产熟妇乱妇熟色T区| 性感美女高潮视频久久久| 亚洲激情偷拍一区二区| 日本脱亚入欧是指什么| 在线观看视频网站麻豆| 婷婷色国产黑丝少妇勾搭AV | 可以在线观看的av中文字幕| 国产福利在线视频一区| 黑人乱偷人妻中文字幕| 极品丝袜一区二区三区| 亚洲高清自偷揄拍自拍| 伊人成人综合开心网| av乱码一区二区三区| 欧美特级特黄a大片免费| 人妻素人精油按摩中出| 最新中文字幕乱码在线| 国产普通话插插视频| 成年人午夜黄片视频资源| 欧美80老妇人性视频| 亚洲人一区二区中文字幕| 国产精品系列在线观看一区二区| 日日夜夜精品一二三| 国产成人精品亚洲男人的天堂| 青青青青青青青青青青草青青 | 男人天堂最新地址av| 综合页自拍视频在线播放| 抽查舔水白紧大视频| 国产伊人免费在线播放| 一区二区三区日韩久久| 日本在线一区二区不卡视频| 午夜久久香蕉电影网| 国产又色又刺激在线视频| av视网站在线观看| 日韩美女综合中文字幕pp| 中文字幕第1页av一天堂网| 国产使劲操在线播放| 人妻少妇一区二区三区蜜桃| 天天操天天爽天天干| 欧美日韩熟女一区二区三区| 精品亚洲中文字幕av| 青青青爽视频在线播放| 青青社区2国产视频| 青青青青青免费视频| 精品亚洲中文字幕av | 中文字幕国产专区欧美激情| 青青草在观免费国产精品| 亚洲欧美综合另类13p| 人人妻人人人操人人人爽| 亚洲 色图 偷拍 欧美| 中文字幕第1页av一天堂网| 青青青视频自偷自拍38碰| 自拍偷拍一区二区三区图片| 国产精品一区二区三区蜜臀av| 99热久久极品热亚洲| 麻豆精品成人免费视频| 日韩一区二区电国产精品| 午夜久久久久久久精品熟女| 亚洲伊人av天堂有码在线| 精品国产亚洲av一淫| 999九九久久久精品| 欧美性感尤物人妻在线免费看| 日韩午夜福利精品试看| 男生用鸡操女生视频动漫| 亚洲av在线观看尤物| lutube在线成人免费看| 91大神福利视频网| 天堂av狠狠操蜜桃| 亚洲福利精品福利精品福利| 亚洲自拍偷拍精品网| 国产伦精品一区二区三区竹菊| 人妻少妇亚洲精品中文字幕| 可以在线观看的av中文字幕| 成人乱码一区二区三区av| 久久h视频在线观看| 在线观看操大逼视频| 久久久久久性虐视频| 在线观看911精品国产| 做爰视频毛片下载蜜桃视频1| 年轻的人妻被夫上司侵犯| 黑人巨大精品欧美视频| 经典国语激情内射视频| 99热久久这里只有精品| 国产精品久久久久网| 动漫黑丝美女的鸡巴| 亚洲国产欧美国产综合在线| 久久精品亚洲成在人线a| 国产露脸对白在线观看| 91高清成人在线视频| 久久这里只有精品热视频| 亚洲精品精品国产综合| 色花堂在线av中文字幕九九| 亚洲公开视频在线观看| 亚洲国产在线精品国偷产拍| 很黄很污很色的午夜网站在线观看| 99人妻视频免费在线| 伊人日日日草夜夜草| av在线免费观看亚洲天堂| 五十路av熟女松本翔子| 99精品免费久久久久久久久a| 青青青青操在线观看免费| 亚洲国产精品中文字幕网站| 国产福利小视频免费观看| 在线不卡成人黄色精品| 国产熟妇人妻ⅹxxxx麻豆| 国产福利小视频免费观看| 日本福利午夜电影在线观看| 国产自拍黄片在线观看| 天天操天天弄天天射| 一区二区三区毛片国产一区| 大香蕉大香蕉大香蕉大香蕉大香蕉| 热99re69精品8在线播放| 中文乱理伦片在线观看| 日本性感美女写真视频| av中文字幕在线观看第三页| 超碰97人人澡人人| 亚洲国产精品中文字幕网站| h国产小视频福利在线观看| 亚洲精品无码色午夜福利理论片| 大香蕉玖玖一区2区| 馒头大胆亚洲一区二区| heyzo蜜桃熟女人妻| 在线观看av2025| 91老师蜜桃臀大屁股| 在线不卡日韩视频播放| 久久h视频在线观看| 自拍偷区二区三区麻豆| 国产刺激激情美女网站| 91大屁股国产一区二区| 一二三中文乱码亚洲乱码one| 亚洲欧美在线视频第一页| 色秀欧美视频第一页| 骚货自慰被发现爆操| 亚洲一级 片内射视正片| 天天操夜夜操天天操天天操| 国产在线拍揄自揄视频网站| 夜色撩人久久7777| 在线观看的a站 最新| 亚洲综合自拍视频一区| 久久久精品精品视频视频| 日韩剧情片电影在线收看| 成人av免费不卡在线观看| 91成人在线观看免费视频| 在线视频这里只有精品自拍| 国产精品亚洲在线观看| 国产高清女主播在线| av高潮迭起在线观看| 在线观看免费av网址大全| 欲满人妻中文字幕在线| 99国内小视频在现欢看| 久久免费看少妇高潮完整版| 亚洲精品久久视频婷婷| 成年女人免费播放视频| 国产chinesehd精品麻豆| 久久尻中国美女视频| 国产一线二线三线的区别在哪| av男人天堂狠狠干| 日日夜夜狠狠干视频| 人人妻人人澡欧美91精品| 亚洲高清国产拍青青草原| 亚洲一区二区久久久人妻| 色综合久久无码中文字幕波多| 国产av国片精品一区二区| 99精品视频在线观看婷婷| 天天躁日日躁狠狠躁躁欧美av | 在线观看av亚洲情色| 亚洲日产av一区二区在线| 夜夜操,天天操,狠狠操| 91人妻人人做人人爽在线| 成年女人免费播放视频| 日本熟妇一区二区x x| 超级福利视频在线观看| 边摸边做超爽毛片18禁色戒| 99精品国产aⅴ在线观看| 人妻少妇亚洲一区二区| 免费成人av中文字幕| 黄网十四区丁香社区激情五月天 | 任我爽精品视频在线播放| 午夜在线观看岛国av,com| 18禁无翼鸟成人在线| 男人操女人的逼免费视频| 最近中文字幕国产在线| 精品国产乱码一区二区三区乱| 成人蜜桃美臀九一一区二区三区| 中文字幕第三十八页久久| 人妻熟女在线一区二区| 在线播放 日韩 av| 午夜激情久久不卡一区二区 | 久久精品国产999| 成人影片高清在线观看| 中文字幕一区二区三区人妻大片 | 人妻av无码专区久久绿巨人| 中文字幕第1页av一天堂网| 亚洲成a人片777777| 免费一级特黄特色大片在线观看| av俺也去在线播放| 青青尤物在线观看视频网站| 成人免费公开视频无毒 | 中英文字幕av一区| 色综合久久无码中文字幕波多| 亚洲免费在线视频网站| av中文字幕福利网| 日韩欧美国产一区不卡| 中文字幕一区二区自拍| 在线成人日韩av电影| 绝色少妇高潮3在线观看| 人妻丝袜精品中文字幕| 熟女在线视频一区二区三区| 亚洲精品ww久久久久久| 亚洲av无码成人精品区辽| 青草亚洲视频在线观看| 中文字幕在线观看国产片| 久久亚洲天堂中文对白| 国产妇女自拍区在线观看| 欧美日韩亚洲国产无线码| 亚洲一级av大片免费观看| 精品首页在线观看视频| 91精品啪在线免费| 亚洲福利精品福利精品福利| 成人sm视频在线观看| 色伦色伦777国产精品| 国产精选一区在线播放| 日韩中文字幕在线播放第二页 | 日本韩国免费福利精品| 欧美一区二区三区乱码在线播放| 亚洲欧美综合另类13p| 91综合久久亚洲综合| 欧美天堂av无线av欧美| 三级黄色亚洲成人av| av一区二区三区人妻| 天天操夜夜骑日日摸| 99久久久无码国产精品性出奶水 | 亚洲免费福利一区二区三区| 日本精品一区二区三区在线视频。| 欧美aa一级一区三区四区| 成年人中文字幕在线观看| www天堂在线久久| 国产综合高清在线观看| ka0ri在线视频| 成人免费做爰高潮视频| 亚洲天堂有码中文字幕视频| 亚洲av无乱一区二区三区性色| 成年午夜影片国产片| 成人网18免费视频版国产| 都市家庭人妻激情自拍视频| 欧美亚洲一二三区蜜臀| 欧美日韩人妻久久精品高清国产| 青娱乐极品视频青青草| 不卡精品视频在线观看| 亚洲天堂第一页中文字幕| 宅男噜噜噜666国产| 精品一线二线三线日本| 午夜的视频在线观看| 免费人成黄页网站在线观看国产| 成人18禁网站在线播放| 中国黄片视频一区91| av网站色偷偷婷婷网男人的天堂| 91桃色成人网络在线观看| av网站色偷偷婷婷网男人的天堂| 免费无码人妻日韩精品一区二区| 无码中文字幕波多野不卡| 日日操综合成人av| 天天日天天天天天天天天天天| 国产精品大陆在线2019不卡| 在线观看国产网站资源| 女人精品内射国产99| 国产福利在线视频一区| 亚洲高清国产拍青青草原| 亚洲区欧美区另类最新章节| 精品国产污污免费网站入口自| 777奇米久久精品一区| 亚洲精品福利网站图片| 老师让我插进去69AV| 黄色录像鸡巴插进去| 日韩近亲视频在线观看| 视频一区 视频二区 视频| 国产麻豆剧果冻传媒app| 五月精品丁香久久久久福利社| av中文字幕电影在线看| 夫妻在线观看视频91| 97人妻色免费视频| av手机免费在线观看高潮| 欧美中国日韩久久精品| 日辽宁老肥女在线观看视频| 亚洲1卡2卡三卡4卡在线观看| 日本精品美女在线观看| 国产乱子伦一二三区| 无套猛戳丰满少妇人妻| 91麻豆精品91久久久久同性| 日美女屁股黄邑视频| 亚洲精品中文字幕下载| 毛片一级完整版免费| 欧亚乱色一区二区三区| 热99re69精品8在线播放| 国产日本欧美亚洲精品视| 天天日天天干天天爱| 熟女国产一区亚洲中文字幕| 日本熟妇色熟妇在线观看| 人妻无码中文字幕专区| 91p0rny九色露脸熟女| 青青青青青青青青青青草青青 | 人妻少妇亚洲一区二区| 亚洲综合另类欧美久久| 狠狠躁夜夜躁人人爽天天天天97| 亚洲av无女神免非久久| 黄片三级三级三级在线观看| 亚洲精品一线二线在线观看| 日韩三级电影华丽的外出| 91天堂天天日天天操| 一区二区三区在线视频福利| 99精品亚洲av无码国产另类| 夜夜嗨av蜜臀av| 日韩成人综艺在线播放| 五十路av熟女松本翔子| 插小穴高清无码中文字幕| 欧美精产国品一二三产品区别大吗| 在线免费观看日本片| 九九热99视频在线观看97| 伊人开心婷婷国产av| 亚洲一区二区三区精品乱码| 毛茸茸的大外阴中国视频| 中文字幕无码一区二区免费| 成年人该看的视频黄免费| 大香蕉大香蕉在线看| 日本熟妇一区二区x x| 亚洲激情,偷拍视频| 国产麻豆剧果冻传媒app| 黄片色呦呦视频免费看| 一区二区三区精品日本| 早川濑里奈av黑人番号| 美日韩在线视频免费看| 亚洲老熟妇日本老妇| 2021久久免费视频| 亚洲精品三级av在线免费观看| 亚洲国产香蕉视频在线播放| 六月婷婷激情一区二区三区| 桃色视频在线观看一区二区 | 欧美精品 日韩国产| 97超碰免费在线视频| 中文字幕一区二 区二三区四区| 国产精品黄片免费在线观看| 91精品国产91久久自产久强| 91综合久久亚洲综合| 亚洲一级 片内射视正片| 婷婷久久久综合中文字幕| 99热99re在线播放| 黄色片黄色片wyaa| 亚洲无码一区在线影院| asmr福利视频在线观看| 国产亚洲欧美45p| 亚洲男人让女人爽的视频| 日本免费一级黄色录像| 2018在线福利视频| 中出中文字幕在线观看| 久久精品36亚洲精品束缚| 亚洲av无码成人精品区辽| 啪啪啪18禁一区二区三区| 亚洲精品在线资源站| 亚洲福利午夜久久久精品电影网 | 大香蕉伊人中文字幕| 欧美精产国品一二三产品价格| 欧亚乱色一区二区三区| 熟女91pooyn熟女| 精彩视频99免费在线| 黑人变态深video特大巨大| 91国产资源在线视频| 美女操逼免费短视频下载链接| 久久久久久久久久一区二区三区| 999九九久久久精品| 国产白嫩美女一区二区| 欧美日韩不卡一区不区二区| 黄色资源视频网站日韩| 免费啪啪啪在线观看视频| 国产成人综合一区2区| 99热色原网这里只有精品| yellow在线播放av啊啊啊| 中国产一级黄片免费视频播放| 91人妻人人做人人爽在线| 亚洲人妻30pwc| 亚洲精品国产久久久久久| 亚洲欧美人精品高清| 91人妻精品一区二区在线看| 乱亲女秽乱长久久久| 最新中文字幕免费视频| 中文字幕高清免费在线人妻 | 在线视频这里只有精品自拍| 一区二区三区四区五区性感视频 | 韩国AV无码不卡在线播放| 91超碰青青中文字幕| 啪啪啪啪啪啪啪啪啪啪黄色| 中文字幕人妻av在线观看| 亚洲伊人久久精品影院一美女洗澡| 无码中文字幕波多野不卡| 青青青青青手机视频| 欧美日韩情色在线观看| 亚洲精品三级av在线免费观看| 天堂av在线播放免费| wwwxxx一级黄色片| 精品日产卡一卡二卡国色天香| 日韩激情文学在线视频| 免费费一级特黄真人片| 国产高清97在线观看视频| 日本a级视频老女人| 亚洲精品三级av在线免费观看| 免费观看污视频网站| 天天日夜夜操天天摸| avjpm亚洲伊人久久| 亚洲av日韩精品久久久久久hd| 黑人变态深video特大巨大| 五十路av熟女松本翔子| 不卡一不卡二不卡三| 99国内小视频在现欢看| av线天堂在线观看| yy6080国产在线视频| 欲乱人妻少妇在线视频裸| 免费男阳茎伸入女阳道视频 | 2025年人妻中文字幕乱码在线| 999久久久久999| 日本熟妇色熟妇在线观看| 国产超码片内射在线| 亚洲精品一线二线在线观看| www日韩a级s片av| 欧美日韩亚洲国产无线码| 日韩加勒比东京热二区| 青青热久免费精品视频在线观看| 一区二区视频视频视频| 欧美va亚洲va天堂va| 精品视频一区二区三区四区五区| 亚洲av无硬久久精品蜜桃| 亚洲日本一区二区三区| 午夜福利资源综合激情午夜福利资| 天天摸天天日天天操| 国产一区二区神马久久| 91精品啪在线免费| 久久艹在线观看视频| 在线免费91激情四射| 天堂中文字幕翔田av| 五十路在线观看完整版| 91桃色成人网络在线观看| 亚洲成人av一区久久| 91快播视频在线观看| 成人乱码一区二区三区av| 国产精品中文av在线播放| 91大神福利视频网| 精品国产成人亚洲午夜| 欧美va不卡视频在线观看| 成人亚洲精品国产精品| 天天操天天射天天操天天天| 欧美第一页在线免费观看视频| 免费大片在线观看视频网站| 日噜噜噜夜夜噜噜噜天天噜噜噜| 大屁股肉感人妻中文字幕在线| 绯色av蜜臀vs少妇| 亚洲人妻国产精品综合| 亚洲欧美清纯唯美另类| 亚洲国产在人线放午夜| av在线免费中文字幕| 亚洲在线一区二区欧美| 欧美色呦呦最新网址| 久久一区二区三区人妻欧美| 天堂av中文在线最新版| 亚洲综合乱码一区二区| 日韩av免费观看一区| 九色精品视频在线播放| 天天操天天插天天色| 97精品综合久久在线| 亚洲特黄aaaa片| 神马午夜在线观看视频| 日本xx片在线观看| av大全在线播放免费| 黄色视频成年人免费观看| 色97视频在线播放| 最新黄色av网站在线观看| 国产美女一区在线观看| 一区二区三区蜜臀在线| 国产janese在线播放| 午夜蜜桃一区二区三区| 80电影天堂网官网| 色综合久久久久久久久中文| 久久久久久久精品老熟妇| 国产露脸对白在线观看| 欧美一区二区中文字幕电影| 性色蜜臀av一区二区三区| 最新欧美一二三视频| 亚洲成a人片777777| 最后99天全集在线观看| 国产精选一区在线播放| 人妻少妇一区二区三区蜜桃| 国产在线自在拍91国语自产精品 | 夜女神免费福利视频| 狠狠躁狠狠爱网站视频| 欧美成人综合色在线噜噜| 97香蕉碰碰人妻国产樱花| 大尺度激情四射网站| 天天操天天干天天艹| 免费十精品十国产网站| 啪啪啪啪啪啪啪啪av| 欧美香蕉人妻精品一区二区| 换爱交换乱高清大片| 人人妻人人爱人人草| 亚洲精品无码久久久久不卡| 亚洲中文字幕乱码区| 久草视频在线免播放| 精品一区二区三区三区色爱| 久久永久免费精品人妻专区| 国产美女午夜福利久久| 黄色录像鸡巴插进去| 精产国品久久一二三产区区别| 亚洲免费国产在线日韩| 最新激情中文字幕视频| 成人资源在线观看免费官网| 93精品视频在线观看| 91九色porny国产在线| 视频二区在线视频观看| 国产精品久久综合久久| 丝袜肉丝一区二区三区四区在线| 日韩av中文在线免费观看| 亚洲人妻国产精品综合| 偷青青国产精品青青在线观看 | 少妇高潮一区二区三区| 国产老熟女伦老熟妇ⅹ| 日本乱人一区二区三区| 91精品国产麻豆国产| 国产日韩精品电影7777| 久久久精品国产亚洲AV一| 亚洲精品av在线观看| 9l人妻人人爽人人爽| 午夜精品亚洲精品五月色| 唐人色亚洲av嫩草| 777奇米久久精品一区| 沈阳熟妇28厘米大战黑人| 日本韩国亚洲综合日韩欧美国产| 专门看国产熟妇的网站| 午夜免费体验区在线观看| 日美女屁股黄邑视频| 精品老妇女久久9g国产| av网站色偷偷婷婷网男人的天堂| 亚洲在线观看中文字幕av| 午夜精品一区二区三区更新| 99精品国自产在线人| 亚洲偷自拍高清视频| 成年人黄色片免费网站| 国产福利在线视频一区| 久久久91蜜桃精品ad| 78色精品一区二区三区| 男人和女人激情视频| 操日韩美女视频在线免费看| 日韩加勒比东京热二区| 日日夜夜狠狠干视频| 亚洲乱码中文字幕在线| 亚洲熟妇x久久av久久| 亚洲国产欧美一区二区三区久久| AV无码一区二区三区不卡| 操日韩美女视频在线免费看| 经典av尤物一区二区| 日韩精品中文字幕在线| 日本美女性生活一级片| 日韩伦理短片在线观看| 女同久久精品秋霞网| 一区二区三区美女毛片| 2022国产综合在线干| 岳太深了紧紧的中文字幕| 亚洲人妻av毛片在线| 午夜婷婷在线观看视频| 久久麻豆亚洲精品av| 男人的天堂av日韩亚洲| 亚洲人妻视频在线网| 国产欧美精品不卡在线| 天堂av在线播放免费| 一区二区三区欧美日韩高清播放| 中文字幕一区二区人妻电影冢本| 视频一区二区综合精品| 欧美专区第八页一区在线播放| 欧洲国产成人精品91铁牛tv| 日韩黄色片在线观看网站| 欧美va不卡视频在线观看| 91精品综合久久久久3d动漫| 999九九久久久精品| av在线shipin| 男女之间激情网午夜在线| 中文字幕一区二区三区人妻大片| 99久久超碰人妻国产| 97精品成人一区二区三区| 激情人妻校园春色亚洲欧美| 中文字幕在线视频一区二区三区| 丰满的继坶3中文在线观看| 99热久久这里只有精品8| 一区二区三区国产精选在线播放 | 精品av国产一区二区三区四区| 日本少妇的秘密免费视频| 午夜毛片不卡免费观看视频| 天天操天天干天天插| av老司机亚洲一区二区| 人妻爱爱 中文字幕| 肏插流水妹子在线乐播下载| 国产成人自拍视频播放| 91‖亚洲‖国产熟女| 午夜精品九一唐人麻豆嫩草成人 | 日本熟女精品一区二区三区| 中文字幕AV在线免费看 | 日本高清在线不卡一区二区| AV无码一区二区三区不卡| 在线观看亚洲人成免费网址| 一区二区三区另类在线 | 99热99re在线播放| 午夜蜜桃一区二区三区| 亚洲人妻国产精品综合| 国产欧美精品不卡在线| 日韩国产乱码中文字幕| av高潮迭起在线观看| 丰满少妇人妻xxxxx| 欧美色呦呦最新网址| 国内资源最丰富的网站| 不戴胸罩引我诱的隔壁的人妻| av在线资源中文字幕| 午夜影院在线观看视频羞羞羞| av日韩在线观看大全| yy6080国产在线视频| 骚逼被大屌狂草视频免费看| 国产欧美精品不卡在线| weyvv5国产成人精品的视频| 不卡精品视频在线观看| 91麻豆精品91久久久久同性| 亚洲国产精品中文字幕网站| 97青青青手机在线视频| 亚洲 人妻 激情 中文| mm131美女午夜爽爽爽| 国产亚洲视频在线二区| 欧美熟妇一区二区三区仙踪林| 精品av国产一区二区三区四区| 亚洲精品国产在线电影| 国产美女一区在线观看| 久草极品美女视频在线观看| 欧美专区第八页一区在线播放| 国产精品一区二区三区蜜臀av| 大屁股熟女一区二区三区| 免费成人av中文字幕| aⅴ精产国品一二三产品| 蜜臀av久久久久久久| 日本黄色特一级视频| japanese五十路熟女熟妇| 精品一区二区三区午夜| 欧美成人综合色在线噜噜| 日韩亚洲高清在线观看| 精品人人人妻人人玩日产欧| 国产真实乱子伦a视频| 美女福利视频导航网站| 亚洲午夜精品小视频| 亚洲欧美另类自拍偷拍色图| 青青青青草手机在线视频免费看| 久久精品亚洲成在人线a| 精品视频一区二区三区四区五区| 美洲精品一二三产区区别| 国产品国产三级国产普通话三级| 欧美成人小视频在线免费看| 日本性感美女三级视频| 精品久久久久久高潮| 操的小逼流水的文章| 久久这里只有精彩视频免费| 亚洲精品乱码久久久久久密桃明| 欧美亚洲中文字幕一区二区三区| 开心 色 六月 婷婷| 日本啪啪啪啪啪啪啪| 99热这里只有精品中文| 久久久久久久精品老熟妇| av男人天堂狠狠干| 69精品视频一区二区在线观看| 女生自摸在线观看一区二区三区| 亚洲蜜臀av一区二区三区九色| 天天干天天爱天天色| 精品久久久久久久久久久99| 久久尻中国美女视频| 亚洲精品 日韩电影| 国产精品国产三级国产精东| 中文字幕第三十八页久久| 日韩黄色片在线观看网站| 久久久久久久久久久久久97| 天天日天天爽天天爽| 美女操逼免费短视频下载链接| 久久综合老鸭窝色综合久久| 护士特殊服务久久久久久久| 福利一二三在线视频观看| 宅男噜噜噜666国产| 国产成人午夜精品福利| 亚洲 中文字幕在线 日韩| 亚洲成人三级在线播放| 黄色在线观看免费观看在线| 免费岛国喷水视频在线观看 | 成年午夜影片国产片| 亚洲精品精品国产综合| 3D动漫精品啪啪一区二区下载| 熟女91pooyn熟女| 一级A一级a爰片免费免会员| 久久久噜噜噜久久熟女av| 超碰中文字幕免费观看| 狠狠嗨日韩综合久久| 少妇人妻久久久久视频黄片| 成人在线欧美日韩国产| 欧美va亚洲va天堂va| 欧美 亚洲 另类综合| 国产精品亚洲在线观看| 免费69视频在线看| 精品黑人一区二区三区久久国产| 欧美一区二区三区激情啪啪啪 | 97年大学生大白天操逼| 久久久久91精品推荐99| 果冻传媒av一区二区三区| 日韩美女福利视频网| 婷婷综合蜜桃av在线| 蜜臀成人av在线播放| 黑人解禁人妻叶爱071| 亚洲欧美福利在线观看| 中文字幕亚洲久久久| 2018在线福利视频| 国产精品sm调教视频| 亚洲av黄色在线网站| 日本一二三中文字幕| 99热99re在线播放| 岛国免费大片在线观看| 午夜福利人人妻人人澡人人爽| 午夜久久久久久久99| 日本免费午夜视频网站| 91九色国产熟女一区二区| 人妻久久无码中文成人| av亚洲中文天堂字幕网| 欧美黄色录像免费看的| 日本又色又爽又黄又粗| 天天日夜夜干天天操| 亚洲国产40页第21页| 视频 国产 精品 熟女 | 亚洲综合色在线免费观看| 国产欧美日韩第三页| 40道精品招牌菜特色| 高清成人av一区三区| 中文字幕日韩精品就在这里| 第一福利视频在线观看| 日韩一区二区三区三州| 中文字幕奴隷色的舞台50| 亚洲高清视频在线不卡| 日本免费一级黄色录像| 99国产精品窥熟女精品| 青青在线视频性感少妇和隔壁黑丝| 中文字幕高清在线免费播放| 九色精品视频在线播放| 91国产在线视频免费观看| 亚洲一区av中文字幕在线观看| 亚洲免费av在线视频| 亚洲精品福利网站图片| av高潮迭起在线观看| 免费观看污视频网站| weyvv5国产成人精品的视频| 天天日天天干天天插舔舔| 日韩欧美在线观看不卡一区二区| av大全在线播放免费| 啊啊啊视频试看人妻| 毛片av在线免费看| 啊啊好慢点插舔我逼啊啊啊视频| 100%美女蜜桃视频| 亚洲一区二区久久久人妻| 中文字幕无码一区二区免费| 99精品久久久久久久91蜜桃| 97人妻人人澡爽人人精品| 久久久久久久久久久免费女人| 天天操天天插天天色| 中文字幕 码 在线视频| 一级黄片久久久久久久久| 免费一级特黄特色大片在线观看| 最近中文2019年在线看| 亚洲丝袜老师诱惑在线观看| 精品日产卡一卡二卡国色天香| 精品区一区二区三区四区人妻| 国产亚洲精品视频合集| 国产成人精品一区在线观看| 亚洲欧美综合另类13p| 国产精品视频一区在线播放| 亚洲国产欧美一区二区三区久久| 女同性ⅹxx女同h偷拍| 亚洲第一伊人天堂网| 91免费福利网91麻豆国产精品| 男生舔女生逼逼视频| 福利视频一区二区三区筱慧| 青青青爽视频在线播放| 中国黄色av一级片| 国产高清97在线观看视频| 十八禁在线观看地址免费 | 欧美亚洲一二三区蜜臀| 99精品亚洲av无码国产另类| 狠狠操操操操操操操操操| 北条麻妃肉色丝袜视频| 国产日韩精品电影7777| 在线免费观看av日韩| 一区二区三区四区视频| 夜女神免费福利视频| 久久精品美女免费视频| 亚洲免费成人a v| 国产高清在线观看1区2区| 国产黄色片蝌蚪九色91| 福利国产视频在线观看| 青青青青青手机视频| 亚洲最大黄 嗯色 操 啊| 人妻激情图片视频小说| 国产使劲操在线播放| 可以在线观看的av中文字幕| 男人和女人激情视频| 搡老熟女一区二区在线观看| 成年人午夜黄片视频资源| 丝袜肉丝一区二区三区四区在线 | 国产三级影院在线观看| 日本精品一区二区三区在线视频。 | 精品suv一区二区69| 91色老99久久九九爱精品| 久久精品国产23696| 玩弄人妻熟妇性色av少妇| 国产亚洲视频在线观看| 国产实拍勾搭女技师av在线| 老师让我插进去69AV| 国产一区二区视频观看| 99精品国自产在线人| 51国产偷自视频在线播放| 天天干天天日天天谢综合156| 精品美女在线观看视频在线观看| 亚洲久久午夜av一区二区| 99精品一区二区三区的区| 深田咏美亚洲一区二区| 97香蕉碰碰人妻国产樱花| 午夜的视频在线观看| 亚洲av极品精品在线观看| 亚洲女人的天堂av| 欧美专区第八页一区在线播放| 大香蕉大香蕉在线看| 国产片免费观看在线观看| 国产视频一区二区午夜| 自拍 日韩 欧美激情| 中文字幕AV在线免费看 | 99热99这里精品6国产| japanese五十路熟女熟妇| 超碰公开大香蕉97| 极品丝袜一区二区三区| 欧美亚洲偷拍自拍色图| wwwxxx一级黄色片| 男生用鸡操女生视频动漫| 亚洲成av人无码不卡影片一| 国产自拍黄片在线观看| 91色九色porny| 久久久制服丝袜中文字幕| 亚洲超碰97人人做人人爱| 日韩中文字幕在线播放第二页| 狠狠躁狠狠爱网站视频| 亚洲午夜精品小视频| 亚洲精品一区二区三区老狼| 亚洲激情偷拍一区二区| 久草视频中文字幕在线观看| 国产亚洲国产av网站在线| 久久久久久九九99精品| 亚洲欧美一区二区三区电影| 男生舔女生逼逼的视频| 欧美一区二区三区高清不卡tv| 亚洲精品午夜aaa久久| 无忧传媒在线观看视频| 亚洲粉嫩av一区二区三区| 人妻少妇性色欲欧美日韩| 91老熟女连续高潮对白| 少妇系列一区二区三区视频| 欧美久久久久久三级网| 岳太深了紧紧的中文字幕| 中文字幕 码 在线视频| 天天日天天摸天天爱| 粗大的内捧猛烈进出爽大牛汉子| 91国产在线免费播放| 97精品成人一区二区三区| 91大神福利视频网| 精品91自产拍在线观看一区| 大屁股肉感人妻中文字幕在线| 黄色资源视频网站日韩| 亚洲欧美国产麻豆综合| 综合页自拍视频在线播放| 黄色视频成年人免费观看| 中文字幕日韩精品日本| 都市激情校园春色狠狠| 亚洲欧美激情国产综合久久久| 福利午夜视频在线观看| 91亚洲精品干熟女蜜桃频道 | 美日韩在线视频免费看| 欧美日韩v中文在线| 一级A一级a爰片免费免会员| 久久久久久久久久性潮| 无码国产精品一区二区高潮久久4| 99热色原网这里只有精品| 国产不卡av在线免费| 视频一区 视频二区 视频| av天堂中文免费在线| 免费av岛国天堂网站| 国产大鸡巴大鸡巴操小骚逼小骚逼| 天天想要天天操天天干| 国产+亚洲+欧美+另类| 欧美3p在线观看一区二区三区| 日本啪啪啪啪啪啪啪| 久草视频在线一区二区三区资源站| 66久久久久久久久久久| 国产女孩喷水在线观看| 中文字幕—97超碰网| 69精品视频一区二区在线观看| 日本裸体熟妇区二区欧美| 18禁美女羞羞免费网站| 九九热99视频在线观看97| 精品一区二区亚洲欧美| 91大屁股国产一区二区| 国产精品福利小视频a| 国产一区二区久久久裸臀| 亚洲女人的天堂av| 精品国产污污免费网站入口自| 水蜜桃一区二区三区在线观看视频| 亚洲综合一区成人在线| 日曰摸日日碰夜夜爽歪歪| 国产精彩福利精品视频| 青青草人人妻人人妻| 日韩熟女系列一区二区三区| 18禁污污污app下载| 三上悠亚和黑人665番号| 57pao国产一区二区| 亚洲国产香蕉视频在线播放| 亚洲中文精品人人免费| 天天日天天日天天射天天干 | 狍和女人的王色毛片| 在线免费观看99视频| 一区二区三区精品日本| 91精品国产观看免费| 天堂va蜜桃一区入口| 97国产在线av精品| 超碰在线中文字幕一区二区| 538精品在线观看视频| 成人国产小视频在线观看| 综合页自拍视频在线播放| 亚洲天天干 夜夜操| 日韩激情文学在线视频| 在线免费观看黄页视频| 成人av在线资源网站| 亚洲午夜精品小视频| 99热久久这里只有精品8| 日本男女操逼视频免费看| 亚洲一区二区三区久久受 | 国产高清精品一区二区三区| 女警官打开双腿沦为性奴| 熟女在线视频一区二区三区| 国产精品久久久久久久精品视频| 少妇人妻100系列| 亚洲另类综合一区小说| 啪啪啪啪啪啪啪啪啪啪黄色| 91色九色porny| 男人天堂最新地址av| 天天日天天天天天天天天天天| 亚洲欧美一区二区三区爱爱动图 | 人妻素人精油按摩中出| 久久久久久久久久一区二区三区| 九九热99视频在线观看97| 人人妻人人人操人人人爽| 免费一级特黄特色大片在线观看 | 欧美日韩激情啪啪啪| 丝袜美腿视频诱惑亚洲无| 婷婷五月亚洲综合在线| 亚洲无码一区在线影院| 99re国产在线精品| 99婷婷在线观看视频| 一区二区三区四区视频| 粉嫩欧美美人妻小视频| 亚洲一区久久免费视频| 亚洲免费av在线视频| 欧美黑人与人妻精品| 欧美 亚洲 另类综合| 久久久制服丝袜中文字幕| 天天日天天敢天天干| av中文字幕在线观看第三页| 大香蕉伊人国产在线| 在线免费观看日本伦理| 97成人免费在线观看网站| 沙月文乃人妻侵犯中文字幕在线| 色哟哟国产精品入口| 国产精彩对白一区二区三区| 国产高清在线在线视频| 亚洲色偷偷综合亚洲AV伊人| 中国把吊插入阴蒂的视频| 天天干天天插天天谢| 蜜桃专区一区二区在线观看| 人人超碰国字幕观看97| 3344免费偷拍视频| 亚洲一级美女啪啪啪| 99久久99一区二区三区| 适合午夜一个人看的视频| 最新国产亚洲精品中文在线| 天天日天天做天天日天天做| 午夜极品美女福利视频| 日本裸体熟妇区二区欧美| 青青草人人妻人人妻| 5528327男人天堂| 青青青青爽手机在线| 日韩近亲视频在线观看| 国产欧美日韩第三页| 中文字幕乱码av资源| 大鸡吧插入女阴道黄色片| 国产亚洲视频在线二区| 东游记中文字幕版哪里可以看到| 日美女屁股黄邑视频| 免费看美女脱光衣服的视频| 大肉大捧一进一出好爽在线视频| 高潮喷水在线视频观看| 午夜精品一区二区三区更新| 午夜成午夜成年片在线观看| 亚洲综合一区二区精品久久| 91传媒一区二区三区| 欧美亚洲牲夜夜综合久久| 夜夜嗨av蜜臀av| 粉嫩av懂色av蜜臀av| 在线观看国产免费麻豆| aaa久久久久久久久| 欧美另类重口味极品在线观看| 激情五月婷婷综合色啪| 最新激情中文字幕视频| 亚洲精品av在线观看| avjpm亚洲伊人久久| 国产精品人妻66p| 色吉吉影音天天干天天操| 精品成人午夜免费看| 亚洲欧美人精品高清| 老司机福利精品视频在线| 日韩av免费观看一区| 2021天天色天天干| 夫妻在线观看视频91| 久久久久久性虐视频| 亚洲中文字幕国产日韩| 中文字幕亚洲中文字幕| 午夜国产免费福利av| 国产午夜福利av导航| 国产清纯美女al在线| 91高清成人在线视频| 五十路av熟女松本翔子| 日本成人不卡一区二区| 国产1区,2区,3区| 日日夜夜精品一二三| 国产欧美精品不卡在线| 亚洲av香蕉一区区二区三区犇| 亚洲 清纯 国产com| 亚洲国产精品美女在线观看| 亚洲高清自偷揄拍自拍| 午夜蜜桃一区二区三区| 姐姐的朋友2在线观看中文字幕| 亚洲中文字幕校园春色| 最新黄色av网站在线观看| 国产又粗又硬又大视频| 2020久久躁狠狠躁夜夜躁 | 欧美怡红院视频在线观看| 后入美女人妻高清在线| 最新91精品视频在线| 亚洲特黄aaaa片| 香港一级特黄大片在线播放| 亚洲一区二区人妻av| 99精品免费久久久久久久久a| 日美女屁股黄邑视频| 亚洲成人熟妇一区二区三区| 免费观看国产综合视频| 国产黄网站在线观看播放| 搡老熟女一区二区在线观看| 在线网站你懂得老司机| 国产内射中出在线观看| 激情五月婷婷免费视频| 青青青青视频在线播放| 久草电影免费在线观看| 成人影片高清在线观看| 人妻久久无码中文成人| 成人av在线资源网站| 97精品视频在线观看| 国产+亚洲+欧美+另类| 日韩av熟妇在线观看| 97瑟瑟超碰在线香蕉| 狠狠躁夜夜躁人人爽天天久天啪 | 中文字幕午夜免费福利视频| av日韩在线免费播放| 1024久久国产精品| 男人插女人视频网站| 久久久久久9999久久久久| 国产亚洲成人免费在线观看| 888欧美视频在线| 欧洲黄页网免费观看| aⅴ精产国品一二三产品| 亚洲欧美另类手机在线| 国产精品自拍在线视频| 1区2区3区4区视频在线观看| av天堂中文免费在线| 人妻3p真实偷拍一二区| 888欧美视频在线| 国产精品自拍偷拍a| 小泽玛利亚视频在线观看| 亚洲中文字幕人妻一区| 91成人在线观看免费视频| 欧美亚洲一二三区蜜臀| 国产精品入口麻豆啊啊啊| 不卡精品视频在线观看| 美女操逼免费短视频下载链接| xxx日本hd高清| 521精品视频在线观看| 国产精品精品精品999| 日本精品一区二区三区在线视频。 | 欧美日本国产自视大全| 欧美另类一区二区视频| 亚洲国产40页第21页| 五十路在线观看完整版| 国产精品污污污久久| 亚洲伊人av天堂有码在线| 亚国产成人精品久久久| 欧美亚洲免费视频观看| 亚洲精品久久综合久| 在线 中文字幕 一区| 国产又色又刺激在线视频| 天天干天天搞天天摸| 97精品视频在线观看| 免费看高清av的网站| 亚洲天天干 夜夜操| 美女张开两腿让男人桶av| 国产成人精品av网站| 经典国语激情内射视频| 色综合色综合色综合色| 天天干天天爱天天色| 哥哥姐姐综合激情小说| 亚洲超碰97人人做人人爱| 888欧美视频在线| 人妻少妇av在线观看| 色哟哟国产精品入口| 中文字幕日韩无敌亚洲精品 | 欧美成人综合视频一区二区| 人妻少妇亚洲一区二区| 快插进小逼里大鸡吧视频| 欧洲亚洲欧美日韩综合| 成人性爱在线看四区| 亚洲日本一区二区久久久精品| 99精品免费观看视频| 色秀欧美视频第一页| 中文字幕奴隷色的舞台50| 男生舔女生逼逼的视频| 91超碰青青中文字幕| 欧美亚洲自偷自拍 在线| 夜夜操,天天操,狠狠操| 97精品人妻一区二区三区精品| 日韩北条麻妃一区在线| 另类av十亚洲av| 色综合久久久久久久久中文| 欧美伊人久久大香线蕉综合| 国产内射中出在线观看| 又大又湿又爽又紧A视频| 女生自摸在线观看一区二区三区 | 自拍偷拍亚洲欧美在线视频| 亚洲国产免费av一区二区三区 | 亚洲免费国产在线日韩| 亚洲少妇高潮免费观看| 精品亚洲中文字幕av| caoporm超碰国产| 99久久激情婷婷综合五月天| av天堂加勒比在线| 国产污污污污网站在线| 久久免看30视频口爆视频| 亚洲伊人色一综合网| 自拍偷区二区三区麻豆| 国产麻豆91在线视频| 成人精品视频99第一页| 97国产在线观看高清| 亚洲1卡2卡三卡4卡在线观看 | 中文字幕高清资源站| 大屁股肉感人妻中文字幕在线| 初美沙希中文字幕在线| 亚洲va国产va欧美va在线| 99精品国产aⅴ在线观看| 精彩视频99免费在线| 亚洲精品亚洲人成在线导航 | 天天艹天天干天天操| 国产成人综合一区2区| 国产又色又刺激在线视频| 色爱av一区二区三区| 日韩欧美中文国产在线| 又粗又长 明星操逼小视频| 青青草成人福利电影| 在线国产日韩欧美视频| 一个色综合男人天堂| 亚洲综合在线视频可播放| 国产亚洲成人免费在线观看| 亚洲福利精品视频在线免费观看| 日本少妇高清视频xxxxx| 日韩加勒比东京热二区| aⅴ精产国品一二三产品| 日韩欧美国产精品91| 国产精品伦理片一区二区| 91麻豆精品久久久久| 国产精彩对白一区二区三区| 国产精品污污污久久| 在线播放国产黄色av| 9久在线视频只有精品| 午夜福利资源综合激情午夜福利资 | weyvv5国产成人精品的视频| 男人的天堂av日韩亚洲| 超黄超污网站在线观看| 亚洲在线免费h观看网站| 久久人人做人人妻人人玩精品vr| 欧美久久一区二区伊人| 中文字幕日本人妻中出| av天堂中文免费在线| 亚洲 图片 欧美 图片| 久久机热/这里只有| 色狠狠av线不卡香蕉一区二区| 日本少妇高清视频xxxxx| 在线免费观看欧美小视频| 五十路av熟女松本翔子| 91一区精品在线观看| 777奇米久久精品一区| 亚洲欧洲av天堂综合| 国产精品视频欧美一区二区| 青青操免费日综合视频观看| 中文字幕在线乱码一区二区| 欧美亚洲少妇福利视频| 不卡一区一区三区在线| 欧美精品免费aaaaaa| 性色av一区二区三区久久久| 91免费放福利在线观看| 国产精品熟女久久久久浪潮| 99re久久这里都是精品视频| 精品视频中文字幕在线播放 | 亚洲免费av在线视频| 欧美成人综合视频一区二区 | 国产精品国色综合久久| 精品人妻一二三区久久| 青青青艹视频在线观看| 最新国产亚洲精品中文在线| 免费在线看的黄网站| 91久久国产成人免费网站| 操的小逼流水的文章| 中文字幕在线欧美精品| 日本欧美视频在线观看三区| 丰满的继坶3中文在线观看| 一二三中文乱码亚洲乱码one | 中文字幕在线乱码一区二区| 国产大学生援交正在播放| 国产亚洲四十路五十路| 亚洲欧美清纯唯美另类| 大鸡巴后入爆操大屁股美女| 国产 在线 免费 精品| av天堂中文字幕最新| 最后99天全集在线观看| 护士小嫩嫩又紧又爽20p| 国产一区二区神马久久| 一区二区三区四区视频| 亚洲av日韩精品久久久| 日本黄色三级高清视频| 国产成人无码精品久久久电影| 99精品国产自在现线观看| 啪啪啪啪啪啪啪免费视频| 亚洲欧美激情国产综合久久久| 熟女人妻一区二区精品视频| 99精品一区二区三区的区| 2020韩国午夜女主播在线| 久久久久久九九99精品| 在线观看911精品国产| 国产又粗又硬又大视频| 亚洲精品ww久久久久久| 亚洲蜜臀av一区二区三区九色| 国产日韩一区二区在线看| 国产精品一区二区久久久av| 久久丁香婷婷六月天| 日韩伦理短片在线观看| 18禁精品网站久久| 在线观看免费视频色97| 97少妇精品在线观看| 啪啪啪啪啪啪啪啪啪啪黄色| 欧洲精品第一页欧洲精品亚洲| 欧美国产亚洲中英文字幕| 日本一区精品视频在线观看| 日本午夜久久女同精女女| 亚洲精品无码色午夜福利理论片| 国产综合视频在线看片| 视频一区 视频二区 视频| 日韩欧美中文国产在线| 亚洲精品国产综合久久久久久久久| 日本人竟这样玩学生妹| 亚洲人妻av毛片在线| 亚洲av色香蕉一区二区三区| 欧美xxx成人在线| 日本少妇在线视频大香蕉在线观看| 不卡精品视频在线观看| 欧美黑人性暴力猛交喷水| 91亚洲国产成人精品性色| 亚洲的电影一区二区三区| 人妻少妇亚洲一区二区| 在线免费观看日本伦理| 亚洲国产最大av综合| 亚洲第一黄色在线观看| 一区二区三区另类在线| 偷偷玩弄新婚人妻h视频| 91小伙伴中女熟女高潮| 被大鸡吧操的好舒服视频免费| 在线观看免费视频网| 青草青永久在线视频18| 亚洲欧美成人综合在线观看| 亚洲熟女女同志女同| 日本脱亚入欧是指什么| eeuss鲁片一区二区三区| 春色激情网欧美成人| 2021久久免费视频| 久久久精品国产亚洲AV一| 欧美色呦呦最新网址| 免费成人av中文字幕| 天天日天天舔天天射进去| 亚洲高清免费在线观看视频| 亚洲视频乱码在线观看| 最新国产精品网址在线观看| 国产亚洲国产av网站在线| 色爱av一区二区三区| 久久尻中国美女视频| av中文字幕网址在线| 1区2区3区4区视频在线观看| 色婷婷六月亚洲综合香蕉| 中文字幕人妻三级在线观看| 女同久久精品秋霞网| av在线免费资源站| 亚洲嫩模一区二区三区| 在线免费观看黄页视频| 97国产福利小视频合集| 在线不卡日韩视频播放| 日韩中文字幕在线播放第二页| 国产 在线 免费 精品| 午夜在线精品偷拍一区二| 亚洲福利精品视频在线免费观看| 无忧传媒在线观看视频| 日韩欧美国产一区不卡| 91免费黄片可看视频| 色天天天天射天天舔| 午夜精品一区二区三区4| 日本午夜福利免费视频| 自拍偷拍,中文字幕| 2021年国产精品自拍| 日日夜夜大香蕉伊人| av在线免费观看亚洲天堂| 国产揄拍高清国内精品对白| 成人午夜电影在线观看 久久| 男人靠女人的逼视频| 久久h视频在线观看| 四川五十路熟女av| 久精品人妻一区二区三区| av天堂中文字幕最新| av手机免费在线观看高潮| 亚洲欧美成人综合在线观看| 中文字幕视频一区二区在线观看 | 国产之丝袜脚在线一区二区三区 | 国产精品午夜国产小视频| 亚洲美女美妇久久字幕组| 亚洲福利午夜久久久精品电影网| 狠狠嗨日韩综合久久| 婷婷午夜国产精品久久久| 亚洲精品久久综合久| av男人天堂狠狠干| 欧美男同性恋69视频| 美女张开两腿让男人桶av| 国产之丝袜脚在线一区二区三区| 91国产在线视频免费观看| 日韩北条麻妃一区在线| 岛国一区二区三区视频在线| 成人乱码一区二区三区av| 都市家庭人妻激情自拍视频| 天天操天天爽天天干| 高潮视频在线快速观看国家快速| 自拍 日韩 欧美激情| 好了av中文字幕在线| 性色av一区二区三区久久久| 人妻熟女中文字幕aⅴ在线| 做爰视频毛片下载蜜桃视频1| 国产麻豆91在线视频| 38av一区二区三区| 日本真人性生活视频免费看| 极品粉嫩小泬白浆20p主播| 中国老熟女偷拍第一页| 精品久久久久久久久久久99| 日本少妇在线视频大香蕉在线观看| 91九色porny蝌蚪国产成人| 一个色综合男人天堂| 视频一区二区综合精品| 免费福利av在线一区二区三区| 久久这里只有精彩视频免费| 91快播视频在线观看| 青娱乐蜜桃臀av色| 亚洲欧美自拍另类图片| 日本熟妇一区二区x x| 男女啪啪视频免费在线观看 | 日本xx片在线观看| 在线观看的黄色免费网站| 女同性ⅹxx女同h偷拍| 精品人妻伦一二三区久| 欧美80老妇人性视频| 久久精品在线观看一区二区| 国产精品国产三级国产午| 欧美一区二区三区在线资源| 亚洲精品 欧美日韩| 午夜福利人人妻人人澡人人爽| 国产精品系列在线观看一区二区| 精品av久久久久久久| 欧美精品一二三视频| 98视频精品在线观看| 天天躁日日躁狠狠躁躁欧美av| 999热精品视频在线| av网址在线播放大全| 在线观看av观看av| 98视频精品在线观看| 含骚鸡巴玩逼逼视频| 三级等保密码要求条款| 久久精品在线观看一区二区| 青青操免费日综合视频观看| 又色又爽又黄又刺激av网站| 91久久国产成人免费网站| 老司机深夜免费福利视频在线观看| 久久久久久久99精品| 66久久久久久久久久久| 日韩精品二区一区久久| 国产福利小视频二区| 沈阳熟妇28厘米大战黑人| 亚洲激情av一区二区| 亚洲精品乱码久久久本| 国产揄拍高清国内精品对白| 在线观看欧美黄片一区二区三区 | 9l人妻人人爽人人爽| 国产又大又黄免费观看| 国产精品女邻居小骚货| 亚洲天堂精品久久久| 免费一级特黄特色大片在线观看| 888亚洲欧美国产va在线播放| 欧美精品 日韩国产| 大香蕉日本伊人中文在线| 中文乱理伦片在线观看| 国产精品伦理片一区二区| 天天操天天爽天天干| 亚洲av男人天堂久久| 都市家庭人妻激情自拍视频| 天天日天天透天天操| 中文字幕中文字幕 亚洲国产| 天天做天天干天天舔| 天天干天天爱天天色| 精品国产成人亚洲午夜| 在线免费91激情四射 | 亚洲高清国产自产av| 久草视频在线一区二区三区资源站 | 久草极品美女视频在线观看| 99热99这里精品6国产| av大全在线播放免费| 黄色成年网站午夜在线观看 | 午夜精品一区二区三区4| 亚洲推理片免费看网站| 护士特殊服务久久久久久久| 丝袜长腿第一页在线| 姐姐的朋友2在线观看中文字幕| 又粗又硬又猛又黄免费30| 亚洲 国产 成人 在线| 天堂va蜜桃一区入口| 日本特级片中文字幕| 成人av免费不卡在线观看| 香港一级特黄大片在线播放| 人妻少妇av在线观看| 粉嫩欧美美人妻小视频| 国产av自拍偷拍盛宴| 亚洲最大黄了色网站| 91片黄在线观看喷潮| 免费看国产又粗又猛又爽又黄视频| 婷婷综合亚洲爱久久| 最近的中文字幕在线mv视频| 一级黄色av在线观看| 人妻在线精品录音叫床| 2021天天色天天干| 国产一区成人在线观看视频| 最新91九色国产在线观看| 欧美久久一区二区伊人| 少妇人妻二三区视频| 久久久久久久久久一区二区三区 | 国产午夜亚洲精品不卡在线观看| 综合激情网激情五月五月婷婷| 91国产资源在线视频| 国产日本欧美亚洲精品视| 最新日韩av传媒在线| 热思思国产99re| 2025年人妻中文字幕乱码在线| tube69日本少妇| 国产一区二区神马久久| 亚洲成人情色电影在线观看 | 男人的天堂在线黄色| 国产午夜无码福利在线看| 国产亚州色婷婷久久99精品| 偷拍自拍国产在线视频| 国产一级精品综合av| 中文字幕日韩精品日本| av中文字幕网址在线| 国产精品成久久久久三级蜜臀av| 亚洲av午夜免费观看| 91久久综合男人天堂| aⅴ精产国品一二三产品| 最近中文2019年在线看| 好吊操视频这里只有精品| 大陆胖女人与丈夫操b国语高清| 国产aⅴ一线在线观看| 色综合久久无码中文字幕波多| 欧美日韩中文字幕欧美| 激情色图一区二区三区| 区一区二区三国产中文字幕| 超级碰碰在线视频免费观看| 亚洲欧美一区二区三区电影| AV天堂一区二区免费试看| 亚洲国产成人最新资源| 人妻激情图片视频小说| 天堂资源网av中文字幕| 最新中文字幕免费视频| 日本成人不卡一区二区| 天堂av狠狠操蜜桃| 亚洲午夜福利中文乱码字幕| 亚洲在线免费h观看网站| 伊人精品福利综合导航| 99热久久极品热亚洲| 国产亚洲视频在线二区| 午夜精品一区二区三区城中村| 成人av在线资源网站| 国产亚洲精品欧洲在线观看| 免费大片在线观看视频网站| 国产精品系列在线观看一区二区 | 亚洲av自拍偷拍综合| 国产精品人妻66p| 岛国免费大片在线观看 | 欧美老鸡巴日小嫩逼| 久久国产精品精品美女| 男人靠女人的逼视频| 五月婷婷在线观看视频免费 | 人人妻人人爱人人草| 搡老熟女一区二区在线观看| 亚洲精品午夜久久久久| 18禁美女黄网站色大片下载| 亚洲精品三级av在线免费观看| 久久久91蜜桃精品ad| 一级黄色片夫妻性生活| 91‖亚洲‖国产熟女| 国产揄拍高清国内精品对白| 中文字幕人妻熟女在线电影| 一色桃子人妻一区二区三区| 熟妇一区二区三区高清版| 欧美日韩国产一区二区三区三州| 激情小视频国产在线| 又粗又硬又猛又爽又黄的| 青青青国产片免费观看视频| 99热色原网这里只有精品| 夜夜嗨av蜜臀av| 免费人成黄页网站在线观看国产| 扒开让我视频在线观看| 日本特级片中文字幕| 女人精品内射国产99| 亚洲精品国产综合久久久久久久久 | 日韩成人性色生活片| 亚洲特黄aaaa片| 国产视频在线视频播放| 欧美一区二区三区激情啪啪啪 | 99精品视频在线观看免费播放| 亚洲精品亚洲人成在线导航| huangse网站在线观看| 91精品国产黑色丝袜| 亚洲成人三级在线播放| 人人妻人人爽人人添夜| 国产丰满熟女成人视频| 男人靠女人的逼视频| 在线观看欧美黄片一区二区三区 | 93精品视频在线观看| 18禁免费av网站| 天天操天天干天天插| 成人免费公开视频无毒| 日韩欧美在线观看不卡一区二区| 免费啪啪啪在线观看视频| 一区二区麻豆传媒黄片| 初美沙希中文字幕在线| 亚洲av无女神免非久久| 久久热这里这里只有精品| 欧美日韩人妻久久精品高清国产| 中文字幕1卡1区2区3区| 国产超码片内射在线| 大香蕉玖玖一区2区| 亚洲成人午夜电影在线观看| 亚洲av无码成人精品区辽| 色综合久久无码中文字幕波多| 蜜桃精品久久久一区二区| 75国产综合在线视频| 色综合色综合色综合色| 啊啊好大好爽啊啊操我啊啊视频| 亚洲无线观看国产高清在线| 久久机热/这里只有| rct470中文字幕在线| 97少妇精品在线观看| 欧美视频不卡一区四区| 日本一区精品视频在线观看| 91老师蜜桃臀大屁股| 99热国产精品666| 亚洲成人情色电影在线观看| 日本熟女精品一区二区三区| 黄色大片免费观看网站| 一区二区视频在线观看免费观看 | 人妻熟女在线一区二区| 中文字幕—97超碰网| 中文字幕无码一区二区免费| 91色老99久久九九爱精品| 成人av在线资源网站| 国产成人自拍视频在线免费观看| 久久丁香婷婷六月天| 大胆亚洲av日韩av| 天天干夜夜操天天舔| 国产精品久久久黄网站| 老师让我插进去69AV| 啊慢点鸡巴太大了啊舒服视频| 国产va精品免费观看| 亚洲欧美激情人妻偷拍| 日韩午夜福利精品试看| avjpm亚洲伊人久久| 欧美精品伦理三区四区| 无码国产精品一区二区高潮久久4| 日本一二三中文字幕| 男女啪啪视频免费在线观看| 亚洲一级美女啪啪啪| 老鸭窝日韩精品视频观看| 熟女妇女老妇一二三区| 亚洲精品 日韩电影| 欧美精品资源在线观看| lutube在线成人免费看| 80电影天堂网官网| 黄色男人的天堂视频| 午夜精品福利一区二区三区p | 天天操天天干天天艹| av资源中文字幕在线观看| 国产极品美女久久久久久| 小泽玛利亚视频在线观看| 亚洲在线观看中文字幕av| 欧美精品黑人性xxxx| 中国黄色av一级片| 精品日产卡一卡二卡国色天香| 中字幕人妻熟女人妻a62v网| 亚洲免费va在线播放| 2020中文字幕在线播放| 在线观看操大逼视频| 天天日天天天天天天天天天天| 操日韩美女视频在线免费看| 亚洲熟女久久久36d| 日韩中文字幕福利av| 精品一线二线三线日本| 都市激情校园春色狠狠| 美女大bxxxx内射| 超碰97人人澡人人| 天天日天天干天天插舔舔| 亚洲人妻30pwc| caoporm超碰国产| 日本一区二区三区免费小视频| 日本av熟女在线视频| 久久久91蜜桃精品ad| 国产精品久久久黄网站| 午夜美女少妇福利视频| 欧洲欧美日韩国产在线| 91国产在线视频免费观看| 伊人日日日草夜夜草| 最新91九色国产在线观看| 青青尤物在线观看视频网站| 国产一区av澳门在线观看| 三上悠亚和黑人665番号| 日本韩国在线观看一区二区| 亚国产成人精品久久久| 欧美日本国产自视大全| 视频 一区二区在线观看| 97小视频人妻一区二区| 97国产福利小视频合集| 国产a级毛久久久久精品| 亚洲一区二区三区av网站| 91快播视频在线观看| 亚国产成人精品久久久| av完全免费在线观看av| 2022中文字幕在线| 亚洲天堂有码中文字幕视频 | 91久久综合男人天堂| ka0ri在线视频| 亚洲一级av大片免费观看| 欧美aa一级一区三区四区| 自拍 日韩 欧美激情| 欧美在线偷拍视频免费看| 欧美香蕉人妻精品一区二区| 日韩亚国产欧美三级涩爱| 91自产国产精品视频| 午夜精彩视频免费一区| 亚洲精品国偷自产在线观看蜜桃| 5528327男人天堂| 真实国模和老外性视频| 精品成人午夜免费看| 伊人开心婷婷国产av| 中文字幕在线观看极品视频| 国产精品视频资源在线播放| 伊人综合免费在线视频| 93精品视频在线观看| 日本高清在线不卡一区二区|