天天看點

python四大資料類型_Python 四大資料類型總結

基本資料類型

數值型

Python 中的資料皆是對象,比如被熟知的 int 整型對象、float 雙精度浮點型、bool 邏輯對象,它們都是單個元素。舉兩個例子。

字首加 0x,建立一個十六進制的整數:

0xa5# 等于十進制的 165使用 e 建立科學計數法表示的浮點數:

1.05e3# 1050.0容器型

可容納多個元素的容器對象,常用的比如:list 清單對象、 tuple 元組對象、dict 字典對象、set 集合對象。Python 定義這些類型的變量,文法非常簡潔。

舉例如下。

使用一對中括号 [],建立一個 list 型變量:

lst = [1,3,5] # list 變量示意圖看出,右側容器為開環的,意味着可以向容器中增加和删除元素:

python四大資料類型_Python 四大資料類型總結

使用一對括号 (),建立一個 tuple 型對象:

tup = (1,3,5) # tuple 變量示意圖看出,右側容器為閉合的,意味着一旦建立元組後,便不能再向容器中增删元素:

python四大資料類型_Python 四大資料類型總結

但需要注意,含單個元素的元組後面必須保留一個逗号,才被解釋為元組。

tup = (1,) # 必須保留逗号否則會被認為元素本身:

In [14]: tup=(1) ...: print(type(tup)) 使用一對花括号 {} 另使用冒号 :,建立一個 dict 對象:

dic = {'a':1, 'b':3, 'c':5} # dict變量字典是一個哈希表,下面的示意圖形象的表達出字典的 “形”。

python四大資料類型_Python 四大資料類型總結

僅使用一對花括号 {},建立一個 set 對象:

s = {1,3,5} # 集合變量Python 的容器類型,list、dict、tuple、set 等能友善地實作強大的功能,下面給出幾個案例。

1. 去最求平均

去掉清單中的一個最小值和一個最大值後,計算剩餘元素的平均值。

defscore_mean(lst): lst.sort() lst2=lst[1:-1]return round((sum(lst2)/len(lst2)),1)lst=[9.1, 9.0,8.1, 9.7, 19,8.2, 8.6,9.8]score_mean(lst) # 9.1代碼執行過程,動畫示範:

python四大資料類型_Python 四大資料類型總結

2. 列印 99 乘法表

列印出如下格式的乘法表:

1*1=11*2=22*2=41*3=32*3=63*3=91*4=42*4=83*4=124*4=161*5=52*5=103*5=154*5=205*5=251*6=62*6=123*6=184*6=245*6=306*6=361*7=72*7=143*7=214*7=285*7=356*7=427*7=491*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=641*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81一共有 10 行,第 i 行的第 j 列等于:j*i,其中:

i 取值範圍:1<=i<=9j 取值範圍:1<=j<=i根據“例子分析”的語言描述,轉化為如下代碼:

In [13]: for i in range(1,10): ...: for j in range(1,i+1): ...: print('%d*%d=%d'%(j,i,j*i),end='\t') ...: print()3. 樣本抽樣

使用 sample 抽樣,如下例子從 100 個樣本中随機抽樣 10 個。

from random import randint,samplelst = [randint(0,50) for _ in range(100)]print(lst[:5])# [38, 19, 11, 3, 6]lst_sample = sample(lst,10)print(lst_sample) # [33, 40, 35, 49, 24, 15, 48, 29, 37, 24]字元串

注意 Python 中沒有像 C++ 表示的字元類型(char),所有的字元或串都被統一為 str 對象。如單個字元 c 的類型也為 str。

str 類型會被經常使用,先列舉 5 個被高頻使用的方法。

strip 用于去除字元串前後的空格:

In [1]: ' I love python\t\n '.strip()Out[1]: 'I love python'replace 用于字元串的替換:

In [2]: 'i love python'.replace(' ','_')Out[2]: 'i_love_python'join 用于合并字元串:

In [3]: '_'.join(['book', 'store','count'])Out[3]: 'book_store_count'title 用于單詞的首字元大寫:

In [4]: 'i love python'.title()Out[4]: 'I Love Python'find 用于傳回比對字元串的起始位置索引:

