人们可能不喜欢 Python 的一些方面是什么?
在本文中,我们将探讨大多数人不喜欢 Python 的一些方面。
使用缩进代替花括号
许多人抱怨 Python 完全依赖缩进构建代码块。如你所知,在 Python 中,缩进不是可选的。抱怨各不相同,但通常包括以下一种或多种情况。
很难看出函数在哪里结束
编写大型 Python 函数时确实如此。但是,如果你完全避免编写大型函数,将会更有优势。这适用于任何语言,而不仅仅是 Python。一个函数应该只做好一件事。如果你发现自己正在开发一个多页函数,请将其分解成只做一件事的较小函数。
这不仅产生了简洁易读的代码,还产生了可测试的代码。针对只完成一件事情且没有副作用的短函数的单元测试很容易编写。当你开发执行许多事情的大型函数时,你只能编写集成测试。
多个 Python 版本
我们看到用户不喜欢 Python 是因为它有两个版本——**Python 2** 和 **Python 3**。
更糟糕的是,它们经常在 Linux 上并排安装。虽然两者以前都很流行(并且不兼容),但这如今比以前少见得多。
大多数项目现在已将其代码迁移到 Python 3,但这并非一直如此。不幸的是,由于许多软件包花了时间确保转换为 Python 3,许多 Linux 发行版不得不同时发布两个版本的 Python。
总而言之——是的,在 Python 3 过渡期间的几年里,这是一个真正的问题,但现在它在很大程度上已经解决了。
Python 速度慢
这是人们不喜欢 Python 的另一个原因。Python 的目标并非成为世界上速度最快的语言。还有 Python 的 GIL(全局解释器锁),它并没有人们所说的那么糟糕。
事实上,Python 作为一种语言,优先考虑易于理解、简洁的代码,而不是单纯的速度。因此,Python 并非最快的语言。然而,我们发现许多人在没有实际遇到速度问题,或者至少在没有首先尝试修复他们自己的低效代码的情况下就抱怨它。
如果你在 Python 中遇到速度问题,你可以采取多种方法来加快代码速度。其中之一是使用**并发**。然而,大多数时候,这仅仅是优化代码的问题。
你可以考虑以下几点:
缓存
布隆过滤器
使用适当的数据结构
尽量减少在循环内执行的工作量
避免递归。
或者,可以考虑使用更快的 Python 实现,例如 PyPy 和 CPython。如果这还不够,许多流行的 Python 程序(例如 NumPy)将其核心功能用 C 实现。因此,用这里的库函数替换你的代码可能会产生更好的结果。
Python 在大型项目中扩展性不好
在辩论中,许多人听到有人为 Python 辩护,但最终得出结论认为它是一种脚本语言,不能很好地扩展到大型项目中。这根本不正确。但人们知道有许多大型应用程序运行良好。事实上,Python 包含所有必要的扩展工具:
如果需要,你可以将项目分成不同的包。
可以使用模块。
它允许面向对象编程。
Python 的扩展性与任何其他语言一样好,甚至更好。Home Assistant 是一个大型项目,我每天都在家里使用它。它证明了 Python 可用于创建大型复杂的应用程序。
Python 只是一种无类型的脚本语言
这部分正确,部分错误。Python 是一种优秀的编程语言。它允许我们快速编写脚本以完成特定任务,而无需事先显式定义类型。它使我们能够进行原型设计和快速测试。
这种类型的灵活性称为动态类型。变量没有类型,但你创建的对象有类型。除此之外,Python 是一种强类型语言,这意味着一旦创建了对象,它的类型就不会改变。
例如,字符串“2”在像“2”+ 2 这样的等式中使用时不会突然变成数字。如果你这样做,Python 将抛出 TypeError。
通过加入显式类型支持,Python 现在提供了一个很好的混合模型。他们似乎找到了最佳点。如果你在进行黑客攻击,可以省略类型。但是,在编写应用程序时,你可以(也应该)指定类型。解释器会忽略它们,但你的 linter 和/或 IDE 可以使用它们来捕获潜在的问题。更好的是,因为它现在知道所有对象的类型,你的 IDE 将提供出色的自动完成功能。
更好的是,因为它现在知道所有对象的类型,你的 IDE 将提供出色的自动完成功能。
Python 社区似乎已经接受了新的显式类型。流行的 API 框架 FastAPI 广泛使用类型。这是它易于使用的其中一个原因——由于显式类型,你还在 Python IDE 中获得出色的自动完成功能。
Python 包含一些难看的全局函数
像 Java 这样的面向对象语言中没有全局函数。在 Python 中,此类函数的示例有 **len()** 和 **print()**。
我们听到关于 len() 最常见的问题是长度应该是对象的一部分,而不是全局函数。
例如,为什么没有 length() 方法来检索 Python 列表的长度?
inputList = [4, 6, 2, 1] # This will NOT work inputList.length() # Also this will NOT work inputList.length # You must use this one len() - #4 len(inputList)
但是,Python 使用 **len()** 函数而不是方法是有原因的。这实际上是一个深思熟虑的设计选择。
在其他语言(例如 Java)中,可以通过调用对象上的方法来获取长度。但它是哪种方法?是:
.length()
.size()
numItems()
……等等
它是一个变量,例如 **.length** 或 **.size** 吗?作为一名 Java 开发人员,我见过所有这些以及更多变体。标准化这样一项常见活动是有意义的。如果你的 Python 对象实现了 __len__() dunder 方法,则 len() 函数将起作用。你只需要习惯它。
结论
在本文中,我们了解了很多人不喜欢 Python 编程语言的七个方面。