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