Python進級の道(六)九浅一深lambda、陳独秀座ってくれ!

7262 ワード

Lambdaって何?
皆さん、こんにちは.今日はPythonのlambda式について詳しく解析しました.LambdaはPythonで広く使われていますが、正直、Lambdaについての議論はどのように使うかではなく、使うべきかどうかの問題があると思います.次はやはり多くの実例を通じて私の学習体験を共有して、最後にあなたも私と同じ結論を出すかもしれません.
まず基礎定義を理解しましょうlambdaとは何ですか?
LambdaはPythonで匿名関数を作成するための特殊な構文を表しています.Lambda構文自体をlambda式と呼び,ここから得られた関数をlambda関数と呼ぶ.
実際にまとめると、lambdaは小さな匿名関数として理解でき、lambda関数は任意の数のパラメータを使用することができますが、式は1つしかありません.JavaScript ES 6の経験がある方は親切に聞こえると思いますが、具体的な関数式は以下の通りです.
  • テンプレート:lambda argument:manipulate(argument)
  • パラメータ:argumentはこの匿名関数が伝達するパラメータであり、コロンの後ろにはこのパラメータに対する操作方法
  • がある.
    上記の定義テンプレートとパラメータを参照して、最も簡単な例を直接見てみましょう.
    add_one = lambda x:x+1       # 1   ,     +1
    add_nums = lambda x,y:x+y    # 2   ,       
    
    print(add_one(2))            #   add_one
    print(add_nums(3,7))         #   add_nums
    
    >>>   3 
         10

    lambda匿名関数の特徴は、比較的簡単な機能に対して、自分でdefを1つ必要とせず、単行で書くことができ、伝参と実行方法が一気に完成していることです.
    Lambdaの使い方の詳細
    次にlambdaの実際の応用を見てみましょう.私自身がlambdaを使った体験では、単独で使ったことがありません.lambdaは一般的にmap、filter、reduceなどの素晴らしい内蔵関数とdict、list、tuple、setなどのデータ構造と混用されているので、最大の効果を発揮することができます.もし友达がまだこれらの内蔵関数をよく知らない人がいたら、私の前の記事Python進級の道(五)map,filter,reduce,zip一網打尽を見てもいいです.
    さあ、余計なことは言わないで、次は一人一人見てみましょう.
    lambda + map
    まず登場するのはlambda+mapの組み合わせで、まず次の例を見てみましょう.
    numbers = [1,2,3,4,5]
    add_one = list(map(lambda n:n+1,numbers))  #map(fun,sequence)
    
    print(list(add_one))
    print(tuple(add_one))
    
    Out: [2, 3, 4, 5, 6]
         (2, 3, 4, 5, 6)

    これは私たちの前回の例で、1つの配列(メタグループ)の各要素+1を実現して、mapの使い方map(fun,sequence)を思い出してみましょう.funは伝達の方法で、sequenceは反復可能なシーケンスで、ここで私たちのfunは匿名関数lambda n:n+1で、ここではlambdaの設計の初心を完璧に説明しました.lambdaがなければ、デルのソリューションは次のとおりです.
    def add(num):
        return num+1
    
    numbers = [1,2,3,4,5]
    add_one = list(map(add,numbers))
    print(add_one)
    print(tuple(add_one))

    明らかに、ここのadd方法は少し余計なので、lambdaで代わるのが良い選択です.次の例を見てみましょう.これは私がログをバックアップするときに書いたコードです.名前は規範的ではありません.
    from datetime import datetime as dt
    logs = ['serverLog','appLog','paymentLog']
    format ='_{}.py'.format(dt.now().strftime('%d-%m-%y'))
    result =list(map(lambda x:x+format,logs))   #   map+lambda        
    print(result)
    
    Out:['serverLog_11-02-19.py', 'appLog_11-02-19.py', 'paymentLog_11-02-19.py']
    

    ここでは先ほどのプラス1の例とあまり差はありませんが、文字列のつなぎ合わせに変えましたが、私のところではlambdaを使うのは良い解決策ではありません.最後に、map+lambdaに少し感じているはずです.dict辞書とやり取りする例をもう一つあげましょう.
    person =[{'name':'Lilei',
              'city':'beijing'},
             {'name':'HanMeiMei',
              'city':'shanghai'}]
    
    names=list(map(lambda x:x['name'],person))
    print(names)
    
    Out:['Lilei', 'HanMeiMei']
    

    さて、ここでmap+lambdaの使い方を見て皆さんはもうよく知っています.
    lambda + filter
    Lambdaとfilterの組み合わせもよく見られますが、特定のフィルタ条件で使用されます.次に、前の記事のfilterの例を見てみましょう.
    numbers = [0, 1, 2, -3, 5, -8, 13]
    
    #     
    result = filter(lambda x: x % 2, numbers)
    print("Odd Numbers are :",list(result))
    
    #     
    result = filter(lambda x: x % 2 == 0, numbers)
    print("Even Numbers are :",list(result))
    
    #    
    result = filter(lambda x: x>0, numbers)
    print("Positive Numbers are :",list(result))
    
    Out:Odd Numbers are : [1, -3, 5, 13]
         Even Numbers are : [0, 2, -8]
         Positive Numbers are : [1, 2, 5, 13]

    ここではfilter(fun,sequence)の中のfunを私たちのlambdaに変えたにほかならないが、lambdaの関数部分(x%2,x%2==0,x>0)はTrueやFalseに戻って判断できるもので、fiterの要求に合っている.
    person =[{'name':'Lilei',
              'city':'beijing'},
             {'name':'HanMeiMei',
              'city':'shanghai'}]
    
    names=list(filter(lambda x:x['name']=='Lilei',person)) #        
    print(names)
    
    Out:[{'name': 'Lilei', 'city': 'beijing'}]
    

    lambda + reduce
    前の記事の例を見てみましょう
    from functools import reduce          # Only Python 3
    numbers = [1,2,3,4]
    result_multiply = reduce((lambda x, y: x * y), numbers)
    result_add = reduce((lambda x,y: x+y), numbers)
    
    print(result_multiply)
    print(result_add)
    
    Out:24
         10
    

    この例はlambdaとreduceの組合せを用いてlistの累積と累積乗算を実現した.興味深いことに、この例は両面性があり、lambdaとreduceがどのように一緒に使用されているかを示している一方で、次に言いたいポイントを引き出しています.lambdaは本当に使う価値がありますか.いったいどう使うべきですか.
    lambdaの過剰使用を避ける
    上の例ではlambdaの実際の応用シーンを見ましたが、ここでは私の意見を共有したいと思います.lambdaの欠点は長所よりやや多く、lambdaの過度な使用を避けるべきだと思います.
    まず、これは私の個人的な見方ですね.私がなぜそう言ったのか理解してほしいです.まず、lambdaの方法と通常のdefを比較してみましょう.lambdaとdefの主な違いは以下の通りです.
  • は、直ちに(変数を必要としない)
  • を伝達することができる.
  • は1行のコードだけで、簡潔(必ずしも効率的ではない)
  • は、return
  • を必要とせずに自動的に戻ることができます.
  • lambda関数には関数名がありません
  • 長所については、私は主にその欠点を話したいと思っています.まず、本当の需要から出発して、私たちは多くの場合lambdaを必要としません.いつもより良い代替方法を見つけることができるので、今、私たちは一緒にさっきのlambda+reduceの例を見てみましょう.私たちはlambadaで実現した結果は以下の通りです.
    from functools import reduce          # Only Python 3
        numbers = [1,2,3,4]
        result_multiply = reduce((lambda x, y: x * y), numbers)
        result_add = reduce((lambda x,y: x+y), numbers)

    ここでlambdaを使用すると、既存のsumとmulメソッドが使用できるため、単純で効率的な目的は実現されません.
    
    from functools import reduce
    from operator import mul
    
    numbers = [1,2,3,4]
    result_add = sum(numbers)
    result_multiply =reduce(mul,numbers)
    
    print(result_add)
    print(result_multiply)
    
    Out: 10
         24
    

    結果は同じであるが,sumとmulを用いたスキームがより効率的であることは明らかである.一般的な例を挙げると、listにいろいろな色が格納されている場合は、lambdaで書くと、各色の頭文字を大文字にする必要があります.
    colors = ['red','purple','green','blue']
    result = map(lambda c:c.capitalize(),colors)
    print(list(result))
    
    Out:['Red', 'Purple', 'Green', 'Blue']
    

    見た目は悪くないようですが、簡潔ですが、もっと良い方法があります.
    
    colors = ['red','purple','green','blue']
    result = [c.capitalize() for c in colors]
    print(result)
    
    Out:['Red', 'Purple', 'Green', 'Blue']
    

    sortedで頭文字が規範化されていない場合も処理でき、ソートも省けます.
    colors = ['Red','purple','Green','blue']
    print(sorted(colors,key=str.capitalize))
    
    Out:['blue', 'Green', 'purple', 'Red']
    

    もう一つの主な原因は、lambda関数に関数名がないことです.だからコードの引き継ぎ、プロジェクトの移植のシーンの中でチームに多くの困難をもたらして、多く関数add_を書きますone()悪いところはありません.みんな理解しやすいので、+1を実行する機能であることは知っていますが、チームで自分が担当しているモジュールにlambdaをたくさん使うと、他の人に理解してもらうのが面倒になります.
    Lambdaに適したシーン
    話を戻せば、存在は合理的ですが、本当にlambdaを使う必要があるのはどんなシーンですか.
  • 必要な方法は簡単です(+1、文字列接合など)、この関数は名前
  • を持つ価値がありません.
  • lambda式を使用すると、私たちが考えている関数名よりも
  • を理解しやすくなります.
  • lambdaを除いて、pythonが提供する関数は何もありません.
  • チームのすべてのメンバーはlambdaを掌握して、みんなはあなたが
  • を使うことに同意します
    他の人にプロフェッショナルな錯覚を与える場合、例えば:
    あら、弟さん、Pythonを習ったそうですが、lambdaを知っていますか.聞いたことない?だめだよ,むだに勉強したんだよ.さあさあ、お話しさせていただきます...ここでは1万字を省略する
    まとめ
    今日はlambdaの使い方と使い方を詳しく説明しましたが、九浅一深とは、90%の場合は簡単な匿名関数を作成するために使われ、10%の場合は少し複雑です(私の言い訳はよかったです)
    要するに、何事にも両面性があるので、lambdaを使う前に止めて、本当にそれが必要かどうかを自分に聞いてみましょう.
    もちろん、他の人とぶらぶらしているときは正反対の口を開く必要があります.lambdaは良いか悪いかはすべて私たち自身がどう言っているかを見て、ほらを吹くときは以下の原則を守ってください.何度も試してみてください.
    女子大生が夜売春をするのは恥ずかしいと言ったら、売春婦になって余暇を利用して勉強に励むと励ましになります.
    Lambdaもそうです