구성원 연산자

구성원 연산자는 아래 표와 같이 두 가지로 나뉘고, 일반적으로 시퀀스 타입에 쓸 수가 있다.

연산자 설명
in 구성원에 있다.
not in 구성원에 없다.

 

s = "abcdef hello"
myList = [10, 20, 30, 40, 50]
myD = {10:"aa", 20:"bb", 30:"cc"}

print("hello" in s)

print("zzz" in s)
print("zzz" not in s)

print(10 in myList)
print(100 in myList)

print(10 in myD)
print("aa" in myD)

#결과
True
False
True
True
False
True
False

예제 코드에서와 같이, in 연산자를 사용하면 “hello”라는 문자열은 s 구성원 안에 포함되어 있기 때문에 True를 반환한다. 반면에 “zzz”는 구성원에 포함되어 있지 않으므로 False를 반환한다. not in 연산자는 in 연산자와 반대이므로 “zzz”가 구성원에 포함되어 있지 않기 때문에 True를 반환한다.

구성원 연산자는 시퀀스 타입에서도 사용 가능하다. 리스트 객체인 myList 10이라는 값이 있으므로 예제 코드 결과는 True를 반환한다. 반면에 100은 없으므로 False를 반환한다.

사전 타입에서는 주의할 점이 있다. 바로 Key에 대해서만 판단 가능하다는 점이다. Key와 연결되는 값에 대해서는 판단 불가능하다.

 

식별 연산자

연산자 설명
is 객체가 같다.
not is 객체가 틀리다.

 

a = 10
b = 10

print(a is b)
print(id(a))
print(id(b))

#결과
True
140728148796080
140728148796080

예제 코드의 경우 파이썬10이라는 정수 객체를 a b가 둘 다 동일한 객체를 참조하는 것으로 해석된다. 또한 파이썬 내장 함수 중 하나인 id를 사용하면 참조형 객체의 주소를 확인할 수 있다. 그리고 둘 다 동일한 것도 확인 가능하다.

 

a = 10
b = 10
b = 100

print(a is b)
print(id(a))
print(id(b))

#결과
False
140728148796080
140728148798960

두 번째 예제 코드의 결과는 당연히 False이다. 파이썬은 참조계수 기법을 사용하기 때문에, 처음에 b 10을 참조할 때는 같은 객체를 참조하지만(참조 계수가 2가 된다) b 100을 참조하는 순간 객체 10의 참조 계수는 2에서 1로 줄어들고 b와의 연결이 끊어진다. 그리고 객체 100의 참조 계수가 1로 증가한다. 따라서 a b는 가리키는 객체가 달라지므로 False가 된다. 참고로, 객체의 참조 계수가 0이 되는 순간 객체는 소멸한다.

관계/논리 연산자

관계 및 논리 연산자는 참인지 거짓인지를 알려주는 연산자로서 연산 결과는 True, False 값을 되돌려 준다. 그리고 관계 연산자는 2개의 항을 비교하여 참인지 거짓인지 판별하는 연산자이다. 논리 연산자는 참, 거짓 결정을 위해 사용하는 연산자이다.

 

연산자 설명
> 작다
< 크다
<= 크거나 같다
>= 작거나 같다
== 같다
!= 같지 않다
and 논리 and (&&)
or 논리 or (||)
not 논리 not (!)

관계 연산자가 논리 연산자보다 우선순위가 높다. 따라서 관계 연산자를 먼저 수행하고 그 다음에 논리 연산자를 수행한다.

 

a = 3
b = a > 0
c = a < 0
d = a >= 0
e = a <= 0
f = a == 0
g = a != 0

print(b, c, d, e, f, g)

#결과
True False True False False True

이 연산 결과는 boolean type이 나오는 것을 확인할 수 있다. 그렇다면 파이썬에서는 0 < a < 10은 어떻게 표현하는가? 다른 언어에서는 0 < a && a < 10으로 표현한다. 하지만 파이썬에서는 그대로 사용할 수가 있다. 이것이 파이썬이 가지는 특징이다. 아래 예제 코드로 결과를 확인 가능하다.

 

a = 3
b = 0 < a < 10

print(b)

a = 11
b = 0 < a < 10

print(b)

#결과
True
False

a 3일 때 범위 안에 들어가므로 True, 반면에 a 11일때는 False임을 확인 가능하다.

 

