1. 程式人生 > 其它 >流暢的python第二章 --列表

流暢的python第二章 --列表

技術標籤:流暢的python學習筆記列表python列表

  • 容器序列:

list、tuple和collections.deque這些序列能存放不同型別的資料。

  • 扁平序列:

str、bytes、bytearray、memoryview和array.array,這類序列只能容納一種型別。

容器序列:存放的是他們所包含的任意型別的引用

扁平序列: 存放的是值,而不是引用。扁平序列是一塊連續的空間,因此扁平序列更加緊湊。

  • 序列型別也可以按照能否被修改分類

  • 可變序列

list、bytearray、array.array、collections.deque和memoryview

  • 不可變序列

tuple、str

bytes

  • 可變序列 和 不可變序列的不同

  • 列表推導是構建列表的快捷方式

將 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]