Programing

변수가 정수인지 아닌지 확인

lottogame 2020. 9. 29. 07:12
반응형

변수가 정수인지 아닌지 확인


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


이 작업을 수행해야하는 경우

isinstance(<var>, int)

원하는 경우 Python 2.x가 아닌 경우

isinstance(<var>, (int, long))

사용하지 마십시오 type. 다형성의 모든 유연성을 차단하기 때문에 파이썬에서는 거의 정답이 아닙니다. 당신이 하위 클래스를 경우 예를 들어, int새 클래스는 등록을해야 int한다, type하지 않을 것이다 :

class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True

이것은 파이썬의 강력한 다형성을 고수합니다 : 당신은 int그것이 하나라는 것을 요구하는 대신, 처럼 행동하는 모든 객체를 허용해야합니다 .

그러나

하지만 고전적인 파이썬 사고 방식은 허가보다 용서를 구하는 것이 더 쉽다는 것 입니다. 즉, x정수 인지 확인하지 마십시오 . 그것이 있다고 가정하고 그렇지 않은 경우 예외 결과를 포착합니다.

try:
    x += 1
except TypeError:
    ...

이 사고 방식은 추상베이스 클래스 의 사용에 의해 서서히 추월되고 있습니다.이 클래스를 사용 하면 특별히 구성된 클래스에서 상속하도록하여 객체가 가져야하는 속성 (추가? 곱하기? 두 배?)을 정확히 등록 할 수 있습니다. 필요한 충분한 속성을 가진 객체를 정확하게 허용하기 때문에 이것이 최선의 해결책이 될 것이지만 사용 방법에 대한 문서를 읽어야합니다.


지금까지 제안 된 모든 답변은 double (파이썬의 부동 소수점은 실제로 double)도 정수 (소수점 뒤에 아무것도없는 경우)가 될 수 있다는 사실을 놓친 것 같습니다. 나는 is_integer()이것을 확인하기 위해 복식에 내장 방법을 사용합니다 .

예 (for 루프에서 x 번째마다 무언가를 수행하려면) :

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

편집하다:

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

>>> 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

당신이 경우 정말 확인해야합니다 그것은 사용하는 것이 좋습니다 추상 기본 클래스를 오히려 구체적인 클래스보다. 의미하는 정수의 경우 :

>>> import numbers
>>> isinstance(3, numbers.Integral)
True

이것은 검사를 just int또는 just intand 로 제한하지 않고 long정수로 작동하는 다른 사용자 정의 유형이 작동하도록 허용합니다.


여기에 언급 된 다양한 방법에 대한 요약은 다음과 같습니다.

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

정수 값을 가진 다양한 숫자 유형에 적용하는 방법은 다음과 같습니다.

Python 숫자 유형이 정수인지 확인하는 방법 표

100 % 일관성이 없다는 것을 알 수 있습니다. Fraction과 Rational은 개념적으로 동일하지만 하나는 .index()방법을 제공하고 다른 하나는 제공 하지 않습니다. 복잡한 유형은 실수 부분이 적분이고 허수 부분이 0 인 경우에도 int로 변환하는 것을 좋아하지 않습니다.

( np.int8|16|32|64(5)np.int8(5), np.int32(5)등이 모두 동일하게 동작)


>>> isinstance(3, int)
True

자세한 내용은 여기참조 하십시오 .

int유사 속성을 찾는 경우에는 도움이되지 않습니다 . 이 경우 다음을 확인할 수도 있습니다 long.

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

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

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


다음과 같은 것을 시도해보십시오.

if x%1 == 0: 

지나치게 복잡한 것보다 간단하게

if type(var) is int:

모든 소프트웨어에서 사용하는 간단한 방법은 이것입니다. 변수가 숫자로 구성되어 있는지 확인합니다.

test = input("Enter some text here: ")
if test.isdigit() == True:
   print("This is a number.")
else:
   print("This is not a number.")

기본적이고 타당하며 평범한 질문이 제기 될 때 그러한 열띤 토론이 다가오는 것을 보는 것은 정말 놀랍습니다.

