日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
一日一技:8行炫技代碼,知識(shí)點(diǎn)多得不得了

例如,我們知道Python里面的range函數(shù),最少可以接收1個(gè)參數(shù),最多能夠接收3個(gè)參數(shù)。當(dāng)只有兩個(gè)參數(shù)的時(shí)候,格式為range(開(kāi)始, 結(jié)束),從開(kāi)始數(shù)字到結(jié)束數(shù)字逐次加1,左閉右開(kāi)。使用今天的方法,可以把它的寫(xiě)法改為開(kāi)始 |到| 結(jié)束,如下圖所示:

又比如,urllib.parse.urljoin可以把域名和一個(gè)相對(duì)路徑拼接起來(lái): urljoin(域名, 相對(duì)路徑),我們也可以改寫(xiě)成如下圖所示的格式:

這種炫技有余,實(shí)用不足的功能是怎么實(shí)現(xiàn)的呢?其實(shí)原理非常簡(jiǎn)單,只有8行代碼:

class Test:
def __init__(self, num):
self.num = num
def __or__(self, other):
print(f'我右邊有一個(gè)東西,它是:{other}')

x = Test(100)
x | 55

這里就涉及到一個(gè)盲點(diǎn)和兩個(gè)真正的知識(shí)點(diǎn)。這個(gè)盲點(diǎn)就是,你可能以為 |到|是一個(gè)字符,但是它是3個(gè)字符;你可能會(huì)把|拼接|看做一個(gè)整體,但是它實(shí)際上是3個(gè)部分:左邊的|、拼接和右邊的|。

我們把空格加上,就很明顯了:

兩個(gè)真正的知識(shí)點(diǎn),就是__or__和__ror__這兩個(gè)魔術(shù)方法和偏函數(shù)partial。而Change本身就是一個(gè)普通的類(lèi)而已,__or__和__ror__定義了這個(gè)類(lèi)的實(shí)例在左側(cè)遇到|時(shí),右側(cè)遇到|時(shí)的具體行為。

我們一個(gè)一個(gè)來(lái)講。首先是__or__。它定義了實(shí)例的右側(cè)遇到|時(shí)的具體行為。例如,我們用一個(gè)簡(jiǎn)單的代碼來(lái)進(jìn)行測(cè)試:

class Test:
def __init__(self, num):
self.num = num
def __or__(self, other):
print(f'我右邊有一個(gè)東西,它是:{other}')

x = Test(100)
x | 55

運(yùn)行效果如下圖所示:

但如果你把豎線(xiàn)放在左邊,他就會(huì)報(bào)錯(cuò),如下圖所示:

而__ror__就是用來(lái)定義|在實(shí)例左邊的時(shí)候,它的行為:

所以,我們最開(kāi)始的例子中,2 |到| 10,實(shí)際上應(yīng)該理解為:

  1. 到是Change(range)返回的實(shí)例
  2. 2 | 到 生成一個(gè)中間對(duì)象,我們假設(shè)它是x
  3. x | 10 生成結(jié)果

在我們演示的例子中,2 | 到首先進(jìn)入了Change類(lèi)的__ror__方法中:

  def __ror__(self, other):
self.func = partial(self.func, other)
return self

其中,一開(kāi)始的self.func就是我們?cè)诔跏蓟瘜?shí)例Change(range)時(shí)傳入的參數(shù)range。所以partial(self.func, other)等價(jià)于partial(range, 2)。關(guān)于偏函數(shù)partial,大家可以看我這篇文章:偏函數(shù):在Python中設(shè)定默認(rèn)參數(shù)的另一種辦法。簡(jiǎn)單來(lái)說(shuō),使用偏函數(shù),可以給一個(gè)真正的函數(shù)傳一部分參數(shù),過(guò)一會(huì)再補(bǔ)剩下的參數(shù)。

可能大家在日常的開(kāi)發(fā)者,很少會(huì)讓一個(gè)實(shí)例方法返回self。關(guān)于這個(gè)寫(xiě)法,大家可以看我的這一篇文章:一日一技:在Python里面實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用。也就是說(shuō),1 | 到返回的,依然是Change類(lèi)的一個(gè)實(shí)例,我們簡(jiǎn)稱(chēng)它為x。這個(gè)實(shí)例的屬性self.func的值是partial(range, 2)。

接下來(lái),x | 10,調(diào)用的是__or__方法,于是,此時(shí)執(zhí)行的是partial(range, 2)(10)。偏函數(shù)的參數(shù)補(bǔ)全了,于是它里面的range真正運(yùn)行了起來(lái),成為了range(2, 10)。

至此,這個(gè)Change類(lèi)我們就解析透了。大家知道,在Python里面,魔術(shù)方法是有很多的,如果你不想用|,你還可以用其它的,例如:

或者:

或者:

同時(shí),這個(gè)Change類(lèi),你甚至可以直接當(dāng)做裝飾器來(lái)使用。任何能夠接收兩個(gè)參數(shù)的函數(shù),都能使用這個(gè)裝飾器。例如:

最后總結(jié)一下。大家都知道,我是非常反對(duì)在工作代碼中炫技的,因?yàn)殪偶嫉膶?xiě)法很難讀,很難維護(hù)。今天這個(gè)炫技的方法,雖然我也不推薦大家用在工作中,但是它短短8行代碼里面,包含了很多個(gè)知識(shí)點(diǎn),這就值得大家玩一玩了。


文章題目:一日一技:8行炫技代碼,知識(shí)點(diǎn)多得不得了
網(wǎng)站URL:http://www.5511xx.com/article/dhjccoh.html