[python] 문자열 계산하기 - eval
문제
https://school.programmers.co.kr/learn/courses/30/lessons/120902
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문자열로 주어진 식을 계산해서 결과값을 리턴하는 문제이다.
예를들어 "3 + 7" 이 문자열로 주어졌으면 결과값은 10 이어야한다.
나의 풀이
def solution(my_string):
oper = []
nums = []
for i in my_string.split():
if i.isdigit():
nums.append(int(i))
else:
oper.append(i)
oper= oper[::-1]
nums= nums[::-1]
while oper:
o = oper.pop()
a,b = 0,0
if o == '+':
a = nums.pop()
b = nums.pop()
nums.append(a+b)
else:
a = nums.pop()
b = nums.pop()
nums.append(a-b)
return nums[0]
나는 빙구인가 ㅋㅋㅋㅋ.. 이렇게 안 해도 된다 다른 사람들의 풀이를 보니까 파이썬 내장함수 eval를 사용한 사람도 있고
split을 사용해서 풀었던 사람들도 있었다.
인상적인 풀이
1. 내장함수 eval
solution=eval
ㅋㅋㅋㅋㅋㅋ.. 이렇게도 풀릴 수도 있구나
파이썬 공식 문서 eval()을 참고할 수 있는 사이트이다
https://docs.python.org/ko/3/library/functions.html#eval
Built-in Functions
The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order.,,,, Built-in Functions,,, A, abs(), aiter(), all(), a...
docs.python.org
eval은 사용성이 넓고 유용하게 느껴질 수 있지만 이런 자유스러움은 독이 될 수도 있기 때문에 사용을 자제해야한다.
서버의 root 디렉토리의 정보가 그대로 노출될 수도 있다.
eval() 함수는 표현식을 그대로 실행하는 것이기 때문에 Command Injection Flaws를 그대로 노출할 수 있으며 대형 참사로 이어질 수 있다. 이는 시스템 명령을 삽입할 수 있는 스크립트 언어(PHP, Javascript 등)은 모두가 갖고 있는 취약점이다.
뿐만 아니라, eval()명령은 코드의 가독성을 떨어뜨리고 디버깅을 어렵게 만들수 있다. 또한 eval를 사용해 일부 로컬 환경에 의존하도록 구현하면 환경 의존성도 생길 수 있으므로 되도록 사용하지 않는 방향을 권장한다.
eval 사용을 왜 지양해야 하는지 예시와 함께 이해하고 싶다면 아래 사이트를 방문하길 바란다
https://bluese05.tistory.com/64
python eval() 함수 - 사용을 조심해야 하는 이유
python eval() 함수 python 의 built-in 함수 중 하나인 eval 함수는 매우 강력하면서도 사용을 자제 하도록 권고하는 양날의 검과 같은 기능이다. 먼저 python docs 의 정의를 보자. eval(expression, globals=None, loc
bluese05.tistory.com
2. split, replace
def solution(my_string):
return sum(int(i) for i in my_string.replace(' - ', ' + -').split(' + '))
나는 이 풀이가 가장 마음에 들었다.
my_string 문자열에 있는 빼기(' - ')를 숫자에 음수(' + -')로 바꾼 다음, 더하기(' + ') 단위로 나눠서 모든 숫자들을 더한다.
예를들어,
my_string = '3 - 10 + 11' 이 있다면, replace(' - ', ' + -')를 거쳐낸 결과는 아래와 같다.
my_string = '3 + (-10) + 11'
여기서 split('+')을 통과한 결과는 '3', '-10', '11' 이다.
이 값들이 sum연산과 for문을 통해서 다같이 더해져서 4가 된다.