본문 바로가기

Programming

파이썬(Python) 기초 : 데이터 타입과 변수

 

파이썬은 여러 가지 데이터 타입을 지원하며, 각각의 데이터를 저장하기 위해 변수를 사용합니다.

 

1. 데이터 타입


데이터 타입은 컴퓨터가 저장하는 데이터의 종류를 나타냅니다. 

마치 상자에 담겨있는 물건처럼, 데이터 타입은 어떤 종류의 정보가 변수에 담겨 있는지 알려줍니다.

     # 정수형 (int): 소수점이 없는 정수를 표현합니다. 

예시: 10, -5, 1000

 

     # 실수형 (float): 소수점을 포함하는 숫자를 표현합니다.

예시: 3.14, 2.718, 10.0

 

     # 복소수형 (complex) : 실수부와 허수부로 구성된 숫자를 표현합니다.

예시 : 3 + 4j, 1 - 2j, 2j


     # 문자형 (str): 문자의 시퀀스를 표현합니다. 작은 따옴표(')나 큰 따옴표(")로 감싸서 생성합니다. 

예시: 'Hello', "Python", '123'

 

     # 논리형 (bool): 참(True) 또는 거짓(False) 값을 가진 논리형 데이터를 표현합니다.

 

리스트(list)

 

파이썬에서 가장 기본적이고 유용한 데이터 구조 중 하나입니다.

여러개의 값을 담을 수 있는 시퀀스 자료형입니다. 리스트는 대괄호 [ ] 로 표현되며, 값들은 쉼표로 구분하여 나열됩니다.

예시: my_list = [1,2,3,4,5]

 

1. 리스트 인덱싱(Indexing) : 리스트 인덱싱은 리스트에서 특정 위치의 요소에 접근하는 것을 의미합니다.

리스트의 각 요소는 0부터 시작하는 인덱스를 가지며, 대괄호 [ ] 안에 인덱스를 지정하여 해당요소에 접근합니다.

my_list = [10, 20, 30, 40, 50]

print(my_list[0])  # 첫 번째 요소에 접근, 출력: 10
print(my_list[2])  # 세 번째 요소에 접근, 출력: 30
print(my_list[-1]) # 마지막 요소에 접근, 출력: 50

 

음수 인덱스를 사용하면 끝에서 부터 요소에 접근할 수 있습니다. 시작은 0 , -1 은 마지막 요소를 나타냅니다.

 

2. 리스트 슬라이싱(Slicing) : 리스트 슬라이싱은 리스트의 일부분을 추출하는 것을 의미합니다.

대괄호 안에 '시작 인덱스 : 끝 인덱스' 형식으로 지정하여 원하는 부분을 선택할 수 있습니다.

시작 인덱스는 포함되고, 끝 인덱스는 포함되지 않습니다.

my_list = [10, 20, 30, 40, 50]

print(my_list[1:3])   # 두 번째부터 세 번째 요소까지 슬라이싱, 출력: [20, 30]
print(my_list[:3])    # 처음부터 세 번째 요소까지 슬라이싱, 출력: [10, 20, 30]
print(my_list[2:])    # 세 번째부터 끝까지 슬라이싱, 출력: [30, 40, 50]
print(my_list[:])     # 리스트 전체를 슬라이싱, 출력: [10, 20, 30, 40, 50]
print(my_list[::2])   # 리스트를 두 칸씩 건너뛰며 슬라이싱, 출력: [10, 30, 50]

 

슬라이싱을 할 때 생력된 부분은 기본값으로 처리됩니다. 예를 들어 [:3] 은 처음부터 세번째 요소까지 의미하고, [2:] 두번째 요소부터 끝까지를 의미합니다.

[::2] 는 시작부터 끝까지 두 칸씩 건너뛰며 슬라이싱을 한다는 의미입니다. 생략하게 되면 기본값 1이 지정됩니다.

 

3. 리스트 값 변경 : 리스트는 가변(mutable)한 자료형이기 때무에 값의 추가, 수정, 삭제가 가능합니다.

# 인덱스를 이용한 값 변경

my_list = [10, 20, 30, 40, 50]
my_list[1] = 25
print(my_list)  # 출력: [10, 25, 30, 40, 50]

# del 키워드를 이용한 값 삭제

