【Python】クロージャー(closure)とは【Python】クロージャー(closure)とは2020年4月5日Python学習Python学習【365日チャレンジ!】55日目のマスターU(@Udemy11)です。55という数字はやっぱりゴジラでしょ!なんていいつつ、51のときは「イチローでしょ!」ということを忘れてしまっていました。毎日学習している関係上、1から365までの数字を一つづつ見ることになるので、何かにつけて数字を紐解いていきたいなと思いつつも、数字がこれ以上大きくなったら野球は無理だろうな〜と冷静に考えている自分がいます。数字で遊ぶのって意外と面白いですよね。昨日は、関数内関数を学習しました。その名のとおり、関数の中に入った関数で、中の関数は外側の関数から引数をもらうことはできても、外の関数外で中の関数を実行することはできませんでした。中の関数を何度も使いまわしたいというときに使われる関数ということでした。2)出力結果3outer_func関数を実行することによって、返り値がinner_func関数になって、中のinner_func関数が実行され、先に渡されていた引数1と2の足し算が出力されるということですね。エクセルでよく使うif関数の入れ子と同じような感じなので、流れはなんとなく理解いただけているかと思います。今日は、そんな関数内関数と似ているクロージャーを学習したいと思います。クロージャークロージャーは、プログラミング言語における関数オブジェクトの一種で、外側の変数を記憶した関数オブジェクトです。関数内関数では、アウター関数に代入された引数の値をインナー関数に代入して返り値を返していましたが、クロージャーは、最終的に関数が実行した返り値を返すのではなく、実行する一歩手前の情報が入った関数オブジェクトとなります。言葉にするとよくわからないので、実際にコードをみてみましょう。0x104a11268>14コードを見ると、outer関数内にあるinner関数で、outer関数の引数aとbをかけた値が返り値になっています。outer関数の返り値は、inner関数の実行【inner()】ではなくオブジェクト【inner】になっているところが関数内関数とは違うところです。2)を実行した返り値はinnerであり、変数rには、inner関数を実行する前の情報が入っているので、変数rをprint出力すれば、関数オブジェクトの情報が表示されます。関数オブジェクトになっている変数rを実行した値が変数lなので、7×2の解である14が出力されました。関数内関数とほぼ同じようなものですが、クロージャーで返されるものは、結果ではなく、途中の経過なので、最終的な関数の実行前にいくつかのパターンを用意しておきたいときなどに使われるということでした。これまた説明だけではよくわからないので、実際にやってみましょう。アウター引数を変える長方形の面積を求める計算を考えてみましょう。アウター関数で、横(width)をいくつか用意して、実行時にインナー関数に縦(hight)を入れて面積を求めるコードになります。w3を用意して、あとは縦の値を入れると面積が出る状態にしています。w3に縦の引数10を代入して、それぞれを出力しました。クロージャーの流れはなんとなくわかったのですが、具体的にどんなに便利なのかが理解できていない状態です。これからたくさんコードを見ていったときに、「あ〜〜!これのことね!」というのがわかればいいかなくらいの理解度でいいのかなと思います。インナーの引数を変える先程は、アウター関数の横(width)の値を複数入れて、インナー関数の縦(hight)の値を固定して3回出力したので、今度は、横の値を固定して、縦の値を変えて出力してみました。print(w(30))print(w(20))print(w(10))出力結果300200100横(width)を10に固定したので、関数オブジェクトは一つだけでよくなりました。あとは、縦(hight)にそれぞれの値を入れて出力すれば、3パターンの面積を求めることができました。この理解でいいの?いつも思っちゃうのが、「この理解でいいの?」ということです。これから学習をすすめていく中で、間違った理解をしていると困るんじゃないかなと思いつつも、なんとなくこれでいいんだろうな〜という感覚を大切にしながら講座をすすめています。疑問に感じたことは質問されていないかチェックしたり、Webで検索してみたり、最終的には質問をしたりして、きちんと理解しているつもりですが、ちょっと不安に思うところもあるんですよね。現時点では、こんな感じの開き直り理解!?でいいとおもっているんですが、これには理由があります。今はあくまでそれぞれの部品を一つ一つこんなことをするパーツであると理解しているところで、それが組み合わさったときに、改めて「そうやってつながるのか!」と感じられるんじゃないかと思っています。虫の目鳥の目で全体を俯瞰することが大切だという話をよく聞くかと思いますが、これに当てはめると、今は虫の目でプログラムを理解しているところで、そのうち鳥の目で全体を見渡すための基盤をしっかりと作って置くことが重要です。虫の目で狭い範囲をず〜っとうろうろしていても疲れてしまうので、たまには、空に羽ばたいて全体像を掴んでみるのもいいかもしれません。いうところで、今日はここまで。Udemyがセールをしているかどうかは、こちら...【Python】模範的な対話アプリケーションの構造解説(MVCモデル)Python学習【365日チャレンジ!】109日目のマスターU(@Udemy11)です。なにげに玄関を眺めていると、アシナガバチがポストに入って...【Python】マルチスレッドとマルチプロセスについてPython学習【365日チャレンジ!】203日目のマスターU(@Udemy11)です。9月になって少しは過ごしやすくなるのかと思いきや、まだま...【Python】簡単な対話アプリケーションの作成Vol.7Python学習【365日チャレンジ!】108日目のマスターU(@Udemy11)です。ホットケーキミックスが品薄になっていたらしですが、大量の...【Python】インフラの仮想環境を構築するイメージを理解しようPython学習【365日チャレンジ!】239日目のマスターU(@Udemy11)です。Keysのキー割り当てにハマった話Googleスプレッドシートの使い方講座Anacondaのアンインストールからの再インストールrequestsを使って仮想通貨のデータを取得Python学習【365日チャレンジ】を振り返ってみます。(2)Amazonのアソシエイトとして、当メディアは適格販売により収入を得ています。