Python基礎技術問題總結

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。

相關文章
相關標籤/搜索