TIL-Python lambda


Lambda基本


単独で使用するのではなく、map, reduce, filterなどに主に使用されます.もちろん落とせないリストも!
[注意]https://wikidocs.net/64,https://gorokke.tistory.com/38
ランダを使うと、defで簡単に作れる機能を1行^^使いやすくなります.
def hap(x, y):
    return x + y
hap(10, 20)
# 30

hap('hi', 'hello')
# 'hihello'
このようにでは、lambdaを使用してすぐに1行の符号化を適用するにはどうすればいいのでしょうか.
(lambda x, y:x+y)(10, 20)
output :
30
(람다와 적용 식을 쓰고)(람다로 적용했으면 하는 값을 넣어준다)ただし、次のコードは使用できません.不可能な場合でも参考に!
lambda x, y:x+y
#<function __main__.<lambda>(x, y)>
lambda x, y:x+y, 10, 20
#(<function __main__.<lambda>(x, y)>, 10, 20)
lambda x, y:x+y, (10, 20)
#(<function __main__.<lambda>(x, y)>, (10, 20))

mapとともに書き込む

# map(함수, 리스트)
(lambda x: x ** 2, range(5))
output :
(<function __main__.<lambda>(x)>, range(0, 5))
  • 異なるバージョンのPythonコード
  • # 파이썬 2.x 버전에서만 가능한 출력
    map(lambda x: x ** 2, range(5))
    output :
    <map at 0x1c98790d640>
    # 파이썬 2.x, 3.x 에서의 출력
    list(map(lambda x: x ** 2, range(5)))
    # 리스트로 range(5)를 받아서 0,1,2,3,4에 lambda식을 하나씩 적용한다.
    output :
    [0, 1, 4, 9, 16]
    mapとlambdaを再利用します.
    testlist = [40, 50, 60, 70, 80]  
    check_pass = (lambda x: 'pass' if x >= 70 else 'fail')(testlist)
    print(check_pass, type(check_pass))
    
    # output
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-16-c8f845a8bcf6> in <module>
    ----> 1 check_pass = (lambda x: 'pass' if x >= 70 else 'fail')(testlist)
          2 print(check_pass, type(check_pass))
    
    <ipython-input-16-c8f845a8bcf6> in <lambda>(x)
    ----> 1 check_pass = (lambda x: 'pass' if x >= 70 else 'fail')(testlist)
          2 print(check_pass, type(check_pass))
    
    TypeError: '>=' not supported between instances of 'list' and 'int'
      
    これにより、次の変更によりコードを実行できます.
    # 가능
    # testlist = [40, 50, 60, 70, 80]
    check_pass = list(map(lambda x: 'pass' if x >= 70 else 'fail', testlist))
    print(check_pass, type(check_pass))  
    output:
    ['fail', 'fail', 'fail', 'pass', 'pass'] <class 'list'>

    reduceとともに書き込み

    # reduce(함수, 시퀀스)
    # 시퀀스의 원소들을 누적적으로 함수에 적용한다
    from functools import reduce
    reduce(lambda x, y: x + y, [0,1,2,3,4])
    output :
    10
    文字列の使用
    reduce(lambda x, y: y + x, 'abc')
    # ba의 결과 이후 그 다음 원소인 c를 더함
    # 첫 번째 x, y = a, b >> 결과 'ba'
    # 두 번째 x, y = ba, c >> 결과 'cba'
    output:
    'cba'

    フィルタとともに書き込む

    # filter(함수, 리스트)
    # 말 그대로 필터. lambda의 결과가 참인 값을 새로운 리스트로 반환
    list(filter(lambda x: x < 5, range(10)))
    output :
    [0, 1, 2, 3, 4]
    # 짝수 돌려주는 filter(lambda()) 만들기
    list(filter(lambda x: x % 2 == 0, range(10)))
    output:
    [0, 2, 4, 6, 8]
    # 홀수 돌려주는 filter(lambda()) 만들기
    # 2로 나눈 나머지가 1 => 1은 True 값이다.(False는 0)
    list(filter(lambda x: x % 2, range(10)))     
    output:
    [1, 3, 5, 7, 9]
    Lambdaは多くのリファレンスリンクで学ぶことができますが、1つのpostingですべて整理する量が多すぎます.
    数が多いというより、lambdaで任意の数の値を出力できます.
    学習したい場合は、文字列、リスト、チュートリアルなどを自分で追加し、if문とコードを作成し、これらの方法を熟知する必要があります.