Python: Konvertierung einer Zeichenfolge in eine ganze Zahl
Hat jemand einen quickie für die Umwandlung einer unsicheren string zu einem int
?
Den string in der Regel kommt zurück als: '234\r\n'
oder sowas.
In diesem Fall möchte ich 234
. Wenn '-1\r\n'
möchte ich -1
. Ich will nicht, dass die Methode zu Versagen, aber ich will nicht so weit gehen, versuchen Sie, mit der Ausnahme, übergeben Sie nur zu verbergen Fehler, die entweder (im Fall, dass etwas extremes passiert).
- "Ich will nicht, dass die Methode zu Versagen, aber ich will nicht so weit gehen, versuchen Sie, mit der Ausnahme, pass nur auf hide-Fehler, die sicherlich scheint widersprüchlich. "Never Fail" bedeutet "Abfangen von Ausnahmen". Was meinst du mit "Never Fail" und "NICHT-Abfangen von Ausnahmen"? Was ist dieses nicht-scheitern, keine Ausnahme, was Sie erwarten? Können Sie klären Ihre Erwartungen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In diesem Fall müssen Sie einen Weg, um zu vermeiden
try
/except
, obwohl ich würde nicht empfehlen es (wenn der input-string ist benannts
, und Sie sind in einer Funktion, muss etwas zurückgeben):den
...
Teil in derelse
ist, wo Sie wieder was Sie wollen, wenn, sagen wir,s
war'iamnotanumber'
,'23skidoo'
leeren all-Räume oder ähnliches.Es sei denn, eine Menge input-strings sind nicht zahlen, try/except ist besser:
sehen Sie den Zugewinn an Prägnanz, und in der Vermeidung der fummelig string-manipulation und testen!-)
Sehe ich viele Antworten tun
int(s.strip())
, aber das ist supererogatorische: das Abisolieren ist nicht nötig!int
weiß genug, um zu ignorieren führende und nachfolgende Leerzeichen werden ganz von selbst!-)int
, was sich nicht geändert hat in 10 Jahren oder mehr!ipython
zu überprüfen, dassint
so wie es ist funktioniert. Blick auf die andere Seite - was würde ein erfahrener python Entwickler denken, als er sah, dass Sie Redundant strip-string, bevor die Nötigung, es zu int? Ich denke, er wäre ein wenig erschrocken und gehen würde, um den Autor mit einem WTF-Frage. Entweder Weg, Sie machen es weniger lesbar für jemanden, so ist es besser, es getan zu haben, zumindest rechts.int
war abhängig von der Laune der person, die es entworfen. Mathematisch gesprochen, wenn ein argument der Funktion ist nicht in der Domäne der Funktion ist, dann ist das Ergebnis undefiniert. Kann man sagen, dass " 123 " ist untrennbar in der Domäne der alle von string in int-Funktionen? Ich glaube nicht, dass man sagen kann dass. Die designer haben könnte geworfen, bad-argument-Ausnahme in diesem Fall. Stattdessen wählten Sie erweitern die Domäne zu gehören solche Argumente. Das ist es, was ich damit meine, 'Kontingent'. Mein argument ist, dass wegen dieser Bedingung, die eine explizitestrip
ist nicht redundant.ValueError
natürlich;-) für so harmlos, Häufig vorkommende umgebenden Leerzeichen wäre unpraktisch, so unpythonic, zwingen genau dasstrip
rufen Sie so lieben -- so zeigt er, dass sagte, Anruf geht gegen den Geist und die Praxis des Python, und es ist eine wirklich schlechte Idee. Wie, sagen wir,'ba%sju%s' % (str(x), str(y))
, zum Beispiel, ist schrecklich Praxis: "mathematisch gesprochen", kein Grund%s
solltestr
seine arg, aber es wäre schrecklich unPythonic wenn es gar nicht!-)int
sollten, wurden entwickelt. Es ist, was es ist. Ich spreche über das problem, das der Leser von der code tragen zu müssen, um eine kleine Tabelle im Kopf, über die Sprachen haben implizite-Streifen: Python: ja, C#: ja, Java: Nein, Delphi: Nein, etc.strip()
beeinträchtigt die Lesbarkeit des Codes, und in der Tat, es sagt dem Leser, dass wer schrieb den code erwartet es werden Leerzeichen, um die ganze Zahl. Die Redundanz nicht hinzufügen, eine erhebliche Menge an overhead (überprüfen Sie es heraus mittimeit
), so kann man nicht verwenden, die als Grundlage für Ihr argument, es sei denn, Sie verarbeiten Milliarden von Ganzzahlen. In meinem Kopf in beide Richtungen zu schreiben, es sind "richtige".timeit
sagt mir der Aufwandint(x.strip())
vsint(x)
liegt vom 63% und 84% -- Weise, die viele als "Grundlage für das argument": die Pythonic Verwendungen der Sprache, d.h. die guten und häufigen diejenigen, die die Sprache der Entwickler zu fördern und zu unterstützen (anstatt Sie zu entmutigen!), offensichtlich sind die, die die meiste Optimierung Aufmerksamkeit, also Geschwindigkeit führt oft erzählen Sie eine Menge über das, was Guido, ich und Dutzende von anderen Python-core-contributors, genehmigen, unterstützen, fordern und fördern. Aber ich bin sicher, Sie wissen besser als die Sprache die Hauptbeteiligten, richtig?-)timeit
falsch?1 - (timeit("int(' 1234 \\r\\n')") / timeit("int(' 1234 \\r\\n'.strip())"))
gibt mir13%
auf meinem Rechner und ein Unterschied von etwa 0.35 Sekunden für 1 million Zyklen. Vielleicht ist die Anwendung legt fest, ob oder nicht, das ist wichtig genug, um umgestalten von code, der verwendetstrip()
Redundant.python -mtimeit -s'x=" 23 "' 'int(x)'
ich Messen eine Reihe von 0.297 zu 0.329 usec, w/python -mtimeit -s'x=" 23 "' 'int(x.strip())'
, 0.535 zu 0.546 --timeit
ist am besten an einem shell-prompt w/python -mtimeit -s'<setup>' 'code'
, btw. Diese zahlen zeigen 63% auf 84% overhead für die redundante.strip
Call (Anruf es 68% +- 5%, in etwa).# int() does strip
. Aber wenn ich nicht muss, würde ich lieber den explizitenstrip
da der code ist besser als Kommentare. Kommentare liegen kann, aber der code nicht.Dieser Streifen alles, außer zahlen und dem " - " - Zeichen. Wenn Sie sicher sein können, dass es nicht immer alle überschüssigen Zeichen außer Leerzeichen, verwenden Sie gruszczy Methode statt.
int('243\r\n'.strip())
Aber das wird dir nicht helfen, wenn etwas anderes als eine Zahl übergeben wird. Setzen Sie stets versuchen, mit Ausnahme und fangen
ValueError
.Sowieso, das funktioniert auch:
int('243\n\r ')
, so dass Sie vielleicht gar nicht brauchenstrip
.BEARBEITEN:
Warum gehst du nicht einfach deine eigene Funktion schreiben, das wird die Ausnahme abfangen und eine vernünftige Standard-und in einigen utils-Modul?
Könnte man nur:
Aber es wirft ein
ValueError
wenn Sie das abisolierteunsafe_string
ist keine gültige Zahl. Sie können natürlich fangen die ValueError und tun, was Sie möchten.int('234\r\n')
funktioniert, ohne Streifen, also meine Funktion ist hier völlig überflüssig.Ohne zu wissen, welche Arten von Eingängen, die Sie erwarten, ist es schwer zu sagen, was ist "genug" um dieses Problem zu lösen. Wenn Sie nur besorgt über nachfolgende Zeilenumbrüche, dann Xavier Combelle oder gruszczy ist Antwort genug:
Wenn Sie eine ganze Zahl, die irgendwo in einem string, dann müssen Sie vielleicht, so etwas wie dieses:
Unter Python 3.0 (LEERLAUF), das hat funktioniert, schön
Wenn man sich mit input, den Sie nicht Vertrauen können, Sie sollte nie trotzdem, dann ist es eine gute Idee zu nutzen, versuchen Sie, mit der Ausnahme, pass-Blöcke zur Steuerung Ausnahmen, wenn die Benutzer inkompatible Daten. Es könnte Ihnen bessere server zu denken versuchen, außer, pass Strukturen als defensive Maßnahmen zum Schutz der Daten-Kompatibilität, anstatt einfach investieren wollte, verheimlichte Fehler.
Ich hoffe, das hilft.
fn für "str " float" ist ein bisschen mehr dadurch erschwert, aber ich denke, ich kann es tun, wenn es nötig ist.