본문 바로가기

Programming/#Python

[Python] 제어문 (2) (실습 결과 포함)

본 포스팅은 책 「두근두근 파이썬」을 참고하여 공부한 내용의 정리본입니다. 

 

 

 


이전 게시글

두근두근 파이썬 Chapter 3 변수와 연산자 (1)

2021/01/10 - [Programming/#Python] - [Python] 두근두근 파이썬 Chapter 3 제어문 (1) (실습 결과 포함)

[Python] 두근두근 파이썬 Chapter 3 제어문 (1) (실습 결과 포함)

본 포스팅은 책 「두근두근 파이썬」을 참고하여 공부한 내용의 정리본입니다. 이전 게시글 두근두근 파이썬 Chapter 2 변수와 연산자 (fin) 2021/01/09 - [Programming/#Python] - [Python] 두근두근 파이썬 Ch..

jiwon-lee-it.tistory.com


0. 들어가며

이전 게시글에서는 파이썬의 기본 구조인 순차문을 비롯해 순차문 이외의 흐름문 중 조건문에 대해 중점적으로 다루었다. 이번 포스팅에서는 여러가지 제어문 중 반복문에 대해 중점적으로 다뤄보도록 한다.

 

1. for 반복문

특정한 작업을 여러 번 되풀이하고자 하는 경우, 우리는 반복문을 사용할 수 있다. 이러한 반복문에는 for문과 while문 두 종류가 존재한다. 이 둘을 비교해 보면, for문은 반복 횟수가 미리 정해져 있는 경우, while문은 반복 횟수는 모르지만 반복 조건이 명확한 경우에 사용한다. 

 

반복문을 사용하지 않을 때

만일 반복문을 사용하지 않고 특정 명령을 반복하고자 한다면 아래와 같이 손수 해당 명령을 반복하는 방법밖에 없다. 아래 예제에서는 5회 반복하였지만, 반복 횟수가 늘어나면 이런 방법은 매우 비효율적이다. 

>>> print('Welcome to everyone!!')
>>> print('Welcome to everyone!!')
>>> print('Welcome to everyone!!')
>>> print('Welcome to everyone!!')
>>> print('Welcome to everyone!!')

Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!

 

range() 함수

range() 함수는 특정 구간의 정수 열(sequence)을 반복해서 생성하는 기능으로, for 반복문에서 구문의 순환을 위해 사용된다. 

 

 

>>> for i in range(5): # 0 ~ 4까지 반복
	print("Welcome to everyone!!")

Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!

>>> for i in range(10):
	print('Welcome to everyone!!')
    
Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!
...
Welcome to everyone!! # 10회 반복

 

루프 제어변수의 익명화

위의 코드에서 i와 같은 문자는 실행문에서는 아무런 영향을 미치지 않는 단순 루프 변수이므로, i 이외의 변수 (eg. '_')로 익명화할 수 있다. 이러한 루프 변수를 C나 Java에서는 루프(loop) 제어 변수 라고 한다. 

>>> for _ in range(10):
	print('Welcome to everyone!!')

 

LAB 3-6: 반복문
# 문항 1
>>> for _ in range(5): 
	print('Hello, Python!')

Hello, Python!
Hello, Python!
Hello, Python!
Hello, Python!
Hello, Python!

# 문항 2
>>> for i in range(5):
	print(i)
    
0
1
2
3
4

 

2. range() 함수의 사용법

range() 함수는 다음과 같이 시작 값, 마지막 값, 증가치 값을 인수로 지정해줄 수 있다. 이때, 초기값과 증가치 값은 생략해서 사용할 수 있으며, 생략 시 각각의 디폴트 값은 0과 1이다. 여기서 주의할 점은 range() 함수가 실수 값을 인자로 가질 수 없다는 것이다. 반면, Numpy 모듈의 arange() 함수는 실수 값을 인자로서, 초기 값, 종료 값, 스텝 값을 지정해줄 수 있다. 

 

 

 

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

>>> list(range(0, 5))
[0, 1, 2, 3, 4] # 동일

>>> list(range(0, 5, 1))
[0, 1, 2, 3, 4] # 동일

>>> list(range(0, 5, 2))
[0, 2, 4]

>>> list(range(2, 5))
[2, 3, 4]

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

>>> list(range(1, 10, 2))
[1, 3, 5, 7, 9]

>>> list(range(-2, -10, -2))
[-2, -4, -6, -8] # 음수 간격 값을 사용할 수도 있음

 

위의 예제를 통해 확인할 수 있듯, range() 함수는 종료 값을 반환하지 않기 때문에 범위를 유의해서 설정해주어야 한다. 

 

 

 

또한, step size를 지정해주는 경우, 증가치가 양수일 때는 아래와 같이 시작 값이 종료 값보다 작아야 하며, 증가치가 음수인 경우 (eg. range(-2, -10, -2))에는 시작 값이 종료 값보다 커야 한다. 

 

 

 

LAB 3-7: range() 함수의 응용
# 문항 1
>>> list(range(1, 101, 1))
[1, 2, 3, 4, 5, ..., 100]

# 문항 2
>>> list(range(2, 101, 2))
[2, 4, 6, 8, 10, ..., 100]

# 문항 3
>>> list(range(1, 101, 2))
[1, 3, 5, 7, 9, ..., 99]

# 문항 4
>>> list(range(-1, -100, -1))
[-1, -2, -3, -4, -5, ..., -99]

 

 

range 메소드를 사용해 결과를 출력하면, 다음과 같이 한 번에 하나의 결과만 반환된다. 이때, 전체 결과 값을 한 줄에 보고 싶다면, 다음과 같이 end 키워드를 사용하여 디폴트 문자를 공백문자로 변경해주면 된다.  

# 기존 for문의 결과 값 반환
>>> for i in range(5):
	print(i)
    
0
1
2
3
4

# end를 사용하여 한 줄에 결과 값 반환
>>> for i in range(0, 5):
	print(i, end = ' ')
0 1 2 3 4

 

end 키워드를 사용함에 있어 range() 함수의 간격 값 역시 적용해줄 수 있다. 

>>> for i in range(2, 5):
	print(i, end = ' ')
print()

>>> for i in range(0, 10, 2):
	print(i, end = ' ')
print()

>>> for i in range(-2, -10, -2):
	print(i, end = ' ')
print()


2 3 4
0 2 4 6 8
-2 -4 -6 -8

 

3. 반복문의 활용

지금까지 다룬 반복문을 활용해 여러 가지 문제에 응용해보자. 

정수의 합 구하기

다음과 같이 1부터 10까지의 정수 값을 s라는 변수에 차례로 더해 누적 연산을 수행할 수 있다. 이때, 누적 합을 의미하는 변수 s의 이름을 sum과 같이 표현한다면, sum() 함수와 이름이 중복되어 함께 사용 시 오류가 발생할 수 있기에 s나 total 같은 이름으로 대체해야 한다. 

>>> s = 0
>>> for i in range(1, 11):
	s = s + i
>>> print('1에서 10까지의 합:', s)

1에서 10까지의 합: 55

 

위와 같은 경우, s값에 루프가 돌 때마다 1부터 10까지 변화하는 i의 값이 누적 연산되는 매커니즘이다. 이러한 각각의 중간 과정을 단계별로 출력해보면 다음과 같다. 이와 같은 결과는 위의 코드에 비해 전체 수행 과정을 확인할 수 있어 이해가 편하다.

>>> s = 0
>>> for i in range(1, 11):
	s += i
    print('i = {}, s = {}'.format(i, s))
    
>>> print('1에서 10까지의 합:', s)

i = 1, s = 1
i = 2, s = 3
i = 3, s = 6
i = 4, s = 10
...
i = 10, s = 55
1에서 10까지의 합: 55

 

LAB 3-8: 누적 덧셈의 응용
# 문항 1
>>> s = 0
>>> for i in range(1, 101):
	s += i
>>> print('1부터 100까지의 합:', s)
1에서 100까지의 합: 5050

# 문항 2
>>> s = 0
>>> for i in range(0, 101, 2):
	s += i
>>> print('1에서 100까지의 정수 중 짝수의 합:', s)
1부터 100까지의 정수 중 짝수의 합: 2550

# 문항 3
>>> s = 0
>>> for i in range(1, 100, 2):
	s += i
>>> print('1에서 100까지의 정수 중 홀수의 합:', s)
1부터 100까지의 정수 중 홀수의 합: 2500

 

input() 함수와 함께 응용하기

1부터 100까지의 수를 누적 연산하는 코드로 다음과 같이 구성할 수 있다. 이 경우, range() 메소드가 종료값을 포함하지 않기에 s에 반복해서 더해줄 대상을 i + 1로 설정하였다. 

>> n = int(input('합계를 구할 수를 입력하세요:'))
합계를 구할 수를 입력하세요: 100

>>> s = 0
>>> for i in range(0, n):
	s += i + 1
    
>>> print('1부터 {}까지의 합은 {}'.format(n, s))
1부터 100까지의 합은 5050

 

반면, 종료 값을 포함하지 않는 문제를 해결하기 위해 반복 횟수인 n을 조정해주는 방법도 있다. 이때, 아래와 같이 n을 n + 1로 조정해주면 종료 값 직전의 n의 값은 포함하기 때문에 의도한 목적을 달성할 수 있다. 

>>> n = int(input('합계를 구할 수를 입력하세요:'))
합계를 구할 수를 입력하세요: 100

>>> s = 0
>>> for i in range(1, n + 1):
	s += i

>>> print('1부터 {}까지의 합은 {}'.format(n, s))
1부터 100까지의 합은 5050

 

4. 팩토리얼 (factorial) 구하기

팩토리얼 연산은 임의의 자연수 n에 대해 1부터 n까지의 모든 자연수를 곱하는 연산이다. 해당 연산을 for 반복문을 사용해 표현하면 이전 예제와 같은 포맷에서 누적 덧셈을 누적 곱셈으로만 변경해주면 된다. 

 

팩토리얼 연산의 수학적 정의

 

>>> n = int(input('수를 입력하세요:'))
수를 입력하세요: 5

>>> fact = 1
>>> for i in range(1, n+1):
	fact *= i

>>> print('{}! = {}'.format(n, fact))
5! = 120

>>> n = int(input('수를 입력하세요:'))
수를 입력하세요.: 50

>>> fact = 1
>>> for i in range(1, n+1):
	fact *= i

>>> print('{}! = {}'.format(n, fact))
50! = 30414093201713378043612608166064768844377641568960512000000000000

 

위의 예제에서 50의 팩토리얼은 굉장히 큰 값을 반환한다. 이러한 수의 경우, C, Java와 같은 언어에서는 표현 가능한 숫자의 범위를 초과하지만, 파이썬은 정수 표현의 한계가 없기에 아무리 큰 수라도 잘 표현할 수 있다. 

 

5. for 문과 리스트
for in 구문

for- in 구문에 리스트를 적용하면 루프가 돌 때마다 리스트의 각 원소를 차례로 순회 방문하는 프로그램을 짤 수 있다. 이를 위해 아래와 같이 for 변수 in 리스트 자료형으로 반복문을 구성하여 리스트 길이 내에서 변수가 리스트의 각 원소를 차례로 참조하도록 할 수 있다. 

 

 

 

이와 같이 for-in 구문을 활용한 순회 방문 원리는 정수형 객체 뿐만 아니라 실수형, 문자열 형 객체에서도 적용할 수 있다. 

# 리스트의 정수 객체 순회
>>> numbers = [11, 22, 33, 44, 55, 66]
>>> for number in numbers:
	print(number, end = ' ')

11 22 33 44 55 66

# 리스트의 실수 객체 순회
>>> f_numbers = [1.1, 2.5, 3.7, 5.6, 9.2, 11.3, 6.8]
>>> for f in f_numbers:
	print(f, end = ' ')
    
1.1 2.5 3.7 5.6 9.2 11.3 6.8

# 리스트의 문자열 객체 순회
>>> summer_fruits = ['수박', '참외', '체리', '포도']
>>> for fruit in summer_fruits:
	print(fruit, end = ' ')

수박 참외 체리 포도

 

누적 덧셈 기능의 응용

이전에 다룬 누적 연산 기능에 대해서도 숫자를 직접 정의하지 않고 리스트로써 누적 연산할 수도 있다.

>>> numbers = [10, 20, 30, 40, 50]

>>> s = 0
>>> for number in numbers:
	s += number

>>> print('리스트 항목 값의 합:', s)
리스트 항목 값의 합: 150

 

이때, 리스트 원소의 합은 위와 같이 for 반복문을 사용하지 않고도 내장함수 sum()을 이용하여 간편하게 구할 수 있다. 

>>> numbers = [10, 20, 30, 40, 50]
>>> print('리스트 항목 값의 합:', sum(numbers))
리스트 항목 값의 합: 150

# sum() 함수와 range() 함수
>>> print('1에서 100까지의 합:', sum(range(0, 101)))
1에서 100까지의 합: 5050

 

문자열 자료형의 리스트 객체화

문자열 자료형은 다음과 같이 list() 함수로 형 변환이 가능하다. 이렇게 변환한 문자열을 for-in 구문에 적용하면 문자 단위로 각각 순회할 수 있다. 

>>> st = 'Hello'
>>> list(st)
['H', 'e', 'l', 'l', 'o]

# for-in 구문에서의 활용'''
>>> for ch in 'Hello':
	print(ch, end = ' ')
H e l l o

다음 게시글

두근두근 파이썬 Chapter 3 제어문 (3)

2021/01/12 - [Programming/#Python] - [Python] 두근두근 파이썬 Chapter 3 함수와 입출력 (3) (실습 결과 포함)

 


 

 

 

 

I'm a Senior Student in Data Science ! 

데이터 사이언스를 공부하고 있는 4학년 학부생의 TIL 블로그입니다. 게시글이 도움 되셨다면 구독과 좋아요 :)