Python分野で初心者の方にとって最難関である関数についてです。
関数を扱えるようになるとプログラミングの可読性がかなり上がります。
関数とは
関数とは、何かしらの値を渡すとその値を元に処理が行われ、その処理結果を返すもの
7章の練習問題1でinput関数を使いました。
これはユーザがターミナル上で入力した値をinput関数に渡しその値を元に処理が行われ、文字列として結果を返す関数でした。
input関数の中で行われている処理の内容は気にする必要はなく、渡す値と処理結果だけを意識して使用すれば問題ありません。
関数に渡す値のことを引数、関数の処理の結果のことを戻り値と言います。
また関数を使うことを関数を呼び出すと言います。
関数は独自に作成することができます。
例えば5人各々の5科目のテストの合計値を算出し、合格か不合格を判定するプログラムがあったとします。
このうち「合計値を算出し、合格か不合格か判定する」この処理を5人分書くのは面倒なことです。そこで関数を使います。
この場合関数の引数と戻り値は以下のようになります。
引数:5科目の点数の値
戻り値:合格か不合格
関数を使用することで、「合計値を算出し、合格か不合格か判定する」の処理を気にする必要なく、引数と戻り値を気にすれば、合格か不合格の結果を得ることができます。
関数の使い方
関数を使うには、関数を定義しておく必要があります。
関数の定義の仕方は以下になります。
def 関数名 (引数名1, 引数名2...):
処理1
処理2
return 戻り値
引数や戻り値が無い関数もあります。その場合は省略して問題ありません。
戻り値は複数の値を返すことができます。
引数名は関数の中では変数として扱うことができます。
またこの定義の時点では関数に書かれた処理は実行されません。関数を呼び出した時に処理が実行されます。
定義した関数の呼び出し方は以下になります。
関数名(引数1, 引数2...)
実際に「5科目のテストの合計値を算出し、合格か不合格を判定するプログラム」を書いてみます。
# 関数の定義
def judge_test (japanese_score, math_score, english_score, society_score, science_score):
# 変数宣言
total_score = 0
judge_result = ""
# 合計値計算
total_score = japanese_score + math_score + english_score + society_score + science_score
# 合格不合格判定
if total_score > 400:
judge_result = "合格"
else:
judge_result = "不合格"
return judge_result
# 変数宣言
japanese = 60
math = 70
english = 50
society = 40
science = 80
judge_result = ""
# 関数の呼び出し
judge_result = judge_test(japanese, math, english, society, science)
# 結果を出力
print("テストの結果は", judge_result, "です。")
ここで注意が必要なのは関数の定義 は 関数を呼び出す処理 より前に定義しておくことです。
プログラムは上から順に処理されますので、関数を呼び出すときに「関数が定義されていない」とエラーとなります。
今回の例では引数と戻り値はそれぞれ以下になります。
引数:japanese_score, math_score, english_score, society_score, science_score
戻り値:judge_result
グローバル変数とローカル変数
変数にはグローバル変数とローカル変数の2種類存在します。
グローバル変数とは、どの関数でも使用できる変数
ローカル変数とは、宣言された関数内でしか使用できない変数
# グローバル変数
グローバル変数A = "AAA"
def 関数B (引数1, 引数2)
# ローカル変数
ローカル変数B = "BBB"
処理1
# グローバル変数
グローバル変数C = "CCC"
def 関数D (引数1, 引数2)
# ローカル変数
ローカル変数D = "DDD"
処理2
グローバル変数Aとグローバル変数Cは関数の外で宣言されています。この場合グローバル変数Aとグローバル変数Cは共に関数B、関数Dで使用することができます。
しかしローカル変数Bは関数Bの中で宣言されています。この場合はローカル変数Bは関数Bで使用することができますが、関数Dでは使用することができません。
同様にローカル変数Dに関しても、関数Dの中で宣言されいますので、関数Dでは使用することができますが、関数Bでは使用することができません。
このように関数の外で宣言されて、どの関数でも使用できる関数をグローバル変数といい、
関数の中で宣言され、宣言された関数の中でしか使用できない関数のことをローカル変数と言います。
プログラムで確認してみましょう。
コード
# グローバル変数宣言
global_valiable = "グローバル変数です。"
# 関数定義(戻り値と引数がない関数)
def function ():
# ローカル変数宣言
local_valiable = "ローカル変数です。"
print("関数内で表示(global_valiable)", global_valiable)
print("関数内で表示(local_valiable)", local_valiable)
# 関数呼び出し
function()
print("関数外で表示(global_valiable)", global_valiable)
print("関数外で表示(local_valiable)", local_valiable)
実行結果
/Users/python/python-for-blog $ /usr/bin/python3 /Users/python/python-for-blog/global_valiable.py
関数内で表示(global_valiable) グローバル変数です。
関数内で表示(local_valiable) ローカル変数です。
関数外で表示(global_valiable) グローバル変数です。
Traceback (most recent call last):
File "/Users/python/python-for-blog/global_valiable.py", line 13, in <module>
print("関数内で表示(local_valiable)", local_valiable)
NameError: name 'local_valiable' is not defined
グローバル変数を関数内で使用できるが、ローカル変数を関数外で使用するとエラーになることが確認できます。
練習問題
問題1
以下の実行結果のように、ユーザから入力された2つの単語 (input関数を使用) を1つにして出力するプログラムを関数を用いて作成せよ。
2つの単語を1つにする処理を関数とする。
実行結果
1つ目の単語を入力してください。Hello ※Helloはユーザからの入力
2つ目の単語を入力してください。World ※Worldはユーザからの入力
HelloWorld
コード
# 関数定義
def connect_word (word1, word2):
# 2つの言葉1つにする。
total_word = word1 + word2
return total_word
# ユーザから入力
word1 = input("1つ目の単語を入力してください。")
word2 = input("2つ目の単語を入力してください。")
# 関数呼び出し
total_word = connect_word(word1, word2)
# 結果出力
print(total_word)
※ コードは解答例です。正解は一つではありません。
問題2
税抜価格りんごが150円みかんが100円があるとする。
合計金額を算出し、税込価格を算出する処理を関数として、税込の合計金額を表示するプログラムを作成せよ。
コード
# 関数定義
def calculate_tax_price (apple_price, orange_price):
# 合計金額を算出
total_price = apple_price + orange_price
# 税込価格を算出
tax_total_price = total_price * 1.08
return tax_total_price
# 変数宣言
apple_price = 150
orange_price = 100
# 税込の合計金額を算出
tax_total_price = calculate_tax_price(apple_price, orange_price)
print("りんごとみかんの合計の税込価格は", tax_total_price, "円です。")
実行結果
りんごとみかんの合計の税込価格は 270.0 円です。
※ コードは解答例です。正解は一つではありません。