어떤 사람들은 int(및 long) 에 대한 유형 검사 가 큰 십진수가 발생하는 경우를 잃을 수 있다고 지적했습니다 . 맞습니다.

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

나는 당신이 유형을 확인하지 말아야한다고 강력하게 선언하는 많은 게시물과 상충됩니다. 글쎄, GvR은 한때 순수한 이론에서는 옳을 수 있지만 실제로는 isinstance종종 유용한 목적을 제공 한다는 효과에 대해 말한 적이 있습니다. (얼마 전에는 링크가 없습니다. 에 게시물이 하나를 좋아한다 ).

재미있는 것은 얼마나 많은 사람들이 OP의 의도가 주어진 유형x숫자 정수 유형 인지 확인하는 것이라고 가정하는 것입니다. 내가 이해 한 것은 OP의 단어를 사용할 때 일반적으로 의미 x하는 것입니다. 정수를 나타내는 지 여부 입니다. 그리고 이것은 매우 중요 할 수 있습니다. 누군가에게 얼마나 많은 항목을 고르고 싶은지 묻는 것과 같이, 음이 아닌 정수를 돌려 받는지 확인하는 것이 좋습니다. 이와 같은 사용 사례가 많습니다.

제 생각에는 (1) 유형 검사가 프로그램 정확성에 대한 하나의 (그리고 종종 매우 거친) 측정이라는 것을 아는 것도 중요합니다. 왜냐하면 (2) 종종 의미가있는 경계 값이고 경계를 벗어난 값이기 때문입니다. 말도 안 돼요. 때로는 모든 숫자를 고려하는 것과 같이 일부 간헐적 값만 의미가 있습니다. 주어진 경우에는 실수 (복잡하지 않은) 정수만 가능할 수 있습니다.

재미있는 사람이 아닌 사람은 x == math.floor( x ). 큰 소수 클래스에 오류가 발생하면 OOP 패러다임을 다시 생각할 때입니다. 목록 인덱스로 사용하기 위해 명확 하지는 않지만 확실하게 정수와 같은 값을 사용하는 방법을 고려하는 PEP 357int있습니다. 내가 솔루션을 좋아하는지 확실하지 않습니다.


여기에서 SO 자체에 대한 관련 질문을 찾았습니다 .

Python 개발자는 유형을 확인하지 않고 유형별 작업을 수행하고 TypeError예외를 포착하는 것을 선호합니다 . 그러나 유형을 모르는 경우 다음이 있습니다.

>>> i = 12345
>>> type(i)
<type 'int'>
>>> type(i) is int
True

문자열이 숫자로만 구성되어 있는지 확인하고 싶지만 int로 변환해도 도움이되지 않는 경우 항상 정규식을 사용할 수 있습니다.

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를 포착하면 예를 들어 선행 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과 같은 중요한 문자열 데이터를 잃을 수있는 경우 더욱 그렇습니다.


확인하려는 값이 아래와 같이 정수로 캐스팅 된 것과 동일한 지 확인하지 않는 이유는 무엇입니까?

def isInt(val):
    return val == int(val)

변수가 문자열처럼 입력 된 경우 (예 :) '2010':

if variable and variable.isdigit():
    return variable #or whatever you want to do with it. 
else: 
    return "Error" #or whatever you want to do with it.

이것을 사용하기 전에 나는 그것을 해결 try/except하고 확인 (int(variable))했지만 더 긴 코드였습니다. 자원 사용이나 속도에 차이가 있는지 궁금합니다.


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

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    

그냥 필요하면 , operator.index( __index__특별한 방법) 제 생각에 갈 수있는 방법입니다. 정수로 안전하게 캐스트 할 수있는 모든 유형에서 작동해야하기 때문입니다. 즉, 실수, 정수, Integral 추상 클래스를 구현하지 않는 멋진 정수 클래스조차도 오리 타이핑으로 작동합니다.

operator.index 목록 인덱싱 등에 사용되는 것입니다. 그리고 제 생각에는 훨씬 더 많은 / 홍보용으로 사용되어야합니다.

