はじめに
前回は、次のようなことを学びました。
- Pythonの文法 単純な型
- Pythonの文法 複数の値を格納する型
- Pythonの文法 条件分岐
- Pythonの文法 繰り返し処理
- Pygameの基本コードの読み解き
今回は、まだ残っているPythonの文法として、関数、モジュールとパッケージを学びます。そして、Pygameのさまざまな機能を確認していきます。
そして今回のテーマは、プログラムを「書く」ことと「整理する」ことです。さまざまな処理を関数としてまとめて、モジュールやパッケージで整理していけるようにしましょう。
関数
プログラムでは、自分で関数を定義することで、処理をまとめて使いやすくすることができます。
関数には、外部から値を受け取る引数と、呼び出し元に結果を返す戻り値があります。関数の基本的な構造は、引数を受け取り、処理をおこない、戻り値を返すというものです。
関数の定義
Pythonではキーワードdef
を使い、関数を定義します。def 関数名(引数名):
と書き、次の行からインデントして処理のグループを書きます。複数の引数を受け取るときは、,
区切りで並べて書きます。引数は、通常の変数と同じように利用できます。
関数は、return
文が実行されると終了します。return 戻り値
と書くことで、値を返すことができます。戻り値を書かなかったときの戻り値はNone
(値なし)です。また関数は、処理のグループのインデントが解除されても終了します。
プログラムの例を示します。2つの数値を足す関数を、定義して利用します。この関数は、引数と戻り値を持ちます。arg
はargument
(引数)の略です。
def add(arg1, arg2): res = arg1 + arg2 return res print(add(10, 20)) # 「30」と表示
プログラムの例を示します。引数を型とともに出力する関数です。戻り値を持ちません。
def print_type(arg): print(arg, type(arg)) print_type(10) # 「10 <class 'int'>」と表示
プログラムの例を示します。1から4までの累乗を返す関数です。引数を持ちません。
def get_powers(): data = [] for i in range(1, 5): # 1から1ずつ5未満まで(1, 2, 3, 4) data.append(i ** i) # 各値の累乗を求める return data print(get_powers()) # 「[1, 4, 27, 256]」と表示
空の関数を書きたいときはpass
を使います。このときの戻り値はNone
(値なし)です。
def test(): pass print(test()) # 「None」と表示
関数の引数
関数を利用するときは、引数の書いた順番に値を書く以外に、引数名を書いて値を書くこともできます。
引数名を書くときには、それぞれの順番は前後しても構いません。値だけ書く書き方と混ぜることもできます。ただし混ぜるときは、引数名で書くものをあとにする必要があります。
プログラムの例を示します。
def print_prof(name, age): print(f"名前は{name}、{age}歳です") print_prof(name = "ポチ", age = 10) # 「名前はポチ、10歳です」と表示 print_prof(age = 9, name = "タマ") # 「名前はタマ、9歳です」と表示 print_prof("ココア", age = 11) # 「名前はココア、11歳です」と表示 # print_prof(name = "ミカン", 8) ← こういう順番は駄目
アスタリスク
Pythonの関数を見ていると、*
(アスタリスク)が出てくることがあります。*
には、いくつかの使い方があります。
まずは、関数を呼び出すときの*
です。*
を使えば、リストや辞書を展開して関数の引数にできます。リストを展開するときは*変数名
と書きます。辞書を展開するときは**変数名
と書きます。
プログラムの例を示します。*
でリストを展開します。
def add(arg1, arg2): res = arg1 + arg2 return res data = [10, 20] print(add(*data)) # 「30」と表示
プログラムの例を示します。**
で辞書を展開します。
def print_prof(name, age): print(f"名前は{name}、{age}歳です") data = {"name": "きなこ", "age": 6} print_prof(**data) # 「名前はきなこ、6歳です」と表示
次に*
の使い方の2つ目を説明します。関数で値を受け取るときの*
です。
引数の前に*
を付ければ、引数をリストや辞書の形で受け取れます。リストとして受け取るときは*引数名
と書きます。辞書として受け取るときは**引数名
と書きます。
プログラムの例を示します。まずは*
を使いリストとして受け取ります。
def add(*args): res = 0 for i in args: # 引数のリストを1要素ずつ処理 res += i # 要素をresに足していく return res print(add(10, 20, 30)) # 「60」と表示
プログラムの例を示します。次は**
を使い辞書として受け取ります。
def print_prof(**kwargs): text = "" for k, v in kwargs.items(): text += f"{k}は{v} " print(text) print_prof(name = "ハナ", age = 7) # 「nameはハナ ageは7」と表示