MLOps 부트캠프 by 한경+토스뱅크/Python

반복문

나니니 2024. 7. 1. 00:22

리스트란?

파이썬에서 리스트의 의므는 여러가지 자료를 저장할 수 있는 자료

  • 리스트 생성 방법: 대괄호[]에 자료를 쉼표로 구분하여 입력함
  • 요소: 대괄호[] 내부에 넣는 자료
  • 인덱스: 대괄호[] 안에 들어간 숫자

리스트 사용 방법

  1. 대괄호 안에 음수를 넣어 뒤에서부터 요소 선택
list_a = [273, 32, 103, "문자열", True, False]
list_a[-1]
False
list_a[-2]
True
list_a[-3]
'문자열'

2. 리스트 접근 연산자를 이중으로 사용 가능

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

3. 리스트 안에 리스트 사용 가능

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

! 리스트에서의 IndexError 예외

: 리스트에 [3]번째 요소가 없으므로 IndexError 발생

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

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

# 리스트를 선언합니다. 
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

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

  • append(): 리스트 에 요소 추가
  • insert(): 리스트 중간에 요소 추가(*위치 지정 필요)
  • extend(): 한 번에 여러 요소 추가(*append() 함수를 반복 실행한 효과)
# 리스트를 선언합니다. 
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]

# extend() 함수 이용하기
list_a = [1, 2, 3]
list_b = [4, 5, 6]
list_a.extend(list_b) # -> 실행 결과로 아무것도 출력하지 않음
list_a
[1, 2, 3, 4, 5, 6]
list_b
[4, 5, 6]

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

파괴적 처리: 원본에 영향을 끼침(eg. append(), insert(), extend())
비파괴적 처리: 원본에 연향을 끼치지 않음(eg. 기본 자료형(숫자, 문자, 열, 불) 등)

리스트에 요소 제거하기: 인덱스로 제거, 값으로 제거

  • 인덱스로 제거하기: del 키워드, pop()
  • 값으로 제거하기: remove() (*가장 먼저 발견되는 하나만 제거)
  • 모두 제거하기: clear()
# 인덱스로 제거하기: del 키워드, pop()

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

# 제거 방법[1] - del 키워드
del list_a[1]
print("del list[1]:", list_a)

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

# 결과값
# 리스트의 요소 하나 제거하기
del list[1]: [0, 2, 3, 4, 5]
pop(2): [0, 2, 4, 5]
  • del 키워드를 이용해 범위로 한번에 제거
list_b = [0, 1, 2, 3, 4, 5, 6]
del list_b[3:6]
list_b
[0, 1, 2, 6]

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

list_d = [0, 1, 2, 3, 4, 5, 6]
del list_d[3:]
list_d
[0, 1, 2]
슬라이싱: 리스트에 [:] 연산자로 리스트 범위를 지정하여 여러 요소를 선택하는 것
-> 리스트[시작_인덱스:끝_인덱스:단계]
단계는 기본값이 1이므로 요소를 건너뛰며 가져와야 하는 경우가 아니라면 생략
# 값으로 제거하기: remove()

list_c = [1, 2, 1, 2]
list_c.remove(2)
list_c
[1, 1, 2]
# 모두 제거하기: clear()

list_d = [0, 1, 2, 3, 4, 5]
list_d.clear()
list_d
[] # -> 요소가 모두 제거됨

리스트 정렬하기: sort() (*기본 오름차순 정렬)

list_e = 52, 273, 103, 32, 275, 1, 7]
list_e.sort() # 오름차순 정렬
list_e
[1, 7, 32, 52, 273, 275]

list_e.sort(reverse=True) # 내림차순 정렬
liest_e
[275, 273, 103, 52, 32, 7, 1]

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

# in 연산자

list_a = [273, 32, 103, 57, 52]
273 in list_a
True

99 in list_a
False

100 in list_a
False

52 in list_a
True

# not in 연산자

list_a = [273, 32, 103, 57, 52]
273 not in list_a
False

99 not in list_a
True

100 not in list_a
True

52 not in list_a
False

not 273 ib list_a
False

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

  • 반복할 수 있는 것: 문자열, 리스트, 딕셔너리, 범위 등
# 리스트를 선언합니다. 
array = [273, 32, 103, 57, 52]

# 리스트에 반복문을 적용합니다. 
for element in array:
    # 출력합니다. 
    print(element)
    
# 결과값
273
32
103
57
52
# for 반복문을 문자열과 함께 사용
for character in "안녕하세요":
	print("-", character)
    
