嵌套函数和装饰器
再认识函数
def opt(func, iterable):
... r= [func(i) for i in iterable]
... return r
...
lst = opt(abs, [-1,-2,-3])
lst
[1, 2, 3]
嵌套函数
将函数作为返回值
- 返回内置函数对象
- 返回自定义函数对象
def my_func(bf):
... return bf
...
mabs = my_func(abs)
mabs(-3)
3
def add(x,y): return x+y
...
madd = my_func(add)
madd(1,2)
3
一个函数体内定义另一个函数
- 内嵌函数不会随着外层函数调用而被执行
- 内嵌的函数不能在外层函数所在的空间调用
- 返回内嵌的函数对象
变量作用域
作用域指的是变量的有效范围
- 函数内部的局部(本地)作用域
- 嵌套函数内
- 嵌套函数之外但在外层函数之内
- 全局作用域
- 内置作用域
划分作用域
- 根据代码结构划分不同级别的作用域:块级、函数、类、模块、包
- python中,if语句块、for语句块、with上下文管理器等等不能划分变量作用于
- 函数和类改变作用域,def,class,lambda
搜索规则
变量掩盖和修改
x = 3
def g():print(x)
...
g()
3
def g2():
... x = 2
... print(x)
...
g2()
2
x
3
两个关键词
global:指定当前变量使用外部的全局变量
nonlocal:内层函数中的变量它外一层函数的变量
- global修饰的变量可能事先并未存在与全局作用域内,但nonlocal修饰的变量必须已经存在于外层函数,不能只存在与全局
x = 1
def foo():
... x+=2
... return x
...
foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment
def foo():
... x = 3
... x+=2
... return x
...
foo
<function foo at 0x00000208AD58EDC0>
foo()
5
x
1
def foo():
... global x
... x+=2
... return x
mabs = my_func(abs)
>>> mabs(-3)
3
>>> def add(x,y): return x+y
...
>>> madd = my_func(add)
>>> madd(1,2)
3
一个函数体内定义另一个函数
- 内嵌函数不会随着外层函数调用而被执行
- 内嵌的函数不能在外层函数所在的空间调用
- 返回内嵌的函数对象
## 变量作用域
作用域指的是变量的有效范围
- 函数内部的局部(本地)作用域
1. 嵌套函数内
2. 嵌套函数之外但在外层函数之内
- 全局作用域
- 内置作用域
划分作用域
- 根据代码结构划分不同级别的作用域:块级、函数、类、模块、包
- python中,if语句块、for语句块、with上下文管理器等等不能划分变量作用于
- 函数和类改变作用域,def,class,lambda
##搜索规则
##变量掩盖和修改
>>> x = 3
>>> def g():print(x)
...
>>> g()
3
>>> def g2():
... x = 2
... print(x)
...
>>> g2()
2
>>> x
3
##两个关键词
global:指定当前变量使用外部的全局变量
nonlocal:内层函数中的变量它外一层函数的变量
- global修饰的变量可能事先并未存在与全局作用域内,但nonlocal修饰的变量必须已经存在于外层函数,不能只存在与全局
>>> x = 1
>>> def foo():
... x+=2
... return x
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment
>>> def foo():
... x = 3
... x+=2
... return x
...
>>> foo
<function foo at 0x00000208AD58EDC0>
>>> foo()
5
>>> x
1
>>> def foo():
... global x
... x+=2
... return x
...
foo()
5
xmabs(-3)
3
>>> def add(x,y): return x+y
...
>>> madd = my_func(add)
>>> madd(1,2)
3
一个函数体内定义另一个函数
- 内嵌函数不会随着外层函数调用而被执行
- 内嵌的函数不能在外层函数所在的空间调用
- 返回内嵌的函数对象
## 变量作用域
作用域指的是变量的有效范围
- 函数内部的局部(本地)作用域
1. 嵌套函数内
2. 嵌套函数之外但在外层函数之内
- 全局作用域
- 内置作用域
划分作用域
- 根据代码结构划分不同级别的作用域:块级、函数、类、模块、包
- python中,if语句块、for语句块、with上下文管理器等等不能划分变量作用于
- 函数和类改变作用域,def,class,lambda
##搜索规则
##变量掩盖和修改
>>> x = 3
>>> def g():print(x)
...
>>> g()
3
>>> def g2():
... x = 2
... print(x)
...
>>> g2()
2
>>> x
3
##两个关键词
global:指定当前变量使用外部的全局变量
nonlocal:内层函数中的变量它外一层函数的变量
- global修饰的变量可能事先并未存在与全局作用域内,但nonlocal修饰的变量必须已经存在于外层函数,不能只存在与全局
>>> x = 1
>>> def foo():
... x+=2
... return x
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment
>>> def foo():
... x = 3
... x+=2
... return x
...
>>> foo
<function foo at 0x00000208AD58EDC0>
>>> foo()
5
>>> x
1
>>> def foo():
... global x
... x+=2
... return x
...
>>> foo()
5
>>> x
5
简单的装饰器
从嵌套函数到语法糖@
从没有参数的装饰器
def strong_deco(f):
def wrapper(name):
return '<strong>{0}<strong>'.format(f(name))
return wrapper
@strong_deco
def book(name):
return name
my = strong_deco(book)
book = my('Learn Python')
b = book('Learn Python')
print(b)
装饰器就是将函数作为对象传入到嵌套函数的参数内