python函数调用顺序高阶函数嵌套函数闭包详解

Posted bkwxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python函数调用顺序高阶函数嵌套函数闭包详解相关的知识,希望对你有一定的参考价值。

 

一:函数调用顺序:其他高级语言类似,Python 不允许在函数未声明之前,对其进行引用或者调用
错误示范:

def foo():
    print in the foo
    bar()
    
foo()

报错:
in the foo

Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    foo()
  File "<pyshell#12>", line 3, in foo
    bar()
NameError: global name bar is not defined

 

def foo():
    print foo
    bar()
foo() #这里bar还没有定义,这里就执行foo这个函数
def bar(): 
  
print bar
报错:NameError:
global name bar is not defined

 

正确示范:(注意,python为解释执行,函数foo在调用前已经声明了bar和foo,所以bar和foo无顺序之分)

 

def bar():
    print in the bar
def foo():
    print in the foo
    bar()
    
foo()

def foo():
    print in the foo
    bar()
def bar():
    print in the bar
foo()

 

二:高阶函数

满足下列条件之一就可成函数为高阶函数

  1. 某一函数当做参数传入另一个函数中

  2. 函数的返回值包含n个函数,n>0

     

高阶函数示范:

def bar():
    print in the bar
def foo(func):
    res=func()
    return res
foo(bar)

高阶函数的牛逼之处:

def foo(func):
    return func

print Function body is %s %(foo(bar))
print Function name is %s %(foo(bar).func_name)
foo(bar)()
#foo(bar)() 等同于bar=foo(bar)然后bar()
bar=foo(bar)
bar()

三:内嵌函数和变量作用域:

定义:在一个函数体内创建另外一个函数,这种函数就叫内嵌函数(基于python支持静态嵌套域)

函数嵌套示范:

def foo():
    def bar():
        print in the bar

    bar()

foo()
# bar()

局部作用域和全局作用域的访问顺序

x=0
def grandpa():
    # x=1
    def dad():
        x=2
        def son():
            x=3
            print x
        son()
    dad()
grandpa()

局部变量修改对全局变量的影响

y=10
# def test():
#     y+=1
#     print y

def test():
    # global y
    y=2
    print y

test()
print y


def dad():
    m=1
    def son():
        n=2
        print --->,m + n
    print -->,m
    son()
dad()

 

四:闭包:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是 closure
def counter(start_num=0):
    count=[start_num]
    def incr():
        count[0]+=1
        return count[0]
    return incr

print counter()
print counter()()
print counter()()
c=counter()
print c()
print c()

 




以上是关于python函数调用顺序高阶函数嵌套函数闭包详解的主要内容,如果未能解决你的问题,请参考以下文章

Python基础高阶函数+函数嵌套+闭包 ==装饰器

Python函数作用域嵌套函数闭包函数高阶函数及装饰器的理解

Python--高阶函数函数嵌套名称空间及变量作用域闭包装饰器

python全栈学习总结六:装饰器

python11 装饰器与闭包

装饰器详解