파이썬이란?
파이썬(Python)은 1990년 암스테르담의 귀도 반 로섬(Guido van rossum)이 개발한 인터프리터 언어입니다. 귀도 파이썬이라는 이름이 자신이 좋아하는 코미디 쇼인 '몬티 파이썬의 날아다니는 서커스' 에서 따왔다고 합니다.
파이썬의 사전적 의미는 '고대 신화에 나오는 파르나소스 산의 동굴에 살던 큰 뱀' 을 뜻하며 아폴로 신이 델파이에서 파이썬을 퇴치했다는 이야기가 전해지고 있습니다. 대부분의 파이썬 표지와 아이콘이 뱀 모양으로 그려져 있는 이유는 바로 이 때문입니다.
파이썬은 '구글에서 만든 소프트웨어의 50% 이상이 파이썬이다' 라는 말이 있을 정도로 많이 사용되는 언어입니다. 이 밖에도 인스타그램, 넷플릭스, 아마존 등 많은 IT 기업에서 파이썬을 사용합니다.
파이썬의 장점은 간결하다는 것입니다. 일을 처리하는 방법이 100가지가 있다면 파이썬은 가장 좋은 방법 1가지만 사용하는 것을 선호합니다. 그리고 다른 언어에서 늘 보게 되는 단락을 구분하는 { }가 없는 대신에, 들여쓰기를 맞추지 않으면 실행되지 않습니다.
또한 파이썬은 Tkinter와 같은 GUI(graphic user interface) 프로그래밍을 위한 도구들이 잘 갖추어져 있고, 다른 언어와 결합해서 사용하기 좋은 접착 언어이며, 라즈베리파이와 같은 사물 인터넷 분야에서도 활용도가 높습니다.
그러나 아직까지는 파이썬으로 안드로이드나, 아이폰 앱 같은 모바일 프로그래밍은 어렵습니다.
숫자형
숫자형(number)이란 숫자 형태로 이루어진 자료형입니다.
숫자형 자료형에는 정수형(int), 실수형(float), 복소수형(complex), 8진수형(octal), 16진수형(hex)이 있습니다.
a = 123 # int
b = -1.2 # float
c = 3 + 4j # complex
d = 0o177 # octal
e = 0x8ff # hex
숫자형 연산자
숫자형 연산자로는 기본적인 사칙연산(+, -, *, /)와 더불어 나머지 연산(%), 몫 연산(//), 지수 연산(**)이 있습니다.
문자열 자료형
문자열(string)이란 문자, 단어 등으로 구성된 문자들의 집합을 의미합니다.
"Hello World" # 1
'Hello World' # 2
"""Hello World""" # 3
'''Hello World''' # 4
3번과 4번은 개행을 포함한 여러 줄 표시가 가능한 방법입니다.
문자열 연산
파이썬에서는 문자열을 더하거나 곱할 수 있습니다.
a = "hello"
b = " world"
print(a + b) # "hello world"
print(a * 2) # "hellohello"
len(a) # 5
주의) 문자열끼리의 덧셈은 가능하지만 '문자열 + 숫자형'은 불가능합니다.
표준 출력을 하는 print() 함수와 길이를 구하는 len() 함수는 파이썬의 기본 내장 함수입니다.
표준 출력은 프로그램이 실행 결과를 화면(콘솔/터미널)에 보여주는 기본 출력 방식입니다.
문자열은 불변(immutable) 자료형이기 때문에 실제로 더하기 연산과 곱셈 연산이 되는 것은 아니고, 새로운 문자열을 만들어 반환하는 것입니다.
인덱싱과 슬라이싱
인덱싱은 하나의 요소를 가져오는 것이고, 슬라이싱은 여러 요소의 부분 집합을 잘라서 가져오는 것입니다.
a = "hello"
a[0] # 'h'
a[-1] # 'o'
a[0:4] # 'hell' # 0 <= a < 4
a[:4] # 'hell' # 0 <= a < 4
a[:] # 'hello' # 0 <= a < 5
a[1:-1] # 'ell' # 1 <= a < 4
문자열 포매팅 1
문자열 포매팅(string formatting)이란 쉽게 말해 문자열 안에 어떤 값을 삽입하는 방법입니다.
"I eat %d apples." % 3
"I eat %s apples." % "five"
number = 3
"I eat %d apples." % number
"I eat $d %s." % (number, "apples")
문자열 포맷 코드

