1.基本调用
python 中的函数使用关键字 def 来创建一个函数,正如其他语言中的函数一样,有函数名,参数,以及返回值。
函数的参数不用指定类型,return 可以在任何地方出现,表示函数结束,如果没有返回内容则默认返回值为None。
一个简单的无参数,无返回值的hello world
>>> def hello():
print('Hello World')
>>> hello()
Hello World
有返回值的
>>> def fun():
return 111
>>> fun()
111
有参数有返回值的
>>> def fun(a,b,c):
d = a+b+c
return d
>>> fun(1,2,3)
6
python中的函数返回值
看起来可以是多个对象
>>> def fun():
return 'aaa','bbb','ccc'
>>> fun()
('aaa', 'bbb', 'ccc')
>>> x,y,z = fun()
>>> x
'aaa'
>>> y
'bbb'
>>> z
'ccc'
>>> x,y,z
('aaa', 'bbb', 'ccc')
这里函数返回的值看起来像是三个字符串,但本质是一个元组而已,所以其实返回的还只是一个对象。
2.默认参数
函数可以有默认参数,默认参数必须从右到左填写,因为参数是从左往右传入的,若默认参数后面还有参数的话调用时会出现歧义。
若定义参数,但没有传入参数的话会出现异常。
>>> def fun(a,b,c=1):
return a,b,c
>>> def fun(a,b,c):
return a,b,c
>>> fun()
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module>
fun()
TypeError: fun() missing 3 required positional arguments: 'a', 'b', and 'c'
但是定义默认参数的话,若无参数传入的话会调用默认参数值,若传入参数的话会根据传入的参数值来操作。
>>> def fun(a=1,b=1,c=1):
return a,b,c
>>> fun()<span style="white-space:pre"> </span>#默认参数值为1
(1, 1, 1)
>>> fun(2,3,4)<span style="white-space:pre"> </span>#使用传入的参数值
(2, 3, 4)
若默认参数后面还有参数的话就会出现异常。
>>> def fun(a=1,b,c):
return a,b,c
SyntaxError: non-default argument follows default argument
所以默认参数只能在参数列表中从右到左出现。
>>> def fun(a,b,c=1):
return a,b,c
>>> fun(1,2,3)
(1, 2, 3)
3.关键字传入参数
python可以根据关键字来传入参数,而不用很死板的只能从左到右一对一的传入。
>>> def fun(a,b,c):
return a,b,c
>>> fun(1,2,3)<span style="white-space:pre"> </span>#全部默认从左到右传入参数
(1, 2, 3)
>>> fun(b=1,c=3,a=2)<span style="white-space:pre"> </span>#全部根据关键字传入参数
(2, 1, 3)
>>> fun(1,c=2,b=3)<span style="white-space:pre"> </span>#混合使用
(1, 3, 2)
4.函数的定义及使用
python中的函数允许先使用在定义,这与C++ 不同,C++必须先定义后才能使用,否则会报错。
>>> def a():
print('a')
b()<span style="white-space:pre"> </span>#先使用
>>> def b():<span style="white-space:pre"> </span>#再定义
print('b')
>>> a()
a
b
>>> b()
b
但是若是使用b函数,而在下面不去定义b函数的话也会报错的。
5.可变长度的参数
(1).非关键字可变长参数(元组)
在有可变长参数(元组)的情况下,在传入相应的参数后,剩下的所有参数按顺序插入到一个元组中,非关键字可变长参数用*表示。
>>> def fun(a,b,c,*d):
print(a,b,c,d)
>>> fun(1,2,3)
1 2 3 ()
>>> fun(1,2,3,4,5,6,7,8,9)<span style="white-space:pre"> </span>#传入的作为元组的一部分输出
1 2 3 (4, 5, 6, 7, 8, 9)
(2).关键字变量参数(字典)
关键字变量参数就是可以将字典的键值作为参数进行传入,插入到一个字典中最后输出,用**表示。
>>> def fun(a,b,c,**d):
print(a,b,c,d)
>>> fun(1,2,3)
1 2 3 {}
>>> fun(1,2,3,x=4,y=5,z=6)
1 2 3 {'z': 6, 'y': 5, 'x': 4}<span style="white-space:pre"> </span>#字典是无序的
当然两种格式也可以混合使用
>>> def fun(a,b,c,*d,**e):
print(a,b,c,d,e)
>>> fun(1,2,3)
1 2 3 () {}
>>> fun(1,2,3,4,5,6,x=7,y=8,z=9)
1 2 3 (4, 5, 6) {'z': 9, 'y': 8, 'x': 7}
6.lambda
用lambda关键字创建匿名函数,匿名是因为不需要用标准的方式来声明,比如用def,然而,作为函数,它们也可以有参数。
一个完整的lambda’语句‘代表了一个表达式,这个表达式的定义体必须和声明放在同一行。
格式:lambda 参数 : 返回内容
>>> a = lambda :print("Hello World")
>>> a()<span style="white-space:pre"> </span>#无参数的
Hello World
>>> a = lambda x,y=3:x+y<span style="white-space:pre"> </span>#有参数,一个参数为默认参数
>>> a(1)
4
>>> a(4,5)
9
7.递归
递归求阶乘
>>> def fun(n):<span style="white-space:pre"> </span>#递归求阶乘
if n==0 or n==1:
return 1
else:
return n*fun(n-1)
>>> fun(3)
6
>>> fun(4)
24
Fibonacci数列
>>> def fun(n):
if n==0 or n==1:
return 1
else:
return fun(n-1)+fun(n-2)
>>> for i in range(10):
print('%d' % fun(i))
1
1
2
3
5
8
13
21
34
55