python中常见的可迭代对象有:列表、元组、字典、字符串、生成器、迭代器等等。
判断一个对象是否可迭代? 通常都会导入collections库,代码如下:
>>> from collections import Iterable >>> isinstance("123", Iterable) True >>> isinstance(123, Iterable) False >>> isinstance([1,2,3], Iterable) True
那么如果不用collections库,如何判断呢?
方法一: 内置函数 hasattr()
即判断对象有否“__iter__”属性
>>> s = "123" >>> hasattr(s, "__iter__") True >>> s = 123 >>> hasattr(s, "__iter__") False >>> hasattr([1,2,3], "__iter__") True >>>
方法二: 内置函数 iter() 或 enumerate()
即判断对象能否被转换为iter对象
>>> def isIter(s): try: res = True t = iter(s) except: res = False return res >>> isIter('123') True >>> isIter(123) False >>>
附: hasattr() 详解
>>> hasattr(int,'__bool__') True >>> hasattr(int,'__iter__') False >>> dir(int)[:10] ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__'] >>> >>> '__bool__' in dir(int) True >>> '__iter__' in dir(int) False
方法三:内置函数isinstance()
在第二参数的元组里罗列出所有的可迭代对象,缺点是可能列不全
>>> obj = None >>> isinstance(obj, (str,list,dict,tuple,set,range,type(_ for _ in[]))) False >>> obj = 'string' >>> isinstance(obj, (str,list,dict,tuple,set,range,type(_ for _ in[]))) True >>>