프로그래밍/Python

Python-20) python lambda, map, eval

LeeSeunghyuk 2020. 12. 23. 12:25
반응형

안녕하세요.

이승혁입니다.

 

지난 포스팅까지 문자열, 리스트, 딕셔너리를 활용할 수 있는 실습들을 진행했습니다.

포스팅 한 메소드들 외에 여러 메소드들을 활용할 수 있습니다.

아래 주소를 통해 좀더 높은 수준의 학습을 진행할 수 있습니다.

 

https://docs.python.org/3/

 

3.9.1 Documentation

Python 3.9.1 documentation Welcome! This is the documentation for Python 3.9.1. Parts of the documentation: What's new in Python 3.9? or all "What's new" documents since 2.0 Tutorial start here Library Reference keep this under your pillow Language Referen

docs.python.org

영어로 보기 불편하신 분들은 한글로 바꾸어 학습을 진행하셔도 좋을 것 같습니다.

 

이번 포스팅할 실습 내용은 문자로된 식을 실행하는 eval,exec,comple , 간단한 바로 실행 함수 lambda,

함수 반복 호출하여 값을 대입하는 map 함수에 대한 실습을 진행하겠습니다.

 

※ eval

 

      입력 받은 수식, 문자열을 그대로 코드로 실행해야 할 경우가 존재합니다.

      eval 함수를 사용하면 문자를 그대로 코드로 실행해주어 결과를 반환합니다.

      2+3 과 같은 수식이 문자열일 경우 eval을 사용합니다.

expr=input('실행할 코드를 입력하세요 : ')
print('입력한 코드의 자료형 :',type(expr))
result=eval(expr)
print(result)

     5*10 이라는 수식이 문자열로 입력되었습니다.

     eval 함수를 통해서 계산된 결과를 result에 할당하고, 이를 출력하여 확인합니다.


 

※ exec 

 

     입력받은 수식, 값이 모두 문자일 때 사용합니다.

   

expr=input('실행할 코드를 입력하세요 : ')
print('입력한 코드의 자료형 :',type(expr))
exec(expr)
print(result)

    result = 5*10 이라는 값, 수식 모두 문자인 코드입니다.

    위 경우는 exec 함수를 사용해서 문자열을 실행하고 문자열의 값을 통해 결과를 확인합니다.

    eval 함수를 통해 exec 함수를 사용하는 경우 ( eval을 사용했지만 수식, 값 모두 문자인 경우)

    None이라는 값이 반환됩니다.


※ eval , exec 는 문자열을 숫자 , 연산자로 처리하는 과정에서 많은 부하가 일어난다고 합니다.

    ===> Compile

 

※ compile 

 

    문자를 실행할 수 있는 소스 객체로 반환해주는 함수입니다.

 

    https://www.w3schools.com/PYTHON/ref_func_compile.asp

 

Python compile() Function

Python compile() Function ❮ Built-in Functions Example Compile text as code, and the execute it: x = compile('print(55)', 'test', 'eval') exec(x) Try it Yourself » Definition and Usage The compile() function returns the specified source as a code object

www.w3schools.com

     compile(sourcefilenamemodeflagdont_inheritoptimize)

 

     source : 문자, 바이트, AST객체가 인자로 사용될 수 있으며 실행할 코드입니다.

     filename : 소스가 포함된 파일 명, 주소가 사용될 수도 있습니다.

     mode : eval , exec , single 세 가지 모드로 compile을 진행합니다.

               eval - if the source is a single expression
               exec - if the source is a block of statements
               single - if the source is a single interactive statement

             

 compile('문자열소스','string',mode) 의 경우와, compile('파일명','파일주소',mode)의 경우로 많이 사용하는 것 같습니다.

 

expr=input('실행할 코드를 입력하세요 : ')
print('입력한 코드의 자료형 :',type(expr))
res=exec(compile(expr,'string','exec'))
print(result)

compile을 사용한 exec

 

expr=input('실행할 코드를 입력하세요 : ')
print('입력한 코드의 자료형 :',type(expr))
res=eval(compile(expr,'string','eval'))
print(res)

compile을 사용한 eval


※ lambda

 

     lambda 함수는 일반적으로 정의해서 사용하는 함수가 아닌, 일시적인 함수를 사용할 때 사용합니다.

     해당 조건만 걸러주는 filter, 뒤에서 사용할 map과 함께 유용하게 사용할 수 있는 기능입니다.

     

          일반 함수                                                람다함수

     def 함수이름(인자):                                   lambda 인자 : 표현식

          표현식

 

     간단한 예제 코드입니다.

lambda_func=lambda x:int(x/10)
print(lambda_func(50))

    Python comprehension을 사용한 lambda 사용입니다.

func=[lambda x:x+10,lambda x:x*10,lambda x:x-10]
res=[i(100) for i in func]
print(res)

list=[10,20,30,40]
gop=lambda x:x*10
res=[gop(i) for i in list] 
print(res)


※  map

 

     위에서 배운 lambda 함수를 리스트의 모든 요소에 적용하기 위해서 for문을 사용했습니다.

     파이썬 내장함수 map을 사용하면 편하게 모든 요소에 동일한 함수를 적용할 수 있습니다.

     결과는 map 객체로 반환되기 때문에 list로 변환하여 결과를 확인할 수 있습니다.

 

     map(함수,인자) 문법을 사용합니다

 

list_data=[10,20,30,40]
result=map(lambda x:x*10,list_data)
print('map 객체로 반환됨 -',result)

result2=list(result)
print('list로 형변환 -',result2)

인자가 2개인 경우에도 사용할 수 있습니다.

list_data=[10,20,30,40]
list_data2=[5,25,10,35]
result=map(lambda x,y: x if x>y else y,list_data,list_data2)
print('map 객체로 반환됨 -',result)

result2=list(result)
print('list로 형변환 -',result2)

 

인자는 2개의 리스트 데이터 입니다.

 

lambda 첫번째리스트,두번째리스트 : 첫번째리스트요소 if 첫리스트요소>두번째리스트요소

                                                                        else 두번째리스트요소 , 첫번째 리스트, 두번째 리스트

 

형태로 작성이 된 것입니다. 따라서 람다식은 다음과 같습니다.

 

lambda 출력결과 : 조건식 or 수식 

lambda listdata,listdata2 : listdata if listdata>listdata2
                                            else listdata2

이 람다식을 사용한 map함수 작성은 다음과 같습니다,

result=map(lambda x,y: x if x>y 
                          else y,list_data,list_data2)

map ( 람다함수, 인자1, 인자2 ) 의 문법으로 나타냈습니다.

 

조금 헷갈리는 부분들이 있는데 익숙해진다면 굉장히 편하게 코드를 작성할 수 있을 것 같습니다.

 

읽어주셔서 감사합니다.

 

반응형