関数(二)

3513 ワード

関数設計の注意点:
結合性:できるだけグローバル変数を使用しないでください.関数で受信した可変実パラメータの値をできるだけ変更しないでください.別のモジュールファイルの変数を直接変更しないでください.
集約性:各関数には単一の、統一されたターゲットがあり、関数はできるだけ小さくなります.
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