Language/Python

Phython study - 3rd day

아르비스 2014. 4. 22. 11:21


1. 튜플(Tuple)


이번에는 '튜플(Tuple)'에 대해 알아보도록 하겠습니다. 이 튜플이라는 녀석은 우리가 앞서 배웠던 리스트와 매우 비슷합니다. 튜플과 리스트가 서로 다른점이 있다면, 대괄호 대신에 소괄호로 묶어서 표현하며 리스트는 요소의 변경이 가능한 반면에 튜플은 요소의 변경이 불가능하다는 특징을 지니고 있습니다. 즉, 읽을 수는 있지만 쓸 수는 없는 것과 같은 것입니다. 우선, 아래의 예제를 통해 튜플이 어떠한 형태를 가지고 있는지 확인해보도록 합시다.

>>> tuples = (1, 2, 3, 4, 5)
>>> type(tuples)
<class 'tuple'>

위 예제의 1행을 보시면, 요소들을 소괄호로 묶었으며 쉼표(,)로 각각의 요소를 구분한다는 것을 확인하실 수 있습니다. 1행의 형식뿐만 아니라, 둘러싸고 있는 소괄호를 제거하거나 리스트와 똑같이 튜플 안에 튜플을 요소로 가질 수 있습니다.

>>> tuples = ('a',)
>>> tuples = 'a', 'b', 'c'
>>> tuples = ('a', 'b', ('c', 'd'))

우선은 위 예제의 1행부터 보도록 합시다. 1행을 보니, 튜플의 마지막에 쉼표가 포함된 것을 보실 수 있는데 이것은 요소 한 개를 가지는 튜플을 만드려고 할 때 마지막에 쉼표를 넣어주어야 합니다. 만약 저 쉼표가 없다면, 소괄호로 둘러싸인 문자열로 취급을 하기 때문에 그렇습니다. 그리고 2행처럼 소괄호로 둘러싸지 않은 형식을 사용할 수 있으며, 3행처럼 튜플 내에서 튜플을 요소로 가질 수 있다는 것을 알 수 있습니다.


이러한 튜플을 통해서, 임시로 값을 저장하는 변수가 필요없이 아래의 예제와 같이 두 변수의 값을 서로 바꿀 수도 있습니다.

>>> a, b = 10, 20
>>> print(a, b)
10 20
>>> a, b = b, a
>>> print(a, b)
20 10

위 예제의 1행에서는 10이 a에, 20이 b에 들어간다는 2~3행을 통해 알 수 있으며 4행에서는 b의 값이 a에, a의 값이 b에 들어감으로써 서로 값이 바뀐다는 것을 5~6행을 통해 알 수 있습니다. 여기서, 왼쪽과 오른쪽에 있는 값의 갯수는 일치해야 한다는 것을 기억해두시기 바랍니다.


2. 튜플에서의 인덱싱과 슬라이싱


문자열과 리스트와 마찬가지로 튜플에서도 역시 인덱싱과 슬라이싱이라는 개념이 존재합니다. 우선은 인덱싱부터 간단하게 살펴보도록 하겠습니다. 

>>> tuples = (0, 1, 2, 3, 4, 5, 6)
>>> tuples[1]
1
>>> tuples[-2]
5

인덱싱도 많이 보니 익숙하죠? 2행에서는 위치 1에 있는 요소의 값을 가져오는 것이고, 4행에서는 위치에 음수가 쓰였으니 뒤에서부터 튜플 tuples를 읽게 됩니다. 뒤에서 두번째에 있는 요소는 바로 5이므로, 5행에서 5라는 결과값이 나온 것입니다. 바로 인덱싱에 이어, 튜플에서의 슬라이싱을 보도록 하겠습니다.

>>> tuples = (0, 1, 2, 3, 4, 5, 6)
>>> tuples[1:3]
(1, 2)
>>> tuples[3:]
(3, 4, 5, 6)

2행에서는 위치 1부터 시작하여, 끝 위치를 범위에서 제외하기 때문에 위치 3이 아닌 위치 2 까지의 요소를 모두 가져옵니다. 그리고 4행에서는 위치 3부터 시작하여, 끝 위치가 따로 명시가 되어있지 않기 때문에 튜플의 끝까지 요소를 모두 가져옵니다. 그렇기 때문에 '3, 4, 5, 6'이란 결과가 도출된 것입니다.