다음에는 논리 연산자를 확인해보자. And 연산자의 경우 다음과 같다.

And 연산자
T T T
T F F
F T F
F F F

위의 표에서 확인 가능하듯이, 둘 다 True가 되어야 결과도 True를 나타낸다. Or 연산자는 둘 다 False가 되어야 False를 나타낸다. 반면에 Not 연산자는 True False False True로 나타낸다.

 

비트 연산자

비트 연산자는 비트 단위로 한 개 또는 두 개의 이진수에 대해 연산을 수행한다.

연산자 설명
& 비트 and
| 비트 or
^ 배타적 or
<< 좌측 쉬프트
>> 우측 쉬프트

 

a = 2 & 1
b = 2 | 1
c = -2 | 1
d = 2 << 1
e = -2 << 1
f = 2 >> 1
g = -2 >> 1

print(a, b, c, d, e, f, g)

#결과
0 3 -1 4 -4 1 -1

& 연산의 경우 비트가 둘 다 1인 경우만 1이 된다. 따라서 예제 코드의 연산 결과는 0이 된다. |의 경우 비트가가 둘 다 0인 경우만 0이 된다. 따라서 연산 결과는 3이 된다. 그렇다면 마이너스 값은 어떻게 될까? 파이썬에서는 2의 보수를 취해서 계산하므로 연산 결과는 -1이 된다.

<<의 경우 비트를 좌측으로 쉬프트하기 때문에 가장 앞의 비트값은 삭제되고 나머지 비트가 모두 왼쪽으로 이동한다. 따라서 2를 곱하는 결과와 같으며 4의 값이 출력된다. 마이너스 값일 경우도 2의 보수를 취해서 계산하면 결과는 2를 곱한 -4가 된다.

>>의 경우 <<와는 반대로 동작하므로 우측으로 쉬프트한다. 결과는 예제 코드와 같이 쉽게 확인 가능하다.

파이썬 엑셀 라이브러리

라이브러리 설명
openpyxl https://openpyxl.readthedocs.io/

Excel 2010 read/write를 지원하며 Pandas의 read_excel 함수에서 내부적으로 사용한다.

pyexcel https://pypi.org/project/pyexcel/

xls, xlsx, xlsm, ods, csv 등의 파일들에 대해 하나의 API로 접근을 지원한다.

xlsxwriter

https://xlsxwriter.readthedocs.io/

xlsx 포맷에 대한 생성을 풍성하게 지원한다.

xlrd https://pypi.org/project/xlrd/

Excel spreadsheets에서 데이터를 추출한다.

xlwt https://pypi.org/project/xlwt/

Excel 97/2000/XP/2003에 대한 read/write를 지원한다.

xlwings

https://pypi.org/project/xlwings/

Excel 프로그램 자동화 라이브러리로서 유일하게 Excel 프로그램에 의존적이다.

 

xlwings 라이브러리

  • Excel 프로그램에 대한 자동화 라이브러리
  • Excel의 장점과 파이썬의 장점을 결합하여 강력한 기능으로 사용 가능
  • 다른 Excel 라이브러리들은 Excel 프로그램과의 연동이 아니라 파일 포맷을 지원하는 형태이기 때문에 
  • Excel 실행 후에 파이썬을 사용하여 값의 read/write 등을 지원
  • Excel의 매크로를 파이썬으로 구현 가능하도록 지원(VBA 대체 가능)
  • Windows/MAC 지원
  • Anaconda Python을 설치하면 포함되어 있음
    1. pip install xlwings 또는 conda install xlwings

Excel을 단독으로 사용하기 보다는 파이썬을 결합하여 수많은 라이브러리들을 연동한다면 작업 효율성을 크게 향상시킬 수 있다.

 

import xlwings as xw

xw.__version__

xlwings를 import하여 version을 위의 예제 코드와 같이 확인할 수 있다. xlwings를 전부 사용하기엔 길기 때문에 xw로 명명한다.

 

data = [
    ['apple', 'samsung', 'lg'],
    ['100', '200', '300'],
    ['140', '280', '420'],
]

xw.view(data)

예제 코드와 같이 2차원 데이터를 생성한 후에, view 함수를 실행하면 Excel 프로그램이 실행되며 내용을 확인할 수 있다. 데이터의 내용이 커도 Excel이 허용하는 범위 내에서는 모두 입력 가능하다.

 

