21年最新Python面試題及答案彙總詳解(上)

千鋒武漢發表於2021-07-15

  Python面試你做準備了嗎?下面小編整理了一套2021年最新Python常見面試題目,及Python面試題目答案彙總。希望能夠幫助到大家。

面試

  21年最新Python面試題及答案彙總詳解(上)

  1、列表(list)和元組(tuple)有什麼區別?

  在我每一次應聘Python資料科學家的面試中,這個問題都會被問到。所以對這個問題的答案,我可以說是瞭如指掌。

  列表是可變的。建立後可以對其進行修改。

  元組是不可變的。元組一旦建立,就不能對其進行更改。

  列表表示的是順序。它們是有序序列,通常是同一型別的物件。比如說按建立日期排序的所有使用者名稱,如["Seth","Ema","Eli"]。

  元組表示的是結構。可以用來儲存不同資料型別的元素。比如記憶體中的資料庫記錄,如(2,"Ema","2020–04–16")(#id,名稱,建立日期)。

  2、如何進行字串插值?

  在不匯入Template類的情況下,有3種方法進行字串插值。

  name=Chris#

  1、fstringsprint(fHello{name})#

  2、%operatorprint(Hey%s%s%(name,name))#

  3、formatprint("Mynameis{}"、format((name)))

  3、“is”和“==”有什麼區別?

  在我的Python職業生涯的早期,我認為它們是相同的,因而製造了一些bug。所以請大家聽好了,“is”用來檢查物件的標識(id),而“==”用來檢查兩個物件是否相等。我們將透過一個例子說明。建立一些列表並將其分配給不同的名字。請注意,下面的b指向與a相同的物件。

  a=[1,2,3]b=ac=[1,2,3]

  下面來檢查是否相等,你會注意到結果顯示它們都是相等的。

  print(a==b)print(a==c)#=>;True#=>;True

  但是它們具有相同的標識(id)嗎?答案是不。

  print(aisb)print(aisc)#=>;True#=>;False

  我們可以透過列印他們的物件標識(id)來驗證這一點。

  print(id(a))print(id(b))print(id(c))#=>;

  4369567560#=>;

  4369567560#=>;

  4369567624

  你可以看到:c和a和b具有不同的標識(id)。

  4、什麼是裝飾器(decorator)?

  這是每次面試我都會被問到的另一個問題。它本身就值得寫一篇文章。如果你能自己用它編寫一個例子,那麼說明你已經做好了準備。

  裝飾器允許透過將現有函式傳遞給裝飾器,從而向現有函式新增一些額外的功能,該裝飾器將執行現有函式的功能和新增的額外功能。

  我們將編寫一個裝飾器,該裝飾器會在呼叫另一個函式時記錄日誌。

  編寫裝飾器函式logging。它接受一個函式func作為引數。它還定義了一個名為log_function_called的函式,它先執行列印出一些“函式func被呼叫”的資訊(print(f{func}called、)),然後呼叫函式func()。最後返回定義的函式。

  deflogging(func):deflog_function_called():print(f{

  func

  }

  called、

  )

  func()returnlog_function_called

  讓我們編寫其他兩個函式,我們最終會將裝飾器新增到其中(但還沒有)。

  defmy_name():print(chris)deffriends_name():print(naruto)my_name()friends_name()#=>;chris#=>;naruto

  現在將裝飾器新增到上面編寫的兩個函式之中。

  @loggingdefmy_name():print(chris)@loggingdeffriends_name():print(naruto)my_name()friends_name()#=>;<;functionmy_nameat0x10fca5a60>;called、#=>;chris#=>;<;functionfriends_nameat0x10fca5f28>;called、#=>;naruto

  現在,你瞭解瞭如何僅僅透過在其上面新增@logging(裝飾器),就能夠輕鬆地將日誌新增到我們編寫的任何函式中。

  5、解釋Range函式

  Range函式可以用來建立一個整數列表,一般用在for迴圈中。它有3種使用方法。

  Range函式可以接受1到3個引數,引數必須是整數。

  請注意:我已經將range的每種用法包裝在一個遞推式構造列表(listcomprehension)中,以便我們可以看到生成的值。

  用法1-range(stop):生成從0到引數“stop”之間的整數。

  [iforiinrange(10)]#=>;[0,1,2,3,4,5,6,7,8,9]

  用法2-range(start,stop):生成從引數“start”到“stop”之間的整數

  [iforiinrange(2,10)]#=>;[2,3,4,5,6,7,8,9]

  用法3-range(start,stop,step):以引數“step”為步長,生成從“start”到“stop”之間的整數。

  [iforiinrange(2,10,2)]#=>;[2,4,6,8]

  6、定義一個名為car的類,它有兩個屬性:“color”和“speed”。然後建立一個例項並返回“speed”。

  classCar:def__init__(self,color,speed):self、color=colorself、speed=speedcar=Car(red,100mph)car、speed#=>;100mph

  7、Python中的例項方法、靜態方法和類方法有什麼區別?

  例項方法:接受self引數,並且與類的特定例項相關。

  靜態方法:使用裝飾器@staticmethod,與特定例項無關,並且是自包含的(不能修改類或例項的屬性)。

  類方法:接受cls引數,並且可以修改類本身。我們將透過一個虛構的CoffeeShop類來說明它們之間的區別。

  classCoffeeShop:specialty=espressodef__init__(self,coffee_price):self、coffee_price=coffee_price#instancemethoddefmake_coffee(self):print(fMaking{self、specialty}for${self、coffee_price})#staticmethod@staticmethoddefcheck_weather():print(Itssunny)#classmethod@classmethoddefchange_specialty(cls,specialty):cls、specialty=specialtyprint(fSpecialtychangedto{specialty})

  CoffeeShop類有一個屬性specialty,預設值設為“espresso”。CoffeeShop類的每個例項初始化時都使用了coffee_price這個屬性。同時,它還有3個方法,一個例項方法,一個靜態方法和一個類方法。

  讓我們將coffee_price的值設為5,來初始化CoffeeShop的一個例項。然後呼叫例項方法make_coffee。

  coffee_shop=CoffeeShop(5)coffee_shop、make_coffee()#=>;Makingespressofor$5

  現在我們來呼叫靜態方法。靜態方法無法修改類或例項狀態,因此通常用於工具函式,例如,把2個數字相加。我們這裡用它來檢查天氣。天氣晴朗。太好了!

  coffee_shop、check_weather()#=>;Itssunny

  現在讓我們使用類方法修改CoffeeShop的屬性specialty,然後呼叫make_coffee()方法來製作咖啡。

  coffee_shop、change_specialty(dripcoffee)#=>;Specialtychangedtodripcoffeecoffee_shop、make_coffee()#=>;Makingdripcoffeefor$5

  注意,make_coffee過去是用來做意式濃縮咖啡(espresso)的,但現在用來做滴濾咖啡(dripcoffee)了!

  8、“func”和“func()”有什麼區別?

  這個問題的目的是想看看你是否理解所有函式也是Python中的物件。

  deffunc():print(Imafunction)func#=>;function__main__、func>;func()#=>;Imafunction

  func是表示函式的物件,它可以被分配給變數或傳遞給另一個函式。帶圓括號的func()呼叫該函式並返回其輸出。

  9、解釋map函式的工作原理。

  Map函式返回一個列表,該列表由對序列中的每個元素應用一個函式時返回的值組成。

  defadd_three(x):returnx+3li=[1,2,3][iforiinmap(add_three,li)]#=>;[4,5,6]

  上面,我對列表中的每個元素的值加了3。

  10、解釋reduce函式的工作原理。

  這個問題很棘手,在你使用過它幾次之前,你得努力嘗試自己能夠理解它。reduce接受一個函式和一個序列,然後對序列進行迭代。在每次迭代中,當前元素和前一個元素的輸出都傳遞給函式。最後,返回一個值。

  fromfunctoolsimportreducedefadd_three(x,y):returnx+yli=[1,2,3,5]reduce(add_three,li)#=>;11

  返回11,它是1+2+3+5的總和。

  11、解釋filter函式的工作原理

  Filter函式顧名思義,是用來按順序過濾元素。

  每個元素都被傳遞給一個函式,如果函式返回True,則在輸出序列中返回該元素;如果函式返回False,則將其丟棄。

  defadd_three(x):ifx%2==0:returnTrueelse:returnFalseli=[1,2,3,4,5,6,7,8][iforiinfilter(add_three,li)]#=>;[2,4,6,8]

  注意上面所有不能被2整除的元素如何被刪除的。

  12、Python是按引用呼叫還是按值呼叫?

  如果你在谷歌上搜尋這個問題並閱讀前幾頁,你就要準備好進入語義的迷宮了。你最好只是瞭解它的工作原理。

  不可變物件(如字串、數字和元組等)是按值呼叫的。請注意下面的例子,當在函式內部修改時,name的值在函式外部不會發生變化。name的值已分配給記憶體中該函式作用域的新塊。

  name=chrdefadd_chars(s):s+=isprint(s)add_chars(name)print(name)#=>;chris#=>;chr

  可變物件(如列表等)是透過引用呼叫的。注意下面的例子中,函式外部定義的列表在函式內部的修改是如何影響到函式外部的。函式中的引數指向記憶體中儲存li值的原始塊。

  li=[1,2]defadd_element(seq):seq、append(3)print(seq)add_element(li)print(li)#=>;[1,2,3]#=>;[1,2,3]

  13、如何使用reverse函式反轉一個列表?

  下面的程式碼對一個列表呼叫reverse()函式,對其進行修改。該方法沒有返回值,但是會對列表的元素進行反向排序。

  li=[a,b,c]print(li)li、reverse()print(li)#=>;[a,b,c]#=>;[c,b,a]

  14、字串乘法是如何工作的?

  讓我們看看將字串"cat"乘以3的結果。

  cat*3#=>;catcatcat

  該字串將自身連線3次。

  15、列表乘法是如何工作的?

  我們來看看將列表[1,2,3]乘以2的結果。

  [1,2,3]*2#=>;[1,2,3,1,2,3]

  輸出的列表包含了重複兩次的列表[1,2,3]的內容。

   本文來自千鋒教育,轉載請註明出處。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2781223/,如需轉載,請註明出處,否則將追究法律責任。

相關文章