Python 기초 문법 정리

2026. 7. 14. 15:28·TIL/Python

Python 기초 문법 정리

변수, 자료형, 문자열, 리스트, 오류 읽기, 딕셔너리, 집합까지 데이터 분석을 위한 Python 기본기를 하나의 흐름으로 정리한다.

Python 변수 자료형 CRUD 문자열 리스트 딕셔너리 집합 인덱싱 슬라이싱 오류 메시지
📕 글의 목적

 이 글은 Python 기초 문법을 데이터 분석 학습의 출발점으로 정리한 글이다. 단순히 문법을 나열하는 것이 아니라, 데이터를 저장하고 필요한 형태로 가공하는 흐름을 기준으로 변수, 자료형, 문자열, 리스트, 딕셔너리, 집합, 오류 해결 방법을 연결한다. 이후 Pandas, 머신러닝, 자동화 코드를 작성하기 위한 기본기를 만드는 것이 핵심이다.

목차
  1. Python 기초 학습의 전체 흐름
  2. Python을 사용하는 이유
  3. Python 개발 환경과 실행 방식
  4. 변수와 기본 연산
  5. 자료형과 CRUD 관점
  6. 문자열: 생성, 인덱싱, 슬라이싱, 메소드
  7. 리스트: 순서가 있는 변경 가능한 자료형
  8. Python 오류 메시지 읽기
  9. 딕셔너리: 키와 값으로 데이터를 관리하는 자료형
  10. 집합: 중복 제거와 집합 연산
  11. 종합 예제와 퀴즈 해설
  12. 전체 흐름 요약과 핵심 정리
  13. 참고 자료

1. Python 기초 학습의 전체 흐름

Python 기초 학습은 문법을 암기하는 과정이 아니다. 데이터 분석 관점에서 보면 Python 문법은 데이터를 저장하고, 조회하고, 수정하고, 삭제하며, 필요한 형태로 가공하기 위한 도구이다. 따라서 변수와 자료형을 따로 외우기보다, 데이터가 코드 안에서 어떤 형태로 존재하고 어떻게 조작되는지를 기준으로 이해해야 한다.

전체 학습 흐름은 Python의 특징과 개발 환경을 이해한 뒤, 변수와 연산자로 데이터를 저장하고 계산하는 것에서 시작한다. 이후 문자열, 리스트, 딕셔너리, 집합처럼 자주 사용하는 자료형을 CRUD 관점으로 학습하고, 인덱싱과 슬라이싱으로 데이터에 접근하는 방법을 익힌다. 마지막으로 오류 메시지를 읽는 방법을 알면 이후 조건문, 반복문, 함수, Pandas 학습으로 자연스럽게 확장할 수 있다.

🚩 핵심 흐름

 Python 기초 문법은 변수 → 연산자 → 자료형 → 인덱싱/슬라이싱 → 자료형별 CRUD → 오류 해결 → Pandas 기반 데이터 분석으로 이어진다. 이 흐름을 잡아두면 문법 하나하나를 따로 외우는 것보다 실제 코드 작성에 더 빨리 연결된다.

단계 학습 내용 데이터 분석과의 연결
1 Python 특징과 개발 환경 이해 코드를 어디서 작성하고 실행할지 결정한다.
2 변수와 연산자 데이터를 이름으로 저장하고 계산한다.
3 자료형 데이터 구조에 맞는 처리 방식을 선택한다.
4 인덱싱과 슬라이싱 필요한 위치의 데이터를 선택한다.
5 CRUD와 메소드 데이터를 생성, 조회, 수정, 삭제한다.
6 오류 메시지 해석 코드 실행 중 발생하는 문제를 스스로 해결한다.

(여기에 Python 기초 학습 흐름 이미지를 삽입)

Python 문법이 변수, 자료형, 자료형별 조작, 오류 해결, 데이터 분석으로 확장되는 흐름.

2. Python을 사용하는 이유

Python은 문법이 비교적 간결하고, 데이터 분석과 인공지능 분야에서 사용할 수 있는 라이브러리가 풍부한 프로그래밍 언어이다. 특히 데이터 분석을 학습하는 입장에서는 자료를 불러오고, 정제하고, 시각화하고, 모델에 입력하는 전체 과정을 하나의 언어로 이어갈 수 있다는 장점이 크다.

2.1  문법이 간결하다

같은 결과를 출력하더라도 Python은 다른 언어보다 작성해야 하는 코드가 짧다. 예를 들어 문자열 하나를 출력하려면 다음 한 줄이면 충분하다.

print("Hello World!")

Java나 C에서는 프로그램 실행을 위한 기본 구조를 별도로 작성해야 하지만, Python은 간단한 출력이나 계산을 빠르게 실행할 수 있다. 다만 Python이 모든 면에서 쉽다는 의미는 아니다. 기본 문법은 간결하지만, 데이터 구조, 객체, 함수, 클래스, 라이브러리 활용으로 넘어가면 체계적인 학습이 필요하다.

2.2  다양한 라이브러리를 사용할 수 있다

Python의 강점은 라이브러리 생태계이다. 라이브러리는 다른 개발자가 미리 작성해 둔 기능의 모음이다. 모든 기능을 처음부터 직접 구현하지 않고, 목적에 맞는 기능을 가져와 사용할 수 있다.

