Bir simli bir sıra (float) olub-olmadığını yoxlamaq üçün necə?

Bir simli Python-da rəqəm kimi təqdim oluna biləcəyini yoxlamaq üçün ən yaxşı üsul hansı?

İndi bir funksiyam var:

 def is_number(s): try: float(s) return True except ValueError: return False 

Hansı, çirkin və yavaş deyil, həssas görünür. Ancaq daha yaxşı bir üsul float , çünki əsas funksiyasında float çağırışı daha da pisləşir.

1335
09 дек. Daniel Goldberg tərəfindən təyin olunan 09 dekabr. 2008-12-09 23:03 '08 at 11:03 pm 2008-12-09 23:03
@ 34 cavab
  • 1
  • 2

Yalnız çirkin və yavaş deyil

İkisi də mübahisə edərdim.

Daimi ifadə və ya strings digər təhlil daha çirkin və yavaş olacaq.

Əminəm ki, hər şey daha uzundur. Bu funksiyanı çağırır və qaytarır. Ən çox görülən istisnalar yığın çərçivələri üçün geniş axtarış olmadan düşür, çünki cəhd edin / Catch bir çox yerüstü tətbiq etmir.

Problem hər hansı bir ədəd dönüşüm funksiyasının iki növ nəticəyə malik olmasıdır.

  • Nömrə olduqda sayı
  • Bir statusu kodu (məsələn, errno vasitəsilə) və ya bir istisna etibarlı bir sayı analiz edilə bilməyəcəyini göstərmək üçün.

C (bir nümunə kimi) bir neçə yolla bunun ətrafında yaranır. Python bunu açıq şəkildə bildirir.

Hesab edirəm ki, sizin kodunuz bunun üçün idealdır.

601
09 дек. Cavab S.Lott tərəfindən 09 dekabrda verilir. 2008-12-09 23:30 '08 saat 23:30 'da 2008-12-09 23:30

Əgər float əvəzinə ayrıştırma (pozitiv, imzalanmamış) tamsayılar isdigit() simli obyektlər üçün isdigit() istifadə edə bilərsiniz.

 >>> a = "03523" >>> a.isdigit() True >>> b = "963spam" >>> b.isdigit() False 
border=0

String üsulları - isdigit()

Unicode simvolunda Unicode - decimal / decimal ilə çox tanış olmayan bir şey də var

1404
09 дек. Cavab Zoomulator 09 Dec verilir . 2008-12-09 23:15 '08 at 11:15 pm 2008-12-09 23:15

Tl; DR ən yaxşı həll s.replace('.','',1).isdigit()

Müxtəlif yanaşmaları müqayisə edən bəzi testlər etdik.

 def is_number_tryexcept(s): """ Returns True is string is a number. """ try: float(s) return True except ValueError: return False import re def is_number_regex(s): """ Returns True is string is a number. """ if re.match("^\d+?\.\d+?$", s) is None: return s.isdigit() return True def is_number_repl_isdigit(s): """ Returns True is string is a number. """ return s.replace('.','',1).isdigit() 

Simli bir ədəd deyilsə, istisna olmaqla blok çox yavaş olur. Amma daha da önemlisi, cəhddən başqa bir üsul, elmi qeydləri düzgün idarə edən yeganə yanaşmadır.

 funcs = [ is_number_tryexcept, is_number_regex, is_number_repl_isdigit ] a_float = '.1234' print('Float notation ".1234" is not supported by:') for f in funcs: if not f(a_float): print('\t -', f.__name__) 

Üzən nöqtə təyinatı ".1234" dəstəklənmir:
- is_number_regex

 scientific1 = '1.000000e+50' scientific2 = '1e50' print('Scientific notation "1.000000e+50" is not supported by:') for f in funcs: if not f(scientific1): print('\t -', f.__name__) print('Scientific notation "1e50" is not supported by:') for f in funcs: if not f(scientific2): print('\t -', f.__name__) 

"1.000000e + 50" elmi notası dəstəklənmir:
- is_number_regex
- is_number_repl_isdigit
"1e50" elmi notası dəstəklənmir:
- is_number_regex
- is_number_repl_isdigit

EDIT: test nəticələri

 import timeit test_cases = ['1.12345', '1.12.345', 'abc12345', '12345'] times_n = {f.__name__:[] for f in funcs} for t in test_cases: for f in funcs: f = f.__name__ times_n[f].append(min(timeit.Timer('%s(t)' %f, 'from __main__ import %s, t' %f) .repeat(repeat=3, number=1000000))) 

