1 ####################################------------------------------------------------####################################
2 #1、def关键字,创建函数
3 #2、函数名
4 #3、()
5 #4、函数体
6 #5、返回值
7 #6、函数的基本参数:
8 #默认参数:send_mail(AAA,BBB,CCC="OK") CCC就设置了默认参数,默认参数必须放置在参数列表的最后
9 #实际参数:ret = send_mail('1360077454@qq.com')实际传输的值
10 #形式参数:def send_mail(AAA) [形式参数可以设置多个]
11 #指定参数:以下面代码为例:默认是 AAA = email ,BBB = "测试第二个形式参数" 如果想要反过来,可以这样写: send_mail(BBB = email,AAA = "测试第二个形式参数") 即可实现
12 #7、函数的动态参数:
13 #* 默认将传入的参数,全部放置在元组中 f1(*[11,22,33,44]) 一个* 是把列表里每一个元素传给*args,而不是把整个列表看做一个元素
14 #** 默认将传入的参数,全部放置在字典中 f1(**{'k':'v','k1':'v1'}) 两个*是把字典里每一个键值对传给*args,而不是把整个字典看做一个元素
15 #8、函数的万能参数:
16 #*args,**kwargs 可以同时传入字符串和字典,会自动区分类别
17
18 #/usr/bin/env python
19 #-*- coding:utf-8 -*-
20 '''
21 def send_mail():
22 try: #捕捉异常,只要这里边出现了异常,就会执行except里的代码
23 import smtplib
24 from email.mime.text import MIMEText
25 from email.utils import formataddr
26
27
28 msg = MIMEText('邮件内容','plain','utf-8')
29 msg['From'] = formataddr(["张江华",'18701130291@163.com'])
30 msg['To'] = formataddr(["哈哈A",'1360077454@qq.com'])
31 msg['Subject'] = "主题"
32
33 server = smtplib.SMTP("smtp.163.com",25)
34 server.login("18701130291@163.com","zhangjianghua123")
35 server.sendmail('18701130291@163.com',['1360077454@qq.com',],msg.as_string())
36 server.quit()
37 except: #捕捉异常,只要try里边的代码出现了异常,就会执行except里的代码
38 return False
39 else: #如果没有出现异常,就返回True
40 return True #这里的返回值True or False,也可以改为字符串,比如"成功",只需要再把下面的判断一起改了就行
41 ret = send_mail() #ret 是send_mail执行完返回的值,True or False 会赋予ret
42 if ret == True:
43 print ("发送成功")
44 else:
45 print ("发送失败")
46 '''
47 '''
48 def f1():
49 print (123)
50 return ('成功') #在函数中,一旦执行return,函数执行过程立即终止
51 print (456)
52 r = f1()
53 print (r)
54 '''
55 '''
56 def f2():
57 print (123) #在函数里,如果没有指定返回值return的话,那么会默认返回None
58 r = f2()
59 print (r)
60 '''
61
62 ####################################------------------------------------------------####################################
63
64 函数的基本参数:
65 #默认参数:send_mail(AAA,BBB,CCC="OK") CCC就设置了默认参数,默认参数必须放置在参数列表的最后
66 #实际参数:ret = send_mail('1360077454@qq.com')实际传输的值
67 #形式参数:def send_mail(AAA) [形式参数可以设置多个]
68 #指定参数:以下面代码为例:默认是 AAA = email ,BBB = "测试第二个形式参数" 如果想要反过来,可以这样写: send_mail(BBB = email,AAA = "测试第二个形式参数") 即可实现
69 send_mail(AAA,BBB)
70 send_mail(email,"测试第二个形式参数")
71
72
73 def send_mail(AAA,BBB): #AAA = 外边ret = send_mail()给的值,即:AAA = 1360077454@qq.com ;#BBB 等于 result = send_mail(email,"测试第二个形式参数") 这句中的第二个值,实际参数是跟形式参数相对应的
74 try: #捕捉异常,只要这里边出现了异常,就会执行except里的代码
75 import smtplib
76 from email.mime.text import MIMEText
77 from email.utils import formataddr
78
79
80 msg = MIMEText(BBB,'plain','utf-8') #邮件地址可以设置变量(形式参数),当然,邮件内容或者其他的值也可以设置变量(形式参数)
81 msg['From'] = formataddr(["张江华",'18701130291@163.com'])
82 msg['To'] = formataddr(["哈哈A",'1360077454@qq.com'])
83 msg['Subject'] = "主题"
84
85 server = smtplib.SMTP("smtp.163.com",25)
86 server.login("18701130291@163.com","zhangjianghua123")
87 server.sendmail('18701130291@163.com',[AAA,],msg.as_string()) #我需要给多人发送邮件时,只需要把邮件地址设置一个变量
88 server.quit()
89 except: #捕捉异常,只要try里边的代码出现了异常,就会执行except里的代码
90 return False
91 else: #如果没有出现异常,就返回True
92 return True #这里的返回值True or False,也可以改为字符串,比如"成功",只需要再把下面的判断一起改了就行
93
94 #ret = send_mail('1360077454@qq.com') #ret 是send_mail执行完返回的值,True or False 会赋予ret
95 #实际参数:ret = send_mail('1360077454@qq.com')实际传输的值
96
97 while True:
98 email = input("请输入你的邮箱地址:")
99 result = send_mail(email,"测试第二个形式参数") #email变量默认就是传给AAA这个形式参数,系统执行的是形式参数AAA
100 if result == True:
101 print ("发送成功")
102 else:
103 print ("发送失败")
104
105 ####################################------------------------------------------------####################################
106
107 函数的动态参数:* 默认将传入的参数,全部放置在元组中 f1(*[11,22,33,44]) 一个* 是把列表里每一个元素传给*args,而不是把整个列表看做一个元素
108
109 第一种动态参数:*
110 # * 是动态参数 ,可以接收实际参数传过来的所有元素,并把它们看做一个元组
111 def f1(*args):
112 print (args,type(args))
113 f1(11,22,'zxc','xxx') #*号可以接收任何的元素
114 li = [11,22,'zxc','xxx'] #给args传了一个列表,他会把列表看做一个元素加入到args
115 f1(li,'zhang') #把li整体当做一个元素加入到args,与后边的字符串同为一个元组
116 f1(*li,666) #如果加上一个*,代表将这个列表里的每一个元素转化到args元组的元素里边,后边不能添加任何字符串
117 f1('zzc')
118 f1(*'zzc') #如果*添加的是字符串,会拆开存成单个元素
119 f1(*'张江华') #中文也是一样会拆开
120 执行结果:
121 (11, 22, 'zxc', 'xxx') <class 'tuple'>
122 ([11, 22, 'zxc', 'xxx'], 'zhang') <class 'tuple'>
123 (11, 22, 'zxc', 'xxx', 666) <class 'tuple'>
124 ('zzc',) <class 'tuple'>
125 ('z', 'z', 'c') <class 'tuple'>
126 ('张', '江', '华') <class 'tuple'>
127 ---------------------------------------------------------------------------------------------------------------------------------
128 第二种动态参数:** 默认将传入的参数,全部放置在字典中 f1(**{'k':'v','k1':'v1'}) 两个*是把字典里每一个键值对传给*args,而不是把整个字典看做一个元素
129
130 def f1(**args): #**默认是字典结构,所以赋值也要是字典结构key-value
131 print (args,type(args))
132 f1(n='zhang',b='jiang',c='hua')
133 dic = {'k':'v','k1':'v1'}
134 f1(**dic) #**代表直接将变量或者字典传入**args这个字典中
135 -----------------------------------------------------------------------------------------------------------------------------------
136 函数的万能参数:*args,**kwargs 可以同时传入字符串和字典,会自动区分类别
137
138 def f1(*args,**kwargs): #万能参数,前后位置不能变
139 print (args,type(args))
140 print (kwargs,type(kwargs))
141 f1(11,22,33,k='v',k1='v1') #同时传入字符串和字典,会自动区分
142 执行结果:
143 (11, 22, 33) <class 'tuple'>
144 {'k': 'v', 'k1': 'v1'} <class 'dict'>
145
146 ####################################------------------------------------------------####################################
147 动态参数实现format功能:
148
149 s1 = "i am {0},age is {1}".format('zhangjianghua',21)
150 print (s1)
151 s2 = "i am {0},age is {1}".format(*['zhangjianghua',21])
152 print (s2)
153 s3 = "i am {name},age is {age}".format(name='zhangjianghua',age=21)
154 print (s3)
155 dic = {'name':'zhangjianghua','age':21}
156 s4 = "i am {name},age is {age}".format(**dic)
157 print (s4)
158 执行结果:
159 i am zhangjianghua,age is 21
160 i am zhangjianghua,age is 21
161 i am zhangjianghua,age is 21
162 i am zhangjianghua,age is 21