2017-06-02 16 views
0
def santa(*says): 
    if not says: 
     return "ho! xmas!" 
    else: 
     return says[0]+"! "+santa(*says[1:]) 

これは、位置の引数構文を持つ再帰関数であり、私の理解に困っています。 「if not says」とはどういう意味ですか?それは "if says == False"と等しいですか?または "if says is None"?なぜなら、どちらか一方で置き換えると、エラーになるからです。それが最初の条件文を満たしていることを意味引数と出力「そうでない場合」とはどういう意味ですか?

"ho! xmas!" 

を持たない

print(santa())

は、どのようにそれがへリンクしません。

+5

'が' * falsy *の場合、つまり空のタプル –

答えて

0

を、空のタプルはブール値のコンテキストでFalseに評価されます。これはブール値に空のタプルをキャストすることによって見ることができます。

任意の引数が not演算子を使用して saysを経て、関数に渡された場合 if not saysがテストしている文を意味
>>> says =() 
>>> bool(says) 
False 
>>> 

。次に例を示します。引数なしでsanta()を呼び出すとき

>>> says =() 
>>> not says 
True 
>>> 

だから、最初のif文がTrueに評価され、そして"ho! xmas!"が返されます。

+0

なぜ 'if says == False'がエラーを出すのですか?彼らは同じものではありません – MrSoLoDoLo

+0

@MrSoLoDoLoそれはエラーを出すべきではありませんが、どちらもうまくいかないはずです。あなたが 'もし言うなら'をするとき、 'boolならば'と言うのと同じです。 Pythonは自動的に 'says'をあなた自身のブール値に変換します。しかし、 '言うこと'が自分自身で「偽」であるかどうかをテストしようとすると、Pythonは 'say'をブール値に変換することも期待しています。それが 'if == False'が動作しない理由です。 –

+0

ありがとう、私はそれを得ていると思う。だから私は本質的に動作しない2つの異なるデータ型を比較している。これは 'if 5> 4 == True'の関数を持つようなものです。 bla bla blaを印刷します。うまくいかないだろう。正しい? – MrSoLoDoLo

0

基本的にsaysに値が設定されているかどうかを確認しています。オブジェクトのifチェックは、そのオブジェクトの真理値をチェックします。 saysはここではタプルになります。タプルは、値があるかどうかをチェックするif Trueです。実際にはsaysが(not)であるかどうかをチェックしています。もし興味があるなら

ドキュメントは詳細を持っている:https://docs.python.org/2.4/lib/truth.html

0
def santa(*says): 
    if not says: 
     return 'ho! xmas!' 

それでは、私たちがここに持っていることは入力の任意のリストを受け入れ関数定義です。関数が最初に行うことは、リストが空であるかどうかをチェックすることです。その後、フォーマットされたフレーズを返し、関数を終了します。

あなたは既にこれを知っているでしょうが、if文はboolean文の結果をチェックし、それに応じてプログラムフローを設定します。この場合、ブールステートメントはnot saysです。 saysは、関数に渡される任意のリストです。 Pythonのすべてのオブジェクトにブール値の結果があるので、リストオブジェクトであるsaysはブール値の結果を持ちます。空の場合、結果はfalseです。空でない場合、結果はtrueです。

saysが空でない場合saysは、空のnot修飾子のために、そしてfalseパスであればif not says:trueパスになります。

Pythonのtruthinessについての詳細は、ここで見つけることができます:Pythonでhttps://docs.python.org/2/library/stdtypes.html#truth-value-testing

関連する問題