my_list = [10, 20, 30, 40, 50]
del my_list[2]
print(my_list)  # 출력: [10, 20, 40, 50]

# 리스트 메서드를 이용한 값 추가 및 삭제

# append() : 리스트의 끝에 값을 추가합니다.

my_list = [10, 20, 30]
my_list.append(40)
print(my_list)  # 출력: [10, 20, 30, 40]

# insert() : 특정 위치에 값을 추가합니다

my_list = [10, 20, 30]
my_list.insert(1, 15)  # 두 번째 인덱스에 값 15를 추가
print(my_list)  # 출력: [10, 15, 20, 30]

# remove() : 특정 값을 삭제합니다.

my_list = [10, 20, 30]
my_list.remove(20)
print(my_list)  # 출력: [10, 30]

 

4. 리스트 길이 : 리스트에 포함된 요소의 개수를 나타냅니다. len() 함수를 사용하여 리스트의 길이를 확인할 수 있습니다.

my_list = [10, 20, 30, 40, 50]

print(len(my_list))  # 출력: 5

print(my_list[4])  # 출력: 50

 

튜플(tuple)

 

리스트와 유사하지만 변경할 수 없는(immutable) 시퀀스 자료형으로, 한 번 생성되면 요소를 추가, 삭제, 수정할 수 없습니다. 튜플은 소괄호 ( ) 로 묶어서 생성하며, 각 요소는 쉼표 , 로 구분됩니다.

my_tuple = (1, 2, 3, 4, 5)
my_tuple = 1, 2, 3, 4, 5    # 괄호를 생략하여 생성할 수도 있습니다.

 

1. 튜플의 특징

 

불변성 (Immutable) : 한번 생성된 튜플은 요소를 추가, 삭제, 수정할 수 없습니다. 따라서 튜플의 크기나 요소를 변경하는 연산을 수행할 수 없습니다.

속도가 빠름 : 리스트보다 메모리를 적게 사용하고, 속도가 빠릅니다. 튜플은 변경할 필요가 없는 데이터를 저장할 때 유용합니다.

해시 가능 (Hashable) : 딕셔너리의 키로 사용할 수 있는데, 이는 튜플이 불변형이기 때문입니다. 리스트는 변경 가능하므로 딕셔너리의 키로 사용할 수 없습니다.

 

2. 튜플의 사용

 

요소 접근하기

튜플은 인덱싱과 슬라이싱을 통해 요소에 접근할 수 있습니다. 인덱싱은 튜플에서 특정 위치의 요소에 접근하는 방법이며, 슬라이싱은 튜플에서 일부분을 추출하는 방법입니다.

my_tuple = (1, 2, 3, 4, 5)

# 인덱싱
print(my_tuple[0])  # 출력: 1

# 슬라이싱
print(my_tuple[1:3])  # 출력: (2, 3)

 

     2-1 함수의 반환 값으로 활용하기

 

      함수가 여러 개의 값을 반환할 때, 튜플을 사용하여 반환할 수 있습니다.

# 튜플을 반환값으로 활용하기

def get_point():
    return 10, 20

x, y = get_point()
print(x, y)  # 출력: 10 20

# 리스트를 반환값으로 활용하기

def get_students():
    students = ['Alice', 'Bob', 'Charlie']
    return students

result = get_students()
print(result)  # 출력: ['Alice', 'Bob', 'Charlie']

 

     2-2 딕셔너리의 키로 사용하기

 

      튜플은 변경할 수 없는 특성 때문에 딕셔너리의 키로 사용할 수 있습니다.

      리스트와 달리 튜플은 해시가능한(hashable) 자료형이기 때문에 딕셔너리의 키로 사용될 수 있습니다.

my_dict = {('John', 30): 'Engineer', ('Alice', 25): 'Doctor'}

print(my_dict[('John', 30)])  # 출력: Engineer
print(my_dict[('Alice', 25)])  # 출력: Doctor

'''
Key인 ('John', 30), ('Alice', 25)는 변경불가능한 튜플로 만들고
Value 인 'Engineer', 'Doctor' 변경이 가능한 Value 입니다.
'''

 

     2-3 불변성을 활용하여 안전한 데이터 저장하기

 

      튜플은 불변성(immutable) 이기 때문에 데이터가 변경되지 않습니다.

      이러한 특성을 활용하여 프로그램의 안전한 데이터 저장에 활용될 수 있습니다.

