Introduction
此篇文章總結python一些常見的技術問題,每個都是簡短的解釋,篇幅不大,不斷更新中…
python
解釋一下python的 and-or 語法
python的and-or經常被用來實現類C語言中的三元運算符:?, 更騷包的寫法是 xxx and xxx or xxx and xxx or xxx,鏈接多個表達式,一行就夠了。面試
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。
不過有技巧可以實現:c#
def choose(bool, a, b):
return (bool and [a] or [b])[0]ide
Python裏面如何拷貝一個對象?
這個問題在 python cookbook中有很好的解釋。
標準庫中的copy模塊提供了兩個方法來實現拷貝.一個方法是copy,它返回和參數包含內容同樣的對象.函數式編程
import copy
new_list = copy.copy(existing_list)函數
有些時候,你但願對象中的屬性也被複制,可使用deepcopy方法:spa
import copy
new_list_of_dicts = copy.deepcopy(existing_list_of_dicts)orm
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))。
命名技巧
今天閱讀代碼,發現一個不錯的函數命名方式:
def request(_argv):
就是把全部的參數前面都加上_下劃線,這樣你在函數體中,一眼就能夠看出那些是局部變量,那些是做爲參數傳入的,相似把全局變量前面加上g。