리스트,튜플
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을 출력합니다.
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. 제너레이터 만드는 법
함수 내부에서 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)) (필요할 때 값을 생성하는 객체)
느낀점
오늘은 자료형과 컴프리헨션에 대해 배웠다. 컴프리헨션은 for문을좀 더 간결하게 사용하기 위해 많이 쓰이는데 간단한 for문이 아닌 이상 이걸 활용하면 더 헷갈리기만 할 것 같다...이 부분은 알아두기만 하고 가끔 쓰는 게 나을 거 같다. 지금 이럴 때 내가 공부해야하는 부분을 같이 공부해야할 것 같은데 집 가면 체력이 없어 공부를 할 수가 없다....큰일 난 것 같다..........
——————————————————————————
본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.
'학습일지' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴AI아카데미(26.04.27) (0) | 2026.04.28 |
|---|---|
| [스나이퍼팩토리] 한컴AI아카데미(26.04.24) (0) | 2026.04.24 |
| [스나이퍼팩토리] 한컴AI아카데미(26.04.22) (0) | 2026.04.22 |
| [스나이퍼팩토리] 한컴AI아카데미(26.04.21) (0) | 2026.04.21 |
| [스나이퍼팩토리] 한컴AI아카데미(26.04.17) (1) | 2026.04.17 |