[TOC]
## 定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
* 函数代码块以**def**关键词开头,后接函数标识符名称和圆括号**()**。
* 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
* 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
* 函数内容以冒号起始,并且缩进。
* **return \[表达式\]** 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
### 语法
Python 定义函数使用 def 关键字,一般格式如下:
~~~
def 函数名(参数列表):
函数体
~~~
### 实例
让我们使用函数来输出"欢迎来到 python的函数编程!":
```
>>>def hello():
.... print("欢迎来到 python的函数编程")
>>>hello()
```
在来一个复杂的,计算一个圆的面积
```
def demo(width, height):
return width * height
def demo1(name):
print("Welcome", name)
demo1("runoob")
w = 4
h = 5
print("width =", w, " height =", h, " area =", area(w, h))
```
## 空函数
如果想定义一个什么事也不做的空函数,可以用`pass`语句:
~~~
def nop():
pass
~~~
`pass`语句什么都不做,那有什么用?实际上`pass`可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个`pass`,让代码能运行起来。
`pass`还可以用在其他语句里,比如:
~~~
if age >= 18:
pass
~~~
缺少了`pass`,代码运行就会有语法错误。
## 参数检查
调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出`TypeError`:我们使用上面编写的demo函数
~~~
>>> demo(1, 2, 3)
Traceback (most recent call last):
File "", line 1, in
TypeError: demo() takes 2 positional argument but 3 were given
~~~
## 返回多个值
函数可以返回多个值吗?答案是肯定的。
比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的坐标:
~~~
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
~~~
`import math`语句表示导入`math`包,并允许后续代码引用`math`包里的`sin`、`cos`等函数。
然后,我们就可以同时获得返回值:
~~~
>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print(x, y)
151.96152422706632 70.0
~~~
但其实这只是一种假象,Python函数返回的仍然是单一值:
~~~
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
~~~
原来返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。
### 小结
定义函数时,需要确定函数名和参数个数;
如果有必要,可以先对参数的数据类型做检查;
函数体内部可以用`return`随时返回函数结果;
函数执行完毕也没有`return`语句时,自动`return None`。
函数可以同时返回多个值,但其实就是一个tuple。