成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一日一技:8行炫技代碼,知識點多得不得了

開發(fā) 前端
我們今天來看一段炫技代碼。它可以把任何能接收兩個參數(shù)的函數(shù)定義成一個特殊的運算符。

我們今天來看一段炫技代碼。它可以把任何能接收兩個參數(shù)的函數(shù)定義成一個特殊的運算符。

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

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

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

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

x = Test(100)
x | 55

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

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

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

我們一個一個來講。首先是__or__。它定義了實例的右側遇到|時的具體行為。例如,我們用一個簡單的代碼來進行測試:

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

x = Test(100)
x | 55

運行效果如下圖所示:

但如果你把豎線放在左邊,他就會報錯,如下圖所示:

而__ror__就是用來定義|在實例左邊的時候,它的行為:

所以,我們最開始的例子中,2 |到| 10,實際上應該理解為:

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

在我們演示的例子中,2 | 到首先進入了Change類的__ror__方法中:

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

其中,一開始的self.func就是我們在初始化實例Change(range)時傳入的參數(shù)range。所以partial(self.func, other)等價于partial(range, 2)。關于偏函數(shù)partial,大家可以看我這篇文章:偏函數(shù):在Python中設定默認參數(shù)的另一種辦法。簡單來說,使用偏函數(shù),可以給一個真正的函數(shù)傳一部分參數(shù),過一會再補剩下的參數(shù)。

可能大家在日常的開發(fā)者,很少會讓一個實例方法返回self。關于這個寫法,大家可以看我的這一篇文章:一日一技:在Python里面實現(xiàn)鏈式調(diào)用。也就是說,1 | 到返回的,依然是Change類的一個實例,我們簡稱它為x。這個實例的屬性self.func的值是partial(range, 2)。

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

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

或者:

或者:

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

最后總結一下。大家都知道,我是非常反對在工作代碼中炫技的,因為炫技的寫法很難讀,很難維護。今天這個炫技的方法,雖然我也不推薦大家用在工作中,但是它短短8行代碼里面,包含了很多個知識點,這就值得大家玩一玩了。


責任編輯:武曉燕 來源: 未聞Code
相關推薦

2024-07-30 08:16:18

Python代碼工具

2024-07-30 08:11:16

2021-10-15 21:08:31

PandasExcel對象

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2025-05-28 03:15:00

Scrapy數(shù)據(jù)sleep

2021-04-12 21:19:01

PythonMakefile項目

2021-11-12 05:00:43

裝飾器代碼功能

2023-10-29 09:16:49

代碼安全命令

2022-06-28 09:31:44

LinuxmacOS系統(tǒng)

2023-10-28 12:14:35

爬蟲JavaScriptObject

2021-09-13 20:38:47

Python鏈式調(diào)用

2024-11-13 09:18:09

2021-03-12 21:19:15

Python鏈式調(diào)用

2021-04-05 14:47:55

Python多線程事件監(jiān)控

2022-03-12 20:38:14

網(wǎng)頁Python測試

2021-04-19 23:29:44

MakefilemacOSLinux

2024-11-11 00:38:13

Mypy靜態(tài)類型

2024-05-24 09:07:06

JSONprint字符串

2024-07-19 18:23:17

2021-07-27 21:32:57

Python 延遲調(diào)用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 少妇久久久久 | 国产高清精品一区二区三区 | 成人免费视频 | 99热精品久久 | 久久久久久久久久一区二区 | 波多野结衣一区二区三区在线观看 | 国产免费一区 | 黄a在线观看 | 福利一区二区 | 国产精品射 | 国产精品久久久久一区二区三区 | 一区二区三区精品视频 | 成人免费一级视频 | 国产免费一区 | 色综合色综合色综合 | 亚洲狠狠爱 | 精品久久久久久国产 | 中文日韩字幕 | 夜夜艹 | av黄色在线观看 | 日韩高清一区 | 亚洲精品在线免费 | 中文字幕成人在线 | 91九色视频 | 亚洲成人高清 | 欧美色综合一区二区三区 | 亚洲精品一区二区在线观看 | 久久精品一区 | 精品国产青草久久久久96 | 风间由美一区二区三区在线观看 | 黄色一级大片在线免费看产 | 青娱乐av| 国产成人免费视频网站高清观看视频 | 在线观看日韩av | 国产网站在线免费观看 | 日韩欧美在线免费观看视频 | 久久免费资源 | 中文字幕色站 | 国产探花在线精品一区二区 | 亚洲国产精品va在线看黑人 | 99热这里只有精品8 激情毛片 |