函数的定义及其返回值、参数等相关操作
在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下:
while True: if cpu利用率 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 硬盘使用空间 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 内存占用 > 80%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接
仔细一看上述代码,if条件语句下的内容可以被提取出来公用,如下:
def 发送邮件(内容) #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 while True: if cpu利用率 > 90%: 发送邮件('CPU报警') if 硬盘使用空间 > 90%: 发送邮件('硬盘报警') if 内存占用 > 80%:
对于上述的两种实现方式,第二次必然比第一次的重用性和可读性要好,其实这就是函数式编程和面向过程编程的区别:
- 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
- 面向对象:对函数进行分类和封装,让开发“更快更好更强...”
函数式编程最重要的是增强代码的重用性和可读性
# 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 # 面向对象:对函数进行分类和封装,让开发“更快更好更强...” # 函数式编程最重要的是增强代码的重用性和可读性 # 函数的定义主要有如下要点: # # def:表示函数的关键字 # 函数名:函数的名称,日后根据函数名调用函数 # 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等... # 参数:为函数体提供数据 # 返回值:当函数执行完毕后,可以给调用者返回数据。 import smtplib from email.mime.text import MIMEText from email.utils import formataddr def senmail(user): flag=True try: msg = MIMEText('python', 'plain', 'utf-8') msg['From'] = formataddr(["嘿嘿",'jinlong12800@sina.com']) msg['To'] = formataddr(["你好",'172560199@qq.com']) msg['Subject'] = "欢迎" server = smtplib.SMTP("smtp.sina.com", 25) server.login("jinlong12800@sina.com", "password") server.sendmail('jinlong12800@sina.com', [user], msg.as_string()) server.quit() except Exception: flag=False return flag ret=senmail('172560199@qq.com'); print(ret) if ret: print("发送成功!") else: print("发送失败!")
上述发送邮件的例子中,若定义返回值,则返回对应的值,若未定义,返回None;return后面的语句不再继续执行,return起到中断当前函数的作用;
参数
#单个普通参数: def show(arg): print(arg) show("123") #两个普通参数 def show(arg,args1): print(arg,args1) show(123,456) #默认参数 默认参数必须在最后 def show(arg,arg1=234): print(arg,arg1) show(789) #指定参数,按形参顺序输出,实参顺序随意 def show(a1,a2): print(a1,a2) show(a2=999,a1=888) #动态参数,单个星号接收的参数自动变为元组 def show(*args): print("动态参数一:",args,type(args)) show(11,22,33,44) #动态参数二,两个星号,接收的参数只能为类字典格式 def show(**kwargs): print("动态参数二:",kwargs,type(kwargs)) show(n1=12,n2=234,n3=333) #双动态参数 def show(*args,**kwargs): print("参数一:",args,type(args)) print("参数二:",kwargs,type(kwargs)) show(11,22,33,n1=99,n2=100,n3=111) print("直接传入对应参数值:") l=[11,22,33] d={"n1":99,"n2":100,"n3":111} show(l,d) print("直接传入对应参数的正确方法:") show(*l,**d) #使用动态参数实现字符串格式化 s1="{0} is {1}" result=s1.format("alex","sb") print("常规字符串格式化方法:",result) l=["alex","2b"] result1=s1.format(*l) print("单一参数动态字符串格式化方法一:",result1) s2="{name} is {actor}" re=s2.format(name="alex",actor="3b") print("常规字符串格式化方法:",re) d1={"name":"alex","actor":"2b"} re1=s2.format(**d1) print("单一参数动态字符串格式化方法二:",re1)
map和filter方法操作
>>> def func(x): if x>33: return True; else: return False; >>> li=[11,22,33,44] >>> new_list=filter(func,li) >>> l=list(new_list) >>> l [44] >>> new_list1=map(lambda x:x+100,li) >>> ll=list(new_list1) >>> ll [111, 122, 133, 144] >>>
lambda常用方法及操作
#lambda简单函数的表述方式 my_result=lambda arg:arg+100 print("对应的函数执行结果为:",my_result(99)) def fun(a): b=a+1 return b print("12222:",fun(100)) func=lambda a:a+1 ret=func(100) print("13333:",ret) fun1=lambda x,y:x+y print("求和:",fun1(3,5)) ll=[12,13,14,15,16] for k,i in enumerate(ll,1): print(k,i) import random ran=random.randint(74,90) ran1=random.randint(97,113) print(ran,ran1) print(chr(ran),chr(ran1)) print("生成随机数:") for i in range(5): ran=random.randint(74,90) # ran1=random.randint(97,113) print(chr(ran),end=" ")