Python学習ノート11:Python関数と関数式プログラミング


1、関数vsプロセスは簡単で、特殊で、戻り値のない関数である.Pythonのプロシージャは関数であり、プロシージャはデフォルトでNoneを返します.
2、呼び出し関数(1)関数オペレータ()(2)キーワードパラメータは、呼び出し者が関数呼び出しのパラメータ名によってパラメータを区別し、パラメータが欠落したり、順序に従っていないことを可能にする.
def net_conn(host,port):
    net_conn_suite
net_conn('kappa',8080)
net_conn(port=8080,host='chino')

(3)デフォルトパラメータデフォルトパラメータは、デフォルト値を宣言したパラメータであり、呼び出し者がそのパラメータに値を入力しないことを許可する.(4)パラメータグループは,メタグループ(非キーワードパラメータ)や辞書(キーワードパラメータ)をパラメータグループとして関数に渡す.
func(positional_args,keyword_args,*tuple_grp_nonkw_args,**dict_grp_kw_args)
  • positional_Args:位置パラメータ
  • keyword_Args:キーワードパラメータ
  • tuple_grp_nonkw_Args:非キーワードパラメータグループ(メタグループ形式)
  • dict_grp_kw_Args:キーワードパラメータグループ(辞書形式)
  • 3、作成関数(1)def文
    def function_name(args):
        "function_documentation_string"
        function_body_suite

    (2)宣言vs定義Pythonでは,宣言と定義を一体と見なし,関数の句は宣言されたタイトル行とその後の定義体からなる.(3)順方向参照Pythonには順方向参照の問題は存在しない(C言語は存在し、関数の呼び出しは関数の定義後にしなければならない).Pythonでは、関数が宣言されない前に参照または呼び出しは許可されません.(4)関数属性(2.1)ピリオド属性識別,ネーミングスペース関数属性はPythonでピリオド属性識別を用いて名前空間を持つ領域である.
    def bar():
        pass
    bar.__doc__='***'
    bar.version=0.1

    関数ボディが作成されていないため、関数の宣言に属性にアクセスできません.(5)内部/インライン関数(C#インライン関数)は、関数内に別の関数(オブジェクト)を作成するのは完全に合法的であり、この関数を内部/インライン関数と呼ぶ.≪クローズド・パッケージ|Closed Package|emdw≫:内部関数には、外部関数または外部関数の外に定義されたオブジェクトの参照が含まれており、内部関数はクローズド・パッケージと呼ばれます.(6)関数(メソッド)アクセラレータは,関数呼び出し上の修飾である.
    @decorator(dec_opt_args)
    def func2Bdecorated(func_opt_args):

    2.2.静的メソッドとクラスメソッドの構文:
    class MyClass(object):
        def staticFoo():
            ...
        staticFoo = staticmethod(staticFoo)

    アクセサリーのコードを使用するには:
    class MyClass(object):
        @staticmethod
        def staticFoo():
            ...

    アクセサリは「積み重ね」できます.
    @deco2
    @deco1
    def func(arg1,arg2,...):
        pass

    結合関数を作成するのと同じです.
    def func(arg1,arg2,...):
        pass
    func=deco2(deco1(func))

    パラメータとパラメータなしの装飾:
    @deco
    def foo():pass
    =>foo=deco(foo)
    @decomaker(deco_args) 
    def foo():pass
    =>foo=decomaker(deco_args)(foo)
    @deco1(deco_arg)
    @deco2
    def func():pass
    =>func=deco1(deco_arg)(deco2(func))

    AOP(Aspect Oriented Programming、プログラミング向け)
  • 導入ログ
  • は、性能
  • を検出するためにタイミングロジックを追加する.
  • 関数にトランザクションを追加する能力
  • タイムスタンプ装飾/タイムスタンプサーバ
  • は、プログラムの複雑さを低減するために、装飾器に汎用機能のコードを配置する.

  • 4、伝達関数Pythonの関数は他のオブジェクトと同様であり、関数は参照(アクセスまたは他の変数を別名として)、パラメータ伝達関数として、リストや辞書などのコンテナオブジェクトの要素として使用することができる.関数が他のオブジェクトと区別される特徴は、関数が呼び出されることです.
    5、Formal Arguments(パラメータ)Python関数のパラメータセットには、必要なすべてのパラメータ、キーワードパラメータ、およびすべてのデフォルト値が含まれます.(1)位置パラメータは、いつ関数が呼び出されても、関数のすべての位置パラメータを指定する必要があります.キーワードパラメータは、パラメータリスト内の適切な位置に一致するキーワードを与えるために、位置によって関数に入力されなくてもよい.(2)デフォルトパラメータすべての位置パラメータは、いずれかのデフォルトパラメータの前に表示する必要があります.
    6、可変長のパラメータ(1)非キーワード可変長パラメータ(タプル)*記号を使用してタプルを指定する.可変長パラメータメタグループは、位置パラメータとデフォルトパラメータの後にある必要があります.(2)キーワード変数パラメータ(辞書)は**記号を使用して辞書を指定する.1.6以前は、長くなるオブジェクトはapply()関数を介して呼び出された関数にしか渡されませんでした.
    7、関数式プログラミング(1)匿名関数とlambda式
    lambda [arg1 [,arg2,...,argN]]:expression

    Pythonではlambdaキーワードで匿名関数を作成できます.完全なlambda文は、宣言と同じ行に配置する必要がある式を表します.
    def true():return True <=>lambda:True
    def add(x,y):return x+y <=>lambda x,y:x+y
    def usuallyAdd2(x,y=2):return x+y <=>lambda:x,y=2:x+y(      )
    def showAllAsTuple(*z):return z <=>lambda *z:z(      )

    (2)組み込み関数1 apply()apply(func[,nkw][,kw])は将来のバージョンでは消失する.②filter()フィルタ関数filter(func,seq)は、1つのオブジェクトのシーケンスと1つの「フィルタ」関数を与え、各シーケンス要素はこのフィルタによってフィルタされ、保持関数は本物のオブジェクトに戻る.③map()map(func,seq 1[,seq 2...])map()は、関数呼び出しを各シーケンスの要素にマッピングし、すべての戻り値を含むリストを返します.
    map(None,[1,3,5],[2,4,6])=>[(1,2),(3,4),(5,6)]
    zip([1,3,5],[2,4,6])=>[(1,2),(3,4),(5,6)]

    ④reduce()reduce(func,seq[,init])reduceは、2元関数、1つのシーケンス、および1つのオプションの初期化器を使用して、そのリストの内容を効果的に単一の値に「減らす」.(「折りたたみ」)
    reduce(func,[1,2,3])≡func(func(1,2),3)

    (3)バイアス関数応用(2.5)functoolsモジュールcurrying概念:1つはn個のパラメータを有し、curriedの関数は1つ目のパラメータを固定パラメータとして硬化し、もう1つはn−1個のパラメータを有する関数オブジェクトを返す.それぞれLISPの元の関数carとcdrの挙動に似ている.Curryingエネルギーはバイアス関数応用(partial functionアプリケーション,PFA)として汎化され,この関数は任意の数(順序)のパラメータの関数を別の残りのパラメータを持つ関数オブジェクトに変換する.
    add1=partial(add,1)=>add1(x)==add(1,x)
    mul100=partial(mul,100)=>mul100(x)==mul(100,x)

    キーワードパラメータ付きPFAを使用します.
    baseTwo=partial(int,base=2)=>baseTwo('10010')==int('10010',base=2)(              )

    PFA優秀応用:「部分GUIモジュール化」(部分クラスインスタンス化)を提供する
    8、変数役割ドメイン(1)グローバル変数とローカル変数検索識別子の順序:ローカル役割ドメインから始まり、全ローカルドメインに至る.見つかりませんでした.NameError例外が放出されました.(2)global文のローカル変数は、同じ名前のグローバル変数を上書きします.名前付きグローバル変数を明確に参照するにはglobal文を使用する必要があります.
    global var1[,var2][,...varN]

    (3)役割ドメインの数2.1までは,複数の関数のネストが存在するが,1つの関数のローカル役割ドメインとグローバル役割ドメインの2つ以上の役割ドメインにアクセスできない.(4)Pythonの静的ネストドメインを閉包する.内部関数1つの内部関数では、外部の役割ドメイン(グローバルな役割ドメインではない)の変数を参照すると、内部関数は閉パケット(closure)と呼ばれます.外部関数内に定義されるが、内部関数によって参照される変数または使用される変数を自由変数と呼ぶ.閉パッケージも関数ですが、追加の役割ドメインを運ぶことができます.(「放浪」の役割ドメイン、グローバル名空間ドメインまたはローカルに属さない)閉パッケージは、計算、非表示状態のインストール、関数オブジェクトおよび役割ドメインの任意の切り替えに役立ちます.閉包はGUIや多くのAPIがコールバック関数をサポートするイベント駆動プログラミングにおいても有用である.閉パケットは、独自の役割ドメインが必要なコールバック関数を必要とする場合に適しています.関数のfunc_を使用するclosureプロパティを使用して、自由変数を追跡します.(5)役割ドメインとlambda 1つのlambda式は、それ自体しかアクセスできないローカル役割ドメインを定義する.
    9、ジェネレータジェネレータの動機:反復中に何らかの方法で次の値を生成し、返す.協同プログラム(協同プログラムは実行可能な独立した関数呼び出しであり、一時停止または一時停止し、プログラムが離れた場所から継続または再開することができる.)中間値を返して複数回継続する協同プログラムを保留することをジェネレータと呼ぶ.2.2にジェネレータを加え、2.3が標準となり、2.5が向上した.ジェネレータはyield文を持つ関数であり、ジェネレータはyield文によって一時停止し、中間の結果を返すことができます.実際の戻り値に達したり、関数が終了してもより多くの値が返されない場合、StopIteration異常が投げ出されます.
    10、他のPythonは関数のリロードをサポートしていないので、type()という組み込み関数をエージェントとして使用して、異なるパラメータタイプの関数を持つ多重宣言を処理してクラスC言語の関数のリロードをシミュレートする必要があります.Pythonは静的ネストドメイン(2.1に導入され2.2で標準となる)をサポートし,内部関数を有用にする.これまでのバージョンでは、内部関数は意味がありませんでした.それらのバージョンはグローバルドメインとローカルドメインのみをサポートしているからです.