파이썬 내장 함수는 외부 모듈과 달리 import 명령어 없이 바로 사용할 수 있는 함수이다. 활용 빈도가 높고 중요한 함수를 몇가지 살펴볼 것이다. 반복 가능한(iterable) 자료형이라는 말을 자주 사용할 것인데, 반복 가능한 자료형이란 for문으로 그 값을 출력할 수 있는 것을 의미한다. 리스트, 튜플, 문자열, 딕셔너리, 집합 등이 있다.
1. all
all(x)는 반복 가능한(iterable) 자료형 x를 입력 인수로 받으며 이 x의 요소가 모두 참이면 True, 거짓이 하나라도 있으면 False를 돌려준다.
all([1, 2, 3])
# True
리스트 자료형 [1, 2, 3]은 모든 요소가 참이므로 True를 돌려준다.
all([1, 2, 3, 0])
# False
리스트 자료형 [1, 2, 3, 0] 중에서 요소 0은 거짓이므로 False를 돌려준다.
all([])
# True
만약 all의 입력 인수가 빈 값인 경우에는 True를 리턴한다.
2. any
any(x)는 반복 가능한(iterable) 자료형 x를 입력 인수로 받으며 이 x의 요소 중 하나라도 참이 있으면 True를 돌려주고, x가 모두 거짓일 때에만 False를 돌려준다. all(x)의 반대이다.
any([1, 2, 3, 0])
# True
리스트 자료형 [1, 2, 3, 0] 중에서 1, 2, 3이 참이므로 True를 돌려준다.
any([])
# False
any의 입력 인수가 빈 값인 경우에는 False를 리턴한다.
3. divmod
divmod(a, b)는 a를 b로 나눈 몫과 나머지를 튜플 형태로 돌려주는 함수이다.
divmod(7, 3)
# (2, 1)
4. enumerate
순서가 있는 자료형(리스트, 튜플, 문자열)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 돌려준다. 보통 enumerate 함수는 다음 예제처럼 for문과 함께 자주 사용한다.
for i, name in enumerate(['body', 'foo', 'bar']):
print(i, name)
'''
0 body
1 foo
2 bar
'''
객체가 현재 어느 위치에 있는지 알려 주는 인덱스 값이 필요할때 enumerate 함수를 사용하면 매우 유용하다.
원소의 인덱스를 1부터 시작할 수도 있다. ㄷ
for i, name in enumerate(['body', 'foo', 'bar'], 1):
print(i, name)
'''
1 body
2 foo
3 bar
'''
5. eval
eval(expression )은 문자열을 입력으로 받아 실행한 결괏값을 돌려주는 함수이다. 보통 eval은 입력받은 문자열로 파이썬 함수나 클래스를 동적으로 실행하고 싶을 때 사용한다.
eval('1+2')
# 3
eval("'hi' + 'a'")
# hia'
eval('divmod(4, 3)')
# (1, 1)
6. hex , oct
hex(x)는 정수 값을 입력받아 16진수(hexadecimal)로 변환하여 돌려주는 함수이다
hex(234)
# '0xea'
hex(3)
# '0x3'
oct(x)는 정수 형태의 숫자를 8진수 문자열로 바꾸어 돌려주는 함수이다.
oct(34)
# '0o42'
oct(12345)
# '0o30071'
7. ord, chr
ord(c)는 문자의 유니코드 값을 돌려주는 함수이다. ord 함수는 chr 함수와 반대이다.
ord('a')
# 97
ord('가')
# 44032
chr(i)는 유니코드(Unicode) 값을 입력받아 그 코드에 해당하는 문자를 출력하는 함수이다.
chr(97)
# 'a'
chr(44032)
# '가'
8. isinstance
isinstance(object, class)는 첫 번째 인수로 인스턴스, 두 번째 인수로 클래스 이름을 받는다. 입력으로 받은 인스턴스가 그 클래스의 인스턴스인지를 판단하여 참이면 True, 거짓이면 False를 돌려준다.
class Person:
pass
a = Person()
isinstance(a, Person)
# True
b = 3
isinstance(b, Person)
# False
9. sorted
sorted(iterable) 함수는 입력값을 정렬한 후 그 결과를 리스트로 돌려주는 함수이다.
sorted([3, 1, 2])
# [1, 2, 3]
sorted(['a', 'c', 'b'])
# ['a', 'b', 'c']
sorted("zero")
# ['e', 'o', 'r', 'z']
sorted((3, 2, 1))
# [1, 2, 3]
리스트 자료형에도 sort 함수가 있는데, 리스트 자료형의 sort 함수는 리스트 객체 그 자체를 정렬만 할 뿐 정렬된 결과를 돌려주지는 않는다.
10. zip
zip은 동일한 개수로 이루어진 iterable 자료형을 묶어 주는 역할을 하는 함수이다.
list(zip([1, 2, 3], [4, 5, 6]))
# [(1, 4), (2, 5), (3, 6)]
list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))
# [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
list(zip("abc", "def"))
# [('a', 'd'), ('b', 'e'), ('c', 'f')]
11. math 라이브러리
math 라이브러리는 자주 사용되는 수학적인 기능을 포함하고 있다.
팩토리얼
import math
print(math.factorial(5))
# 120
제곱근
import math
print(math.sqrt(7))
# 2.6457513110645907
최대 공약수
gcd(a, b) 는 a와 b의 최대공약수를 반환한다.
import math
print(math.gcd(21,14))
# 7
파이와 자연상수
import math
print(math.pi)
# 3.141592653589793
print(math.e)
# 2.718281828459045
12. Counter()
Counter()를 사용하면 주어진 단어(리스트)에서 그 알파벳(단어)이 몇 번 등장하는지 알려주는 딕셔너리 기반의 메서드이다. 보통 데이터의 개수를 셀 때 dictionary 자료구조를 많이 사용한다.
딕셔너리를 사용한 카운팅
def count_letters(word):
counter = {}
for letter in word:
if letter not in counter:
counter[letter] = 0
counter[letter] += 1
return counter
count_letters('hello world'))
# {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
Counter()를 사용한 카운팅
counter() 함수는 그 단어와 등장숫자를 내림차순으로 정렬해 나타낸다.
from collections import Counter
counter = Counter('hello world')
print(counter)
# Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
사전 자료형으로 바꾸기
이것을 dict() 함수로 딕셔너리로 바꾸면 단어의 등장순서에 따라 정렬해준다.
print(dict(counter))
# {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
items() : key, value 쌍을 튜플 형태로 반환
print(counter.items())
# dict_items([('h', 1), ('e', 1), ('l', 3), ('o', 2), (' ', 1), ('w', 1), ('r', 1), ('d', 1)])
keys() : 카운터 객체의 key들을 반환
print(counter.keys())
# dict_keys(['h', 'e', 'l', 'o', ' ', 'w', 'r', 'd'])
루프 돌리기 (counter는 딕셔너리 형태이기 때문에 가능)
for key, value in counter.items():
print(key, ':', value)
'''
h : 1
e : 1
l : 3
o : 2
: 1
w : 1
r : 1
d : 1
'''
elements() : 카운터 숫자만큼 요소 반환
print(list(counter.elements()))
# ['h', 'e', 'l', 'l', 'l', 'o', 'o', ' ', 'w', 'r', 'd']
Counter().most_common()
Counter 클래스는 데이터의 개수가 많은 순으로 정렬된 배열을 리턴하는 most_common 메서드가 있다.
from collections import Counter
Counter('hello world').most_common()
# [('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]
이 메서드의 인자로 숫자 K를 넘기면 그 숫자 만큼만 리턴하기 때문에, 가장 개수가 많은 K개의 데이터를 얻을 수도 있습니다.
from collections import Counter
Counter('hello world').most_common(1)
# [('l', 3)]
counter 연산
더하기, 빼기, 교집합, 합집합 연산도 가능하다.
c3 = Counter({'a': 3, 'b': 5, 'c': 1, 'd': 4})
c4 = Counter({'a': 1, 'b': 2, 'c': 8, 'e': 4})
c3 + c4 # Counter({'a': 4, 'b': 7, 'c': 9, 'd': 4, 'e': 4})
c3 - c4 # Counter({'a': 2, 'b': 3, 'd': 4})
c3 & c4 # Counter({'a': 1, 'b': 2, 'c': 1})
c3 | c4 # Counter({'a': 3, 'b': 5, 'c': 8, 'd': 4, 'e': 4})
update() : iterable을 전달하여 같은 값이 있으면 카운트가 추가되게 하고 없으면 새로운 key, value 쌍을 생성한다.
old = ['apple', 'banana', 'strawberry'] # 원래 리스트
new = ['hi', 'apple', 'apple', 'Apple'] # 추가로 나타난 리스트
from collections import Counter
counter = Counter(old)
print(counter)
# Counter({'apple': 1, 'banana': 1, 'strawberry': 1})
counter.update(new) # 추가된 리스트를 누적하여 센다
print(counter)
# Counter({'apple': 3, 'banana': 1, 'strawberry': 1, 'hi': 1, 'Apple': 1})
13. itertools()
itertools는 파이썬에서 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리이다. 그 중 permutation과 combination이 주로 사용된다.
permutations()
permutation(순열)은 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우를 계산해준다. permutations()은 클래스이므로 리스트로 변형하여 사용한다.
from itertools import permutations
data = ['a', 'b', 'c', 'd']
result = permutations(data,3)
print(result)
# <itertools.permutations object at 0x000002730D8B23B0>
print(list(result))
# [('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
product()
product는 permutations()와 비슷하게 동작하지만 원소를 중복하여 뽑는다. 즉, 순서를 고려하고 원소를 중복허용하여 뽑는 경우를 모두 반환한다.
from itertools import product
data = ['a', 'b', 'c']
result = list(product(data,repeat=2)) # 중복을 허용하여 2개 뽑는 경우
print(result)
# [('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('c', 'c')]
combinations()
combination(조합)은 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우를 계산해준다. combinations()은 클래스이므로 리스트로 변형하여 사용한다.
from itertools import combinations
data = ['a', 'b', 'c']
result = combinations(data,2)
print(result)
# <itertools.combinations object at 0x000002730D9A09F0>
print(list(result))
# [('a', 'b'), ('a', 'c'), ('b', 'c')]
combinations_with_replacement()
combinations_with_replacement()는 combinations()와 비슷하게 동작하지만 원소를 중복하여 뽑는다. 즉, 순서를 고려하지 않고 원소를 중복허용하여 뽑는 경우를 모두 반환한다.
from itertools import combinations_with_replacement
data = ['a', 'b', 'c']
result = list(combinations_with_replacement(data,2)) # 중복을 허용하여 조합
print(result)
# [('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')]
14. random 모듈
파이썬 랜덤 모듈은 랜덤 숫자를 생성해준다.
random(): 0 <= x < 1인 랜덤 실수 x 반환
import random
print(random.random())
# 0.7083716281233781
uniform(a, b): a <= x < b인 랜덤 실수 x 리턴
print(random.uniform(1,10))
# 5.861648650062278
randint(a, b): a <= x <= b인 랜덤 정수 x 리턴 (2번째 인자로 넘어온 정수도 범위에 포함시킴)
print(random.randint(1, 10))
# 9
randrange(): range(start, stop, step) 함수로 만들어지는 정수 중에 하나를 랜덤하게 리턴
print(random.randrange(0, 101, 2))
# 20
choice(): 랜덤하게 하나의 원소 선택
print(random.choice('alphabet'))
# b
sample(): 랜덤하게 여러 개의 원소 선택
print(random.sample([1, 2, 3, 4, 5], 3))
# [5, 4, 1]
shuffle(): 원소의 순서를 랜덤하게 변경
a = [1,2,3,4,5,6,7,8]
random.shuffle(a)
print(a)
# [7, 4, 6, 8, 3, 2, 5, 1]