Python 関数

関数は、整理された、再利用可能な、単一または関連する機能を実現するためのコードブロックです。

関数はアプリケーションのモジュール性とコードの再利用性を高めます。Pythonがprint()のような多くの組み込み関数を提供していることはすでにご存じでしょう。しかし、自分で関数を作成することもできます。これはユーザー定義関数と呼ばれます。


関数を定義する

自分が望む機能を持つ関数を定義できます。以下は簡単なルールです:

  • 関数のコードブロックはdefキーワードで始まり、その後に関数識別子の名前と丸括弧が続きます。()。
  • 渡されるすべてのパラメータと引数は丸括弧の中に置く必要があります。丸括弧の間にパラメータを定義できます。
  • 関数の最初の行には、オプションでドキュメンテーション文字列(関数の説明を格納するためのもの)を使用できます。
  • 関数の本体はコロンで始まり、インデントされます。
  • return [式]関数を終了し、オプションで呼び出し元に値を返します。式を伴わないreturnはNoneを返すのと同じです。

構文

def functionname( parameters ): "関数_ドキュメンテーション文字列" function_suite return [expression]

デフォルトでは、パラメータ値とパラメータ名は関数宣言で定義された順序で照合されます。

例

以下は、文字列をパラメータとして受け取り、それを標準出力に表示する簡単なPython関数です。

例(Python 2.0+)

def printme( str ): "渡された文字列を標準出力に表示します" print str return

関数呼び出し

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

この関数の基本構造が完成したら、別の関数から呼び出して実行することも、Pythonプロンプトから直接実行することもできます。

次の例では、printme()関数を呼び出しています:

例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- # 関数を定義 def printme( str ): "渡された任意の文字列を印刷します" print str return # 関数を呼び出し printme("ユーザー定義関数を呼び出します!") printme("同じ関数を再度呼び出します")

上記の例の出力結果:

ユーザー定義関数を呼び出したい!

パラメータ渡し

pythonでは、型はオブジェクトに属し、変数には型がありません:

a=[1,2,3] a="サンプル"

上記のコードでは、[1,2,3]は List 型であり、"サンプル"は String 型であり、変数 a には型がありません。a は単なるオブジェクトへの参照(ポインタ)であり、List 型のオブジェクトを指すことも、String 型のオブジェクトを指すこともできます。

変更可能(mutable)と変更不可能(immutable)オブジェクト

pythonでは、strings、tuples、numbers は変更不可能なオブジェクトであり、list、dict などは変更可能なオブジェクトです。

  • 不変型:変数代入a=5後に再代入すると、a=10ここでは実際には新しいint値オブジェクト10が生成され、aがそれを指すようにします。5は破棄され、aの値を変更するのではなく、aが新しく生成されたのと同じです。

  • 可変型:変数代入la=[1,2,3,4]後に再代入すると、la[2]=5これは list la の3番目の要素の値を変更するもので、la 自体は変更されず、その内部の一部の値だけが変更されます。

python の関数のパラメータ渡し:

  • 不変型:c++ の値渡しに似ています。整数、文字列、タプルなどです。fun(a)の場合、渡されるのは a の値だけで、a オブジェクト自体には影響しません。たとえば fun(a)の内部で a の値を変更しても、それはコピーされた別のオブジェクトを変更するだけで、a 自体には影響しません。

  • 可変型:c++ の参照渡しに似ています。リスト、辞書などです。fun(la)の場合、la が実際に渡され、変更後は fun の外部の la も影響を受けます。

python ではすべてがオブジェクトです。厳密には値渡しか参照渡しかとは言えず、不変オブジェクトを渡すか可変オブジェクトを渡すかと言うべきです。

python で不変オブジェクトを渡す例

例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- def ChangeInt( a ): a = 10 b = 2 ChangeInt(b) print b # 結果は 2

例には int オブジェクト 2 があり、それを指す変数は b です。ChangeInt 関数に渡すとき、値渡しの方法で変数 b がコピーされ、a と b は同じ Int オブジェクトを指します。a=10 のとき、新しい int 値オブジェクト 10 が生成され、a がそれを指すようにします。

可変オブジェクトを渡す例

例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- # 関数の説明を記述 def changeme( mylist ): "渡されたリストを変更します" mylist.append([1,2,3,4]) print "関数内の値:", mylist return # changeme関数を呼び出し mylist = [10,20,30] changeme( mylist ) print "関数外の値:", mylist

例では、関数に渡すオブジェクトと末尾に新しい内容を追加するオブジェクトは同じ参照を使用しているため、出力結果は次のようになります。

函数内取值:  [10, 20, 30, [1, 2, 3, 4]]
函数外取值:  [10, 20, 30, [1, 2, 3, 4]]

パラメータ

以下は、関数を呼び出すときに使用できる正式なパラメータの型です:

  • 必須パラメータ
  • キーワードパラメータ
  • デフォルトパラメータ
  • 可変長パラメータ

必須パラメータ

必須パラメータは正しい順序で関数に渡す必要があります。呼び出し時の数は宣言時と同じでなければなりません。

printme() 関数を呼び出すには、1つのパラメータを渡す必要があります。そうしないと構文エラーが発生します:

