为何使用函数
函数在程序中主要作用有以下两点:
- 最大化代码重用和最小化代码冗余;
- 过程的分解;
编写函数
在python中函数的主要概念:
- def是可执行的代码:
def是一条可执行的语句——在python运行def之前,函数并不存在。事实上,在if语句、while循环甚至其他的def中嵌套def语句是合法的; - def创建一个对象并将其赋值给某一变量名:
当python运行到def语句时,将生成一个新的函数对象并将其赋值给这个函数名。和所有的赋值一样,函数名变成一个函数对象的引用; - lambda创建一个对象并将其作为结果返回:
lambda表达式创建一个匿名函数; - return将一个结果对象传回给调用者:
函数是通过一条return语句将计算得到的值传回给调用者的,即返回值成为函数调用的结果。没有返回值的return语句则直接将控制权交会给调用者; - yield向调用者发回一个结果对象,但是会记住它离开的位置:
像生成器这样的函数也可以通过yield语句来返回值,并挂起它们的状态以便稍后能恢复; - global声明了一个模块级的可赋值的变量:
在默认情况下,所有在一个函数中被赋值的对象都是这个函数的局部变量,并且仅在这个函数运行的过程中存在。需要将其赋值成为全局变量,则需要在global语句中声明它; - nonlocal声明了一个需要被赋值的外层函数变量:
nonlocal语句允许一个函数对一个在其外层的def语句的作用域中的已有名称进行赋值; - 参数是通过赋值(对象引用)传递给函数的:
在程序中,调用者和函数通过引用共同对象,但是不需要别名; - 除非你显式指明形式参数与实际参数的对应,否则实际参数按位置赋值给形式参数:
- 参数、返回值与变量不需要被声明:
可以传递任意类型的参数给函数,函数也可以返回任意类型的对象:
def语句
def语句会创建一个函数对象并将其赋值给一个变量名。def语句一般的格式如下所示:
def name(arg1, arg2, ...argN):
statements
...
return value
return语句是可选的;
def语句执行与运行时
def语句是一条真正可执行的语句:当它运行的时候,会创建一个新的函数对象并将其赋值给一个变量名。因为def是一条语句,所以它可以出现在任何的地方,如下:
if test:
def func():
...
else:
def func():
...
...
func()
可以将上述代码中的def理解为一条‘=’赋值语句:它在运行时给一个变量名赋值。通常def在运行到的时候才进行计算,而在def之中的代码也只在函数被调用后才会计算。
因为函数是在运行时才定义的,所以函数名并没有什么特别之处。关键在于函数名所引用的那个对象:
othername = func
othername()