1. 파이썬은 변수 선언 시에 자료형을 지정하지 않아도 되며, 자동으로 파이썬이 타입을 결정한다.
이를 동적 타이핑이라고 한다.
2. 파이썬 기본 데이터 타입
타입 |
설명 |
예시 |
int |
Integer |
10, -5 , 1000 |
float |
Floating Point |
3.14, -0.5 |
str |
String |
"Python" |
bool |
Boolean |
True, False |
list |
List |
[1, 2, 3], ["a", "b", "c"] |
tuple |
Tuple |
(1, 2, 3), ("a", "b") |
dict |
Dictionary |
{"Lang" : "Python", "Level":1} |
set |
set |
{1, 2, 3, 4} |
NoneType |
None |
None |
3. 정수형(int)
# 크기에 제한이 없다
a = 10
b = -5
c = 2**100
print(c)
4. 실수형(float)
# 소수점을 포함하며, 지수 표현 e를 사용할 수 있다.
a = 3.14
b = 1.2e3 #1.2 * 10^3
print(b)
5. 문자열(str)
# ', "로 감싼 문자열
a = "Hello"
print(s + " Wolrd) # 문자열 연결 방법
6. 불리언(bool)
#True, False 값을 가진다
flag = True
print(flag and False)
"""
파이썬 논리 연산자
and, or, not
"""
7. 리스트(list)
# 여러 데이터를 순서대로 저장하는 자료형
"""
수정 가능한 데이터 타입이다
"""
numbers = [1, 2, 3, 4, 5]
# 요소 추가
numbers.append(6) # 끝에 추가: [1, 2, 3, 4, 5, 6]
numbers.insert(0, 0) # 지정 위치에 추가: [0, 1, 2, 3, 4, 5, 6]
numbers.extend([7, 8]) # 리스트를 확장: [0, 1, 2, 3, 4, 5, 6, 7, 8]
# 요소 제거
numbers.pop() # 마지막 요소 제거하고 반환
numbers.pop(0) # 인덱스 0의 요소 제거하고 반환
numbers.remove(5) # 값이 5인 첫 요소 제거
numbers.clear() # 모든 요소 제거
# 검색과 정렬
numbers = [3, 1, 4, 1, 5, 9, 2]
numbers.index(4) # 값이 4인 요소의 인덱스 반환
numbers.count(1) # 값이 1인 요소의 개수 반환
numbers.sort() # 오름차순 정렬: [1, 1, 2, 3, 4, 5, 9]
numbers.sort(reverse=True) # 내림차순 정렬
numbers.reverse() # 리스트 순서 뒤집기
# 복사
numbers_copy = numbers.copy() # 리스트 복사
# 기타 유용한 내장 함수들
len(numbers) # 리스트 길이
sum(numbers) # 모든 요소의 합
max(numbers) # 최대값
min(numbers) # 최소값
# 슬라이싱 기본 개념
# 기본 문법: list[시작:끝:단계]
# - 시작 인덱스: 포함
# - 끝 인덱스: 미포함
# - 단계: 건너뛸 간격
numbers = [0, 1, 2, 3, 4, 5]
# 기본 슬라이싱
print(numbers[1:4]) # [1, 2, 3]
# 인덱스 1부터 3까지 추출 (4는 미포함)
# 처음부터 슬라이싱
print(numbers[:3]) # [0, 1, 2]
# 처음부터 인덱스 2까지
# 끝까지 슬라이싱
print(numbers[2:]) # [2, 3, 4, 5]
# 인덱스 2부터 끝까지
# 단계 지정 슬라이싱
print(numbers[::2]) # [0, 2, 4]
# 처음부터 끝까지 2칸씩 건너뛰며 추출
# 슬라이싱 실제 사용 예시
logs = ["2024-02-01 로그인", "2024-02-02 결제", "2024-02-03 로그아웃"]
recent_logs = logs[-3:] # 최근 3개의 로그만 보기
# ["2024-02-01 로그인", "2024-02-02 결제", "2024-02-03 로그아웃"]
email = "user@example.com"
domain = email[email.index("@")+1:] # 이메일에서 도메인만 추출
# "example.com"
phone = "010-1234-5678"
masked_phone = phone[:-4] + "****" # 전화번호 뒷자리 마스킹
# "010-1234-****"
# 컴프리헨션 기본 개념
# 기본 문법: [표현식 for 항목 in 반복가능객체 if 조건식]
# - 반복문과 조건문을 한 줄로 작성할 수 있게 해주는 기능
# - 리스트를 생성하는 간단하고 효율적인 방법
# 1. 기본 형태
numbers = [1, 2, 3, 4, 5]
squares = [x**2 for x in numbers]
# [1, 4, 9, 16, 25]
# 일반 반복문으로는:
# squares = []
# for x in numbers:
# squares.append(x**2)
# 2. 조건문 추가
even_squares = [x**2 for x in numbers if x % 2 == 0]
# [4, 16]
# 일반 반복문으로는:
# even_squares = []
# for x in numbers:
# if x % 2 == 0:
# even_squares.append(x**2)
# 3. 중첩 반복문
matrix = [[1, 2], [3, 4]]
flattened = [num for row in matrix for num in row]
# [1, 2, 3, 4]
# 일반 반복문으로는:
# flattened = []
# for row in matrix:
# for num in row:
# flattened.append(num)
# 컴프리헨션 실제 사용 예시
prices = [1000, 2000, 3000, 4000, 5000]
# 쇼핑몰에서 20% 할인된 가격 계산
sale_prices = [price * 0.8 for price in prices]
# [800.0, 1600.0, 2400.0, 3200.0, 4000.0]
scores = [85, 92, 78, 90, 87]
# 성적 관리 시스템에서 90점 이상인 학생 필터링
high_scores = [score for score in scores if score >= 90]
# [92, 90]
files = ["doc.txt", "image.jpg", "data.csv", "photo.jpg"]
# 이미지 파일만 필터링 (파일 관리 시스템)
image_files = [file for file in files if file.endswith('.jpg')]
# ["image.jpg", "photo.jpg"]
users = [
{"name": "Kim", "age": 25},
{"name": "Lee", "age": 30},
{"name": "Park", "age": 35}
]
# 회원 관리 시스템에서 이름만 추출
names = [user["name"] for user in users]
# ["Kim", "Lee", "Park"]
8. 튜플(tuple)
# 튜플 생성
numbers = (1, 2, 3)
single_item = (1,) # 요소가 1개일 때는 콤마 필수
empty = () # 빈 튜플
# 수정 불가능
numbers[0] = 5 # TypeError 발생!
# 패킹과 언패킹
coordinates = (3, 4) # 패킹
x, y = coordinates # 언패킹
# 나머지 값 한번에 언패킹하기 (*)
first, *rest = (1, 2, 3, 4, 5)
print(first) # 1
print(rest) # [2, 3, 4, 5]
numbers = (1, 2, 2, 3, 4, 5)
# 검색 관련
numbers.index(2) # 값 2의 첫 번째 인덱스: 1
numbers.count(2) # 값 2의 개수: 2
# 기타 내장 함수
len(numbers) # 튜플 길이: 6
max(numbers) # 최대값: 5
min(numbers) # 최소값: 1
sum(numbers) # 합계: 17
# 1. 좌표 시스템
point = (3, 4)
x, y = point # 언패킹
# 2. 함수에서 여러 값 반환
def get_user_info():
return ("Jyun", "jyun@email.com")
name, age, email = get_user_info()
# 3. 딕셔너리 키로 사용 (리스트는 불가능)
locations = {
(37.5665, 126.9780): "서울",
(35.1796, 129.0756): "부산"
}
# 4. 데이터 무결성이 필요한 경우
DAYS = ("월", "화", "수", "목", "금", "토", "일")
MONTHS = tuple(range(1, 13)) # (1, 2, ..., 12)
# 튜플의 장점
# 1. 메모리 효율성
# - 튜플이 리스트보다 메모리를 적게 사용
# 2. 실수로 인한 데이터 변경 방지
SETTINGS = (1920, 1080) # 화면 해상도
# 3. 더 빠른 실행 속도
# - 불변성 때문에 리스트보다 처리가 빠름
# 4. 딕셔너리 키로 사용 가능
cache = {
(1, 2): "some_value",
# [1, 2]: "error" # 리스트는 키로 사용 불가
}
# 튜플은 아래와 같은 경우에 주로 사용된다
# 1. 변경되면 안 되는 데이터
# 2. 함수의 반환 값
# 3. 딕셔너리의 키
# 4. 좌표나 RGB 색상값 같은 관련 데이터의 그룹화 등
9. 딕셔너리(dict)
# 딕셔너리 생성
user = {
"name": "Choe",
"Lang": "Python"
}
# 빈 딕셔너리 생성
empty_dict = {}
empty_dict2 = dict()
# 주의할 점
# 키는 반드시 불변(immutable) 타입이어야 함
valid_dict = {
"string": 1, # 문자열 키 (OK)
(1, 2): 2, # 튜플 키 (OK)
1: 3 # 숫자 키 (OK)
}
invalid_dict = {
[1, 2]: 1 # 리스트는 키가 될 수 없음 (Error)
}
# 주요 메서드
user = {"name": "Choe", "Lang": "Python"}
# 값 추가/수정
user["city"] = "Bucheon" # 새로운 키-값 추가
user["Game"] = "LostArk" # 기존 값 수정
# 값 삭제
del user["Lang"] # 특정 키-값 쌍 삭제
user.pop("city") # 키-값 쌍 삭제하고 값 반환
user.clear() # 모든 키-값 쌍 삭제
# 검색
print(user.get("name")) # 값 가져오기 (키가 없으면 None 반환)
print(user.get("hobby", "없음")) # 키가 없을 때 기본값 지정
# 키, 값, 쌍 가져오기
print(user.keys()) # 모든 키
print(user.values()) # 모든 값
print(user.items()) # 모든 키-값 쌍
# 딕셔너리 컴프리헨션
# 1부터 5까지의 제곱수 딕셔너리
squares = {x: x**2 for x in range(1, 6)}
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 조건부 딕셔너리 생성
even_squares = {x: x**2 for x in range(1, 6) if x % 2 == 0}
# {2: 4, 4: 16}
# 사용 예시
messages = {
"ko": {"welcome": "환영합니다"},
"en": {"welcome": "Welcome"},
"ja": {"welcome": "ようこそ"}
}
10. 집합(set)
# 중복을 허용하지 않고, 순서가 없는 자료형이다
# 집합 생성
numbers = {1, 2, 3, 3, 4, 4, 5} # {1, 2, 3, 4, 5} (중복 제거됨)
fruits = {'apple', 'banana', 'orange'}
# 빈 집합 생성
empty_set = set() # 주의: {}는 빈 딕셔너리가 됨!
# 다른 자료형으로부터 집합 생성
list_to_set = set([1, 2, 2, 3]) # {1, 2, 3}
text_to_set = set("Hello") # {'H', 'e', 'l', 'o'}
# 집합은 순서가 없음
set1 = {3, 1, 4, 1, 5}
print(set1) # 출력 순서가 입력 순서와 다를 수 있음
# 집합은 불변(immutable) 요소만 포함 가능
valid_set = {1, "hello", (1, 2)} # OK
invalid_set = {1, [2, 3], {4, 5}} # Error
# 집합 연산
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}
# 합집합
print(A | B) # {1, 2, 3, 4, 5, 6}
print(A.union(B)) # 위와 동일
# 교집합
print(A & B) # {3, 4}
print(A.intersection(B)) # 위와 동일
# 차집합
print(A - B) # {1, 2}
print(A.difference(B)) # 위와 동일
# 대칭 차집합 (합집합 - 교집합)
print(A ^ B) # {1, 2, 5, 6}
print(A.symmetric_difference(B)) # 위와 동일
# 주요 메서드
numbers = {1, 2, 3}
# 요소 추가/제거
numbers.add(4) # 요소 추가
numbers.remove(2) # 요소 제거 (없으면 에러)
numbers.discard(2) # 요소 제거 (없어도 에러 없음)
numbers.pop() # 임의의 요소 제거하고 반환
numbers.clear() # 모든 요소 제거
# 집합 관계 확인
A = {1, 2, 3}
B = {1, 2, 3, 4}
print(A.issubset(B)) # A가 B의 부분집합인가?
print(B.issuperset(A)) # B가 A를 포함하는가?
print(A.isdisjoint(B)) # A와 B는 교집합이 없는가?
# 실제 사용 예시
# 1. 중복 제거
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_numbers = list(set(numbers)) # [1, 2, 3, 4]
# 2. 친구 관계 분석
user1_friends = {"Kim", "Lee", "Park"}
user2_friends = {"Lee", "Choi", "Kim"}
common_friends = user1_friends & user2_friends # 공통 친구
# 3. 태그 시스템
post1_tags = {"python", "coding", "tutorial"}
post2_tags = {"python", "django", "web"}
all_tags = post1_tags | post2_tags # 모든 태그
# 4. 권한 관리
admin_permissions = {"read", "write", "delete"}
user_permissions = {"read", "write"}
if user_permissions.issubset(admin_permissions):
print("Valid permissions")
# 집합 컴프리헨션
# 짝수 집합 생성
evens = {x for x in range(10) if x % 2 == 0}
# {0, 2, 4, 6, 8}
# 문자열에서 모음만 추출
vowels = {char for char in "Hello World" if char.lower() in 'aeiou'}
# {'e', 'o'}
댓글