2016-05-18 8 views
-6

私はこのコードを持っている:Pythonで別の関数の中で関数を使う方法は?

# - - - - -my function inside another function- - - - - - - - - - - - - - - - 

def Enhanced(Dofn,Membership,incenter,iteration, tolerance,h,m,clusters,q): 

    def Dofn(Membership,center,h,m,clusters,q): 

     #some processings. 
     center = V 
     Membership = U 
     ObjFunction = sum(O) 

     return Membership, center,ObjFunction 


    ObjFunction = [] 
    center = incenter 

    for ii in range(0,iteration): 
     [Membership,center,ObjFunc] = Dofn(Membership,center,h,m,clusters,q) 
     ObjFunction.append(ObjFunc) 

    return Membership, center, iterN 

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

#Main program 
# some parameters 
Membership, center, iterN = Enhanced(Dofn,Membership,incenter,iteration, tolerance,h,m,clusters,q) 

は、私は、関数内の関数を使用します。以前の質問で私は私が上記のような機能を呼び出すことができることを読んだ。それでも私にエラーが出る:

name 'Dofn' is not defined 

Enhanedに紹介する「Dofn」の色が違っており、機能として認識されているようです。しかし、メインプログラムではエラーが発生しています! 関数内部で関数を使用する問題を解決する方法を教えてください。メインプログラムでそれを呼びますか?

ありがとうございました

+0

引数リストに 'Dofn'があるのはなぜですか? – user2357112

+0

この回答に基づいて:[リンク](http://stackoverflow.com/questions/6289646/python-function-as-a-function-argument?lq=1) – AMN

+0

@AMNあなたは呼び出し元が(他の)関数を呼び出す必要のある関数を通知する必要がある場合は、引数を指定します。しかし、あなたのコードでは、 'Enhanced'は常に内部関数を呼び出す必要があります。したがって、誰に呼び出すかを教える必要はありません。 – interjay

答えて

1

Dofnは​​メインプログラムでは不明です。引数リストから取り出します。

+0

私が書いたようにメインプログラムで 'Dofn' 'Enhanced()は正確に9つの引数(8与えられた)'をとります。メインと拡張引数の中でDofnをまたいだ場合、エラーは 'TypeError: 'builtin_function_or_method'オブジェクトに '__getitem__'属性がありません。 – AMN

+0

@AMN: – user2357112

0

変数Dofnがメインプログラムで宣言されていないため、 "name 'Dofn' is not defined"が表示されます。実際には、ランダムな文字列や整数を置いてその部分を修正すると、「name 'Membership'は定義されていません」と不平を言うでしょう。実際、Enhancedへの呼び出しで持っている変数はすべて定義されていません。変数を使用する前に宣言する必要があります。

あなたがしようとしていることには、内部関数を保持したい場合には、外部関数からそれを戻す方法がいくつか必要であり、それを他の関数の引数として使用する必要があります。 例:

def returnInner(): 
    print "In outer" 
    def inner(): 
     print "In inner" 
    return inner 
def useInner(func): 
    func() 
useInner(returnInner()) 

出力:

In outer 
In inner 
+0

このテクニックはいくつかの点で便利ですが、ここでは大過剰です。 'Dofn'は関数の引数であってはならず、主関数が参照を得る理由はありません – interjay

+0

私はあなたが言ったことを書いたが、間違いなく私の質問に尋ねた。それは可能なのだろうか? kしてください? – AMN

+0

@interjay、私はあなたの意見に同意します。私はちょうどOPがそれをどのように使用するかを理解していないように見えるので、内部機能の使用を示しています。 – user3885927

1

DEF拡張(Dofn、会員、内心、反復、寛容、H、M、クラスタ、Q):

def Dofn(Membership,center,h,m,clusters,q): 

    #some processings. 
    center = 'V' 
    Membership = 'U' 
    ObjFunction = 'sum' 
    print " Hey !!! I am Dofn Function" 

    return Membership, center,ObjFunction 


ObjFunction = [] 
center = incenter 

for ii in range(0,iteration): 
    [Membership,center,ObjFunc] = Dofn(Membership,center,h,m,clusters,q) 
    ObjFunction.append(ObjFunc) 
    print " I am Enhanced Function" 

return Membership, center, 'iterN' 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

メインプログラム

いくつかのパラメータ

メンバー、中央、iterN =拡張( 'X'、 'ラット'、 'YYY'、4 'AAAAAA'、 'B'、 'C​​'、 'DDD'、 'RRR' )

関数内の関数を使用してのあなたの道を右(このようにのみ、我々は、Pythonで関数内の関数を使用する必要があります)しかし、あなたはそれがあなたのエラー

間違って渡している引数です:名「Dofnは​​」ではありません

あなたの関数のためではありません。あなたのメインプログラムの間違った引数を渡したからです。 あなたのメインプログラムから変数を渡す前に定義する必要があります

関連する問題