20260322 오늘의 학습: Python 내장함수 정리

Yesol Lee·2026년 3월 22일

COS Python

목록 보기
6/18

지난 학습 요약

  • 문자열 처리 (split, join, replace, 회문) + 집합 연산 (합/교/차집합)
  • 11문제 풀이, 1차 정답률 73%
  • 함수 작성 시 하드코딩 → 일반화 패턴 학습

오늘 수업 계획

COS Pro 빈출 내장함수를 빠르게 정리하고, 문제 6개로 확인. 짧은 세션으로 진행.


학습 내용 정리

1. sorted() — 정렬의 핵심

nums = [3, 1, 4, 1, 5]
sorted(nums)                          # [1, 1, 3, 4, 5]
sorted(nums, reverse=True)            # [5, 4, 3, 1, 1]

# key 파라미터 — COS Pro 단골!
words = ["banana", "apple", "cherry"]
sorted(words, key=len)                # ['apple', 'banana', 'cherry']

students = [("철수", 85), ("영희", 92), ("민수", 78)]
sorted(students, key=lambda x: x[1])  # 점수 기준 정렬

sort()는 원본 변경, sorted()는 새 리스트 반환. 이전 세션에서 배운 내용의 복습이다.

2. enumerate() — 인덱스 + 값 동시 순회

fruits = ["사과", "바나나", "포도"]
for i, fruit in enumerate(fruits):
    print(i, fruit)
# 0 사과 / 1 바나나 / 2 포도

# start 파라미터로 시작 번호 지정
for i, fruit in enumerate(fruits, start=1):
    print(i, fruit)  # 1부터 시작

Java의 for(int i=0; i<arr.length; i++) 대신 Python은 enumerate()를 쓴다. 인덱스와 값이 동시에 필요할 때 필수.

3. zip() — 여러 리스트를 묶어서 순회

names = ["철수", "영희", "민수"]
scores = [85, 92, 78]

for name, score in zip(names, scores):
    print(f"{name}: {score}점")

# 딕셔너리 만들기
score_dict = dict(zip(names, scores))
# {'철수': 85, '영희': 92, '민수': 78}

길이가 다르면 짧은 쪽에 맞춰서 잘린다. dict(zip(키리스트, 값리스트))는 딕셔너리 생성의 정석 패턴이다.

4. map() — 모든 요소에 함수 적용

nums = ["1", "2", "3"]
list(map(int, nums))                      # [1, 2, 3]

nums = [1, 2, 3, 4]
list(map(lambda x: x ** 2, nums))         # [1, 4, 9, 16]

input().split()으로 받은 문자열을 숫자로 바꿀 때 list(map(int, input().split()))은 거의 공식이다.

5. filter() — 조건에 맞는 것만 걸러내기

nums = [1, 2, 3, 4, 5, 6]
list(filter(lambda x: x % 2 == 0, nums))  # [2, 4, 6]

리스트 컴프리헨션 [x for x in nums if x % 2 == 0]과 같은 결과. COS Pro에서는 둘 다 나오므로 두 방식 다 알아야 한다.

수업 중 질문: "filter()한 결과는 데이터타입이 뭐지? 굳이 list로 한번 감싸는 이유"

filter()는 리스트가 아니라 filter 객체(이터레이터)를 반환한다. map()도 마찬가지.

result = filter(lambda x: x % 2 == 0, nums)
print(type(result))  # <class 'filter'>

그래서 인덱스 접근(result[0])이나 len()을 쓰려면 list()로 감싸야 한다. 하지만 sorted(), for문, sum() 등에는 이터레이터를 바로 넣을 수 있다:

# list()로 감싸야 할 때: 인덱스 접근, len(), 출력 확인
lst = list(filter(lambda x: x > 3, nums))
print(lst[0])   # OK
print(len(lst))  # OK

# 안 감싸도 될 때: sorted(), for문, sum() 등
sorted(filter(lambda x: x > 3, nums))   # OK
for x in filter(lambda x: x > 3, nums): # OK

Java로 비유하면 Stream과 비슷하다 — .collect(Collectors.toList()) 해야 리스트가 되는 것처럼, Python도 list()로 감싸야 리스트가 된다.

6. any() / all() — 조건 한번에 검사

scores = [85, 92, 78, 60]
all(s >= 60 for s in scores)   # True — 전원 60점 이상?
any(s >= 90 for s in scores)   # True — 90점 이상이 한 명이라도?
  • any(): 하나라도 True면 True
  • all(): 전부 True여야 True

Java의 .stream().anyMatch() / .allMatch()와 같은 개념이다.

7. sum() — 합계

sum([1, 2, 3, 4, 5])           # 15
avg = sum(scores) / len(scores) # 평균 구하기

수업 중 질문: "평균 구하는 내장함수 없나?"

statistics 모듈에 mean()이 있지만, import가 필요한 모듈 함수다. COS Pro에서는 보통 sum(scores) / len(scores)로 직접 구한다. sum()이 내장함수이므로 import 없이 바로 쓸 수 있다.

8. 수학 관련 내장함수

abs(-5)           # 5 — 절대값
divmod(17, 5)     # (3, 2) — 몫과 나머지 동시에
pow(2, 10)        # 1024 — 거듭제곱

빠른 요약표 — Java 대응

Python 함수하는 일Java 대응
sorted(lst, key=)정렬 (새 리스트)Collections.sort()
enumerate(lst)인덱스+값 순회for(int i=0;...)
zip(a, b)병렬 순회직접 인덱스로 접근
map(func, lst)전체 변환.stream().map()
filter(func, lst)조건 필터.stream().filter()
any() / all()조건 검사.stream().anyMatch()
sum()합계.stream().sum()

9. 문제 풀이 하이라이트

평균 이상 점수 필터+정렬 (함수 작성)

def above_average(scores):
    avg_score = sum(scores) / len(scores)
    tmp_list = [x for x in scores if x >= avg_score]   # 리스트 컴프리헨션
    tmp_list2 = filter(lambda x: x >= avg_score, scores) # filter 버전
    return sorted(tmp_list2, reverse=True)

filter와 리스트 컴프리헨션 두 가지를 스스로 비교하며 작성했다. 둘 다 같은 결과이므로 본인이 편한 방식을 쓰면 된다.

zip+sorted+enumerate 조합 랭킹 (함수 작성)

def make_ranking(names, scores):
    pairs = sorted(list(zip(names, scores)), key=lambda x: x[1], reverse=True)
    result = []
    for idx, pair in enumerate(pairs):
        result.append(f"{idx+1}등: {pair[0]} ({pair[1]}점)")
    return result

오늘 배운 내장함수 3개를 자연스럽게 조합한 문제. enumerate에서 중첩 언패킹을 쓰면 더 깔끔하게 쓸 수도 있다:

for idx, (name, score) in enumerate(pairs, start=1):
    result.append(f"{idx}등: {name} ({score}점)")

start=1을 쓰면 idx+1 없이도 1부터 시작한다.


오늘의 결과

  • 6문제 전부 1차 정답률 100% — 내장함수 개념을 빠르게 흡수
  • 함수 작성에서 하드코딩 없이 일반화 성공 (개선 추세!)
  • 다음 학습: 튜플 활용 + 함수 심화, Phase 1 마무리를 향해
profile
문서화를 좋아하는 개발자

0개의 댓글