def is_iterable(item,protect=[str]):
    """
    Returns a boolean value describing whether an input 
    *item* can be considered iterable. *protect* is a 
    list of types which should be explicitly considered
    non-iterable.  The default is *[str,unicode].
    Types *str* or *unicode* of length 1 are explicitly
    protected, as are items of type *dict*.  This is
    largely a helper function for larger functions
    *apply_to_array*, *where_true*, and other iterable
    functions.
    """
    
    #protect non iterables from iteration
    for type_to_protect in protect:
        if isinstance(item,type_to_protect): return False
    #specifically protect strings of length one, they will never trip TypeError just by indexing them over and over
    if isinstance(item,str) and len(item)==1: return False
    elif isinstance(item,type): return False
    elif isinstance(item,dict): return False
    try: iter(item); return True
    except TypeError: return False