Tungsten Fabric SDN — SmartNIC vRouter
792
2022-05-30
3.3.3 字符串和列表
字符串和列表本來是不同的兩種數據類型,但是它們之間有很多共性,因此這里放在一起講。
1.字符串和列表的共性
在Python中,字符串有3種表現形式:'abc',"abc"和"""abc"""。這3種字符串都是合法的字符串,只是使用的場合不同。單引號形式的字符串和雙引號的字符串基本相同,只是,在處理特殊字符的時候,雙引號字符串更加方便,建議大家在平常的開發中使用雙引號形式;三引號形式的字符串通常用于文檔字符串和SQL語句中。
Python中沒有數組的概念,與之對應的是列表。這是一種新的數據形式,一個合法的列表如下:
List_1 = [1,1.2,"abc",[1,2,3]]
可以看到,列表里面的元素可以是任意類型的數據,一個列表并不受限于元素的類型。
從本質上來說,字符串是一類特殊的列表,因此,列表的大部分操作同樣適用于字符串。下面用一些示例來說明字符串(String)和列表的共同點。
取下標操作:
Str_awcloud = "awcloud"
List_awcloud = ["a","w","c","l","o","u","d"]
print Str_awcloud[0] -> a
print List_awcloud [0] -> a
截取第1個到第4個元素之間的元素:
print Str_awcloud[1:4] -> wcl
print List_awcloud [1:4] -> ['w', 'c', 'l']
截取第1個到第4個元素之間的元素,每隔2個元素取一次:
print Str_awcloud[1:4:2] -> wl
print List_awcloud [1:4:2] -> ['w', 'l']
取得某個元素的下標:
print Str_awcloud.index("a") -> 0
print List_awcloud.index("a") -> 0
逆序取得某個元素:
print Str_awcloud[-1] -> d
print List_awcloud [-1] -> ['d']
追加元素:
print Str_awcloud + "678"-> awcloud678? #1
print List_awcloud + [6,7,8]-> ['a', 'w', 'c', 'l', 'o', 'u', 'd', '123', 6, 7, 8] #2
計算長度:
print len(Str_awcloud) -> 8
print len(List_awcloud) -> 8
多次復制:
print Str_awcloud * 2 -> awcloudawcloud
print List_awcloud * 2 -> ['a', 'w', 'c', 'l', 'o', 'u', 'd', 'a', 'w', 'c', 'l', 'o', 'u', 'd]
復制:
Str_target = Str_awcloud[:]
List_target = List_awcloud[:]
print Str_target -> awcloud
print List_target ->-> ['a', 'w', 'c', 'l', 'o', 'u', 'd']
請注意以上加粗部分,加粗代碼表示該操作將返回一個結果,該結果由另外的變量接收,并不改變當前變量。另外,請注意追加元素示例代碼的#1和#2,列表沒有“類型”,但是列表在進行運算時是有類型的,也就是說列表的“+”操作,必須在列表和列表之間進行。同樣地,字符串的“+”操作也必須在字符串和字符串之間操作,并不支持不同類型之間的操作,這點和Java不同。
2.字符串是特殊的列表
特殊性1:字符串的值是常量,是不可變動的,而列表是可更改的。例如,
Str_awcloud = "awcloud"
List_awcloud = ["a","w","c","l","o","u","d"]
可以使用如下代碼:
List_awcloud [0] = "b" -> List_awcloud
將列表變更為[“b”,”w”,”c”,”l”,”o”,”u”,”d”]。但若使用下面的代碼:
Str_awcloud[0] = "b" ->
系統會直接報錯,由于此特性沒有對字符串的插入、追加等操作,這些操作也不被允許,而列表則可以進行這些操作。
列表的追加:
List_awcloud.append(89) -> List_awcloud = ["b","w","c","l","o","u","d",89]
在列表的第1位插入數據:
List_awcloud[1:1] = [0,9,8] -> List_awcloud = ["b",0,9,8,"w","c","l","o","u","d",89]
特殊性2:字符串只是特殊的列表,字符串也是一種數據類型,擁有自己的特殊函數和方法。
將字符串進行大小寫轉換:
Str_awcloud.upper() Str_awcloud.lower()
字符串的追加:
"".join([Str_awcloud,"123"])
說明 字符串的值是常量,是不可改變的,因此,對字符串進行追加。插入甚至修改,操作的都只是字符串的副本,并不是字符串本身。
字符串有“+”操作,也有join操作,這兩個操作的執行結果是一樣的,但是,從執行效率來說,join操作要比“+”快,因此,以后在對字符串進行操作時,如果遇到字符串的拼接操作,建議首選join操作,而不是“+”。
這里提出一個優化原則:編寫Python代碼,首要目標是可讀性好,其次要求執行效率高。關于如何提高Python的執行效率,會在后面陸續介紹。
特殊性3:列表也擁有自己的特殊方法。修改一下字符串和列表之間的關系定義——字符串和列表是不同的數據類型,但是,二者之間有很多交集,很多方法可以通用,但是,并不是說字符串就是列表,字符串和列表之間沒有子集關系。
關于字符串的具體操作和特性可以查看Python的幫助手冊,這里不再介紹。
3.列表
首先,看一下如何構造一個列表:
List_0 = list("awcloud")
List_1 = [1,2,3,"awcloud"]
List_2 = [x for x in range(10)]
List_3 = [x for x in xrange(10)]
List_4 = map(lambda x: x,[1,2,3,4,5])
以上五句代碼,功能是一樣的,都是創建一個列表。具體分析如下。
第一句,List_0 = list(“awcloud”),實際上是調用Python的內置方法list來構造一個列表。前面已經學了數字、字符串和列表,其實,這三大類數據類型都有自己的內置構造方法,例如,int類型的構造方法是int(),字符串類型的構造方法是str(),而列表的構造方法是list()。如果需要生成或者轉換成對應的數據類型,只需要調用對應的構造方法即可。
第二句,直接進行初始化。
第三句和第四句類似,里面涉及for關鍵字和其他的一些內置函數。
第五句直接使用其他內置函數來構造一個列表。
在以上五句代碼中,引入了一些關鍵字,如for、in、lambda,也引入了一些內置函數,如range、xrange以及map。為了更好地理解以上代碼的功能,下面將詳細講解這幾個重要的關鍵字和函數。
關鍵字in:表示某個元素存在于另一個元素中。例如:
"a" in "awcloud" -> True
"a" in [1,2,3,4,5] -> False
在這個輸出結果中,看到了兩個新的關鍵字:True和False。這兩個關鍵字用于表示真和假,與C、Java語言中的用法一樣。
關鍵字for:用于進行迭代或者循環的關鍵字,與C、Java語言中的用法一樣,唯一不同的是,在Python中,for關鍵字需要配合in關鍵字使用。
例如:
for x in [1,2,3] print x
關鍵字lambda:構造一個匿名函數,實現簡易的功能。
例如:
result = lambda x:x + 1
等同于
def result(x):return x + 1
函數range:根據指定的參數返回一個列表。例如:
range(10)-> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
range(10,20) -> [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
range(10,20,2) -> [10, 12, 14, 16, 18]
函數xrange:xrange的功能和range的功能類似,不同的是,range一旦執行,那么生成的列表將立即存放到內存當中,而xrange采用了一種類似懶加載的方式,當xrange被執行時并沒有真正生成所需要的列表,或者說生成的列表并沒有立即被放到內存當中,只有當生成的列表被調用時,該列表才會被依次展開。
因此,這里提出Python性能優化的第二條原則:在生成列表時,如果數據量比較小 (<5),建議使用range;其他情況,推薦使用xrange。
函數map:先來看一下map函數的定義。
map(function, sequence[, sequence, ...]) -> list
可見,map接收兩個參數,第一個參數為一個函數,第二個參數為一個序列或者可迭代對象,它的返回值為一個列表。
下面來看一下前面提到的列表構造的問題。
List_2 = [x for x in range(10)]
效果等同于
List_2= range(10)
但有不同于:
List_3 = [x for x in xrange(10)]
List_4 = map(lambda x: x,[1,2,3,4,5])
List_2表示使用range(10)中所產生的元素來構造一個列表。List_3同第一句,只是在內存處理方面不一樣。List_4則是使用map函數產生一個列,請注意加粗部分,它們的效果是等同的,但是也存在不同之處。
List_2 = [x for x in range(10)]這種語法形式叫作列表推導,它和數學中的集合類似,例如,該句可以用如下的數學表達式表示:{x ∈[0,10)}。而List_2 = range(10)則是單純的賦值操作,兩者的性質不一樣。在Python的實現中,列表推導要比直接賦值來得快。
因此,在這里提出Python性能優化的第三條原則:構造列表時,推薦使用列表推導。
OpenStack Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。