一、函数
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。
二、函数的好处
1.提高代码的复用性
2.让代码更简洁,简化代码
三、定义函数
定义函数使用def关键字,后面是函数名,函数名不能重复,函数不调用,是不会执行的
def sayhello():#函数名
print('hello')#函数体
sayhello() #调用函数
四、函数的参数
函数在调用的时候,可以传入参数,有形参和实参(简单点说,形参就是函数接收的参数,而实参就是你实际传入的参数。)
形参:
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。
实参:
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。函数调用结束返回主调用函数后则不能再使用该形参变量。
位置参数:
就是按照参数的位置来进行传参,比如下面的calc函数,a和b就是位置参数,位置参数是必传的,有几个位置参数在调用的时候就要传几个,否则就会报错,那如果有多个位置参数的话,记不住哪个位置
传哪个了怎么办,可以使用位置参数的名字来指定调用
比如说下面的calc函数也可以使用calc(y=1,x=2)这样来调用,这种调用方式叫做关键字传参
def calc(a,b):#a和b就是形参,形式参数
#a和b即位置参数,也叫必填参数
res = a * b
print('%s * %s=%s'%(a,b,res))
# calc(7,8)#调用函数,将7,8分别传给a和b 7和8叫实参,实际参数
默认参数:
默认参数就是在定义形参的时候,给函数默认赋一个值,比如说数据库的端口这样的,默认给它一个值,这样就算你在调用的时候没传入这个参数,它也是有值的
默认参数不是必填的,如果给默认参数传值的话,它就会使用你传入的值。如果使用默认值参数的话,必须放在位置参数后面定义。
def op_file(file_name,conent=None):
#conent就是默认参数
f = open(file_name,'a+',encoding='utf-8')
f.seek(0)
if conent:#不为空代表写
f.write(conent)
f.flush()
else:
all_users = f.read()
return all_users #调用完函数之后,返回什么结果
# print(f.read())#为空代表读
f.close()
res = op_file('a.txt')#res就是接受函数的返回值
print(res)
函数的返回值:return
每个函数都有返回值,如果没有在函数里面指定返回值的话,在python里面函数执行完之后,默认会返回一个None,函数也可以有多个返回值,如果有多个返回值的话,会把返回值都放到一个元组中,
返回的是一个元组。
1.把函数处理的结果返回回来(例如函数op_file)
2.结束函数,函数里面遇到return,函数会立即结束
def haha():
#函数里面遇到return,函数会立即结束
for i in range(5):
if i == 3:
print(i)
return#只写一个return的话,就返回None
res = haha()
print(res)
函数不固定参数
一个函数,参数不是固定的,我也不知道以后这个函数会扩展成啥样,可能参数越来越多,这个时候如果再用固定的参数,那后面程序就不好扩展了,这时候就可以用非固定参数了,非固定参数有两种,一种是可变参数,一种是关键字参数。
不固定参数特点:1.非必传;2.没有限制参数个数;3.它把参数放到一个元组里
def syz1(*args): #参数组
print(args)
userna = args[0]
pwd =args[1]
age = args[2]
syz('ytt','123456',18)#调用函数
def syz(a,*args):#参数组
print(a)
userna = args[0]
pwd =args[1]
age = args[2]
syz('ytt','123456',18)#必传参数a没有传,会报错
syz('ls','sdf','kkk','lll','rrr','rrr')#a打印结果为ls
关键字参数:
**kwargs特点:1.非必填;2.没有限制参数个数;3.它把参数放到一个字典里了,key是=前面的,value是=后面的
def sys3(time,**kwargs):
print(kwargs)
sys3('sdf')
sys3(name='nhy',age=38,time='20180908')
sys3('2018',name='nhy',age=38,addr='回龙观',home='河南')
sys3('nhy')
#返回结果为
#{}
#{'age': 38, 'name': 'nhy'}
#{'age': 38, 'name': 'nhy', 'home': '河南', 'addr': '回龙观'}
#{}
五、局部变量和全局变量
局部变量
意思就是在局部生效的,出了这个变量的作用域,这个变量就失效了,比如上面的c就是一个局部变量,出了这个函数之后,就没有c这个值了
全局变量
意思就是在整个程序里面都生效的,在程序最前面定义的都是全局变量,全局变量如果要在函数中修改的话,需要加global关键字声明,如果是list、字典和集合的话,
则不需要加global关键字,直接就可以修改。
name = '呵呵'#这就是一个全局变量
#如果要改全局变量的话,那你要先声明一下,你修改的是全局变量
def sayName():
global name#声明下修改的是全局变量
name = 'ytt'
print('name1',name)
sayName()
六、递归函数
递归:就是函数自己调用自己,示例如下:
def test1():
num = int(input('输入一个数字:'))
if num%2 == 0:#判断输入的数字是不是偶数
return True#如果是偶数的话,程序就退出了,返回True
print('不是偶数,请重新输入')
return test1()#如果不是偶数的话,继续调用自己,输入数字
print(test1())#调用test