Python3-python-functions

提供:Dev Guides
移動先:案内検索

Python 3-関数

関数は、単一の関連アクションを実行するために使用される、整理された再利用可能なコードのブロックです。 関数を使用すると、アプリケーションのモジュール性が向上し、高度なコードの再利用が可能になります。

既にご存じのとおり、Pythonにはprint()などの多くの組み込み関数が用意されています。 ただし、独自の関数を作成することもできます。 これらの関数は_user-defined functions._と呼ばれます。

関数を定義する

関数を定義して、必要な機能を提供できます。 Pythonで関数を定義する簡単なルールを次に示します。

  • 関数ブロックは、キーワード def で始まり、その後に関数名と括弧(())が続きます。
  • 入力パラメータまたは引数は、これらの括弧内に配置する必要があります。 これらの括弧内にパラメーターを定義することもできます。
  • 関数の最初のステートメントは、オプションのステートメント(関数のドキュメント文字列または_docstring_)にすることができます。
  • すべての関数内のコードブロックはコロン(:)で始まり、インデントされます。
  • ステートメントreturn [expression]は関数を終了し、オプションで式を呼び出し元に返します。 引数なしのreturnステートメントは、return Noneと同じです。

構文

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

デフォルトでは、パラメーターには定位置動作があり、定義されたのと同じ順序で通知する必要があります。

次の関数は、入力パラメーターとして文字列を受け取り、標準画面に出力します。

def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

関数を呼び出す

関数を定義すると、関数に名前が付けられ、関数に含まれるパラメーターが指定され、コードのブロックが構成されます。

関数の基本構造が完成したら、別の関数から呼び出すか、Pythonプロンプトから直接呼び出して実行できます。 以下は、* printme()*関数を呼び出す例です-

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme("This is first call to the user defined function!")
printme("Again second call to the same function")

上記のコードが実行されると、次の結果が生成されます-

This is first call to the user defined function!
Again second call to the same function

参照渡しと値渡し

Python言語のすべてのパラメーター(引数)は参照によって渡されます。 関数内でパラメータが参照するものを変更すると、その変更は呼び出し元の関数にも反映されます。 たとえば-

#!/usr/bin/python3

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   print ("Values inside the function before change: ", mylist)

   mylist[2]=50
   print ("Values inside the function after change: ", mylist)
   return

# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)

ここでは、渡されたオブジェクトの参照を維持し、同じオブジェクトに値を追加しています。 したがって、これは次の結果を生成します-

Values inside the function before change:  [10, 20, 30]
Values inside the function after change:  [10, 20, 50]
Values outside the function:  [10, 20, 50]

引数が参照によって渡され、参照が呼び出された関数内で上書きされるもう1つの例があります。

#!/usr/bin/python3

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist = [1,2,3,4] # This would assi new reference in mylist
   print ("Values inside the function: ", mylist)
   return

# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)

パラメーター mylist は、関数changemeに対してローカルです。 関数内でmylistを変更しても、mylistには影響しません。 関数は何も達成せず、最終的にこれは次の結果を生成します-

Values inside the function:  [1, 2, 3, 4]
Values outside the function:  [10, 20, 30]

関数の引数

次のタイプの仮引数を使用して関数を呼び出すことができます-

  • 必須の引数
  • キーワード引数
  • デフォルト引数
  • 可変長引数

必須の引数

必須の引数は、正しい位置の順序で関数に渡される引数です。 ここで、関数呼び出しの引数の数は、関数定義と正確に一致する必要があります。

関数* printme()*を呼び出すには、必ず1つの引数を渡す必要があります。そうしないと、次のように構文エラーが発生します-

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme()

上記のコードが実行されると、次の結果が生成されます-

Traceback (most recent call last):
   File "test.py", line 11, in <module>
      printme();
TypeError: printme() takes exactly 1 argument (0 given)

キーワード引数

キーワード引数は、関数呼び出しに関連しています。 関数呼び出しでキーワード引数を使用する場合、呼び出し元はパラメーター名で引数を識別します。

これにより、Pythonインタープリターは提供されたキーワードを使用して値をパラメーターと一致させることができるため、引数をスキップしたり、順序を乱したりできます。 また、次の方法で* printme()*関数へのキーワード呼び出しを行うことができます-

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme( str = "My string")

上記のコードが実行されると、次の結果が生成されます-

My string

次の例は、より明確な図を示しています。 パラメーターの順序は重要ではないことに注意してください。

#!/usr/bin/python3

# Function definition is here
def printinfo( name, age ):
   "This prints a passed info into this function"
   print ("Name: ", name)
   print ("Age ", age)
   return

