函数执行特定的操作并返回一个值,执行一个函数的操作称为“调用”。一般而言,要判断某个对象是否可调用,可使用内置函数 callable() 。
x = 1
callable(x)
False
import math
y = math.sqrt
callable(y)
True
调用时可能需要提供一些参数,放在圆括号中的内容。
前一节说过,函数是结构化编程的核心。那么如何定义函数呢?使用 def 语句,表示定义函数。
def hello(name):
return 'Hello, ' + name + '!'
运行这些代码后,将有一个名为 hello 的新函数。 它返回一个字符串,其中包含向唯一参数指定的人发出的问候语。 可像使用内置函数那样使用这个函数。
print(hello('world'))
Hello, world!
print(hello('Gumby'))
Hello, Gumby!
如果编写一个函数,返回一个由斐波那契数组成的列表呢?很容易! 只需使用前面介绍的代码,但不从用户那里读取数字,而是通过参数来获取。
def fibs(num):
result = [0, 1]
for i in range(num-2):
result.append(result[-2] + result[-1])
return result
def test():
pass
test()
print(test())
None
执行这些代码后,解释器就知道如何计算斐波那契数了。 现在不用再关心这些细节,而只需调用函数 fibs() 。
fibs(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
fibs(15)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
在这个示例中,num 和 result 也可以使用其他名字,但 return 语句非常重要。 return 语句用于从函数返回值(在前面的 hello 函数中,return 语句的作用也是一样的)。
要给函数编写文档,以确保其他人能够理解,可添加注释(以 # 打头的内容)。 还有另一种编写注释的方式,就是添加独立的字符串。 在有些地方,如 def 语句后面(以及模块和类的开头),添加这样的字符串很有用。 放在函数开头的字符串称为文档字符串(docstring),将作为函数的一部分存储起来。
下面的代码演示了如何给函数添加文档字符串:
def square(x):
'Calculates the square of the number x.'
return x * x
可以像下面这样访问文档字符串:
square.__doc__
'Calculates the square of the number x.'
注意:doc 是函数的一个属性。属性名中的双下划线表示这是一个特殊的属性。
特殊的内置函数 help() 很有用。 在交互式解释器中,可使用它获取有关函数的信息,其中包含函数的文档字符串。
help(square)
Help on function square in module __main__:
square(x)
Calculates the square of the number x.
数学意义上的函数总是返回根据参数计算得到的结果。 在Python中,有些函数什么都不返回。 在诸如Pascal等的语言中,这样的函数可能另有其名(如过程)。 但在Python中,函数就是函数,即使它严格来说并非函数。 什么都不返回的函数不包含 return 语句,或者包含 return 语句,但没有在 return 后面指定值。
def test():
print('This is printed')
return
print('This is not')
这里使用 return 语句只是为了结束函数。
x = test()
This is printed
跳过了第二条 print 语句。(这有点像在循环中使用 break ,但跳出的是函数。) 既然 test 什么都不返回,那么 x 指向的是什么呢?下面就来看看:
x
什么都没有。再仔细地看看。
print(x)
None
这是一个熟悉的值:None 。由此可知,所有的函数都返回值。 如果没有告诉它们该返回什么,将返回 None 。
警告:不要让这种默认行为带来麻烦。如果在 if 之类的语句中返回值,务必确保其他分支也返回值, 以免在调用者期望函数返回一个序列时(举个例子),不小心返回了 None 。