In [5]: 'i love python'.find('python')Out[5]: 7舉個應用字元串的案例,判斷 str1 是否由 str2 旋轉而來。

字元串 stringbook 旋轉後得到 bookstring,寫一段代碼驗證 str1 是否為 str2 旋轉得到。

轉化為判斷:str1 是否為 str2+str2 的子串。

下面函數原型中,注明了每個參數的類型、傳回值的類型,增強代碼的可讀性和可維護性。

defis_rotation(s1: str, s2: str) -> bool:if s1 isNoneor s2 isNone:returnFalseif len(s1) != len(s2):returnFalsedefis_substring(s1: str, s2: str) -> bool:return s1 in s2return is_substring(s1, s2 + s2)測試函數 is_rotation:

r = is_rotation('stringbook', 'bookstring')print(r) # Truer = is_rotation('greatman', 'maneatgr')print(r) # False代碼執行過程,動畫示範:

python四大資料類型_Python 四大資料類型總結

字元串的比對操作除了使用 str 封裝的方法外,Python 的 re 正則子產品功能更加強大,寫法更為簡便,廣泛适用于爬蟲、資料分析等。

下面這個案例實作:密碼安全檢查,使用正規表達式非常容易實作。

密碼安全要求:

要求密碼為 6 到 20 位;密碼隻包含英文字母和數字。import repat = re.compile(r'\w{6,20}') # 這是錯誤的,因為 \w 通配符比對的是字母,數字和下劃線,題目要求不能含有下劃線# 使用最穩的方法:\da-zA-Z 滿足“密碼隻包含英文字母和數字”# \d比對數字 0-9# a-z 比對所有小寫字元;A-Z 比對所有大寫字元pat = re.compile(r'[\da-zA-Z]{6,20}')選用最保險的 fullmatch 方法,檢視是否整個字元串都比對。

以下測試例子都傳回 None,原因都在解釋裡。

pat.fullmatch('qaz12') # 傳回 None,長度小于 6pat.fullmatch('qaz12wsxedcrfvtgb67890942234343434') # None 長度大于 22pat.fullmatch('qaz_231') # None 含有下劃線下面這個字元串 n0passw0Rd 完全符合:

In [20]: pat.fullmatch('n0passw0Rd')Out[20]: 自定義類型

Python 使用關鍵字 class 定制自己的類,self 表示類執行個體對象本身。

一個自定義類内包括屬性、方法,其中有些方法是自帶的。

類(對象):

classDog(object):pass以上定義一個 Dog 對象,它繼承于根類 object,pass 表示沒有自定義任何屬性和方法。

下面建立一個 Dog 類型的執行個體:

wangwang = Dog()Dog 類現在沒有定義任何方法,但是剛才說了,它會有自帶的方法,使用 __dir__() 檢視這些自帶方法:

In [26]: wangwang.__dir__()Out[26]:['__module__','__dict__','__weakref__','__doc__','__repr__','__hash__','__str__','__getattribute__','__setattr__','__delattr__','__lt__','__le__','__eq__','__ne__','__gt__','__ge__','__init__','__new__','__reduce_ex__','__reduce__','__subclasshook__','__init_subclass__','__format__','__sizeof__','__dir__','__class__']有些地方稱以上方法為魔法方法,它們與建立類時自定義個性化行為有關。比如:

__init__ 方法能定義一個帶參數的類;__new__ 方法自定義執行個體化類的行為;__getattribute__ 方法自定義讀取屬性的行為;__setattr__ 自定義指派與修改屬性時的行為。類的屬性:

def__init__(self, name, dtype): self.name = name self.dtype = dtype通過 __init__,定義 Dog 對象的兩個屬性:name、dtype。

類的執行個體:

wangwang = Dog('wangwang','cute_type')wangwang 是 Dog 類的執行個體。

類的方法:

defshout(self): print('I\'m %s, type: %s' % (self.name, self.dtype))注意:

自定義方法的第一個參數必須是 self,它指向執行個體本身,如 Dog 類型的執行個體 dog;引用屬性時,必須前面添加 self,比如 self.name 等。總結以上代碼:

In [40]: classDog(object): ...: def__init__(self,name,dtype): ...: self.name=name ...: self.dtype=dtype ...: defshout(self): ...: print('I\'m %s, type: %s' % (self.name, self.dtype))In [41]: wangwang = Dog('wangwang','cute_type')In [42]: wangwang.nameOut[42]: 'wangwang'In [43]: wangwang.dtypeOut[43]: 'cute_type'In [44]: wangwang.shout()I'm wangwang, type: cute_type看到建立的兩個屬性和一個方法都被暴露在外面,可被 wangwang 調用。這樣的話,這些屬性就會被任意修改:

In [49]: wangwang.name='wrong_name'In [50]: wangwang.nameOut[50]: 'wrong_name'如果想避免屬性 name 被修改,可以将它變為私有變量。改動方法:屬性前加 2 個 _ 後,變為私有屬性。如:

In [51]: classDog(object): ...: def__init__(self,name,dtype): ...: self.__name=name ...: self.__dtype=dtype ...: defshout(self): ...: print('I\'m %s, type: %s' % (self.name, self.dtype))同理,方法前加 2 個 _ 後,方法變為“私有方法”,隻能在 Dog 類内被共享使用。

但是這樣改動後,屬性 name 不能被通路了,也就無法得知 wangwang 的名字叫啥。不過,這個問題有一種簡單的解決方法,直接新定義一個方法就行:

defget_name(self):return self.__name綜合代碼:

In [52]: classDog(object): ...: def__init__(self,name,dtype): ...: self.__name=name ...: self.__dtype=dtype ...: defshout(self): ...: print('I\'m %s, type: %s' % (self.name, self.dtype)) ...: defget_name(self): ...: return self.__name ...:In [53]: wangwang = Dog('wangwang','cute_type')In [54]: wangwang.get_name()Out[54]: 'wangwang'但是,通過此機制,改變屬性的可讀性或可寫性,怎麼看都不太優雅!因為無形中增加一些備援的方法,如 get_name。

下面,通過另一個例子,解釋如何更優雅地改變某個屬性為隻讀或隻寫。

自定義一個最精簡的 Book 類,它繼承于系統的根類 object:

classBook(object):def__init__(self,name,sale): self.__name = name self.__sale = sale使用 Python 自帶的 property 類,就會優雅地将 name 變為隻讀的。

@propertydefname(self):return self.__name使用 @property 裝飾後 name 變為屬性,意味着 .name 就會傳回這本書的名字,而不是通過 .name() 這種函數調用的方法。這樣變為真正的屬性後,可讀性更好。

In [101]: classBook(object): ...: def__init__(self,name,sale): ...: self.__name = name ...: self.__sale = sale ...: @property ...: defname(self): ...: return self.__nameIn [102]: a_book = Book('magic_book',100000)In [103]: a_book.nameOut[103]: 'magic_book'property 是 Python 自帶的類,前三個參數都是函數類型。更加詳細的讨論放在後面讨論裝飾器時再展開。

In [104]: help(property)Help on classpropertyinmodulebuiltins:classproperty(object) | property(fget=None, fset=None, fdel=None, doc=None)如果使 name 既可讀又可寫,就再增加一個裝飾器 @name.setter。

In [105]: classBook(object): ...: def__init__(self,name,sale): ...: self.__name = name ...: self.__sale = sale ...: @property ...: defname(self): ...: return self.__name ...: @name.setter ...: defname(self,new_name): ...: self.__name = new_nameIn [106]: a_book = Book('magic_book',100000)In [107]: a_book.name = 'magic_book_2.0'In [108]: a_book.nameOut[108]: 'magic_book_2.0'注意這種裝飾器寫法:name.setter,name 已經被包裝為 property 執行個體,調用執行個體上的 setter 函數再包裝 name 後就會可寫。對于 Python 入門者,可以暫時不用太糾結這部分理論,使用 Python 一段時間後,再回過頭來自然就會了解。

小結

今天學習 Python 的四大基本資料類型。數值型 int、float 等;容器型 list、dict、tuple、set 等;字元型 str 與正規表達式介紹;自定義類的基本文法規則,class、屬性和方法等。

來源:網際網路摘抄

python四大資料類型_Python 四大資料類型總結
python四大資料類型_Python 四大資料類型總結