Se você se preocupou com o desempenho (e eu não estou sugerindo que você deveria), a abordagem baseada em tentativas é a vencedora (em comparação com a abordagem baseada em partições ou a abordagem regexp), desde que você não espere muito seqüências inválidas, nesse caso, é potencialmente mais lento (provavelmente devido ao custo do tratamento de exceções).
Novamente, não estou sugerindo que você se preocupe com o desempenho, apenas fornecendo os dados para o caso de você fazer isso 10 bilhões de vezes por segundo, ou algo assim. Além disso, o código baseado em partição não manipula pelo menos uma sequência válida.
$ ./floatstr.py
F ..
partição triste: 3.1102449894
partição feliz: 2.09208488464
..
re sad: 7.76906108856
feliz: 7.09421992302
..
tente triste: 12.1525540352
tente feliz: 1.44165301323
.
==================================================== ====================
FAIL: test_partition (__main __. ConvertTests)
-------------------------------------------------- --------------------
Traceback (última chamada mais recente):
Arquivo "./floatstr.py", linha 48, na partição test_
self.failUnless (is_float_partition ("20e2"))
AssertionError
-------------------------------------------------- --------------------
Ran 8 testes em 33.670s
FAILED (falhas = 1)
Aqui está o código (Python 2.6, regexp retirado da resposta 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()