aşağıdakı funksiyalar test edilmişdir:

 from re import match as re_match from re import compile as re_compile def is_number_tryexcept(s): """ Returns True is string is a number. """ try: float(s) return True except ValueError: return False def is_number_regex(s): """ Returns True is string is a number. """ if re_match("^\d+?\.\d+?$", s) is None: return s.isdigit() return True comp = re_compile("^\d+?\.\d+?$") def compiled_regex(s): """ Returns True is string is a number. """ if comp.match(s) is None: return s.isdigit() return True def is_number_repl_isdigit(s): """ Returns True is string is a number. """ return s.replace('.','',1).isdigit() 

2019

13 мая '14 в 22:28 2014-05-13 22:28 Sebastian tərəfindən verilmiş cavab 13 may '14 saat 10:28 2014-05-13 22:28

Hesab edirəm ki, bir istisna var: "NaN"

Əgər "NaN" üçün FALSE dönmək üçün is_number istəyirsinizsə, bu kod işləməyəcək, çünki Python bir nömrə olmayan (identifikasiya problemləri barədə danışmaq) bir rəqəmin öz təmsilçiliyinə çevrilir:

 >>> float('NaN') nan 

Əks halda, indi geniş istifadə etdiyim kod parçası üçün sizə təşəkkür edirəm. :)

G.

66
01 сент. Cavab gvrocha 01 sep tərəfindən verilir . 2010-09-01 17:06 '10 'da 17:06' da 2010-09-01 17:06

Bununla əlaqədar:

 '3.14'.replace('.','',1).isdigit() 

yalnız bir və ya olmadığı təqdirdə gerçəkliyi qaytarır. ədəd bir sıra.

 '3.14.5'.replace('.','',1).isdigit() 

saxta qaytarır

redaktə: başqa bir şərh gördüm ... başqa bir vəziyyət üçün .replace(badstuff,'',maxnum_badstuff) edə bilərsiniz. Əgər duz əldən, özbaşına zövqləri yoxsa (ref: xkcd # 974 ) yaxşı olarsa: P

52
26 мая '12 в 1:22 2012-05-26 01:22 cavab 26 may, saat 12: 00 -da verilir. 2012-05-26 01:22

Alfe ayrıca float'ı kompleks identifikatorlar olaraq yoxlamaq lazım olmadığını bildirdilər:

 def is_number(s): try: complex(s) # for int, long, float and complex except ValueError: return False return True 

Daha əvvəl dedilər: bir sıra istifadə etmək mümkün olmayan kompleks ədədləri (məsələn, 1 + 2i) yoxlamaq lazımdır ki, bəzi nadir hallar var:

 def is_number(s): try: float(s) # for int, long and float except ValueError: try: complex(s) # for complex except ValueError: return False return True 
39
26 июля '10 в 16:10 2010-07-26 16:10 Cavab 26 iyul 'da 16:10' da Matthew Wilcoxson tərəfindən verilmişdir 2010-07-26 16:10

Hansı, çirkin və yavaş deyil, həssas görünür.

Bu, bir az vaxt tələb edə bilər, amma bunun bir pitonik üsuludur. Daha qeyd olunduğu kimi, alternativlər daha pisdir. Bunun başqa bir üstünlüyü var: polimorfizm.

Duck çapının mərkəzi ideyası "əgər o, ördək kimi gedir və danışırsa, o, bir ördəkdir". Nə bir şey bir şamandıra çevrilə bilər, necə müəyyən bir dəyişiklik edə bilərsiniz ki, bir dize subclass lazımdır ki, qərar qəbul edirsiniz? Yoxsa başqa bir şeyi tamamilə sınamağa qərar verərsən? Bunu yuxarıda göstərilən kodu dəyişmədən edə bilərsiniz.

Digər dillər interfeyslərdən istifadə edərək bu problemləri həll edir. Hansı həllin başqa bir mövzu üçün daha yaxşı olduğunu təhlil edəcəyəm. Əslində, python mütləq tənlikin ördək kimi tərəfinə bağlıdır və Python-da çox şey planlamağı planlaşdırırsınızsa, məsələn, sözdizimə istifadə etmək məcburiyyətindəsiniz (lakin bu, əlbəttə ki, bunu sevməlisiniz demək deyil).

Hesabınıza daha çox diqqət yetirmək istəyə bilərsiniz: Python olduqca tez bir zamanda digər dillərlə müqayisədə istisnaları atır və sıxır (30 qat daha sürətli. NET). Heck, dil özü hətta müstəsna olmayan normal proqram şərtlərini keçmək üçün istisnalar yaradır (hər dəfə bir for loop üçün istifadə edirsiniz). Beləcə əhəmiyyətli bir problem olmadığını qədər bu kodun performans baxımından çox narahat olmayacağam.

37
11 дек. Jason Baker'a cavab 11 dekabr 2008-12-11 07:56 '08 at 7:56 2008-12-11 07:56

int üçün bu istifadə edin:

 >>> "1221323".isdigit() True 

Ancaq float üçün bəzi tövsiyələrə ehtiyacımız var ;-). Hər üzən nöqtə bir nöqtəyə sahib ...

 >>> "12.34".isdigit() False >>> "12.34".replace('.','',1).isdigit() True >>> "12.3.4".replace('.','',1).isdigit() False 

