python

python

python入門~関数の作成方法 | 独学プログラミング

こちらの記事では過去の記事で紹介してきた関数を自分で作成する方法や、自作することによるメリットを紹介していきます。

関数を作ることもできるんだね。いまいち使いどころが分からないけど・・・
上手に使うことでコードを短くしたり、読みやすくすることが出来ます!
実例で紹介していきますね

関数を作る目的

早速、作る目的を理解するところから始めましょう

例えば以下のように配列の中の数字を2倍にして一つずつ表示するプログラムがあったとします。

num_array = [2, 5, 10]

for num in num_array:
    print("元の数字は" + str(num) + "です")
    print("2倍の数字は" + str(num * 2) + "です")

print("処理を終了します")

上記の例で配列内の3つの数値を、元の数値と2倍にした数値を表示するプログラムです。

例に追加して、3倍の数値を表示するプログラムを追加してみます。

num_array = [2, 5, 10]

for num in num_array:
    print("元の数字は" + str(num) + "です")
    print("2倍の数字は" + str(num * 2) + "です")

for num in num_array:
    print("元の数字は" + str(num) + "です")
    print("3倍の数字は" + str(num * 3) + "です")

print("処理を終了します")

同じくfor文を準備して、中身の*2部分を3に変更してあげることで実現できますね。

ただfor文がほぼ同じ処理が2つ続いています。こちらを関数を自作して利用することで解決できます。

# 配列と掛け算の数値を受け取って処理をする関数
def value_print(num_array, multiplication):
    for num in num_array:
        print("元の数字は" + str(num) + "です")
        print(str(multiplication) + "倍の数字は" + str(num * multiplication) + "です")

# 処理開始
num_array = [2, 5, 10]

value_print(num_array, 2)
value_print(num_array, 3)

print("処理を終了します")

この例だけでは、大きなメリットは感じづらいですが、例えば2, 3のように処理を追加していく場合、上の例では1行(value_print)の部分を追加するだけで実現できるようになります。

続けて上記例を使って関数の作り方、コードの処理の順番を説明していきます。

関数の作り方

まずは以下部分に注目します。こちらが関数を定義している部分です。

# 配列と掛け算の数値を受け取って処理をする関数
def value_print(num_array, multiplication):
    for num in num_array:
        print("元の数字は" + str(num) + "です")
        print(str(multiplication) + "倍の数字は" + str(num * multiplication) + "です")

関数の定義

関数の定義はdefという文字列を使って表現されます。

上記例の場合は、「value_printという関数を定義する」という書き方です。

この書き方をすることで呼び出す際にはvalue_printを使って呼び出すことが出来ます。

引数の受け取り方

関数定義と同じ行のカッコの中身は引数の定義です。

上記例では、num_arrayとmultiplication2つの変数を受け取るという定義をしています。

関数の中で上記の変数を使うことになるため、呼び出す際にはvalue_print(XXX, 〇〇〇)のように変数を2つ指定する必要があります。

引数の詳細な設定方法やルールは後述しています。

関数のスコープ(対象)について

関数の処理の中は、通常のコードと同じようにif文を使った条件分岐やfor文やwhile文を利用することが可能です。

またif文などと同じくインデント部分が関数の処理範囲になります。

関数の処理が終わると元の呼び出し部分に戻り、処理が継続されます。

関数を作って利用する場合の実行順

今回の例で説明すると、以下の実行順になります。コメントの番号順で処理が進んでいきます。

# 実行順3、5
def value_print(num_array, multiplication):
    for num in num_array:
        print("元の数字は" + str(num) + "です")
        print(str(multiplication) + "倍の数字は" + str(num * multiplication) + "です")

# 実行順1
num_array = [2, 5, 10]

# 実行順2
value_print(num_array, 2)
# 実行順4
value_print(num_array, 3)

# 実行順6
print("処理を終了します")

関数の定義部分は呼び出されるまでは実行されません。

そのため実際に処理開始するのは8行目からになります。

次に11行目でvalue_printを呼び出すと2行目に定義している関数が実行されます。

関数内のfor文の処理が終わると関数が終了するため、次の実行順4が実行される・・という流れです。

関数を利用することにより、今までの「上から順に処理される」という概念が変わるため、どこが関数定義されている箇所なのかを把握できるようにしましょう。

いままで上から順に実行されるという考え方だったけど、関数は注意する必要があるね

関数の引数と戻り値の使い方

引数と戻り値とは?

以下の記事で解説してますので、知らない方や不安な方は先に確認しておきましょう。

python入門~関数とメソッドの違い

引数の設定方法

前述でも記載したとおり、defで定義する関数名の後にカッコ書きで記載します。

この時に変数なしの場合もカッコは必要です。 ※value_print()とします。

def value_print(num_array, multiplication):
    for num in num_array:
        print("元の数字は" + str(num) + "です")
        print(str(multiplication) + "倍の数字は" + str(num * multiplication) + "です")

例の場合は、1つ目の引数に配列、2つ目の引数に数値として利用しているため、渡す側でも注意が必要です。

戻り値の設定方法

文字列を数値に変換するint関数では文字列を引数に受け取って、数値を返却しています。

num = int("100")

このように関数内で処理した結果を返す処理を、自作した関数で実施することも可能です。

# 受け取った変数を*2にして返却する関数
def sample_num(num):
    rst = num * 2
    return rst


# 4を引数にsample_numを呼び出し、結果をnum2変数に入れる
num2 = sample_num(4)

# 実行結果:8
print(num2)

上記の例では、sample_numという関数を定義しています。

8行目で呼び出した結果をnum2に入れ、最後にprint処理を行っています。

また関数内では最終的に返したい結果をreturnという構文を使って指定します。上記例はrst変数の中身を返却しています。

ルールは何となく把握したけど、どういった場面で関数を使うべきがまだピンときてないよ
最初は同じような処理を見つけたら関数に出来ないかな?と考えてみる程度で大丈夫です
慣れてくると効率的な関数の作成ポイントが分かるようになってきます

python入門~関数の作成方法 まとめ

今回はprint関数やint関数のような関数定義を自分で実施する方法、また作成する目的について紹介しました。

当然自分で作成する関数も業務では必須の仕組みです。他の人が作成した関数を読む機会もあるため、関数周辺の使い方は自作しながら身に着けていきましょう。

ここまでの記事でpython入門の制御処理の紹介は完了です。

続けて実際にプログラミングするために押さえておきたい内容を一つずつ紹介していきます。

python入門~dictionary型の使い方と目的

補足~本ページQ&A

関数は事前に定義が必要

関数を作るdefの処理は一番最初に実施する必要があるの?
一番最初でなくても大丈夫です。"呼び出す前に定義する"ことを守るようにしましょう
定義する前に呼び出してしまうと以下のように定義されていないというエラーになります
# 定義される前にsample_numを呼び出し
num2 = sample_num(4)

# 実行結果:NameError: name 'sample_num' is not defined
def sample_num(num):
    rst = num * 2
    return rst

関数内で関数を呼び出す

if文と同じように関数の中から関数の呼び出しも出来る?
全く問題なく利用できます。原則として"呼び出す前に定義する"が守られていれば大丈夫です
# 2倍にして返却する関数
def sample_num(num):
    rst = num * 2
    return rst

# 値を2倍にして表示する関数
def value_print(num):
    print_num = sample_num(num)
    print(print_num)


# 一番最初に実行される処理
# 実行結果:20
value_print(10)

上記の例ではvalue_print関数の中でsample_num関数を呼び出しています。

極力、関数は汎用的な作りとしたいので、上記例のようにあえて関数を分離するケースもあります。

関数で戻り値を複数返す方法

関数を作成してみたけど、、結果を2つ返すいい方法ないかな??
以下のようにカンマで繋ぐことで実現できます
結果は配列として返却されます
# 2倍にして返却する関数
def sample_num(num):
    rst = num * 2
    rst2 = num * 10
    return rst, rst2


num_array = sample_num(5)

# 実行結果:10
print(num_array[0])

# 実行結果:50
print(num_array[1])
他言語ではあまり見られない書き方なので、以下のように配列にして返すほうが分かりやすいです
# 2倍にして返却する関数
def sample_num(num):
    rst = num * 2
    rst2 = num * 10
    rst_array = [rst, rst2]
    return rst_array


num_array = sample_num(5)

# 実行結果:10
print(num_array[0])

# 実行結果:50
print(num_array[1])

関数のオプション引数・デフォルト値指定について

関数の引数は予めオプション指定を行うことが出来ます
利用方法としては引数が指定されていない場合に使われる値となります
# 2倍にして返却する関数
def sample_num(num = 5):
    rst = num * 2
    return rst

print_value = sample_num()

# 実行結果:10
print(print_value)

上記例ではsample_numを呼び出す際に引数が指定されていませんが、予め設定されているnumのオプション値が利用され、結果は10となります。

多用すると分かりづらくなるため、必要な場面でのみ利用するようにしましょう!
こちらも業務で良く使われる処理の一つです

関数の型定義について

pythonは関数定義や引数、戻り値の文法が分かりやすい言語ですが、関数が増えてくると型情報が分かりづらくなるデメリットもあります
そういった課題に対して型ヒントを設定する方法があります
def greeting(name: str) -> str:
    return "Hello " + name

greet_name = greeting("haru")

# 実行結果:Hello haru
print(greet_name)

上記の例では、str型のname引数を受け付けて、結果を->の後に記載されているstrで戻り値を返却します。という書き方です。

ただあくまでも注釈であり、間違った型を引数として設定してもエラーになりません。

静的解析を行うことでズレている場合は検知可能ですが、実施手順は別記事で紹介していきます。

-python
-

Copyright© ビギナープログラミング , 2020 All Rights Reserved.