中spline函数的⽤法_Python中函数的⽤法
我们可以将函数视为“⼀等公民”
函数可以赋值给变量
函数可以作为函数的参数
函数可以作为函数的返回值
⾼阶函数的⽤法:(filter、map以及它们的替代品)items1 =list(map(lambda x: x **2, filter(lambda x: x
%2, range(1, 10))))items2 =[x ** 2for 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 resultreturn wrapper
python单例模式如果装饰器不希望跟print函数耦合,可以编写带参数的装饰器。from functools import wrapsfrom time import timedef record(output):"""⾃定义带参数的装饰器"""def decorate(func):@wraps(func)def wrapper(*args, **kwargs):start =time()result =func(*args,
**kwargs)output(func.__name__, time() -start)return resultreturn wrapperreturn decoratefrom functools import wrapsfrom time import timeclass Record():"""⾃定义装饰器类(通过__call__魔术⽅法使得对象可以当成函数调⽤)"""def__init__(self, output):self.output =outputdef __call__(self, func):@wraps(func)def wrapper(*args, **kwargs):start =time()result =func(*args, **kwargs)self.output(func.__name__, time() -start)return resultreturn wrapper
说明:由于对带装饰功能的函数添加了@wraps装饰器,可以通过func.__wrapped__⽅式获得被装饰之前的函数或类来取消装饰器的作⽤。
例⼦:⽤装饰器来实现单例模式。
from functools import wrapsdef singleton(cls):"""装饰类的装饰器"""instances ={}@wraps(cls)def wrapper(*args, **kwargs):if cls not in instances:instances[cls] =cls(*args, **kwargs)return instances[cls]return wrapper@singletonclass President():"""总统(单例类)"""pass
说明:上⾯的代码中⽤到了闭包(closure),不知道你是否已经意识到了。还没有⼀个⼩问题就是,上⾯的代码并没有实现线程安全的单例,如果要实现线程安全的单例应该怎么做呢?from functools import wrapsfrom threading import Lockdef 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函数使⽤⽅法感觉怎么样?
欢迎爱好Python的⼈跟⼩编交流切磋⼀下!⼩编推荐⼀个学python的学习315346913
⽆论你是⼤⽜还是⼩⽩,是想转⾏还是想⼊⾏都可以来了解⼀起进步⼀起学习!内有开发⼯具,很多⼲货和技术资料分享!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。