您好,登錄后才能下訂單哦!
本篇內容主要講解“Python中為什么沒有函數重載”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python中為什么沒有函數重載”吧!
題目: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 Counterdef
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模塊提供了很多進行路徑操作的工具函數,在項目開發中也是經常會用到的。 如果題目明確要求不能使用os.walk函數,那么可以使用os.listdir函數來獲取指定目錄下的文件和文件夾,然后再通過循環遍歷用os.isdir函數判斷哪些是文件夾,對于文件夾可以通過遞歸調用進行遍歷,這樣也可以實現遍歷一個文件夾的操作。
題目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中為什么沒有函數重載”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。