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

Python 编程小技巧

这里为您总结一些实用且地道的 Python 编程技巧,从基础到进阶。

🎯 基础必备技巧

  1. 多重赋值与序列解包
# 传统方式
a = 1
b = 2
c = 3# Pythonic 方式
a, b, c = 1, 2, 3# 交换变量值
a, b = b, a  # 不需要临时变量# 解包列表/元组
numbers = [1, 2, 3, 4, 5]
first, *middle, last = numbers
print(first)   # 1
print(middle)  # [2, 3, 4]
print(last)    # 5
  1. 列表推导式 (List Comprehensions)
# 传统方式
squares = []
for x in range(10):squares.append(x**2)# Pythonic 方式
squares = [x**2 for x in range(10)]# 带条件的推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0]# 嵌套循环
matrix = [[1, 2], [3, 4], [5, 6]]
flattened = [num for row in matrix for num in row]  # [1, 2, 3, 4, 5, 6]
  1. 字典与集合推导式
# 字典推导式
square_dict = {x: x**2 for x in range(5)}  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}# 交换键值对
inverted = {v: k for k, v in square_dict.items()}# 集合推导式
unique_squares = {x**2 for x in [1, 2, 2, 3, 3, 3]}  # {1, 4, 9}

🔧 实用操作技巧

  1. enumerate 获取索引和值
fruits = ['apple', 'banana', 'cherry']# 传统方式(不推荐)
for i in range(len(fruits)):print(i, fruits[i])# Pythonic 方式
for i, fruit in enumerate(fruits):print(i, fruit)# 指定起始索引
for i, fruit in enumerate(fruits, start=1):print(i, fruit)  # 从1开始计数
  1. zip 并行迭代多个序列
names = ['Alice', 'Bob', 'Charlie']
scores = [85, 92, 78]for name, score in zip(names, scores):print(f"{name}: {score}")# 转换为字典
score_dict = dict(zip(names, scores))  # {'Alice': 85, 'Bob': 92, 'Charlie': 78}
  1. 使用 collections 模块
from collections import defaultdict, Counter# defaultdict - 自动初始化字典值
word_count = defaultdict(int)
for word in ['apple', 'banana', 'apple']:word_count[word] += 1  # 不会报 KeyError# Counter - 计数神器
words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
word_counts = Counter(words)
print(word_counts.most_common(2))  # [('apple', 3), ('banana', 2)]

⚡ 高效编程技巧

  1. 使用 any() 和 all()
numbers = [1, 3, 5, 7, 9]# 检查是否有偶数
has_even = any(x % 2 == 0 for x in numbers)  # False# 检查是否都是奇数
all_odd = all(x % 2 == 1 for x in numbers)   # True
  1. 使用 set 去重和快速查找
# 列表去重(保持顺序)
original = [3, 1, 2, 3, 4, 2, 1]
unique = list(dict.fromkeys(original))  # [3, 1, 2, 4]# 快速成员检查
large_list = list(range(1000000))
large_set = set(large_list)# 列表查找(慢)
print(999999 in large_list)  # O(n)# 集合查找(快)
print(999999 in large_set)   # O(1)
  1. 使用 get() 方法安全访问字典
person = {'name': 'Alice', 'age': 25}# 不安全的方式
# city = person['city']  # KeyError!# 安全的方式
city = person.get('city', 'Unknown')  # 返回 'Unknown'
age = person.get('age')               # 返回 25

🎨 代码优化技巧

  1. 使用 with 语句管理资源
# 自动关闭文件
with open('file.txt', 'r') as file:content = file.read()
# 文件在这里自动关闭# 自定义上下文管理器
from contextlib import contextmanager@contextmanager
def timer():import timestart = time.time()yieldprint(f"耗时: {time.time() - start:.2f}秒")with timer():# 执行一些操作time.sleep(1)
  1. 使用生成器节省内存
# 列表(占用内存)
def get_numbers_list(n):return [x for x in range(n)]  # 一次性生成所有数字# 生成器(节省内存)
def get_numbers_gen(n):for x in range(n):yield x  # 按需生成# 使用
for num in get_numbers_gen(1000000):  # 几乎不占内存if num > 10:break
  1. 使用 args 和 kwargs
def flexible_function(*args, **kwargs):print(f"位置参数: {args}")print(f"关键字参数: {kwargs}")flexible_function(1, 2, 3, name='Alice', age=25)
# 位置参数: (1, 2, 3)
# 关键字参数: {'name': 'Alice', 'age': 25}

🚀 高级技巧

  1. 使用 walrus operator (海象运算符 := )
# Python 3.8+
while (line := input("输入内容: ")) != "quit":print(f"你输入了: {line}")# 在列表推导式中使用
data = [1, 2, 3, 4, 5]
results = [y for x in data if (y := x * 2) > 5]  # [6, 8, 10]
  1. 使用 functools.lru_cache 缓存结果
from functools import lru_cache@lru_cache(maxsize=None)
def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)# 第一次计算会慢,后续相同参数会直接从缓存返回
print(fibonacci(100))  # 快速返回结果
  1. 使用 dataclasses 简化类定义
from dataclasses import dataclass@dataclass
class Person:name: strage: intcity: str = "Unknown"  # 默认值# 自动生成 __init__, __repr__, __eq__ 等方法
person = Person("Alice", 25)
print(person)  # Person(name='Alice', age=25, city='Unknown')

💡 调试与测试技巧

  1. 使用 assert 进行断言
def calculate_discount(price, discount):assert 0 <= discount <= 1, "折扣必须在0-1之间"assert price >= 0, "价格不能为负"return price * (1 - discount)
  1. 使用 strrepr
class Point:def __init__(self, x, y):self.x = xself.y = ydef __str__(self):return f"Point({self.x}, {self.y})"def __repr__(self):return f"Point(x={self.x}, y={self.y})"p = Point(3, 4)
print(str(p))   # Point(3, 4) - 用户友好
print(repr(p))  # Point(x=3, y=4) - 开发者友好

📝 总结建议

  1. 写Pythonic的代码:利用语言特性,避免"翻译"其他语言的写法
  2. 善用标准库:Python 有"内置电池",很多问题都有现成解决方案
  3. 注重可读性:代码是写给人看的,偶尔才给机器执行
  4. 适时优化:先写正确的代码,再考虑优化性能
  5. 多写文档字符串:用 “”“注释”"" 说明函数/类的用途

这些技巧会让你的 Python 代码更简洁、高效和专业!


文章转载自:

http://zIZ0FoeZ.krhkn.cn
http://Tgsz7p32.krhkn.cn
http://Aq79P2Ua.krhkn.cn
http://ql9hUYNK.krhkn.cn
http://qvhF1keb.krhkn.cn
http://x1Edk1cm.krhkn.cn
http://tpwlLQTG.krhkn.cn
http://BfHuo1xz.krhkn.cn
http://drJ7m4Hh.krhkn.cn
http://P4qjRDC1.krhkn.cn
http://LiiSKkNH.krhkn.cn
http://Sdz4HxfZ.krhkn.cn
http://qDz71U8o.krhkn.cn
http://nZ7KZWLY.krhkn.cn
http://q29a6WB7.krhkn.cn
http://49BN3t4U.krhkn.cn
http://EoB9W6JR.krhkn.cn
http://kV8ggRn6.krhkn.cn
http://BDd7vi58.krhkn.cn
http://noIVFmnw.krhkn.cn
http://tONFK0dB.krhkn.cn
http://eU2xK5UY.krhkn.cn
http://4uJzcFDx.krhkn.cn
http://MsNCvC4y.krhkn.cn
http://Zf2slC0Y.krhkn.cn
http://WqdyAiZ1.krhkn.cn
http://mupa7moK.krhkn.cn
http://VFGMTpK0.krhkn.cn
http://MObOkCmu.krhkn.cn
http://gRSUdqD6.krhkn.cn
http://www.dtcms.com/a/376115.html

相关文章:

  • JVM新生代内存溢出怎么解决?
  • 《C++进阶之STL》【set/map 模拟实现】
  • elementUI表格高度异常问题排查思路
  • 光谱相机的图像模式
  • Spring Boot + MyBatis-Plus 单数据源多线程事务一致性实践
  • 考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
  • Spring Boot `@Service` 互相调用全攻略:`@Autowired` vs `@Resource`
  • MySQL数据导出避坑指南:如何选择正确的工具并设计安全的备份策略?
  • 《算法闯关指南:优选算法-双指针》--01移动零,02复写零
  • ACD智能分配:轮流分配和排序上限分配的设置
  • DevOps实战(6) - 使用Arbess+GitHub+SonarQube实现Java项目自动化部署
  • 《WINDOWS 环境下32位汇编语言程序设计》第15章 注册表和INI文件
  • 【硬件-笔试面试题-81】硬件/电子工程师,笔试面试题(知识点:详细讲讲同步时钟与异步时钟通信)
  • 双RFSOC47DR-16通道5GSPS ADC采集模块
  • Linux学习笔记】信号的产生和用户态和内核态
  • SpringMvc常见问题
  • 在 CentOS 系统上实现定时执行 Python 邮件发送任务
  • 认知语义学对人工智能自然语言处理的影响与启示
  • 基于「YOLO目标检测 + 多模态AI分析」的植物病害检测分析系统(vue+flask+数据集+模型训练)
  • Chaos Mesh / LitmusChaos 混沌工程:验证 ABP 的韧性策略
  • 《C++ 基础进阶:内存开辟规则、类型转换原理与 IO 流高效使用》
  • AI在人力资源场景中的落地
  • 动态规划篇(背包问题)
  • 线程亲和性(Thread Affinity)
  • 三层交换机实现vlan互通
  • 【项目】在AUTODL上使用langchain实现《红楼梦》知识图谱和RAG混合检索(三)知识图谱和路由部分
  • MyBatis基础到高级实践:全方位指南(上)
  • 开始 ComfyUI 的 AI 绘图之旅-RealESRGAN图生图之图像放大(四)
  • [HUBUCTF 2022 新生赛]help
  • Matlab机器人工具箱6.1 导入stl模型——用SerialLink描述