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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
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()

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