분야 대표 라이브러리 주요 용도
데이터 처리 Pandas, NumPy 데이터 정제, 계산, 변환
데이터 시각화 Matplotlib, Seaborn 그래프 작성
통계 분석 SciPy, Statsmodels 통계 검정, 회귀 분석
머신러닝 Scikit-learn 분류, 회귀, 군집화
딥러닝 PyTorch, TensorFlow 신경망 모델 개발
웹 개발 Django, Flask, FastAPI 웹 서비스 개발
자동화 Selenium, BeautifulSoup 웹 자동화, 데이터 수집

2.3  다른 언어와 연동할 수 있다

Python은 C, C++, Java 등 다른 언어와 함께 사용할 수 있다. 계산 속도가 중요한 부분은 C나 C++로 구현하고, 전체 데이터 처리와 분석 흐름은 Python으로 작성하는 방식이 가능하다. 실제로 NumPy와 Pandas 내부의 많은 연산은 C 또는 Cython 기반으로 구현되어 있어, Python 문법으로 작성하더라도 내부적으로는 빠른 연산을 활용할 수 있다.

2.4  Python 학습 방법

Python 학습 방식은 크게 Bottom-up 방식과 Top-down 방식으로 나눌 수 있다. Bottom-up은 변수, 자료형, 조건문, 반복문, 함수, 클래스처럼 기초 문법부터 쌓아가는 방식이다. Top-down은 먼저 프로젝트나 문제를 정하고, 필요한 문법과 라이브러리를 그때그때 익히는 방식이다.

방식 흐름 장점 주의점
Bottom-up 기초 문법 → 함수/클래스
→ 라이브러리 → 프로젝트
기본기를 체계적으로 쌓을 수 있다. 실제 활용까지 시간이 오래 걸릴 수 있다.
Top-down 프로젝트 목적
→ 필요한 문법 학습 → 적용
활용 목적을 빠르게 이해할 수 있다. 기초가 약하면 코드 복사에 그칠 수 있다.
 가장 효과적인 방식은 기초 문법을 순서대로 학습하면서 작은 예제나 프로젝트에 바로 적용하는 것이다. 문법만 공부하면 활용 감각이 부족해지고, 프로젝트만 따라 하면 기본 개념이 비어 있을 수 있기 때문이다.

3. Python 개발 환경과 실행 방식

 IDE는 Integrated Development Environment의 약자로, 코드를 작성하고 실행하고 오류를 확인할 수 있는 통합 개발 환경을 의미한다. Python 코드는 일반적으로 .py 파일 또는 .ipynb 파일에서 작성한다.

3.1  .py 파일과 .ipynb 파일

.py 파일은 일반적인 Python 프로그램이나 프로젝트 코드를 작성할 때 사용한다. 파일 전체가 위에서 아래로 실행되며, 함수나 클래스를 여러 파일로 관리하는 프로젝트에 적합하다.

.ipynb 파일은 Jupyter Notebook과 Google Colab에서 사용하는 노트북 파일이다. 코드를 셀 단위로 나누어 실행할 수 있고, 코드 사이에 설명과 이미지를 넣을 수 있어 데이터 분석과 시각화 학습에 적합하다.

환경 특징 적합한 상황
VS Code 다양한 언어와 확장 기능을 지원한다. 일반 Python 프로젝트, 데이터 분석, 웹 개발
PyCharm Python 프로젝트 개발에 특화되어 있다. 규모 있는 Python 프로젝트
Jupyter Notebook 셀 단위 실행이 가능하다. 분석 실습, 시각화, 학습 노트
JupyterLab 파일과 노트북을 함께 관리하기 편하다. 여러 노트북과 데이터 파일을 함께 다룰 때
Google Colab 별도 설치 없이 웹에서 실행할 수 있다. 간단한 실습, GPU 실험, 공유용 노트북
❗ Jupyter Notebook에서 주의할 점

 노트북 환경에서는 코드 작성 순서와 실행 순서가 달라질 수 있다. 이전 셀을 실행하지 않고 다음 셀을 실행하면 변수가 정의되지 않아 NameError가 발생할 수 있다. 오류가 날 때는 코드 자체뿐 아니라 셀 실행 순서도 함께 확인해야 한다.

4. 변수와 기본 연산

 변수는 데이터를 저장하기 위해 붙이는 이름이다. Python에서 변수는 값을 직접 담는 상자라기보다, 메모리에 존재하는 객체를 가리키는 이름에 가깝다.

a = 1
name = "Alice"

 위 코드에서 a와 name은 변수이고, 1과 "Alice"는 변수에 저장된 값이다. =는 두 값이 같다는 의미가 아니라 오른쪽 값을 왼쪽 변수에 할당한다는 의미이다.

a = 10
b = a

 이 경우 a와 b는 같은 정수 객체 10을 참조한다. 이 관점은 나중에 리스트처럼 변경 가능한 자료형을 다룰 때 중요해진다.

4.1  변수 이름 작성 규칙

user_name = "Alice"
data_2026 = 100

 변수 이름에는 영문자, 숫자, 언더바를 사용할 수 있다. 단, 첫 글자에 숫자를 사용할 수 없고, 띄어쓰기를 사용할 수 없으며, Python 예약어를 변수 이름으로 사용할 수 없다. 또한 Python은 대소문자를 구분한다.

name = "Alice"
Name = "Bob"

name과 Name은 서로 다른 변수이다. 다음과 같은 변수 이름은 사용할 수 없다.

1data = 10      # 숫자로 시작
user name = ""  # 띄어쓰기 사용
class = 1       # 예약어 사용

4.2  주석

 주석은 코드에 설명을 작성할 때 사용하며 프로그램 실행에 영향을 주지 않는다. 주석은 코드가 무엇을 하는지 그대로 반복하기보다, 왜 그렇게 작성했는지 또는 어떤 점을 주의해야 하는지 기록하는 데 쓰는 것이 좋다.

# 사용자 이름 저장
user_name = "Alice"

4.3  사칙연산과 연산자 우선순위

 Python에서는 기본적인 사칙연산과 나머지, 몫, 거듭제곱 연산을 사용할 수 있다.

연산자 의미 예시 결과
+ 덧셈 a + b 13
- 뺄셈 a - b 7
* 곱셈 a * b 30
/ 나눗셈 a / b 3.333...
// 몫 a // b 3
% 나머지 a % b 1
** 거듭제곱 a ** b 1000
a = 10
b = 3

print(a + b)
print(a // b)
print(a % b)
print(b ** 2)

/ 연산의 결과는 일반적으로 실수형 float로 반환된다. 수학식과 마찬가지로 곱셈과 나눗셈이 덧셈과 뺄셈보다 먼저 계산되며, 계산 순서를 명확하게 하고 싶으면 괄호를 사용한다.

2 + 3 * 4
# 14

(2 + 3) * 4
# 20

5. 자료형과 CRUD 관점

 자료형은 데이터의 종류와 해당 데이터에 사용할 수 있는 연산을 결정한다. 같은 값처럼 보여도 자료형이 다르면 사용할 수 있는 연산과 메소드가 달라진다.

age = 25
height = 175.5
name = "Alice"
is_student = True

print(type(age))
# <class 'int'>
자료형 의미 예시
int 정수 10, -5
float 실수 3.14, -0.5
str 문자열 "Python"
bool 논리값 True, False
list 순서가 있는 데이터 집합 [1, 2, 3]
tuple 변경할 수 없는 순서형 집합 (1, 2, 3)
dict 키와 값의 쌍 {"name": "Alice"}
set 중복이 없는 집합 {1, 2, 3}

5.1  CRUD로 자료형 이해하기

 CRUD는 데이터를 다룰 때 수행하는 네 가지 기본 작업이다. 문자열, 리스트, 딕셔너리, 집합은 구조가 다르지만 모두 생성, 조회, 수정, 삭제 관점으로 정리할 수 있다.

구분 의미 설명
Create 생성 데이터를 새로 만들거나 추가한다.
Read 조회 저장된 데이터에 접근한다.
Update 수정 기존 데이터를 변경한다.
Delete 삭제 데이터를 제거한다.
❗ 문자열은 수정할 수 없다

 문자열은 인덱싱과 슬라이싱으로 조회할 수 있지만, 내부 문자 하나를 직접 수정할 수 없다. 문자열을 수정하려면 새로운 문자열을 만들어 변수에 다시 할당해야 한다.

6. 문자열 : 생성, 인덱싱, 슬라이싱, 메소드

 문자열은 문자들의 순서 있는 집합이다. 작은따옴표 또는 큰따옴표로 작성하며, 여러 줄 문자열은 따옴표 세 개를 사용한다. 따옴표는 문자열의 시작과 끝을 나타낼 뿐 실제 출력 결과에는 포함되지 않는다.

text1 = "Python"
text2 = 'Python'

message = '저는 "Python"을 공부합니다.'

my_str = """가나다
라마바
사아자"""

print(type(my_str))
# <class 'str'>

6.1  인덱싱

 인덱싱은 문자열에서 특정 위치의 문자 하나를 선택하는 것이다. Python의 인덱스는 0부터 시작한다. 음수 인덱스는 뒤에서부터 접근한다.

text = "Python"

text[0]
# 'P'

text[1]
# 'y'

text[-1]
# 'n'
문자열 Python의 인덱스 구조

문자 : P y t h o n

양수 인덱스 : 0 1 2 3 4 5

음수 인덱스 : -6 -5 -4 -3 -2 -1

(여기에 문자열의 양수·음수 인덱스 구조 이미지 삽입)

문자열 Python에서 양수 인덱스는 앞에서부터, 음수 인덱스는 뒤에서부터 접근하는 구조.

6.2  슬라이싱

 슬라이싱은 문자열의 일정 범위를 잘라내는 방법이다. 기본 형식은 text[start:stop:step]이며, start 위치부터 stop 위치 바로 전까지 선택한다.

text = "Python"

text[0:2]
# 'Py'

text[:4]
# 'Pyth'

text[2:]
# 'thon'

text[-3:]
# 'hon'

text[::2]
# 'Pto'

text[::-1]
# 'nohtyP'

슬라이싱에서 가장 자주 헷갈리는 지점은 끝 인덱스가 포함되지 않는다는 점이다. 다음 코드에서 결과가 문자 하나인 이유는 0부터 1 바로 전까지만 가져오기 때문이다.

my_str = "가나다"

my_str[0:1]
# '가'

my_str[0]
# '가'

(여기에 슬라이싱에서 마지막 인덱스가 포함되지 않는 구조 이미지 삽입)

text[0:2]가 0번과 1번 문자를 가져오고 2번 문자는 포함하지 않는 구조.

6.3  문자열의 불변성

문자열은 한 번 생성되면 내부 문자를 직접 변경할 수 없다.

text = "Python"
text[0] = "J"
# TypeError

문자열을 변경하려면 기존 문자열의 일부를 이용해 새로운 문자열을 생성한 뒤 변수에 다시 할당해야 한다.

text = "Python"
text = "J" + text[1:]

print(text)
# Jython

6.4  출력, 내장 함수, 메소드

일반적인 Python 프로그램에서는 print()를 사용해 값을 출력한다. Jupyter Notebook에서는 코드 셀의 마지막 표현식을 자동으로 출력하기도 하지만, 여러 중간 결과를 확인하거나 .py 파일에서 실행할 때는 print()를 사용하는 것이 안전하다.

name = "Alice"
print(name)

# Jupyter Notebook에서는 마지막 표현식이 자동 출력될 수 있다.
name

내장 함수는 Python이 기본으로 제공하는 함수이고, 메소드는 특정 자료형의 객체가 제공하는 함수이다. 함수는 함수(데이터) 형태로 호출하고, 메소드는 객체.메소드() 형태로 호출한다.

print("Python")
len("Python")
type("Python")

"Python".upper()
메소드는 자료형에 종속된다

upper()는 문자열 메소드이므로 정수에는 사용할 수 없다. 예를 들어 10.upper()는 오류가 발생한다. 메소드를 사용할 때는 해당 객체의 자료형을 먼저 확인해야 한다.

6.5  주요 문자열 연산과 메소드

문자열은 결합, 반복, 대소문자 변환, 길이 확인, 분리, 결합, 치환, 시작/끝 검사 등을 자주 사용한다.

letter = "alsidIEK39182lsie2"
text = "Hello Python"

output = letter + text
text * 2
# 'Hello PythonHello Python'

letter.upper()
letter.lower()

print(letter)
# alsidIEK39182lsie2

letter = letter.upper()

len(text)
# 12

upper()나 lower()는 변환된 새로운 문자열을 반환할 뿐 원본 문자열을 직접 바꾸지 않는다. 변환 결과를 계속 사용하려면 변수에 다시 저장해야 한다.

text = "Hello Python"
text.split()
# ['Hello', 'Python']

text = "hello,python, Elice"
text.split(", ")
# ['hello,python', 'Elice']

text.split(",")
# ['hello', 'python', ' Elice']

parts = text.split(",")
clean_parts = [part.strip() for part in parts]
# ['hello', 'python', 'Elice']

",".join("adke21")
# 'a,d,k,e,2,1'

words = ["Hello", "Python"]
" ".join(words)
# 'Hello Python'

split()은 구분자 기준으로 문자열을 나누고 리스트를 반환한다. 구분자를 지정하지 않으면 연속된 공백을 기준으로 분리한다. 쉼표와 공백이 섞인 데이터에서는 구분자를 정확히 지정하고, 필요한 경우 strip()으로 앞뒤 공백을 제거해야 한다.

text = "Hello Python"

text.replace("Hello", "")
# ' Python'

text.replace("Hello ", "")
# 'Python'

text.startswith("H")
# True

text.endswith("Python")
# True

text.strip()         # 양쪽 공백 제거
text.lstrip()        # 왼쪽 공백 제거
text.rstrip()        # 오른쪽 공백 제거
text.find("Python")  # 문자열 위치 검색
text.count("o")      # 특정 문자 개수
text.isdigit()       # 숫자로만 구성되었는지 확인
text.isalpha()       # 문자로만 구성되었는지 확인

7. 리스트 : 순서가 있는 변경 가능한 자료형

 리스트는 여러 개의 데이터를 순서대로 저장하는 자료형이다. 리스트는 순서가 있고, 인덱싱과 슬라이싱이 가능하며, 중복된 값을 저장할 수 있다. 또한 서로 다른 자료형을 함께 저장할 수 있고, 생성 후 요소를 수정할 수 있다.

numbers = [1, 2, 3]

numbers = list([1, 2, 3])

my_list = [1, 2, 3]
data = [1, "Python", True, 3.14]

data = [
    "Hello",
    ["Python", "Hi"],
    (12, 11, 10),
    14
]

7.1  리스트 인덱싱과 중첩 인덱싱

 리스트도 문자열처럼 인덱스를 사용해 특정 위치의 요소를 조회할 수 있다. 리스트 안에 또 다른 리스트가 들어 있으면 인덱싱을 여러 단계로 적용할 수 있다.

a = [1, 2, 3, 4, 5]
c = ["Hello", ["Python", "Hi"], (12, 11, 10), 14]

a[0]
# 1

c[1]
# ['Python', 'Hi']

c[1][0]
# 'Python'

a[5]
# IndexError

c[1][0]은 두 단계로 해석한다. 먼저 c[1]로 내부 리스트 ["Python", "Hi"]를 선택하고, 선택한 내부 리스트의 [0]으로 "Python"을 선택한다.

(여기에 중첩 리스트의 2단계 인덱싱 구조 이미지 삽입)

바깥 리스트에서 내부 리스트를 먼저 선택한 뒤, 내부 리스트에서 다시 요소를 선택하는 구조.

7.2  리스트 슬라이싱

 리스트 슬라이싱도 문자열 슬라이싱과 같은 원리를 따른다. 시작 인덱스는 포함되고 끝 인덱스는 포함되지 않는다. 슬라이싱은 원본 리스트를 직접 변경하지 않고 새로운 리스트를 반환한다.

b = ["hello", "life", "today", "happy"]

b[0:3]
# ['hello', 'life', 'today']

b[-2:]
# ['today', 'happy']

7.3  append()와 extend()

append()는 리스트 마지막에 값 하나를 추가한다. 반면 extend()는 반복 가능한 객체의 요소들을 하나씩 풀어서 추가한다.

numbers = [1, 2, 3]

numbers.append(4)
print(numbers)
# [1, 2, 3, 4]

numbers.append([5, 6])
print(numbers)
# [1, 2, 3, 4, [5, 6]]

numbers = [1, 2, 3]
numbers.extend([4, 5])
print(numbers)
# [1, 2, 3, 4, 5]
구분 동작 예시 결과
append() 전달한 값을 하나의 요소로 추가한다. [1, 2, [3, 4]]
extend() 전달한 리스트의 요소를 각각 추가한다. [1, 2, 3, 4]

7.4  리스트 조회와 수정

 리스트의 길이는 len()으로 확인한다. 중첩 리스트의 경우 바깥쪽 요소를 기준으로 길이를 계산한다. 리스트는 변경 가능한 자료형이므로 특정 위치의 값을 직접 수정할 수 있고, 슬라이싱으로 여러 요소를 한 번에 변경할 수도 있다.

numbers = [1, 2, 3, 4, 5]

len(numbers)
# 5

numbers[2] = 22
print(numbers)
# [1, 2, 22, 4, 5]

numbers[1:3] = [20, 30]
print(numbers)
# [1, 20, 30, 4, 5]

7.5  리스트 삭제

 리스트에서 값을 삭제하는 방법은 여러 가지가 있다. del은 인덱스나 범위 기준으로 삭제하고, remove()는 특정 값을 찾아 첫 번째로 일치하는 요소를 삭제한다. pop()은 삭제한 값을 반환하며, 인덱스를 생략하면 마지막 요소를 삭제한다. clear()는 모든 요소를 삭제한다.

numbers = [1, 2, 22, 4, 5]

del numbers[3]
print(numbers)
# [1, 2, 22, 5]

numbers = [5, 4, 3, 2, 1]
numbers.remove(3)
print(numbers)
# [5, 4, 2, 1]

removed = numbers.pop()
print(removed)
# 1

print(numbers)
# [5, 4, 2]

numbers.pop(0)

numbers.clear()
print(numbers)
# []

7.6  정렬과 순서 뒤집기

sorted()는 정렬된 새로운 리스트를 반환하고 원본을 변경하지 않는다. 반면 .sort()는 리스트 자체를 정렬하고 반환값은 None이다.

numbers = [1, 4, 5, 2, 3]

sorted_numbers = sorted(numbers)
print(sorted_numbers)
# [1, 2, 3, 4, 5]

print(numbers)
# [1, 4, 5, 2, 3]

numbers.sort()
print(numbers)
# [1, 2, 3, 4, 5]

result = numbers.sort()
print(result)
# None

sorted(numbers, reverse=True)
구분 sorted() .sort()
종류 내장 함수 리스트 메소드
원본 변경 변경하지 않음 직접 변경
반환값 정렬된 새 리스트 None
사용 대상 반복 가능한 여러 객체 리스트만 가능
reverse()는 크기순으로 정렬하는 것이 아니라 현재 순서를 그대로 반대로 뒤집는다.
numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print(numbers)
# [5, 4, 3, 2, 1]

numbers = [3, 1, 5]
numbers.reverse()
# [5, 1, 3]

리스트끼리는 +로 결합할 수 있고, *로 반복할 수 있다.

a = [1, 2, 3]
b = [4, 5]

a + b
# [1, 2, 3, 4, 5]

b * 2
# [4, 5, 4, 5]

8. Python 오류 메시지 읽기

 Python에서 오류가 발생하면 코드가 멈춘다. 이때 중요한 것은 오류 문구 전체를 그대로 검색하는 것이 아니라, 오류 종류, 발생 위치, 사용한 함수나 메소드, 실제 변수의 자료형을 순서대로 확인하는 것이다.

오류가 발생한 코드 위치 확인
→ 오류 종류 확인
→ 오류 메시지 해석
→ 변수와 자료형 확인
→ 코드 수정
→ 다시 실행

(여기에 Traceback에서 마지막 줄의 오류 종류와 발생 위치를 읽는 방법 이미지 삽입)

Traceback의 마지막 줄에서 오류 클래스와 메시지를 확인하고, 위쪽에서 오류가 발생한 코드 줄을 찾는 흐름.

8.1  자주 발생하는 기본 오류

SyntaxError는 Python 문법이 올바르지 않을 때 발생한다. 괄호를 닫지 않았거나, 따옴표가 맞지 않거나, 들여쓰기가 잘못된 경우가 대표적이다.

print(1, 2
# SyntaxError

print(1, 2)

IndexError는 리스트나 문자열에 존재하지 않는 인덱스로 접근할 때 발생한다.

numbers = [1, 2, 3]

numbers[3]
# IndexError

numbers[2]
# 3

NameError는 정의되지 않은 변수를 사용할 때 발생한다. Jupyter Notebook에서는 변수를 정의한 셀을 실행하지 않았을 때도 자주 발생한다.

bb = "가나다"

print(b)
# NameError

print(bb)

ZeroDivisionError는 숫자를 0으로 나눌 때 발생한다. 실제 데이터 분석에서는 분모가 0인지 먼저 확인해야 한다.

5 / 0
# ZeroDivisionError

a = 5
b = 0

if b != 0:
    result = a / b
else:
    result = None

8.2  자료형과 관련된 오류

TypeError, KeyError, AttributeError, ValueError는 자료형과 자료 구조를 제대로 이해하지 못했을 때 자주 만난다.

"10" + 5
# TypeError

int("10") + 5
# 15

person = {"name": "Alice"}
person["age"]
# KeyError

numbers = [1, 2, 3]
numbers.upper()
# AttributeError

int("Python")
# ValueError
📕 오류 해결의 핵심

 오류 메시지는 실패의 표시가 아니라 디버깅 힌트이다. 오류 클래스 이름을 보고 문제 유형을 좁히고, 변수의 자료형과 값의 형태를 확인하면 대부분의 기초 오류는 스스로 해결할 수 있다.

9. 딕셔너리 : 키와 값으로 데이터를 관리하는 자료형

 딕셔너리는 키와 값의 쌍으로 데이터를 저장한다. 리스트가 위치를 나타내는 정수 인덱스로 접근한다면, 딕셔너리는 키로 접근한다. 따라서 데이터의 의미를 이름으로 관리할 때 적합하다.

gdp = {
    "한국": 3000,
    "미국": 4000,
    "대만": 3500
}

gdp["한국"]
# 3000

(여기에 리스트의 인덱스 접근과 딕셔너리의 키 접근 비교 이미지 삽입)

리스트는 위치 번호로 접근하고, 딕셔너리는 키 이름으로 값에 접근하는 차이.

9.1  딕셔너리와 JSON의 차이

 딕셔너리와 JSON은 형태가 비슷하지만 동일한 개념은 아니다. Python 딕셔너리는 Python 프로그램 내부에서 사용하는 자료형이고, JSON은 서로 다른 프로그램이나 시스템 사이에서 데이터를 교환할 때 사용하는 텍스트 형식이다.

구분 Python 딕셔너리 JSON
성격 Python 내부 자료형 데이터 교환용 텍스트 형식
논리값 True, False true, false
빈 값 None null
사용 목적 프로그램 내부 데이터 관리 시스템 간 데이터 전달
import json

person = {
    "name": "Alice",
    "age": 25
}

json_text = json.dumps(person, ensure_ascii=False)

9.2  딕셔너리 생성과 조회

person = {
    "name": "Alice",
    "age": 25,
    "city": "Seoul"
}

empty_dict = {}
empty_dict = dict()

 딕셔너리는 존재하는 키로 값을 조회할 수 있다. 존재하지 않는 키로 접근하면 KeyError가 발생한다. 오류 없이 값을 조회하려면 get()을 사용할 수 있다.

person["name"]
# 'Alice'

person["job"]
# KeyError

person.get("job")
# None

person.get("job", "정보 없음")
# '정보 없음'

9.3  추가, 수정, 삭제

딕셔너리는 새로운 키를 지정하면 값이 추가된다. 이미 존재하는 키에 값을 할당하면 기존 값이 수정된다.

person["job"] = "Engineer"
person["age"] = 30

# 결과
{
    "name": "Alice",
    "age": 30,
    "city": "Seoul",
    "job": "Engineer"
}

삭제는 del, pop(), clear()를 사용할 수 있다.

del person["city"]

removed_job = person.pop("job")

person.clear()
print(person)
# {}

9.4  주요 메소드와 키 존재 여부

keys(), values(), items()는 딕셔너리의 키, 값, 키-값 쌍을 조회할 때 사용한다. 단, dict_keys와 dict_values는 리스트처럼 바로 인덱싱하거나 슬라이싱할 수 없다. 인덱싱이 필요하면 리스트로 변환해야 한다.

person = {
    "name": "Alice",
    "age": 25,
    "city": "Seoul",
    "job": "Engineer"
}

person.keys()
# dict_keys(['name', 'age', 'city', 'job'])

person.values()
# dict_values(['Alice', 25, 'Seoul', 'Engineer'])

person.items()
# dict_items([('name', 'Alice'), ('age', 25), ('city', 'Seoul'), ('job', 'Engineer')])

person.keys()[0]
# TypeError

keys = list(person.keys())
keys[0]
# 'name'

in 연산자는 기본적으로 딕셔너리의 키를 검사한다. 값의 존재 여부를 확인하려면 values()를 사용해야 한다.

"job" in person
# True

"hobby" in person
# False

"Alice" in person.values()
# True

9.5  딕셔너리 키의 조건

 딕셔너리 키에는 변경할 수 없는 자료형을 사용해야 한다. 문자열, 숫자, 튜플은 키로 사용할 수 있지만 리스트는 변경 가능한 자료형이므로 키로 사용할 수 없다.

data = {
    "name": "Alice",
    1: "one",
    (10, 20): "coordinate"
}

data = {
    [1, 2]: "value"
}
# TypeError

10. 집합 : 중복 제거와 집합 연산

 집합은 중복된 값을 허용하지 않는 자료형이다. 같은 값을 다시 추가해도 하나만 유지된다. 집합은 순서가 보장되는 인덱스 기반 자료형이 아니므로 일반적인 인덱싱과 슬라이싱을 사용할 수 없다.

numbers = {1, 2, 3, 4}

numbers.add(3)

print(numbers)
# {1, 2, 3, 4}

numbers[0]
# TypeError

10.1  빈 집합 생성과 중복 제거

중괄호만 사용한 {}는 빈 집합이 아니라 빈 딕셔너리를 만든다. 빈 집합은 set()으로 생성해야 한다.

empty = {}

type(empty)
# dict

empty_set = set()

 리스트를 집합으로 변환하면 중복된 값을 제거할 수 있다. 다만 기존 순서를 유지해야 하는 데이터에 무조건 set()을 사용하면 안 된다. 집합은 원래 리스트의 순서를 보존하기 위한 자료형이 아니기 때문이다.

values = [1, 2, 2, 3, 3, 3]

unique_values = set(values)

print(unique_values)
# {1, 2, 3}

10.2  집합 연산

 집합은 합집합, 교집합, 차집합, 대칭 차집합을 계산할 때 유용하다. 두 데이터 묶음 사이에 공통 값이 무엇인지, 한쪽에만 있는 값이 무엇인지 확인할 때 사용할 수 있다.

set_a = {1, 2, 3}
set_b = {3, 4, 5}

set_a.union(set_b)
# {1, 2, 3, 4, 5}

set_a | set_b

set_a.intersection(set_b)
# {3}

set_a & set_b

set_a.difference(set_b)
# {1, 2}

set_a - set_b

set_a.symmetric_difference(set_b)
# {1, 2, 4, 5}

set_a ^ set_b
연산 메소드 연산자 의미
합집합 union() | 두 집합의 모든 값
교집합 intersection() & 두 집합에 공통으로 있는 값
차집합 difference() - 앞 집합에만 있는 값
대칭 차집합 symmetric_difference() ^ 한쪽에만 존재하는 값

10.3  딕셔너리와 집합 비교

구분 딕셔너리 집합
기본 구조 키와 값의 쌍 고유한 값의 모음
표기 {"name": "Alice"} {1, 2, 3}
중복 키 중복 불가 값 중복 불가
접근 키를 이용 인덱싱 불가
주요 활용 데이터 속성 관리, 매핑 중복 제거, 집합 비교

11. 종합 예제와 퀴즈 해설

 Python 기초 문법은 개별 문법보다 여러 자료형이 함께 섞인 예제를 해석할 때 더 중요해진다. 리스트 안에 문자열, 숫자, 딕셔너리, 튜플, 집합이 들어갈 수 있고, 각 자료형마다 접근 방식이 달라진다.

11.1  append(), extend(), set()

 다음 예제는 extend()로 여러 요소를 추가한 뒤, append()로 값을 하나씩 추가하는 흐름이다. 이후 집합으로 변환하면 중복이 제거된다.

tests = [1, 2, 3, 4, 5]

tests.extend(["apple", "banana", 1, 2])

tests.append("apple")
tests.append("banana")
tests.append(1)
tests.append(2)

# 최종 리스트
[
    1, 2, 3, 4, 5,
    "apple", "banana", 1, 2,
    "apple", "banana", 1, 2
]

set(tests)
# {1, 2, 3, 4, 5, "apple", "banana"}

11.2  슬라이싱, pop(), 문자열 변환

tests[2:5]는 인덱스 2, 3, 4의 값을 선택한다. pop()은 마지막 요소를 삭제하면서 반환한다. str(tests).upper()는 리스트 전체를 문자열로 변환한 뒤 영문자를 대문자로 바꾸지만, 원본 리스트 내부 문자열이 실제로 바뀌는 것은 아니다.

tests[2:5]
# [3, 4, 5]

tests.pop()

tests
# [
#     1, 2, 3, 4, 5,
#     "apple", "banana", 1, 2,
#     "apple", "banana", 1
# ]

str(tests).upper()
# "[1, 2, 3, 4, 5, 'APPLE', 'BANANA', 1, 2, 'APPLE', 'BANANA', 1]"

11.3  딕셔너리 items()

items()는 키와 값을 튜플로 묶은 형태를 반환한다. 반복문에서는 키와 값을 동시에 꺼내는 패턴으로 자주 사용한다.

dict01 = {
    "1": 13,
    "name": 142,
    "hhE": "@E#C"
}

dict01.items()
# dict_items([('1', 13), ('name', 142), ('hhE', '@E#C')])

for key, value in dict01.items():
    print(key, value)

11.4  중첩 자료형과 단일 원소 튜플

 중첩 자료형은 바깥 구조부터 차례대로 접근해야 한다. 리스트 안의 리스트, 리스트 안의 튜플처럼 자료형이 섞여 있으면 각 단계에서 현재 선택된 객체가 무엇인지 확인하는 것이 중요하다. 또한 (11)은 튜플이 아니라 정수이다. 요소가 하나인 튜플을 만들려면 쉼표가 필요하다.

list011 = [
    {"1": 13, "name": 142},
    [102, (1, 23), 4],
    11,
    {14, "apple"},
    "!"
]

list011[1]
# [102, (1, 23), 4]

list011[1][1]
# (1, 23)

len(list011)
# 5

type((11))
# int

single_tuple = (11,)
type(single_tuple)
# tuple
📕 중첩 자료형을 읽는 방법

 복잡한 자료형은 한 번에 해석하지 말고 한 단계씩 끊어 읽어야 한다. 예를 들어 list011[1][1]은 먼저 list011[1]의 결과를 확인하고, 그 결과에서 다시 [1]을 적용하는 방식으로 해석한다.

12. 전체 흐름 요약과 핵심 정리

전체 흐름 요약

  • Python 기초 문법은 데이터를 다루기 위한 최소 단위부터 시작한다. 변수는 데이터에 이름을 붙이는 방식이고, 자료형은 데이터의 구조와 가능한 연산을 결정한다. 문자열은 문자들의 순서 있는 집합이며 인덱싱과 슬라이싱이 가능하지만 직접 수정할 수 없다. 리스트는 여러 값을 순서대로 저장하며 수정, 추가, 삭제가 가능한 대표적인 자료형이다.
  • 딕셔너리는 키와 값의 쌍으로 데이터를 관리한다. 위치보다 이름으로 데이터에 접근해야 할 때 유용하다. 집합은 중복 없는 값의 모음으로, 중복 제거와 집합 연산에 적합하다. 오류 메시지는 코드를 고치는 데 필요한 정보를 제공하므로, 오류 종류와 발생 위치, 변수의 자료형을 기준으로 해석해야 한다.
  • 이후 조건문과 반복문을 학습하면 자료형 내부의 데이터를 조건에 따라 선택하거나 반복적으로 처리할 수 있다. 함수와 Pandas를 학습하면 이러한 기초 문법을 실제 데이터 분석 과정에 적용할 수 있다.

핵심 개념 정리

개념 핵심 정리
변수 데이터를 저장하기 위해 붙이는 이름이며, Python에서는 객체를 참조하는 이름에 가깝다.
자료형 데이터의 종류와 사용할 수 있는 연산을 결정한다.
문자열 순서가 있는 문자 집합이며 인덱싱과 슬라이싱은 가능하지만 내부 문자를 직접 수정할 수 없다.
리스트 순서가 있고 변경 가능한 자료형으로, 여러 값을 저장하고 수정할 수 있다.
딕셔너리 키와 값의 쌍으로 데이터를 저장하며, 위치가 아니라 키를 이용해 접근한다.
집합 중복 없는 값을 저장하며, 중복 제거와 합집합·교집합·차집합 계산에 유용하다.
오류 메시지 오류 종류, 발생 위치, 변수 자료형을 확인하면 문제 원인을 좁힐 수 있다.
🔑 한 문장 결론

 Python 기초 문법의 핵심은 문법 자체를 외우는 것이 아니라, 자료형별로 데이터를 어떻게 저장하고 접근하고 변경하는지 이해하는 것이다.

13. 참고 자료

Source

KDT 빅데이터 기반 품질 관리(QA,QC) 양성 과정 6회차, Python 기초 탄탄 라이브세션

'TIL > Python' 카테고리의 다른 글

Pandas로 시작하는 데이터 분석 : 데이터 불러오기부터 그룹 분석까지  (1) 2026.06.05
Python 분석 환경 조성하기  (0) 2026.06.05
Python 데이터 시각화 확장하기  (0) 2026.06.04
데이터를 쉽게 보는 matplotlib 기초  (0) 2026.06.02
Python 분석을 위한 데이터 전처리 기초  (0) 2026.06.01
'TIL/Python' 카테고리의 다른 글
  • Pandas로 시작하는 데이터 분석 : 데이터 불러오기부터 그룹 분석까지
  • Python 분석 환경 조성하기
  • Python 데이터 시각화 확장하기
  • 데이터를 쉽게 보는 matplotlib 기초
yustitix
yustitix
Semiconductor Process & Quality Data Analyst Candidate, M.S. in Polymer Engineering, @Yustitix </br> Aspiring Semiconductor Process & Quality Data Analyst, aiming to grow into a Manufacturing AI Data Scientist.
  • yustitix
    데분하다
    yustitix
  • 전체
    오늘
    어제
    • 분류 전체보기 (52)
      • Portfolio (4)
      • Job search (9)
        • JD (3)
        • Article study (5)
        • News room (1)
      • TIL (35)
        • TIL (2)
        • 코테 (11)
        • Python (6)
        • 머신러닝 (6)
        • 기초 통계 (3)
        • 반도체 공정 입문 (7)
      • Project (4)
        • FAERS 이상사례 자가보고 데이터 기반 모니터링.. (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
yustitix
Python 기초 문법 정리
상단으로

티스토리툴바