앞서 제어문에서 while 반복문을 알아보았다. 항상 말하지만 파이썬은 리스트를 다루는 도구들이 잘 발달되어 있어서
데이터 분석에 많이 쓰인다!
오늘 알아볼 for문은 반복문을 list 개념을 이용해 반복하는 도구이다!
While VS For
상황에 따라서 while이 더 좋은 접근법이 될 수 있고, for이 더 좋은 접근법이 될 수 있다.
보통 while문은 종료 조건을 확실히 알 때, for문은 반복 횟수를 확실히 알 때 사용한다.
다음 예시를 살펴보자.
my_list = [2,3,4,5,6]
for number in my_list:
print(number)
my_list = [2, 3, 4, 5, 6]
i = 0
while i < len(my_list):
print(my_list[i])
i+=1
이 케이스에서는, 종료 조건보다 반복 횟수를 더 확실히 알고 있기에, for문이 더 깔끔해 보인다.
in keyword
in을 통해 리스트의 0번 인덱스부터 마지막 인덱스까지의 데이터가 number에 할당되어 반복된다.
Range함수
앞서 for문은 리스트를 기준으로 반복문을 list의 개념을 이용해 반복하는 도구라 했다.
그렇다면, 다른 언어와 달리 100번 반복을 하고 싶으면??
for(int i = 0 ; i < 100; i++){
###something###
}
자바의 경우, 간단히 범위 조건을 적어줌으로서 반복을 할 수 있다.
하지만 파이썬의 경우는,,, 리스트를 [0,1,2,,,,,99]까지 적어주어야 한다.
이런 단순반복노동은 프로그래밍 철학에 어긋나겠지?
따라서 우리는 range 함수를 이용해 반복문을 이용한다!
1. 파라미터 2개 쓰는 버전
range(start, stop)
- start 부터 stop-1 까지 리스트 반환
ex) range(3,11) # [3, 4, 5, 6,,,,10]
2. 파라미터 1개 쓰는 버전
range(stop)
- 0부터 stop-1 까지 리스트 반환
ex) range(10) #[0, 1, 2, ,,9]
3. 파라미터 3개 쓰는 버전
range(start, stop, step)
- start부터 stop-1 까지 step간격으로 리스트 반환
ex) range(3, 17, 3) # [3, 6, 9, 12, 15]
range(3, 15, 3) # [3, 6, 9, 12]
장점
- 간편하고 깔끔한 리스트 만들기 가능
- 메모리 효율성
메모리 효율성
range함수를 쓰면, 0을쓰고 버리고, 1을쓰고 버리고... 하기 때문에 메모리 공간을 절약 할 수있음.
안그러면 리스트 크기가 n 일때 n 을 저장할 메모리 공간이 필요함!
활용 예시
1. 구구단
for i in range(1,10):
for j in range(1,10):
print(f'{i} * {j} = {i*j}')
2. 피타고라스 삼조
피타고라스 삼조
피타고라스 삼조란, 피타고라스 정리(a^2 + b^2 = c^2a 2 +b 2 =c 2 )를 만족하는 세 자연수 쌍 (a, b, c)이다.
예를 들어, 3^2 + 4^2 = 5^2이기 때문에 (3, 4, 5)는 피타고라스 삼조이다다. a < b < c라고 가정할 때, a+b+c=400을 만족하는 피타고라스 삼조 (a, b, c)는 단 하나다. 이 경우, a * b * c얼마인가?
by hwany
for c in range(1,399):
for b in range(1,399):
for a in range(1,399):
if (a<b) and (b<c):
if a + b + c == 400:
if c**2 == a**2 + b**2:
print(f'{a*b*c}')
else:
continue
else:
continue
else:
continue
- 너무 문제의 흐름대로 코드를 짰다. 좀 더러워보이기도 한다..!
by Answer
for a in range(1, 400):
for b in range(1, 400):
c = 400 - a - b
if a * a + b * b == c * c and a < b < c:
print(a * b * c)
내가 지금까지 range 함수는 리스트를 리턴한다고 설명했다. 하지만 이는 엄밀히 말하면 잘못된 내용이다.
Range 함수는 List를 만드는 함수가 아니다.
sum = 0
for x in range(4):
sum=x+sum
print(sum) # 6
sum = 0
a = [0, 1, 2, 3]
for x in a:
sum=x+sum
print(sum) # 6
위 두 코드를 비교해보자.
첫 번째 코드는 range함수를 이용해서 for문을 돌렸고, 두 번째 코드는 실제 리스트를 선언해서 for문을 돌렸다.
이렇게만 본다면, range(4)는 [0, 1, 2, 3]이라는 list객체를 만드는 함수처럼 보이지만,,,
print(a) # 이를 실행하면 [0, 1, 2, 3]이 출력된다.
#################################################
print(range(4)) # 이를 실행하면 range(0, 4)가 출력된다.
#################################################
print(list(range(4))) # 이를 실행하면 [0, 1, 2, 3]이 출력된다.
[0, 1, 2, 3]
range(0, 4)
[0, 1, 2, 3]
자 과연 range 함수는 list를 리턴하는 함수인가?
즉, range도 list처럼 어떤 객체 유형을 생성하는 클래스이다.
다음 코드를 살펴보자!
a=range(4)
b=range(4)
print(id(a))
print(id(b))
140028825997648
140028825997984
range함수를 이용해 변수 a와 b에 할당했다. 만일 range 함수가 list를 리턴할 뿐이라면, a 와 b의 아이디가 같아야 하지만, 결과를 보면 서로 다른 메모리 주소를 차지하고 있는 것을 알 수 있다.
즉! 서로 다른 객체이다.
따라서, range()는 int()나 list()처럼 객체를 생성하는 클래스라는 것을 알 수 있다.
type(range)
# <class 'type'>
그렇다면... 과연 range가 생성하는 객체는 무엇일까?
iterable한 정수 원소를 가진 list 유사 객체라고 볼 수 있겠다!
iterable이란?
iterable한 객체라는 것은 그 객체의 원소를 차례로 꺼내서 그 원소를 가지고 반복적인 작업을 할 수 있는 객체를 말합니다.
그럼에도 불구하고, 범위를 정해서 원소를 자동으로 생성할 수 있다는 편리함이 있기 때문에
for 구문과 list() 클래스 함수의 경우 list 객체 대신 이 range() 클래스 함수가 많이 사용된다.
*출처 : https://post.naver.com/viewer/postView.nhn?volumeNo=27735641&memberNo=21815
2021-09-12
'Language > Python' 카테고리의 다른 글
7. 파이썬 문자열 (0) | 2021.09.12 |
---|---|
6. 파이썬 딕셔너리 (0) | 2021.09.12 |
4. 파이썬 리스트 (0) | 2021.09.10 |
3. 파이썬 제어문 (0) | 2021.09.07 |
2. 파이썬 추상화 (0) | 2021.09.06 |