好程式設計師Python培訓分享Python面試寶典之基礎篇-03

好程式設計師發表於2020-04-21

好程式設計師 Python 培訓分享 Python 面試寶典之基礎篇 -03

 

題目011:Python中為什麼沒有函式過載?

點評 C++、Java、C#等諸多程式語言都支援函式過載,所謂函式過載指的是在同一個作用域中有多個同名函式,它們擁有不同的引數列表(引數個數不同或引數型別不同或二者皆不同),可以相互區分。過載也是一種多型性,因為通常是在編譯時透過引數的個數和型別來確定到底呼叫哪個過載函式,所以也被稱為編譯時多型性或者叫前繫結。這個問題的潛臺詞其實是問面試者是否有其他程式語言的經驗,是否理解Python是動態型別語言,是否知道Python中函式的可變引數、關鍵字引數這些概念。

首先Python是解釋型語言,函式過載現象通常出現在編譯型語言中。其次Python是動態型別語言,函式的引數沒有型別約束,也就無法根據引數型別來區分過載。再者Python中函式的引數可以有預設值,可以使用可變引數和關鍵字引數,因此即便沒有函式過載,也要可以讓一個函式根據呼叫者傳入的引數產生不同的行為。

題目012:用Python程式碼實現Python內建函式max。

點評 :這個題目看似簡單,但實際上還是比較考察面試者的功底。因為Python內建的 max 函式既可以傳入可迭代物件找出最大,又可以傳入兩個或多個引數找出最大;最為關鍵的是還可以透過命名關鍵字引數 key 來指定一個用於元素比較的函式,還可以透過 default 命名關鍵字引數來指定當可迭代物件為空時返回的預設值。

下面的程式碼僅供參考:

def   my_max ( * args,   key = None ,   default = None ):

     """    獲取可迭代物件中最大的元素或兩個及以上實參中最大的元素    :param args: 一個可迭代物件或多個元素    :param key: 提取用於元素比較的特徵值的函式,預設為None    :param default: 如果可迭代物件為空則返回該預設值,如果沒有給預設值則引發ValueError異常    :return: 返回可迭代物件或多個元素中的最大元素    """

     if   len (args)   ==   1   and   len (args[ 0 ])   ==   0 :

         if   default:

             return   default

         else :

             raise   ValueError ( 'max() arg is an empty sequence' )

     items   =   args[ 0 ]   if   len (args)   ==   1   else   args

     max_elem,   max_value   =   items[ 0 ],   items[ 0 ]

     if   key:

         max_value   =   key(max_value)

     for   item   in   items:

         value   =   item

         if   key:

             value   =   key(item)

         if   value   >   max_value:

             max_elem,   max_value   =   item,   value

     return   max_elem

題目013:寫一個函式統計傳入的列表中每個數字出現的次數並返回對應的字典。

點評 :送人頭的題目,不解釋。

def   count_letters (items):

     result   =   {}

     for   item   in   items:

         if   isinstance (item,   ( int ,   float )):

             result[item]   =   result . get(item,   0 )   +   1

     return   result

也可以直接使用Python標準庫中 collections 模組的 Counter 類來解決這個問題, Counter dict 的子類,它會將傳入的序列中的每個元素作為鍵,元素出現的次數作為值來構造字典。

from   collections   import   Counter

 

def   count_letters (items):

     counter   =   Counter(items)

     return   {key:   value   for   key,   value   in   counter . items()  \

             if   isinstance (key,   ( int ,   float ))}

題目014:使用Python程式碼實現遍歷一個資料夾的操作。

Python標準庫 os 模組的 walk 函式提供了遍歷一個資料夾的功能,它返回一個生成器。可以透過這個生成器來獲得資料夾下所有的檔案和資料夾。

import   os

g   =   os . walk( '/Users/Hao/Downloads/' ) for   path,   dir_list,   file_list   in   g:

     for   dir_name   in   dir_list:

         print (os . path . join(path,   dir_name))

     for   file_name   in   file_list:

         print (os . path . join(path,   file_name))

說明 os.path 模組提供了很多進行路徑操作的工具函式,在專案開發中也是經常會用到的。

題目015:現有2元、3元、5元共三種面額的貨幣,如果需要找零99元,一共有多少種找零的方式?

點評 :還有一個非常類似的題目:“一個小朋友走樓梯,一次可以走1個臺階、2個臺階或3個臺階,問走完10個臺階一共有多少種走法?”,這兩個題目的思路是一樣,如果用遞迴函式來寫的話非常簡單。

from   functools   import   lru_cache

 

@lru_cache() def   change_money (total):

     if   total   ==   0 :

         return   1

     if   total   <   0 :

         return   0

     return   change_money(total   -   2 )   +   change_money(total   -   3 )   +   change_money(total   -   5 )

說明 :在上面的程式碼中,我們用 lru_cache 裝飾器裝飾了遞迴函式 change_money ,如果不做這個最佳化,上面程式碼的漸近時間複雜度將會是     ,而如果引數 total 的值是 99 ,這個運算量是非常巨大的。 lru_cache 裝飾器會快取函式的執行結果,這樣就可以減少重複運算所造成的開銷,這是空間換時間的策略,也是動態規劃的程式設計思想。  
溫馨提示 Python面試寶典會持續更新,從基礎到專案實戰的內容都會慢慢覆蓋到。雖然每天只更新5個題目,但是每道題擴散出的資訊量還是比較大的,希望對找工作的小夥伴所有幫助。 你的點贊、收藏和評論都是我繼續建立的動力,請不要吝惜你的讚美

 


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

相關文章