- 作用域:
python的作用域一共有4种,分别是:
L(local)局部作用域
E(Enclosing)闭包函数外的函数中
G(Global)全局作用域
B(Built-in)内建作用域
以L、E、G、B、的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),在找不到就会去全局找,再者去内建中找。
python除了def/class/lambda外,其他如:if/elif/else try/except for/while并不能改变其作用域。定义在他们之内的变量,外部还是可以访问
if True:
a = 'tom'
print(a)
try:
b = 'bob'
except:
pass
print(b)
for i in range(1):
c = 'huahua'
print(c)
while True:
d = 'xiaoming'
break
print(d)
在def/class/lambda内进行赋值,就变成了其局部的作用域,局部作用域会覆盖全局作用域,但不会影响全局作用域。
- 高阶函数
1.函数名可作为参数传递
2.函数名可以复制给其他变量
3.函数名可以作为返回值
def foo(func):
print(func)
def bar():
print('xixi')
foo(bar())
# 函数名作为参数传递
def foo():
return bar
def bar():
print('bar')
#函数名作为返回值
b = foo()
# 将bar复制给b
b()
- 闭包
闭包的定义:如果在一个内部函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包
def func(a):
def sum(b):
return a + b
return sum
a = func(1)
print(a(3))
这里面调用func的时候就产生了一个闭包--inner_func,并且该闭包持有自由变量--name,因此这也意味着,当函数func的生命周期结束之后,name这个变量依旧存在,因为他被闭包引用了,所以不会被回收,闭包延长了局部变量的生命周期
- 装饰器
装饰器本质上也是一个函数,装饰器函数用来修饰其他函数,在不改变原函数代码的情况下为函数增加功能而无需修改调用方式。
import time
def time_consuming(func):
def inner(name):
start_time = time.time()
func(name)
end_time = time.time()
return '耗时',end_time - start_time
return inner
@time_consuming #这一步相当于func = time_consuming(func(name))
def func(name):
print('我的名字是',name)
print(func('bob')) #在这里调用func实际上是执行了show_time 函数里的inner函数
- 得益于 python 强大的功能,python 的函数可以像普通对象一样存在,可以作为参数传递给另一个函数也可以被 重新赋值,比如
def func3(): print('1234')
func3()
print(type(func3))
func3 = '1234' print(func3) print(type(func3))
- 装饰器将需要修饰的功能函数作为参数传入==>意味着装饰器需要接受一个参数,我们将需要修饰的函数作为 参数传入
装饰器内置一个函数并返回这个内置函数 在内置函数中调用需要修饰的功能函数(这里用到了参数),并增加新功能
网友评论