溫馨提示×

溫馨提示×

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

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

Python基礎(chǔ)常見問題總結(jié)(一)

發(fā)布時間:2020-06-29 05:16:33 來源:網(wǎng)絡(luò) 閱讀:1832 作者:MissLeejuan 欄目:編程語言

1.__ foo 、foo_ 和 __foo__ 三者之間的區(qū)別是什么?
__foo表示私有屬性、_foo表示受保護(hù)的屬性、__foo__表示Python自帶的屬性

2.請您簡述Python編譯的工作原理,PyCodeObject 和 PyFrameObject 對象的作用。
Python編譯的工作原理:Python語言寫的程序不需要編譯成二進(jìn)制代碼,它可以直 接從源代碼運(yùn)行程序。當(dāng)我們運(yùn)行Python文件程序的時候,?Python解釋器把源代碼轉(zhuǎn)換成中間形式:字節(jié)碼,然后再由Python虛 擬機(jī)來執(zhí)行這些字節(jié)碼。
PyCodeObject對象:pyc 字節(jié)碼在Python虛擬機(jī)中對應(yīng)的是PyCodeObject對象,虛擬機(jī)將字節(jié)封裝成一個PyCodeObject對象再一條條執(zhí)行字節(jié)碼指令。
PyFrameObject對象:當(dāng)發(fā)生函數(shù)調(diào)用時,創(chuàng)建新的幀,對應(yīng)Python的實現(xiàn)就是PyFrameObject對象。

3.如何理解self、cls、和super?

self是實例方法定義中的第一個參數(shù),代表該方法的實例對象
cls是類方法中的第一個參數(shù),代表當(dāng)前類
super是指在Python面向?qū)ο蟮睦^承特征下中,若子類調(diào)用父類方法則需要super()實現(xiàn)。

4.如何區(qū)分@classmethod和@staticmethod?

@classmethod是類裝飾器,使用裝飾器方法定義類方法告知Python的解釋器該方法為類方法,裝飾器優(yōu)化該方法的執(zhí)行效率。
@staticmethod是靜態(tài)方法裝飾器,使用裝飾器方法定義靜態(tài)方法告知Python的解釋器該方法為靜態(tài)方法,裝飾器優(yōu)化該方法的執(zhí)行效率。

5.如何理解閉包Closure(作用)?其語法規(guī)范要求?(可編寫片段代碼實現(xiàn)閉包規(guī)范)
閉包:在一個外函數(shù)內(nèi)定義了一個內(nèi)函數(shù) ,內(nèi)函數(shù)運(yùn)用了外函數(shù)的臨時變量,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用,這樣就形成了閉包

閉包函數(shù)實例:

outer為外函數(shù)、inner為內(nèi)函數(shù),a和b都是外函數(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ù)兩個臨時變量a=5,b=10并創(chuàng)建了內(nèi)函數(shù),然后把內(nèi)函數(shù)的引用返回存給了demo,外函數(shù)結(jié)束時發(fā)現(xiàn)內(nèi)函數(shù)將會用到自己的臨時變量,這兩個變量就不會釋放,會綁定給內(nèi)函數(shù)。
    demo()

6.什么是迭代器Iterator ? 編寫片段代碼說明應(yīng)用方式.

迭代器就是用于迭代操作(for循環(huán))的對象,它像列表一樣,可以迭代獲取其中的每一個元素,任何實現(xiàn)了next()方法的對象都可以被稱為迭代器。
對于可迭代對象(序列、range函數(shù)返回值、zip函數(shù)返回值、enumerate函數(shù)返回值等等)調(diào)用iter()函數(shù)就會返回一個迭代器,對于迭代器用iter方法就會返回迭代器自身。

迭代器代碼實例說明:

it =iter([1,2,3,4,5])
while True:
    try:
        x=next(it)
    except StopIteration:
        break
