Python3で関数を定義する方法
序章
関数は、アクションを実行する命令のブロックであり、定義されると、再利用できます。 関数によってコードがよりモジュール化され、同じコードを何度も使用できるようになります。
Pythonには、次のような使い慣れた関数がいくつかあります。
print()
これはオブジェクトを端末に出力しますint()
は、文字列または数値のデータ型を整数のデータ型に変換します- オブジェクトの長さを返す
len()
関数名には括弧が含まれ、パラメーターが含まれる場合があります。
このチュートリアルでは、コーディングプロジェクトで使用する独自の関数を定義する方法について説明します。
前提条件
Python 3をインストールし、コンピューターまたはサーバーにプログラミング環境をセットアップする必要があります。 プログラミング環境をセットアップしていない場合は、ローカルプログラミング環境またはサーバー上のプログラミング環境のインストールおよびセットアップガイドを参照して、オペレーティングに適したものにすることができます。システム(Ubuntu、CentOS、Debianなど)
関数の定義
クラシックな「Hello、World!」を回すことから始めましょう。 プログラムを関数に。
選択したテキストエディタで新しいテキストファイルを作成し、プログラム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
次の出力が表示されます。
OutputHello, World!
関数は、上記で定義したhello()
関数よりも複雑になる可能性があります。 たとえば、関数ブロック内で forループ、条件付きステートメントなどを使用できます。
たとえば、以下で定義する関数は、条件ステートメントを使用してname
変数の入力に母音が含まれているかどうかを確認し、for
ループを使用して
# 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
パラメータ。 これらの値は、指定された順序で各パラメーターに対応します。
プログラムは基本的に、パラメーターに渡した値に基づいて次の計算を実行します。
a = 1 + 2
b = 1 + 3
c = 2 + 3
この関数は、a
、b
、およびc
も出力します。上記の計算に基づいて、a
は3
と等しいと予想されます。 ]、b
は4
、c
は5
になります。 プログラムを実行してみましょう:
- python add_numbers.py
Output3 4 5
1
、2
、および3
をパラメーターとしてadd_numbers()
関数に渡すと、期待どおりの出力が得られます。
パラメータは、通常、関数定義内の変数として定義される引数です。 メソッドを実行するときに値を割り当てて、引数を関数に渡すことができます。
キーワード引数
パラメータを順番に呼び出すだけでなく、キーワードarguments を関数呼び出しで使用できます。この場合、呼び出し元はパラメータ名で引数を識別します。
キーワード引数を使用する場合、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
OutputUsername: 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
コマンドを使用してプログラムを再度実行すると、次の出力が返されます。
OutputUsername: cameron-catfish
Followers: 820
関数定義はprint()
ステートメントと同じ順序を維持するため、キーワード引数を使用する場合、それらを関数呼び出しに渡す順序は重要ではありません。
デフォルトの引数値
パラメータの一方または両方にデフォルト値を指定することもできます。 followers
パラメータのデフォルト値を1
の値で作成しましょう。
def profile_info(username, followers=1):
print("Username: " + username)
print("Followers: " + str(followers))
これで、username関数のみを割り当てて関数を実行でき、フォロワーの数は自動的にデフォルトで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
コマンドを使用してプログラムを実行すると、次の出力が表示されます。
OutputUsername: JOctopus
Followers: 1
Username: sammyshark
Followers: 945
デフォルトパラメータに値を指定すると、すでにデフォルトが設定されている各引数の値の定義をスキップできます。
値を返す
パラメータ値を関数に渡すことができ、関数は値を生成することもできます。
関数は、return
ステートメントを使用して値を生成できます。これにより、関数が終了し、オプションで式が呼び出し元に返されます。 引数なしでreturn
ステートメントを使用すると、関数はNone
を返します。
これまで、関数でreturn
ステートメントの代わりにprint()
ステートメントを使用してきました。 印刷する代わりに変数を返すプログラムを作成しましょう。
square.py
という新しいテキストファイルで、パラメータx
を二乗し、変数y
を返すプログラムを作成します。 result
変数を出力する呼び出しを発行します。この変数は、3
が渡された状態でsquare()
関数を実行することによって形成されます。
def square(x):
y = x ** 2
return y
result = square(3)
print(result)
プログラムを実行して、出力を受け取ることができます。
- python square.py
Output9
整数9
が出力として返されます。これは、Pythonに3の2乗を見つけるように要求することで期待されるものです。
return
ステートメントがどのように機能するかをさらに理解するために、プログラムのreturn
ステートメントをコメントアウトできます。
def square(x):
y = x ** 2
# return y
result = square(3)
print(result)
それでは、プログラムをもう一度実行してみましょう。
- python square.py
OutputNone
ここで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
変数のプリントを呼び出しました。
return
ステートメントが含まれているので、プログラムをもう一度実行してみましょう。
- python add_numbers.py
Output(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()
関数を含めることは必須ではありませんが、プログラムの最も重要なコンポーネントを1つの関数にまとめる論理的な方法でPythonプログラムを構造化できます。 また、Python以外のプログラマーがプログラムを読みやすくすることもできます。
上記のhello.py
プログラムにmain()
関数を追加することから始めます。 hello()
関数を保持してから、main()
関数を定義します。
def hello():
print("Hello, World!")
def main():
main()
関数内に、print()
ステートメントを含めて、main()
関数を使用していることを知らせましょう。 さらに、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
次の出力が表示されます。
OutputThis is the main function.
Hello, World!
main()
内でhello()
関数を呼び出し、次にmain()
を呼び出して実行したため、Hello, World!
のテキストは、通知された文字列の後に1回だけ出力されました。主な機能でした。
次に、複数の関数を操作するので、グローバル変数とローカル変数の変数スコープを確認する価値があります。 関数ブロック内で変数を定義すると、その関数内でのみその変数を使用できるようになります。 関数間で変数を使用したい場合は、グローバル変数を宣言する方がよい場合があります。
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()
関数を変更して、命令が2つの個別の関数になるようにします。
最初の関数has_vowel()
は、name
文字列に母音が含まれているかどうかを確認します。
2番目の関数print_letters()
は、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__':
ステートメントを使用すると、コードを論理的に整理して、より読みやすくモジュール化することができます。
結論
関数は、プログラム内でアクションを実行する命令のコードブロックであり、コードを再利用可能でモジュール化するのに役立ちます。
コードをよりモジュール化する方法の詳細については、 Python3でモジュールを作成する方法に関するガイドをご覧ください。