<jupyter_start><jupyter_text>11. Function2, Class1_20191009_03 _Day 3_영상 1  map, filter, reduce함수 - 리스트 관련 함수  1. Filter- 리스트 데이터에서 특정 조건에 맞는 value 만 남기는 함수- **filter( func, iterable(대상 리스트) )**- -> 리스트에 func(filter조건에 부합하면 True 반환)을 다 대입시켜서, func의 결과 True인 것만 리스트에 채워넣는 것 *map : 리스트 데이터를 함수 출력값으로 다시 매핑 (순서가 있는 데이터 집합에서 모든 값에 함수를 적용시킨 결과를 출력하는 함수)<jupyter_code># 홀수만 출력

ls = range(10)

result = list(filter(lambda data : True if data%2 else False, ls))
result<jupyter_output><empty_output><jupyter_text>map 과 filter 의 차이점 : 함수 인자로 *iterable / iterable 만 가능- map ( func, *iterable)  -> *iterable에 func (map함수연산을 *iterable에 하나씩 대입해서 나온 출력값을 리스트에 매핑하는 것)- filter ( func, iterable) -> iterable(주로 리스트 1개)에 func(filter조건 부합하면 True반환)을 하나씩 대입해서 func결과 True인 것만 리스트에 채워넣는 것<jupyter_code># map ( func, *iterable)  -> *iterable에 func (map함수연산을 *iterable에 하나씩 대입해서 나온 출력값을 리스트에 매핑하는 것)
# 질문, map함수에서 *iterable한, 데이터 여러개 올 수 있는 경우는 어떤 경우? 예시..?
ls = [1,2,3,4]
result = list(map(lambda data : '홀수' if data%2 else '짝수', ls))
result2 = list(map(lambda data : '홀수' if data%2 else '짝수',[1,2,3,4]))
print(result, result2,sep='\n')

result3 = list(filter(lambda data : True if data%2 else False, ls))
result4 = list(filter(lambda data : True if data%2 else False,[1,2,3,4]))

print('\n',result3,result4,sep='\n')<jupyter_output>['홀수', '짝수', '홀수', '짝수']
['홀수', '짝수', '홀수', '짝수']


[1, 3]
[1, 3]<jupyter_text>2. reduce- 리스트 데이커를 처음부터 순서대로 특정 함수를 실행하여 결과를 누적시켜주는 함수    - **즉, 리스트를 reduce하는 데, 그냥이 아니라 2개를 연산시켜 1개로 압축시켜주는 느낌**- from functools import reduce- reduce( func, 대상 리스트(시퀀스 )- **Apply a function of two arguments cumulatively to the items of a sequence,**    - **from left to right, so as to reduce the sequence to a single value.**<jupyter_code>from functools import reduce

ls = [3,1,2,4,5]
reduce(lambda a,b: a+b, ls)<jupyter_output><empty_output><jupyter_text>3. Decorator- 함수에서 코드를 바꾸지 않고, 기능을 추가하거나 수정하고 싶을 때 사용하는 문법- 데코레이터의 사용```def c(func):    def wrapper(*args, **kwargs):        code_1                       반복해서 추가될 코드를 하나 넣어주고        result = func(*args, **kwargs)  wrapper함수를 치환시킬 함수를 넣어주는 것. a가 wrapper로, 1,2,3 모두 실행시키는 것!        code_3                       반복해서 추가될 코드 하나 넣어주는 것. 나중에 함수 선언 시, 굳이 반복해서 적지 않아도 되게끔        return result                wrapper함수가 a함수가 되는 순간.    return wrapper    @cdef a():    code_2    @cdef b():    code_4```--------------```[해석해보자]1단계 : a함수가 c로 들어감@cdef a():    code_2```--------------[@c]- 1) @c -> c함수  c(func) 이 돌아간다[c함수 실행]- 2) a함수(func)가 c함수 안에 들어간다. 즉, c함수에서 code_2가 돌아가는 것- 3) c함수가 a함수를 받아서 돌아가는 데, 먼저 c함수에 선언된 wrapper함수가 생성된다.[wrapper함수 선언]- 4) wrapper함수는 *args, **kwargs를 받는 데, a()함수의 nulls값을 다 받아준다.- 5) 그리고 wrapper함수는 다음과 같이 선언 "code_1 실행 -> result에 a함수 연산결과 들어감(code_2 실행) -> code3 실행"- 6) 이로서, code_1, code_2(a함수), code_3 실행되는 함수를 **선언 완료!**[wrapper함수 return -> a함수]- 7) 하지만, 일단 return은 reuslt (code_2(a함수)) 만! -> wrapper함수는 code1,2,3실행시키고, 반환은 code_2만- **a함수가 wrapper함수로 치환됨**[c함수 return -> wrapper 함수]- 8) 마지막으로, c함수는 wrapper함수는 return```con) a함수 -> wrapper함수로 바뀐다. a함수 실행시키면 code1,2,3 다 실행됨 / c def a() : a를 호출하면 wrapper함수가 실행됨```<jupyter_code># a
def plus(a,b):
    print("start")                       #code1
    result = a + b                       #code2
    print("result : {}".format(result))  #code3
    return result

#b
def minus(a,b):
    print("start")                       #code1
    result = a -b                        #code4
    print("result : {}".format(result))  #code3
    return result

#c
def disp(func):
    def wrapper(*args, **kwargs):
        print("start")                     #code1
        result = func(*args, **kwargs)     #code2,4
        print("result : {}".format(result))#code3
        return result
    return wrapper<jupyter_output><empty_output><jupyter_text>위의 a b를 데코레이터를 활용해 간단히 표현해보자<jupyter_code>plus(1,2)
# code 1,3 지우면
def plus(a,b):
    result = a + b                       #code2
    return result

plus(1,2)
# code 1,3 지우고 + decorator(@disp) 쓰면  => code 1,2,3 출력
@disp
def plus(a,b):
    result = a + b                       #code2
    return result

plus(1,2)<jupyter_output>start
result : 3<jupyter_text>예제 : 비밀번호 입력 검열기 만들기 (데코레이터로 함수생성)<jupyter_code>def plus(a,b):
    return a+b

plus(1,2)
def checkpwd(func):
    def wrapper(*args,**kwargs):
        pwd = '<PASSWORD>'
        input_pwd = input("insert password :")
                
        if input_pwd == pwd:
            result = func(*args,**kwargs)
        else:
            result = "비밀번호가 일치하지 않습니다."
        return result
    return wrapper
@checkpwd
def plus(a,b):
    return a+b

plus(1,2)<jupyter_output>insert password :<PASSWORD>
{'fraction_non_alphanumeric': 0.13916068710589258, 'fraction_numerical': 0.025657751685148944, 'mean_word_length': 2.888419273034658, 'pattern_counts': {'":': 0, '<': 24, '<?xml version=': 0, '>': 36, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '77857', 'license': 'MIT', 'n_tokens_mistral': 2408, 'n_tokens_neox': 2912, 'n_words': 556, 'path': '1.Study/2. with computer/4.Programming/2.Python/3. Study/01_Python/0403_Lecture_python.ipynb', 'repo_name': 'jskim0406/Study', 'size': '4599'}