"".reverse()

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

"".reverse()

Beitragvon bremer » Sonntag 21. Dezember 2008, 21:08

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

Beitragvon yipyip » Sonntag 21. Dezember 2008, 21:16

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

Beitragvon str1442 » Sonntag 21. Dezember 2008, 21:19

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

Beitragvon yipyip » Sonntag 21. Dezember 2008, 21:38

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

Beitragvon lunar » Sonntag 21. Dezember 2008, 22:06

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

Beitragvon BlackJack » Sonntag 21. Dezember 2008, 22:16

@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: 2405
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » Sonntag 21. Dezember 2008, 22:22

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

Beitragvon str1442 » Sonntag 21. Dezember 2008, 22:57

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

Beitragvon yipyip » Sonntag 21. Dezember 2008, 23:02

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

Beitragvon lunar » Sonntag 21. Dezember 2008, 23:07

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

Beitragvon str1442 » Sonntag 21. Dezember 2008, 23:33

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

Beitragvon BlackJack » Sonntag 21. Dezember 2008, 23:35

@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

Beitragvon lunar » Montag 22. Dezember 2008, 00:31

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder