面向对象与高级特性
1. 定义类方法(实例方法)实现求和
class Calculator:
def __init__(self, num1, num2):
# 初始化实例属性
self.num1 = num1
self.num2 = num2
def add(self):
# 实例方法求和
return self.num1 + self.num2
# 使用示例
calc = Calculator(5, 7)
print(calc.add()) # 输出:12
2. 单例模式实现
class Singleton:
_instance = None # 类属性保存唯一实例
def __new__(cls, *args, **kwargs):
# 控制实例化过程
if not cls._instance:
# 创建新实例并初始化
cls._instance = super().__new__(cls)
cls._instance.init_settings(*args, **kwargs)
return cls._instance
def init_settings(self, value=None):
# 初始化方法(只执行一次)
self.value = value
# 使用示例
s1 = Singleton(value=100)
s2 = Singleton(value=200)
print(s1 is s2) # 输出:True(是同一个实例)
print(s1.value) # 输出:100(后续初始化不会覆盖值)
print(s2.value) # 输出:100
关键点说明:
-
类与对象示例:
-
使用
__init__
初始化实例属性 -
通过实例方法
add()
实现求和功能 -
需要先创建实例再调用方法
-
-
单例模式实现:
-
通过重写
__new__
方法控制实例创建 -
使用类属性
_instance
存储唯一实例 -
添加
init_settings()
方法实现安全初始化 -
所有实例共享相同的对象ID
-
后续实例化不会覆盖已存在的属性值
-
3. Lambda匿名函数
# 基础语法:lambda 参数: 表达式
square = lambda x: x**2 # 平方函数
cube = lambda x: x**3 # 立方函数
print(square(5)) # 输出 25
print(cube(3)) # 输出 27
# 直接结合使用(无需定义变量)
numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, numbers))
print(squared) # 输出 [1, 4, 9, 16]
4.高阶函数应用
map() - 数据转换
# 将字符串列表转为大写
words = ["hello", "world", "python"]
upper_words = list(map(str.upper, words))
print(upper_words) # 输出 ['HELLO', 'WORLD', 'PYTHON']
# 结合lambda计算字符长度
lengths = list(map(lambda s: len(s), words))
print(lengths) # 输出 [5, 5, 6]
filter() - 数据筛选
# 过滤偶数
numbers = [12, 7, 24, 5, 19]
even_numbers = list(filter(lambda x: x%2 == 0, numbers))
print(even_numbers) # 输出 [12, 24]
# 筛选包含字母"o"的单词
words = ["apple", "orange", "banana", "kiwi"]
filtered = list(filter(lambda s: 'o' in s, words))
print(filtered) # 输出 ['orange']
reduce() - 数据聚合
from functools import reduce
# 计算累加和
numbers = [1, 2, 3, 4, 5]
sum_result = reduce(lambda a,b: a + b, numbers)
print(sum_result) # 输出 15
# 计算阶乘(5! = 120)
factorial = reduce(lambda a,b: a * b, range(1,6))
print(factorial) # 输出 120
5.关键特性说明:
功能 | 特点 | 典型场景 |
---|---|---|
Lambda函数 | - 单行匿名函数 - 不能包含复杂逻辑 - 自动返回表达式结果 | 临时简单操作 回调函数参数 |
map() | - 返回迭代器 - 对每个元素执行相同操作 - 输入输出长度相同 | 数据格式转换 批量计算 |
filter() | - 返回迭代器 - 输出长度 ≤ 输入长度 - 根据布尔条件过滤元素 | 数据清洗 条件筛选 |
reduce() | - 需要导入functools - 逐步累积计算结果 - 最终返回单个聚合值 | 求和/求积 统计聚合操作 |
6. 最佳实践建议:
优先使用内置函数:
# 比lambda更高效的写法
sum_result = sum(numbers) # 替代reduce加法
filtered = [x for x in numbers if x%2==0] # 列表推导式替代filter
避免过度嵌套:
# 不推荐的写法
result = reduce(lambda x,y: x+y,
filter(lambda x: x>10,
map(lambda x: x*2, numbers)))
# 推荐的清晰写法
doubled = [x*2 for x in numbers]
filtered = [x for x in doubled if x>10]
result = sum(filtered)
-
函数式编程适用场景:
- 数据管道处理(ETL)
- 流式数据处理
- 需要高度声明式代码的场合