函数的定义及其返回值、参数等相关操作

在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下:

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=" ")

 

posted @ 2016-10-11 17:49  Eric9  阅读(314)  评论(0编辑  收藏  举报