【Python神技巧】一行判断对象能不能遍历,少踩90%类型坑!
·
【前言】
大家好,这里是 Charming讲Python编码小技巧 系列专栏。每天分享一个 30-seconds-of-python 仓库中的神级写法,助你告别“屎山”代码,写出让人眼前一亮的 Pythonic 风格!
1. 小技巧内容描述
你是不是经常遇到这种报错:
TypeError: 'int' object is not iterableTypeError: 'NoneType' object is not iterable
根本原因通常是:你以为这个对象能 for 循环,结果它不能。
今天这个小技巧,直接让你在遍历前“先验明正身”:
from collections.abc import Iterable
obj = [1, 2, 3]
print(isinstance(obj, Iterable)) # True
核心思路很简单:
- 能被
for遍历的对象,通常就是可迭代对象(Iterable) - 用
isinstance(x, Iterable)先判断,再处理,代码更稳
2. 为什么这么用,并列举几个例子
为什么推荐?
- 提前拦截异常:避免程序在运行中突然
TypeError。 - 逻辑更清晰:显式写出“我只处理可迭代对象”。
- 通用性强:列表、元组、集合、字典、字符串都适用。
例子1:安全遍历输入参数
from collections.abc import Iterable
def print_items(data):
if isinstance(data, Iterable) and not isinstance(data, (str, bytes)):
for item in data:
print(item)
else:
print(data)
print_items([10, 20, 30])
print_items(99)
很多业务函数既可能收到单值,也可能收到列表。这样写,鲁棒性直接拉满。
例子2:批量处理用户输入
from collections.abc import Iterable
def normalize_input(x):
if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
return list(x)
return [x]
print(normalize_input(7)) # [7]
print(normalize_input((1, 2, 3))) # [1, 2, 3]
统一成列表后,后续流程(过滤、映射、聚合)会顺滑很多。
例子3:接口返回值兼容处理
from collections.abc import Iterable
def to_rows(result):
if result is None:
return []
if isinstance(result, Iterable) and not isinstance(result, (str, bytes, dict)):
return list(result)
return [result]
print(to_rows(None)) # []
print(to_rows(["a", "b"])) # ['a', 'b']
print(to_rows("ok")) # ['ok']
接口返回值有时是单条,有时是多条。先做可迭代判断,能减少大量边界 Bug。
今日小结:
写 Python,别等报错再补救。isinstance(x, Iterable) 这一步小判断,往往能帮你挡住线上大问题。
关注专栏,明天继续解锁一个 30-seconds-of-python 神级技巧!
更多推荐


所有评论(0)