前面的函数练习中,我们给函数撰写了 print()
语句使函数可以把运行后的结果打印出来。不过我们并不总是需要把结果打印出来,在实际编写程序的时候我们更多的是需要使用函数的结果做其他事情(而不是打印出来)。
这就是本题的一个重点 return
的使用。先看个小栗子,并且简单说明一下:
def my_add(a, b):
"""
其实这里可以用 三引号 写函数的说明文档的。但是也要遵循缩进规则
就像我们用 help 或者 pydoc 擦看的内容一样。
这个函数实现了两个数字相加的功能
"""
return a + b
# 接下来调用看看
my_add(2, 3)
# 打印函数看看
print(my_add(2, 3))
删掉三行注释之后这个函数只有两行内容,第一行我们比较熟悉了:定义了一个拥有两个参数函数 my_add
。我们来看第二行代码:
a
和 b
。a + b
。return
,把 a + b
的结果返回出来python 在执行这个函数的时候会把合法的两个参数做相加,并把结果返回。这里有个问题,返回到哪了?看一下两次调用的结果。
可以看到,我们明明调用了 my_add
两次,应该有两次 return
,但是屏幕上却只有一个结果被打印了。事实上 return
的结果是在内存中的,如果没人使用这个返回的结果,则这个结果将被 python 的垃圾回收机制清除掉来腾出可用内存。所以通常情况下,我们会为结果赋值,用一个变量表示结果并等待被使用;或者如本例直接使一个函数被另一个当作参数来用。
return
的功能,试着自己写几个函数,让他们返回一些值,你可以将任何可以放在 =
右边的东西作为一个函数的返回值。
def add(a, b):
print("ADDING %d + %d" % (a, b))
return a + b
def subtract(a, b):
print("SUBTRACT %d - %d" % (a, b))
return a - b
def multiply(a, b):
print("MULTIPLY %d * %d" % (a, b))
return a * b
def divide(a, b):
print("DIVIDE %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))
# A puzzle for the extra credit, type it in anyway.
print("Here is puzzle.")
what = add(age, subtract(height, multiply(weight, divide(iq, 2))))
print("That becomes: ", what, "Can you do it by hand?")
这个谜题其实只是一个多层嵌套引用函数的语句,由一个函数的结果作为另一个函数的参数,而这个函数的结果又是其他函数的参考。看起来比较乱,但拆开步骤的话和前面的么什么区别。
通过前面第一轮的函数调用后我们首先获得了四个数字变量:
age = add(30, 5)
height = subtract(78, 4)
weight = multiply(90, 2)
iq = divide(100, 2)
# 调用后它们的值变为:
age = 35
height = 74
weight = 180
iq = 50.0
# iq是除法得到的,在 Py3 中实际值是浮点数,但是打印的时候由于格式化变为了整数
再来看一下谜题部分
what = add(age, subtract(height, multiply(weight, divide(iq, 2))))
# 变量 what 可以由内到外把嵌套的结构逐步拆分为
x1 = divide(iq, 2)
x2 = multiply(weight, x1)
x3 = subtract(height, x2)
x4 = add(age, x3)
what = x4
# 然后把前边变量的数值代入进去可得到
x1 = divide(50.0, 2)
x2 = multiply(180, x1)
x3 = subtract(74, x2)
x4 = add(35, x3)
怎么样,这样看这个谜题也没什么吧?
在打印出 That becomes: -4391.0 Can you do it by hand?
之前有四行信息,么有人么想明白的?结合上面 x1-x4 的推导过程以及函数的内容看看呢?
《笨办法学 python3》系列练习计划——0. 序言、目录