Si vous vous souciez des performances (et je ne vous suggère pas de le faire), l'approche basée sur les essais est clairement gagnante (par rapport à votre approche basée sur les partitions ou à l'approche regexp), tant que vous ne vous attendez pas à beaucoup de chaînes non valides, auquel cas il est potentiellement plus lent (probablement en raison du coût de la gestion des exceptions).
Encore une fois, je ne suggère pas que vous vous souciez de la performance, je vous donne simplement les données au cas où vous le feriez 10 milliards de fois par seconde, ou quelque chose du genre. De plus, le code basé sur la partition ne gère pas au moins une chaîne valide.
$ ./floatstr.py
F..
partition triste: 3.1102449894
partition heureuse: 2.09208488464
..
re triste: 7.76906108856
re heureux: 7.09421992302
..
essayez triste: 12.1525540352
essayez heureux: 1.44165301323
.
=================================================== =====================
ÉCHEC: test_partition (__main __. ConvertTests)
-------------------------------------------------- --------------------
Traceback (dernier appel le plus récent):
Fichier "./floatstr.py", ligne 48, dans test_partition
self.failUnless (is_float_partition ("20e2"))
AssertionError
-------------------------------------------------- --------------------
Ran 8 tests en 33.670s
FAILED (échecs = 1)
Voici le code (Python 2.6, expression régulière tirée de la réponse de John Gietzen ):
def is_float_try(str):
try:
float(str)
return True
except ValueError:
return False
import re
_float_regexp = re.compile(r"^[-+]?(?:\b[0-9]+(?:\.[0-9]*)?|\.[0-9]+\b)(?:[eE][-+]?[0-9]+\b)?$")
def is_float_re(str):
return re.match(_float_regexp, str)
def is_float_partition(element):
partition=element.partition('.')
if (partition[0].isdigit() and partition[1]=='.' and partition[2].isdigit()) or (partition[0]=='' and partition[1]=='.' and pa\
rtition[2].isdigit()) or (partition[0].isdigit() and partition[1]=='.' and partition[2]==''):
return True
if __name__ == '__main__':
import unittest
import timeit
class ConvertTests(unittest.TestCase):
def test_re(self):
self.failUnless(is_float_re("20e2"))
def test_try(self):
self.failUnless(is_float_try("20e2"))
def test_re_perf(self):
print
print 're sad:', timeit.Timer('floatstr.is_float_re("12.2x")', "import floatstr").timeit()
print 're happy:', timeit.Timer('floatstr.is_float_re("12.2")', "import floatstr").timeit()
def test_try_perf(self):
print
print 'try sad:', timeit.Timer('floatstr.is_float_try("12.2x")', "import floatstr").timeit()
print 'try happy:', timeit.Timer('floatstr.is_float_try("12.2")', "import floatstr").timeit()
def test_partition_perf(self):
print
print 'partition sad:', timeit.Timer('floatstr.is_float_partition("12.2x")', "import floatstr").timeit()
print 'partition happy:', timeit.Timer('floatstr.is_float_partition("12.2")', "import floatstr").timeit()
def test_partition(self):
self.failUnless(is_float_partition("20e2"))
def test_partition2(self):
self.failUnless(is_float_partition(".2"))
def test_partition3(self):
self.failIf(is_float_partition("1234x.2"))
unittest.main()