1、python中函数的定义:函数是逻辑结构化和过程化的一种编程方法。
python中函数定义方法: def test(x): "The function definitions" x+=1 return x def:定义函数的关键字 test:函数名 ():内可定义形参 "":文档描述(非必要,但是强烈建议为你的函数添加描述信息) x+=1:泛指代码块或程序处理逻辑 return:定义返回值调用运行:可以带参数也可以不带函数名()
#编程语言中的函数是通过一个函数名封装好一串用来完成某一特定功能的逻辑
2、为什么要是用函数
场景:
现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码
while True: if cpu利用率 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 硬盘使用空间 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 内存占用 > 80%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接
上面的代码虽然实现了功能,但重复代码太多了,每次报警都要重写一段发邮件的代码,且日后需要修改发邮件的这段代码,比如加入群发功能,就需要在所有用到这段代码的地方都修改一遍
现把重复的代码提取出来,放在一个公共的地方,起个名字,以后谁想用这段代码,就通过这个名字调用就行了,如下
def 发送邮件(内容) #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 while True: if cpu利用率 > 90%: 发送邮件('CPU报警') if 硬盘使用空间 > 90%: 发送邮件('硬盘报警') if 内存占用 > 80%: 发送邮件('内存报警')
总结使用函数的好处:
1.代码重用
2.保持一致性,易维护
3.可扩展性
三、函数与过程
过程定义:过程就是简单特殊没有返回值的函数
这么看来我们在讨论为何使用函数的的时候引入的函数,都没有返回值,没有返回值就是过程
def test01(): msg='hello The little green frog' print msg def test02(): msg='hello WuDaLang' print msg return msg t1=test01() t2=test02() print 'from test01 return is [%s]' %t1 print 'from test02 return is [%s]' %t2
总结:当一个函数/过程没有使用return显示的定义返回值时,python解释器会隐式的返回None,所以在python中即便是过程也可以算作函数
def test01(): pass def test02(): return 0 def test03(): return 0,10,'hello',['alex','lb'],{'WuDaLang':'lb'} t1=test01() t2=test02() t3=test03() print 'from test01 return is [%s]: ' %type(t1),t1 print 'from test02 return is [%s]: ' %type(t2),t2 print 'from test03 return is [%s]: ' %type(t3),t3
总结:
返回值数=0:返回None
返回值数=1:返回object
返回值数>1:返回tuple
4、函数参数
1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
2.实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
3.位置参数和关键字(标准调用:实参与形参位置一一对应;关键字调用:位置无需固定)
def test(x,y,z):#x=1,y=2,z=3 print(x) print(y) print(z) #位置参数,必须一一对应,缺一不行多一也不行 test(1,2,3) #关键字参数,无须一一对应,缺一不行多一也不行 test(y=1,x=3,z=4)
#位置参数必须在关键字参数左边 test(1,y=2,3)#报错 test(1,3,y=2)#报错 test(1,3,z=2) test(1,3,z=2,y=4)#报错 test(z=2,1,3)#报错
4.默认参数
def handle(x,type='mysql'): print(x) print(type) handle('hello') handle('hello',type='sqlite') handle('hello','sqlite') def install(func1=False,func2=True,func3=True): pass
5.参数组
#参数组:**字典 *列表 def test(x,*args): print(x) print(args) # test(1) # test(1,2,3,4,5) # test(1,{'name':'alex'}) # test(1,['x','y','z']) # test(1,*['x','y','z']) # test(1,*('x','y','z')) # def test(x,**kwargs): # print(x) # print(kwargs) # test(1,y=2,z=3) # test(1,1,2,2,2,2,2,y=2,z=3) # test(1,y=2,z=3,z=3)#会报错 :一个参数不能传两个值 def test(x,*args,**kwargs): print(x) print(args,args[-1]) print(kwargs,kwargs.get('y')) # test(1,1,2,1,1,11,1,x=1,y=2,z=3) #报错 # test(1,1,2,1,1,11,1,y=2,z=3) # test(1,*[1,2,3],**{'y':1})