#迭代器通過不斷調(diào)用next方法會依次前進(jìn)到序列中的下一個元素,并將其返回最后到達(dá)一系列結(jié)果的末尾時,會引發(fā)StopIteration異常               

7.說明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ù)類型,是無序的、可迭代的(支持for循環(huán)遍歷)

8.如何理解生成器Generator? 在Python中有幾種實現(xiàn)方式(可編寫片段代碼說明)?

生成器本質(zhì)上是一個高級迭代器,使得所需要返回的一系列元素所需的代碼更加簡單和高效。
生成器有兩種實現(xiàn)方式:
(1).生成器函數(shù)
生成器函數(shù):常規(guī)函數(shù)定義中使用return返回結(jié)果,在生成器函數(shù)中使用yield關(guān)鍵字代替return,yield語句一次返回一個結(jié)果,在每個結(jié)果中間掛起函數(shù)的狀態(tài),以便下一次從它離開的地方執(zhí)行。

代碼說明:
def gensquares(Num):
    for i in range(Num):
        yield i**2
for item in gensquares(5):
     print(item)

(2).生成器表達(dá)式
生成器表達(dá)式:和列表生成式相似,不過將“[]”改為“()”,但是生成器返回按需產(chǎn)生結(jié)果的一個對象,而不是一次構(gòu)建一個結(jié)果列表。

代碼說明:
squares=(i2 for i in range(2,5))
print(type(squares))
#使用next()方法每次返回一個結(jié)果
next(squares)

9.Python中的異常是什么?分為幾種?多except捕獲異常的規(guī)范要求都有哪些?

異常是一個事件,該事件會在程序執(zhí)行過程中發(fā)生,影響程序正常執(zhí)行,在Python中程序無法正常處理時,就會拋出異常。在Python中常見的異常處理為單異常和多異常處理,在Python3中長使用try ... except ... finally處理,常見的有try ... except ...、try ... except ... except ... except ...(多except捕獲)、try ... except ... else/finally.對于try ... except ... else/finally來說,else中的語句是當(dāng)try語句塊出現(xiàn)異常時不執(zhí)行,當(dāng)try語句塊無異常時執(zhí)行,如果替換為finally則是不論try語句塊是否出現(xiàn)異常finally都會執(zhí)行。
多except捕獲異常:一個try語句塊可能包含多個except字句,分別用來處理不同的特定的異常,在多異常捕獲時,我們常將小異常放在前面,大異常在后面,用于避免程序在處理時,異常不能分別處理,從而將所有異常歸為一個異常進(jìn)行處理。

10.如何理解“鴨子模型”,其主要作用是什么?

Python不支持多態(tài),并且也用不到多態(tài),多態(tài)是應(yīng)用于Java和c#這一類強(qiáng)類型語言中,而Python推崇“鴨子類型”。
“鴨子類型”是動態(tài)類型的一種風(fēng)格,在這種風(fēng)格中,一個對象有效的語義不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由當(dāng)前方法和屬性的集合決定。

11.裝飾器decorator的作用,編寫片段代碼說明。

裝飾器就是用來裝飾函數(shù)的,想要增強(qiáng)原有函數(shù)的功能,但不希望改變現(xiàn)函數(shù)的定義,是一種在代碼運(yùn)行期間動態(tài)增加功能的方式。定義的裝飾器實際上是返回函數(shù)的高階函數(shù)。

代碼說明:
#裝飾器(無參數(shù))
import time
def Timelt(ProMain):
    def program_times():
        startTime = time.time()
        ProMain()
        endTime = time.time()
        msecsTime = (endTime - startTime) * 1000
        print("程序%s運(yùn)行時間:%s 毫秒" % (main.__name__,msecsTime))
    return program_times
@Timelt #python提供的語法糖,@deco 和 main = deco(main) 是完全等價的,本質(zhì)是一樣的
def main():
    print("程序運(yùn)行開始...")
    time.sleep(0.5)
    print("程序運(yùn)行結(jié)束...")
