-4

なぜこれがうまくいかないのですか?

def distance_from_zero(x):        
    if type(x) == int or float:
        return abs(x) 
    else:
        return "Not an integer or float!"

print distance_from_zero(2050)

しかし、これは同じことである正解です!

def distance_from_zero(x):    

    if type(x) == int or type(x) == float:
        return abs(x) 
    else:
        return "Not an integer or float!"

print distance_from_zero(2050)
4

1 に答える 1

8

これらは同じものではありません。次の 2 行を比較します。

if type(x) == int or float:

if type(x) == int or type(x) == float:

そして、それが違いです。

最初のものは をチェックtype(x) == intし、結果を取得して でor処理するため、 が である場合はfloatを返し、それ以外の場合はを返します。とはどちらも真の値であるため、その部分は常に発生し、は決して発生しません。TruexintfloatTruefloatifelse

type(x) == int2 つ目は、 、type(x) == float、 をチェックして、orそれらをまとめて ing することです。したがって、Trueif xisintまたは if xis a float、およびFalseif it is a を返します。

in演算子を使用してコードを簡略化できます。

if type(x) in (int, float)

しかし、それはまだあまり良い Python ではありません。本当にタイプを切り替えたい場合は、ほとんどの場合isinstance、タイプを比較するのではなく、次のようにします。

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

これは、たとえば のサブクラスが渡された場合にコードが機能することを意味しますintintしかし、たとえば、 のラッパー、またはカスタム設計された整数型、さらには (Python 2.x では) aに対しては機能しませんlong。したがって、より良いバージョンは次のとおりです。

if isinstance(x, numbers.Real)

floatこれは、intlong、およびその他のさまざまな組み込み型、それらの型のサブクラス、およびnumbers.RealABCに自身を登録するものに対して True を返します。

しかし、実際には、通常、タイプの切り替えはまったく必要ありません。Python はダックタイピングを中心に設計されています。ここで気にすることは、それを に正常に渡すことができるということですabs。それができる限り、それが実際にどのような特定のタイプであるかを誰が気にしますか? そう:

try:
    return abs(x)
except TypeError:
    return "Not a number!"

または、さらに良いことに、例外をキャッチして文字列を返すのではなく (これは、呼び出し元が数字と文字列の両方を処理する必要があることを意味します)、例外を伝播させます。

return abs(x)
于 2013-04-11T21:40:22.073 に答える