作用域、函数嵌套和闭包
- 使用嵌套函数要注意一点就是作用域问题,inside() 函数是内嵌在 outside() 函数中的,只有 outside() 调用,在外边或者别的函数体里是无法对其进行调用的。
def outside():
print('I am outside!')
def inside():
print('I am inside!')
#错误的引用
inside()
#正确的引用
inside()
outside()
- 下面这个例子没看懂。为什么代码 A 没有报错,但代码 B 却报错了?
代码A
def outside():
var = 5
def inside():
var = 3
print(var)
inside()
outside()
代码B
def outside():
var = 5
def inside():
print(var)
var = 3
inside()
outside()
仔细一看报错的内容是:UnboundLocalError: local variable 'var' referenced before assignment,说的是变量 var 没有被定义就拿来使用,肯定错啦!
这里 outside() 函数里有一个 var 变量,但要注意的是,内嵌函数 inside() 也有一个同名的变量,Python 为了保护变量的作用域,故将 outside() 的 var 变量屏蔽起来,因此此时是无法访问到外层的 var 变量的。
lambda表达式
作用
1.创建匿名函数,运行后释放函数体,不占用资源。
2.适用于执行脚本和出现一两次的函数
3.增加代码可读性
格式
g=lambda x:3*x+1
g(5)
g=lambda x,y:x*y
g(3,6)
高端一点的用法:
lambda x : x if x % 2 else None
等价于:
def is_odd(x):
if x % 2:
return x
else:
return None
BIF
filter()过滤器
- 格式1
list(filter(None,[0,1,False,True,236]))
结果:[1, True, 236]
- 格式2——求奇数
list(filter(lambda x:x%2,range(10)))
结果:[1, 3, 5, 7, 9]
map()映射
- 格式
list(map(lambda x:x*2,range(10)))
结果:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]