Wie bekomme ich ein int-Objekt in einen mehrzeiligen string hinein?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
ILoveJesus1001
User
Beiträge: 3
Registriert: Sonntag 18. März 2018, 17:03

Hallo liebe Leute vom Python-Forum!

Hoffe ich bin hier im richtigen Unterforum! Sonst wäre mir nur das Forum: Allgemeine Fragen eingefallen!

Meine Frage ganz kurz und knapp:

Möchte in einen mehrzeiligen string ein int-Objekt hineinbekommen und frage mich, wie genau das geht!

Alles Liebe,
euer Raffael
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@ILoveJesus1001: mit Stringformatierung. Dabei ist es egal, ob der String mehrzeilig ist oder nicht.
IHack
User
Beiträge: 14
Registriert: Dienstag 13. März 2018, 11:17

Guckst du hier.
Im einfachsten Fall:

Code: Alles auswählen

i = 3
s = 'ich habe %s Probleme'
print( s % i)
Beachte: Das ist ein schlechtes Beispiel. Wandle den Int lieber explizit um.

Es gibt viele Varianten, wie man das machen kann.
Lerne lieber gleich die Neueste und caste __immer__ explizit.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@IHack: was meinst Du mit explizit? Das was Du da zeigst, ist doch schon ziemlich explizit.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

IHack hat geschrieben: Lerne lieber gleich die Neueste und caste __immer__ explizit.
Was ist denn fuer dich casten? str(1) aufzurufen? Und warum ist das einem formatting vorzuzuziehen, bei dem du Kontrolle ueber die Darstellung von zB Nachkommanteilen oder padding hast?
IHack
User
Beiträge: 14
Registriert: Dienstag 13. März 2018, 11:17

Genau das meine ich mit "explizit".

Das Formatieren geht letztlich auf C's printf Familie zurück.
Sich anzugewöhnen, das casten durch das Format machen zu lassen (auch wenn das durchaus zulässig ist; ich es ja auch als Beispiel sogar geschrieben habe), ist es zum Lernen von Python __wirklich__ besser, wenn man solche Operationen explizit schreibt.
Ich denke jeder, der das nicht tut, wird später erst mal richtig staunen, wenn ihm dann ein '%011.7f' oder dergleichen über den Weg läuft.

Und das gilt nicht nur für Python, eben weil die sprintf Familie überall zu Hause ist.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

printf castet nichts. Es formatiert. Und wo der Vorteil einer vorhergehenden Typwandlung liegen soll ist mir nicht klar. Du hast ein int, int kann formatiert werden, es gibt dann deutlich mehr Optionen, Optionen die man *ohne* den urspruenglichen Typ zu verwenden noch nicht mal hat. Was bringt einem da ein cast? Oder missverstehe ich immer noch, was du meinst. Wie waere es, wenn du das zeigst, statt das, von dem du eigentlich der Meinung bist, dass es schlechter ist.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: ich glaube IHack meint nur explizite Formatangaben, also '%d' statt '%s' wenn es sich um eine Ganzzahl handelt.
IHack
User
Beiträge: 14
Registriert: Dienstag 13. März 2018, 11:17

Ganz genau.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah. Gut, sehe ich auch so, aber mit Casten hat’s halt nix zu tun :K
ILoveJesus1001
User
Beiträge: 3
Registriert: Sonntag 18. März 2018, 17:03

Ein Beispiel dazu:

klfaMn = 100
klcoMn = 120

string ausgabe =
'''
Kleinster cooler Mann: (Angabe in cm)
Kleinster fauler Mann: (Angabe in cm)
'''

Dort wo steht, Angaben in cm sollten die Werte von klfaMn und klcoMn stehen, wie kriege ich die hier in den mehrzeiligen String hinein?

Alles Liebe,
Raffael
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit den schon mehrfach gezeigten Format-Angaben und dem %-Operator. Oder neuer mit {} und format. Ist dir doch gezeigt worden. Was ist daran noch nicht klar?
IHack
User
Beiträge: 14
Registriert: Dienstag 13. März 2018, 11:17

Code: Alles auswählen

