2025년 11월 4일 화요일
오후 8:48
반복문
상품을 개가 아닌 1000개를 연산하려면?
반복적인 작업을 할때 반복문을 쓴다.
어떠한 조건이나 범위 내에서 어떠한 명령을 반복적으로 수행
우리 회사의 서비스를 구독 중인 고객들에게 뉴스레터 보내기
회의 보고서 4부 출력하기 등
보통 for문과 while문으로 크게 나뉨
시퀀스에서 원소를 하나씩 가져와서 명령 실행
시퀀스 자료형의 원소를 하나 씩 순회한다고 표현한다.
for 변수 in 시퀀스:
<수행할 명령>
<수행할 명령>
For문의 반복횟수? = 시퀀스 자료형의 길이 만큼
count = 0
for i in [1, 2, 3, 4, 5]:
count += 1
print(count)
시퀀스 자료형 안의 원소 값을 합침
total = 0
seq = [1, 3, 5, 7, 9]
for i in seq:
print(f"현재원소: {i}")
total += i
print(f"최종 결과: {total}") # 종속되지 않음
현재원소: 1
현재원소: 3
현재원소: 5
현재원소: 7
현재원소: 9
최종 결과: 25
반복문: for-range문
N회동안 명령을 수행해라
Range(): 연속되는 숫자를 만들어주는 함수
시작 숫자(a)와 끝 숫자(b)를 지정하면 a ~ (b-1) 까지의 숫자 생성
문법: range(start, end, step)
끝범위는 포함 안됨
Range(5) 이렇게 하나만 있는 경우 하나의 값만 넣으면 0 ~ (값-1)까지의 범위
Step은 각각의 값을 어떻게 점프할것이냐의 기준
증감 간격이다.
(2,5)라면 2부터 4까지 범위만큼 반복문 진행
2, 3, 4라는 값이 각각 i에 저장이 되서 실행이 된다.
for i in range(5, 10): # b-a회 반복
print(i)
5
6
7
8
9
Range()함수에 값이 하나면 0부터 a미만까지 반복 한다는 뜻
5-2회 반복 한다는 뜻
count = 0
for i in range(10):
count += 1
print(count)
10
10회 반복 0부터 10미만까지
for i in range(5):
print(i)
0
1
2
3
4
for i in range(5, 10, 2): # b-a회 반복
print(i)
5
7
9
2씩 건너 뛰어 3개만 출력이 된다.
Len의 num_list라면
5가됨 즉 0부터 5미만이 된다.
즉 시퀀스의 길이 만큼 순회
i는 넘리스트의 인덱스 정보, num_list의 i번째 값 출력 하는것
인덱스랑 해당 인덱싱된 결과 출력
str_var = "Hello Python"
for i in range(len(str_var)):
print(i, str_var[i])
# len(str_var) == 12
# range(12) -> 0부터 12미만
# 각 값을 i에 저장
0 H
1 e
2 l
3 l
4 o
5
6 P
7 y
8 t
9 h
10 o
11 n
str_var = input("문자열 입력: ")
for i in range(len(str_var)):
print(i, str_var[i])
# len(str_var) == 12
# range(12) -> 0부터 12미만
# 각 값을 i에 저장
print(f"문자열: {str_var}")
print(f"0부터 {len(str_var)}미만 까지")
문자열 입력: welcome to sesac
0 w
1 e
2 l
3 c
4 o
5 m
6 e
7
8 t
9 o
10
11 s
12 e
13 s
14 a
15 c
문자열: welcome to sesac
0부터 16미만 까지
두가지 방식
시퀀스 방식, range+len()방식
Enumerate() 함수 도 사용 가능하다. 인덱스와 실제값 추출
처음 봤던 예시에 반복문 적용
prices = [3000, 4500, 10000, 8000, 22000]
quantities = [3, 4, 1, 2, 1]
total = 0
for i in range(len(prices)):
total += prices[i] * quantities[i]
print(total)
75000
상품 개수가 많아져도 자동 확장된다.
for문안에서 정의된 변수는 밖에서 못씀, 접근 못함 ?
If문은 가능
For문 밖의 변수는 임의로 넣어준 값
prices = [4000, 25000, 7500, 12000, 18500]
discounted = []
for i in range(len(prices)):
if prices[i] >= 10000:
discounted.append(prices[i]*0.9)
else:
discounted.append(prices[i])
print(discounted)
[4000, 22500.0, 7500, 10800.0, 16650.0]
Prices[i]원소가 10000이상일시 10% 할인 적용
Continue 키워드
반복문 내에서 continue를 만나면 나머지 명령을 건너뛰고, 다음 반복으로 넘어감
I가 짝수인 경우 건너 뛴다.
그외의 경우는 print(i)
보통 컨티뉴는 조건문에 쓴다. 이런 조건일때 넘어가라
While문
조건이 참인 동안 명령을 수행해라
for문은 횟수 기반의 반복이라면, while문 조건 기반의 반복문
while 조건:
<수행할 명령>
For문은 횟수 기반 반복
While은 조건 기반 반복
I가 양수인 동안 반복
I가 0보다 크지 않을 때까지 반복
i = 5
while i > 2:
print(i)
i -= 1
print("while문 종료")
5
4
3
while문 종료
I >2라는 조건문을 걸어 놨기에
3까지만 출력되고 종료가 된다.
초기 잔액이 인출금액보다 클때까지만 인출한다.
무한루프
끝나지 않는 반복문: 조건이 항상 참이 된다면?
무한루프가 발생하지 않게끔 코드를 작성해야 함
조건문과 break를 활용!
조건문과 break를 활용! break는 반복문을 강제 종료하는 역할
i가 5가 될 때, 조건문이 참이 되어 break에 의해 탈출!
I가 넘버스 길이보다 작을때만 실행되라.
탐색을 했을때 break해서 반복문 종료
현재 원소가 target과 일치하는 순간에 break를 통해 탐색 종료
if i == len(numbers):
print("탐색하지 못했습니다.")
이 코드문까지 추가하면 while문 다 끝난 상태여도 탐색하지 못했으면 출력
일부러 무한 루프(infinite loop) 만들기
일부러 조건을 항상 참으로 만들고, 중간에 조건문+break를 통해 탈출
Tuple 자료형의 필요성
리스트 자료형의 경우 값이 바뀔 위험이 있는 자료형
Tuple 자료형
값을 바꿀 수 없으면서, 여러 개의 값을 담을 수 있는 순서가 있는 자료형 (read-only)
(),사용
튜플 정의하기
맨 밑에 처럼 써도 튜플로 인정 하지만 가독성을 위해 소괄호 사용
Tuple도 시퀀스 자료형이기에, 특징을 모두 가지고 있다.
인덱싱과 슬라이싱, in 연산자와 len() 함수
결론은 불변객체인거 빼고 리스트와 동일함
Tuple은 읽기전용(read-only) 구조
데이터를 추가/삭제/변경이 불가능하다. 한 번 생성되면 고정되는 자료형
Append,remove, 값 수정은 못함
tp = (4, 2, 1, 5, 6)
tp2 = (100, 100)
print(tp[2])
print(tp[2:4])
print(6 in tp)
print(len(tp))
print(tp+tp2)
print(tp*2)
1
(1, 5)
True
5
(4, 2, 1, 5, 6, 100, 100)
(4, 2, 1, 5, 6, 4, 2, 1, 5, 6)
tp.append(6)
tp.remove(4)
tp[3] = 5
Traceback (most recent call last):
File "c:\Users\USER\sesacworkspace\새싹임세혁_251104\main.py", line 8, in
tp.append(6)
AttributeError: 'tuple' object has no attribute 'append'
이런 에러가 뜬다. 튜플은 추가/삭제/변경할수 없다.
튜플끼리 더한거,곱한거는-> 하나의 새로운 튜플 만드는거라 가능하다 추가/변경이 아니라 생성.
Unpacking(언패킹)
묶여 있는 자료형(List, Tuple, Dictionary 등)의 원소들을 분해해서 각 변수들에 나누는 것
아래 코드가 언패킹 과정이다.
a, b, c = (1, 2, 3)
패킹=언패킹의 반대
튜플을 정의 하는것.
여러 값을 묶어서 하나의 변수(투플, 리스트 등)에 저장
Unpacking활용(1): Swap(스왑)
Swap: 두 변수 값을 서로 바꾸는 것
A = 10
B = 15
A = b
B = a
A와 b둘다 15가됨 이렇게 하면
그래서 이런 방법을 쓴다
Tmp = a
A = b
B = tmp
하지만 파이썬에서 언패킹을 쓰면 편하다.
a, b = b, a
둘다 튜플인데 소괄호가 생략됨
Unpacking 활용(2): 입력 분할 input().split()
한 줄에 공백을 기준으로 여러 개의 값을 입력 받기 위함.
사용자 입력 한 줄 입력
input().split()
한 줄에 공백을 기준으로 여러 개의 값을 입력 받기 위함.
10 20 30
문자열 “10 20 30”과 동일
이렇게 하면 하나의 인풋으로 여러 값을 입력 받고 수정할 수 있다.
str.split(c) → List 문자열을 대상으로 문자열 c를 기준으로 문자열을 분할하여 각 분할된 값을 리스트로 묶어서 반환 *인자를 비워놓으면 Default로 공백(“ “)을 기준으로 수행
a, b, c, d = (1, 2, 3, 4)
print(a)
print(b)
print(c)
print(d)
1
2
3
4
result = input().split()
print(result)
10 20 30 40 50 60 70 80 90 100
['10', '20', '30', '40', '50', '60', '70', '80', '90', '100']
공백을 기준으로 쪼개서
그 원소값들을 하나의 리스트로 반환한다.
a, b, c, d, e = input().split()
print(a, b, c, d, e)
1 2 3 4 5
1 2 3 4 5
이렇게 하면 5개만 입력 받고 출력함
튜플로 입력을 형변환도 가능하다. tuple()이렇게 감싸면
입력 분할의 확장: map()함수
입력 받은 값을 한번에 숫자로 만들자 -> map()함수
map() 함수: 리스트의 각 원소에 변환 함수를 적용하여 변환된 새로운 리스트를 반환
map(변환 함수, 변환할 반복 가능한 자료형)
최종적으로 새로운 리스트를 만들어 줌.
input().split()은 리스트 타입 10 20 30이 각각 문자열로 저장된 것
맵함수 인자로 넣으면 int로 바뀜
Int 가 각 원소를 정수로 변환
input().split()의 결과 리스트를 대상으로 각 원소마다 정수로 변환하여 새로운 리스트 생성
a, b, c, d, e = input().split()
print(a, b, c, d, e )
print(type(a))
10 20 30 40 50
10 20 30 40 50
<class 'str'>
숫자처럼 보이지만 문자형태로 출력된다.
이렇게 정수로 변환 하기 위해.
x, y, z = map(int, input().split())
print(x,y,z)
print(type(x))
10 20 30
10 20 30
<class 'int'>
문자열로 인풋 받은것을 정수형으로 변환 하여 공백을 기준으로 x, y, z변수에 각각 저장(언패킹) 한다.
Int 자리에 float, str 들어갈수도 있고, input().split()에는 리스트나 튜플도 들어갈수 있다.
input().split(',') 이렇게 하면 , 기준으로 나누어 원소 저장
딕셔너리
각 값이 무엇을 의미하는지 바로 파악하기 어려울 때가 있다.
그래서 등장한게 딕셔너리
사전처럼 쓴다는 뜻
조금 더 쉽게 말하면, 값에 이름(이름표)을 붙인 것으로, 키:값 쌍들의 순서가 없는 집합
중괄호와 콜론을 사용하여 표현.
키:값이 한쌍 각쌍은 ,로 구분
열쇠의 역할을 하는 Key를 알면 Value를 알 수 있다
키: 열쇠의 역할 키 키를 알면 밸류를 알 수 있다.
밸류: 키에 의해서 가져올 수 있는 값
딕셔너리 자료형 다루기(1)
Key를 기반으로 Value 꺼내기
딕셔너리[Key] 이런형태로
리스트는 인덱스를 넣고 여긴 숫자가 아닌 키의 이름값을 넣어야 한다.
person = {"name" : "Gildong", "age" : 25, "address" : "서울시 강남구"}
print(person["name"])
print(person["age"])
print(person["address"])
Gildong
25
서울시 강남구
이렇게 하면 밸류값들이 출력 됨
딕셔너리 변수명[]안에 키의 이름을 넣는다.
딕셔너리 한쌍을 각각,로 구분하기
for i in (person):
print(person[i])
Gildong
25
서울시 강남구
01012345678
abc@abc.com
이렇게도 가능하다.
딕셔너리 자료형 다루기(2)
딕셔너리[새로운Key] = Value
person["gender"] ="M"
{'name': 'Gildong', 'age': 25, 'address': '서울시 강남구', 'phone_number': '01012345678', 'email': 'abc@abc.com', 'gender': 'M'}
딕셔너리 자료형 다루기(3)
이미 존재하는 Key를 대상으로, 변경할 Value를 할당
딕셔너리[기존Key] = Value
person["address"] = "서울시 마포구"
print(person)
{'name': 'Gildong', 'age': 25, 'address': '서울시 마포구', 'phone_number': '01012345678', 'email': 'abc@abc.com', 'gender': 'M'}
딕셔너리 자료형 다루기(4)
del 딕셔너리[Key]
원래 있던 키를 지움
del person["age"]
“age” 키에 대해 key:value 자료 삭제
print(person)
{'name': 'Gildong', 'address': '서울시 마포구', 'phone_number': '01012345678', 'email': 'abc@abc.com', 'gender': 'M'}
딕셔너리 자료형 다루기(5)
in 연산자를 활용하여, 해당 Key가 딕셔너리에 있는지 검사
있으면 트루 없으면 폴스 값 반환
Key in 딕셔너리
Example
(1) 딕셔너리 level에서 ‘medium’의 값을 가져오기
(2) 딕셔너리 level에서 ‘low’ 키가 있는지 확인하기
(3) 딕셔너리 level에 {‘high’ : 10} 쌍을 추가하기
(4) 딕셔너리 level에서 ‘low’ 키를 삭제하기
#(1)
print(level["medium"])
#(2)
if "low" in level:
print("Y")
#(3)
level["high"] = 10
print(level)
#(4)
del level["low"]
print(level)
딕셔너리 자료형 특징 :key는 Immutable한 자료형
딕셔너리의 키는 변할 수 없는 자료형(숫자, 문자열, 투플)으로 설정해야 한다.
리스트 같은 가변객체로 key를 사용할수 없다.
데이터 모델링
현실 세계의 데이터를 구조화
Json 데이터 형태가 파이썬의 딕셔너리랑 거의 같은 구조
한 회사의 데이터를 표현 (중첩 딕셔너리)
딕셔너리 안에 딕셔너리가 있는 구조
print(company["departments"]["HR"]["manager"])
이영희가 출력된다. 계층에 계층 타고타고 들어가는 구조이다.
print(len(company["departments"]["IT"]["employees"]))
딕셔너리의 메서드: keys(), values(), items()
• keys() : 현재 딕셔너리의 모든 key들의 묶음을 반환.
• values() : 현재 딕셔너리의 모든 value들의 묶음을 반환.
• items() : 현재 딕셔너리의 key-value 쌍을 Tuple로 묶은 묶음을 반환.
capital_dict = {'Korea' : 'Seoul', 'Vietnam' : 'Hanoi', 'Japan' : 'Tokyo'}
print(capital_dict.keys())
print(capital_dict.values())
print(capital_dict.items())
dict_keys(['Korea', 'Vietnam', 'Japan'])
dict_values(['Seoul', 'Hanoi', 'Tokyo'])
dict_items([('Korea', 'Seoul'), ('Vietnam', 'Hanoi'), ('Japan', 'Tokyo')])
For문과 함께 활용: keys(), values()
for x in capital_dict:
print(x)
for x in capital_dict.keys():
print(x)
위랑 두번째랑 같은 결과가 나온다. 키값만 출력
for x in capital_dict.values():
print(x)
밸류값만 출력이 된다.
For문과 함께 활용: items()
언패킹을 활용하여 Key-Value 묶음 투플을 두 개의 변수로 할당
Items 쓸때는 키, 밸류값 출력을 한다.
항상 for문에 두개의 변수 사용
for x, y in capital_dict.items():
print(x, y)
Korea Seoul
Vietnam Hanoi
Japan Tokyo
딕셔너리 활용: dict() 함수
딕셔너리 형 변환 함수로, 다중 원소로 구성된 리스트나 투플을 딕셔너리로 변환.
딕셔너리 활용: zip() 함수
말 그대로 묶는 여겨할
여러 리스트나 튜플을 동일한 인덱스끼리 하나로 묶는 역할
딕셔너리 활용: zip() 함수의 확장
2개뿐만 아니라, 그 이상의 개수도 묶기 가능
4개도 가능하다.
a = [1, 2, 3]
b = [10, 20, 30]
c = [10, 20, 30]
d = [10, 20, 30]
print(list(zip(a,b,c,d)))
[(1, 10, 10, 10), (2, 20, 20, 20), (3, 30, 30, 30)]
딕셔너리 활용: zip() 함수의 확장 - 만약 각각 길이가 다른 경우에는?
리스트마다 길이가 다를시 가장 짧은 리스트에 맞춰준다.
a = [1, 2, 3]
b = [10, 20]
c = [100, 200, 300, 400]
print(list(zip(a,b,c)))
[(1, 10, 100), (2, 20, 200)]
B의 길이가 2이므로 딱 튜플이 두쌍만 나옴
딕셔너리 활용: zip() 함수와 dict()함수
zip으로 묶은 결과를 딕셔너리로 변환: 첫번째 원소가 Key, 두번째 원소가 Value
하나는 Key, 하나는 Value가 되는 구조이므로 2개의 리스트(또는 투플)로만 zip으로 묶어야 한다!
만약에 여러 원소가 담긴 투플로 Key나 Value를 구성하고 싶다면 중첩 zip() 적용
names와 scores라는 각각 빈 리스트를 정의하고, 5명의 학생의 이름과 점수를 입력받아 각 리스트에 저장 후, 이 두 개의 리스트를 활용하여 딕셔너리를 생성하시오.
names = []
scores = []
for i in range(0, 5):
names.append(input("이름을 입력하세요: "))
for i in range(0, 5):
scores.append(int(input("점수를 입력하세요: ")))
dic = dict(zip(names, scores))
print(dic)
반복문을 하나로 합치고, range(5)로 수정 가능
Input.split()도 가능하다 함