Seite 2 von 2
Verfasst: Montag 26. Oktober 2009, 11:38
von snafu
Wenn man so zwanghaft `''.join()` auf Strings (verbunden mit dem Zusatzaufwand wie in meinem Beispiel) verwenden soll, dann frage ich mich, wieso der `+`-Operator bei Zeichenketten nicht einfach zu einem Alias für `''.join()` und intern eine Liste mit den Strings geführt wird. Ich finde dieses Vorgehen jedenfalls nicht gerade intuitiv und sehe auch keine enormen Performance-Einbußen, sobald man mal anders vorgeht. Ich füge jetzt aber auch nicht unbedingt eine Zeichenkette von 520KB zu einer alten Zeichenkette von 893KB hinzu, sodass ich das merken würde... *scnr*
Verfasst: Montag 26. Oktober 2009, 12:04
von b.esser-wisser
snafu hat geschrieben: Ich hatte kürzlich selber ein Snippet gepostet, wo es darum ging, einen String solange mit einer unbekannten Anzahl an Zeichen zu erweitern bis er eine bestimmte Mindestlänge hat
Hast du da str.rjust() (bzw. str.ljust) nachgebaut?
scnr, Jörg
Verfasst: Montag 26. Oktober 2009, 12:12
von snafu
b.esser-wisser hat geschrieben:Hast du da str.rjust() (bzw. str.ljust) nachgebaut?

Nein, ich hab `/dev/urandom` befragt und wollte nur bestimmte Zeichen verwenden. Das Device musste halt solange gelesen werden bis die gewünschte Anzahl an verwendbaren Zeichen erreicht war.
Verfasst: Montag 26. Oktober 2009, 17:15
von b.esser-wisser
@snafu
Na dann - wäre ja auch zu schön gewesen

Verfasst: Montag 26. Oktober 2009, 20:03
von BlackJack
Ein paar Funktionen aus `itertools` und `functools` und schon kann man das auch problemlos mit `join()` machen:
Code: Alles auswählen
In [16]: urandom_file = open('/dev/urandom', 'rb')
In [17]: random_chars = iter(partial(urandom_file.read, 1), '')
In [18]: ''.join(islice((c for c in random_chars if c < 'Z'), 10))
Out[18]: '\x19P\x10\x00 %,5\x1d6'

Verfasst: Montag 26. Oktober 2009, 23:40
von problembär
Vielleicht sollte man noch erwähnen, daß das Problem nur entsteht, eben weil in Python alles nett und freundlich sein soll: Deshalb denkt der print-Befehl selbst an das "\n", das man meist will, und beim "," fügt er eben noch eine Leerstelle an, wohl, weil das in den meisten Fällen auch gewollt ist.
Wenn man dieses Verhalten umgeht, weil man was anderes will, sollte man das IMHO ebenso nett und freundlich tun.
Aber ich bin da tolerant: TMTOWTDI

.
Gruß
Verfasst: Dienstag 27. Oktober 2009, 10:01
von birkenfeld
problembär hat geschrieben:Vielleicht sollte man noch erwähnen, daß das Problem nur entsteht, eben weil in Python alles nett und freundlich sein soll: Deshalb denkt der print-Befehl selbst an das "\n", das man meist will, und beim "," fügt er eben noch eine Leerstelle an, wohl, weil das in den meisten Fällen auch gewollt ist.
Wenn man dieses Verhalten umgeht, weil man was anderes will, sollte man das IMHO ebenso nett und freundlich tun.
Code: Alles auswählen
from __future__ import print_function
print('a', 'b', end='')
print('a', 'b', sep='', end='')
Ist mir nett und freundlich genug

Verfasst: Dienstag 27. Oktober 2009, 11:29
von snafu
BlackJack hat geschrieben:Ein paar Funktionen aus `itertools` und `functools` und schon kann man das auch problemlos mit `join()` machen:
Nur, dass es überhaupt nicht das tut, was es soll. In meinem Fall sollten nur Buchstaben, Zahlen und Unterstriche herauskommen. Hier scheint alles Mögliche heraus zu kommen.
Verfasst: Dienstag 27. Oktober 2009, 19:29
von BlackJack
@snafu: Da Du nicht gesagt hast was für Bedingungen gelten sollten, kommt da "alles mögliche" heraus. Ich kann ja nicht hellsehen und habe halt eine relativ willkürliche Bedingung verwendet. Die kann man ja aber problemlos anpassen.
Code: Alles auswählen
In [24]: urandom_file = open('/dev/urandom', 'rb')
In [25]: random_chars = iter(partial(urandom_file.read, 1), '')
In [26]: ''.join(islice((c for c in random_chars if c.isalnum() or c == '_'), 10))
Out[26]: 'PkrpmRt4x_'