有知友写了篇文章 《Python 是我用过最糟糕的语言之一》,说了一堆Python的缺点,但没一条说到点子上,引号里面是作者的观点,后面是我对他所说的做的解释。
没有Let等局部变量声明(Scala有block,Haskell,Idris,Ocaml,es6的Let, js的 var),你无法可靠地在局部引入一个变量,一不小心就把全局变量改了。我觉得这个是最无法忍受的。
说没有局部变量声明,不知道他是怎么使用使变量的,也许他并不知道LEGB,只要没有用 global 关键字声明的话,默认定义在函数里面的变量都是局部变量,例如:
x = 10
def func():
x = 20
函数里面的x和外面的x完全互不影响,怎么就把全局变量改了呢?
所有绑定都是可变变量,没有immutable
immutable对象在Python多了去了,int、float、decimal、complexbool、string、tuple、range、frozenset、bytes 都是不可变对象
匿名函数不支持多行,这个还不如js
Python 是采用强制缩进的语言,匿名函数换成多行反而变得复杂了,Python哲学就不鼓励复杂的逻辑用匿名函数来实现,可读性不好,限制单行是要求你尽可能是在简短的逻辑才使用匿名函数,如果是复杂的业务逻辑,你完全你可以用嵌套函数嘛。
动态类型系统,编辑器支持非常糟糕,难以代码补全(pycharm)
这个就更没有黑的必要可,动态类型语言的特性用起来就是比静态语言灵活方便,表达性比静态语言更强,所以你很少会看到有Python相关的设计模式。 我感觉PyCharm的代码补全功能已经非常完善了,自从Python引入了类型声明后,编辑器支持已经足够友好了。
版本兼容问题:2和3不兼容是OK的,但是居然3.6和3.7的包都不互通(比如3.7就没法安装Tensorflow)
因为Python3.7新增了async关键字,如果你的项目中不幸使用了async作为变量名,肯定运行不了,这换成任何语言都是这样,jdk10 也引入过新的关键字 var, 如果你的代码把var作为变量,一样也运行不了,这没啥好黑的,总体上语法、接口都是保持向后兼容的。
以上其实都是一些个人喜好的问题,谈不上糟糕两字,就好比湖南人吃米粉有些人喜欢吃圆的有些人喜欢吃扁的一样,你不能因为这家店只提供扁粉你就说他们的体验很糟糕吧。
关注公众号「Python之禅」,回复「1024」免费获取Python资源