您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python四大數(shù)據(jù)類型實例分析”,在日常操作中,相信很多人在Python四大數(shù)據(jù)類型實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python四大數(shù)據(jù)類型實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
前綴加 0x
,創(chuàng)建一個十六進(jìn)制的整數(shù):
0xa5 # 等于十進(jìn)制的 165
使用 e
創(chuàng)建科學(xué)計數(shù)法表示的浮點數(shù):
1.05e3 # 1050.0
可容納多個元素的容器對象,常用的比如:list 列表對象、 tuple 元組對象、dict 字典對象、set 集合對象。Python 定義這些類型的變量,語法非常簡潔。
舉例如下。
使用一對中括號 []
,創(chuàng)建一個 list 型變量:
lst = [1,3,5] # list 變量
示意圖看出,右側(cè)容器為開環(huán)的,意味著可以向容器中增加和刪除元素:
使用一對括號 ()
,創(chuàng)建一個 tuple 型對象:
tup = (1,3,5) # tuple 變量
示意圖看出,右側(cè)容器為閉合的,意味著一旦創(chuàng)建元組后,便不能再向容器中增刪元素:
但需要注意,含單個元素的元組后面必須保留一個逗號,才被解釋為元組。
tup = (1,) # 必須保留逗號
否則會被認(rèn)為元素本身:
In [14]: tup=(1) ...: print(type(tup)) <class 'int'>
使用一對花括號 {}
另使用冒號 :
,創(chuàng)建一個 dict 對象:
dic = {'a':1, 'b':3, 'c':5} # dict變量
字典是一個哈希表,下面的示意圖形象的表達(dá)出字典的 “形”。
僅使用一對花括號 {}
,創(chuàng)建一個 set 對象:
s = {1,3,5} # 集合變量
Python 的容器類型,list、dict、tuple、set 等能方便地實現(xiàn)強(qiáng)大的功能,下面給出幾個案例。
1. 去最求平均
去掉列表中的一個最小值和一個最大值后,計算剩余元素的平均值。
def score_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
代碼執(zhí)行過程,動畫演示:
2. 打印 99 乘法表
打印出如下格式的乘法表:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
一共有 10 行,第 i 行的第 j 列等于:j*i
,其中:
i 取值范圍:1<=i<=9
j 取值范圍:1<=j<=i
根據(jù)“例子分析”的語言描述,轉(zhuǎn)化為如下代碼:
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 個樣本中隨機(jī)抽樣 10 個。
from random import randint,sample lst = [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),所有的字符或串都被統(tǒng)一為 str 對象。如單個字符 c
的類型也為 str。
str 類型會被經(jīng)常使用,先列舉 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
舉個應(yīng)用字符串的案例,判斷 str1 是否由 str2 旋轉(zhuǎn)而來。
字符串 stringbook 旋轉(zhuǎn)后得到 bookstring,寫一段代碼驗證 str1 是否為 str2 旋轉(zhuǎn)得到。
轉(zhuǎn)化為判斷:str1 是否為 str2+str2 的子串。
下面函數(shù)原型中,注明了每個參數(shù)的類型、返回值的類型,增強(qiáng)代碼的可讀性和可維護(hù)性。
def is_rotation(s1: str, s2: str) -> bool: if s1 is None or s2 is None: return False if len(s1) != len(s2): return False def is_substring(s1: str, s2: str) -> bool: return s1 in s2 return is_substring(s1, s2 + s2)
測試函數(shù) is_rotation:
r = is_rotation('stringbook', 'bookstring') print(r) # True r = is_rotation('greatman', 'maneatgr') print(r) # False
代碼執(zhí)行過程,動畫演示:
55555
字符串的匹配操作除了使用 str 封裝的方法外,Python 的 re 正則模塊功能更加強(qiáng)大,寫法更為簡便,廣泛適用于爬蟲、數(shù)據(jù)分析等。
下面這個案例實現(xiàn):密碼安全檢查,使用正則表達(dá)式非常容易實現(xiàn)。
密碼安全要求:
要求密碼為 6 到 20 位;
密碼只包含英文字母和數(shù)字。
import re pat = re.compile(r'\w{6,20}') # 這是錯誤的,因為 \w 通配符匹配的是字母,數(shù)字和下劃線,題目要求不能含有下劃線 # 使用最穩(wěn)的方法:\da-zA-Z 滿足“密碼只包含英文字母和數(shù)字” # \d匹配數(shù)字 0-9 # a-z 匹配所有小寫字符;A-Z 匹配所有大寫字符 pat = re.compile(r'[\da-zA-Z]{6,20}')
選用最保險的 fullmatch 方法,查看是否整個字符串都匹配。
以下測試?yán)佣挤祷?None,原因都在解釋里。
pat.fullmatch('qaz12') # 返回 None,長度小于 6 pat.fullmatch('qaz12wsxedcrfvtgb67890942234343434') # None 長度大于 22 pat.fullmatch('qaz_231') # None 含有下劃線
下面這個字符串 n0passw0Rd
完全符合:
In [20]: pat.fullmatch('n0passw0Rd') Out[20]: <re.Match object; span=(0, 10), match='n0passw0Rd'>
Python 使用關(guān)鍵字 class 定制自己的類,self 表示類實例對象本身。
一個自定義類內(nèi)包括屬性、方法,其中有些方法是自帶的。
類(對象):
class Dog(object): pass
以上定義一個 Dog 對象,它繼承于根類 object,pass 表示沒有自定義任何屬性和方法。
下面創(chuàng)建一個 Dog 類型的實例:
wangwang = Dog()
Dog 類現(xiàn)在沒有定義任何方法,但是剛才說了,它會有自帶的方法,使用 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__']
有些地方稱以上方法為魔法方法,它們與創(chuàng)建類時自定義個性化行為有關(guān)。比如:
init 方法能定義一個帶參數(shù)的類;
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
類的實例。
類的方法:
def shout(self): print('I\'m %s, type: %s' % (self.name, self.dtype))
注意:
自定義方法的第一個參數(shù)必須是 self,它指向?qū)嵗旧恚?Dog 類型的實例 dog;
引用屬性時,必須前面添加 self,比如 self.name
等。
總結(jié)以上代碼:
In [40]: class Dog(object): ...: def __init__(self,name,dtype): ...: self.name=name ...: self.dtype=dtype ...: def shout(self): ...: print('I\'m %s, type: %s' % (self.name, self.dtype)) In [41]: wangwang = Dog('wangwang','cute_type') In [42]: wangwang.name Out[42]: 'wangwang' In [43]: wangwang.dtype Out[43]: 'cute_type' In [44]: wangwang.shout() I'm wangwang, type: cute_type
看到創(chuàng)建的兩個屬性和一個方法都被暴露在外面,可被 wangwang 調(diào)用。這樣的話,這些屬性就會被任意修改:
In [49]: wangwang.name='wrong_name' In [50]: wangwang.name Out[50]: 'wrong_name'
如果想避免屬性 name 被修改,可以將它變?yōu)樗接凶兞?。改動方法:屬性前?2 個 _
后,變?yōu)樗接袑傩?。如?/p>
In [51]: class Dog(object): ...: def __init__(self,name,dtype): ...: self.__name=name ...: self.__dtype=dtype ...: def shout(self): ...: print('I\'m %s, type: %s' % (self.name, self.dtype))
同理,方法前加 2 個 _
后,方法變?yōu)椤八接蟹椒ā保荒茉?Dog 類內(nèi)被共享使用。
但是這樣改動后,屬性 name 不能被訪問了,也就無法得知 wangwang 的名字叫啥。不過,這個問題有一種簡單的解決方法,直接新定義一個方法就行:
def get_name(self): return self.__name
綜合代碼:
In [52]: class Dog(object): ...: def __init__(self,name,dtype): ...: self.__name=name ...: self.__dtype=dtype ...: def shout(self): ...: print('I\'m %s, type: %s' % (self.name, self.dtype)) ...: def get_name(self): ...: return self.__name ...: In [53]: wangwang = Dog('wangwang','cute_type') In [54]: wangwang.get_name() Out[54]: 'wangwang'
但是,通過此機(jī)制,改變屬性的可讀性或可寫性,怎么看都不太優(yōu)雅!因為無形中增加一些冗余的方法,如 get_name。
下面,通過另一個例子,解釋如何更優(yōu)雅地改變某個屬性為只讀或只寫。
自定義一個最精簡的 Book 類,它繼承于系統(tǒng)的根類 object:
class Book(object): def __init__(self,name,sale): self.__name = name self.__sale = sale
使用 Python 自帶的 property 類,就會優(yōu)雅地將 name 變?yōu)橹蛔x的。
@property def name(self): return self.__name
使用 @property 裝飾后 name 變?yōu)閷傩?,意味?.name
就會返回這本書的名字,而不是通過 .name()
這種函數(shù)調(diào)用的方法。這樣變?yōu)檎嬲膶傩院?,可讀性更好。
In [101]: class Book(object): ...: def __init__(self,name,sale): ...: self.__name = name ...: self.__sale = sale ...: @property ...: def name(self): ...: return self.__name In [102]: a_book = Book('magic_book',100000) In [103]: a_book.name Out[103]: 'magic_book'
property 是 Python 自帶的類,前三個參數(shù)都是函數(shù)類型。更加詳細(xì)的討論放在后面討論裝飾器時再展開。
In [104]: help(property) Help on class property in module builtins: class property(object) | property(fget=None, fset=None, fdel=None, doc=None)
如果使 name 既可讀又可寫,就再增加一個裝飾器 @name.setter。
In [105]: class Book(object): ...: def __init__(self,name,sale): ...: self.__name = name ...: self.__sale = sale ...: @property ...: def name(self): ...: return self.__name ...: @name.setter ...: def name(self,new_name): ...: self.__name = new_name In [106]: a_book = Book('magic_book',100000) In [107]: a_book.name = 'magic_book_2.0' In [108]: a_book.name Out[108]: 'magic_book_2.0'
注意這種裝飾器寫法:name.setter,name 已經(jīng)被包裝為 property 實例,調(diào)用實例上的 setter 函數(shù)再包裝 name 后就會可寫。對于 Python 入門者,可以暫時不用太糾結(jié)這部分理論,使用 Python 一段時間后,再回過頭來自然就會理解。
到此,關(guān)于“Python四大數(shù)據(jù)類型實例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。