python 函数的本质理解

作者: Tim在路上 | 来源:发表于2018-09-30 20:46 被阅读2次

    对于习惯了Java等面向对象语言,可能会对其任何对象都可以用类来表示已经习惯,但是python语言的灵活多变可能让你感到很不习惯,对于很多骚操作很感到吃惊(:

    但是其实实际上是不能真正的理解python中的一切皆对象的概念,当你真正理解其概念后,你才会明白原来python的强大

    python 中函数与类都是对象

    python 中函数和类,甚至是模块都是对象,函数大部分情况下可以作为类来用,而且都是第一类对象,什么是第一类对象?

    第一类对象的通用特性:

    • 可作为值传递,赋值给另一个对象;
    • 可以作为元素添加到集合对象中;
    • 可以作为参数传递给其他函数;
    • 可以作为函数的返回值。

    函数赋值给变量,通过变量就可以调用

    def f1(str):
      return len(str)
    # 函数赋值给变量,通过变量就可以调用 
    temp=f1
    print temp('hello')
    

    注意这里是值传递,即使删除f1,也可以通过temp调用该函数

    def f1(str):
      return len(str)
    # 函数赋值给变量,通过变量就可以调用 
    temp=f1
    del f1
    print temp('hello')
    

    作为元素添加到集合中

    def f2(str1,str2):
       return str1+str2
    # 作为元素添加到集合中
    a=[]
    a.append(f1)
    a.append(f2)
    print a[0]('hello')
    print a[1]('hello','world')
    

    作为参数

    def func(f,str):
      return f(str)
    
    print func(f1,'hello')
    

    作为函数的返回值

    def mutiply(x,y):
      reutrn x*y
    def sub(x,y):return x-y
    def func2(i):if i==1: return mutiplyelse:return sub
    temp=func2(2)
    print temp(2,4)
    

    使用函数的对象特性

    已经知道函数就是对象.因此,对象:

    • 可以赋值给一个变量
    • 可以在其他函数里定义

    赋值在前面已经提到了,函数可以赋值给任意的变量,当作变量来使用,同时还可以在函数里定义另一个函数

    def getTalk(kind="shout"):
    
        # 在函数里定义一个函数
        def shout(word="yes"):
            return word.capitalize()+"!"
    
        def whisper(word="yes") :
            return word.lower()+"...";
    
        # 返回一个函数
        if kind == "shout":
            # 这里不用"()",我们不是要调用函数
            # 只是返回函数对象
            return shout
        else:
            return whisper
    
    # 怎么用这个特性呢?
    
    # 把函数赋值给变量
    talk = getTalk()
    
    # 可以看到"talk"是一个函数对象
    print talk
    # 输出 : <function shout at 0xb7ea817c>
    
    # 函数返回的是对象:
    print talk()
    # 输出 : Yes!
    
    # 不嫌麻烦你也可以这么用
    print getTalk("whisper")()
    # 输出 : yes...
    

    这里要注意赋值时括号的使用,括号表示调用函数,而赋值时时不需要调用函数的,
    talk = getTalk(),这里是把第一层函数赋值给了talk,,所以调用时可以talk()调用,当然也可以直接 talk=getTalk,调用时talk()()来调用

    那么这个特性也就行成了函数的嵌套与闭包

    嵌套与闭包

    函数的嵌套

    def fun1():
        def fun2():
            def fun3():
                print("Hello world!")
            return fun3
        return fun2
    a=fun1()
    # a()
    fun1()()()
    
    Hello world!
    

    函数的闭包

    闭包函数就是函数可以读取到与自己不是一个作用域的局部变量

    1.必须有一个内嵌函数
    2.内嵌函数必须引用外部函数中的变量
    3.外部函数的返回值必须是内嵌函数

    def fun1(x):
        def fun2(y):
            print(x+y)
        return fun2
    fun1(2)(3)
    5
    

    装饰器,匿名函数,map函数等都是函数的变体,都是通过这些基本特性来实现的

    相关文章

      网友评论

        本文标题:python 函数的本质理解

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