자료형
프로그래밍을 할 때 쓰이는 숫자, 문자열등의 자료 형태로 저장되는 그 모든 것을 뜻한다. 프로그램의 가장 기본이 되고 핵심적인 단위가 되는 것이
바로 이 자료형이다. 따라서 자료형을 충분히 이해하지 않고 프로그래밍을 시작하려는 것은 프로그래밍의 포기로 연계될 수 있다.
이론적인 부분이라 다소 지루한 면이 있지만, 자료형은 가장 기초가 되는 부분이기 때문에 끈기 있게 공부하는 것이 좋다.
1. 숫자형
숫자형이란 말 그대로 숫자 형태로 이루어진 자료형으로 자연수, 정수, 실수, 복소수(이것을 안다면 당신은 공대생 ㅋㅋ), 8진수, 16진수 등이
있다. 이런 숫자들은 파이썬에서는 다음과 같이 표현한다.
정수형
정수형이란 말 그대로 정수를 뜻한다. 양의 정수, 0, 음의 정수 모두를 말한다.
실수
아래에서 첫 번째와 두 번째는 사람들이 사용하는 방식이며, 세 번째와 네 번째는 컴퓨터식 지수 표현 방법이다.
* 1번째 줄에 위치한 것은 파이썬에서 한글을 지원하기 위해 추가해야 하는 문자열이다.
8진수
8진수를 사용하기 위해서는 숫자가 0(숫자 0)으로 시작하면 된다.
16진수
16진수를 사용하기 위해서는 숫자 혹은 문자가 0x로 시작하면 된다.
복소수
* 여기서 알아할 개념은 함수의 사용이 아니라 바로 ` <- 이 기호이다.
` 이 기호는 단일 인용부호가 아니라 숫자키 1 왼쪽, Tab키의 위에 위치한 것이다.
4~7줄을 보면 개념상 문자열과 숫자를 더하고 있다. 아래쪽에서도 나오지만 문자열+문자열은 문자열을 서로 연결하라는 뜻으로 해석되지만, 문자열+숫자형의 경우에는 서로 형이
다르기 때문에 에러가 난다. 따라서 숫자형을 문자형으로 바꿔줘야 하는데 그럴 때 사용하는 것이 바로 ` 기호다.
즉, 'a.real` 이라는 것은 숫자 2.0이 아니라 문자열 "2.0"이다.
숫자 연산
파이썬에서도 사칙연산을 사용할 수 있다.
위와 같은 사칙 연산이 가능하다. 그러나 나눗셈의 경우에는 주의해야 할 부분이 있다. 다음 사진을 참고하자.
3 /4를 했을 경우 0.75가 나오기를 바라면 1번째 줄의 경우처럼 하면 결과에서 알 수 있듯이 0으로 뜬다. 이는 3과 4를 자연수로 인식하기
때문이다. 따라서 0.75가 나오게 하고 싶은 경우에는 숫자 2개 중 1개를 실수로 표현해야 한다. (3,4번째 줄)
혹은 10,11번째 줄 처럼 사용할 수도 있는데 이를 캐스팅(형 변환)이라고 한다. 즉, float(x)는 x라는 변수에 대입된 값을 실수값을 바꾸어 준다.
프로그래밍을 한번이라도 해 본 사람은 아래의 연산자를 알 것이다. % 연산자는 나머지 값을 구해주는 연산자이다.
아래의 연산자는 x의 y승을 구해주는 연산자이다.
2. 문자열
문자열이란 문장을 말한다. 혹은 숫자이여도 인용부호 (") 로 둘러진 것은 모두 문자열로 인식된다.
- "Hello Python"
- "A"
- "12345"
문자열을 만드는 방법
1. "Hello World"
2. 'Hello World'
3. """Python, it is very powerful language"""
4. '''Python, it is very powerful language'''
문자열을 만들기 위해서는 위의 예에서 보듯이 이중 인용부호("), 단일 인용부호(') 혹은 이중/단일 인용부호 3개를 연속으로 사용하면 된다.
그렇다면 단순함을 좋아하는 파이썬에서 굳이 문자열 만드는 방법을 4가지나 지원하는 이유는 무엇일까? 이유는 다음과 같다.
문자열 내에 ('), (")를 포함시키려면...?
문자열을 나타내게 해주는 ('), (")를 때로는 문자열 자체에 포함시켜야 할 경우도 있다. 이러한 경우에는 좀 더 특별한 문법이 필요한다.
1. 단일 인용부호 (')를 포함 ( Pyton's powerful )
위와 같은 문자열을 변수(str)에 저장하고 싶을 경우에는 다음과 같이 문자열을 이중 인용부호(")로 둘러싸야 한다.
str = "Pythons's powerful"
2. 이중 이중 인용부호 (")를 포함 ("Python's powerful." I said)
위와 같이 이중 인용부호(")가 포함된 문자열은 단일 인용부호(')로 둘러싸야 한다.
str = '"Python's powerful." I said'
3. '\' (역슬래시)로 ('),(") 무력화
('),(")를 문자열에 포함시킬 수 있는 또 다른 방법은 역슬래시를 이용하는 것이다.
즉, 역슬래시가 문자열 내에 삽입되면 그것은 문자열을 둘러싸는 의미가 아니라 문자 그 자체를 뜻하게 된다.
str1 = 'Python\'s powerful'
str2 = "\"Python's powerful.\" I said'
복수의 문자열 처리
문자열이 항상 1줄만 있는 것은 아니다. 다음과 같이 여러가지 문자열이 있을 때의 처리법을 알아보자.
I'm student
I'm learning a Python
Python is very fun
1. 줄바꿈 문자('\n') 삽입
ml1 = "I'm student\nI'm learning a Python\nPython is very fun"
위의 예처럼 줄바꿈 문자를 삽입할 수 있으나 가독성이 떨어지며, 줄이 너무 길어진다는 단점이 있다.
따라서 아래의 방법을 많이 사용한다.
2. 연속된 이중 인용부호 3개 사용 (""")
ml2 = """
I'm student
I'm learning a Python
Python is very fun
"""
문자열 연산
파이썬에서는 숫자와 마찬가지로 문자열을 더하고 곱할 수 있다. 사람의 생각을 그대로 반영해주는 파이썬의 장점 중 하나이다.
1. 문자열 합치기
3번째 줄을 보면 더도 말고 덜도 말고 딱 눈에 보이는 데로 보면 fr과 ba를 더하라고 해석할 수 있다.
"Python"이라는 fr 변수와 " is very powerful" 이라는 ba 변수를 더한 것이다. 문자열에서의 덧셈 연산은 서로 붙이라는 뜻으로 해석할 수 있다.
2. 문자열 곱하기
1번째 줄에서 a 변수에 "=" 라는 문자열을 입력하였다. 그리고 2,4 번째 줄에서 곱셈 연사을 하였고 결과는 위와 같다.
문자열에서의 곱셈 연산은 해당 문자열을 곱한 수만큼 출력하라는 뜻으로 해석할 수 있다.
인덱싱
위의 이론들이 기본이였다면 지금부터는 약간 중급의 개념으로 볼 수 있다.
인덱싱이란 무엇인가를 '가리키다' 라는 의미이다. 이해가 잘 되지 않는 다면 아래의 예를 보면서 이해 하면 된다.
각 문자열의 자리마다 번호를 매긴 숫자이다. 여기서 프로그래밍을 처음 접하는 사람들이 굉장이 헷갈릴만한 개념이 등장한다.
대부분의 프로그래밍 언어들은 위와 같이 특정한게 연속으로 나올 경우 제일 앞에 위치하는 것을 0으로 인식
한다는 점이다. 즉, 사람들은 4번째 줄 처럼 1,2,3, 이런 식으로 숫자를 세지만, 컴퓨터는 2번째 줄 처럼 0,1,2, 이런 식으로 인식한다는 것이다.
이것은 굉장이 중요한 개념으로 반드시 알아두어야 한다.
다시 본론으로 들어와서 슬라이싱의 예제를 보도록 하자.
a[숫자]가 뜻하는 것은 a라는 문자열의 숫자 번째 문자를 말한다.
즉 2번째 줄은 0번째 문자인 "P", 3번째 줄은 "h" 이런 식이다.
5번째 줄의 경우 0 자체가 양수/음수에 속하지 않음으로 무조건 0번째 문자를 뜻하는 것이고,
6번째 줄의 경우 -[숫자]란 기준이 뒤라는 것이다. 즉 -[1]은 뒤에서 1번째인 "l"을 말한다.
슬라이싱
슬라이싱은 무엇인가를 '잘라낸다' 라는 의미를 가진다. 우선 인덱싱을 배웠으니 아래의 질문에 대답을 해보자.
위의 Python~~ 문자열에서 Python 혹은 powerful 이라는 단어들만 뽑아내려면 어떻게 해야 할까?
인덱싱만 아는 사람들은 다음과 같이 대답을 할 것이다.
원하는 결과를 얻었으나 너무 비효율적이다. 다행히 파이썬에서는 이러한 상황에 대비하여 더 좋은 방식을 제공한다.
바로 슬라이싱 이라는 방식이다.
슬라이싱의 문법은 다음과 같다.
a[숫자:숫자]
위를 해석하자면 앞의 숫자에서부터 뒤의 숫자까지 뽑아낸다고 이해할 수 있다. 즉 ,a[0:5] 란 0~5번째 까지의 문자열을 뽑아낸다.
다시 본론으로 돌아와서, 위의 질문에 대한 대답은 슬라이싱을 이용하면 간단하게 처리할 수 있다.
아래 사진을 참고한다.
컴퓨터는 0부터 인식한다고 했으니 0~5번을 뽑아내면 될것이다.
어라 그런데 뭔가 이상하다. 0~5를 뽑아내려고 2번째 줄 처럼 코딩하였는데 결과는 n이 짤린 "Pytho"가 나와버렸다.
신기하게도 3번째 줄은 앞 숫자도 없고 뒤 숫자도 6인데 "Python"이 나와버렸다. 이유는 무엇일까?
첫 번째 의문에 대한 이유는 간단하다. a[시작번호:끝번호] 처럼 쓰면 끝번호에 해당하는 것은 포함 되지 않는다.
즉, a[0:5]를 수식으로 나타내면 0<= a <5 로 인식하여 실제적으로 0~4까지 문자열을 뽑아내게 된다.
위의 개념 또한 상당히 중요함으로 암기해야 한다.
두 번째 의문은 대한 이유 또한 간단한데, 슬라이싱은
1. 반드시 번호를 요구하지는 않으며,
2. 시작 번호가 반드시 0일 필요도 없고
3. 번호가 음수여도 상관 없다.
이해가 잘 되지 않는다면 아래의 예를 보자.
2번째 줄 처럼 앞의 숫자를 10, 뒤의 숫자를 14로 하면, 10번째 부터 14 미만, 즉 10~13 문자열인 very를 뽑아낸다.
3번째 줄 처럼 앞의 숫자를 7, 뒤의 숫자를 넣지 않으면 7번째 부터 끝까지 뽑아낸다. 즉, is very powerful을 뽑아낸다.
4번째 줄 처럼 앞의 숫자를 0, 뒤의 숫자를 -9로 하면 0번째 부터 뒤에서 부터 9번째인, Python is very를 뽑아낸다.
마지막으로 5번째 줄 처럼 앞,뒤 숫자를 모두 넣지 않으면 해당 문자열 전체를 뽑아낸다.
슬라이싱 활용 예제
슬라이싱이 왜 필요한지 이해가 되지 않으면 다음의 예를 보자.
위의 사진처럼 비슷한 패턴을 가진 문자열들을 여러개를 받아서 처리해야 한다고 가정해보자. 일반적으로 DB와 연동할 경우 많이 발생한다.
이를 적절히 잘라서 사용해야 하기 때문에 위와 같이 인덱싱 및 슬라이싱 기법을 적절히 사용해야 한다.
꼼꼼히 살펴본 사람들이라면 의문이 들어야 한다.
a = "파이썬20쉬운http://python.kr" 이라고 정의를 했으면 파이썬 자체가 a[:3] 이여야 하는데 실제 코드에서는 a[:6]으로 코딩되었다.
왜 그럴까? 이에 대한 이유는 언어의 처리인데, 컴퓨터는 영어와 숫자를 1글자당 1바이트로 처리한다. 즉, ab12 는 4바이트이다.
그러나 한글의(euc-kr 인코딩) 경우 1글자당 2바이트로 인식된다. 따라서 파이썬은 01,23,45 이다. 아래의 사진을 보면 이해가 빠를 것이다.
바이트에 대한 설명은 이곳을 눌러 볼 수 있다..
문자열 부분 바꾸기
a = Python // 내가 원한 값
a = Pithon // 실제 들어 간 값
위 처럼 잘 못 코딩되었다.
이럴 경우 어떻게 해결해야 할까?
1. a = Python 이라고 재선언한다.
* 질문에는 의도가 있는 법, 이런 대답을 원하는 것은 아니다.
2. i를 y로 다음과 같이 바꾼다.
* 2번째 줄에 있는 #은 파이썬에서의 주석이다. (주석:실제로 컴파일 될 때는 영향을 미치치 않게 해줌)
어찌되었든 나름 위처럼 해보려 했는데, 실행화면을 보니 아래와 같은 오류가 난다.
TypeError: 'str' object does not support item assignment
이유는, 파이썬에서 문자열은 불변의 값을 가진다. 즉, 위의 코딩처럼 값을 바꿀 수 없다는 것이다. 결론은 다음과 같은 방법을 이용한다.
해결이 되었다. 물론 실제 코딩시 이런일은 발생하지 않는다. 발생하더라도 1번 처럼 해결하는것이 훨씬 빠르고 에러 확률도 0%다.
그러나 굳이 이걸 보여주는 이유는 문자열은 불변의 값을 가진다는 것을 알아야 하기 때문이다. 이 후 코딩시 위의 에러를
상당히 많이 볼 확률이 높다.
문자열 포매팅
C언어를 공부한 사람들이라면 알만한 것이다. (아래의 C 예제를 잠깐 보도록 하자)
#include <stdio.h>
int main()
{
int a = 3;
print ("나는 %d개의 컴퓨터가 있어\n", a);
return 0;
}
출력 결과 : 나는 3개의 컴퓨터가 있어
즉, 파이썬도 위의 C 에서의 %d 처럼 포매팅을 할 수 있다.
문자열 포맷 코드 표
코드 |
설명 |
%s |
문자열 (String) |
%c |
문자 1개 (Character) |
%d |
정수 (Integer) |
%f |
부동 소수 (Floating-Point) |
%o |
8진수 |
%x |
16진수 |
%% |
Literal % (문자 '%' 자체) |
1. 숫자 직접 대입
2. 숫자가 할당된 변수 대입
3. 문자열 직접 대입
* 문자열 또한 2번처럼 변수를 통하여 대입이 가능하다.
4. 입력 값이 복수 인 경우
입력 값 혹은 변수를 괄호 사이에 ',' 로 구분해준다.
5. 어떤 코드를 써야하는지 헷갈리면...
%s 는 만능이다.
6. 문자열 내에 %를 포함하고 싶을 때....
위 처럼 사용하면 에러가 난다. 따라서 다음과 같이 사용한다.
문자열 관련 함수
함수 |
설명 |
x.upper() |
문자열 x를 모두 대문자로 바꾸어 준다. |
x.lower() |
문자열 x를 모두 소문자로 바꾸어 준다. |
x.count(y) |
문자열 x 중 y와 일치하는 것의 갯수를 반환한다. |
x.find(y) |
문자열 x 중 문자 y가 처음으로 나온 위치를 반환한다. 없으면 -1이 반환된다. |
x.index(y) |
문자열 x 중 문자 y과 처음으로 나온 위치를 반환한다. 없으면 에러가 발생된다. |
x.join(y) |
y라는 문자열의 각각의 요소 사이사이에 문자열 x를 삽입한다. |
x.lstrip() |
문자열 x의 좌측 공백을 모두 지운다. |
x.rstrip() |
문자열 x의 우측 공백을 모두 지운다. |
x.strip() |
문자열 x의 양쪽 공백을 모두 지운다. |
x.replace(y,z) |
문자열 x의 y라는 문자열을 z라는 문자열로 변환한다. |
x.split([y]) |
문자열 x를 y 기준으로 나누어 리스트 값으로 돌려준다. |
x.swapcase() |
문자열 x의 대문자는 소문자로, 소문자는 대문자로 각각 변환한다. |
각 함수의 예제는 다음과 같다.
3. 리스트
숫자와 문자열만 가지고 프로그래밍을 하기에는 힘든 요소들이 많다. 예를 들면 1 부터 10까지의 수정 짝수들의 집합을 예로 들면
이런 집합들을 숫자나 문자열만 가지고 표현 하기는 쉽지 않다. 파이썬에서는 이러 불편함을 해소할 수 있는 자료형이 있는데, 그것이 바로
리스트이다. (C언어와 비교하자면 일종의 배열이다)
리스트 예제
a = []
b = [1, 2, 3]
c = ['Python', 'is', 'powerful']
d = [1, 2, 'Python']
e = [1, 2, ['Python', 'is']]
위의 예제에서 보듯이 리스트는 어떠한 자료형도 포함시킬 수 있다.
문자열 부분에서 인덱싱과 슬라이싱을 배웠는데 리스트 또한 가능하다.
리스트의 인덱싱
문자열의 인덱싱과 유사하다. C언어에서도 다차원 배열이 있는 것처럼 리스트도 그와 비슷한 형태가 있다.
아래는 리스트 내에 리스트가 있는 것으로 안쪽에 있는 리스트에 접근하기 위해서는 다음과 같이 접근할 수 있다.
a[-1]은 앞서 배운 것 처럼 a[3]와 동일하다. 이해를 쉽게 하려면 밖에 있는 리스트를 외리스트, 안에 있는 리스트를 내리스트라고 칭한다.
외리스트의 3번째 요소는 내리스트 그 자체이다. 즉 a[3]은 'a'가 아니라 ['a', 'b', 'c'] 이다.
결국 내리스트의 요소게 접근하기 위해서는 우선 외리스트에 접근 후 내리스트에 접근해야 한다.
5,6 번째 줄은 각각 외리스트를 통해 내리스트에 접근 후 0번째, 2번째 문자를 뽑아내는 것을 의미한다.
리스트가 3개일 경우도 마찬가지다.
리스트의 슬라이싱
보는 것처럼 문자열의 슬라이싱과 별 다를 것이 없다. 다중 리스트의 경우에도 마찬가지이다.
리스트의 연산
숫자형도 가능하고, 문자열도 가능하고, 리스트 또한 연산이 가능하다. 리스트는 덧셈, 곱셈 연산을 할 수 있다.
리스트의 덧셈, 곱셈 연산은 문자열의 연산과 똑같다.
1. 덧셈 연산
a 리스트와 b 리스트를 더하는 즉, 합치는 연산이다.
2. 곱셈 연산
a 리스트를 3번 반복하라는 연산이다.
리스트의 수정과 변경 및 삭제
문자열은 불변의 값을 가진다고 위에서 설명했다. 리스트는 가변의 값을 갖는다. 이해가 되질 않는다면 아래의 예제를 보자
수정 1
a의 2번째 문자인 3를 4로 변경하였다.
수정 2
2번째 줄까지 실행되면 3번째 줄 처럼 [1,2,4]의 값으로 변경 된다.
이 상태에서 a[1:2]은 [2] 라는 리스트 값을 가지게 되며, 이 리스트를 ['a','b','c']로 변경하였다.
* 리스트 값이라는 부분에 밑줄을 하면서까지 강조를 한 이유는 바로 아래에 있다.
리스트 수정 시 주의 사항
얼핏 보기에는 a[1:2]의 값과 a[1]의 값이 같을 것 처럼 생각된다. 왜냐면, [1:2]는 1 이상 2 미만으로 해석되어 1 자체로 볼 수 있기 때문이다.
값만 따지고 보면 다를 것이 없으나, 반환되는 자료형이 다르다.
즉, 위의 사진처럼 a[1:2]는 2라는 값이 반환이 되긴 하지만, 자료형이 리스트로 반환된다. 그러나 a[1]은 2라는 값 자체가 숫자로 반환된다.
결국 a[1]을 수정하라는 것은 2라는 숫자값 자체를 리스트로 변경하라는 문장이 되므로 중첩 리스트가 되어버린다. (아래 사진 참조)
이러한 오류는 쉽게 범할 수 있는 오류이다. 각별히 주의해야 한다.
삭제 1
a[1:3] 의 값을 지운 것으로 결국 [1, 'c', 4]가 된다.
삭제 2
del 함수를 이용한 것으로 a[1]의 값 'c'를 삭제했다.
리스트 관련 함수
함수 |
설명 |
x.append(y) |
리스트 x의 마지막에 y를 추가한다. |
x.sort() |
리스트 x를 정렬 (내림차) |
x.reverse() |
리스트 x의 순서를 거꾸로 뒤짚는다. |
x.index(y) |
리스트 x에서 y를 찾아서 위치를 반환한다. |
x.insert(i, y) |
리스트 x에서 i의 위치에 y를 삽입한다. |
x.remove(y) |
리스트 x에서 처음 나오는 y를 삭제한다. |
x.pop() |
리스트 x에서 맨 마지막의 값을 반환하고 삭제한다. |
x.count(y) |
리스트 x에서 y개수를 반환한다. |
x.extend(y) |
리스트 x에 리스트 y를 더한다. |
각 함수들의 예제는 아래에서 확인 할 수 있다.
Remove 반복
remove를 이용하여 지우고 싶은 값을 모두 지우려면 나중에 배울 제어문과 반복문을 알아야 한다.
여기서는 맛 만 보도록 한다.
4. 튜플
튜플은 터플이라고 불리기도 한다. 튜플은 리스트와 몇 가기 점을 제외하고는 개념이 유사하다. 다른점은 다음과 같다.
- 리스트는 '[' 와 ']'로 둘러싸지만 튜플은 '('와 ')'로 둘러 싸인다.
- 리스트의 값은 생성, 삭제, 수정이 가능(가변)하지만 터플은 그 값을 변화시킬 수 없다.(불변)
튜플의 일반적인 형태는 다음과 같다.
- t1 = ()
- t2 = (1, )
- t3 = (1, 2, 3)
- t4 = 1, 2, 3
- t5 = ('a', 'b', 'c', ('ab', 'cd'), 1, 2, 3)
리스트와 생김새는 거의 비슷하지만, 특이할 만한 점은
단지 한 개의 요소를 가진 튜플은 t2 = (1, ) 처럼 한 개의 요소와 그 뒤에 콤마(',')를붙여야 한다는 점과,
t4 = 1, 2, 3 처럼 괄호 ()를 생략해도 된다는 점이다.
얼핏 보면 터플과 리스틑 상당히 비슷한 역활을 하지만, 실제 코딩시에는 터플과 리스트의 구분이 정확해야 한다.
위에서 본 것 처럼 터블과 리스트의 가장 큰 차이점은 불변/가변이기 떄문에 프로그램 구동 시 값을 고정해 주고 싶으며 터플,
값이 변경되야 한다면 리스트를 사용하는것이 옳다.
터플 인덱싱, 슬라이싱, 더하기 및 곱하기
불변의 값을 가진다는 것과 제외하면 리스트와 완전히 동일하기 때문에 간단하게 다음의 예제를 보자.
1. 인덱싱
2. 슬라이싱
3. 더하기 (연결)
4. 곱하기 (반복)
5. 값 변경 (에러)
터플은 불변의 값을 가지기 때문에 값을 변경할 수 없다.
6. 값 지우기 (에러)
터플은 불변의 값을 가지기 때문에 값을 삭제할 수 없다.
5. 딕셔너리
딕셔너리란 단어 그대로 해석하듯이 사전이라 뜻이다. 사전은 항상 키(단어)와 값(단어의 뜻)이 있는데, 파이썬의 딕셔너리 또한
이와 유사한 개념이다. 사람을 예로 들면 누구든지 "이름" = "철수", "생일" = "2013년 12월 26일" 등으로 구분할 수 있다.이러한 대응 관계를 자료형으로 만든 것이 파이썬의 딕셔너리 개념이다.
다음은 딕셔너리의 일반적인 모습이다.
{Key1:Value1, Key2:Value2, Key3:Value3, ...}
즉, Key와 Value들의 여러 쌍들이 '{' 와 '}'로 둘러싸이고 각각의 요소는 Key:Value' 형태로 이루어져 있으며 쉼표 (',')로 구분되어 있다.
딕셔너리의 예는 다음과 같다.
dic = {'name':'john', 'phone':'0123456', 'age':'30'}
위의 예제에서 Key는 name, phone, age이며 이에 해당되는 Value는 john, 012345, 30이다. 이것을 보기 좋게 표로 나타내면 다음과 같다.
Key |
Value |
name |
john |
phone |
012345 |
age |
30 |
딕셔너리 사용
나는 우리 팀원 4명의 각 특기를 만들어서 자료형에 저장해야 한다. 어떠한 자료형이 적합할까? 바로 딕셔너리다.
즉, { "팀원1":"웹해킹", "팀원2":"리버싱", "팀원3:","포렌식", "팀원4":"웹개발"} 이런 식으로 나타낼 수 있다.
딕셔너리를 제대로 사용하기 위한 방법에는 여러가지가 있다.
Key를 이용, Value 얻기
리스트, 터플, 문자열은 요소값을 얻기내기 위해서 인덱싱 혹은 슬라이싱이라는 기법을 사용하지만, 딕셔너리는 단 1가지의 방법만 있다.
바로 Key를 이용해서 Value를 얻어내는 것이다.
위의 예제에서 많은 사람들이 헷갈릴만한 부분은 a[1]이다. a[1]은 'a' 라는 값을 돌려주는데, 여기서 a[1]이 의미하는 것은
리스트, 터플, 문자열에서의 a[1]와는 다른 것이다. 딕셔너리에서 [] 안에 위치한 것(여기서는 숫자1)은 몇 번째 요소를 뜻하는 것이 아니라
Key에 해당하는 1을 나타낸다. (즉, 딕셔너리는 인덱싱/슬라이싱 기법이 존재하지 않는다)
딕셔너리 쌍 추가
쌍을 추가하는 방법은 Key를 이용하여 Value를 호출했던 것처럼 새로운 Key에 Value를 설정하면 된다. 아래의 예제들이 추가하는 예제인데
원래의 딕셔너리는 순서를 따지지 않는다. 중요한 것은 순서가 아닌 "무엇이 추가되었는가" 이다. 그러나 파이썬이 버전이 업그레이드 되면서
자동으로 Key를 기준으로 Sort(정렬)를 해준다.
딕셔너리 쌍 삭제
쌍을 삭제하는 방법은 del 딕셔너리이름[Key] 를 하면 이에 해당되는 쌍이 삭제된다.
딕셔너리 생성 시 주의사항
딕셔너리를 생성할 떄 주의할 점은 Value는 상관이 없으나 Key는 고유한 값이기 때문에 중복되는 값을 설정하면 하나를 제외한 나머지의 것들은
무시된다는 점이다. Error는 나지 않는다. 아래의 예를 보면 1:'d'를 제외한 모든 쌍이 무시된다. 일반적으로 앞에서 만든 쌍이 무시되고
제일 뒤의 쌍이 남지만 항상 그런것은 아니기 때문에 어떠한 쌍이 삭제되는지는 예측할 수 없다. (예측할 이유가 없다)
딕셔너리 관련 함수
함수 |
설명 |
x.keys() |
딕셔너리 x의 Key들을 모아 놓은 리스트를 출력한다. |
x.values() |
딕셔너리 x의 Value들을 모아 놓은 리스트를 출력한다. |
x.items() |
딕셔너리 x의 (Key, Value) 쌍의 터플을 모아놓은 리스트를 출력한다. |
x.clear() |
딕셔너리 x의 모든 Key:Value 쌍들을 삭제한다. |
x.get(y) |
딕셔너리 x의 Key가 y인 것을 찾아 Value를 출력한다. |
x.has_key(y) |
딕셔너리 x에 y라는 키아 있는지 조사하여 참, 거짓을 출력한다. |
관련 함수의 예제는 다음과 같다.
6. 참/거짓
질문!
자료형에도 참고 거짓이 있다?
대답!
있다
자료형에도 참과 거짓이 있다. 이것은 매우 중요한 개념이다. 특히 프로그래밍을 처음 해본 사람들이라면 이해하기 어려운 개념이기도 하다.
참과 거짓을 판정하는 기준을 표로 나타내면 다음과 같다.
자료형 |
참(True) / 거짓(False) |
공백이 아닌 문자열 ("Python") |
참 |
공백인 문자열 ("") |
거짓 |
공백이 아닌 리스트 ( [1, 2, 3] ) |
참 |
공백인 리스트 ( [] ) |
거짓 |
공백인 터플 ( ) |
거짓 |
공백인 딕셔너리 |
거짓 |
0이 아닌 숫자 (1/2/3/3.14) |
참 |
0 |
거짓 |
None == Null |
거짓 |
숫자형을 제외한 모든 자료형은 해당 자료형이 비어있으면 거짓이다. 당연히 무언가 1개의 값이라도 있으면 참이다.
숫자형은 0일때는 거짓, 이외의 모든 값(실수 등)은 참이다.
표에서 마지막에 위치한 None==Null은 無 개념이다. 0도 아니고, 공백 (' ') 도 아니고 그냥 아무 것도 없다는 소리다. 존재 자체를 하지 않는다.
참/거짓은 일반적으로 단독으로 쓰이지 않고 뒤에서 배울 조건문과 많이 쓰인다. 아래의 예제를 보자
While이란 조건문을 사용한 예제이다 While은 다음과 같은 문법을 갖는다.
While <조건문>:
<수행할 내용>
즉, 위의 예제를 해석해보면 TorF가 참인 동안에 pop() 함수(마지막 요소를 삭제)를 실행한다는 것이고, TorF가 거짓(다 삭제되면)이면
End of Pop (Pop 끝) 이라는 문장을 출력한다고 볼 수 있다.
While이 조금 복잡하면 If문으로 예제를 보면 이해가 쉽다.
7. 변수
변수란 객체를 가리키는 것이다. 객체란 지금껏 보았던 자료형을 포함한 파이썬에서 사용되는 모든 것들을 말한다.
변수의 일반적인 형태는 변수명=변수값 이런식으로 된다.
- a = 3
- b = 4
변수 생성 방법
- a = 3
- b, c = 'Python', 'Lang'
- (d, e) = ("Python", "Lang")
- [f, g] = ["Python", "Lang"]
- h = i = "Python"
마지막 생성 바방법은 여러 개의 변수에 같은 값을 대입하는 것인데, 이 것을 이용하면 두 변수의 값을 매우 간단하게 바꿀 수 있다.
리스트 복사
위쪽의 리스트 부분에서는 아직 변수 설명을 하지 않았기 때문에 설명하지 않은 부분을 지금 설명하려 한다.
한줄씩 해석해보면,
1 = a 라는 변수에 [1, 2, 3] 리스트를 대입한다.
b 라는 변수에 a 변수를 대입한다. (이로서 a와 b 모두 [1, 2, 3] 값을 가진다)
a 변수의 1번째 위치 (즉 2)의 값을 4로 바꾼다. (이로서 a는 [1, 4, 3] 값을 가진다)
출력 결과를 보면 a는 당연하지만 b 또한 바뀌어 있다. 왜 그럴까?
그 이유는 a, b 모두 같은 리스트인 [1, 2, 3]을 가리키고 있기 때문이다. 즉 a와 b는 변수 이름만 다를 뿐 변수 값 그 자체는 같다는 것이다.
b 변수를 생성할 때 a와 같은 값을 가지면서 a가 가리키는 리스트와는 다른 리스트르 가리키게 하려면 다음과 같이 한다.
1번째 줄에 위치한 것은 copy 함수를 쓰기 위해 필요한 모듈 copy를 임포트하는 것으로 나중에 모듈 부분에서 자세히 다룬다.
두 변수가 같은 값을 가지면서 다른 객체를 가리키는지를 판단하려면 'is' 함수를 이용한다.
이 함수는 동일한 객체면 참, 다르면 거짓을 출력한다.
'Developing > Python_배우기' 카테고리의 다른 글
Python 06 - 제어문 (for) (0) | 2014.01.12 |
---|---|
Python 05 - 제어문 (while) (0) | 2014.01.12 |
Python 04 - 제어문 (if, elif), 연산자(비교&논리), in/not in, pass (0) | 2014.01.01 |
Python 02 - 개발환경 구축 (0) | 2013.12.19 |
Python 01 - 파이썬이란? (0) | 2013.12.19 |