code: def iterable(i, exclude=(string_types, dict, NotIterable)):
      
      try:
          iter(i)
      except TypeError:
          return False
      if exclude:
          return not isinstance(i, exclude)
      return True
docs: Return a boolean indicating whether ``i`` is SymPy iterable.
      True also indicates that the iterator is finite, i.e. you e.g.
      call list(...) on the instance.
  
      When SymPy is working with iterables, it is almost always assuming
      that the iterable is not a string or a mapping, so those are excluded
      by default. If you want a pure Python definition, make exclude=None. To
      exclude multiple items, pass them as a tuple.
  
      See also: is_sequence
  
      Examples
      ========
  
      >>> from sympy.utilities.iterables import iterable
      >>> from sympy import Tuple
      >>> things = [[1], (1,), set([1]), Tuple(1), (j for j in [1, 2]), {1:2}, '1', 1]
      >>> for i in things:
      ...     print('%s %s' % (iterable(i), type(i)))
      True <... 'list'>
      True <... 'tuple'>
      True <... 'set'>
      True <class 'sympy.core.containers.Tuple'>
      True <... 'generator'>
      False <... 'dict'>
      False <... 'str'>
      False <... 'int'>
  
      >>> iterable({}, exclude=None)
      True
      >>> iterable({}, exclude=str)
      True
      >>> iterable("no", exclude=str)
      False