python必刷面试_Python面试必刷题系列(5)
本篇是【Python面試必刷題系列】的第5篇文章。通過收集、整理Python真實面試題,給大家講解面試中的python高頻考察點,希望能夠引起讀者的足夠重視。
往期回顧:
Python中 is 和 == 有什么區別?
(1)==是比較運算符,用來比較兩個對象的value(值)是否相等。
(2)is也叫做同一性運算符,用來比較對象間的唯一身份標識(id)是否一致。
請看示例:
a?=?b?=?"abc"X?=?"abc"print?a?==?b??#?Trueprint?a?==?X??#?Trueprint?a?is?b??#?Trueprint?a?is?X??#?Truea?=?b?=?[1,?2,?3]X?=?[1,?2,?3]print?a?==?b??#?Trueprint?a?==?X??#?Trueprint?a?is?b??#?Trueprint?a?is?X??#?False
結論:只有數值型和字符串型比較,a is X才為True,當是tuple,list,dict或set型時,a is X為False。
原因:id(a) != id(X),感興趣的同學可以試一下。
列舉sort 和 sorted 的區別
sort 只是應用在 list 上的方法,就地排序,無返回值。
sorted 是內建函數,對所有可迭代的對象都可進行排序,返回新的list。
sorted 語法:
sorted(iterable, key=None, reverse=False)
參數說明:
iterable -- 可迭代對象。
key -- 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自于可迭代對象中,指定可迭代對象中的一個元素來進行排序。
reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)。
什么是猴子補丁?
在運行期間動態修改一個類或模塊,叫做猴子補丁(Monkey Patch)。
用法一:運行時動態替換模塊的方法
class?Person(object):????def?speak(self):????????print?"oooooo"def?speak_patch(self):????print?"eeeeee"if?__name__?==?'__main__':????Person.speak?=?speak_patch????person?=?Person()????person.speak()?#?輸出是?“eeeee”,相當于臨時替換了模塊里的方法
用法二:運行時動態增加模塊的方法
這種場景也比較多,比如我們引用團隊通用庫里的一個模塊,又想豐富模塊的功能,除了繼承之外也可以考慮用Monkey Patch。
成員變量用單、雙下劃線修飾的區別?
(1)
_xxx?: 保護型成員變量,只允許該類及其子類訪問;不能用于from module import *?。
(2)
__xxx?: 私有型成員變量,只允許該類本身進行訪問,連子類也不允許。
(3)
__xxx__?: python內置的專用特殊方法。像__init__()之類
的。
說說lambda表達式的應用場景?
lambda 表達式的本質就是匿名的、函數體僅有一行的函數。
#?lambda表達式lambda?x?,?y?:?x?+?y#?改寫成函數def?add(x,?y):????return?x+?y
雖然函數比 lambda 表達式的適應性更強,能夠創建復雜的函數對象,但 lambda 表達式依然有如下兩個優點:
對于單行函數,使用 lambda 表達式可以省去定義函數的過程,讓代碼更加簡潔。
對于不需要多次復用的函數,使用 lambda 表達式可以在用完之后立即釋放,提高了性能。
例子如下:
a?=?[('a',?1),?('b',?2),?('c',?3),?('d',?4)]a_1?=?list(map(lambda?x:?x[0],?a))
copy 和 deepcopy 的區別是什么?
結論:
淺拷貝,只拷貝父對象,不會拷貝父對象內部的子對象。
深拷貝,既拷貝父對象,又拷貝各級子對象。
理解:
import?copyorigin?=?[1,?2,?[3,?4]]??# origin 里邊有三個元素:1, 2,[3, 4]cop1?=?copy.copy(origin)cop2?=?copy.deepcopy(origin)print?cop1?==?cop2??#?Trueprint?cop1?is?cop2??#?False#?說明: cop1?和?cop2?目前看上去還相同,但已不再是同一個objectorigin[2][0]?=?"hey!"origin[0]?=?"a"print?origin??#?['a',?2,?['hey!',?4]]print?cop1??#?[1,?2,?['hey!',?4]]print?cop2??#?[1,?2,?[3,?4]]#?說明: origin第一層元素改變,對深淺拷貝都不會有影響;#?但是子對象(origin[2]?=?[3,?4])發生改變后,淺拷貝會跟著變,深拷貝卻不受影響
也就是說,如果父元素的第一層中存在可變對象,如list、dict以及普通類的實例對象等,使用淺拷貝只是傳遞了可變對象的引用,而深拷貝才是通俗理解上的完全復制。
下面是在普通類實例上做的一組測試,感興趣的同學可以繼續看,結論與上面一致。
import?copyclass?OBJ(object):????X?=?[1,?2,?[1,?2]]??#?類變量????def?__init__(self):????????self.x?=?[1,?2,?[1,?2]]??#?實例變量#?深淺拷貝origin?=?OBJ()cop1?=?copy.copy(origin)cop2?=?copy.deepcopy(origin)#?改變實例對象的屬性origin.x[0]?=?"**"origin.x[2][1]?=?"##"print?cop1.x??#?['**',?2,?[1,?'##']]print?cop2.x??#?[1,?2,?[1,?2]]#?改變類變量的屬性origin.X[0]?=?"**"origin.X[2][1]?=?"##"print?cop1.X??#?['**',?2,?[1,?'##']]print?cop2.X??#?['**',?2,?[1,?'##']]
什么是斷言?應用場景?
python的assert是用來檢查一個條件,如果它為真,繼續往下執行。如果它為假,則會拋出AssertError 錯誤信息,并終止執行程序。
例如:
x?=?23assert?x?>?0,?"x?is?not?positive"assert?x%2?==?0,?"x?is?not?an?even?number"
結果顯示:
Traceback?(most?recent?call?last):??File?"/Users/arrnos/PycharmProjects/wechat/interface.py",?line?3,?in?????assert?x%2?==?0,?"x?is?not?an?even?number"AssertionError:?x?is?not?an?even?number
斷言是保證程序運行可靠性的一種方式,因為,在條件不符合我們預期時,程序會自動在斷言處終止運行,同時會拋出錯誤所在的代碼行和相關信息,也算是一種程序問題定位的手段。
具體應用場景:函數入參檢查、運行時程序邏輯檢查、約定檢查、程序常量以及文檔檢查等。
詳細可參考:https://www.cnblogs.com/zhuifeng-mayi/p/9248558.html
dir()是做什么的?
dir()是python的一種內置函數,dir(object)用于查看object內部的全部屬性和方法。
比如查看list、字符串或者是os模塊的全部內部函數和方法,可以這樣:
print?dir(os)print?dir(list)print?dir("")print?dir(str)?#?和上面運行結果一致
*args和 * *kwargs 的含義及用法。
在函數定義中使用?*args?和**kwargs傳遞可變長參數。?*args用來將參數打包成 tuple 給函數體調用。** kwargs用于將關鍵字參數打包成 dict 給函數體調用。
(1) *和**的用法:拆包
def?fun1(a,?b):????print?a,?bdef?fun2(b,?a):????print?a,?bfun1(*[1,?2])?#?*用于拆解list或元組,拆解結果作為位置參數fun2(**{"a":?1,?"b":?3})?#?**用于拆解字典,并將其作為關鍵字參數
結果:
1?21?3
(2) *args 用法實例:
*args用于接收元組作為位置參數。
def?fun(a,?*args):????print?a????print?"args:",?args????print?"type(args):",?type(args)????for?arg?in?args:????????print?arg#?調用fun(1,?2,?3)
結果:
1args:?(2,?3)type(args):?23
(3)**kwargs用于接收字典類型的參數
def?fun(a,?**kwargs):????print?"a?is?",?a????print?"kwargs:",?kwargs????print?"type(kwargs):",?type(kwargs)????print?"b?is?",?kwargs.get("b",?None)????print?"c?is?",?kwargs.get("c",?None)????print?"d?is?",?kwargs.get("d",?None)#?調用fun(1,?b=3,?c=5)
結果:
a?is??1kwargs:?{'c':?5,?'b':?3}type(kwargs):?b?is??3c?is??5d?is??None
type、class和object之間的關系?
(1) type?: 用來返回一個對象的類型
(2) object
由于Python中一切皆對象,也就是說Python中的任何變量類型都是可以被修改的,這也是Python等動態編程語言的特點。type的基類是object,但是object也是由type生成的,他們之間形成了一個環路,這樣設計的目的也就是為了方便對這些數據結構進行修改。
(3) class
class是用來描述一個類對象的,通過class可以實例化出一個對象。
(4) type,class,object三者之間的關系:
比心
?
推薦閱讀:
【算法研習社】
機器學習、數據挖掘、推薦系統、架構編程
海量干貨,持續發送
大廠內推、技術資料獲取,加小編微信,拉你進
【算法研習社 - 交流群】
總結
以上是生活随笔為你收集整理的python必刷面试_Python面试必刷题系列(5)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝商家收款码怎么申请
- 下一篇: 冬奥会纪念币钞何时发行