Chapter04 반복문 (4-1 리스트와 반복문)

lasso·2021년 5월 11일
0

Chapter04 반복문

💡 학습 목표

  • 리스트, 딕셔너리, 범위를 이해합니다.
  • for 반복문과 리스트, 딕셔너리, 범위를 조합하는 방법을 배웁니다.
  • while 반복문을 배웁니다.
  • break 키워드와 continue 키워드를 이해합니다.

4-1 리스트와 반복문

리스트 요소 인데스 for 반복문
지금까지 살펴보았던 문자열, 숫자, 불 등은 어떤 하나의 값을 나타내는 자료형입니다. 이와 반대로 여러 개의 값을 나타낼 수 있게 해주는 자료형이 있습니다. 리스트, 딕셔너리 등이 대표적입니다. 이번 절에서는 리스트에 대해 알아보고 이러한 자료들이 컴퓨터가 사람보다 뛰어나다고 하는 능력 중의 하나로 꼽히는 '반복문'에 의해 어떻게 활용되는지 알아보겠습니다.

시작하기 전에

리스트란 무엇일까요? 우리가 알고 있는 사전적 의미는 '목록'이며, 파이썬에서 리스트의 의미는 여러가지 자료를 저장할 수 있는 자료입니다. '자료를 저장할 수 있는 자료'라고 하니 무슨 말인지 의아해할 수도 있는데, 지금까지 활용한 숫자나 문자, 수식 등이 개별적인, 독립적인 '자료'였다면 리스트는 이러한 자료들을 모아서 사용할 수 있게 해주는 특별한 형태의 자료를 말합니다.

다음 코드는 여섯 개의 자료를 가진 리스트를 선언한 예입니다. 리스트는 대괄호[] 내부에 여러종류의 자료를 넣어 선언합니다. 선언한 리스트를 출력하면 내부의 자료를 모두 출력합니다.

>>> array = [273, 32, 104, "문자열", True, False]
>>> print(array)
[273, 32, 104, '문자열', True, False]

리스트 선언하고 요소에 접근하기

파이썬에서 리스트를 생성하는 방법은 다음과 같이 대괄호[]에 자료를 쉼표로 구분해서 입력합니다. 내부에 넣는 자료를 요소라고 하고 영어로는 element 라고 부릅니다. 두 가지 모두 자주 언급되는 용어이니 기억해 두세요.

[요소, 요소, 요소, ... ]

그럼 간단하게 리스트를 생성해 보겠습니다. 리스트는 한 가지 자료형만을 구성할 수도 있고, 여러 종류의 자료형으로 구성할 수도 있습니다. 프롬프트에 리스트를 입력하면 리스트 내부의 자료를 보두 출력하는 모습을 볼 수 있습니다.

>>> [1, 2, 3, 4]   # 숫자로만 구성된 리스트
[1, 2, 3, 4]
>>> ["안", "녕", "하", "세", "요"]   # 문자열로만 구성된 리스트
['안', '녕', '하', '세', '요']
>>> [273 ,32, 103, "문자열", True, False]   #여러 자료형으로 구성된 리스트
[273, 32, 103, '문자열', True, False]

리스트 안에 있는 요소를 각각 사용하려면 리스트 일므 바로 뒤에 대괄호[]를 입력하고, 자료의 위치를 나타내는 숫자를 입력합니다.

다음과 같이 리스트를 선언했다면,

list_a = [273 ,32, 103, "문자열", True, False]

각각의 요소는 다음과 같은 형태로 저장되는데, 일반적으로 현실에서는 숫자를 1부터 세지만, 문자열 때처럼 파이썬은 0부터 셉니다. 각 요소가 들어있는 위치는 다음과 같습니다.

list_a

27332103문자열TrueFalse
[0][1][2][3][4][5]

이때 리스트 기호인 대괄호[]안에 들어간 숫자를 인덱스라고 부릅니다. '요소'와 '인덱스'라는 이름을 꼭 기억해 주세요. 앞으로 자주 사용할 용어입니다.

>>> list_a = [273 ,32, 103, "문자열", True, False]
>>> list_a[0]
273
>>> list_a[1]
32
>>> list_a[2]
103
>>> list_a[1:3]   # 1~2까지만 출력!
[32, 103]

list_a[1:3]의 [1:3]은 문자열 범위 선택 연산자에서 설명했듯이 1번째 글자부터 3번째 글자를 선택하는 것이 아니라 그 앞에 숫자, 2번째 글자까지 선택합니다. 그래서 결과는 [32, 103]이 출력됩니다.

리스트의 특정 요소는 변경할 수도 있습니다. 다음과 같이 입력하면 "변경"이라는 문자열을 0번째에 대입하면서 요소를 변경하고 있습니다.

>>> list_a = [273 ,32, 103, "문자열", True, False]
>>> list_a[0] = "변경"
>>> list_a
['변경' ,32, 103, '문자열', True, False]

list_a 0번째 요소 변경됨

변경32103문자열TrueFalse
[0][1][2][3][4][5]

리스트는 위와 같은 일반적인 사용법 외에도 다양하게 사용할 수 있는 방법이 많은데, 그 부분을 살펴보겠습니다.

첫째, 대괄호 안에 음수를 넣어 뒤에서부터 요소를 선택할 수 있습니다.

문자열을 살펴보면서 문자열의 뒤에서부터 문자를 선택하는 방법에 대해 배웠습니다. 리스트도 마찬가지로 대괄호 안에 음수를 넣어 뒤에서부터 요소를 선택할 수 있습니다.

>>> list_a = [273 ,32, 103, "문자열", True, False]
>>> list_a[-1]
False
>>> list_a[-2]
True
>>> list_a[-3]
'문자열'
27332103문자열TrueFalse
[-6][-5][-4][-3][-2][-1]

둘째, 리스트 접근 연산자를 다음과 같이 이중으로 사용할 수 있습니다.

아래와 같은 리스트가 있다고 할 때 list_a[3]을 지정하면 "문자열"을 꺼내오고 list_a[3][0]을 지정하면 3번째에서 가져온 "문자열"에서 다시 0번째를 가져와 출력합니다.

>>> list_a = [273 ,32, 103, "문자열", True, False]
>>> list_a[3]
'문자열'
>>> list_a[3][0]
'문'

셋째, 리스트 안에 리스트를 사용할 수도 있습니다.

아래와 같이 기술하면 list_a는 세 개를 가지는 리스트로 만들어집니다.

>>> list_a = [[1, 2, 3], [4, 5, 6],[7, 8, 9]]
>>> list_a[1]
[4, 5, 6]
>>> list_a[1][1]
5

☑️ 리스트에서의 IndexError 예외

문자열에서 IndexError 예외를 살펴보았습니다. 이번에는 리스트에서의 IndexError 예외를 살펴보겠습니다. 이 예외는 리스트의 길이를 넘는 인덱스로 요소에 접근하려고 할 때 발생하는 예외입니다. 요소가 존재하지 않는 위치에서 요소를 꺼내려고 하니 예외가 발생하는 것입니다.

다음 코드를 실행하면,

>>> list_a = [273, 32, 103]
>>> list_a[3]

아래와 같이 IndexError가 발생합니다.

IndexError               Traceback (most recent call last)
<ipython-input-11-00fdb33c6bd6> in <module>
      1 list_a = [273, 32, 103]
----> 2 list_a[3]

IndexError: list index out of range

리스트 연산자 : 연결(+), 반복(*), len()

이전에 문자열에 적용할 수 있는 연산자는 리스트에서도 활용할 수 있으니 꼭 기억해 달라고 언급했습니다. 문자열과 리스트는 굉장히 비슷한 자료형으로, 사용할 수 있는 연산자와 함수가 비슷합니다. 리스트 연산자를 손코딩으로 살펴보겠습니다.

👉 리스트 연산자

소스코드 list01.py

# 리스트를 선언합니다.
list_a = [1, 2, 3]
list_b = [4, 5, 6]

# 출력합니다.
print("# 리스트")
print("list_a =", list_a)
print("list_b =", list_b)
print()

# 기본 연산자
print("# 리스트 기본 연산자")
print("list_a + list_b =", list_a + list_b)
print("list_a * 3 =", list_a * 3)
print()

# 함수
print("# 길이 구하기")
print("len(list_a) =", len(list_a))

## 실행 결과
# 리스트
list_a = [1, 2, 3]
list_b = [4, 5, 6]

# 리스트 기본 연산자
list_a + list_b = [1, 2, 3, 4, 5, 6]
list_a * 3 = [1, 2, 3, 1, 2, 3, 1, 2, 3]

# 길이 구하기
len(list_a) = 3

2행과 3행은 list_a와 list_b에 리스트를 선언합니다.

list_a = [1, 2, 3]
list_b = [4, 5, 6]

7행과 8행은 선언된 리스트를 출력하고,

print("list_a =", list_a)   # list_a = [1, 2, 3]
print("list_b =", list_b)   # list_b = [4, 5, 6]

그런 다음 13행에서는 문자열 연결 연산자 +를 사용해 list_alist_b의 자료를 연결합니다. 14행에서는 문자열 반복 연산자를 사용해 list_a의 자료를 3번 반복합니다.

print("list_a + list_b =", list_a + list_b)  # [1, 2, 3, 4, 5, 6]
print("list_a * 3 =", list_a * 3)  # [1, 2, 3, 1, 2, 3, 1, 2, 3]

len() 함수는 괄호 내부에 문자열을 넣으면 문자열의 글자 수(=길이)를 세어 주지만, 리스트 변수를 넣으면 요소의 개수를 세어줍니다. 19행은 list_a에 들어있는 요소의 개수를 구합니다.

print("len(list_a) =", len(list_a))  # len(list_a) = 3

문자열에 연산자를 적용할 때와 비슷한 결과를 출력하므로 쉽게 이해할 수 있을 것입니다.


리스트에 요소 추가하기 : append, insert

리스트에 요소를 추가할 때는 두 가지 방법이 있습니다. 한가지는 append() 함수를 활용하는 것으로, 리스트 뒤에 요소를 추가합니다.

리스트명.append(요소)

다른 한 가지는 insert() 함수를 사용하는 것으로 리스트의 중간에 요소를 추가합니다.

리스트명.insert(위치, 요소)

실제 코드를 보면서 어떻게 사용하는지 살펴보겠습니다.

👉 리스트에 요소 추가하기

소스코드 list02.py

# 리스트를 선언합니다
list_a = [1, 2, 3]

# 리스트 뒤에 요소 추가하기
print("# 리스트 뒤에 요소 추가하기")
list_a.append(4)
list_a.append(5)
print(list_a)
print()

# 리스트 중간에 요소 추가하기
print("# 리스트 중간에 요소 추가하기")
list_a.insert(0,10)
print(list_a)

## 실행 결과
# 리스트 뒤에 요소 추가하기
[1, 2, 3, 4, 5]

# 리스트 중간에 요소 추가하기
[10, 1, 2, 3, 4, 5]

2행의 실행문은 list_a에 넣을 자료를 선언합니다. 자료를 선언하고 나면 자료는 다음과 같은 형태로 저장되겠죠.

list_a = [1, 2, 3]
123
[0][1][2]

append() 함수는 현재의 리스트 뒤쪽에 요소를 추가하는 것으로, 6행이 실행되면 list_a에는 4가 추가되고, 7행이 실행되면 5가 추가됩니다. 그 결과, list_a = [1, 2, 3, 4, 5] 가 됩니다.

list_a.append(4)
list_a.append(5)
12345
[0][1][2][3][4]

그에 반해 13행의 insert() 함수는 괄호 안에서 정해 준 위치에 요소를 삽입하며, 이때 해당 위치의 요소는 뒤로 하나씩 밀립니다. 그 결과 list_a = [10, 1, 2, 3, 4, 5]가 됩니다.

list_a.insert(0, 10)  # (삽입할 위치, 삽입할 값)
1012345
[0][1][2][3][4][5]

append() 함수와 insert() 함수는 리스트에 요소 하나를 추가합니다. 한 번에 여러 요소를 추가하고 싶을 때는 extend() 함수를 사용합니다. extend() 함수는 매개변수로 리스트를 입력하는데, 원래 리스트 뒤에 새로운 리스트의 요소를 모두 추가해 줍니다.

>>> list_a = [1, 2, 3]
>>> list_a.extend([4, 5, 6])
>>> print(list_a)
[1, 2, 3, 4, 5, 6]

extend() 함수는 마치 append() 함수를 세 번 반복 실행한 효과를 가져옵니다.

☑️ 리스트 연결 연산자와 요소 추가의 차이

리스트 연결 연산자와 extned() 함수는 비슷한 형태로 동작합니다. 리스트와 리스트를 연결한다는 기능은 동일한데, 한 가지 큰 차이점이 있습니다.
다음 코드를 살펴보겠습니다.

>>> list_a = [1, 2, 3]
>>> list_b = [4, 5, 6]
>>> list_a + list_b  # 리스트를 연결 연산자로 연결하니,
[1, 2, 3, 4, 5, 6]  # 실행결과로 [1, 2, 3, 4, 5, 6]이 나왔습니다.
>>> list_a  # list_a와 list_b에는 어떠한 변화도 없습니다. (비파과적 처리)
[1, 2, 3]
>>> list_b
[4, 5, 6]

리스트 연결 연산자는 연산 결과로 [1, 2, 3, 4, 5, 6]을 출력하고 있으며, 원본에 어떠한 변화도 없다는 것을 확인할 수 있습니다. 이어서 extned() 함수를 사용해 보겠습니다.

list_a = [1, 2, 3]
list_b = [4, 5, 6]
list_a.extend(list_b)  # 실행 결과로 아무것도 출력하지 않았습니다.
list_a  # 앞에 입력했던 list_a 자체에 직접적인 변화가 있습니다 (파괴적 처리)
[1, 2, 3, 4, 5, 6] 
>>> list_b 
[4, 5, 6]

리스트 연결 연산자 list_a + list_b 만으로는 list_a에 어떠한 영향도 주지 않습니다. 하지만 extend() 함수를 사용하면 list_a에 직접적으로 영향을 줍니다. 리스트와 같이 원본에 어떠한 영향도 주지 않는 것을 비파괴적이라고 표현하고, append(), insert(), extend() 함수와 같이 리스트에 적접적인 영향을 주는 함수 또는 연산을 파괴적이라고 표현합니다.

원래 자료는 비파괴적으로 사용하는 것이 편리합니다. 비파괴적으로 사용하면 원본도 활용할 수 있고, 새로운 결과도 활용할 수 있으므로 선택지가 더 넓기 때문입니다. 그래서 기본적인 모든 것들은 비파괴적으로 작동합니다.

하지만 리스트는 용량이 매우 클 수도 있습니다. 프로그래밍 언어 입장에서 용량이 얼마나 큰지도 모르는 것을 '원본과 결과'라는 두 가지로 생성하는 것은 위험할 수 있습니다. 그래서 파이썬 프로그래밍 언어는 원본을 직접적ㅇ르ㅗ 조작하는 기능을 제공해서 이러한 위험을 피하는 것입니다.

어떤게 파괴적이고 어떤게 비파괴적인지 헷갈릴 때는 위와 같이 직접 하나하나 입력해서 원본에 변화가 있는지 없는지 확인하는 것이 좋습니다.


리스트에서 요소 제거하기

파이써은 리스트에서 요소를 제거하는 방법이 많습니다. 리스트에서 요소를 제거하는 방법은 크게 두 가지로 나타압니다.

  • 인덱스로 제거하기
  • 값으로 제거하기

각각의 방법에 대해 알아보겠습니다.

☑️ 인덱스로 제거하기 : del, pop

인덱스로 제거한다는 것은 '리스트의 1번째 요소를 제러해 주세요', '리스트의 2번째 요소를 제거해 주세요'처럼 요소의 위치를 기반으로 요소를 저가하는 것입니다. del 키워드 또는 pop() 함수를 사용합니다.

del 키워드는 다음과 같은 구문을 사용하며, 리스트의 특정 인덱스에 있는 요소를 제거합니다.

del 리스트명[인덱스]

pop() 함수 또한 제거할 위치에 있는 요소를 제거하는데, 매개변수를 입력하지 않으면 마지막 요소를 제거합니다.

리스트명.pop(인덱스)

👉 리스트 연결 연산자와 요소 추가의 차이

소스코드 list03.py

list_a = [0, 1, 2, 3, 4, 5]
print("# 리스트의 요소 하나 제거하기")

# 제거 항법[1] - del
del list_a[1]
print("del list_a[1] : ", list_a)

# 제거 방법[2] - pop()
list_a.pop(2)
print("list_a.pop(2) : ", list_a)

## 실행 결과
# 리스트의 요소 하나 제거하기
del list_a[1] :  [0, 2, 3, 4, 5]
list_a.pop(2) :  [0, 2, 4, 5]

코드를 실행해 보니 1번째 요소와 2번째 요소가 제거됩니다. 제거되는 과정을 한번 살펴보겠습니다. 1행을 실행하면 list_a 자료가 다음과 같이 저장됩니다.

list_a = [0, 1, 2, 3, 4, 5]
012345
[0][1][2][3][4][5]

5행의 del 키워드가 가리키는 인덱스가 1번째이므로, 1이 제거되고 [0, 2, 3, 4, 5]를 출력합니다.

del list_a[1]
02345
[0][1][2][3][4]

9행에서는 2번째 요소를 제거하라고 했으므로 3이 제거되고 [0, 2, 4, 5]를 출력합니다. 미세한 동작 차이가 있지만, 요소를 제거하기 위한 목적으로만 사용되는 경우가 많아서 'pop() 함수를 사용했을 때는 해당 인덱스의 요소가 출력된다' 등은 무시해도 괜찮습니다.

list_a.pop(2)
0245
[0][1][2][3]

pop() 함수의 매개변수에 아무 것도 입력하지 않으면 자동으로 -1이 들어가는 것으로 취급해서 마지막 요소를 제거합니다.

추가로 del 키워드를 사용할 경우에는 범위를 지정해 리스트의 요소를 한꺼번에 제거할 수도 있습니다. [3:6]을 지정하면 마지막 요소를 포함하지 않는다는 것을 다시 한번 기억해 주세요.

>>> list_b = [0, 1, 2, 3, 4, 5, 6]
>>> del list_b[3:6]
>>> list_b
[0, 1, 2, 6]

범위의 한쪽을 입력하지 않으면 지정한 위치를 기준으로 한쪽을 전부 제거해 버릴 수도 있습니다. [:3]을 지정하면 3을 기준(3번째 불포함)으로 왼쪽을 모두 제거합니다.

>>> list_c = [0, 1, 2, 3, 4, 5, 6]
>>> del list_c[:3]
>>> list_c
[3, 4, 5, 6]

[3:]을 지정하면 3을 기준 (3번째 포함)으로 오른쪽 모두를 제거합니다.

>>> list_d = [0, 1, 2, 3, 4, 5, 6]
>>> del list_d[3:]
>>> list_d
[0, 1, 2]

☑️ 값으로 제거하기 : remove

두 번째 방법은 값으로 제거하는 것입니다. 말 그대로 '리스트 내부에 있는 2를 제거해 주세요'처럼 값을 지정해서 제거하는 것입니다. 이때는 remove() 함수를 사용합니다.

리스트.remove()

간단하게 사용해 볼까요?

>>> list_c = [1, 2, 1, 2]  # 리스트 선언하기
>>> list_c.remove(2)   # 리스트의 요소를 값으로 제거하기
>>> list_c
[1, 1, 2]

remove() 함수로 지정한 값이 리스트 내부에 여러 개 있어도 가장 먼저 발견되는 하나만 제거합니다. 위의 예제를 보면 리스트에 2가 두 개 있는데, 하나만 제거했습니다. 앞쪽에 있는 2가 제거된 것입니다.

만약 리스트에 중복된 여러 개의 값을 모두 제가하려면 반복문과 조합해서 사용해야 합니다.

☑️ 모두 제거하기 : clear

리스트 내부의 요소를 모두 제거할 때는 clear() 함수를 사용합니다.

리스트.clear()

간단한 함수이므로 쉽게 이해할 수 있습니다.

>>> list_d = [0, 1, 2, 3, 4, 5]
>>> list_d.clear()
>>> list_d
[]   # 요소가 모두 제거되었습니다.

프로그래밍 언어에서는 내부에 있는 모든 것을 제거할 때 항상 clear라는 이름을 사용합니다. 이는 리스트뿐만 아니라 이후에 살펴보는 딕셔너리에도 해당되며, 웹 개발, 인공지능 개발 등을 할 때도 많이 사용하므로 clear는 모두 제거할 때 사용한다고 꼭 기억해 주세요

지금까지 살펴보았던 모든 리스트의 함수들은 파괴적으로 동작합니다. 다시 한번 코드를 보면서 원본이 변화된 것을 느껴보면 좋을 것 같습니다.


리스트 내부에 있는지 확인하기 : in/not in 연산자

파이썬은 특정 값이 리스트 내부에 있는지 확인하는 방법을 제공합니다. 바로 in 연산자를 활용하는 방법입니다. 아래와 같은 형식으로 사용됩니다.

in 리스트

많이 사용되는 코드입니다. 바로 코드를 살펴보며 어떻게 사용하는지 알아보겠습니다.

>>> list_a = [123, 23, 234, 121, 332, 43]
>>> 332 in list_a
True
>>> 99 in list_a
False
>>> 34 in list_a
False
>>> 43 in list_a
True

리스트 내부에 값이 있으면 True, 없으면 False를 출력한다는 것을 쉽게 확인할 수 있습니다. 추가적으로 not in 연산자는 리스트 내부에 해당 값이 없는지 확인하는 연산자입니다. in 연산자와 정확하게 반대로 동작합니다.

>>> list_a = [123, 23, 234, 121, 332, 43]
>>> 332 not in list_a
False
>>> 99 not in list_a
True
>>> 34 not in list_a
True
>>> 43 not in list_a
False
>>> not 34 in list_a
True

지금까지 리스트와 관련된 기본적인 내용을 살펴보았습니다. 이외에도 리스트에는 셀 수 없을 만큼 많은 기능이 있습니다. 순열과 조합을 만드는 기능과 행렬 연산을 하는 등의 수학적인 기능도 있는데요. 지금까지 배운 기본적인 내용을 확실하게 알아야 이후에 인공지능 등을 공부할 때 막힘없이 리스트를 더 공부할 수 있습니다. 따라서 지금까지 살펴본 내용 정도는 꼭 기억해 주세요.


for 반복문

컴퓨터가 사람보다 월드잏 뛰어난 능력이 있다면 바로 '반복'입니다. 아무리 반복해도 컴퓨터는 지루해 하지도, 능률이 떨어지지도 않습니다. 컴퓨터에 반복을 지시하는 방법이 바로 반복문 입니다.

컴퓨터에 반복 작업을 시키는 방법은 간단합니다. 반복할 작업 내용이 있는 코드를 '복사'하고, 원하는 만큼 '붙여넣기'하면 됩니다. 예를 들어, 다음 코드는 출력을 다섯 번 반복합니다.

print("출력")
print("출력")
print("출력")
print("출력")
print("출력")

하지만 100번, 1,000번 또는 무한하게 반복 작업하고 싶을 때 코드를 계속 붙여넣기하는 것은 무리입니다. 이럴 때 반복문을 사용하면 매우 편리합니다. 예를 들어 다음 코드는 출력을 100번 반복합니다.

for i in range(100) :
    print("출력")

앞서 배운 여러 개의 값을 나타낼 수 있게 해주는 리스트와 같은 자료를 사용해서 반복문을 적용하는 것이 반복문의 기본입니다. 그럼 본격적으로 반복문에 대해 살펴보겠습니다.


for 반복문 : 리스트와 함께 사용하기

for 반복문의 기본 형태는 다음과 같습니다.

for 반복자 in 반복할 수 있는 것 :
    코드

반복할 수 있는 것에는 문자열, 리스트, 딕셔너리, 범위 등이 있습니다. 지금까지 리스트를 살펴보았으니 리스트와 조합해서 사용해 보겠습니다.

👉 for 반복문과 리스트

소스코드 for_list.py

# 리스트를 선언합니다.
array = [123, 23, 122, 334, 24]

# 리스트에 반복문을 적용합니다.
for element in array : 
    # 출력합니다
    print(element)
    
# 실행 결과
123
23
122
334
24

for 반복문은 리스트에 있는 요소 하나하나가 element라는 변수에 들어가며, 차례차례 반복하게 됩니다. print() 함수로 element를 출력하므로 리스트의 요소를 차례차례 출력하게 되는 것입니다.

여기서 잠깐! for 반복문과 문자열
for 반복문은 문자열을 함께 사용할 수도 있습니다. 문자열을 for 반복문 뒤에 넣으면 글자 하나하나에 반복이 적용됩니다. 실행 결과를 보면 어떤 식으로 실행되는지 쉽게 이해할 수 있을 겁입니다.

for character in "안녕하세요" :
    print("-", character)
# 실행 결과
-----

마무리

🔍 4가지 키워드 핵심 포인트

  • 리스트는 여러 가지 자료를 저장할 수 있는 자료형을 말합니다.
  • 요소는 리스트 내부에 있는 각각의 내용을 의미합니다.
  • 인덱스는 리스트 내부에서 값의 위치를 의미합니다.
  • for 반복문은 특정 코드를 반복해서 실행할 때 사용하는 기본적인 구문입니다.

🔍 확인문제