import numpy as np

data = np.random.rand(3, 5) #3행 5열의 랜덤 데이터 생성
xw.view(data)

예제 코드와 같이 Numpy 라이브러리를 import한 후에, 임의의 데이터를 생성하고 'xw.view'를 사용하면 또 새로운 Excel이 실행되는 것을 확인할 수 있다. 이때 새로운 Excel을 실행하지 않고 기존의 Excel을 사용하기 위해서는 아래와 같이 사용하면 된다.

 

xw.sheets.active # 현재 활성화 된 sheets에 접근

xw.sheets.active를 사용하면 현재 활성화 된 sheets에 접근 가능하다. 따라서 이를 활용한다면 새로운 Excel을 실행하지 않고 기존의 활성화된 Excel을 사용 가능하다.

 

import numpy as np

data = np.random.rand(3, 5) #3행 5열의 랜덤 데이터 생성
xw.view(data, xw.sheets.active)

xw.sheets.active를 xw.view의 두 번째 전달 인자에 넣으면 기존에 열어놨던 '통합 문서1.xlsx'에 임의의 데이터를 생성한 결과들이 적용된 것을 확인할 수 있다. xw.view의 기능은 Excel 워크 시트의 전체 내용을 한 번에 바꾸는 것이다.

 

import pandas as pd

url = 'https://finance.naver.com/marketindex/exchangeList.nhn' # 네이버 증권 환율 정보 테이블
pd.read_html(url)

Pandas의 read_html을 사용하여 네이버 증권 환율 정보의 테이블을 가져올 수 있다. 그런데 dataframe 형식이 아님을 확인할 수 있고, 위 내용을 dataframe화 시켜주어야 한다. 그리고 아래 예제 코드와 같이 활용해본다.

 

import pandas as pd

url = 'https://finance.naver.com/marketindex/exchangeList.nhn' # 네이버 증권 환율 정보 테이블
df_list = pd.read_html(url)
df = df_list[len(df_list) - 1]

print(df.shape)
df.head()

행과 열의 갯수를 출력하고 환율 정보 테이블을 dataframe화 시킨 결과이다. 그런데 상단을 보면 column명이 정리가 되지 않은 상태로 사용되고 있음을 확인할 수 있다.

 

df.columns = [
    '통화명',
    '매매기준율',
    '현찰 - 사실 때',
    '현찰 - 파실 때',
    '송금 - 보내실 때',
    '송금 - 받으실 때',
    '미화환산율',
]
df.head()

column명을 정리하는 방법은 다양하지만, 예제 코드처럼 직접 지정하여 정리할 수도 있다. column 개수를 확인한 후에 지정을 하면 위와 같이 잘 정리된 결과를 확인할 수 있다.

 

df = df.set_index('통화명')
df.head()

index를 0부터 1씩 증가하도록 지정되어 있는 것들을 새롭게 지정할 수도 있다. set_index를 사용하게 되면 위와 같이 통화명을 기준으로 인덱스가 지정된 것을 확인할 수가 있는데, 이 결과는 기존의 dataframe을 변경한 것이 아니라 새로운 dataframe을 생성한 것이다. 따라서 head를 사용하기 위해선 다시 df에 저장해주어야 한다.

 

xw.view(df, xw.sheets.active)

df에 저장된 결과를 Excel에 반영하기 위해서는 xw.view를 사용한다. 예제 코드를 실행하면 파이썬을 통해 웹 사이트에서 크롤링한 내용을 Excel에 한 번에 손쉽게 업데이트 한 결과를 확인할 수 있다. 이 방법을 사용하지 않으면, 매 번 별도의 Excel 파일을 생성하고 작업해야하는 불편함이 있다.

만약 Excel의 시트가 여러 개가 있다고 하면 Excel에서 업데이트 하고 싶은 sheets를 활성화하고 예제 코드를 사용하면 해당 시트가 업데이트 된다.

 

# xw.Range('A1') # 하나의 cell을 지정
xw.Range('A1:C3').value

세 번재 시트를 업데이트 한 후에 예제 코드를 사용해본다. 사용된 Range는 Excel 범위를 지정할 수 있다. 범위를 지정한 후에 value를 사용하면 지정된 범위의 값을 읽어올 수 있다. 실제 예제 코드 결과를 보면 Excel의 (A1:C3) 범위 값을 2차원 리스트 형식으로 읽어온 것을 확인할 수 있다.

 

