Python序列類型
容器序列:
list靶病、tuple会通、和collections.deque這些序列能存放不同類型的數(shù)據(jù)。
扁平序列:
str娄周、bytes渴语、bytearray、memoryview和array.array昆咽,這些序列只能容納一種類型。
容器序列存放的是它們所包含的任意類型的對象的引用,而扁平序列里存放的是值而不是引用掷酗,換句話說调违,扁平序列其實是一段連續(xù)的內(nèi)存空間。由此可見扁平序列其實更加緊湊泻轰,但是它里面只能存放諸如字符技肩、字節(jié)和數(shù)值這種基礎(chǔ)類型。
可變序列
list浮声、bytearray虚婿、array.array、collections.deque和memoryview
不可變序列
tuple泳挥、str和bytes
列表推導
示例1:把一個字符串變成unicode碼位的列表
示例2
示例2為列表推導的結(jié)果然痊,通常的原則是,只用列表推導來創(chuàng)建新的列表屉符,并且盡量保持簡短剧浸。
元組
元組是不可變列表。
元組拆包
例一:city, year,pop,chg,area=('Tokyo',2003,32450,0.66,8014)
例二:交換兩個變量的值:a, b = b, a
例三:>>>t = (20, 8) ? >>>quotient, remainder = div(*t)
對對象進行切片
我們可以用s[a:b:c]的形式對s在a和b之間以c為間隔取值
對序列使用+和*
python程序員會默認序列是支持+和*的矗钟。通常+號兩側(cè)的序列由相同類型的數(shù)據(jù)所構(gòu)成唆香,在拼接的過程中,兩個被操作的序列都不會被修改吨艇,python會新建一個包含同類型數(shù)據(jù)的序列來作為拼接的結(jié)果躬它。
如果想要把一個序列復制幾份然后再拼接起來,更快捷的做法是把這個序列乘以一個整數(shù)东涡。
+和*都遵循這個規(guī)律冯吓,不修改原有的操作對象,而是構(gòu)建一個全新的序列软啼。
建立由列表組成的列表
例:一個包含3個列表的列表桑谍,嵌套3個列表各自有3個元素來代表井字游戲的一行方塊,使用了列表推導
下例展示了另一個方法祸挪,這個方法看上去是個誘人的捷徑锣披,但實際上是錯的
上述這個例子相當于把一個對象追加3次
序列的增量賦值
增量賦值運算符+=和*=的表現(xiàn)取決于它們的第一個操作對象,+=背后的特殊方法是__iadd__贿条,但是如果一個類沒有實現(xiàn)這個方法的話雹仿,python會退一步調(diào)用__add__。
如果a實現(xiàn)了__iadd__方法整以,就會調(diào)用這個方法胧辽。同時對可變序列(例如list、bytearray和array.array)來說公黑,a會就地改動邑商,就像調(diào)用了a.extend(b)一樣摄咆。但是如果a沒有實現(xiàn)__iadd__的話,a+=b這個表達式的效果就變得跟a=a+b一樣了人断,首先計算a+b吭从,得到一個新的對象,然后賦值給a恶迈。也就是說涩金,在這個表達式中,變量名會不會關(guān)聯(lián)到新的對象暇仲,完全取決于這個類型有沒有實現(xiàn)__iadd__這個方法步做。
總的來講,可變序列一般都實現(xiàn)了__iadd__方法奈附,而不可變序列不支持這個操作全度。
list.sort方法和內(nèi)置函數(shù)sorted
list.sort方法會就地排序列表,也就是說不會把原列表復制一份桅狠。這也是這個方法的返回值是None的原因讼载,與list.sort相反的是內(nèi)置函數(shù)sorted,它會新建一個列表作為返回值中跌。這個方法可以接受任何形式的可迭代對象作為參數(shù)咨堤。
這兩個函數(shù)的關(guān)鍵字參數(shù):
reverse:如果被設(shè)定為True,被排序的序列里的元素會以降序輸出漩符。
key:一個只有一個參數(shù)的函數(shù)一喘,這個函數(shù)會被用在序列里的每一個元素上。
當列表不是首選時
雖然列表既靈活又簡單嗜暴,但面對各類需求時凸克,我們可能會有更好的選擇。比如闷沥,要存放1000萬個浮點數(shù)的話萎战,數(shù)組(array)的效率要高的多,因為數(shù)組在背后存放的并不是float對象舆逃,而是數(shù)字的機器翻譯蚂维,也就是字節(jié)表述。再比如說路狮,如果需要頻繁對序列做先進先出的操作虫啥,deque的速度會快得多