Python 3で関数を定義する方法
紹介
関数とは、アクションを実行する命令のブロックであり、一度定義されると再利用可能です。関数はコードをよりモジュラーにし、同じコードを何度も使用できるようにします。
Pythonには、おそらくあなたが馴染みのあるいくつかの組み込み関数があります。それには次のものが含まれます:
print()は、オブジェクトをターミナルに出力します- 文字列または数値データ型を整数データ型に変換する
int() len()はオブジェクトの長さを返します
関数名には括弧が含まれ、パラメーターを含む場合があります。
このチュートリアルでは、コーディングプロジェクトで使用するための独自の関数を定義する方法について説明します。
前提条件
Python 3がインストールされていることと、コンピュータやサーバーにプログラミング環境が設定されていることが必要です。プログラミング環境が設定されていない場合は、オペレーティングシステム(Ubuntu、CentOS、Debianなど)に適したローカルプログラミング環境またはサーバー上のプログラミング環境のインストールおよび設定ガイドを参照できます。
関数を定義する
まずはクラシックな「こんにちは、世界!」プログラムを関数に変えてみましょう。
私たちは好みのテキストエディタで新しいテキストファイルを作成し、そのプログラムにhello.pyと名付けます。それから、関数を定義します。
関数は、def キーワードを使用して定義され、その後に任意の名前が続き、続いて関数が受け取る任意のパラメーターを保持する一対の括弧が続き(それらは空でもかまいません)、最後にコロンで終了します。
情報:このチュートリアルの例コードに従うには、ローカルシステムで python3 コマンドを実行して Python インタラクティブシェルを開きます。そして、>>> プロンプトの後に例をコピー、貼り付け、または編集することができます。
この場合、hello()という名前の関数を定義します。
def hello():
これは関数を作成するための初期のステートメントを設定します。
ここから、関数が何をするかの指示を提供するために、4スペースのインデントを付けた2行目を追加します。この場合、Hello, World!をコンソールに出力します:
def hello():
print("Hello, World!")
私たちの関数は今完全に定義されていますが、この時点でプログラムを実行しても何も起こりません。なぜなら、私たちは関数を呼び出していないからです。
では、私たちの定義された関数ブロックの外で、hello()を使って関数を呼び出しましょう。
def hello():
print("Hello, World!")
hello()
さて、プログラムを実行しましょう:
- python hello.py
次の出力を受け取るべきです。
Hello, World!
関数は、上で定義した hello() 関数よりも複雑になることがあります。たとえば、私たちは関数ブロック内で for ループや条件文などを使用することができます。
例えば、以下に定義された関数は条件文を使用して、name変数の入力に母音が含まれているかどうかを確認し、その後forループを使用してname文字列の文字を繰り返します。
Define function names()
def names():
# Set up name variable with input
name = str(input('Enter your name: '))
# Check whether name has a vowel
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
# Iterate over name
for letter in name:
print(letter)
Call the function
names()
上記で定義したnames()関数は、条件文とforループを設定し、関数定義内でコードをどのように整理できるかを示しています。しかし、プログラムの目的やコードの設定方法によっては、条件文とforループを2つの異なる関数として定義したい場合もあります。
プログラム内で関数を定義することで、私たちのコードはモジュール化され再利用可能になり、同じ関数を再記述することなく呼び出すことができます。
パラメーターを使用した作業
これまで、引数を取らない空の括弧を持つ関数を見てきましたが、関数定義の中で括弧内にパラメータを定義することもできます。
パラメーターとは、関数定義内の名称付きエンティティであり、関数が受け入れることができる引数を指定します。
パラメータx、y、zを受け取る小さなプログラムを作成しましょう。異なる構成でパラメータを加算する関数を作成します。この合計は関数によって出力されます。その後、関数を呼び出して数値を関数に渡します。
def add_numbers(x, y, z):
a = x + y
b = x + z
c = y + z
print(a, b, c)
add_numbers(1, 2, 3)
私たちは、xパラメータに数値1、yパラメータに数値2、zパラメータに数値3を渡しました。これらの値は、与えられた順序で各パラメータに対応しています。
プログラムは、私たちがパラメーターに渡した値に基づいて、基本的に次の計算を行っています。
a = 1 + 2
b = 1 + 3
c = 2 + 3
この関数は、a, b, と c も印刷し、上記の数学に基づいて、a は 3 と等しく、b は 4、c は 5 と予想されます。プログラムを実行してみましょう:
- python add_numbers.py
3 4 5
add_numbers() 関数に 1、2、および 3 を引数として渡すと、期待される出力が得られます。
パラメータは、通常関数定義内で変数として定義される引数です。メソッドを実行するときに値を割り当てることができ、引数を関数に渡します。
キーワード引数
引数を順番に呼び出すことに加えて、関数呼び出しでキーワード引数を使用することができ、呼び出し元が引数をパラメータ名で識別します。
キーワード引数を使用する場合、Pythonインタープリタは提供されたキーワードを使用して値をパラメータに一致させるため、パラメータの順序を入れ替えて使用することができます。
ユーザーのプロファイル情報を表示する関数を作成しましょう。それには、username(文字列として意図されている)とfollowers(整数として意図されている)の形式でパラメーターを渡します。
Define function with parameters
def profile_info(username, followers):
print("Username: " + username)
print("Followers: " + str(followers))
関数定義文の中で、usernameとfollowersはprofile_info()関数の括弧の中に含まれています。この関数のブロックは、ユーザーに関する情報を文字列として出力し、2つのパラメータを利用しています。
さて、関数を呼び出し、それにパラメータを割り当てることができます。
def profile_info(username, followers):
print("Username: " + username)
print("Followers: " + str(followers))
Call function with parameters assigned as above
profile_info("sammyshark", 945)
Call function with keyword arguments
profile_info(username="AlexAnglerfish", followers=342)
最初の関数呼び出しでは、ユーザー名をsammyshark、フォロワー数を945として情報を入力しました。2回目の関数呼び出しでは、キーワード引数を使用し、引数変数に値を割り当てました。
プログラムを実行しましょう:
- python profile.py
Username: sammyshark
Followers: 945
Username: AlexAnglerfish
Followers: 342
出力には、両方のユーザーのユーザー名とフォロワー数が表示されます。
これにより、異なる呼び出しを持つ同じプログラムのこの例のように、パラメータの順序を変更することもできます。
def profile_info(username, followers):
print("Username: " + username)
print("Followers: " + str(followers))
Change order of parameters
profile_info(followers=820, username="cameron-catfish")
プログラムを再度 python profile.py コマンドで実行すると、以下の出力が得られます:
Username: cameron-catfish
Followers: 820
関数定義が同じ順序のprint()ステートメントを維持するため、キーワード引数を使用する場合、関数呼び出しに渡す順序は重要ではありません。
デフォルト引数値
パラメータの1つまたは両方のデフォルト値も提供できます。followersパラメータのデフォルト値を1に設定しましょう:
def profile_info(username, followers=1):
print("Username: " + username)
print("Followers: " + str(followers))
さて、今はユーザー名の関数だけが割り当てられた状態でその関数を実行でき、フォロワーの数は自動的に1にデフォルト設定されます。また、必要に応じてフォロワーの数を変更することもできます。
def profile_info(username, followers=1):
print("Username: " + username)
print("Followers: " + str(followers))
profile_info(username="JOctopus")
profile_info(username="sammyshark", followers=945)
プログラムを python profile.py コマンドで実行すると、以下の出力が得られます:
Username: JOctopus
Followers: 1
Username: sammyshark
Followers: 945
デフォルト値を持つデフォルトパラメータを提供することで、すでにデフォルトがある各引数の値を定義する手間を省くことができます。
値を返す
関数にパラメータ値を渡すことができ、関数は値を生成することもできます。
関数は、return 文を使用することで値を生成することができ、これは関数を終了させ、オプションとして 呼び出し元に式を返します。引数なしのreturn 文を使用すると、関数はNone を返します。
これまで、私たちは関数内で return ステートメントの代わりに print() ステートメントを使用してきました。それでは、印刷するのではなく変数を返すプログラムを作成しましょう。
新しいテキストファイル「square.py」を作成し、パラメーター「x」を二乗して変数「y」を返すプログラムを作ります。「3」を渡して「square()」関数を実行することで生成された「result」変数を出力するように呼び出します。
def square(x):
y = x ** 2
return y
result = square(3)
print(result)
私たちはプログラムを実行し、出力を受け取ることができます:
- python square.py
9
整数9が出力として返されます。これは、Pythonに3の平方を求めるように頼んだ場合に予想される結果です。
return文がどのように機能するかをさらに理解するために、プログラム内のreturn文をコメントアウトすることができます:
def square(x):
y = x ** 2
# return y
result = square(3)
print(result)
さあ、プログラムをもう一度実行しましょう:
- python square.py
None
ここで return 文を使用しない場合、プログラムは値を返すことができないため、値はデフォルトで None になります。
別の例として、上記の add_numbers.py プログラムでは、print() 文を return 文に置き換えることができます。
def add_numbers(x, y, z):
a = x + y
b = x + z
c = y + z
return a, b, c
sums = add_numbers(1, 2, 3)
print(sums)
関数の外で、変数sumsを、上記のように1、2、および3を引数として受け取る関数の結果と等しく設定します。そして、sums変数の値を出力するためにprintを呼び出しました。
戻り値の文があるので、プログラムを再実行しましょう:
- python add_numbers.py
(3, 4, 5)
私たちは、以前に関数内で print() 文を使って受け取ったのと同じ数字 3、4、および 5 を出力として受け取ります。今回は、return 文の式リストに少なくとも1つのカンマがあるため、タプルとして渡されます。
関数は、値を返すかどうかにかかわらず、return 文に達すると即座に終了します。
def loop_five():
for x in range(0, 25):
print(x)
if x == 5:
# Stop function at x == 5
return
print("This line will not execute.")
loop_five()
forループ内でreturn文を使用すると、関数が終了するため、ループの外にある行は実行されません。その代わりにbreak文を使用した場合は、その時点でループのみが終了し、最後のprint()行は実行されます。
return文は関数を終了し、引数とともに発行されると値を返すことがあります。
main()を関数として使用する
Pythonではプログラムの最後に関数を呼び出すことができ、それが実行されます(上記の例で行ったように)が、多くのプログラミング言語(C++やJavaなど)では実行のためにmain関数が必要です。main()関数を含めることは必須ではありませんが、Pythonプログラムに論理的な構造を提供し、プログラムの最も重要なコンポーネントを1つの関数にまとめることができます。また、非Pythonプログラマーがプログラムを読みやすくすることも可能です。
最初に、上記の hello.py プログラムに main() 関数を追加します。hello() 関数はそのままにして、次に main() 関数を定義します:
def hello():
print("Hello, World!")
def main():
main() 関数の中で、私たちが main() 関数にいることを知らせるために print() ステートメントを追加しましょう。また、main() 関数の中で hello() 関数を呼び出しましょう:
def hello():
print("Hello, World!")
def main():
print("This is the main function")
hello()
最後に、プログラムの最後でmain()関数を呼び出します:
def hello():
print("Hello, World!")
def main():
print("This is the main function.")
hello()
main()
この時点で、私たちはプログラムを実行できます:
- python hello.py
次の出力を受け取ります:
This is the main function.
Hello, World!
なぜなら、main()内でhello()関数を呼び出し、その後にmain()を呼び出して実行したため、Hello, World!というテキストは、私たちがメイン関数にいることを示す文字列の後に、一度だけ印刷されたからです。
次に、複数の関数を扱うので、グローバル変数とローカル変数の変数スコープを再確認することが重要です。関数ブロック内に変数を定義すると、その変数はその関数内でのみ使用できます。異なる関数で変数を使用したい場合は、グローバル変数を宣言する方が良いかもしれません。
Pythonでは、'__main__'は、トップレベルのコードが実行されるスコープの名前です。プログラムが標準入力、スクリプト、またはインタラクティブプロンプトから実行されると、その__name__は'__main__'に等しく設定されます。
これにより、以下の構造を使用するという慣習があります。
if __name__ == '__main__':
# Code to run when this is the main program here
これにより、プログラムファイルを次のように使用できます。
if文の後に続くものを実行し、メインプログラムとして- モジュールとして実行し、
if文の後に続くものを実行しないようにしてください。
この文に含まれていないコードは、実行時に実行されます。プログラムファイルをモジュールとして使用している場合、この文に含まれていないコードは、セカンダリファイルを実行するときにもインポート時に実行されます。
私たちのnames.pyプログラムを拡張し、新しいファイルmore_names.pyを作成しましょう。このプログラムでは、グローバル変数を宣言し、元のnames()関数を修正して、指示が二つの独立した関数になるようにします。
最初の関数、has_vowel()は、name文字列に母音が含まれているかどうかをチェックします。
print_letters()という2番目の関数は、name文字列の各文字を印刷します。
Declare global variable name for use in all functions
name = str(input('Enter your name: '))
Define function to check if name contains a vowel
def has_vowel():
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
Iterate over letters in name string
def print_letters():
for letter in name:
print(letter)
この設定で、has_vowel()とprint_letters()関数の両方への呼び出しを含むmain()関数を定義しましょう。
Declare global variable name for use in all functions
name = str(input('Enter your name: '))
Define function to check if name contains a vowel
def has_vowel():
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
Iterate over letters in name string
def print_letters():
for letter in name:
print(letter)
Define main method that calls other functions
def main():
has_vowel()
print_letters()
最後に、ファイルの下部に if __name__ == '__main__': 構文を追加します。私たちの目的のために、すべての関数を main() 関数に配置しているので、この if ステートメントに続いて main() 関数を呼び出します。
Declare global variable name for use in all functions
name = str(input('Enter your name: '))
Define function to check if name contains a vowel
def has_vowel():
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
Iterate over letters in name string
def print_letters():
for letter in name:
print(letter)
Define main method that calls other functions
def main():
has_vowel()
print_letters()
Execute main() function
if __name__ == '__main__':
main()
私たちは今、プログラムを実行できます。
- python more_names.py
このプログラムは names.py プログラムと同じ出力を表示しますが、こちらのコードはより整理されており、修正なしでモジュール形式で使用できます。
もしmain()関数を宣言したくなかった場合は、次のようにプログラムを終了することもできました:
...
if __name__ == '__main__':
has_vowel()
print_letters()
main() を関数として使用し、if __name__ == '__main__': 文を使うことで、コードを論理的に整理し、可読性やモジュール性を高めることができます。
結論
関数はプログラム内で動作を実行する指示のコードブロックであり、コードの再利用性とモジュール性を高めるのに役立ちます。
コードをよりモジュール化する方法について詳しく学ぶために、Python 3でモジュールを書く方法に関するガイドを読んでみてください。