# 결과값
- 안
- 녕
- 하
- 세
- 요

중첩 리스트와 중첩 반복문

  • 중첩 반복문: 반복문을 여러 겹 중첩해 사용(-n차원 처리 할 때 사용)
    • 1차원 리스트: [1, 2, 3]
    • 2차원 리스트: [[1, 2, 3], [4, 5, 6]]
list_of_list = [
    [1, 2, 3], 
    [4, 5, 6, 7], 
    [8, 9]
]

for items in list_of_list:
    for item in items:
        print(items)
        
        
# 결과값
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[4, 5, 6, 7]
[4, 5, 6, 7]
[4, 5, 6, 7]
[4, 5, 6, 7]
[8, 9]
[8, 9]

전개 연산자

: 리스트 앞에 * 기호를 사용하여 리스트 요소를 전개

  • 리스트 내부에 사용하는 경우
  • 함수 매개변수 위치에 사용하는 경우
# 리스트 내부에 사용하는 경우

a = [1, 2, 3, 4]
b = [*a, *a]
b
[1, 2, 3, 4, 1, 2, 3, 4]

# append() 함수를 사용하는 경우
a = [1, 2, 3, 4]
a.append(5)
a
[1, 2, 3, 4, 5] # -> 내용이 변경됨

# 전개 연산자를 사용한 경우
b = [1, 2, 3, 4]
c = [*b, 5]
b
[1, 2, 3, 4] # -> 내용에는 어떠한 영향도 없음
c
[1, 2, 3, 4, 5] # -> 새로운 리스트 c가 만들어짐
# 함수 매개변수 위치에 사용하는 경우

a = [1, 2, 3, 4]
print(*a)
1 2 3 4

딕셔너리와 반복문

자료형 의미 가리키는
위치
선언 형식 사용 예 틀린 예
리스트 인덱스를 기반으로 값을 저장 인덱스 변수 = [] list_a[1]  
딕셔너리 키를 기반으로 값을 저장 변수 = {} dict_a["name"] dict_a{"name"}

딕서녀리 선언하기

(*키를 문자열로 사용 시, '따옴표' 필수!)

# 딕셔너리 선언하기

idct_a = {
    "name": "어벤져스 엔드게임",
    "type": "히어로 무비"
    }
    
# 딕셔너리의 요소에 접근하기
# !딕셔너리 선언 시에는 중괄호{} 사용하지만, 요소에 접근 할 때에는 대괄호[] 사용

dic_a
{'name': '어벤져스 엔드게임', 'type': '히어로 무비'}
dict_a["name"]
'어벤져스 엔드게임'
dict_a["type"]
'히어로 무비'

# 딕셔너리 내부 값에 문자열, 숫자, 불 등 다양한 자료를 넣을 수 있음
idct_b = {
    "director": ["안소니 루소", "조 루소"],
    "cast": ["아이언맨", "타노스", "토르", "닥터스트레인지", "헐크"]
    }
# 딕셔너리 요소 접근

# 딕셔너리를 선언합니다. 
dictionary = {
    "name": "7D 건조 망고",
    "type": "당절임",
    "ingredient": ["망고", "설탕", "메타중아황산나트륨", "치자황색소"],
    "origin": "필리핀"
}

# 출력합니다. 
print("name:", dictionary["name"])
print("type:", dictionary["type"])
print("ingredient:", dictionary["ingredient"])
print("origin:", dictionary["origin"])
print()

# 값을 변경합니다. 
dictionary["name"] = "8D 건조 망고"
print("name:", dictionary["name"])

# 출력값
name: 7D 건조 망고
type: 당절임
ingredient: ['망고', '설탕', '메타중아황산나트륨', '치자황색소']
origin: 필리핀

name: 8D 건조 망고
# 인덱스를 지정하여 리스트 안의 특정값을 출력할 수 있음
dictionary["ingredient"]
['망고', '설탕', '메타중아황산나트륨', '치자황색소']
dictionary["ingredient"][1]
'설탕'

딕셔너리에 값 추가/제거 하기

# 딕셔너리 값 추가하기

dictionary["price"] = 5000

# 이미 존재하고 있는 키를 지정하여 값 넣을 시, 대치됨

dictionary["name"] = "8D 건조 파인애플"

# 딕셔너리 요소 제거

del dictionary["ingredient"]

! KeyError 예외: 딕셔너리에 존재하지 않는 키에 접근하면 KeyError 발생함

