この記事には、PR部分にUdemyのアフィリエイトリンクを含みますが、記事の内容は筆者が独自に作成したものです。記事の作成についてUdemy様から報酬等を受け取って作成したものではありません。
関数の中身
Pythonの関数は、普通に書くと数行にわたるコードを、簡単に呼び出せます。
例えば、sum( )関数は、リスト内の数字をすべて加算してその数字を返しますが、その処理をいちいち書き出すとすると、どのようになるでしょうか。
# SUM( )の例
#%%
numbers = [1, 2, 3, 4, 5]
total = sum(numbers)
# 実際行われているであろう処理
numbers = [1, 2, 3, 4, 5]
total = 0
for i in numbers:
total += i
イテラブル(反復可能)なリストが、forで繰り返し呼び出せることは反復処理の回で学びました。
変数totalにリスト内の数字を加算していく処理を行うとすると、上記のようなコードが考えられるでしょう。
1回~2回しか行わない処理ならば、上記のように書いても負担が少ないでしょうが、sum( )関数を利用すれば、forを利用した一連の処理を一瞬で行うことが出来ます。もちろん、組み込み関数の中に最適な関数が用意されており、それを利用できれば新しい関数を作成する必要はありません。
しかし、プログラムを作成していると、同じ構造のコードを何回も書くことになるというケースがあり、それは組み込み関数には存在しない処理であることがあります。
そのような場合に役立つのが、関数の定義・作成です。
関数は一度作成すれば何度でも簡単に呼び出すことができ、コードの重複を減らしてプログラムを整理することが出来ます。
今回は、Pythonでの関数を定義・作成方法を学んでいきます。
PR
関数の定義・作成
Pythonで関数を定義・作成するには、defを使用します。
引数を取らない関数、引数を取る関数、複数の引数を取る関数の順で例を見ていきましょう。
引数を取らない関数
#%%
def birth():
"""誕生日を呼び出す関数"""
birth = (2000,4,1)
return birth
birth()
birth()は、新しく作成する関数の名前となります。defを用いて関数の作成が終了した後は、単純に birth()と記述するだけで、何度も呼び出すことが出来るようになります。
returnは、この関数を実行したときに、最終的に返す値を示します。birth()を実行した場合、(2000,4,1)というタプルを返すのがこの関数の内容です。
(注)docstringについて
以下の説明は、読み飛ばしても構いません。
‘’’’誕生日の呼び出し”””という、三つの「”」で囲まれた部分は、トリプルクオート文字列と呼ばれるもので、 ’Hello, World!’ と同じように、文字列として扱われます。
しかし、文字列は変数として割り当てられない限り、プログラムを実行する際になんの効果も発生させないため、コメントとしての役割を果たすことが出来ます。
defを使って新しい関数を定義する場合、この””””””は、docstringと呼ばれ、新しく作った関数がどのような関数なのかを説明する役割を果たします。
関数を作成する際は、他人がその関数を読んでも役割を理解できるよう、docstringを付けることが推奨されています。
また、docstringを英語で記述するべきか、日本語で記述するべきかについては、属する組織により最適解が変わるようです。日本人しか見る可能性がないプログラムであれば、日本語で記述するメリットが大きくなります。
引数を取る関数
先ほど作成したbirth( )は、特定の引数を取らない関数でした。次は、特定の引数を取る関数を作成していきます。まずは、引数を一つだけ取る関数を作成してみましょう。
#%%
def square(v):
"""引数を2乗する関数"""
i = v*v
return i
square(15)
これは、引数に入力した数字を2乗する関数です。
引数を関数の処理の中で利用したいときは、何らかの変数を引数に入力するだけです。
このとき、引数に割り当てる変数や、defに続く処理の中で使用する変数を、関数の外から引っ張ってこないように注意してください。
関数の外の変数を使用すると、その変数の内容が変化したり、変数自体が消滅した場合、作成した関数自体が動かない、無用の長物になってしまいます。
(注)ローカル変数とグローバル変数
ローカル変数は、関数内で定義された変数のことです。この変数は、その関数内からのみアクセス可能で、関数の外からはアクセスできません。上記コードの例で言うと、変数i や、変数v がローカル変数に当たります。関数の外から、iやvを変更しようとしても、関数内の変数にはアクセスできません。
一方、グローバル変数は、関数の外で定義され、プログラム全体からアクセス可能な変数です。グローバル変数は、関数の外で変更することは、演算子=などを使うことで簡単に行えます。ただし、関数の中からグローバル変数を変更するように働きかけるには、globalというキーワードを利用する必要があります。
複数の引数を取る関数
組み込み関数でいえば、range()関数は複数の引数を取る関数でした。range(1,9)などといった形で利用します。このように、「 , 」(コンマ)を使って複数の引数を取る関数も、自分で作成することが出来ます。
def add_num(num1, num2):
"""2つの引数を加算する関数"""
result = num1 + num2
return result
add_num(999,888)
この関数は、2つのパラメータnum1とnum2を取り、それらを加算して結果を返します。
モジュールの作り方
モジュール作成
関数を作成できるようになると、randomモジュールのような import randomという形で読み込んでいたモジュールも、自分で作成できるようになります。
今までの例に挙げた3つの関数を、下記のようにまとめてkansuu.pyとして保存したとします。
def birth():
"""誕生日を呼び出す関数"""
birthday = (2000,4,1)
return birth
def square(v):
"""引数を2乗する関数"""
i = v*v
return i
def add_num(num1, num2):
"""2つの引数を加算する関数"""
result = num1 + num2
return result
これらの関数を、プログラムの中で呼び出すにはどのようにしたら良いでしょうか。
kansuu.pyと同じディレクトリ内からならば、以下のようなコードでkansuu.pyに保存した関数を呼び出すことが出来ます。
#%%
import kansuu
kansuu.birth()
kansuu.square(11)
kansuu.add_num(55,88)
これは、randomモジュールを利用する際の方法と同じということに気が付くでしょう。
関数をまとめたファイルを.py形式で同じディレクトリに保存すれば、「import ファイル名」でファイルを読み込み、ファイル名.関数名()と記述することで利用できるようになります。
以上から、モジュールとは、Pythonのスクリプトファイルそのものであるということがわかります。
組み込みモジュールの中身を確認する
これから先の操作では、Pythonの中核的な機能を担うファイルの中身を覗いてみます。
決して内容を変更して保存したりしないでください。
いつも利用しているrandomモジュールは、一体どこに保存されているでしょうか。先ほど学んだ内容から、ファイル名は random.py としてPythonのどこかに保存されているはずです。Pythonの保存場所を開き、確認してみましょう。
それぞれ、Pythonの保存場所や、バージョンが違うため、以下の説明を参考に、自分で探してみてください。
Pythonの保存場所がわからない場合、Cドライブで「Python312」とフォルダ名を入力して検索(検索ワードはPythonのバージョンによって異なります)。
Pythonファイルの中から、Libフォルダを開く。
Libフォルダ内の「random.py」ファイルを探す。
Libフォルダの中に、「.py」で並んでいるPythonファイルたちが、組み込みモジュールです。「random.py」を開いて中身を覗いてみましょう。
このように、よく利用しているモジュールも、defを用いて作成されていることがわかります。
興味がある方は、コードを追って読んでみましょう。コードを読む良い練習になります(もちろん、すべてのモジュールを読む必要はありません)。
内容を確認した後は、決して変更等を保存せずにファイルを閉じてください。もし内容を変更してしまった場合は、Pythonを再インストールして内容を復元してください。
まとめ
今回の記事では、Pythonの関数の作成方法と、モジュールの作成方法、組み込みモジュールの中身について学習しました。これらの知識を活用すれば、コードをより効率的に記述することができ、より高度なプログラムを書くことが出来るようになります。
次回
PR
コメント