Python 3で関数を定義する方法

前書き

*関数*は、アクションを実行する命令のブロックであり、定義されると再利用できます。 関数はコードをよりモジュール化し、同じコードを何度も使用できるようにします。

Pythonには、次のような多くの組み込み関数があります。

  • オブジェクトを端末に出力する + print()+

  • 文字列または数値データ型を整数データ型に変換する + int()+

  • オブジェクトの長さを返す + len()+

関数名には括弧が含まれ、パラメーターが含まれる場合があります。

このチュートリアルでは、コーディングプロジェクトで使用する独自の関数を定義する方法について説明します。

関数を定義する

古典的なhttps://www.digitalocean.com/community/tutorials/how-to-write-your-first-python-3-program[「Hello、World!」プログラム]を関数に変換することから始めましょう。

選択したテキストエディタで新しいテキストファイルを作成し、プログラム「+ hello.py +」を呼び出します。 次に、関数を定義します。

関数は、 `+ def +`キーワードを使用して定義し、その後に選択した名前、関数が使用するパラメーターを保持する括弧のセット(空にすることができます)、コロンで終了します。

この場合、 `+ hello()+`という名前の関数を定義します:

hello.py

def hello():

これにより、関数を作成するための初期ステートメントが設定されます。

ここから、4スペースのインデントを含む2行目を追加して、関数の動作に関する指示を提供します。 この場合、コンソールに `+ Hello、World!+`を出力します。

hello.py

def hello():
   print("Hello, World!")

これで関数は完全に定義されましたが、この時点でプログラムを実行しても、関数を呼び出さなかったため何も起こりません。

それで、定義された関数ブロックの外で、 `+ hello()+`で関数を呼び出しましょう:

hello.py

def hello():
   print("Hello, World!")

hello()

それでは、プログラムを実行しましょう。

python hello.py

次の出力が表示されます。

OutputHello, World!

関数は、上で定義した + hello()+`関数よりも複雑になる可能性があります。 たとえば、https://www.digitalocean.com/community/tutorials/how-to-construct-for-loops-in-python-3 [+ for +` loops]、https://www.digitaloceanを使用できます。 .com / community / tutorials / how-to-write-conditional-statements-in-python-3-2 [条件付きステートメント]など、機能ブロック内。

たとえば、以下に定義する関数は、条件文を使用して、「+ name 」変数の入力に母音が含まれているかどうかを確認し、「 for 」ループを使用して「 name +」文字列の文字を繰り返し処理します。

names.py

# 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 +」を取り込む小さなプログラムを作成しましょう。 さまざまな構成でパラメーターを一緒に追加する関数を作成します。 これらの合計は、関数によって出力されます。 次に、関数を呼び出して、関数に数値を渡します。

add_numbers.py

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
Output3 4 5

「+ add_numbers()」関数のパラメーターとして「+1 +」、「 2+」、および「3」を渡すと、期待される出力を受け取ります。

パラメーターは、通常、関数定義内の変数として定義される引数です。 メソッドを実行するときに値を割り当て、関数に引数を渡すことができます。

キーワード引数

パラメータを順番に呼び出すことに加えて、関数呼び出しで*キーワード引数*を使用できます。この場合、呼び出し元はパラメータ名で引数を識別します。

キーワード引数を使用する場合、Pythonインタープリターは提供されたキーワードを使用して値をパラメーターに一致させるため、パラメーターを順不同で使用できます。

ユーザーのプロファイル情報を表示する関数を作成しましょう。 パラメータを + username +(文字列として意図されている)と + followers +(整数として意図されている)の形式で渡します。

profile.py

# Define function with parameters
def profile_info(username, followers):
   print("Username: " + username)
   print("Followers: " + str(followers))

関数定義ステートメント内で、 `+ username `と ` followers `は ` profile_info()+`関数の括弧内に含まれています。 関数のブロックは、2つのパラメーターを利用して、ユーザーに関する情報を文字列として出力します。

これで、関数を呼び出してパラメーターを割り当てることができます。

profile.py

def profile_info(username, followers):
   print("Username: " + username)
   print("Followers: " + str(followers))

# Call function with parameters assigned as above


# Call function with keyword arguments

最初の関数呼び出しでは、ユーザー名が「+ sammyshark 」でフォロワーが「+945」である情報を入力しました。2番目の関数呼び出しでは、キーワード引数を使用して、引数変数に値を割り当てました。

プログラムを実行しましょう:

python profile.py
OutputUsername: sammyshark
Followers: 945
Username: AlexAnglerfish
Followers: 342

出力には、両方のユーザーのユーザー名とフォロワー数が表示されます。

これにより、同じプログラムの異なる呼び出しを使用したこの例のように、パラメーターの順序を変更することもできます。

profile.py

def profile_info(username, followers):
   print("Username: " + username)
   print("Followers: " + str(followers))

# Change order of parameters

`+ python profile.py +`コマンドを使用してプログラムを再度実行すると、次の出力が表示されます。

OutputUsername: cameron-catfish
Followers: 820

関数定義は `+ print()+`ステートメントの同じ順序を維持するため、キーワード引数を使用する場合、関数呼び出しにそれらを渡す順序は関係ありません。

デフォルトの引数値

また、パラメータの一方または両方にデフォルト値を提供できます。 値が「1」の「+ followers +」パラメータのデフォルト値を作成しましょう。

profile.py

