어떤 프로그래밍 언어든 자료형을 충분히 이해하지 않고 프로그래밍을 시작하면
나중에 프로그램을 만들때 억장이 와르르 무너져 버릴 수 있다.
그럼 기초 공사를 시작해보자.
여러 자료형을 배워보기 전 딱 하나만 기억하고 가자.
연산
은 자료형이 같은
경우에만 할 수 있다.
그럼 자료형마다 어떻게 연산이 다른 지 알아보자.
숫자형은 우리가 흔히 사용하는 숫자로 이루어진 자료형이고,
우리가 잘 알고 있는 정수, 실수도 있지만,
친숙하지 않은 8진수, 16진수도 있다.
8진수와 16진수
8진수(Octal): 숫자가 0o 또는 0O로 시작
16진수(Hexadecimal): 숫자가 0x로 시작
숫자형을 활용하여 연산을 해보자.
a = 3 b = 10 print(a + b) print(a - b) print(b / a) print(b // a) print(b * a) print(b ** a) print(b % a)
13
-7
3.3333333333333335
3
30
1000
1
5번째 줄의 '/'와 6번째 줄의 '//'의 차이는?
'/'는 나눗셈 결과를 그대로 돌려주지만, '//'는 나눗셈 후 몫을 반환해준다.
다음은 문자열(String)이다.
문자열을 만들 때는 'apple', "banana" 처럼 따옴표를 사용해야 하고,
줄이 다른 문자열을 만들고 싶을 때는
multiline=""" Semin is handsome """
이처럼 연속된 따옴표 3개를 사용하여 만들 수 있다.
s = "jang semin" 문자열에서
필요한 부분만 추출하고 싶다면?
인덱싱
또는 슬라이싱
을 통해 추출할 수 있다.
s = 'jang semin' print(s[0]) #인덱싱 print(s[0:5]) print(s[:10:2]) print(s[::2]) print(s[::-1])
j
jang
jn ei
jn ei
nimes gnaj
두번째 줄처럼 인덱싱을 활용해 특정 요소를 추출할 수도 있고,
3번째~6번째 줄처럼 슬라이싱을 활용해 부분을 뽑아낼 수도 있다.
슬라이싱 기법을 사용할 때 시작번호와 끝 번호를 꼭 지정해주지 않아도 되고,
끝 번호 index는 추출 시 포함하지 않는다는 것을 기억하자.
6번째 줄의 [-1]이 뜻하는 건 뒤에서부터 추출 한다는 것이다.
a = "Pithon" print(a[1]) a[1] = 'y'
a 변수에 "Pithon"을 대입하고, a[1]의 값을 y로 바꿔주려 했으나,
오류가 발생한다. 왜?
따라서, 문자열 요소 변경은 인덱싱과 슬라이싱으로 해야한다!
a = "Pithon" print(a[:1] + 'y' + a[2:])
"현재 생활관 온도는 18도 입니다."
시간이 흐른 후 다시 재보니, 20도로 변했다.
이렇게 특정한 값을 바꿔야 할 경우 포매팅
기법을 쓴다.
a = 'I eat %s apples.' % 3 print(a)
이렇게 문자열 포맷 코드를 사용하여 바로 대입할 수도 있고,
name = '장세민' age = 23 print(f'나의 이름은 {name}입니다. 나이는 {age}입니다.')
이름으로 넣을 수도 있다.
문자열 자료형은 문자열 내장 함수를 가지고 있다.
s = ' jang semin ' print(s.upper()) #대문자 변환 print(s.lower()) #소문자 변환 print(s.count('n')) #문자 개수 세기 print(s.find('n')) #위치 알려주기1, 존재하지 않으면 -1 print(s.index('n')) #위치 알려주기2, 존재하지 않으면 오류 a = s.split(' ') #문자열 ''기준으로 나누기 print(a) print('!'.join(a)) #문자열의 각각의 문자 사이에 ''삽입 print(s.lstrip()) #왼쪽 공백 지우기 print(s.rstrip()) #오른쪽 공백 지우기
기억해두자
리스트 안에는 어떠한 자료형도 포함시킬 수 있다.
a = [] b = [1,2,3] c = ['life', 'is', 'too', 'short'] d = [1, 2, 'life', 'is'] e = [1, 2, ['life', 'is']]
이런 리스트의 가장 중요한 특징은 다음과 같다.
e = [1, 2, ['life', 'is']] e[2][0] = 'semin' print(e)
[1, 2, ['semin', 'is']]
리스트의 길이를 구하기 위해서는 len함수
를 사용해야 한다.
print(len(e))
3
l = [400, 200, 100, 200, 300] l.append(500) #리스트에 요소 추가 l.sort() #리스트 오름차순 정렬 print(l) l.reverse() #리스트 내림차순 정렬 print(l) l.insert(1, 600) #리스트의 a번째 위치에 b 삽입 print(l) print(l.count(300)) #리스트에 포함된 요소 x의 개수 세기 l.extend([100, 200, 300]) #원래 리스트에 x리스트 더함 print(l.pop()) #맨 마지막 요소를 돌려주고 그 요소 삭제 l.remove(100) #리스트에서 첫 번째로 나오는 x 삭제 print(l)
[100, 200, 200, 300, 400, 500]
[500, 400, 300, 200, 200, 100]
[500, 600, 400, 300, 200, 200, 100]
1
300
[500, 600, 400, 300, 200, 200, 100, 200]
튜플(tuple)은 리스트와 거의 비슷하며 리스트와 다른 점은 다음과 같다.
t1 = () t2 = (1,) t3 = (1, 2, 3) t4 = 1, 2, 3 t5 = ('a', 'b', ('ab', 'cd'))
t2 = (1,) 처럼 단지 1개의 요소만을 가질 때는 요소 뒤에 콤마(,)를 반드시 붙여야 하고,
t4 = 1, 2, 3처럼 괄호()를 생략해도 무방하다는 점 기억하자!
요즘 사용하는 대부분의 언어는 연관 배열
또는 해시(Hash)
를 통해
'이름' = '장세민, '나이' = 23 처럼 대응관계를 나타낼 수 있는 자료형을 갖고 있다.
파이썬에는 이를 딕셔너리 자료형을 통해 구현할 수 있다.
딕셔너리 자료형의 가장 큰 특징은
Key
를 통해 Value
를 얻는다.dic = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}
Key | Value |
---|---|
name | pey |
phone | 0119993323 |
birth | 1118 |
리스트나 튜플, 문자열은 요솟값을 얻고자 할 때 인덱싱이나 슬라이싱 기법을 사용하지만,
다음 예시처럼
grade = {1:'a', 2:'b'} print(grade[1]) #Key가 1인 요소의 Value를 반환 print(grade[2]) #Key가 2인 요소의 Value를 반환
a
b
[]안의 숫자는 n번째 요소를 뜻하는 것이 아니라 Key에 해당하는 값을 나타낸다.
앞에서도 말했듯이 인덱싱 방법은 딕셔너리 자료형에 적용할 수 없다.
a = {1:'a', 1:'b'} print(a)
먼저 딕셔너리에서 Key는 고유 값이므로 중복되는 Key값을 설정해 놓으면
하나를 제외한 나머지 것들이 모두 무시된다.
또 한 가지 주의해야 할 사항은 Key에 리스트는 쓸 수 없다.
딕셔너리의 Key로 사용 여부는 Key가 가변하는 값인지 아닌지에 따라 달려 있다.
a = {[1,2]: 'hi'}
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-6-1620a8a90d9a> in <module> ----> 1 a = {[1,2]: 'hi'} TypeError: unhashable type: 'list'
단 Value에는 변하는 값이든 변하지 않는 값이든 상관없이 아무 값이나 넣을 수 있다.
a = {'name':'pey', 'phone': '0119993323', 'birth': '1118'} print(a.keys()) #Key 리스트 만들기, 리스트 고유 함수는 사용 x print(a.values()) #Value 리스트 만들기 print(a.items()) #Key, Value 쌍 튜플로 돌려줌 print(a.get('name')) #Key로 Value 얻기 print(a.clear()) #Key:Value 쌍 모두 지우기
dict_keys(['name', 'phone', 'birth']) dict_values(['pey', '0119993323', '1118']) dict_items([('name', 'pey'), ('phone', '0119993323'), ('birth', '1118')]) pey None
s1 = set("Hello") print(s1)
{'e', 'H', 'o', 'l'}
결과가 좀 이상하다.
l문자가 하나 빠져있고, 순서도 엉망이다.
그 이유는 집합에는 가장 중요한 특징이 있기 때문이다.
순서가 없다는건? 인덱싱으로 값을 얻을 수 없다는 것
s1 = set([1, 2, 3, 4, 5, 6]) s2 = set([4, 5, 6, 7, 8, 9]) print(s1 & s2) #교집합 print(s1.intersection(s2)) #교집합 print(s1|s2) #합집합, 중복해서 포함된 값은 한 개씩만 표현 print(s1.union(s2)) #합집합 print(s1 - s2) #차집합 print(s1.difference(s2)) #차집합
{4, 5, 6}
{4, 5, 6}
{1, 2, 3, 4, 5, 6, 7, 8, 9}
{1, 2, 3, 4, 5, 6, 7, 8, 9}
{1, 2, 3}
{1, 2, 3}
s1 = set([1, 2, 3]) s1.add(4) #값 1개 추가 print(s1) s1.update([5, 6, 7]) #값 여러 개 추가 print(s1) s1.remove(2) #특정 값 제거 print(s1)
{1, 2, 3, 4}
{1, 2, 3, 4, 5, 6, 7}
{1, 3, 4, 5, 6, 7}
a = True b = False print(type(a)) print(type(b))
<class 'bool'>
<class 'bool'>
불(bool) 자료형은 참(True)과 거짓(False)을 나타내는 자료형이다.
자료형에 참과 거짓이 존재한다는 말은 이상할 지 몰라도 분명히 존재한다!
자료형 | 값 | 참 or 거짓 |
---|---|---|
문자열 | "" | 거짓 |
리스트 | [] | 거짓 |
튜플 | () | 거짓 |
딕셔너리 | {} | 거짓 |
숫자형 | 0이 아닌 숫자 | 참 |
None | 거짓 |
문자열, 리스트, 튜플, 딕셔너리 등의 값이 비어 있으면 거짓이다.
숫자에서는 값이 0일 때 거짓이 된다.
오늘은 여기까지