frage zu "print" befehl
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*
- b.esser-wisser
- User
- Beiträge: 272
- Registriert: Freitag 20. Februar 2009, 14:21
- Wohnort: Bundeshauptstadt B.
Hast du da str.rjust() (bzw. str.ljust) nachgebaut?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

scnr, Jörg
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.b.esser-wisser hat geschrieben:Hast du da str.rjust() (bzw. str.ljust) nachgebaut?
- b.esser-wisser
- User
- Beiträge: 272
- Registriert: Freitag 20. Februar 2009, 14:21
- Wohnort: Bundeshauptstadt B.
@snafu
Na dann - wäre ja auch zu schön gewesen
Na dann - wäre ja auch zu schön gewesen

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'

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ß
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ß
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
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='')

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.BlackJack hat geschrieben:Ein paar Funktionen aus `itertools` und `functools` und schon kann man das auch problemlos mit `join()` machen:
@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_'