파이썬 기초(9) - 반복문

*이 글을 읽기전에 작성자 개인의견이 있으니, 다른 블로그와 교차로 읽는것을 권장합니다.*
반복문은 동일한 작업을 여러 번 실행하기 위해 사용되는 제어 구조입니다. 주로 for 문과 while 문이 사용되며, 각각의 반복문은 다른 상황에 적합한 방식으로 사용됩니다. 반복문에서 사용하는 문법은 다음이 있습니다.
- 사용 어문
- while문
- for 문
- 사용 함수
- range() 함수
- enumerate() 함수
- zip() 함수
1. while문
while 문은 특정 조건이 참인 동안 반복적으로 코드 블록을 실행하는 제어 구조입니다. while 문은 주어진 조건이 참인 동안 반복적으로 코드를 실행하며, 조건이 거짓이 되면 반복을 멈춥니다. while문에서 반복문으로 사용된 변수는 코드가 내려가면서 값이 변한다는 것을 인지해야 합니다. 나중에 중첩 반복문을 작성할 때, 반복되는 순서를 헷갈리는 경우가 많아, 어렵기 때문입니다.
#while문
i=1
while i <=3:
print('출력')
i +=1 # i=i+1
활용예시: 1부터 100까지의 짝수 합을 구하는 프로그램 작성해보기
# 1부터 100까지의 총합
i=0 #i는 순서
sum=0
while i <=100:
sum+=i #sum=sum+i
i+=2 #i=i+2
print(f'1부터 100까지 짝수의 합은 {sum}')
2+4+...98+100으로 구하는 방식으로 짜보았다 이와 반대로 %연산자로 나눗셈의 나머지가 1을 버리는 방식의 예시가 있습니다.
i=0
sum=0
while i<=100:
if i%2==0:
sum+=i #if문에 영향
i+=1 #if문에 영향X, 나머지가 1인 수는 더해지지 않음
print(f'1부터 100까지 짝수의 합은 {sum}')
위 방식으로는 0+2+0+...+98+0+100로 진행되며 홀수는 %나눗셈 나머지 조건문으로 0값으로 출력됩니다. 따라서 홀수건째 수는 0이며, 짝수번째 수는 2,4,6,...,98,100으로 출력됩니다.
첫번째 방식과 두번째 방식의 공통점은 결과값이 동일하다는 것이고, 차이점은 첫번째 방식은 짝수만 출력된다는 것, 두번째 방식은 홀수가 if조건문에 의해 0으로 출력된다는 점입니다.
2. for문
for 문은 시퀀스(리스트, 튜플, 문자열 등)의 각 항목에 대해 반복 작업을 수행하는 반복문입니다. for 문은 주로 "지정된 범위 내에서 반복"할 때 사용됩니다(이때, 주로 range()함수 사용). 이것은 반복할 요소들이 미리 정해져 있는 경우에 유용합니다. while문과 for문의 차이점은 다음과 같습니다.
- while 문: 조건을 걸어 반복문으로 사용
- for 문: 조건이 아닌, 시퀀스 자료로 반복문 사용
- 시퀀스: 순서가 있는 자료형으로 리스트, 튜플, 딕셔너리, 집합이 있음, 자료형 그대로 오는것뿐만 아니라 변수로 와도 사용
```
for 변수 in 시퀀스:
시퀀스 갯수만큼 반복할 문자
```
#for문 기본
a=[1,2,3,4]
for i in a:
print(i)
for문은 위에서 아래 방식으로 해석됩니다. 해석순서: for i -> in a -> print(i)
3. 반복문에서 사용하는 함수
반복문에서는 in 뒤에 있는 시퀀스 자료를 생성하기 위해 함수(내장 함수)를 사용합니다. 사용되는 종류는 다음과 같습니다.
- range()
- enumerate()
- zip()
3-1. range()
range() 함수는 파이썬에서 순차적인 정수의 시퀀스를 생성하는 데 사용되는 내장 함수(파이썬에 기본적으로 들어있는)입니다. 주로 for 문과 함께 사용되며, 일정한 범위 내에서 반복 작업을 수행할 때 유용하게 활용됩니다. range() 함수의 결과로 생성되는 순차적인 정수 시퀀스는 실제로 메모리에 저장되지 않고(메모리에 저장되지 않는다면, 처리속도가 느려지지 않음) 필요할 때마다 생성되므로, 큰 범위의 반복문에도 효율적으로 사용할 수 있습니다.
- 앞에서 했던 슬라이싱과 형태가 비슷하나, 슬라이싱은 :(콜론)을 사용하여 인덱스를 표현하는 방법이나, range()함수는 주로 숫자를 표현하는 방법이 차이점입니다. 슬라이싱의 stop이 출력되지 않는것처럼 range()함수의 stop도 포함해서 출력하지 않습니다.
#range()함수
```
range(시작값, 종료값, 단계)
range(start, stop, step)
```
#슬라이싱과 비교
```
변수[start순번:stop순번:step순번]
```
# range()함수에서 start기본값은 0, step의 기본값은 1
a=range(1,11,1)
a
#range()함수 start값 생략
for i in range(15):
print(i, end=' ')
#for, range()를 이용해 1부터 100까지 홀수 합 구하기
sum=0 # 구하려는 값 변수설정
for i in range(0,101,2):
sum+=i
print(f'구한값: {sum}')
3-2. enumerate()
enumerate()함수는 파이썬에서 반복문을 사용할 때 인덱스와 값(value)을 함께 가져오기 위해 사용되는 내장 함수입니다. 주로 for 문과 함께 사용되며, 반복문 내에서 순서를 추적하면서 값과 해당 값의 인덱스를 함께 사용할 때 유용합니다. enumerate() 함수는 (인덱스, 값)의 튜플을 반환하는 이터레이터(iterator)를 생성합니다.
- enumerate() 함수를 쓰면, 시퀀스의 요소값은 value값(출력했을 때 뒤에 위치하는 값)이 된다.
- iterable: 반복가능한, iterable자리에 시퀀스(변수) 삽입
#enumerate() 함수
enumerate(iterable,start값)
a=[1,2,3,4,5]
for i in enumerate(a): # enumerate()함수의 start기본값은 0
print(i) # enumerate()함수를 쓰면, 시퀀스의 요소값=value값
#행2개(인덱스,value값)을 튜플자료형으로 표현
b=['one','two','three','four','five']
for i,v in enumerate(b,1):
print(f'인덱스: {i}, value값: {v}')
3-3. zip()
zip()함수는 파이썬에서 여러 개의 반복 가능한(iterable) 객체를 병렬적으로 묶어주는 내장 함수입니다. 각 객체로부터 순서대로 하나의 요소씩 가져와 튜플로 묶어주는 이터레이터를 반환합니다. 주로 여러 개의 리스트나 튜플을 병렬적으로 처리하고자 할 때 사용됩니다.
- 첫번째 시퀀스를 1열, 두번째 시퀀스를 2열,...n번째 시퀀스는 n열이 오게 사용
#zip()함수 형태
zip(iterable1, iterable2,...)
#zip()
a=[1,2,3,4] #1열
b=['one','two','three','four'] #2열
c=['first','second','thrid','fourth'] #3열
d=['하나','둘','셋','넷'] #4열
for q,w,e,r in zip(a,b,c,d):
print(q,w,e,r)
zip()함수는 시퀀스값을 열방향으로 병렬 도치하는 방식으로 출력합니다. range()를 이용해 zip()함수를 동일한 결과로 출력할 수 있습니다. 하지만 rnage()함수는 1:1로 대응되지 않는다면 오류가 나옵니다. 또한, range()함수는 숫자를 이용하여 표현하는데, 실제 코드를 표현할 때, 숫자보다는 변수가 코드 표현과 수정하기 더 쉽다는 장점이 있습니다.
#zip()안에 변수를 사용하지 않고 출력
for q,w,e in zip('1234','abcd','가나다라'):
print(q,w,e)
# 튜플형으로 출력
for q in zip('1234','abcd','가나다라'):
print(q)
정리