리스트는 '인덱스' 기반으로 값을 저장하므로 IndexError, 딕셔너리는 '키'를 기반으로 값을 저장하므로 KeyError가 발생(*값 제거시에도 동일)

딕셔너리 내부에 키 여부 확인

  • in 키워드
  • get() 함수
# in 키워드

# 딕셔너리를 선언합니다. 
dictionary = {
    "name": "7D 건조 망고",
    "type": "당절임",
    "ingredient": ["망고", "설탕", "메타중아황산나트륨", "치자황색소"],
    "origin": "필리핀"
}

# 사용자로부터 입력을 받습니다. 
key = input("> 접근하고자 하는 키: ")

# 출력합니다. 
if key in dictionary:
    print(dictionary[key])
else:
    print("존재하지 않는 키에 접근하고 있습니다.")
# get() 함수 -> 존재하지 않는 키에 접근할 경우 KeyError를 발생시키지 않고 None을 출력함

# 딕셔너리를 선언합니다. 
dictionary = {
    "name": "7D 건조 망고",
    "type": "당절임",
    "ingredient": ["망고", "설탕", "메타중아황산나트륨", "치자황색소"],
    "origin": "필리핀"
}

# 존재하지 않는 키에 접근해 봅니다.
value = dictionary.get("존재하지 않는 키")
print("값:", value)

# None 확인 방법
if value == None:
    print("존재하지 않는 키에 접근했었습니다.") # -> None과 같은지 확인
    
# 출력값
값: None
존재하지 않는 키에 접근했었습니다.

for 반복문: 딕셔너리와 함께 사용하기 (*딕셔너리 내부의 키가 변수에 들어감)

# 딕셔너리를 선언합니다. 
dictionary = {
    "name": "7D 건조 망고",
    "type": "당절임",
    "ingredient": ["망고", "설탕", "메타중아황산나트륨", "치자황색소"],
    "origin": "필리핀"
}

# for 반복문을 사용합니다. 
for key in dictionary:
    # 출력합니다. 
    print(key, ":", dictionary[key])
    
    
# 출력값
name : 7D 건조 망고
type : 당절임
ingredient : ['망고', '설탕', '메타중아황산나트륨', '치자황색소']
origin : 필리핀

범위 자료형과 while 반복문

범위: 정수로 이루어진 범위를 만들 때 range() 함수 사용

# 매개변수에 숫자를 한 개 넣는 방법
a = range(5) # 0부터 5-1 까지의 정수로 범위를 생성함

# 매개변수에 숫자를 두 개 넣는 방법
range(0, 5) # 0부터 5-1 까지의 정수로 범위를 생성함

# 매개변수에 숫자를 세 개 넣는 방법
range(0, 5, 1) # 0부터 5-1까지의 정수로 범위를 만드는데, 앞뒤의 숫자가 1만큼 차이를 가짐

# list() 함수를 이용해 범위를 리스트로 변경하면 범위 내부에 어떤 값들이 해당하는지 확인
list(range(5))
[0, 1, 2, 3, 4]

list(range(0, 5))
[0, 1, 2, 3, 4]

list(range(5, 10))
[5, 6, 7, 8, 9]

list(range(0, 10, 2))
[0, 2, 4, 6, 8]

list(range(0, 10, 3))
[0, 3, 6, 9]

