こんにちは、Yoshimiです。
私が開発でいつも困ることととしてメソッド(自作関数)の作り方です。なので、自分の備忘録的な観点とアウトプットすることでしっかりと自分が理解できると信じて残していきます。一緒にスキルアップしちゃいましょう!
Contents
関数
Pythonの「関数」とは、「何らかの値を渡すと、処理に応じた結果を返す」というものです。数式ですね。PythonやIT業界では、与える値を「引数」といいます。返ってくる値を「戻り値」「返り値」と呼びます。
簡単な例ではprint()があります。print(何らかの値)を実行すると何らかの値が表示されます。これは戻り値はありませんが、「出力させる」という処理がprint関数で実行されています。
関数が大切な理由は、「複雑な処理を何度も記述するのが面倒だから」です。例えば以下のプログラムをどう思いますか?
# 以下の a, b, c の合計が知りたい a = [1, 2, 3] b = [1, 10, 100] c = [5, 50, 500] d = 0 for i in a: d = d + i e = 0 for i in b: e = e + i f = 0 for i in c: f = f + i print(d) print(e) print(f)
6 111 555
同じ計算のfor文を3回記述しています。プログラムに落とし込むの面倒ですよね。
上記のような単純な計算であればまだ把握できるかもしれませんが、より複雑な処理の場合、理解するのにも時間がかかってしまいます。というか私は時間がかかります。自分のコードで時間がかかるのであれば、他人が作ったコードは尚更時間がかかります。ですので、関数にしておいてあげた方が後からコードを読む人にも親切になります。
では、上記の処理を簡略化してします。
# 以下の a, b, c の合計が知りたい a = [1, 2, 3] b = [1, 10, 100] c = [5, 50, 500] d = sum(a) e = sum(b) f = sum(c) print(d) print(e) print(f)
かなりスッキリしました。
上記のfor文はリストに入ってる値の総和になるのでsum()を使っています。よくみるとsum()で計算され代入されたd、e、fをprint()で表示しています。この部分も簡略化できそうです。
# 以下の a, b, c の合計が知りたい a = [1, 2, 3] b = [1, 10, 100] c = [5, 50, 500] num_list=[a,b,c] for i in num_list: print(sum(i))
上記プログラムも同じ結果になります。
いかがでしょうか?関数ではありませんが、同じ処理をまとめるということの素晴らしさをお分かりいただけましたでしょうか?
スッキリしていてみやすいですし、なんかプログラマー感でますよね!
ということで、関数を作ってみましょう。
簡単な関数をつくってみよう
関数のルールを覚えましょう。
ソースコードdef 関数名(引数1,引数2,引数3,....): 処理
def 処理名():とし、改行しインデントを下げて処理を記述していきます。
引数の数は処理に応じてして指定してください。引数なしということもできます。
処理は一つの処理だけでなく、複雑にいくつもの処理を組み合わせることも可能です。その処理で、どんな値を返したいのかで処理の中身も変わるはずです。
引数なしの関数
引数なしの関数を作成してみましょう。
print('山田太郎')
を実行してください。
山田太郎
と表示されます。
print文の上にdef 処理():をつけ、print()を改行してください。
def fullname(): print('山田太郎')
これで、関数は作成できました。Fullname()を実行してください。
fullname()
山田太郎
山田太郎が出力されます。
fullname()には、引数はありませんが、「山田太郎」を表示させる処理があるので、何回実行しても「山田太郎」が表示されます。
引数をわたす関数
fullname()に引数を渡して、結果を表示できるようしましょう
def fullname(name): print('私は' + name + 'です')
これで、関数は作成できました。
fullname("佐藤亮一")
私は佐藤亮一です
nameという引数に、佐藤亮一が渡され、def文内の処理、「’私は’+ name + ‘です’」が、「’私は’+ ‘佐藤亮一’ + ‘です’」となり、表示されました。
複数の引数を渡すの関数
複数個の引数を渡す関数を作ってみましょう。
def diff(x, y): print(x - y) #関数を実行 diff(10,3)
x,yという2つの引数を渡す関数です。
7
diff関数内で差の計算が実行されています。従って、7が返ってきます。
return文を使う関数
処理文の最後に、returnを書いて、そこに、この関数を呼び出したときに何を出力するかを定義します。これも作成したい関数によって、ある場合とない場合があります。
戻り値がある
def greeting(): return "hello"
この関数を呼び出します。
ソースコードgreeting()
'hello'
戻り値として’hello’が返ってきました。
この関数は変数に代入し利用することが可能です。
a = greeting() print(a)
ソースコードhello
ここで少し気になったことがあると思います。「戻り値として返ってきた」の表現ですが、jupyter notebookで実行すると表示されますが、pyファイルにしてターミナルで実行した際、’hello’は表示されません。なぜならば表示させるprint()関数がないからです。ですので、後者の「変数に代入し利用する」(今回はprint()ですが)で表示させています。
上記の確認は、あくまでも戻り値にどういう値が入っているのかを確認した次第です。
戻り値がない
以下のプログラムを実行してみてください。
def greeting(): print("hello") #関数の実行 greeting()
hello
なんら変わらないですね。
しかし、変数に代入し、出力してみます。
a = greeting() print(a)
hello None
helloと出力されるので一見変わらないように見えますが、戻り値としてはNoneが返ってきています。
関数においてreturnは必須ではなく、何らかの処理を実行するだけで値を返す必要がなければ省略できます。
いや〜めっちゃ難しいです。私には・・・
戻り値がある・ないのサンプル
さて、ここで問題です。以下のプログラムはどんな値を返すか考えてみましょう。
def greeting(): print("Hello") return "Good bye" #出力 x = greeting() print(x)
greeting()関数の中の処理は、Helloを出力し、戻り値としてGood byeを指定しています。
xにgreeting()の処理を代入し、print()しています。
結果としては、
HelloとGood byeを出力しそうです。
Hello Good bye
予想通りでした。
ではもう1つみてみましょう。
def greeting(): print("Hello") return "Good bye" print("see you again") x = greeting() print(x)
Hello Good bye
greeting()の中に「see you again」があるのに出力されない!と思ったと思います。実は、return 文が実行されると関数内での処理はそこで終了となります。
return 文は最後に記述するというルールはありません。複雑な処理ともなると、if文やfor文などと組み合わせて、条件分岐でreturn(戻り値)を返し、次の処理に進むということもあります。