정렬과 공백
"%10s"는 전체 길이가 10개인 문자열 공간에서 대입되는 값을 오른쪽으로 정렬하고 그 앞의 나머지를 공백으로 채우라는 의미입니다.
"%5s" % "hi" #오른쪽 정렬 # 공백(5-2)칸 + hi # ' hi'
"%-5s" % "hi" #왼쪽 정렬 # hi + 공백(5-2)칸 # 'hi '
소수점 표현
"%0.4f"에서 "0"은 길이에 상관하지 않겠다는 의미이고, ".4f"는 소수점 뒤에 나올 숫자의 개수입니다.
"%0.4f" % 3.42134234 # 소수점 4자리까지 # '3.4213"
"%10.4f" % 3.42134234 # 공백(10-6)칸 + 소수점 4자리까지 # ' 3.4213'
문자열 포매팅 2
format 함수
대입 방식은 인덱스 방식과 이름 방식이 있습니다.
"I eat {0} apples".format(3)
fruits = "apples"
"I eat {0} {1}".format(3, fruits) # 인덱스
"I eat {num} {fruits}".format(num=3, fruits="apples") # 이름
정렬과 공백 및 소수점 표현도 가능합니다.
"{0:<10}".format("hi") # 왼쪽 정렬
"{0:>10}".format("hi") # 오른쪽 정렬
"{0:^10}".format("hi") # 가운데 정렬
"{0:=<10}".format("hi") # 왼쪽 정렬 + '='문자 채우기
"{0:0.4f}".format(3.42134234) # '3.4213'
문자열 포매팅 3
f-string
파이썬 3.6부터 도입된 f-string은 변수의 값을 간편하게 문자열에 삽입할 수 있으며, 표현식까지 직접 사용할 수 있어 더욱 직관적이고 유연한 문자열 포매팅을 제공합니다.
num = 3
fruits = "apples"
f"I eat {num + 1} {fruits}."
d = {'num': 3, 'fruits':'apple'}
f"I eat {d["num"]} {d["fruits"]}."
정렬과 공백 및 소수점 표현도 가능합니다.
f'{"hi":<10}' # 왼쪽 정렬
f'{"hi":>10}' # 오른쪽 정렬
f'{"hi":^10}' # 가운데 정렬
f'{"hi":=<10}' # 왼쪽 정렬 + '='문자 채우기
y = 3.42134234
f'{y:0.4f}' # '3.4213'
문자열 관련 함수

문자열 관련 함수를 사용해도 문자열은 불변이기 때문에 원본 값이 변경되는 것이 아닌, 변경된 새로운 문자열을 반환합니다.
리스트
리스트(list)는 여러 개의 값을 순서대로 저장할 수 있는 가변(sequence) 자료형으로 다음과 같은 다양한 생성 방법이 있습니다.
a = []
b = list()
c = [1, 2]
d = list(1, 2)
e = [1, 2, ["a", "b"]]
리스트 연산
리스트도 문자열과 마찬가지로 더하거나 곱할 수 있습니다.
a = [1, 2, 3]
b = ['a', 'b']
a + b # [1, 2, 3, 'a', 'b']
a * 2 # [1, 2, 3, 1, 2, 3]
len(a) # 3
인덱싱과 슬라이싱
리스트도 문자열과 마찬가지로 인덱싱과 슬라이싱이 가능합니다.
a = [1, 2, ["a", "b"]]
a[0] # 1
a[2][0] # "a"
a[0:2] # [1, 2]
수정과 삭제
리스트는 문자열과 달리 수정이 가능합니다.
a = [1, 2, 3]
a[0] = 3 # [3, 2, 3]
del a[1] # [3, 3]
del a[1:] # [3]
리스트 관련 함수

