Kann man irgendwie feststellen, ob ein String steht für eine ganze Zahl (z.B., '3'
, '-17'
aber nicht '3.14'
o 'asfasfas'
) Ohne Verwendung eines try/except-Mechanismus?
is_int('3.14') == False
is_int('-7') == True
Kann man irgendwie feststellen, ob ein String steht für eine ganze Zahl (z.B., '3'
, '-17'
aber nicht '3.14'
o 'asfasfas'
) Ohne Verwendung eines try/except-Mechanismus?
is_int('3.14') == False
is_int('-7') == True
Die richtige RegEx-Lösung würde die Ideen von Greg Hewgill und Nowell kombinieren, aber keine globale Variable verwenden. Sie können dies erreichen, indem Sie ein Attribut an die Methode anhängen. Ich weiß auch, dass es verpönt ist, Importe in eine Methode einzufügen, aber was ich anstrebe, ist ein "Lazy Module"-Effekt wie http://peak.telecommunity.com/DevCenter/Importing#lazy-imports
bearbeiten: Meine Lieblingstechnik ist bisher die ausschließliche Verwendung von Methoden des String-Objekts.
#!/usr/bin/env python
# Uses exclusively methods of the String object
def isInteger(i):
i = str(i)
return i=='0' or (i if i.find('..') > -1 else i.lstrip('-+').rstrip('0').rstrip('.')).isdigit()
# Uses re module for regex
def isIntegre(i):
import re
if not hasattr(isIntegre, '_re'):
print("I compile only once. Remove this line when you are confident in that.")
isIntegre._re = re.compile(r"[-+]?\d+(\.0*)?$")
return isIntegre._re.match(str(i)) is not None
# When executed directly run Unit Tests
if __name__ == '__main__':
for obj in [
# integers
0, 1, -1, 1.0, -1.0,
'0', '0.','0.0', '1', '-1', '+1', '1.0', '-1.0', '+1.0',
# non-integers
1.1, -1.1, '1.1', '-1.1', '+1.1',
'1.1.1', '1.1.0', '1.0.1', '1.0.0',
'1.0.', '1..0', '1..',
'0.0.', '0..0', '0..',
'one', object(), (1,2,3), [1,2,3], {'one':'two'}
]:
# Notice the integre uses 're' (intended to be humorous)
integer = ('an integer' if isInteger(obj) else 'NOT an integer')
integre = ('an integre' if isIntegre(obj) else 'NOT an integre')
# Make strings look like strings in the output
if isinstance(obj, str):
obj = ("'%s'" % (obj,))
print("%30s is %14s is %14s" % (obj, integer, integre))
Und für die weniger abenteuerlustigen Mitglieder der Klasse, hier ist das Ergebnis:
I compile only once. Remove this line when you are confident in that.
0 is an integer is an integre
1 is an integer is an integre
-1 is an integer is an integre
1.0 is an integer is an integre
-1.0 is an integer is an integre
'0' is an integer is an integre
'0.' is an integer is an integre
'0.0' is an integer is an integre
'1' is an integer is an integre
'-1' is an integer is an integre
'+1' is an integer is an integre
'1.0' is an integer is an integre
'-1.0' is an integer is an integre
'+1.0' is an integer is an integre
1.1 is NOT an integer is NOT an integre
-1.1 is NOT an integer is NOT an integre
'1.1' is NOT an integer is NOT an integre
'-1.1' is NOT an integer is NOT an integre
'+1.1' is NOT an integer is NOT an integre
'1.1.1' is NOT an integer is NOT an integre
'1.1.0' is NOT an integer is NOT an integre
'1.0.1' is NOT an integer is NOT an integre
'1.0.0' is NOT an integer is NOT an integre
'1.0.' is NOT an integer is NOT an integre
'1..0' is NOT an integer is NOT an integre
'1..' is NOT an integer is NOT an integre
'0.0.' is NOT an integer is NOT an integre
'0..0' is NOT an integer is NOT an integre
'0..' is NOT an integer is NOT an integre
'one' is NOT an integer is NOT an integre
<object object at 0x103b7d0a0> is NOT an integer is NOT an integre
(1, 2, 3) is NOT an integer is NOT an integre
[1, 2, 3] is NOT an integer is NOT an integre
{'one': 'two'} is NOT an integer is NOT an integre
Ich mache das ständig, weil ich eine leichte, aber zugegebenermaßen irrationale Abneigung gegen die Verwendung des Musters "versuchen/ausnehmen" habe. Ich verwende dies:
all([xi in '1234567890' for xi in x])
Negative Zahlen werden nicht berücksichtigt. Sie können also alle Minuszeichen auf der linken Seite entfernen und dann prüfen, ob das Ergebnis Ziffern von 0-9 enthält:
all([xi in '1234567890' for xi in x.lstrip('-')])
Sie können auch x an str() übergeben, wenn Sie nicht sicher sind, dass die Eingabe eine Zeichenkette ist:
all([xi in '1234567890' for xi in str(x).lstrip('-')])
Es gibt einige (Rand?)Fälle, in denen dies nicht funktioniert:
type(1E2)
gibt <class 'float'>
während type(10^2)
gibt <class 'int'>
.type(---1)
gibt zurück. <class int>
. Es ist jedoch nicht ganz konsistent mit dem Interpreter, da int('---1')
gibt einen Fehler, aber meine Lösung liefert True
mit der gleichen Eingabe.Es wird also nicht funktionieren für jede mögliche Eingaben, aber wenn Sie diese ausschließen können, ist es eine gute einzeilige Prüfung, die folgende Ergebnisse liefert False
wenn x keine ganze Zahl ist und True
wenn x eine ganze Zahl ist. Aber wenn Sie wirklich ein Verhalten wünschen, das genau modelliert die int()
eingebaut, sind Sie besser dran, wenn Sie try/except verwenden.
Ich weiß nicht, ob es pythonisch ist, aber es ist nur eine Zeile, und es ist relativ klar, was der Code tut.
*Ich will damit nicht sagen, dass der Interpreter führende Minuszeichen ignoriert, sondern nur, dass eine beliebige Anzahl von führenden Minuszeichen nichts daran ändert, dass das Ergebnis eine ganze Zahl ist. int(--1)
wird tatsächlich interpretiert als -(-1)
, oder 1. int(---1)
wird interpretiert als -(-(-1))
oder -1. Eine gerade Anzahl von führenden Minuszeichen ergibt also eine positive ganze Zahl, eine ungerade Anzahl von Minuszeichen eine negative ganze Zahl, aber das Ergebnis ist immer eine ganze Zahl.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
28 Stimmen
Warum versuchen beide, dies "auf die harte Tour" zu tun? Was ist falsch an try/except?
8 Stimmen
Ja, was ist falsch an try/except? Es ist besser, um Vergebung zu bitten als um Erlaubnis.
82 Stimmen
Ich würde fragen, warum sollte diese einfache Sache try/except erfordern? Das Ausnahmesystem ist ein komplexes Biest, aber dies ist ein einfaches Problem.
19 Stimmen
@Aivar hör auf, FUD zu verbreiten. Ein einzelner try/except-Block ist nicht einmal annähernd "komplex".
68 Stimmen
Es ist aber nicht wirklich FUD. Sie würden effektiv schreiben 4 Zeilen Code, erwarten, dass etwas zu explodieren, fangen, dass Ausnahme und tun Ihre Standard, anstatt mit einem Einzeiler.
2 Stimmen
Isinstance(deine_variable, basestring) sagt dir, ob die Variable entweder str oder unicode ist, oder beides. Dies beantwortet zwar nicht die spezifische Frage oben (mit der Umwandlung von String in eine Zahl), aber es beantwortet mindestens eine Frage, die als Duplikat zu dieser auf einer anderen Seite markiert ist, oder zumindest die Frage, die ich hatte, als ich diese Seite fand.
0 Stimmen
Hausaufgaben verbieten manchmal die Verwendung von try:. Wenn eine Ausnahme auftritt, selbst wenn Sie sie behandeln, wird sie erkannt und Sie bestehen die Aufgabe nicht.
4 Stimmen
@johnktejik Hier ist eine Idee - erstellen Sie einen Webservice, der die Frage beantwortet, ob eine Zeichenkette eine ganze Zahl sein kann, und stellen Sie dann im Code Ihrer Aufgabe eine HTTP-Anfrage an ihn. Der Webservice kann das try/catch ausführen
3 Stimmen
@dagrooms Ich liebe es. Ich frage mich, ob ihr Hacker-Alarm losgehen würde.
1 Stimmen
@S.Lott ich versuche dies in einem Listenverständnis zu tun also kein Versuch außer
2 Stimmen
Ausnahmen sind in Python üblich. Man kann nicht einmal eine
for
Schleife ohne Ausnahmebehandlung - einefor
Schleife stoppt, wenn der Iterator einStopIteration
Ausnahme. Die Website Entwurfsabsicht ist, dass Sie, wenn Sie wissen wollen, ob eine Zeichenkette als Ganzzahl interpretiert werden kann, die Funktionint
und fangen die Ausnahme ab.5 Stimmen
"Mach es auf die pythonische Art!", "Mach es auf die Microsoft-Art!", "Mach es auf die Google-Art!", "Mach es auf meine Art!". Wie wäre es mit Der Auftraggeber hat eine Frage gestellt, wie man etwas macht und die Bedingungen dafür genannt. Ich habe ein ähnliches Problem: Ich versuche herauszufinden, wie ich ein Element in einer Liste überprüfen kann, und die Übung sagt ausdrücklich, dass ich try/except nicht verwenden kann, und einige andere Einschränkungen, einschließlich einiger Einschränkungen hinsichtlich Leistung und Optimierung. Bis jetzt habe ich noch keine Lösung für diese Aufgabe gefunden.
2 Stimmen
@S.Lott Wenn Ausnahmen nicht außergewöhnlich sind, warum werden sie dann Ausnahmen genannt? Ausnahmen sollten für die Behandlung von Fehlern (und ich meine Fehler: Programmierfehler) sein. Ausnahmen sind der einzige Teil von Python, den ich nicht mag.
0 Stimmen
Ich denke, dass die Tatsache, dass OP nicht genau definiert, was ob eine Zeichenkette eine ganze Zahl darstellt hat zu einem Haufen unnötiger Verwirrung und Streitereien geführt.
1 Stimmen
Warum nicht try/except verwenden? Weil man sie nicht in einer Lambda-Funktion verwenden kann, wie man sie z.B. in
filter()
. Natürlich ist die Definition einer Nicht-Lambda-Funktion immer kurz und klar, so dass es keine große Sache ist, aber es ist gültig Frage.0 Stimmen
Was ist der Unterschied zu
s.isnumeric()
?