码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-12-05 12:19:15      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:创建   nbsp   line   ace   bsp   func   局部变量   turn   int   

 

一:函数调用顺序:其他高级语言类似,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函数调用顺序、高阶函数、嵌套函数、闭包详解

标签:创建   nbsp   line   ace   bsp   func   局部变量   turn   int   

原文地址:https://www.cnblogs.com/bkwxx/p/10069502.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!