리스트의 더하기 연산의 경우 제 3의 배열은 만들어서 반환하는 것이기 때문에 extend() 함수를 사용하는 것이 메모리 효율성이 좋습니다.
튜플
튜플(tuple)은 몇 가지 점을 제외하고는 리스트와 거의 비슷하며 차이점은 다음과 같습니다.
- 리스트는 [], 튜플은 ()으로 표현합니다.
- 리스트는 요소값의 생성, 삭제, 수정이 가능하지만, 튜플은 요소값을 바꿀 수 없습니다.
튜플은 아래와 같이 생성할 수 있습니다.
t1 = ()
t2 = (1,)
t3 = (1, 2, 3)
t4 = 1, 2, 3
t5 = (1, 2, ('a', 'b'))
생성 방법에도 리스트와 다른 2가지가 있습니다.
- 1개의 요소만 가질 때는 요소 뒤에 쉼표(,)를 반드시 붙여야 합니다.
- 소괄호를 생략해도 됩니다.
튜플은 요소값이 변화가 불가능한데 실제 프로그램에서는 값이 변경되는 형태의 변수가 훨씬 많기 때문에 일반적으로 튜플보다 리스트를 많이 사용합니다.
튜플도 리스트와 마찬가지로 덧셈, 곱셈 연산이 가능하며 인덱싱과 슬라이싱도 가능합니다.
딕셔너리
딕셔너리(Dictionary)는 키(key)와 값(value)의 쌍으로 데이터를 저장하는 변수형입니다. 파이썬에서 딕셔너리는 {} 중괄호를 사용하여 정의하며, 각 키는 고유하며, 키-값 쌍으로 이루어져 있습니다.
딕셔너리는 다음과 같이 생성할 수 있습니다.
dic = {'name': 'james', 'age': 30, 3: [1, 2, 3] }
요소 접근
딕셔너리는 리스트와 튜플과 달리 인덱스로 접근할 수 없어 다음과 같이 key 값으로 접근해야 합니다.
dic = {'name': 'james', 'age': 30, 3: [1, 2, 3] }
dic['name'] # 'james'
dic[3] # [1, 2, 3]
추가와 삭제
a = {1: 'a'}
a[2] = 'b' # {1: 'a', 2: 'b'}
a['name'] = 'james' # {1: 'a', 2: 'b', 'name': 'james'}
del a[1] # {2: 'b', 'name': 'james'}
주의할 점
딕셔너리를 사용할 때 주의할 점이 2가지 있습니다.
- key 값은 고유한 값으로 중복되는 key 값을 설정하면 하나를 제외한 나머지는 모두 무시됩니다.
- key 값은 불변 값만 올 수 있습니다. (튜플은 가능, 리스트는 불가능)
딕셔너리 관련 함수

my_dict = {'name': 'Alice', 'age': 30, 'city': 'New York'}
# keys()
my_dict.keys() # dict_keys(['name', 'age', 'city'])
# values()
my_dict.values() # dict_values(['Alice', 30, 'New York'])
# items()
my_dict.items() # dict_items([('name', 'Alice'), ('age', 30), ('city', 'New York')])
# get()
my_dict.get('name') # Alice
my_dict.get('email') # None
my_dict.get('email', 'naver') # naver (default)
# in
print('name' in my_dict) # True
print('email' in my_dict) # False
# clear()
my_dict.clear() # {}
dict_keys, dict_values, dict_items는 파이썬의 딕셔너리에서 반환되는 객체 유형입니다. 이들은 딕셔너리의 키, 값, 그리고 키-값 쌍을 나타내는 특별한 타입의 객체로, 반복 가능한(iterable) 객체로 처리됩니다.
my_dict.get(x) 방식의 경우 key 값 x가 존재하지 않으면 None 을 리턴하고, my_dict[x] 방식의 경우 key 값 x가 존재하지 않으면 에러를 발생시킵니다.
집합
집합(set)은 중복을 허용하지 않고 순서가 없는 변경 가능한 자료형으로, 집합 연산에 유용하게 쓰입니다.
집합은 아래와 같이 생성할 수 있습니다.
s1 = {1, 2, 3}
s2 = set() # {}
s3 = set([1, 2, 3]) # {1, 2, 3}
s4 = set((1, 2, 3)) # {1, 2, 3}
s5 = set("hello") # {'e', 'h', 'l', 'o'}
{}는 기본적으로 비어 있는 딕셔너리를 의미하기 때문에 비어 있는 집합을 만들 때는 반드시 set() 으로 만들어야 합니다.
집합은 다음과 같은 2가지 특성을 갖습니다.
- 중복을 허용하지 않습니다.
- 순서가 없습니다.
요소 접근
집합 또한 리스트와 튜플과 달리 인덱스가 없기 때문에 다음과 같이 접근해야 합니다.
s = {1, 2, 3}
for item in s: # 반복문
print(item)
l1 = list(s) # 리스트로 변환
print(l1[0])
t1 = tuple(s1) # 튜플로 변환
print(t1[0])
교집합, 합집합, 차집합
s1 = {1, 2, 3, 4, 5}
s2 = {3, 4, 5, 6, 7}
# 교집합
s1 & s2 # {3, 4, 5}
s1.intersection(s2) # {3, 4, 5}
# 합집합
s1 | s2 # {1, 2, 3, 4, 5, 6, 7}
s1.union(s2) # {1, 2, 3, 4, 5, 6, 7}
# 차집합
s1 - s2 # {1, 2}
s1.difference(s2) # {1, 2}
집합 관련 함수

