Python内置函数详解(七) - 高阶函数与实用工具
深入解析property、range、repr、reversed、round、set和setattr七个核心内置函数
1. property() - 属性管理函数
property()
函数用于创建属性,将类方法转换为只读属性或可读写属性。它通常用作装饰器,实现面向对象编程中的封装特性。
典型应用场景
- 数据验证和过滤
- 延迟计算或惰性求值
- 访问控制(只读/读写属性)
- 兼容旧接口的属性访问
代码示例
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
"""获取半径值"""
return self._radius
@radius.setter
def radius(self, value):
"""设置半径值,并进行验证"""
if value <= 0:
raise ValueError("半径必须为正数")
self._radius = value
@property
def area(self):
"""计算圆的面积(只读属性)"""
return 3.14159 * self._radius ** 2
# 使用示例
c = Circle(5)
print(f"半径: {c.radius}") # 输出: 半径: 5
print(f"面积: {c.area:.2f}") # 输出: 面积: 78.54
c.radius = 7
print(f"新面积: {c.area:.2f}") # 输出: 新面积: 153.94
try:
c.radius = -2 # 触发异常
except ValueError as e:
print(f"错误: {e}") # 输出: 错误: 半径必须为正数
2. range() - 数字序列生成函数
range()
函数用于生成一个不可变的数字序列,常用于循环操作和列表生成。
语法形式
range(stop)
range(start, stop)
range(start, stop, step)
关键特性
- 生成惰性序列,节省内存
- 只支持整数参数
- 常用于for循环和创建列表、元组
代码示例
# 生成0-4的序列
print(list(range(5))) # [0, 1, 2, 3, 4]
# 生成5-9的序列
print(list(range(5, 10))) # [5, 6, 7, 8, 9]
# 生成0-10之间的偶数
print(list(range(0, 11, 2))) # [0, 2, 4, 6, 8, 10]
# 生成10-1的倒序
print(list(range(10, 0, -1))) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
# 在for循环中使用
for i in range(3):
print(f"第{i+1}次循环")
3. repr() - 对象表示函数
repr()
函数返回对象的可打印字符串表示形式,通常用于调试和开发。该字符串通常是有效的Python表达式,可以用于重新创建对象。
与str()的区别
- repr():面向开发者,提供精确的、无歧义的对象表示
- str():面向用户,提供可读性好的字符串表示
- 在交互式环境中,直接输入变量名会调用repr()
代码示例
import datetime
now = datetime.datetime.now()
# 使用str() - 用户友好的格式
print(str(now)) # 输出: 2023-08-15 14:30:25.123456
# 使用repr() - 开发调试格式
print(repr(now)) # 输出: datetime.datetime(2023, 8, 15, 14, 30, 25, 123456)
# 自定义类的repr
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Point({self.x}, {self.y})"
p = Point(3, 4)
print(repr(p)) # 输出: Point(3, 4)
4. reversed()
反转序列元素,返回一个反向迭代器。
nums = [1, 2, 3, 4]
rev = reversed(nums)
print(list(rev)) # [4, 3, 2, 1]
# 反转字符串
s = "Python"
print(''.join(reversed(s))) # nohtyP
5. round()
对浮点数进行四舍五入,可指定小数位数。
print(round(3.14159)) # 3
print(round(3.14159, 2)) # 3.14
print(round(2.675, 2)) # 2.67 (注意浮点精度问题)
# 处理负数
print(round(-3.5)) # -4
print(round(-4.5)) # -4
6. set()
创建无序不重复元素集,用于成员测试和去重。
# 从列表创建集合
numbers = set([1, 2, 2, 3, 4, 4])
print(numbers) # {1, 2, 3, 4}
# 集合运算
a = set('abracadabra')
b = set('alacazam')
print(a - b) # {'r', 'd', 'b'}
print(a | b) # {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
print(a & b) # {'a', 'c'}
7. setattr()
动态设置对象属性值。
class Person:
pass
p = Person()
# 设置属性
setattr(p, 'name', 'Alice')
setattr(p, 'age', 30)
print(p.name) # Alice
print(p.age) # 30
# 动态设置多个属性
attributes = {'city': 'Beijing', 'job': 'Engineer'}
for key, value in attributes.items():
setattr(p, key, value)
print(p.city) # Beijing
实际应用技巧
- 使用
property
创建智能属性,实现数据验证和计算属性 - 在内存敏感场景中使用
range
代替列表 - 为自定义类实现
__repr__
方法,提高调试效率 - 使用
reversed
高效处理大型序列反转 setattr
在动态配置和元编程中非常有用- 使用
set
进行高效的去重和集合运算 - 注意
round
函数的银行家舍入规则
发表评论