例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- #関数の説明を記述 def printme( str ): "渡された任意の文字列を印刷します" print str return #printme関数を呼び出し printme()

上記の例の出力結果:

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

キーワードパラメータ

キーワードパラメータは関数呼び出しと密接に関係しており、関数呼び出しはキーワードパラメータを使用して渡すパラメータ値を決定します。

キーワードパラメータを使用すると、関数呼び出し時のパラメータの順序が宣言時と異なっていても構いません。Python インタプリタはパラメータ名でパラメータ値を照合できるからです。

次の例では、関数 printme() の呼び出し時にパラメータ名を使用しています:

例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- #関数の説明を記述 def printme( str ): "渡された任意の文字列を印刷します" print str return #printme関数を呼び出し printme( str = "My string")

上記の例の出力結果:

My string

次の例は、キーワードパラメータの順序が重要でないことをより明確に示しています:

例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- #関数の説明を記述 def printinfo( name, age ): "渡された任意の文字列を印刷します" print "Name: ", name print "Age ", age return #printinfo関数を呼び出し printinfo( age=50, name="miki" )

上記の例の出力結果:

Name:  miki
Age  50

デフォルトパラメータ

関数を呼び出すとき、デフォルトパラメータの値が渡されない場合、その値はデフォルト値と見なされます。次の例では、age が渡されない場合にデフォルトの age を印刷します:

例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- #関数の説明を記述 def printinfo( name, age = 35 ): "渡された任意の文字列を印刷します" print "Name: ", name print "Age ", age return #printinfo関数を呼び出し printinfo( age=50, name="miki" ) printinfo( name="miki" )

上記の例の出力結果:

Name:  miki
Age  50
Name:  miki
Age  35

可変長パラメータ

当初の宣言よりも多くのパラメータを処理できる関数が必要になるかもしれません。これらのパラメータは可変長パラメータと呼ばれ、前述の2種類のパラメータとは異なり、宣言時に名前を付けません。基本構文は次のとおりです:

def functionname([formal_args,] *var_args_tuple ): "関数_ドキュメンテーション文字列" function_suite return [expression]

アスタリスク(*)を付けた変数名には、名前のないすべての変数パラメータが格納されます。可変長パラメータの例は次のとおりです:

例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- # 関数の説明を記述 def printinfo( arg1, *vartuple ): "渡された任意のパラメータを出力する" print "出力:" print arg1 for var in vartuple: print var return # printinfo関数を呼び出す printinfo( 10 ) printinfo( 70, 60, 50 )

上記の例の出力結果:

输出:
10
输出:
70
60
50

匿名関数

Python は lambda を使って匿名関数を作成します。

  • lambdaは単なる式であり、関数本体はdefよりもはるかに簡単です。
  • lambdaの本体は式であり、コードブロックではありません。lambda式には限られたロジックしかカプセル化できません。
  • lambda関数は独自の名前空間を持ち、自身の引数リストの外部やグローバル名前空間にある引数にはアクセスできません。
  • lambda関数は1行でしか書けないように見えますが、CやC++のインライン関数とは異なります。後者は小さな関数を呼び出す際にスタックメモリを消費せず、実行効率を高めることを目的としています。

構文

lambda関数の構文は次のように1つのステートメントのみで構成されます:

lambda [arg1 [,arg2,.....argn]]:expression

以下の例のとおりです:

例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- # 関数説明を記述できます sum = lambda arg1, arg2: arg1 + arg2 # sum関数を呼び出す print "加算後の値は :", sum( 10, 20 ) print "加算後の値は :", sum( 20, 20 )

上記の例の出力結果:

相加后的值为 :  30
相加后的值为 :  40

return 文

return文[式]は関数を終了し、呼び出し元に式を任意に返します。引数なしのreturn文はNoneを返します。これまでの例では数値を返す方法を示していませんでしたが、次の例でその方法を説明します:

例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- # 関数説明を記述できます def sum( arg1, arg2 ): # 2つの引数の和を返します。 total = arg1 + arg2 print "関数内 :", total return total # sum関数を呼び出す total = sum( 10, 20 )

上記の例の出力結果:

函数内 :  30

変数のスコープ

プログラム内のすべての変数がどの位置からでもアクセスできるわけではありません。アクセス権限は、その変数がどこで代入されたかによって決まります。

変数のスコープは、プログラムのどの部分で特定の変数名にアクセスできるかを決定します。最も基本的な2つの変数スコープは次のとおりです:
  • グローバル変数
  • ローカル変数

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

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

ローカル変数は宣言された関数の内部でのみアクセスでき、グローバル変数はプログラム全体でアクセスできます。関数を呼び出すと、関数内で宣言されたすべての変数名がスコープに追加されます。以下の例のとおりです:

例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- total = 0 # これはグローバル変数です # 関数説明を記述できます def sum( arg1, arg2 ): # 2つの引数の和を返します。 total = arg1 + arg2 # totalはここではローカル変数です。 print "関数内はローカル変数 :", total return total # sum関数を呼び出す sum( 10, 20 ) print "関数外はグローバル変数 :", total

上記の例の出力結果:

函数内是局部变量 :  30
函数外是全局变量 :  0
その他の拡張