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