3

2 つの機能:

def check(n):
    if int(n) != n:
        print("int(n) != n")
    else:
        print("int(n) == n")

def check2(n):
    if not isinstance(n, int):
        print("n is not an int")
    else:
        print("n is an int")

違いは何ですか?で、どっちがいいの?

4

4 に答える 4

3

2番目のものは実際に機能します(intに強制できないものでエラーが発生しないため)が、実際に何をしたいかによって異なります。純粋な Python で作業している場合、最善の方法はダック型です。このような関数は、何かが整数値であるかどうかをチェックするためのわずかな微調整です (したがって、たとえば、2.0およびでも動作します2。しかし、そうではありません'2'が、エラーは発生しません:

def check3(n):
    "prints 'n is an int' if the value is integral"
    try:
        val = int(n)
        if val == n:
           print("n is an int")
    except ValueError:
        pass # return False would also work
    print("n is not an int")

対照的に、 と の違いを知ることが重要な場合1.0(1たとえば、int64 ndarray がある場合) は、インスタンスのチェックを使用することをお勧めcheck2ます

要するに、これは intでなければならないか、それとも単に整数のように振る舞うべきなのかという質問です。int でなければならない場合は check2 を使用し、int のように動作する必要がある場合は check2 を使用します (ただし、上記のように try/except 内に収まるように変更する必要があります)。

もう 1 つのオプションは、抽象基本クラスを使用して、int ライク (たとえば、整数であるが実際には int のサブクラスではない numpy int dtype) を許可するために抽象基本クラスを利用することnumbers.Integralです。

def check4(n):
    if isinstance(n, (int, numbers.Integral)):
        print("n is an int")
    else:
        print("n is not an int")

余談ですが、check4抽象基底クラスのインスタンス チェックのルックアップにはいくつかの処理が含まれるため、check3よりもはるかに低速です。

于 2013-11-07T02:47:35.310 に答える
2

あなたの最初の方法if int(n) != nは、良い考えではありません。が文字列または数値でない場合n、への変換intは例外で失敗します。

>>> class Foo(object):
>>>    pass
>>> f = Foo()
>>> int(f)
TypeError: int() argument must be a string or a number, not 'Foo'

最良の方法は(とにかくPython 2.xで)次のとおりだと思います。

if  isinstance(n, (int,long)):
    print 'n is an integer type'
else:
    print 'n is not an integer type'

int または をチェックしていることに注意してくださいlong。それはだからisinstance(0xDEADBEEF2B84F00D, int) == Falseです。

このコードは、浮動小数点値をまったく処理しません。このコードがどのように使用されるかについての情報は提供されていないため、すべてのケースを正しく処理するのはあなた次第です。

于 2013-11-07T02:45:55.610 に答える
2

主な違いは、入力がプリミティブ データ以外の場合は変換に失敗し、入力のタイプがそれまたはそれから派生したものである場合にのみ True になります。intisinstanceintだから、一緒に行くほうがいいcheck2です。以下のサンプル実行を確認してください。

def check(n):
    if int(n) != n:
        print("int(n) != n")
    else:
        print("int(n) == n")

def check2(n):
    if not isinstance(n, int):
        print("n is not an int")
    else:
        print("n is an int")


class myInt(int):
    pass

check(1)
check("1")
#check({})      #Will throw error
#check([])      #Will throw error
check(myInt()) 
print ""
check2(1)
check2("1")
check2({})
check2(myInt())
check2([])

出力

int(n) == n
int(n) != n
int(n) == n

n is an int
n is not an int
n is not an int
n is an int
n is not an int
于 2013-11-07T02:50:41.980 に答える