我们可以将函数视为“一等公民”
函数可以赋值给变量
函数可以作为函数的参数
函数可以作为函数的返回值
高阶函数的用法:(filter、map以及它们的替代品)items1 =
list(map(lambda
x: x **
2, filter(lambda
x: x %
2, range(1, 10))))
items2 =
[x **
2
for
x in
range(1, 10) if
x %
2]
闭包和作用域问题:
Python搜索变量的LEGB顺序(Local --> Embedded --> Global --> Built-in)
global和nonlocal关键字的作用:
global:声明或定义全局变量(要么直接使用现有的全局作用域的变量,要么定义一个变量放到全局作用域)。
nonlocal:声明使用嵌套作用域的变量(嵌套作用域必须存在该变量,否则报错)。
装饰器函数(使用装饰器和取消装饰器)
例子:输出函数执行时间的装饰器
def
record_time(func):
"""自定义装饰函数的装饰器"""
@wraps(func)
def
wrapper(*args, **kwargs):
start =
time()
result =
func(*args, **kwargs)
print(f'{func.__name__}: {time() - start}秒')
return
result
return
wrapper
如果装饰器不希望跟print函数耦合,可以编写带参数的装饰器。from
functools import
wraps
from
time import
time
def
record(output):
"""自定义带参数的装饰器"""
def
decorate(func):
@wraps(func)
def
wrapper(*args, **kwargs):
start =
time()
result =
func(*args, **kwargs)
output(func.__name__, time() -
start)
return
result
return
wrapper
return
decorate
from
functools import
wraps
from
time import
time
class
Record():
"""自定义装饰器类(通过__call__魔术方法使得对象可以当成函数调用)"""
def
__init__(self, output):
self.output =
output
def
__call__(self, func):
@wraps(func)
def
wrapper(*args, **kwargs):
start =
time()
result =
func(*args, **kwargs)
self.output(func.__name__, time() -
start)
return
result
return
wrapper
说明:由于对带装饰功能的函数添加了@wraps装饰器,可以通过func.__wrapped__方式获得被装饰之前的函数或类来取消装饰器的作用。
例子:用装饰器来实现单例模式。
from
functools import
wraps
def
singleton(cls):
"""装饰类的装饰器"""
instances =
{}
@wraps(cls)
def
wrapper(*args, **kwargs):
if
cls
not
in
instances:
instances[cls] =
cls(*args, **kwargs)
return
instances[cls]
return
wrapper
@singleton
class
President():
"""总统(单例类)"""
pass
说明:上面的代码中用到了闭包(closure),不知道你是否已经意识到了。还没有一个小问题就是,上面的代码并没有实现线程安全的单例,如果要实现线程安全的单例应该怎么做呢?from
functools import
wraps
from
threading import
Lock
def
singleton(cls):
"""线程安全的单例装饰器"""
instances =
{}
locker =
Lock()
@wraps(cls)
def
wrapper(*args, **kwargs):
if
cls
not
in
instances:
with locker:
if
cls
not
in
instances:
instances[cls] =
cls(*args, **kwargs)
return
instances[cls]
return
wrapper
以上就是本次分享的全部内容了,不知大家对小编讲述的Python函数使用方法感觉怎么样?