사실 자르기 문제 등으로 인해 부동 소수점이 거부되고 모든 정수 유형 (예 : numpy 등)과 함께 작동하는지 확인하려는 경우 정수 값을 얻는 유일한 올바른 방법이라고 주장합니다. (아직) 추상 클래스를 지원하지 않을 수 있습니다.

이것은 무엇을 __index__했다 도입 을 위해!


Python 버전 (2.x 대 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)

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

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

.. 같은 numpy 검사 가있는 경우

isinstance(var, numbers.Integral)

.. (느림) 또는 ..

isinstance(var, (int, long, np.integer))

.. 모든 유형과 일치하기 위해이 변형처럼 np.int8, np.uint16...

( longPY3 하락)

인식 어떤 정수처럼 어디서나 개체가 까다로운 추측 게임이다. 확인 중

var & 0 == 0 

진실과 비 예외가 좋은 내기 일 수 있습니다. 마찬가지로 부호있는 정수 유형 만 확인합니다 .

var ^ -1 ==  -var - 1

를 사용할 수도 있습니다 str.isdigit. 찾아보세요help(str.isdigit)

def is_digit(str):
      return str.isdigit()

int 함수를 사용하여

intchecker = float(input('Please enter a integer: '))
intcheck = 0
while intcheck != 1:
    if intchecker - int(intchecker) > 0:
        intchecker = float(input("You didn't enter a integer. "
                                 "Please enter a integer: "))
    else:
        intcheck = 1
print('you have entered a integer')

int 가 없으면 다음과 같이 할 수 있습니다.

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

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

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

정수와 문자열로 주어진 정수를 모두 확인하려는보다 일반적인 접근 방식은 다음과 같습니다.

def isInt(anyNumberOrString):
    try:
        int(anyNumberOrString) #to check float and int use "float(anyNumberOrString)"
        return True
    except ValueError :
        return False

isInt("A") #False
isInt("5") #True
isInt(8) #True
isInt("5.88") #False *see comment above on how to make this True

숫자가 정사각형인지 확인하는 프로그램을 작성 중이 었는데이 문제가 발생했을 때 사용한 코드는 다음과 같습니다.

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!")

To tell if the number was an integer I converted the float number you get from square rooting the user input to a rounded integer (stored as the value ), if those two numbers were equal then the first number must have been an integer, allowing the program to respond. This may not be the shortest way of doing this but it worked for me.


#!/usr/bin/env python

import re

def is_int(x):

    if(isinstance(x,(int,long))):

        return True
    matchObj = re.match(r'^-?\d+\.(\d+)',str(x))

        if matchObj:

        x = matchObj.group(1)

        if int(x)-0==0:

            return True

     return False

print is_int(6)

print is_int(1.0)

print is_int(1.1)

print is_int(0.1)

print is_int(-956.0)

If you want to write a Python 2-3 compatible code

To test whether a value is an integer (of any kind), you can to do this :

# Python 2 and 3: 
import sys
if sys.version_info < (3,):
    integer_types = (int, long,)
else:
    integer_types = (int,)

>>> isinstance(1, integer_types)
True

# Python 2 only:
if isinstance(x, (int, long)):
     ...

# Python 3 only:
if isinstance(x, int):
    ...

source : http://python3porting.com/differences.html


It is very simple to check in python. You can do like this:

Suppose you want to check a variable is integer or not!

## For checking a variable is integer or not in python

if type(variable) is int:
     print("This line will be executed")
else:
     print("Not an integer")

The simplest way is:

if n==int(n):
    --do something--    

Where n is the variable


you can do this by:

name = 'Bob'
if type(name) == str:
    print 'this works'
else:
    print 'this does not work'

그리고 그것은 'this works'를 반환합니다 ...하지만 이름을 int (1)로 변경하면 이제 문자열이기 때문에 'this does not work'를 반환합니다 ... 시도 할 수도 있습니다.

name = int(5)
if type(name) == int:
    print 'this works'
else:
    print 'this does not work'

그리고 같은 일이 일어날 것입니다


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

예를 들면 :

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

참고 URL : https://stackoverflow.com/questions/3501382/checking-whether-a-variable-is-an-integer-or-not

반응형