第二十四节,自定义函数
函数是将要实现的功能写在函数里,在要使用此功能的地方调用此函数即可实现功能,这样大大减少编程重复书写同样的代码,在多个要使用同样功能的地方调用函数即可不需要重复写同样的代码
函数式编程最重要的是增强代码的重用性和可读性
函数的定义主要有如下要点:
def:表示函数的关键字
函数名:函数的名称,日后根据函数名调用函数
函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
参数:为函数体提供数据
return:返回值:当函数执行完毕后,可以给调用者返回数据。
1,定义函数,调用函数
函数需要先定义函数功能,然后在要使用此函数更能的地方调用韩式
2.自定义函数写好后,函数名加()表示执行函数,函数名不加()号表示指向函数
定义函数无参
无参就是不往函数里传参数,一般用固定死了的一个功能函数
#!/usr/bin/env python # -*- coding:utf-8 -*- #定义函数无参 def huo(): a = 3 + 2 + 5 print(a) #调用函数 huo() #输出 10
定义函数有参
有参就是要往函数里传参数进去使用,可以传一个参数,或者多个参数
书写格式是:在定义函数里面,写上形式参数来接收实际参数,(形式参数相当于变量),在调用函数里写上实际参数来指向定义函数里的形式参数
实际参数和形式参数的对应顺序是从第一个位置对等顺序,所以有几个形式参数,就要传几个实际参数
传入的实际参数可以是数字,字符串,列表,字典等任意类型
#!/usr/bin/env python # -*- coding:utf-8 -*- #定义函数有参 #接收调用函数里的实际参数 def huo(b,c,d): #用接收到的实际参数来进行运算 a = b + c + d print(a) #调用函数 #在调用函数里传入实际参数 huo(1,2,3) #输出 6
注意:如果在调用函数的时候,传值的实际参数和定义函数形的式参数,不从第一个顺序对应,也就是想自定义对应顺序,就必须在调用函数里传入形式参数=实际参数
#!/usr/bin/env python # -*- coding:utf-8 -*- #!/usr/bin/env python # -*- coding:utf-8 -*- #定义函数有参 #接收调用函数里的实际参数 def huo(b,c,d): #用接收到的实际参数来进行运算 a = b + c + d print(a) #调用函数 #在调用函数里传入实际参数 huo(d = 1,b = 2,c = 3) #输出 6
定义函数有参(默认值)
就是在定义函数里的形式参数=一个默认值(实际参数)的,当调用函数的时候如果传值了就会替换默认值,如果没传值就是默认值
注意:如果有默认值的形式参数一定要放在最后的位置,否则会出错
# -*- coding:utf-8 -*- #定义函数有参 #接收调用函数里的实际参数 #b有默认值=2 def huo(c,d,b=2): #用接收到的实际参数来进行运算 a = b + c + d print(a) #调用函数 #在调用函数里传入实际参数 #默认参数没传值 huo(d = 1,c = 3) #输出 6
定义函数(关键字return)
return:返回值:当函数执行完毕后,可以给调用者返回数据。
注意:在程序执行自定义函数的时候只要遇到return,函数里面下面的代码不在执行了
举例1
返回函数里的运算结果
#!/usr/bin/env python # -*- coding:utf-8 -*- #定义函数有参 #接收调用函数里的实际参数 def huo(b,c,d): #用接收到的实际参数来进行运算 a = b + c + d #返回函数里的结果 return a #调用函数 #在调用函数里传入实际参数 print(huo(1,2,3))#将函数返回结果打印出来 #输出 6
举例2
#!/usr/bin/env python # -*- coding:utf-8 -*- #定义函数有参 #接收调用函数里的实际参数 def huo(b,c,d): #用接收到的实际参数来进行运算 a = b + c + d #返回函数里的结果 return a #调用函数 #在调用函数里传入实际参数 sou = huo(1,2,3)#将函数返回结果赋值给一个变量 #将函数返回结果打印出来 print(sou) #输出 6
检查运行自定义函数时里面是否有错
try:获取代码是否有错
except:如果代码有错执行这里面的
#!/usr/bin/env python # -*- coding:utf-8 -*- def shi(a,b): #获取代码是否有错误(注意如果使用了这个就不会显示红字的错误信息) try: a = a + c print(a) #如果代码有错就执行except里面的 except: #自定义错误提示 print("文件3.py,自定义函数错误,行号3") shi(1,2) #返回错误提示
示例:自定义函数传参发送邮件
代码说明
""" import smtplib from email.mime.text import MIMEText from email.utils import formataddr #邮件内容 msg = MIMEText('邮件内容', 'plain', 'utf-8') #发件人名称和发件人邮箱 msg['From'] = formataddr(["玉秀文化传播",'15284816568@163.com']) #收件人名称和收件人邮箱 msg['To'] = formataddr(["林贵秀",'729088188@qq.com']) #邮件主题 msg['Subject'] = "主题" #发件邮箱smtp设置 server = smtplib.SMTP("smtp.163.com", 25) #发件人邮箱和登陆密码设置 server.login("15284816568@163.com", "adc8868") #发件人邮箱,收件人邮箱 server.sendmail('15284816568@163.com', ['729088188@qq.com',], msg.as_string()) server.quit() """
示例:
#!/usr/bin/env python # -*- coding:utf-8 -*- #发件人信息 a = "15284816568@163.com"#发件人邮箱 b = "玉秀文化传播有限公司"#发件人名称 c = "adc8868"#发件人邮箱密码 #收件人信息 d = "729088188@qq.com"#收件人邮箱 e = "林贵秀"#收件人名称 #邮件信息 f = "玉秀文化传播有限公司招聘函"#邮件主题 g = "您好!感谢您参加我公司的招聘,我们很荣幸的通知您,您以被我公司录取,请及时参加公司培训" #自定义函数 def you_xiang(a,b,c,d,e,f,g): import smtplib from email.mime.text import MIMEText from email.utils import formataddr #邮件内容 msg = MIMEText(g, 'plain', 'utf-8') #发件人名称和发件人邮箱 msg['From'] = formataddr([b,a]) #收件人名称和收件人邮箱 msg['To'] = formataddr([e,d]) #邮件主题 msg['Subject'] = f #发件邮箱smtp设置 server = smtplib.SMTP("smtp.163.com", 25) #发件人邮箱和登陆密码设置 server.login(a, c) #发件人邮箱,收件人邮箱 server.sendmail(a, [d,], msg.as_string()) server.quit() #调用函数 you_xiang(a,b,c,d,e,f,g)
自定义函数(动态参数)一个*元组类型 非约束参数名称 *args
在自定义函数的时候形式参数加上一个*号
调用函数的时候就可以传入多过实际参数,传入的实际参数会自动组成元组元素
#!/usr/bin/env python # -*- coding:utf-8 -*- #定义动态参数函数,一个星* def f1(*a): print(a) #调用函数 f1(123,456,789) #输出 (123, 456, 789)
自定义函数(动态参数)两个**字典类型 非约束参数名称 *kwargs
在自定义函数的时候形式参数加上两个**号
调用函数的时候就可以传入多过实际参数,注意:传入的实际参数必须是键值对,传入的实际参数会自动组成字典元素
#!/usr/bin/env python # -*- coding:utf-8 -*- #定义动态参数函数,两个* def f1(**a): print(a) #调用函数 f1(k1=123,k2=456,k3=789) #输出 {'k1': 123, 'k3': 789, 'k2': 456}
自定义函数(两种动态参数和普通参数的结合应用)普通型,元组型,字典型 (万能参数)
注意:如果是结合应用,普通型写在第一位,一个*元组型写在第二位,两个**字典型写在最后
说明:
第一个形式参数是普通参数,所以第一个传入实际参数会自动赋值给第一个形式参数
第二个形式参数是*b一个星元组类型,所以后面的字符会自动组合成元组赋值给第二个形式参数,键值对除外
第三个形式参数是**c两个星字典类型,所以键值对会自动组合成字典赋值给第三个形式参数
#!/usr/bin/env python # -*- coding:utf-8 -*- #定义动态参数函数的结合应用 def f1(a, *b, **c): print(a) print(b) print(c) #调用函数 f1(111,123,456,789,k1=123,k2=456,k3=789) #输出结果 #111 #(123, 456, 789) #{'k3': 789, 'k1': 123, 'k2': 456}
将函数传入的列表元素转换成元组元素
其他集合类型同理(字典除外)
# -*- coding:utf-8 -*- #将函数的传入的列表元素转换成元组元素 #定义函数 def f1(*args): print(args) a = [123,456,789] #调用函数普通传值,会把这个列表整体转换成元组的一个元素,如([123, 456, 789],) f1(a) #调用函数加一个*传值,会把这个列表的每个元素转换成元组的元素,如(123, 456, 789) f1(*a) #输出结果 #([123, 456, 789],) #(123, 456, 789)
将函数传入的字典元素转换成字典元素
#!/usr/bin/env python # -*- coding:utf-8 -*- #将函数的传入的字典元素转换成字典元素 #定义函数 def f1(**kwargs): print(kwargs) a = {"k1": 123, "k2": 456,"k3": 789} #调用函数加两个**传值,会把这个字典的每个元素转换成字典的元素,如{'k1': 123, 'k2': 456, 'k3': 789} f1(**a) #输出结果 #{'k1': 123, 'k2': 456, 'k3': 789}
全局变量和局部变量
全局变量可以在局部里使用,局部变量不可以在全局使用
全局变量:就是在函数外设置的变量,是在整个文件代码中可以使用的
局部变量:就是定义函数里面设置的变量,只能在定义函数内部使用,要想整个文件代码中可以使用就必须转换成全局变量
#!/usr/bin/env python # -*- coding:utf-8 -*- def f1(a,b): #将c变量转换成全局变量 global c c = a + b print(c) f1(5,6) #将转换成全局变量的c加11 a1 = c + 11 print(a1) #最后输出 #11 #22
lambda 表达式创建简单的函数
创建方式:函数名称(有点像变量名称),lambda(表达式关键字),形式参数,:功能模块
#!/usr/bin/env python # -*- coding:utf-8 -*- #lambda 表达式 #lambda 表达式创建简单的函数 #创建方式:函数名称(有点像变量名称),lambda(表达式关键字),形式参数,:功能模块 """列1""" f1 = lambda a,b:a + b #lambda 表达式定义函数 f2 = f1 (1,2) #调用函数 print(f2) """列2""" av = lambda a:a #lambda 表达式定义函数 av1 = av("你好") #调用函数 print(av1)