Как в Python 3 реализовать проверку на целое число? (все положительные, отрицательные целые числа и ноль)
6 Answers
Чтобы проверить является ли строка введённая пользователем целым числом, можно воспользоваться int в try/except, похожим образом как показано в ответе на вопрос «Python 3 Проверка на дробное число введённое пользователем», порекомендованный @Alex.B, заменив float на int как @gil9red предложил и @slippyk явно показал:
def isint(s):
try:
int(s)
return True
except ValueError:
return False
Пример:
>>> isint('10')
True
>>> isint('a') # не десятичная цифра
False
>>> isint('²') # верхний индекс
False
>>> isint('১') # Bengali (Unicode)
True
Это может сломаться, если ввод не строка, например:
>>> isint(0.5) # XXX не работает для float
True
>>> 0.5 .is_integer()
False
>>> from numbers import Integral
>>> isinstance(0.5, Integral)
False
>>> isinstance(123, Integral)
True
>>> isinstance(1., Integral) # XXX float
False
>>> 1..is_integer() # но целое значение
True
>>> from fractions import Fraction
>>> isint(Fraction(1, 2)) # XXX не работает для дробей
True
>>> isinstance(Fraction(1, 2), Integral)
False
>>> isinstance(Fraction(1), Integral) # XXX дробь
False
>>> Fraction(1) == 1 # даже если целое значение
True
См. How to check if a float value is a whole number.
Если вы хотите проверить, что переданная строка содержит только десятичные цифры и ничего более (к примеру, нет '+','-', ' ', '\n' символов в ней), то можно str.isdecimal использовать:
>>> '123'.isdecimal()
True
>>> '+123'.isdecimal()
False
>>> isint('+123')
True
>>> isint(' 123\n')
True
>>> ' 123\n'.isdecimal()
False
isdecimal() можно использовать, чтобы имена файлов, содержащие цифры, в "естественном" порядке отсортировать (как Windows-проводнике). См. Python analog of natsort function (sort a list using a “natural order” algorithm).
Если хотите несколько таких чисел из ввода извлечь, можно регулярное выражение использовать:
>>> import re
>>> from datetime import datetime
>>> date_string = '2016-11-01 23:04:05'
>>> datetime(*map(int, re.findall(r'\d+', date_string)))
datetime.datetime(2016, 11, 1, 23, 4, 5)
Последнее, это возможно более простой, менее строгий (и эффективный) вариант для:
>>> datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')
datetime.datetime(2016, 11, 1, 23, 4, 5)
Если вы хотите разрешить задавать целые числа в произвольном основании как в исходном коде Питона, то передайте base=0:
>>> int('0b1110', 0) # binary ("01")
14
>>> int('0xcafe', 0) # hexadecimal
51966
Подробнее в документации int.
- 52,361
-
-
-
@AndrioSkur неверно. Подумайте в чём разница между str.isdecimal, str.isdigit, str.isnumeric. И даже если бы не было разницы, то посмотрите в ответе на явный пример:
'+123'. – jfs Jan 23 '18 at 14:52 -
Ок. Но
'+123'это оверкилл. Это уже может и не записаться в разные места. Так можно и'1 + 2 / 3'за число считать – Andrio Skur Jan 23 '18 at 15:15 -
@AndrioSkur прочтите вопрос, автор явно упоминает отрицательные числа, если вы думаете что '+123' не нужно поддерживать, то
'-123'ответ обязан поддерживать.¶ Даже если бы не нужно было знаки поддерживать, то isdigit всё равно не следует использовать. Посмотрите на явный пример с верхним индексом в ответе ('²'). – jfs Jan 23 '18 at 15:50
Про числа в питоне почитайте:
a = int('19') # Переводим строку в число
b = int('19.5') # Строка не является целым числом
Traceback (most recent call last):
File "", line 1, in
ValueError: invalid literal for int() with base 10: '19.5'
В чем проблема исправить уже готовую функцию? @gil9red прямым текстом.
def isInt(value):
try:
int(value)
return True
except ValueError:
return False
isInt(input())
- 6,161
-
Бывал на данном ресурсе и читал про числа. Данный кусок демонстрирует преобразование строки в число. Мне-же нужна именно проверка на то, что переменная является целым числом. (В идеале - условие на проверку данных, введенных пользователем. – CD4 Nov 01 '16 at 07:10
-
-
-
Нужно просто изменить функцию из комментария
Alex.B, воспользовавшись советомgil9red– slippyk Nov 01 '16 at 07:53 -
Следуйте pep-8 соглашениям имён, если нет особых причин их нарушать в вашем конкретном случае. Не используйте camelCase для имён функций, можно
isint()назвать вместо этого. – jfs Nov 01 '16 at 23:05
принимает числовые значения
def isInt(n):
return int(n) == float(n)
>>> isInt(122)
True
>>> isInt(12.2)
False
>>> isInt(12.0)
True
>>>
- 498
-
это неверно. 1- это вместо возвращения False, выбрасывает исключения для некоторых строк ('a') 2- даже если строку с целым числом передать, ломается (попробуйте число больше
2**53). float имеют ограниченную точность в Питоне, а int могут быть сколь угодно большими. Подробнее Ляп в Питоне: x + 1.0 < x – jfs Jan 24 '18 at 07:50
Проверка на самом деле простая. Как вы помните, любое деление или возведение в степень в Python некоего выражения приведёт к тому, что результат операции примет тип переменной float. Функция type() окажется бесполезной. Я для проверки пользуюсь простой формулой деления целого числа на число с плавающей запятой. Если число целое, то результат будет равен 1.0, а иначе отличаться от единицы. Вот пример кода для проверки возведённого в степень числа:
number = 170
a=number**(1/2)
if int(a)/float(a)==1.0:
print('Квадратный корень из',int(number),'равен', int(number**(1/2)), ' - является целым числом')
else:
print('Квадратный корень из',int(number),'- не целое число.')
Попробуй через type(variable).
Например: if type(var) is int: print('Variable: %d is int!' % var)
- 446
Используйте стандартный метод
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False
- 1,696
floatменяете наintи будет тоже самое – gil9red Nov 01 '16 at 06:19