(1)基本機能
●機能は、ファーストクラスのオブジェクトであります
Pythonでのすべてが対象である、すべてのオブジェクトである最初のクラス(ファーストクラス)、関数は例外ではないだけでなく、ファーストクラスのオブジェクト。それは、それのような、通常のオブジェクトデータ処理として使用することができるオブジェクトであるので:独自の特性を有するように、変数に割り当てることができ、貯蔵容器内に配置することができる別の機能または戻り値の引数として使用される、というようにすることができます。あなたはDEF定義関数を使用すると、関数オブジェクトと同等のものを生成します。
次の例では、組み込み関数のシーケンスに三つ、それぞれ、取り出した後、イテレータを呼び出します。
ライン= 'ABC、1,3.14' fun_list = [STR、INT、フロート] para_list = line.split( '') obj_list = [F fに対する(ヴァル)、ヴァルNジップ(fun_list、para_list)] #Obj_list結果:[ 'ABC'、1、3.14]
●のドキュメンテーション文字列
典型的には、属性__doc__関数に格納された機能「ドキュメント文字列」の目的の記述としてDEF関数の後の最初の行、。組み込み関数の助けを借りて(関数名、関数を記述した文書を表示することができます)。
●あなたはタイプを呼び出すことができます
組み込み関数、メソッドのインスタンスは、クラスは、コール・インタフェースの例を提供し、ユーザ定義関数を:オブジェクトであって、コールタイプ動作関数呼び出しをサポートすることができます。あなたは、組み込みの呼び出し可能な関数()オブジェクトが呼び出し可能であるかどうかを確認するために使用することができます。
あなたがクラスを呼び出すときにクラスは、新しいインスタンスを作成するには、クラスの__init __()メソッドの引数に自動的に、それを呼び出すことができています。
オブジェクトの例としては、一般的に呼び出し可能ではなく、この実施例を実現__call __()メソッドは、インスタンスを直接呼び出すことができる場合。たとえば:xがインスタンスである場合、X(引数)を行うのx .__コール__(引数)メソッドを呼び出すことと同じです。
●プロパティ関数
オブジェクトの関数として、理論的には、任意のプロパティは、関数に追加することができます。そこにいくつかの内部関数のデフォルトのプロパティもあり、次の表を参照してください。
「組み込み関数」は、以下の性質を有します
プロパティ | 説明 |
---|---|
__doc__ | ドキュメントの文字列。 |
__名前__ | 関数名。 |
__自己__ | 関連する方法の例。定義:lenのような()は、__ self__がNone(結合していない表示)機能を内蔵するため、等s.append()そのようなものが内蔵方法、__ self__リストオブジェクトは、Sです。 |
「ユーザー定義関数」とは、以下の性質を有します
プロパティ | 説明 |
---|---|
__doc__ | ドキュメントの文字列。 |
__名前__ | 関数名。 |
__dict__ | これは、辞書機能の属性が含まれています。 |
__コード__ | コンパイルされたコード。 |
__defaults__ | タプルは、デフォルトパラメータが含まれています。 |
__globals__ | 対応する機能は次のような場合にグローバル名前空間辞書に適用されます。 |
__clousre__ | クロージャ(タプルは、ネストされたスコープと関連データを含みます) |
「方法の例は、」以下の特性を有します
プロパティ | 説明 |
---|---|
__doc__ | ドキュメントの文字列。 |
__名前__ | メソッド名。 |
__クラス__ | メソッドは、クラスを定義しました。 |
__func__ | 実装の関数オブジェクト |
__自己__ | 関連する方法の例(非結合法、比較なし場合) |
●結合および非結合方法
あなたは、一例としてメソッドを呼び出すと、結合および非結合2つの用途があります。実施例1の方法を自動的に自己引数に渡されるようにパッケージの結合方法とメンバ関数の例のうちの対応するものには、結合方法が、呼び出されます。ユーザは、非結合方法、明示的に最初のパラメータとして渡されたインスタンスの必要性を呼び出すとき、結合方法だけでなく、メンバ関数なしインスタンスをパッケージ。2以下の例を参照してください。
バインディングの使用(バインドメソッド):
Fooクラス(): デフメタ(自己): プリント(A) OBJ =フー()#インスタンスを作成します M = obj.meth#メタ方法は、これに結合するOBJ M(2)は、このメソッドを呼び出す#、Pythonは自動的に自己がメタ()メソッドへのパラメータとして渡されたOBJ
結合していない使い方(未結合の方法):
Fooクラス(): デフメタ(自己): プリント(A) OBJ =フー()#インスタンスを作成します UM = Foo.meth#非結合、ちょうどUMにこの方法を割り当て、現在のインスタンスである必要はありません。 UM(OBJ、2)#結合していない、このメソッドを呼び出すと、ユーザーが明示的に最初のパラメータOBJの例として渡す必要があります。
●匿名関数
匿名関数の形で式を作成することができますラムダステートメントを使用して、その使用は短いコールバック関数を指定されています。構文は次のとおりです。
ラムダ パラメータ:表現
非匿名関数式文が表示されないことができラムダ、また複数行の文の出現。
次の例では、匿名関数を定義します。
=ラムダX、Y:X * Y B =(2,5)#Bの結果である:10
ラムダ匿名関数のソート順序を渡す次の例()メソッド、:
[( 'B'、2)、( ''、1)]ソート(キー=ラムダX:X [1])#結果は[( ''、1)、( 'B'、2)]。 #説明:使用匿名関数リストの要素が前処理され、元のタプルの(「」、1)前処理:タプル要素を除去した後(つまり:1)は、ソートすることが可能です。
(2)関数のパラメータ
●位置パラメータ、キーワードのパラメータ、戻り値
関数を呼び出すときに、渡された引数の数の順序は、それ以外の場合は、例外が例外TypeErrorなり、関数の定義と一致する必要があります。あなたは関数定義のオーダーパラメータに準拠していないので、あなたは、呼び出すときにパラメータ名を指定した場合呼び出すときに、これは非常に読みやすさを増加させます。このパラメータは、パラメータの名前はキーワード引数と呼ばれて渡され、パラメータは一般的にパラメータ名が位置パラメータと呼ばれ、指定されていません指定します。キーワードのパラメータは、すべての位置パラメータの後ろに配置することができます。
(非簡単なデジタル、である)関数の引数は値によって渡されますが、オブジェクトが渡された場合、いわゆる値渡しは、関数のパラメータであるだけで、それは過去に渡されたものの値をコピーするオブジェクトのアドレスであるため、この関数は、実際に変更することができますコンテンツ外のオブジェクト。通常、副作用の影響を防ぐために、スレッドがロックを使用する必要があるため、一般的には最高のこのスタイルを使用しないようにするには、だけでなく、プログラムと並行スレッド、これらの関数の非効率的な使用に関与。
あなたがreturn文を省略し、または単一のキーワードを返した場合は、[なし]オブジェクトを返します。
●パラメータのデフォルト値
呼び出しは、この値を提供できないときに、関数の定義は、次のように、特定のパラメータのデフォルト値を指定することができた場合。デフォルト値を持つパラメータが発生すると、このパラメータは、そうでない場合は、SyntaxError例外をスローし、デフォルト値を持つパラメータに従わなければなりません。
変数オブジェクトは、次の例では、デフォルト値(例えば、空のリスト)、これは、予期せぬバグを引き起こす可能性があり、推奨されていません。
DEF楽しい(X、SEQ = []): seq.append(X) 戻り配列 楽しい(1)#戻り、[1] 楽しい(2)#戻り[1,2] 楽しい(3)#戻り[1,2,3]
意図実施形態の故障は、配列パラメータ、新しいリスト、新しいリストにXが渡されます。しかし、実際にはバグが生成されます。この状況は、関数内で新しいリストを作成し、SEQ =なしお勧めします。
●単一のアスタリスク*
アスタリスクの意味の前に関数の定義、および単一のパラメータ:残りの位置のパラメータを収集し、同じタプルに配置します。ときに、関数呼び出しのように、ユーザーは任意の数のパラメータを提供することができます。次の例に示すように:
デフ楽しい(X、Y *): プリント(X) プリント(Y) 楽しい( ''、1、2、 'C')#結果:及び(1,2、 'C') 楽しい(3)#結果:3と()
シングルアスタリスクはまた、すなわち、逆使用することができます使用する*関数を呼び出すときに、タプルは自動的に名前を指定したキーパラメータの数に展開されます。
DEF myadd(X、Y): リターンX + Y T =(1,2) Xに拡大myadd(* T)#呼び出し、単一アスタリスク自動的タプル(1、2)、Y
●ダブルアスタリスク**
関数定義は、パラメータは二重のアスタリスクの意味が先行すると次のとおりです。キーワード引数の残りの部分を収集し、辞書にそれらを配置します。ですから、関数を呼び出すとき、あなたは、設定項目の多くを渡すことができるパラメータとして展開することができます。
楽しいデフ(X、Z **): プリント(X) プリント(Z) 楽しい(X = 1、Y = 2、Z = 3)結果の#1および{ 'Y' 2、Z '':3}
ダブルアスタリスクは、関数を呼び出すときに、辞書が自動的に名前を指定したキーパラメータの数に分割されます**、逆に使用を使用することができます。
DEF myadd(X、Y): リターンX + Y D = { 'X':1、 'Y':2} myadd(** D)#呼び出し、バイナリ数d辞書が自動的に展開さ:Y = 2、X = 1
シングルアスタリスクとダブルアスタリスクを組み合わせて使用することができる、位置パラメータとキーワードパラメータの同時収集のため、パラメータは** *パラメータの後に現れなければなりません。
デフ楽しい(* argsを、** kwargsから): 印刷(引数) 印刷(kwargsから) 楽しい(1,2,3、X = 4、Y = 5、Z = 6) #結果:(1,2,3)と{ 'X':4 'Y':5 'Z':6}
(3)範囲
関数が実行されるたびに、新しいローカル名前空間を作成します。この名前空間(とも呼ばれる範囲)、それは関数のパラメータおよび関数内で定義されたすべてのローカル変数の名前が含まれている辞書、内部の「見えない」を持っているだけのよう。
それぞれがローカルスコープ以外の機能、およびグローバルスコープを持っていることを除いて。あなたは辞書のスコープのインスタンスを返すために(OBJ)をvarsの組み込み関数、)(内蔵の辞書機能を地元の人々()およびグローバルを通じてローカルおよびグローバルスコープを表示することができます。
X = 1 デフ楽しいです(): Y = 2 印刷(地元の人々()) 印刷(グローバル()) 楽しいです() { 'Y':2}#ローカルに()として示されています #グローバル()xよりも他のグローバル変数を示すことに加えて、グローバルなデフォルトは、多くの変数が表示されます。 { 'X':1、 '楽しい':<0x000001E5C52EA048で関数fun> '__name__': '__main__' '__doc__':なし、 '__PACKAGE__':なし、 ...... }
関数内●アクセスグローバル変数
Pythonのインタプリタの構文解析変数は、最初にローカルスコープの要素を検索しますときに何もグローバルスコープが検索されていない場合より、内蔵それでも見つからない場合は、名前空間、それはNameError例外につながる場合は、検索が見つかりません。
このメソッドは、グローバル変数ではなく、グローバル変数の割り当て、グローバル変数への代入にアクセスすることができますが、グローバルなキーワードを使用します。
関数内でグローバル変数を変更します。
X = 1 デフ楽しいです(): グローバルX X = 2 楽しい()#実行楽しい()した後、グローバル変数xの値が2となります
ローカル変数とグローバル変数の関数名は、名前が重複した場合:
X = 1 デフ楽しいです(): Xという名前のローカル変数を作成するには、ここではx = 2# グローバル()「X」] = 3つの#利用グローバル()組み込み関数、直接グローバル変数辞書のようにして動作させることができます 楽しい()#実行楽しい()した後、グローバル変数xの値が3となり
注: Pythonは、関数のローカルスコープに高いレベルのアクセスへのアクセスをサポートしていないが、関数を呼び出す、次のコード例では、例外NameErrorが発生します
デフfun_inner(): プリント(X) デフ)(fun_outer: X = 2 fun_inner() fun_inner()関数は、ローカルスコープの()外呼び出し元の関数fun_outerにアクセスできないためNameErrorを呼び出すときのx fun_outerは()#は、例外がスローされます
●ネストされたスコープ
python3は、使用して、ネストされた関数の定義をサポートし、外定義関数のローカルスコープ(外側ない呼び出し関数)の変数を、これが呼び出されます。動的スコープ(ダイナミックスコープ)、次の例を非ローカルキーワードが必要下記:
デフ)(fun_outer: X = 4 デフfun_inner(): Xによって定義される外側の層に結合する非局所のx#宣言 X = 5 プリント(X) fun_inner() プリント(X) fun_outer()#は、最初の5プリントアウト、印刷中fun_inner()ステートメントを実行します。その後、外側の層にprint文を実行し、それをx 5本当に見に変更することができます
(4)再帰
再帰関数と呼ばれる(再帰)自分自身を呼び出します。解決するために小さな問題の繰り返しに大きな問題を打破することができる最も一般的な使用シナリオを再帰的、そしてこの小さな問題の構造を解明することは非常に簡単です。再帰ループのほとんどが解決置き換えるために使用することができ、時には再帰関数がサイクルより読みやすく書くことが、よりエレガントに見えます。
Nの階乗の再帰的計算
DEF階乗(N): もしN <= 1: 1を返します 他: リターンN *階乗(N-1)
バイナリサーチの再帰的なシーケンスを実現します:
DEF(配列、numは、上下)検索: 下の場合==アッパー: 上部リターン 他: 中央=(+上下)// 2 NUM>配列[ミドル]の場合: 戻り検索(上側当量、NUM、中央+ 1) 他: リターン検索(SEQ、NUM、下、中央) SEQ = [1、2、3、4、5、6、7、8、9、10] seq.sort() (SEQ、NUM = 2、0 =上下= 9)を見つけるためにバイナリ検索を使用するよりも#トラバーサルを検索し、あなたはすぐにNUMを見つけることができます