Həm də mənfi ədədlər üçün lstrip() əlavə lstrip() :

 >>> '-12'.lstrip('-') '12' 

İndi universal bir yol alırıq:

 >>> '-12.34'.lstrip('-').replace('.','',1).isdigit() True >>> '.-234'.lstrip('-').replace('.','',1).isdigit() False 
19
08 сент. Cavab Sdwdaw 08 sep tərəfindən verilir . 2015-09-08 11:42 '15 'də 11:42' de 2015-09-08 11:42

Yalnız Mimic C #

C # -də, skalar dəyərlərini təhlil edən iki fərqli funksiya var:

  • Float.Parse ()
  • Float.TryParse ()

float.parse ():

 def parse(string): try: return float(string) except Exception: throw TypeError 

Qeyd Tipi təhlükəsizliyə istisna niyə dəyişdiyini merak edərsənsə, buradakı sənədlər .

float.try_parse ():

 def try_parse(string, fail=None): try: return float(string) except Exception: return fail; 

Qeyd Hələ də dəyər növü olduğundan boolean dəyərini "Yanlış" qaytarmaq istəmirsiniz. Daha yaxşı bir şey yoxdur, çünki bir uğursuzluq olduğunu göstərir. Əlbəttə, başqa bir şey istəyirsinizsə, uğursuz parametrləri istədiyiniz hər şeyi dəyişə bilərsiniz.

Parse () və try_parse () funksiyalarını genişləndirmək üçün float genişləndirmək üçün bu üsulları əlavə etmək üçün float sinfi aradan buraxmalısınız.

Öncədən mövcud funksiyaları hörmət etmək istəyirsinizsə, kod belə olmalıdır:

 def monkey_patch(): if(!hasattr(float, 'parse')): float.parse = parse if(!hasattr(float, 'try_parse')): float.try_parse = try_parse 

SideNote: Şəxsən onu Monkey Punching deyirəm, çünki göründüyü kimi, mən bunu dilimdə istifadə etmirəm, amma YMMV.

Ərizə:

 float.parse('giggity') // throws TypeException float.parse('54.3') // returns the scalar value 54.3 float.tryParse('twank') // returns None float.tryParse('32.2') // returns the scalar value 32.2 

Pifon böyük müqəddəs Peyğəmbər müqəddəsə, Sharpisə dedi: "Hər şey edə bilərik, daha yaxşı edə bilərəm, səndən daha yaxşı bir şey edə bilərəm".

15
18 февр. Cavab Evan Plaice tərəfindən 18 fevralda verilir . 2012-02-18 04:35 '12 at 4:35 2012-02-18 04:35

Nömrələr deyil strings üçün, try: except: normal ifadələrdən asılı olaraq daha yavaşdır. Qüvvədə nömrələrin strings üçün, normal ifadə yavaş çalışır. Beləliklə, müvafiq üsul sizin girişinizdən asılıdır.

