お帰りなさい｡
このビデオでは､ 重要な概念である「リターン」についてお話したいと思います｡
Pythonのキーワードで､ 関数を扱うときによく目にする言葉です｡
では､ 見てみましょう｡
ところで､ sumという関数を作りたいとします｡ これはPythonにはすでに存在しますが､
独自に作成することにして､ 1番には1番と言うことにします｡
そして2番目は､ 1番目の数字と2番目の数字を足す､ シンプルで素敵な関数です｡
さて､ 4番と5番でいくつか実行すると､ 何が起こると思いますか？
ランを打つ｡
そして何も起こらない｡ つまり､ 何も印刷しないのだから､ 驚くには値しないかもしれない｡
そうですね｡
でも､ ここでプリントを走らせたらどうなるんだろう？
さて､ この変化｡
見てみよう｡
うーん｡
何も出てきません｡
それは期待通りですか？
そして､ 今まで見たことがないでしょ？
つまり､ 1､ 2､ 3というリストがあって､ その上でクリアみたいなことをやったのを覚えています｡
私たちのEDでは
この小さな矢印を出し､ 何もないと言っているのです｡
また､ リストについて､ clearが実際のリストを変更し､ すべてをクリアしてリストを空にするというアイデアについてお話しました｡
既存のリストを変更するだけで､ その代わりに何も返さない｡
まあ､ 機能なんてそんなもんです｡
必ず何かを返さなければならないし､ ここに返すキーワードがないように何も返さないときは､ 自動的に何も返さないようになっているのです｡
つまり､ ここにreturnのようなものがなければ､ 常に何も返さないということだ｡
しかし､ returnを追加すると､ 2行目に入った途端にと言うことになるのです｡
ねえ｡
この機能を終了してほしい｡
そして､ この関数を終了するときには､ この式が与えてくれるものをすべて返してほしいのです｡
実行」をクリックすると
9人？
これを10＋5に変えると15になる｡
そして､ これは関数に関する一般的なルールです｡ なぜなら､ 関数は2つのことができるからです｡
1つは､ 何かを返すことができること｡
つまり､ 関数の最後には､ 関数が実行された後､ 何も返さないか､
何らかの値やデータ型を返すか､ 何も返さないが何かを変更する関数があります｡
だから､ 例えば､ 印刷ができるんです｡
こんにちは｡
そして､ もし私がここで走っていたら
そのreturn文がないので､ noneを返しています｡
しかし､ 私の関数は､ 何かを変更します｡
さて､ この文章の見た目は右？
私たちのためにハイを印刷してくれる｡
つまり､ 関数はプログラムの何かを変更するか､ 何かを返すかのどちらかです｡
そしてこれは､ 後ほど関数型プログラミングの話をするときに触れる､ かなり高度なトピックです｡
しかし､ 関数に関する経験則として､ 関数は1つのことをとてもうまくやるべきだということがあります｡
そして､ 通常､ 関数は何かを返すはずです｡
だからといって､ 複数のことをする関数や､ 何かを返さない関数が悪いというわけではありません｡
しかし､ コードをシンプルで読みやすくするためには､ この2つのルールを持つことが一般的に良いとされています｡
例えば､ ここでprintとadditionがあるとすると､ この関数は複数のことをやっていることになりますね｡
印刷の心配をするのも､ 何かの心配をするのも｡
そして､ その定義｡
この関数をsumと呼びます｡
つまり､ もし私が知らなかったり､ これを見ずに､ いくつか走っただけだったら｡
印刷が高いというのは､ 名前からして何をやっているのかわからないので､ 意外に思われるのではないでしょうか｡
というか､ これは総括を期待しているんです｡
なぜ私のプログラムは "Hi "と言っているのですか？
後ほど説明するように､ 異なる関数を組み合わせて実行することができます｡
そして､ 必ず何かを返すようにします｡ こうすることで､ この戻り値を実際に変数に代入することができるからです｡
例えば､ totalはsum 10に等しいと言うことができる｡
5つです｡
そして､ この関数は何かを返すので､ それが終わったとき､ runningは値として15を持つことになります｡
それは､ ここでやっていることと同じことです｡
そして､ ここがクールなところです｡
今は､ たぶん合計で10数本走れるようになりました｡
では､ ひとつひとつ見ていきましょう｡
関数を定義すると､ Pythonのインタープリタは､ 「よし､ Someが何であるかはわかった」と言うでしょう｡
これで定義ができましたね｡
思い出に残りますね｡
このまま7行目まで進んで､ 「ねえ､ 変数の合計が欲しいんだけど､
その合計がある10の5乗になるようにしたいんだ｡
そして､ total pythonに何かを割り当てる前に､ インタープリタがいくつか言うことになります｡
また何人か｡
ああ､ 私はここでそれを覚えている......私はそれに引数10と5を与えるつもりですいくつかのメモリOCで｡
だから､ その関数を実行しに行くんです｡
この閉じ括弧を終えると､ すぐに和に入ります｡
1番は10､ 2番は5と表示されます｡
2行目に行くと､ 「10＋5を足してくれ､ この変数が何であるかは分かっているんだ｡
そして､ それが終わって､ これが15になったら､ 帰ってきてほしいんです｡
Pythonのインタープリタは､ 最後に､ あるものを呼び出すと､ おい､ 変数totalに15という値を代入しろ､
と言って､ 次の行に行くわけです｡
ねえ､ 印刷したいんだけど｡
何を印刷したいですか？
まあ､ これを印刷したいんですけどね｡
と言われそうですが､ おいおい､ 何があるんだ？
あるあるは知っている｡
記憶に残っています｡
そしてまた､ 10と言い出す｡
そして､ 次の議論は総論になる｡
おい､ 合計しようぜ｡
記憶をたどって､ ああ､ 15なんだ､ とわかるように｡
だから､ 15と言ってるようなものなんです｡
そして､ これが関数の力なんですね｡
こんな感じで､ 物を返したり､ 変数に代入して呼び出したりできるようになりました｡
そして､ もっとシンプルにしたい場合は､ 合計をここに書く代わりに､ いくつかを実行し続けることができます｡
そして､ 見てください｡
これで1行にまとまったので､ 「実行」をクリックすると｡
もう一度｡
まだまだ現役です｡
なるほど｡
でも､ こんな風にしたらどうでしょう？
define someと言った後に､ define inside of here anotherと言ったらどうでしょう｡
関数で､ この関数は num 1 と num 2 を受け取ります｡
そして､ この中で､ ついに復活するのが､ 1番です｡
そして2つ目｡
うーん｡
試してみましょう｡
どうなると思いますか？
さて､ まず､ 合計がある10＋20に等しいとします｡
そして､ 総印刷をする｡
実行」をクリックすると
何も出てきません｡
今すぐ
それはなぜでしょうか？
そして､ これはあなたにとって明白なことでしょう｡ なぜなら､ ここで私は､ いくつか定義して欲しい､ そしてその関数で何をするつもりなのか､
と言っているのですから｡
この中に別の関数を定義するのですが､ このreturn文は実は正しく実行されていないのです｡
なぜなら､ このブロックの中でやっていることは､ このコードブロックの中だけだからです｡
この部分ですか｡
関数を定義していますが､ 決して他の関数を呼び出しているわけではありません｡
そのため､ これは何も返しません｡
そして､ この関数を呼び出す機能を失ってしまったのです｡
では､ どうすればこれを解決できるのか｡
一つの方法として､ 戻るということがありますね｡
ですから､ ここでは最後に､ インデントが正しいことを確認し､ 別のfuncを返すことになります｡
では､ ここでreturnを追加してどうなるかを見てみましょう｡
実行」をクリックすると
よし､ これでこの機能が使えるようになった｡
つまり､ Totalは私たちが返したこの関数と同じになり､ メモリ内にあるわけです｡
なるほど｡
でも､ 思うような結果が得られないんです｡
そうですね｡
それはなぜか？
なぜなら
まあ､ この関数を呼ぶわけではないのですが｡
そこで､ いくつかの方法があります｡
ここでパラメータや引数を与えることができます｡
では､ 1020とし､ 「実行」をクリックすると｡
30を得るか､ ここで与えたものをそのままにするならば､ 単に別のfuncと言えばいいだけです｡
そこで､ 1番と2番を指定して､ 実行をクリックすると｡
おい､ あれ見ろよ｡
30を取得｡
このビデオは､ 何度も繰り返し見る必要があるかもしれません｡
そして､ この機能は､ 正直言って､ まあ､ 非常に分かりにくいので､ あまり良いとは言えません｡
機能はわかりやすいものでなければなりません｡
そこで､ 同じパラメータ名ではなく､ 少し変えてみるのもいいかもしれません｡
ただ､ それを明確にするために
1と2と言えるかもしれませんね｡
そして､ ここではand one plus and twoとすることで､ この別の関数を返すときに､ ここで呼び出した1番と2番のパラメータを使用することを明確にしています｡
なぜなら､ この関数の定義では､ これらが何であるかはあまり気にならないからです｡
他の関数が呼び出されたときだけ気にする｡
ビデオを一時停止して､ これを見たり､ 少し練習したりする必要がある場合は､ それは完全に理解できます｡
でも､ 還暦の力を見せたかったんです｡
条件文のように関数を入れ子にすることもできますが､ 関数が何かを返すか､
さもなければ何も返さないかに注意しなければなりません｡
そして､ ほとんどの場合､ 関数から何かを返したいでしょうから､ このように変数に代入して､
後でプログラムの中で使えるようにすることができるのです｡
次回作でお会いしましょう｡
バイバイ｡
最後にもうひとつ｡
returnキーワードは自動的に関数を終了させるので､ ここでprintのような別のコードを追加した場合､ その関数は終了します｡
こんにちは｡
あるいは､ ここにリターンファイブがあってもいいかもしれませんね｡
まだ有効であることがわかりますね｡
でも､ これを実行すると
関数から何かを返すとすぐにその関数を終了してしまうので､ インタプリタは5行目と6行目までたどり着けず､
まだ30が表示されています｡
この部分が関数を終了しない理由は､ この関数の内部で定義していることを忘れてはいけないからです｡
だから､ この部分は実際に動かしていないんです｡
私たちは､ コードの中で別の関数が出てきたときに､ それが何であるかは知っているが､ それを実行するつもりはない､
と言っているだけなのです｡
だから､ こんな感じになるんですね｡
そして､ returnステートメントが呼ばれるとすぐに､ 「よし､
この値でこの関数から抜けるぞ」と言うのです｡
ちょっとだけ注意点｡