【前言】
大家好,这里是 Charming讲Python编码小技巧 系列专栏。每天分享一个 30-seconds-of-python 仓库中的神级写法,助你告别“屎山”代码,写出让人眼前一亮的 Pythonic 风格!

1. 小技巧内容描述

你是不是经常遇到这种报错:

  • TypeError: 'int' object is not iterable
  • TypeError: '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 神级技巧!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