For문 list 출력 - formun list chullyeog

for n in list 이해

Prerequisites (미리 알아야 할 것들)

변수, 리스트 등등 주로 Python 배울 때 for문 이전에 오는 내용은 사전에 마스터한 후에 이 포스팅을 보시기 바랍니다. 포스팅 요청은 댓글로!

Like, subscribe, comment, retweet, et cetera, et cetera.

For문 쉽네

우선 for문의 가장 기본적인 형태부터 살펴볼게요

list = [ 1, 2, 3 ]for n in list:
print(n)

이런 간단한 for문은 영어 그대로 읽어서 이해하실 수 있을 거에요 — “L 내의 모든 수 n에 대해서, n을 출력하라”. 수학 전공 과목에서 쓰는 문법과 동일하죠?

말 그대로 다음과 같은 출력이 나올 겁니다.

1
2
3

쉬워 쉬워~

그러면 L내의 모든 원소를 제곱시키는 코드를 짜볼까요?

list = [ 1, 2, 3 ]for n in list:
n = n ** 2
print(list)

이러면 되겠죠? 요것도 영어 그대로 읽으면 — “L 내의 모든 수 n에 대해서, n을 제곱시켜라”. 그럼 출력을 확인해 볼까요?

[ 1, 2, 3 ]

???: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

For문 어렵네

사실 L내의 모든 원소를 제곱시키는 코드는 이겁니다.

list = [ 1, 2, 3 ]
i = 0
for n in list:
L[i] = n ** 2
i += 1

멘붕이 오죠!

멘붕이 온다고 가정하고 설명할게요 — 왔다고 가정하고 들어주세요. 호호

이렇게 for문이 조금만 복잡해지면 그 의미가 자연스럽게 와닿지가 않아요😔. 이럴 때는 for문을 이과 style로 명.확.하.게 분석해야 깔끔하게 이해할 수 있습니다. 아까 본 간단한 예제부터 다시 살펴볼게요!

For문: 이과 style

사실 for문은 반본적인 코드를 짧고 심플하게 쓸 수 없을까 하는 고민에서 나온 겁니다. 그러면 아까 본 예시는 어떤 코드를 짧게 쓸려고 한걸까요?

list = [ 1, 2, 3 ]# 아까 본 예시 (짧고 심-플)
for n in list:
print(n)
# 는 이걸 짧게 쓸려고 한거에요! (깔-끔하고 반복적)
n = list[0]
print(n)
n = list[1]
print(n)
n = list[2]
print(n)

바로 이겁니다! 단순히 이해 돕기 위해 비유적으로 나타낸 코드가 아닙니다. for문을 사용한 위쪽의 짧-고 심플한 코드와 그 아래쪽의 깔-끔하고 반복적인 코드완벽히 똑같은 코드입니다.

어려운 for문을 처음 접할 때는 깔-끔하고 반복적인 코드를 생각하면서 분석하는게 좋아요. 코드가 길긴 하지만 익숙하니까요. 그리고 6–7번 정도 해보면 눈으로만 봐도 자연스럽게 이해할 수 있는 수준이 되실 겁니다.

한 6–7번, 길어도 2시간이잖아요? 한 학기는 2880시간~💃🕺

반복 연습 1

자 그럼, 아까 본 틀린 원소 제곱 코드를 깔-끔하게 살펴볼게요.

list = [ 1, 2, 3 ]# 심-플
for n in list:
n = n ** 2
# 깔-끔
n = list[0]
n = n ** 2
n = list[1]
n = n ** 2
n = list[2]
n = n ** 2
print(list)

이걸 보면 list가 왜 변하지 않았는지 아시겠죠? 저희는 n 친구만 가지고 놀았던 겁니다 😔

정말?

저한테 물어보지 말고 우리의 뱀* 친구한테 물어보세요! 코드가 여기를 지날 때 이 변수의 값이 뭐지? 궁금증이 들면 print(“설명”, 변수)를 넣고 돌려보시면 됩니다.

list = [ 1, 2, 3 ]for n in list:
print("n1:", n)
n = n ** 2
print("n2:", n)
print(list)

출력 결과

n1: 1
n2: 1
n1: 2
n2: 4
n1: 3
n2: 9
[ 1, 2, 3 ]

*Python은 본래 비단뱀이라는 뜻입니다.

반복 연습 2

이제 좀 더 어려운 원소 제곱 코드를 살펴볼게요. 제대로 돌아가는 걸로.

list = [ 1, 2, 3 ]# 심-플
i = 0
for n in list:
list[i] = n ** 2
i += 1
# 깔-끔
i = 0
n = list[0]
list[i] = n ** 2
i += 1
n = list[1]
list[i] = n ** 2
i += 1
n = list[2]
list[i] = n ** 2
i += 1

우선 코드를 직접 이해해보시고 설명을 읽어주세요!

