혼공파 66 ~ 69강
1. 이터러블/이터레이터/제너레이터 함수와 표현식
# for 요소 in 반복할수있는 것
# "이터러블": 반복할수있는 것
# Iterate + able
# 리스트, 튜플, 딕셔너리
# "이터레이터" : 이터러블을 만드는 방법 중 하나
# 이러한 이터레이터는 아래 3가지 방법으로 만들 있다.
# - 1. 제너레이터 표현식 : 메모리를 적게 사용하고 연산이 분산된다.
## 리스트 내포 : 메모리 사용량이 많다
'''[
표현식
for 요소 in 반복할수있는것
if 조건
]'''
범위 = range(1, 100 + 1)
리스트내포 = [
i * i
for i in 범위
]
print(리스트내포)
제너레이터표현식 = (
i * i
for i in 범위
)
print(제너레이터표현식)
# <generator object <genexpr> at 0x7f5d8a4470d0>
## next()함수를 사용해서 이터레이터의 요소들을 하나씩 순차적으로 꺼낼 수 있다.
print(next(제너레이터표현식)) # 1
print(next(제너레이터표현식)) # 4
print(next(제너레이터표현식)) # 9
for 요소 in 제너레이터표현식:
print(요소)
# 제너레이터표현식은 이터러블이므로 이렇게 반복문에 이터러블로 사용할 수 있다.
# - 2. 제너레이터 함수
# 내부에서 yield 키워드를 사용하는 함수는 제너레이터 함수이다.
def 제너레이터함수():
for i in range(1, 100+1):
yield i * i
제너레이터 = 제너레이터함수()
for 요소 in 제너레이터:
print(요소)
# - 3. 이터레이터 클래스 : 나중에
2. 가독성과 유지보수성
가독성 : 코드를 쉽게 읽고 이해할 수 있는 성질
유지보수 : 코드의 가독성이 높을수록 유지보수성이 올라간다.
- 현대의 프로그래밍은 가독성을 높이기위해 주석 보다는 함수를 많이 사용하여 기능을 쪼개고,
변수와 함수 이름을 적절하게 지정함으로 가독성을 높인다. - 현대의 컴파일러는 최적화를 통해 간단한 함수는 별도의 메모리 스택 사용없이
인라인 코드로 불러와서 실행하기 때문에 함수를 최대한 많이 만들어서
가독성을 높여도 프로그램 성능에 지장을 주지 않도록 한다. - 함수를 사용하면 유지보수 단계의 변경점을 쉽게 전체 프로그램에 반영할 수 있다.
3. 깊이우선탐색트리
# 알고리즘 연습 문제
# 100명의 사람이 하나 이상의 테이블에 나누어 앉는 모든 패턴을 구하라
# 한 개의 테이블에 앉을 수 있는 최대 사람 수는 10명이다.
# 한 개의 테이블에 누구도 혼자 앉아서는 안된다. 최소 2인
## 깊이 우선 탐색 트리
# 전체 사람수를 6명으로 제한해서 생각해 보기
전체사람수 = 6
counter = 0
def 그래프(노드, 이전화살표에적힌숫자):
if 노드 == 0:
global counter
counter += 1
print(f"{노드}에 진입")
for i in range(max(2, 이전화살표에적힌숫자), min(노드, 10) + 1):
print(f"{i} 화살표를 만듦")
그래프(노드 - i, i)
print(f"{노드}에서 리턴")
그래프(전체사람수, 0)
print(counter)
0명으로 딱 떨어져서 답이 될 수 있는 경우가 아래의 그림처럼 5가지이지만
테이블 번호와 사람을 구분하지 않으므로 4명 2명 과 2명 4명 테이블은 동일한 방법이 되어 하나만 카운트해야한다.
더 큰 숫자를 앉힌 경우는 다음 진행해서 이전에 앉힌 숫자보다 무조건 큰 경우만 따질 수 있게 하면 중복을 제거할 수 있다. (4명 앉히고서는 2명 앉히는 경우는 진행이 안됨, 따라서 2명 앉히고 4명 앉혀서 0명은 떨어진 부분만 카운트된다)
4. 깊이우선탐색트리 재귀함수에 메모화 적용으로 인한 개선
# 알고리즘 연습 문제
# 100명의 사람이 하나 이상의 테이블에 나누어 앉는 모든 패턴을 구하라
# 한 개의 테이블에 앉을 수 있는 최대 사람 수는 10명이다.
# 한 개의 테이블에 누구도 혼자 앉아서는 안된다. 최소 2인
## 깊이 우선 탐색 트리
전체사람수 = 100
메모 = {
# 키 : 값
# 함수의 매개변수 : 리턴
}
def 그래프(노드, 이전화살표에적힌숫자):
# 튜플 : 이뮤터블 자료형 -> 딕셔너리 키로 사용가능
# 메모 [(노드, 이전화살표에적힌숫자)]
if (노드, 이전화살표에적힌숫자) in 메모:
return 메모[(노드, 이전화살표에적힌숫자)]
# 일반적인 상황
리턴값 = 0
if 노드 == 0:
리턴값 += 1
else:
for i in range(max(2, 이전화살표에적힌숫자), min(노드, 10) + 1):
리턴값 += 그래프(노드 - i, i)
return 리턴값
print(그래프(전체사람수, 0)) # 437420
후오.. 어렵다...
'Base > Python' 카테고리의 다른 글
20. 파이썬 설치 및 환경설정 (0) | 2023.03.23 |
---|---|
19. 하노이의 탑 (재귀함수) (0) | 2023.03.10 |
17. 기본 파일처리 / CSV 파일 읽고 쓰기 (0) | 2023.03.08 |
16. 콜백함수 / map/filter 함수 / 람다 key 키워드 매개변수 (0) | 2023.03.03 |
15. 튜플/ 이뮤터블 자료 / 뮤터블 자료 (0) | 2023.03.03 |
댓글