pow():数学计算的"加速器"
1. 基础用法:高效幂运算与取模
pow()函数用于计算幂运算,支持三参数形式进行高效的取模计算。
# 基本幂运算
print(f"2的3次方: {pow(2, 3)}") # 输出: 8
print(f"10的-2次方: {pow(10, -2)}") # 输出: 0.01
print(f"5的0次方: {pow(5, 0)}") # 输出: 1
# 使用取模运算(更高效 than pow(base, exp) % mod)
print(f"2^10 mod 100: {pow(2, 10, 100)}") # 输出: 24
print(f"3^7 mod 13: {pow(3, 7, 13)}") # 输出: 3
# 等价运算符对比
base, exp, mod = 2, 10, 100
print(f"pow()方式: {pow(base, exp, mod)}")
print(f"传统方式: {base ** exp % mod}") # 效率较低
# 复数结果
print(f"负数的分数次幂: {pow(-9, 0.5)}") # 输出: (1.8369701987210297e-16+3j)
2. 实际应用:加密算法和数学计算
class MathUtils:
@staticmethod
def modular_exponentiation(base, exponent, modulus):
"""模幂运算(加密算法常用)"""
if modulus == 1:
return 0
return pow(base, exponent, modulus)
@staticmethod
def fast_power_sequence(n, modulus=None):
"""快速生成幂序列"""
if modulus:
return [pow(2, i, modulus) for i in range(n)]
else:
return [pow(2, i) for i in range(n)]
@staticmethod
def calculate_compound_interest(principal, rate, periods):
"""计算复利"""
return principal * pow(1 + rate, periods)
@staticmethod
def modular_inverse(a, modulus):
"""计算模逆元(数论重要概念)"""
# 使用 pow(a, -1, modulus) 计算a在模modulus下的逆元
try:
return pow(a, -1, modulus)
except ValueError as e:
return f"计算失败: {e}"
# 使用示例
math_utils = MathUtils()
# 加密计算示例(RSA基础)
print("=== 加密算法示例 ===")
message = 65 # 原始消息
public_key = (17, 3233) # (e, n)
encrypted = math_utils.modular_exponentiation(message, public_key[0], public_key[1])
print(f"加密结果: {encrypted}")
# 快速幂序列
power_seq = math_utils.fast_power_sequence(5, 100)
print(f"2的幂序列模100: {power_seq}")
# 复利计算
investment = 1000 # 本金
annual_rate = 0.05 # 年利率
years = 10
future_value = math_utils.calculate_compound_interest(investment, annual_rate, years)
print(f"投资未来价值: {future_value:.2f}")
# 模逆元计算
print(f"38在模97下的逆元: {math_utils.modular_inverse(38, 97)}")
# 验证: 23 * 38 % 97 = 1
print(f"验证: {23 * 38 % 97 == 1}")
print():输出控制的"万能打印机"
1. 基础用法:灵活控制输出格式
print()函数是Python中最常用的输出工具,支持丰富的格式化选项。
# 基本输出
print("Hello, World!") # 输出: Hello, World!
# 多参数输出
name = "Alice"
age = 25
print("姓名:", name, "年龄:", age) # 默认空格分隔
# 自定义分隔符
print("2023", "10", "15", sep="-") # 输出: 2023-10-15
# 自定义结束符
print("开始执行...", end="")
print("完成!") # 输出: 开始执行...完成!
# 输出到文件
with open("output.txt", "w") as f:
print("这是文件内容", file=f)
# 强制刷新缓冲区
import time
print("正在处理...", end="", flush=True)
time.sleep(2)
print("完成!")
2. 实际应用:高级日志和进度显示
class AdvancedPrinter:
def __init__(self, timestamp=False, level_prefix="", file=None):
self.timestamp = timestamp
self.level_prefix = level_prefix
self.file = file
def log(self, *args, **kwargs):
"""带格式的日志输出"""
import datetime
parts = []
if self.timestamp:
parts.append(f"[{datetime.datetime.now().strftime('%H:%M:%S')}]")
if self.level_prefix:
parts.append(f"[{self.level_prefix}]")
# 构建输出内容
content = " ".join(str(arg) for arg in args)
if parts:
print(" ".join(parts), content, file=self.file, **kwargs)
else:
print(content, file=self.file, **kwargs)
def progress_bar(self, current, total, length=50):
"""显示进度条"""
percent = current / total
filled_length = int(length * percent)
bar = "█" * filled_length + "─" * (length - filled_length)
print(f"\r[{bar}] {percent:.1%}", end="", flush=True)
if current == total:
print() # 完成后换行
def table_print(self, data, headers=None):
"""表格形式输出"""
if not data:
return
# 自动检测列宽
if headers:
all_data = [headers] + data
else:
all_data = data
# 计算每列最大宽度
col_widths = []
for i in range(len(all_data[0])):
col_width = max(len(str(row[i])) for row in all_data)
col_widths.append(col_width)
# 打印表头
if headers:
header_line = " | ".join(f"{header:<{width}}" for header, width in zip(headers, col_widths))
print(header_line)
print("-" * len(header_line))
# 打印数据行
for row in data:
row_line = " | ".join(f"{str(item):<{width}}" for item, width in zip(row, col_widths))
print(row_line)
# 使用示例
printer = AdvancedPrinter(timestamp=True, level_prefix="INFO")
# 日志输出
printer.log("应用程序启动")
printer.log("加载配置文件", "config.ini")
# 进度条演示
print("进度条演示:")
total = 100
for i in range(total + 1):
printer.progress_bar(i, total)
import time
time.sleep(0.02) # 模拟处理时间
# 表格输出
data = [
["Alice", 25, "Engineer"],
["Bob", 30, "Designer"],
["Charlie", 35, "Manager"]
]
headers = ["姓名", "年龄", "职位"]
print("\n员工信息表:")
printer.table_print(data, headers)
property:属性管理的"智能网关"
1. 基础用法:创建托管属性
property类用于创建托管属性,实现getter、setter和deleter方法。
# 基础property使用
class Temperature:
def __init__(self):
self._celsius = 0
def get_celsius(self):
"""获取摄氏度"""
return self._celsius
def set_celsius(self, value):
"""设置摄氏度(带验证)"""
if value < -273.15:
raise ValueError("温度不能低于绝对零度")
self._celsius = value
def del_celsius(self):
"""删除温度值"""
print("删除温度值")
del self._celsius
# 创建property属性
celsius = property(get_celsius, set_celsius, del_celsius, "温度属性")
# 使用示例
temp = Temperature()
temp.celsius = 25 # 调用set_celsius
print(f"当前温度: {temp.celsius}°C") # 调用get_celsius
try:
temp.celsius = -300 # 会触发验证错误
except ValueError as e:
print(f"错误: {e}")
# 查看文档字符串
print(f"属性文档: {Temperature.celsius.__doc__}")
2. 实际应用:数据验证和属性装饰器
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
self._email = None
@property
def name(self):
"""姓名属性(只读)"""
return self._name.title() # 返回格式化名称
@property
def age(self):
"""年龄属性"""
return self._age
@age.setter
def age(self, value):
"""年龄设置器(带验证)"""
if not isinstance(value, int):
raise TypeError("年龄必须是整数")
if value < 0 or value > 150:
raise ValueError("年龄必须在0-150之间")
self._age = value
@property
def email(self):
"""邮箱属性"""
return self._email
@email.setter
def email(self, value):
"""邮箱设置器(带格式验证)"""
import re
if not re.match(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', value):
raise ValueError("邮箱格式不正确")
self._email = value
@email.deleter
def email(self):
"""邮箱删除器"""
print("清空邮箱地址")
self._email = None
@property
def is_adult(self):
"""计算属性:是否成年"""
return self._age >= 18
def __repr__(self):
return f"Person(name='{self.name}', age={self.age})"
# 使用示例
print("=== 属性管理示例 ===")
person = Person("alice smith", 25)
# 使用属性
print(f"姓名: {person.name}") # 自动调用getter,输出: Alice Smith
print(f"年龄: {person.age}")
print(f"是否成年: {person.is_adult}")
# 设置属性
person.age = 30 # 调用setter,通过验证
person.email = "alice@example.com" # 调用setter,通过验证
print(f"邮箱: {person.email}")
# 属性验证测试
try:
person.age = 200 # 会触发验证错误
except ValueError as e:
print(f"年龄设置错误: {e}")
try:
person.email = "invalid-email" # 会触发验证错误
except ValueError as e:
print(f"邮箱设置错误: {e}")
# 删除属性
del person.email # 调用deleter
print(f"删除后邮箱: {person.email}")
总结
通过本文的详细解析,我们深入了解了Python中三个重要的内置功能:
- 1. pow(base, exp, mod) - 数学计算的加速器,加密算法、数论计算、性能优化
- 2. print(*objects, sep, end, file, flush) - 输出控制的万能打印机,调试输出、日志记录、进度显示
- 3. property(fget, fset, fdel, doc) - 属性管理的智能网关,数据验证、计算属性、API设计
版本兼容性提醒:
- • Python 3.8+:
pow()支持负指数和关键字参数 - • Python 3.3+:
print()新增flush参数 - • Python 3.5+:
property的文档字符串可写 - • Python 3.13+:
property新增__name__属性