반복문 + 조건문(필터링)
for n in range(1,10):
#n값이 짝수면 출력, 홀수면 아무일도 하지 않는다 -> 이분법적 상황 -> if ~ else ~
if n%2:
print(n)
결과값 :
1
3
5
7
9
----------------------------------------------------------------------
for n in range(1,10):
#n값이 짝수면 출력, 홀수면 아무일도 하지 않는다 -> 이분법적 상황 -> if ~ else ~
if not n%2:
print(n)
결과값 :
2
4
6
8
- for문 안에 for문이 존재하는 경우
- 중첩 반복문
- 구구단, 게임 드로잉 시 패턴 표현
- 딥러닝 > 영상/ 이미지 인식(CNN) > 필터/커널이 2D이미지를 스트라이드하여 특징 추출할 때
# 요구사항
'''
3 x 1 = 3
3 x 2 = 6
...
6 x 9 = 54
'''
# 앞자리는 3~6
# 뒷자리는 1~9
for i in range(3,7):
print(f'구구단 {i}단')
for j in range(1,10):
#:>2 코드로 자릿수는 2자리, 오른쪽 정렬로 통일
print(f'{i} x {j} = {i*j:>2}')
#탈출 코드를 이용하여 샘플링 작업 구성
#정답의 형태는 계속 빌드업하면서 완성
#디테일 및 코드 리뷰로 최종 코드 구성
break
결과값 :
구구단 3단
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
구구단 4단
4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36
.
.
.
6 x 9 = 54
# 3~6단 출력
# 5단 제외 -> 조건식 -> 조건문
# 3x3, 4x4, 6x6은 제외
# 구구단 구현
for i in range(3,7):
# 5단은 제외이므로 i가 5일 때 다음 작업 생략
if i == 5: continue
for j in range(1,10):
# 현재 구구단과 같은 숫자인 경우는 제외이므로 i와 j가 같을 때 다음 작업 생략
if i == j: continue
print(f'{i} x {j} = {i*j:>2}')
- 간결하게 반복문 처리
- 데이터를 직관적으로 일괄 처리
- 처리 속도도 빠름, 람다와 비견될 정도(구성하기 나름)
- 결과 중심주의로 작성하는 철학을 가짐
#결과를 리스트에 담는다.
results = list()
for i in range(3,7):
for j in range(1,10):
results.append(f'{i} x {j} = {i*j:>2}') ## 리스트에 구구단 텍스트를 추가
print(len(results), results)
----------------------------------------------------------------------
# 컴프리헨션 스타일로 마이그레이션(코드 리펙토링) 수행
# 최종 결과의 타입은 list
results = [f'{i} x {j} = {i*j:>2}' for i in range(3,7) for j in range(1,10)]
print(len(results),results)
# 위 코드와 아래 코드의 출력값은 동일함.
# 보기에 훨씬 간결하고 속도도 빨라서 컨프리헨션 사용 장려
- 컨프리헨션 절차
- 결과를 중심으로 변수 및 타입 생성하여 출력까지 구성
- 출력 내용 구성
- 반복 내용 구성
- 필요 시 조건 추가
- 확인 및 보정
- 흐름제어에 변수를 줄 수 있는 키워드
- break
- 반복문 탈출(exit)
- break 키워드를 감싸고 있는(코드블럭, 들여쓰기) 가장 가까운 반복문(for, while)을 탈출함
- continue
- 키워드를 감싸고 있는(코드블럭, 들여쓰기) 가장 가까운 반복문(for, while)으로 점프 -> 반복문의 조건식 수행(뒤 코드 생략)
- 통상 조건문과 같이 사용함
- else
- 반복문이 중단 없이(exit, break 없이) 정상적으로 모두 반복 후 종료되었다면 진입함(5바퀴 돌아야하는데 3바퀴밖에 안 돌았으면 진입하지 않음)
- 위와같은 상황을 인지해야 한다면 사용
- for(while) ~ else ~
break
#의도 : 샘플로 1개만 출력, 한바퀴 돌려본다(임시 코드)
for n in range(10):
print(n)
break
결과값 : 0
for n in range(10):
print(n)
#조건식 + break 결합 -> 통상적 표현
if n > 3:
break
결과값 :
0
1
2
3
4
for i in range(3, 7) :
for j in range(1,10) :
print(f'{i} * {j} = {i*j:>2}')
break # 나를 감싸고 있는 가장 가까운 반복문을 탈출한다 -> 2번 라인 반복문 탈출
break # 1번과 반응
결과값 : 2 * 1 = 2
continue
for i in range(3,7):
if i == 4: continue # 4인 경우 건너뛰고 반복문 조건식 수행
print(i)
결과값 :
3
5
6
else
for i in range(3):
print('A', i)
if i == 1:
print('B', i)
continue
print('C', i)
else : print('continue 사용 시 else에 진입한다? YES')
결과값 :
A 0
A 1
B 1
A 2
continue 사용 시 else에 진입한다? YES
for i in range(3):
print('A', i)
if i == 1:
print('B', i)
break
print('C', i)
else : print('break 사용 시 else에 진입한다? NO') # 반복문이 지정된 횟수를 모두 반복하지 않았음.
결과값 :
A 0
A 1
B 1
- 언제 끝날지 모르는 반복상황(무한루프)에서 사용
- 조건 xx를 만족할 때까지(특정 x) 반복하라
- 0 ~ 무한대 반복
- 탈출 코드가 반드시 필요함
- 조건문 + break
- while문의 조건식에 변수를 적용하여 조정
- 플래그(flag, 기능적인 표현) 변수를 이용하여 탈출
- 중첩 반복문에서 복잡하게 꼬여있는 경우 , 간단하게 탈출코드 구성 -> 변수값을 변화시켜서 조건문을 False로 구성하여 탈출
- 한마디로, 로직으로 처리한다고 할 수 있음
- 문법
while 조건식:
statements
# 더미데이터
datas = [11, 12, 13]
# 요구사항
# datas에 데이터가 없을 때까지 반복(무한 루프), 각 멤버를 출력하시오
# 데이터가 없다 -> [] 빈 리스트 -> 조건식에서 사용하면 False로 해석 -> 반복문 종료됨
while datas:
print(datas.pop()) # pop() : 멤버를 제거하고 반환하는데 역순으로 튀어나옴(마지막으로 들어온 순서대로 반환)
결과값 :
13
12
11
종합
a = [1,2,3,4,5]
while a:
tmp = a.pop()
if tmp % 2 == 0:
continue
print(tmp, len(a))
if len(a) == 1:
break
else:
print('반복문이 모든 반복회수를 정상적으로 수행했다')
결과값 :
5 4
3 2
1 0
반복문이 모든 반복회수를 정상적으로 수행했다