programing

어떤 물체가 숫자인지 확인하는 가장 단순한 방법은 무엇입니까?

megabox 2023. 8. 2. 08:58
반응형

어떤 물체가 숫자인지 확인하는 가장 단순한 방법은 무엇입니까?

임의의 파이썬 객체가 주어진다면, 그것이 숫자인지 아닌지를 판단하는 가장 좋은 방법은 무엇입니까?여기서is는 로정니다됩으로 됩니다.acts like a number in certain circumstances.

예를 들어, 벡터 클래스를 쓰고 있다고 가정합니다.다른 벡터가 주어지면 점 곱을 찾으려고 합니다.스칼라가 지정된 경우 전체 벡터의 배율을 조정하려고 합니다.

가 떤어것 확지는중하인지 것.int,float,long,bool사용자 정의 개체는 숫자처럼 작동할 수 있으므로 사용자 정의 개체에는 적용되지 않습니다., 하만지, 는하것을 하는 것__mul__예를 들어, 방금 설명한 벡터 클래스가 정의하기 때문에 충분하지 않습니다.__mul__하지만 제가 원하는 번호는 아닐 겁니다

모듈을 사용하여 테스트합니다.isinstance(n, Number) 가능

>>> from numbers import Number
... from decimal import Decimal
... from fractions import Fraction
... for n in [2, 2.0, Decimal('2.0'), complex(2, 0), Fraction(2, 1), '2']:
...     print(f'{n!r:>14} {isinstance(n, Number)}')
              2 True
            2.0 True
 Decimal('2.0') True
         (2+0j) True
 Fraction(2, 1) True
            '2' False

물론 이것은 오리 타이핑과는 반대입니다.개체실제보다 어떻게 작동하는지가 더 중요한 경우 숫자가 있는 것처럼 작업을 수행하고 예외를 사용하여 그렇지 않은 경우를 알려줍니다.

당신은 어떤 물체가

특정 상황에서 숫자처럼 행동합니다.

Python 2.5 이상 버전을 사용하는 경우, 유일한 실제 방법은 이러한 "특정 상황" 중 일부를 확인하고 확인하는 것입니다.

2.6 이서는을 사용할 수 .isinstance숫자가 있는숫자 - 이 목적을 위해 정확히 존재하는 추상 기본 클래스(ABC)(더 많은 ABC가 존재함)collections다양한 형태의 컬렉션/컨테이너를 위한 모듈로, 다시 2.6부터 시작합니다. 또한 이러한 릴리스에서만 필요한 경우 자신만의 추상 기본 클래스를 쉽게 추가할 수 있습니다.)

2.5 및 이전 버전에 바흐를 추가할 수 있습니다.0그리고 주목할 만하다"는 것이 경우에 따라 좋은 정의가 될 수 있습니다.하지만 여러분은 스스로에게 무엇이 여러분이 "숫자"라고 생각하고 싶은 것이 확실히 가능해야 하는지, 그리고 그것이 절대적으로 불가능해야 하는지에 대해 물어볼 필요가 있습니다. 그리고 확인해야 합니다.

은 또한 할 수도 , 있는 을 추가하기 당신 당신이 2.6 상서필수에 등록되지 않은 것을 추가하기 위해 필요할 입니다. 아마도 당신이 관심 있는 유형을 추가하기 위해 당신 자신의 등록을 하기 위해 당신이 아직 등록되지 않은 유형을 추가하기 위해 필요할 것입니다.numbers.Numbers숫자라고 주장하지만 처리할 수 없는 일부 유형을 제외하고 싶다면 ABC가 없기 때문에 훨씬 더 많은 주의가 필요합니다.unregister를 들어 당신은 자신의 수 ].WeirdNum거기에 그런 이상한 유형을 등록하고, 먼저 확인합니다.isinstance당신이 확인하기 전에 구제하는 것.isinstancenumbers.Number성공적으로 계속합니다.

이 BTW를 가 있다면 .x무언가를 할 수 있거나 할 수 없으며, 당신은 일반적으로 다음과 같은 것을 시도해야 합니다.

try: 0 + x
except TypeError: canadd=False
else: canadd=True

.__add__예를 들어 모든 시퀀스는 다른 시퀀스와의 연결을 목적으로 하기 때문에 그 자체로 유용한 정보가 없습니다. " 숫사 " 자는 " 시의 " 퀀스 " 가기 " 본들 " 수인 " 것입 " 같은다 " 니것 " 과인 " 일단 " 유수 " 함에한 " 대한러것 " 는▁is▁number ▁argument▁to▁▁such▁single것▁that다▁valid▁a▁built▁function▁is▁▁a니 "라는 정의와 같습니다.sum완전 한 유형들어"잘못된" )입니다.ZeroDivisionError또는ValueError&c)는 예외를 전파하지만 괜찮습니다. 사용자에게 그러한 미친 유형이 좋은 회사에서는 허용되지 않는다는 것을 가능한 한 빨리 알려주십시오;-; 하지만 스칼라에 합치할 수 있는 "벡터"(Python의 표준 라이브러리에는 없지만 물론 타사 확장자로 인기가 있습니다) 또한 여기서 잘못된 결과를 제공합니다. (예.이 수표는 co가 되어야 한다"참을 수 없는" 것 이후의 (예: 그것을 확인합니다.iter(x)을 기르다, 키우다, 키우다, 키우다, 키우다TypeError한 방법이 .__iter__ 그 수표가 ).

그러한 합병증을 잠깐 들여다보는 것만으로도 실현 가능할 때마다 추상적인 기초 수업에 의존하도록 동기를 부여하기에 충분할 수 있습니다.;-).

이것은 정말로 예외가 빛나는 좋은 예입니다.숫자 유형을 사용하여 수행할 작업을 수행하면 됩니다.TypeError다른 모든 것들로부터.

하지만 분명히, 이것은 수술이 효과가 있는지만 확인할 뿐, 말이 되는지는 확인하지 않습니다!이를 위한 유일한 진정한 해결책은 절대로 유형을 혼합하지 않고 항상 값이 어떤 유형 클래스에 속하는지 정확히 아는 것입니다.

개체에 0을 곱합니다.0을 곱한 숫자는 0입니다.다른 결과는 개체가 숫자가 아님을 의미합니다(예외 포함).

def isNumber(x):
    try:
        return bool(0 == x*0)
    except:
        return False

isNumber를 사용하면 다음과 같은 출력이 제공됩니다.

class A: pass 

def foo(): return 1

for x in [1,1.4, A(), range(10), foo, foo()]:
    answer = isNumber(x)
    print('{answer} == isNumber({x})'.format(**locals()))

출력:

True == isNumber(1)
True == isNumber(1.4)
False == isNumber(<__main__.A instance at 0x7ff52c15d878>)
False == isNumber([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
False == isNumber(<function foo at 0x7ff52c121488>)
True == isNumber(1)

아마도 세계에는 다음을 정의하는 숫자가 아닌 객체들이 있을 것입니다.__mul__0에 0을 곱했을 때 0을 반환하지만 이는 극단적인 예외입니다.이 솔루션은 사용자가 생성하거나 발견하는 정상적이고 정상적인 코드를 모두 포함해야 합니다.

numpy.array 예:

import numpy as np

def isNumber(x):
    try:
        return bool(x*0 == 0)
    except:
        return False

x = np.array([0,1])

answer = isNumber(x)
print('{answer} == isNumber({x})'.format(**locals()))

출력:

False == isNumber([0 1])

질문을 다시 요약하자면, 어떤 것이 집합인지 단일 값인지 결정하려고 합니다.어떤 것이 벡터인지 숫자인지 비교하는 것은 사과를 오렌지와 비교하는 것입니다. 저는 문자열이나 숫자의 벡터를 가질 수 있고, 저는 단일 문자열이나 단일 숫자를 가질 수 있습니다.실제로 어떤 유형을 가지고 있는지가 아니라 얼마나 많은 수(1개 이상)를 가지고 있는지에 관심이 있습니다.

인지 확인하는 것입니다.__len__예:

def do_mult(foo, a_vector):
    if hasattr(foo, '__len__'):
        return sum([a*b for a,b in zip(foo, a_vector)])
    else:
        return [foo*b for b in a_vector]

도 있어요.foo 번째 번째첫:

def do_mult(foo, a_vector):
    try:
        return sum([a*b for a,b in zip(foo, a_vector)])
    except TypeError:
        return [foo*b for b in a_vector]

궁극적으로, 어떤 것이 스칼라와 같은지 테스트하는 것보다 어떤 것이 벡터와 같은지 테스트하는 것이 더 쉽습니다.다른 유형(예: 문자열, 숫자 등)의 값이 입력되는 경우 프로그램의 논리에 약간의 작업이 필요할 수 있습니다. 처음에 문자열에 숫자 벡터를 곱하려고 한 이유는 무엇입니까?

기존 방법 요약/평가하기

Candidate    | type                      | delnan | mat | shrewmouse | ant6n
-------------------------------------------------------------------------
0            | <type 'int'>              |      1 |   1 |          1 |     1
0.0          | <type 'float'>            |      1 |   1 |          1 |     1
0j           | <type 'complex'>          |      1 |   1 |          1 |     0
Decimal('0') | <class 'decimal.Decimal'> |      1 |   0 |          1 |     1
True         | <type 'bool'>             |      1 |   1 |          1 |     1
False        | <type 'bool'>             |      1 |   1 |          1 |     1
''           | <type 'str'>              |      0 |   0 |          0 |     0
None         | <type 'NoneType'>         |      0 |   0 |          0 |     0
'0'          | <type 'str'>              |      0 |   0 |          0 |     1
'1'          | <type 'str'>              |      0 |   0 |          0 |     1
[]           | <type 'list'>             |      0 |   0 |          0 |     0
[1]          | <type 'list'>             |      0 |   0 |          0 |     0
[1, 2]       | <type 'list'>             |      0 |   0 |          0 |     0
(1,)         | <type 'tuple'>            |      0 |   0 |          0 |     0
(1, 2)       | <type 'tuple'>            |      0 |   0 |          0 |     0

(는 이 질문으로 이곳에 왔습니다)

코드

#!/usr/bin/env python

"""Check if a variable is a number."""

import decimal


def delnan_is_number(candidate):
    import numbers
    return isinstance(candidate, numbers.Number)


def mat_is_number(candidate):
    return isinstance(candidate, (int, long, float, complex))


def shrewmouse_is_number(candidate):
    try:
        return 0 == candidate * 0
    except:
        return False


def ant6n_is_number(candidate):
    try:
        float(candidate)
        return True
    except:
        return False

# Test
candidates = (0, 0.0, 0j, decimal.Decimal(0),
              True, False, '', None, '0', '1', [], [1], [1, 2], (1, ), (1, 2))

methods = [delnan_is_number, mat_is_number, shrewmouse_is_number, ant6n_is_number]

print("Candidate    | type                      | delnan | mat | shrewmouse | ant6n")
print("-------------------------------------------------------------------------")
for candidate in candidates:
    results = [m(candidate) for m in methods]
    print("{:<12} | {:<25} | {:>6} | {:>3} | {:>10} | {:>5}"
          .format(repr(candidate), type(candidate), *results))

아마도 반대로 하는 것이 더 나을 것입니다.그것이 벡터인지 확인합니다.이 경우 점 곱을 수행하고 다른 모든 경우에는 스칼라 곱셈을 시도합니다.

벡터 클래스 유형이어야 하기 때문에(또는 벡터 클래스에서 상속되어야 하므로) 벡터를 확인하는 것은 쉽습니다.도트 곱을 먼저 시도하고 실패하면(= 실제 벡터가 아님) 스칼라 곱셈으로 되돌아갈 수도 있습니다.

덧붙이자면.값이 숫자(int, float 등)인지 여부를 찾기 위해 isinstance와 digit를 조합하여 사용할 수 있습니다.

instance(num1, int) 또는 isinstance(num1, float) 또는 num1.isdigit(num1.isdigit)인 경우:

단순 시도 예외 블록에서 구현 가능

def check_if_number(str1):
    try:
        int(float(str1))
        return 'number'
    except:
        return 'not a number'

a = check_if_number('32322')
print (a)
# number

가상 벡터 클래스의 경우:

가정하다v이고, 에 벡이고, 우는그곱있하습다니고것을터를 있습니다.x 요 소 를 곱 것 여 타 지 부 한 당 이 구 성 는 하 ▁each ▁component ▁of 부 여 ▁if ▁it ▁to 지 각 ▁sense 한 ▁multiply 구 당 타v타고x우리는 아마도 그것을 의미했을 것입니다, 그러니 먼저 그것을 시도해 보세요.안된다면, 우리가 점을 칠 수 있을까요?그렇지 않으면 형식 오류입니다.

EDIT - 아래 코드가 작동하지 않습니다. 왜냐하면2*[0]==[0,0]을 키우는 대신에TypeError댓글이 달렸기 때문에 남깁니다.

def __mul__( self, x ):
    try:
        return [ comp * x for comp in self ]
    except TypeError:
        return [ x * y for x, y in itertools.zip_longest( self, x, fillvalue = 0 )

벡터 클래스를 구현할 때도 비슷한 문제가 있었습니다.번호를 확인하는 한 가지 방법은 다음을 사용하여 하나로 변환하는 것입니다.

float(x)

이것은 x를 숫자로 변환할 수 없는 경우를 거부해야 하지만 복소수와 같이 유효할 수 있는 다른 종류의 숫자와 유사한 구조를 거부할 수도 있습니다.

인수 유형에 따라 다른 메서드를 호출하려면 을 참조하십시오.

예를 들어, 벡터 클래스를 쓰고 있다고 가정합니다.다른 벡터가 주어지면 점 곱을 찾으려고 합니다.스칼라가 지정된 경우 전체 벡터의 배율을 조정하려고 합니다.

from multipledispatch import dispatch

class Vector(list):

    @dispatch(object)
    def __mul__(self, scalar):
        return Vector( x*scalar for x in self)

    @dispatch(list)
    def __mul__(self, other):
        return sum(x*y for x,y in zip(self, other))


>>> Vector([1,2,3]) * Vector([2,4,5])   # Vector time Vector is dot product
25
>>> Vector([1,2,3]) * 2                 # Vector times scalar is scaling
[2, 4, 6]

불행히도, (제가 알기로는) 우리는 쓸 수 없습니다.@dispatch(Vector)우리는 여전히 유형을 정의하고 있기 때문에.Vector유형 이름이 아직 정의되지 않았습니다.저는 베이스인 신대기본사있습용니다고하을형▁the▁base다있▁type니습▁instead▁usingm▁i',고사대를 사용하고 있습니다.list그것은 심지어 당신이 a의 점 제품을 찾을 수 있게 합니다.Vector a 리고a.list.

간단하고 간단한 방법:

obj = 12345
print(isinstance(obj,int))

출력:

True

개체가 문자열이면 'False'가 반환됩니다.

obj = 'some string'
print(isinstance(obj,int))

출력:

False

항목이 . 를 들어, " 터항있습다니이목데이다있"입니다.rec_day에 쓸 ▁be▁a가 될 입니다.float그러나 프로그램 처리 중에는 다음 중 하나가 될 수 있습니다.float,int또는str타이프를 치다str새 레코드를 초기화할 때 사용되며 더미 플래그 값을 포함합니다.

그런 다음 이 번호가 있는지 확인할 수 있습니다.

                type(rec_day) != str 

저는 이런 식으로 파이썬 프로그램을 구성했고 이것을 수치 검사로 사용하여 '유지보수 패치'를 넣었습니다.피톤적인 방법인가요?아마 제가 코볼에서 프로그래밍을 한 이후로는 아닐 것입니다.

숫자를 사용할 수 있습니다.개체가 숫자인지 확인하는 숫자입니다.

숫자의 경우 Python 3은 int, float, complex type 3가지를 지원하므로 숫자로 3가지 유형의 값을 확인할 수 있습니다.아래 표시된 번호:

import numbers

print(type(100), isinstance(100, numbers.Number))
print(type(100.23), isinstance(100.23, numbers.Number))
print(type(100 + 2j), isinstance(100 + 2j, numbers.Number))

반환 올턴True아래와 같이:

<class 'int'> True
<class 'float'> True
<class 'complex'> True

그리고 숫자의 경우 Python 2는 int, long, float, complex 4가지 유형을 지원하므로 숫자로 4가지 유형의 값을 확인할 수 있습니다.아래 표시된 번호:

import numbers

print(type(100), isinstance(100, numbers.Number))
print(type(10000000000000000000), isinstance(10000000000000000000, numbers.Number))
print(type(100.23), isinstance(100.23, numbers.Number))
print(type(100 + 2j), isinstance(100 + 2j, numbers.Number))

반환 올턴True아래와 같이:

(<type 'int'>, True)
(<type 'long'>, True)
(<type 'float'>, True)
(<type 'complex'>, True)

isdigit() 기능을 사용할 수 있습니다.

>>> x = "01234"
>>> a.isdigit()
True
>>> y = "1234abcd"
>>> y.isdigit()
False

언급URL : https://stackoverflow.com/questions/3441358/what-is-the-most-pythonic-way-to-check-if-an-object-is-a-number

반응형