frage zu "print" befehl

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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*
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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? :wink:

scnr, Jörg
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

b.esser-wisser hat geschrieben:Hast du da str.rjust() (bzw. str.ljust) nachgebaut? :wink:
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.
Benutzeravatar
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 :twisted:
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'
:-)
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 :wink:.

Gruß
Benutzeravatar
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='')
Ist mir nett und freundlich genug :)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
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_'
Antworten