Seite 2 von 3

Verfasst: Sonntag 19. Juli 2009, 23:30
von EyDu
Bei so etwas einfachen kann man auch offensichtlich keine Fehler machen.

Code: Alles auswählen

>>> isint("- 1")
False
>>> int("- 1")
-1
>>> isint(" -1")
False
>>> int(" -1")
-1
>>> isint(" 1")
False
>>> int(" 1")
1

Verfasst: Dienstag 21. Juli 2009, 18:05
von birkenfeld
Inzwischen wird es wirklich einfacher, ``int()`` direkt aufzurufen.

Verfasst: Dienstag 21. Juli 2009, 20:46
von problembär
Stimmt leider.

Verfasst: Mittwoch 22. Juli 2009, 17:23
von problembär
Hallo nochmal,

hab' noch einmal drüber nachgedacht. Wie oben schon gesagt, müßte man am besten wohl einen regulären Ausdruck nehmen. In sowas sind ja die Perl-Leute Spezialisten, und sie haben sich auch damit befaßt, sogar mehrfach.

Das Ergebnis war aber immer noch nicht so, wie ich's wollte, deshalb hab' ich auch noch einen eigenen regulären Ausdruck (für float) geschrieben (der aber nicht diese "3E+23"-Sachen erkennt):

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import re

a = ('','foo 30','.20','20.',',20','20,','1.3E2', '2..3','++3','2.3.',
     '10','..3','0','100','100.23','1,100.23','-3E-2', "- 15.3", " 24.32   ",    "+ 32. ",         " - 21,23 ", "-.", "-")

patobj = re.compile("^ *[+-]? *(\d+|\d+\.\d*|\d*\.\d+) *$")

for i in a:

    if patobj.search(i):
        print i + " is True."
    else:
        print i + " is False."

    try:
        b = float(i)
        print i + " is Good."
    except:
        print i + " is Bad."
    print
Bestimmt entdeckt ihr jetzt wieder noch ein paar Schwächen.

Ist wohl ein bekanntes, aber gar nicht so einfaches Problem.

Viele Grüße

Verfasst: Mittwoch 22. Juli 2009, 17:27
von DasIch
problembär hat geschrieben:Wie oben schon gesagt, müßte man am besten wohl einen regulären Ausdruck nehmen.
Wieso auch einfach wenn es auch kompliziert und unvollständig geht?

Verfasst: Mittwoch 22. Juli 2009, 17:29
von problembär
Weil zumindest in Perl:
>>USe an eval, it's correct (by definition) and avoids possible errors
>QA Editors note: This solution doesn't work as described.
Außerdem lasse ich meine Anwendung sich wenn möglich nicht vorsätzlich aufhängen (try: ... except: ....), vor allem wenn ich meinen Code auch mal in andere Sprachen bringen will, die das nicht unterstützen.

Verfasst: Mittwoch 22. Juli 2009, 17:31
von DasIch
Zwischen eval, und int/float/complex besteht allerdings ein kleiner Unterschied.

Verfasst: Mittwoch 22. Juli 2009, 18:47
von EyDu
problembär hat geschrieben:Außerdem lasse ich meine Anwendung sich wenn möglich nicht vorsätzlich aufhängen (try: ... except: ....), vor allem wenn ich meinen Code auch mal in andere Sprachen bringen will, die das nicht unterstützen.
try-except ist bei Python allerdings vollkommen üblich und sogar ausdrücklich erwünscht (Stichwort: EAFP).

Das Umwandeln in eine andere Sprache ist ein wirklich sinnloses Argument. Jede Sprache hat ihre Eigenheiten und Paradigmen, welche auch beachtet werden sollten. Einfach kopieren macht keinen Sinn. Mit deinem Ansatz provozierst du zusätzlich noch Fehler. Zu schlechtem Code kommt dann noch ein fehlerhaftes Programm.

Verfasst: Mittwoch 22. Juli 2009, 19:44
von problembär
und unvollständig
Ist soweit nicht unvollständig. Bei den Leerzeichen war ich nur etwas großzügig. Das heißt, vor der Umwandlung in float muß man noch die Leerzeichen rausziehen:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import re

a = ('','foo 30','.20','20.',',20','20,','1.3E2', '2..3','++3','2.3.',
     '10','..3','0','100','100.23','1,100.23','-3E-2', "- 15.3", " 24.32   ",    "+ 32. ",         " - 21,23 ", "-.", "-")

patobj = re.compile("^ *[+-]? *(\d+|\d+\.\d*|\d*\.\d+) *$")

for i in a:

    if patobj.search(i):
        print i + " is True."
        i = i.replace(" ", "")
        i = float(i)
        print "Type of i is now: " + str(type(i))
    else:
        print i + " is False."
    print

Verfasst: Mittwoch 22. Juli 2009, 20:39
von birkenfeld
Trotzdem ist dein Code immer noch unvollständig, was z.B. 1e5 angeht.

Es ist ganz falsch, das potentielle Auslösen einer Exception als "aufhängen" zu bezeichnen. Exceptions sind eigentlich in allen Sprachen, die sie unterstützen, und in Python ganz besonders eben nicht so "außergewöhnlich", wie der Name vermuten ließe. Sie sind ein Sprachelement wie jedes andere, und werden z.B. auch ganz regulär verwendet, um das Ende eines Iterators zu signalisieren - jede "for"-Schleife, die du verwendest, verarbeitet Exceptions.

Zu den anderen Sprachen hat EyDu schon alles gesagt.

Verfasst: Mittwoch 22. Juli 2009, 22:48
von Leonidas
Schreiben wir in allen Sprachen Assembler... (abgesehen davon dass das gar nicht geht, weil es kaum ein Sprachelement gibt, dass wirklich in jeder Sprache vorkommt)

@birkenfeld: du solltest mal deine Signatur aktualisieren :)

Verfasst: Donnerstag 23. Juli 2009, 00:42
von EyDu
problembär hat geschrieben:Ist soweit nicht unvollständig.
Nur gut, dass niemand Tabs benutzt :wink: