流暢的python第二章 --列表
- 容器序列:
list、tuple和collections.deque這些序列能存放不同型別的資料。
- 扁平序列:
str、bytes、bytearray、memoryview和array.array,這類序列只能容納一種型別。
容器序列:存放的是他們所包含的任意型別的引用
扁平序列: 存放的是值,而不是引用。扁平序列是一塊連續的空間,因此扁平序列更加緊湊。
-
序列型別也可以按照能否被修改分類
- 可變序列
list、bytearray、array.array、collections.deque和memoryview。
- 不可變序列
tuple、str
- 可變序列 和 不可變序列的不同
- 列表推導是構建列表的快捷方式
將 l1 中的元素新增到 ls 中
l1 = 'abcdefg'
ls = []
for i in l1:
ls.append(ord(i))
- 使用列表推導
l1 = 'abcdefg'
ls = [ord(n) for n in l1]
- 元組和記錄
元組其實是對資料的記錄:元組中的每個元素都存放了記錄中一個欄位的資料,外加這個欄位的位置。正是這個位置資訊給資料賦予了意義。
t1 = ('Zhangsan', 30, 180) name, age, height = t1 print(name, age, height) >>Zhangsan 30 180
- 巢狀元組拆包
接受表示式的元組可以是巢狀式的,例如(a, b, (c, d))。只要這個接受元組的巢狀結構符合表示式本身的巢狀結構,Python就可以作出正確的對應
t1 = ('Zhangsan', 30, 180,('中國','北京'))
name,age,height,(country,city) = t1
print(name,age,height,country,city)
>>Zhangsan 30 180 中國 北京
- 具名元組
collections.namedtuple用於產生具名元組 people = collections.namedtuple('people',['name','age','height']) p1 = people('Zhangsan',30,180)collections.namedtuple用於產生具名元組 people = collections.namedtuple('people',['name','age','height']) p1 = people('Zhangsan',30,180) print(p1) print(p1)
- 具名元組的屬性和方法
1._fields屬性是一個包含這個類所有欄位名稱的元組。
2. 用_make( )通過接受一個可迭代物件來生成這個類的一個例項,它的作用跟people('Zhangsan',30,180)是一樣的。
3._asdict( )把具名元組以collections.OrderedDict的形式返回,我們可以利用它來把元組裡的資訊友好地呈現出來。
- 序列的增量賦值
增量賦值運算子+=和*=的表現取決於它們的第一個操作物件。+= 背後的特殊方法時__iadd__方法但是如果一個類沒有__iadd__方法,python會退而求其次,呼叫__add__.
a += b
如果 a實現了__iadd__方法,a會就地改變,就行呼叫了a.extend(b)一樣。如果a沒有實現__iadd__方法,a+=b這個表示式的效果就變得跟a=a+b一樣了。首先計算 a + bD得到一個新物件,再將新物件賦值給a。也就是說,在這個表示式中,變數名會不會被關聯到新的物件,完全取決於這個型別有沒有實現__iadd__這個方法。
print("實現了__iadd__")
l = [1,2,3]
print('id=',id(l),'element',l)
l += l
print('id=',id(l),'element',l)
print('沒有實現__iadd__')
t = (1,2,3)
print('id=',id(t),'element',t)
t+=t
print('id=',id(t),'element',t)
>>實現了__iadd__
>>id= 220358736 element [1, 2, 3]
>>id= 220358736 element [1, 2, 3, 1, 2, 3]
>>沒有實現__iadd__
>>id= 61442608 element (1, 2, 3)
>>id= 220387792 element (1, 2, 3, 1, 2, 3)
- list.sort方法和內建函式sorted
list.sort方法會就地排序列表,也就是說不會把原列表複製一份。這也是這個方法的返回值是None的原因,提醒你本方法不會新建一個列表。在這種情況下返回None其實是Python的一個慣例:如果一個函式或者方法對物件進行的是就地改動,那它就應該返回None,好讓呼叫者知道傳入的引數發生了變動,而且並未產生新的物件。例如,random.shuffle函式也遵守了這個慣例。
用返回None來表示就地改動這個慣例有個弊端,那就是呼叫者無法將其串聯起來。而返回一個新物件的方法(比如說str裡的所有方法)則正好相反,它們可以串聯起來呼叫,從而形成連貫介面(fluent interface)。
與list.sort相反的是內建函式sorted,它會新建一個列表作為返回值。這個方法可以接受任何形式的可迭代物件作為引數,甚至包括不可變序列或生成器(見第14章)。而不管sorted接受的是怎樣的引數,它最後都會返回一個列表。
不管是list.sort方法還是sorted函式,都有兩個可選的關鍵字引數。
Reverse
如果被設定為True,被排序的序列裡的元素會以降序輸出(也就是說把最大值當作最小值來排序)。這個引數的預設值是False。
Key
一個只有一個引數的函式,這個函式會被用在序列裡的每一個元素上,所產生的結果將是排序演算法依賴的對比關鍵字。比如說,在對一些字串排序時,可以用key=str.lower來實現忽略大小寫的排序,或者是用key=len進行基於字串長度的排序。這個引數的預設值是恆等函式(identity function),也就是預設用元素自己的值來排序
s11 = [11,12,13,5,7,9]
s11 = sorted(s11)
print(s11) #1
s11 = sorted(s11,reverse=True)
print(s11) #2
def mod(var):
return var%5
s11 = sorted(s11,reverse=True,key = mod)
print(s11) #3
>>[5, 7, 9, 11, 12, 13]
>>[13, 12, 11, 9, 7, 5]
>>[9, 13, 12, 7, 11, 5]