1. 오늘 한 것
① while 반복문의 3가지 활용 패턴 및 range()
- 상태 기반: 리스트에 특정 값이 있는 '동안' remove()를 반복해 일괄 삭제.
- 시간 기반: time.time() + 5를 활용해 정확히 5초 동안만 루프를 돌리는 로직.
- 무한 루프 제어: while True:로 반복하다 특정 입력(y) 시 break로 탈출.
- range(): range(5), range(5, 10), range(0, 10, 3) 등 매개변수 생략 시 자동으로 채워지는 Default 파라미터 동작 실습.
② 파이썬의 꽃, 리스트 내포(List Comprehension)
- for문과 if문을 리스트 [] 안에 한 줄로 압축하여 새로운 배열을 만들어내는 고급 문법 실습.
# 1. 0~18까지 짝수만 제곱한 리스트
array = [i*i for i in range(0, 20, 2)]
# 2. "초콜릿"을 제외한 과일 리스트 필터링
array2 = ["사과", "자두", "초콜릿", "바나나"]
output = [fruit for fruit in array2 if fruit != "초콜릿"]
③ 복합 자료형(딕셔너리+리스트)의 계층적 탐색
- 딕셔너리(Dictionary) 안에 리스트가 있거나, 또 다른 딕셔너리가 중첩되어 있을 때 type() 함수를 활용해 분기 처리하는 방법 실습.
# 04_확인문제_4번.py 실습 발췌
for key in character:
if type(character[key]) is list: # Value가 리스트면 한번 더 for문
for list_item in character[key]:
print("{} : {}".format(key, list_item))
elif type(character[key]) is dict: # Value가 딕셔너리면 안으로 파고들기
for dict_item in character[key]:
print("{} : {}".format(dict_item, character[key][dict_item]))
④ 사용자 정의 함수 선언 (def) 및 반환값 (return)
- def 키워드를 사용하여 중복되는 코드를 하나의 블록으로 묶는 함수 기초 실습.
- 매개변수를 받아 내부 연산을 거친 후, return을 통해 결과값을 외부로 반환하는 로직 구현.
# 05_1_방정식만들기2.py 발췌
def mul(*values):
result = 1
for value in values:
result *= value
return result
print(mul(5, 7, 9, 10)) # 결과: 3150
⑤ 가변 매개변수(*values)와 키워드 매개변수 활용
- 가변 매개변수(*): 매개변수의 개수가 정해지지 않았을 때, 여러 개의 값을 튜플(Tuple) 형태로 한 번에 쓸어 담아 받는 문법.
- 키워드 매개변수: 함수 호출 시 매개변수 이름을 직접 명시(n=3)하여 기본값이 있는 파라미터를 건너뛰거나 특정 매개변수에만 값을 전달하는 방법.
2. 문제 / 헷갈린 점
① 복잡한 로직을 리스트 내포로 한 줄에 쓰기 (헷갈림주의..)
- 상황: 1~100 사이 숫자 중 2진수로 변환했을 때 0이 1개만 포함된 숫자를 구하는 로직을 한 줄로 짜려니 머리가 꼬임. [i for i in range(1, 101) if "{:b}".format(i).count("0")==1]
- 해결: 리스트 내포는 편리하지만 로직이 복잡해지면 가독성이 떨어짐. 한 번에 줄이려 하지 말고 일반 for문으로 먼저 풀어쓴 뒤 압축하는 연습이 필요함을 느낌.
② 중첩 딕셔너리에서 Key와 Value의 위치 혼동
- 상황: 계층형 딕셔너리 탐색 중 character[key][dict_item] 처럼 괄호가 연달아 나오자 현재 변수가 가리키는 것이 Key인지 Value인지 헷갈림.
- 해결: 주석으로 변수의 현재 상태를 일일이 매핑함. 구조가 복잡할 때는 디버깅 주석이 생명줄임을 체감함.
③ 가변 매개변수 뒤에 일반 매개변수가 올 때의 에러
- 상황: def print_n_times(*values, n=2): 처럼 가변 매개변수 뒤에 기본 매개변수를 배치했을 때, 값을 어떻게 넘겨야 할지 혼동됨.
- 해결: *values가 들어오는 값을 모두 빨아들이기 때문에, 그 뒤에 있는 매개변수에 값을 넣으려면 호출할 때 반드시 키워드 매개변수 방식(n=3)으로 명시해주어야 파이썬 엔진이 구분할 수 있다는 문법적 규칙을 이해함.
3. 오늘 배운 핵심
- while은 조건, for는 반복 횟수다: 횟수가 명확하지 않은 상태 제어(특정 값 삭제, 시간제어)에는 while이 유리하다.
- 리스트 내포는 파이썬의 무기다: 타 언어의 4~5줄짜리 배열 가공 코드를 한 줄로 끝낼 수 있다.
- 함수 매개변수의 유연성: *values를 사용해 인자 갯수의 제한을 없애고, 키워드=값 형태로 호출하여 함수 사용의 직관성을 극대화할 수 있다.
4. 다음 목표
- 변경할 수 없는 자료형인 '튜플(Tuple)'의 특성 학습하기.
- 함수를 매개변수로 전달하는 콜백(Callback)의 개념과 일회용 함수인 '람다(Lambda)' 문법 익히기.