学习Python艰难的方式,Ex21,EC3

时间:2012-03-14 21:24:07

标签: python

Ex21,额外学分3:一旦你完成了拼图的公式,进入那里,看看修改功能的各个部分会发生什么。尝试改变它以达到另一个价值。

我的代码:

def add(a, b):
    print "ADDING %d + %d" % (a, b)
    return a + b

def subtract(a, b):
    print "SUBTRACTING %d - %d" % (a, b)
    return a - b

def multiply(a, b):
    print "MULTIPLYING %d * %d" % (a, b)
    return a * b

def divide(a, b):
    print "DIVIDING %d / %d" % (a, b)
    return a / b


print "Let's do some math with just functions!"

age = add(30, 5)
height = subtract(78, 4)
weight = multiply(90, 2)
iq = divide(100, 2)

print "Age: %d, Height: %d, Weight: %d, IQ: %d" % (age, height, weight, iq)



print "Here is a puzzle."


# new formula
what = add(height, subtract(weight, multiply(iq, divide(age, 2))))

# original formula
# what = add(age, subtract(height, multiply(weight, divide(iq, 2))))



print "That becomes: ", what, "Can you do it by hand?"

我为此练习编写的新公式位于注释#new formula下。在编写并运行它之后,我注意到发生了一些奇怪的事情:分区时代/ 2中的浮点被忽略。

问题:为什么Python会忽略age / 2中的浮点(还有进一步的操作)以及如何让它忽略它呢?

4 个答案:

答案 0 :(得分:5)

如果你没有使用python3,你必须用

开始你的主要python文件
from __future__ import division

制作1/2 == 0.5。否则1/2 == 0(整数除法,基本上四舍五入)。

如果出于某种原因,您可以始终使用1//2来访问整数除法。

答案 1 :(得分:3)

使用float()可以解决任何问题,但是如果要转换的是常量,则更简单的方法是明确包含小数位;即divide(age, 2.)。只有一个操作数需要是浮点数才能使输出也是浮点数。

编辑:,正如JF在下面指出的那样,我的措辞有点草率:“任何”我的意思是“变量和常量”。更一般地说,float()会尝试对浮点数进行合理的转换,但当然有些情况下这种转换是不可能的,或者涉及丢失一些信息 - 请参阅注释以获取一些示例。)

答案 2 :(得分:1)

看起来你正在使用Python 2.x,是吗?除非分子或分母是浮点数,否则除法默认为整数除法。您可以通过将其更改为return float(a) / b来纠正它。

答案 3 :(得分:1)

Python 2.x中的整数除法默认返回整数结果。这在Python 3中已更改。使用float()将其中一个数字转换为浮点数,或者将from __future__ import division放在脚本的开头。

(他们在学习Python艰难的方式中起步练习21而没有提到这个可爱的Python怪癖?)