当前位置:首页 > Python > 正文

Python内置函数详解(七)property、range、repr等7个函数详解 | Python高级编程教程

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函数的银行家舍入规则

发表评论