SK플래닛 ai활용 데이터엔지니어 과정 2기/파이썬

파이썬 - 흐름제어(2)

dev-lee 2026. 3. 4. 16:59

반복문

 

for문

  • 지정된 횟수 반복
  • X회 반복하라(특정됨)
  • 문법
for 개별데이터(멤버) in 컬렉션계열|제너레이터:
  수행문
 

기본형

# 더미데이터
datas = [1,2,3,4,5] #컬렉션 계열(for문과 자주 함께 사용함)

datas

결과값 : [1, 2, 3, 4, 5]
# for 단수형이름 in 복수형이름
# 컬렉션의 경우 멤버의 수만큼 반복됨
 #-> 컬렉션의 맨 처음 데이터부터 끝까지 순서대로 추출됨
for data in datas:
  print(data)
  
결과값 : 
1
2
3
4
5
# 5 4 3 2 1 순으로 출력하시오 (리뷰때 연습)
# case 1 : 데이터를 뒤집은 후( datas.reverse() ) for문 적용
# case 2 : 순서대로 접근하는데 인덱싱을 역순으로 적용한다
# case ...

# 첫번째 방법 : 리스트에 reverse()함수를 사용하여 역순으로 뒤집은 후 출력
datas.reverse()
for data in datas :
  print(data)
  
  
# 두번째 방법 : 슬라이싱의 step을 -1로 하여 출력
for data in datas[::-1]:
  print(data)
  
#세번째 방법 : 리스트의 원본을 건드리지 않고 reversed()함수 사용하여 출력
for data in reversed(datas):
  print(data)
  
  
모두 다 결과값은
5
4
3
2
1 로 역순으로 나옴

리스트 + 튜플 구조의 데이터에 반복문처리

  • 데이터 형태
  [ ( , ...), (), (), ... ]
#더미 데이터
datas = [(1,2),(3,4), (5,6)] # 온도, 습도 

datas

결과값 : [(1, 2), (3, 4), (5, 6)]
# 요구사항
# datas에서 데이터를 추출하여 다음과 같이 출력하시오
'''
첫번째값 1, 두번째값 2
첫번째값 3, 두번째값 4
첫번째값 4, 두번째값 5
'''
# 실습 2분
for data in datas:
  # [0], [1]의미를 잘 모르겠음 -> 주석달아야 함
  print( f'첫번째값 {data[0]}, 두번째값 {data[1]}' )

결과값 : 
첫번째값 1, 두번째값 2
첫번째값 3, 두번째값 4
첫번째값 5, 두번째값 6

------------------------------------------------------

#데이터가 명확하게 사용되는 것을 확인할 수 있음.
# -> 상대적으로 장황함 -> 간략하게 표현할 수 있음
for data in datas:
  온도, 습도 = data # 분해
  print( f'첫번째값 {온도}, 두번째값 {습도}' )
  
결과값 : 
첫번째값 1, 두번째값 2
첫번째값 3, 두번째값 4
첫번째값 5, 두번째값 6

------------------------------------------------------

# 아예 처음부터 쪼개서 받는다.
for 온도, 습도 in datas:
  print(f'첫번째값 {온도}, 두번째값 {습도}')
  
------------------------------------------------------
  
# 습도만 사용할 거면 _로 온도는 받고 버리고 습도만 사용할 수도 있음
for _, 습도 in datas:
  print(f'두번째값 {습도}')
  
결과값 :
두번째값 2
두번째값 4
두번째값 6

 

딕셔너리 구조의 데이터 반복문 처리

subways = {
    'name' : '영등포역',
    'age' : 70
}

subways

결과값 : {'name': '영등포역', 'age': 70}
#단순 for문 작성
#단순 for문으로 통째로 돌리면 키값만 도출됨

for subway in subways:
  print(subway)
  
결과값 : 
name
age
# 키, 값을 출력하려면 받은 키로 인덱싱을 해서 값 추출하면 됨

for key in subways:
  print(key, subways[key]) # key, 인덱싱을 통해 값 추출
  
결과값 : 
name 영등포역
age 70
# (키, 값) 튜플로 구성하여 모두 출력하는 함수
# items() 함수
subways.items()

결과값 : dict_items([('name', '영등포역'), ('age', 70)])
# items() 를 이용하여 키, 값 출력

for key, value in subways.items():
  print(f'{key}, {value}')
  
결과값 : 
name, 영등포역
age, 70

(중요)리스트 + 딕셔너리 구조의 데이터에 반복문 처리

  • JSON 데이터에서 자주 보이는 형태(리스트 표현 시)
    • openapi 뉴스 검색 결과 ex) 뉴스 10개-> JSON(반복되는 데이터를 가지고 있음)
    • db 조회를 통한 검색 결과 -> JSON
    • aws opensearch를 통한 검색 결과 -> JSON
ktx_stations = [
{
    'name' : '영등포역',
    'age' : 70,
    'location' : ['1', '서울', '영등포']
},
{
    'name' : '광명역',
    'age' : 30,
    'location' : ['2', '경기도', '광명']
}
]

ktx_stations

결과값 : 
[{'name': '영등포역', 'age': 70, 'location': ['1', '서울', '영등포']},
 {'name': '광명역', 'age': 30, 'location': ['2', '경기도', '광명']}]
# 요구사항
'''
 영등포역의 년식은 70년
 광명역의 년식은 26년
'''

# 첫번째 방법
for station in ktx_stations :
  print(f'{station['name']}의 년식은 {station['age']}년')
  
# 두번째 방법
for station in ktx_stations:
  name, age, _ = station.values()
  print(f'{name}의 년식은 {age}년')
  
결과값 : 
영등포역의 년식은 70년
광명역의 년식은 30년
# 요구사항
'''
 영등포역의 년식은 70년, 위치는 서울
 광명역의 년식은 26년, 위치는 경기도
'''

# 첫번째 방법
for station in ktx_stations :
  print(f'{station['name']}의 년식은 {station['age']}년, 위치는 {station['location'][1]}')
  
  
# 두번째 방법
for station in ktx_stations:
  name, age, _ = station.values()
  print(f'{name}의 년식은 {age}년, {_[1]}')
  
# 2-2 방법
for station in ktx_stations:
  name, age, (_, location, _) = station.values()
  print(f'{name}의 년식은 {age}년, {location}')
  
결과값 : 영등포역의 년식은 70년, 서울
광명역의 년식은 30년, 경기도

 

enumerate(통상 딕셔너리) 활용

  • enumerate()
    • 내장함수
    • 데이터 순서대로 정방향 인덱스를 부여(0,1,2,...)
#enumerate() 함수를 사용하면 앞에 인덱스가 붙음

for key in enumerate(station):
  print(key)
  
결과값 : 
(0, 'name')
(1, 'age')
(2, 'location')

--------------------------------------------------

for index, key in enumerate(station):
  print(index, key)
  
결과값 :
0 name
1 age
2 location

--------------------------------------------------

#요구사항
'''
데이터 개수만큼 출력하시오

인덱스 키 값
'''

# 첫번째 방법
for index, key in enumerate(station):
  print(index, key, station[key])
 
# 두번째 방법
for index, (k, v) in enumerate(station.items()):
  print(index, k, v)
  
결과값 : 
0 name 광명역
1 age 30
2 location ['2', '경기도', '광명']

 

range()

 
  • 특정 범위 내에서 수를 생성(공급)하는 내장 함수
  • 제너레이터 기능을 가짐
    • 필요할 때 필요한만큼 생성
    • for문에서 in 뒤에 사용 가능
  • 사용
 range(시작값, 끝값, step(기본값 1)) -> split()과 같은 구조

 #데이터는
  시작값 <= x < 끝값 <- 이러한 구조를 가지고 있음
 #간격은 기본값 1
 #시작값 생략하면 0부터라는 의미
range(3) # 0<= x < 3, 간격은 1 0> 0,1,2가 나오기를 기대함

#뭔가가 실행되지는 않고 for문에 붙여서 사용해야함
결과값 : range(0, 3)
for n in range(3):
  #데이터를 요청할 때 데이터를 생산하여 공급함(제너레이터) -> yeild를 사용함
  print(n)

print('-'*10)
for n in range(1,3):
  print(n)

print('-'*10)
# STEP이 2임
for n in range(1, 12, 2):
  print(n)
  
결과값 : 
0
1
2
----------
1
2
----------
1
3
5
7
9
11
%%time

nums = list()
for i in range(10000000): #천만개의 연속수 생성
  nums.append(i)

#메모리 체크
import sys
sys.getsizeof(nums)

결과값 : 
CPU times: user 852 ms, sys: 251 ms, total: 1.1 s
Wall time: 1.11 s
89095160


----------------------------------------------------

%%time

# 천만번 작동하는 것이 아니라, 호출하면 1개 생성하고 대기하고 있는 것임(들고있는 것이 아니라 생성해주는 것)
tmp = range(10000000) 
sys.getsizeof(tmp)

#실제로 결과값도 시간이 굉장히 빠른 것을 볼 수 있음
결과값 : 
CPU times: user 27 µs, sys: 5 µs, total: 32 µs
Wall time: 34.3 µs
48