xw.Range('A1').expand()

하지만 Excel의 범위를 매번 계산하기 힘들다. 시작은 상단의 좌표를 지정하고, 범위 확장을 위한 expand를 사용해보면 연속된 데이터 값을 가진 범위들을 자동으로 선택해준다.

 

xw.Range('A1:A4').expand('right') # table, right, down

expand안의 인자는 'table'이 default로 사용되며 'right' 혹은 'down'을 통해 범위를 선택할 수도 있다. 예제 코드와 같이 (A1:A4)까지의 범위를 지정하고 expand에 'right'를 인자로 전달하게 되면 (A1:G4)까지 범위가 자동으로 지정됨을 확인할 수 있다.

 

data = xw.Range('A1:A4').expand().value
data

보통은 'table' 인자를 많이 쓰기 때문에 생략을 많이 한다. 따라서 expand 사용 후 value를 통해 범위 값을 파이썬의 참조 변수로 쉽게 읽어올 수 있다. 그리고 읽어온 참조 변수를 사용해서 데이터를 다양하게 정제 가능하다.

개요

파이썬의 연산자 종류에 대한 개요를 알아보고 각 연산자들의 특징을 파악한다. 파이썬 연산자 종류는 아래와 같다.

  1. 수치 연산자
  2. 대입 연산자
  3. 관계, 논리 연산자
  4. 비트 및 구성원 연산자

 

산술 연산자

연산자 설명 사용 예시
+ 덧셈 9 + 2 = 11
- 뺄셈 9 - 2 = 7
* 곱셈 9 * 2 = 18
/

나눗셈

int/int 계산에서는 자동으로 float형 변환

9 / 2 = 4.5
** 거듭제곱 9 ** 2 = 81
% 몫을 제외한 나머지 값 9 % 2 = 1
//

정수 나누기. 몫.

파이썬 버전 2.xx에서의 나눗셈과 동일

9 // 2 = 4

산술 연산자는 간략히 위의 표와 같이 정리할 수 있다. 사용 예시를 보면 몇 가지를 제외하고 기존에 실생활에서 사용하던 사칙연산과 크게 다를바가 없다.

 

사용 예시

a = 11 + 2
b = 12 - 2
c = 13 * 2
d = 14 / 2
e = 15 ** 2
f = 16 // 2
g = 17 % 3

print(a, b, c, d, e, f, g)

#결과
13 10 26 7.0 225 8 2

예제 코드의 결과를 보면 조금 특이한 점을 발견할 수 있다. 다른 프로그래밍 언어인 C언어 및 Java는 정수형끼리 나누면 정수형 결과가 나오는데 파이썬은 조금 다르게 실수형 결과(7.0)가 나온다.

참고로, 산술 연산자의 우선 순위는 거듭제곱, 곱하기, 나누기, 나머지, 몫, 더하기, 빼기이며 결합도는 좌에서 우로 계산하면 된다.

 

a = 11 + 6 - 4 * 3 ** 2
print(a)

# 반지름이 11인 원의 면적은?
c = 11 ** 2 * 3.14
print("원의 면적:", c)

#결과
-19
원의 면적: 379.94

 

예제 코드의 첫 번째 줄의 a의 출력 값은 -19이다. 그 이유는 연산자 우선 순위에 의해 거듭제곱의 연산자 우선순위가 가장 높기 때문에 가장 먼저 계산되고, 그 다음 곱셈 연산자가 계산된다. 그리고 순차적으로 계산되며 결국 -19의 값을 출력한다. 이와 같은 방법으로 원의 면적을 예제 코드와 같이 구할 수 있다.

 

s = input("input:")
print(s)
print(type(s))

#결과
input:12
12
<class 'str'>

 

외부 장치로부터 입력 값을 받는 C언어의 scanf와 같은 기능은 파이썬에서는 input 함수이다.

위의 예제 코드를 작성하여 키보드로 숫자 12를 입력해보자. 그리고 입력 받은 객체의 타입을 보면 문자열(str) 타입인 것을 확인할 수 있다. 따라서, 우리는 어떤 값(숫자, 문자 등)을 입력하던 input 함수를 통해 받는다면 모두 문자열 타입이 된다.

그렇다면 하나의 반지름을 외부 장치인 키보드로부터 입력 받아 원의 면적을 구하기 위해서는 어떻게 해야할까? input 함수로 입력받으면 문자열 타입이기 때문에 곱하기 연산을 하면 올바른 결과 값을 출력하지 못하고 해당 문자열을 곱하기 연산 만큼 반복하게 된다. 따라서 문자열을 반드시 정수 타입으로 변환해주어야 한다.

 

a = '12'
a = int(a)
print(type(a))

b = 12
b = str(a)
print(type(b))

c = (10, 20, 30)
c = list(c)
print(type(c))

#결과
<class 'int'>
<class 'str'>
<class 'list'>

 

위의 예제와 같이 파이썬의 내장 함수를 통해 충분히 객체 타입을 원하는대로 바꿀 수 있다. 예제 출력 결과를 보면 문자열은 정수로, 정수는 문자열로, 튜플은 리스트로 바뀜을 확인할 수 있다. 따라서 내장 함수인 input을 통해 문자열을 받은 후 원의 면적을 구하는 방법은 아래처럼 검증할 수 있다.

 

# 하나의 반지름 값을 입력받아 원의 면적을 구하시오
r = input("반지름을 입력하시오: ")
r = int(r)
c = r ** 2 * 3.14
print(c)

#결과
반지름을 입력하시오: 11
379.94

 

대입 연산자

연산자 설명 사용 예시
+= 덧셈 i += 3
-= 뺄셈 i -= 3
*= 곱셈 i *= 3
/= 나눗셈 i /= 3
//= i //= 3
%= 나머지 i %= 3
**= 거듭제곱 i **= 3

대입 연산자는 위와 같이 정리된다. 연산에 사용되는 주체를 대입하여 사용함으로써 간단하게 표현할 수 있다.

 

사용 예시

a, b, c, d, e, f, g = 10, 10, 10, 10, 10, 10, 10

a += 3
b -= 3
c *= 3
d /= 3
e //= 3
f %= 3
g **= 3

print(a, b, c, d, e, f, g)

#결과
13 7 30 3.3333333333333335 3 1 1000

 

예제와 같이 연산 결과는 짐작할 수 있다. 3번 라인을 풀어서 쓰면 a = a + 3이 된다. 이렇게 대입 연산자를 쓰면 더 간결하게 표현 가능하다.

 

a = 10
a++

#결과
  File "<ipython-input-10-556c10cad483>", line 2
    a++
       ^
SyntaxError: invalid syntax

 

참고로, Python에서는 전치연산자 및 후치연산자를 사용할 수 없다. 
후치 연산자를 사용하였을 때는 syntax error 발생으로 인해 불가능하다. 

 

a = 10
++a
print(a)

#결과
10

 

전치 연산자를 사용하였을 때는 error 발생은 하지 않지만 값이 증가되지 않음을 확인 가능하다. 그 이유는 값 1을 증가시키는 것이 아닌 +(+a)와 같이 계산되기 때문이다.

Python 세트 타입

  1. 중복 없는 데이터를 저장
  2. {} 또는 파이썬 내장 함수인 set()를 이용(딕셔너리인 dict({키:값}과 비슷하다.)
  3. 순서 없는 데이터 타입
  4. 변경 가능한(mutable) 데이터 타입
  5. 집합 관련 연산자를 사용

 

사용 예시

mySet = {10, 20, 30}
print(mySet[0])

#결과
    print(mySet[0])
TypeError: 'set' object is not subscriptable

순서 없는 데이터 타입이기 때문에 인덱싱을 사용하면 error가 발생한다.

 

mySet = {10, 20, 30, 100}
print(mySet)
print(type(mySet))

{100, 10, 20, 30}
<class 'set'>

순서 없는 데이터 타입이므로 예제 출력 시에 값을 넣은 순서대로 출력되지 않는 것을 확인할 수 있다.

 

mySet = {10, 20, 30, 100}
mySet.add(1000)
print(mySet)
print(type(mySet))

#결과
{100, 1000, 10, 20, 30}
<class 'set'>

변경 가능하기 때문에 추가도 가능하다. 결과를 보면 객체 요소에 1000이 추가된 것을 확인할 수 있다.

 

mySet = {10, 20, 30, 100}
mySet.add(1000)
mySet.remove(30)
print(mySet)
print(type(mySet))

#결과
100, 1000, 10, 20}
<class 'set'>

변경 가능하기 때문에 삭제도 가능하다. 예제 결과를 보면 세트 객체 요소 중 30의 값이 삭제된 것을 확인할 수 있다.

 

mySet = {10, 20, 30, 100, 20, 30}
print(mySet)
print(type(mySet))

#결과
{100, 10, 20, 30}
<class 'set'>

세트 타입의 특징은 중복을 제거해주는 것이다. 예제처럼 20과 30을 세트 타입 객체에 중복된 값으로 넣게 되었을 때 출력 결과를 확인해보면 제거되어 있음을 알 수 있다.

 

mySet1 = {10, 20, 30}
mySet2 = {20, 30, 40, 50}
print(mySet1 & mySet2) # 교집합
print(mySet1 | mySet2) # 합집합
print(mySet1 - mySet2) # 차집합1
print(mySet2 - mySet1) # 차집합2
print(mySet1 ^ mySet2) # 대상 차집합(교집합을 제외한 나머지)

#결과
{20, 30}
{50, 20, 40, 10, 30}
{10}
{40, 50}
{40, 10, 50}

집합 관련 연산자 사용 가능하다는 특징도 있다. 예제와 같이 각 집합 관련 연산자를 사용할 수 있으며 아래 예제와 같이 세트 타입의 멤버 함수로도 사용 가능하다.

 

mySet1 = {10, 20, 30}
mySet2 = {20, 30, 40, 50}
print(mySet1.intersection(mySet2)) # 교집합

#결과
{20, 30}

세트 객체의 intersection 함수를 사용하여 교집합 출력을 동일하게 확인할 수 있다.

 

 

사전 타입

  1. 오브젝트를 키와 값으로 저장
  2. {키:값} 또는 파이썬 내장 함수인 dict() 함수를 사용
  3. 순서 없는 데이터 타입(인덱싱 및 슬라이싱은 불가능)
  4. 변경 가능한(mutable) 데이터 타입

사용 예시

myD = {10:"aa", 20:"bb", 30:"cc"}
print(myD)
print(type(myD))

#결과
{10: 'aa', 20: 'bb', 30: 'cc'}
<class 'dict'>

위의 예제 결과를 보면 사전 객체인 것을 확인할 수 있다.

 

myD = {10:"aa", 20:"bb", 30:"cc"}
print(myD)
print(type(myD))
print(myD[0])

#결과
    print(myD[0])
KeyError: 0

또한 순서 없는 데이터 타입이기 때문에 인덱스가 불가능하다. 대신 key를 넣을 수 있다.

 

myD = {10:"aa", 20:"bb", 30:"cc"}
print(myD)
print(type(myD))
print(myD[20])
print(myD.get(20))
print(myD.get(40, "zz"))

#결과
{10: 'aa', 20: 'bb', 30: 'cc'}
<class 'dict'>
bb
bb
zz

그리고 get이라는 멤버 함수가 있기 때문에 동일하게 key 값을 얻을 수 있다. 또한 get 함수는 default 값을 줄 수도 있다. 이 역할은, sample code와 같이 40이라는 key가 없으면 “zz”를 default로 출력해준다.

 

myD = {10:"aa", 20:"bb", 30:"cc"}
myD[10] = "AA"
print(myD)

#결과
{10: 'aa', 20: 'bb', 30: 'cc'}
<class 'dict'>
bb
bb
zz

사전 타입은 mutable이기 때문에 수정 가능한 특징이 있으며 예제와 같이 key 10의 값을 “AA”로 수정한 결과 바뀌는 것을 확인 가능하다. 한 가지 주의할 내용은 key가 중복되지 않는다는 점이다.

 

myD = {10:"aa", 20:"bb", 30:"cc", 20:"BB"}
myD[10] = "AA"
print(myD)

#결과
{10: 'AA', 20: 'BB', 30: 'cc'}

Key값 20을 중복시켰을 때 overwrite 되는 것을 확인할 수 있다. 따라서 반드시 key는 중복되지 않고 사용하면 안 된다. 

 

myD = {10:"aa", 20:"bb", 30:"cc"}
myD[10] = "AA"
myD[40] = 'dd'
myD[100] = 'ff'
print(myD)

#결과
{10: 'AA', 20: 'bb', 30: 'cc', 40: 'dd', 100: 'ff'}

사전 타입의 특징은 key가 있으면 수정되며 없으면 추가된다. 예제를 통해 40과 100의 key가 추가된 것을 확인할 수 있다.

 

myD = {10:"aa", 20:"bb", 30:"cc"}
print(myD.pop(20))
print(myD)

#결과
bb
{10: 'aa', 30: 'cc'}

다음은 삭제 함수이다. pop을 사용할 수 있는데 return도 해준다. 예제의 결과처럼, pop을 통해 key 20의 값을 return하고 사전 객체에서 해당 값이 삭제되어 있음을 확인할 수 있다.

 

myD = {10:"aa", 20:"bb", 30:"cc"}
del(myD[20])
print(myD)

#결과
{10: 'aa', 30: 'cc'}

추가로, python 내장 함수인 del을 사용할 수도 있다.

 

myD = {10:"aa", 20:"bb", 30:"cc"}
print(myD.keys())
print(myD.values())
print(myD.items())
 
test = [10, (10, 'aa')]
print(test[0])
print(test[1])
print(test[1][0])

#결과
dict_keys([10, 20, 30])
dict_values(['aa', 'bb', 'cc'])
dict_items([(10, 'aa'), (20, 'bb'), (30, 'cc')])
10
(10, 'aa')
10

Keys 함수는 dictionary의 key 요소만 출력해주는 함수이다.
Values 함수는 key에 연결되는 data값들을 출력해주는 함수이다.
Items 함수는 list의 tuple로서 key 값이 구성되는 함수이다.

test처럼 정수 객체와 tuple 객체를 list로 만들었다고 하였을 때, test[0]은 정수 출력, test[1]은 tuple 출력을 확인할 수 있다. 그리고 tuple 객체의 index를 지정함으로써 각 요소를 출력 가능하다.

[튜플(Tuple) 타입]

오브젝트의 리스트를 저장

() 또는 python 내장 함수인 tuple()을 이용

순서 있는 데이터 타입

변경 불가능한(immutable) 데이터 타입

함수의 인자, 리턴에 주로 사용


[사용 예시]

1
2
3
myT = (10203040)
print(myT)
print(type(myT))
cs
1
2
(10, 20, 30, 40)
<class 'tuple'>
cs

위의 예제를 실행시키면 튜플 객체인 것을 확인할 수 있다.

튜플 객체는 순서 있는 데이터 타입이기 때문에 인덱싱 및 슬라이싱을 사용 가능하다.


1
2
3
4
5
6
myT = (10203040)
print(myT)
print(type(myT))
print((myT[0]))
print(myT[-1])
print(myT[0:3])
cs
1
2
3
4
5
(10, 20, 30, 40)
<class 'tuple'>
10
40
(10, 20, 30)
cs

튜플의 경우 변경 불가능(immutable)하다. 따라서 아래 예제와 같이 수정하면 error가 발생한다.


1
2
3
4
5
6
7
myT = (10203040)
print(myT)
print(type(myT))
print((myT[0]))
print(myT[-1])
print(myT[0:3])
myT[0= 100
cs
1
2
    myT[0] = 100
TypeError: 'tuple' object does not support item assignment
cs

따라서 튜플의 메소드를 보면 리스트와 다르게 append나 insert 같은 함수들은 존재하지 않는다. 그리고 요소들을 삭제하거나 추가할 수가 없다.


튜플 packing unpacking의 두 가지 문법적 요소를 가지고 있다우선 아래 sample code를 보자.

1
2
3
4
5
# a = 10
# b = 20
# c = 30
a, b, c = 102030
print(a, b, c)
cs
1
10 20 30
cs

a, b, c의 객체를 선언하기 위해서는 위와 같이 콤마 연산자를 써서 한 줄로 선언할 수 있다.

1
2
3
myT = (10203040)
a, b, c = (100200300# unpacking
print(a, b, c)
cs
1
100 200 300
cs

위에 myT처럼 변수 하나가 요소들을 받지 않고 a, b, c처럼 여러 변수들이 있을 때 각각 객체들을 받도록 괄호를 없애주는 것을 unpacking이라고 한다.

1
2
3
myT = (10203040)
= 100200300 # packing
print(a)
cs
1
(100, 200, 300)
cs

콤마를 통해 각 변수가 하나씩 객체를 받아야 하지만 출력 결과를 보면 a가 모든 객체를 다 받았다. 이와 같이, 자동적으로 괄호를 붙여주는 것을 packing이라고 한다. 즉, 튜플로 자동 변환된다.

1
2
a, b, c = [100200300]
print(a, b, c)
cs
1
100 200 300
cs

한편, Unpacking은 리스트도 가능하다. 결론적으로 packing은 튜플 타입으로만 변환되지만 unpacking은 튜플 및 리스트 모두 가능하다.



1
2
3
4
5
6
7
myList = [10203040]
myList[0= 100
 
myList.append(50)
myList.insert(1200)
myList.extend([123])
print(myList)
cs
1
[100, 200, 20, 30, 40, 50, 1, 2, 3]
cs

1번째 index insert 함수를 사용하여 200을 추가한 내용이다또한 extend 함수를 사용하여 list를 새롭게 연결해주었다. extend 함수는 요소 뒤에 새로운 list 값들을 연결시켜준다.

1
2
3
4
5
6
myList = [10203040]
myList[0= 100
 
myList = myList + [123]
myList = myList * 3
print(myList)
cs
1
[100, 20, 30, 40, 1, 2, 3, 100, 20, 30, 40, 1, 2, 3, 100, 20, 30, 40, 1, 2, 3]
cs

추가적으로 연산자를 사용해도 extend와 동일한 결과를 얻을 수 있다
‘+’ 연산자를 사용하여 [1, 2, 3]을 요소 뒤에 추가해주고, ‘*’ 연산자를 사용하여 3번 반복하여 기존의 요소에서 총 3배의 요소가 되도록 만들었다.
삭제 또한 가능하다. remove 함수를 사용하면 되며 삭제할 개체를 인자로 전달해주면 된다.

1
2
3
4
5
myList = [10203040]
myList[0= 100
 
myList.remove(30)
print(myList)
cs
1
[100, 20, 40]
cs

출력 결과를 확인해보면, 30이 삭제된 것을 확인할 수 있다. 또한 pop 함수를 사용해도 삭제 가능하다. 이 함수를 사용하게 되면 맨 마지막 요소가 삭제된다.

1
2
3
4
5
myList = [10203040]
myList[0= 100
 
myList.pop()
print(myList)
cs
1
[100, 20, 30]
cs

예제의 출력 결과와 같이 40이 삭제된 것을 확인 가능하다또한 pop에도 전달 인자를 넣을 수 있는데 인덱스를 넣게 되면 삭제된다.

1
2
3
4
5
myList = [10203040]
myList[0= 100
 
myList.pop(1)
print(myList)
cs
1
[100, 30, 40]
cs

pop 함수 외에도 또 다른 삭제 방법은 python 내장 함수인 del 함수로 가능하다.

1
2
3
4
5
myList = [10203040]
myList[0= 100
 
del(myList[0])
print(myList)
cs
1
[20, 30, 40]
cs

0번째 index인 100이 삭제된 것을 확인할 수 있다. 다음은 index를 구해본다.

1
2
3
4
5
6
myList = [10203040]
myList[0= 100
 
= myList.index(20)
print(n)
print(myList)
cs
1
2
1
[100, 20, 30, 40]
cs

출력 결과와 같이 객체 20이 존재하는 index는 1임을 확인 가능하다. 그리고 count 함수는 특정 객체의 객수를 구하는 역할을 한다.

1
2
3
4
5
6
myList = [1020304020]
myList[0= 100
 
= myList.count(20)
print(n)
print(myList)
cs
1
2
2
[100, 20, 30, 40, 20]
cs

객체 20의 개수는 index 1, 4에 2개 존재하므로 출력 결과도 2가 나왔다. 그렇다면 리스트에 포함된 전체 객체 수는 어떻게 구할 수 있을까? 바로 Python의 내장 함수인 ‘len’을 사용하면 된다.

1
2
3
4
5
6
myList = [1020304020]
myList[0= 100
 
= len(myList)
print(n)
print(myList)
cs
1
2
5
[100, 20, 30, 40, 20]
cs

정리하자면, list 객체는 순서 있는 객체이므로 인덱싱 및 슬라이싱을 사용 가능하며 각각의 리스트를 다루는 멤버 함수(추가, 수정, 삭제)를 이용하여 리스트를 다룰 수 있다.

+ Recent posts