ないぶかんすう


内部関数ないないないかんすう:関数に含まれる関数のシェイプかんすに含まれるかんすに含まれるけいじ
lambda, map()
ex)
def outFunc(v1, v2):
    def inFunc(num1, num2):
        return num1 + num2
    return inFunc(v1, v2)
print(outFunc(10,20))
outFunc()関数の外部コールでinFunc()関数を使用中にエラーが発生しました.
 
Lambda関数:関数を1行に簡略化します.
  • lambdaパラメータ1、パラメータ2、...:パラメータ式
  • def hap(num1, num2):
        res = num1 + num2
        return res
    print(hap(10,20))
    hap2 = lambda num1, num2 : num1 + num2
    print(hap2(10,20))
    
    hap3 = lambda num1 = 10, num2 = 20 : num1 + num2
    print(hap3())
    print(hap3(100, 200))
    パラメータが指定されていない場合はデフォルトに設定され、パラメータが渡された場合はデフォルトは無視されます
    ラムダ関数ラムダかんすう:単純な関数を作成するには
    名前のない関数で、ラムダ式とも呼ばれます.
    匿名関数:anonymous function

    ラムダ関数はパラメータと関数の機能しか持たない.(lambda [매개변수1, 매개변수2, ...] : [표현식])(인자1, 인자2, ...)インラインramda関数:呼び出し文にramda関数の機能を追加できます.print('100과 200의 합 : ', (lambda x, y : x + y)(100, 200)) 
    map()関数
  • lambda関数の利点はmap()関数とともに使用する場合に見られる.
  • map()は、2つの引数を持つ関数です.
  • r = map(function, iterable, ...)
  • 最初のパラメータ関数:関数名
  • 第2パラメータiterable:1つのメンバーのオブジェクト(list、str、tuple)
  • を一度に返すことができます.
  • map()関数iterableのすべての要素に関数を適用し、関数によって変更された反復器
  • を返します.
    a = [1,2,3,4]
    b = [17,12,11,10]
    list(map(lambda x, y : x + y, a, b))
     
    フィルタ内蔵関数
    複数のデータからデータの一部を抽出するために使用します.filter(조건 함수, 순회 가능한 데이터) filter()関数は、2番目のパラメータのデータのうち、1番目のパラメータを満たす条件関数のデータのみを返します.
    ex)
    users = [{'mail': '[email protected]', 'name': 'Brett Holland', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Madison Martinez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Michael Jenkins', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Karen Rodriguez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Amber Rhodes', 'sex': 'F'}]
    
    
    # 함수를 인자로 받기 때문에, is_man() 함수 선언
    def is_man(user):
         return user["sex"] == "M"
    
    # 첫 번째 인자 : is_man(), 두 번째 인자 : users
    for man in filter(is_man, users):
        print(man)
    
    
    # 결과
    # {'mail': '[email protected]', 'name': 'Brett Holland', 'sex': 'M'}
    # {'mail': '[email protected]', 'name': 'Michael Jenkins', 'sex': 'M'}
     
    Ramda関数でフィルタ
    条件関数のコードが長い場合は、上記のように関数を宣言しますが、関数が短い場合はramda関数を使用して簡単なコードを作成できます.
    users = [{'mail': '[email protected]', 'name': 'Brett Holland', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Madison Martinez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Michael Jenkins', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Karen Rodriguez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Amber Rhodes', 'sex': 'F'}]
    
    
    # 함수를 인자로 받기 때문에, is_man() 함수 선언
    def is_man(user):
         return user["sex"] == "M"
    
    for woman in filter(lambda u: u["sex"] != "M", users):
        print(woman)
     
    結果データを返すfilter()関数を使用して、listまたはtupleタイプのデータを格納する必要があります.filter()関数は、filterのタイプで結果を返します.filter()関数の結果値をlistに変換する最も簡単な方法は、list()内蔵関数を使用することです.
    users = [{'mail': '[email protected]', 'name': 'Brett Holland', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Madison Martinez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Michael Jenkins', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Karen Rodriguez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Amber Rhodes', 'sex': 'F'}]
    
    print(list(filter(lambda u: u["mail"].endswith("@gmail.com"), users)))
    
    # 결과
    [{'mail': '[email protected]', 'name': 'Brett Holland', 'sex': 'M'}, {'mail': '[email protected]', 'name': 'Michael Jenkins', 'sex': 'M'}, {'mail': '[email protected]', 'name': 'Karen Rodriguez', 'sex': 'F'}, {'mail': '[email protected]', 'name': 'Amber Rhodes', 'sex': 'F'}]
    tuple()内蔵関数を使用してtupleに変換できます.
    users = [{'mail': '[email protected]', 'name': 'Brett Holland', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Madison Martinez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Michael Jenkins', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Karen Rodriguez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Amber Rhodes', 'sex': 'F'}]
    
    print(tuple(filter(lambda u: u["mail"].endswith("@gmail.com"), users)))
    
    # 결과
    ({'mail': '[email protected]', 'name': 'Brett Holland', 'sex': 'M'}, {'mail': '[email protected]', 'name': 'Michael Jenkins', 'sex': 'M'}, {'mail': '[email protected]', 'name': 'Karen Rodriguez', 'sex': 'F'}, {'mail': '[email protected]', 'name': 'Amber Rhodes', 'sex': 'F'})
     
    List Comprehension
    これはfilter()関数を用いるよりもPythonのようなデータ抽出方法である.
    users = [{'mail': '[email protected]', 'name': 'Brett Holland', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Madison Martinez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Michael Jenkins', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Karen Rodriguez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Amber Rhodes', 'sex': 'F'}]
    
    print([user for user in users if user["sex"] == 'M'])
    
    # 결과
    [{'mail': '[email protected]', 'name': 'Brett Holland', 'sex': 'M'}, {'mail': '[email protected]', 'name': 'Michael Jenkins', 'sex': 'M'}]
    リストは結果値がリストタイプであることを理解するため、他のタイプの変換は必要ありません.
    tupleを取得するには、tuple()内蔵関数を使用するだけです.
    users = [{'mail': '[email protected]', 'name': 'Brett Holland', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Madison Martinez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Michael Jenkins', 'sex': 'M'},
    {'mail': '[email protected]', 'name': 'Karen Rodriguez', 'sex': 'F'},
    {'mail': '[email protected]', 'name': 'Amber Rhodes', 'sex': 'F'}]
    
    print(tuple(user for user in users if user["sex"] == 'M'))
    
    # 결과
    ({'mail': '[email protected]', 'name': 'Brett Holland', 'sex': 'M'}, {'mail': '[email protected]', 'name': 'Michael Jenkins', 'sex': 'M'})
    x)二乗出力
    a = [1,2,3,4,5]
    a = [x**2 for x in a]
    print(a)
    
    # 결과
    [1, 4, 9, 16, 25, 36, 49]
    ex)複数の整数文字列を受信しint()関数を使用して整数値リストに変換する
    list_array = [int(x) for x in input('정수를 여러개 입력하세요 : ').split()]
    
    print(list_array)
    ex)2つのリストの積機能
    product_xy = [x * y for x in [1, 2, 3] for y in [2, 4, 6]]
    
    # 결과
    [2, 4, 6, 4, 8, 12, 6, 12, 18]
    ex)2と3の倍数を求める
    name = [n for n in range(1, 31) if n % 2 == 0 if n % 3 == 0]
    print(name)
    
    # 결과
    [6, 12, 18, 24, 30]
     
     
    その他のフィルタ関数
    1)関数範囲と条件を指定する際のフィルタ関数の使用
    ages = [34, 39, 29, 19, 13, 44]
    
    print('성년 리스트 : ')
    for a in filter(lambda x : x >= 19, ages):
        print(a, end = ' ')
    2)Ramda関数による負値抽出機能
    n_list = [-30, 45, -5, -90, 20, 54, 77]
    
    minus_list = list(filter(lambda  x : x < 0, n_list))
    print("음수 리스트",minus_list)
     
     

    reduce関数

    def reduce(function, iterable, initializer=None):
        it = iter(iterable)
        if initializer is None:
            value = next(it)
        else:
            value = initializer
        for element in it:
            value = function(value, element)
        return value
    reduce関数はfunctionであり、iterableは渡さなければならない.initializerはオプションである.
    reduce関数は、iterableの要素を関数に代入し、結果値を返す関数です.
    ex) function : func, iterable : [a_1, a_2, a_3, a_4]
    返される結果値:func(func(a 1,a 2),a 3,a 4)
     
    def reduce(function, iterable, initializer=None):
        it = iter(iterable)
        if initializer is None:
            value = next(it)
        else:
            value = initializer
        for element in it:
            value = function(value, element)
        return value
    
    result1 = reduce(lambda  x, y : x + y, ['2','4','6','8','10','12'],'add : ')
    print(result1)
    
    
    # 결과
    add : 24681012
     
     
     
    参考資料
  • https://www.daleseo.com/python-filter/
  • Pythonカリキュラムリソース、ch 09機能モジュールおよびlambda関数-更新