[Python] 변수의 자료형

2020. 1. 8. 14:54Python 기초/Python_Basic

읽기전에 
코드 결과는 맨 아래 # 으로 표시하였습니다. 기본 환경은 Jupyter이며, 따라서 만약 코드 실행을 원하신다면 위에서부터 차례대로 실행시키면 됩니다. 코드블록 하나만을 실행시키면 올바른 결과가 나오지 않을 수 있습니다. 

변수(Variable)

python에서 사용하는 여러 변수의 형태와 사용하는 여러 함수에 대해 다뤄보겠습니다.

python에서 사용하는 변수는 기본적으로 변수명 = 변수로 선언하며, 이때 변수명은 소문자와 대문자를 구분합니다.

또한, 연산자(+,-,*,/)나 python에서 사용하는 내장 함수를 의미하는 문자들(for, if...)은 사용할 수 없습니다.

띄어쓰기(스페이스바) 역시 마찬가지로 사용할 수 없습니. 일반적으로 띄어쓰기를 표기하기 위해서는 _ 를 사용합니다.


숫자의 자료형

Integer, 정수형

정수형은 수학에서 사용하는 '정수'와 동일합니다. 아래 코드와 같이 선언할 수 있고, integer의 약자인 int 라는 클래스를 가집니다.

# 정수형 변수 선언
a = 2
print(a)
print(type(a))

# 2
# <class 'int'>

Float, 실수형

실수형은 수학에서 사용하는 '실수'와 동일합니다. 실수는 float로 표기합니다. 

# 변수 재선언
a = 2.0 # 이 순간, 윗 코드에서 선언한 a = 2는 사라지고 a = 2.0이라는 새로운 변수가 선언된다. 
print(a)
print(type(a))

# 2.0
# <class 'float'>

정수의 연산

python에서 정수의 연산은 기본적으로 공백에 영향을 받지 않습니다. 따라서 a+b와 a + b 는 동일합니다. 연산자로는 대표적으로 +, -, *, /, **, //, % 가 존재하며, **(제곱)은 *(곱하기)보다 우선됩니다.

# 연산 예시
a = 3
b = 2

print(a+b) # 더하기
print(a**b) # 제곱
print(a/b) # 나누기
print(a//b) # 몫
print(a%b) # 나머지

# 5
# 9
# 1.5
# 1
# 1

정수와 실수의 연산, 묵시적 형변환

정수와 실수의 연산은 '묵시적 형변환'이 발생한 다음 연산을 실시하게 됩니다.

묵시적 형변환이란, 쉽게 말해 프로그램이 사용자에게 일일이 보고하지 않고 자동으로 변수의 형태를 바꾸는 것을 의미합니다. 묵시적 형변환이 발생하게 되면 정수는 실수로 바뀌게 됩니다.

a = 3 
b = 2.0 
print(a+b) # 묵시적 형변환 발생 후 연산 수행
print(type(a+b)) # 형태도 변경

# 5.0
# <class 'float'>

명시적 형변환

명시적 형변환은 사용자가 직접 형태를 변경할 것을 지시하여 형태를 변경하는 것입니다.

# a를 float형으로 변환
a = float(a)

# b를 int형으로 변환될때, 뒤의 소수점은 그냥 사라진다. 
# 사라진 소수점은 후에 다시 float형으로 바꿔도 돌아오지 않는다.
b = int(b)

print(a)
print(b)

# 3.0
# 2

이진 자료형, Boolean (True & False)

Boolean 자료형은 기본적으로 if문과 while문과 같은 조건문에서 자주 사용됩니다.  True, False 는 이미 그 자체로 의미가 내장되어 있기 때문에, 변수명으로 사용할 수 없습니다.

a = True
b = False
print(a)
print(type(a))
print(b)
print(type(b))

# True
# <class 'bool'>
# False
# <class 'bool'>
# Boolean에서 어느 때 False가 출력되는가?
# 1. 숫자자료형은 값이 0일때 False가 출력된다.
a = 0
print(bool(a))

# 2. 리스트, 튜플, 딕셔너리, 집합과 같은 시퀀스 자료형은 안에 요소가 없을 때 False가 출력된다.
a = []
b = {}
print(bool(a))	
print(bool(b))

# False
# False
# False

문자열 자료형, String

문자열은 "", '' 안에 문자를 넣어서 선언한다. "'는 구분할 수 있습니다. 

# quote 는 인용문이라는 뜻을 가지고 있다.
quote = "나는 생각한다. 고로 존재한다."
print(quote)
print(type(quote))

# 나는 생각한다. 고로 존재한다.
# <class 'str'>

문자열 연산

python에서는 +와 *를 통해 문자를 연산할 수 있습니다. 

# 문자열 연산에는 +와 *가 있다.
# +와 * 모두 공백없이 정확하게 달라붙어 출력된다.
a = 'apple'
b = 'delicious'
print(a+b)
print(a*3)

# appledelicious
# appleappleapple

이스케이프(Escape) 코드

이스케이프 코드는 문자열을 다루기 위한 코드입니다. 여기서는 자주 사용하는 코드를 다뤄보겠습니다. 이스케이프 코드는 문자열 안에 넣어서 사용합니다.

\n :  개행 (엔터와 같은 의미)
\t :  탭 (스페이스바4번)
\\ :  슬래쉬
\' :  작은 따옴표
\" :  큰 따옴표
# enter의 역할을 하는 \n
a = "치킨 \n먹을래."
print(a)

# 치킨 
# 먹을래.
# 4칸을 띄어쓰는 \t
a = "치킨 \t먹을래."
print(a)

# 치킨 	먹을래.
# \\을 넣고 싶을때 사용하는 \\
a = "치킨 \\먹을래."
print(a)

# 치킨 \먹을래.
# 문자열은 겉에 ''와 ""를 씌우기 때문에, 안에서의 혼동을 방지하기 위한 \',\"
a = "치킨 \'진짜\' 먹을래."
print(a)

# 치킨 '진짜' 먹을래.
a = "그가 말했다. \"치킨 먹을래.\""
print(a)

# 그가 말했다. "치킨 먹을래."

리스트(List)

리스트는 [](대괄호)로 선언합니다. 대괄호 안에 여러 변수들을 넣을 수 있으며, 길이를 가지고 있기 때문에 시퀀스(Sequenc)형이라고도 부릅니다. 리스트는 python에서 매우 자주 사용되며, 리스트에서만 쓸 수 있는 내장 함수들이 존재합니다.

fruits = ['apple', 'banana', 'grape', 'lemon', 'melon', 1]
print(fruits)
print(type(fruits))
print(len(fruits))
# len은 list안의 요소들의 개수를 세어준다.

# ['apple', 'banana', 'grape', 'lemon', 'melon', 1]
# <class 'list'>
# 6

리스트는 인덱스(Index)로 변수에 접근할 수 있습니다. 인덱스란, 쉽게 말해 '몇 번째' 를 의미합니다.

# 단, python은 0부터 숫자를 센다.
fruits = ['apple', 'banana', 'grape', 'lemon', 'melon', 1]

print(fruits[0]) # 0번째인 'apple'
print(fruits[1])

# apple
# banana
print(type(fruits[3]))
print(type(fruits[5]))

# <class 'str'>
# <class 'int'>
# 범위를 지정할 수도 있다.
fruits = ['apple', 'banana', 'grape', 'lemon', 'melon', ]
print(fruits[:3]) # python은 항상 ~이상, ~미만이다.
print(fruits[::2]) # 두칸씩 뛸수도 있다.
print(fruits[-1])

# ['apple', 'banana', 'grape']
# ['apple', 'grape', 'melon']
# melon

중첩리스트

여기서부터는 어려워지기 때문에.. 차근차근 살펴보겠습니다. 

a = [1,2,3, [1.0, 2.0, 3.0, ['a','b','c']]]
print(a)

# [1, 2, 3, [1.0, 2.0, 3.0, ['a', 'b', 'c']]]
# 처음 보았을 때는 매우 어렵다...! 존댓말 on 

# 천천히 분석해봅시다. 
# a의 요소는 1, 2, 3, 그리고 리스트 입니다.
# 따라서 3번째를 출력하면, [1.0, 2.0, 3.0, ['a','b','c']]가 나올것을 기대합니다.
print(a[3])

# 중첩리스트 역시 리스트이기 때문에, 인덱스를 통해 접근할 수 있습니다.
# a의 3번째 요소의 3번째 요소의 0번째 요소는 'a'가 나올 것으로 기대합니다.
print(a[3][3][0])

# a의 요소의 개수는 몇개일까요? 당연히 4개입니다.
print(len(a))

# 어렵게 생각하지말고, 차근차근 앞에서부터 잘라나가면 알 수 있습니다.

# [1.0, 2.0, 3.0, ['a', 'b', 'c']]
# a
# 4

리스트 연산

리스트끼리는 연산이 가능합니다. 

a = [1, 2, 3]
b = ['a', 'b', 'c']

# 리스트 끼리는 연산이 가능합니다.
# + 연산은 리스트를 뒤에 더해주는 것이기 때문에, extend와 그 원리가 같습니다.
print(a+b)
print(a.extend(b)) # 그러나 연장하는 것 자체를 출력할 수는 없습니다. None값이 출력됩니다.

c = a.extend(b) # 새롭게 변수를 저장해도, 마찬가지입니다.
print(c)
print(a) # extend 이후, a를 출력하는 것만 올바른 값을 가져옵니다.

# [1, 2, 3, 'a', 'b', 'c']
# None
# None
# [1, 2, 3, 'a', 'b', 'c']
print(b*2) # *연산자 역시 올바르게 작동합니다.

# ['a', 'b', 'c', 'a', 'b', 'c']

리스트 값 수정하기 

a = [1, 2, 3]
print(a)

# [1, 2, 3]
# 인덱스로 접근해봅시다.
a[2] = 10
print(a)

# [1, 2, 10]
# del도 사용이 가능합니다.
del a[2]
print(a)

# [1, 2]

리스트 관련 함수 (append, extend)

가장 기초적으로 append과 extend가 존재합니다. 

a = [1, 2, 3]
print(a)
# append 함수는 리스트의 뒤쪽에 추가하게 됩니다.
a.append(4)
a

# [1, 2, 3, 4]
# 문자열 역시 추가가 가능합니다.
a.append('와! 너무재밌다!')
print(a)

# [1, 2, 3, 4, '와! 너무재밌다!']
# 리스트 추가도 가능합니다.
a = [1, 2, 3]
a.append([4, 5, 6])
print(a)

# [1, 2, 3, [4, 5, 6]]
# extend와의 차이가 뭘까요?
# extend는 리스트를 언패킹(Unpacking)하여, 요소로써 추가하게 됩니다. 
a = [1, 2, 3]
a.extend([4,5,6])
print(a)

# [1, 2, 3, 4, 5, 6]

리스트 관련 함수 (sort, reverse)

a = [1, 3, 5, 2, 4]
print(a)

# [1, 3, 5, 2, 4]
a.sort() # 오름차순으로 정렬합니다.
print(a)

# [1, 2, 3, 4, 5]
a.sort(reverse=True) # 내림차순으로 정렬합니다. 
print(a)

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

# sort 함수가 오름차순, 내림차순 정렬이였다면, reverse는 그런것과 상관없이 리스트의 순서 자체를 뒤집습니다.
a.reverse()
a

# [4, 2, 5, 3, 1]
# 참고. reverse() 안에는 어떠한 argument도 넣을 수 없습니다.
a.reverse(reverse=True) # 오류발생

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-89-fa8c9d1c973a> in <module>
      1 # reverse() 안에는 어떠한 argument도 넣을 수 없습니다.
----> 2 a.reverse(reverse=True) # 오류발생

TypeError: reverse() takes no keyword arguments

리스트 관련 함수 (index, insert, remove, pop, count)

# index 함수는 그 요소가 몇번째 위치에 있는지 그 좌표를 알려줍니다.
a = ['a', 'b', 'c', 'd']
a.index('d')

# 3
# insert는 정확한 index의 좌표값에 정확한 값을 "추가"합니다.
# 대체의 개념이 아닙니다. 그 좌표값에 어떠한 값을 추가하고, 나머지 값들은 뒤로 밀어냅니다.
a = [1, 2, 3, 4, 5]
print(a)

# [1, 2, 3, 4, 5]
# insert를 사용할때는 []를 사용할 필요가 없습니다.
a.insert(0, 10)
print(a)

# [10, 1, 2, 3, 4, 5]
a = [1, 1, 1, 2, 3, '지워줘', 4, 5, 1]

# remove는 정확한 단 하나의 요소값을 지워줍니다. 
a.remove('지워줘')
print(a)

# [1, 1, 1, 2, 3, 4, 5, 1]
a = [1, 2, 3, "꺼내줘", 4]

# pop은 정확한 요소를 집어서 밖으로 빼낸 후, 이를 삭제합니다.
c = a.pop(4)
print(c)
print(a)

# 4
# [1, 2, 3, '꺼내줘']
# pop의 default 값은 맨 뒤의 요소입니다.
a = [1, 2, 3, 4]
a.pop()
print(a)

# [1, 2, 3]
a = [1, 1, 1, 2, 2, 3]

# count는 리스트 안의 정확한 요소의 개수를 찾아냅니다.
b = a.count(1)
print(b)

# 3

튜플, Tuple

튜플은 자주 사용되지 않기 때문에, 개념만 짚고 넘어갑니다. 

# 튜플이란? () 안에 요소를 넣음으로써 생성합니다.
# list와 매우 유사하지만, 직접 값을 수정하지 않는 이상 값을 수정하거나 변경할 수 없습니다.
a = (1, 2, 3, 4, 5)
print(a)
print(type(a))

<class 'int'>
<class 'tuple'>
<class 'tuple'>

집합 - Set

# 집합은 자주 사용되는 개념은 아니지만, 짚고 넘어가야하는 개념입니다.
# 특히 몇몇 알고리즘 문제를 푸는데에 유용합니다. 
# 집합은 {} 로 정의됩니다.
# 합, 교, 차 집합이 전부 가능합니다.

a = {1, 2, 3}
b = {2, 3, 4}

print(a)
print(b)
print(type(a))
print(type(b))

# {1, 2, 3}
# {2, 3, 4}
# <class 'set'>
# <class 'set'>

집합의 연산

a = {1, 2, 3}
b = {2, 3, 4}
# 교집합
c = a & b
print(c)

d = a.intersection(b) # intersection은 함수입니다. () 안에 넣어야겠죠?
print(d)

# {2, 3}
# {2, 3}
# 합집합 
c = a | b
print(c)

d = a.union(b)
print(d)

# {1, 2, 3, 4}
# {1, 2, 3, 4}
# 차집합
c = a - b
c2 = a.difference(b) # difference 함수를 사용할 수 도 있습니다.
print(c)
print(c2)

d = b - a
d2 = b.difference(a)
print(d)
print(d2)

# {1}
# {1}
# {4}
# {4}

집합의 논리

# 집합은 논리연산자가 작동합니다.
# 부분집합과 모집합을 생각하면 이해가 쉽습니다.
a = {1, 2, 3}
b = {1, 2, 3, 4, 5}

# a는 b의 부분집합입니다.
# b는 a의 모집합입니다.
a > b

# False
a < b

# True
a <= b

# True

딕셔너리, Dictionary

딕셔너리는 알고리즘과 데이터 분석에서 정말 많이 활용됩니다. 따라서 반드시 알아두어야 합니다. 기본적으로 키와 밸류의 짝으로 이루어져있습니다. 

 

집합과 마찬가지로 {}를 사용하지만 내부는 전혀 다릅니다. 참고로 a = {} 와 같이 선언하게 되면 기본적으로 자료형은 딕셔너리 형태가 됩니다. 

 

# 딕셔너리는 key와 value로 이루어져 있습니다.
# 따라서, key 값과 value 값 둘다 이용하여 접근이 가능합니다.
Minsu = {
    'name': 'Minsu',
    'age': 20,
    'height': 180.0,
    'hobby': 'listening music',
}
print(Minsu)
print(type(Minsu))

{'name': 'Minsu', 'age': 20, 'height': 180.0, 'hobby': 'listening music'}
<class 'dict'>
# 키 값을 호출하면 밸류 값이 출력됩니다.
Minsu['age']

# 20

딕셔너리 관련 함수(keys, values)

jungho = {
    'name': 'jungho',
    'age': 26,
    'height': 183.3,
    'hobby': 'listening music',
    'friends': ['purem', 'jiwon']
}
jungho.keys()

# dict_keys(['name', 'age', 'height', 'hobby', 'friends'])
jungho.values()

# dict_values(['jungho', 26, 183.3, 'listening music', ['purem', 'jiwon']])

딕셔너리 관련 함수(items, clear)

jungho.items()

# dict_items([('name', 'jungho'), ('age', 26), ('height', 183.3), ('hobby', 'listening music'), ('friends', ['purem', 'jiwon'])])
jungho.clear() # 내용을 전부 삭제합니다.
print(jungho)
print(type(jungho)) # 내용이 삭제되어도 여전히 dict의 속성을 가지고 있습니다.

# {}
# <class 'dict'>