print('die %s ist kein %s' % ('Mann', 'Frau') )
print('die {} ist kein {}'.format('Mann', 'Frau') )
print('''die {}
ist
kein {}'''.format('Mann', 'Frau') )
Du solltest evtl. deine Versuche hier posten, damit man sehen kann, woran du scheiterst.

@__deeds__: Ich verstehe dich nicht so ganz.
Wenn du ein %s bei einer Zahl verwendest, castest du implizit durch die printf Funktion. Das ist erlaubt, aber eben nicht ganz sauber.
Und "cast" verwende nicht nur ich als Wort für Typumwandlung.
Was verstehst du denn unter "cast"?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe unter cast genau das, was du in deinem letzten Satz sagst: typumwandlung. In Python also zb str(10), um ein Integer in einen String-Wert zu wandeln.

Mit der Formatierung hat das aber nichts zu tun. So wie du cast hier benutzt, suggeriert das so etwas zu tun:

"%s" % str(10)

Oder noch schlimmer

"foo" + str(10)

Im ersten Fall ist es unnoetig, im zweiten kann man statt Formatierung mit Typwandlung arbeiten, verliert aber Einfluss auf die Darstellung. Bei Fall 1 natuerlich auch.

Wenn du stattdessen (das ja von dir selbst vorgeschlagene

"%i" % 10

findet dabei aber kein "cast" statt. Auch nicht implizit. Sonst waeren wir ja wieder bei Fall 2. Sondern eine Formatierung, mit der Moeglichkeit auch noch padding etc dazu zu dekorieren. Mir ist schon klar, das dir die Vor- und Nachteile bewusst sind, nur ist dein Begriff cast in diesem Kontext ungebraeuchlich, darum war ich verwirrt.
IHack
User
Beiträge: 14
Registriert: Dienstag 13. März 2018, 11:17

Jede Formatierung eines Integers ist -per definitionem- ein Cast.
Die Integerzahl muss erst in einen String konvertiert werden.
Das ist völlig unabhängig, ob man das einem impliziten __repr__, __string__ überlässt, oder explizit tut.
Dein Format impliziert ebenfalls einen Typcast. Zwangsläufig.
Selbst dein %i impliziert eine Umwandlung. (Ich habe das nicht vorgeschlagen.)

Mit ging es nur darum, dem TE den Rat zu geben, sich eben nicht auf implizite Casts zu verlassen, sondern immer möglichst explizit zu formulieren. That's all.

Was du weiter schreibst, ist eher nicht das Thema.
Kannst ja einen eigenen Thread für diese Debatte aufmachen.
In dem würde mich als erstes interessieren, __wie__ du "cast" __exakt__ definierst.
ILoveJesus1001
User
Beiträge: 3
Registriert: Sonntag 18. März 2018, 17:03

Hier ein Beispiel, damit ihr seht, wo ich hänge!

s = 'Eine Zahl lautet 37476476!'
zahldez = int(s[17:-1])
zahlbin = bin(zahldez)

string ausgabe = 'Zahl Dezimal: ' + str(zahldez) + '/nZahl binaer: ' + str(zahlbin)

Aus irgendeinem Grund funktioniert die Ausgabe nicht!

Alles Liebe,
Raffael
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Probier mal das:

Code: Alles auswählen

'{:b}'.format(int(s[17:-1])) # binär
'{:x}'.format(int(s[17:-1])) # hex
'{:o}'.format(int(s[17:-1])) # oct
Angenommen du hast irgendeine Zahl und willst diese als HEX mit 4 Stellen darstellen, also ein Word.

Code: Alles auswählen

'0x{:04x}'.format(int(32768))
'0x{:04x}'.format(int(2**16-1))
Am besten mal hier nachsehen: https://pyformat.info/
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@ILoveJesus1001: Dein Eingabestring ist sehr speziell und das Programm funktioniert auch nur mit exakt so einem String. Schon im anderen Thread von Dir wurde Stringformatierung angesprochen. `/n` ist einfach nur `/n`. Was Du suchst ist `\n` für das Neue-Zeichen-Zeile. `string ausgabe` ist kein gültiges Python. Bei `zahldez` handelt es sich einfach nur um eine Zahl. Die intern verwendete Basis ist nicht relevant.

Code: Alles auswählen

ausgabe = 'Zahl Dezimal: {0}\nZahl binaer: {0:b}'.format(zahl)
Antworten