@Feedback1000: Dann ist die Aufgabenstellung vielleicht schon zu komplex wenn nicht einmal Funktionen gegeben sind. Und spätestens wenn ein Format mit eine Spezifikation/Grammatik gegegeben ist, macht es deutlich mehr Sinn sich einen darauf aufbauenden Parser zu schreiben, oder auf fertige externe Bibliotheken zurück zu greifen, statt sich da was selbst zu basteln und das Rad damit neu zu erfinden, in der Regel nicht so schön rund wie es sein könnte/sollte.
„Unterprogramme“ ist ein Begriff der nicht so wirklich zu Funktionen und Python passt. Das ist so aus der Zeit wo man mit GOSUB zu nummerierten oder benannten Abschnitten gesprungen ist und auf lauter globalen Variablen operierte.
Man kann die Funktionen natürlich auch alle einsetzen, beziehungsweise auf die verzichten, die auf das vorhandensein von Klammern prüft und alles in die Hauptfunktion schreiben. Verzichtet dann halt auf die Prüfung auf Klammern, ist nicht wirklich sinnvoll testbar, und die Verständlichkeit leidet.
Code: Alles auswählen
#!/usr/bin/env python3
POLYGON_KEYWORD = "POLYGON"
POLYGON = "POLYGON ((20 12), (10 11), (17 18), (20 20), (30 19), (29 18), (31 15), (28 10), (22 8), (19 9))"
def main():
keyword, points_text = POLYGON.strip().split(None, 1)
if keyword != POLYGON_KEYWORD:
raise ValueError(
f"expected {POLYGON_KEYWORD}, got {keyword!r} instead"
)
points = (
tuple(map(int, point_text.strip()[1:-1].split(None, 1)))
for point_text in points_text.strip()[1:-1].split(",")
)
print("\n".join(f"P{i}=({x},{y})" for i, (x, y) in enumerate(points, 1)))
if __name__ == "__main__":
main()
Für WKT ist das aber auch falsch. Dort werden die Punkte anders dargestellt, und ein Polygon muss geschlossen sein, sonst wäre LINESTRING das passende Mittel.
Und bevor man sich da selbst was bastelt, würde man eher `shapely` verwenden:
Code: Alles auswählen
#!/usr/bin/env python3
import shapely
POLYGON = "POLYGON ((20 12, 10 11, 17 18, 20 20, 30 19, 29 18, 31 15, 28 10, 22 8, 19 9, 20 12))"
def main():
points = shapely.from_wkt(POLYGON).boundary.coords
print("\n".join(f"P{i}=({x},{y})" for i, (x, y) in enumerate(points, 1)))
if __name__ == "__main__":
main()