Why do Python programmers still use old-style division?
我在2001年开始使用python。我喜欢语言的简单,但有一个让我恼火的功能是/操作符,它会在一些微妙的地方咬我,比如
1 2 3 4 5 6
| def mean(seq):
"""
Return the arithmetic mean of a list
(unless it just happens to contain all ints)
"""
return sum(seq) / len(seq) |
幸运的是,PEP238已经被写了,当我发现新的from __future__ import division声明时,我就开始认真地将它添加到我写的每个.py文件中。
但在这里,大约9年后,我仍然经常看到使用/进行整数除法的python代码示例。//不是一个广为人知的功能吗?还是有理由选择旧的方式?
我认为用于截断的//是相当有名的,但是人们不愿意在他们编写的每个模块中"从未来导入"。
经典的方法(使用EDCOX1,1)等来获得一个浮点结果,EDCOX1(2)来截除另一个浮点除法,这是C++中使用的一种方法(在C、Java、FORTRAN、……中略有不同的语法),每一个Python版本中包含2.7个"本地",所以如果很多人都非常使用T,就不足为奇了。哦,舒适地说,"经典的方法"。
当python 3比python 2更加广泛和广泛使用时,我希望事情会有所改变。
如果您愿意,您可以为整个解释器更改/的行为,因此不必在每个模块中从将来导入。
1 2 3 4 5 6 7
| $ python -c"print 1/2"
0
$ python -Qwarn -c"print 1/2"
-c:1: DeprecationWarning: classic int division
0
$ python -Qnew -c"print 1/2"
0.5 |
- 如果您正在编写由其他人运行的代码,您如何要求他们使用您首选的选项来运行它?看起来像是"在我的机器上为我工作"的解决方案之一。
- @约翰,我想在Windows上,您应该使用.bat来运行具有正确选项的python。在UNIX/Linux中,您可以将选项添加到shebang行。大多数情况下,虽然-Qwarn对于寻找从/升级到//的位置很有用,但不会破坏任何东西。
- 我宁愿让代码独立于命令行选项正常工作。在分发包/模块时,选项没有多大用处。
- 我尝试用硬编码的-Qnew编译python解释器,但它破坏了太多东西。help()函数是其中之一。
对我来说,使用in t s进行划分总是有意义的,它产生了一种通常不进行动态类型转换的语言。
- 我同意。操作员已经为不同的类型做了不同的事情。对于添加/连接,请考虑+。
- 我不同意。想象一下,如果math.sqrt(2)返回1而不是1.4142135623730951。在python 2.1中,除除法外,int在所有情况下都是float的完美替代品。
- @DAN04:太糟糕了,更多的语言无法根据对结果所做的工作推断出要使用的运算符的类型。如果f1-f2是float,d1是double,并且一个正在计算f2=f1+0.1;,那么将0.1转换为float并使用float执行加法是有意义的,但是如果一个正在计算d1=f1+f2;,那么将操作数转换为double然后进行计算将更有意义。让运算符产生与其操作数相同的结果类型是容易实现的,但不美观,容易引起错误。