8

Udacity で Web アプリケーション エンジニアリング コースを受講しています。インストラクターが検証メソッドのステートメントでand演算子を使用していることに気付きました。returnそして、2つの引数を返すことができる方法がわかりませんでした。発言のようなものではないかと思いますif。誰かがそれが実際に何であるかを説明できますか?

検証方法は次のとおりです。

USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
def valid_username(username):
    return username and USER_RE.match(username)

前もって感謝します。

4

3 に答える 3

16

演算子は、両方のand引数が真であるかどうかを評価しますが、少し意外な方法で、最初に左側の引数を調べます。それが真実である場合、それは正しい引数を返します。左の引数が偽物である場合、左の引数を返します。

したがって、コードの最後の行は次のとおりです。

return username and USER_RE.match(username)

と同じです:

if username:
    return USER_RE.match(username)
else:
    return username

のような文字username列は、空でない場合は真実です。正規表現match関数は、パターンが一致する場合はtruish matchオブジェクトを返しNone、一致しない場合は偽の値を返します。

最終的な結果は、valid_usernameusernameが空の文字列ではなく、usernameが指定されたパターンに一致する場合、truish値を返すことです。

ここでの「and」は2つの値を返すこととは関係がなく、1つの値を計算していることに注意してください。

于 2012-07-22T23:29:46.627 に答える
3

論理演算子を使用すると、ルールに従って続行されるため、andを使用すると、最初のステートメントの真実性が評価され、真実でない場合は、真実でない値が返されます(最初の場合は'') 。

print repr("" and "THIS IS POST AND")
""

print "" or "THIS IS POST AND"
THIS IS POST AND

print None or "Something else"
Something else

Noneこれが役立つのは、次のようなもの(たとえば、長さの特性)で存在しないメソッドを呼び出したくない場合です。

r = None

s = [1,2,3,4]

print r and len(r)
None

print s and len(s)
4

あなたが投稿した場合、ポイントは、ユーザー名が真実である場合にのみ、正規表現に対してユーザー名をチェックしたいということです。

ここで重要なのはand、とor両方が短絡していることです。したがって、真実ではないものを取得した場合、関数は正規表現を評価することさえしません。

于 2012-07-22T23:30:09.803 に答える
-1

andは単なる二項演算子です。return a and bは構造的にreturn a + bまたはreturn a * bと同じであり、同じように機能します。式が評価され、その結果が に渡されreturn、呼び出し元に返されます。ステートメントで使用andすることについて特別なことは何もありません。return

Ned's answer で非常によく説明されているように、とa and bの両方が true-ish の場合は true-ish であり、そうでない場合は false-ish です。また、式全体の結果を決定するのに十分であるため、左の引数が false-ish の場合も短絡します。aba and b

この場合、空の文字列はその正規表現と一致しないため、操作は冗長であり、純粋にロジックと見なされます。ただし、正規表現の一致で例外がスローされるusername値が与えられる可能性があるため、ここで使用されているのではないかと強く疑っています。Nonenot を使用すると、 forの偽っぽい値 ( を含む) が、正規表現の一致を試みることなく、関数が偽っぽいものを返すことを意味username and USER_RE.match(username)します。USER_RE.match(username)Noneusername

returnしかし、繰り返しますが、これはとは何の関係もありませんand

于 2012-07-23T02:26:15.783 に答える