面試專欄22
01 什么是斷言(assert)?應(yīng)用場(chǎng)景? 02 解決哈希沖突的算法有哪幾種?分別有什么特點(diǎn)? 03 介紹一下try except的用法和作用? 04 常用字符串格式化有哪幾種 05 用盡量簡(jiǎn)潔的方法將二維數(shù)組合并成一維數(shù)組 06 python的可變類型和不可變類型的區(qū)別 07 如何實(shí)現(xiàn)['1','2','3']變成[1,2,3] 08 什么是反射,以及應(yīng)用場(chǎng)景 09 對(duì)列表[3,1,-4,-2]按照絕對(duì)值排序 10 super的作用
01 什么是斷言(assert)?應(yīng)用場(chǎng)景?
斷言(assert)是編程中的一個(gè)概念,用于確保程序中某個(gè)特定的條件一定為真。如果該條件為假,程序會(huì)拋出一個(gè)錯(cuò)誤或異常。斷言主要用于在開發(fā)和測(cè)試階段捕獲預(yù)期之外的情況,確保代碼的邏輯正確性。 斷言的工作機(jī)制是這樣的:當(dāng)斷言條件為真時(shí),程序繼續(xù)執(zhí)行;當(dāng)斷言條件為假時(shí),程序會(huì)拋出一個(gè)斷言錯(cuò)誤或異常,并終止執(zhí)行。
應(yīng)用場(chǎng)景
:
開發(fā)中的調(diào)試
:當(dāng)開發(fā)者認(rèn)為某個(gè)條件應(yīng)該總是為真時(shí),可以使用斷言來(lái)檢查。如果在后續(xù)開發(fā)中該條件被違反,斷言會(huì)立即發(fā)出警告,幫助開發(fā)者快速定位問(wèn)題。
單元測(cè)試
:在編寫單元測(cè)試時(shí),斷言可以用來(lái)檢查代碼的輸出是否符合預(yù)期。
驗(yàn)證前提條件
:例如,某個(gè)函數(shù)可能要求其輸入?yún)?shù)滿足特定條件。使用斷言可以確保這些條件得到滿足。
避免明顯的邏輯錯(cuò)誤
:在某些情況下,如果代碼的某部分到達(dá)了不應(yīng)該到達(dá)的地方,可以使用斷言進(jìn)行提示。
文檔
:斷言可以作為代碼文檔的一部分,明確說(shuō)明函數(shù)或方法的預(yù)期行為和約束。
02 解決哈希沖突的算法有哪幾種?分別有什么特點(diǎn)?
哈希沖突(Hash Collision)是指當(dāng)兩個(gè)或多個(gè)不同的輸入數(shù)據(jù)在經(jīng)過(guò)哈希函數(shù)處理后產(chǎn)生相同的輸出哈希值的情況。解決哈希沖突是哈希表設(shè)計(jì)中的一個(gè)重要問(wèn)題。以下是一些常用的解決哈希沖突的方法以及它們的特點(diǎn):
開放尋址法(Open Addressing)
工作原理
:當(dāng)沖突發(fā)生時(shí),選擇另一個(gè)空的位置存放該數(shù)據(jù)。
特點(diǎn)
:
所有的元素都存儲(chǔ)在哈希表中。
當(dāng)表開始變得越來(lái)越滿時(shí),沖突的概率增加,從而降低了效率。
常用的開放尋址策略有線性探測(cè)(Linear Probing)、二次探測(cè)(Quadratic Probing)和雙重哈希(Double Hashing)。
鏈地址法(Chaining)
工作原理
:每個(gè)表項(xiàng)都維持一個(gè)鏈表,所有映射到同一個(gè)哈希值的元素都存儲(chǔ)在這個(gè)鏈表中。
特點(diǎn)
:
相對(duì)簡(jiǎn)單,易于實(shí)現(xiàn)。
哈希表中的每個(gè)位置都可能存儲(chǔ)多個(gè)元素,這樣沖突的處理變得相對(duì)容易。
與開放尋址法相比,鏈地址法在表變得滿時(shí)的性能下降相對(duì)較小。
再哈希法(Rehashing)
工作原理
:使用多個(gè)哈希函數(shù)。當(dāng)?shù)谝粋€(gè)哈希函數(shù)產(chǎn)生沖突時(shí),嘗試使用第二個(gè)哈希函數(shù),依此類推。
特點(diǎn)
:
可以降低沖突的概率。
需要維護(hù)多個(gè)哈希函數(shù),可能增加了計(jì)算的復(fù)雜性。
雙哈希(Double Hashing)
工作原理
:與再哈希法類似,但雙哈希是開放尋址法的一種,使用兩個(gè)哈希函數(shù)進(jìn)行探測(cè)。
特點(diǎn)
:
當(dāng)?shù)谝粋€(gè)哈希函數(shù)產(chǎn)生沖突時(shí),第二個(gè)哈希函數(shù)決定如何探測(cè)下一個(gè)位置。
提供了比線性和二次探測(cè)更好的性能。
擴(kuò)容法
工作原理
:當(dāng)哈希表達(dá)到一定的填充度時(shí),將哈希表的大小翻倍,并重新哈希所有的數(shù)據(jù)。
特點(diǎn)
:
可以降低沖突的概率,提高查詢的效率。
需要額外的重新哈希開銷,可能導(dǎo)致某些操作的延遲增大。
03 介紹一下try except的用法和作用?
ry 和 except 是 Python 中的關(guān)鍵字,它們用于異常處理。異常是程序執(zhí)行期間發(fā)生的事件,該事件會(huì)影響程序的正常流程。通過(guò)使用 try 和 except,你可以捕獲并響應(yīng)特定的異常,而不讓程序崩潰或默認(rèn)地終止。
作用
:
錯(cuò)誤處理
:允許程序在發(fā)生錯(cuò)誤時(shí)繼續(xù)運(yùn)行,而不是完全崩潰。
診斷問(wèn)題
:提供對(duì)異常的詳細(xì)信息,幫助開發(fā)者理解和修復(fù)問(wèn)題。
資源管理
:確保在發(fā)生異常時(shí),資源(如文件或網(wǎng)絡(luò)連接)被適當(dāng)?shù)仃P(guān)閉或釋放。
04 常用字符串格式化有哪幾種
使用百分號(hào)(%)
這是較早的 Python 版本中常用的格式化方式。每個(gè)格式字符串都以 % 開始,后跟一個(gè)或多個(gè)字符,這些字符確定了數(shù)據(jù)的表示方式。
str.format() 方法
這是一種更現(xiàn)代的字符串格式化方法,使用 {} 作為占位符,然后使用 format() 方法將值傳遞給字符串。
f-string(格式化字符串文字)
這是 Python 3.6 及更高版本中引入的新方法。通過(guò)在字符串前加 f 或 F,并在 {} 中直接嵌入表達(dá)式,可以非常方便地格式化字符串。
模板字符串(Template Strings)
通過(guò) Python 的 string 模塊,你可以使用模板字符串。這主要用于當(dāng)字符串格式從外部源(如配置文件或數(shù)據(jù)庫(kù))獲得時(shí)。
05 用盡量簡(jiǎn)潔的方法將二維數(shù)組合并成一維數(shù)組
two_dim_list = [[1, 2, 3], [4, 5], [6, 7, 8, 9]] one_dim_list = [item for sublist in two_dim_list for item in sublist] print(one_dim_list)
06 python的可變類型和不可變類型的區(qū)別
1. 不可變類型 (Immutable Types):
這些類型的對(duì)象一旦創(chuàng)建,其內(nèi)容就不能被修改。但要注意的是,變量可以重新指向新的對(duì)象,但已存在的對(duì)象自身不會(huì)被改變。 常見的不可變類型有:
整型(int)
浮點(diǎn)型(float)
復(fù)數(shù)型(complex)
布爾型(bool)
字符串(str)
元組(tuple)
可變類型 (Mutable Types):
這些類型的對(duì)象在創(chuàng)建后,其內(nèi)容是可以被修改的。 常見的可變類型有:
列表(list)
字典(dict)
集合(set)
07 如何實(shí)現(xiàn)['1','2','3']變成[1,2,3]
使用列表解析 str_list = ['1', '2', '3'] int_list = [int(i) for i in str_list] print(int_list)
08 什么是反射,以及應(yīng)用場(chǎng)景
反射(Reflection)是指程序能夠在運(yùn)行時(shí)檢查或修改其內(nèi)部結(jié)構(gòu),特別是對(duì)象的類型和屬性的能力。簡(jiǎn)單地說(shuō),反射使得代碼可以“自省”或“查看并更改”它自己。在很多高級(jí)編程語(yǔ)言中,如 Java、C# 和 Python,都提供了一定的反射功能。
Python 中的反射
: Python 提供了以下內(nèi)置函數(shù)來(lái)支持反射: getattr(obj, 'x'): 獲取對(duì)象 obj 的 x 屬性。
setattr(obj, 'x', v): 將對(duì)象 obj 的 x 屬性設(shè)置為 v。
hasattr(obj, 'x'): 檢查對(duì)象 obj 是否有一個(gè)名為 x 的屬性。
delattr(obj, 'x'): 刪除對(duì)象 obj 的 x 屬性。
type(obj): 獲取對(duì)象 obj 的類型。
isinstance(obj, Class): 檢查 obj 是否是 Class 類或其子類的實(shí)例。
issubclass(A, B): 檢查 A 是否是 B 的子類。
dir(obj): 獲取對(duì)象 obj 的所有屬性和方法。
應(yīng)用場(chǎng)景
:
動(dòng)態(tài)導(dǎo)入模塊
:根據(jù)配置或條件動(dòng)態(tài)地導(dǎo)入模塊。
插件架構(gòu)
:應(yīng)用程序可以檢查和加載第三方提供的插件。
對(duì)象序列化
:轉(zhuǎn)換對(duì)象為其它格式,例如 JSON,以便存儲(chǔ)或網(wǎng)絡(luò)傳輸。
自動(dòng)生成代碼
:例如,ORM(對(duì)象關(guān)系映射)庫(kù)可能會(huì)使用反射來(lái)從數(shù)據(jù)庫(kù)模式生成對(duì)應(yīng)的類。
測(cè)試和模擬
:在測(cè)試環(huán)境中,通過(guò)反射來(lái)模擬或替換某些組件。
自定義工具和IDEs
:例如,一個(gè)對(duì)象瀏覽器或調(diào)試器可能使用反射來(lái)顯示對(duì)象的屬性和方法。
09 對(duì)列表[3,1,-4,-2]按照絕對(duì)值排序
lst = [3, 1, -4, -2] sorted_lst = sorted(lst, key=abs) print(sorted_lst)
10 super的作用
super() 是 Python 中的一個(gè)內(nèi)置函數(shù),它在面向?qū)ο缶幊讨杏葹橹匾饕糜谡{(diào)用基類(父類或超類)的方法。它常用于重載繼承的方法,確?;愔械倪m當(dāng)方法得到調(diào)用。 在 Python 中,一個(gè)常見的使用場(chǎng)景是在子類中重載了 __init__ 方法時(shí),使用 super() 來(lái)確保父類的 __init__ 方法也被正確調(diào)用。
作用
:
避免硬編碼類名
:使用 super() 可以避免直接使用父類的名稱來(lái)調(diào)用其方法,這使得代碼更加健壯,因?yàn)槟憧梢愿母割惖拿Q而不需要修改到每個(gè)調(diào)用它的地方。
支持多重繼承
:在多重繼承的情況下,super() 能確保每個(gè)父類的方法只被調(diào)用一次,避免了因重復(fù)調(diào)用而引起的問(wèn)題。它遵循方法解析順序(MRO)來(lái)確定調(diào)用的順序。