[python] python3 힘들게 배우기 #14
ex38. 파이썬의 명령 실행 과정에 대해서
예전 예제들 중에 list에 append 명령을 이용하여 element를 추가하는 과정을 수행해 본 적이 있다. 이 과정은 정확히 어떻게 이루어지는지 한번 알아보도록 하자.
아래와 같은 빈 리스트에 요소 하나를 추가하는 과정이 있다고 해보자.
myList = []
myList.append('myElement')
print(myList)
위 명령을 수행하면?
['myElemnt']
이렇게 나올 것이다.
이 과정을 자세히 들여다보자.
2번쨰 줄인 myList.append('myElement')
후 엔터키를 치는 순간
-
파이썬은 먼저
myList
를 발견한 후, 해당 변수를 찾기 시작한다. 바로 위에 줄에서 선언해 놓았기 때문에 뒤쪽으로도 찾는다. 여기서는 list지만 이것이 함수든, 글로벌 변수든간에 하여튼 찾기 시작한다. -
myList
가 어떤 것인지 찾은 후에, 뒤에 붙어 있는.
(period) 오퍼레이터를 읽는다..
은 해당 객체의 하위 단계에 있는 variable을 찾게 한다.myList
는 list 객체이므로,myList
는 다양한 function을 갖고 있을 것이다. -
이후
append
를 읽는 순간,append
가myList
가 갖고 있는 variable인지 아닌지 판단한 후에, 갖고 있는 것이 맞다면, 파이썬은 append 명령을 수행한다. -
다음으로
(
(첫번째 괄호)를 읽으면, 파이썬은 ‘이것은 함수로군’하고 깨닫게 된 후, 함수를 실행하기 되지만 이 때 추가 argument 와 함꼐 수행하게 된다. -
추가 argment는 바로…
myList
이다!! 약간 이상하게 들리겠지만, 파이썬이 이렇게 동작한다. 즉 우리가myList.append('myElement')
로 썼음에도 불구하고, 파이썬에서는append(mystuff, 'myElemnt')
로 명령을 수행하는 것이다!!
어떻게 이렇게 되는 것일까? 아직 class
를 배우진 않았지만, 아래 예제를 그냥 한 번 보자.
>>> class Thing(object):
def test(message):
print(message)
>>> a = Thing()
>>> a.test('hello')
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
a.test('hello')
TypeError: test() takes 1 positional argument but 2 were given
마지막 줄을 보자. 분명 실행을 a.test('hello')
라고, argument를 하나만 넣었음에도 불구하고, 2개를 받았다 고 되어있다!! 이는 즉 파이썬이 a.test('hello')
를 자기 멋대로 test(a, 'hello')
로 변경했기 떄문에 생긴 일이다.(그렇다고 test(a, 'hello')
라고 입력해도 된다는 건 아니다.test
를 읽어들이는 순간 파이선은 test
변수(함수)가 선언되어 있지 않기 때문에 에러를 뱉을 것이다.) 지금은 좀 이해가 되지 않겠지만, 앞으로 몇 개의 예제를 따라 하며 해당 개념과 클래스에 대해 배워보자.
아래 예제를 실행해 보자.
#여섯 개의 요소를 가진 리스트를 만들어 볼까요?
List = ['one', 'two', 'three', 'four']
print(List)
#아직 요소가 네 개 뿐이군요...
more_elements = ['five', 'six', 'seven', 'eight']
while len(List) =! 6: #List 개수가 6개가 될 때 까지 무한이 도는 loop
next_element = more_elements.pop()
print("다음 요소를 추가합니다 :", next_element)
List.append(next_element)
print(f"이제 List 요소의 개수는 {len(List)}개입니다.")
print("다 된 것 같군요.")
print("완성된 리스트로 멋진 것을 해 봅시다.")
print(List[1])
print(List[-1]) # -1은 가장 끝 요소 0은 가장 첫 요소임
print(List.pop()) #pop으로 뽑아낸 것만 프린트. pop은 마지막 요소인 seven을 꺼낼 것이다.
print(' '.join(List))
print('#'.join(List[1:3]))
실행하면 아래와 같다.
['one', 'two', 'three', 'four']
다음 요소를 추가합니다 : eight
이제 List 요소의 개수는 5개입니다.
다음 요소를 추가합니다 : seven
이제 List 요소의 개수는 6개입니다.
다 된 것 같군요.
완성된 리스트로 멋진 것을 해 봅시다.
two
seven
seven
one two three four eight
two#three
마지막 세 개 실행을 보았을 때 짐작하겠지만, pop명령은 List 본체를 변형한다. 그러나 join명령을 사용하면 List 의 요소를 이용해 새로운 string을 만들어낼 뿐, 원래의 리스트인 List는 그대로 남아 있다. 그래서 join을 두 번 사용할 수 있었던 것이다.
마지막 명령문에 쓰인 [ : ]은 range( , ) 와 비슷하게 쓰인다. 즉 index 1부터 index 3 이전까지의 요소를 조인하라는 뜻.
댓글남기기