page contents

写了5年Python还在用for循环?这4个进阶写法让你的代码少一半、快一倍

很多人写Python代码三五年,还是在用同一套写法。循环里套if,列表反复遍历,函数参数写成一大串。代码能跑,可读性差,改起来费劲。换个思路,同样的事情可以写得更少,跑得更快。

 attachments-2026-09-DT659Jy06abb18a387e8c.png

很多人写Python代码三五年,还是在用同一套写法。循环里套if,列表反复遍历,函数参数写成一大串。代码能跑,可读性差,改起来费劲。换个思路,同样的事情可以写得更少,跑得更快。

 看一个例子。你要从一个列表里挑出所有偶数,然后每个数乘以2。新手写法是建个空列表,写for循环,里面判断取模,再append。这段代码没错,但占了四行。用列表推导式,一行搞定。

 推导式不是语法糖,它把循环和条件判断收进一个表达式,解释器执行起来比手动append快,因为省掉了方法查找和属性调用的开销。列表推导式还能嵌套条件,比如同时过滤偶数和大于10的数,写两个if就行。 

 字典和集合也有推导式,用法一样。 

 再说生成器。你处理一个百万行的日志文件,用readlines全部读进内存,机器直接卡死。生成器表达式把方括号换成圆括号,一次只产出一个值,内存占用恒定。

 更关键的是,生成器可以暂停。你写一个函数,里面用yield返回数据,调用时不会立刻执行,每次next才走到下一个yield。这个特性用来做数据管道很自然。读文件、解析行、过滤、输出,用生成器串起来,代码像流水线,每个环节只关心自己的活。 

 函数参数是另一个容易写乱的地方。有人喜欢写def process(a, b, c, d, e),调用时得对着位置数。用关键字参数,调用方写清楚哪个值给哪个参数,顺序无关。 

默认参数要小心,别用可变对象。def add_item(item, lst=[])这个写法,lst只在函数定义时创建一次,第二次调用会看到上次加进去的东西。正确做法是默认值写None,函数体里判断再建新列表。 

 星号参数也有用,*args收位置参数,**kwargs收关键字参数,写装饰器或者包装函数时绕不开。 

 装饰器本身值得单独说。它就是一个函数,接收函数,返回新函数。你写个计时器装饰器,套在任何函数前面,就能打印执行时间。不用改原函数一行代码。functools.wraps得加上,不然被装饰函数的元信息会丢。装饰器带参数的话,外面再包一层,结构变成三层函数嵌套。看懂这个模式,很多库的源码就不难读了。

 上下文管理器管资源释放。with open('file') as f这种写法,退出代码块时自动关文件,出异常也关。你自己写的类要实现__enter__和__exit__,就能用with语句。 

 更省事的办法是用contextlib.contextmanager装饰一个生成器函数,yield之前是进入逻辑,yield之后是清理逻辑。数据库连接、锁、临时目录,都适合这么管。 

异常处理别写except: pass。出错了你根本不知道。至少把异常类型写清楚,比如except ValueError。多个异常类型可以写元组。else子句在没异常时执行,finally不管有没有异常都执行。raise from保留原始异常的上下文,调试时能看清调用链。自定义异常类继承Exception就行,别继承BaseException,那个是给系统退出信号用的。 

 字符串拼接在循环里别用加号。每次加号都建新字符串,数据量大时慢得明显。用列表收集片段,最后join。 

格式化用f-string,比百分号和format都直观,变量直接嵌在字符串里,还能写表达式。f-string里调用函数、做运算都行。性能上f-string也最快,因为它在编译时就被处理了。 

 路径操作别拼字符串。os.path.join能处理不同系统的分隔符,但更推荐pathlib。Path对象用除号拼路径,read_text和write_text读写文件,glob找匹配文件,mkdir建目录。路径存在性检查用exists方法,判断是文件还是目录用is_file和is_dir。这些方法名一看就懂,比os模块那堆函数名清楚。

 数据累加用sum、min、max这些内置函数,它们用C实现,比手写循环快。any和all做布尔判断,短路的特性让它们遇到第一个满足条件的元素就停。enumerate同时拿索引和值,zip同时遍历多个序列。这些内置函数写出来短,意图也明确。

 字典取值用get方法,给个默认值,键不存在也不报错。setdefault更进一步,键不存在时设默认值并返回。Counter统计频次,一行解决词频统计。defaultdict当键不存在时自动创建默认值,省掉判断。这些都在collections模块里,标准库自带,不用装东西。 

代码写短不是目的,写清楚才是。短的前提是别人能看懂,自己过两周还能改。上面这些写法在团队里推广,得先统一风格。有人觉得推导式嵌套三层看不清,那就拆开写。工具是拿来用的,不是拿来炫的。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

  • 发表于 2026-09-29 09:47
  • 阅读 ( 41 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2484 篇文章

作家榜 »

  1. Pack 2484 文章
  2. 轩辕小不懂 2403 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 216 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章