国产无遮挡裸体免费直播视频,久久精品国产蜜臀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

最新評論

av破解版在线观看| 在线 中文字幕 一区| 日本裸体熟妇区二区欧美| 中国无遮挡白丝袜二区精品| 亚洲精品av在线观看| 国产欧美日韩第三页| 自拍偷拍vs一区二区三区| 老师啊太大了啊啊啊尻视频| 男人的天堂在线黄色| 一区二区三区四区中文| 亚洲图片偷拍自拍区| 十八禁在线观看地址免费| 18禁美女羞羞免费网站| av天堂中文免费在线| 日本三极片中文字幕| 亚洲免费成人a v| 国产在线91观看免费观看| 亚洲男人让女人爽的视频| 黄色中文字幕在线播放| 精品美女久久久久久| 老鸭窝在线观看一区| 精品一区二区三区欧美| 日本高清成人一区二区三区| 五十路丰满人妻熟妇| 日本最新一二三区不卡在线| 后入美女人妻高清在线| 欧亚日韩一区二区三区观看视频| 美女福利写真在线观看视频| 91‖亚洲‖国产熟女| 福利午夜视频在线观看| 一级黄片大鸡巴插入美女| 亚洲综合一区二区精品久久| 亚洲av成人免费网站| 国产精品国色综合久久| 啊慢点鸡巴太大了啊舒服视频| 97国产精品97久久| 天天操天天操天天碰| 啪啪啪操人视频在线播放| 国产精品精品精品999| 天天干天天操天天扣| 人妻无码中文字幕专区| 亚洲综合乱码一区二区| av在线免费中文字幕| 美味人妻2在线播放| 97人妻无码AV碰碰视频| 特级欧美插插插插插bbbbb| 丰满少妇人妻xxxxx| 青青草成人福利电影| 亚洲av日韩精品久久久| 亚洲精品av在线观看| 欧美日韩一级黄片免费观看| 亚洲自拍偷拍综合色| 欧美专区第八页一区在线播放| 亚洲精品午夜aaa久久| 亚洲午夜高清在线观看| 国产一级精品综合av| 中国熟女@视频91| 国产黄色片在线收看| 四川乱子伦视频国产vip| 精品久久久久久久久久久久人妻| 日韩精品一区二区三区在线播放| 亚洲天天干 夜夜操| 欧美成人综合视频一区二区 | 三级等保密码要求条款| 亚洲欧美清纯唯美另类 | 亚洲熟女久久久36d| 91免费观看国产免费| av无限看熟女人妻另类av| 精品一区二区三区三区88| 欧美日韩一级黄片免费观看| 亚洲人妻av毛片在线| 欧美爆乳肉感大码在线观看| 韩国三级aaaaa高清视频| 99精品免费观看视频| 成人24小时免费视频| 爱有来生高清在线中文字幕| 日本一本午夜在线播放| 在线观看黄色成年人网站| 中国熟女@视频91| 91片黄在线观看喷潮| 99久久激情婷婷综合五月天| 亚洲欧美综合在线探花| 最近中文字幕国产在线| 熟女在线视频一区二区三区| 亚洲嫩模一区二区三区| 亚洲国产欧美国产综合在线| 色天天天天射天天舔| 国产精品黄大片在线播放| 亚洲av黄色在线网站| 精品黑人巨大在线一区| 在线免费观看国产精品黄色| 又黄又刺激的午夜小视频| 免费人成黄页网站在线观看国产 | 一区二区视频视频视频| 欧美中国日韩久久精品| 欧美成人综合色在线噜噜| 青青草人人妻人人妻| 亚洲一级av大片免费观看| 老鸭窝日韩精品视频观看| 亚洲蜜臀av一区二区三区九色| 在线观看操大逼视频| 青草亚洲视频在线观看| 亚洲成人精品女人久久久| 天天日天天操天天摸天天舔 | 日韩精品一区二区三区在线播放| 人妻少妇精品久久久久久| 91超碰青青中文字幕| 岛国黄色大片在线观看| 亚洲成人线上免费视频观看| av无限看熟女人妻另类av| h国产小视频福利在线观看| 白嫩白嫩美女极品国产在线观看| 亚洲精品亚洲人成在线导航| 欧美另类一区二区视频| 真实国模和老外性视频| 激情综合治理六月婷婷| 激情国产小视频在线| av老司机亚洲一区二区| 亚洲美女高潮喷浆视频| 播放日本一区二区三区电影| 五十路老熟女码av| 97青青青手机在线视频| 少妇人妻100系列| 青青青青视频在线播放| 人妻少妇精品久久久久久| 一区二区三区精品日本| 性感美女高潮视频久久久| 搡老熟女一区二区在线观看| 国产成人自拍视频在线免费观看| 视频啪啪啪免费观看| 国产精品成人xxxx| 国产一区二区欧美三区| 亚洲精品麻豆免费在线观看| 黑人大几巴狂插日本少妇| 天天干天天爱天天色| 国产精品人妻一区二区三区网站 | 中文字幕乱码av资源| 91p0rny九色露脸熟女| 不卡一区一区三区在线| 9l人妻人人爽人人爽| 欧美日韩人妻久久精品高清国产| 福利在线视频网址导航| 99婷婷在线观看视频| av新中文天堂在线网址| 亚洲天天干 夜夜操| 欧美天堂av无线av欧美| 中文字幕在线欧美精品| 真实国模和老外性视频| 91精品国产黑色丝袜| 免费看国产又粗又猛又爽又黄视频 | 亚洲一区二区人妻av| 欧美地区一二三专区| 亚洲精品一区二区三区老狼| 亚洲av色香蕉一区二区三区| 午夜成午夜成年片在线观看| 北条麻妃av在线免费观看| 人人超碰国字幕观看97| 沙月文乃人妻侵犯中文字幕在线| 69精品视频一区二区在线观看| 人妻av无码专区久久绿巨人| 极品粉嫩小泬白浆20p主播| 日本一本午夜在线播放| 性感美女诱惑福利视频| av无限看熟女人妻另类av| 成人亚洲精品国产精品 | 在线视频这里只有精品自拍| 国产揄拍高清国内精品对白| 黄色视频成年人免费观看| 涩爱综合久久五月蜜臀| 天天日天天敢天天干| 亚洲天堂有码中文字幕视频| 欧洲亚洲欧美日韩综合| 欧美综合婷婷欧美综合| 日本高清成人一区二区三区| 国产亚洲欧美另类在线观看| 亚洲变态另类色图天堂网| 91亚洲国产成人精品性色| 亚洲激情唯美亚洲激情图片| 经典国语激情内射视频| 天天摸天天亲天天舔天天操天天爽| 日韩人妻xxxxx| 一个人免费在线观看ww视频| 人妻久久久精品69系列| 久久久久五月天丁香社区| 99婷婷在线观看视频| av一区二区三区人妻| 精品黑人一区二区三区久久国产| 亚洲国产最大av综合| 人妻少妇av在线观看| 人妻久久久精品69系列| 国产精品视频欧美一区二区| 黑人大几巴狂插日本少妇| 内射久久久久综合网| 亚洲熟妇久久无码精品| 水蜜桃一区二区三区在线观看视频| 国产精品系列在线观看一区二区| 欧美一区二区三区四区性视频| 亚洲一区二区久久久人妻| 精品一区二区三区午夜| 激情综合治理六月婷婷| 又黄又刺激的午夜小视频| 2022国产精品视频| 午夜精品一区二区三区福利视频| 欧美成人综合色在线噜噜| 又黄又刺激的午夜小视频| 午夜精品在线视频一区| weyvv5国产成人精品的视频| 国产成人一区二区三区电影网站| www久久久久久久久久久| 亚洲国产欧美一区二区丝袜黑人| 桃色视频在线观看一区二区| 小泽玛利亚视频在线观看| 78色精品一区二区三区| 国产精品手机在线看片| 综合激情网激情五月天| 国产成人精品久久二区91| 91大屁股国产一区二区| 国产又粗又硬又大视频| 91色老99久久九九爱精品| 人妻最新视频在线免费观看| 三级等保密码要求条款| av手机免费在线观看高潮| 99av国产精品欲麻豆| www久久久久久久久久久| 欧美精品一二三视频| 日韩av有码中文字幕| 欧美成人精品欧美一级黄色| 大鸡吧插逼逼视频免费看 | 91快播视频在线观看| 天天操夜夜操天天操天天操| 午夜场射精嗯嗯啊啊视频| 亚洲欧美精品综合图片小说| 国产精品久久9999| 岛国一区二区三区视频在线| 丝袜美腿视频诱惑亚洲无| 自拍偷拍亚洲欧美在线视频| 综合一区二区三区蜜臀| 亚洲人妻国产精品综合| 欧亚日韩一区二区三区观看视频| 99久久中文字幕一本人| 天天日天天鲁天天操| 91香蕉成人app下载| 国产精品自拍偷拍a| 国产露脸对白在线观看| 欧美中文字幕一区最新网址| 亚洲av黄色在线网站| 亚洲av无硬久久精品蜜桃| 欧美性感尤物人妻在线免费看| 啪啪啪18禁一区二区三区| 亚洲午夜电影在线观看| 精品久久婷婷免费视频| 一区二区三区日韩久久| 国产一区二区火爆视频| 伊人网中文字幕在线视频| 宅男噜噜噜666免费观看| 日本av熟女在线视频| 日本高清成人一区二区三区| 在线观看亚洲人成免费网址| av视屏免费在线播放| 欧美亚洲一二三区蜜臀| 成人免费做爰高潮视频| 99热这里只有国产精品6| 77久久久久国产精产品| 中文字幕日韩精品日本| 馒头大胆亚洲一区二区| 欧美日韩不卡一区不区二区| 亚洲蜜臀av一区二区三区九色| 视频 国产 精品 熟女 | 欧美亚洲偷拍自拍色图| 在线观看国产网站资源| 中文字母永久播放1区2区3区| 91av精品视频在线| 丝袜美腿视频诱惑亚洲无| 精品人妻每日一部精品| av中文字幕网址在线| 97青青青手机在线视频| 丝袜美腿欧美另类 中文字幕| 日辽宁老肥女在线观看视频| 91国产资源在线视频| rct470中文字幕在线| 四川五十路熟女av| 97国产在线av精品| 亚洲精品福利网站图片| 天堂v男人视频在线观看| 天天摸天天干天天操科普| 亚洲av黄色在线网站| 青青草人人妻人人妻| 国产女孩喷水在线观看| 免费国产性生活视频| xxx日本hd高清| av在线免费观看亚洲天堂| 一区二区在线观看少妇| avjpm亚洲伊人久久| 久久农村老妇乱69系列| 粗大的内捧猛烈进出爽大牛汉子| 亚洲综合自拍视频一区| 亚洲欧美另类自拍偷拍色图| 欧美久久一区二区伊人| 天天日天天干天天爱| 亚洲青青操骚货在线视频| av在线资源中文字幕| 1区2区3区4区视频在线观看| 天天日天天操天天摸天天舔| 亚洲欧美激情中文字幕| 91中文字幕免费在线观看| 天天日天天透天天操| 精品国产在线手机在线| 人人妻人人澡人人爽人人dvl| 天堂av中文在线最新版| 美女少妇亚洲精选av| 欧美精品国产综合久久| 黄片三级三级三级在线观看| 自拍偷拍亚洲另类色图| 青青青青爽手机在线| 2020久久躁狠狠躁夜夜躁| 偷拍自拍亚洲视频在线观看| 中文字幕日韩人妻在线三区| 国产片免费观看在线观看| 摧残蹂躏av一二三区| 精品美女久久久久久| 欧美激情精品在线观看| 老师啊太大了啊啊啊尻视频| 亚洲av日韩精品久久久| 天堂va蜜桃一区入口| 免费手机黄页网址大全| 超碰中文字幕免费观看| 中文字幕高清在线免费播放| 午夜久久久久久久99| 91香蕉成人app下载| 视频一区二区在线免费播放| 青青青爽视频在线播放| 老师让我插进去69AV| 2021最新热播中文字幕| 不卡精品视频在线观看| 欧美日韩激情啪啪啪| 在线亚洲天堂色播av电影| 天天做天天爽夜夜做少妇| 久久精品视频一区二区三区四区| 黑人借宿ntr人妻的沦陷2| 久久www免费人成一看片| 66久久久久久久久久久| 中文字幕网站你懂的| 中文字幕 人妻精品| 日本美女成人在线视频| 99精品亚洲av无码国产另类| 亚洲av在线观看尤物| 成人午夜电影在线观看 久久| 色秀欧美视频第一页| 精品亚洲在线免费观看| 人人在线视频一区二区| 直接观看免费黄网站| 极品丝袜一区二区三区| 精品亚洲在线免费观看| 日本阿v视频在线免费观看| 欧美女同性恋免费a| 男人的天堂av日韩亚洲| 亚洲免费福利一区二区三区| 大鸡吧插逼逼视频免费看| av中文字幕电影在线看| 青青草原色片网站在线观看| 香蕉av影视在线观看| 精品久久久久久久久久中文蒉| avjpm亚洲伊人久久| 91麻豆精品91久久久久同性| 在线观看的a站 最新| 97资源人妻免费在线视频| 国内资源最丰富的网站| 国产欧美精品一区二区高清| 日本真人性生活视频免费看| 欧美黄片精彩在线免费观看| 中文字幕无码一区二区免费| 9国产精品久久久久老师| 日韩成人免费电影二区| 日韩美女福利视频网| 亚洲国产第一页在线观看| 熟女少妇激情五十路| 亚洲va国产va欧美va在线| 欧美日韩精品永久免费网址| 天天日天天爽天天爽| 扒开腿挺进肉嫩小18禁视频| 色97视频在线播放| 精品一区二区三四区| 91社福利《在线观看| 亚洲精品在线资源站| 欧美日本在线视频一区| 性色蜜臀av一区二区三区| 久久久久久99国产精品| 亚洲色偷偷综合亚洲AV伊人| 中文字幕在线免费第一页| 黄色大片男人操女人逼| 欧美一区二区三区高清不卡tv| 国产97在线视频观看| 人妻无码中文字幕专区| 青草亚洲视频在线观看| 亚洲女人的天堂av| 天天干天天插天天谢| 国产精品大陆在线2019不卡| 成人久久精品一区二区三区| 日本一二三区不卡无| 伊人综合aⅴ在线网| 五十路息与子猛烈交尾视频| 亚洲护士一区二区三区| 久久久久久国产精品| 天天日天天鲁天天操| 国产av国片精品一区二区| 成年人黄视频在线观看| 不戴胸罩引我诱的隔壁的人妻| 宅男噜噜噜666国产| 青青青青操在线观看免费| 亚洲欧美一卡二卡三卡| 三级av中文字幕在线观看| 青娱乐最新视频在线| 国产黑丝高跟鞋视频在线播放| 亚洲嫩模一区二区三区| 人妻3p真实偷拍一二区| 最新91精品视频在线| 日本福利午夜电影在线观看| 日韩黄色片在线观看网站| 天天日天天做天天日天天做| 乱亲女秽乱长久久久| 免费无码人妻日韩精品一区二区| 国产黄色a级三级三级三级| 美女福利写真在线观看视频| 青青在线视频性感少妇和隔壁黑丝| 五十路av熟女松本翔子| 午夜在线一区二区免费| 亚洲高清视频在线不卡| av无限看熟女人妻另类av | 欧美熟妇一区二区三区仙踪林| 精品亚洲国产中文自在线| 9国产精品久久久久老师| 天堂va蜜桃一区入口| 93视频一区二区三区| 免费观看丰满少妇做受| 性感美女福利视频网站| 98精产国品一二三产区区别| 国产97视频在线精品| 好了av中文字幕在线| 熟女人妻在线观看视频| jul—619中文字幕在线| 最新中文字幕免费视频| 日韩一个色综合导航| 国产高潮无码喷水AV片在线观看| 国产福利小视频二区| 天天艹天天干天天操| 亚洲国际青青操综合网站| brazzers欧熟精品系列| av无限看熟女人妻另类av| 中文字幕午夜免费福利视频| jiuse91九色视频| 日韩不卡中文在线视频网站| 久久精品久久精品亚洲人| 中文字幕视频一区二区在线观看| 中文字幕亚洲久久久| 欧美黄色录像免费看的| 美女骚逼日出水来了| 青青青青青免费视频| 深田咏美亚洲一区二区| 毛茸茸的大外阴中国视频| av大全在线播放免费| 黄色三级网站免费下载| 老师啊太大了啊啊啊尻视频| 国产白袜脚足J棉袜在线观看| 在线视频免费观看网| 99热碰碰热精品a中文| 又色又爽又黄又刺激av网站| 国产高清精品极品美女| 日本福利午夜电影在线观看| 亚洲欧美综合另类13p| 熟女人妻在线中出观看完整版| 精品久久婷婷免费视频| 国产亚洲四十路五十路| 亚洲特黄aaaa片| 国产女人被做到高潮免费视频 | 亚洲另类伦春色综合小| 免费观看理论片完整版| 888欧美视频在线| 欧美另类一区二区视频| 中文字幕人妻一区二区视频| 色综合久久五月色婷婷综合| 中英文字幕av一区| 欧美精品伦理三区四区| 国产免费av一区二区凹凸四季| 操日韩美女视频在线免费看| 超级碰碰在线视频免费观看| 桃色视频在线观看一区二区 | 一个色综合男人天堂| 大肉大捧一进一出好爽在线视频| sw137 中文字幕 在线| 亚洲精品午夜久久久久| 欧美老妇精品另类不卡片| 男人的网址你懂的亚洲欧洲av| 人妻av无码专区久久绿巨人| 免费观看丰满少妇做受| 宅男噜噜噜666免费观看| 亚洲一区久久免费视频| 青青草国内在线视频精选| 国产精品人妻熟女毛片av久| 久久久久久cao我的性感人妻 | 精品一区二区三区三区88| 亚洲av在线观看尤物| 免费黄色成人午夜在线网站| 在线观看911精品国产| 亚洲一区二区三区精品乱码| 日韩熟女系列一区二区三区| 午夜成午夜成年片在线观看| 日本一区美女福利视频| 欧美viboss性丰满| 国产欧美日韩在线观看不卡| 首之国产AV医生和护士小芳| 人妻自拍视频中国大陆| 97人妻色免费视频| 欧美日本在线视频一区| 老司机午夜精品视频资源| 亚洲国产香蕉视频在线播放| 亚洲另类在线免费观看| 少妇一区二区三区久久久| 人妻素人精油按摩中出| 亚洲 清纯 国产com| 男人的网址你懂的亚洲欧洲av | 91自产国产精品视频| av中文字幕在线观看第三页| 精品国产污污免费网站入口自| 四川乱子伦视频国产vip| 天天日天天玩天天摸| 国产精品国产精品一区二区| 色综合天天综合网国产成人| av在线播放国产不卡| 免费av岛国天堂网站| 国产av自拍偷拍盛宴| av乱码一区二区三区| 日本一二三区不卡无| 国产日韩欧美视频在线导航| 日本人妻精品久久久久久| 亚洲图库另类图片区| 免费十精品十国产网站| 色天天天天射天天舔| 亚洲综合在线视频可播放| 噜噜色噜噜噜久色超碰| 日本少妇精品免费视频| 在线观看成人国产电影| 欧美在线一二三视频| 自拍偷拍亚洲另类色图| 日本熟妇色熟妇在线观看| 一区二区久久成人网| 91精品激情五月婷婷在线| wwwxxx一级黄色片| 蜜桃视频入口久久久| 日曰摸日日碰夜夜爽歪歪| 中文乱理伦片在线观看| 亚洲2021av天堂| 国产一区二区火爆视频| 国产V亚洲V天堂无码欠欠| 国产精品久久9999| 亚洲国产精品久久久久久6| 天天夜天天日天天日| 91高清成人在线视频| 亚洲熟女综合色一区二区三区四区| 日本免费一级黄色录像| 91www一区二区三区| 91精品激情五月婷婷在线| 把腿张开让我插进去视频| 爱有来生高清在线中文字幕| 韩国三级aaaaa高清视频| 中文字幕一区二区三区人妻大片| 午夜久久久久久久精品熟女| 91成人在线观看免费视频| 天天日天天舔天天射进去| 日韩写真福利视频在线观看| 伊人成人综合开心网| 九一传媒制片厂视频在线免费观看 | 欧美激情精品在线观看| 护士小嫩嫩又紧又爽20p| 欧美中国日韩久久精品| 懂色av蜜桃a v| 国产黄网站在线观看播放| 亚洲一级美女啪啪啪| 天天躁日日躁狠狠躁av麻豆| 男人的天堂在线黄色| 特一级特级黄色网片| 亚洲va天堂va国产va久| 日本欧美视频在线观看三区| 大胸性感美女羞爽操逼毛片| 天天日天天操天天摸天天舔| 亚洲精品无码色午夜福利理论片| 美洲精品一二三产区区别 | 日本熟妇一区二区x x| 免费在线黄色观看网站| 亚洲国产成人在线一区| 第一福利视频在线观看| 丝袜美腿欧美另类 中文字幕| av中文字幕网址在线| 大香蕉玖玖一区2区| 粉嫩欧美美人妻小视频| 天天操天天弄天天射| 日日爽天天干夜夜操| 亚洲熟女女同志女同| 成人福利视频免费在线| 国产美女精品福利在线| 天天操天天爽天天干| 天天干夜夜操天天舔| 欧洲黄页网免费观看| 亚洲av人人澡人人爽人人爱| 日日夜夜大香蕉伊人| 丰满熟女午夜福利视频| 天天干天天搞天天摸| 久久麻豆亚洲精品av| 欧美日韩高清午夜蜜桃大香蕉| 国产久久久精品毛片| 一区二区三区四区五区性感视频| 2018最新中文字幕在线观看| 97国产在线av精品| a v欧美一区=区三区| 亚洲福利午夜久久久精品电影网| 亚洲精品成人网久久久久久小说| 无忧传媒在线观看视频| 高潮喷水在线视频观看| 亚洲欧美久久久久久久久| 亚洲精品无码久久久久不卡| 93精品视频在线观看| 亚洲熟女久久久36d| 极品丝袜一区二区三区| 99精品一区二区三区的区| 国产精品人久久久久久| 男女第一次视频在线观看| 红桃av成人在线观看| 亚洲成高清a人片在线观看| 高潮喷水在线视频观看| 一区二区三区激情在线| 成熟丰满熟妇高潮xx×xx| 日本人竟这样玩学生妹| 人人妻人人人操人人人爽| 精品一区二区三区在线观看| 亚洲va欧美va人人爽3p| 欧美激情电影免费在线| 亚洲一区二区人妻av| 中文字幕在线免费第一页| av破解版在线观看| 一色桃子人妻一区二区三区| 91麻豆精品久久久久| 噜噜色噜噜噜久色超碰| 无码国产精品一区二区高潮久久4| 欧美一级色视频美日韩| 亚洲美女高潮喷浆视频| 免费观看理论片完整版| 国产九色91在线视频| 97精品综合久久在线| 中文字幕高清资源站| 成人福利视频免费在线| 日韩欧美国产一区ab| 人人妻人人澡人人爽人人dvl| 亚洲av色图18p| 色综合久久五月色婷婷综合| 成人av电影免费版| 亚洲av第国产精品| 国产亚洲天堂天天一区| 日韩视频一区二区免费观看| 99精品国产自在现线观看| 十八禁在线观看地址免费| 中文字幕av熟女人妻| av网站色偷偷婷婷网男人的天堂| 亚洲国产香蕉视频在线播放| 一区二区三区久久中文字幕| 国产福利小视频二区| 天天做天天干天天舔| 精品一区二区亚洲欧美| 成人高清在线观看视频| 在线观看国产网站资源| 国产精品人妻熟女毛片av久| 密臀av一区在线观看| 美女在线观看日本亚洲一区| 久久农村老妇乱69系列| 天天日天天日天天射天天干| 中国熟女@视频91| 美女视频福利免费看| av完全免费在线观看av| 视频 一区二区在线观看| 黑人借宿ntr人妻的沦陷2| 制丝袜业一区二区三区| 青青热久免费精品视频在线观看| 久久精品国产999| 日本丰满熟妇BBXBBXHD| 日本精品一区二区三区在线视频。 | 亚洲综合另类精品小说| 97人人模人人爽人人喊 | 人妻少妇性色欲欧美日韩| 天天日天天干天天插舔舔| 不卡一区一区三区在线| 四川五十路熟女av| av中文字幕电影在线看| 色花堂在线av中文字幕九九| 国产精品免费不卡av| 九九视频在线精品播放| 狠狠操操操操操操操操操| 欧亚乱色一区二区三区| 最新国产亚洲精品中文在线| 中文字幕之无码色多多| 无码日韩人妻精品久久| 色在线观看视频免费的| 91欧美在线免费观看| 中文字幕免费在线免费| 亚洲国际青青操综合网站| 端庄人妻堕落挣扎沉沦| av一区二区三区人妻| 91破解版永久免费| 直接观看免费黄网站| 日韩一个色综合导航| heyzo蜜桃熟女人妻| av视网站在线观看| 自拍偷拍一区二区三区图片| 国产精品一二三不卡带免费视频| 国产精品视频男人的天堂| 久草视频首页在线观看| 国产女孩喷水在线观看| 2o22av在线视频| 中文字日产幕乱六区蜜桃| 亚洲乱码中文字幕在线| 色综合天天综合网国产成人| 熟女在线视频一区二区三区| 特大黑人巨大xxxx| 亚洲日产av一区二区在线| 免费看国产又粗又猛又爽又黄视频| 少妇人妻二三区视频| 沙月文乃人妻侵犯中文字幕在线 | 国产乱子伦精品视频潮优女| 亚洲中文字幕校园春色| 99久久激情婷婷综合五月天| 3344免费偷拍视频| av一区二区三区人妻| 欧美精产国品一二三产品价格| 99亚洲美女一区二区三区| 亚洲精品在线资源站| 欧美特色aaa大片| 日本最新一二三区不卡在线 | 黑人性生活视频免费看| 加勒比视频在线免费观看| 成人免费公开视频无毒| 免费大片在线观看视频网站| 大胆亚洲av日韩av| 人妻另类专区欧美制服| 国产高清97在线观看视频| 一区二区在线视频中文字幕 | 亚洲av无码成人精品区辽| 欧美性受xx黑人性猛交| 日韩亚国产欧美三级涩爱| 在线免费观看日本片| 美女张开两腿让男人桶av| 福利片区一区二体验区| 偷拍自拍亚洲视频在线观看| 亚洲男人的天堂a在线| aaa久久久久久久久| 男人插女人视频网站| 青青青青青青青青青青草青青 | 国产亚洲欧美另类在线观看| 亚洲公开视频在线观看| 国产精品熟女久久久久浪潮| 精品久久久久久久久久久a√国产| 日本在线不卡免费视频| 久草视频福利在线首页| 免费看美女脱光衣服的视频| 动色av一区二区三区| 99av国产精品欲麻豆| 中国黄色av一级片| 午夜毛片不卡在线看| 亚洲精品av在线观看| 亚洲av日韩精品久久久| 55夜色66夜色国产精品站| 人妻激情图片视频小说| 中文字幕中文字幕人妻| 97精品视频在线观看| 亚洲国产成人av在线一区| 午夜在线精品偷拍一区二| 99热色原网这里只有精品| 免费av岛国天堂网站| 亚洲欧美一卡二卡三卡| 五月天久久激情视频| 日韩美女搞黄视频免费| 大肉大捧一进一出好爽在线视频| 亚洲精品av在线观看| 天天干夜夜操啊啊啊| 日比视频老公慢点好舒服啊| 2021年国产精品自拍| 久久久久91精品推荐99| 黄片色呦呦视频免费看| 午夜久久久久久久99| 欧美日本在线观看一区二区| 超pen在线观看视频公开97| 亚洲区欧美区另类最新章节| 色av色婷婷人妻久久久精品高清 | 国产日本精品久久久久久久| 国产内射中出在线观看| 午夜场射精嗯嗯啊啊视频| 在线观看av观看av| 鸡巴操逼一级黄色气| 中文字幕第一页国产在线| 少妇一区二区三区久久久| 国产精品日韩欧美一区二区| 三级黄色亚洲成人av| 久久久精品精品视频视频| 久久精品久久精品亚洲人| 91麻豆精品久久久久| 性感美女诱惑福利视频| 色97视频在线播放| av视网站在线观看| 日日操综合成人av| wwwxxx一级黄色片| 密臀av一区在线观看| av天堂资源最新版在线看| 在线免费观看av日韩| 啊慢点鸡巴太大了啊舒服视频| 在线观看黄色成年人网站| 国产成人午夜精品福利| 91大神福利视频网| 3D动漫精品啪啪一区二区下载| 欧美天堂av无线av欧美| 天天日天天做天天日天天做| 首之国产AV医生和护士小芳| 超pen在线观看视频公开97| 喷水视频在线观看这里只有精品| 亚洲av第国产精品| 在线观看欧美黄片一区二区三区| 日韩成人免费电影二区| 亚洲一区av中文字幕在线观看| 91亚洲手机在线视频播放| 黄页网视频在线免费观看| 国产精品系列在线观看一区二区| 国产久久久精品毛片| 黄色无码鸡吧操逼视频| 午夜av一区二区三区| 成人sm视频在线观看| 天天干天天日天天谢综合156| 亚洲天堂精品久久久| 中文字幕一区二区自拍| 91色九色porny| 久久这里只有精彩视频免费| 18禁免费av网站| 动漫美女的小穴视频| 欧美成人一二三在线网| 99一区二区在线观看| 制丝袜业一区二区三区| 国产欧美日韩在线观看不卡| 欧美xxx成人在线| 亚洲伊人久久精品影院一美女洗澡 | 88成人免费av网站| 日韩美女综合中文字幕pp| 爆乳骚货内射骚货内射在线| 97超碰最新免费在线观看| 日韩三级黄色片网站| 亚洲av一妻不如妾| 欧洲黄页网免费观看| 黄片色呦呦视频免费看| www骚国产精品视频| av中文字幕网址在线| 在线不卡日韩视频播放| 午夜精品福利一区二区三区p| 91www一区二区三区| 男人的天堂在线黄色| 成人蜜桃美臀九一一区二区三区| 一区二区三区av高清免费| 国产精品欧美日韩区二区 | 亚洲熟妇x久久av久久| 888欧美视频在线| 中文字日产幕乱六区蜜桃| 888欧美视频在线| 91小伙伴中女熟女高潮| 中文字幕在线永久免费播放| 亚洲欧美另类自拍偷拍色图| 精内国产乱码久久久久久 | 97国产精品97久久| 中文字幕一区二区三区蜜月| 久久精品久久精品亚洲人| 久久久久国产成人精品亚洲午夜| 天天日天天干天天爱| 黑人解禁人妻叶爱071| 婷婷六月天中文字幕| av网址在线播放大全| 欧美另类一区二区视频| 午夜精品一区二区三区福利视频| 日本人妻少妇18—xx| 亚洲免费va在线播放| 欧美麻豆av在线播放| 国产乱子伦一二三区| 日本女大学生的黄色小视频| 亚洲综合在线视频可播放| 极品性荡少妇一区二区色欲| 成人高潮aa毛片免费| 国产污污污污网站在线| 好了av中文字幕在线| 青青色国产视频在线| 天天日天天干天天爱| 中文字幕欧美日韩射射一| 欧美一区二区三区乱码在线播放 | av一本二本在线观看| 少妇ww搡性bbb91| 亚洲国产成人在线一区| 黄色片黄色片wyaa| brazzers欧熟精品系列| 农村胖女人操逼视频| 国产一区av澳门在线观看| 亚洲综合一区成人在线| 亚洲另类在线免费观看| 和邻居少妇愉情中文字幕| 一个人免费在线观看ww视频| 韩国男女黄色在线观看| gogo国模私拍视频| 亚洲成高清a人片在线观看| 91超碰青青中文字幕| 天天日天天爽天天爽| 偷拍3456eee| 亚洲欧美国产麻豆综合| 久草视频在线一区二区三区资源站| 久久精品久久精品亚洲人| 一区二区视频视频视频| 成年人午夜黄片视频资源| 国产露脸对白在线观看| 欧美80老妇人性视频| 欧美成人小视频在线免费看| av在线免费观看亚洲天堂| 九九热99视频在线观看97| 黄色资源视频网站日韩| 3344免费偷拍视频| 精品av久久久久久久| 97瑟瑟超碰在线香蕉| 99热99re在线播放| 亚洲国产精品美女在线观看| 久草福利电影在线观看| 91色网站免费在线观看| 亚洲午夜在线视频福利| 国产又粗又硬又大视频| 在线免费观看亚洲精品电影| 国产熟妇乱妇熟色T区| 久久久久久性虐视频| 欧美亚洲少妇福利视频| 岳太深了紧紧的中文字幕| 国产成人自拍视频在线免费观看| 亚洲va天堂va国产va久| 亚洲福利精品视频在线免费观看 | 国产亚洲国产av网站在线| 最近中文字幕国产在线| 日本高清成人一区二区三区| 亚洲午夜电影之麻豆| 美女吃鸡巴操逼高潮视频| 国产午夜亚洲精品麻豆| 天天想要天天操天天干| 色综合天天综合网国产成人| 国产视频精品资源网站| 在线观看亚洲人成免费网址| 人妻少妇中文有码精品| 精内国产乱码久久久久久| 欧美精品激情在线最新观看视频| 午夜精彩视频免费一区| 国产精品黄片免费在线观看| 91试看福利一分钟| rct470中文字幕在线| 喷水视频在线观看这里只有精品| 伊人综合aⅴ在线网| 中字幕人妻熟女人妻a62v网| 亚洲嫩模一区二区三区| 99热色原网这里只有精品| 国产又粗又黄又硬又爽| 天天想要天天操天天干| 国产一区二区久久久裸臀| 91色网站免费在线观看| 大香蕉福利在线观看| 午夜91一区二区三区| 成人30分钟免费视频| 青青青青草手机在线视频免费看| 国产一区二区欧美三区| 9国产精品久久久久老师 | 免费在线福利小视频| 午夜免费体验区在线观看| 青青在线视频性感少妇和隔壁黑丝| 性色av一区二区三区久久久| 黄色成人在线中文字幕| 日本后入视频在线观看| 欧美精品久久久久久影院| 福利在线视频网址导航| 少妇与子乱在线观看| 亚洲人妻av毛片在线| 爆乳骚货内射骚货内射在线| 日韩欧美在线观看不卡一区二区 | 青青青青青青草国产| 婷婷六月天中文字幕| 2022天天干天天操| 在线不卡成人黄色精品| 成年人黄视频在线观看| 亚洲最大免费在线观看| 亚洲图库另类图片区| 欧美精品中文字幕久久二区| 亚洲精品在线资源站| 顶级尤物粉嫩小尤物网站| av成人在线观看一区| 久久久久国产成人精品亚洲午夜| 欧美亚洲牲夜夜综合久久| 好吊视频—区二区三区| 粉嫩小穴流水视频在线观看| 天天日天天干天天插舔舔| 性生活第二下硬不起来| 中文字幕—97超碰网| 精品美女福利在线观看| japanese五十路熟女熟妇| 91成人精品亚洲国产| 在线 中文字幕 一区| caoporn蜜桃视频| 日本美女成人在线视频| 4个黑人操素人视频网站精品91| 中文字幕,亚洲人妻| 天天干天天插天天谢| 亚洲精品av在线观看| 青青青激情在线观看视频| 自拍偷拍日韩欧美一区二区| 欧美精品一二三视频| 夜夜嗨av蜜臀av| 日日夜夜狠狠干视频| 大鸡吧插逼逼视频免费看 | 欧美女同性恋免费a| 久草视频在线免播放| 国产精品熟女久久久久浪潮| 国产熟妇人妻ⅹxxxx麻豆| 青青青视频自偷自拍38碰| 男人天堂色男人av| 免费十精品十国产网站| 亚洲另类综合一区小说| 亚洲高清一区二区三区视频在线| 亚洲人人妻一区二区三区| 免费黄高清无码国产| 啊慢点鸡巴太大了啊舒服视频| 国产午夜福利av导航| 午夜精品亚洲精品五月色| 五色婷婷综合狠狠爱| 午夜精品一区二区三区城中村| 久草视频中文字幕在线观看| 成年人的在线免费视频| 亚洲码av无色中文| 人妻少妇性色欲欧美日韩| 真实国模和老外性视频| 青青青青青青青青青青草青青 | 性欧美日本大妈母与子| 91自产国产精品视频| 日韩美女精品视频在线观看网站| 亚洲午夜伦理视频在线| 日本中文字幕一二区视频| 亚洲高清国产拍青青草原| 久久丁香婷婷六月天| 亚洲午夜伦理视频在线| 国产精品视频资源在线播放| 久久丁香花五月天色婷婷| 快插进小逼里大鸡吧视频| 久草视频首页在线观看| 91试看福利一分钟| 久久三久久三久久三久久| 国产片免费观看在线观看| 亚洲精品ww久久久久久| 人妻丝袜精品中文字幕| 精品av国产一区二区三区四区| 亚洲av男人的天堂你懂的| 可以在线观看的av中文字幕| 日本熟女精品一区二区三区| 亚洲特黄aaaa片| 丝袜肉丝一区二区三区四区在线看| 一区二区视频在线观看视频在线| 鸡巴操逼一级黄色气| 开心 色 六月 婷婷| 一本一本久久a久久精品综合不卡| 人妻另类专区欧美制服| 中文字幕网站你懂的| 动漫美女的小穴视频| 国产真实乱子伦a视频| 好吊视频—区二区三区| 啪啪啪啪啪啪啪啪啪啪黄色| 中文字幕在线观看国产片| 日韩中文字幕福利av| 中文字幕日韩人妻在线三区| 夜女神免费福利视频| 91自产国产精品视频| 国产91精品拍在线观看| 亚洲在线一区二区欧美| 国产欧美精品一区二区高清| 18禁美女黄网站色大片下载| 国产真实乱子伦a视频| 中文字幕亚洲久久久| 欧美一区二区三区激情啪啪啪| 欧美中文字幕一区最新网址| 成人久久精品一区二区三区| 最新日韩av传媒在线| 99精品免费观看视频| 女蜜桃臀紧身瑜伽裤| 国产真实灌醉下药美女av福利| 欧美成人综合色在线噜噜| 成人av免费不卡在线观看| 人妻少妇av在线观看| 都市家庭人妻激情自拍视频| 色秀欧美视频第一页| 在线成人日韩av电影| 动漫av网站18禁| 国产妇女自拍区在线观看| 888欧美视频在线| 美女骚逼日出水来了| 亚洲一区久久免费视频| 久久精品久久精品亚洲人| 在线成人日韩av电影| 欧美麻豆av在线播放| 亚洲一区二区三区久久午夜| 国产性色生活片毛片春晓精品 | 五月天中文字幕内射| 久久一区二区三区人妻欧美| 小泽玛利亚视频在线观看| 不卡日韩av在线观看| 亚洲精品 欧美日韩| v888av在线观看视频| 成人亚洲国产综合精品| 三上悠亚和黑人665番号| 亚洲 图片 欧美 图片| av线天堂在线观看| 日本熟妇一区二区x x| 91精品国产高清自在线看香蕉网 | 91自产国产精品视频| 亚洲av成人网在线观看| 岛国一区二区三区视频在线| 黑人3p华裔熟女普通话| 久久午夜夜伦痒痒想咳嗽P| 55夜色66夜色国产精品站| 日本少妇高清视频xxxxx| 精品黑人一区二区三区久久国产| 国产第一美女一区二区三区四区 | 免费啪啪啪在线观看视频| 干逼又爽又黄又免费的视频| 婷婷色国产黑丝少妇勾搭AV| 亚洲国产美女一区二区三区软件| 日韩不卡中文在线视频网站| 久久美欧人妻少妇一区二区三区| 揄拍成人国产精品免费看视频| brazzers欧熟精品系列| 中文字幕在线乱码一区二区| 精品一区二区三区三区色爱| 成年美女黄网站18禁久久| 国产久久久精品毛片| 国产一区自拍黄视频免费观看| 亚洲图片欧美校园春色| 亚洲免费成人a v| 成人24小时免费视频| 久久www免费人成一看片| 亚洲 国产 成人 在线| 国产不卡av在线免费| 扒开腿挺进肉嫩小18禁视频| 天天日天天干天天搡| 好吊操视频这里只有精品| 国产97视频在线精品| 日本熟女精品一区二区三区| 91‖亚洲‖国产熟女| 熟女国产一区亚洲中文字幕| 天天操天天爽天天干| 亚洲一区二区三区精品视频在线| 黄色视频在线观看高清无码| 最新激情中文字幕视频| 天天综合天天综合天天网| 青青草亚洲国产精品视频| 在线免费观看99视频| 日本特级片中文字幕| 福利视频网久久91| 精品美女福利在线观看| av在线观看网址av| 国产亚洲精品品视频在线| 综合激情网激情五月天| 欧美国产亚洲中英文字幕| 婷婷综合蜜桃av在线| 国产高清在线观看1区2区| 老司机福利精品免费视频一区二区| 夜夜嗨av蜜臀av| 国产麻豆剧传媒精品国产av蜜桃| 精品一区二区三区三区88| 开心 色 六月 婷婷| 老司机免费福利视频网| huangse网站在线观看| 喷水视频在线观看这里只有精品| 日本韩国亚洲综合日韩欧美国产 | 欧美亚洲少妇福利视频| www久久久久久久久久久| 男女之间激情网午夜在线| 97超碰最新免费在线观看| 国产夫妻视频在线观看免费| 国产不卡av在线免费| 91精品国产综合久久久蜜| 又大又湿又爽又紧A视频| 日本裸体熟妇区二区欧美| 国产美女午夜福利久久| 夜夜骑夜夜操夜夜奸| 美女福利视频网址导航| 青青草人人妻人人妻| 男女啪啪视频免费在线观看| 欧美黑人性暴力猛交喷水| 大陆胖女人与丈夫操b国语高清| 日本丰满熟妇大屁股久久| 日韩亚洲高清在线观看| 亚洲成人熟妇一区二区三区| 午夜在线观看一区视频| 成人免费毛片aaaa| 熟女91pooyn熟女| 水蜜桃国产一区二区三区| 色综合久久无码中文字幕波多| 不卡日韩av在线观看| 日本在线一区二区不卡视频| 在线观看av2025| 亚洲日产av一区二区在线| 护士小嫩嫩又紧又爽20p| 国产精品自拍在线视频| 一个色综合男人天堂| 91免费放福利在线观看| 精品亚洲在线免费观看| 国产在线自在拍91国语自产精品| 高清成人av一区三区| 中文字幕奴隷色的舞台50| 国产精品久久久久久久久福交 | 欧美中文字幕一区最新网址| 国产日韩欧美美利坚蜜臀懂色| 日本五十路熟新垣里子| 日本最新一二三区不卡在线| 中文字幕无码一区二区免费| 伊人精品福利综合导航| heyzo蜜桃熟女人妻| 亚洲国产最大av综合| 姐姐的朋友2在线观看中文字幕| av在线shipin| 丰满的子国产在线观看| 欧美一区二区三区激情啪啪啪| 日本韩国亚洲综合日韩欧美国产| 香蕉av影视在线观看| 啊啊好大好爽啊啊操我啊啊视频| av成人在线观看一区| 亚洲欧美精品综合图片小说| 亚洲综合在线观看免费| 欧美亚洲偷拍自拍色图| 亚洲成人线上免费视频观看| 亚洲在线免费h观看网站| 日本女人一级免费片| brazzers欧熟精品系列| 欧美精产国品一二三产品价格| 红杏久久av人妻一区| 天天日天天干天天插舔舔| 性感美女高潮视频久久久| 涩爱综合久久五月蜜臀| 欧美一区二区中文字幕电影 | 国产午夜亚洲精品不卡在线观看| 精品一区二区三区三区色爱| 青青青青草手机在线视频免费看 | 人妻熟女中文字幕aⅴ在线| aaa久久久久久久久| 天天干天天爱天天色| 把腿张开让我插进去视频| 青青草亚洲国产精品视频| aaa久久久久久久久| av老司机亚洲一区二区| 亚洲av无硬久久精品蜜桃| 久久h视频在线观看| 超碰97人人做人人爱| 国产麻豆剧传媒精品国产av蜜桃| 91老熟女连续高潮对白| 超碰97免费人妻麻豆| 久久三久久三久久三久久| 在线观看911精品国产| 美女福利视频网址导航| 国产欧美日韩在线观看不卡| 青娱乐最新视频在线| 中文字幕在线观看国产片| 国产精品福利小视频a| 熟女妇女老妇一二三区| 丰满的子国产在线观看| 男大肉棒猛烈插女免费视频 | 黄色片黄色片wyaa| 亚洲人一区二区中文字幕| 精品黑人一区二区三区久久国产| 偷拍3456eee| 啊啊啊想要被插进去视频| 中出中文字幕在线观看| 最新日韩av传媒在线| 51国产偷自视频在线播放| 福利午夜视频在线观看| 青青色国产视频在线| 中文字幕日韩91人妻在线| 97人妻无码AV碰碰视频| 最近中文字幕国产在线| 一区二区三区另类在线| 亚洲一区二区久久久人妻| 国产精品国产三级国产精东| 亚洲综合另类精品小说| 婷婷六月天中文字幕| 青青青爽视频在线播放| 欧美日本aⅴ免费视频| 视频在线免费观看你懂得| 国产自拍在线观看成人| 少妇与子乱在线观看| 9国产精品久久久久老师| 成年午夜免费无码区| 一区二区三区四区视频| 80电影天堂网官网| 曰本无码人妻丰满熟妇啪啪| 国产午夜亚洲精品不卡在线观看| 国产性色生活片毛片春晓精品 | 日日操夜夜撸天天干| 国产av一区2区3区| 护士特殊服务久久久久久久| 久久久极品久久蜜桃| 2017亚洲男人天堂| 中文字幕日韩91人妻在线| 一级黄色片夫妻性生活| 91片黄在线观看喷潮| 中文字幕+中文字幕| 国产福利在线视频一区| 日韩在线中文字幕色| 夜女神免费福利视频| 成人免费毛片aaaa| 亚洲精品久久视频婷婷| 青青青青操在线观看免费| 欧洲欧美日韩国产在线| 国产露脸对白在线观看| 喷水视频在线观看这里只有精品| 国产黄色大片在线免费播放| 亚洲一区二区三区偷拍女厕91| 亚洲中文字幕人妻一区| 中文字幕在线观看极品视频| 欧美精品中文字幕久久二区| 久草视频中文字幕在线观看| 一区二区三区另类在线| 夫妻在线观看视频91| 4个黑人操素人视频网站精品91 | 亚洲欧美激情人妻偷拍| 免费在线看的黄网站| 91传媒一区二区三区| 日韩欧美一级黄片亚洲| 天天日天天添天天爽| 青草久久视频在线观看| 97精品视频在线观看| 欧美亚洲少妇福利视频| 超级福利视频在线观看| 午夜成午夜成年片在线观看| 精品国产污污免费网站入口自| 熟女人妻在线中出观看完整版| 伊人日日日草夜夜草| 97小视频人妻一区二区| 一个色综合男人天堂| 国产一区二区视频观看| 人妻3p真实偷拍一二区| 国产一区二区火爆视频| 在线观看视频一区麻豆| 国产黄色片在线收看| 一区二区三区另类在线| 少妇深喉口爆吞精韩国| 激情人妻校园春色亚洲欧美| 国产精彩对白一区二区三区| 2022精品久久久久久中文字幕| 人妻凌辱欧美丰满熟妇| 亚洲中文字幕综合小综合| 天天日天天干天天爱| 国产精品伦理片一区二区| 午夜青青草原网在线观看| 国产美女精品福利在线| 韩国爱爱视频中文字幕| tube69日本少妇| 操日韩美女视频在线免费看| 大香蕉伊人中文字幕| 粉嫩av懂色av蜜臀av| 精彩视频99免费在线| 亚洲青青操骚货在线视频| 三级黄色亚洲成人av| 日比视频老公慢点好舒服啊| 在线国产精品一区二区三区| 欧美日韩v中文在线| 国产日韩精品电影7777| 久草电影免费在线观看| www日韩a级s片av| 国产V亚洲V天堂无码欠欠| 亚洲一区自拍高清免费视频| 中文字幕+中文字幕| 99精品视频在线观看婷婷| 国产普通话插插视频| 欧美伊人久久大香线蕉综合| 欧美日韩情色在线观看| 97青青青手机在线视频| 天天操夜夜操天天操天天操| 日本后入视频在线观看| 国产一区av澳门在线观看| 色哟哟在线网站入口| 亚洲蜜臀av一区二区三区九色| 最新中文字幕免费视频| 91精品国产综合久久久蜜 | 大香蕉伊人中文字幕| 99热99这里精品6国产| 欧美3p在线观看一区二区三区| 人妻少妇中文有码精品| 日韩一个色综合导航| 精品久久婷婷免费视频| 日韩中文字幕精品淫| 欧美成人猛片aaaaaaa| 欧美专区第八页一区在线播放 | 天天干天天插天天谢| 欧美成人一二三在线网| 国产97视频在线精品| 色吉吉影音天天干天天操| 精品91自产拍在线观看一区| 国产亚洲天堂天天一区| 黄色成年网站午夜在线观看| 亚洲欧美成人综合在线观看| 中文字幕人妻被公上司喝醉在线 | 日韩中文字幕在线播放第二页| 国产a级毛久久久久精品| 999久久久久999| 99精品视频在线观看婷婷| 亚洲激情唯美亚洲激情图片| 韩国AV无码不卡在线播放 | 视频一区 二区 三区 综合| 欲满人妻中文字幕在线| 丝袜国产专区在线观看| av大全在线播放免费| 在线 中文字幕 一区| 五月天色婷婷在线观看视频免费| 激情国产小视频在线| 天天日天天操天天摸天天舔| 黄色片一级美女黄色片| 亚洲精品高清自拍av| 二区中出在线观看老师| 中文字母永久播放1区2区3区| 亚洲最大黄了色网站| 亚洲 中文 自拍 另类 欧美| 日韩一区二区三区三州| 端庄人妻堕落挣扎沉沦| 97国产在线av精品| 成人免费毛片aaaa| 在线免费观看黄页视频| 制丝袜业一区二区三区| 免费看高清av的网站| 999九九久久久精品| 大香蕉大香蕉在线看| 在线观看日韩激情视频| 国产片免费观看在线观看| 色婷婷久久久久swag精品| 91欧美在线免费观看| 国产精品sm调教视频| 东京干手机福利视频| 专门看国产熟妇的网站| 日韩特级黄片高清在线看| 亚洲第17页国产精品| 美女张开两腿让男人桶av| 在线免费视频 自拍| 99久久超碰人妻国产| 亚洲激情av一区二区| 伊人成人在线综合网| 欧美亚洲中文字幕一区二区三区| 青青青青青操视频在线观看| 亚洲国产精品美女在线观看| 午夜精品亚洲精品五月色| 5528327男人天堂| 日本乱人一区二区三区| 天天艹天天干天天操| 亚洲日本一区二区久久久精品| 亚洲2021av天堂| 亚洲一区二区三区在线高清 | 亚洲中文字幕校园春色| 国产精选一区在线播放| 揄拍成人国产精品免费看视频| 亚洲免费av在线视频| 日韩欧美一级黄片亚洲| 精品一区二区三区三区色爱| 91国偷自产一区二区三区精品| 免费人成黄页网站在线观看国产| 日韩国产乱码中文字幕| 欧亚乱色一区二区三区| 丝袜亚洲另类欧美变态| 操的小逼流水的文章| 国产使劲操在线播放| 大鸡巴操b视频在线| 大屁股熟女一区二区三区| 在线视频国产欧美日韩| 国产精品手机在线看片| 中国熟女@视频91| 少妇高潮无套内谢麻豆| 成人免费做爰高潮视频| 色综合久久久久久久久中文| 国产av福利网址大全| 亚洲青青操骚货在线视频| 自拍偷拍 国产资源| 蜜桃视频17c在线一区二区| 中文字幕视频一区二区在线观看| 91高清成人在线视频| 1区2区3区不卡视频| 国产精品黄页网站视频| 自拍偷拍 国产资源| 久久www免费人成一看片| 亚洲变态另类色图天堂网| 岛国青草视频在线观看| 一级A一级a爰片免费免会员| 国产综合精品久久久久蜜臀| 日本午夜爽爽爽爽爽视频在线观看 | 免费黄页网站4188| 偷拍3456eee| 一区二区久久成人网| 亚洲 欧美 精品 激情 偷拍 | 天天射,天天操,天天说| 自拍偷拍,中文字幕| 韩国三级aaaaa高清视频| 2021最新热播中文字幕| 男生用鸡操女生视频动漫 | 久久久噜噜噜久久熟女av| 天天想要天天操天天干| 亚洲精品ww久久久久久| 国产成人无码精品久久久电影| 亚洲狠狠婷婷综合久久app| 一区二区在线观看少妇| 免费无码人妻日韩精品一区二区| 青青青国产片免费观看视频| 爱爱免费在线观看视频| 美女福利写真在线观看视频| 一级黄片大鸡巴插入美女| 国产精品久久久久久美女校花| 久久这里只有精彩视频免费| 婷婷色中文亚洲网68| 亚洲推理片免费看网站| 超pen在线观看视频公开97| 亚洲成人精品女人久久久| 污污小视频91在线观看| 中文字幕 码 在线视频| 婷婷久久久综合中文字幕| 男生用鸡操女生视频动漫| 亚洲av日韩精品久久久久久hd| 亚洲一区二区激情在线| 绝顶痉挛大潮喷高潮无码 | 天堂av在线官网中文| 国产老熟女伦老熟妇ⅹ| 国产精品精品精品999| 国产久久久精品毛片| 这里只有精品双飞在线播放| 久久久制服丝袜中文字幕| av完全免费在线观看av| 午夜福利人人妻人人澡人人爽| 激情啪啪啪啪一区二区三区| 91九色国产熟女一区二区| 在线观看国产网站资源| 小穴多水久久精品免费看| 青青草成人福利电影| 欧美成人综合色在线噜噜| 99一区二区在线观看| 亚洲av成人免费网站| 在线观看黄色成年人网站 | 在线免费观看日本伦理| 免费男阳茎伸入女阳道视频 | 黑人巨大的吊bdsm| 伊拉克及约旦宣布关闭领空| 亚洲国产在线精品国偷产拍| 可以在线观看的av中文字幕| 护士小嫩嫩又紧又爽20p| 国产欧美精品一区二区高清| 欧美精品免费aaaaaa| 密臀av一区在线观看| 国产精品成人xxxx| 在线观看视频网站麻豆| 91免费黄片可看视频| 久久一区二区三区人妻欧美| 亚洲一区二区久久久人妻| av在线免费观看亚洲天堂| 亚洲综合色在线免费观看| 中国熟女一区二区性xx| 国产又粗又硬又猛的毛片视频| 成年人免费看在线视频| 精品久久久久久久久久久a√国产| 日韩精品一区二区三区在线播放| 久久久久久久久久久免费女人| 国产三级精品三级在线不卡| 成人网18免费视频版国产| 亚洲第17页国产精品| 99精品国产免费久久| 人妻激情图片视频小说| www日韩a级s片av| 国产精品熟女久久久久浪潮| 国产成人一区二区三区电影网站| 亚洲熟妇久久无码精品| 精内国产乱码久久久久久| 桃色视频在线观看一区二区| 亚洲精品 日韩电影| 日本阿v视频在线免费观看| 中文字幕日韩精品日本| 综合激情网激情五月五月婷婷| www,久久久,com| 久久www免费人成一看片| 亚洲女人的天堂av| 日韩在线中文字幕色| 日韩伦理短片在线观看| 青草久久视频在线观看| 在线网站你懂得老司机| 国产中文精品在线观看| 肏插流水妹子在线乐播下载| yellow在线播放av啊啊啊| 欧美亚洲自偷自拍 在线| 亚洲av无硬久久精品蜜桃| 久久精品亚洲成在人线a| 国产精品手机在线看片| 久草视频在线免播放| 自拍偷拍vs一区二区三区| 动漫黑丝美女的鸡巴| 精品美女福利在线观看| 日本三极片视频网站观看| 天堂资源网av中文字幕| 国产亚洲欧美另类在线观看| 一级a看免费观看网站| 大尺度激情四射网站| 亚洲国际青青操综合网站| 伊人网中文字幕在线视频| 成人蜜桃美臀九一一区二区三区| 亚洲 国产 成人 在线| 日韩熟女av天堂系列| 亚洲 欧美 精品 激情 偷拍| 国产熟妇人妻ⅹxxxx麻豆| 日韩不卡中文在线视频网站 | 激情五月婷婷免费视频| 日本乱人一区二区三区| 亚洲美女美妇久久字幕组| 欧美在线偷拍视频免费看| 性色蜜臀av一区二区三区| 激情人妻校园春色亚洲欧美| av在线免费资源站| 日日爽天天干夜夜操| 污污小视频91在线观看| 欧美精品一区二区三区xxxx| 中文字幕中文字幕人妻| 欧美黑人巨大性xxxxx猛交| 韩国一级特黄大片做受| 夜色撩人久久7777| 操人妻嗷嗷叫视频一区二区| 亚洲欧美久久久久久久久| 日韩人妻在线视频免费| 蜜臀成人av在线播放| 毛片一级完整版免费| 天天日天天添天天爽| 大鸡巴操b视频在线| 日本av在线一区二区三区| 亚洲国产欧美一区二区三区…| 久久人人做人人妻人人玩精品vr | 在线不卡成人黄色精品| aⅴ精产国品一二三产品| 乱亲女秽乱长久久久| 亚洲日本一区二区三区| 欧美性感尤物人妻在线免费看| 日韩人妻丝袜中文字幕| 亚洲免费福利一区二区三区| 国产av国片精品一区二区| 日本真人性生活视频免费看| 2012中文字幕在线高清| 婷婷综合亚洲爱久久| 蜜桃专区一区二区在线观看| 欧美一区二区三区久久久aaa| 日韩剧情片电影在线收看| 99久久激情婷婷综合五月天| 日本a级视频老女人| 国产福利在线视频一区| 国产品国产三级国产普通话三级| 蜜桃专区一区二区在线观看| 中文字幕综合一区二区| 国产精品成久久久久三级蜜臀av| 91中文字幕免费在线观看| 精品av久久久久久久| 中文字幕亚洲久久久| 欧亚日韩一区二区三区观看视频 | aiss午夜免费视频| 国产亚洲视频在线二区| 国产变态另类在线观看| 中文字幕高清在线免费播放| 又色又爽又黄的美女裸体| 99视频精品全部15| 岳太深了紧紧的中文字幕| asmr福利视频在线观看| 最新91九色国产在线观看| 中国老熟女偷拍第一页| 欧美男同性恋69视频| 香蕉片在线观看av| 天天插天天狠天天操| 成年人免费看在线视频| 日韩一区二区电国产精品| 亚洲欧美激情国产综合久久久| 狠狠躁夜夜躁人人爽天天久天啪| 水蜜桃国产一区二区三区| 精品国产在线手机在线| 国产成人自拍视频在线免费观看| 免费一级特黄特色大片在线观看 | 2025年人妻中文字幕乱码在线| 曰本无码人妻丰满熟妇啪啪| 色偷偷伊人大杳蕉综合网| 午夜婷婷在线观看视频| 92福利视频午夜1000看| 国产在线观看黄色视频| 国产va在线观看精品| 爱爱免费在线观看视频| 91超碰青青中文字幕| 精品区一区二区三区四区人妻| 天天日天天摸天天爱| 青青草亚洲国产精品视频| 97国产福利小视频合集| 色婷婷综合激情五月免费观看| 性感美女福利视频网站| 99精品国产aⅴ在线观看| 偷青青国产精品青青在线观看| 18禁污污污app下载| 国产精品成人xxxx| 早川濑里奈av黑人番号| 日本性感美女写真视频| 欧美va不卡视频在线观看| 视频一区二区在线免费播放| 成人国产激情自拍三区| 日本美女成人在线视频| 91在线视频在线精品3| 日韩北条麻妃一区在线| 国产精品亚洲在线观看| 日韩av熟妇在线观看| av在线免费资源站| 日韩a级精品一区二区| 日本熟女50视频免费| 成人免费做爰高潮视频| av完全免费在线观看av| 日本熟妇色熟妇在线观看| 国产女人被做到高潮免费视频| free性日本少妇| 动漫av网站18禁| 国产视频网站一区二区三区| 青青草原色片网站在线观看| 日本www中文字幕| 久久国产精品精品美女| 日日操夜夜撸天天干| 天天做天天干天天操天天射| 天天干狠狠干天天操| xxx日本hd高清| 经典亚洲伊人第一页| 五十路丰满人妻熟妇| 午夜极品美女福利视频| 天天夜天天日天天日| 亚洲欧美清纯唯美另类| 天天躁日日躁狠狠躁av麻豆| 97国产在线av精品| 欧美特级特黄a大片免费| 激情色图一区二区三区| 亚洲高清一区二区三区视频在线| 国产91嫩草久久成人在线视频| 亚洲成人激情av在线| 国产视频网站一区二区三区 | 直接能看的国产av| 岛国免费大片在线观看| 91精品国产黑色丝袜| 亚洲一级av无码一级久久精品| 韩国黄色一级二级三级| 日本熟女精品一区二区三区| 免费观看理论片完整版| 91精品国产高清自在线看香蕉网| 亚洲av色香蕉一区二区三区| 日本裸体熟妇区二区欧美| 99婷婷在线观看视频| 亚洲天堂精品久久久| 在线免费观看亚洲精品电影| 最新国产精品拍在线观看| 国产变态另类在线观看| 国产日本欧美亚洲精品视| 国产品国产三级国产普通话三级| 69精品视频一区二区在线观看| 91国内精品久久久久精品一| 美女被肏内射视频网站| 日本免费一级黄色录像| 白白操白白色在线免费视频| 国产精品一二三不卡带免费视频| 成年人免费看在线视频| 狍和女人的王色毛片| 久精品人妻一区二区三区| 免费观看理论片完整版| 欧美精品亚洲精品日韩在线| 国产chinesehd精品麻豆| 日本人妻少妇18—xx| 亚洲欧美一卡二卡三卡| 欧洲欧美日韩国产在线| 日韩精品激情在线观看| 色秀欧美视频第一页| 国产亚州色婷婷久久99精品| 在线观看成人国产电影| 中国老熟女偷拍第一页| 很黄很污很色的午夜网站在线观看| h国产小视频福利在线观看| 扒开腿挺进肉嫩小18禁视频| 九九热99视频在线观看97| 999九九久久久精品| 精品国产高潮中文字幕| 激情小视频国产在线| 天天插天天狠天天操| 天天色天天舔天天射天天爽| 成人精品在线观看视频| 18禁美女羞羞免费网站| 岛国一区二区三区视频在线| 大鸡巴操娇小玲珑的女孩逼| 好吊视频—区二区三区| 成人国产激情自拍三区| 五色婷婷综合狠狠爱| 综合激情网激情五月天| 粉嫩小穴流水视频在线观看| 五月天色婷婷在线观看视频免费| 骚货自慰被发现爆操| 亚洲欧美激情中文字幕| 色综合天天综合网国产成人| 亚洲狠狠婷婷综合久久app| 天天操天天插天天色| mm131美女午夜爽爽爽| 9色在线视频免费观看| 亚洲精品无码久久久久不卡| brazzers欧熟精品系列| 大鸡巴操b视频在线| 欧美色呦呦最新网址| 日韩无码国产精品强奸乱伦| 国产日本欧美亚洲精品视| 91九色porny国产蝌蚪视频| av无限看熟女人妻另类av| 啪啪啪18禁一区二区三区| 亚洲免费va在线播放| 宅男噜噜噜666国产| 午夜91一区二区三区| 久久久久久cao我的性感人妻 | 天天干天天啪天天舔| 97人妻总资源视频| aaa久久久久久久久| 18禁无翼鸟成人在线| 粉嫩av懂色av蜜臀av| 91久久国产成人免费网站| 99av国产精品欲麻豆| www久久久久久久久久久| 99国内精品永久免费视频| 爆乳骚货内射骚货内射在线 | yy96视频在线观看| 国产视频在线视频播放| 青草亚洲视频在线观看| 91久久综合男人天堂| av中文字幕在线观看第三页| 黄色片一级美女黄色片| 日本五十路熟新垣里子| 亚洲中文字幕人妻一区| 亚洲国产成人最新资源| 人妻凌辱欧美丰满熟妇| 97精品人妻一区二区三区精品| 中文字幕 码 在线视频| 天天想要天天操天天干| 精品91高清在线观看| 国产视频网站国产视频| 日本一二三中文字幕| 99精品亚洲av无码国产另类 | 亚洲 中文 自拍 无码| 亚洲自拍偷拍精品网| 日本熟女50视频免费| 国产刺激激情美女网站| 91久久人澡人人添人人爽乱| 一色桃子人妻一区二区三区| 久久精品国产亚洲精品166m| 无码精品一区二区三区人| 大屁股肉感人妻中文字幕在线| 亚洲无码一区在线影院| 国产又粗又硬又大视频| 黄色片一级美女黄色片| 午夜福利人人妻人人澡人人爽| 国产麻豆国语对白露脸剧情 | rct470中文字幕在线| 欧美日韩人妻久久精品高清国产| 黄色视频成年人免费观看| av成人在线观看一区| 亚洲另类图片蜜臀av| 99久久激情婷婷综合五月天| 亚洲天堂第一页中文字幕| 欧美少妇性一区二区三区| av在线观看网址av| 99婷婷在线观看视频| 在线国产日韩欧美视频| 伊人网中文字幕在线视频| 欧美特级特黄a大片免费| 午夜毛片不卡免费观看视频| 中文字幕一区二 区二三区四区 | 午夜精品福利91av| 亚洲熟妇x久久av久久| 国产实拍勾搭女技师av在线| 蜜桃视频17c在线一区二区| 激情人妻校园春色亚洲欧美 | 一区二区三区在线视频福利| 大陆胖女人与丈夫操b国语高清| 亚洲一区二区三区五区| 日本少妇人妻xxxxxhd| 91麻豆精品秘密入口在线观看| 中国把吊插入阴蒂的视频| 懂色av蜜桃a v| 人妻少妇性色欲欧美日韩| 亚洲欧美清纯唯美另类| 黄色片一级美女黄色片| 清纯美女在线观看国产| 欧美黄片精彩在线免费观看| 一区二区三区四区五区性感视频 | 97精品综合久久在线| 岛国免费大片在线观看| 国产一区二区在线欧美| 99热这里只有精品中文| 91p0rny九色露脸熟女| 天天干天天操天天爽天天摸| 国产真实灌醉下药美女av福利| 77久久久久国产精产品| 亚洲av无乱一区二区三区性色| 超碰97免费人妻麻豆| 日本美女成人在线视频| 亚洲图库另类图片区| 亚洲中文字幕综合小综合| 不戴胸罩引我诱的隔壁的人妻| 国产午夜激情福利小视频在线| 亚洲在线免费h观看网站| 精品视频一区二区三区四区五区| 成人av天堂丝袜在线观看| 大肉大捧一进一出好爽在线视频| 欧洲日韩亚洲一区二区三区| 国产a级毛久久久久精品| 亚洲福利午夜久久久精品电影网| 欧美老妇精品另类不卡片| 青青草亚洲国产精品视频| 亚洲第一黄色在线观看| 午夜婷婷在线观看视频| jiujiure精品视频在线| 亚洲精品一线二线在线观看| 午夜美女少妇福利视频| 中文字幕人妻av在线观看 | 一区二区视频在线观看视频在线| 亚洲 欧美 精品 激情 偷拍| 黑人变态深video特大巨大| 伊人情人综合成人久久网小说| 成人免费做爰高潮视频| 丰满的子国产在线观看| 中文字母永久播放1区2区3区| 成人免费公开视频无毒| 老鸭窝在线观看一区| 成人国产激情自拍三区| 亚洲激情,偷拍视频| 人人在线视频一区二区| 亚洲成人激情视频免费观看了| 久久久人妻一区二区| 亚洲伊人色一综合网| 性感美女高潮视频久久久| 久久久极品久久蜜桃| 日韩精品中文字幕在线| 天天干天天爱天天色| 中文字幕av熟女人妻| 欧美日本国产自视大全| 亚洲va天堂va国产va久| 午夜dv内射一区区| 欧美精品资源在线观看| 888亚洲欧美国产va在线播放| 久久精品在线观看一区二区| 强行扒开双腿猛烈进入免费版| 天堂av在线最新版在线| 成人国产激情自拍三区| 精品老妇女久久9g国产| 亚洲天天干 夜夜操| 黄色资源视频网站日韩| 美女大bxxxx内射| 欧美国品一二三产区区别| 又黄又刺激的午夜小视频| 国产美女午夜福利久久| 日本韩国免费一区二区三区视频| 欧美另类一区二区视频| 少妇一区二区三区久久久| 午夜免费观看精品视频| 直接观看免费黄网站| 欧美美女人体视频一区| 99精品国产aⅴ在线观看| 欧美在线精品一区二区三区视频| 国产精品一区二区三区蜜臀av | 成人av天堂丝袜在线观看| 硬鸡巴动态操女人逼视频| 绯色av蜜臀vs少妇| 欧美日本国产自视大全| 天天做天天干天天舔| 老司机福利精品视频在线| 在线免费视频 自拍| 1区2区3区不卡视频| 久久久久久久久久一区二区三区| 亚洲av第国产精品| 2025年人妻中文字幕乱码在线| 亚洲天堂av最新网址| 蜜桃精品久久久一区二区| 初美沙希中文字幕在线| 视频久久久久久久人妻| 亚洲午夜高清在线观看| 五十路人妻熟女av一区二区| 久久久精品999精品日本| 日本av高清免费网站| 97超碰人人搞人人| 精品欧美一区二区vr在线观看| 91在线免费观看成人| 国产av福利网址大全| 日本一二三中文字幕| 亚洲欧美福利在线观看| 久草视频在线一区二区三区资源站| 一个人免费在线观看ww视频 | 影音先锋女人av噜噜色| 热思思国产99re| 99精品国产自在现线观看| 久久尻中国美女视频| 人妻少妇一区二区三区蜜桃| 97人妻总资源视频| 黄色av网站免费在线| 好男人视频在线免费观看网站| 成人激情文学网人妻| 亚洲蜜臀av一区二区三区九色 | 涩涩的视频在线观看视频| 青草久久视频在线观看| 在线观看911精品国产| 一区二区视频视频视频| www日韩毛片av| 激情啪啪啪啪一区二区三区| 啪啪啪啪啪啪啪免费视频| 日韩精品中文字幕播放| 91九色porny国产蝌蚪视频| 精品国产污污免费网站入口自| 亚洲日本一区二区三区 | 午夜在线一区二区免费| 色婷婷久久久久swag精品| 国产性色生活片毛片春晓精品 | 亚洲人妻视频在线网| 中文字幕av第1页中文字幕| 综合激情网激情五月天| 狍和女人的王色毛片| 91精品一区二区三区站长推荐| 999九九久久久精品| 国产精品大陆在线2019不卡| 日韩成人性色生活片| 国产精品一区二区久久久av| 久久久久久久久久久免费女人| 中文字幕在线观看极品视频| 中文字幕 亚洲av| 超级碰碰在线视频免费观看| 最新97国产在线视频| 成人福利视频免费在线| 黑人3p华裔熟女普通话| 亚洲综合一区成人在线| 久久精品在线观看一区二区| 夜色撩人久久7777| 91精品国产综合久久久蜜| 久久农村老妇乱69系列| 被大鸡吧操的好舒服视频免费| 国产妇女自拍区在线观看| 亚洲自拍偷拍综合色| 精品一线二线三线日本| 熟女视频一区,二区,三区| 日本韩国在线观看一区二区| 亚洲人妻av毛片在线| 蜜桃视频入口久久久| 91精品资源免费观看| 激情啪啪啪啪一区二区三区 | av在线资源中文字幕| 日韩特级黄片高清在线看| 在线视频精品你懂的| 激情综合治理六月婷婷| 日本av在线一区二区三区| 国产福利小视频免费观看| 3337p日本欧洲大胆色噜噜| 成人sm视频在线观看| 欧美视频不卡一区四区| 偷偷玩弄新婚人妻h视频| 日韩伦理短片在线观看| 青青尤物在线观看视频网站 | 青青青爽视频在线播放| 亚洲成人熟妇一区二区三区| 色狠狠av线不卡香蕉一区二区| 又粗又长 明星操逼小视频| 国产麻豆乱子伦午夜视频观看| 97年大学生大白天操逼| 最近中文2019年在线看| 中文字幕免费福利视频6| 久久三久久三久久三久久| 少妇人妻100系列| 高潮喷水在线视频观看| 国产黄网站在线观看播放| 国产熟妇一区二区三区av | 国产精品一区二区av国| 香蕉av影视在线观看| 国产精品一二三不卡带免费视频| 含骚鸡巴玩逼逼视频| 在线观看视频网站麻豆| 熟女人妻在线观看视频| 久久久精品欧洲亚洲av| 青青青视频手机在线观看| 好太好爽好想要免费| 青青在线视频性感少妇和隔壁黑丝| 青青青艹视频在线观看| 二区中出在线观看老师 | 偷拍美女一区二区三区| 综合激情网激情五月天| 久久这里只有精品热视频| 免费高清自慰一区二区三区网站| 喷水视频在线观看这里只有精品| 青青草原网站在线观看| 婷婷激情四射在线观看视频| 中国老熟女偷拍第一页| 亚洲熟女女同志女同| 青青青爽视频在线播放| 精品国产污污免费网站入口自 | 91桃色成人网络在线观看| 欧美激情精品在线观看| 免费大片在线观看视频网站| 久久久超爽一二三av| 人人爱人人妻人人澡39| 三级黄色亚洲成人av| 精品成人啪啪18免费蜜臀| 中文字幕av男人天堂| 成年女人免费播放视频| 成年人黄视频在线观看| 日美女屁股黄邑视频| 日日操综合成人av| 国产a级毛久久久久精品| 亚洲国产成人av在线一区| 动漫精品视频在线观看| 天天摸天天亲天天舔天天操天天爽 | 精品久久久久久久久久中文蒉| 成人18禁网站在线播放| 国产精品女邻居小骚货| 日本少妇的秘密免费视频| 蜜桃视频入口久久久| av手机在线免费观看日韩av| 人妻另类专区欧美制服| av中文字幕国产在线观看| 亚洲熟妇无码一区二区三区| 人妻在线精品录音叫床| 最新中文字幕乱码在线| 把腿张开让我插进去视频| 国产剧情演绎系列丝袜高跟| 成人乱码一区二区三区av| 2022精品久久久久久中文字幕| 国产精品亚洲а∨天堂免| 亚洲国产最大av综合| 亚洲图片欧美校园春色| 黄页网视频在线免费观看| 天堂av狠狠操蜜桃| 中文字幕AV在线免费看 | 一区二区视频在线观看视频在线| 国产亚洲视频在线观看| 少妇ww搡性bbb91| 久久免看30视频口爆视频| 欧美亚洲偷拍自拍色图| 喷水视频在线观看这里只有精品 | 久久久久久久亚洲午夜综合福利| 青青社区2国产视频| 国产福利在线视频一区| 免费国产性生活视频| 黄色中文字幕在线播放| 一区二区熟女人妻视频| 视频在线免费观看你懂得| 久久久精品999精品日本| 淫秽激情视频免费观看| 色婷婷六月亚洲综合香蕉| 大肉大捧一进一出好爽在线视频| 天天干天天操天天插天天日| 青青草国内在线视频精选| 伊人成人在线综合网| 亚洲va欧美va人人爽3p| 亚洲一区二区三区久久午夜 | 51精品视频免费在线观看| 老司机免费视频网站在线看| 精品av久久久久久久| 麻豆性色视频在线观看| 欧美熟妇一区二区三区仙踪林| 78色精品一区二区三区| 亚洲一级av大片免费观看| 久久这里有免费精品| 大陆胖女人与丈夫操b国语高清| 男人天堂色男人av| 天天日天天鲁天天操| 日韩激情文学在线视频| 国产在线免费观看成人| 亚洲一区二区三区五区| 国产精品伦理片一区二区| 天天日天天摸天天爱| 精品av国产一区二区三区四区| 99re6热在线精品| 在线国产中文字幕视频| 日韩在线中文字幕色| 天天日天天舔天天射进去| 91精品国产综合久久久蜜| 亚洲欧美日韩视频免费观看| 国产麻豆剧果冻传媒app| 521精品视频在线观看| 日韩在线中文字幕色| 都市家庭人妻激情自拍视频| 中文字幕 亚洲av| 精品av国产一区二区三区四区| 亚洲av极品精品在线观看| 亚洲最大黄了色网站| 一色桃子人妻一区二区三区| 亚洲av色香蕉一区二区三区| 欧美精品 日韩国产| 日曰摸日日碰夜夜爽歪歪| 一区二区三区另类在线| 欧美韩国日本国产亚洲| 色综合久久无码中文字幕波多| 成人福利视频免费在线| 91亚洲国产成人精品性色| 男女第一次视频在线观看| 免费大片在线观看视频网站| 午夜大尺度无码福利视频| 免费费一级特黄真人片| 欧美成一区二区三区四区| 亚洲av男人天堂久久| 9色精品视频在线观看| 久碰精品少妇中文字幕av| 午夜精品久久久久麻豆影视| 亚洲伊人久久精品影院一美女洗澡| 亚洲公开视频在线观看| 国产视频网站一区二区三区| 亚洲综合另类精品小说| 抽查舔水白紧大视频| 日韩美女搞黄视频免费| 精品国产亚洲av一淫| 一个色综合男人天堂| 熟妇一区二区三区高清版| 中文字幕人妻av在线观看| 又黄又刺激的午夜小视频| 国产日韩欧美视频在线导航 | 国产精品久久久久久久久福交| av新中文天堂在线网址| 婷婷六月天中文字幕| 久久久久久国产精品| japanese日本熟妇另类| 自拍偷拍,中文字幕| 一色桃子人妻一区二区三区| 肏插流水妹子在线乐播下载| 国产实拍勾搭女技师av在线| 一区二区三区精品日本| 青青青青青手机视频| 少妇高潮一区二区三区| 亚洲国产欧美一区二区三区久久| 国产a级毛久久久久精品| 一区二区三区久久久91| 四川五十路熟女av| 国产麻豆国语对白露脸剧情| 天堂av在线播放免费| 夜鲁夜鲁狠鲁天天在线| av中文字幕在线观看第三页| 自拍偷拍vs一区二区三区| 亚洲男人的天堂a在线| 亚洲天堂成人在线观看视频网站| 91精品国产91久久自产久强| 国产综合高清在线观看| 成人综合亚洲欧美一区| 九九热99视频在线观看97| 成年午夜影片国产片| 97超碰免费在线视频| 性欧美日本大妈母与子| 夜夜骑夜夜操夜夜奸| 视频一区二区综合精品| 欧美成人综合色在线噜噜| 三级黄色亚洲成人av| 成年人午夜黄片视频资源| av大全在线播放免费| 日韩不卡中文在线视频网站| 午夜成午夜成年片在线观看| 五月激情婷婷久久综合网| 97人人模人人爽人人喊| 93视频一区二区三区| 国产亚洲成人免费在线观看| 在线观看视频 你懂的| 日韩成人综艺在线播放| 青青青青青青青青青青草青青| 在线播放国产黄色av| 国产高清97在线观看视频| 国产视频一区在线观看| 欧美特色aaa大片| 亚洲成人精品女人久久久| 蜜桃久久久久久久人妻| 91 亚洲视频在线观看| 精彩视频99免费在线| 中国视频一区二区三区| www日韩毛片av| 在线制服丝袜中文字幕| 国产超码片内射在线| 视频 一区二区在线观看| 亚洲精品在线资源站| 91色秘乱一区二区三区| 久草福利电影在线观看| 成人免费毛片aaaa| 亚洲综合色在线免费观看| av在线免费观看亚洲天堂| 国产黄色高清资源在线免费观看| 亚洲色偷偷综合亚洲AV伊人| 国产va精品免费观看| 综合色区亚洲熟妇shxstz| 男人靠女人的逼视频| 免费手机黄页网址大全| 欧美视频不卡一区四区| 大鸡吧插入女阴道黄色片| 97精品成人一区二区三区| 中文字幕最新久久久| 欧美精品伦理三区四区| 日本成人一区二区不卡免费在线| 国产妇女自拍区在线观看| 亚洲国产欧美国产综合在线 | 精品高潮呻吟久久av| 午夜精彩视频免费一区| 久久久久久久久久久免费女人| 精品国产乱码一区二区三区乱| 宅男噜噜噜666免费观看| 成年美女黄网站18禁久久| av在线免费中文字幕| 五十路在线观看完整版| 插小穴高清无码中文字幕| 中文字幕网站你懂的| 成人国产影院在线观看| xxx日本hd高清| 粉嫩欧美美人妻小视频| 这里只有精品双飞在线播放| 中文字幕+中文字幕| 精品人人人妻人人玩日产欧| 久草视频福利在线首页| 动漫黑丝美女的鸡巴| 日韩av有码中文字幕| 亚洲精品国品乱码久久久久| 1000部国产精品成人观看视频 | 曰本无码人妻丰满熟妇啪啪| 亚洲 人妻 激情 中文| 男人操女人的逼免费视频| 午夜精彩视频免费一区| 国产黄色a级三级三级三级| 久久久久久久精品老熟妇| 最新国产亚洲精品中文在线| 国产高清精品一区二区三区| 亚洲综合在线视频可播放| 超碰公开大香蕉97| 99精品一区二区三区的区| 果冻传媒av一区二区三区| www久久久久久久久久久| 国产中文字幕四区在线观看| 色97视频在线播放| 丁香花免费在线观看中文字幕| 人人爽亚洲av人人爽av| 美日韩在线视频免费看| 91免费福利网91麻豆国产精品| 美味人妻2在线播放| 欧美交性又色又爽又黄麻豆| 亚洲精品欧美日韩在线播放| 国产午夜男女爽爽爽爽爽视频| 中文字幕在线乱码一区二区| 久久久久久久久久性潮| 国产黄色大片在线免费播放| 97色视频在线观看| 香蕉av影视在线观看| 欧美日韩中文字幕欧美| 女警官打开双腿沦为性奴| 综合精品久久久久97| 视频二区在线视频观看| 日本熟妇一区二区x x| 五十路熟女人妻一区二| 国产真实乱子伦a视频 | 在线观看av观看av| 国产熟妇人妻ⅹxxxx麻豆| 视频一区二区在线免费播放| 男人在床上插女人视频| 日本性感美女视频网站| 中文字幕人妻一区二区视频| 久草视频首页在线观看| 国产黄色高清资源在线免费观看| 青娱乐蜜桃臀av色| 男人的天堂av日韩亚洲| 家庭女教师中文字幕在线播放| 国产亚洲视频在线观看| 天天日天天日天天射天天干| 日韩视频一区二区免费观看| 国产精品系列在线观看一区二区| 国产日韩精品电影7777| 在线观看亚洲人成免费网址| 亚洲精品亚洲人成在线导航| 91she九色精品国产| 欧美精品久久久久久影院| 国产一区av澳门在线观看| 小泽玛利亚视频在线观看| 在线国产精品一区二区三区| 性感美女诱惑福利视频| 色综合久久久久久久久中文| 久久精品国产999| 日韩a级精品一区二区| 美女张开腿让男生操在线看| 国产精品午夜国产小视频| 国产精品自拍视频大全| 国产视频精品资源网站| 成人av亚洲一区二区| 操操网操操伊剧情片中文字幕网| 无码精品一区二区三区人| 国产一区二区视频观看| 国产欧美精品一区二区高清| 天天通天天透天天插| 国产一区成人在线观看视频| 91极品大一女神正在播放| 97黄网站在线观看| 2017亚洲男人天堂| 亚洲人人妻一区二区三区 | 国产夫妻视频在线观看免费| 97黄网站在线观看| 日本美女成人在线视频| 成年人免费看在线视频| 在线观看视频 你懂的| 红杏久久av人妻一区| 亚洲1069综合男同| 亚洲国产在人线放午夜| 青青社区2国产视频| 97人妻色免费视频| 91国内视频在线观看| 精品老妇女久久9g国产| 国产福利小视频大全| tube69日本少妇| 久久三久久三久久三久久| 青青伊人一精品视频| 一色桃子人妻一区二区三区| 天天日天天鲁天天操| 国产又粗又硬又猛的毛片视频 | 欧洲亚洲欧美日韩综合| 一区二区三区四区五区性感视频| 少妇人妻100系列| 蜜桃臀av蜜桃臀av| 91中文字幕免费在线观看| 国产一区二区欧美三区| 99热久久这里只有精品8| 18禁无翼鸟成人在线| 国产精品熟女久久久久浪潮| 日韩精品电影亚洲一区| 免费av岛国天堂网站| 日韩写真福利视频在线观看| 亚洲偷自拍高清视频| 午夜精品一区二区三区4| 狍和女人的王色毛片| 亚洲成人国产综合一区| 欧美在线精品一区二区三区视频 | 久久久久久久久久久免费女人| 欧美日韩熟女一区二区三区|