9.23 闭包和装饰器

1.闭包函数:把闭包函数内部的变量和函数包起来,返回闭包函数内部的函数。闭包函数也是一个函数。

def f1():
    def f2():
        print('from f2')
    return f2
res=f1()
res()   #from f2
def f1(url):
    def f2():
        print(url)
    return f2
res=f1('www.taobao.com')
res()  #www.taobao.com

两种为函数传参的方式:

a.使用参数的形式

def f1(x):
    print(x)
f1(1) #1

b.包给函数

def outter(x):
    x=1
    def inner():
        print(x)
    return inner
f=outter(1)
f() #1

2.装饰器:为被装饰器对象添加额外功能,定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外功能。

装饰器的实现必须遵守的两大原则:

a.不修改被装饰对象的源代码

b.不修改被装饰对象的调用方式

3.装饰器的使用

改变源代码

import time

def index():
    '''被装饰的函数'''
    start=time.time()
    print('welcome to index')
    time.sleep(1)
    end=time.time()
    print(f'运行时间是:{end-start}')
index()
运行结果:
welcome to index
运行时间是:1.0000569820404053

编写重复代码:

import time
def index():
    print('index')
    time.sleep(1)

def f1():
    print('f1')
    time.sleep(1)

start=time.time()
index()
end=time.time()
print(end-start)

start=time.time()
f1()
end=time.time()
print(end-start)
运行结果:
index
1.0000574588775635
f1
1.0000569820404053

第一种传参方式:改变调用方式

import time
def index():
    print('index')
    time.sleep(1)

def time_count(func):
    start = time.time()
    func()
    end=time.time()
    print(end-start)
time_count(index) 
运行结果:
index
1.0000572204589844

第二种传参方式:包给函数-外包

import time
def index():
    print('index')
    time.sleep(1)

def time_count(func):   #func是真正的index
    def wrapper():
        start = time.time()
        func()
        end=time.time()
        print(end-start)
    return wrapper

res=time_count(index)  #res==wrapper
res()
运行结果:
index
1.0010573863983154

4.完善装饰器:

wrapper 的返回值和index的返回值相同

import time
def index():
    print('index')
    time.sleep(1)
    return 123

def time_count(func):   #func是真正的index
    def wrapper():
        start = time.time()
        func()
        end=time.time()
        print(end-start)
        return res    
    return wrapper

f1=time_count(index)  #res==wrapper
res=f1()
print(res)
运行结果:
index
1.0010573863983154
123

给index传参的实现:

import time
def index():
    print('index')
    time.sleep(1)

def home(name):
    print(f'welcome {name} to home page')
    time.sleep(1)
    return name

def time_count(func):   #func是真正的index
    def wrapper(*args,**kwargs):
        start = time.time()
        res=func(*args,**kwargs)
        end=time.time()
        print(end-start)
        return res
    return wrapper

res=time_count(home) #res==wrapper
f1=res('nick')
print(f1)
运行结果:
welcome nick to home page
1.0000569820404053
nick

5.装饰器语法糖:在被装饰函数正上方,并且是单独的一行@装饰器

def time_count(func):   #func是真正的index
    def wrapper(*args,**kwargs):
        start = time.time()
        res=func(*args,**kwargs)
        end=time.time()
        print(end-start)
        return res
    return wrapper

@time_count
def index():
    print('index')
    time.sleep(1)
    return 123

@time_count
def home(name):
    print(f'welcome {name} to home page')
    time.sleep(1)
    return name

# res=time_count(home) #res==wrapper
f1=home('nick')
print(f1)

f2=index()
print(f2)
运行结果:
welcome nick to home page
1.0000572204589844
nick
index
1.0000572204589844
123

6.装饰器模板:

def deco(func):
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return wrapper

7.三层的有参装饰器:

usename_list=[]

def sanceng(role):
    def login_deco(func):
        def wrapper(*args,**kwargs):
            usename_inp=input('请输入用户名:')
            pwd_inp=input('请输入密码:')

            if usename_list:
                print('已经登录,无须重复')
                res=func(*args,**kwargs)
                return res
            with open(f'{role}_info.txt','r',encoding='utf8') as fr:
                for role_info in fr:
                    usename,pwd=role_info.strip().split(':')
                    if usename==usename_inp and pwd==pwd_inp:
                        print('登录成功')
                        usename_list.append(usename)
                        res = func(*args, **kwargs)
                        return res
                else:
                    print('登录失败')
        return wrapper
    return login_deco

@sanceng('admin')
def index (x,y):
    print('index')
    print('x,y',x,y)

    return 123

res=index(10,30)
运行结果:
请输入用户名:ldd
请输入密码:123
登录成功
index
x,y 10 30

转载于:https://www.cnblogs.com/lidandanaa/p/11574686.html

使用优化算法,以优化VMD算法的惩罚因子惩罚因子 (α) 和分解层数 (K)。 1、将量子粒子群优化(QPSO)算法与变分模态分解(VMD)算法结合 VMD算法背景: VMD算法是一种自适应信号分解算法,主要用于分解信号为不同频率带宽的模态。 VMD的关键参数包括: 惩罚因子 α:控制带宽的限制。 分解层数 K:决定分解出的模态数。 QPSO算法背景: 量子粒子群优化(QPSO)是一种基于粒子群优化(PSO)的一种改进算法,通过量子行为模型增强全局搜索能力。 QPSO通过粒子的量子行为使其在搜索空间中不受位置限制,从而提高算法的收敛速度与全局优化能力。 任务: 使用QPSO优化VMD中的惩罚因子 α 和分解层数 K,以获得信号分解的最佳效果。 计划: 定义适应度函数:适应度函数根据VMD分解的效果来定义,通常使用重构信号的误差(例如均方误差、交叉熵等)来衡量分解的质量。 初始化QPSO粒子:定义粒子的位置和速度,表示 α 和 K 两个参数。初始化时需要在一个合理的范围内为每个粒子分配初始位置。 执行VMD分解:对每一组 α 和 K 参数,运行VMD算法分解信号。 更新QPSO粒子:使用QPSO算法更新粒子的状态,根据适应度函数调整粒子的搜索方向和位置。 迭代求解:重复QPSO的粒子更新步骤,直到满足终止条件(如适应度函数达到设定阈值,或最大迭代次数)。 输出优化结果:最终,QPSO算法会返回一个优化的 α 和 K,从而使VMD分解效果最佳。 2、将极光粒子(PLO)算法与变分模态分解(VMD)算法结合 PLO的优点与适用性 强大的全局搜索能力:PLO通过模拟极光粒子的运动,能够更高效地探索复杂的多峰优化问题,避免陷入局部最优。 鲁棒性强:PLO在面对高维、多模态问题时有较好的适应性,因此适合海上风电时间序列这种非线性、多噪声的数据。 应用场景:PLO适合用于优化VMD参数(α 和 K),并将其用于风电时间序列的预测任务。 进一步优化的建议 a. 实现更细致的PLO更新策略,优化极光粒子的运动模型。 b. 将PLO优化后的VMD应用于真实的海上风电数据,结合LSTM或XGBoost等模型进行风电功率预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值