这是我在python-ideas上发布的一些东西,但我认为这些很有趣,应该分享给更多的人。

最近有很多关于合并两个dict(词典)的运算符的讨论。

这促使我思考为什么有些人喜欢运算符,我想起了30多年前与导师Lambert Meertens的一次讨论。

对于数学家来说,运算符对于他们的思考方式至关重要。我们来选取一个简单的操作,比如将两个数相加,并尝试研究它的一些行为。

add(x, y) == add(y, x) (1)

式(1)表示了加法的交换律。它通常用运算符来书写,这使得它更简洁:

x + y == y + x (1a)

这似乎是一个小小的收获。

现在我们来考虑一下结合律:

add(x, add(y, z)) == add(add(x, y), z) (2)

式(2)可以用运算符重写:

x + (y + z) == (x + y) + z (2a)

这比式(2)容易理解得多,并且我们发现括号是多余的,所以现在我们可以这样写:

x + y + z (3)

没有歧义(+ 运算符绑定到左边还是右边并不重要)。

许多其他定律也可以很容易的使用运算符来写。这里还有一个关于加法恒等元素的例子:

add(x, 0) == add(0, x) == x (4)

相比于

x + 0 == 0 + x == x (4a)

这里的总的思想就是一旦你学会了这个简单的表示法,用它们写的方程就比用函数表示法写的方程更容易“操作”——就好像我们的大脑用不同的大脑机制来掌握运算符,这是更有效率的方法。

我认为,使用运算符编写的公式更容易被“视觉化”处理就与此有关: 它们利用了大脑的视觉处理机制,而这一机制在很大程度上是在潜意识中运作的,并且它会告诉大脑的意识部分它看到了什么(比如,“椅子”而不是“几块木头连在一起”)。函数符号在我们的大脑中则必须走一条不同的路径,这是无意识的(它与内容的阅读和理解有关,这是在比视觉处理更晚的年龄段才学会/训练的)。

当你将多个运算符结合在一起时,视觉处理的功能就会变得非常明显。例如,考虑一下分配律:

mul (n,add(x, y)) == add(mul (n, x) mul (n, y)) (5)

这写起来很恼火,我相信一开始你是不会看到这个规律的(或者至少你不会立刻看到它,如果我没有提到这是分配律的话)。

与下式比较:

n * (x + y) == n * x + n * y (5a)

注意,这里也使用了相对的运算符优先级。通常数学家们会把它写得更紧凑:

n(x+y) == nx+ny (5b)

但是,遗憾的是,目前这超出了Python解析器的能力。

运算符表示法的另一个非常强大的方面是,可以方便地将它们应用于不同类型的对象。例如,定律(1)到(5)在x、y和z是相同大小的向量,而n是标量(用0向量代替字面量“0”)时也适用,如果它们是矩阵(同样,n必须是一个标量)也适用。

你可以这样处理不同域中的对象。例如,上面的定律(1)到(5)也适用于函数(n也是一个标量)。

通过明智地选择运算符,数学家们可以运用他们的视觉大脑来帮助他们更好地进行数学研究: 他们会更快地发现新的有趣的定律,因为有时黑板上的符号就会跳到你面前,给你提供一条通往难以捉摸的数学证明的道路。

现在,编程并不完全等同于数学,但我们都知道可读性很重要,这就是Python中运算符重载的作用。一旦你内化了运算符具有的简单属性,使用+号进行字符串或列表连接将比纯OO表示法更具可读性,上面(2)和(3)解释了(部分程度上)为什么是这样。

当然,这样做绝对有可能做过火——然后你就会使用Perl。但我认为,那些指出“已经有办法做到这一点”的人忽略了一点,即真正理解这一点是比较容易的:

d = d1 + d2

和下面相比:

d = d1.copy ()

d.update(d2) #修正:这一行之前是错误的

这不仅仅是少了几行代码的事: 第一种形式允许我们使用我们的视觉处理,以帮助我们更快的看到它的意思,并且不会影响我们大脑的其他部分(例如,这些部分可能已经被跟踪d1和d2的意思占据)。

当然,任何事情都是有代价的。你必须学习运算符,并且在应用于不同对象类型时必须学习它们的属性。(数学中也是如此——对于数字,x*y == y*x,但是这个属性不适用于函数或矩阵; 另一方面,正如结合律一样, x+y == y+x适用于所有情况。)

“但是性能呢?”我听见你这样问。好问题。在我看来,可读性第一,性能第二。在基本的例子(d = d1 + d2)中,与使用update的两行代码版本相比,没有性能损失,而且可读性明显提高。我能想到很多情况,性能差异无关紧要,但可读性是最重要的,对我来说,这是默认的假设(即使在Dropbox——我们最重要的性能代码已经用丑陋的Python或Go重写过了)。对于少数性能至关重要的情况,很容易将运算符版本转换为其他版本——*一旦你确认了这是很有必要的*(可能是通过分析得出d的)。

