为毛 python 没有自增自减运算?

2014-02-19 12:35:35 +08:00
 kevinroot
每次写到count += 1就ju花一紧
16123 次点击
所在节点    Python
42 条回复
luckwang
2014-02-19 14:54:29 +08:00
用for的话有个enumerate()
sandtears
2014-02-19 14:57:54 +08:00
因为作者不喜欢
BOYPT
2014-02-19 15:04:27 +08:00
在python里面找编码效率问题,你还真是找对了地方。
davidli
2014-02-19 15:49:16 +08:00
上面那个stackoverflow链接里的回答很有道理。
i++平时就主要用在for语句里,而在Python里for语句直接用range()了,i++ ++i这种不够直观又容易出错的用法就没必要出现了。
oldcai
2014-02-19 15:56:03 +08:00
@est 是啊,我也是用的这个方法实现原先需要switch的功能。
比起switch,这个不用只拘泥于数字类型。
至于效率,都用脚本了,就不要那么计较了吧(啊喂,为什么不用ruby用python(找骂))。
而且,到计较switch不满足条件会遍历条件的效率的时候,也会有其他的实现方式了。
qazwsxedc121
2014-02-19 16:07:46 +08:00
我现在写js都绝对不写 ++ ,写 += 1 了,蝴蝶书里面说的我感觉很有道理
FrankFang128
2014-02-19 16:19:51 +08:00
令人误解,不用也罢。
liubin
2014-02-19 16:55:20 +08:00
@VYSE 不加锁没有哪种语言会把++作为原子操作去实现吧。
jiang42
2014-02-19 17:12:49 +08:00
每种语言都有各自的优劣
想要自增自减大可以用C
程序是写给人看的,不过计算机恰好能读懂而已
BTW,python 是社区在进行开发,你可以去提出 issue 叫他们增加自增自减
有没人愿意这么做就不知道了-。-
kunimi
2014-02-19 17:44:45 +08:00
@yegle 这个例子还是有一定误导性的,对于整型变量来说,python其实定义了一个小整数池(-5到257),在这个范围内,如果对两个变量赋值同一个值,那么它们指向的是同一个对象。
In [1]: i=258

In [2]: j=258

In [3]: id(i)
Out[3]: 42930796

In [4]: id(j)
Out[4]: 42932492
luoqeng
2014-02-19 18:21:46 +08:00
@chevalier
A (false) folk myth is that the instruction set architecture of the PDP-11 influenced the idiomatic use of the B programming language. The PDP-11's increment and decrement addressing modes correspond to the −−i and i++ constructs in C. If i and j were both register variables, an expression such as *(−−i) = *(j++) could be compiled to a single machine instruction. Dennis Ritchie unambiguously contradicts this folk myth, noting that the PDP-11 did not yet exist at the time of B's creation. He notes however that these addressing modes may have been suggested by the auto-increment cells of the PDP-7, though the implementation of B did not utilize this hardware feature.[4] The C programming language did however take advantage of several low level PDP-11 dependent programming features, resulting in the propagation of these features into new processors.

http://en.wikipedia.org/wiki/PDP-11_architecture

《C专家编程》里面好像也有讲
jakwings
2014-02-19 18:33:51 +08:00
我觉得看完上面的所有评论才应该菊花一紧……不敢玩 Python 代码风格了怎么办?@est
est
2014-02-19 19:06:46 +08:00
@liubin 也不绝对。x86指令集支持这个 http://en.wikipedia.org/wiki/Fetch-and-add
wodemyworld
2014-02-19 19:11:31 +08:00
没原生swith这个确实一开始不太能习惯
VYSE
2014-02-19 20:12:45 +08:00
@liubin INC寄存器是原子的,要原子INC内存里一变量就得LOCK INC/DEC在X86,GCC里得用atomic系列函数搞,不知道其他编译器怎么选择
workaholic
2014-02-19 20:33:44 +08:00
概念不同,python中数字和字符都是改变后就变了地址,前后加减操作给人错觉就是没有变地址
weakish
2014-02-19 20:41:37 +08:00
Lua里面连`+=`也没有……
picasso250
2014-02-20 09:42:34 +08:00
there is one way to do one thing
yegle
2014-02-20 11:00:28 +08:00
另外,真的不试试enumerate函数吗…
fghzpqm
2014-02-20 11:25:42 +08:00
@VYSE GIL 并不能保证 a += 1 是原子的。 cc @est

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/100890

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX