質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Python

    11785questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Pythonのlambda式やif文の代入について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 126

ass3891

score 5

ここのサイトを見ていて、if文を一行に書く方法で下記のコードのresultに例1のif文や例2のlambda式を代入しているのですが、なぜ代入できるのでしょうか?

#例1
a=1
result ='even' if a%2==0 else 'add'
print(result)

a=2
result ='even' if a%2==0 else 'add'
print(result)
#例2
add_lambda = lambda a, b=1: a + b

print(add_def(3, 4))


また、例1の文のa=2の後にresultの式を書かないとresultの結果が上書きされないのはなぜでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

if文を一行に書く方法で下記のコードのresultに例1のif文や例2のlambda式を代入しているのですが、なぜ代入できるのでしょうか?

結論から言うと、式の結果が値を持っているから代入できる、という回答になります。

例1のif文は「三項演算子」と呼ばれるもので、文ではなく式扱いとなります。
式であり値を持つ(2とか’文字’と同じ)ため、変数に代入できるのです。
result=1+2 が成り立つのをイメージしてもらえばわかりやすいかと思います(「+」も演算子の仲間)

例1の場合は、条件式(a%2==0)に応じて値(’even’もしくは'odd')を決定しています。

例2のlambda式は「無名関数」と呼ばれ、関数内で処理した結果(値)を返しています。
問題にあるコードの場合、a+bの結果となる値を返しており、下のコードと等価になります。

def add_lambda(a,b=1):
    return a+b

また、例1の文のa=2の後にresultの式を書かないとresultの結果が上書きされないのはなぜでしょうか?

基本的にプログラミング言語は、上から下へ順番に処理を行います
変数の値を変えたからといって、関連する変数が自動的に更新されるわけではありません。

例1の場合、処理の順番は次のようになります。

  1. aに1を代入

  2. resultに「a(=1)を使った条件式に応じて'even''add'のどちらか」を代入

  3. resultを出力する('odd')

  4. aに2を代入

  5. resultに「a(=2)を使った条件式に応じて'even''add'のどちらか」を代入

  6. resultを出力する('even')

2.と5.で使うaの値が違うため、結果的にresultに代入される値も異なるのです。

以上、長文になりましたが、ご参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/07 23:37

    回答ありがとうございます。
    式を丸々代入してるのだと勘違いしていました。
    分かりやすい説明ありがとうございます

    キャンセル

  • 2019/04/07 23:48

    ご理解いただけたようで何よりです。

    キャンセル

+1

なぜ代入できるのでしょうか? 

'even' if a%2==0 else 'add'は式です。result = 式と書いているので、式の結果がresultに代入されます。result = 100で代入できるのと同じ事です。

lambda a, b=1: a + bについても同じく式です。

例1の文のa=2の後にresultの式を書かないとresultの結果が上書きされないのはなぜでしょうか?

上書きしないと上書きされないと言うことです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/07 23:39

    回答ありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • Python

    11785questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。