"".reverse()

Code-Stücke können hier veröffentlicht werden.
Antworten
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

Code: Alles auswählen

>>> "".join(["gnirtS"[i-1] for i in range(len("gnirtS"), 0, -1)])

'String'
Weitere Ideen?
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Vielleicht:

Code: Alles auswählen

In [7]: "gnirtS"[::-1] 
Out[7]: 'String'
:D
yipyip
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Oder als Iterator mit reversed() (builtin), auch wenn das imho wieder ein Builtin ist, von dem man nicht weiß, was davon zuhalten ist.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Oder:

Code: Alles auswählen

def rec_reverse(string, acc=''):

  if not string:
    return acc
  
  return rec_reverse(string[1:], string[0] + acc)


print rec_reverse('gnirtS')
print rec_reverse('uhuH')
:wink:
yipyip
lunar

Aber nur, wenn die Strings nicht zu lang werden ;)
BlackJack

@str1442: Also ich sehe `reversed` wie `iter` oder `sorted`. Macht als generische Funktion mehr Sinn, als wenn das jeder als `reversed()`-Methode auf seinen Sequenzen definieren müsste.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

lunar hat geschrieben:Aber nur, wenn die Strings nicht zu lang werden ;)
Die Endrekursion könnte man zur Iteration optimieren, da muss man einfach nur einen passenden Dekorator drauf setzen wenn dass nicht mehr ausreicht. :P

Das ganze ist natürlich hier trotzdem keine sinnvolle Lösung...
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Also ich sehe `reversed` wie `iter` oder `sorted`. Macht als generische Funktion mehr Sinn, als wenn das jeder als `reversed()`-Methode auf seinen Sequenzen definieren müsste.
Funktionen wie iter oder das seit 2.6 neue next haben durchaus (zur Generalisierung, da jeder Iterator eine next Methode haben muss und man dann besser eine allgemein bekannte Funktion als eine next Methode bemüht) ihre Berechtigung, aber sorted und reversed sind schon arg speziell. Reversed ruft entweder eine __reversed__ Methode des Objektes auf oder sortiert mithilfe von __getitem__ von 0 an. Insofern ist ein Objekt gezwungen, sich entweder "Listen-ähnlich" zu verhalten oder eine __reversed__ Methode zu implementieren (wo man auch einfach die 4 Unterstriche weglassen könnte). Zusätzlich haben Listen sogar noch eine In Place reverse Methode. Sorted dagegen scheint immer eine Liste zurückzugeben und ist anscheinend äquivalent zu

Code: Alles auswählen

a = list(sequence)
a.sort()
Insofern erscheint mir der Weg über Objektmethoden (oder "besondere" Verhaltensweisen, wie über das Slicing mit [::-1]) oftmals der Klarere zu sein.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

DasIch hat geschrieben: Das ganze ist natürlich hier trotzdem keine sinnvolle Lösung...
Natürlich war das nicht *vollkommen* ernst gemeint,
mir ist doch auch klar, dass diese "Idiomatik" eher zu
Scheme und Prolog gehört als zu Python.

Aber:
1. finde ich sowas schön (auch in Python)
2. Vielleicht erweist sich etwas in dieser Art
für den einen oder anderen doch mal als nützlich.

:wink:
yipyip
lunar

yipyip hat geschrieben:1. finde ich sowas schön (auch in Python)
Es ist nicht schön, eine Rekursion zu bauen, wenn die Sprache das auch ohne kann.

@str1442
Naja, mit der gleichen Argumentation könnte man "next()" auch anzweifeln, verlangt es doch, dass sich das übergebene Objekt wie ein Iterator verhält ...
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Naja, mit der gleichen Argumentation könnte man "next()" auch anzweifeln, verlangt es doch, dass sich das übergebene Objekt wie ein Iterator verhält ...
Diese Funktionen machen doch alle nicht viel. iter(obj) ruft entweder obj.__iter__ auf oder benutzt auch das "Listen-ähnliche" __getitem__ Verhalten, len(obj) ruft auch nur obj.__len__() auf... Es sind alles Funktionen, die erfordern, das ein Objekt eine bestimmte "magic" (doppelt Unterstrich) Methode implementiert oder sich in einer bestimmten Art und Weise verhält. len, iter, next sind aber sehr allgemein gehaltene Funktionalitäten. next(obj) macht sogar gar nichts anderes als nur obj.next() aufzurufen. Ein Iterator muss aber zwingend eine next() Methode haben, um zb in einer For Schleife verwendet werden zu können.

Das Sortieren oder Umdrehen von Sequenzen kann dagegen auf zigfache Weise erfolgen. Vielleicht macht es bei einer Sequenz überhaupt keinen Sinn, sie umdrehen zu wollen bzw es wäre mehrdeutig? (Vielleicht ein dreidimensionales Array?) Oder eine Matrix, auf die Spaltenweise zugreifen kann, die wäre über eine pure Reihenfolge von 0 nach sonstwo und __getitem__ schlecht abgebildet. Kurz, wie man etwas sortieren oder umdrehen kann ist viel zu unklar und zu speziell für eine allgemeine "reversed" Funktion, zumal man grade für das Arbeiten mit "Listen ähnlichem" Verhalten ja schon Slices gibt, deren Sinn und Zweck man sich bei eigenen Objekten auch selbst definieren kann. Und ich will auch nicht für jede erdenkliche Funktionalität eine Art Funktion haben, die nur eine Methode eines Objektes aufruft.
Es ist nicht schön, eine Rekursion zu bauen, wenn die Sprache das auch ohne kann.
Manche Dinge lassen sich mit Rekursion imho deutlich "natürlicher" / intuitiver lösen als mit Iteration.
Zuletzt geändert von str1442 am Sonntag 21. Dezember 2008, 23:35, insgesamt 1-mal geändert.
BlackJack

@str1442: Oder eben auch `iter()` denn das ruft auch entweder die `__iter__()`-Methode auf, oder bemüht `__getitem__()` mit aufsteigenden Indices. Also letztendlich nicht viel anders als `reversed()`.
lunar

str1442 hat geschrieben:
Es ist nicht schön, eine Rekursion zu bauen, wenn die Sprache das auch ohne kann.
Manche Dinge lassen sich mit Rekursion imho deutlich "natürlicher" / intuitiver lösen als mit Iteration.
Jo, das bezweifele ich nicht. Ich gebe zu, ich habe auch etwas an meiner eigentlichen Aussage vorbeiformuliert ;)

Mir ging es nur darum, dass eine rekursive Funktion unnötig ist, wenn es – wie in diesem Fall per Slicing – syntaktischen Zucker für die gleiche Operation gibt. Das Rekursion dagegen schöner sein kann als die entsprechende Iteration, steht dagegen außer Zweifel.
Antworten