1. list_a = [0, 1, 2, 3, 4, 5, 6, 7] 입니다. 다음 표의 함수들을 실행했을 때 list_a의 결과가 어떻게 나오는지 적어 보세요.

함수list_a의 값
list_a.extend(list_a)[0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7]
list_a.append(10)[0, 1, 2, 3, 4, 5, 6, 7, 10]
list_a.insert(3,0)[0, 1, 2, 0, 3, 4, 5, 6, 7]
list_a.remove(3)[0, 1, 2, 4, 5, 6, 7]
list_a.pop(3)[0, 1, 2, 4, 5, 6, 7]
list_a.clear[]

2. 다음 반복문 내부에 if 조건문의 조건식을 채워서 100 이상의 숫자만 출력하게 만들어 보세요. for 반복문을 조합하는 코드는 굉장히 많이 사용합니다.

numbers = [273, 103, 5, 32, 65, 9, 72, 800, 99]
for number in numbers :
    if number >= 100 :
        print("- 100 이상의 수 : {}".format(number))
        
# 실행 결과
- 100 이상의 수 :  273
- 100 이상의 수 :  103
- 100 이상의 수 :  800

3. 다음 빈칸을 채워서 실행결과에 해당하는 프로그램들을 완성해 보세요.

## 코드 1
numbers = [273, 103, 5, 32, 65, 9, 72, 800, 99]

for element in numbers : 
    if element % 2 == 0 :
        print("{}는 짝수입니다.".format(element))
    else :
        print("{}는 홀수입니다.".format(element))
        
## 실행 결과 1
273는 홀수입니다.
103는 홀수입니다.
5는 홀수입니다.
32는 짝수입니다.
65는 홀수입니다.
9는 홀수입니다.
72는 짝수입니다.
800는 짝수입니다.
99는 홀수입니다.
## 코드 2
numbers = [273, 103, 5, 32, 65, 9, 72, 800, 99]

for element in numbers : 
    if element >= 100 :
        print("{}는 3자리 자릿수입니다.".format(element))
    elif element >= 10 :
        print("{}는 2자리 자릿수입니다.".format(element))
    else :
        print("{}는 1자리 자릿수입니다.".format(element))
        
## 코드 2 풀이 방법 2
numbers = [273, 103, 5, 32, 65, 9, 72, 800, 99]

for element in numbers :
    print("{}는 {}자릿수입니다.".format(element, len(str(element))))
    
## 실행 결과 2
2733자리 자릿수입니다.
1033자리 자릿수입니다.
51자리 자릿수입니다.
322자리 자릿수입니다.
652자리 자릿수입니다.
91자리 자릿수입니다.
722자리 자릿수입니다.
8003자리 자릿수입니다.
992자리 자릿수입니다.

4. 다음 빈칸을 채워서 실행결과처럼 숫자를 하나하나 모두 출력해 보세요.

list_of_list = [
    [1, 2, 3],
    [4, 5, 6, 7],
    [8, 9],
]

for  list in list_of_list : 
    for element in list : 
        print(element)
        
# 실행 결과
1
2
3
4
5
6
7
8
9

5. 다음 코드의 빈칸을 채워서 실행결과처럼 출력되도록 완성해 보세요.

## 확인문제 5번

numbers =  [1, 2, 3, 4, 5, 6, 7, 8, 9]
output = [[], [], []]

for number in numbers : 
    output[(number % 3)-1].append(number)
    
print(output)

## 실행 결과
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
왜 그럴까...
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
output = [[], [], []]
output[1].append(1)
output[2].append(2)
output[0].append(3)
output[1].append(4)
output[2].append(5)
output[0].append(6)
output[1].append(7)
output[2].append(8)
output[0].append(9)
print(output)

이렇게 하면 1, 2, 0이 되어서 [[3, 6, 9], [1, 4, 7], [2, 5, 8]]이 출력되고

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
output = [[], [], []]
output[1-1].append(1)
output[2-1].append(2)
output[0-1].append(3)
output[1-1].append(4)
output[2-1].append(5)
output[0-1].append(6)
output[1-1].append(7)
output[2-1].append(8)
output[0-1].append(9)
print(output) 요렇게 -1을 해줘야 0, 1, -1이 되어서 원하는 순서대로 나오네요.

윤성인, 『혼자 공부하는 파이썬』, 한빛미디어(2019), p138-159.

profile
라쏘, 릿지, 엘라스틱넷 중 라쏘를 담당하고 있습니다.

0개의 댓글