Özünüzü performansla əlaqəli taparsanız , isfloat adlı bir funksiya təmin edən fastnumbers adlı yeni bir üçüncü tərəf modul istifadə edə bilərsiniz. Tam açıqlama, mən yazaram. Onun nəticələrini aşağıda göstərilən vaxtlara daxil etdik.


 from __future__ import print_function import timeit prep_base = '''\ x = 'invalid' y = '5402' z = '4.754e3' ''' prep_try_method = '''\ def is_number_try(val): try: float(val) return True except ValueError: return False ''' prep_re_method = '''\ import re float_match = re.compile(r'[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?$').match def is_number_re(val): return bool(float_match(val)) ''' fn_method = '''\ from fastnumbers import isfloat ''' print('Try with non-number strings', timeit.timeit('is_number_try(x)', prep_base + prep_try_method), 'seconds') print('Try with integer strings', timeit.timeit('is_number_try(y)', prep_base + prep_try_method), 'seconds') print('Try with float strings', timeit.timeit('is_number_try(z)', prep_base + prep_try_method), 'seconds') print() print('Regex with non-number strings', timeit.timeit('is_number_re(x)', prep_base + prep_re_method), 'seconds') print('Regex with integer strings', timeit.timeit('is_number_re(y)', prep_base + prep_re_method), 'seconds') print('Regex with float strings', timeit.timeit('is_number_re(z)', prep_base + prep_re_method), 'seconds') print() print('fastnumbers with non-number strings', timeit.timeit('isfloat(x)', prep_base + 'from fastnumbers import isfloat'), 'seconds') print('fastnumbers with integer strings', timeit.timeit('isfloat(y)', prep_base + 'from fastnumbers import isfloat'), 'seconds') print('fastnumbers with float strings', timeit.timeit('isfloat(z)', prep_base + 'from fastnumbers import isfloat'), 'seconds') print() 

 Try with non-number strings 2.39108395576 seconds Try with integer strings 0.375686168671 seconds Try with float strings 0.369210958481 seconds Regex with non-number strings 0.748660802841 seconds Regex with integer strings 1.02021503448 seconds Regex with float strings 1.08564686775 seconds fastnumbers with non-number strings 0.174362897873 seconds fastnumbers with integer strings 0.179651021957 seconds fastnumbers with float strings 0.20222902298 seconds 

Gördüyünüz kimi

  • try: except: rəqəmsal giriş üçün sürətli idi, lakin yalnış giriş üçün çox yavaş oldu
  • Giriş girildikdə regex çox effektlidir
  • Hər iki halda fastnumbers qalib
15
14 авг. Cavab SethMMorton 14 aug verilir . 2014-08-14 06:34 '14 saat 06:34 'da 2014-08-14 06:34

Mən bilirəm ki, bu xüsusilə köhnədir, amma cavab verərəm ki, ən yüksək səs cavabından itkin olan məlumatları əhatə edirəm. Bu, onu tapanlar üçün çox dəyərli ola bilər:

Aşağıdakı üsulların hər biri üçün, qəbul edilməli olan hər hansı bir girişə ehtiyac varsa, onları metere bağlayın. (0-255 deyil, tamsayılar üçün səs təriflərindən istifadə edəcəyimizi fərz etsək)

x.isdigit() x tamsayı olub olmadığını yoxlamaq üçün yaxşı işləyir.

x.replace('-','').isdigit() x mənfi olub olmadığını yoxlamaq üçün yaxşı işləyir. (İlk mövqedə ilk giriş)

x.replace('.','').isdigit() x x.replace('.','').isdigit() olub olmadığını yoxlamaq üçün yaxşı işləyir.

x.replace(':','').isdigit() x əlaqənin olub olmadığını yoxlamaq üçün yaxşı işləyir.

x.replace('/','',1).isdigit() x x.replace('/','',1).isdigit() olub olmadığını yoxlamaq üçün yaxşı işləyir.

12
05 янв. Cavab Aruthawolf Jan 05 tərəfindən verilir 2016-01-05 18:21 '16 saat 06:21 'da 2016-01-05 18:21

Siz Unicode strings istifadə edə bilərsiniz, onlar istədiyiniz nə etmək üçün bir yol var:

 >>> s = u"345" >>> s.isnumeric() True 

Və ya:

 >>> s = "345" >>> u = unicode(s) >>> u.isnumeric() True 

http://www.tutorialspoint.com/python/string_isnumeric.htm

http://docs.python.org/2/howto/unicode.html

11
04 марта '13 в 19:12 2013-03-04 19:12 Cavab Blackzafiro tərəfindən 04.03.2013 saat 19:12 'da verildi. 2013-03-04 19:12

