Python基础(十四)------函数与装饰器

目录

一、概述

a. 用于管理和增强函数和类的行为

b. 提供一种在函数或类定义中插入自动运行代码的机制

c.特点:
	更明确的语法
	更高的代码可维护性
	更好的一致性

二、编写

a. 函数基础

	将函数赋给变量
	将函数作为参数来传递
def add(x,y):
    print(x+y)
 
def action(x,y,func):
    return func(x,y)
 
action(1,2,add)
action(1,2,lambda x,y:print(x+y)) #匿名函数作参数
action1 = add #将函数赋给变量(委托函数)
action1(1,2)
3
3
3
函数嵌套及跨域访问
 
def action():
    def add(x,y):
        print(x+y)
    return add
 
action()(1,2)
#有括号是返回函数的执行结果,没有括号是返回一个函数对象
3
def func_1():
    x = 10
    def func_2():
        x = 20
        print(x)
    return func_2()
 
func_1()
可见,在上述程序中,func_2()函数使用的是自身函数内的变量x而非外层变量。若想使用外层变量,则要用nonloacl声明
def func_1():
    x = 10
    def func_2():
        nonlocal x 
        print(x)
    return func_2()
 
func_1()
10

b. 函数定义装饰器

def p_decorator(func): #用函数定义一个装饰器
    def wrapper(*args,**kwargs): #这个参数组合代表任意类型任意数量的参数
        return '<p>'+func(*args,**kwargs)+'</p>'
    return  wrapper
 
@p_decorator
def get_text():
    return 'hello man'
 
@p_decorator
def get_upper(text):
    return text.upper()
 
 
if __name__ == '__main__':
    print(get_text())
    # html = p_decorator(get_text)
    # print(html())
<p>hello man</p>
<p>WWW.BAIDU.COM</p>

c. 类定义装饰器

(在修饰类中的方法时由于self参数重复出现,易起冲突)

class P:
    def __init__(self,func):
        self.func = func
    def __call__(self, *args, **kwargs):
        return '<p>'+self.func(*args, **kwargs)+'</p>'
 
@P
def get_upper(text):
    return text.upper()
 
if __name__ == '__main__':
    print(get_upper('www.baidu.com'))
<p>WWW.BAIDU.COM</p>

d. 参数化装饰器

让装饰器更具有通用性
def tags(tag):
    def tag_decorator(func):
        def wrapper(*args, **kwargs):
            return f'<{tag}>{func(*args, **kwargs)}</{tag}>'
        return wrapper
    return tag_decorator
 
# def div_decorator(func):
#     def wrapper(*args, **kwargs):
#         return '<div>{}</div>'.format(func(*args, **kwargs))
#     return wrapper
 
@tags('div')
@tags('p') #优先内侧修饰器
def get_upper(text):
    return text.upper()
 
if __name__ == '__main__':
    print(get_upper('www.baidu.com'))
<div><p>WWW.BAIDU.COM</p></div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值