# Now you can call printinfo function
printinfo( age = 50, name = "miki" )

上記のコードが実行されると、次の結果が生成されます-

Name:  miki
Age  50

デフォルトの引数

デフォルト引数は、その引数の関数呼び出しで値が提供されない場合にデフォルト値を想定する引数です。 次の例は、デフォルトの引数のアイデアを与え、それが渡されない場合、デフォルトの年齢を出力します-

#!/usr/bin/python3

# Function definition is here
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print ("Name: ", name)
   print ("Age ", age)
   return

# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
printinfo( name = "miki" )

上記のコードが実行されると、次の結果が生成されます-

Name:  miki
Age  50
Name:  miki
Age  35

可変長引数

関数の定義中に指定したよりも多くの引数の関数を処理する必要がある場合があります。 これらの引数は_variable-length_引数と呼ばれ、必須およびデフォルトの引数とは異なり、関数定義では名前が付けられていません。

非キーワード変数引数を持つ関数の構文は次のとおりです-

def functionname([formal_args,] *var_args_tuple ):
   "function_docstring"
   function_suite
   return [expression]

すべての非キーワード変数引数の値を保持する変数名の前にアスタリスク(*)が置かれます。 関数呼び出し中に追加の引数が指定されていない場合、このタプルは空のままです。 以下は簡単な例です-

#!/usr/bin/python3

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print ("Output is: ")
   print (arg1)

   for var in vartuple:
      print (var)
   return

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

上記のコードが実行されると、次の結果が生成されます-

Output is:
10
Output is:
70
60
50

無名関数

これらの関数は、 def キーワードを使用して標準的な方法で宣言されていないため、匿名と呼ばれます。 lambda キーワードを使用して、小さな匿名関数を作成できます。

  • Lambdaフォームは任意の数の引数を取ることができますが、式の形式で1つの値のみを返します。 コマンドや複数の式を含めることはできません。
  • ラムダには式が必要なので、匿名関数を直接printに呼び出すことはできません。
  • Lambda関数には独自のローカル名前空間があり、パラメーターリスト内の変数とグローバル名前空間内の変数以外の変数にはアクセスできません。
  • ラムダは関数の1行バージョンのように見えますが、パフォーマンス上の理由で呼び出し中に関数を渡すことでスタックを割り当てることを目的とするCまたはC ++のインラインステートメントとは異なります。

構文

  • ラムダ関数の構文には、次のような単一のステートメントのみが含まれています-
lambda [arg1 [,arg2,.....argn]]:expression

以下は、関数の lambda 形式がどのように機能するかを示す例です-

#!/usr/bin/python3

# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2

# Now you can call sum as a function
print ("Value of total : ", sum( 10, 20 ))
print ("Value of total : ", sum( 20, 20 ))

上記のコードが実行されると、次の結果が生成されます-

Value of total :  30
Value of total :  40

returnステートメント

ステートメントreturn [expression]は関数を終了し、オプションで式を呼び出し元に返します。 引数なしのreturnステートメントは、return Noneと同じです。

以下に示す例はすべて、値を返していません。 次のように関数から値を返すことができます-

#!/usr/bin/python3

# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2
   print ("Inside the function : ", total)
   return total

# Now you can call sum function
total = sum( 10, 20 )
print ("Outside the function : ", total )

上記のコードが実行されると、次の結果が生成されます-

Inside the function :  30
Outside the function :  30

変数の範囲

プログラム内のすべての変数は、そのプログラム内のすべての場所でアクセスできるわけではありません。 これは、変数を宣言した場所によって異なります。

変数のスコープは、特定の識別子にアクセスできるプログラムの部分を決定します。 Pythonには変数の2つの基本的なスコープがあります-

  • グローバル変数
  • ローカル変数

グローバルvs. ローカル変数

関数本体内で定義された変数はローカルスコープを持ち、外部で定義された変数はグローバルスコープを持ちます。

つまり、ローカル変数は宣言された関数内でのみアクセスできますが、グローバル変数はすべての関数によってプログラム本体全体でアクセスできます。 関数を呼び出すと、その中で宣言された変数がスコープに取り込まれます。 以下は簡単な例です-

#!/usr/bin/python3

total = 0   # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2; # Here total is local variable.
   print ("Inside the function local total : ", total)
   return total

# Now you can call sum function
sum( 10, 20 )
print ("Outside the function global total : ", total )

上記のコードが実行されると、次の結果が生成されます-

Inside the function local total :  30
Outside the function global total :  0