page contents

写了五年Python还在if堆代码?这15个习惯让你少踩一半坑

有人写Python五六年,代码还是靠if堆。换个人接手,看半天不知道逻辑在哪。问题不在语法,在习惯。下面这些做法,你直接拿去用,能少踩很多坑。

attachments-2026-10-5JWjkeCP6ac45322e315c.png

有人写Python五六年,代码还是靠if堆。换个人接手,看半天不知道逻辑在哪。问题不在语法,在习惯。下面这些做法,你直接拿去用,能少踩很多坑。

先看一个循环。很多人写for循环喜欢先建一个空列表,再往里append。代码长这样:result = [] 然后 for x in data: result.append(x*2)。这不是错,是啰嗦。Python有推导式,一行写完:result = [x*2 for x in data]。速度还快。推导式能嵌if,比如[x for x in data if x > 0]。嵌套两层也行,但别超过两层。超过两层可读性就崩,还不如写普通循环。

字典取值是个高频动作。d = {'a': 1},取d['b']会报KeyError。很多人用if 'b' in d来判断。更省事的办法是d.get('b', 0)。get第二个参数是默认值。想删键又不想报错,用pop('b', None)。这两个方法用了就回不去。

函数参数默认值有个坑。def f(x, lst=[]): 这个空列表在函数定义时就创建了,每次调用都共享同一个。写f(1)加一个元素,再写f(2)会发现列表里有两个元素。正确做法是def f(x, lst=None): 里面判断if lst is None: lst = []。这个错误新手老手都会犯。

字符串拼接别用加号。循环里s += str(i)会反复创建新字符串。数据量大时很慢。用列表存起来,最后''.join(list)。或者直接用f-string。f'{name} is {age}'比'%s is %d' % (name, age)清楚,也比format快。f-string里能写表达式,比如f'{x*2}'。

文件读写要用with。f = open('a.txt')这样写,忘了close文件句柄就泄漏。with open('a.txt') as f: 块结束自动关。读大文件别用read(),内存扛不住。用for line in f: 逐行处理。写文件用'w'模式,追加用'a'。二进制加'b'。

异常处理别裸奔。try: 后面跟except: 什么都抓,KeyboardInterrupt也抓,Ctrl+C都停不下来。应该抓具体异常,比如except ValueError: 或者except (IOError, OSError):。捕获后至少打个日志或者raise,别pass吞掉。吞异常等于埋雷。

列表和字典的深浅拷贝要分清。a = [1, [2]],b = a,改b[1][0] = 3,a也变。这是引用。想复制一层用b = a.copy()或者b = list(a)。但里层列表还是共享。要完全独立用import copy; b = copy.deepcopy(a)。数据嵌套深了必须deepcopy。

enumerate和zip是遍历神器。for i, v in enumerate(data): 同时拿索引和值。for x, y in zip(list1, list2): 并行遍历两个列表。zip在Python 3返回迭代器,省内存。两个列表长度不等时,zip按短的截断。要按长的用itertools.zip_longest。

生成器省内存。读一个10G日志文件,用列表推导式会撑爆内存。用(x for x in f)或者写生成器函数,yield返回。生成器只能遍历一次,遍历完就空了。需要多次遍历就存成列表或者重新创建。

装饰器不难。写个@timer记录函数耗时:def timer(func): def wrapper(*args, **kwargs): start = time.time(); r = func(*args, **kwargs); print(time.time()-start); return r; return wrapper。加在函数头上就行。functools.wraps要加上,不然函数名变成wrapper。

类型注解不是必须,但加上好处多。def add(a: int, b: int) -> int: 一看就知道参数和返回类型。IDE能提示,mypy能检查。不强制,但团队协作时省沟通成本。注解不影响运行,Python照样动态。

路径操作别拼字符串。用os.path.join('dir', 'file.txt')或者pathlib.Path('dir') / 'file.txt'。跨平台不会因为斜杠出错。pathlib更现代,Path对象有read_text()、write_text()、exists()、mkdir()等方法。

变量交换不用临时变量。a, b = b, a一行搞定。背后是元组打包解包。同样,函数返回多个值也是元组:def f(): return 1, 2。接收时x, y = f()。

这些技巧单个看都不难。串起来用,代码量能减三成,出错概率降一半。你平时写Python最头疼哪块?列表处理、文件读写还是并发?

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

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

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2026-10-06 09:47
  • 阅读 ( 20 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2484 篇文章

作家榜 »

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