03. 定义函数 II
练习解决方案:人口密度函数
下面是我的解决方案:
def population_density(population, land_area):
return population/land_area
此处函数体只有一行,原因是在代码不混乱的前提下,我个人偏向于保持函数简单。你也可以将计算语句和返回语句分为两行来编写函数。
缩进
正如大家刚刚所见,缩进十分重要。这可以用来提醒我们 Python 函数体中存在什么代码、以及哪些代码在函数体之外。缩进不仅仅在函数定义中重要,在其他情况下也经常出现。在其他语言中,会使用
{
和
}
等符号表示代码块开始和结束位置,而在 Python 中,我们使用缩进来包含代码块。
在 Python 中,缩进字符数通常是四个空格的倍数。请务必遵守此规定,因为更改缩进将会完全改变代码的含义。每位 Python 程序员都务必要遵循相同的缩进规定!
记录函数
函数有助于将程序分解成更小的块。这样不仅易于编写,而且函数可重复使用,也使读取更加容易。如果一个程序需要计算多个人口密度,那么该程序可以多次调用
population_density
,而不需要频繁写出公式,这样更加简便。
由于函数有可读名称,所以我们在运行时更容易读懂代码。虽然人口密度公式本身并不复杂,但一个命名清晰的函数显然更容易识别。
还有一种便于读取函数的方法,即文档字符串(也称为 "docstrings")。Docstrings 是一种用于解释函数目的以及使用方法的注释。下面是一个 population_density 函数,函数中包含一个 docstring:
def population_density(population, land_area):
"""Calculate the population density of an area.
population: int. The population of the area
land_area: int or float. This function is unit-agnostic, if you pass
in values in terms of square km or square miles the
function will return a density in those units.
"""
return population / land_area
Docstrings 外是三重引号,即
"""
。docstring 字符串的第一行简要解释函数目的。如果你觉得这样的说明就够了,即可在此结束 docstring,单行 docstrings 也是完全可以的。但如果函数十分复杂,为了确保说明清晰,可以在一行总结后添加一段更详细的描述段落。
另外一种 docstring 元素则用于解释函数参数。可以在此列出参数,说明参数目的以及参数类型。
docstring 的每一部分都是可选的,docstring 本身也是如此。但请记得,编写代码始终比阅读代码更加容易。如果能使合作伙伴(包括未来的你!)更易读懂你的代码,那么应该尽可能地为他人、为自己提供便利。
你可以在 https://www.python.org/dev/peps/pep-0257/ 上阅读更详细的 docstring 规定解释。
一个不返回任何值的函数
可以将函数想象为一台接收输入(参数),然后进行处理,最后输出结果(返回值)的小型机器。这是一个很好的比喻,但是不太确切。有一些函数根本不返回任何值,比如
print
,:
>>> return_value = print("I wish to register a complaint.")
I wish to register a complaint.
>>> print(return_value)
None
print
在控制台上
显示
文本,但是我们看到的其
返回值
是
None
。
None
是 Python 中的一个特殊值,表示值的缺失。如果函数没有明确返回任何其他内容,则
None
是其默认返回值。
我们来看一则示例。这是此前练习中用到的测试代码,我们将其编写为一组可复用的函数:
def print_testcase(expected_value, actual_value):
print("expected value: {}, actual value: {}".format(expected_value, actual_value))
这个函数不像之前的示例,它没有返回语句,但它仍然是一个有效的函数。我们来试一下:
>>> return_value = print_testcase(42, 42)
expected value: 42, actual value: 42
调用函数时,输出是
print
打印出的内容。但是给
return_value
的赋值是什么?我们可以用
print
打印
return_value
来进行检查!
>>> print(return_value)
None
练习:
readable_timedelta
请编写一个名为
readable_timedelta
的函数。该函数接收一个参数(一个整数型变量
days
),并返回一个字符串,表示传入的天数有几星期零几天。例如,
readable_timedelta(10)
应返回
1 week(s) and 3 day(s).
。
编写时请加上一个 docstring,用于说明该函数的目的。
Start Quiz:
# Write your code for readable_timedelta here.
# Uncomment this function call to test it:
# print(readable_timedelta(10))