一、函数的创建和调用
1、什么是函数
- 函数就是执行特定任务和完成特定功能的一段代码
2、函数创建格式
def sum(a,b): #a,b称为形式参数,简称形参,形参的位置是在函数的定义处 c=a+b return c result=sum(10,60) #10,60称为实际参数的值,简称实参,实参的位置是函数的调用处 print(result) 运算结果: 70
3、函数调用的参数传递
- 位置实参——根据形参对应的位置进行实参传递
- 关键字实参——根据形参名称进行实参传递
4、在函数的调用过程中,进行参数的传递。如果是不可变对象,在函数体的修改不会影响实参的值;如果是可变对象,在函数体中的修改会影响带实参的值
n1=10 n2=['hello','world'] test(n1,n2) print(n1) #10 可以发现n1的值没有发生改变,因为n1是不可变对象 print(n2) #['hello', 'world', 10] 可以发现n2发生了变化,因为n2是可变对象
二、函数的返回值
1、如果函数没有返回值【函数执行完毕之后,不需要给调用处提供数据】,return可以省略
2、函数的返回值,如果是1个,直接返回类型
3、函数的返回值,如果是多个,返回的结果为元组
#判断基数与偶数 odd=[] even=[] def fun(lst): for i in lst: if i%2==0: even.append(i) else: odd.append(i) return odd,even lst=[10,29,34,23,44,53,55] print(fun(lst)) #可以发现已元组的形式输出
三、函数参数定义
1、函数定义默认值参数——函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参
def fun(a,b=20): print(a,b) #函数的调用 fun(100) #100 20(在这里可以发现,只传入一个参数第二个参数使用默认值) fun(100,200) #100 200
2、个数可变的位置参数
- 定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
- 使用*定义个数可变的位置形参
- 结果为一个元组
def fun(*args): #函数定义时的可变的位置参数 print(args) #结果以元组的形式返回 fun(10) fun(100,200) fun(30,40,50) 运算结果: (10,) (100, 200) (30, 40, 50)
3、个数可变的关键字形参
- 定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参
- 使用**定义个数可变的关键字形参
- 结果为一个字典
def fun(*args): #函数定义时的可变的位置参数,结果为一个元组 print(args) fun(10) fun(10,30) fun(30,405,50) def fun1(**args): ##函数定义时的可变的关键字参数,结果为一个字典 print(args) fun1(a=10) fun1(a=10,b=20) ''' def fun2(*args,*a): pass 可以发现报错:个数可变的位置参数只能有一个;同理,个数可变的关键字参数也只能有一个 在一个函数的定义过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求是个数可变的位置形参放在个数可变的关键字形参之前 '''
4、函数的调用
将列表中的每个元素都转换为位置实参——使用*
将字典中的每个键值对都转换为关键字实参——使用**
def fun(a,b,c):#sa,b,c在函数的定义处,所以只是形式参数 print('a=',a) print('b=',b) print('c=',c) ''' 函数的调用 ''' fun(10,20,30)#函数调用时的参数传递,称为位置传参 lst=[10,20,30] #fun(lst)#不能直接把lst列表传入函数中,因为lst相当于是一个对象 fun(*lst)#在函数调用中,使用*可以将列表中的每个元素都转换为位置实参传入 print('______________________') fun(a=100,c=300,b=200) dic={'a':111,'b':222,'c':333} #fun(dic)#报错,dic只是一个对象,需要添加**将字典里面数据转化为关键字实参 fun(**dic) #在函数调用时,将字典中的键值对都转化为关键字实参传入
5、函数的定义
def fun(a,b=10): #b是在函数的定义处,所以b是形参,而且进行了赋值,所以b称为默认值形参 print(a) print(b) def fun2(*args): #个数可变的位置形参 print(args) def fun3(**args2):#个数可变的关键字形参 print(args2) fun2(10,20,30,40) #元组 fun3(a=10,b=20,c=30)#字典 def fun4(a,b,c,d): print('a=', a) print('b=', b) print('c=', c) print('d=', d) #调用fun4函数 fun4(10,20,30,40)#位置实参传递 fun4(a=10,b=20,c=30,d=40)#关键字实参传递 fun4(10,20,c=30,d=40)#前两个参数采用位置实参传递,后两个参数采用关键字实参传递 ''' 如果只想c,d采用关键字实参传递,这需要在创建函数的时候在c,d前加一个* def fun4(a,b,*,c,d): print('a=', a) print('b=', b) print('c=', c) print('d=', d) '''
四、函数变量
局部变量:在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明会变成全局变量
全局变量:在函数体外定义的变量,可作用于函数内外
def fun(a,b): c=a+b print(c) #print(a) 可以发现报错,因为 a c 都是局部变量 #print(c) name='杨老师' #name的作用范围为函数内部和外部都可以使用——全局变量 print(name) def fun2(): print(name) fun2() def fun3(): global age#使用global声明变量,可以使得局部变量变为全局变量 age=20 print(age) fun3() print(age)#报错,age是局部变量 运行结果: 杨老师 杨老师 20 20