一、定义函数
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。
在Python中,定义一个函数要使用def
语句,依次写出函数名、括号、括号中的参数和冒号:
,然后,在缩进块中编写函数体,函数的返回值用return
语句返回。
我们可以自定义一个求绝对值的函数:
1 def my_abs(n): 2 if n>=0: 3 return n 4 else: 5 return -n
二、使用函数的好处
1、提高代码的复用性
2、让代码更简洁、简化代码
3、代码可扩展
三、函数的参数
位置参数:
就是按照参数的位置来传参数,比如上面的my_abs(n)中n就是位置参数,位置参数是必传的。有几个位置参数在调用的时候就要传几个,否则就会报错了。
例如:
def calc(a,b): #形参, 形式参数 res = a * b print('%s * %s = %s'%(a,b,res))
如果有多个位置参数的话,记不住哪个位置传哪个了怎么办,可以使用位置参数的名字来指定调用
比如说上面的那个calc函数也可以使用calc(b=1,a=2)这样来调用,这种调用方式叫做关键字传参
默认参数:
默认参数就是在定义形参的时候,给函数参数默认赋一个值,这样在调用函数的时候就算没有传值也不会报错。
所以,默认参数不是必填的,如果给默认参数传值的话,它就会使用你传入的值。如果使用默认值参数的话,必须放在位置参数后面定义。
1 def op_file(file_name,conent=None): #默认值参数,它是非必填的 2 f = open(file_name,'a+',encoding='utf-8') 3 f.seek(0) 4 if conent:#不为空代表写 5 f.write(conent) 6 f.flush() 7 else: 8 all_users = f.read() 9 return all_users #调用完函数之后,返回什么结果 10 f.close()
不固定参数:
在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。不固定参数有两种,一种是可变参数,一种是关键字参数。
可变参数:
可变参数用*来接收,后面想传多少个参数就传多少个,如果位置参数、默认值参数、可变参数一起使用的的话,可变参数必须在位置参数和默认值参数后面。可变参数也是非必传的。
1 def syz(a,*args): #参数组 2 print(a,args) 3 username = args[0] 4 pwd = args[1] 5 age = args[2] 6 syz('niuhanyang','2423',2323,5) 7 syz('1s','sdf','890','uuu')
1 输出如下: 2 niuhanyang ('2423', 2323, 5) 3 1s ('sdf', '890', 'uuu')
关键字参数:
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。请看示例:
1 def person(name,age,**kwargs): 2 print('name:',name,'age:',age,'other:',kwargs) 3 4 person(age='18',name='mululu',score='100',addr='广州',home='湖北') 5 person('mululu','18',addr='湖北') 6 person('kevin',25)
1 输出结果如下: 2 name: mululu age: 18 other: {'home': '湖北', 'addr': '广州', 'score': '100'} 3 name: mululu age: 18 other: {'addr': '湖北'} 4 name: kevin age: 25 other: {}
使用关键字参数的话,调用的时候必须使用关键字传参。关键字参数也是非必传的。
四、函数的返回值
-
python 函数使用 return 语句返回 "返回值",可以将其赋给其它变量作其它的用处
-
所有函数都有返回值,如果没有 return 语句,会隐式地调用 return None 作为返回值
- 如果函数执行了 return 语句,函数会立刻返回,结束调用,return 之后的其它语句都不会被执行了
- 函数也可以有多个返回值,如果有多个返回值的话,会把返回值都放到一个元组中,返回的是一个元组。
-
1 def cacl(x,y): 2 c=x*y 3 return c,x,y 4 res=cacl(5,6) 5 print(res) 6 7 >>>(30,5,6)
五、全局变量和局部变量
全局变量与局部变量两者的本质区别就是在于作用域。用通俗的话来理解的话,全局变量是在整个py文件中声明,全局范围内都可以访问;局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了。
在程序最前面定义的都是全局变量,全局变量如果要在函数中修改的话,需要加global关键字声明,如果是list、字典和集合的话,则不需要加global关键字,直接就可以修改。
1 name = 'marry'#字符串全局变量 2 names = ['kevin']#list全局变量 3 print(name) 4 print(names) 5 def test(): 6 global name #修改name的值就需要用global关键字 7 name = 'Sriba' 8 names.append(name)#修改全局变量names的值 9 return names 10 test()#调用函数 11 print('修改后',name) 12 print('修改后names',names)
六、递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
1 def fact(n): 2 if n==1: 3 return n 4 else: 5 return n*fact(n-1)
递归调用的特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
七、内置函数
内置函数是指python自带的一些函数,直接拿过来能用的
1 id() #看内存地址 2 type() #看数据类型 3 print() #打印 4 input() #输入 5 list() #将传入对象转为list 6 set()# 将传入对象转为集合 7 str()#将传入对象转为字符串 8 dict()#将传入对象转为字典 9 int()#将传入对象转为int类型 10 float()#将传入对象转为float类型 11 len()#取传入对象的长度 12 max()#取最大值 13 min()#取最小值 14 dir() #打印传入对象的可调用方法 15 sorted()#排序 16 round(11.00011,2)#保留几位小数 17 map() #下周 18 filter() #下周 19 zip() #下周