학습일지

[스나이퍼팩토리] 한컴AI아카데미(26.04.23)

cd-record 2026. 4. 23. 18:18
리스트,튜플

 1. 리스트:  순서가 있고 수정 가능한(Mutable) 자료형

  • 메소드
메소드 설명 예시
.append(x) 리스트 끝에 항목 x를 추가 a.append(4)
.extend(list) 리스트 끝에 다른 리스트를 이어 붙임 a.extend([5, 6])
.insert(i, x) i번 인덱스 위치에 x를 삽입 a.insert(0, "start")
.remove(x) 리스트에서 첫 번째로 나오는 x를 삭제 a.remove(3)
.pop(i) i번 인덱스 요소를 삭제하고 반환 (비우면 마지막) val = a.pop()
.clear() 리스트의 모든 요소를 삭제 a.clear()
.index(x) x의 인덱스 위치를 반환` a.index("apple")
.count(x) 리스트 내 x의 개수를 세기 a.count(1)
.sort()
<=> a = sorted() 
리스트를 오름차순 정렬 (원본 변경)
sort 값을 a에 반환해주는 함수 
a.sort()
.sort(reverse=True) 리스트를 내림차순 정렬 (원본 변경) a.sort(reverse=True)
.reverse() 리스트 순서를 뒤집음 (원본 변경) a.reverse()
.copy() 리스트를 얕은 복사 b = a.copy()

 

2. 튜플:  순서가 있지만 수정 불가능한(Mutable) 자료형

  • 메소드
메소드 설명 예시
.count(x) 튜플 내 x의 개수를 반환 t.count(10)
.index(x) 튜플 내 x의 인덱스 위치를 반환 t.index("hi")

 

*리스트 vs 튜플 차이점

구분 리스트 (List) 튜플 (Tuple)
기본 기호 대괄호 [ ] 소괄호 ( )
변경 가능 여부 가능 (Mutable) 불가능 (Immutable)
수행 속도 상대적으로 느림 상대적으로 빠름
주 사용처 데이터가 수시로 변할 때 데이터가 고정되어야 할 때
메모리 사용 더 많은 메모리 사용 더 적은 메모리 사용

 

딕셔너리, 세트

 

1. 딕셔너리: 키(Key)와 값(Value)의 쌍으로 이루어진 자료형

  • 메소드
메소드 설명 예시
.keys() 모든 키를 객체로 반환 d.keys()
.values() 모든 값을 객체로 반환 d.values()
.items() 키-값 쌍을 튜플 묶음으로 반환 d.items()
.get(k, d) 키 k의 값을 반환 (키가 없으면 d 반환) d.get("name", "N/A")
.update(dict) 딕셔너리에 다른 딕셔너리를 합침 (수정/추가) d.update({"age": 20})
.pop(k) 키 k에 해당하는 값을 삭제하고 반환 val = d.pop("id")
.popitem() 마지막으로 추가된 키-값 쌍을 삭제하고 반환
(반환할 때는 튜플로 반환)
item = d.popitem()
.clear() 모든 요소를 삭제 d.clear()

 

2. 세트: 중복을 제거하거나 집합 연산(합집합, 교집합 등)을 수행할 때 주로 사용. (수정 가능(Mutable)하지만, 순서가 없어서 인덱싱(s[0])은 불가능))

  • 메소드
메소드 설명 예시
.add(x) 세트에 요소 x를 하나 추가 s.add(4)
.update(list) 여러 개의 요소를 한꺼번에 추가 s.update([5, 6, 7])
.remove(x) 요소 x를 삭제 (요소가 없으면 에러 발생) s.remove(3)
.discard(x) 요소 x를 삭제 (요소가 없어도 에러 없음) s.discard(10)
.pop() 임의의 요소를 삭제하고 반환 val = s.pop()
.clear() 모든 요소를 삭제 s.clear()
.union(s2) 합집합 반환 (연산자: |) s1.union(s2)
.intersection(s2) 교집합 반환 (연산자: &) s1.intersection(s2)
.difference(s2) 차집합 반환 (연산자: -) s1.difference(s2)

 

* 한눈에 비교하기

자료형 기호 순서(Index) 중복 허용 수정 가능 여부 주요 용도
리스트 [ ] O O O (Mutable) 가장 범용적인 데이터 목록
튜플 ( ) O O X (Immutable) 수정되면 안 되는 고정 값
딕셔너리 { } X (Key 활용) Key(X), Value(O) O (Mutable) 키-값 쌍으로 매핑된 데이터
세트 { } X X O 중복 제거, 집합 연산

 

** 예외처리

try:
    idx = a.index('d')
except ValueError:
    idx = -1
print(idx)

 

  • try: 블록:
    • a.index('d')를 실행합니다.
    • 만약 'd'가 리스트 a 안에 존재한다면, 그 위치(인덱스 번호)를 찾아 변수 id에 저장합니다.
  • except ValueError: 블록:
    • 파이썬의 index() 메서드는 찾는 값이 리스트에 없을 경우 ValueError를 발생시킵니다.
    • 에러가 발생하면 프로그램이 중단되지 않고, 이 except 블록으로 즉시 이동합니다.
    • 여기서 idx = -1을 실행하여, 값이 없음을 -1이라는 특수한 값으로 처리합니다.
  • print(idx):
    • 최종적으로 찾아낸 인덱스 번호 혹은 -1을 출력합니다.
*** 내장함수(min, max, sum)

 

a = [5, 3, 9]
print(min(a)) # 최소값
print(max(a)) # 최대값
print(sum(a)) # 합
print(sum(range(1,101)))

 

 
comprehension(컴프리헨션)

 

1. 컴프리헨션

반복 가능한 객체(리스트, 딕셔너리, 셋 등)를 생성할 때, 기존의 복잡한 for 루프 문법을 단 한 줄의 코드로 간결하고 직관적으로 작성할 수 있게 해주는 파이썬만의 강력한 기능

  • 컴프리헨션을 쓰는 이유
    • 가독성: 여러 줄의 for문을 한 줄로 줄여준다.
    • 성능: 파이썬 내부적으로 최적화되어있어 일반적으로 for루프보다 속도가 약간 더 빠르다.
  • 리스트 컴프리헨션 (List Comprehension)
    • 기본 문법: [표현식 for 항목 in 반복가능객체 if 조건문]
# 1부터 10까지의 숫자 중 짝수만 제곱하여 리스트 만들기
# 일반 for 루프 방식
result = []
for i in range(1, 11):
    if i % 2 == 0:
        result.append(i**2)

# 리스트 컴프리헨션 방식
result = [i**2 for i in range(1, 11) if i % 2 == 0]

 

  • 딕셔너리 컴프리헨션 (Dictionary Comprehension)
    • 기본 문법: {키: 값 for 항목 in 반복가능객체 if 조건문}
# 문자열 리스트를 키로, 그 길이를 값으로 하는 딕셔너리 생성
words = ["apple", "banana", "cherry"]
word_lengths = {word: len(word) for word in words}
# 결과: {'apple': 5, 'banana': 6, 'cherry': 6}

 

  • 셋 컴프리헨션 (Set Comprehension)
    • 리스트 컴프리헨션과 유사하지만, 대괄호 [] 대신 중괄호 {}를 사용하며 결과값의 중복을 제거
numbers = [1, 1, 2, 2, 3, 4, 5]
unique_squares = {x**2 for x in numbers}
# 결과: {1, 4, 9, 16, 25} (중복이 제거됨)

 

* 컴프리헨션과 삼항연산자 같이 쓸 때 주의

  • 문법 순서 기억하기
    • 필터링(if만 있을 때): [표현식 for 항목 in 리스트 if 조건]
    • 삼항 연산자(if-else): [값1 if 조건 else 값2 for 항목 in 리스트]

이 순서가 뒤섞이면 파이썬은 **SyntaxError**를 뱉습니다. "조건문이 for 뒤에 오면 단일 if만 가능하고, for 앞에 오면 if-else 구조여야 한다"는 점을 기억하세요.

  • 가독성 문제 (중요)

삼항 연산자와 컴프리헨션을 결합하면 코드가 길어지고 복잡해지기 쉽습니다. 특히 삼항 연산자 안에 또 다른 삼항 연산자를 넣는 중첩 삼항 연산은 절대 피하는 것이 좋습니다.

 

** 제너레이터

파이썬에서 데이터를 한 번에 하나씩만 메모리에 올려서 처리할 수 있게 해주는 특별한 함수이자 객체

 

Q. 제너레이터가 왜 중요한가요? (메모리 효율성)

데이터가 100만 개 있다고 가정

  • 일반 리스트: 100만 개의 데이터를 전부 메모리에 한꺼번에 올립니다. (메모리 사용량이 큼)
  • 제너레이터: 데이터가 필요할 때마다 하나씩만 꺼내 씁니다. (메모리 사용량이 극히 적음)

Q. 언제 사용하나요?

  1. 대용량 파일 읽기: 로그 파일처럼 매우 큰 파일을 한 줄씩 처리해야 할 때.
  2. 무한한 시퀀스: 숫자를 무한히 생성하거나, 끝을 알 수 없는 스트리밍 데이터를 처리할 때.
  3. 메모리 절약: 연산 과정에서 중간 리스트를 생성하지 않고 파이프라인처럼 연결할 때.

1. 제너레이터 만드는 법

함수 내부에서 return 대신 yield를 사용하면 그 함수는 제너레이터가 됩니다.

# 제너레이터 함수 정의
def number_generator():
    yield 1
    yield 2
    yield 3

# 제너레이터 객체 생성
gen = number_generator()

# next()를 호출할 때마다 다음 yield까지 실행됨
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
# print(next(gen)) # StopIteration 에러 발생 (더 이상 값이 없음)

 

2. 제너레이터 표현식 (Generator Expression)

리스트 컴프리헨션과 문법이 거의 같지만, [] 대신 ()를 사용합니다.

  • 리스트 컴프리헨션: [x for x in range(1000)] (메모리 즉시 할당)
  • 제너레이터 표현식: (x for x in range(1000)) (필요할 때 값을 생성하는 객체)

 

001.ipynb
0.02MB

 

 

 

 

 

 

느낀점

 

오늘은 자료형과 컴프리헨션에 대해 배웠다. 컴프리헨션은 for문을좀 더 간결하게 사용하기 위해 많이 쓰이는데 간단한 for문이 아닌 이상 이걸 활용하면 더 헷갈리기만 할 것 같다...이 부분은 알아두기만 하고 가끔 쓰는 게  나을 거 같다. 지금 이럴 때 내가 공부해야하는 부분을 같이 공부해야할 것 같은데 집 가면 체력이 없어 공부를 할 수가 없다....큰일 난 것 같다.......... 

 

 

 

 

 

 

 

——————————————————————————

본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.