前言:加上另外一篇文章 Python dictionary items()系列函数的使用,来自Python Cookbook同一节仅有的两个例子,发现了两个不同的盲点,看来书里面的代码不自己手动输入一遍,真的不行
===================== 正文分割线 =====================
源自《Python Cookbook》第3版7.1节第一个例子
def avg(first, *rest):
return (first + sum(rest)) / (1 + len(rest))
# Sample use
avg(1, 2) # 1.5
avg(1, 2, 3, 4) # 2.5
>>> def avg(first, *rest):
... return (first + sum(rest)) / (1 + len(rest))
...
>>> avg(1, 2)
1
>>> avg(1, 2, 3, 4)
2
可以很明显的看到,小数点后的数据被截断了,我记得两个整数相除,"//" 应该才是取整,难道我记错了?
>>> def avg(first, *rest):
... return (first + sum(rest)) // (1 + len(rest)) # change '/' to '//'
...
>>> avg(1, 2)
1
>>> avg(1, 2, 3, 4)
2
将 “/” 改成了“//”,得到的结果是一样的,“//”的确是取整这一点我是没记错,不过为什么“/”的结果也是截断了的?
同样的程序我在 3.4.1 的解释器里面做了测试,得到了预想的结果:
>>> def avg(first, *rest):
... return (first + sum(rest)) / (1 + len(rest))
...
>>> avg(1, 2)
1.5
>>> avg(1, 2, 3, 4)
2.5
>>> def avg(first, *rest):
... return (first + sum(rest)) // (1 + len(rest)) # change '/' to '//'
...
>>> avg(1, 2)
1
>>> avg(1, 2, 3, 4)
2
可以看到在 3.4.1 的解释器里,“/”的结果保留了小数位,而“//”则是取整后的结果
搜索之后,找到了stackoverflow上的这个问题:Python里如何强制除法的结果为浮点数? 注意这个是针对 2.x 的版本,3.x 里面并不存在这样的问题
答案的前两个解决方案,都很不错:
方法1:
>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
类似于C语言里面的做法:
c = a / float(b)