函数执行特定的操作并返回一个值,执行一个函数的操作称为“调用”。一般而言,要判断某个对象是否可调用,可使用内置函数 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
。