Почему оператор! = В python не работает для типа функции (или это просто мой код)? - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу предоставить свой код, прежде чем задавать вопрос для некоторого контекста.

Мой код:

a = float(input('Insert the value for a: '))
b = float(input('Insert the value for b: '))
c = float(input('Insert the value for c: '))
if type(a) != (float() or int()):
print ('You didn\'t insert a number! Try again! This is your last chance or I will stop running!')
sleep(1)
print (a)
if type(b) != (float() or int()):
print ('You didn\'t insert a number! Try again! This is your last chance or I will stop running!')
sleep(1)
print (b)
if type(c) != (float() or int()):
print ('You didn\'t insert a number! Try again! This is your last chance or I will stop running!')
sleep(1)
print (c)

Это выводит (учитывая, что я ввожу значения):

Введите значение для: 8

Введите значение для b: 3

Введите значение для c: 2

Вы не вставили номер! Попробуйте снова! Это твой последний шанс, или я перестану бежать!

8,0

Вы не вставили номер! Попробуйте снова! Это твой последний шанс, или я перестану бежать!

3,0

Вы не вставили номер! Попробуйте снова! Это твой последний шанс, или я перестану бежать!

2,0

Проблема в том, что я указал, что если это не число с плавающей точкой или целое число, оно должно доставить сообщение. Но я вставил целое число, но оно все равно распечатало строку. В чем проблема? Можете ли вы назначить переменные типам чисел?

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Его печать именно то, что вы просите его напечатать

a = 1 

if a != 1 or a!=2:
    print('Of course, a != 2 is True!')
(xenial)vash@localhost:~/python/stack_overflow$ python3.7 insert.py
Of course, a != 2 is True!

Только один из операторов or должен быть равен True для выполнения оператора if, а с float != int он становится True и запускает print, как вы его просили сделать

0 голосов
/ 18 сентября 2018

!= отлично работает; проблема в том, что a != (b or c) не означает a != b or a != c: != не распространяется по or. Это не имеет ничего общего с типами.

0 голосов
/ 18 сентября 2018

Вы вызвали конструкторы float и int, которые без аргументов возвращают нулевое значение.

Итак:

if type(a) != (float() or int()):

переводится в:

if type(a) != (0.0 or 0):

, который затем (благодаря правилам булевой оценки) становится:

if type(a) != 0:

, что явно неверно.

Если вы хотите проверить точные типы, проверьте с помощью inдля tuple типов, например:

if type(a) not in (float, int):

Обычно вы хотите принять подклассы, поэтому подход Pythonic будет:

if not isinstance(a, (float, int)):

Конечно, ничего из этого не решит проблему проверки.Вы явно создали a, преобразовав str в float. всегда будет float или будет повышать ValueError, если строка не является допустимым значением float.Проверка типов никогда не поможет.

Итак, что вы действительно хотите - это выполнить преобразование в блоке try и перехватить исключение, если оно завершится неудачей:

try:
    a = float(input('Insert the value for a: '))
    b = float(input('Insert the value for b: '))
    c = float(input('Insert the value for c: '))
except ValueError:
    sys.exit('You didn\'t insert a number!')  # or some equivalent action to handle failure

Если вы хотите выполнить цикл, пока вам не дадут правильный номер, у нас есть несколько вопросов на выбор из (есть еще десятки, я просто могу 'не надо связывать их всех).

0 голосов
/ 18 сентября 2018

Вы хотите сделать:

if type(...) not in (float, int):

Потому что для этого нужен in оператор, а не звонить

Лучше:

if not isinstance(var,(float,int)):

Или неэффективным способом:

if type(...) is not float and type(...) is not int:

Вы также можете сделать:

import sys
try:
    a = float(input('Insert the value for a: '))
    b = float(input('Insert the value for b: '))
    c = float(input('Insert the value for c: '))
except ValueError:
    print('Error: Not a integer or float') 
    sys.exit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...