Python使自己作为自己的语言而具有哪些独特之处?[关闭]


12

Python使自己作为自己的语言独特的一些特征是什么?我正在寻找各种特性,从好到坏,对障碍有用,语法到实际使用情况,但是对于普通开发人员而言,无遮掩的观察将是最有用的。

我是新手,因此可能需要解释一些直观的内容。


9
Python不是唯一的,它不包含任何其他语言都没有的单一独特功能。
SK-logic

10
这是我知道的唯一以Monty Python命名的语言...
yannis 2011年

@ SK-logic的问题是关于特征,其中特征是子集。没有Python独有的特征吗?
kojiro 2011年

@kojiro,我从未见过“特征”的正式定义,所以我宁愿不要猜测。
SK-logic

1
@ kojiro,PL功能通常被理解为其语法和语义。两者都已正式定义。
SK-logic

Answers:


22

您将很难找到绝对独特的功能。自成立以来,大多数语言功能已被一种以上的语言采用。有些可能更稀有,主要是因为它们不是新鲜事物,还是默默无闻,或者是出于充分的理由而消失了。不过,即使那样,您最好还是查看功能组合。

也就是说,Python的几个功能应该构成相对独特的组合。至少我不知道具有重叠功能集的远程(流行和实用)任何语言。如评论中所述,Ruby非常接近,但是仍然存在许多差异。

  • 基于元的元编程。基本上,在类创建时运行任意代码。为使非常好的类定制与非常的recieving到底有多大的工作-例如,对于一个对象-关系映射(ORM),客户端类可以写成像往常一样有一些额外的线条状attr = SomeDataType(),并自动生成一吨的代码。Django的“模型”就是一个例子。
  • 建议您对所有内容都使用迭代器。这在3.x中尤其明显,在该版本中,大多数基于列表的替代方法都已被替代,而基于迭代器的等效方法已被废除。迭代器还充当集合的通用接口(既包含您实际在内存中的集合,又包含仅需要一次并因此使用以下功能创建的集合)。与集合无关的,节省空间的(O(1)通常会自然产生中间结果的空间,很少有任务实际上一次需要存储中的所有项),可组合数据处理从未如此简单。
  • 与上面有关的生成器表达式。许多人会听说过列表理解(使用非常方便的语法从该过程中的另一个可迭代,过滤和映射创建列表)。忘了它们,它们是语法糖,这是特例。生成器表达式在语法上非常接近,最终导致完全相同的项目序列,但是它们懒惰地产生结果(O(1)除非您明确保留结果,否则它们会占用空间)。
  • yield,这主要是使编写迭代器(此处称为生成器)变得更好。它们是上述功能的老大哥,支持各种控制流程。C#具有相似的东西,但关键字相同。但是,yield它也过载以支持有限的协程(例如,Lua具有更详尽的支持),但是,聪明的人在解决难题时很好地利用了它们。我想到了两个例子:具有回溯和无栈限制的递归下降解析异步I / O(具有方便的语法)。
  • 多目标分配和可迭代的拆包。类固醇的赋值。您不仅可以一次分配多个值(甚至在交换值时和迭代-时for key, value in mapping.items()),还可以将任何已知长度的迭代器(诚实地,主要是元组)分解为多个变量。从3.x版本开始,它甚至对于未知长度的集合都非常实用,因为您可以指定一些变量使用单个项目,而一个变量则保留所有剩余值:first, *everything_in_between, last = values
  • 描述符,可能是自定义属性访问的各种方式中最强大的。有一些属性(如在C#中,但没有特殊语言支持),静态方法,类方法等,均实现为描述符。它们也是一流的对象。就在一周前,我在属性中遇到了重复且棘手的代码-因此我编写了一个小函数来生成重复部分并将其包装在propery对象中。
  • 完全越位规则(用indindion表示分界)。我故意把这放在最后。尽管它确实与Python有所区别,但是一旦习惯了它,它就不会真正在日常编程中脱颖而出(或者至少是我的经验)。

我仍然对Ruby有点陌生,但我认为除了最后一点之外,所有内容都可以触及吗?无论哪种方式,我都同意在Python中可能找不到“唯一”,但“在其他顶级语言中不常见”可以找到。
钻机

@Rig:我不是Ruby专家,但是我既没有见过元类(Ruby在元编程方面肯定同样强大,并且可以将其用于相似的目的,但是我的印象是它的实现方式不同),也没有生成器或生成器表达式(尽管似乎有协程),也没有可迭代的拆包(尽管有多目标分配),也没有Ruby中的描述符。是的,Ruby和Python确实重叠。但是有区别

好+1 对我来说,“对类固醇的赋值”实际上是“穷人的模式匹配”,但仍然非常有用:)我还注意到参数在函数中传递的灵活性:*args**kwargs,将元组和字典映射为参数的简便方法,等等。 。
9000

