6-函数

作者: 胖腚猴 | 来源:发表于2017-09-17 17:35 被阅读0次

    函数

    函数的英文单词:function

    在计算机中称之为函数
    在显示生活中称之为功能
    

    函数是能够实现特定功能的计算机代码而已,他是一种特定的代码组结构。

    函数的作用

    1.提升代码的重复利用率,避免重复开发相同代码

    2.提高程序开发效率

    3.便于程序维护

    函数的定义

    1.基本格式:

    def  函数名():
        函数功能代码...
        函数功能代码...
        ...
    
    
    调用函数: 函数名()
    

    特征:函数定义之后不会自动执行,必须在调用函数后函数才会执行.

    函数名的命名规则:和变量基本一样

    1.推荐使用英文或者拼音,禁止使用中文
    2.可以使用数字,但是不能用数字开头
    3.不可以使用特殊字符,除了_
    4.函数名严格区分大小写
    5.函数名必须要有意义。
    6.不能和系统已经存在的保留关键字冲突!
    
    7.禁止使用和系统提供函数相同的函数名
    

    2.带有参数的格式:

    def 函数名(参数,参数...):
        函数功能代码...
        函数功能代码...
        ...
        
    
    调用函数:函数名(参数,参数...)
    
    
    形参:形式上的参数,声明函数时()中的参数是形参
    实参:实际上的参数,调用函数时()中的参数是实参
    

    注意:实参将值传递给形参的过程本质上就是简单的变量赋值仅此而已

    3.带有默认值的参数

    def 函数名(形参=默认值,形参=默认值...):
        函数功能代码...
        函数功能代码...
        ...
    
    调用函数:
        函数名()  调用函数时所有形参采用默认值操作
        函数名(实参,实参...) 调用时形参使用实参的值而抛弃默认值
    

    注意:在此情况下使用实参值覆盖原有形参的默认值,本质上就是变量的重新赋值操作

    4.关键字参数

    def 函数名(形参=默认值,形参=默认值...):
        函数功能代码...
        函数功能代码...
        ...
    
    调用函数:函数名(形参=实参,形参=实参...)
    

    关键字参数就是调用函数时,在实参前面指定形参的做法,为了防止参数按照位置传递出现的错误

    5.收集参数

    1.非关键字收集参数

    def 函数名(*参数名):
        函数功能代码...
        函数功能代码...
        ...
    
    调用函数:函数名(实参,实参...)   没有数量限制
    

    特征:
    1.非关键字收集参数,在形参前添加一个*即可
    2.非关键字收集参数收集实参组成一个元组
    3.非关键字收集参数,仅收集没有任何形参接受的非关键字实参
    4.非关键字收集参数和普通的形参可以共存

    2.关键字收集参数

    def 函数名(**参数名):
        函数功能代码...
        函数功能代码...
        ...
    
    调用函数: 函数名(形参=实参,形参=实参...) 没有数量限制
    

    特征:
    1.关键字收集参数,在形参前添加两个**即可
    2.关键字收集参数,收集的结果组成一个字典,关键字成为字典的键,实参成为值
    3.关键字收集参数,仅收集没有任何形参接受的关键字参数
    4.关键字参数可以和普通的形参共存

    多种参数混合

    定义函数时尽量避免多种参数格式混合(普通参数/非关键字参数,关键字参数,非关键字收集参数,关键字收集参数)

    1.普通参数(非关键字参数)和关键字参数必须在两种收集参数之前
    2.非关键字收集参数,必须在关键字收集参数之前
    3.如果多种参数在一起,必须注意进制参数多次赋值操作(相同赋值赋值之后,关键字参数在此赋值!)
    

    关于返回值的问题

    函数根据执行完毕是否可以得到一个结果,将函数分为2个类型:

    执行过程函数:print()
    
        函数执行完毕之后,不会有任何结果可以被接受的函数。
    
    具有返回值的函数:id(),type()
    
        函数执行完毕之后,会产生一个结果,可以被变量接受或者使用的函数
    

    格式:

    def 函数名(参数....):
        函数功能代码...
        函数功能代码...
        ...
    
        [return 语句]
    

    return的特征:

    1.具有return语句的函数称为具有返回值的函数
    2.return可以为当前函数执行完毕返回一个结果,这样的函数调用可以被接受
    3.return执行之后,函数则会终止,所有return之后的语句不会被执行
    4.一个函数可以书写多个return语句,但是一般会放入分支结构当中。
    5.一个函数如果需要返回多个数据,需要借助复合数据类型(list,tuple,set,dict)来操作即可!
    

    函数文档

    函数文档就是用来查看当前函数相关信息介绍的一个特定格式而已。

    查看函数文档的方法:

    help(函数名称)
    
        直接输出显示函数文档的内容字符串
    
    函数名.__doc__ 
    
        直接输出显示函数文档的内容元字符串(转义字符不转义)
    

    定义函数的文档:

    def 函数名(参数...):
        '''
            在此处声明函数文档
    
        '''
    
        函数功能代码...
        函数功能代码...
        。。。
    
    或者:
    
    def 函数名(参数...):
        """
            在此处声明函数文档
    
        """
    
        函数功能代码...
        函数功能代码...
        。。。
    

    注意:函数文档的作用是对函数进行说明,便于阅读和快速掌握函数的使用,通常函数文档需要具有以下信息:

    函数的作用
    函数的参数介绍(个数,数据类型)
    函数的返回值(数据和类型)
    

    变量的作用域

    变量的作用域就是指变量的有效范围。

    变量按照作用范围分为2类:

    全局变量 
    
        在函数外部声明的变量就是全局变量(在函数内部需要global关键才可以使用)
    
    局部变量
    
        在函数内部声明的变量就是局部变量
    

    全局变量和局部变量的有效范围:

    1.全局变量在函数外部可以正常使用
    2.全局变量在函数内部也可以正常使用(需要global声明)
    3.局部变量在函数内部可以正常使用
    4.局部变量在函数外部不可以被访问
    

    global关键字

    将局部变量提升为全局变量

    格式:
    
        def 函数名():
            #提升局部变量为全局变量
            global 变量名
            
            函数的其他功能代码...
            ...
    

    注意:只有在函数内部使用global关键字对变量进行全局声明,该变量才是一个完整的哦全局变量,在函数内外可以进行任意获取修改删除等操作。

    内部函数

    在函数内部声明的函数就是内部函数。

    特征:
    1.内部函数的本质就是局部变量(函数就是一个变量)
    2.内部函数在函数外部不可以直接调用
    3.内部函数在函数内部调用必须在定义了内部函数之后才可以调用

    闭包

    想办法将局部变量引入到全局环境中可以使用,这就是闭包操作

    闭包方法1:

    def 函数名():
    
        局部变量1
        局部变量2
        ...
    
        def 内部函数1():
            pass
    
        def 内部函数2():
            pass
        ...
    
        return (局部变量1,局部变量2,...内部函数1,内部函数2....)
    

    闭包方法2:

    def 函数名():
    
        局部变量1
        局部变量2
        ...
    
        def 内部函数1():
            pass
    
        def 内部函数2():
            pass
        ...
    
        #获取/收集所有需要进行闭包操作的内部函数和变量
        def all():
            return (局部变量1,局部变量2,...内部函数1,内部函数2....)
    
        return all
    

    闭包的优缺点:

    优点:
    
        1.可以方便的进行函数式编程,组织程序代码
        2.使得局部变量和内部函数在外部可以访问
    
    缺点:
        1.闭包操作会导致整个函数的内部环境,被长久保存,占用大量内存。
    

    闭包环境查看:__closure__

    用于查询当前闭包操作所使用的环境中的变量和内部函数等信息
    

    nonlocal

    nonlocal关键字的意义,不是局部变量,当然他也不是全局变量,通常用于内部函数中使用外部函数的局部变量。

    #声明一个外部函数
    def outer():
    
        #声明一个变量(肯定不是全局变量)
        x = 5
        
        #声明一个内部函数
        def inner():
            nonlocal x#声明x不是局部变量
            x += 9
            print(x)
    
        #调用函数
        inner()
    
    
    
    #调用outer
    outer()
    

    注意:如果内部函数想使用全局变量,那么应该使用global声明变量(函数最外层的全局变量)
    如果内部函数使用的是外部函数的局部变量,那么应该使用nonlocal声明(内部函数的外层,外部函数的局部变量)

    lambda表达式

    lambda表达式是一种简洁格式的函数。该表达式不是正常的函数结构,而是属于表达式的类型。

    基本格式:

    lambda 参数,参数...:函数功能代码
    
    例如:lambda x,y:x + y     获取2个值的和的lambda函数
    

    带分支格式:

    lambda 参数,参数... :值1  if 条件表达式  else 值2
    
    例如:lambda sex : '有胡子' if sex == 'man' else '没胡子'
    

    调用函数格式:

    lambda 参数,参数...:其他函数(...)
    
    例如:lambda x:type(x)
    

    lambda表达式的优缺点:

    优点:
    
        书写简单不需要def 关键字
        不需要费脑子想函数名(匿名函数)
        看起来高大上!
    
    
    缺点:
        
        lambda表达式功能受限,无法使用循环和多项分支
        复杂的操作,不适合lambda表达式
    

    递归函数

    在函数内调用当前函数本身的函数就是递归函数。

    相关文章

      网友评论

          本文标题:6-函数

          本文链接:https://www.haomeiwen.com/subject/atlmsxtx.html