一、函数式编程之发送邮件
#!/usr/bin/env python # -*- coding:utf-8 -*- import smtplib from email.mime.text import MIMEText from email.utils import formataddr def mails(): msg = MIMEText('邮件内容', 'plain', 'utf-8') msg['From'] = formataddr(["Python爱好者",'[email protected]']) msg['To'] = formataddr(["来自Python官网",'[email protected]']) msg['Subject'] = "主题" server = smtplib.SMTP("smtp.126.com", 25) server.login("[email protected]","密码") server.sendmail('[email protected]', ['[email protected]',], msg.as_string()) server.quit() mails()
函数的相关知识点:
1、def定义函数的关键字
2、函数名,后面通过函数名调用该函数
3、函数声明,不自动执行;调用后才执行
4、函数的参数
5、函数的返回值
一、函数的返回值:
1、如果函数体中没有定义返回值动作语句,那么函数默认返回的结果为none
2、如果有返回值可以将返回值赋值给某个变量
二、函数之普通参数
参数:
普通参数
默认参数
动态参数
普通参数:形式参数(形参)和实际参数(实参)
#形式参数(形参)
#实际参数(实参)
参数可以有N个,并且传入指定个数的参数
有如下函数email,其中括号中的message为形式参数,形式参数可以随便定义,而调用函数的时候传入的参数为实际参数,即实参(email("CPU报警"))
def email(message): msg = MIMEText('message', 'plain', 'utf-8') msg['From'] = formataddr(["python爱好者",'[email protected]']) msg['To'] = formataddr(["走人",'[email protected]']) msg['Subject'] = "主题" server = smtplib.SMTP("smtp.qq.com", 25) server.login("[email protected]","roots@123") server.sendmail('[email protected]', ['[email protected]',], msg.as_string()) server.quit() email("CPU报警"
)
三、函数之默认参数
1、不传值则用默认值
2、默认参数必须放在参数列表的最后
3、默认参数也可以有多个
示例:
def email(message,subject="监控报警系统"): msg = MIMEText('message', 'plain', 'utf-8') msg['From'] = formataddr(["python爱好者",'[email protected]']) msg['To'] = formataddr(["走人",'[email protected]']) msg['Subject'] = "主题" server = smtplib.SMTP("smtp.qq.com", 25) server.login("[email protected]","roots@123") server.sendmail('[email protected]', ['[email protected]',], msg.as_string()) server.quit() email("CPU报警",subject="监控报警系统") email("硬盘报警",subject="生产业务系统") email("CPU报警")
以上函数email(message,subject="监控报警系统")参数中subject="监控报警系统"为默认参数,在调用时,放在最后,默认参数放在最后,即email("CPU报警",subject="监控报警系统");也可以初始化默认参数:email("硬盘报警",subject="生产业务系统"),此时原来函数中定义的subject的值将被"生产业务系统"覆盖;调用函数时默认参数也可以不用传值:email("CPU报警")
四、动态参数(一)(传入单值构造成元组)
def func(*args): pass
1、接收多个参数
2、内部自动构造元组
3、如果穿的序列,在序列前加星号(*),可以避免再构造元组,即穿进去是什么,就输出什么
示例代码如下:
li_list = [11,22,33,44,55] li_tuple = ('a','b','c','d') def func(*args): print args print "########这里是分割线#####" func(123) func("abdcdefg") func(li_list) func(li_tuple) func(*li_list) func(*li_tuple)
输出结果:
(123,) ########这里是分割线##### ('abdcdefg',) ########这里是分割线##### ([11, 22, 33, 44, 55],) ########这里是分割线##### (('a', 'b', 'c', 'd'),) ########这里是分割线##### (11, 22, 33, 44, 55) ########这里是分割线##### ('a', 'b', 'c', 'd') ########这里是分割线#####
如果要获取传入参数的值,可以通过参数下标来获取:
示例代码如下:
li_list = [11,22,33,44,55] li_tuple = ('a','b','c','d') def func(*args): print args[0] print "########这里是分割线#####" func(123) func("abdcdefg") func(li_list) func(li_tuple) func(*li_list) func(*li_tuple) 123 ########这里是分割线##### abdcdefg ########这里是分割线##### [11, 22, 33, 44, 55] ########这里是分割线##### ('a', 'b', 'c', 'd') ########这里是分割线##### 11 ########这里是分割线##### a ########这里是分割线#####
四、动态参数(二)(传入的参数为字典的数据结构)
示例代码如下:
dic ={'k1':123,'k2':321,'k3':431} def func(**kargs): print kargs print "######这里是分割线######" func(k1=123) func(k2=321) func(**dic)
输出结果:
{'k1': 123} ######这里是分割线###### {'k2': 321} ######这里是分割线###### {'k3': 431, 'k2': 321, 'k1': 123} ######这里是分割线######
五、动态函数(三)(同时传入单值和双值,分别构造成元组和字典)
def func(*args,**kwargs): print args print kwargs print "#########这里是分割线#########" func(11,22,33) func(k1=123,k2=999) func(11,22,33,k1=123,k2=999)
输出结果:
(11, 22, 33) {} #########这里是分割线######### () {'k2': 999, 'k1': 123} #########这里是分割线######### (11, 22, 33) {'k2': 999, 'k1': 123} #########这里是分割线#########