[python] 변수가 정수인지 아닌지 확인


14 Answers

지금까지 제안 된 모든 대답은 double (파이썬의 실수는 실제로 두 배입니다) 또한 정수가 될 수 있다는 사실을 놓치고있는 것 같습니다 (소수점 뒤에 아무 것도없는 경우). 이것을 확인하기 위해 double에 내장 된 is_integer() 메서드를 사용합니다.

예 (for 회 돌이에서 매 x 번째 무언가를하기) :

for index in range(y): 
    # do something
    if (index/x.).is_integer():
        # do something special

편집하다:

이 메서드를 호출하기 전에 항상 float로 변환 할 수 있습니다. 세 가지 가능성 :

>>> float(5).is_integer()
True
>>> float(5.1).is_integer()
False
>>> float(5.0).is_integer()
True

그렇지 않으면 Agostino가 말한 것처럼 이것이 int인지 먼저 확인할 수 있습니다.

def is_int(val):
    if type(val) == int:
        return True
    else:
        if val.is_integer():
            return True
        else:
            return False
Question

변수가 정수인지 어떻게 확인합니까?




당신이 int 가 아닌 경우에 이것을 할 수 있습니다 :

var = 15.4
if(var - int(var) != 0):
    print "Value is not integer"



문자열이 숫자로만 구성되어 있는지 확인하려고하지만 int로 변환해도 도움이되지 않으면 항상 regex를 사용할 수 있습니다.

import re
x = "01234"
match = re.search("^\d+$", x)
try: x = match.group(0)
except AttributeError: print("not a valid number")

Result: x == "01234"

이 경우 x가 "hello"이면 숫자 유형으로 변환하면 ValueError가 발생하지만 데이터는 프로세스에서 손실됩니다. 정규 표현식을 사용하고 AttributeError를 잡으면 문자열의 숫자 문자를 확인할 수 있습니다 (예 : leading 0).

AttributeError를 던지기를 원하지 않고보다 구체적인 문제를 찾고 싶다면 정규식을 다양하게하고 일치를 확인할 수 있습니다.

import re
x = "h01234"
match = re.search("\D", x)
if not match:
    print("x is a number")
else:
    print("encountered a problem at character:", match.group(0))

Result: "encountered a problem at character: h"

실제로 예외를 사용하지 않고 문제가 발생한 위치를 보여줍니다. 다시 말하지만, 이것은 유형을 테스트하는 것이 아니라 문자 자체를 테스트하는 것입니다. 이렇게하면 형식을 확인하는 것보다 훨씬 유연성이 뛰어납니다. 특히 형식간에 변환을 수행하면 0을 선행하는 것처럼 중요한 문자열 데이터가 손실 될 수 있습니다.




숫자가 정수인지를 확인할 수 있습니다. 예 : 7.0

def is_int(x):
    if x - round(x) == 0 :
        return True
    else:
        return False



Python 버전 (2.x vs 3.x)을 고려하지 않으려면 six ( PyPI )를 사용하고 integer_types 속성을 사용하십시오.

import six

if isinstance(obj, six.integer_types):
    print('obj is an integer!')

six (매우 가벼운 단일 파일 모듈) 내에서이 작업을 수행하는 것입니다.

import sys
PY3 = sys.version_info[0] == 3

if PY3:
    integer_types = int,
else:
    integer_types = (int, long)



유형 검사를 수행하는 또 다른 옵션이 있습니다.

예 :

  n = 14
  if type(n)==int:
  return "this is an int"



x = n ** (1.0 / m) 인 경우를 생각해 보자. 여기서 n = 10 ** 5, m = 5이다. 파이썬에서 x는 부동 소수점 산술 연산 때문에 정수가 아닌 10.000000000000002가됩니다.

그래서 나는

if str(float(x)).endswith('.0'): print "It's an integer."

이 코드로 테스트했습니다 :

for a in range(2,100):
    for b in range(2,100):
        x = (a**b)**(1.0/b)
        print a,b, x, str(float(x)).endswith('.0')

모든 a와 b에 대해 True를 출력합니다.




>>> isinstance(3, int)
True

자세한 내용은 here 를 참조 here .

이것은 int 와 같은 속성을 찾는 경우에는 도움이되지 않습니다. 이 경우에는 long 확인하고 싶을 수도 있습니다.

>>> isinstance(3L, (long, int))
True

이 종류의 검사를 파이썬 소스의 배열 / 인덱스 유형에 대해 보았지만 C 외부에서 볼 수는 없다고 생각합니다.

토큰 그래서 답장 : 당신은 그 유형을 확인해야합니까? 처리 할 수없는 유형을 전달하지 않거나 잠재적 인 코드 재사용자를 능가하려고 시도하지 마십시오. 함수에 int를 전달하지 않는 좋은 이유가있을 수 있습니다.




단순한 것만 큼 복잡한 것은 아닙니다.

if type(var) is int:



다음은 정수를 결정하는 간단한 예제입니다.