if __name__=="__main__": #腳本程序入口
    main()
補(bǔ)充:語法糖(Syntactic sugar),也譯為糖衣語法,是由英國計算機(jī)科學(xué)家彼得·約翰·蘭達(dá)(Peter J. Landin)發(fā)明的一個術(shù)語,指計算機(jī)語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機(jī)會。

12.*args和**kwargs的異同點(diǎn)

這兩個參數(shù)為函數(shù)定義中參數(shù)列表中排名最后的參數(shù)
*args代表該參數(shù)位置可以任意個參數(shù),最后都會轉(zhuǎn)為元組數(shù)據(jù)類型在函數(shù)體內(nèi)處理
**kwargs代表該參數(shù)位置可以放key-value格式的數(shù)據(jù),最終都會轉(zhuǎn)化為字段形式數(shù)據(jù)在函數(shù)體內(nèi)處理。

13.@property裝飾器的作用,請舉例說明。

@property裝飾器將方法定義為屬性,后續(xù)可以使用對象.屬性名的方式輸出

舉例說明:
class person():
    def __init__(self,name):
        self.__name=name
        pass
    @property #使用@property將私有實例變量變?yōu)橐粋€屬性,從而可以使用對象.屬性的名稱的方式進(jìn)行輸出。
    def name(self):
        return self.__name
if __name__=="__main__":
    obj=person("Lee")
    print('name屬性:{0}'.format(obj.name))

14.請您簡述Python如何理解對象序列化和反序列化操作?

所謂序列化是將編程語言中的各種對象轉(zhuǎn)化為字節(jié)流的過程,同時也可以逆向操作將字節(jié)流還原成一個對象,這個過程稱為發(fā)序列化。

15.Python連接數(shù)據(jù)庫實現(xiàn)讀寫操作的標(biāo)準(zhǔn)流程描述。

#導(dǎo)入模塊
import pymysql
db=pymysql.connect("localhost","root","root","mysql")
#創(chuàng)建游標(biāo)對象
cursor=db.cursor()
#使用execute()方法執(zhí)行SQL語句
cursor.execute("select * from mysql")
#使用fechone()方法獲取單條數(shù)據(jù)
data=cursor.fetchone()
#關(guān)閉數(shù)據(jù)庫
db.close()

16.python異常的關(guān)鍵字有哪些?每個代碼塊執(zhí)行的規(guī)則是什么?

python異常的關(guān)鍵字有:try,except,else,finally
try語塊執(zhí)行方式:
(1)首先執(zhí)行try字句.
(2)如果沒有異常發(fā)生,忽略except子句,try子句執(zhí)行后結(jié)束
(3)如果執(zhí)行try子句過程中發(fā)生異常,那么try子句余下的部分將被忽略,如果異常與except關(guān)鍵字后的名稱相同,那么對應(yīng)的except子句被執(zhí)行,最后執(zhí)行try語句之后的代碼
(4)如果一個異常沒有與任何except匹配,那么這個異常會傳遞給上層的try中,對于可選子句else子句,如果使用這個子句,那么必須放在所有的except子句后,這個子句在try子句沒有發(fā)生任何異常的時候執(zhí)行,對于finally來說,不管前面子句是否執(zhí)行,finally中的語句都會執(zhí)行。

17.pickle模塊中的dumps()/loads()和dump()/load()的區(qū)別。

pickle模塊支持講一個Python對象轉(zhuǎn)化為字節(jié)流,同時還能對相應(yīng)的字節(jié)流逆操作得到原來的對象
pickle模塊的常用函數(shù):
pickle.dump(obj.file [,protocol])對象序列化操作函數(shù)
pickle.load(file)將file中的對象序列化讀取
pickle.dumps(obj,[,protocol]) 將對象轉(zhuǎn)化為string字符串類型
pickle.loads(string)從string中讀取并反序列化還原之前的obj對象。

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

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

AI