프로그램을 작성하면 컴퓨터는 작성된 표현식과 문장을 실행하고 계산된 결과를 변수에 저장해 프로그램을 실행한다. 이는 표현식과 문장을 평가해서 처리하는 것과 같다.
즉시 실행해 결과 출력하기
표현식이나 문장을 바로 계산해서 결과를 반환하거나 내부에 바로 사용할 수 있게 구성하는 것을 탐욕스러운 평가(greedy evaluation) 또는 엄격 평가(eager evaluation)라고 한다.
연속적 변수 할당
연속적인 변수 할당과 변수 참조는 다음과 같이 실행된다.
a = b = c = d = 5
print(a + b + c + d)
print(a.__add__(b).__add__(c).__add__(d))
[결과]
20
20
이처럼 연산자를 연속해서 사용하면 내부적으로 스페셜 메소드를 연속으로 실행해 처리하는 것과 같다.
문자열로 작성된 표현식과 문장 실행
문자열로 작성된 표현식은 컴퓨터에서 프로그램을 문자열로 변환하고 이 문자열을 분해한다. 분해한 문자열이 표현식이면 평가해 결과를 반환한다.
e = "100 + 100"
print(eval(e)) # eval는 문자열 내의 표현식을 실행하는 함수
print(100 + 100)
[결과]
200
200
문자열로 정의된 문자열을 함수 exec에 인자로 전달해 실행하면 아무런 변화가 없지만 모듈 내에 add_변수에 함수 객체를 할당한다. 메모리에 로딩되어 문장을 처리할 준비를 하는 것이다.
s = """
def add_(x, y):
return x + y
"""
exec(s) # exec는 문자열로 만들어진 문장을 실행하는 함수
print(add_(10,10))
[결과]
20
특정 객체를 만든 후에 실행하기
특정 표현식이 실행되면 결괏값을 바로 반환하지 않고 이 값을 호출할 수 있는 값을 반환하는 객체를 핸들러(handler)라고 한다.
이 핸들러를 필요한 시점에 실행해 결과를 반환하는데, 이렇게 처리되는 방식을 지연 평가(Lazy evaluation)라고 하며 보통 파이썬은 동적 객체를 만드는 반복자(lterator)인 경우 핸들러 객체를 반환한다.
반복자 객체의 특징은 모든 원소를 사용하면 다시 객체를 만들어 사용해야 한다.
반복형 객체를 만드는 내장 클래스 range를 사용해 객체를 하나 만들어 보자. 이 반복형의 원소를 하나씩 꺼내기 위해 for문에 넣어 실행하면 해당 객체를 출력한다.
r = range(5) # (0, 1, 2, 3, 4)
for i in r:
print(i)
[결과]
0
1
2
3
4
문자열에 수식을 넣고 계산하기
미지수 변수와 지정되지 않은 변수를 넣어서 수식 처리를 할당해보자.
우선 미지수 변수를 사용해보자. 정상적으로 작동한다.
x = 100
y = "2 * x ** 2 + 4"
print(eval(y))
[결과]
20004
이번에는 아직 할당하지 않은 변수 y를 문자열에 넣은 후 수식을 정의해보자. 문장을 평가할 때 exec 함수를 사용하면 값은 반환되지 않지만 y1를 조회하면 내부에 수식이 처리된 결과가 저장된 것을 알 수 있다.
x = 100
z = "y1 = 2 * x ** 2 + 4"
exec(z) # 문장 실행
print(globals()["y1"]) # 변수가 할당되어 전역 이름공간에서 조회가 가능함
print(y1)
[결과]
20004
20004
참고
- 한권으로 개발자가 원하던 파이썬 심화 A to Z, 문용준/문성혁 저
'◎ Python > 파이썬 심화 (책)' 카테고리의 다른 글
[파이썬 심화] 6. 문서화와 주석으로 꾸미기 (1) | 2022.08.28 |
---|---|
[파이썬 심화] 5. 문장 꾸미기 (0) | 2022.08.27 |
[파이썬 심화] 4. 객체를 생성한 클래스가 자료형이다 (0) | 2022.08.24 |
[파이썬 심화] 2. 파이썬의 모든 값은 객체(object)다 (0) | 2022.08.22 |
[파이썬 심화] 1. 변수에 관한 고찰 (0) | 2022.08.21 |
자기계발 블로그