def is_int(x):
    print round(x),
    if x == round(x):
        print 'True',
    else:
        print 'False'

is_int(7.0)   # True
is_int(7.5)   # False
is_int(-1)    # True    



파일에서 읽고 배열이나 사전에 여러 데이터 유형 값이있는 경우 다음이 유용합니다. 변수가 int (또는 적용하려는 다른 데이터 유형)로 유형 변환 될 수 있는지 여부를 확인하십시오.

try :
    int(a);
    #Variable a is int
except ValueError : 
    # Variable a is not an int



그러한 기본적이고 유효하며 믿을만한 질문이 제기 될 때 그러한 열띤 토론이 생겨나는 것은 정말 놀랍습니다.

어떤 사람들은 int (및 long )에 대한 유형 검사가 큰 십진수가있는 느슨한 경우를 지적했습니다. 맞아.

어떤 사람들은 '그냥 x + 1 을해야하고 실패했는지 확인해야한다고 지적했습니다. 음, 한 가지로, 이것은 float에서도 작동합니다. 반면에, 확실히 숫자가 아니지만 + 연산자를 어떤 식 으로든 정의하는 클래스를 만드는 것은 쉽습니다.

나는 당신이 유형을 확인해서는 안된다는 것을 강력하게 선언하는 많은 게시물과 확답이 없습니다. 글쎄, GvR은 순수한 이론에서 옳을 수도있는 것을 말했지만 실제로는 isinstance 종종 유용한 목적으로 사용됩니다. (예전에는 링크가 없으므로 GvR에서 관련 정보를 읽을 수 있습니다. 이 같은 게시물에 문제가 있음).

재미있는 것은 얼마나 많은 사람들이 OP의 의도는 주어진 x유형 이 숫자 정수형인지를 확인하는 것이라고 생각하는 것입니다. OP의 단어를 사용할 때 일반적으로 의미하는 것입니다 : x 가 정수를 나타내는 지 여부 . 이것은 매우 중요 할 수 있습니다. 누군가에게 얼마나 많은 항목을 선택할지 묻는 것처럼, 음수가 아닌 정수를 다시 확인할 수 있습니다. 이와 같은 사용 사례는 많습니다.

그것은 제 의견으로는 (1) 타입 검사가 ONE이고 프로그램의 정확성을 측정하는 경우가 많다는 것을 알아야합니다. (2) 종종 의미있는 값으로 묶여 있고 값을 벗어납니다. 말도 안돼. 때로는 일부 간헐적 인 값이 의미를가집니다. 예를 들어 모든 숫자를 고려할 때, 실제의 (복잡하지 않은) 정수 값만 주어진 경우에 가능할 수 있습니다.

재미 아닌 사람은 x == math.floor( x ) 확인하는 것을 언급하는 것 같습니다. 그게 큰 10 진수 클래스에서 오류를 발생 시킨다면, 아마도 OOP 패러다임을 다시 생각할 때입니다. 목록 인덱스로 사용되기 위해 너무도 명백하지는 않지만 정수가 아닌 값을 사용하는 방법을 고려하는 PEP 357 이 있습니다. 내가 솔루션을 좋아하는지 확실하지 않다.




다음은 여기에 언급 된 여러 가지 방법에 대한 요약입니다.

  • int(x) == x
  • try x = operator.index(x)
  • isinstance(x, int)
  • isinstance(x, numbers.Integral)

다음은 정수 값을 갖는 다양한 숫자 유형에 적용하는 방법입니다.

당신은 그들이 100 % 일치하지 않는 것을 볼 수 있습니다. 분수와 Rational은 개념적으로 동일하지만, 하나는 .index() 메소드를 제공하고 다른 하나는 제공하지 않습니다. 복잡한 부분은 실수 부분이 정수이고 허수 부분이 0 인 경우에도 int로 변환하는 것을 싫어합니다.




이를 수행하는 간단한 방법은 1로 나누기에서 나머지가 0인지 아닌지 직접 확인하는 것입니다.

if this_variable % 1 == 0:
    list.append(this_variable)
else:
    print 'Not an Integer!'



번호가 정사각형인지 확인하고이 문제가 발생했는지 확인하기 위해 프로그램을 작성했습니다. 사용한 코드는 다음과 같습니다.

import math
print ("this program will tell you if a number is square")
print ("enter an integer")
num = float(input())
if num > 0:
    print ("ok!")
    num = (math.sqrt(num))
    inter = int(num)
    if num == inter:
            print ("It's a square number, and its root is")
            print (num)
    else:
            print ("It's not a square number, but its root is")
            print (num)
else:
    print ("That's not a positive number!")

숫자가 정수인지 확인하려면 사용자 입력을 루팅 한 값에서 반올림 한 정수 (값으로 저장 됨)로 변환 한 후 두 숫자가 같으면 첫 번째 숫자가 정수 여야합니다. 응답 할 프로그램. 이 일을하는 가장 짧은 방법은 아니지만 그것은 나를 위해 일했습니다.






Related



Tags

python python