作为一名长期使用Python进行开发的工程师,我经常遇到需要快速理解并实现特定功能的场景。Python以其简洁优雅的语法和丰富的生态系统,成为解决各类编程问题的首选工具。本文将通过几个典型示例,展示如何用Python实现常见功能,并深入解析其中的编程思路和技巧。
这些示例涵盖了数据处理、自动化脚本、算法实现等日常开发中的高频需求。每个示例都经过实际项目验证,包含完整的代码实现和详细的解释说明。无论你是Python初学者还是有一定经验的开发者,都能从中获得实用的编程方法和优化技巧。
文件批量重命名是日常工作中经常遇到的需求。比如摄影师需要按日期序列整理照片,或者开发人员需要统一规范项目文件名。手动操作不仅效率低下,还容易出错。
Python的os和pathlib模块提供了强大的文件系统操作能力,结合正则表达式可以实现灵活的文件名匹配和替换。我们将设计一个工具,能够:
python复制import os
import re
from pathlib import Path
def batch_rename_files(directory, pattern, replacement):
"""
批量重命名目录中的文件
:param directory: 目标目录路径
:param pattern: 需要替换的模式(正则表达式)
:param replacement: 替换后的内容
"""
for filename in os.listdir(directory):
if re.search(pattern, filename):
filepath = Path(directory) / filename
new_name = re.sub(pattern, replacement, filename)
new_path = filepath.parent / new_name
filepath.rename(new_path)
print(f"Renamed: {filename} -> {new_name}")
# 使用示例
batch_rename_files(
"/path/to/photos",
r"IMG_(\d{4})(\d{2})(\d{2})",
r"Vacation_\1-\2-\3"
)
提示:在实际项目中,可以扩展为GUI工具或命令行工具,增加文件过滤、预览、撤销等功能。
真实世界的数据往往存在各种问题:
Python的pandas库提供了高效的数据处理能力,特别适合这类数据清洗任务。
python复制import pandas as pd
def clean_data(raw_data):
"""
数据清洗流程
:param raw_data: 原始DataFrame
:return: 清洗后的DataFrame
"""
# 处理缺失值
df = raw_data.copy()
df.fillna({
'age': df['age'].median(),
'income': df['income'].mean()
}, inplace=True)
# 统一格式
df['phone'] = df['phone'].str.replace(r'\D', '', regex=True)
df['email'] = df['email'].str.lower()
# 处理异常值
df = df[(df['age'] > 0) & (df['age'] < 120)]
# 去重
df.drop_duplicates(subset=['email'], keep='last', inplace=True)
return df
# 使用示例
data = pd.read_csv('raw_data.csv')
cleaned_data = clean_data(data)
cleaned_data.to_csv('cleaned_data.csv', index=False)
Python有多种HTTP请求库可供选择:
对于常规API调用,requests是最佳选择。
python复制import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def request_with_retry(url, params=None, max_retries=3):
"""
带重试机制的API请求
:param url: 请求URL
:param params: 查询参数
:param max_retries: 最大重试次数
:return: 响应数据
"""
session = requests.Session()
retries = Retry(
total=max_retries,
backoff_factor=1,
status_forcelist=[500, 502, 503, 504]
)
session.mount('https://', HTTPAdapter(max_retries=retries))
try:
response = session.get(url, params=params, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
return None
# 使用示例
data = request_with_retry(
"https://api.example.com/data",
params={"page": 1, "limit": 100}
)
Python中的并发编程主要有三种方式:
python复制from concurrent.futures import ThreadPoolExecutor
import time
def process_item(item):
"""模拟处理单个项目的耗时操作"""
time.sleep(0.5) # 模拟IO操作
return f"processed_{item}"
def batch_process(items, max_workers=4):
"""
使用线程池批量处理项目
:param items: 待处理项目列表
:param max_workers: 最大线程数
:return: 处理结果列表
"""
results = []
with ThreadPoolExecutor(max_workers=max_workers) as executor:
future_to_item = {
executor.submit(process_item, item): item
for item in items
}
for future in concurrent.futures.as_completed(future_to_item):
item = future_to_item[future]
try:
result = future.result()
results.append(result)
except Exception as e:
print(f"Item {item} generated an exception: {e}")
return results
# 使用示例
items = [f"item_{i}" for i in range(10)]
processed_items = batch_process(items)
print(processed_items)
装饰器是Python中强大的元编程工具,常用于:
python复制import time
from functools import wraps
def timer(func):
"""统计函数执行时间的装饰器"""
@wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
end = time.perf_counter()
print(f"{func.__name__} executed in {end - start:.4f} seconds")
return result
return wrapper
def retry(max_attempts=3, delay=1):
"""失败重试装饰器"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
attempts = 0
while attempts < max_attempts:
try:
return func(*args, **kwargs)
except Exception as e:
attempts += 1
if attempts == max_attempts:
raise
time.sleep(delay)
return wrapper
return decorator
# 使用示例
@timer
@retry(max_attempts=2)
def fetch_data(url):
"""模拟获取数据"""
if "example" not in url:
raise ValueError("Invalid URL")
return "sample data"
data = fetch_data("http://test.com")
算法是编程基础,面试和实际开发中经常遇到。我们以经典的"两数之和"问题为例,展示不同解法的Python实现。
python复制def two_sum_naive(nums, target):
"""
暴力解法 - O(n^2)时间复杂度
:param nums: 数字列表
:param target: 目标和
:return: 满足条件的索引对
"""
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
return []
def two_sum_hash(nums, target):
"""
哈希表解法 - O(n)时间复杂度
:param nums: 数字列表
:param target: 目标和
:return: 满足条件的索引对
"""
num_map = {}
for i, num in enumerate(nums):
complement = target - num
if complement in num_map:
return [num_map[complement], i]
num_map[num] = i
return []
# 使用示例
nums = [2, 7, 11, 15]
target = 9
print(two_sum_naive(nums, target)) # 输出: [0, 1]
print(two_sum_hash(nums, target)) # 输出: [0, 1]
python复制# 使用cProfile分析代码性能
import cProfile
def slow_function():
total = 0
for i in range(100000):
total += i * i
return total
# 性能分析
profiler = cProfile.Profile()
profiler.enable()
slow_function()
profiler.disable()
profiler.print_stats(sort='time')
在实际项目中,我通常会先编写清晰可读的代码,然后在性能关键路径上应用这些优化技巧。过度优化往往会降低代码可维护性,需要权衡取舍。