# for문
my_list = [2, 3, 5, 7, 11]
for number in my_list: # number : 변수, my_list : 리스트 변수 이름
print(number)
for문 : 어떤 반복 가능한 객체들을 순차적으로 처리할 때 유용함
# range 함수
for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
print(i)
'''
파라미터 1개 버전
for i in range(stop):
print(i)
→ 0부터 stop-1 까지의 범위
'''
for i in range(10): # 0 ~ 9 (for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]: 와 같음)
print(i)
'''
파라미터 2개 버전
for i range(start, stop):
print(i)
→ start부터 stop-1까지의 범위
'''
for i in range(3, 11): # 3 ~ 10 (for i in [3, 4, 5, 6, 7, 8, 9, 10]: 와 같음)
print(i)
'''
파라미터 3개 버전
for i in range(start, stop, step):
print(i)
→ start부터 stop-1까지의 범위, 간격 : step
'''
for i in range(3, 17, 3): # 간격 3씩, 3 ~ 16 (for i in [3, 6, 9, 12, 15]: 와 같음)
print(i)
print()
for i in range(3, 16, 3): # 간격 3씩, 3 ~ 15 (for i in [3, 6, 9, 12, 15]: 와 같음)
print(i)
print()
for i in range(3, 15, 3): # 간격 3씩, 3 ~ 14 (for i in [3, 6, 9, 12]: 와 같음)
print(i)
range 장점
- 간편함
- 깔끔함
- 메모리 효율성
# 실습과제
numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
# 인덱스와 원소 출력
for i in range(len(numbers)):
print(i, numbers[i])
for i in range(11):
print(f"2^{i} = {2 ** i}")
for dan in range(1, 10):
for i in range(1, 10):
print(f"{dan} * {i} = {dan * i}")
for a in range(1, 334):
for b in range(a + 1, 500):
c = 1000 - a - b
if a * a + b * b == c *c and b < c:
print(a * b * c)
numbers = [2, 3, 5, 7, 11, 13, 17, 19]
new_numbers = []
for i in range((len(numbers))):
new_numbers.append(numbers.pop())
print("뒤집어진 리스트: " + str(new_numbers))
과제 해설
접근법 #1 리스트를 뒤집기 위해서는, 서로 대칭인 원소들의 위치를 바꿔야(swap)한다.
- 대칭 관계 이해하기
서로 대칭이 되는 인덱스를 찾아야 한다.
인덱스 0과 대칭되는 위치는 인덱스 len(numbers) - 1 이다.
인덱스 1과 대칭되는 위치는 인덱스 len(numbers) - 2 이다.
인덱스 2과 대칭되는 위치는 인덱스 len(numbers) - 3 이다.
대칭되는 두 인덱스를 left 와 right 라 하자.
right = len(numbers) - left - 1 로 관계를 표현할 수 있다.
- 반복문 돌기
반복문을 돌면서 left 요소와 right 요소의 위치를 바꿔야 한다.
numbers = [2, 3, 5, 7, 11, 13, 17, 19]
# 리스트 뒤집기
for left in range(len(numbers)):
# 인덱스 left와 대칭인 인덱스 right 계산
right = len(numbers) - left - 1
# 위치 바꾸기
temp = numbers[left]
numbers[left] = numbers[right]
numbers[right] = temp
print("뒤집어진 리스트: " + str(numbers))
이렇게 하면 리스트가 뒤집히지 않은 상태로 출력된다.
이유 : for문을 left 가 0일 때부터 left 가 len(numbers) - 1 일 때까지 반복한다. 사실 left 가 그렇게 끝까지 돌 필요가 없다. 그냥 리스트 길이의 반만 돌아도 리스트를 뒤집을 수 있기 때문.
오히려 리스트 길이의 반을 넘게 돌면, 잘 바꿔 놨던 위치를 다시 원상 복구하는 셈이다.
접근법 #2 위치 바꾸기를 쉽게 할 방법 : 자료형 튜플 (tuple) 이용
korean_names = ('효선', '유신')
english_names = 'hyoseon', 'yusin'
print(type(korean_names))
print(type(english_names))
괄호를 사용하거나 , (comma)로만 각 요소를 구분해도 튜플로 인식 가능
numbers = [2, 3, 5, 7, 11, 13, 17, 19]
# 리스트 뒤집기
for left in range(len(numbers) // 2):
# 인덱스 left와 대칭인 인덱스 right 계산
right = len(numbers) - left - 1
# 위치 바꾸기
numbers[right], numbers[left] = numbers[left], numbers[right]
print("뒤집어진 리스트: " + str(numbers))
위와 같이 쓰게 되면 지정연산자(=) 의 오른쪽에 있는 튜플이 위치가 바꾸기 전의 numbers[left], numbers[right] 의 값을 보관하게 된다. 그리고 numbers[right], numbers[left] 에 해당하는 요소에 값을 각각 할당하게 되면서 이전 코드처럼 임시 변수를 만들지 않고도 값을 교환할 수 있다.
답
numbers = [2, 3, 5, 7, 11, 13, 17, 19]
# 리스트 뒤집기
for left in range(len(numbers) // 2):
# 인덱스 left와 대칭인 인덱스 right 계산
right = len(numbers) - left - 1
# 위치 바꾸기
numbers[right], numbers[left] = numbers[left], numbers[right]
print("뒤집어진 리스트: " + str(numbers))