Python函数
函数的定义
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回表示函数结束。
例如:
def function(arges):
函数主体
return
函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回
如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。
return None可以简写为return。
函数的返回值可以是多个值,用不同的参数之间逗号隔开,其实就是返回一个tuple值,因为tuple的定义可以省略括号。
空函数
如果想定义一个什么事也不做的空函数,可以用pass语句:
def nop():
pass
pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。
例如if或者for循环中代码块什么都不添加,那么就会报错,在这种情况下可以先放一个pass语句
默认参数
Python函数支持默认参数,默认参数必须指向不变对象。
def add_def(a,b,c,d = 0):#默认参数
return a+b+c+d
若是调用该函数只输入前三个参数,那么参数d的值默认为0,若是输入四个参数,那么d的值就为第四个值。
语法与C++中函数的默认参数规则几乎差不多,而且默认参数可以有多个,但是默认参数必须从右到左依次而来。
对于默认参数,其参数的值类似于C++函数中的static修饰,在函数结束后并没有释放,而是依据保持数值。
如下函数所示:
def add_list(L = []):
L.append('add')
return L
连续调用三次add_list函数
print add_list()
print add_list()
print add_list()
其结果如下:
['add']
['add', 'add']
['add', 'add', 'add']
可变参数
在Python函数中,还可以定义可变参数(可以通过传入数组参数实现),可变参数就是传入的参数个数是可变的,可以输入任意个参数给该函数。
对于可变参数的函数实现,只需要在参数前面加了一个*号。然后传进去的参数便可以当成tuple进行处理。
def add_var(*n):
print "n is ", n
s = 0
for i in n:
s += i
return s
print add_var(1,2,3)
其结果为6
通过传入tuple或者list实现可变参数,但是这种方式需要在调用函数前将参数的数值添加到tuple和list中,但是这种方式太过繁琐了。
如果已经有一个list或者tuple,要调用一个可变参数函数,例如
nums = [1, 2, 3]
add_var(nums[0], nums[1], nums[2])
结果为14
这种写法是可行的,问题是太繁琐,所以Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
add_var(*nums)
结果为14
这种写法相当有用,而且很常见。
关键参数
在Python函数中,还可以定义关键字参数,关键字参数允许你传入0个或任意个含参数名的参数,所有正常形参之外的其他的关键字参数都将被放置在一个字典中传递给函数,这些关键字参数在函数内部自动组装为一个dict,在参数前面加了一个**符号即可。
def add_key(**k):
for i in k:
print i
print k[i]
return
print add_key(name = "chen",age = 10)
其结果为:
age
10
name
chen
则其传入参数在函数内已经转换成dict了存入k中了。
变量指向函数
变量指向函数,或者是说有函数类型的变量,函数可以当成变量进行传递,作为函数的入参等。
将函数赋值给变量,然后再将变量作为函数调用,如下所示
f = add
print f(3,4)
其结果为7
定义函数,函数参数为函数变量,如下所示
def add_function(fadd):
return fadd(1,2)
调用该函数,传入add函数。
print add_function(add)
结果为3
返回函数
函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。作为返回的函数可以先存在指向函数的变量中,在需要的时候再进行用。
定义将函数作为返回的函数如下,此函数将会返回r_add函数:
def add_return_function(a,b):
def r_add():
return a+b
return r_add
如下,调用了返回函数之后,那么此时f1会执行r_add函数。
f1 = add_return_function(3,5)
在后面调用f1,那么就会计算出结果:
print f1()
其结果为8。
但是需要注意的是,当我们调用add_return_function()时,每次调用都会返回一个新的函数,即使传入相同的参数。如下所示:
f = add_return_function(3,5)
f1 = add_return_function(3,5)
print f == f1
打印出来的结果为false
注意到返回的函数在其定义内部引用了局部变量,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。例如:
def add_return_f1():
fs = []
for i in range(1, 4):
def r_add():
return i+i
fs.append(r_add)
return fs
在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。
f1,f2,f3 = add_return_f1()
print f1()
print f2()
print f3()
则此时输出的结果都为6,不是我们认为的2、4、6
出现该原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了2,然后再调用的时候,此时最终结果为6。
若是我们想要结果分别为2、4、6,那么可以再在函数体内定义一个函数,如下所示:
def add_return_f2():
fs = []
for i in range(1,4):
def add(j):
def r_add():
return j+j
return r_add
fs.append(add(i))
return fs
(f1,f2,f3) = add_return_f2()
print f1( )
print f2( )
print f3( )
此时的结果分别为2、4、6
匿名函数
当我们在传入函数时,有些时候,不需要显式地定义函数,直接在调用处编写函数,作为输入函数,而且该函数并不进行命名,此类函数成为匿名函数。
匿名函数的定义形式为关键字lambda表示匿名函数,冒号前面的x表示函数参数,冒号后面的表达式的结果作为返回值。
例如定义如下匿名函数:
f_l = lambda x,y:x+y
print f_l(3,2)
结果为5。
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数同样,也可以把匿名函数作为返回值返回。匿名函数完全可以在调用的时候,再进行定义,由于函数主体只能是表达式,因此一般逻辑简单的函数用匿名函数,对于实现比较复杂的函数而言,建议还是使用普通函数。