• python 学习之 函数


    五 函数 

    1、背景

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

    复制代码
    while True:
        if cpu利用率 > 90%:
            #发送邮件提醒
            连接邮箱服务器
            发送邮件
            关闭连接
        
        if 硬盘使用空间 > 90%:
            #发送邮件提醒
            连接邮箱服务器
            发送邮件
            关闭连接
        
        if 内存占用 > 80%:
            #发送邮件提醒
            连接邮箱服务器
            发送邮件
            关闭连接
    复制代码

    一看上述代码,if条件语句下的内容可以被提取出来公用,如下:

    复制代码
    def 发送邮件(内容)
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接
        
    while True:
        
        if cpu利用率 > 90%:
            发送邮件('CPU报警')
        
        if 硬盘使用空间 > 90%:
            发送邮件('硬盘报警')
        
        if 内存占用 > 80%:
    复制代码

    对于上述的两种实现方式,第二次必然比第一次的重用性和可读性要好,其实这就是函数式编程和面向过程编程的区别:

    • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
    • 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

       函数式编程最重要的是增强代码的重用性和可读性

    2、定义和使用

    复制代码
    1 def 函数名(参数):
    2        
    3     ...
    4     函数体
    5     ...
    6     返回值
    复制代码

    函数的定义主要有如下要点:

    • def:表示函数的关键字
    • 函数名:函数的名称,日后根据函数名调用函数
    • 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
    • 参数:为函数体提供数据
    • 返回值:当函数执行完毕后,可以给调用者返回数据。 注意是返回给函数调用者

     2.1 返回值

    函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。

    以上要点中,比较重要有参数和返回值:

    复制代码
    如下  n5 返回值 返回给其调用者  再返回给上一层调用者。  如果 n4 n3 n2 n1 都不加return 则返回none
    def n5(): return 5 def n4(): return n5() def n3(): return n4() def n2(): return n3() def n1(): return n2() ret1 = n1() print(ret1)
    复制代码
    复制代码
     1 def 发送短信():
     2        
     3     发送短信的代码...
     4    
     5     if 发送成功:
     6         return True
     7     else:
     8         return False
     9    
    10    
    11 while True:
    12        
    13     # 每次执行发送短信函数,都会将返回值自动赋值给result
    14     # 之后,可以根据result来写日志,或重发等操作
    15    
    16     result = 发送短信()
    17     if result == False:
    18         记录日志,短信发送失败...
    复制代码

    2.2 、参数

    为什么要有参数?

    2.2.1   函数参数种类

    函数的有三中不同的参数:

    • 普通参数
    • 默认参数
    • 动态参数

     普通参数

    复制代码
     1 # ######### 定义函数 ######### 
     2 
     3 # name 叫做函数func的形式参数,简称:形参
     4 def func(name):
     5     print name
     6 
     7 # ######### 执行函数 ######### 
     8 #  'wupeiqi' 叫做函数func的实际参数,简称:实参
     9 func('wupeiqi')
    10 
    11 普通参数
    复制代码

    默认参数

    复制代码
     1 def func(name, age = 18):
     2     
     3     print "%s:%s" %(name,age)
     4 
     5 # 指定参数
     6 func('wupeiqi', 19)
     7 # 使用默认参数
     8 func('alex')
     9 
    10 注:默认参数需要放在参数列表最后
    11 
    12 默认参数
    复制代码

    动态参数1  : *args   意指可以传入多个元素以逗号分割

    复制代码
     1 def func(*args):
     2 
     3     print args
     4 
     5 
     6 # 执行方式一
     7 func(11,33,4,4454,5)
     8 
     9 # 执行方式二
    10 li = [11,2,2,3,3,4,54]
    11 func(*li)
    12 
    13 动态参数
    复制代码

    如果 元素参数是一个列表呢?我们把列表传入输出的一个元素是列表,但是我们想把列表的每个元素当一个参数。调用的时候加*

    复制代码
     1 #!/usr/bin/env python
     2 # _*_ coding:utf-8 _*_
     3 __author__ = 'liujianzuo'
     4 a=[1,3,4]
     5 def fuc(*args):
     6     #print(args)
     7     return args
     8 ret=fuc(a)
     9 print(ret)
    10 
    11 结果:
    12 C:Python35python3.exe E:/py_test/s4/s5.py
    13 ([1, 3, 4],)
    14 
    15 
    16 
    17 #!/usr/bin/env python
    18 # _*_ coding:utf-8 _*_
    19 __author__ = 'liujianzuo'
    20 a=[1,3,4]
    21 def fuc(*args):
    22     #print(args)
    23     return args
    24 ret=fuc(*a)
    25 print(ret)
    26 C:Python35python3.exe E:/py_test/s4/s5.py
    27 (1, 3, 4)
    复制代码

    动态参数2:*args   意指可以传入多个元素以key= value  key的格式是按照变量名的命名规范为标准的

    复制代码
     1 def func(**kwargs):
     2 
     3     print args
     4 
     5 
     6 # 执行方式一
     7 func(name='wupeiqi',age=18)
     8 
     9 # 执行方式二
    10 li = {'name':'wupeiqi', age:18, 'gender':'male'}
    11 func(**li)
    12 
    13 动态参数2 :**kwargs
    复制代码
    View Code

    如果 元素参数是一个字典呢?我们把列表传入输出的一个元素是字典,但是我们想把字典的每个key value当一个参数。调用的时候加** 只加*是key

    复制代码
     1 #!/usr/bin/env python
     2 # _*_ coding:utf-8 _*_
     3 __author__ = 'liujianzuo'
     4 a={"k1":2,"k2":3}
     5 def fuc(**args):
     6     #print(args)
     7     return args
     8 ret=fuc(**a)
     9 print(ret)
    10 
    11 C:Python35python3.exe E:/py_test/s4/s5.py
    12 {'k1': 2, 'k2': 3}
    复制代码
    View Code

    动态参数3 : *args **kwargs

    1 def func(*args, **kwargs):
    2 
    3     print args
    4     print kwargs
    View Code
    复制代码
     1 #!/usr/bin/env python
     2 # _*_ coding:utf-8 _*_
     3 __author__ = 'liujianzuo'
     4 a={"k1":2,"k2":3}
     5 b=[1,2,3]
     6 def fuc(*args,**kwargs):
     7     #print(args)
     8     return args,kwargs
     9 ret=fuc(*b,**a)
    10 print(ret)

    C:Python35python3.exe E:/py_test/s4/s5.py
    ((1, 2, 3), {'k2': 3, 'k1': 2})

    复制代码

    扩展:发送邮件实例

    复制代码
    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    __author__ = 'liujianzuo'
    
    
    def email(p,text,subject):
        import smtplib
        from email.mime.text import MIMEText
        from email.utils import formataddr
    
        ret = True
        try:
    
            msg = MIMEText(text, 'plain', 'utf-8')
            msg['From'] = formataddr(["武沛齐",'wptawy@126.com'])
            msg['To'] = formataddr(["走人",'424662508@qq.com'])
            msg['Subject'] = subject
    
            server = smtplib.SMTP("smtp.126.com", 25)
            server.login("wptawy@126.com", "WW.3945.59")
            server.sendmail('wptawy@126.com', [p,], msg.as_string())
            server.quit()
        except:
            ret = False
        return ret
    
    
    r1=email("1223995142@qq.com","python test email +===","subject==pyhon")
    if r1:
        print("发生成功")
    else:
        print("发送失败")
    复制代码

     函数变量: 局部变量 与全局变量

    函数外的变量定义的全局变量,在函数内部修改不了,因为,函数内部需要global一下否则在函数内部只能是局部变量,只是变量名跟全局变量相同而已

    复制代码
    #!/usr/bin/env python
    #_*_coding:utf-8_*_
    
    num = 10
    
    def fun():
        num +=10
        
    
    
    输出
    C:Python35python3.exe E:/py_test/s13_xml/log_mokuai.py
    Traceback (most recent call last):
      File "E:/py_test/s13_xml/log_mokuai.py", line 10, in <module>
        fun()
      File "E:/py_test/s13_xml/log_mokuai.py", line 7, in fun
        num +=10
    UnboundLocalError: local variable 'num' referenced before assignment
    
    这里执行函数是改变不了函数的num的,因为函数的num是局部变量,只是跟全局变量num相同而已。 需要global一下
    
    
    
    num = 10
    def fun():
        global num
        num += 10
        print(num)
    
    fun()
    
    C:Python35python3.exe E:/py_test/s13_xml/log_mokuai.py
    20
    复制代码
    复制代码
    liujianzuo@python:~/py_training/seminar6/day3$ cat sayHi1.py
    
    age =28   #程序全局变量
    def sayHi(name):
            age = 29  #函数局部变量
            '''this is my first test function'''
            print "hello %s,how are you?,my age is %s!" %(name,age)
    
    sayHi('liujianzuo')
    print 'age:',age
    
    liujianzuo@python:~/py_training/seminar6/day3$ python sayHi1.py 
    hello liujianzuo,how are you?,my age is 29!
    age: 28

    注释全局变量

    #age =28

    def sayHi(name):

            age = 29

            '''this is my first test function'''

            print "hello %s,how are you?,my age is %s!" %(name,age)

    sayHi('liujianzuo')

    print 'age:',age

    报错如下

    liujianzuo@python:~/py_training/seminar6/day3$ python sayHi1.py

    hello liujianzuo,how are you?,my age is 29!

    age:

    Traceback (most recent call last):

      File "sayHi1.py", line 9, in <module>

        print 'age:',age

    NameError: name 'age' is not defined

    更改方法;让局部变全局  global更改局部变全部 不建议使用

    #age =28

    def sayHi(name):

            global age

            age = 29

            '''this is my first test function'''

            print "hello %s,how are you?,my age is %s!" %(name,age)

    sayHi('liujianzuo')

    print 'age:',age

    执行

    liujianzuo@python:~/py_training/seminar6/day3$ python sayHi1.py

    hello liujianzuo,how are you?,my age is 29!

    age: 29

    注释局部变量

    age =28

    def sayHi(name):

    #       age = 29

            '''this is my first test function'''

            print "hello %s,how are you?,my age is %s!" %(name,age)

    sayHi('liujianzuo')

    print 'age:',age

    执行

    liujianzuo@python:~/py_training/seminar6/day3$ python sayHi1.py    

    hello liujianzuo,how are you?,my age is 28!

    age: 28     

    复制代码
  • 相关阅读:
    linux-01-04(创建文件夹mkdir,进入目录命令cd,创建文件命令 echo cp vim touch等,批量创建文件操作)
    linux-05(tar命令的使用)
    linux-06(移动命令mv)
    linux-07(复制命令cp)
    linux-08(查看命令历史记录history)
    cookie
    vue-router路由懒加载
    setTimeout async promise执行顺序总结
    forEach陷阱
    函数节流与函数防抖之间的区别
  • 原文地址:https://www.cnblogs.com/superfangchao/p/8514588.html
Copyright © 2020-2023  润新知