Introduction
此篇文章總結python一些常見的技術問題,每一個都是簡短的解釋,篇幅不大,不斷更新中…
解釋一下python的 and-or 語法
python的and-or常常被用來實現類C語言中的三元運算子:?, 更騷包的寫法是 xxx and xxx or xxx and xxx or xxx,連線多個表示式,一行就夠了。
1 2 3 4 5 6 7 8 |
if a > 10: return "big" elif a > 5: return "middle" else: return "small" a > 5 and "big" or a > 3 and "middle" or "small" |
但是要注意and-or並不完全等價於三元運算子,因為 a and b or c ,如果b是個假值,那麼將返回c。
不過有技巧能夠實現:
1 2 |
def choose(bool, a, b): return (bool and [a] or [b])[0] |
Python裡面如何拷貝一個物件?
這個問題在 python cookbook中有很好的解釋。
標準庫中的copy模組提供了兩個方法來實現拷貝.一個方法是copy,它返回和引數包含內容一樣的物件.
1 2 |
import copy new_list = copy.copy(existing_list) |
有些時候,你希望物件中的屬性也被複制,可以使用deepcopy方法:
1 2 |
import copy new_list_of_dicts = copy.deepcopy(existing_list_of_dicts) |
1 2 3 4 5 |
copy(x) Shallow copy operation on arbitrary Python objects. deepcopy(x, memo=None, _nil=[]) Deep copy operation on arbitrary Python objects. |
python中如何判斷物件相等
也有一個類似的問題會被面試官問爆,我們不能將這個問題弄混了。
首先是C#中字串的==和equal方法。
“==” :
對於內建值型別而言, == 判斷兩個記憶體值是否相等。
對於使用者自定義的值型別而言(Struct), == 需要過載,否則不能使用。
對於引用型別而言,預設是同一引用才返回true,但是系統過載了很多引用型別的 == (比如下文提到的string),所以c#中引用型別的比較並不建議使用 ==。
“equals” :
對於值型別而言, 記憶體相等才返回true。
對於引用型別而言,指向同一個引用才算相等。
但是比較特殊的是字串String,是一個特殊的引用型型別,在C#語言中,過載了string的equals()方法,使string物件用起來就像是值型別一樣。
python中的 ==
python中的物件包含三要素:id, type, value
id 用來標識唯一一個物件,type標識物件的型別,value用來設定物件的值。
is 判斷是否是一個物件,使用id來判斷的。
== 是判斷a物件的值是否是b物件的值,預設呼叫它的__eq__方法。
什麼是lambda函式?它有什麼好處?
早期自認為看了許多東西,總想把lambda表示式和lambda演算之間的關係研究明白,但是後來發現,文獻中除了說lambda這個名字的由來是借鑑了lambda演算之外,再沒有談及其它。
那麼lambda表示式有什麼好處?匿名函式,一般用來給filter,map這樣的函數語言程式設計服務,map(lambda x: x*2,[1,2,3,4,5])
或者就是一次性產品。類似於這種即用即扔的產品:(lambda x: x*2)(3)
或者作為回撥函式,傳遞給某些應用,比如訊息處理。
請寫出一段Python程式碼實現刪除一個list裡面的重複元素
可能有人用迴圈對比刪除的辦法去實現,不過有一個更優雅的辦法,list(set(li))。
命名技巧
今天閱讀程式碼,發現一個不錯的函式命名方式:
1 |
def request(_argv): |
就是把所有的引數前面都加上_下劃線,這樣你在函式體中,一眼就可以看出那些是區域性變數,那些是作為引數傳入的,類似把全域性變數前面加上g。