Float () xüsusilə bu üçün nəzərdə tutulmuşdur, çünki float üçün döküm və tutmaq ValueError yəqin ki, ən sürətli yoldur. Paralel strings (regex, və s.) Tələb edən hər şey bu əməliyyat üçün konfiqurasiya edilməməsi səbəbindən daha yavaş olma ehtimalı. Mənim $ 0.02.

10
09 дек. Cavab codelogic verilir 09 Dekabr. 2008-12-09 23:31 '08 at 11:31 pm 2008-12-09 23:31

Bu cavabı simvolu axtarmaq üçün nümunə olan funksiyaya aid bir addım-addım təlimat təqdim edir:

  • Müsbət sayı
  • Müsbət / mənfi - tam / float
  • Nömrə yoxlanarkən xətlərin "NaN" (bir nömrə deyil) necə düşməsi lazımdır?

Simli müsbət bir tamsayı olub olmadığını yoxlayın

Verilən bir simli müsbət tamsayı olub olmadığını yoxlamaq üçün str.isdigit() istifadə edə bilərsiniz.

Nəticələrin nümunələri:

 # For digit >>> '1'.isdigit() True >>> '1'.isalpha() False 

Müsbət / mənfi simli tam / float olduğunu doğrulayın

str.isdigit() simvolu mənfi və ya üzən nöqtə str.isdigit() qaytarır. Məsələn:

 # returns 'False' for float >>> '123.3'.isdigit() False # returns 'False' for negative number >>> '-123'.isdigit() False 

Əgər mənfi ədədləri və float yoxlamaq istəyirsinizsə, aşağıdakı kimi yoxlamaq üçün xüsusi bir funksiya yaza bilərsiniz:

 def is_number(n): try: float(n) # Type-casting the string to 'float'. # If string is not a valid 'float', # it'll raise 'ValueError' exception except ValueError: return False return True 

Məsələn çalıştırın:

 >>> is_number('123') # positive integer number True >>> is_number('123.4') # positive float number True >>> is_number('-123') # negative integer number True >>> is_number('-123.4') # negative 'float' number True >>> is_number('abc') # 'False' for "some random" string False 

Nömrə yoxlanarkən xəttləri "NaN" (bir nömrə) verməyin

Yuxarıda göstərilən funksiyalar Python üçün "NAN" (Not deyil) simvolu üçün True funksiyasını qaytaracaqdır, çünki Python üçün bu bir nömrə deyil, əks etdirən etibarlı float dəyəridir. Məsələn:

 >>> is_number('NaN') True 

math.isnan() "NaN" olub olmadığını yoxlamaq üçün, math.isnan() kimi istifadə edə bilərsiniz:

 >>> import math >>> nan_num = float('nan') >>> math.isnan(nan_num) True 

Və ya onu yoxlamaq üçün əlavə bir kitabxana idxal etmək istəmirsinizsə, sadəcə bunu == istifadə edərək, == müqayisə edə bilərsiniz. nan float özü ilə müqayisə edildikdə Python False qaytarır. Məsələn:

 # 'nan_num' variable is taken from above example >>> nan_num == nan_num False 

Buna görə, yuxarıdakı is_number funksiyası "NaN" üçün False ə qayıtmaq üçün yenilənə bilər :

 def is_number(n): is_number = True try: num = float(n) # check for "nan" floats is_number = num == num # or use 'math.isnan(num)' except ValueError: is_number = False return is_number 

Məsələn çalıştırın:

 >>> is_number('Nan') # not a number "Nan" string False >>> is_number('nan') # not a number string "nan" with all lower cased False >>> is_number('123') # positive integer True >>> is_number('-123') # negative integer True >>> is_number('-1.12') # negative 'float' True >>> is_number('abc') # "some random" string False 

PS: Hər bir çek üçün hər bir əməliyyat, növün tipindən asılı olaraq, əlavə yük daşıyır. Sizin tələblərinə cavab verən is_number funksiyasının versiyasını seçin.

8
11 февр. Cavab Moinuddin Quadri tərəfindən 11 Fevralda verilir . 2018-02-11 11:34 '18 'də saat 11: 34' də 2018-02-11 11:34

Hansı üsulun ən sürətli olduğunu bilmək istərdim. Ümumiyyətlə, check_replace funksiyası tərəfindən ən yaxşı və ən uyğun nəticələr verilmişdir. Ən sürətli nəticələr check_exception funksiyası ilə təyin olundu, lakin yalnız bir istisna check_exception - bu onun kodu ən effektivdir, lakin istisna atmaq üçün üstəlik olduqca böyükdür.