불
불(bool) 자료형이란 참(True)과 거짓(False)를 나타내는 자료형입니다.
(True와 False는 파이썬의 예약어로 첫 글자를 대문자로 작성해야합니다.)
자료형의 참과 거짓
참과 거짓은 조건문의 결과로도 반환되지만, 다음의 표처럼 자료형의 값 자체로도 참과 거짓이 나누어집니다.

변수와 대입
변수는 값을 저장하고 참조할 수 있는 이름 있는 공간입니다. 파이썬에서는 모든 값은 객체이며 변수에 대입 시 list, tuple, set, dict 같은 자료형은 객체가 위치하는 메모리 주소를 복사하게 됩니다. 이 중에서 불변 객체인 tuple을 제외하고서는 요소 값을 변경하면 원본 객체가 변경되게 됩니다.
대입
파이썬의 변수 대입 방법에는 다음과 같은 방법들이 있습니다.
# 각각 대입
a, b, c = 1, 2, 3
# 교차 대입
a, b = b, a
# 튜플
a, b = (1, 2)
(a, b) = 1, 2
# 리스트
[a, b] = [1, 2]
# 연쇄 대입
a = b = 2
주소 복사
a = [1, 2, 3]
b = a
id(a) == id(b) # True
a is b # True
id()는 변수가 가리키고 있는 객체의 주소 값을 리턴하는 파이썬의 내장 함수로, is 연산자 내부에서는 이 함수를 사용해 비교를 합니다.
슬라이스
a = [1, 2, 3]
b = a[:]
a is b # False
위 코드와 같이 슬라이스의 경우 원본과 다른 새로운 객체를 생성해서 반환합니다.
Go 언어에서의 슬라이스는 원본 배열을 참조합니다.
copy()
from copy import copy
a = [1, 2, 3]
b = copy(a) # a.copy()와 동일
a is b # False
얕은 복사, 깊은 복사
위에서 알아본 슬라이스는 시퀀스(sequence) 자료형인 list, tuple, str에서만 가능하고 copy() 함수는 거기에 더해 dict, set도 가능하다는 차이점이 있지만, 둘 다 공통적으로 얕은 복사를 수행합니다.
얕은 복사란 객체의 바깥 구조만 복사하고, 내부의 참조 객체는 공유하는 것을 의미하고, 깊은 복사란 객체와 그 내부의 참조 객체까지 모두 재귀적으로 복사하는 것을 의미합니다.
a = [[1, 2], [3, 4]]
b = a.copy() # a[:]
a is b # False
a[0] is b[0] # True
위 코드에서와 같이 슬라이스와 copy() 모두 얕은 복사를 수행하여 객체 자체는 다르지만, 내부 참조는 동일한 것을 확인할 수 있습니다.
'Lang > Python' 카테고리의 다른 글
| Python (4) - 내장 함수, 표준 라이브러리, 외부 라이브러리 (2) | 2025.05.18 |
|---|---|
| Python (3) - 클래스, 모듈, 패키지, 예외 처리 (0) | 2025.05.13 |
| Python (2) - 제어문, 함수, 입출력 (0) | 2025.05.02 |