串列推導式
Python里面有個很棒的語法糖(syntactic sugar),它就是 list comprehension ,有人把它翻譯成“串列推導式”,也有人翻譯成“串列決議式”,名字聽上去很難理解,但是看它的語法就很清晰了,雖然名字叫做 list comprehension,但是這個語法同樣適用于dict、set等這一系列可迭代(iterable)資料結構,
語法規范:
其中的 if 條件判斷根據需要可有可無,
下面看一個具體的例子,生成一個包含10以內的偶數的list:
由for回圈升級到串列推導式:
在沒有了解 list comprehension 之前,上面那個生成偶數list的通常做法是用 for 回圈:
很明顯, for 回圈占用了4行代碼,而 list comprehension 只用了1行代碼,
文章開始說到推導式的語法規范時,我們講了 if 運算式是可有可無的,這也符合我們編程遇到的實際情況,比如,要生成一個10以內的整數的平方的串列:
復雜的嵌套回圈
我們先來看一個例子,把一個矩陣(以串列為元素的串列)展平為一個串列,首先,我們用 for 回圈來實作一下:
接著我們用串列推導式實作該功能:
還是一行代碼就搞定,但一行里面有兩個 for ,看起來很亂,兩個 for ,哪個在前哪個在后呢?只要記住他們的順序和不用推導式的原始for回圈是一致的即可,
推導式的可讀性
一行代碼搞定幾行代碼的事情,看上去很簡潔,但是讀起來很費勁,尤其是當條件陳述句很長的時候,把這一行代碼變得很長,超過了代碼規范規定的長度(一般是80個字符),也使得理解代碼變得困難,
面對一行長長的代碼該如何下口讀,如何理解呢?別著急,好在Python允許在中括號、花括號之間斷行:
串列推導式的斷行:
斷行前:
斷行后:
帶嵌套回圈的推導式的斷行:
斷行前:
斷行后:
字典(dict)和集合(set)的推導式
前面我們也提到過,推導式不僅僅適用于串列,它同樣使用于字典dict和集合set,
把一個字典的key和value互換:
用一個串列的所有單詞的首字母生成一個集合:
通過以上講解就可以輕松掌握Python的串列推導式( list comprehension )了,簡而言之,就是把普通的多行for回圈壓縮成一行代碼,這種壓縮語法適用于串列、字典、集合等可迭代資料結構(iterables),
深淺拷貝
物件參考、淺拷貝、深拷貝(拓展、難點、重點)
Python中,物件的賦值,拷貝(深/淺拷貝)之間是有差異的,如果使用的時候不注意,就可能產生意外的結果
其實這個是由于共享記憶體導致的結果
拷貝:原則上就是把資料分離出來,復制其資料,并以后修改互不影響,
先看 一個非拷貝的例子
使用=賦值(物件參考)
=賦值:資料完全共享
=賦值是在記憶體中指向同一個物件,如果是可變(mutable)型別,比如串列,修改其中一個,另一個必定改變
如果是不可變型別 (immutable) ,比如字串,修改了其中一個,另一個并不會變
淺拷貝(copy)
淺拷貝:資料半共享(復制其資料獨立記憶體存放,但是只拷貝成功第一層)
深拷貝(deepcopy)
深拷貝:資料完全不共享(復制其資料完完全全放獨立的一個記憶體,完全拷貝,資料不共享)
深拷貝就是完完全全復制了一份,且資料不會互相影響,因為記憶體不共享,
深拷貝的方法有
總結:
copy.copy 淺拷貝 只拷貝父物件,不會拷貝物件的內部的子物件,
copy.deepcopy 深拷貝 拷貝物件及其子物件
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265291.html
標籤:其他
