当前位置 博文首页 > zy010101博客:python——深入函数(1)

    zy010101博客:python——深入函数(1)

    作者:[db:作者] 时间:2021-06-26 18:19

    函数基础

    函数能够实现功能的模块化封装,以方便后续调用。函数能够实现代码重用,减少代码冗余。另外,函数可以实现过程的分解。来一步一步实现整个过程。

    def

    python的函数是由一条赋值语句def编写的。def是可执行语句,在python运行到def的时候,会创建一个函数对象,并把该函数对象赋值给函数名变量。由于def是语句,因此它能出现在任何可以出现语句的地方。例如:

    name = input("please input your name:")
    if name == "Nicholas Zhao Si":
        def func():
            print("尼古拉斯·赵四")
    else:
        def func():
            print("杂鱼")
    func()
    

    上面的代码中在if-else语句的子句中定义了函数。代码的执行结果如下所示:

    zy@zy-PC:/media/zy/新加卷1/学习/Python$ python3 test.py 
    please input your name:zy
    杂鱼
    zy@zy-PC:/media/zy/新加卷1/学习/Python$ python3 test.py 
    please input your name:Nicholas Zhao Si
    尼古拉斯·赵四
    

    代码的执行结果说明了确实是当python执行到def语句的时候才会创建函数对象,并赋值给变量(函数名)。接下来,通过赋值操作,共享引用同一个函数对象。例如:

    name = input("please input your name:")
    if name == "Nicholas Zhao Si":
        def func():
            print("尼古拉斯·赵四")
    else:
        def func():
            print("杂鱼")
    funb = func     # func赋值给funb,它们引用同一个函数对象
    funb()
    

    程序执行结果如下所示,表明使用func和funb没有任何区别,它们是共享引用。

    zy@zy-PC:/media/zy/新加卷1/学习Python$ python3 test.py 
    please input your name:zy
    杂鱼
    zy@zy-PC:/media/zy/新加卷1/学习/Python$ python3 test.py 
    please input your name:Nicholas Zhao Si
    尼古拉斯·赵四
    

    因此,函数名和普通的变量名没有任何区别,它可以赋值给其他变量名,或者是保存在列表,元组之中等。

    return

    上面定义的函数没有return语句,但是这并不意味函数没有返回值。实际上,没有return语句的函数,返回值默认是None,例如:

    def func():
        print("666")
    
    
    ret = func()    # 接受函数返回值
    print(ret)  
    

    执行代码将会打印函数返回值,结果如下:

    666
    None
    

    可以看到,即使没有return语句,python的函数也会默认返回None,这点需要特别注意。回顾一下,列表,字典,集合这样的允许原地修改的对象,它们的某些方法,实际上没有return语句,但是会默认返回None,因此初学python的人,可能会犯如下的致命错误。

    L = [1,2,3]
    L = L.append(4)    # 错误使用,这将导致L的值变为None
    print(L)
    

    我们可以执行这段代码,结果如下:

    None
    

    return语句是可选的,并不是必须的,代码执行到return语句的时候,函数调用结束,并把结果返回到调用处。例如:

    def add(x, y):
        return x + y
    
    
    res1 = add(1, 2)
    print(res1)
    res2 = add('a', 'b')
    print(res2)
    

    程序执行结果如下所示:

    3
    ab
    

    add函数的这种“适应性”,有一个新的名词“鸭子类型”来称呼这种多态性。

    鸭子类型

    鸭子类型是说,有一只鸟(甚至可以是其他东西),它游起来像鸭子,叫起来像鸭子,走起来也像鸭子,等等。那么它就是鸭子。换而言之,我们不关心它是否是鸭子,而是关心它的行为像不像鸭子。这种多态行为其实也是新瓶装老酒。毕竟“已有的事,后必再有;已行的事,后必再行。日光之下,并无新事。”
    鸭子类型是多态的一种形式,在这种形式中,不管对象属于哪个类,也不管声明的具体接口是什么,只要对象实现了相应的方法,函数就可以在对象上执行操作。

    局部变量

    函数内的所有变量都是局部变量(包括函数参数),这些变量在函数被调用的时候创建,并在函数结束的时候销毁。例如:

    >>> def func(r):
    ...     PI = 3.14
    ...     return PI * r * r
    ... 
    >>> PI
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    NameError: name 'PI' is not defined
    >>> func(3)
    28.259999999999998
    

    PI这个变量只能在函数内部使用,在外部使用会出错,因为函数内部的所有变量都是局部变量。

    上一篇:没有了
    下一篇:没有了