向奕鸣:专注阳宅风水与墓地风水堪舆!

学了8年Python被这8行炫技代码惊呆了!

来源:向奕鸣

接收1个参数,最多能够接收3个参数。当只有两个参数的时候,格式为range(开始, 结束),从开始数字到结束数字逐次加1,左闭右开。使用2022-11-06 的方法,可以把它的写法改为开始 |到| 结束

学了8年Python被这8行炫技代码惊呆了!

我们2022-11-06 来看一段炫技代码。它可以把任何能接收两个参数的函数定义成一个特殊的运算符。

例如,我们知道Python里面的range函数,最少可以接收1个参数,最多能够接收3个参数。当只有两个参数的时候,格式为range(开始, 结束),从开始数字到结束数字逐次加1,左闭右开。使用2022-11-06 的方法,可以把它的写法改为开始 |到| 结束,如下图所示:

又比如,urllib.parse.urljoin可以把域名和一个相对路径拼接起来:urljoin(域名, 相对路径),我们也可以改写成如下图所示的格式:

这种炫技有余,实用不足的功能是怎么实现的呢?其实原理非常简单,只有8行代码:

fromfunctoolsimportpartialclassChange(object):def__init__(self,func):self.func=funcdef__or__(self,other):returnself.func(other)def__ror__(self,other):self.func=partial(self.func,other)returnself

这里就涉及到一个盲点和两个真正的知识点。这个盲点就是,你可能以为|到|是一个字符,但是它是3个字符;你可能会把|拼接|看做一个整体,但是它实际上是3个部分:左边的|、拼接和右边的|。

我们把空格加上,就很明显了:

两个真正的知识点,就是__or__和__ror__这两个魔术方法和偏函数partial。而Change本身就是一个普通的类而已,__or__和__ror__定义了这个类的实例在左侧遇到|时,右侧遇到|时的具体行为。

我们一个一个来讲。首先是__or__。它定义了实例的右侧遇到|时的具体行为。例如,我们用一个简单的代码来进行测试:

classTest:def__init__(self,num):self.num=numdef__or__(self,other):print(f\'我右边有一个东西,它是:{other}\')x=Test(100)x|55

运行效果如下图所示:

但如果你把竖线放在左边,他就会报错,如下图所示:

而__ror__就是用来定义|在实例左边的时候,它的行为:

所以,我们最开始的例子中,2 |到| 10,实际上应该理解为:

到是Change(range)返回的实例2 | 到生成一个中间对象,我们假设它是xx | 10生成结果

在我们演示的例子中,2 | 到首先进入了Change类的__ror__方法中:

def__ror__(self,other):self.func=partial(self.func,other)returnself

其中,一开始的self.func就是我们在初始化实例Change(range)时传入的参数range。所以partial(self.func, other)等价于partial(range, 2)。关于偏函数partial,大家可以看我这篇文章:偏函数:在Python中设定默认参数的另一种办法。简单来说,使用偏函数,可以给一个真正的函数传一部分参数,过一会再补剩下的参数。

可能大家在日常的开发者,很少会让一个实例方法返回self。关于这个写法,大家可以看我的这一篇文章:一日一技:在Python里面实现链式调用。也就是说,1 | 到返回的,依然是Change类的一个实例,我们简称它为x。这个实例的属性self.func的值是partial(range, 2)。

接下来,x | 10,调用的是__or__方法,于是,此时执行的是partial(range, 2)(10)。偏函数的参数补全了,于是它里面的range真正运行了起来,成为了range(2, 10)。

至此,这个Change类我们就解析透了。大家知道,在Python里面,魔术方法是有很多的,如果你不想用|,你还可以用其它的,例如:

或者:

或者:

同时,这个Change类,你甚至可以直接当做装饰器来使用。任何能够接收两个参数的函数,都能使用这个装饰器。例如:

最后总结一下。大家都知道,我是非常反对在工作代码中炫技的,因为炫技的写法很难读,很难维护。2022-11-06 这个炫技的方法,虽然我也不推荐大家用在工作中,但是它短短8行代码里面,包含了很多个知识点,这就值得大家玩一玩了。

最后送大家20000个红包封面

感谢大家对「菜鸟学Python」的5年的支持

悄悄说一下,我觉得还蛮漂亮的。

扫码领取即可

推荐阅读:

入门:最全的零基础学Python的问题 |零基础学了8个月的Python|实战项目|学Python就是这条捷径

干货:爬取豆瓣短评,电影《后来的我们》|38年NBA最佳球员分析| 从万众期待到口碑扑街!唐探3令人失望 |笑看新倚天屠龙记|灯谜答题王|用Python做个海量小姐姐素描图|碟中谍这么火,我用机器学习做个迷你推荐系统电影

趣味:弹球游戏 |九宫格 |漂亮的花|两百行Python《天天酷跑》游戏!

AI:会做诗的机器人|给图片上色|预测收入|碟中谍这么火,我用机器学习做个迷你推荐系统电影

小工具:Pdf转Word,轻松搞定表格和水印!|一键把html网页保存为pdf!|再见PDF提取收费!|用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换|制作一款钉钉低价机票提示器!|60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

1).卧槽!Pdf转Word用Python轻松搞定!

2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃

3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密

4).80行代码!用Python做一个哆来A梦分身

5).你必须掌握的20个python代码,短小精悍,用处无穷

6).30个Python奇淫技巧集

7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货

8).再见Python!我要学Go了!2500字深度分析!

9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片

点阅读原文,看200个Python案例!

本文由向奕鸣整理发布,转载请注明出自http://www.xjfsg.com/news/49226.shtml

上一篇:梦见风景下一篇:学了8年Python被这8行炫技代码惊呆了!

相关文章

图文资讯

友情链接: 向奕鸣