1.函数的定义
python内置了很多函数,可以直接调用,多数情况下,还需要自定义函数,自定义函数的主体,换行的缩进表示代码属于该函数.定义的函数只有被调用的时候才会执行.函数只有有返回值的情况下才可以打印
语法定义:
def 函数名():
......
......
其中,函数名可以由数字,字母,下划线组合而成,但不能以数字开头,冒号以下的代码是函数的主体,换行的缩进表示代码属于该函数
实例代码:
1 def add():
2 a = 1
3 b = a+3
4 print(b)
5 add()
6 #运行结果:
7 4
代码说明:
1 自定义一个名叫add的函数
2 在add函数中定义变量a,并将a赋值为1
3 在add函数中定义变量b,并将b赋值为a+3的运算结果
4 打印b的值
5 调用执行add()函数
7 运行结果,为4
注意:如果没有第5行的调用,那么add()函数就不会执行了
2.函数的参数
自定义函数的时候还可以加上参数,参数可以是一个,也可以是多个,参数放在()里面,加上的参数只是一个形式参数,而非真正的参数.
实例代码1:
1 def add(a,b):
2 c = a+b
3 print(c)
4 add(1,2)
5 #运行结果:
6 3
代码说明:
1 定义一个add函数,并创建形式参数a,b
2 将a+b的结果赋值给变量c
3 打印c的值
4 调用执行add(a,b)函数,并给形式参数给传递实参1,给形式参数b传递实参2
6 运行结果,为3
注意:对于add(a,b)函数来说,函数内的a,b只是形式参数,a,b可以表示任何数据,而c就是a和b任意数据的和,等式c=a+b,只是建立了c与a,b的关系
实例代码2:
1 def add(a = 1,b = 2):
2 c = a +b
3 print(c)
4 add()
5 add(2,3)
6 add()
7 #运行结果:
8 3
9 5
10 3
代码说明:
1.定义函数,有形式参数a,b 并给a赋默认值1,给b赋默认值2
2.定义变量c,赋值a+b的运算结果
3.打印c
4.调用函数,不传实参
5.调用函数,传实参,a传实际参数2,b传实际参数3
6.调用函数,不传实参.caution:虽然第5行在调用函数时改变了a和 b的值,但对于函数本身默认值是不会变的,调用时改变的值只是对调用时生效,并不会影响函数本身的默认值
8.4的运行结果
9.5的运行结果
10.3的运行结果
注意:在定义具有形参的函数时,也可以给形式参数赋值,产生一个默认值,当调用函数时,分为两种情况:当调用函数不加实际参数时,就以定义函数时默认值作为实际值;当调用函数加上实际值,那么新的实参就会代替原来的默认值.
使用关键字参数允许函数调用时参数的顺序与声明时不一致,Python解释器能够用参数名匹配参数值.如:
def printinfo(name,age):
..................
printinfo(age=50,name='猪太肥')
传参时会通过参数名匹配参数值,不会出现name=50,age="猪太肥"的情况.
3.函数的返回值
之前定义的函数只是用来执行某些操作,并没有将最后执行的结果保存.上面的例子是将c的值打印了出来,并未将c的值保存和返回,导致c的值只能在函数内使用
实例代码1:
1 def add(a = 1,b = 2): 2 c = a + b 3 print(add()) 4 print(add(2,3)) 5 #运行结果: 6 None 7 None
注意:python语言中,没有返回值时不会报错,会返回一个None
如何返回和保存c的值呢? 只需要在函数中加return + 返回值
实例代码:
1 def add(a = 1,b = 2):
2 c = a + b
3 return c
4 print(add())
5 print(add(2,3))
6 #运行结果
7 3
8 5
代码说明:
3.在执行完add函数时返回c的值
4.将调用执行add()的结果打印出来.由于add函数有了返回值,所以打印出来就是c的值
有时候函数需要返回的值不止一个,同样可以用return来返回,区别于单个返回值,多个返回值需要用逗号隔开,数据以元组的形式返回,同样也可以把返回值按照顺序赋值给多个变量
实例代码:
1 def add(a = 1,b = 2):
2 c = a + b
3 return a,b,c
4 print(add())
5 print(add(2,3))
6 x,y,z = add(3,5)
7 print(x,y,z)
8 #运行结果:
9 (1, 2, 3)
10 (2, 3, 5)
11 3 5 8
代码说明:
3.在执行完add函数后,返回a,b,c的值
4.调用add函数,不传实参,并打印执行结果,由于返回了3个值,所以返回的是3个元素的元组
5.调用add函数,传递实参,并打印执行结果,由于返回了3个值,所以返回的是3个元素的元组
6.调用add函数,不传实参,并将执行结果分别赋值给x,y,z
7.打印x,y,z的值
实例代码体会下有无返回值的区别:]
def changeme(mylist): mylist.append(6); print('list = ',mylist) list = [1,2,3,4,5] print(changeme(list))
print(list) 运行结果: list = [1, 2, 3, 4, 5, 6]#执行调用函数时,被调用函数内的打印 None#被调用函数没有返回值,所以打印不出东西来 def changeme(mylist): mylist.append(6); print('list = ',mylist) return mylist #被调用函数有返回值 list = [1,2.3,4,5] print(changeme(list))
print(list) 运行结果: list = [1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6] #被调函数有返回值,可以打印出东西来
[1, 2, 3, 4, 5, 6] #列表的可变性,在执行调用函数时,列表以发生变化
4.函数的嵌套
除了 自定义和执行函数外,还可以在函数中相互嵌套调用,即在某个函数的代码中调用其他函数,这就是函数的嵌套.
实例代码:
1 def a1(a,b):
2 return a+b
3 def a2(c):
4 return c
5 def a3(x,y,z):
6 result = a1(x,y)-a2(z)
7 return result
8 print(a3(1,2,3))
9 #运行结果:
10 0
代码说明:
1.自定义a1()函数,并创建形式参数a和b
2.函数a1返回a+b的结果
3.自定义a2()函数,并创建形式参数c
4.函数a2返回c的结果
5.自定义a3()函数,并创建形式参数x,y,z
6.将函数a1的运行结果减去函数a2的运行结果,并把结果赋值给result.
7,函数a3()执行完结果,返回运算结果result的值
8.打印a(1,2,3)的执行结果.
任意函数都能调用任意函数,没有上下级等级关系.但这不利于代码的可读性.为了让代码更清晰,利于对代码进行修改,设立一个主函数,并在这个函数下定义它需要调用的子函数,这样主次关系就会更加明确,而且子函数不会被其他函数调用,避免了代码调用混乱的结果.
实例代码:
1 def a(x,y,z):
2 def a1(a,b):
3 return a+b
4 def a2(c):
5 return c
6 result = a1(x,y)-a2(z)
7 return result
8 print(a(1,2,3))
9 #运行结果:
10 0
1 def a1(a,b):
2 c = a+b
3 def a2(x):
4 x=x*x
5 return x
6 return a2(c)
7 print(a1(1,2))
8 #运行结果:
9 9