2013-05-10 24 views
23

Mam aplikację, która ma kilka poleceń. Po wpisaniu określonego polecenia należy wpisać dodatkowe informacje o czymś/kimś. Teraz informacja musi być ściśle liczbą całkowitą lub ciągiem, w zależności od sytuacji.Jak sprawdzić, czy zmienna jest liczbą całkowitą lub łańcuchem?

Jednak cokolwiek wpisałeś w Pythonie używając raw_input() faktycznie jest łańcuchem, bez względu na to, a dokładniej, w jaki sposób powinienem krótko i bez wypróbować ... z wyjątkiem zobacz, czy zmienna składa się z cyfr lub znaków?

+2

Możesz zrobić: '" 0 ".isdigit()'. Dokumentacja: http://docs.python.org/2/library/stdtypes.html#str.isdigit – bernie

+0

Sprawdzanie typu obiektu w Pythonie jest złym pomysłem - czyni dynamiczną naturę Pythona mniej przydatną. * Łatwiej jest prosić o wybaczenie niż pozwolenie. * –

+1

Dlaczego niechęć do 'try'..'wyzób' tutaj? To jest * dokładnie * to, co użyjesz obsługi wyjątków * dla *. –

Odpowiedz

49

Moim zdaniem masz dwie opcje:

  • Po prostu spróbuj przekonwertować go na int, ale złap wyjątek:

    try: 
        value = int(value) 
    except ValueError: 
        pass # it was a string, not an int. 
    

    To jest podejście wymagające przebaczenia.

  • Jawnie sprawdzić, czy są tylko cyfry w ciągu:

    value.isdigit() 
    

    str.isdigit() zwraca True tylko wtedy, gdy wszystkie znaki w ciągu są cyfry (0 - 9).

    Odpowiednikiem typu unicode/Python 3 str jest unicode.isdecimal()/str.isdecimal(); tylko dziesiętne znaki Unicode mogą być konwertowane na liczby całkowite, ponieważ nie wszystkie cyfry mają rzeczywistą wartość całkowitą (U+00B2 SUPERSCRIPT 2 to cyfra, ale nie dziesiętnie, na przykład).

    Jest to często nazywane podejściem Pytaj o pozwolenie lub Look Before You Leap.

Ten ostatni nie wykryje wszystkich prawidłowych wartości int(), jako białe znaki i + i - są także dozwolone w int() wartości. Pierwsza forma z przyjemnością zaakceptuje numer ' +10 ', a druga nie.

Jeśli oczekujesz, że użytkownik zwykle wprowadzi liczbę całkowitą, użyj pierwszego formularza. Łatwiej (i szybciej) prosić o przebaczenie niż o pozwolenie w takim przypadku.

+0

Są inne opcje. Lepiej powiedzieć, że te dwie opcje są właśnie tym, co sam byś polecił. –

+0

@android: Inne opcje są przesadą w większości sytuacji. Ale to skwantyfikowało. –

+0

Problem polega na tym, że tak naprawdę nie rozumiem try ... z wyjątkiem, więc jeśli mógłbyś wyjaśnić to dokładniej, byłoby wspaniale. – user2154354

5

The isdigit method of the str type zwraca True iff podany łańcuch jest tylko jedną lub więcej cyfr. Jeśli tak nie jest, to wiesz, że ciąg powinien być traktowany jako ciąg znaków.

+1

isdigit() retransmisje False dla liczb ujemnych – Mawg

14

jeśli chcesz sprawdzić, co to jest:

>>>isinstance(1,str) 
False 
>>>isinstance('stuff',str) 
True 
>>>isinstance(1,int) 
True 
>>>isinstance('stuff',int) 
False 

jeśli chcesz dostać ints z raw_input

>>>x=raw_input('enter thing:') 
enter thing: 3 
>>>try: x = int(x) 
    except: pass 

>>>isinstance(x,int) 
True 
+0

Użyj łańcucha bazowego zamiast str, aby złapać unicode, zobacz http://stackoverflow.com/questions/1979004/what-is-the-difference-between-isinstanceaaa-basestring-and-isinstanceaaa – gseattle

+0

To jest dla mnie idealne, działa na liczby dodatnie i ujemne ... fajne, dzięki –

1

Nie sprawdzaj. Dalej i zakładaj, że jest to właściwy sygnał wejściowy, i złap wyjątek, jeśli tak nie jest.

intresult = None 
while intresult is None: 
    input = raw_input() 
    try: intresult = int(input) 
    except ValueError: pass 
1

zależności od definicji krótko, można użyć jednej z następujących opcji:

Powiązane problemy