1.初始函数
面向过程编程,从上到下按照业务逻辑之一实现
#定义函数
def 函数名():
代码
代码
代码
#调用函数
函数名()
函数名()
def get_info():
print("欢迎使用xx系统")
v1=1
v2=2
v3=v1+v2
print(v3)
get_info()
函数式编程:公共重复的功能提取到函数中
反复利用某段代码【增强代码的重用性】
特别长的逻辑,拆分到函数中【增强代码的可读性】
def 发送邮件():
发送邮件报警-10行
...
if cpu使用率>90%:
发送邮件()
if 内存>90%:
发送邮件()
if 硬盘>90%:
发送邮件()
2.函数的参数
注意:任意类型都可以作为参数传递
*位置传参
def send_email(x1):
print(x1)
send_email(a)
def send_email(x1,x2,x3):
print(x1)
send_email(a,b,c)
*关键字传参
send_email(x1=11,x2=22,x3=33)
*混合传参(关键字传参放在后面)
send_email(11,x2=22,x3=33)
*默认值
def send_email(x1,x2,x3=999):
pass
send_email(11,x2=22) #x3=999
send_email(11,x2=22,x3=888) #x3=888
8
3.练习题
定义函数,接收1个字符串类型的参数,在函数内部计算字符串中"a"出现的次数,输出
def count():
x=0
str=input("请输入字符串:")
for i in range(len(str)):
if str[i]=="a":
x=x+1
print(x)
count()
def get_str_count(data_string):
count=0
for i in data_string:
if str[i]=="a":
count=count+1
print(count)
get_str_count("shuahdusadjiojiajdmka")
#定义函数,接收2个字符串类型的参数,在函数内部计算字符串中第二个参数默认a出现的次数,输出
def get_str_count(data_string,key="a"):
count=0
for i in data_string:
if str[i]=="a":
count=count+1
massage="{}出现的次数:{}".format(key,count)
print(massage)
get_str_count("shuahdusadjiojiajdmka")
get_str_count("shuahdusadjiojiajdmka","b")
4.动态参数
def send_email(x1,x2,x3=999): #x3是默认参数
pass
send_email(11,x2=22)
函数的默认参数中出现了可变类型一定要谨慎(list/dict)
def func(a2=[]):
a2.append(2)
print(a2)
func() #[2]
func([]) #[2] func([1,]) [1,2]
func() #[2,2]
注意:执行函数未传递参数,默认每次创建一个空列表赋值给a2——>错误
*
def func(*a1)
#a1=(1,11,33)
#a1=("xx",123)
#a1=([11,22,3],"张三")
#a1=(1,)
#a1=()
#a1=([11,22,3],)
#a1=((11,22,3),)
pass
func(1,11,33)
func("xx",123)
func([11,22,3],"张三")
func(1)
func()
func([11,22,3])
func((11,22,3))
**
def func(**a1)
#a1={"v1":"1","v2":"11"}
#a1={}
#a1={"uu":"999"}
pass
func(v1=1,v2=11)
func()
func(uu=999)
*,**
def func(*a1,**a2)
#a1=(1,2) a2={}
#a1=() a2={"v1":"1","v2":"11"}
#a1=(99,) a2={"data":"123"}
pass
func(1,2)
func(v1=1,v2=11)
func(99,data=123)
def func(n1,n2,*a1,*a2):
#n1=1,n2=2,a1=(123,),a2={"v1":123}
#
pass
func(1,2)
func(1,2,123,123,v1=123)
易错点
def f1(arg):
pass
f1(123)
f1("xxx")
f1([11,22,33])
def f2(*args,**kwargs):
pass
#args=([11,22,33])
#args=((11,22,33))
#kwargs={"v1":(11,22,33)}
f2([11,22,33])
f2((11,22,33))
f2(v1=(11,22,33))
5.函数的返回值
返回值,执行函数之后的结果
def add(v1,v2)
return v1+v2
res=add(10,20)
return :在函数中作于返回值
print:输出
返回值可以是任意类型
def func():
return 123
def func():
return "xxx"
def func():
return [11,22,33]
函数没有返回值,默认返回None
def func():
data=123
res=func() #res=None
函数内部一旦遇到return函数立即终止
练习题
定义函数,接收任意个位置传参的参数(整数类型),在函数的内部将用户传入的所有参数相加并得到最后的结果,将结果返回给调用者
def func(*args):
result = 0
for item in args:
result = result + item
return result
v1=func(11,22,33)
def func(*args):
result = 0
for item in args:
if type(item)==str:
if item.isdecimal():
result=result+int(item)
else:
result = result + item
return result
v1=func(11,22,33)
写函数,接受2个参数:文件路径、文本——>读取文件每行内容,判断这一行是否包含第二个参数指定的文本,如果包含,则将文件的那一行并添加到列表中,返回列表
import os
#
def func(path,key):
#读文件保证文件存在
f = open("path", mode='rb', encoding='utf-8')
data_list = []
#判断文件是否存在
if not os.path.exists(path):
return data_list
for line in f:
line = line.strip()
if not line:
continue
if key in line:
data_list = data_list.append(line)
print(data_list)
f.close()
return data_list
func()
6.扩展
def func()
return11,22,33
v1=func()
print(v1) #(11,22,33)
def func()
return11,22,33
v1,v2,v3=func()
print(v1,v2,v3)
7.调用函数
def f1():
print(11)
print(22)
def f2():
print(99)
f1()
print(66)
f2()
注意:函数传递是引用,不会重新拷贝一份数据,再传入其中
def f1(a1):
a1.upper() #字符串是不可变类型,生成新的字符串需要重新赋值
#列表是可变类型
v1="root"
f1(v1)
print(v1) #v1=root
8.python中的作用域
作用域:一块共享区域,区域里面的资源共享
python中有一个全局作用域
在python中一个函数是一个作用域
name="张三"
age=18
if 1==1:
size=10
for i in range(10):
pass
print(name,age,size,i) #i=9
name="张三"
age=18
def func():
v1=10
v2"root"
print(v1)
print(name) #可以向上找数值"孩子可以找爸爸"
func()
9.全局和局部变量
#全局变量 大写
NAME="张三"
AGE=18
def func():
#局部变量 小写
v1=10
v2"root"
print(v1)
print(name) #可以向上找数值"孩子可以找爸爸"
func()
10.global关键字
name="lisa"
def f():
global name #后续操作的name都是全局
name ="root" #将name改成root
print(name) #root
f()
print(name) #root
11.函数名也是一个变量名称
def f1()
print("123")
f2=f1 #f1赋给f2
f2()
def f1()
print("123")
data_list=[11,"lisa",True,f1(),f1]
data_list[-1]() #执行函数
data_list[-2] #f1()的执行结果,None
应用场景
def send_sms():
print("发短信提醒:")
def send_email():
print("发邮件提醒:")
def send_wechat():
print("发短信提醒:")
func_list=[send_sms,send_email,send_wechat]
for func in func_list:
func()
#定义三个函数分别为注册,登录,查看用户信息
#输出1注册 2登录 3查看信息
#选择序号,根据序号不同选择不同的函数
def register():
print("注册")
def login():
print("登录")
def user_info():
print("用户信息")
dict = {
"1": register,
"2": login,
"3": user_info
}
print("欢迎登陆")
print("1.注册 2.登录 3.查看用户信息")
choice = input("请选择")
func = dict.get(choice)
if func: #如果choice选择不存在,choice=None,即F
func()
else:
print("选择错误")
dict = {
"1":( register,"注册")
"2": (login,"登录")
"3": (user_info,"查看信息")
}
lin_list=[]
for k,v in dict.items():
line="{}.{}".format(k,v[-1])
lin_list.append(line)
masssge=" ".join(line_list)
print(massage)
12.匿名函数(lambda表达式)
如果函数只当参数使用,后期不再使用,建议使用匿名函数
def func(x,y):
return x+y
func=lambda x,y:100+y #默认包含return,即return100+y
func=lambda x,y:100+y
res=func(1,2)
print(res) #102
func=lambda x,y:x+y
res=func(1,2)
print(res) #3
func=lambda *args,**kwargs:len(args)+len(kwargs)
res=func(11,22,v1=1)
print(res) #3
基于python代码发邮件
#将pyth内置的模块(功能导入)
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
#构建邮件内容
msg=MIMEText("周二快乐~","html","utf-8") #内容
msg['From']=formataddr(["高宇彤","m18241634100@163.com"]) #自己的名字/自己的邮箱
msg['to']='451078950@qq.com' #目标邮箱
msg['Subject']="祝福" #主题
#发送邮件
sever=smtplib.SMTP_SSL("smtp.163.com")
sever.login("m18241634100@163.com","CTTEURHZEZSHKWEI") #账户/授权码
sever.sendmail("m18241634100@163.com","451078950@qq.com",msg.as_string()) #自己邮箱/目标邮箱/内容
sever.quit()
def send_email(to,subject,content):
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
#构建邮件内容
msg=MIMEText(content,"html","utf-8") #内容
msg['From']=formataddr(["高宇彤","m18241634100@163.com"]) #自己的名字/自己的邮箱
msg['to']=to #目标邮箱
msg['Subject']=subject" #主题
#发送邮件
sever=smtplib.SMTP_SSL("smtp.163.com")
sever.login("m18241634100@163.com","CTTEURHZEZSHKWEI") #账户/授权码
sever.sendmail("m18241634100@163.com",to,msg.as_string()) #自己邮箱/目标邮箱/内容
sever.quit()
email=input("请输入邮箱")
body=input("请输入内容")
send_email(email,"测试邮件",body)