うみうしの日誌

~(・ ω ・)~nullnull

Python つまづいたとこメモ

最近UdacityのFree courseでPythonの勉強を始めたのだが、少しつまづいたので、メモしていく。

if文について
関数の定義のところで、

def proc(a,b):
    if test(a):
        return b
    return a

と同じ結果を示す関数を選べ、という問題が出た(test(a)は、aに応じてブール値を返す何かしらの関数として既に与えられているとする)。これで、次のproc4(a,b)が正解なのが最初分からなかった

def proc4(a,b)
    if test(a):
        b = "udacity"
    else:
        return b
    return a



疑問点はいくつかあった。
まず、proc(a,b)はtest(a)がTrueならbを返し、Falseならaを返すという関数になっているという。しかし、前の節では

    if <TestExpression>:
        <Block>
    <NextExpression>

のようなとき、<TestExpression>がTrueのときのみ中の<Block>が実行され。インタプリタがインデントにより<Block>が終わったことを知るため、<TestExpression>がTrueでもFalseでも次の<NextExpression>が実行される、というようなことを説明していた。

それなら、proc(a,b)はtest(a)がTrueでもFalseでもreturn aはするんじゃないの?bとaが返されたりはしないの?と思った。

何が本当か分からないが、このときはif文が優秀で<NextExpression>にreturnがあると、この<NextExpression>は実はまだif文の中なのだと判断し、elseの処理としてreturnを実行する、つまり「else: return hoge」の省略形なのかなと思った。

def proc(a,b):
    if test(a):
        return b
    return a

#上の関数は下の奴の省略形なのかなということ

def proc(a,b):
    if test(a):
        return b
    else:
        return a

そうすると、proc4(a,b)は

def proc4(a,b)
    if test(a):
        b = "udacity"
    else:
        return b
    else:
        return a

ということになるのか?バグやんけ、不正解だな、と思ったが実際のところは正解だった。



その後いろいろ試してみて分かったが、returnが1つ返されると他のreturnは戻り値として現れないようだった。複数戻り値を与えたいときは、pythonではカンマで区切って「return a,b」のようにすることになっているようだ。

つまりproc(a,b)とproc4(a,b)は多分こんな感じになっている。
f:id:CHfour:20180108232004p:plain
本当かは知らない。
これは嘘。returnは別にif文に関連した操作ではない。return hogeで元の関数が返り値hogeを得て終了する。
なので、1度returnが来ると以降は読まれず関数処理が終了する。