Python_day_05_装饰器

本文介绍了函数在Python中的多种用途,包括作为变量、高阶函数(map、reduce、filter)的应用,以及装饰器的概念。还详细讲解了匿名函数的使用方法,并通过实例展示了如何利用这些高级特性简化代码。

函数本身也可以赋值给变量,即:变量可以指向函数。
函数名其实就是指向函数的变量!

1.高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另
一个函数作为参数,这种函数就称之为高阶函数。

2.map函数

map() 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依
次作用到序列的每个元素,并把结果作为新的 list 返回。
map() 作为高阶函数,把运算规则抽象了.

map
print map(abs, [-1, 10, 20, 30, -100])

def fun(x):
    return  x**2+100
print map(fun, range(5))

3.reduce函数

reduce 把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接
收两个参数,reduce 把结果继续和序列的下一个元素做累积计算。

def add(x, y):
    return x + y

range(5)  - [0, 1, 2, 3, 4]  - add(add(add(add(0,1),2),3),4)  -  10
print reduce(add, range(5))

4.filter函数

filter() 也接收一个函数和一个序列。和 map() 不同的时,
filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True
还是 False 决定保留还是丢弃该元素。

filter,第一个参数function,返回值必须是Bool值;
print filter(lambda x: x % 2 == 0, range(1,20))

def isPrime(n):
    for i in range(2, n):
        if n % i == 0:
            return  False
    else:
        return True
li = range(200,301)
print filter(isPrime, li)

4.sorted函数

排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速
排序,排序的核心是比较两个元素的大小。通常规定如下:

x < y, return -1
x == y, return 0
x > y, return 1

sorted
li.sort()

由小到大排序;

print sorted([91, 2, 23])

由大到小排序

print sorted([91, 2, 23], reverse=True)

忽略大小写的排序;

users = ['adam', 'LISA', 'barT', 'Adam']

def ignore_cmp(s1, s2):
    s1 = s1.upper()
    s2 = s2.upper()
    return cmp(s1, s2)

print sorted(users, cmp=ignore_cmp)

5.匿名函数

•当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
•关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数
• 匿名函数有只能有一个表达式,不用写 return ,返回值就是该表达式的结果。
• 因为匿名函数没有名字,不必担心函数名冲突。 此外,匿名函数也是一个函数对
象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数;
1. 匿名函数的关键字为 lambda, 冒号前面是形式参数, 冒号后面是返回值;
2. 匿名函数的形式参数可以是: 必选, 默认, 可变, 关键字参数.

f = lambda x, y=2, *args, **kwargs : (x*y,args, kwargs)
print f(2,3,4,5,6,7, a=1, b=2, c=3)

指定key值进行排序

goods = [
    ['001', u'笔记本电脑', 4000, 20],
    ['002', u'苹果', 2, 100],
    ['003', u'小米手机', 2999, 10]
]

goods是一个可迭代对象;iterable;
lambda a: a[3]是一个匿名函数;
a = ['001', u'笔记本电脑', 4000, 20] ---》 20
a = ['002', u'苹果', 2, 100]  --> 100
a = ['003', u'小米手机', 2999, 10]  --> 10
a = sorted(goods, key=lambda a: a[3])

for i in a:
    print i

6.装饰器

•装饰器就是用来装饰函数。
• 想要增强原有函数的功能;
• 但不希望修改now()函数的定义;
• 在代码运行期间动态增加功能的方式;

<think>我们正在讨论Python中的@classmethod装饰器。根据用户的问题,他们想了解这个装饰器的作用和使用方法。根据引用,我们知道: - @classmethod用于定义类方法,该方法绑定到类而非实例(引用[1]) - 类方法的第一个参数是类本身,通常命名为cls(引用[2]) - 类方法可以访问类变量,但不能访问实例变量(因为不依赖于实例) - 类方法常用于创建工厂方法,用于创建类的实例(引用[3]) 现在,我们将按照用户要求的结构化方式回答,并生成相关问题。 注意:在回答中,我们将使用中文,并确保数学表达式(如果有)按照系统指令格式化。由于本问题不涉及数学公式,我们主要关注代码示例和解释。</think>### Python @classmethod 装饰器详解 #### 一、核心作用 1. **创建类方法**:将普通方法转换为类方法,使其**绑定到类本身**而非实例(引用[2]) ```python class MyClass: @classmethod def class_method(cls): # cls 自动接收类本身 return cls.__name__ ``` 2. **访问类级属性**:通过 `cls` 参数直接访问类变量(引用[4]) ```python class Counter: count = 0 @classmethod def increment(cls): cls.count += 1 # 修改类级变量 ``` 3. **替代构造函数**:实现多种对象创建方式(工厂模式) ```python class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day @classmethod def from_string(cls, date_str): # 替代构造函数 year, month, day = map(int, date_str.split('-')) return cls(year, month, day) # 创建新实例 ``` #### 二、与实例方法对比 | 特性 | 类方法 (`@classmethod`) | 实例方法 | |--------------|------------------------------|-------------------| | 第一个参数 | `cls` (类对象) | `self` (实例对象) | | 调用方式 | 类名直接调用 `MyClass.method()` | 需实例化后调用 | | 访问权限 | 仅访问类属性 | 可访问实例属性 | | 内存占用 | 类加载时创建,单份存在 | 每实例独立存在 | #### 三、典型使用场景 1. **工厂模式**(引用[3]) ```python class Car: def __init__(self, model): self.model = model @classmethod def electric_car(cls): return cls("Tesla Model 3") # 创建特定类型实例 ``` 2. **类状态管理** ```python class Config: _settings = {} @classmethod def set_config(cls, key, value): cls._settings[key] = value ``` 3. **继承场景多态**(引用[5]) ```python class Parent: @classmethod def create(cls): return cls() # 子类调用时返回子类实例 class Child(Parent): pass obj = Child.create() # 返回Child实例而非Parent ``` #### 四、与@staticmethod区别 - `@classmethod` 接收 `cls` 参数,可访问/修改类状态 - `@staticmethod` 无隐式参数,相当于普通函数(引用[3]) ```python class Utilities: @staticmethod def validate_email(email): # 无需访问类/实例 return "@" in email ``` > **最佳实践**:当方法需要访问类属性或创建类实例时使用 `@classmethod`;当方法独立于类状态时用 `@staticmethod`(引用[3])
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值