# 0부터 10까지의 범위 생성 시, 10을 반드시 포함해야 한다는 걸 강조하고 싶을 때
a = range(0, 10 + 1) # 11을 10+1로 표현하는 것은 강조하기 위함
list(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for 반복문: 범위와 함께 사용하기

# for 반복문과 범위를 함께 조합해서 사용합니다. 

for i in range(5):
    print(str(i) + " = 반복 변수")
print()

for i in range(5, 10):
    print(str(i) + " = 반복 변수")
print()

for i in range(0, 10, 3):
    print(str(i) + " = 반복 변수")
print()

# 결과값
0 = 반복 변수
1 = 반복 변수
2 = 반복 변수
3 = 반복 변수
4 = 반복 변수

5 = 반복 변수
6 = 반복 변수
7 = 반복 변수
8 = 반복 변수
9 = 반복 변수

0 = 반복 변수
3 = 반복 변수
6 = 반복 변수
9 = 반복 변수

for 반복문: 리스트와 범위 조합하기

# 리스트를 선언합니다. 
array = [273, 32, 103, 57, 52]

# 리스트에 반복문을 적용합니다. 
for i in range(len(array)):
    # 출력합니다. 
    print("{}번째 반복: {}".format(i, array[i]))
    
# 결과값
0번째 반복: 273
1번째 반복: 32
2번째 반복: 103
3번째 반복: 57
4번째 반복: 52

for 반복문: 반대로 반복하기

  • range() 함수의 매개변수를 세 개 사용하는 방법
  • reversed() 함수를 사용하는 방법
# range() 함수의 매개변수를 세 개 사용하는 방법

# 역반복문
for i in range(4, 0 - 1, -1):
    # 출력합니다. 
    print("현재 반복 변수: {}".format(i))

# 결과값
현재 반복 변수: 4
현재 반복 변수: 3
현재 반복 변수: 2
현재 반복 변수: 1
현재 반복 변수: 0


# reversed() 함수를 사용하는 방법

# 역반복문
for i in reversed(range(5)):
    # 출력합니다. 
     print("현재 반복 변수: {}".format(i))

# 결과값
현재 반복 변수: 4
현재 반복 변수: 3
현재 반복 변수: 2
현재 반복 변수: 1
현재 반복 변수: 0

중첩 반복문으로 피라미드 만들기

output = ""

for i in range(1, 10):
    for j in range(0, i):
        output += "*"
    output += "\n"
        
print(output)

# 결과값
*
**
***
****
*****
******
*******
********
*********
output = ""

for i in range(1, 15):
    for j in range(14, i, -1):
        output += ' '
    for k in range(0, 2 * i -1):
        output += '*'
    output += '\n'
    
print(output)

# 결과값
             *
            ***
           *****
          *******
         *********
        ***********
       *************
      ***************
     *****************
    *******************
   *********************
  ***********************
 *************************
***************************

while 반복문 (*조건이 중요)

# 기본적인 형태

while 불 표현식: 
	문장

for 반복문처럼 사용하기

# 반복 변수를 기반으로 반복하기
i = 0
while i < 10:
    print("{}번째 반복입니다.".format(i))
    i += 1

while 반복문: 상태를 기반으로 반복하기

# 해당하는 값 모두 제거하기

# 변수를 선언합니다. 
list_test = [1, 2, 1, 2]
value = 2

# list_test 내부에 value가 있다면 반복
while value in list_test:
    list_test.remove(value)

# 출력합니다. 
print(list_test)

# 출력값
[1, 1]

while 반복문: 시간을 기반으로 반복하기 (*시간을 기반으로 조건 시, while 반복문 활용)

*유닉스 타임: 세계 표준시(UTC)로 1970년 1월 1일 0시 0분 0초를 기준으로 몇 초가 지났는지를 정수로 나타낸 것

# 시간과 관련된 기능을 가져옵니다. 
import time

# 변수를 선언합니다. 
number = 0

# 5초 동안 반복합니다. 
target_tick = time.time() + 5
while time.time() < target_tick:
    number += 1

# 출력합니다. 
print("5초 동안 {}번 반복했습니다.".format(number))

while 반복문: break 키워드 / continue 키워드

  • break: 반복문 벗어날 때
  • continue: 현재 반복 생략 후, 다음 반복으로 넘어갈 때
# 변수를 선언합니다. 
i = 0

# 무한 반복합니다. 
while True:
    # 몇 번째 반복인지 출력합니다. 
    print("{}번째 반복문입니다.".format(i))
    i = i + 1
    # 반복을 종료합니다. 
    input_text = input("> 종료하시겠습니까?(y/n): ")
    if input_text in ["y", "Y"]:
        print("반복을 종료합니다.")
        break
        
# 출력값
0번째 반복문입니다.
> 종료하시겠습니까?(y/n): n
1번째 반복문입니다.
> 종료하시겠습니까?(y/n): n
2번째 반복문입니다.
> 종료하시겠습니까?(y/n): n
3번째 반복문입니다.
> 종료하시겠습니까?(y/n): y
반복을 종료합니다.

문자열, 리스트, 딕셔너리와 관련된 기본 함수

  • 리스트에 적용할 수 있는 기본 함수: min(), max(), sum()
  • 리스트 뒤집기: reversed()
  • 현재 인덱스가 몇 번째인지 확인하기: enumerate() 
    • enumerat() 함수 사용 시, for와 in 사이에 반복 변수를 두 개 넣을 수 있음
  • 딕셔너리로 쉽게 반복문 작성하기: items()
  • 리스트 안에 for문 사용하기: 리스트 내포