# 프로그램이 실행 중에 변경되면 안 되는 상수 값들을 튜플로 저장
PI = 3.14
GRAVITY = 9.8

 

세트 (set)

 

중복되지 않는 항목들의 모음을 나타냅니다. 세트는 중복된 요소를 허용하지 않으며, 순서가 없는 자료형입니다.

세트는 중괄호 { } 를 사용하여 정의하며, 각 요소는 쉼표로 구분됩니다. 세트는 변경 가능한 (mutable) 자료형이며, 요소를 추가, 삭제 할 수 있습니다.

 

1. 세트의 특징

 

     1-1 중복된 요소가 없음

      세트는 중복된 요소를 허용하지 않습니다. 따라서 하나의 세트에는 각 요소가 최대 한번씩만 나타납니다.

 

     1-2 순서가 없음

      세트는 요소들의 순서가 없습니다. 따라서 세트에 포함된 요소들의 순서는 항상 변경될 수 있습니다.

 

2. 세트의 사용

 

      2-1 세트의 생성

      세트는 중괄호 { } 를 사용하여 생성하며, 각 요소는 쉼표로 구분됩니다.

my_set = {1, 2, 3, 4, 5}

# set() 함수를 사용하여 빈 세트를 생성할 수도 있습니다.
empty_set = set()

 

      2-2 중복 제거

      세트는 중복된 요소를 자동으로 제거해주는 특성을 가지고 있습니다.

      따라서 리스트나 튜플과 같이 중복된 요소를 제거하고 싶을 때 유용하게 사용됩니다.

# 중복된 요소가 있는 리스트
numbers = [1, 2, 3, 3, 4, 5, 5, 5, 6]

# 세트로 변환하여 중복 제거
unique_numbers = set(numbers)

print(unique_numbers)

#결과
{1, 2, 3, 4, 5, 6}

 

      2-3 집합 연산
      세트는 수학적인 집합 연산을 수행할 수 있습니다.

      합집합, 교집합, 차집합 등의 연산을 세트를 사용하여 간편하게 수행 할 수 있습니다.

# 두 개의 세트 생성
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# 합집합 ( 기호 : | ) : 두 집합의 모든 요소를 포함하는 집합을 반환
union_set = set1 | set2
print(union_set)  # {1, 2, 3, 4, 5, 6, 7, 8}

# 교집합 ( 기호 : & ) : 두 집합에 공통으로 포함된 요소로 이루어진 집합을 반환
intersection_set = set1 & set2
print(intersection_set)  # {4, 5}

# 차집합 ( 기호 : - ) : 첫 번째 집합에는 포함되지만 두 번째 집합에는 포함되지 않는 요소로 이루어진 집합을 반환
difference_set = set1 - set2
print(difference_set)  # {1, 2, 3}

# 대칭 차집합 ( 기호 : ^ ) : 두 집합 중 한 집합에만 포함된 요소로 이루어진 집합을 반환
symmetric_difference_set = set1 ^ set2
print(symmetric_difference_set)  # {1, 2, 3, 6, 7, 8}

 

      2-4 멤버십 테스트

      세트는 특정 요소가 세트에 포함되어 있는지 여부를 효율적으로 확인할 수 있습니다.

# 세트 생성
fruits = {'apple', 'banana', 'orange', 'grape'}

# 멤버십 테스트
print('apple' in fruits)  # True
print('kiwi' in fruits)   # False

 

딕셔너리 (dict)

 

키(key)와 값(value)의 쌍으로 이루어진 데이터 구조입니다. 중괄호({ })로 생성하며, 각 쌍은 콜론 : 으로 키와 값이 구분되고, 각 쌍은 쉼표 , 로 구분됩니다.

 

