函数也是一个可执行对象
函数也是可执行对象这一点是理解python嵌套函数最基础的一点。 举个例子
def bar():
print('i am bar ')
def foo(f):
f()
bar()
foo(bar)
-----------
i am bar
i am bar
总结一下,就是说,函数也是一个对象。我们在定义一个函数的时候,他的参数可以引用任何一个对象。也就说明,可以引用一个函数了。
他的大体框架如下:
def opt_seq(func,seq):
r = [func(i) for i in seq]
return r
##func 指的是可以使用的函数
print(opt_seq(ord,'python'))
-----------
[112, 121, 116, 104, 111, 110]
就如ord函数这样,可以直接在函数里对python进行取ascii码。那么证明了函数中嵌套python自带函数是可行的。那如果我们自己再嵌套一个自建函数呢?外面的函数被执行,里面的函数是不是也自动被执行呢?
def foo():
def bar():
print('i am bar')
print('i am foo')
foo()
----------
i am foo
上面是一个简单的嵌套,也很容易就可以看出,嵌套函数是可行的(因为没有报错);但是为什么没写bar()呢?因为它报错了
也就是我们在调用嵌套内层的函数时,发现并没有它。那在里面写了,我们想从外面得到这个函数,应该怎么办呢?
def foo():
def bar():
print('i am bar')
return bar
a = foo()
a()
----------
i am bar
之前说了,这个bar()函数也是一个对象,那既然是一个对象,我们就把它return的方式来返回。返回到调用foo这个函数所在的位置,记住这个时候它作为对象已经替代了foo了。
那为什么直接引用bar()不行呢?这个时候就要讲到另外一个概念,作用域。
作用域
一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域
全局作用域(global):在整个程序运行环境中都可见
局部作用域:在函数、类等内部可见;局部变量使用范围不能超过其所在的局部作用域
举个例子
a=1
def f2():
print(a+1)
f2()
----------
2
****************************************
a=1
def f3():
a = a + 1
print(a)
f3()
----------
UnboundLocalError: local variable 'a' referenced before assignment
为什么第二种稍微修改就报错呢?
那是因为函数里的a只是f3里面的一个局部变量,而我们想要的a是外面的那个全局变量。
这个时候我们用global来定义(多层嵌套共用内部的变量的话,用nonlocal),把里面的a变成全局变量,那就可以了
a=1
def f3():
global a
a = a + 1
print(a)
f3()
----------
2