python 3進級編(一)--関数の深い理解
python 3進級編(一)--関数の深い理解
この文章を読んで何を学ぶことができますか.関数といえば、関数のパラメータ、戻り値、関数アドレスなどを思い浮かべるかもしれませんが、python 3の関数の使い方は非常に柔軟です.例えば、関数のネスト定義を許可し、関数をパラメータや変数として伝達し、関数が関数を返すことを許可します.この文章では、これらの「柔軟」の使い方を説明します.
--これはいい博文だと思いますが、小さないいねをしてほしいです.支持に感謝します.
目次
python 3進級編(一)--関数の深い理解
1また関数を見る 1.1関数呼び出しの2形式 2関数変数に値を付け、関数を削除しようとする 2.1変数に関数を割り当てる 2.2 del関数を試してみる 3関数ネスト定義 3.1定義関数のネストを試みる 3.2ネスト定義の関数を参照により呼び出す 4関数戻り関数 5関数をパラメータとして渡す
1関数を見る
基礎編では関数の定義と呼び出しを詳しく説明したが,ここではより深い研究の下で説明した.次の例では、関数の定義と呼び出しを思い出すのに役立ちます.コードの例:
実行結果:
1.1関数呼び出しの2つの形式
関数呼び出しは、持つかどうか
実行結果:
また、関数アドレスが変動していることがわかります.
2関数は変数に割り当てられ、関数を削除しようとします
2.1変数に関数を割り当てる
上記の関数の2つの呼び出し形式に基づいて、関数を変数に割り当てるには、変数が関数の戻り値を取得することと、関数アドレスを取得することの2つの可能性があります.戻り値を取得するのは分かりやすいですが、関数の実行結果を取得することに相当します.アドレスを取得するのに何の役に立ちますか?変数が関数アドレスを取得すると,その変数に相当してもこの関数を指す,すなわちこの変数によってこの関数を呼び出すことができる.これは実はc/c++のポインタの概念です.コードの例"
実行結果:
関数は持たない
2.2 del関数の試行
python 3にキーワードがあることを知っています
実行結果:
関数名
3関数ネスト定義
3.1ネスト定義関数の試行
python 3では関数のネスト定義を許可し、例えば関数
コードの例:
3.2ネスト定義を参照して呼び出す関数
関数の内部にネストされて定義された関数は、関数の外部から直接呼び出すことはできませんが、前に述べた関数には複数の参照がありますが、実際には関数が参照によって呼び出されます.グローバルリファレンスを使用して、内部ネスト定義の関数を直接指すことができ、関数の外部でネスト定義の関数を呼び出すことができます.コードの例:
実行結果:
4関数戻り関数
は、
実行結果:
は関数を用いて内部関数のアドレスを返し,外部アクセス内部関数も実現できる.関数ネスト定義と関数戻り関数を組み合わせると、関数呼び出しに「かっこ」が付く場合があり、興味深いです.コードの例:
実行結果:
論理は複雑ではありません.私たちは理にかなっています.
実行結果:
5関数をパラメータとして渡す
ある関数が一部の機能を実現し、もう一部の機能が一時的に不確定である場合、この不確定な機能をパラメータとして呼び出しのために個別にカプセル化することができる.
実行結果:
ここの
この文章を読んで何を学ぶことができますか.関数といえば、関数のパラメータ、戻り値、関数アドレスなどを思い浮かべるかもしれませんが、python 3の関数の使い方は非常に柔軟です.例えば、関数のネスト定義を許可し、関数をパラメータや変数として伝達し、関数が関数を返すことを許可します.この文章では、これらの「柔軟」の使い方を説明します.
--これはいい博文だと思いますが、小さないいねをしてほしいです.支持に感謝します.
目次
python 3進級編(一)--関数の深い理解
1関数を見る
基礎編では関数の定義と呼び出しを詳しく説明したが,ここではより深い研究の下で説明した.次の例では、関数の定義と呼び出しを思い出すのに役立ちます.コードの例:
def Function():
print("Call Function")
return 0
print(Function())
実行結果:
Call Function
0
1.1関数呼び出しの2つの形式
関数呼び出しは、持つかどうか
()
2つに分けられますが、カッコを付けると関数が実行され、カッコ内の実パラメータが形パラメータに渡され、関数の戻り値が呼び出し先に渡されます.カッコを付けない場合、呼び出されたのは関数のアドレスであり、関数は実行されません.コードの例:def Function():
print("Call Function")
return 0
#
print(Function())
print("---------------------------------")
print(Function)
実行結果:
Call Function
0
---------------------------------
また、関数アドレスが変動していることがわかります.
2関数は変数に割り当てられ、関数を削除しようとします
2.1変数に関数を割り当てる
上記の関数の2つの呼び出し形式に基づいて、関数を変数に割り当てるには、変数が関数の戻り値を取得することと、関数アドレスを取得することの2つの可能性があります.戻り値を取得するのは分かりやすいですが、関数の実行結果を取得することに相当します.アドレスを取得するのに何の役に立ちますか?変数が関数アドレスを取得すると,その変数に相当してもこの関数を指す,すなわちこの変数によってこの関数を呼び出すことができる.これは実はc/c++のポインタの概念です.コードの例"
def Function():
print("Call Function")
return 0
Func1 = Function() # 0
print(Func1)
print("--------------------------------------------------")
Func2 = Function #
print(Func2)
print("--------------------------------------------------")
Func2() #
実行結果:
Call Function
0
--------------------------------------------------
--------------------------------------------------
Call Function
関数は持たない
()
変数に渡されるのは関数アドレスであり、変数が関数アドレスを持っている場合は()
を加えると関数実行を呼び出すことができる.もちろん、変数が格納されている関数アドレスは、他の変数に値を割り当て続けることができます.より正確には、変数にアドレスを割り当てることは、オブジェクト(ここでは関数)に新しい参照を作成し、この参照によってオブジェクト自体にアクセスすることができます.(実際にpython 3はすべて引用で、後に引用を1枚補充します).2.2 del関数の試行
python 3にキーワードがあることを知っています
del
各オブジェクトの参照を削除できます.削除するのは直接削除するのではなく、参照自体であることに注意してください.1つのオブジェクトが参照によって指向されていない場合、ゴミ回収メカニズムは自動的に解放されます.関数定義時の関数名もその関数の1つの参照にすぎず、同様にこの参照を削除することができます.del
関数は実際にその関数の最初の参照を削除している.def Function():
print("Call Function")
return 0
Func = Function #
del Function
# Function() #error: NameError: name 'Function' is not defined
Func() #
実行結果:
Call Function
関数名
Function
この関数の作成時に存在する最初の関数参照であり、この関数に渡すことで新たな参照を作成できるFunc
、この場合参照を削除Function
であれば参照Func
依然として有効であるがFunction
削除された後は使用できない.要するに、関数定義時に関数名が最初の参照であり、関数に複数の参照を作成できます.関数の参照は、最初の参照であっても削除できます.3関数ネスト定義
3.1ネスト定義関数の試行
python 3では関数のネスト定義を許可し、例えば関数
Func1
では関数Func2
を定義でき、関数Func2
では関数Func3
を定義できる.関数を定義するときは呼び出すためですが、関数がネストされているときの役割ドメインに注意してください.関数Func2
関数Func1
で定義されている場合、Func1
関数でのみ呼び出すことができるFunc2
関数は、外部から直接呼び出すことができない(グローバル関数との最大の違いは役割ドメイン).実行結果:def Func1():
print("Call Func1")
def Func2():
print("Call Func2")
def Func3():
print("Call Func3")
Func3()
Func2()
#Func3() #error: NameError: name 'Func2' is not defined
Func1() # Func1, Func2 Func3
#Func2() #error: NameError: name 'Func2' is not defined
#Func3() #error: NameError: name 'Func2' is not defined
コードの例:
Call Func1
Call Func2
Call Func3
Func2
関数内で呼び出されたFunc3
関数、Func1
関数内で呼び出されたFunc2
関数なので、Func1
関数を呼び出すと、実際に呼び出されたFunc2
およびFunc3
関数が付属しています.3.2ネスト定義を参照して呼び出す関数
関数の内部にネストされて定義された関数は、関数の外部から直接呼び出すことはできませんが、前に述べた関数には複数の参照がありますが、実際には関数が参照によって呼び出されます.グローバルリファレンスを使用して、内部ネスト定義の関数を直接指すことができ、関数の外部でネスト定義の関数を呼び出すことができます.コードの例:
Func = None
def Func1():
global Func #
print("Call Func1")
def Func2():
print("Call Func2")
Func = Func2
Func2()
Func1() # Func1, Func2 Func3
print("---------------------------------------------")
Func() #
実行結果:
Call Func1
Call Func2
---------------------------------------------
Call Func2
4関数戻り関数
は、
()
の関数名を持たない関数のアドレスを呼び出し、それを関数の戻り値とすると、関数呼び出しにおいて戻り関数のアドレスが得られる.コードの例:def Func1():
print("Call Func1")
def Func2():
print("Call Func2")
return Func2
Func = Func1() # Func1, Func2 Func3
print("------------------------------------")
Func() #
実行結果:
Call Func1
------------------------------------
Call Func2
は関数を用いて内部関数のアドレスを返し,外部アクセス内部関数も実現できる.関数ネスト定義と関数戻り関数を組み合わせると、関数呼び出しに「かっこ」が付く場合があり、興味深いです.コードの例:
def FuncA(NumA):
print("Call FuncA", "Param:%d" % NumA)
def FuncB(NumB):
print("Call FuncB", "Param:%d" % NumB)
def FuncC(NumC):
print("Call FuncC", "Param:%d" % NumC)
return NumC #FuncC
return FuncC #FuncB FuncC
return FuncB #FuncA FuncB
print(FuncA(1)(2)(3)) #
print("---------------------------------------")
print(((FuncA(1))(2))(3)) #
実行結果:
Call FuncA Param:1
Call FuncB Param:2
Call FuncC Param:3
3
---------------------------------------
Call FuncA Param:1
Call FuncB Param:2
Call FuncC Param:3
3
論理は複雑ではありません.私たちは理にかなっています.
FuncA(1)
関数を呼び出して値を渡す1
、FuncA
で定義しているFuncB
およびFuncC
関数は呼び出されていないので実行されない.そしてFuncA
呼び出しが終了して次の関数に戻るFuncB
アドレス、
+()
また関数呼び出しを構成しているのでFuncA(1)(2)
ここまで関数呼び出しが開始されているFuncB
そしてその値を伝えている2
、同じ理屈FuncA(1)(2)(3)
実行できるFuncC
というのも理解に難くありません.実行の順序はネストされた順序で外から内へ,パラメータリスト()
も1つずつ対応しており,繰返し実行可能な基礎は関数戻り値が次の実行関数のアドレスを返すことである. が多層関数に関連する場合、内層関数は外層関数のパラメータにアクセスできます.同じ名前の変数の場合、最下層変数に優先的にアクセスします.コードの例:def FuncA(NumA):
Str = "A"
def FuncB(NumB):
Str = "A"
def FuncC(NumC):
Str = "A" # ,
print(NumA, NumB, NumC, Str) #
return NumC #FuncC
return FuncC #FuncB FuncC
return FuncB #FuncA FuncB
FuncA(1)(2)(3) #
実行結果:
1 2 3 A
5関数をパラメータとして渡す
ある関数が一部の機能を実現し、もう一部の機能が一時的に不確定である場合、この不確定な機能をパラメータとして呼び出しのために個別にカプセル化することができる.
def Function(Func):
print("Call Function")
Func()
def Func1():
print("Call Func1")
def Func2():
print("Call Func2")
Function(Func1) # Func1 Function
print("---------------------------")
Function(Func2) # Func2 Function
実行結果:
Call Function
Call Func1
---------------------------
Call Function
Call Func2
ここの
Function
関数機能は2つある:1、自分の関数内の論理を実現する.2、外部から入力された関数を呼び出すが、外部関数が実行するロジックFunction
関心がなく、外部関数が自分で決める.python 3には装飾器の概念がありますが、実は関数のパラメータとしての使い方の進化です.後の章でpython装飾器について紹介します.