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 ,-)
Wie fängt ein Python-Programmierer einen Elefanten?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Die Elefantenjagt kannte ich nocht nicht, ist aber witzig.
Da könnte man aber auch filter() nutzen.
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)]
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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
Wie wäre
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
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
Gruß,
Christian
edit: Einmal, hatte mich vertippt
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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.
.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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice