Задать вопрос

Как произвести проверку входных данных Python?

Учу Python и програмирование в целом 3 день. Написал простенькую МЕГАпрогу :)
# coding=utf-8

import math

vibor = int(raw_input("Если нужно вычислить длину гипотенузы введите 1, а если катета, введите 2: "))
while vibor != 1 and vibor != 2:
        vibor = int(raw_input("Вы невнимательны!!! Если нужно вычислить длину гипотенузы введите 1, а если катета, введите 2: "))

if vibor == 1:
    catet_a = int(raw_input("Длина первого катета = "))
    while catet_a <= 0:
        catet_a = int(raw_input("Длина катета должна быть больше нуля! Вверите ещё раз. Катет = "))

    catet_b = int(raw_input("Длина второго катета = "))
    while catet_b <= 0:
        catet_b = int(raw_input("Длина катета должна быть больше нуля! Вверите ещё раз. Катет = "))

    gepotenuza = math.sqrt(catet_a ** 2 + catet_b ** 2)
    print("Гипотенуза = " +  str(gepotenuza))

elif vibor == 2:
    catet_a = int(raw_input("Длина первого катета = "))
    while catet_a <= 0:
        catet_a = int(raw_input("Длина катета должна быть больше нуля! Вверите ещё раз. Катет = "))

    gepotenuza = int(raw_input("Длина гипотенузы = "))
    while gepotenuza <= catet_a:
        gepotenuza = int(raw_input("Длина гипотенузы должна быть больше длины катета! Введите ещё раз. Гипотенуза = "))

    catet_b = math.sqrt(gepotenuza ** 2 - catet_a **2)
    print("Катет = " + str(catet_b))

Когда пользователь вводит числа - всё окей. Но когда вводит строку интерпретатов возвращает ошибку.
Вопрос. Как можно зделать проверку что пользователь ввёл int() а не str() ???

P.S. Все замечания по коду только приветствуются!
P.S. Версия Python 2.7
  • Вопрос задан
  • 9183 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Tiendil
@Tiendil
Разработчик ПО.
try:
    vibor = int(vibor)
except ValueError:
    print u'неверный формат данных'
    exit()
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
ArthurG
@ArthurG
isinstance("", str)  # => True
isinstance(0, str)  # => False
isinstance("", int)  # => False
isinstance(0, int)  # => True
Ответ написан
donkaban
@donkaban
Умею рисовать тени
Попробуйте воспринять достаточно простую идею.
Если вы обрабатываете неправильный параметр - вы проверяете что-то и пишете что-то типа "неверный параметр, я ожидаю цисло, а вы вводите строку". Если вы не совершите никаких проверок, интерпретатор питона напишет вам то же самое. Динамическая типизация, все такое.
Еще раз : не стоит проверять параметры, если реакция интерпретатора не оличается от вашей, зачем писать лишний код?
Ответ написан
adugin
@adugin Куратор тега Python
Специально написал посложнее (в жизни так не надо), в учебных целях.
Если разберётесь, как и почему оно работает - научитесь очень многому.
# -*- coding: utf-8 -*-

from itertools import starmap, imap
from math import sqrt

options = {str(index):option for (index, option) in enumerate('Cathetus|Hypotenuse'.split('|'), 1)}

if __name__ == '__main__':
    while True:
        try:
            menu = '\n'.join(
                starmap('-'.join(chr(0x20)*2).join(['{}']*2).format, options.items())
            )
            choice = raw_input('\nCalculate:\n%s\n\nYour choice: ' % menu)
            side = options[choice]
            sign = -1 if int(choice) == 1 else 1
            print
            query = lambda index: raw_input('Enter side #%s: = ' % index)
            sides = sorted(float(x) for x in imap(query, options))
            assert 0 < sides[0] <= sides[1], '\nERROR: Length must be a positive number!'
            result = sqrt(pow(sides[-1], 2) + sign*(min(sides)**2))
        except KeyError:
            print '\nERROR: No such option!'
        except ValueError:
            print '\nERROR: Length must be a number!'
        except AssertionError, error_text:
            print error_text
        else:
            print '\nResult: {:.2f}'.format(result)
            exit(0)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы