안녕하세요.
이승혁입니다.
지난 포스팅까지 문자열, 리스트, 딕셔너리를 활용할 수 있는 실습들을 진행했습니다.
포스팅 한 메소드들 외에 여러 메소드들을 활용할 수 있습니다.
아래 주소를 통해 좀더 높은 수준의 학습을 진행할 수 있습니다.
영어로 보기 불편하신 분들은 한글로 바꾸어 학습을 진행하셔도 좋을 것 같습니다.
이번 포스팅할 실습 내용은 문자로된 식을 실행하는 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
compile(source, filename, mode, flag, dont_inherit, optimize)
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)
expr=input('실행할 코드를 입력하세요 : ')
print('입력한 코드의 자료형 :',type(expr))
res=eval(compile(expr,'string','eval'))
print(res)
※ 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 ) 의 문법으로 나타냈습니다.
조금 헷갈리는 부분들이 있는데 익숙해진다면 굉장히 편하게 코드를 작성할 수 있을 것 같습니다.
읽어주셔서 감사합니다.
'프로그래밍 > Python' 카테고리의 다른 글
Python-23) 합성곱 : 파이썬 합성곱, 컨볼루션 연산, python Convolution (12) | 2020.12.25 |
---|---|
Python-22) 지역변수 , 전역변수 : python global (2) | 2020.12.24 |
Python-21) python read, readline, write, writelines : 파이썬 파일 쓰기, 파일 읽기 , python txt (0) | 2020.12.24 |
Python 현재 디렉토리 확인하기 (3) | 2020.12.24 |
Python-19) 딕셔너리 기본값 : defaultdict, setdefault (0) | 2020.12.23 |
Python-18) python 딕셔너리 메소드 : dict keys, values, items (0) | 2020.12.22 |
Python-17) list append, insert, del, remove, len, count : 리스트 객체 메소드, 리스트 메소드, 파이썬 마스터 (0) | 2020.12.21 |
Python-16) 리스트 인덱스, 추출, reverse : Python list , list 객체, 파이썬 리스트 (0) | 2020.12.15 |