嵌套函数和装饰器

嵌套函数和装饰器

再认识函数

函数

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

一个函数体内定义另一个函数

  • 内嵌函数不会随着外层函数调用而被执行
  • 内嵌的函数不能在外层函数所在的空间调用
  • 返回内嵌的函数对象

变量作用域

作用域指的是变量的有效范围

  • 函数内部的局部(本地)作用域
  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 "", line 1, in
File "", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment
def foo():
... x = 3
... x+=2
... return x
...
foo

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 "", line 1, in
File "", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment
>>> def foo():
... x = 3
... x+=2
... return x
...
>>> foo

>>> foo()
5
>>> x
1
>>> def foo():
... global x
... x+=2
... return x
...
foo()
5
x

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 "", line 1, in

File "", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment
>>> def foo():
... x = 3
... x+=2
... return x
...
>>> foo

>>> foo()
5
>>> x
1
>>> def foo():
... global x
... x+=2
... return x
...
>>> foo()
5
>>> x
5

简单的装饰器

从嵌套函数到语法糖@
从没有参数的装饰器
def strong_deco(f):
def wrapper(name):
return '{0}'.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)
装饰器就是将函数作为对象传入到嵌套函数的参数内

你可能感兴趣的:(嵌套函数和装饰器)