Seite 1 von 1

Tupelfrage (Anfängerfrage) (gelöst)

Verfasst: Sonntag 31. Dezember 2006, 20:22
von Gnushi
Hallo zusammen!

Ich habe eine Methode in einer Klasse, die so aussieht:

Code: Alles auswählen

def point_in_rect (self, p = (0,0), r = ((0, 0), (10, 10))):
    px, py = p
    rx, ry, rw, rh = r
    ....
Hier kommt aber ein Fehler, daß ich so nicht an die Elemente der Tupel in r kommen könne. Nun probiere ich

Code: Alles auswählen

def point_in_rect (self, p = (0,0), r = ((0, 0), (10, 10))):
    px, py = p
    a, b = r
    rx, ry = a
    rw, rh = b
    ....
und es funktioniert. Gibt außer dieser Umschreibung noch einen Trick, wie ich an die Tupelelemente kommen kann, und zwar ohne diese Hilfsvariablen?

Da r ein ganz normales Rechteck ist, würde ich dem Anwender gerne ermöglichen, auch Rechtecke der Form (0, 0, 10, 10) einzugeben, also vier statt derer zwei Tupelelemente. Kann man die Methode so umschreiben, daß beide Sorten Rechtecke akzeptiert werden?

Liebe Grüße und einen guten Rutsch

Gnushi

Re: Tupelfrage (Anfängerfrage)

Verfasst: Sonntag 31. Dezember 2006, 20:54
von BlackJack
Gnushi hat geschrieben:Ich habe eine Methode in einer Klasse, die so aussieht:

Code: Alles auswählen

def point_in_rect (self, p = (0,0), r = ((0, 0), (10, 10))):
    px, py = p
    rx, ry, rw, rh = r
    ....
Wird da auch irgendwo `self` benötigt? Wenn nicht, dann gehört's sehr wahrscheinlich nicht in diese Klasse sondern ist einfach eine Funktion.
Hier kommt aber ein Fehler, daß ich so nicht an die Elemente der Tupel in r kommen könne. Nun probiere ich

Code: Alles auswählen

def point_in_rect (self, p = (0,0), r = ((0, 0), (10, 10))):
    px, py = p
    a, b = r
    rx, ry = a
    rw, rh = b
    ....
und es funktioniert. Gibt außer dieser Umschreibung noch einen Trick, wie ich an die Tupelelemente kommen kann, und zwar ohne diese Hilfsvariablen?
Ich würd's nicht Trick nennen: Das entpacken funktioniert auch "rekursiv". Du hast ein Tupel mit zwei Elementen, also müssen auf der linken Seite der Zuweisung auch zwei "Empfänger" stehen. Das können auch wieder Tupel sein auf die dann die jeweiligen Elemente verteilt werden:

Code: Alles auswählen

def point_in_rect(self, p=(0,0), r=((0, 0), (10, 10))):
    px, py = p
    (rx, ry), (rw, rh) = r
Du kannst die Argumentliste auch gleich so schreiben das alles auf einzelne Namen verteilt wird:

Code: Alles auswählen

def point_in_rect((point_x, point_y),
                  ((upper_left_x, upper_left_y), (width, height))):
    # ...
Hier habe ich jetzt Deine Vorgabewerte weggelassen, aber die machen IMHO bei so einer Funktion nicht wirklich Sinn.
Da r ein ganz normales Rechteck ist, würde ich dem Anwender gerne ermöglichen, auch Rechtecke der Form (0, 0, 10, 10) einzugeben, also vier statt derer zwei Tupelelemente. Kann man die Methode so umschreiben, daß beide Sorten Rechtecke akzeptiert werden?
Ja das geht, wird aber schnell unsauber. Entscheide Dich lieber für eine Variante.

Entpacken oder Zugreifen

Verfasst: Montag 1. Januar 2007, 10:26
von droptix

Code: Alles auswählen

r = ((0, 0), (10, 10))
# entweder `entpacken`:
a, b = r
print a, b # (0, 0) (10, 10)
# oder wie bei Listen drauf zugreifen:
a = r[0]
b = r[1]
print a, b # (0, 0) (10, 10)
# wobei das auch gleich so ginge:
rx = r[0][0]
ry = r[0][1]
rw = r[1][0]
rh = r[1][1]
print rx, ry, rw, rh # 0 0 10 10

Re: Tupelfrage (Anfängerfrage)

Verfasst: Montag 1. Januar 2007, 20:42
von Gnushi
BlackJack hat geschrieben: Du kannst die Argumentliste auch gleich so schreiben das alles auf einzelne Namen verteilt wird:

Code: Alles auswählen

def point_in_rect((point_x, point_y),
                  ((upper_left_x, upper_left_y), (width, height))):
    # ...
Genau so mache ich das nun. Vielen Dank für die Hilfe.

Gnushi