一、函数的定义
1、函数概念
- 函数是一种功能抽象,利用它可以将一个复杂的大问题分解成一系列简单的小问题,分而治之。函数可以在一个程序中多个位置使用,也可以用多个程序,当程序需要修改时,只需要在函数中修改一次,所有调用位置的功能都会随之更新。
2、函数创建
-
Python语言通过保留字 def 定义函数。
-
语法结构:
def <函数名>(<参数列表>):
<函数体>
return <返回值列表> -
函数名可以是任何有效的python标识符,参数列表是调用函数时传递给它的值。
例:定义一个求一个数字的平方的函数f
def f(x): s=x**2 print(s)
运行上面的代码,并不会输出任何内容,因为函数还未被调用
二、函数的调用
-
函数的定义也叫做函数的声明,定义完函数并不能直接运行,而是需要通过“调用”才能运行,调用函数也是执行函数的一个过程。可以把函数的定义理解为创建一个固定用途的工具,调用函数则为使用这个工具。每次调用函数都会开辟新的内存空间,函数执行完后,空间就会被释放。函数的调用语法如下:
-
语法结构:
<函数名>(<实际赋值的参数列表>)
例:#定义一个对整数x求平方值的函数f def f(x): s=x**2 print(s) #调用函数f,对10求平方值 f(10) #100
三、函数参数传递
1、形式参数和实际参数
-
在调用函数时,大多数情况下,主调用函数和被调用函数之间有数据传递关系,这就是有参数的函数形式。函数参数的作用时传递给函数使用,函数利用接受到的数据进行具体的操作处理。
-
形式参数和实际参数
- 形式参数:在定义函数时,函数名后面括号中的参数。
- 实际参数:在调用函数时,函数名后面括号中的参数。
#定义函数时,这里的函数参数obj就是形式参数 def demo(obj): print(obj) a='你好世界' #调用已经定义好的demo函数,此时传入的函数参数a就是实际参数 demo(a)
2、参数的值传递和引用传递
-
函数参数传递机制问题在本质上是调用函数(过程)和被调用(过程)在调用发生时进行通信的方法问题。
-
基本的参数传递机制有两种:值传递和引用传递。
-
值传递就是将实际参数值的副本(复制品)传入函数,而实际参数本身不会受到任何影响。适用于实参类型为不可变类型(字符串、数字等)
-
引用传递时,改变形式参数的值,实际参数也会发生同样的改变。适用于实参类型为可变类型(列表,字典等)。
-
值传递示例代码:
def demo(obj): obj+=obj print('形式参数:',obj)#第二行输出,输出形象的值 a='你好世界' print('a的值为:',a)#第一行输出,输出a变量的初始值 demo(a) print('实际参数为:',a)#第三次输出,输出实参的值 #a的值为:你好世界 #形式参数:你好世界你好世界 #实际参数的值为:你好世界
-
引用传递示例代码:
def demo(obj): obj+=obj print('形式参数:',obj)#第二行输出,输出形参的值 a=[1,2,3] print('a的值为:',a)#第一行输出,输出a变量的初始值 demo(a) print('实际参数为:',a)#第三行输出,输出实参的值 #a的值为: [1, 2, 3] #形式参数: [1, 2, 3, 1, 2, 3] #实际参数为: [1, 2, 3, 1, 2, 3]
3、位置参数
-
位置参数也成为必备参数,是必须按照正确的顺序传递到函数中,即调用时的数量和位置必须和定义时是一样的。
-
函数调用时,参数可以按照位置或名称方式(关键字参数)赋值。
-
位置赋值示例代码:
def ht(n,m):#共两个参数,第一个参数为n,第二个参数为m s=n**2//m print(s) ht(27,5)#调用函数时会按照参数位置直接赋值,和名称无关,即形参n=27、m=5 #145
-
在调用函数时,指定的实参位置要和形参保持一致,否则将产生以下两种情况:
- 抛出TypeError异常
- 产生效果与预期不符
-
名称赋值示例代码:
def ht(n,m):#共两个参数,第一个参数为n,第二个参数为m s=n**2//m print(s) ht(m=27,n=5)#调用函数时会按照名称直接赋值,和顺序无关,即形参m=27、n=5 #0
-
在调用函数时,指定的实际参数的数量和形式参数的数量一致,否则会抛出TypeError异常,提醒缺少必要的位置参数。
4、缺省参数
-
调用函数时,如果没有指定某个参数将抛出异常,为了解决这个问题,函数定义时可以为某些参数指定默认值,构成缺省参数。这样在调用该函数时,当没有为此参数传值时,则直接使用定义函数时设置的默认值。定义缺省参数的函数语法格式如下:
-
语法结构:
def <函数名>(<非缺省参数>,<缺省参数=值>): -
注意:在定义函数时,缺省参数一定要写在非缺省参数的后面。
def div(n,m=1):#共n、m两个参数,其中n为非缺省参数,m为缺省参数 a=n//m print(a) div(10)#调用只传入一个参数,即形参n为10,m默认为1 div(10,2)#调用传入俩个个参数,即形参n为10,m为传入值2 #10 #5
定义函数时,定义缺省函数设置默认值时要牢记一点,缺省参数的默认值必须指向不可变对象。
-
不定长参数
-
在定义函数时,可以设计可变数量参数。可变参数也称为不定长参数,即传入参数的数量可以是任意多个。定义不定长参数时:一共有两种形式:*parameter 和 **parameter。
-
*parameter:
def<函数名>(*参数名):
这种形式表示接受任意多个实际参数并将其放到一共元组中。
def address(*city): print('中国有:') for item in city: print(item) address('重庆','北京','广州','四川','上海')#直接以元组形式将多个参数传人 #中国有: #重庆 #北京 #广州 #四川 #上海
-
如果想要使用一个已经存在的列表作为函数的不定长参数,可以在参数的名称前加‘ * ’。
def address(*city): print('中国有:') for item in city: print(item) li=['重庆','北京','广州','四川','上海'] address(*li) #重庆 #北京 #广州 #四川 #上海
-
**parameter
def <函数名>(**参数名):
这种形式表示接受任意多个类型关键字参数一样的实际参数,并将其放到一个字典中。def address(**city): print('中国的城市有:') for key,value in city.items(): print(key+'热门景点有:'+value) #直接以字典形式将多个参数传入 address(重庆='解放碑',昆明='滇池',上海='迪士尼') #中国的城市有: #重庆热门景点有:解放碑 #昆明热门景点有:滇池 #上海热门景点有:迪士尼
-
如果想要使用一个已经存在的字典作为函数的可变参数,可以在参数的名称前加‘ ** ’。
def address(**city): print('中国的城市有:') for key,value in city.items(): print(key+'热门景点有:'+value) dic={'重庆':'解放碑','昆明':'滇池','上海':'迪士尼'} address(**dic) #中国的城市有: #重庆热门景点有:解放碑 #昆明热门景点有:滇池 #上海热门景点有:迪士尼
-
四、返回值
-
在Python中,可以在函数体内使用return语句为函数指定返回值,该返回值可以是任意类型,并且无论return语句出现在函数的什么位置,只要得到执行,就会直接结束函数的执行。
-
语法结构
def <函数名>(参数):
函数体
return < value > -
参数说明
value:可选参数,用于指定要返回的值,可以返回一个值,也可以返回多个值。def fact(n,m=1): s=1 for i in range(1,n+1): s*=i return s//m,n,m#可以返回多个值 print(fact(10,5)) #(725760, 10, 5) 元组类型
注意:return语句在同一函数中可以出现多次,但是只要有一个得到执行,就会直接结束函数的执行,类似循环中的break。
def fact(n): if n>0: return 1 else: return 0 print(2)#无论形参n值为多少,此行代码都不可达 print(fact(2)) print(fact(-2)) #1 #0
-
返回值参数可以指定,也可以省略不写(将返回空值None)
def fact(n): n=n+1 return #未指定返回值参数 print(fact(2))#输出参数为2时的函数返回值 #None
(1)return保留值用来传递返回值
(2)函数可以有返回值,也可以没有,可以有return,也可以没有
(3)return可以传递0个返回值,也可以传递任意多个返回值