간단히 설명드리기 전에 용어만 몇가지 정하고 갈게요. 리스트 내의 숫자 list[0], list[1], list[2]를 원소라고 부르고, 그 원소들이 리스트 상에 있는 위치 0, 1, 2를 인덱스라고 부르겠습니다.

for문 친구가 n에다가 list의 원소들을 하나하나 넣어주는 덕분에 저희는 n ** 2으로 원소의 제곱을 구할 수 있어요. 그런데, 그 제곱값을 다시 list에 넣어주려면 어디에 넣을지 list[인덱스] 이렇게 지정해줘야 하잖아요! 그 인덱스는 for문 친구가 알아서 만들어주지 않아요 😔. 그래서 저희가 인덱스로 쓰기 위해 i라는 변수를 만들고 1씩 더해줬어요.

for문 파악 팁

Python 코드가 실행되는 과정은 이렇게 생각하시면 됩니다. 프로그램을 실행하면, 우리 뱀 친구가 코드의 실행 순서에 맞게 코드를 한줄 한줄 읽는 겁니다.

뱀 친구의 눈길

그래서 뱀 친구의 눈길을 우리가 그대로 따라가면 복잡한 for문도 확실하게 이해할 수 있습니다.

핵 발전에도 Python은 쓰입니다. PyRK: A Python Package For Nuclear Reactor Kinetics

이렇게 실행 순서를 따라 화면 상의 코드를 한줄 한줄 짚어보세요. 그 과정에서 이 변수 저 변수가 어떻게 변하는지 따라가보면 코드가 하는 일을 명확하게 파악할 수 있습니다. 시간은 조금 걸려요.

사실 좋은 코드는 이렇게 하지 않아도 한 눈에 파악하기 쉬운 코드입니다.

불쌍한 for문 친구

아까 본 코드의 깔-끔한 버젼 다시 살펴볼게요

i = 0
n = list[0]
list[i] = n ** 2
i += 1
n = list[1]
list[i] = n ** 2
i += 1
n = list[2]
list[i] = n ** 2
i += 1

이 코드를 보면 사실 for문 친구한테 미안해지죠 😔. 어차피 i 인덱스 변수 만들거면서 list[i] ** 2를 쓰면 되지 굳이 list 원소 가져와서 n에 넣어달라고 하고 말이죠.

조별과제에서 자료 조사해왔더니 PPT 만드는 친구가 그 자료 쓰지도 않는 꼴.

사실 PPT 만든 친구가 가장 불쌍하죠. ‘제가 자료 조사할게요’ ㅇㅅㄹ (이소리).

그냥 for문 친구한테 처음부터 i 인덱스를 가져와달라고 하는건 어떨까요?

index_list = [ 0, 1, 2 ]i = index_list[0]
list[i] = list[i] ** 2
i = index_list[1]
list[i] = list[i] ** 2
i = index_list[2]
list[i] = list[i] ** 2

요렇게. 참고로, i = 0 이렇게 안하고 i = index_list[0]로 쓴 이유는 뭘까요? for문 친구는 리스트 내의 원소를 가져오는 것만 알아요.

바보야, 내겐 너 리스트 뿐이야 🎵

그래서 위와 같이 코드르 짜야만…

for i in [ 0, 1, 2 ]:
list[i] = list[i] ** 2

이렇게 for문으로 심-플하게 바꿀 수 있어요!

그런데 리스트 길이가 항상 3은 아니잖아요? 그러면 0부터 <리스트의 크기> - 1까지의 숫자를 담은 리스트는 어떻게 만들까요? 두 가지 함수를 사용하면 됩니다.

  1. 리스트의 크기를 구하는 함수 len(list)
  2. 0부터 N-1까지의 리스트를 만들어주는 함수 range(N)

for문의 새로운 형태

for i in range(len(list)):
list[i] = list[i] ** 2

두 개의 함수를 활용하면 이렇게 짤 수 있겠죠! 💃🕺

list = [ 1, 2, 3 ]
i = 0
for n in list:
list[i] = n ** 2
i += 1
print(list)

즉, 이 코드와

list = [ 1, 2, 3 ]
for i in range(len(list)):
list[i] = list[i] ** 2
print(list)

이 코드도 완벽히 똑같은 코드입니다. 아래쪽이 더 깔끔해 보이죠?

그래서 인덱스가 필요한 경우에는 이러한 형태의 for문을 주로 사용하게 됩니다. 원본 list를 수정하는 경우에도 쓰일 수 있고, 인덱스를 함께 출력하는 경우, list 내에서 값을 옮기는 경우 등등 다양하게 사용됩니다.

정리

1. 리스트 원소만 필요한경우

for n in list:

2. 리스트 인덱스까지 필요한 경우

for i in range(len(list)):

3. 코드 분석할 때 뱀 친구 따라 한줄씩 읽자

4. 많은 코드를 읽어보자

수고하셨습니다 💃🕺

Toplist

최신 우편물

태그