我相信,除了使用基于布局的语法外,与CLOS共同使用的lisp都能达到所有目的。Haskell不是面向对象的(尽管有OO扩展),但是除了元类点之外,我相信它可以匹配所有这些功能。
Jules

3

我猜想使Python独特的唯一原因是它公开的功能的特定组合。对于大多数编程语言来说都是如此。

或者可能有一件小事情:我还没有看到Python self作为一种形式参数明确传递给以任何其他语言完成的对象成员函数的方式。这是一件小事,我看不出这是如何真正改变的。

但是我对Python不太熟练,因此可能肯定缺少一些东西!


@delnan:啊,我错过了“明确地传递自己作为一个正式的参数” ..想这就是我得到在凌晨2点读;)
德棉布莱希特

4
显性的自我也发生在奥伯伦(Oberon),弗拉夫
f

通用lisp对象系统中也使用了显式的self参数。但是,CLOS提供了多种方法,这意味着self参数没有任何特殊之处,就像在python中一样。
Jules

1

自动处理文档字符串成为其所有者的属性。通常,Python的所有出色的自省功能都使其成为一种非常独特的语言,从使用help()的能力到__doc__用作对象的一流属性的能力。例如:

>>> class DocStringException(Exception):
...     """Error message is the same as docstring"""
...     def __str__(self):
...         return repr(self.__doc__)
... 
>>> class ExampleException(DocStringException):
...     """An example happened"""
... 
>>> raise ExampleException
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.ExampleException: 'An example happened'

其他有用的自省功能:

  • help / help()-帮助解释器/帮助对象
  • 关键字-python关键字
  • locals()-获取本地名称
  • globals()-获取全局名称
  • dir()-获取对象的属性和方法
  • .mro方法。,issubclass-了解继承
  • id()-获取对象的内存地址

Ruby与Common Lisp,Clojure以及我相信的许多其他动态语言几乎具有相同的功能。
–Torbjørn

@Torbjørn哪个权力?自动文档编制还是自省功能?
kojiro 2011年

我在想两个。不完全是这样说,而是本着精神。我不相信Ruby具有相同的文档编制功能,但是可以肯定地进行内省。CL和Clojure具有这两个功能-我相信自省是Python之外的,因为它是同质的
Torbjørn

1
  1. Generator Expressions
  2. input()让我解释一下,到目前为止,我还没有看到一种语言,您可以在其中为打印某些内容的语句分配一个值,就像ruby的print/gets,但是为打印内容分配一个值,而不是:print "Foo" bar = gets
  3. yield
  4. 多种类型的数据集: ordereddict, namedtuple, array, list, tuple, dictionary

生成器表达式可以使用列表推导在Haskell中实现(与Python列表不同,Haskell列表是惰性的,因此不需要特定的语法)。通过“输入”,我假设您的意思是该名称的python 3函数(因为python 2函数是危险的,不应使用)。的确,这是行为的不寻常组合(尽管它存在于javascript-window.prompt-和BASIC中,这是我猜想python从那里借来的),但是它可以由程序员轻松实现(“ input s = putStrLn s >> getStrLn”将用于haskell)。
Jules

像Haskell这样的惰性语言实际上并不需要产量-它可以返回使用常规方法构建的列表,并且将根据需要生成项目。尽管如此,该库仍包含协程的显式实现。Haskell标准库包含所有提到的数据结构,还有更多。
Jules

-2

事实是,Python是极少数具有极低语法开销的语言,它具有强大的表达能力:列表/集合/字典理解,产量,修饰符,评估,元类编程,自省,优化的内置数据结构(列表,字典,集合),所有这些事情都以一种非常不错的方式汇聚在一起,使您(开发人员)能够以您认为的最快的速度,用简洁,优雅的代码表达您的想法。我真的想不出具有这种杀手级功能的其他语言。


1
如果您认为Python的语法开销较低(尽管语法繁琐而语法糖相对较多),您对Scheme的看法如何?
Tikhon Jelvis'4

Eval实际上不应该用于任何生产程序(尽管我同意,它对于快速黑客攻击非常有用)。如其他问题的注释所示,python在具有这些功能方面绝不是唯一的。例如,我相信clojure具有您列出的所有功能,并且大多数功能都可以通过常规的lisp完成。
Jules

-4

我会说它是使用缩进来包含if语句和循环。还没有看到其他语言的版本。

我认为它非常方便,因为它使混淆python代码变得更加困难!

除了功能以外,它似乎还可以逐行地执行,而且也可以这样解释,这很好。


2
维基百科知道一个充满各种语言的屏幕。这就是越位规则

3
我不明白,除了函数以外,它似乎还以整齐的方式逐行执行,它也可以这样解释,这很好。这是什么意思?
kojiro 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.