上篇文章對Python進行了基本介紹
同時也學習了常見的運算符
對象類型是Python學習中重要的一步
本文對字元串、清單、元組等
進行簡單說明
參考書目為《Python學習手冊》(第五版)
如有任何疑問或不正之處
敬請讨論交流
也可以關注CSDN賬号:weixin_42637220
一起學習交流
一.Python對象類型
非正式角度說,在Python中,我們使用“材料”來處理“事務”。“事務”指的是像加法或者拼接這樣的操作形式,而“材料”指的就是我們操作的對象。
1.Python知識結構
- 程式由子產品構成
- 子產品包括語句
- 語句包括表達式
- 表達式建立并且處理對象
2.Python基本資料類型
在之前學習過的C語言中,我們知道:C語言在計算機中建立一塊空間區域,然後向這塊空間區域存放資料(如int型,字元型)。由于每種資料類型的位元組長度各不相同,是以在定義變量時,需要提前說明我們定義的這個變量到底是什麼資料類型。
如:
int a=10;
代表的含義是在計算機中開辟一塊4個位元組的區域,用來存放整型資料10。因為說明了變量a是整型,是以在給a重新指派的時候,賦予的值也必須是一個整型。
下圖展示了C語言變量的示意圖,在計算機中位址為1001的位置開始開辟一塊區域,如果存放字元型資料‘S’,需要提前聲明a為char型,開辟的位置就是1001這一個位元組的區域;如果存放整型資料‘10’,需要提前聲明a為int型,開辟的位置就是1001至1004這4個位元組的區域;
而在Python中,變量代表了一個資料對象的引用,可以将其了解為變量是一個“标簽”,可以“貼”在一個整型資料對象上,也可以“貼在”一個字元型資料對象上。
如:
a=10
代表的含義是用變量a引用一個整型資料10。下圖展示了Python中變量的示意圖,變量a首先去引用一個整型資料10,我們對a重新進行指派時,就是把變量a去引用另一個字元型資料‘S’。
在Python中,基本的資料類型如下圖所示,後面将對每種資料類型進行詳細介紹。
3.數字
Python内置的數字類型足以表示絕大部分數值量,包括:整數(不帶小數部分的數字)、浮點數(帶小數部分的數字)、帶虛部的複數、帶分子和分母的有理分數···同時,Python還有更多第三方庫提供更強大的功能。數字運算符在前面已叙述,這裡不再贅述。
4.序列
序列是一個包含其他對象的有序集合,序列的元素包含了一個從左到右的順序——序列中的元素根據它們的相對位置進行存儲和讀取。一般序列包括字元串、清單和元組。
5.序列操作
序列操作是通用的,但是方法不通用。一條簡明的法則是:Python的工具庫是呈層級分布的:可作用于多種類型的通用操作都是以内置函數或者表達式的形式出現的(如len(X)、X[0]),但是類型特定的操作是以方法調用的形式出現的(如:aString.upper())。
- 索引操作:索引量按照從最前面的偏移量進行編碼的,也就是從0開始,第一項索引是0,第二項索引是1,以此類推。能夠進行反向索引操作,從右邊開始索引(負的索引号會簡單地與字元串的長度相加,即:s[-1]=s[len(s)-1])。
- 通過内置的len函數驗證其長度。
- 分片(slice)操作:一種一次就可以提取整個分片的方法,一般形式為X[I:J],表示“取出X中從偏移量為I,直到但不包括偏移量為J 的内容”。
- 拼接操作:使用“+”号來将兩個相同類型的序列進行拼接。使用“*”來将一個序列進行重複。
6.可變性與不可變性
對象具有不可變性:在建立後不能原位置改變,即不可能覆寫不可變對象的值。
不可變對象:數字、字元串、元組。
可變對象:清單、字典、集合。
嚴格意義上,可以在原位置改變基于文本的資料。
- 将其拓展為一個由獨立字元構成的清單,進行改變後将其轉化為字元串進行輸出。
代碼示例如下:
S='hello'
# 将字元串S轉換為清單L
L=list(S)
# 改變清單L的第二個元素
L[1]='x
'# 将清單L轉換為字元串并輸出
print(''.join(L))
運作結果如下:
hxllo
- 使用内置函數bytearray,傳回一個新位元組數組,并且這個數組的元素是可變的。
代碼示例如下:
# bytearray函數傳回一個新位元組數組,并且這個數組的元素是可變的
'''參數如果是bytearray對象,将通過緩沖器協定(buffer protocol)複制其中的資料,即這裡的b'spam'。'''
B=bytearray(b'spam')
B.extend(b'eggs')
print(B)
運作結果如下:
bytearray(b'spameggs')
7.尋求幫助
檢視詳細的介紹對象方法,需要使用dir函數。使用help函數查詢該方法具體是做什麼的。
代碼示例如下:
line='hello'
# 使用dir函數檢視line字元串有哪些方法
print(dir(line))
# 使用help函數檢視某個方法具體是幹什麼用的
print(help(line.upper))
運作效果如下:
二.字元串(不可變序列)
字元串是用來記錄文本資訊(如你的姓名)和任意位元組集合(如圖檔檔案的内容)。
1.建立字元串
建立。如:
S='hello'
2.查找字元串中元素偏移量
find方法是基本的子字元串查找的操作,它将傳回一個傳入子字元串的偏移量,或者在沒有找到的情況下傳回-1。
代碼示例如下:
S='hello'
print(S.find('ll'))
運作結果如下:
2
3.替換字元串中指定子字元串
replace方法:字元串的replace方法會對全局進行搜尋和替換。
代碼示例如下:
S='hello'
T=S.replace('ll','xx')
print(T)
運作結果如下:
hexxo
4.使用分隔符拆分字元串
split方法:使用分隔符将字元串拆分為子字元串,如果參數num 有指定值,則僅分隔 num 個子字元串。
代碼示例如下:
line='hello,my,name,is,cola'
# 通過調用split方法,将字元串line按照','将其分割為一個字元集合
# 這個字元集合是
#['hello','my','name','is','cola']
T=line.split(',')
# 通過for循環依次輸出每個子字元串
for str in T:
print(str,type(str))
運作結果如下:
hello
my
name
is
cola
5.字母大小寫轉化
upper方法:所有字母大寫。lower方法:所有字母小寫。capitalize方法:首字母大寫,其他字母小寫。title方法:每個單詞首字母大寫,其他小寫。
代碼示例如下:
S='hello'
T='WORLD'
# 将字元串S轉換為大寫字母并輸出
print(S.upper())
# 将字元串T轉換為小寫字母并輸出
print(T.lower())
P='ni hao,nice to meet you'
# 将字元串P的首字母轉換為大寫字母,其他字母保持不變
print(P.capitalize())
# 将字元串P中每個單詞的首字母轉換為大寫字母,其他字母保持不變
print(P.title())
運作結果如下:
HELLO
world
Ni hao,nice to meet you
Ni Hao,Nice To Meet You
6.去字元串左右端空格
strip 方法:同時去掉左右兩邊的空格。lstrip 方法:去掉左邊的空格。rstrip 方法:去掉右邊的空格。
代碼示例如下:
# S字元串的左邊和右邊都有一個空格符
S=' hello '
# 将帶空格和換行符的字元串S輸出
print(S)
# 通過strip方法去掉左邊和右邊的空格
print(S.strip())
# 通過lstrip方法去掉左邊的空格
print(S.lstrip())
# 通過rstrip方法去掉右邊的空格
print(S.rstrip())
運作結果如下:
hello
hello
hello
hello
7.字元串方法連用
方法的連用:Python遵循從左至右的執行順序,每次前一步的方法調用結束,都會為後一步方法調用産生一個臨時對象。
代碼示例如下:
line='ni hao,nice to meet you'
#先調用capitalize方法,再調用split方法
print(line.capitalize().split(','))
運作結果如下:
['Ni hao', 'nice to meet you']
8.字元串模式比對
模式比對:這裡以match 方法為例。首先需要導入一個名為re的子產品(這個子產品包含了類似搜尋、分割、替換等調用),re.match調用傳回一個比對的對象,我們通過group方法來擷取這個比對的對象。
代碼示例如下:
# 導入re子產品
import re
# 通過re.match調用進行正規表達式比對
match=re.match('Hello(.*)world(.*)','Hello python world !!')
# group(0)傳回整個表達式比對的字元串
print(match.group(0))
# group(1)傳回第一個比對的子字元串小組,這裡是' python'
print(match.group(1))
# group(1)傳回第二個比對的子字元串小組,這裡是' !!'
print(match.group(2))
運作結果如下:
Hello python world !!
python
!!
三.清單(可變序列)
Python的清單對象是這個語言提供的最通用的序列。它是一個任意類型的對象的位置相關的有序集合,沒有固定的大小。清單是可變的,通過對相應偏移量進行指派可以定位地對清單進行修改。下面包含方法都直接改變了清單。
1.建立清單
建立,如:
L=[123,'spam',1.23]
2.清單的增減
append方法:清單的append方法增大了清單的大小,并在清單的尾部插入一項。
pop方法:移除給定偏移項的一項,使得清單減少。
insert方法:在指定偏移量位置插入元素,參數為偏移量和元素值。
remove方法:删除指定的元素,參數為元素
extend方法:在尾部插入多個元素,參數為一個清單。
代碼示例如下:
L=[123,'spam',1.23]
print(L)
# 使用append方法增大清單的大小,并在清單的尾部插入一項
L.append('niro')
print(L)
# 使用pop方法(等效的del語句)移除給定偏移項的一項,使得清單減少
L.pop(2)
print(L)
# 使用insert方法在指定偏移量位置插入元素,參數為偏移量和元素值
L.insert(2,'hello')
print(L)
# 使用remove方法删除指定的元素,參數為元素
L.remove('spam')
print(L)
# 使用extend方法在尾部插入多個元素,參數為一個清單
L.extend(['yyy','jjj'])
print(L)
運作結果如下:
[123, 'spam', 1.23]
[123, 'spam', 1.23, 'niro']
[123, 'spam', 'niro']
[123, 'spam', 'hello', 'niro']
[123, 'hello', 'niro']
[123, 'hello', 'niro', 'yyy', 'jjj']
3.清單排序
sort方法:預設升序進行排序。reverse=True時,降序;reverse=Flase時,升序。
代碼示例如下:
L=[2,10,9]
print(L)
'''sort方法用來排序,有兩個參數,(key主要是用來進行比較的元素,隻有一個參數, 具體的函數的參數就是取自于可疊代對象中,指定可疊代對象中的一個元素來進行排序。另一個參數reverse=True時,降序。reverse=Flase時,升序'''
L.sort(reverse=True)
print(L)
運作結果如下:
[2, 10, 9]
[10, 9, 2]
4.邊界檢查
清單沒有固定的大小,但Python不允許引用不存在的元素。是以超過清單末尾之外的索引總會導緻錯誤,對清單末尾範圍之外指派也是如此。
- 錯誤1:有超過清單末尾之外的索引
代碼示例如下:
L=[2,10,9]
# 超過清單末尾的索引會導緻錯誤
print(L[10])
運作錯誤提示:
IndexError: list index out of range
-
錯誤2:
對清單末尾範圍之外指派
代碼示例如下:
L=[2,10,9]
# 對清單範圍之外指派
L[5]=12
print(L)
運作錯誤提示:
IndexError: list assignment index out of range
5.資料類型的嵌套
Python核心資料類型的一個優秀特性就是它們支援任意的嵌套,能夠以任意的組合對其進行嵌套,并可以多個層次進行嵌套。如一個清單可以包含一個字典,并在一個字典裡包含一個清單等。這裡以清單嵌套清單實作一個矩陣為例。
代碼示例如下:
M=[[1,2,3],[4,5,6],[7,8,9]]
# 輸出整個矩陣M
print(M)
# 讀取矩陣M的整個第二行
print(M[1])
# 讀取矩陣M第二行的第三個元素
print(M[1][2])
運作結果如下:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[4, 5, 6]
6
6.清單推導
清單推導源自數學中的集合概念。它是一種通過對序列中的每一項運作一個表達式來建立一個新清單的方法,每次一個,從左至右。清單推導是編寫在方括号中的,并且由使用了同一個變量名的表達式和循環結構組成。
代碼示例如下:
M=[[1,2,3],[4,5,6],[7,8,9]]
# 建立一個數組P,這個數組由數組M中每一項的第二個元素構成
'''這裡的row可以是任意可行性變量名'''
P=[row[1] for row in M]
print(P)
# 先對數組中每一項的第二個元素進行判定,是否能被2整除。滿足條件的元素進行*2操作
Q=[n[1]*2 for n in M if n[1]%2==0]
print(Q)
運作結果如下:
[2, 5, 8]
[4, 16]
7.生成連續整數
range函數:生成連續整數的功能
代碼示例如下:
# 原生函數range生成連續整數的功能'''range函數如果隻有一個參數,這個參數代表計數到這個參數(不包括這個參數)如果這個函數有三個參數,三個參數分别代表起始點(預設為0),結束點(不包括這個參數),步長'''
S=list(range(5))
L=list(range(4,10,2))
print(S,L)
運作結果如下:
[0, 1, 2, 3, 4] [4, 6, 8]
四.字典(可改變的映射)
Python中的字典是一種完全不同的東西:它們不是序列,而是一種映射(mapping)。映射同樣是一個其他對象的集合,但是它們是通過鍵(key)而不是相對位置來存儲對象的。字典是Python核心對象集合中唯一地一種映射類型,也具有可變性:同清單一樣,可以就地改變并随着需求增大或減小。
1.建立字典和通路
直接建立字典;
通過dict(name=value)建立;
通過dict(zip([names···],[values···])))建立;
通過鍵對這個字典進行索引來讀取、改變鍵所關聯的值;
拓展字典并進行指派。
代碼示例如下:
#建立1:
D={'food':'apple','color':'red','num':4}
#建立2:
D=dict(food='apple',color='red',num=4)
#建立3:
D=dict(zip(['food','color','num'],['apple','red',4]))
# 字典D通過鍵(key)對這個字典進行索引讀取
print(D['food'],D['color'])
# 字典D通過鍵(key)對這個字典進行索引改變鍵所關聯的值
D['num']=16
print(D)
# 與清單禁止邊界外的指派不同,對字典D拓展一個鍵并對其指派
D['value']='great'
print(D)
運作結果如下:
apple red
{'food': 'apple', 'color': 'red', 'num': 16}
{'food': 'apple', 'color': 'red', 'num': 16, 'value': 'great'}
2.重訪嵌套的建立和通路
這裡以字典中嵌套一個字典為例。
代碼示例如下:
D={
'name':{'first name':'Jerry','last name':'smith'},
'sex':'female',
'age':14}
# 通路字典D的'name'鍵,通路字典D鍵'name'嵌套的鍵'first name'
print(D['name'])
print(D['name']['first name'])
運作結果如下:
{'first name': 'Jerry', 'last name': 'smith'}
Jerry
3.字典中不存在的鍵
在通路字典中不存在的鍵時會報錯,我們可以使用if測試不存在鍵。
代碼示例如下:
D={'a':'A','b':'B','c':'C'
}# 字典D中不存在鍵'd'
print('d' in D)
# 使用if來測試不存在的鍵
if 'k' not in D:
print('沒有這個鍵')
運作結果如下:
False
沒有這個鍵
4.鍵的排序
因為字典不是一個序列,是以字典的鍵從左至右的順序是被打亂的,映射不是按位置排序的。解決辦法是先通過字典的keys方法收集一個鍵的清單,然後通過清單的sort方法進行排序,然後使用for循環循環逐個進行顯示結果。
代碼示例如下:
D={'a':1,'c':3,'b':2}
print(D)
# 将字典的鍵存儲在一個清單d1中
d1=list(D.keys())
# 對清單d1的元素進行排序
d1.sort()
# 使用for循環将d1中每個元素輸出并根據鍵将字典輸出
for str in d1:
print(str,'=',D[str])
運作結果如下:
{'a': 1, 'c': 3, 'b': 2}
a = 1
b = 2
c = 3
現在在最新的python版本中,可以将上述步驟用sorted函數一步到位。
代碼示例如下:
D={'a':1,'c':3,'b':2}
print(D)
# 使用sorted函數将字典D的鍵放在一個清單中,并将其按照升序排列# 使用for循環将每個鍵和它訓示的值輸出
for str in sorted(D):
print(str,'=',D[str])
運作結果如下:
{'a': 1, 'c': 3, 'b': 2}
a = 1
b = 2
c = 3
五.元組(不可改變的序列)
元組對象(tuple)基本上就像一個不可改變的清單,本質上是一個不可改變的序列,功能上是用來表示确定元素的集合。
1.建立元組
建立。(這裡元組的括号可以省略):
如下兩種建立方式是一樣的:
x=('apple','red',4)
x='apple','red',4
2.檢視元素偏移量、檢視元素個數
元組有兩個專有的可調用方法。index方法檢視某個元素的偏移量;count方法檢視這個元組中某個元素的個數。
代碼示例如下:
x=('apple','red',4)
# 調用index方法檢視某個元素的偏移量
print(x.index('apple'))
# 調用count方法檢視這個元組中某個元素的個數
print(x.count('apple'))
運作結果如下:
1
六.檔案
檔案對象是Python代碼調用電腦上存放的外部檔案的主要接口。它們可以被用于讀取和寫入文本記錄、音頻片段、Excel文檔、儲存郵件以及任何你儲存在電腦上的東西。
要建立一個檔案對象,需要調用内置的open函數以字元串的形式傳遞給它一個外部的檔案名以及一個可選的表示處理模式的字元串。
這裡python和之前的C語言的檔案操作有相似的地方,C語言對檔案操作需要建立檔案指針,python對檔案操作需要建立檔案對象。在檔案關閉前或緩沖區重新整理前,字元串内容存儲在緩沖區中,這時你在檔案中是看不到寫入的内容的。
代碼示例如下:
'''對檔案進行操作,需要open函數建立檔案對象,同時與close函數成對出現# 這裡的'w'是寫入資料的處理模式字元串'''
f=open('data.txt','w')
'''使用write方法在檔案中寫入字元串'''
f.write('hello\n')
f.write('world\n')
'''close方法與open成對出現'''
f.close()
#'r'是讀取資料的處理模式字元串,可以省略
f=open('C:\\Users\\19354\\PycharmProjects\\pythonProject3\\data.txt','r')
# 調用read方法讀取檔案中的字元
n=f.read()print(n)
f.close()
運作結果如下:
hello
world
七.集合(非序列、非映射的不可變的、無序的一種資料結構)
集合是新增在python中的類型,既不是序列,也不是映射。它們是唯一地不變的對象的無序集合。集合更像是一個無值的字典的鍵。
集合可以通過調用内置set函數建立,set函數的參數是可疊代對象,也可以集合字面量和表達式建立。
1.建立集合
集合建立,建立空集合的方法隻有x=set()這一種,因為y={},預設建立的是一個空字典。
如:
# 通過set函數進行建立一個集合,參數是一個可疊代對象,可為空
x=set('Hello')
# 通過{}直接建立,和字典類似,隻是沒有value
y={'h','e','l','l','0'}
2.取并集和取交集
代碼示例如下:
# 通過set函數進行建立一個集合,參數是一個可疊代對象,可為空
x=set('Hello')
# 通過{}直接建立,和字典類似,隻是沒有value
y={'h','e','l','l','0'}
# 通過&對兩個集合取交集
print(x&y)
# 通過|兩個集合取并集
print(x|y)
結果運作如下:
{'e', 'l'}
{'0', 'l', 'H', 'e', 'h', 'o'}
八.類型轉換
函數 | 說明 |
int(x [,base]) | 将x轉換我一個整數(這裡的base指代的是進制,預設為10進制) |
long(x [,base] ) | 将x轉換為一個長整數 |
float(x) | 将x轉換到一個浮點數 |
complex(real [,imag]) | 建立一個複數 |
str(x) | 将對象 x 轉換為字元串 |
repr(x) | 将對象 x 轉換為表達式字元串 |
eval(str) | 用來計算在字元串中的有效Python表達式,并傳回一個對象 |
tuple(s) | 将序列 s 轉換為一個元組 |
list(s) | 将序列 s 轉換為一個清單 |
set(s) | 轉換為可變集合 |
dict(d) | 建立一個字典。d 必須是一個序列 (key,value)元組 |
frozenset(s) | 轉換為不可變集合 |
chr(x) | 将一個整數轉換為一個字元 |
unichr(x) | 将一個整數轉換為Unicode字元 |
ord(x) | 将一個字元轉換為它的整數值 |
hex(x) | 将一個整數轉換為一個十六進制字元串 |
oct(x) | 将一個整數轉換為一個八進制字元串 |
【參考書目】:《Python學習手冊》