Müvəffəqiyyətli icraya nəzarət yoxlama metodudur, məsələn, check_exception ilə check_exception lakin digər iki test funksiyası Real float üçün yanlışlığı qaytarır:

 huge_number = float('1e+100') 

Burada istinad kodudur:

 import time, re, random, string ITERATIONS = 10000000 class Timer: def __enter__(self): self.start = time.clock() return self def __exit__(self, *args): self.end = time.clock() self.interval = self.end - self.start def check_regexp(x): return re.compile("^\d*\.?\d*$").match(x) is not None def check_replace(x): return x.replace('.','',1).isdigit() def check_exception(s): try: float(s) return True except ValueError: return False to_check = [check_regexp, check_replace, check_exception] print('preparing data...') good_numbers = [ str(random.random() / random.random()) for x in range(ITERATIONS)] bad_numbers = ['.' + x for x in good_numbers] strings = [ ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(random.randint(1,10))) for x in range(ITERATIONS)] print('running test...') for func in to_check: with Timer() as t: for x in good_numbers: res = func(x) print('%s with good floats: %s' % (func.__name__, t.interval)) with Timer() as t: for x in bad_numbers: res = func(x) print('%s with bad floats: %s' % (func.__name__, t.interval)) with Timer() as t: for x in strings: res = func(x) print('%s with strings: %s' % (func.__name__, t.interval)) 

MacBook Pro 201-də Python 2.7.10-un nəticələri:

 check_regexp with good floats: 12.688639 check_regexp with bad floats: 11.624862 check_regexp with strings: 11.349414 check_replace with good floats: 4.419841 check_replace with bad floats: 4.294909 check_replace with strings: 4.086358 check_exception with good floats: 3.276668 check_exception with bad floats: 13.843092 check_exception with strings: 15.786169 

MacBook Pro 201-də Python 3.6.5-dən əldə edilən nəticələr:

 check_regexp with good floats: 13.472906000000009 check_regexp with bad floats: 12.977665000000016 check_regexp with strings: 12.417542999999995 check_replace with good floats: 6.011045999999993 check_replace with bad floats: 4.849356 check_replace with strings: 4.282754000000011 check_exception with good floats: 6.039081999999979 check_exception with bad floats: 9.322753000000006 check_exception with strings: 9.952595000000002 

Aşağıda, MacBook Pro 201-də PyPy 2.7.13-dən aşağıdakı nəticələr verilmişdir:

 check_regexp with good floats: 2.693217 check_regexp with bad floats: 2.744819 check_regexp with strings: 2.532414 check_replace with good floats: 0.604367 check_replace with bad floats: 0.538169 check_replace with strings: 0.598664 check_exception with good floats: 1.944103 check_exception with bad floats: 2.449182 check_exception with strings: 2.200056 
8
16 янв. Cavab Ron Reiter tərəfindən verilir 2013-01-16 09:09 '13 at 9:09 2013-01-16 09:09

Bir sıra nömrələri olduğunuzu düşünürəm. str = "100949" və yalnız nömrələr olub olmadığını yoxlamaq istəyirsiniz

 if str.isdigit(): returns TRUE or FALSE 

isdigit docs

Əks halda, metodunuz simli bir rəqəmin görünüşünü tapmaq üçün yaxşı işləyir.

7
13 окт. Clayton 13 oktyabrda yerləşdirilib . 2014-10-13 12:17 '14 at 12:17 2014-10-13 12:17

Beləliklə, hər şeyi bir yerə qoymaq, Nan, sonsuzluq və kompleks ədədləri yoxlamaq (görünsəydilər, onlar i ilə deyil, yəni 1 + 2j ilə göstərildikdə) bu səbəb olur:

 def is_number(s): try: n=str(float(s)) if n == "nan" or n=="inf" or n=="-inf" : return False except ValueError: try: complex(s) # for complex except ValueError: return False return True 
6
23 марта '12 в 19:10 2012-03-23 19:10 Cavab 23 mart 2012 -ci il saat 19:10-da verilir. 2012-03-23 ​​19:10

Sizin kodunuz mənim üçün yaxşı görünür.

Yəqin ki, istisnaların istifadəsi səbəbindən kodun "qeyri-adi" olduğunu düşünürsünüz? Qeyd edək ki, Python proqramçıları kodunun okunabilirliğini yaxşılaşdırdıqları zaman istifadəsini istisna edirlər.

