こんにちは、ウチダです。
私は投資や仕事に役立てるためにプログラミング言語pythonを勉強しています。
いまはプログラミングスキルを高めるために、実用書の演習問題を解いています。

前回は第2章フロー制御の演習を解説しました。
(参考:Python学習の第2章フロー制御)
今回は第3章関数の演習を解説します。
目次
- 1 Pythonを身につけてスキルアップしよう!
- 1.1 python学習1:関数を使う意義を理解しよう
- 1.2 python学習2:関数を理解しよう
- 1.3 python学習3:関数を理解しよう
- 1.4 python学習4:関数を理解しよう
- 1.5 python学習5:スコープを理解しよう
- 1.6 python学習6:ローカルスコープを理解しよう
- 1.7 python学習7:戻り値を理解しよう
- 1.8 python学習8:戻り値を理解しよう
- 1.9 python学習9:グローバル変数を理解しよう
- 1.10 python学習10:Noneを理解しよう
- 1.11 python学習11:importを理解しよう
- 1.12 python学習12:モジュールの使い方を理解しよう
- 1.13 python学習13:例外処理を理解しよう
- 1.14 python学習14:例外処理を理解しよう
- 1.15 python学習15:関数を理解しよう
- 1.16 python学習16:関数を理解しよう
Pythonを身につけてスキルアップしよう!

プログラミング言語Pythonはコードが非常にシンプルで、誰もが簡単にプログラムを作れます。
また、ツールも無料で取得でき、ネットにもコードが多数掲載されています。
Pythonは初心者こそおすすめのプログラミング言語なんです。
ただ、難しい実用書を読むだけでは理解も難しいですよね。
そこで演習を通して、専門語や使い方を覚えていけたらきっと楽しいと思います。
今回は第3章関数の演習を解いてきましょう!
python学習1:関数を使う意義を理解しよう
'''
プログラムの中で関数を用いるとなぜ便利なのですか?
'''
例えば野菜の名前を書くと、ジュース名に変えてくれるプログラムを考えます。
print('野菜の名前を入力してください:')
vege = input()
print(vege + ' juice')
複数のジュースを作る時は、このコードをいくつも書かなければなりません。
コードが増えると、修正が大変になったりミスを探しにくくなります。
作業量も増えますし、コード自体も読みにくくなります。
そこで、関数を使うことで重複するコードをなくします。
python学習2:関数を理解しよう
'''
関数の中のコードはいつ実行されますか?
関数が定義されたときですか?
それとも関数が呼び出されたときですか?
'''
関数の中のコードが実行されるのは呼び出されたときです。
以下のサンプルプログラムでは、greet()関数を作成して実行しても、ブロックは実行されません。
greet()と呼び出すとブロックが実行されます。

python学習3:関数を理解しよう
'''
関数を定義する文は何ですか?
'''
関数を定義するにはdef文を使います。
def 関数名(引数):
ブロック #def節のコード
関数を呼び出すと、ブロック内のコードが実行されます。
python学習4:関数を理解しよう
'''
関数と関数呼び出しの違いは何ですか?
'''
関数はdef文とdef節のコードからなります。
関数呼び出しは、関数名と丸カッコ()を用いて書きます。
プログラム実行が関数呼び出しに到達すると、def節のコード先頭行にジャンプして実行し始めます。
関数の末尾に到達すると、関数呼び出しをした行に戻り、続きのコードを実行します。
python学習5:スコープを理解しよう
'''
Pythonプログラムにはグローバルスコープはいくつありますか?
ローカルスコープはいくつありますか?
'''
スコープとは変数の格納庫のようなものです。
スコープにはグローバルスコープとローカルスコープの2種類があります。
グローバルスコープはプログラム内で1つだけ存在するものです。
プログラムが実行されるときに生成されます。
プログラムが終了すると、グローバルスコープは消滅し、すべての変数は忘れ去られます。
ローカルスコープは、関数が呼び出されるたびに生成します。
関数の中で代入される変数はすべてローカルスコープの中に存在します。
python学習6:ローカルスコープを理解しよう
'''
関数から返ると、ローカルスコープ内の変数はどうなりますか?
'''
関数から返ると、ローカルスコープは消滅し、ローカル変数はすべて忘れ去られます。
また、関数を呼び出しても、変数は前回関数が呼び出されたときの最後の値を覚えているわけではありません。
例えば次のプログラムを試してみます。

関数内でeggsを定義しましたが、関数の外で表示させるとエラーになりました。
関数から返るとローカルスコープは破棄され、その中の変数はすべて忘れ去られるのが分かると思います。
python学習7:戻り値を理解しよう
'''
戻り値とは何ですか?
戻り値は式の一部になりえますか?
'''
戻り値とは関数呼び出しによって得られた値を指します。
例えば以下のプログラムでは引数numの2乗が戻り値ansになります。

関数呼び出しも評価すると値を返すので、式の一部として使えます。
python学習8:戻り値を理解しよう
'''
関数がreturn文を持たない場合、関数の戻り値は何になりますか?
'''
先ほどのプログラムからretunを削除してみます。

関数呼び出しは同じなのに、戻り値はNoneになりました。
Noneは値がないことを意味します。
returnで戻り値を書かなかったため、このような結果になりました。
python学習9:グローバル変数を理解しよう
'''
関数の中でグローバル変数を参照するには
どうすればよいですか?
'''
関数の中からグローバル変数を変更するには、global文を使います。

上段のプログラムでは関数内でglobal文を使っています。
その後、関数呼び出しでeggsに代入されたので、最後はspamを表示しました。
一方下段では、global文を使っていません。
関数呼び出しでeggs2に代入しますが、このeggs2はローカル変数なので、関数から戻ると忘れ去られます。
したがって、最後はglobalが表示されます。
global文を使うと「この関数ではeggsはグローバル変数を参照するので、この名前のローカル変数を作らないで」と伝えることになるのです。
python学習10:Noneを理解しよう
'''
Noneのデータ型は何ですか?
'''
演習8で示したとおり、Noneは値がないことを表します。
データ型はNoneTypeになります。

python学習11:importを理解しよう
'''
import areallyourpetnamedericという文はどのように働きますか?
'''
import モジュール名は、モジュールをプログラムにインポートする際に使います。
プログラムの中でモジュールを呼び出せるようになります。
演習の場合、areallyourpetnamedericというモジュールがプログラムの中で使えるようになります。
python学習12:モジュールの使い方を理解しよう
'''
spamというモジュールの中のbacon()という関数があるとして、
spamをインポートした後にどのようにこの関数を呼び出しますか?
'''
モジュール内の関数を呼び出す時は、モジュール名.関数名と書きます。
したがって、演習問題の解答はspam.bacon()です。
前回の記事では、datetimeをインポートして、今日の日付を表示するプログラムを紹介しました。

(参考:Python学習の第2章フロー制御)
python学習13:例外処理を理解しよう
'''
プログラムがエラーになったとき異常終了しないようにするには
どうすればよいですか?
'''
エラー(例外)が起こると、プログラム全体が異常終了してしまいます。
商品でこのようなことは起こってはならないですよね。
そこで、例外処理が重要になります。
例外処理はtryとexcept文で作ります。
python学習14:例外処理を理解しよう
'''
try節の働きは何ですか?
except節の働きは何ですか?
'''
try節の中には例外が起こるかもしれないコードを書きます。
例外が起こると、続くexcept節にプログラム実行が移ります。
例えば割り算のプログラムを考えます。

0で割るとdivision by zeroとエラーが表示されます。
そこでtryとexcept文で関数を作成して、同様に0で割り算すると、try節ではエラーになります。
そしてexcept節のコードが実行され、文章が表示されます。
python学習15:関数を理解しよう
'''
numberというパラメータをひとつ持つcollatz()という名前の関数を書きなさい。
numberが偶数なら、collatz()はnumber / 2を戻り値とします。
numberが奇数なら、collatz()は3 * number + 1を戻り値とします。
次に、ユーザーに整数を入力してもらい、その数をcollatz()に渡して呼び出し、
関数が1を返すまで関数の戻り値をcollatz()に渡して呼び出し続けるプログラムを
書きなさい。
'''
関数とwhileループを使って作成します。

def文でcollatz()関数を作成します。
%は割り算の余りを返します。
2で割った余りが0なら偶数、1なら奇数と判断しています。
繰り返し処理するのでwhileループの中に関数呼び出しを作りました。
inputの入力値はstr型になるので、int()で整数型に変換しています。
また、負の整数のときはエラーになるようにbreakを使いました。
これがないと、負の整数を入力したら無限ループに入ります。
python学習16:関数を理解しよう
'''
演習15において、ユーザーが入力した文字列が整数でない場合を判定するように
try〜except文を追加しなさい。
except節では整数値を入力するように示すメッセージを表示しなさい。
'''
try節に学習15のコードを書き、except節にエラー文を表示するコードを書きます。

整数が入力された時だけcollatz()関数を使うようにしたいので、try節にすべてまとめました。
もしexcept節の後にwhile以降を書くと、エラー処理後にwhile文が実行されてしまいます。
これで第3章の学習は終わりです。
単に本を読むより、演習を通して学ぶほうが楽しく感じませんか?
もっと詳しく勉強したい方はこちらの本をおすすめします。
次回は第4章を解説します。
ここまで読んでくださりありがとうございました。