関数(二)
3513 ワード
関数設計の注意点:
結合性:できるだけグローバル変数を使用しないでください.関数で受信した可変実パラメータの値をできるだけ変更しないでください.別のモジュールファイルの変数を直接変更しないでください.
集約性:各関数には単一の、統一されたターゲットがあり、関数はできるだけ小さくなります.
Pythonの関数はオブジェクトであり,関数オブジェクトは他の名前に値を付け,他の関数に渡し,データ構造に埋め込むことができる.一方、def文に使用される名前は、現在の役割ドメインの変数にすぎません.defが実行されると、この名前は関数オブジェクトを指し、他のオブジェクトに割り当てることができます.また、この関数名に他のオブジェクトを与えることもできます.
関数の内省
関数もオブジェクトなので、クラスのように通過することもできます.参照してプロパティの値を表示します.一方dir法を参照することにより,次の層の詳細を深く探索することができる.
関数のプロパティ
上記の関数プロパティに加えて、手動で新しいプロパティを追加することもできます.
関数注記
注記情報:関数のパラメータと結果に関連する任意のユーザー定義データ.オプションで、関数オブジェクトに直接アタッチされます.annotations__,注記defヘッダ行に記述されるので、関数を定義するときにのみ設定できます.変数と関数の戻り値のみにコメントします.
≪パラメータのコメント|Comments for Parameters|oem_src≫:パラメータの後にコロンとコメント情報を追加します.パラメータにデフォルト値を設定したい場合は、コメントの後にあります.
値を返すコメント:パラメータリストの後にコロンを付ける前に->寸法情報の後に
lambda
Lambda式:1つ以上のパラメータが、1つのコロンに続いて式に続きます.lambda argument1,argument2,...argument3:expression using arguments
Lambdaが導入したローカル役割ドメインはネストされたdef文のように、上位関数、モジュール、および内蔵役割ドメイン(LEGB法則による)から変数を自動的に調べます.
シーケンスに関数をマッピングする:map
map関数は、シーケンスオブジェクトの各メタ数に入力された関数を適用し、すべての呼び出し結果を含むリストを返します.最初のパラメータは関数オブジェクトを期待するため、lambdaとよく協力します.
filterとreduce
フィルタは、あるテスト関数に基づいていくつかの要素数をフィルタします.
reduceは、各ペアの要素に関数を適用し、最終結果まで実行します.
結合性:できるだけグローバル変数を使用しないでください.関数で受信した可変実パラメータの値をできるだけ変更しないでください.別のモジュールファイルの変数を直接変更しないでください.
集約性:各関数には単一の、統一されたターゲットがあり、関数はできるだけ小さくなります.
Pythonの関数はオブジェクトであり,関数オブジェクトは他の名前に値を付け,他の関数に渡し,データ構造に埋め込むことができる.一方、def文に使用される名前は、現在の役割ドメインの変数にすぎません.defが実行されると、この名前は関数オブジェクトを指し、他のオブジェクトに割り当てることができます.また、この関数名に他のオブジェクトを与えることもできます.
>>> def echo(message): # echo
... print(message)
...
>>> echo
<function echo at 0xb70760ac>
>>> x=echo #
>>> x('hello world')
hello world
>>> echo=5 # echo
>>> echo
5
関数の内省
関数もオブジェクトなので、クラスのように通過することもできます.参照してプロパティの値を表示します.一方dir法を参照することにより,次の層の詳細を深く探索することができる.
>>> def fun(a):
... print(a)
...
>>> dir(fun)
['__annotations__', '__call__', '__class__', '__closure__', '__code__',... , '__subclasshook__']
>>> fun.__code__
<code object fun at 0xb71532a0, file "<stdin>", line 1>
>>> dir(fun.__code__)
['__class__', ..., 'co_argcount', ..., 'co_varnames'] # _, ,
>>> fun.__code__.co_varnames
('a',)
>>> fun.__code__.co_argcount
1
関数のプロパティ
上記の関数プロパティに加えて、手動で新しいプロパティを追加することもできます.
>>> fun.count=0 # count,
>>> dir(fun) # dir , count fun
['__annotations__', ...,'__sizeof__', '__str__', '__subclasshook__', 'count']
関数注記
注記情報:関数のパラメータと結果に関連する任意のユーザー定義データ.オプションで、関数オブジェクトに直接アタッチされます.annotations__,注記defヘッダ行に記述されるので、関数を定義するときにのみ設定できます.変数と関数の戻り値のみにコメントします.
≪パラメータのコメント|Comments for Parameters|oem_src≫:パラメータの後にコロンとコメント情報を追加します.パラメータにデフォルト値を設定したい場合は、コメントの後にあります.
値を返すコメント:パラメータリストの後にコロンを付ける前に->寸法情報の後に
>>> def fun(a:'spam'=4, b:(1,10)=5, c:float=6) -> int:
... return a+b+c
...
>>> fun.__annotations__
{'a': 'spam', 'c': <class 'float'>, 'b': (1, 10), 'return': <class 'int'>}
lambda
Lambda式:1つ以上のパラメータが、1つのコロンに続いて式に続きます.lambda argument1,argument2,...argument3:expression using arguments
Lambdaが導入したローカル役割ドメインはネストされたdef文のように、上位関数、モジュール、および内蔵役割ドメイン(LEGB法則による)から変数を自動的に調べます.
>>> def knights():
... title ='sir'
... action =(lambda x='fee':title+x) # ,
... return action
...
>>> act=knights()
>>> act('hello')
'sirhello'
シーケンスに関数をマッピングする:map
map関数は、シーケンスオブジェクトの各メタ数に入力された関数を適用し、すべての呼び出し結果を含むリストを返します.最初のパラメータは関数オブジェクトを期待するため、lambdaとよく協力します.
>>> map((lambda x:x+3),(1,2,3)) #
<map object at 0xb707544c>
>>> list(map((lambda x:x+3),(1,2,3)))
[4, 5, 6]
>>> list(map(pow,[1,2,3],[2,3,4])) # N N , ,
[1, 8, 81]
filterとreduce
フィルタは、あるテスト関数に基づいていくつかの要素数をフィルタします.
reduceは、各ペアの要素に関数を適用し、最終結果まで実行します.
>>> list(filter((lambda x: x>0),range(-5,5))) # 0
[1, 2, 3, 4]
>>> from functools import reduce
>>> reduce((lambda x, y:x+y),[1,2,3,4])
10