Funktionsparameter Zahl mit führenden nullen soll string sei

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.
Antworten
pyron
User
Beiträge: 12
Registriert: Montag 14. März 2011, 09:33
Wohnort: Ratingen
Kontaktdaten:

Hallo zusammen,

ich habe folgendes vor:
Ich möchte einen Funktionsparameter haben, beispielsweise 0815 innerhalb der Funktion möchte ich diesen aber als String "0815" verarbeiten. wie stelle ich sicher, dass dieser als String in die Funktion einläuft?
Es kommt immer "invalid Token" das, wie ich hier gelesen habe, damit zu tun hat, dass die Zahl dann als Oktal-Zahl erkannt wird.
Wie forciere ich Python denn nun, dass es ein String sein soll.

PS: Ich hatte schon versucht die Typenumwandlung in der Funktion selber durchzuführen, aber dann werden die führenden Nullen abgeschnitten, was schon wichtig für mich wäre diese zu behalten.

Ich hoffe ich habe mich nicht zu kompliziert ausgedrückt.
Eventuell kann mir ja jemand einen Tipp geben.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Äh. Du verwendest einfach String-Literale.

Code: Alles auswählen

'0815'
"Hallo Welt"
pyron
User
Beiträge: 12
Registriert: Montag 14. März 2011, 09:33
Wohnort: Ratingen
Kontaktdaten:

Hallo,

aber wie forciere ich, dass ein String in die Methode übergeben wird:

foo(hier_soll_ein_text_eingegeben_werden):
print hier_soll_ein_text_eingegeben_werden
print str(hier_soll_ein_text_eingegeben_werden) # das würde nichts bringen, wenn eine Zahl übergeben wird,
# die mit Null anfängt.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

pyron hat geschrieben:aber wie forciere ich, dass ein String in die Methode übergeben wird:
Indem du einen übergibst. Du kannst da nichts forcieren, selbst wenn du es könntest wäre es sowieso schon zu spät. Wenn du beim Aufruf der Funktion schon eine Zahl hast ist die Null sowieso schon verloren.

Poste am besten mal einen Beispielcode der dein Problem widerspiegelt. Ich vermute einfach mal du benutzt input(), willst aber eigentlich raw_input() verwenden (input solltest du sowieso nie verwenden).
BlackJack

@pyron: Das eine Zeichenkette übergeben wird kannst Du in der Funktion nicht forcieren. Wie sollte das auch gehen!? Das musst Du dort sicherstellen wo die Funktion aufgerufen wird. Nämlich das sie dort eben nur mit einer Zeichenkette als Argument aufgerufen wird.

Kann es sein dass Du vielleicht Python 2.x und die `input()`-Funktion verwendest? Dann lass die Finger von `input()` (mehr oder weniger grundsätzlich) und verwende `raw_input()`.

Ansonsten beschreibe das zu lösende Problem mal genauer.
pyron
User
Beiträge: 12
Registriert: Montag 14. März 2011, 09:33
Wohnort: Ratingen
Kontaktdaten:

Danke für den Hinweis.
Ich denke ich muss es vorher regeln, dass auch nur ein String übergeben wird.
Falls das nicht passiert, raise ich nun eine Exception. Danke für die Erklärung.
Thread kann geschlossen werden.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

pyron hat geschrieben:Danke für den Hinweis.
Ich denke ich muss es vorher regeln, dass auch nur ein String übergeben wird.
Falls das nicht passiert, raise ich nun eine Exception. Danke für die Erklärung.
Thread kann geschlossen werden.
Lass das einfach raus, das mit der Exception. Die kannst davon ausgehen, dass du nicht zu blöd bist, die richtigen Typen zu verwenden, und falls du aus Versehen doch mal den falschen verwendest, tritt spätestens bei der ersten Operation mit dem Wert ein Fehler auf.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Bestimmte Typen in Python forcieren geht nur mit einer Prüfung zur Laufzeit. Python wirft immer, wenn ihm ein Typ nicht passt, einen TypeError, das kann man auch selbst machen, also

Code: Alles auswählen

def ich_will_nur_str(x):
    if type(x) is not str: raise TypeError
    print "Garantiert ein String:", x
Allgemein gelten solche expliziten Prüfungen als schlechter Stil. Insbesondere wenn man es wie ich so macht, dass man genau den Typ vergleicht. Die nächstbeste Alternative wäre der Test "isinstance(x, str)", doch in Python 2 gibt es neben Byte-Strings noch "richtige" Strings, die unicode-Zeichen verarbeiten könenn als Typ unicode. So ein String funktioniert eigentlich fast überall, wo auch ein Bytestring geht (und umgekehrt) sodass man eher "isinstance(x, (str, unicode))" prüfen will oder "isinstance(x, basestring)", was das ganze aber auch nicht hübscher macht.

Ich glaube ja, der ursprünglichen Frage liegt ein Verständnisproblem zugrunde. Es wird nicht zwischen der Repräsentation einer Zahl und der Zahl selbst unterschieden. Intern sollte man immer mit Zahlen arbeiten, nicht mit konkreten Repräsentationen in String-Form. Einmal den String einlesen und umwandeln, dann später zum Ausgeben wieder in die passende Repräsentation umwandeln

Code: Alles auswählen

x = int(raw_input(), 10)
x += 1
print "%04d" % x
Die erste Zeile liest problemlos Strings mit Zahlen mit führenden Nullen ein, die letzte Zeile schreibt die Zahl mit mindestens 4 Ziffern und dann entsprechend führenden Nullen. In "x" selbst ist aber eine Zahl, mit der ich vernünftig rechnen kann.

Stefan
Antworten