Seite 1 von 1

Wie fängt ein Python-Programmierer einen Elefanten?

Verfasst: Mittwoch 19. Oktober 2005, 09:39
von henning
Moin!
Die meisten von euch kennen sicher die Elefantenjagd.

Ich frage mich gerade, wie ein Python-Programmierer (mit ein bisschen humoristischer selbstkritik) einen Elefanten jagen würde?

Vielleicht:
- Für alle Tiere in Afrika:
- Fange dieses Tier, versuche es mit Erdnüssen zu füttern
und an seinem Rüssel zu ziehen.
- Wenn keine Aunahme ausgelöst wurde, breche die Schleife ab,
die Suche ist beendet.

Das wäre so ein Ansatz a la Ducktyping ,-)

Verfasst: Mittwoch 19. Oktober 2005, 11:01
von Leonidas
Die Elefantenjagt kannte ich nocht nicht, ist aber witzig.

Code: Alles auswählen

def is_elefant(tier):
    try:
        tier.feed("Erdnuss")
        tier.pull(u"Rüssel")
        return True
    except:
        return False

tiere = get_animals("Africa")
elefanten = [tier for tier in tiere if is_elefant(tier)]
Da könnte man aber auch filter() nutzen.

Verfasst: Mittwoch 19. Oktober 2005, 14:24
von CM
Nee, das finde ich nicht gut. Ist ja total ineffizient erst einmal alle zu fangen und dann zu testen. Ein bißchen effizienter sind wir Pythonprogrammieren meist schon :D
Wie wäre

Code: Alles auswählen

#dann muss man nicht suchen, wo es sowieso keine Elefanten gibt:
Gebiet = Africa[north_of_Sahel:cape]
#nicht fangen, sondern bloß nachschauen
tiere = lookup_animals(Gebiet)

for tier in tiere:
    #ein Elefant reicht!
    if is_elefant(tier): gefunden = tier.location(); break
Und wenn es auf die Performance ankommt, kann man das Gebiet des Vorkommens und den Suchalgorithmus immer noch verfeinern ...

Gruß,
Christian

edit: Einmal, hatte mich vertippt

Verfasst: Mittwoch 19. Oktober 2005, 22:06
von BlackJack
Und das man mit der Funktion auch einen Ameisenbär erwischen kann, wenn der nichts gegen eine Erdnuss einzuwenden hat, dann ist uns das wurscht, weil es beim "duck-typing" schliesslich nicht auf den exakten Typ ankommt, sondern nur darauf, dass das erwartete Verhalten des Objekts stimmt. ;-)

Verfasst: Donnerstag 20. Oktober 2005, 05:33
von henning
Stimmt, also geht der Python-Programmierer davon aus, der Ameisenbär müsse ein Elefant sein, bis erbeim Verladen merkt, dass die Ohren zu klein sind ,-)

Verfasst: Donnerstag 20. Oktober 2005, 15:26
von Leonidas
Hängt natürlich ab, was unser "Elefant" für ein Interface haben müsste:
.is_gross() liefert True
.farbe() liefert "grau"
.feed("Erdnuss") gibt keine NahrungGroesserAlsTier Exception (aber da würde schon .ist_gross() False gaben) oder andere Exceptions
.pull("Ruessel") gibt auch keine KoerperteilNotFound Exceptions
.get_ruessel() müsste dann auch eine <Ruessel instance at 0x?> geben.

Aber das ist bei Menschen recht ähnlich: hat Flügel, ist klein, kein Fell, gelb gestreift -> Biene -> Hilfe! Dabei ist es auch egal, ob das fliegende Teil wirklich auch eine Instanz der Biene Klasse ist, oder nur ein anderes Tier, dass sich per Duck typing tarnt.