2016-07-20 5 views
4

指定された値(文字列として渡される)がチェックされて桁数が4か6のいずれかになる関数を作成しようとしています。それは数字です。IF、AND、ORをEQUALオペランドと一緒にPythonで使用する

def number(x): 
    if (len(x) == (4 or 6)) and x.isdigit(): 
     print "True" 
    else: 
     print "False" 

のみ上記のコードは、それがこれを渡し、なぜ私は理解していない...最初のテストの下を通っているが、他のテストのどれも:

私の最初の衝動は、このコードで行くことにしました

number("1234") 

len()関数を切り離しても、正しく動作します。

def number(x): 
    if (len(x) == 4 or len(x) == 6) and x.isdigit(): 
     print "True" 
    else: 
     print "False" 


## Checks 
number("1234") 
number("123456") 
number("abcd") 
number("abcdef") 
number("1") 
number("a") 

上記のコードは、すべてのテストに合格します。

だから私の質問は以下のとおりです。

  1. ここで何が起こっていますか?
  2. このためのクリーナーコードを作成する方法はありますか?

ありがとうございました!

**この質問にはブール演算子に関する基本的な概念は同じですが、問題自体はlen()、isdigit()の使用法、および改善のための最善の方法それ(誰かが返品の使用をコメントした)。しかし、間違いなく他の質問に別の考え方を追加します。

+4

ヒント: '(4または6)'はそれ自身で何を評価しますか? 'len(x)'はそれと同じですか? –

+1

重複していません。程遠い。はい、両方の質問は同じマニュアルのセットを読むことで解決されますが、重複はありません。 –

答えて

2

を書きたかったことは、この行のロジックを調べるのに役立ちます:

if (len(x) == (4 or 6)): 

(4 or 6)句には、論理的にorの短絡が含まれています。値4は真であるため、評価され、==の関係比較に戻されます。

orの仕組みは、左辺がブール真理で評価され、真であればその値が返されます。左辺が真でない場合、右辺が評価され、その値が返されます。

4 or ...の左側が真偽であるため、右側面は評価されません。 Pythonはさらに4 orを見ていません。左側の値が偽の値(0など)だった場合は、orの右側が評価されます。

この動作を確認するには、print 4 or 6を試してください。 if (len(x) == 4)と意味的に同じです。つまり、4が真であるため6は評価されません。したがって、出力は4になります。

したがって、4はハードコードされた真の値なので、意味的にはif (len(x) == 4)と同じです。

if(len(x) == 4 or len(x) == 6 ... 

if(len(x) in (4,6) ... 
5

あなたはそうのようなin演算子を使用することができます与えられたコンテナ内の封じ込めのためのinチェック

def number(x): 
    if len(x) in (4, 6) and x.isdigit(): 
    print "True" 
else: 
    print "False" 

を。 4 or 6は単独では望ましくないものに評価されるため、最初のコードセグメントが失敗することに注意してください。あなたはPythonシェル上でそれをチェックアウトすることができます

>>> 4 or 6 
4 
1

おそらく

if (len(x) in (4, 6)) and x.isdigit(): 

代わりの

if (len(x) == (4 or 6)) and x.isdigit(): 
2

短い答え:len(x) in [4, 6]またはlen(x) == 4 or len(x) == 6を私はあなたが本当に知りたいと何

len(x)が4または6のいずれかである場合は、いくつかの方法でコードにそれを置くことがあります。

"または"は論理的な選択です。 (4または6)が非ゼロ(真)の値に解決されることが保証されます。この場合、4に解決されるので、テストケースは合格になります。

+0

あなたの応答を読んだ後、私の頭の中をクリックしました - ありがとう。 これを読んでいる誰かのために、私がやった重大な間違いは、ORをブール値として考えることではありませんでした。 – jhub1

1

問題はorステートメントにあります。

1より大きい値は、条件付きで評価するとTrueと評価されます。だから(4 or 6)いつもが解決されます。

あなたは上記のinのステートメントを使用することができますか、あなただけの2 ==年代を使用することができます。

if (len(x) == 4 or len(x) == 6) and x.isdigit()

それは少しwordierだ、私はそれが簡単に読むことを見つけます。

1

私が先に行くと

このためにクリーンなコードを書くための任意の方法にお答えしますか!

はい。 を返すのは、文字列を出力するのではなく、ブール値です。

def number(x): 
    return len(x) in {4, 6} and x.isdigit() 

print(number("1234")) # True 

次に、文字列比較なしでif文でメソッドを使用するのは簡単です。

+0

ありがとうございます。これを拡大するには - この2つの機能の時間を合わせる場合は、どうしたらいいですか?私は[Python -m timeit "import simplified; simplified.number()]をコンソールで試しましたが、うまくいきませんでしたsimplched.pyはこの関数が存在するファイルの名前です – jhub1

+0

わかりません。 'timeit'を使用しました。if-else条件がないので、これはより早いと言いたいと思います –

関連する問題