摘要:結(jié)果為對于迭代器和生成器你知道哪些,它們分別應(yīng)用于什么場景先介紹什么是可迭代的任何可用于循環(huán)的都是可迭代的。示例結(jié)果為,迭代器任何可以使用函數(shù)的都是迭代器,也可使用函數(shù)將可迭代對象變?yōu)榈鳌N磳懲辏麓胃卵a(bǔ)上。
閱讀本文大約需要 8 分鐘。7.說一下 Python 中的裝飾器
原理:利用閉包,將目標(biāo)函數(shù)外面再套一層函數(shù),使得目標(biāo)函數(shù)具有一個新的功能,并且不改變目標(biāo)函數(shù)原有功能。
實現(xiàn)方式:
閉包
def decorate(func): def wrapper(): print("新功能") func() return wrapper def func(): print("原有功能") f = decorate(func) f() # 結(jié)果為: 新功能 原有功能
@ 語法糖
def decorate01(func): def wrapper(): print("新功能") func() return wrapper @decorate01 def func01(): print("原有功能") func01() # 結(jié)果為: 新功能 原有功能
?
8.說一說類屬性、實例屬性、私有屬性和保護(hù)屬性類屬性相當(dāng)于全部變量,所有由類創(chuàng)建出來的實例,都可以使用,而實例屬性相當(dāng)于局部變量,只能由該實例自己使用,當(dāng)類屬性與實例屬性命名一樣時,在調(diào)用該同名屬性時,會屏蔽掉類屬性,調(diào)用實例屬性,這點(diǎn)跟 LEGB 很像。
當(dāng)通過實例對象來修改類屬性時,其實修改的并不是類屬性,而是新建了一個跟類屬性名一樣的實例屬性。
Python 中將以兩個下劃線__開頭,但不以兩個下劃線結(jié)尾的變量,認(rèn)作為私有屬性,Python 通過 name manage算法,將該私有屬性的引用更改為_classname_reference,用戶試圖調(diào)用該私有屬性時,會因為對象引用不一樣而找不到該屬性,故而實現(xiàn)了「屬性私有化」。
在獲取實例屬性時,一般采用定義一個實例方法的方式獲取屬性,避免直接對實例屬性進(jìn)行操作,起到一個保護(hù)屬性的作用。
9.為什么說 Python 是動態(tài)語言,鴨子類型是指什么Python 相當(dāng)于其他靜態(tài)語言,可以在代碼運(yùn)行過程中,改變變量的屬性。
鴨子類型指的是 Python 不用定義變量類型,只要該變量像是什么類型,那么就認(rèn)為它就是什么類型,我們更多關(guān)注的是它的行為,而不是它的類型。
10.元類是什么實例都是由類創(chuàng)建出來,而類則是由元類創(chuàng)建出來。他們之間的關(guān)系相當(dāng)于「奶奶-媽媽-孫子」。
示例:
class Myclass(): pass new = type("NewClass", (Myclass,), {"name": "new"}) print(new) print(new.__mro__) # 查看該類的繼承情況 # 結(jié)果為( , , )
具體點(diǎn)的內(nèi)容可以參考這篇問答:什么是元類
11.@staticmethod 和 @classmethod 的區(qū)別@staticmethod 是為類添加一個靜態(tài)方法
@classmethod 是為類添加一個類方法
12.如何動態(tài)添加屬性由于 Python 的特性使得程序在運(yùn)行過程中,我們可以為某個對象添加屬性、方法。
示例:
class Myclass: pass m = Myclass() # 為實例動態(tài)添加一個屬性 m.name = "new_atribute" def func(self): return "new_function" # 為實例動態(tài)添加一個方法 m.func = func print(m.name) print(m.__dict__) # 返回 m 的所有屬性,方法 # 結(jié)果為 new_atribute new_function {"func":13.對于迭代器和生成器你知道哪些,它們分別應(yīng)用于什么場景, "name": "new_atribute"} # 另外一種動態(tài)添加方法 import types def func01(self): print("new_function01") # 實例 m 添加一個屬性 func,而這個屬性指向func()函數(shù),故當(dāng)調(diào)用 m.func 時,也就相當(dāng)于調(diào)用了 func() 函數(shù),間接實現(xiàn)了為 m 添加方法 func()。 m.func = types.MethodType(func, m) print(m.func()) # 結(jié)果為 new_function01
先介紹什么是可迭代的Iterable:任何可用于for循環(huán)的都是可迭代的。也可以使用collection模塊下的isinstance(obj, Iterable)來檢驗該對象是否可迭代。
示例:
from collections import Iterable print(isinstance("abc",Iterable)) print(isinstance(123,Iterable)) # 結(jié)果為 True,F(xiàn)alse
迭代器
任何可以使用next()函數(shù)的都是迭代器,也可使用iter()函數(shù)將可迭代對象變?yōu)榈鳌?
示例:
from collections import Iterator itr = iter("abc") print(type(itr)) print(isinstance(itr, Iterator)) # 結(jié)果為 Iterator,True
生成器
任何函數(shù)中含有yield關(guān)鍵字的都是生成器,列表生成式中的[]改為()也是一個生成器。
實現(xiàn)方式
示例:
g = [i for i in range(10)] print(type(g)) # 結(jié)果為 list g1 = (i for i in range(10)) print(type(g1)) # 結(jié)果為 generator def func(): for i in range(10): yield i f = func() print(f) # 結(jié)果為
生成器怎么取值,什么時候結(jié)束
生成器可以通過next(f)、f.__next__()和f.send()三種方式來取值
示例:
def func01(): for i in range(10): yield i f = func() print(next(f)) print(f.__next__()) print(f.send("hahah")) # 結(jié)果為 0 1 2
其中f.send()可以向生成器傳值,但是其第一次傳入的值默認(rèn)為None。如果想要取出send("hahah")里傳入的值,則需要在生成器中添加接收的變量。
示例:
def func(): for i in range(10): # yield i temp = yield i print(temp) f = func() print(next(f)) print(f.__next__()) print(f.send("hahah")) # 結(jié)果為 0 None 1 hahah 2
生成器里的值被取完之后,或者中間遇到 return關(guān)鍵字,就會退出,這三種方法有一個共同點(diǎn):當(dāng)生成器取完之后會拋出StopIteration的錯誤。
而使用for循環(huán)來取出生成器里的值就不會拋出錯誤,這也是最被推薦的。
應(yīng)用場景
在生成一個包含很多數(shù)(百萬級別)的列表時,但是又只用得到其中很小一部分的數(shù)時,使用列表生成式會極大的浪費(fèi)內(nèi)存,且不一定能夠生成,因為受機(jī)器內(nèi)存限制。
而使用生成器則不然,生成器只是在你需要的時候,才會申請一塊內(nèi)存,可以邊取邊用,極大的降低了內(nèi)存消耗。
生成器用的最多的地方在于「協(xié)程」。由于基于 C 解釋器下的 Python 中含有一個 GIL 鎖,使得 Pyhon 的多線程是一個假性多線程,這也是為什么很多人說 Python 性能慢的原因。
未寫完,下次更新補(bǔ)上。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/45133.html
摘要:狀態(tài)碼有那些分別代表是什么意思簡單版繼續(xù),一般在發(fā)送請求時,已發(fā)送了之后服務(wù)端將返回此信息,表示確認(rèn),之后發(fā)送具體參數(shù)信息正常返回信息請求成功并且服務(wù)器創(chuàng)建了新的資源服務(wù)器已接受請求,但尚未處理請求的網(wǎng)頁已永久移動到新位置。 http狀態(tài)碼有那些?分別代表是什么意思? 簡單版 [ 100 Continue 繼續(xù),一般在發(fā)送post請求時,已發(fā)送了http header之后...
摘要:關(guān)于該問題的討論今天看到的一道面試題,感覺對理解的以及原型鏈和閉包很有幫助。自己并試著講述一下自己的理解,歡迎拍磚。進(jìn)入上下文時,會獲取,函數(shù)聲明,變量聲明。 2017.3.27更新今天在刷題的時候,突然發(fā)現(xiàn)之前已經(jīng)有人在討論這道題了,而且還涉及到了運(yùn)算符優(yōu)先級的問題,這是自己一開始沒有想到的。(其實有人也說:程序?qū)懚嗔耍匀挥涀×耸裁辞闆r下會發(fā)生什么樣的事情,但是為什么會發(fā)生這樣的事...
摘要:第三次握手客戶端收到報文之后,會回應(yīng)一個報文。因此,需要三次握手才能確認(rèn)雙方的接收與發(fā)送能力是否正常。三次握手的作用三次握手的作用也是有好多的,多記住幾個,保證不虧。也就是說,第一次第二次握手不可以攜帶數(shù)據(jù),而第三次握手是可以攜帶數(shù)據(jù)的。在面試中,三次握手和四次揮手可以說是問的最頻繁的一個知識點(diǎn)了,我相信大家也都看過很多關(guān)于三次握手與四次揮手的文章,今天的這篇文章,重點(diǎn)是圍繞著面試,我們應(yīng)該...
摘要:講了一下我在電力物聯(lián)網(wǎng)項目中通過設(shè)計的文件遠(yuǎn)程升級功能。完成聊天畢業(yè)規(guī)劃怎么樣收到面試調(diào)查問卷等待中。。。。。 7.31 投遞提前批c++客戶端崗位 8.16 被轉(zhuǎn)...
閱讀 1707·2023-04-26 02:30
閱讀 1033·2021-11-10 11:36
閱讀 1380·2021-10-08 10:14
閱讀 3496·2021-09-28 09:35
閱讀 1552·2021-08-23 09:47
閱讀 2544·2019-08-30 15:56
閱讀 1469·2019-08-30 15:44
閱讀 1751·2019-08-30 13:59