まんじ
職業: ニート

フリーランスなウェブエンジニアをしてますう。
いじめられて中学で不登校→ネトゲ廃人になって500万稼ぐ→早稲田→ビジネス失敗→投機成功→ウェブエンジニア→ドバイ→Now

昔やってた大学受験のサイト

不登校から早稲田へ

最近作ってるウェブアプリ

TimeHub

Chapter8. 関数(メソッド)

  • 2023/05/18
  • 2023/05/20
  1. Chapter8. 関数(メソッド)

Contents

今回はプログラミングで最重要っちゃ最重要な関数(メソッド)についてやっていきます。

以後、メソッドと呼んだら関数(メソッド)と解釈してください。

そもそも関数(メソッド)とは何か

「ある値を入れたり、入れなかったりして呼び出すと、ある値が出てくるもの」です。

中学でやる1次関数もプログラミングの関数という概念に似ています。

上の1次関数の例だと、「xにある値を入れると、1加えられて、yに入る」って感じです。

プログラミングにおける関数も大体そんな感じ。(感じ。)

Pythonでメソッドはどう書くのか

早速コードを見ていきましょう。

def sum(x, y):
  return x + y

print(sum(100, 200))

メソッドは変数と違くて、defと書いて定義します。(変数に入れることもできますが省略します。)

ここで解説画像を入れたいと思いま〜ぁっす↑↑(謎のハイテンション)

forとかifと同様で、:とインデントに注意してあげてください。

Pythonでメソッドを使うメリット

メリット1. 使いまわせる

例えば、先ほど書いたsumのメソッドは、一度書いてしまえばいろいろな場面で使いまわすことができます。

このまんじと愉快に楽しく学ぶPython講座ではやらないんですが、Pythonのコードはファイル分割できます。

  • PythonファイルA(メソッドがいっぱい書いてある)
  • PythonファイルB
  • PythonファイルC

このように用意したら、ファイルBからファイルAのメソッドを呼び出して、何度も使い回すことができます。

「そんな使いまわす場面あるの?」と最初は思いがちなんですけど、ある程度コードをいっぱい書くようになってくると、わりかし使いまわす場面が増えてきます。

なので、引数に対して特定の処理をして結果を戻すことができるメソッドは便利なのです。

そう、便利なのデス!

メリット2. シンプルに書ける(責務や関心事を分離することができる)

例えばなんですけど、ある結果を得るために、144回計算する行が必要な計算式があるとします。

その計算式をコードを書く際に毎回書いていると、コードがごっちゃごちゃになって、読むのにも時間がかるようになってきます。

しかし、その144回の計算を引数を渡すと戻り値で戻してくれるメソッドがあれば、コードを書く際もシンプルに書けます。

イメージとしてはこんなん。

def super_function_as_144_times_calculation():
  # ここで144回のめちゃくちゃ複雑な計算が行われます
  # ここで144回のめちゃくちゃ複雑な計算が行われます
  # ここで144回のめちゃくちゃ複雑な計算が行われます
  # ここで144回のめちゃくちゃ複雑な計算が行われます
  # ここで144回のめちゃくちゃ複雑な計算が行われます
  return 4

result = super_function_as_144_times_calculation()
print(result)

あんまりイメージはわかないかもですが、要は、メソッド内部に閉じ込めることができるんです。

例をあげるなら、洗濯機に洗濯物つっこんで、ボタン押したら、数十分後に何もかも全部終わって洗濯物が取り出せるみたいな感じです。

入出力だけ把握してればよくて、内部の処理は任せたぞ!って感じなのが、メソッド。そう、洗濯機です。

Pythonのメソッドを実際に書いてみよう

パターン1: 2個値を入れると足し算して戻してくれる

def add_two_numbers(x, y):
  return x + y

print(add_two_numbers(1,3))

解説です。

  1. def add_two_numbersでメソッドを定義、引数にはxとyを取る
  2. 引数を足したものをreturnで戻す
  3. printでメソッドを呼び出して出力

これに関しては簡単?かと思いますが、メソッドに関して言うとこの形をベースにただ変形されていくだけです。

パターン2: 2個文字列を入れると引っ付けて戻してくれる

def concatenate_string(first, second):
  return first + second

print(concatenate_string("まんじさん", "大好き😱"))

解説です。

  1. def concatenate_stringで引数、first、secondを取るメソッドを定義してます
  2. 戻り値として、first + secondで文字列を連結して戻します
  3. printメソッドのところでメソッドを読んで出力

数字の足し算とほぼ同じでした。

パターン3: 階乗計算をしてくれる

一応、そもそも階乗ってなんぞや?って部分について解説を入れておくと、5! = 120ってやつです。

5! = 5 * 4 * 3 * 2 * 1 = 120
4! = 4 * 3 * 2 * 1 = 24

ということで、コードです。

def get_factorial(x):
  factorial = x
  for number in range(1, x):
    factorial *= number
  return factorial

print(get_factorial(5))

解説です。

  1. def get_factorialで階乗を計算するメソッド定義(xが5なら5の階乗てきな)
  2. range(1, x)でループを回して、最初に定義したfactorialにループごとにかけていってます
  3. x = 5なら、 5に1,2,3,4をかけていって、階乗計算をしています
  4. returnで戻して、printで出力して終わり

まあでも階乗とか使わんのだよなーと思いつつ、キモヲタエンジニアだと階乗をこう書きます。

わりときもいので、流し読みでOKです。

def get_factorial(x):
  return x * get_factorial(x - 1) if x != 1 else 1

print(get_factorial(5))

解説です。

  1. def get_factorialでメソッド定義
  2. returnの部分で、xが1になるまでずっと、x-1を引数にして自分の関数を呼びだし続けて、結果的に階乗を作る
    • 三項演算という1行でif文を書ける文法を使ってます
  3. printで出力

これは再帰関数(recursive function)と呼ばれるやつで、関数から自分の関数を呼び出してある条件までループさせる技です。

一般的にエンジニア界隈だとこういうのがカッコイイみたいな風潮があるっちゃあります。

「みんなと違う書き方ができるおれ、最高にかっこいい」てきな、まじで分かりにくいですけど、確かに1行はイケてると思ってしまう自分がいます。

とりあえず無視でOKです。

パターン4: 今日の運勢を教えてくれる

import random

def get_today_luck():
  today_luck = random.randint(1, 3)
  if today_luck == 1:
    return "凶"
  elif today_luck == 2:
    return "大凶"
  else:
    return "めちゃくちゃ大凶"
  
print(get_today_luck())

解説です。

  1. import randomで、Pythonに組み込みで入っているrandomモジュールを読み込んでいます(メソッドが大量に入ってるっぽいものです)
  2. get_today_luckメソッドを定義
  3. today_luck = random.randint(1, 3)で、1~3の間で乱数を取り出してます
  4. if文で分岐して、運気を戻り値で戻してます
  5. printメソッドで表示

絶対運悪くなるしかないという。オワタ。

import randomってところが意味不明かと思うので、もう少し深掘りします。

import ***

または

from *** import ***

って感じの宣言で、Python組み込みのモジュール(大量にメソッドとかが詰め込まれた便利なやつ)を読み込んで使えます。

定番どころとしては以下のようなものがあります。

import math
import requests
import random

こいいったモジュールの利用は実際にプログラミングをしていると勝手に使うようになります。

「うーん、階乗計算が必要だな・・・」
「Python 階乗計算」
結果「mathモジュールの、factorialメソッドが使えます」

import math

print(math.factorial(5))

「おお、ほんとだ、できた」って感じの思考フローです。

まとめ

今回はメソッドについて勉強してみました。

必要そうに感じた時にメソッドにしてみると良いと思います。

まんじ
職業: ニート

フリーランスなウェブエンジニアをしてますう。
いじめられて中学で不登校→ネトゲ廃人になって500万稼ぐ→早稲田→ビジネス失敗→投機成功→ウェブエンジニア→ドバイ→Now

昔やってた大学受験のサイト

不登校から早稲田へ

最近作ってるウェブアプリ

TimeHub