def __process_by_python(self):
maximum_change = float('<STR_LIT>')<EOL>iteration = <NUM_LIT:0><EOL>if self.__observer is not None:<EOL><INDENT>initial_clusters = self.__update_clusters()<EOL>self.__observer.notify(initial_clusters, self.__centers.tolist())<EOL><DEDENT>while maximum_change > self.__tolerance and iteration < self.__itermax:<EOL><INDENT>self.__clusters = self.__update_clusters()<EOL>updated_centers = self.__update_centers()  <EOL>if self.__observer is not None:<EOL><INDENT>self.__observer.notify(self.__clusters, updated_centers.tolist())<EOL><DEDENT>maximum_change = self.__calculate_changes(updated_centers)<EOL>self.__centers = updated_centers    <EOL>iteration += <NUM_LIT:1><EOL><DEDENT>self.__calculate_total_wce()<EOL>
!
        @brief Performs cluster analysis using python code.