zoukankan      html  css  js  c++  java
  • 函数的定义及其返回值、参数等相关操作

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

    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=" ")
  • 相关阅读:
    【方法1】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录
    hdu3415 Max Sum of Max-K-sub-sequence 单调队列
    HBase总结(十八)Hbase rowkey设计一
    Makefile生成器,使用C++和Boost实现
    quartz cron表达式在线生成
    NS3网络仿真(6): 总线型网络
    连载:面向对象葵花宝典:思想、技巧与实践(35)
    zoj 2921 Stock(贪心)
    11g RAC 加节点 之 手动加入vip 资源
    [Unity3D]Unity+Android交互教程——让手机"动"起来
  • 原文地址:https://www.cnblogs.com/eric8899/p/5950218.html
Copyright © 2011-2022 走看看