首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 之父Guido van Rossum在2013年对几个问题的回应

摘要:

关于Python面向对象的问题。

关于PyPy

关于浏览器运行Python

关于Python 3

关于函数是编程问题

关于lambda表达式问题

关于面向对象:接口,虚类,私有成员,等等…为什么Python没有这些特性?

Guido:我能想到的有两个原因:你并不是真的需要它们,并且如果没有编译时的类型检查会很难实现。

Python是作为一个臭鼬工厂的项目开始做的(没有被管理层支持和鼓励但也没有阻止),并且我希望能够快点出一些成果。这指引我移除了一些不是真正需要或者继续的特性;这也让我进行运行时的所有类型检查,它限制了Python能够支持的特性。

我也不是面向对象的忠实信徒——我只是想要一个简单的语言,它因为意外或多或少地变得有一些面向对象。

在新版的Python中,已经有了和这些语言特性类似的实现,但运行效果并不怎么好,或者导致大量的运行开销,所以,这些特性通常是需要避免使用的(不过,这些特性还是有一些用处,有些人也热衷去使用它们)。

你觉得PyPy代表未来的发展方向吗?

Guido:我对此仍然持怀疑态度,有两个原因:

(1)它们还不支持Python3。

(2)还有很多扩展模块不能很好的支持。

但是我希望它们能修复那些问题。

作为PyPy项目的竞争者,Jython和IronPython会让CPython项目保持其发展势头(咋又回到CPython了呢^_^)。

是不是已经是时候来实现让Python运行在浏览器里的功能了?

Guido:我在1995年就放弃了这件事。并且请不要把Python编译成Javascript。它们的语义非常不同,结果是你用Javascript写了一个Python运行时,它会让运行变得太慢。

关于Python3:

Guido:我同意向Python3的迁移会持续很长时间,在我离开Google的时候,所有向Python2.7过渡的工作全部完成了(在前几年已经成功的从2.4迁移到2.6),在Dropbox这里,客户端和服务器端都是用的2.7。这两个公司都在考虑Python3的问题了。

再来说向Python3的迁移,我实际上是相当乐观的。很多流行的库都开始着手做这件事。它确实会持续很长时间,但也有很多进展,过几年之后,我希望所有的代码都能迁移到Python3上来。完全根除Python2的使用可能会花更多的时间,但是呢,Windows XP不也是没完全死掉吗。

你是否感觉函数式编程方法总的来说不是特别有用,或者它不是十分适合Python?

Guido:我并不是把一个想法做到极致的信徒,我试着在设计选择的时候走实用主义的路子(但不是“太”实用主义)。我会衡量现实代码的可读性和可用性。有些地方 map( ) 和 filter( ) 是适合的,但是另一方面Python有列表推导。我不再讨厌 reduce( ),因为我曾经只用 (a) 来实现sum( ),或者用(b) 可读性不好。所以我们添加了内建的sum( ),将reduce( )移除出内建函数,移到了一个工具函数里。

我对函数式语言的看法,就是它们都用非常强大的编译器,比如Haskell。对这样的一个编译器,函数式泛型是非常有用的,因为它让大量的转变成为可能,包括并行化。

但是,Python解释器并不清楚你的代码的含义,这也是很有用的。所以,我不认为把一些函数式的思想加入Python是合理的,因为这些在函数式语言里是很有用的,但是不适合Python,并且这会让代码对不使用函数式编程的人非常不具有可读性(这里指的是大部分程序员)。

我也不认为现在函数式语言的成果已经让它准备好成为主流。不可否认的是,我对于Haskell一些相关的领域并不是很了解,但是任何没有Haskell流行的语言都有它的实际用处,我也没有听过有别的函数式语言比Haskell更流行。对于Haskell,我认为让很多编译器技术得到证明是非常棒的,但是它的“纯净”会是它被人接受的最大障碍。它的单一让它对于大部分人是不适合的。

Python有限的支持lambda表达式,是否会支持多行lambda表达式?

Guido:这确实是更好的方法,这里使用def关键字在本地作用域定义一个正规的函数。这个被定义的函数对象变成了一个本地变量,而这根使用lambda是相同的语义,除非这里用到了一个本地变量,并且这里没有任何语法的限制。例如,以下两种写法的语言是相同的:

def make_adder(n):

__def adder(x):

____return x + n

__return adder

然后这是使用lambda的表达式:

def make_adder(n):

__return lambda x: x + n

Andrew Koenig 有一次向我指出了在一种场景下,lambda是非常适合的,那就是你有你个很长的list或者dict包括很多lambda表达式,因此如果你想不用lambda实现的话,那么定义一大堆函数,给它们命名,然后用list或dict里的名称来引用它们就会让你受不了。但是,在那种情况下,lambda表达式是足够简单的,如果你有一些异常,在list或dict之前使用def才是一种好的妥协。

这里还是要推荐下小编的Python学习群:491 308 659, 邀请码:YZ 不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2017最新的Python资料和0基础入门教程,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180220A0LPF000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券