Seite 2 von 2

Verfasst: Samstag 10. Januar 2009, 19:03
von Leonidas
Außerdem sind Generatoren lazy. Wie Python-Programmierer. Also quasi ein "perfect match".

Verfasst: Samstag 10. Januar 2009, 19:14
von BlackJack
@BlackVivi: Wie bitte? Intuitiv logischer? Schneller von der Hand geschrieben? Also ich finde die Generatorlösung sieht komplizierter aus als das hier und hat auch mehr Code:

Code: Alles auswählen

def type_annotate(obj):
    if isinstance(obj, list):
        return map(type_annotate, obj)
    else:
        return (type(obj), obj)
Ausserdem hat so eine rekursiv lazy Variante dann auch Probleme beim Anzeigen, das erfordert dann nämlich auch wieder ein relativ komplizierten Code statt eines einfachen ``print``. Immer dran denken wie die Ausgabe aussehen soll.

Verfasst: Samstag 10. Januar 2009, 19:29
von BlackVivi
BlackJack hat geschrieben:@BlackVivi: Wie bitte? Intuitiv logischer?
Für _mich_ schon. Über viele Sachen lassen sich streiten, aber der Generator für diese Funktion ist für mich mal leichter... Und für andere bestimmt auch.
BlackJack hat geschrieben:Ausserdem hat so eine rekursiv lazy Variante dann auch Probleme beim Anzeigen, das erfordert dann nämlich auch wieder ein relativ komplizierten Code statt eines einfachen ``print``. Immer dran denken wie die Ausgabe aussehen soll.
Das ist wiederum ein Argument... Wobei man allgemein für einen sinnvollen Einsatz für die Datenstruktur sich etwas ausdenken muss, finde ich.

Verfasst: Samstag 10. Januar 2009, 19:44
von str1442
Mehrere Dinge:

1. So eine typeannotate Funktion ist höchstwahrscheinlich nicht für den Gebrauch innerhalb von Programmen gedacht, sondern höchstens für den Programmierer. Abgesehen davon daß die Aufgabe sowieso eine Hausaufgabe war.

Aus dieser Sicht disqualifiziert sich ein Generator für so ein Problem. Dennoch ist es als Generator ebenfalls leicht zu schreiben und es kam mir intuitiv in den Sinn. Zumal Generatoren zu viel mehr nutzbar sind als "nur" Iterables zu bilden.

2. Der Grund, warum ich es schlussendlich als Generator hingeschrieben habe, war, daß man so die Grundstruktur, die Madpuella ja richtig erkannt hat, mehr oder weniger "rein" dargestellt bekommt, und zugleich der Teil "schreibe das Ganze nun als Funktion mit einem Returnpoint und einer Liste, an die Elemente angehängt werden" und "schreibe eine Funktion typeannote, die deepmap() nutzt" als Übung übrig bleiben, was sich ja jetzt erledigt hat.

Hier ist übringens noch eine Variante:

Code: Alles auswählen

>>> def deepmap(func, ls):
...  return [func(elem) if not isinstance(elem, list) else deepmap(func, elem) for elem in ls]
... 
:P