code: def iter_find_files(directory, patterns, ignored=None):
      
      if isinstance(patterns, basestring):
          patterns = [patterns]
      pats_re = re.compile('|'.join([fnmatch.translate(p) for p in patterns]))
  
      if not ignored:
          ignored = []
      elif isinstance(ignored, basestring):
          ignored = [ignored]
      ign_re = re.compile('|'.join([fnmatch.translate(p) for p in ignored]))
      for root, dirs, files in os.walk(directory):
          for basename in files:
              if pats_re.match(basename):
                  if ignored and ign_re.match(basename):
                      continue
                  filename = os.path.join(root, basename)
                  yield filename
      return
docs: Returns a generator that yields file paths under a *directory*,
      matching *patterns* using `glob`_ syntax (e.g., ``*.txt``). Also
      supports *ignored* patterns.
  
      Args:
          directory (str): Path that serves as the root of the
              search. Yielded paths will include this as a prefix.
          patterns (str or list): A single pattern or list of
              glob-formatted patterns to find under *directory*.
          ignored (str or list): A single pattern or list of
              glob-formatted patterns to ignore.
  
      For example, finding Python files in the directory of this module:
  
      >>> files = set(iter_find_files(os.path.dirname(__file__), '*.py'))
  
      Or, Python files while ignoring emacs lockfiles:
  
      >>> filenames = iter_find_files('.', '*.py', ignored='.#*')
  
      .. _glob: https://en.wikipedia.org/wiki/Glob_%28programming%29