1、函数定义的格式:
def 函数名([参数]):
函数文档字符串
函数体
格式说明
(1)函数名可由英文字符、数字或下划线组成。数字不能作为第一个字符。
(2)函数名不能与python已有的关键字同名。
(3)可以没有参数,也可以有多个参数(参数间半角逗号分隔)。
(4)函数文档字符串可省略。用于指定执行help(函数名)时显示的函数说明。
(5)在函数体内可使用“return 表达式”语句返回函数值。
(6)未指定函数返回值时,返回值为None。
(7)函数体内的语句不能与def关键字左对齐,必须保持右缩进(默认4个空格)。
(8)当函数体比较简短时,也可以将函数体与def写在同一行。如:
def getV(a,b): return a+b
2、函数调用
函数定义后,即可在代码中调用,调用方法与使用内置函数相同。通过“函数名(参数)”形式调用。
对于上面定义的getV函数,下面的调用方法均可:
x=getV(16,2)
y=getV(12,3)+getV(81,9)
z=getV(b=3,a=15) #通过参数名称传递参数时,参数顺序可以打乱。
***说明***
---定义函数时的参数称为形式参数,是变量。调用时的参数称为实际参数,可以是常量、变量或表达式。
3、参数的默认值
定义函数时,形参可赋默认值。这类参数称为可选参数。调用函数时,如果不传递该参数值,则使用该默认值。如:
def fun(a,b=10)
retrun a+b
则以下方法均可调用:
x=fun(3,2)
y=fun(3)
4、可变参数(参数个数不确定)
用“*”标识参数,将未命名的传递参数打包成元组。如:
def fun(*a)
s=0
for x in a:
s+=x
return s
调用:a=fun(1,2,3)+fun(4,5)
***注意与元组为参数的区别:
def fun(a)
s=0
for x in a:
s+=x
return s
调用:a=fun( (1,2,3) )+fun( (4,5) )
5、关键字参数
定义函数时,可用“**”标识,将传递的命名参数打包成字典。如:
def fun(**a)
s=0
for x in a:
s+=a[x]
retrun s
调用:a=fun(a=4,b=3,c=6)
***注意与字典为参数的区别:
def fun(a)
s=0
for x in a:
s+=a[x]
retrun s
调用:m=fun( dict(a=4,b=3,c=6) )
***说明***
---位置参数、可变参数、关键字参数可按序混合使用。
---混合使用格式:函数名(p,*a,**b)
6、传递参数时的解包
(1)传递参数时,可使用“*”标识元组,将其元素解包为传递的多个参数。如:
def fun6(a,b,c):
return a+b+c
a=(1,2,3)
x=fun(*a) # *a表示将元组的3个元素解包为3个参数
(2)传递参数时,可使用“**”标识字典,将其元素解包为多个参数。如:
def fun(a,b,c):
return a+b+c
x=dict(a=1,b=2,c=3)
print(fun(**x))
***注意:字典键必须与参数个数及其名称相同。
7、lambda匿名函数
---lambda函数用于创建匿名函数。
(1)格式:
lambda arg1,arg2,... : exp
---arg1,arg2,...为参数。个数可以是0,1,2,...
---匿名函数只是一个表达式,通常用于定义简单函数。
---exp是一个表达式,是函数的值(整个匿名函数表达式的值)。
示例:
x=lambda a,b : a+b
print( x(2,3),x(4,8) ) #输出:5 12
(2)创建方法
方法①:在表达式中创建。这时匿名函数只能调用一次。如:
x,y,z=1,2,8
a=z-(lambda u,v:u+v)(x,y)
“lambda u,v:u+v”的作用:创建一个匿名函数,它有2个参数u,v,返回值为2个参数的值的和。
“(lambda u,v:u+v) (x,y)”的作用:调用定义的匿名函数,传入的参数是x和y。
方法②:以赋值方式创建。如:
x=lambda a,b:a+b
print( x(2,3),x(4,8) )
这时匿名函数可多次调用,可将x理解为函数名称。
8、函数的递归调用
---定义函数时,函数体内调用函数本身,这个函数称为递归函数。如:
def fun1(n):
if n<2:
return 1
else:
return n*f(n-1)
调用:fun1(3)的返回值为6。
---递归函数应用说明
---必须有一个明确的结束条件(函数调用自身的总次数是有限的)
---递归调用次数不宜过多
---应尽量避免使用递归函数
9、函数体使用全局变量
默认情况下,函数体内使用的变量,其作用范围就是函数体。
函数体内使用全局变量有两种方式:
(1)不使用global关键字声明
使用限制:函数体内只能读取全局变量的值,不能修改全局变量的值。
注意:如果在函数体内没有读取全局变量的值,而是直接给全局变量赋值,那么,这个变量只是一个与全局变量同名的局部变量。如果在函数体内先读取了全局变量的值,再给它赋值,则会触发异常。
例如,下面代码是正确的:函数体内的变量a是局部变量,与全局变量a无联系。
a=10
def fun( ):
a=8
return a
但是,以下代码会触发异常:先读取了全局变量a的值,不能再为全局变量赋值。
a=10
def fun( ):
b=a+3
a+=2
return a+b
(2)使用global关键字声明
使用限制:函数体内可以读取、修改全局变量的值。在使用关键字global声明全局变量之前,不能再定义同名的局部变量。否则global声明语句会触发异常。

