我开始通过这本书学习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 的方式解决它?
答案 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
我希望这适合你!