def profile_info(username, ):
   print("Username: " + username)
   print("Followers: " + str(followers))

これで、ユーザー名関数のみを割り当てて関数を実行でき、フォロワーの数は自動的にデフォルトの1になります。 また、必要に応じてフォロワーの数を変更することもできます。

profile.py

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 」を2乗して変数「 y 」を返すプログラムを作成します。 ` result `変数を出力する呼び出しを発行します。これは、 ` 3 `が渡された ` square()+`関数を実行することにより形成されます。

square.py

def square(x):
   y = x ** 2
   return y

result = square(3)
print(result)

プログラムを実行して、出力を確認できます。

python square.py
Output9

整数 `+ 9 +`が出力として返されます。これは、Pythonに3の2乗を求めるように求めることで期待されるものです。

+ return`ステートメントの動作をさらに理解するために、プログラムで + return`ステートメントをコメントアウトできます。

square.py

def square(x):
   y = x ** 2
   # return y

result = square(3)
print(result)

それでは、プログラムをもう一度実行しましょう。

python square.py
OutputNone

ここで `+ return `ステートメントを使用しないと、プログラムは値を返すことができないため、値はデフォルトで ` None +`になります。

別の例として、上記の「+ add_numbers.py 」プログラムでは、「 print()」ステートメントを「 return +」ステートメントに置き換えることができます。

add_numbers.py

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 `を受け取ります。 今回はhttps://www.digitalocean.com/community/tutorials/understanding-tuples-in-python-3[tuple]として配信されます。これは、 ` return +`ステートメントのhttps://docs.python.org/ 3.6 / reference / expressions.html#grammar-token-expression_list [expression list]には少なくとも1つのコンマがあります。

関数は、値を返しているかどうかに関係なく、 `+ return +`ステートメントにヒットするとすぐに終了します。

return_loop.py

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`ステートメントを使用すると、関数が終了するため、ループ外の行は実行されません。 代わりに、https://www.digitalocean.com/community/tutorials/how-to-use-break-continue-and-pass-statements-when-working-with-loops-in-python-を使用した場合3#break-statement [+ break + statement]、その時点でループのみが終了し、最後の `+ print()+`行が実行されます。

`+ return +`ステートメントは関数を終了し、パラメーターとともに発行されると値を返す場合があります。

関数として `+ main()+`を使用する

Pythonでは、プログラムの下部で関数を呼び出して実行できます(上記の例で行ったように)が、多くのプログラミング言語(C +やJavaなど)を実行するには、 ` main `関数が必要です。 ` main()+`関数を含めると、必須ではありませんが、プログラムの最も重要なコンポーネントを1つの関数にまとめる論理的な方法でPythonプログラムを構築できます。 また、Python以外のプログラマーがプログラムを読みやすくすることもできます。

上記の `+ hello.py `プログラムに ` main()`関数を追加することから始めます。 ` hello()`関数を保持した後、 ` main()+`関数を定義します。

hello.py

def hello():
   print("Hello, World!")

`+ main()`関数内に、 ` main()`関数にいることを知らせるために、 ` print()`ステートメントを含めます。 さらに、 ` main()`関数内で ` hello()+`関数を呼び出しましょう:

hello.py

def hello():
   print("Hello, World!")


def main():

最後に、プログラムの最後で、 `+ main()+`関数を呼び出します。

hello.py

def hello():
   print("Hello, World!")

def main():
   print("This is the main function.")
   hello()

この時点で、プログラムを実行できます。

python hello.py

次の出力が表示されます。

OutputThis is the main function.
Hello, World!

`+ main()`内で ` hello()`関数を呼び出し、実行するために ` main()`のみを呼び出したため、 ` Hello、World!+`テキストは、 main関数にいることを教えてくれる文字列。

次に、複数の関数を使用するため、https://www.digitalocean.com/community/tutorials/how-to-use-variables-in-python-3#globalの変数スコープを確認する価値があります。 -and-local-variables [グローバルおよびローカル変数]。 関数ブロック内で変数を定義すると、その関数内でのみその変数を使用できます。 関数間で変数を使用する場合は、グローバル変数を宣言することをお勧めします。

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 +`文字列の各文字を出力します。

more_names.py

# 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()+`関数を定義しましょう。

more_names.py

# 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

最後に、ファイルの下部に `+ if name == 'main ':`構造を追加します。 目的のために、やりたいすべての関数を ` main()`関数に入れたので、この ` if `ステートメントに続いて ` main()+`関数を呼び出します。

more_names.py

# 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





# Execute main() function

これでプログラムを実行できます。

python more_names.py

プログラムは `+ names.py +`プログラムと同じ出力を表示しますが、ここではコードがより体系化されており、修正することなくモジュール方式で使用できます。

`+ main()+`関数を宣言したくない場合は、次のようにプログラムを終了することもできます。

more_names.py

...
if __name__ == '__main__':
   has_vowel()
   print_letters()

`+ main()`を関数として使用し、 ` if name == 'main ':+`ステートメントを使用すると、コードを論理的に整理して、コードを読みやすくモジュール化できます。

結論

関数は、プログラム内でアクションを実行する命令のコードブロックであり、コードを再利用可能かつモジュール化するのに役立ちます。

コードをよりモジュール化する方法の詳細については、https://www.digitalocean.com/community/tutorials/how-to-write-modules-in-python-3 [モジュールの作成方法]のガイドをご覧ください。 Python 3]。