标签:
在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | while True : if cpu利用率 > 90 % : #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 硬盘使用空间 > 90 % : #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 内存占用 > 80 % : #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 |
上面代码可以看出,整个发邮件的代码都是重复的,可以优化成以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def 发送邮件(内容) #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 while True : if cpu利用率 > 90 % : 发送邮件( ‘CPU报警‘ ) if 硬盘使用空间 > 90 % : 发送邮件( ‘硬盘报警‘ ) if 内存占用 > 80 % : |
优化后的代码无论是从可读性还是重用性上都要比之前的代码要好,这就是函数式编程和面相过程变成的区别:
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面相对象:对函数进行分类和封装,让开发“更快更好更强”
函数式编程最重要的是增强代码的重用性和可读性。
1 2 3 4 5 | def 函数名(参数): 函数体 返回值 |
函数的定义主要有如下五点:
def:函数的关键字,python解释器读到这里,知道是要定义函数了
函数名:函数的名称,日后通过函数名来调用函数
函数体:函数中进行一系列的逻辑计算,
参数:为函数体提供数据
返回值:当函数执行完毕后,可以给调用者返回数据。让调用者知道,函数是否执行成功。
返回值用来告知调用者函数是否执行成功
1 2 3 4 5 6 7 8 9 10 11 | def f1(): print ( 123 ) # 在函数中,一旦执行return,函数执行过程立即终止 return "111" print ( 456 ) r = f1() print (r) 执行结果: 123 111 |
从上面的结果可以看出,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | def CPU报警邮件() #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 def 硬盘报警邮件() #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 def 内存报警邮件() #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 while True : if cpu利用率 > 90 % : CPU报警邮件() if 硬盘使用空间 > 90 % : 硬盘报警邮件() if 内存占用 > 80 % : 内存报警邮件() |
以上例子可以看出,如果没有参数,无法自定义邮件内容,不灵活。带参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def 发送邮件(邮件内容) #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 while True : if cpu利用率 > 90 % : 发送邮件( "CPU报警了。" ) if 硬盘使用空间 > 90 % : 发送邮件( "硬盘报警了。" ) if 内存占用 > 80 % : 发送邮件( "内存报警了。" ) 这样可以清晰看出来邮件报警,哪里出了问题。 |
1 2 3 4 5 6 | def f1(name): #name叫做函数的形式参数,简称形参 print (name) f1( ‘yangyang‘ ) #yangyang叫做函数f1的实际参数,简称实参 执行结果: yangyang |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def send(yy, content, xx = "OK" ): #定义函数时,xx="OK" 这种写法为默认参数,如果调用函数时不指定,则默认输出此值(OK)。 #默认参数必须放置在参数列表的最后 print (yy, content, xx) print ( "发送邮件成功:" , xxoo, content) return True while True : em = input ( "请输入邮箱地址:" ) result = send(em, "didi" , "ok" ) #em、didi、ok分别对应定义函数时,send()中的yy,content,xx。如果不写ok,name输出xx时,默认为OK。 if result = = True : print ( "发送成功" ) else : print ( "发送失败" ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def send(yy, content, xx = "OK" ): #定义函数时,xx="OK" 这种写法为默认参数,如果调用函数时不指定,则默认输出此值(OK)。 #默认参数必须放置在参数列表的最后 print (yy, content, xx) print ( "发送邮件成功:" , xxoo, content) return True while True : em = input ( "请输入邮箱地址:" ) result = send(em, "didi" , "ok" ) #em、didi、ok分别对应定义函数时,send()中的yy,content,xx。如果不写ok,name输出xx时,默认为OK。 if result = = True : print ( "发送成功" ) else : print ( "发送失败" ) |
默认参数必须放置在参数列表的最后,如果调用函数时不指定,则默认输出定义函数时定义的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | * 默认将传入的参数,全部放置在元组中, f1( * [ 11 , 22 , 33 , 44 ]) def f1( * args): # args = (11,) args = ([ 11 , 22 , "alex" , "hhhh" ], "12" ) print (args, type (args)) f1() 执行结果: ([ 11 , 22 , ‘alex‘ , ‘hhhh‘ ], ‘12‘ ) < class ‘tuple‘ > 由执行结果可以看出, * args 参数会把所有的值放置到元组中。 def f1( * args): print (args) f1( 11 , 22 , 33 , 44 ) #执行结果: ( 11 , 22 , 33 , 44 ) #把传入的参数放置到元组中 li = [ 11 , 22 , 33 , 44 ,] f1( * li) #通过*列表名的方式将列表传入到函数中,把列表中的每一个值添加到元组中 执行结果: ( 11 , 22 , 33 , 44 ) f1(li) #不加*,将整个列表作为一个元素添加到元组 执行结果: ([ 11 , 22 , 33 , 44 ],) * * 默认将传入的参数,全部放置在字典中 f1( * * { "kl" : "v1" , "k2" : "v2" }) def f1( * * args): print (args) #执行方式一 f1(n1 = "biubiubiu" , n2 = 18 , "name" = "yangrz" ) 执行结果:{ ‘n1‘ : ‘biubiubiu‘ ,} #执行方式二,定义字典,结果kk:{字典} dic = { ‘k1‘ : "v1" , "k2" : "v2" } f1(kk = dic) 执行结果:{ ‘kk‘ : { ‘k2‘ : ‘v2‘ , ‘k1‘ : ‘v1‘ }} dic = { ‘k1‘ : "v1" , "k2" : "v2" } #把字典的元素传入到函数中 f1( * * dic) 执行结果:{ ‘k2‘ : ‘v2‘ , ‘k1‘ : ‘v1‘ } |
1 2 3 4 5 6 7 8 9 10 11 | def f1( * args, * * kwargs): #传入的是数字、字符串、列表就传入*args,如果是字典就传入**kwargs print (args) print (kwargs) f1( 11 , 22 , 33 ) # 执行结果: # (11, 22, 33) # {} f1(k1 = "v1" ) 执行结果:{ ‘k1‘ : ‘v1‘ } |
标签:
原文地址:http://www.cnblogs.com/yangruizeng/p/5535678.html