-2

以下のコードがこのように機能する理由がわかりません。(Python3x で)

>>>f = lambda: print('Hello') or print('Hello again')

>>>f()

Hello

Hello again

また、このように理解することはできません。

>>>f = lambda: print('Hello') and print('Hello again')

>>>f()

Hello

私にとって、最初のラムダ関数は「Hello」または「Hello again」という単語を出力するように見えますが、 「Hello」と「Hello again」の両方を出力します。

2 番目の関数は、'Hello'と'Hello again'という単語を出力するように見えますが、'Hello ' しか出力しません。

このラムダ関数で何が起こっているのか説明できる人はいますか?

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

4

2 に答える 2

2

printは None を返します (これは Falseish です)。そのため、python は のもう一方のオペランドを評価する必要がありますが、答えを得るには を評価する必要はorありません。and

  • return print('Hello') or print('Hello again')
  • Hello印刷され、リターンを印刷None
  • return None or print('Hello again')
  • orいずれかのオペランドが True の場合、True を返します。最初のものが True の場合、2 番目のものを評価する必要はありません。そうではない
  • Hello again印刷されます
  • return None or None
  • これで、False が返されることが確実になりました。

 

  • return print('Hello') and print('Hello again')
  • Hello印刷され、リターンを印刷None
  • return None and print('Hello again')
  • and両方のオペランドが True の場合、True を返します。最初の値が False の場合、2 番目の値を評価する必要はありません。
  • return False
于 2013-01-19T09:37:57.937 に答える
0

これは遅延評価と呼ばれ、Python が必要以上に計算しないことを意味します。の:

Expression1 or Expression2

Expression1 and Expression2

Expression1 が False の場合、or比較の場合、Python は結果を計算するために Expression2 の結果を必要としますが、andExpression1 が False の場合の比較では、比較の 2 番目の部分を計算する必要はあり0 and x == Falseません。 isTrueまたは比較False の 2sd 関数 print をand評価する必要はありません。Python は比較が等しいことを既に知っているからです。False

print関数は何も返さない、つまり返すNone

>>> def print2(string):
     print(string)
     return True

>>> r=(lambda: print2('Hello') or print2('Hello again'))()
Hello

ただし、これは最初のHelloのみを出力し(trueであるため)、Helloを再度出力することはありません

>>> r=(lambda: print2('Hello') and print2('Hello again'))()
Hello
Hello again

遅延評価を理解するには、次のコマンドを試してください。

>>> def p():
     print("foo")
     return True



>>> False and p() and p()

False

>>> True and p() and p()

foo
foo
True

>>> True and (not p()) and p()

foo
False
于 2013-01-19T10:38:00.343 に答える