튜플에서의 인덱싱과 슬라이싱은 문자열과 리스트의 인덱싱과 슬라이싱과 똑같으므로 이 편에서는 자세히 설명하지는 않겠습니다. 혹여나, 인덱싱과 슬라이싱이 궁금하시면 문자열 편을 읽어보시고 오시면 될 것 같습니다.


3. 튜플에서의 연산자


튜플에서도 튜플을 연결하는 + 연산자와 반복하는 * 연산자가 존재합니다. 간단하게나마 이 두 연산자들을 살펴보도록 하겠습니다.

>>> tuples = ('a', 'b', 'c')
>>> tuples + ('d', 'e', 'f')
('a', 'b', 'c', 'd', 'e', 'f')
>>> tuples * 3
('a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c')

위 예제의 2행을 보시면 튜플 tuples와 ('d', 'e', 'f')를 서로 연결하여 ('a', 'b', 'c', 'd', 'e', 'f')가 되었음을 보실 수 있습니다. 이어서 4행을 보시면, 곱한 수만큼 튜플이 반복되는 것을 확인하실 수 있습니다. 간단하죠? 오늘은 여기까지 튜플에 대해 설명해드리도록 하겠습니다. 모두 수고하셨습니다.



4. 사전(Dictionary)


이번에는 사전(Dictionary)에 대해서 알아보도록 하겠습니다. 사전이란 우리가 흔히 알고있는 국어사전, 영어사전 등과 같이 단어와 뜻이 한 쌍이듯이 파이썬에서의 사전도 키(Key)와 값(Value)이 한 쌍으로 이루어져 있습니다. 이런 사전은 튜플이나 리스트와는 다르게 위치를 통한 인덱싱이 허용되지 않습니다. 그 대신, 키를 통해서 값을 찾을 수는 있습니다. 사전을 어떻게 만들 수 있는지 사전의 형식을 한번 보도록 합시다.

>>> dic = {'name':'Smith', 'rank':1, 'average':97.5}
>>> type(dic)
<class 'dict'>
>>> dic
{'name': 'Smith', 'average': 97.5, 'rank': 1}

우선, 위 예제의 1행을 보시면 사전 형식의 변수 dic이 보이는데 키와 값들을 중괄호로 묶은 것을 보실 수 있습니다. 또한, 키와 값은 콜론(:)으로 구분이 되는 것 또한 알 수 있습니다. 예를 들어서, 저기에서는 키가 'name', 'rank', 'average'이며 값은 'Smith', 1, 97.5와 같이 서로 쌍을 이룹니다. 저기선 키가 모두 문자열이지만, 숫자도 될 수 있으며 튜플도 사용할 수 있습니다. 하지만 리스트나 사전은 키로 사용하지 못합니다.

>>> dic = {123:456, 3.14:41.3, (1, 3):(3, 1), 'abc':'def', 'list':{1, 2, 3}, 'dict':{1:2, 3:4, 5:6}}
>>> dic
{'dict': {1: 2, 3: 4, 5: 6}, 3.14: 41.3, (1, 3): (3, 1), 'abc': 'def', 'list': {1, 2, 3}, 123: 456}

위 예제를 살펴보시면 여러가지 형식의 키와 값이 존재합니다. 키와는 다르게 값에는 어떠한 형식의 데이터라도 들어가는 것을 보실 수 있고, 이번에는 키를 통해서 값을 가져와 보도록 하겠습니다.

>>> dic = {'name':'John', 'age':21, 'e-mail':'john33@abc.com'}
>>> dic['name']
'John'
>>> dic['age']
21
>>> dic[0]
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    dic[0]
KeyError: 0

위 예제에서는 2행과 4행을 보시면 '사전명[키]' 이러한 식으로 키에 해당하는 값을 가져오는 것을 볼 수 있습니다. 그러나 6행과 같이 위치를 통해서는 값을 가져오지 못하며, 이는 사전에서 자료의 순서라는 개념이 존재하지 않아 위치를 통한 인덱싱이 불가능하고, 이런 인덱싱이 불가능하니 우리가 생각하는 슬라이싱도 불가능 하다는 것을 알 수 있습니다. 보는 그대로 값을 가져오려면 위처럼 키를 통해 값을 가져와야 합니다.

>>> dic = {'key1':'value1', 'key2':'value2'}
>>> dic['key1'] = 'value3'
>>> dic['key2'] = 'value4'
>>> dic
{'key2': 'value4', 'key1': 'value3'}

또한, 위 예제를 통해서 키를 통해 값을 변경할 수 있다는 사실을 알 수 있습니다. 그러나 키값은 변경할 수 없습니다. 주의할 점이 한가지 더 있는데, 그것은 사전에서 키가 중복되면 안됩니다. 물론, 같은 키에다 다른 값을 가진 두개의 요소가 존재할 수 있지만 어느 값을 가져올지 모르며 다른 하나가 무시될 수 있습니다. 그리고 사전에서 요소를 제거하려면 del라는 내장 함수를 사용하면 됩니다. 아래와 같이 말이죠.

>>> dic = {'a':'b', 'c':'d', 'e':'f'}
>>> dic
{'e': 'f', 'c': 'd', 'a': 'b'}
>>> del dic['a']
>>> dic
{'e': 'f', 'c': 'd'}

위와 같이 del 함수를 사용하여 요소를 제거할 수 있으며, 이 del 함수는 사전의 요소뿐만 아니라 리스트, 변수, 함수 등 제거할 수 있는것이 여러가지가 있습니다. 간단하죠?


5. 관련 함수


두번째로, 사전에 관련된 함수를 차례대로 보도록 하겠습니다. keys, values, items, clear, in 이렇게 총 6개의 함수와 대해서 알아보도록 합시다. 처음부터 keys 함수를 보도록 하겠습니다.


  사전 - 사전 키 리스트(keys) 함수


먼저 아래의 예제를 보도록 합시다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> dic.keys()
dict_keys(['name', 'age', 'phone'])

위 예제에서 keys 함수를 사용하면 3행과 같이 dict_keys 객체를 내보냅니다. 이 dict_keys 객체는 사전의 키를 모아서 만든 것이라고 할 수 있습니다. 아직 반복문은 배우지 않았으나, for라는 녀석을 통해 keys 함수가 내뱉는 dict_keys 객체를 통해서 순회하여 접근할 수 있습니다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> for i in dic.keys():
	print(i)

name
age
phone

  사전 - 사전 값 리스트(values) 함수


아래의 예제를 보도록 합시다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> dic.values()
dict_values(['Smith', 18, '01131313131'])

사전 키 리스트를 얻는 keys 함수와 동일하게, 이번에는 키가 아니라 값만을 가져오고 싶다면 values 함수를 사용하면 됩니다. values 함수도 비슷하게 dict_values 객체를 내보내며 이 객체는 사전의 값을 모아서 만든 것이라고 할 수 있습니다. 동일하게 반복문을 통해서 values 함수가 내뱉는 dict_values 객체를 통해서 순회하여 접근할 수 있습니다.


  사전 - 사전 키와 값으로 이루어진 쌍 리스트(items) 함수


우선은 아래의 예제를 보도록 합시다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> dic.items()
dict_items([('name', 'Smith'), ('age', 18), ('phone', '01131313131')])

이번에는 키와 값을 요소로 지니는 여러개의 튜플을 리스트로 돌려줍니다. values 함수는 dict_items 객체를 내보냅니다.


  사전 - 사전 초기화(clear) 함수


우선은 아래 예제를 보도록 합시다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> dic
{'name': 'Smith', 'age': 18, 'phone': '01131313131'}
>>> dic.clear()
>>> dic
{}

이 clear 함수는 사전의 요소를 모두 제거하여 초기화 시키는 함수입니다. clear 함수를 사용하면 위 예제의 6행과 같이 요소가 모두 사라지게 됩니다.


  사전 - 사전 키에 해당하는 값 반환(get) 함수


우선은 아래 예제를 보도록 합시다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> dic.get('phone')
'01131313131'
>>> dic.get('age')
18

이 get 함수는 키에 해당하는 값을 돌려줍니다. 만약 키 phone에 해당하는 값을 가져오려면 'dic.get('phone')'처럼 get 함수를 이용하는 방법과 'dic['phone']'처럼 함수를 쓰지 않고도 직접 값을 가져오는 방법이 있습니다.


  사전 - 사전 키 존재 여부 검사(in)

마지막으로 아래의 예제를 보도록 합시다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> 'name' in dic
True
>>> 'job' in dic
False

파이썬에서 has_key라는 함수가 3.x 버전부터 사라지고, 이를 대체하여 in이라는 녀석을 통해 해당 키가 사전에 존재하는지 검사할 수 있습니다. 만약 존재하면 참(True)을, 존재하지 않다면 거짓(False)을 내보내게 됩니다. 2행을 보시면 키 'name'이 사전 dic에 있나 검사하는데 있으니 True를, 4행에서 키 'job'이 사전 dic에 있나 검사하는데 없으니 False을 내보내게 된겁니다. 유용하죠?


사전에 대한 설명은 여기서 그만하고, 다음 편에서는 논리 연산자와 부울에 대해 간단히 알아보도록 하겠습니다. 모두들 읽느라 수고하셨습니다.



6. 부울(Bool)


오늘은 부울(Bool)에 대해서 알아보도록 하겠습니다. 이 부울이란 녀석은 참과 거짓을 나타내는 자료형이며, 참은 True로, 거짓은 False로 표현이 됩니다. 이 부울을 보자니 도대체 어디에 사용되는 녀석인지 생각이 도저히 나지 않으시는 분들도 계실겁니다. 왜 부울이라는 개념이 존재할까요? 참과 거짓은 도대체 어디에 사용되는 것일까요? 이는 파이썬 내의 논리 연산자를 통한 논리 연산이나, 수치를 서로 비교할때 사용하는 비교 연산자의 결과로 사용됩니다.

>>> 3 > 5
False
>>> 4 < 6
True
>>> 'a'=='b'
False
>>> 3.14!=3.14
False

위 예제에 쓰인 비교 연산자들을 차례대로 설명하자면, 1행과 3행에서는 어느게 더 큰가 작은가를 비교하는 연산자 >와 <가 사용되었으며, 5행에서는 서로 같은지 비교하는 연산자인 ==가, 7행에서는 서로 다른지 비교하는 연산자인 !=가 사용되었습니다. 다시 돌아와서, 1행의 '3 > 5'에서는 당연히 3보다 5가 크므로 False이 됩니다. 이어서 3행의 '4 < 6'에서는 4보다 6이 크므로 True가 됩니다. 5행의 'a'=='b'에서는 'a'와 'b'가 서로 같지 않으므로 False를, 7행의 '3.14!=3.14'에서는 서로 다르지 않으므로 False를 돌려주는 것입니다.


7. 논리 연산자


이번에는 비교 연산자에 이어서 논리 연산자에 대해서도 간단히 알아보도록 하겠습니다. 파이썬에서의 논리 연산자는 논리곱을 의미하는 and(&)가 있으며, 논리합을 의미하는 or(|)가 있으며, 부정을 의미하는 not이 있습니다. 논리곱(and)은 두 값이 모두 참이여야만 참을 내보내며, 논리합(or)은 두 값중 하나라도 참일 경우에 참을 내보내고, 부정(not)은 값을 부정하는 것으로써 참일 경우 거짓을, 거짓인 경우 참을 내보냅니다. 우선 예제를 보도록 합시다.

>>> True and False
False
>>> False or True
True
>>> not False
True
>>> 4 > 5 and 104 < 311.4
False

위 예제를 차근차근 살펴보자면, 1행에서 True와 False를 가지고 논리곱 연산을 합니다. 여기서는 두 값이 모두 참이 아니므로 False를 내보냅니다. 3행에서는 False와 True를 가지고 논리합 연산을 하는데, 두 값중에 참이 하나라도 있으므로 True를 내보냅니다. 5행에서는 False를 부정하여 반대되는 값인 True를 내보냅니다. 7행에서는 '4 > 5'에서 5가 더 크므로 False, '104 < 311.4'에서는 311.4가 더 크므로 True를 내보냅니다. 결과적으로 'False and True'가 되는 것이며 이는 False가 되는 것입니다. 논리 연산자와 관련된 것은 아니지만 한가지 예를 더 보도록 합시다.

>>> bool(0)
False
>>> bool(1)
True
>>> bool(5.41)
True
>>> bool([])
False
>>> bool('a')
True

위 예제에 사용된 내장 함수 bool은 임의의 형식을 가진 객체를 부울 형식으로 변환하는 것으로, 0과 값이 비어있는 경우는 False이며 0을 제외한 모든 값은 True라는 사실을 알 수 있습니다. 이 부울이란 녀석은, 나중에 배울 반복문이나 조건문 등과 같은데서 조건식으로 많이 쓰이니 앞으로 많이 만나보실 수 있으실 겁니다. 부울에 대한 설명은 여기까지 하도록 하고, 다음 강좌에서는 조건문에 대해 알아보도록 하겠습니다. 모두 수고하셨습니다!



저작자: http://blog.eairship.kr/