全域性變數 陣列 第二章 序列構成陣列

2021-10-12 09:20:42 字數 2654 閱讀 9202

python 風格: 序列的泛型操作, 內建元組和對映型別, 用縮進來架構的原始碼, 無需變數宣告的強型別等.

python 從 abc 語言繼承了用統一風格處理序列資料. 資料結構都共用同一套操作: 迭代, 切片, 排序, 和拼接.

容器序列: list, tuple, collections.deque 等能存放不同型別的資料的引用,

扁平序列: str, bytes, bytearray, memoryview和array.array 等只能容納同一種型別的.

序列型別還能按照能否被修改來分類

可變序列:(mutablesequence): list, bytearray, array.array等

不可變序列(sequence): str, tuple 和 bytes

列表推導, 通常只用於建立新的列表, 並且盡量簡單. 避免其他操作, 例如用來重複獲取乙個函式的***

python 會忽略**裡面, {}, () 中的換行, 可以省略不好看的續行符

python3 中列表推導不會再有變數洩露問題, 即中變數, 影響到全域性變數.

列表推導可以同 filter , map, zip等內建函式結合使用, 且速度不一定比lambda慢, eg:[ord(s) for s in symbols if ord(s) > 127]

生產器表示式, 主要用來節省記憶體. 當用作函式引數時, 只有它自己時, 可以省略乙個括號, 即tuple(ord(symbol) for symbobl in symbols)

元組即可用作不可變的列表, 還可以用於沒有欄位名的記錄. eg:city, year, pop, chg, area = ('tokyo', 2003, 32450, 0.66, 8014) # 元組拆包

*運算子, _佔位符, 經常用在元組拆包中.

具名元組,collections.nametuple工廠函式, 可以用來建立乙個帶欄位名的元組和乙個有名字的類

作為不可變的列表與list對比, 有一張方法和屬性對比表2-1, 見p27

根據實用性, 列表常用來存放相同型別, 元組常用來存放不同型別, 也符合記錄的本質

list, tuple, str等都支援切片操作

為什麼切片和區間會忽略最後乙個元素 - 當只有最後乙個位置資訊, 可以快速看出有幾個元素.range(3), my_list[:3]- 當起止位置都可見, 可以快速計算長度(stop-start) - 快速將序列拆成兩個不重疊的部分,my_list[:x], my_list[x:]- 符合其他同樣以0開始的傳統

切片背後, 其實是呼叫切片物件 slice(a, b, c), 在 10.4.1節有詳細講解

多維切片和省略一般用在numpy模組中

切片賦值, 值必須是iterable

python預設序列支援運算子+, *, 注意前者需要兩邊由相同資料型別構成, 兩個運算子返回值都是新建乙個全新序列.

對於運算子*需要特別注意, 存在巢狀的情況下, 複製的是索引即[[1,2,3]]*2, --> [[1,2,3], [1,2,3]], 改變第乙個列表, 第二個列表會跟隨變化.

增量賦值的特殊方法__iadd__, __imul__ --> +=, *=, 找不到增量賦值的特殊方法就會呼叫+, *, 注意對於可變序列會就地改變, 對於不可變序列會返回全新序列. 所以對不可變序列執行增量賦值會很慢.

另外, 有一些教訓 - 不要將可變物件放在元組裡面, eg:t=(1,2,[30,40]); t[2]+=[50,60], 會報錯typeerror, 但t還是被改變了, 邊界問題- 增量賦值不是原子操作 - 檢視 python 的位元組碼並不難, dis.dis()函式, 對於理解**背後執行機制很有幫助

list.sort 方法會就地排序, 內建函式 sorted 會返回全新列表.

兩者有相同引數, reverse 和 key, key 接受僅乙個引數的函式, 會將序列中每個元素先執行函式再比較. eg: key=str.lower 忽略大小寫排序

兩個排序演算法都是穩定的, 採用自適應排序演算法timsort, 特點是交替使用插入排序和歸併排序.

bisect模組包含兩個函式, bisect和insort, 兩者利用二分查詢演算法來在有序序列中查詢或插入元素

檢查乙個元素是否出現在另乙個集合中, 使用 set 更適合, set 專為檢查元素是否存在做過優化

當列表不是首選, - 陣列, 建立陣列需要乙個型別碼, 即只能存放一種型別, 當處理千萬浮點數的時候, 比列表明顯更高效 - 記憶體檢視, memoryview 是乙個內建類, 能讓使用者不複製內容的情況下操作同乙個陣列的不通過切片, 來自numpy的啟發. - numpy, scipy, 提供高階陣列和矩陣操作, pandas和blaze提供資料分析的工具 - 雙向佇列和其他形式的佇列, 一般都實現了執行緒安全. - collections.deque(雙向佇列), - queue的queue, lifoqueue, priorityqueue. - multiprocessing, asyncio, heapq 等

第二章(提煉) 序列構成的陣列(三)

python 程式設計師會預設序列是支援 和 操作的。通常 號兩側的序列由相同型別的資料所構成,在拼接的過程中,兩個被操作的序列都不會被修改,python 會新建乙個包含同樣型別資料的序列來作為拼接的結果。如果想要把乙個序列複製幾份然後再拼接起來,更快捷的做法是把這個序列乘以乙個整數。和 都遵循這個...

MATLAB入門 第二章 矩陣和陣列

2.1矩陣的建立與合併 1 由於matlab是基於矩陣運算的,所以使用者輸入的所有資料均被儲存為矩陣或陣列。即使是單個變數,如 a 1 whos命令可以檢視工作空間內儲存的變數的資訊 建立矩陣 這個識別符號 相鄰元素用逗號或者空格分隔 換行用分號 使用 初值 步長 終值 可以建立向量 即行向量 列向...

C 學習 第二章C語言基礎 (六)陣列

int a 10 注意,陣列名是存放第乙個元素的位址。int mian printf a p n a for int i 0 i 5 i a 100 printf d p p n a 0 a,a 0 for int i 0 i 5 i return 0 這裡沒寫資料越界的例子,資料越界會影響其他資料...