转载于:https://www.cnblogs.com/qqq1622479435/p/10767090.html

Python之父:为什么操作符很有用?相关推荐

  1. python之父叫什么-Python之父:为什么操作符很有用?

    这是我在python-ideas上发布的一些东西,但我认为这些很有趣,应该分享给更多的人. 最近有很多关于合并两个dict(词典)的运算符的讨论. 这促使我思考为什么有些人喜欢运算符,我想起了30多年 ...

  2. Python之父抛弃Python!现在学Python还有用吗?

    7 月 12 日,Python 之父 Guido van Rossum 在 Python 邮件组里发邮称,他将退出 Python 核心决策层,而转居幕后.从 Guido van Rossum 的邮件内 ...

  3. Python很慢?Python之父一句话亮了

    Python的运行速度确实没有C或者Java快,但是有一些项目正在努力让Python变得更快. Python代码简洁干净,但是大家都知道Python运行起来相对较慢 --- 在CPU密集型的任务上慢于 ...

  4. python学了真的很有用吗-会Python的人工作不会太差?编程课真的有必要学吗?

    都市快报"会Python的人工作不会太差,追上同龄人,就现在!" "学Python,自动化处理Excel.Word,高效办公,准时下班." "Exce ...

  5. Python之父重回决策层,未来如何发展?

    作者 | 豌豆花下猫 来源 | Python猫(ID:python_cat) 春节假期结束了,大家陆续地重回到原来的生活轨道上.假期是一个很好的休息与调节的机会,同时,春节还有辞旧迎新的本意,它是新的 ...

  6. Python之父:Python 4.0可能不会来了

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨机器之心 编辑丨极市平台 导读 不要对 Python 4.0 ...

  7. Python 之父为什么嫌弃 lambda 匿名函数?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:AI算法与图像处理 Python 支持 lambda 匿 ...

  8. python之父-Python之父宣布退休,但Python仍在吞噬世界

    声明:本文来自于微信公众号InfoQ(ID:infoqchina),作者:赵钰莹,授权站长之家转载发布. 10 月 30 日,Python 之父 Guido 大牛宣布退休,离开 Dropbox. 他发 ...

  9. 别了!Python之父!

    前段时间,Python之父退出了Python,这个创造出了世界上最令人欢迎的编程语言之一Python(胶水语言)的技术界大牛终于不用再为运营的事情苦恼了! 有人说:耿直的技术大佬终于做不好管理岗,黯然 ...

  10. 64岁Python之父:我不退休了,我要去微软

    整理 | Tina.小智.万佳 几个小时前,Python 之父 Guido van Rossum 宣布了他已经加入微软的消息. 去年 10 月,Van Rossum 在 Dropbox 公司工作了六年 ...

最新文章

  1. BEGINNING SHAREPOINT#174; 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 总结
  2. LINQ to SQL 之DataContext用法
  3. linux 内核 netfilter 网络过滤模块 (2)-conntrack
  4. HTTP协议处理流程
  5. php虚拟主机和服务器吗,php虚拟主机和服务器吗
  6. 【四重优化,速看】剑指 Offer 13. 机器人的运动范围
  7. 微信群运营之设计运营思路
  8. [vue] 有使用过vue吗?说说你对vue的理解
  9. 未来2年,会Python的人将会非常抢手
  10. ActionT 委托
  11. Android开发笔记(三十五)页面布局视图
  12. [转载] Python List index()方法
  13. 6/6 随机过程 马尔科夫链 习题(随机过程应用与模型第三章)
  14. 当当网上书店购物车——源码
  15. 样本不均衡及其解决办法
  16. 【EasyExcel】 模板填充批量导出,多文件以zip压缩包格式导出
  17. 常见笔顺错误的字_常用汉字中易写错笔顺的字有哪些?
  18. 令人敬畏的泰格伍兹 万维钢_令人敬畏的桌面壁纸:Windows 7版
  19. linux 应用编程(持续更新)
  20. 竞价实例 and 弹性伸缩的结合

热门文章

  1. 浙大学霸Facebook总部跳楼:永远不要把公司当成“家”
  2. 太傻了!下次二面再回答不好“秒杀系统“设计原理,我就捶死自己...
  3. Mybatis 有坑,千万别踩!
  4. Java程序员排行前10的错误,请注意!
  5. 这波疫情,中国会弯道超车么?
  6. sift计算效率优化_【计算机视觉】9. 小结
  7. python基础之面向对象(二)(封装、继承、多态)
  8. DevExpress DateEdit控件选择精确到秒
  9. RabbitMQ----源码安装
  10. 由swap引出的局部变量,形参和指针的小问题