为什么Python中没有++和——运算符?


当前回答

清晰!

Python非常强调清晰度,没有程序员能够正确地猜出——a的含义,除非他/她学过一种具有这种结构的语言。

Python还在很大程度上避免了引起错误的构造,而++操作符是众所周知的缺陷的丰富来源。 这两个原因足以让Python中不使用这些操作符。

决定Python使用缩进来标记块而不是 而不是句法手段,比如某种形式的开始/结束括号 或者强制性的结束标记很大程度上是基于同样的考虑。

为了说明问题,我们来看看关于引入条件操作符的讨论(在C: cond ?resultif: resultelse)在2005年加入Python。 至少阅读该讨论的第一条信息和决定信息(前面有几个关于同一主题的前奏)。

花絮: 其中经常提到的PEP是“Python增强提案”PEP 308。LC表示列表理解,GE表示生成器表达式(如果这些使您感到困惑,请不要担心,它们不是Python中少数复杂的地方)。

其他回答

我相信这源于Python的信条“显式优于隐式”。

它就是这样设计的。自增和自减运算符只是x = x + 1的快捷方式。Python通常采用一种设计策略,减少执行操作的可选方法的数量。增强赋值是Python中最接近自增/自减操作符的东西,它们直到Python 2.0才被添加。

除了这里的其他优秀答案之外,++和——也因未定义的行为而臭名昭著。例如,这段代码中发生了什么?

foo[bar] = bar++;

它看起来很无辜,但它是错误的C(和c++),因为您不知道第一个栏是否会增加。一个编译器可能会以一种方式执行,另一个可能会以另一种方式执行,而第三个编译器可能会让恶魔从你的鼻子里飞出来。所有这些都完全符合C和c++标准。

(编辑:c++ 17改变了给定代码的行为,这样它就被定义了;它将等价于foo[bar+1] = bar;+ +酒吧;——尽管如此,这可能不是程序员所期望的。)

在C和c++中,未定义行为被视为不可避免的邪恶,但在Python中,它只是邪恶,并尽可能避免。

这并不是因为它没有意义;将“x++”定义为“x+ = 1,求值到x的前一个绑定”非常有意义。

如果你想知道最初的原因,你必须在旧的Python邮件列表中寻找,或者询问当时在那里的人(例如。Guido),但事后很容易就能证明:

简单的递增和递减不需要像其他语言那样多。你不会写这样的for(int i = 0;I < 10;i)在Python中经常使用;相反,你可以把I放在(0,10)范围内。

由于不经常需要它,所以没有理由给它自己的特殊语法;当您确实需要增加时,+=通常就可以了。

It's not a decision of whether it makes sense, or whether it can be done--it does, and it can. It's a question of whether the benefit is worth adding to the core syntax of the language. Remember, this is four operators--postinc, postdec, preinc, predec, and each of these would need to have its own class overloads; they all need to be specified, and tested; it would add opcodes to the language (implying a larger, and therefore slower, VM engine); every class that supports a logical increment would need to implement them (on top of += and -=).

这些都是+=和-=的冗余,所以会变成净损失。

我知道这是一个旧线程,但最常见的用例++ I没有涵盖,即手动索引集时,没有提供索引。这种情况就是python提供enumerate()的原因

示例:在任何给定的语言中,当你使用像foreach这样的构造来遍历一个集合时——为了示例的目的,我们甚至会说它是一个无序的集合,你需要一个唯一的索引来区分它们

i = 0
stuff = {'a': 'b', 'c': 'd', 'e': 'f'}
uniquestuff = {}
for key, val in stuff.items() :
  uniquestuff[key] = '{0}{1}'.format(val, i)
  i += 1

在这种情况下,python提供了一个枚举方法,例如。

for i, (key, val) in enumerate(stuff.items()) :