溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python中為什么沒有函數(shù)重載

發(fā)布時間:2021-11-01 17:20:38 來源:億速云 閱讀:225 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“Python中為什么沒有函數(shù)重載”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python中為什么沒有函數(shù)重載”吧!

題目:Python中為什么沒有函數(shù)重載?

點(diǎn)評:C++、Java、C#等諸多編程語言都支持函數(shù)重載,所謂函數(shù)重載指的是在同一個作用域中有多個同名函數(shù),它們擁有不同的參數(shù)列表(參數(shù)個數(shù)不同或參數(shù)類型不同或二者皆不同),可以相互區(qū)分。重載也是一種多態(tài)性,因?yàn)橥ǔJ窃诰幾g時通過參數(shù)的個數(shù)和類型來確定到底調(diào)用哪個重載函數(shù),所以也被稱為編譯時多態(tài)性或者叫前綁定。這個問題的潛臺詞其實(shí)是問面試者是否有其他編程語言的經(jīng)驗(yàn),是否理解Python是動態(tài)類型語言,是否知道Python中函數(shù)的可變參數(shù)、關(guān)鍵字參數(shù)這些概念。

首先Python是解釋型語言,函數(shù)重載現(xiàn)象通常出現(xiàn)在編譯型語言中。其次Python是動態(tài)類型語言,函數(shù)的參數(shù)沒有類型約束,也就無法根據(jù)參數(shù)類型來區(qū)分重載。再者Python中函數(shù)的參數(shù)可以有默認(rèn)值,可以使用可變參數(shù)和關(guān)鍵字參數(shù),因此即便沒有函數(shù)重載,也要可以讓一個函數(shù)根據(jù)調(diào)用者傳入的參數(shù)產(chǎn)生不同的行為。

題目012:用Python代碼實(shí)現(xiàn)Python內(nèi)置函數(shù)max。

點(diǎn)評:這個題目看似簡單,但實(shí)際上還是比較考察面試者的功底。因?yàn)镻ython內(nèi)置的max函數(shù)既可以傳入可迭代對象找出最大,又可以傳入兩個或多個參數(shù)找出最大;最為關(guān)鍵的是還可以通過命名關(guān)鍵字參數(shù)key來指定一個用于元素比較的函數(shù),還可以通過default命名關(guān)鍵字參數(shù)來指定當(dāng)可迭代對象為空時返回的默認(rèn)值。

下面的代碼僅供參考:

def my_max(*args, key=None, default=None):
   """
   獲取可迭代對象中最大的元素或兩個及以上實(shí)參中最大的元素
   :param args: 一個可迭代對象或多個元素
   :param key: 提取用于元素比較的特征值的函數(shù),默認(rèn)為None
   :param default: 如果可迭代對象為空則返回該默認(rèn)值,如果沒有給默認(rèn)值則引發(fā)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:寫一個函數(shù)統(tǒng)計(jì)傳入的列表中每個數(shù)字出現(xiàn)的次數(shù)并返回對應(yīng)的字典。

點(diǎn)評:送人頭的題目,不解釋。

def 
count_letters(items):
   result = {}
   for item in items:
       if isinstance(item, (int, float)):
           result[item] = result.get(item, 0) + 1
   return result

也可以直接使用Python標(biāo)準(zhǔn)庫中collections模塊的Counter類來解決這個問題,Counter是dict的子類,它會將傳入的序列中的每個元素作為鍵,元素出現(xiàn)的次數(shù)作為值來構(gòu)造字典。

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代碼實(shí)現(xiàn)遍歷一個文件夾的操作。

Python標(biāo)準(zhǔn)庫os模塊的walk函數(shù)提供了遍歷一個文件夾的功能,它返回一個生成器??梢酝ㄟ^這個生成器來獲得文件夾下所有的文件和文件夾。

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模塊提供了很多進(jìn)行路徑操作的工具函數(shù),在項(xiàng)目開發(fā)中也是經(jīng)常會用到的。 如果題目明確要求不能使用os.walk函數(shù),那么可以使用os.listdir函數(shù)來獲取指定目錄下的文件和文件夾,然后再通過循環(huán)遍歷用os.isdir函數(shù)判斷哪些是文件夾,對于文件夾可以通過遞歸調(diào)用進(jìn)行遍歷,這樣也可以實(shí)現(xiàn)遍歷一個文件夾的操作。

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

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

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裝飾器裝飾了遞歸函數(shù)change_money,如果不做這個優(yōu)化,上面代碼的漸近時間復(fù)雜度將會是 ,而如果參數(shù)total的值是99,這個運(yùn)算量是非常巨大的。lru_cache裝飾器會緩存函數(shù)的執(zhí)行結(jié)果,這樣就可以減少重復(fù)運(yùn)算所造成的開銷,這是空間換時間的策略,也是動態(tài)規(guī)劃的編程思想。

到此,相信大家對“Python中為什么沒有函數(shù)重載”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI