当前位置:首页>python>别再写脚本了!用好这3个Python高阶特性,让你的代码优雅10倍

别再写脚本了!用好这3个Python高阶特性,让你的代码优雅10倍

  • 2026-10-11 08:21:31
别再写脚本了!用好这3个Python高阶特性,让你的代码优雅10倍

点击上方蓝字关注我们

hello,大家好。又见面啦,我是星禾。
我最开始的时候是Java程序员,后来当了5年全职宝妈,现在all in AI赛道。专注AI基础知识和AI前沿科技分享。
最近在系统学Python进阶内容,发现有3个特性特别有意思——学会了之后真的能让代码上一个档次。它们就是装饰器、生成器、上下文管理器 ,今天就和大家聊聊这Python三件套到底怎么用。

01

装饰器:给函数穿"外套",不改代码也能加功能
你有没有遇到过这种情况:写了十几个爬虫函数,每个都要加计时、重试、代理轮换的逻辑?代码重复度真的太高了。
那这种时候,装饰器就是救星。
1.1 什么是装饰器
说白了,装饰器就是一个 "函数包装机" 。给你一个函数,它帮你包一层,加点额外功能,再还给你。原函数该干嘛还干嘛,但多了点"超能力"。
就像给手机套个壳。手机还是那个手机,但多了防摔功能。
def my_decorator(func):def wrapper():print("执行前")func()  # 调用原函数print("执行后")return wrapper@my_decoratordef say_hello():print("你好")say_hello()
运行结果 :
执行前你好执行后
`@mydecorator` 这行代码,就是给你的 `sayhello` 函数"套了个壳"。等价于 `sayhello = mydecorator(say_hello)` 。
1.2 企业级实战:计时装饰器
最实用的入门装饰器——给函数加计时功能。
import timefrom functools import wrapsdef timer(func):@wraps(func)  # 这行很重要!保留原函数信息def wrapper(args, *kwargs):start = time.time()result = func(args, *kwargs)print(f"{func.name} 耗时:{time.time() - start:.2f}秒")return resultreturn wrapper@timerdef slow_function():time.sleep(1)print("执行完毕")slow_function()
输出 :
执行完毕slow_function 耗时:1.00秒
1.3 带参数的装饰器
有时候你想让装饰器"可配置"。比如重试次数,有的函数网络不稳定想重试3次,有的只需要重试1次。
def retry(max_attempts=3, delay=1):def decorator(func):@wraps(func)def wrapper(args, *kwargs):for attempt in range(1, max_attempts + 1):try:return func(args, *kwargs)except Exception as e:if attempt == max_attempts:raiseprint(f"第{attempt}次失败,{delay}秒后重试...")time.sleep(delay)return wrapperreturn decorator@retry(max_attempts=3, delay=2)def fetch_data():pass
三层嵌套的原理 :
  • 第一层 `retry()` 接收装饰器自己的参数( `max_attempts` 、 `delay` )
  • 第二层 `decorator()` 接收被装饰的函数
  • 第三层 `wrapper()` 执行实际的包裹逻辑
1.4 那个不起眼但关键的 @wraps
我猜你注意到代码里的 `@wraps(func)` 了。这玩意儿不是摆设,它能解决一个"身份危机"。
做个实验你就懂了:
def bad_decorator(func):def wrapper():func()return wrapper@bad_decoratordef test():"""这是测试函数的文档"""passprint(test.name)  # 输出:wrapper ❌print(test.doc)   # 输出:None ❌from functools import wrapsdef good_decorator(func):@wraps(func)def wrapper():func()return wrapper@good_decoratordef test2():"""这是测试函数的文档"""passprint(test2.name)  # 输出:test2 ✅print(test2.doc)   # 输出:这是测试函数的文档 ✅
写装饰器一定带上 `@wraps`,这是专业和业余的分水岭。

02

生成器:内存友好,处理大数据不爆了
你有没有遇到过这种情况:要处理100GB的日志文件,Python直接内存爆炸?
生成器就是来解决这个问题的。
2.1 生成器 vs 列表
先看一个对比:
lst = [x*2 for x in range(1000000)]  # 占用大量内存gen = (x*2 for x in range(1000000))  # 仅创建生成器对象
关键区别 :
  • 列表:一次性把所有结果算出来,全部放进内存
  • 生成器:需要一个,算一个,用完即丢
2.2 生成器函数
用 `yield` 关键字定义生成器函数:
def countupto(max_num):count = 1while count <= max_num:yield countcount += 1for num in countupto(5):print(num)  # 1, 2, 3, 4, 5
执行原理 :
  • 调用 `countupto(5)` 不会执行函数体,而是返回一个生成器对象
  • `next()` 触发函数执行,遇到 `yield` 暂停
  • 函数状态被保存,下次 `next()` 从暂停位置继续
2.3 实战:内存友好的大文件读取
def readlargefile(filepath):"""内存友好的大文件读取"""with open(filepath, 'r') as f:for line in f:yield line.strip()for line in readlargefile('huge_log.txt'):process(line)  # 每次只处理一行

03

上下文管理器:with语句自动管理资源
写文件操作的时候,你还在手动 `f.close()` 吗?
f = open("test.txt", "r")data = f.read()f.close()with open("test.txt", "r") as f:data = f.read()
这就是上下文管理器——管理资源的生命周期,确保资源在使用前正确打开,在使用后正确关闭。
3.1 通过类实现
class FileManager:def init(self, filename, mode):self.filename = filenameself.mode = modeself.file = Nonedef enter(self):self.file = open(self.filename, self.mode)return self.filedef exit(self, exctype, excval, exc_tb):if self.file:self.file.close()return False  # 不抑制异常with FileManager("example.txt", "w") as f:f.write("Hello, World!")
3.2 用 @contextmanager 更简洁
from contextlib import contextmanagerimport time@contextmanagerdef timer(name):start = time.time()yieldprint(f"{name} 耗时: {time.time() - start:.2f}秒")with timer("数据处理"):pass
`yield` 前面的代码相当于 `enter`,后面的代码相当于 `exit`。
3.3 企业级实战:数据库事务
from contextlib import contextmanagerimport sqlite3@contextmanagerdef transaction(db_path):conn = sqlite3.connect(db_path)try:yield connconn.commit()except Exception:conn.rollback()raisefinally:conn.close()with transaction('app.db') as conn:cursor = conn.cursor()cursor.execute('UPDATE users SET name=? WHERE id=?', ('Alice', 1))

04

三件套组合使用
这三个特性组合起来,威力巨大:
@timer@retry(max_attempts=3)def fetch_page(url):with open('cache.txt', 'r') as f:return f.read()
装饰器从下往上执行: `fetch_page` → `@retry` → `@timer`

05

总结
特性
核心关键词
使用场景
装饰器
@语法糖、wraps、高阶函数
日志记录、性能监控、权限验证
生成器
yield、惰性计算、内存优化
大数据处理、无限序列
上下文管理器
with、__enter__/__exit__、资源管理
文件操作、数据库连接、锁管理
记住一个原则 :好的代码不是"能跑就行",而是"优雅、可维护、易扩展"。这三个特性,就是让你从"会写代码"到"写好代码"的阶梯。
今天的内容就到这里啦~
如果你觉得有用, 欢迎转发给身边想学Python的朋友 。
还有什么想了解的AI或编程知识? 评论区告诉我 ,咱们下期见!
🌟 往期回顾
💡 关于星禾
  • 身份:星禾
  • 经历:大厂程序员 → 全职宝妈 → 米核AI合伙人
  • 当前:all in AI赛道,专注AI前沿知识分享
  • 联系方式:cuizh002

最新文章

随机文章