無題のプレゼンテーション

Pythonの勉強するよ【関数編①】

どもども。お久しぶりです。アプリを作っていたらこちらのほうが疎かになってしまいました。いつの間にやら年も明け、2月に入ってしまったのでそろそろ復帰したいと思います。
しばらくの間は週1更新を目標に頑張っていこうと思います。

前回はfor文とrange関数について勉強していきました。

【前回の復習】
・for文は指定回数繰り返したり、データの集まりからデータを一つずつ取り出すときに使う。
・range()関数で回数を指定できたりする。

今回は関数について勉強していきます。

3.0 関数

関数とはそもそも何か

関数というのは、プログラムの中にある、小さなプログラムの集まりのことです。
プログラムを書いていると、何度も同じ処理をしたくなることがあります。
例えば、次のような表示がしたいとしましょう。

Howdy!!
Howdy!!!!
Hello there.
Howdy!!
Howdy!!!!
Hello there.
Howdy!!
Howdy!!!!
Hello there.

↑のをそのまま表示しようとすると、下のようになります。

print('Howdy!!')
print('Howdy!!!!')
print('Hello there.')
print('Howdy!!')
print('Howdy!!!!')
print('Hello there.')
print('Howdy!!')
print('Howdy!!!!')
print('Hello there.')

この場合、行数が多くなりコードが読みづらくなりますし、どこか間違っていた場合修正するのが大変です。
例えば、Hello there.と表示するはずが、Hello here.と表示していた場合、3か所修正をする必要があります。
そこで使用するのが関数です。
関数を使うと、以下のようにまとめることができます。

def hello():
    print('Howdy!!')
    print('Howdy!!!!')
    print('Hello there.')

hello()
hello()
hello()

def hello(): からprint('Hello there.')までが関数で、そのあとのhello()が関数を呼び出している箇所です。実行結果は先ほどと同じになります。
helloという関数を自分で作成し、その中でprint関数を呼び出しています。
そのため、先ほどのようにHello here.と間違って表示していた場合は、hello関数内の1か所だけを修正すればいいのです。

【Point】
・関数とは、プログラムの中にある小さなプログラムの集まりのこと。
・関数のメリット
 1.処理をまとめることができるので、ソースコードがすっきりする。
 2.バグが発生したときに、少ない修正箇所で済む。

3.1 関数の定義

先ほどは、関数とは何か、関数のメリットは何かを勉強しました。
今回は、関数の定義の仕方を勉強していきます。

3.1.1 パラメータなし関数

最初はパラメータなしの関数の定義の仕方を説明します。

def 関数名():
    コードのブロック

これだけです。関数名のところには、この関数が何をする関数なのかを表す名前を付けてあげるとよいでしょう。

3.1.2 パラメータ付き関数

続いては、パラメータ付き関数の定義の仕方です。ですがその前に、パラメータの説明を簡単にしましょう。
パラメータとは、関数を呼び出す際に渡される引数が格納される変数のことです。
例えば、len()関数の定義を見てみましょう。

len(s)

len関数は以下のように使用します。

len('test')

引数としてtestという文字列が渡され、len関数の定義の変数sに格納されます。この変数sがパラメータです。

それでは、実際にパラメータ付き関数の定義の仕方を説明します。

def 関数名(param):
    コードのブロック

これだけです。paramのところは任意の名前を付けることができます。また、パラメータの数を2つや3つに増やすこともできます。
実際に定義してみましょう。

def add_x_y(x, y):
    print( x + y )

上の関数は、引数で受け取ったxとyを足して、標準出力に表示する関数です。このように、パラメータの数を増やしたい場合は、カンマで区切ることで数を増やすことができます。
また、print関数のようにいくつ引数が渡されるかわからない場合、次のように定義します。

def 関数名(*param):
    コードのブロック

こうすることで、print関数のように複数個の引数を扱うこともできます。
ここで注意することは、パラメータを使えるのは、その関数内だけという点です。
実際にadd_x_y関数を呼び出すことを想定してみます。

def add_x_y(x, y):
    print( x + y )


add_x_y(1, 2)
print(x)

実際に実行してみると、結果は以下のようになります。

【実行結果】
3
Traceback (most recent call last):
File ".\test.py", line 6, in <module>
print(x)
NameError: name 'x' is not defined

add_x_yが実行された後のprint(x)の部分で未定義エラーが発生しています。
このように、関数の外でパラメータを使おうとするとエラーになるので注意しましょう。

【Point】
・パラメータなしの関数の定義の仕方
def 関数名():
    コードのブロック

・パラメータ付き関数の定義の仕方
def 関数名(param):
    コードのブロック

・パラメータはその関数の中でしか使えない。

3.2 戻り値とreturn文

前の項目で、関数の定義の仕方を勉強しました。続いては、戻り値とreturn文について勉強していきます。
戻り値とは、関数の実行結果として、関数から返される値のことです。
先ほども登場した、len関数を例にとります。

res = len('test')

print(res)
【実行結果】
4

上記のように、len関数は関数で実行した結果を呼び出し元に返していることがわかります。
それでは実際に、戻り値を返却する関数を作成してみましょう。
戻り値を返却する際に活躍するのがreturn文です。
return文の定義の仕方は以下のようになります。

return 値 または 式
def add_x_y(x, y):
    return x + y

res = add_x_y(1,2)
print(res)
【実行結果】
3

言語によっては、戻り値の値を定義しないといけませんが、Pythonの場合は必要ありません。
return文は、評価した式、または値を呼び出し元に戻り値として返却します。そのため、x + yを評価した結果が呼び出し元に返却されます。
return文で注意することは、return文が実行されると、その関数は終了するということです。例えば、先ほどの関数に少し手を加えてみます。

def add_x_y(x, y):
    return x + y
    print('test')

res = add_x_y(1,2)
print(res)

この場合の実行結果も先ほどと同様、3が表示されますが、testは表示されません。
return文は途中で関数をやめることができるので、エラーが発生したら、処理を中断するのような使い方もできます。

[Point]
・戻り値とは、関数から返される値のこと
・return文を使って、関数の戻り値を設定することができる。
・return文の書き方
    return 値 または 式
・return文が実行されると、関数は処理を終了する。

3.3 None値について

戻り値とreturn文について勉強しましたが、return文を指定しない関数は何を返却しているのでしょうか?実際に見てみましょう。

def add_x_y(x, y):
   print(x + y)

res = add_x_y(1,2)
print(res)
【実行結果】
3
None

Noneという値が返却されていることがわかります。
このNoneというのは、NoneTypeの唯一の値になります。この値は、値がないことを表しています。他の言語でいうとnullやundefinedと同じようなものです。
return文の使い方として、途中で関数を終了するというものがありましたが、戻り値を返却しない関数は途中で関数を終了できないのでしょうか?
実は、同じようにreturn文を使用して、途中終了することができます。

def add_x_y(x, y):
   if x % 2 == 0:
       return
   print(x + y)

res = add_x_y(1,2)
print(res)

res = add_x_y(2,2)
print(res)

関数add_x_yは、xの値が奇数の場合のみ、足し算した結果を表示します。そのため、実行結果は下のようになります。

【実行結果】
3
None
None

このように、return文のみを書くことで、戻り値をNoneにして、関数の処理を終了することができます。

【Point】
・None値は、値がないことをあらわす値。
・return文に何も式や値を設定しないと、Noneが戻り値に設定される。
・return文のみ書くことで、戻り値を設定せずに、関数を終了できる。

3.4 キーワード引数

本日最後は、キーワード引数についてです。
キーワード引数とは、引数に任意項目を設定したい場合に使用します。
例えば、よく使うprint関数の定義を見てみましょう。

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

sepパラメータに注目してみます。先ほどまでの定義の仕方と異なり、sep=' 'となっていますね?これは、引数として値が設定されなかった場合の初期値を設定しています。つまり、print関数は、キーワード引数としてsepの値が渡されなかったら、半角スペースをsepに設定するということです。では実際にキーワード引数に値を設定してみましょう。

print('A','B','C')
print('A','B','C',sep=',')
【実行結果】
A B C
A,B,C

このようにprint関数は、キーワード引数sepが指定されなかった場合、受け取った引数を半角スペースで区切って表示します。しかし、sepを指定した場合、その指定した値で区切ることができます。
それでは実際にキーワード引数を定義してみましょう。

def 関数名(key値=value値):
    コードのブロック

ここで設定するvalue値が、key値の初期値として設定されます。

実際に使ってみると、以下のようになります。

def add_x_y(x, y, env_flag=False):
   if env_flag:
       if x % 2 == 0 and y % 2 == 0:
           print(x + y)
       return
   print(x + y)

print('env_flag = no set')
add_x_y(1,1)
add_x_y(1,2)
add_x_y(2,1)
add_x_y(2,2)

print('env_flag = True')
add_x_y(1,1,env_flag=True)
add_x_y(1,2,env_flag=True)
add_x_y(2,1,env_flag=True)
add_x_y(2,2,env_flag=True)
【実行結果】
env_flag = no set
2
3
3
4
env_flag = True
4

add_x_y関数は、キーワード引数にenv_flagを持っています。初期値はFalseなので、何も設定されない場合は、引数xとyを足した結果を表示します。しかし、Trueが設定された場合は、xとyが偶数の場合のみ、xとyを足した結果を表示します。

【Point】
・キーワード引数は、引数に任意項目を設定したい場合に使用する。
・キーワード引数の定義の仕方
def 関数名(key値=value値):
    コードのブロック

まとめ

今回は関数について勉強しましたがいかがでしたでしょうか?
簡単にまとめると、こんな感じかと。

【まとめ】
・パラメータなしの関数の定義の仕方
def 関数名():
    コードのブロック


・パラメータ付き関数の定義の仕方
def 関数名(param):
    コードのブロッ


return文を使って、関数の戻り値を設定することができる。
・return文の書き方
    return 値 または 式

return文が実行されると、関数は処理を終了する。
・キーワード引数は、引数に任意項目を設定したい場合に使用する。
・キーワード引数の定義の仕方
def 関数名(key値=value値):
    コードのブロック

だいぶボリューミーになってしまいました。次回は、スコープの話をしていこうと思います。ではでは。

P.S.

ラズパイを買って、エアコンをスマホから操作できるようにしました。
時間ができたら解説しようと思います。


この記事が気に入ったらサポートをしてみませんか?