1.__ foo 、foo_ 和 __foo__ 三者之間的區(qū)別是什么?
__foo表示私有屬性、_foo表示受保護(hù)的屬性、__foo__表示Python自帶的屬性
皋蘭網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
2.請(qǐng)您簡(jiǎn)述Python編譯的工作原理,PyCodeObject 和 PyFrameObject 對(duì)象的作用。
Python編譯的工作原理:Python語(yǔ)言寫的程序不需要編譯成二進(jìn)制代碼,它可以直 接從源代碼運(yùn)行程序。當(dāng)我們運(yùn)行Python文件程序的時(shí)候,?Python解釋器把源代碼轉(zhuǎn)換成中間形式:字節(jié)碼,然后再由Python虛 擬機(jī)來(lái)執(zhí)行這些字節(jié)碼。
PyCodeObject對(duì)象:pyc 字節(jié)碼在Python虛擬機(jī)中對(duì)應(yīng)的是PyCodeObject對(duì)象,虛擬機(jī)將字節(jié)封裝成一個(gè)PyCodeObject對(duì)象再一條條執(zhí)行字節(jié)碼指令。
PyFrameObject對(duì)象:當(dāng)發(fā)生函數(shù)調(diào)用時(shí),創(chuàng)建新的幀,對(duì)應(yīng)Python的實(shí)現(xiàn)就是PyFrameObject對(duì)象。
3.如何理解self、cls、和super?
self是實(shí)例方法定義中的第一個(gè)參數(shù),代表該方法的實(shí)例對(duì)象
cls是類方法中的第一個(gè)參數(shù),代表當(dāng)前類
super是指在Python面向?qū)ο蟮睦^承特征下中,若子類調(diào)用父類方法則需要super()實(shí)現(xiàn)。
4.如何區(qū)分@classmethod和@staticmethod?
@classmethod是類裝飾器,使用裝飾器方法定義類方法告知Python的解釋器該方法為類方法,裝飾器優(yōu)化該方法的執(zhí)行效率。
@staticmethod是靜態(tài)方法裝飾器,使用裝飾器方法定義靜態(tài)方法告知Python的解釋器該方法為靜態(tài)方法,裝飾器優(yōu)化該方法的執(zhí)行效率。
5.如何理解閉包Closure(作用)?其語(yǔ)法規(guī)范要求?(可編寫片段代碼實(shí)現(xiàn)閉包規(guī)范)
閉包:在一個(gè)外函數(shù)內(nèi)定義了一個(gè)內(nèi)函數(shù) ,內(nèi)函數(shù)運(yùn)用了外函數(shù)的臨時(shí)變量,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用,這樣就形成了閉包
閉包函數(shù)實(shí)例:
outer為外函數(shù)、inner為內(nèi)函數(shù),a和b都是外函數(shù)的臨時(shí)變量
def outer(a):
b=10
def inner():
print(a+b)
return inner
if __name__=="__main__":
demo=outer(5)
#在這里我們調(diào)用外函數(shù)傳入?yún)?shù)5,此時(shí)外函數(shù)兩個(gè)臨時(shí)變量a=5,b=10并創(chuàng)建了內(nèi)函數(shù),然后把內(nèi)函數(shù)的引用返回存給了demo,外函數(shù)結(jié)束時(shí)發(fā)現(xiàn)內(nèi)函數(shù)將會(huì)用到自己的臨時(shí)變量,這兩個(gè)變量就不會(huì)釋放,會(huì)綁定給內(nèi)函數(shù)。
demo()
6.什么是迭代器Iterator ? 編寫片段代碼說(shuō)明應(yīng)用方式.
迭代器就是用于迭代操作(for循環(huán))的對(duì)象,它像列表一樣,可以迭代獲取其中的每一個(gè)元素,任何實(shí)現(xiàn)了next()方法的對(duì)象都可以被稱為迭代器。
對(duì)于可迭代對(duì)象(序列、range函數(shù)返回值、zip函數(shù)返回值、enumerate函數(shù)返回值等等)調(diào)用iter()函數(shù)就會(huì)返回一個(gè)迭代器,對(duì)于迭代器用iter方法就會(huì)返回迭代器自身。
迭代器代碼實(shí)例說(shuō)明:
it =iter([1,2,3,4,5])
while True:
try:
x=next(it)
except StopIteration:
break
#迭代器通過(guò)不斷調(diào)用next方法會(huì)依次前進(jìn)到序列中的下一個(gè)元素,并將其返回最后到達(dá)一系列結(jié)果的末尾時(shí),會(huì)引發(fā)StopIteration異常
7.說(shuō)明list、tuple和dictionary之間的異同點(diǎn)。
列表list支持的特性:索引、切片、連接、重復(fù)、成員操作符
元組tuple支持的特性:索引、切片、連接、重復(fù)、成員操作符
字典dictionary不支持這些特性
列表list屬于可變數(shù)據(jù)類型,是有序的、可迭代的(支持for循環(huán)遍歷)
元組tuple屬于不可變數(shù)據(jù)類型,是有序的、可迭代的(支持for循環(huán)遍歷)
字典dictionary屬于可變數(shù)據(jù)類型,是無(wú)序的、可迭代的(支持for循環(huán)遍歷)
8.如何理解生成器Generator? 在Python中有幾種實(shí)現(xiàn)方式(可編寫片段代碼說(shuō)明)?
生成器本質(zhì)上是一個(gè)高級(jí)迭代器,使得所需要返回的一系列元素所需的代碼更加簡(jiǎn)單和高效。
生成器有兩種實(shí)現(xiàn)方式:
(1).生成器函數(shù)
生成器函數(shù):常規(guī)函數(shù)定義中使用return返回結(jié)果,在生成器函數(shù)中使用yield關(guān)鍵字代替return,yield語(yǔ)句一次返回一個(gè)結(jié)果,在每個(gè)結(jié)果中間掛起函數(shù)的狀態(tài),以便下一次從它離開(kāi)的地方執(zhí)行。
代碼說(shuō)明:
def gensquares(Num):
for i in range(Num):
yield i**2
for item in gensquares(5):
print(item)
(2).生成器表達(dá)式
生成器表達(dá)式:和列表生成式相似,不過(guò)將“[]”改為“()”,但是生成器返回按需產(chǎn)生結(jié)果的一個(gè)對(duì)象,而不是一次構(gòu)建一個(gè)結(jié)果列表。
代碼說(shuō)明:
squares=(i2 for i in range(2,5))
print(type(squares))
#使用next()方法每次返回一個(gè)結(jié)果
next(squares)
9.Python中的異常是什么?分為幾種?多except捕獲異常的規(guī)范要求都有哪些?
異常是一個(gè)事件,該事件會(huì)在程序執(zhí)行過(guò)程中發(fā)生,影響程序正常執(zhí)行,在Python中程序無(wú)法正常處理時(shí),就會(huì)拋出異常。在Python中常見(jiàn)的異常處理為單異常和多異常處理,在Python3中長(zhǎng)使用try ... except ... finally處理,常見(jiàn)的有try ... except ...、try ... except ... except ... except ...(多except捕獲)、try ... except ... else/finally.對(duì)于try ... except ... else/finally來(lái)說(shuō),else中的語(yǔ)句是當(dāng)try語(yǔ)句塊出現(xiàn)異常時(shí)不執(zhí)行,當(dāng)try語(yǔ)句塊無(wú)異常時(shí)執(zhí)行,如果替換為finally則是不論try語(yǔ)句塊是否出現(xiàn)異常finally都會(huì)執(zhí)行。
多except捕獲異常:一個(gè)try語(yǔ)句塊可能包含多個(gè)except字句,分別用來(lái)處理不同的特定的異常,在多異常捕獲時(shí),我們常將小異常放在前面,大異常在后面,用于避免程序在處理時(shí),異常不能分別處理,從而將所有異常歸為一個(gè)異常進(jìn)行處理。
10.如何理解“鴨子模型”,其主要作用是什么?
Python不支持多態(tài),并且也用不到多態(tài),多態(tài)是應(yīng)用于Java和c#這一類強(qiáng)類型語(yǔ)言中,而Python推崇“鴨子類型”。
“鴨子類型”是動(dòng)態(tài)類型的一種風(fēng)格,在這種風(fēng)格中,一個(gè)對(duì)象有效的語(yǔ)義不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由當(dāng)前方法和屬性的集合決定。
11.裝飾器decorator的作用,編寫片段代碼說(shuō)明。
裝飾器就是用來(lái)裝飾函數(shù)的,想要增強(qiáng)原有函數(shù)的功能,但不希望改變現(xiàn)函數(shù)的定義,是一種在代碼運(yùn)行期間動(dòng)態(tài)增加功能的方式。定義的裝飾器實(shí)際上是返回函數(shù)的高階函數(shù)。
代碼說(shuō)明:
#裝飾器(無(wú)參數(shù))
import time
def Timelt(ProMain):
def program_times():
startTime = time.time()
ProMain()
endTime = time.time()
msecsTime = (endTime - startTime) * 1000
print("程序%s運(yùn)行時(shí)間:%s 毫秒" % (main.__name__,msecsTime))
return program_times
@Timelt #python提供的語(yǔ)法糖,@deco 和 main = deco(main) 是完全等價(jià)的,本質(zhì)是一樣的
def main():
print("程序運(yùn)行開(kāi)始...")
time.sleep(0.5)
print("程序運(yùn)行結(jié)束...")
if __name__=="__main__": #腳本程序入口
main()
補(bǔ)充:語(yǔ)法糖(Syntactic sugar),也譯為糖衣語(yǔ)法,是由英國(guó)計(jì)算機(jī)科學(xué)家彼得·約翰·蘭達(dá)(Peter J. Landin)發(fā)明的一個(gè)術(shù)語(yǔ),指計(jì)算機(jī)語(yǔ)言中添加的某種語(yǔ)法,這種語(yǔ)法對(duì)語(yǔ)言的功能并沒(méi)有影響,但是更方便程序員使用。通常來(lái)說(shuō)使用語(yǔ)法糖能夠增加程序的可讀性,從而減少程序代碼出錯(cuò)的機(jī)會(huì)。
12.*args和**kwargs的異同點(diǎn)
這兩個(gè)參數(shù)為函數(shù)定義中參數(shù)列表中排名最后的參數(shù)
*args代表該參數(shù)位置可以任意個(gè)參數(shù),最后都會(huì)轉(zhuǎn)為元組數(shù)據(jù)類型在函數(shù)體內(nèi)處理**kwargs
代表該參數(shù)位置可以放key-value格式的數(shù)據(jù),最終都會(huì)轉(zhuǎn)化為字段形式數(shù)據(jù)在函數(shù)體內(nèi)處理。
13.@property裝飾器的作用,請(qǐng)舉例說(shuō)明。
@property裝飾器將方法定義為屬性,后續(xù)可以使用對(duì)象.屬性名的方式輸出
舉例說(shuō)明:
class person():
def __init__(self,name):
self.__name=name
pass
@property #使用@property將私有實(shí)例變量變?yōu)橐粋€(gè)屬性,從而可以使用對(duì)象.屬性的名稱的方式進(jìn)行輸出。
def name(self):
return self.__name
if __name__=="__main__":
obj=person("Lee")
print('name屬性:{0}'.format(obj.name))
14.請(qǐng)您簡(jiǎn)述Python如何理解對(duì)象序列化和反序列化操作?
所謂序列化是將編程語(yǔ)言中的各種對(duì)象轉(zhuǎn)化為字節(jié)流的過(guò)程,同時(shí)也可以逆向操作將字節(jié)流還原成一個(gè)對(duì)象,這個(gè)過(guò)程稱為發(fā)序列化。
15.Python連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)讀寫操作的標(biāo)準(zhǔn)流程描述。
#導(dǎo)入模塊
import pyMySQL
db=pymysql.connect("localhost","root","root","mysql")
#創(chuàng)建游標(biāo)對(duì)象
cursor=db.cursor()
#使用execute()方法執(zhí)行SQL語(yǔ)句
cursor.execute("select * from mysql")
#使用fechone()方法獲取單條數(shù)據(jù)
data=cursor.fetchone()
#關(guān)閉數(shù)據(jù)庫(kù)
db.close()
16.python異常的關(guān)鍵字有哪些?每個(gè)代碼塊執(zhí)行的規(guī)則是什么?
python異常的關(guān)鍵字有:try,except,else,finally
try語(yǔ)塊執(zhí)行方式:
(1)首先執(zhí)行try字句.
(2)如果沒(méi)有異常發(fā)生,忽略except子句,try子句執(zhí)行后結(jié)束
(3)如果執(zhí)行try子句過(guò)程中發(fā)生異常,那么try子句余下的部分將被忽略,如果異常與except關(guān)鍵字后的名稱相同,那么對(duì)應(yīng)的except子句被執(zhí)行,最后執(zhí)行try語(yǔ)句之后的代碼
(4)如果一個(gè)異常沒(méi)有與任何except匹配,那么這個(gè)異常會(huì)傳遞給上層的try中,對(duì)于可選子句else子句,如果使用這個(gè)子句,那么必須放在所有的except子句后,這個(gè)子句在try子句沒(méi)有發(fā)生任何異常的時(shí)候執(zhí)行,對(duì)于finally來(lái)說(shuō),不管前面子句是否執(zhí)行,finally中的語(yǔ)句都會(huì)執(zhí)行。
17.pickle模塊中的dumps()/loads()和dump()/load()的區(qū)別。
pickle模塊支持講一個(gè)Python對(duì)象轉(zhuǎn)化為字節(jié)流,同時(shí)還能對(duì)相應(yīng)的字節(jié)流逆操作得到原來(lái)的對(duì)象
pickle模塊的常用函數(shù):
pickle.dump(obj.file [,protocol])對(duì)象序列化操作函數(shù)
pickle.load(file)將file中的對(duì)象序列化讀取
pickle.dumps(obj,[,protocol]) 將對(duì)象轉(zhuǎn)化為string字符串類型
pickle.loads(string)從string中讀取并反序列化還原之前的obj對(duì)象。
文章名稱:Python基礎(chǔ)常見(jiàn)問(wèn)題總結(jié)(一)
本文路徑:http://redsoil1982.com.cn/article24/jdghje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷、云服務(wù)器、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)