Ответ 1
Проблема
Вы понимаете это правильно. not 0
(а также not 0.0
) возвращает True
в Python
. Простой тест можно сделать, чтобы увидеть это:
a = not 0
print(a)
Result: True
Таким образом, проблема объясняется. Эта строка:
if not x:
Необходимо изменить на что-то еще.
Решение
Существует несколько способов устранения проблемы. Я просто собираюсь перечислить их из того, что, по моему мнению, является наилучшим решением вплоть до последних возможных решений:
-
Для обработки всех возможных действительных случаев.
Так как
square
должен, естественно, ожидать ввода числа с исключением комплексного числа и долженreturn
ошибка в противном случае, я думаю, что лучшим решением является оценка с использованиемif not isinstance(x, numbers.Number) or isinstance(x, numbers.Complex):
def square(x=None): if not isinstance(x, numbers.Number) or isinstance(x, numbers.Complex): # this sums up every number type, with the exclusion of complex number print ("you have not entered x") else: y=x**2 return y list=[1, 3, 0 ,9] output=[] for item in list: y=square(item) output.append(y) print (output)
numbers.Number - абстрактный класс, чтобы проверить, является ли аргумент
x
числом (кредит Copperfield для указания этого).Выдержка из Документация по стандартной библиотеке Python объясняет, что вам нужно - за исключением сложного числа:
класс numbers.Number
Корень из числовой иерархии. Если вы просто хотите проверить, аргумент x является числом, не заботясь о том, какой тип, используйте isinstance (x, Number).
Но вы не хотите, чтобы ввод был сложным числом. Поэтому просто опустите его, используя
or isinstance(x, numbers.Complex)
Таким образом, вы пишете
definition
square
точно так, как вы хочу это. Это решение, я думаю, является лучшим решением по его полнота.
-
Для обработки только тех типов данных, которые вы хотите обрабатывать.
Если у вас есть список допустимых типов данных inpug, вы также можете использовать только те конкретные типы данных, которые хотите обрабатывать. То есть вы не хотите обрабатывать случаи для типов данных, отличных от того, что вы указали. Примеры:
if not instance(x, int): #just handle int if not instance(x, (int, float)): #just handle int and float if not instance(x, (numbers.Integral, numbers.Rational)): #just handle integral and rational, not real or complex
Вы можете легко изменить/расширить условие выше для разных данных типы, которые вы хотите включить или исключить, - в соответствии с вашими необходимость. Это решение, я думаю, является вторым лучшим благодаря его для проверки достоверности.
(Код выше делается более питоническим способом, как предлагается cat)
-
Не обрабатывать невозможные случаи: вы знаете, что пользователи не будут помещать в качестве ввода.
Подумайте об этом более свободно, если вы знаете - не типы данных, которые вы хотите обрабатывать, как во втором решении, - но типы данных, которые пользователь не поместил, тогда вы можете иметь более свободное состояние, например:
if not isinstance(x, numbers.Number): # this is ok, because the user would not put up complex number
Это решение, я думаю, является третьим лучшим благодаря one простейшей, но мощной проверки.
Единственным недостатком этого решения является то, что вы не обрабатываете сложный тип. Поэтому его можно реализовать только из-за того, что пользователи не будут иметь сложный номер в качестве входных данных.
-
Чтобы обрабатывать ошибки ввода только для известных возможных входов, которые могут вызывать ошибки.
Например, если вы знаете, что x всегда
int
илиNone
- и, следовательно, единственная возможная ошибка ввода - этоNone
- тогда мы можем просто написать логику, чтобы избежать оценкиy
только тогда, когдаx
None
выглядит следующим образом:def square(x=None): if x is None: print ("you have not entered x") else: y=x**2 return y list=[1, 3, 0 ,9] output=[] for item in list: y=square(item) output.append(y) print (output)
Это решение имеет силу простейшего.
... и тем не менее наиболее опасный для использования, если вы точно не знаете, что пользователи будут использовать для ввода. В противном случае это решение прекрасно, а также является самым простым.
Ваше решение, я думаю, более или менее относится к этой категории. Вы знаете, какой вклад даст пользователь, а что нет. Таким образом, используя это решение или ваше собственное решение:
if not x and not str(x).isdigit():
Хорошо, за исключением того, что примерное решение проще
Учитывая ваше дело, вы можете использовать любое решение выше, чтобы получить:
[1, 9, 0, 81]
(Side Note: Я пытаюсь отформатировать решения, чтобы они выглядели как "канонические решения" для удобства чтения. Таким образом, те, у кого есть те же вопросы и которые посещают эту страницу в будущем, смогут найти решения более всеобъемлющий и читаемый)