Numbers

  • 파이썬은 동적으로 타입이 변하기 때문에, 정수를 저장한 변수에 실수도 저장할 수 있다. 물론 다른 타입도 가능하다.

>>> x = 1
>>> type(x)
<class 'int'>
>>> x = 0.5
>>> type(x)
<class 'float'>
  • 변수의 크기는 지정되지 않으므로 C언어의 long long 과 int 크기의 숫자도 같은 변수에 저장된다.

    • 단, 값이 매우 클 경우 inf 또는 지수 형태(예시: 1e+123)로 표현된다.

>>> x = 1e123
>>> x
1e+123
>>> '%d' % x
'999999999999999977709969731404129670057984297594921577392083322662491290889839886077866558841507631684757522070951350501376'
  • immutable: 불변 객체(생성 후 상태를 바꿀 수 없는 객체), 다른 변수로 동일한 메모리 주소에 쓰기 작업 수행 시 복사되어 원본이 변하지 않는다.

    • y = x 라인까지는 두 변수 모두 같은 메모리를 참조하지만, y에 연산을 수행할 경우 메모리가 복사되어 원본 데이터가 변경되지 않는다.

>> x = 3
>> y = x
>> y += 1
>> x
3
>> y
4

 

String

  • 문자열 타입으로, 큰 따옴표와 작은 따옴표 모두 문자열로 표현된다. "blabla" 와 'blabla' 는 같다.

>>> x = "abcd"
>>> type(x)
<class 'str'>
>>> x == 'abcd'
True

 

  • immutable: 불변 객체(생성 후 상태를 바꿀 수 없는 객체), 다른 변수로 동일한 메모리 주소에 쓰기 작업 수행 시 복사되어 원본이 변하지 않는다.

>> x = 'abcd'
>> y = x
>> y += 'e'
>> x
'abcd'
>> y
'abcde'
  • 파이썬에서는 시퀀스 형에 대해 슬라이싱(slicing) 기능을 제공하는데, 앞으로 설명할 튜플과 리스트, 그리고 문자열은 시퀀스 형에 해당된다. 단, 문자열은 리스트와 달리 특정 위치에 값을 할당할 수 없으며, 수정하길 원한다면 다음과 같이 슬라이싱을 활용할 수 있다.

    • 파이썬에서는 슬라이싱과 관련해서 유용한 연산들을 많이 할 수 있는데, 대표적인 예로 문자열 뒤집기가 있다.

>>> x = 'helloempty'
>>> y = 'emptyworld'
>>> x + y
'helloemptyemptyworld'
>>> x[:5] + y[-5:]
'helloworld'
>>> x[::-1] # 문자열 뒤집기
'ytpmeolleh'
  • 지원하는 메소드는 다음과 같고, 호출 시 원본은 바뀌지 않는다.

>>> x.
x.capitalize(    x.isalpha(       x.ljust(         x.split(
x.casefold(      x.isascii(       x.lower(         x.splitlines(
x.center(        x.isdecimal(     x.lstrip(        x.startswith(
x.count(         x.isdigit(       x.maketrans(     x.strip(
x.encode(        x.isidentifier(  x.partition(     x.swapcase(
x.endswith(      x.islower(       x.replace(       x.title(
x.expandtabs(    x.isnumeric(     x.rfind(         x.translate(
x.find(          x.isprintable(   x.rindex(        x.upper(
x.format(        x.isspace(       x.rjust(         x.zfill(
x.format_map(    x.istitle(       x.rpartition(
x.index(         x.isupper(       x.rsplit(
x.isalnum(       x.join(          x.rstrip(
메소드 이름 용도  
capitalize() 첫 글자만 대문자로 바꾼 문자열을 반환
isalnum() 문자열에 숫자, 알파벳로만 구성되어 있으면 true, 아니면 false
isdigit() 문자열이 숫자로만 구성되어 있으면 true, 아니면 false
islower() 문자들이 모두 소문자이면 true, 아니면 false
isupper() 문자들이 모두 대문자이면 true, 아니면 false
isnumeric() 문자들이 모두 유니코드 문자이면 true, 아니면 false
isspace() 문자들이 모두 공백이면 true, 아니면 false
join([...]) 배열 원소가 모두 문자열이면, 지금 문자열을 구분자로 하나로 합쳐서 반환
ljust(width, fillchar=' ') 문자열이 width보다 짧으면 좌측으로 정렬 후 나머지를 fillchar로 채워서 반환
rjust(width, fillchar=' ') 문자열이 width보다 짧으면 우측으로 정렬 후 앞부분을 fillchar로 채워서 반환
lower() 모든 대문자를 소문자로 바꿔서 반환
upper() 모든 소문자를 대문자로 바꿔서 반환
lstrip(ch=' ') 왼쪽에 ch를 모두 제거해서 반환. ex) " a cde" -> "a cde"
rstrip(ch=' ') 오른쪽에 ch를 모두 제거해서 반환. ex) "acd e " -> "acd e"
strip(ch=' ') 양쪽에 ch를 모두 제거해서 반환
replace(old, new[, max]) 최대 max개까지 old를 new로 변경, max가 없으면 모두 변경한 후 반환
swapcase() 대문자는 소문자로, 소문자는 대문자로 바꾼 것을 반환

 

List

  • 리스트 타입으로, 다른 타입의 데이터를 함께 저장할 수 있다.

>>> x = [1,2,3,'hi',0.5]
>>> x
[1, 2, 3, 'hi', 0.5]
>>> type(x)
<class 'list'>
  • mutable: 가변 객체(생성 후에도 상태를 변경할 수 있는 객체), 다른 변수로 동일한 메모리 주소에 쓰기 작업 시 복사되지 않고 원본이 수정된다. 따라서 원본을 유지하려면 깊은 복사(deepcopy)를 해야 한다.

    • y = x 이후에도 두 변수는 모두 같은 메모리 주소를 참조한다.

>> x = [1,2]
>> y = x
>> y.append(3)
>> x
[1,2,3]
>> y
[1,2,3]
>> x = [1,2]
>> y = x.copy() # 깊은 복사를 할 경우 immutable 하게 사용 가능.
>> y.append(3)
>> x
[1,2]
>> y
[1,2,3]
  • 동일한 타입의 데이터를 사용하길 원한다면 array 모듈을 사용해야 한다.

>>> import array
>>> A = array.array('i', [1,2,3,4])
>>> A.
A.append(       A.fromfile(     A.itemsize      A.tolist(
A.buffer_info(  A.fromlist(     A.pop(          A.tostring(
A.byteswap(     A.fromstring(   A.remove(       A.tounicode(
A.count(        A.fromunicode(  A.reverse(      A.typecode
A.extend(       A.index(        A.tobytes(
A.frombytes(    A.insert(       A.tofile(
  • 지원하는 메소드는 다음과 같다.

>>> x.
x.append(   x.copy(     x.extend(   x.insert(   x.remove(   x.sort(
x.clear(    x.count(    x.index(    x.pop(      x.reverse(
메소드 이름 용도  
append(element) 리스트의 끝에 원소를 추가
copy() 리스트를 복사하여 반환
extend([...]) 리스트의 끝에 새 리스트를 추가
insert(index, element)   해당 위치에 원소를 삽입
remove(element) 원소를 삭제
sort() 리스트를 오름차순으로 정렬
clear() 리스트의 모든 원소를 제거
count(element) 리스트에 저장된 원소의 개수를 반환
index(element) 원소의 인덱스를 반환
pop() 리스트의 끝에서 원소를 제거한 후 반환
reverse() 리스트를 뒤집음
  • 리스트의 원소를 지우는 방법은 del 키워드를 사용해서도 가능한데, 주로 원소를 모르고 인덱스로 연산할 때 유용하다.

>>> x = [1,2,3]
>>> x
[1, 2, 3]
>>> del x[2]
>>> x
[1, 2]
  • 시퀀스 형(리스트, 문자열, 튜플 등)은 + 연산자* 연산자를 이용해서 합칠 수 있다. 매우 유용하다.

    • 단, 다른 시퀀스 형끼리는 연산할 수 없다.

>>> [1,2,3] + [4,5,6] + [7,8,9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [1,2] * 3
[1, 2, 1, 2, 1, 2]
>>> [[1,2,3], [4,5,6]] + [1,2,3]
[[1, 2, 3], [4, 5, 6], 1, 2, 3]
>>> "hello" + "world"
'helloworld'
>>> "A" * 12
'AAAAAAAAAAAA'
>>> (3,)*13 # 튜플은 원소가 1개일 때 뒤에 콤마(,)를 써야한다. 안그러면 스칼라 곱셈으로 계산된다.
(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3)

 

Tuple

  • 튜플 타입으로, 리스트와의 차이점은 다음과 같다.

    • 리스트는 []을, 튜플은 ()을 사용해서 선언한다.

    • 리스트는 크기나 원소를 동적으로 변경할 수 있으나, 튜플은 읽기만 가능(read-only)하다.

    • 리스트는 튜플보다 속도가 느리다.

  • immutable: 불변 객체(생성 후 원본이 변하지 않는 객체), 다른 변수가 동일한 메모리 주소에 쓰기 작업 수행 시 복사되어 원본이 수정되지 않는다.

>> x = (1,2)
>> y = x
>> y += (3,)
>> x
(1,2)
>> y
(1,2,3)
  • 지원하는 메소드는 다음과 같으며, count(element) 는 해당 원소의 개수를 반환하고, index(element) 는 해당 원소의 인덱스를 반환한다.

>>> x.
x.count(  x.index(

 

Dictionary

  • 딕셔너리 타입으로, key와 value 쌍을 원소로 저장한다.

    • key는 unhashable type(해쉬 불가능 타입)의 데이터는 해당될 수 없다. 주로 문자열, 숫자, 커스텀 객체가 해당된다.

>>> x = {'k1':1, 'k2':2, 3:"hello"}
>>> type(x)
<class 'dict'>

[+] 객체를 키로 쓰는 경우 메모리 주소로 동일한 키인지 구분한다.

>>> class Obj:
...     pass
...
>>> o = Obj()
>>> o
<__main__.Obj object at 0x10c1fddc0>
>>> x = {}
>>> x[o] = 1
>>> x
{<__main__.Obj object at 0x10c1fddc0>: 1}
  • mutable: 가변 객체(생성 후에도 원본이 변경되는 객체), 다른 변수에서 동일한 메모리에 쓰기 작업 수행 시 복사되지 않고 원본이 수정된다. 따라서 원본을 유지하려면 깊은 복사(deepcopy)를 해야 한다.

>> x = {'k1':2}
>> y = x
>> y['k2'] = 4
>> x
{'k1':2, 'k2':4}
>> y
{'k1':2, 'k2':4}
  • 지원하는 메소드는 다음과 같다.

>>> x.
x.clear(       x.get(         x.pop(         x.update(
x.copy(        x.items(       x.popitem(     x.values(
x.fromkeys(    x.keys(        x.setdefault(
메소드 이름 용도  
clear() 딕셔너리의 원소들을 모두 제거
get(key) 키에 해당되는 값을 반환
pop(key) 키에 해당되는 값을 제거해서 반환
update(dictionary) 현재 딕셔너리에 새로운 딕셔너리를 합침. 동일한 키가 있으면 새로운 값으로 수정된다.
copy() 딕셔너리를 복사해서 반환
items() 키와 값을 튜플 형태의 리스트로 반환. 주로 반복문에서 키와 값을 참조할 때 사용된다.
단, dict_items 라는 객체이며 리스트가 아니다.
>>> y = x.items()
>>> type(y) == type([])
False
>>> type(y)
<class 'dict_items'>
popitem() 마지막 아이템을 제거해서 반환
values() 값들만 리스트 형태로 반환하는데 dict_values 라는 객체이며 리스트는 아니다.
>>> y = x.values()
>>> type(y) == type([])
False
>>> type(y)
<class 'dict_values'>
fromkeys(seq[, value]) 시퀀스형의 원소들을 키로 갖는 딕셔너리를 반환하며, value는 기본값으로 쓰이는데 없으면 None을 값으로 갖는다.
keys() 키만 리스트 형태로 반환하는데 dict_keys 라는 객체이며 리스트는 아니다.
>>> y = x.keys()
>>> type(y) == type([])
False
>>> type(y)
<class 'dict_keys'>
setdefault(key[, value]) 해당 키에 대한 디폴트 값을 설정하는데, 키가 이미 있다면 바뀌지 않는다. value를 넘기지 않으면 None 이 설정된다.

 

set

  • 집합 자료형으로, set() 또는 {} 으로 선언할 수 있다.

>>> x = set({1,2,3})
>>> y = {1,2,3}
>>> type(x), type(y)
(<class 'set'>, <class 'set'>)
>>> x == y
True
  • 내부적으로 해쉬 테이블로 구현되어 있어 삽입/삭제/검색 시 O(1)의 비용이 든다.

  • 데이터는 순서 없이 저장되므로, 삽입한 순서와는 다르게 저장된다.

  • 인덱싱이나 슬라이싱이 불가능하다.

  • mutable: 가변 객체(생성 후에도 원본이 변경되는 객체)

  • 지원하는 메소드는 다음과 같다.

>>> x.
x.add(                          x.issubset(
x.clear(                        x.issuperset(
x.copy(                         x.pop(
x.difference(                   x.remove(
x.difference_update(            x.symmetric_difference(
x.discard(                      x.symmetric_difference_update(
x.intersection(                 x.union(
x.intersection_update(          x.update(
x.isdisjoint(
  • 집합 자료형으로는 frozenset 도 있는데 둘의 차이는 해시가능(hashable)의 유무이다.

    • set은 가변형이며 add() 나 remove() 메소드로 원소를 추가하거나 삭제할 수 있다. 원소에 대한 해시값이 따로 존재하지 않는다.

    • frozenset은 불변형이며 원소를 수정할 수 없다. 단, 원소에 대한 해시값이 별도로 존재한다.

    • frozeonset 은 딕셔너리의 key로 사용할 수 있다.

>>> x = { set([1,2]):1 }
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> x = { frozenset([1,2]):1 }
>>> x
{frozenset({1, 2}): 1}
  • frozenset 이 지원하는 메소드는 다음과 같다.

>>> x = frozenset()
>>> x.
x.copy(                  x.isdisjoint(            x.symmetric_difference(
x.difference(            x.issubset(              x.union(
x.intersection(          x.issuperset(

 

타입 변환 함수

  • int() – converts any data type into integer type

  • float() – converts any data type into float type

  • ord() – converts characters into integer

  • hex() – converts integers to hexadecimal

  • oct() – converts integer to octal

  • tuple() – This function is used to convert to a tuple.

  • set() – This function returns the type after converting to set.

  • list() – This function is used to convert any data type to a list type.

  • dict() – This function is used to convert a tuple of order (key,value) into a dictionary.

  • str() – Used to convert integer into a string.

  • complex(real,imag) – This functionconverts real numbers to complex(real,imag) number.

  • 모두 내장 함수(built-in function)이며, 인자로 주는 시퀀스형이 구조가 일치하지 않으면 예외를 일으킬 수 있다.

>>> int('123aa')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '123aa'
>>> int('123')
123

 

그 외

 

'Programming Language > Python' 카테고리의 다른 글

[정리 04] 파이썬 함수: LEGB 규칙, Closure, Decorator  (0) 2021.02.06
[정리 03] 유용한 기능들  (0) 2021.02.05
[정리 01] Python 기초  (0) 2021.02.04
간단한 알고리즘  (0) 2019.06.30
Tip (Reference)  (0) 2019.05.15

+ Recent posts