2010-08-20 68 views
1

我开始在2001年使用Python我喜欢语言的简洁,只有一个功能,惹恼了赫克了我是/运营商,这将咬我在微妙的地方,如为什么Python程序员仍然使用旧式的划分?

def mean(seq): 
    """ 
    Return the arithmetic mean of a list 
    (unless it just happens to contain all ints) 
    """ 
    return sum(seq)/len(seq) 

幸运的是,PEP 238已经写好了,当我发现新的声明时,我开始虔诚地将它添加到我写的每个.py文件中。

但是这里差不多9年过去了,我还经常看到Python code samplesuse / for integer division//不是一个广为人知的功能吗?还是有一个理由更喜欢旧的方式?

+0

未来分区也是我最喜欢的分区之一 – 2010-08-20 05:13:07

回答

8

我认为//截断是相当有名的,但人们不愿意从他们编写的模块中“导入未来”。经典的方法(使用float(sum(seq))等等得到一个浮点型结果,int(...)截断否则浮点型除法)是你在C++中使用的方法(在C,Java,Fortran中使用略有不同的语法, ...),以及包含2.7版本的每个Python版本中的“本地”,所以如果很多人习惯于并且习惯于使用“经典方法”,这并不奇怪。

当Python 3变得比Python 2更广泛和更广泛使用时,我希望事情发生改变。

2

您可以更改的/行为对整个解释,如果你喜欢,所以没有必要从未来的每一个模块

$ 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 
+4

如果您正在编写由其他人运行的代码,那么您如何强制他们使用您的首选选项运行它?看起来像那些“在我的机器上为我工作”的“解决方案”之一。 – 2010-08-20 06:37:41

+3

@John,我猜想你会使用一个.bat来运行python和正确的选项。在unix/linux中,您可以将选项添加到shebang行。大多数情况下,'-Qwarn'对于找到可以从'/'升级到'//'而不会破坏任何东西的地方很有用 – 2010-08-20 07:01:52

+2

我宁愿使代码正常工作,而不管命令行选项如何。当分发软件包/模块时,选项并不多。 – 2010-08-20 09:22:57

1

对我来说总是有意义了将使用int给人和INT进口导致通常在飞行类型转换中不会执行的语言。

+0

我同意。运营商已经针对不同类型做了不同的事情。想想+来添加/连接。 – thieger 2010-08-20 10:45:54

+3

我不同意。想象一下,如果'math.sqrt(2)'返回1而不是1.4142135623730951。在Python 2.1中,除了*除外,'int'在所有情况下都是'float'的完美替代品。 – dan04 2010-08-20 13:15:29

+0

@ dan04:太糟糕了,更多的语言不能根据结果做什么来推断使用的操作符的类型。如果f1-f2是浮点数并且d1是双精度浮点数,并且一个正在计算f2 = f1 + 0.1;那么将0.1浮点数转换为浮点数并使用浮点数执行相加是有意义的,但是如果计算'd1 = f1 + f2;'将这些操作数转换为double并进行计算会更有意义。运营商应该产生相同的结果类型,因为它们的操作数很容易实现,但是恕我直言很糟糕并且容易导致错误。 – supercat 2013-11-13 21:20:18

相关问题