Vorbereitung auf Python Klausur

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
philoo7
User
Beiträge: 1
Registriert: Donnerstag 1. November 2018, 12:18

In dieser Übung müssen wir die Distanz zwischen einer Anzahl von Punkten(punkteliste) berechnen und dann die kleinste Distanz ausgeben. Die Berechnung der Distanzen stellte kein Problem da. Mein Problem ist nun die berechneten Distanzen abzuspeichern und dann das min davon zu bestimmen. Komme leider echt nicht weiter. Habe schon viel probiert. Wär super wenn mir wer helfen könnte. merci vielmals.:D
import math

###Funktionen
def mylength(PP,PPP):
x1,y1=PP
x2,y2=PPP

###oder x1,y1=pp[0]

dx=x2-x1###distanz zw x2+x1
dy=y2-y1###distanz zw y2 +y1
d=math.sqrt(dx**2+dy**2)
return d

punkteliste=[(19,21),(56,32),(94,11),(57,31),(89,51),(11,11),(72,61),(85,51),(81,63)]###punkte reinladen
print punkteliste

for i in range (len(punkteliste)):###nimmt alle x werte aus punkteliste
for j in range (len(punkteliste)): ###nimmt alle y werte aus punkteliste
dist=mylength(punkteliste,punkteliste[j])###berechnet die Distanz zwischen x (punkteliste und y [punkteliste [j]
print dist
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Tipps:
Wenn es nur auf den minimalen Wert ankommt, ist es nicht nötig alle Distanzen zu speichern, sondern nur den ?......? Wert.
Wenn die Aufgabenstellung es erfordert alle Distanzen zuerst zu speichern, würde sich doch so was wie eine "distanzli..." anbieten, oder?
Erzeuge eine leere und hänge jeweils die berechnete Distanz an.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 18267
Registriert: Sonntag 21. Oktober 2012, 17:20

@philoo7: was soll das `my` bei `mylength`? Gibt es auch noch `yourlength`? Ich dachte Längen sind unabhängig von demjenigen, der sie berechnet.
`PP` und `PPP` sind ganz schlechte Variablennamen, zum einen, weil großgeschriebene Namen für Konstanten reserviert sind, zum anderen, weil eine Ansammlung von Ps nicht gerade aussagekräftig sind. Man braucht auch nicht jedes Zwischenergebnis an einen eigenen Namen binden.
Das könnte also besser so aussehen:

Code: Alles auswählen

def length(point1, point2):
    x1, y1 = point1
    x2, y2 = point2
    return ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5
Später iterierst Du über einen Index, was man in Python nicht macht, weil man besser über die Punkte in der Liste direkt iteriert:

Code: Alles auswählen

for point1 in punkteliste:
    for point2 in punkteliste:
        distance = length(point1, point2)
Hier würde ich eine Variable min_distance benutzen, und in jedem Schritt vergleichen, ob distance kleiner als min_distance ist und bei Bedarf ersetzen.
Hier wirst Du später noch ein Problem entdecken, nämlich dass der minimale Abstand immer 0 ist.
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@philoo7: So wie es da jetzt (vermutlich) steht, kann man für die minimale Distanz einfach ein ``print(0)`` hinschreiben, denn Du berechnest auch die Distanz von jedem Punkt zu sich selbst – was 0 ist, und eine kleinere Distanz kann es ja nicht geben. ;-)

Die Argumentnamen `PP` und `PPP` gehen ja mal so ganz und gar nicht. Namen sollen dem Leser verraten was der Wert bedeutet und nicht zu rätselraten zwingen. `point_a` und `point_b` wären Beispiele für sinnvolle Argumentnamen für diese Funktion. Was soll das `my` in `mylength()`? Das ist ein in 99,999% aller Fälle völlig depperter und sinnfreier Präfix. Weg damit. Noch besser wäre es dann wenn die Funktion eine Tätigkeit beschreiben würde. Dann kann man `length` auch tatsächlich als Namen für eine Längenangabe verwenden. Also zum Beispiel für das Ergebnis des Funktionsaufrufs. Denn das Funktion und Ergebnis nicht an ähnliche Namen gebunden werden, ist auch nicht wirklich verständlich. Da sollte man sich entweder auf `length`/`calculate_length()` oder auf `distance`/`calculate_distance()` ”einigen”. Ich würde letztes nehmen, denn eine Länge wäre eher etwas was man für eine Linie berechnet und nicht für zwei Punkte, die ja keine Ausdehnung oder Länge haben, sondern nur Koordinaten.

Kommentare werden mit *einem* ``#`` gekennzeichnet, nicht mit dreien.

Die Kommentare bei den Schleifen sind inhaltlich falsch, und bei der Berechnung in der Schleife ebenfalls. Der Aufruf von `mylength()` mit den dort gezeigten Argumenten wird gleich in der ersten Zeile der Funktion zu einer Ausnahme führen. Entweder hast Du das nicht ausprobiert, oder das fehlt bei der Beschreibung Deines Problems.

Konkrete Grunddatentypen sollten nicht in Namen vorkommen. Also nur `punkte` statt `punkteliste`. Denn wenn man den Typ mal ändert, müsste man auch überall die Namen ändern, oder man hat falsche, irreführende Namen im Code.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten