Есть ли какая-то функция типа str.isnumeric
, но применима для float?
'13.37'.isnumeric() #False
Я все еще использую это:
def isFloat(string):
try:
float(string)
return True
except ValueError:
return False
Есть ли какая-то функция типа str.isnumeric
, но применима для float?
'13.37'.isnumeric() #False
Я все еще использую это:
def isFloat(string):
try:
float(string)
return True
except ValueError:
return False
Как говорит Имран, ваш код абсолютно прекрасен, как показано.
Тем не менее, он поощряет клиентов isFloat
вниз по пути "Look Before You Leap" вместо того, чтобы путь Pythonic "проще просить прощения, чем разрешение".
Это больше Pythonic для клиентов, чтобы предположить, что у них есть строка, представляющая float, но будьте готовы обработать исключение, которое будет выбрано, если это не так.
Этот подход также имеет хороший побочный эффект преобразования строки в float один раз вместо двух.
Небольшое обобщение:
def strType(var):
try:
if int(var) == float(var):
return 'int'
except:
try:
float(var)
return 'float'
except:
return 'str'
Ваш код в порядке. Решения на основе выражений чаще всего подвержены ошибкам.
Быстрое тестирование с timeit
показывает float(str_val)
действительно быстрее, чем re.match()
>>> timeit.timeit('float("-1.1")')
1.2833082290601467
>>> timeit.timeit(r"pat.match('-1.1')", "import re; pat=re.compile(r'^-?\d*\.?\d+(?:[Ee]-?\d+)?$');")
1.5084138986904527
И используемое выше выражение не выдает один крайный аргумент, он не может соответствовать '-1.'
, хотя float()
с радостью преобразует его в соответствующее значение float.
Там есть уловка: float ('nan') возвращает nan, исключение исключено;)
Расширение от результатов @Imran:
>>> timeit('float("-1.1")', number=10000000)
1.365271806716919
>>> timeit(r"isfloat('-1.1')", """def isfloat(s): t = s.partition('.');
return t[1] and t[0].isdigit() and (not t[2] or t[2].isdigit());""",
number=10000000)
2.565232992172241
>>> timeit(r"pat.match('-1.1')", "import re; pat=re.compile(r'^-?\d*\.?\d+(
...: ?:[Ee]-?\d+)?$');", number=10000000)
3.258622169494629
My partition
решение намного быстрее, чем регулярное выражение, но медленнее, чем float
; однако имеет то преимущество, что не поднимает ошибок (поэтому вы можете использовать его, например, в понимании).
Это обрабатывает граничные условия, такие как 1.
, но не такие специализации, как NaN
.
isinstance(myVariable, float)
будет работать, если вы тестируете переменную с плавающей точкой.
Изменить: слишком быстро говорили, не совсем понимали, что вы пытались получить.