Python數據類型方法整理
前言:主要是對Python數據類型做一個整理,部分知識點源於《python3程式開發指南(第二版)》
一、Python的關鍵要素
1.1 要素1:數據類型
int類型
str類型
組合數據類型:
元組
列表
字典
集合
組合數據類型的區別:
1.形式不一樣:列表是[]形式,元組()形式,字典、集合是{}形式
2.可變不可變:列表、字典、集合可變,元組不可變
3.哈希不可哈希:列表、字典、集合不可哈希,字元串str、數字、元組tuple可哈希
可哈希的數據類型,即不變的數據結構 (字元串、整數、元組)
不可哈希的數據類型,即可變的數據結構 (字典dict,列表list,集合set)
4.有序無序:列表、元組有序,字典、集合無序
5.集合的元素,字典的key必須是可哈希的
6.集合中的元素都是不重複的,元組和列表可以重複
7.支援的內置方法不同
二、數據類型
組合數據類型是對象,因此每種數據類型都有自己的方法。Python所有變數實際上是對象引用
2.1 標識符與關鍵字
Python的關鍵字
Python標識符命名規範:
- 由字元(A~Z 和 a~z)、下劃線和數字組成,但不能以數字開頭;
- 不能以python中的關鍵字命名;
-
- 2.1. 不能與Python關鍵字同名
-
- 2.2 不能與Python內置數據類型(如int/float/list/str/tuple)同名
-
- 2.3. 不能與Python內置函數名與異常名作為標識符名
- Python中的標識符中,不能包含空格、@、% 以及 $ 等特殊字元。
- Python 中,標識符中的字母是嚴格區分大小寫的,相同單詞大小格式不同代表意義不同,如:
-
- number = 0
-
- Number = 0
-
- NUMBER = 0
- 變數名命名要有意義,最好見名知意,提高程式碼可讀性
- 推薦使用大小駝峰型(GuessAge或guessAge)和下劃線(guess_age)來命名;
- 常量通常使用大寫來定義
- Python 語言中,以下劃線開頭的標識符有特殊含義,例如:
-
- 以單下劃線開頭的標識符(如 _width),表示不能直接訪問的類屬性,其無法通過 from…import* 的方式導入;
-
- 以雙下劃線開頭的標識符(如__add)表示類的私有成員;
-
- 以雙下劃線作為開頭和結尾的標識符(如 __init__),是專用標識符。
因此,除非特定場景需要,應避免使用以下劃線開頭的標識符。
2.2 Integral類型
內置Integral類型:int、浮點類型(浮點數、複數、十進位數字)、布爾值,True表示1,False表示0
2.2.1 整數
- 圖:數值型操作與函數
2.3 字元串
字元串可以使用引號創建,python中字元串是不可變對象。字元串是一個有序的字元的集合,一對單,雙或三引號中間包含的內容稱之為字元串,其中三引號可以由多行組成
2.3.1字元串轉義
2.3.2 字元串運算符
2.3.3 字元串格式化
%c | 格式化字元及其ASCII碼 |
%s | 格式化字元串 |
%d | 格式化整數 |
%u | 格式化無符號整型 |
%o | 格式化無符號八進位數 |
%x | 格式化無符號十六進位數 |
%X | 格式化無符號十六進位數(大寫) |
%f | 格式化浮點數字,可指定小數點後的精度 |
%e | 用科學計數法格式化浮點數 |
%E | 作用同%e,用科學計數法格式化浮點數 |
%g | %f和%e的簡寫 |
%G | %f 和 %E 的簡寫 |
%p | 用十六進位數格式化變數的地址 |
2.3.4 字元串操作方法
字元串可以取切片(通過索引、步長值取值)
語法格式:
- seq = “abcdefg”
- [:] 提取從開頭(默認位置0)到結尾(默認位置-1)的整個字元串
- seq[start]
如: seq[1],取第二個字元「b」
3. [start:] 從start 提取到結尾
4. [:end] 從開頭提取到end – 1
5. seq[start:end]
如: seq[1:3] 包含上邊界不包含下邊界,因此取值為”bc”
如: seq[1:] 取值從第二個字元至結尾:”bcdefg”
6. seq[start:end:step] 如seq[1:4:2]步長值為2,因此取值”bd”
7. 負索引:-1表示最後一個字元
seq可以是任意序列,比如列表、字元串或元組,start、end、step必須是整數,
2.3.5 string模組
2.4 元組
所謂元組的不可變指的是元組所指向的記憶體中的內容不可變。
2.4.1 元組的內置方法
2.4.2 訪問元組
元組可以使用下標索引來訪問元組中的值
#!/usr/bin/python3 tup1 = ('Google', 'Runoob', 1997, 2000) print (tup1[0]) print (tup2[1:5])
2.4.3 修改元組
元組中的元素值是不允許修改的,但我們可以對元組進行連接組合,如下實例:
tup1 = (12, 34.56) tup2 = ('abc', 'xyz') # 以下修改元組元素操作是非法的。# tup1[0] = 100 #創建一個新的元組,可進行元組合併 tup3 = tup1 + tup2 print (tup3)
2.4.4 刪除元組
元組中的元素值是不允許刪除的,但我們可以使用del語句來刪除整個元組,如下實例:
tup = ('Google', 'Runoob', 1997, 2000) del tup
2.4.5 元組運算符
與字元串一樣,元組之間可以使用 + 號和 * 號進行運算。這就意味著他們可以組合和複製,運算後會生成一個新的元組。
Python 表達式 | 結果 | 描述 |
len((1, 2, 3)) | 3 | 計算元素個數 |
(1, 2, 3) + (4, 5, 6) | (1, 2, 3, 4, 5, 6) | 連接 |
(‘Hi!’,) * 4 | (‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’) | 複製 |
3 in (1, 2, 3) | TRUE | 元素是否存在 |
for x in (1, 2, 3): print (x,) | 1 2 3 | 迭代 |
2.5 列表
2.5.1 列表方法
2.5.2 列表內涵
列表內涵是一個表達式,也是一個循環,該循環有一個可選的,包含在方括弧中的條件,作用是為列表生產數據選項,並且可以使用條件過濾掉不需要的數據項。
列表內涵最簡單的形式如下:
[item for item in iterable]
上面的語句將返回一個列表,其中包含iterable中的每個數據項,在語義上與list(iterable)是一致的。有兩個特點使得列表內涵具有更強大的功:一個是可以使用表達式,另一個是可以附件條件,由此帶來如下兩種實現列表內涵的常見語法格式:
[expression for item in iterable]
[expression for item in iterable if condition]
第二種 相當於
temp=[] for item in iterable: if condition: temp.append(item)
例子1:指定生成閏年方式
leaps=[] for year in range(1900,1940): if(year%4==0 and year%100!=0)or (year%400==0) leaps.append(year)
使用列表內涵
leaps=[y for y in range(1900,1940) if(y%4==0 and y%400!=0) or(y%400=0)]
例子2:計算50以內的和
print(sum([i for i in range(1,51)])) print(sum(range(1, 51)))
例子3:計算九九乘法表
s = [(x, y, x*y) for x in range(1, 10) for y in range(1,10) if x>=y]
2.6 集合
Python提供兩種內置的集合類型:可變的set類型,固定的frozenset類型。
集合特性:
1.集合元素必須是可哈希即不可變數據類型(比如float,frozenset,int,str,touple)
2.集合元素是無序的,不能使用索引、切片取值
只有可哈希運算的對象可以添加到集合中,所有固定的數據類型(比如float,frozenset,int,str,touple)都是可哈希運算的,可以添加到集合中。內置的可變數據類型(比如list,dictset)都是不可哈希的,因為其哈希值會隨著包含項數的變化而變化,因此,這些數據類型都是不能添加到集合中的。
集合是0個或多個對象引用的無序組合,這些對象所引用的對象都是可哈希運算的。幾個是可變的,但由於其中的項是無序的,因此沒有索引位置,不能分片或按步距分片。
2.6.1 集合方法與操作符
語法 | 描述 |
s.add(x) | 將數據項x添加到集合s中(如果s中未包含x) |
s.clear() | 清楚集合s中的所有數據項 |
s.pop() | 返回並移除已集合s中一個隨機項,如果s為空集,就會產生KeyError |
s.remove(x) | 從集合s中移除數據項x,如果s中不包含x,就會產生KeyError |
s.discard(x) | 如果數據項x存在於集合s中,就移除該數據項,參見set.remove() |
s.copy() | 返回集合元素的淺拷貝 |
s.difference(t) s-t | 返回一個新集合,其中包含在s中但不在集合t中的所有數據項 |
s.difference_update(t) s-=t | 移除每一個在集合t但不在集合s中的項 |
s.union(t) s|t | 返回新集合,包含s中所有數據項以及在t中不在s中的數據項 |
s.update(t) s|=t | 將集合t中每個s中不包含的數據項添加到集合s中 |
2.6.2 集合內涵
集合內涵是一個表達式,也是一個帶有可選條件(包含在花括弧中)的循環,與列表內涵類似,也支援兩種語法格式
{expression for item in iterable}
- {expression for item in iterable if condition}
- 我們可以使用上面語法過濾,下面給出一個實例:
- Html = {x for x in files if x.lower().endswith((‘.htm’,’.html’))} 意思是集合html只存放那些以.htm或.html結尾的文件名這裡不區分大小寫
2.7 映射類型
字典特性:
1.key是可哈希運算的對象即(比如float,frozenset,int,str,touple)
- 2.字典的鍵是不能重複的,獨一無二
- 3.字典是無序的,不能通過索引取切店
4. 字典是可變的
字典的方法:
語法 | 描述 |
d.clear() | 從dict d中移除所有項 |
d.copy() | 返回dict d的淺拷貝 |
d.fromkeys(s,v) | 返回一個dict,字典的鍵為序列s中的所有項,值為None或v |
d.get(k) | 返回k對應的value,如果k不在字典中返回None |
d.get(k,v) | 返回k對應的value,如果k不在字典中就返回v |
d.items() | 返回dict中所有key,value項 |
d.keys() | 返回dict中的所有key |
d.values() | 返回dict中的所有value |
d.pop(k) | 返回k對應的value,並移除k的項,如果k不存在就產生KeyError |
d.pop(k,v) | 返回k對應的value,並移除k的項,如果k不存在就返回v |
d.popitem() | 返回並移除dict中一個任意的key,value對,如果d為空就產生KeyError |
d.setdefault(k,v) | 與d.get()方法一樣,不同處如果k沒有包含在dict d中就插入一個鍵為k的新項,其值為None或v,可用於賦值 |
d.update(a) | 將a中不包含在b的(key,value)添加到d,如包含則替換 |
dict.setdefault(key, default=None) –> 有key獲取值,否則設置 key:default,並返回default,default默認值為None,會修改原字典
dict.get(key, default=None) –> 有key獲取值,否則返回default。default默認值為None。
字典內涵
兩種語法格式:
[keyexpression:valueexpression for key, value in iterable]
[keyexpression:valueexpression for key, value in iterable if condition]
實例一:如果使用字典內涵創建字典,鍵為當前目錄中文件的文件名,值為以位元組計數的文件大小
os.listdir()返回傳遞給函數的路徑中包含的文件與目錄列表但列表中不會包含"."或".." os.path.getsize()函數返回給定文件的大小(以位元組計數) file_sizes = {name:os.path.getseize(name) for name in os.listdir(".")} file_sizes = {name:os.path.getseize(name) for name in os.listdir(".") if os.path.isfile(name)}
字典內涵可用於創建反轉目錄,比如給定字典d,生成一個新字典,新字典的鍵是d的值,值是d的鍵
inverted_d = {v:k for k,v in d.items()}