code: def read_points(features):
      
      for feature in features:
  
          if isinstance(feature, (tuple, list)) and len(feature) == 2:
              yield feature
  
          elif hasattr(feature, '__geo_interface__'):
              # An object implementing the geo_interface
              try:
                  # Could be a Feature...
                  geom = feature.__geo_interface__['geometry']
                  for pt in _geom_points(geom):
                      yield pt
              except KeyError:
                  # ... or a geometry directly
                  for pt in _geom_points(feature.__geo_interface__):
                      yield pt
  
          elif 'type' in feature and feature['type'] == 'Feature':
              # A GeoJSON-like mapping
              geom = feature['geometry']
              for pt in _geom_points(geom):
                  yield pt
  
          elif 'coordinates' in feature:
              geom = feature
              for pt in _geom_points(geom):
                  yield pt
  
          else:
              raise InvalidFeatureError(
                  "Unknown object: Not a GeoJSON Point feature or "
                  "an object with __geo_interface__:\n{0}".format(feature))
docs: Iterable of features to a sequence of point tuples
      Where "features" can be either GeoJSON mappings
      or objects implementing the geo_interface