功能和回报和公式

时间:2016-02-11 12:10:04

标签: python

我开始通过这本书学习python" python艰难的方式",我被困在任务#21(http://learnpythonthehardway.org/book/ex21.html)上:

该任务的代码片段如下:

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

def substract(a, b):
    print "ADDING %d - %d" % (a, b)
    return a - b

def multiple(a, b):
    print "ADDING %d * %d" % (a, b)
    return a * b

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

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

age = add(20, 6)
height = substract(200, 20)
weight = multiple(40, 2)
iq = divide(190, 2)

print "age: %d, height: %d, weight: %d, iq: %d" % (age, height, weight, iq)
what = add(age,multiple(iq, substract(weight, divide(height,4))))

#this is my current solution
    first_step = divide(height,4)
    two_step = substract(weight, first_step)
    three_step = multiple(iq, two_step)
    four_step = add(age, three_step)
    print four_step
#end of my current solution

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

能够获得这样的输出:

Let's do some math with just functions!
ADDING 30 + 5
SUBTRACTING 78 - 4
MULTIPLYING 90 * 2
DIVIDING 100 / 2
Age: 35, Height: 74, Weight: 180, IQ: 50
Here is a puzzle.
DIVIDING 50 / 2
MULTIPLYING 180 * 25
SUBTRACTING 74 - 4500
ADDING 35 + -4426
That becomes:  -4391 Can you do it by hand?

我的问题: 如何以更加 pythonic 的方式解决它?

3 个答案:

答案 0 :(得分:1)

查看等式的解析树可能会有所帮助。 (不要担心解析树的确切定义。)

           -
          / \
         /   \
        +    1023
       / \
      /   \
     24   (/)
          / \
         /   \
        34   100

使用operator模块中的函数(只是为了避免定义我自己的函数),将上面每个运算符的左右子元素作为参数传递给相应的函数。例如,由于34和100是上面树中/的子项,因此调用为div(34, 100)

从树的顶部开始,您会看到sub应该带两个参数,一个加法和1023.所以从一个部分答案开始

answer = sub(add(??), 1023)

接下来,添加有参数24和除法。现在您的答案看起来像

answer = sub(add(24, div(??)), 1023)

最后,该部门有34和100的论点。

from operator import add, sub, div
answer = sub(add(24, div(34, 100)), 1023)

答案 1 :(得分:0)

这个问题措辞严厉,但这是我的解释:

假设"减去"事实上"减去" ..

what = add(age,multiple(iq, substract(weight, divide(height,4)))) 

实现了这个公式:

what = age + iq * (weight - height/4)

尝试的公式:" 24 + 34/100 - 1023"

//首先我错误地将其解释为:

 24 + 34
----------
100 - 1023

必须是这样的:

what = divide(add(24,34), substract(100, 1013))

所以这是一个理解什么时候被调用的练习.. (首先调用参数,然后使用参数函数)

编辑:那里没有意外情况!

  

但是,由于运算符优先级,问题相当于24 +(34/100) - 1023

应该是

what = add(24, substract(divide(34, 100), 1023))

答案 2 :(得分:0)

作为函数,按照操作顺序,它看起来像这样。我首先将每个操作放在一个变量中,以便使事情变得更容易。

q = divide(34, 100)
s = add(24, quo)
d = subtract(sum, 1023)

接下来,我通过用变量名替换它们的函数名来制作一个等式:

result = subtract(add(24, divide(32, 100))), 1023)
print result

我希望这适合你!