2015-09-22 2 views
-2

Предположим, что двум переменным, varA и varB, присваиваются значения, числа или строки.Как проверить тип переменной?

Написать кусок кода Python, который печатает одну из следующих сообщений:

«строка участия», если либо Vara или varB являются строки

«больше», если Вар больше varB

"равно", если Vara равно varB

"меньше", если Вара меньше varB

Введите код в поле ниже, если varA и varB уже определены.

Мой код

if type(varA) == type('s')) or (type(varB) == type('s')): 
    print "string involved" 
if int(varA)>int(varB): 
    print "bigger" 
elif (int(varA)<int(varB)): 
    print "smaller" 
else: 
    print "equal" 

Тестовые значения: varA = -7, varB = adieu результат:

ValueError: invalid literal for int() with base 10: 'adieu' 

Почему я получаю этот выход? Как решить эту проблему?

+0

К 'varB = adieu' вы имеете в виду' varB = «adieu''? Почему вы используете равенство типа, а не, например, 'isinstance (varA, basestring)'? – jonrsharpe

+1

int (varA) пытается преобразовать вашу строку в int. Это невозможно, если ваше первое условие - True. Если вы измените свой второй «если» на «elif», он больше не будет пытаться это сделать – Baart

ответ

1

Вам нужно пропустить второе испытание, если первое испытание истинно. Один из ваших аргументов - это строка, и эта строка не может быть преобразована в целое число, потому что Adieu состоит из букв, а не цифр.

Вы можете сделать это с помощью elif вместо if:

if type(varA) == type('s')) or (type(varB) == type('s')): 
    print "string involved" 
elif int(varA)>int(varB): 
    print "bigger" 
elif (int(varA)<int(varB)): 
    print "smaller" 
else: 
    print "equal" 

Вам не нужно конвертировать varA и varB в целых числах вообще здесь, хотя, потому что ваш первый тест уже установлено, что ни один не строки, и я знаю, назначение вы делаете только переходит в строки или целые числа:

if type(varA) == type('s')) or (type(varB) == type('s')): 
    print "string involved" 
elif varA > varB: 
    print "bigger" 
elif varA < varB: 
    print "smaller" 
else: 
    print "equal" 

Далее, вы не» t должен использовать type('s'), если вы можете напрямую ссылаться на результат этого теста, используя str; если вы собираетесь использовать type(), вы должны проверить идентичности вместо равенства здесь:

if type(varA) is str or type(varB) is str: 
    print "string involved" 
elif int(varA)>int(varB): 
    print "bigger" 
elif (int(varA)<int(varB)): 
    print "smaller" 
else: 
    print "equal" 

Это почти всегда лучше использовать isinstance() для проверки типов, хотя, так как это позволяет подклассов, чтобы пройти тест тоже:

if type(varA) == type('s')) or (type(varB) == type('s')): 
    print "string involved" 
elif varA > varB: 
    print "bigger" 
elif varA < varB: 
    print "smaller" 
else: 
    print "equal" 

Далее, вы не должны использовать type('s'), когда вы можете ссылаться на результаты этого теста непосредственно с помощью str; если вы собираетесь использовать type(), вы должны проверить идентичности вместо равенства здесь:

if isinstance(varA, str) or isinstance(varB, str): 
    print "string involved" 
elif varA > varB: 
    print "bigger" 
elif varA < varB: 
    print "smaller" 
else: 
    print "equal" 

Я сильно подозреваю, что ваше задание просит вас создать функцию, которая возвращает результата, не печатать. В этом случае вам необходимо использовать return заявление вместо:

if isinstance(varA, str) or isinstance(varB, str): 
    return "string involved" 
elif varA > varB: 
    return "bigger" 
elif varA < varB: 
    return "smaller" 
else: 
    return "equal"