5
11 дек. Cavab Dubhead 11 dekabrda verilir. 2008-12-11 07:03 '08 saat 07:03 'de 2008-12-11 07:03

Bəzi sürət testlərini etdim. Bir simli ehtimalla bir ədəd olsaydı, cəhd / istisna strategiyası ən sürətli. Simli ədədi kimi ehtimalı yoxsa Integer yoxlamasında maraqlıysanız, bir növ test (isdigit plus başlığı '-') etməlisiniz. Bir üzən nöqtə nömrəsini yoxlamağınız istəyirsinizsə, çıxmadan qaçış / kod xaricindən istifadə etməlisiniz.

4
12 окт. cavab 12 oktyabr FxIII tərəfindən verilir . 2010-10-12 10:43 '10 at 10:43 2010-10-12 10:43

Simli əsas növlərə (float, int, str, bool) köçürüldüyünü müəyyənləşdirmək üçün lazım idi. İnternette heç bir şey tapmadım, sonra bunu yaratdım:

 def str_to_type (s): """ Get possible cast type for a string Parameters ---------- s : string Returns ------- float,int,str,bool : type Depending on what it can be cast to """ try: f = float(s) if "." not in s: return int return float except ValueError: value = s.upper() if value == "TRUE" or value == "FALSE": return bool return type(s) 

Misal

 str_to_type("true") # bool str_to_type("6.0") # float str_to_type("6") # int str_to_type("6abc") # str str_to_type(u"6abc") # unicode 

Siz növü tutmaq və istifadə edə bilərsiniz.

 s = "6.0" type_ = str_to_type(s) # float f = type_(s) 
4
03 июля '14 в 20:12 2014-07-03 20:12 Cavab astrodsg iyul 03 '14 saat 20:12 2014-07-03 20:12 verilir

Girişi aşağıdakı kimi ola bilər:

a="50" b=50 c=50.1 d="50.1"


1-Ümumi giriş:

Bu funksiyaya daxil olmaq hər hansı bir ola bilər!

Belirli bir değişkenin sayısal olub olmadığını bulur. Nümerik strings bir isteğe bağlı işarəsi, hər hansı bir ədəd, isteğe bağlı ondalık hissədən və isteğe bağlı eksponent hissədən ibarətdir. Beləliklə, + 0123.45e6 etibarlı sayısal dəyərdir. Hexadecimal (məsələn, 0xf4c3b00c) və ikili (məsələn, 0b10100111001) qeyd edilməsinə icazə verilmir.

is_numeric funksiyası

 import ast import numbers def is_numeric(obj): if isinstance(obj, numbers.Number): return True elif isinstance(obj, str): nodes = list(ast.walk(ast.parse(obj)))[1:] if not isinstance(nodes[0], ast.Expr): return False if not isinstance(nodes[-1], ast.Num): return False nodes = nodes[1:-1] for i in range(len(nodes)): #if used + or - in digit : if i % 2 == 0: if not isinstance(nodes[i], ast.UnaryOp): return False else: if not isinstance(nodes[i], (ast.USub, ast.UAdd)): return False return True else: return False 

test vəzifəsi:

 >>> is_numeric("54") True >>> is_numeric("54.545") True >>> is_numeric("0x45") True 

is_float funksiyası

Verilən bir dəyişənin üzən olub olmadığını tapır. Float strings isteğe bağlı bir xarakter, hər hansı bir ədəd, ...

 import ast def is_float(obj): if isinstance(obj, float): return True if isinstance(obj, int): return False elif isinstance(obj, str): nodes = list(ast.walk(ast.parse(obj)))[1:] if not isinstance(nodes[0], ast.Expr): return False if not isinstance(nodes[-1], ast.Num): return False if not isinstance(nodes[-1].n, float): return False nodes = nodes[1:-1] for i in range(len(nodes)): if i % 2 == 0: if not isinstance(nodes[i], ast.UnaryOp): return False else: if not isinstance(nodes[i], (ast.USub, ast.UAdd)): return False return True else: return False 

test vəzifəsi:

 >>> is_float("5.4") True >>> is_float("5") False >>> is_float(5) False >>> is_float("5") False >>> is_float("+5.4") True 

Ast nədir?


2- Dəyişən məzmunun simli olduğuna əminsəniz :

str.isdigit () metodunu istifadə edin

 >>> a=454 >>> a.isdigit() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'int' object has no attribute 'isdigit' >>> a="454" >>> a.isdigit() True 

3 rəqəmli giriş:

int dəyərini müəyyənləşdirin:

 >>> isinstance("54", int) False >>> isinstance(54, int) True >>> 

float aşkar:

 >>> isinstance("45.1", float) False >>> isinstance(45.1, float) True 
3
ответ дан user10461621 06 окт. '18 в 10:23 2018-10-06 10:23

РайанН предлагает

Если вы хотите вернуть False для NaN и Inf, измените строку на x = float (s); return (x == x) и (x - 1!= x). Это должно возвращать True для всех поплавков, кроме Inf и NaN

Но это не совсем работает, потому что для достаточно больших поплавок x-1 == x возвращает true. Например, 2.0**54 - 1 == 2.0**54

3
ответ дан philh 29 июля '13 в 17:08 2013-07-29 17:08

Я также использовал указанную вами функцию, но вскоре я заметил, что строки как "Нан", "Инф" и ее вариация считаются цифрами. Поэтому я предлагаю вам улучшенную версию вашей функции, которая вернет false для этих типов ввода и не выйдет из строя "1e3" вариантов:

 def is_float(text): try: float(text) # check for nan/infinity etc. if text.isalpha(): return False return True except ValueError: return False 
1
ответ дан mathfac 16 окт. '16 в 0:11 2016-10-16 00:11

Вы можете использовать регулярное выражение.

 number = raw_input("Enter a number: ") if re.match(r'^\d+$', number): print "It integer" print int(number) elif re.match(r'^\d+\.\d+$', number): print "It float" print float(number) else: print("Please enter a number") 
1
ответ дан Avinash Raj 23 авг. '15 в 16:22 2015-08-23 16:22

Этот код обрабатывает показатели, числа с плавающей точкой и целые числа, без использования регулярных выражений.

 return True if str1.lstrip('-').replace('.','',1).isdigit() or float(str1) else False 
0
ответ дан ravi tanwar 16 дек. '18 в 10:12 2018-12-16 10:12

Если вы хотите знать, может ли вся строка быть представлена ​​в виде числа, вы хотите использовать regexp (или, возможно, преобразовать float в строку и сравнить ее с исходной строкой, но я предполагаю, что не очень быстро).

0
ответ дан m_eiman 10 дек. '08 в 12:15 2008-12-10 12:15

Bunu sınayın.

  def is_number(var): try: if var == int(var): return True except Exception: return False 
0
ответ дан TheRedstoneLemon 30 мая '15 в 20:12 2015-05-30 20:12

Я работал над проблемой, которая привела меня к этой теме, а именно: как конвертировать коллекцию данных в строки и числа наиболее интуитивно понятным способом. Я понял, прочитав исходный код, что то, что мне нужно, было различным по-разному:

1 - Мне нужен целочисленный результат, если строка представляет целое число

2 - Я хотел, чтобы число или результат строки вставлялись в структуру данных

поэтому я применил исходный код для создания этой производной:

 def string_or_number(s): try: z = int(s) return z except ValueError: try: z = float(s) return z except ValueError: return s 
0
ответ дан user1508746 09 нояб. '14 в 17:06 2014-11-09 17:06

Вы можете обобщить технику исключения полезным способом, возвращая более полезные значения, чем True и False. Например, эта функция ставит кавычки вокруг строк, но оставляет числа в одиночку. Это именно то, что мне нужно для быстрого и грязного фильтра, чтобы сделать некоторые определения переменных для R.

 import sys def fix_quotes(s): try: float(s) return s except ValueError: return '"{0}"'.format(s) for line in sys.stdin: input = line.split() print input[0], '<- c(', ','.join(fix_quotes(c) for c in input[1:]), ')' 
0
ответ дан Thruston 25 мая '13 в 0:36 2013-05-25 00:36

Вот мой простой способ сделать это. Скажем, что я перебираю некоторые строки, и я хочу добавить их в массив, если они окажутся числами.

 try: myvar.append( float(string_to_check) ) except: continue 

Замените myvar.apppend любой операцией, которую вы хотите сделать с строкой, если она окажется числом. Идея состоит в том, чтобы попытаться использовать операцию float() и использовать возвращаемую ошибку, чтобы определить, является ли строка числом.

0
ответ дан Anil 16 июля '09 в 20:45 2009-07-16 20:45
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос