一、 函数
定义:
def info():
print("执行info()函数")
直接调用方法和封装一个函数:
使用信息发送的功能为例
登录163网易免费邮-你的专业电子邮局
1)开启POP3/SMTP服务,会得到对应的授权码,也就是登陆密码
2)找到对应SMTP服务器url
1) 直接调用python内置方法:
import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMEText("月薪十万。","html","utf-8") msg["Form"] = formataddr(["任可","m15571027178@163.com"]) msg["to"] = "1831120378@qq.com" msg["Subject"] = "主题:我的目标" server = smtplib.SMTP_SSL("smtp.163.com") server.login("m15571027178@163.com","password") server.sendmail("m15571027178@163.com","1831120378@qq.com",msg.as_string()) server.quit()
2)封装成函数:
def send_email(text,name,from_addr,to_addr,subject,password,url): msg = MIMEText(text,"html","utf-8") msg["Form"] = formataddr([name,from_addr]) msg["to"] = to_addr msg["Subject"] = subject server = smtplib.SMTP_SSL(url) server.login(from_addr,password) server.sendmail(from_addr,to_addr,msg.as_string()) server.quit() pass
调用函数:
函数参数几种形式:
1)给参数设置默认值
def do_something(a1,a2,a3=10):
print(a1,a2,a3)
pass
do_something(1,2,3) #1 2 3
do_something(1,2) #1 2 10
2)动态传入参数,参数前加*,args为元组
def do2(*args):
print(args)
pass
do2(1,2,3) #(1, 2, 3)
do2(1,2) #(1, 2)
3)动态传入参数,参数前加**,kwargs为字典
def do3(**kwargs):
print(kwargs)
pass
do3(v1=1,v2=2,v3=3) # {'v1': 1, 'v2': 2, 'v3': 3}
do3(v1=1,v2=2) # {'v1': 1, 'v2': 2}
函数的返回值:
没有返回值时,默认的返回值为None
返回值可以有多个,接收返回值会是一个元组类型
二、作用域
python以函数为界区分作用域
if 1 == 1:
name = "root"
print(name) # root name声明在函数外边
for i in range(10):
pass
print(i) # 9 i声明在函数外边
def info():
name = "root"
print(name)
info() # 运行时异常 name在函数内部
二、global关键字:
1)函数内部作用域找不到全局CITY变量名。
2)函数内部作用域与全局作用域输出
3)使用global关键字在函数内部操作全局变量
二、生成器 yield next关键字:
1) 保留函数对象a
2)不保留函数对象,每次都重新调用一个新函数对象
这样写就没有意义
3)for循环调用生成器:
这里两次输出结果都是0到9
三、装饰器
装饰器分为 切面函数 和 目标函数:
给info()函数加上注解@aop,调用info()函数.
则首先执行aop(func)函数,func就是执行的info()对象
然后执行inner()函数,完成inner函数对象调用后返回info()对象返回值给aop()
最后返回inner对象的返回值。