编程学习网 > 编程语言 > Python > 写Python总绕远路 改掉这几个习惯 代码立刻短一半
2026
09-26

写Python总绕远路 改掉这几个习惯 代码立刻短一半


很多人写Python会不自觉地绕远路。代码能跑,功能也对,就是看着别扭。这种别扭不是审美问题,是习惯问题。改掉几个习惯,代码立刻短一截,读起来也顺。

列表生成式不是炫技用的。比如要生成一个平方数列表,有人会先建空列表,再循环,再append。三步。写成[x*x for x in range(10)],一行。读的时候眼睛从左扫到右,意思就出来了。再加个条件,[x*x for x in range(10) if x % 2 == 0]。过滤和变换写在一起,逻辑不乱。有人担心嵌套生成式难读。两个for的嵌套,只要把外层循环写在前面,跟写普通循环的顺序一样,读起来没障碍。超过两个嵌套,考虑拆开,或者换成生成器表达式分步处理。

字典的get方法能省掉一堆if。比如统计词频,常见写法是:

counts = {} for word in words:     if word in counts:         counts[word] += 1     else:         counts[word] = 1 

改成counts[word] = counts.get(word, 0) + 1,逻辑一样,行数少一半。遇到需要默认值的场景,get的第二个参数直接写默认值,不用先判断键是否存在。如果默认值是个可变对象,比如空列表,别用get,用collections.defaultdict(list)。否则每次get都要写个新建的列表,浪费内存。

字符串拼接别用加号。短字符串连着加几个还行,一旦在循环里加,每次都在内存里新建对象,效率掉得厉害。用''.join(list_of_strings),先把片段收进列表,最后一次性拼。如果必须动态加,用io.StringIO,写进去再取出来。这个细节在日志拼接和报文组装里特别明显。小数据量看不出差别,数据一多,join比加号快一个数量级。

enumerate和zip是循环里的两把好手。想同时拿索引和值,别写for i in range(len(items))。for i, item in enumerate(items)直接给出索引和元素,干净。想同时遍历两个列表,别用下标去索引另一个列表。for a, b in zip(list1, list2)把两个序列拉平对齐。如果两个列表长度不一样,zip会以短的为准截断。想按长的来,用itertools.zip_longest。这个函数还能指定填充值,处理不齐的数据很方便。

函数默认参数别用可变对象。写def func(a, b=[]),这个空列表只在函数定义时创建一次。多次调用func,b会累积之前的结果。这是Python的坑,不是设计缺陷,是可变对象和默认参数结合的后果。想用空列表当默认值,写def func(a, b=None),函数体里判断if b is None: b = []。这样每次调用都是新列表。

with语句不只能开文件。任何支持上下文管理协议的对象都能用。数据库连接、锁、临时目录、甚至自定义的计时器。标准库里的contextlib.contextmanager能把一个生成器函数变成上下文管理器。比如写个计时装饰器,不用装饰器语法,用with更直观:

from contextlib import contextmanager import time  @contextmanager def timer(name):     start = time.time()     yield     print(f'{name} took {time.time() - start:.3f}s') 

用的时候with timer('loop'):,代码块跑完自动打印耗时。比用装饰器改函数定义清爽,适合临时测量某段代码。

异常处理别写裸except。except:会抓住所有异常,包括键盘中断和系统退出。这些异常不该被普通业务代码吞掉。写except Exception:,把系统级异常放过去。如果知道可能出什么错,精确捕获。比如读文件,捕FileNotFoundError和PermissionError,分开处理。不知道具体类型,至少记日志再重新抛出。吞掉异常不处理,出了问题查起来很痛苦。

路径操作统一用pathlib。别再用os.path.join拼字符串了。Path('/tmp') / 'data' / 'file.txt'用除号拼路径,跨平台。Path对象有.exists()、.read_text()、.glob()这些方法,比os模块和glob模块混着用简洁。读取文本直接Path('file.txt').read_text(),写回用.write_text(content)。需要遍历目录下所有py文件,Path('.').rglob('*.py')返回生成器,边遍历边处理。

代码块用空行隔开逻辑段。函数内部,把相关几行放一起,不相关的空一行。一个函数只做一件事。超过二十行的函数,考虑拆。拆出来的函数命名要准,名字说清楚做什么,别用process、handle这种含糊的词。读代码的人看名字就知道这步在干什么,不用跳进去看实现。

变量命名别省字母。usr不如user,tmp不如temp。省两个字母,读的时候要多想一下。缩写只在团队内约定俗成时用,比如cfg、env。循环里的计数器用i、j没问题,范围小,上下文清楚。一旦循环体超过五行,i就不够看了,改成有意义的词,比如row_index。

写完代码放一放再回看。刚写完时脑子里有完整逻辑,看不出问题。隔半天再看,很多地方会觉得别扭。觉得别扭的地方就是该改的地方。改完再跑测试,功能不变,可读性上一个台阶。

以上就是“写Python总绕远路 改掉这几个习惯 代码立刻短一半”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取