2017-07-09 4 views
1

Pythonドキュメントの特にthisページを読み、attrgetterとitemgetterに関してです。関数内のdefの使い方は何ですか?

defreturnという使用法の使用法をコード例で理解するのは苦労しています。 これらの機能の使用はではありません。

lamdbaのようですが、それをどのように解釈するのか分かりません。

EDIT


私はそれだけでクリックされたと思います。 attrgetterはresolve_attr関数のコンストラクタのようなものですか?私は通常、defのコードがdefreturnの間であると予想していたので、これはちょっと混乱しました。リターンのコードはラムダのようなものです。混乱に加えて、arg ojbは返されたオブジェクトに渡される引数です。 Arhhhhh .....


これが意味を成すために私が知る必要があることは何ですか?

これは私が参照しているコードの例です:

def attrgetter(*items): 
    if any(not isinstance(item, str) for item in items): 
     raise TypeError('attribute name must be a string') 
    if len(items) == 1: 
     attr = items[0] 
     def g(obj): #What is this 
      return resolve_attr(obj, attr) 
    else: 
     def g(obj):#And this? 
      return tuple(resolve_attr(obj, attr) for attr in items) 
    return g 

def resolve_attr(obj, attr): 
    for name in attr.split("."): 
     obj = getattr(obj, name) 
    return obj 
+2

"上位関数"を参照してください。これらは、引数として関数を取り、関数を返す関数です。これはファンクションファクトリの一例であり、共通のパターンです。 –

+0

[こちら](https://en.m.wikipedia.org/wiki/Higher-order_function)をご覧ください。あなたが知っておくべき他のアイデアは、Pythonには[ファーストクラスの関数](https://en.m.wikipedia.org/wiki/First-class_function)があります。これらのアイデアは[機能プログラミングパラダイム](https://en.m.wikipedia.org/wiki/Functional_programming)に共通しています –

+0

ええ、今読んでいる –

答えて

3

defは、関数を定義するためのキーワードです。

これらはあなたが複数のreturng

attrgetter()の内側を持っている理由だ別の関数内 attrgetter()

を定義した関数だけですlambdaattrgetter()ので返す関数、直接ではなく、結果のように見えます。

gは、実際にラムダ宣言に置き換えることができます。

3

Pythonでは、関数は通常のオブジェクトとまったく同じです。それらを渡すことができます(上記の例のように)、他の関数からそれらを返すことができます。

例の関数は、戻り値として別の関数を返します。これは、関数(それはdef g(ojb):の行です)を定義し、単にそれを返すことによって行います。

これは、Pythonでは関数が他のオブジェクトとまったく同じだからできます。

関連する問題