1. 딕셔너리의 특징

 

      1-1 유연한 구조

      딕셔너리는 키-값 쌍의 집합으로 구성되어 있으며, 각 키와 값은 임의의 데이터 타입일 수 있습니다.

      즉, 숫자, 문자열, 리스트, 튜플, 딕셔너리 등을 포함한 모든 데이터 타입을 딕셔너리의 키 또는 값으로

      사용할 수 있습니다.

      1-2 키의 유일성

      딕셔너리의 키는 유일해야 하며, 중복된 키는 허용되지 않습니다.

      각 키는 딕셔너리 내에서 고유한 식별자 역할을 합니다.


      1-3 순서가 없음

      딕셔너리는 내부적으로 키-값 쌍의 순서를 유지하지 않습니다.

      따라서 딕셔너리의 요소에는 인덱스를 사용하여 직접 접근할 수 없습니다.

 

2. 딕셔너리의 사용


딕셔너리는 다음과 같은 주요 용도로 사용됩니다.


      2-1 데이터 그루핑

      딕셔너리는 서로 관련된 데이터를 묶어서 저장하고 관리할 수 있습니다.

      예를 들어, 사용자 정보(이름, 나이, 이메일 등)를 딕셔너리의 키-값 쌍으로 저장하여 효율적으로 관리할 수 있습니다.

 

      2-2 빠른 검색

      딕셔너리는 키를 사용하여 빠르게 값에 접근할 수 있습니다.

      키를 기반으로 데이터를 검색하므로, 데이터의 크기가 커져도 검색 시간이 늘어나지 않습니다.

 

      2-3 딕셔너리의 생성
      딕셔너리는 중괄호 { }를 사용하여 생성하며, 각 키와 값은 콜론 :으로 구분됩니다.

my_dict = {'name': 'Alice', 'age': 30, 'email': 'alice@example.com'}

# dict() 생성자를 사용하여 빈 딕셔너리를 생성할 수도 있습니다.
empty_dict = dict()

 

자료구조 순서 수정 중복 정의
리스트 ( list ) O O O [ ]
튜플 ( tuple ) O X O ( )
세트 ( set ) X O X { }
딕셔너리 ( dict ) X Key : X , Value : O Key : X , Value : O { }

 

2. 변수


변수는 데이터를 저장하는 데 사용되는 식별자(identifier)입니다. 파이썬에서 변수를 사용할 때는 값을 할당하고 참조할 수 있습니다. 변수를 정의할 때는 이름을 선택하고 등호(=)를 사용하여 값을 할당합니다.

마치 상자에 이름을 붙여 놓는 것처럼, 변수는 데이터에 이름을 붙여 쉽게 관리할 수 있도록 합니다.

# 변수에 값 할당하기
age = 25
name = 'John'
is_student = True

# 변수 값 출력하기
print(age)        # 25
print(name)       # John
print(is_student) # True


변수를 사용하여 데이터를 저장하고 조작할 수 있으며, 변수의 값을 언제든지 변경할 수 있습니다.

 

주의사항

 

1. 변수명 규칙

변수명은 영문자(대소문자 구분), 숫자, 밑줄(_)을 사용할 수 있습니다. 하지만 숫자로 시작할 수는 없습니다.

변수명을 지을 때 스네이크 케이스(my_variable_name)나 카멜 케이스(myVariableName)와 같은 네이밍 컨벤션을 따르는 것이 좋습니다. 

스네이크 케이스는 단어를 모두 소문자로 쓰고 단어 사이를 밑줄(_)로 구분하는 방식이며, 카멜 케이스는 첫 단어를 소문자로 시작하고 이후 단어의 첫 글자를 대문자로 쓰는 방식입니다.

# 유효한 변수명 예시
my_variable = 10
anotherVariable = "Hello"
_this_is_a_variable = True
snake_case_variable = 42
camelCaseVariable = "World"

# 잘못된 변수명 예시 (문법 오류)
2nd_variable = 20  # 숫자로 시작
variable-name = "invalid"  # 특수 문자 사용
for = "loop"  # 예약어 사용

 

2. 예약어 사용 금지

파이썬에서 사용되는 예약어(예: if, for, while 등)는 변수명으로 사용할 수 없습니다.

 

3. 가독성 유지

변수명을 의미있게 작성하여 코드의 가독성을 높이는 것이 중요합니다.

 

4. 동적 타이핑

파이썬은 동적 타이핑 언어로, 변수의 타입은 런타임에 결정됩니다. 이는 자유로운 프로그래밍을 가능하게 해주지만, 예상치 못한 버그를 발생시킬 수 있으므로 주의가 필요합니다.