[Python] 7. 내장함수

Wonder_Land🛕·2022년 6월 19일
0

[Python]

목록 보기
7/12
post-thumbnail
  1. 수치 연산 함수
  2. Sequence / Iterable Type을 다루는 함수
  3. 변환 함수
  4. 객체 조사를 위한 함수
  5. 실행 관련 함수
  6. Q&A
  7. 마치며

우리가 프로그램을 만든다고 할 때
'무에서 유를 창조'하지는 않습니다.

물론 어느정도는 직접 만들겠지만,
많은 부분은 누군가 미리 만들어놓은 검증된 함수를 활용합니다.

이러한 방식은 생산성 및 품질 역시 향상 시킬 수 있습니다.

따라서, 프로그램을 제작하기 전에
'나에게 필요한 기능이 미리 구현된 함수가 있는지 'API'를 통해'
알아보는 것이 좋습니다.

이미 구현되어 있는 함수가 있는데, 굳이 시간을 소비할 필요는 없으니까요.


1. 수치 연산 함수

1) abs()

  • abs() : 인자로 숫자를 전달하면 그 숫자의 절대값을 반환하는 함수
abs(arg)
val1 = 10	# 10의 절대값
val2 = -10	# -10의 절대값
print(abs(val1), abs(val2))

[Result]
10 10

2) divmod()

  • divmod() : 첫 번째 인자를 두번째 인자로 나눴을 때의 몫과 나머지를, 튜플 객체로 반환하는 함수
divmod(나누어지는 수, 나누는 수)
val1, val2 = 9, 5	
result_tuple = divmod(val1, val2)	#tuple 객체로 반환
print(result_tuple)

[Result]
(1, 4)

3) pow()

  • pow() : 첫번째 인자를 두번째 인자값으로 제곱한 결과를 반환하는 함수
pow(, 지수)
val1, val2 = 2, 5
print(pow(val1, val2))	#2의 5제곱 == 32

[Result]
32


2. Sequence / ¹Iterable Type을 다루는 함수

1) all()

  • all() : iterable 객체를 인자로 전달받아, element 모두가 True이면 True, False가 1개 이상이면 False를 반환하는 함수
all(iterable 객체)
val1 = [1, 2, 3]
print(all(val1))

val2 = [0, 1, 2]	# '0'은 False
print(all(val2))

[Result]
True
False

참고로, 0, False, "", None은 False로 취급합니다.

2) any()

  • any() : iterable 객체를 인자로 전달받아, element 모두가 False이면 False, True가 1개 이상이면 True를 반환하는 함수
any(iterable 객체)
val1 = [0, 1, 2]
print(any(val1))

val2 = [0, "", None]	#모든 element가 False
print(any(val2))

[Result]
True
False

참고로, 0, False, "", None은 False로 취급합니다.

all()함수와 반대로 작용하네요😉

3) enumerate()

  • enumerate() : iterable 객체를 입력받아, index를 포함하는 Tuple 객체의 항목으로 구성된 enumerate 객체를 반환하는 함수
enumerate(iterable 객체)
val = [10, 20, 30]

for index, value in enumerate(val):	# val을 enumerate 객체로 반환
    print(f'({index}, {value})')

for obj in enumerate(val):	
    print(obj)

[Result]
(0, 10)
(1, 20)
(2, 30)

(0, 10)
(1, 20)
(2, 30)

참고로, obj1번째 항목(obj[0]은 index를, 2번째(obj[1])는 value를 가짐

4) filter()

  • filter() : 조건을 만족하는 elemente만 필터링하여 filter 객체를 반환하는 함수
filter(조건, iterable 객체)

조건은 True / False를 반환하는 함수
iterable 객체의 element가 조건함수에서 실행되고,
True인 element만 필터링합니다.

def is_even(N):
    return N % 2 == 0	# 짝수만 필터링

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ret_val = filter(is_even, N)	# filter 객체 반환

print(list(ret_val))	# list로 변환

[Result]
[2, 4, 6, 8, 10]

filter(is_even, numbers)는,

is_even함수가 True를 반환한 짝수값을 항목으로 하는 List를 생성 후 filter 타입으로 반환하여,

ret_val에 저장합니다.

5) list() tuple() set() dict()

  • list() : Iterable type을 인자로 받아 list로 변환하는 함수

  • tuple() : Iterable type을 인자로 받아 tuple로 변환하는 함수

  • set() : Iterable type을 인자로 받아 set로 변환하는 함수

  • dict() : Iterable type을 인자로 받아 dict로 변환하는 함수
list(iterable 객체)
tuple(iterable 객체)
set(iterable 객체)
dict(iterable 객체)
data = "Hello!"

print(list(data))
print(tuple(data))
print(set(data))
print(dict(enumerate(data)))

[Result]
['H', 'e', 'l', 'l', 'o', '!']
('H', 'e', 'l', 'l', 'o', '!')
{'l', 'o', 'e', 'H', '!'}
{0: 'H', 1: 'e', 2: 'l', 3: 'l', 4: 'o', 5: '!'}

6) map()

  • map() : 두번째 인자로 iterable 객체를 전달 받아, 각 element에 대해 첫번째 인자로 전달 받은 함수를 적용한 결과를 map 객체로 반환하는 함수
map(함수, iterable 객체)
data = list("wonder")
result = map(lambda x:x.upper(), data)
print(list(result))

[Result]
['W', 'O', 'N', 'D', 'E', 'R']

7) max() min()

  • max() : iterable 객체를 인자로 전달받아 항목 중 가장 큰 값 반환

  • min() : iterable 객체를 인자로 전달받아 항목 중 가장 작은 값 반환
max(iterable 객체)
min(iterable 객체)
data = [10, 25, 30, 45]
print(max(data), min(data))

[Result]
45 10

8) range()

  • range() : 첫번째 인자인 시작값, 두번째 인자인 종료값, 세번째 인자인 증감치를 통해 Sequence형 객체를 생성하는 함수
range(시작값, 종료값, 증감치)

이 때, 종료값은 범위에 포함되지 않습니다.
즉, '(시작값) ~ (종료값 - 1)'까지의 범위만 가집니다.

또한, 시작값은 생략되면 0, 증감치는 생략되면 1로 고정됩니다.

data1 = list(range(0, 10, 1))
data2 = list(range(0, 10))   # 생략된 증감치는 `1`로 고정
data3 = list(range(10))     # 생략된 시작값은 `0`으로 고정

print(data1, data2, data3, sep = "\n")

[Result]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

9) sorted()

  • sorted() : iterable 객체를 인자로 전달받아, element가 정렬된 list를 생성해 반환하는 함수
sorted(iterable 객체, key옵션, reverse옵션)

key옵션은 정렬할 '기준'을 입니다.
reverse옵션`은 '오름차순 / 내림차순'입니다.

data = [3, 8, 12, 2, 5, 11]

print(data)
print(sorted(data))	# 오름차순 정렬

print(list(reversed(sorted(data))))	# 내림차순 정렬 1
print(sorted(data, reverse = True)) # 내림차순 정렬 2

[Result]
[3, 8, 12, 2, 5, 11]
[2, 3, 5, 8, 11, 12] # 오름차순
[12, 11, 8, 5, 3, 2] # 내림차순 1
[12, 11, 8, 5, 3, 2] # 내림차순 2

만약 정렬할 객체가 Dictionary 객체라면 어떻게 할까요?

기본적으로
sorted(dict 객체)를 실행하면 key를 기준으로 정렬됩니다.

따라서 value를 기준으로 정렬하고자 하면,
sorted()함수의 key옵션을 이용해야 합니다.

data = {
    "B" : 1,
    "A" : 2,
    "E" : 3,
    "D" : 4,
    "C" : 5,
}

print(sorted(data))

print(sorted(data, key = lambda x : data[x]))	# 오름차순
print(sorted(data, key = lambda x : data[x], reverse = True))	# 내림차순

[Result]
['A', 'B', 'C', 'D', 'E'] # key로 정렬
['B', 'A', 'E', 'D', 'C'] # value로 오름차순 정렬
['C', 'D', 'E', 'A', 'B'] # value로 내림차순 정렬

10) zip()

  • zip() : 2개 이상의 iterable 객체를 인자로 전달받아, 동일 index의 element끼리 묶어 tuple을 element로 구성하는 zip 객체를 생성하는 함수
zip(iterable 객체1, iterable 객체2, ...)

이 때, 인자로 전달된 객체는 1) 동일한 type, 2) element의 개수가 동일해야 합니다.

data1 = [1, 2, 3]
data2 = [4, 5, 6]
data3 = ["a", "b", "c"]

print(list(zip(data1, data2, data3)))

[Result]
[(1, 4, 'a'), (2, 5, 'b'), (3, 6, 'c')]


3. 변환 함수

1) chr() ord() hex()

  • chr() : integer의 유니코드 값을 인자로 전달받아, 해당 코드의 문자를 반환하는 함수

  • ord() : 문자를 인자로 전달받아, 해당 문자의 유니코드 값(10진수)을 반환하는 함수

  • hex() : 10진 정수값을 인자로 전달받아, 16진수로 변환된 값을 반환하는 함수
chr(정수)
ord(문자)
hex(10진 정수)
val1 = 65
print(chr(val1))

val2 = "A"
print(ord(val2))

val3 = 10
print(hex(10))

[Result]
A
65
0xa

2) int() float() str()

  • int() : 숫자 형식의 문자열, float 숫자Integer로 변환하는 함수

  • float() : 숫자 형식의 문자열, Integer 숫자Float로 변환하는 함수

  • str() : 인자로 전달된 객체에 대한 문자열을 반환하는 함수
int(문자열 또는 float)
float(문자열 또는 int)
str(객체)
val1 = 4.5
val2 = "10"
val3 = 4.5

print(int(val1))
print(float(val2))
print(str(val3))

[Result]
4
10.0
4.5


4. 객체 조사를 위한 함수

1) dir()

  • dir() : 객체가 가지고 있는 변수, 메서드와 같은 속성 정보를 list 객체로 반환하는 함수
dir(obj)

이 때, 인자를 생략하면 현재 Local Scope에 대한 정보를 list 객체로 반환합니다.

print(dir())	# Local Scope에 대한 정보 list로 반환

data = "Hello Wonder Land!"
print(dir(data))    # 문자열이 가지는 Method정보를 list로 받환

[Result]
['__annotations__', '__builtins__', ..., '__spec__']
['__add__', '__class__', ..., 'zfill']

2) globals() locals()

  • globals() : 현재의 Global Symbol Table을 보여주는 Dictionary를 반환하는 함수 (전역변수와 함수, 클래스의 정보를 포함합니다)

  • locals() : 현재의 Local Symbol Table을 보여주는 Dictionary를 반환하는 함수 (매개변수를 포함한 지역변수와 중첩함수의 정보를 포함합니다)
globals()
locals()

3) id()

  • dir() : 객체의 고유 주소(참조값)를 반환하는 함수
id(객체)

보통은 16진수로 표현하기 때문에, hex()를 붙여 사용합니다.

val = 10
print(hex(id(val)))

[Result]
0x2147bb90210

4) isinstance() issubclass()

  • isinstance() : 첫번째 인자로 전달된 객체가, 두번째 인자로 전달된 Class의 instace인지를 True / False로 반환하는 함수

  • issubclass() : 첫번째 인자로 전달된 Class가, 두번째 인자로 전달된 Class의 subclass인지를 True / False로 반환하는 함수
isinstance(객체, 클래스)
issubclass(클래스1, 클래스2)
class Parent:
    pass

class Child(Parent):	# Parent Class를 상속받음
    pass

P = Parent()
C = Child()

print(isinstance(P, Parent))     # True
print(isinstance(C, Parent))     # True
print(isinstance(P, Child))      # False
print(issubclass(Child, Parent)) # True

[Result]
True
True
False
True


5. 실행 관련 함수

1) eval()

  • eval() : 실행 가능한 표현식의 문자열을 인자로 전달받아, 해당 문자열의 표현식을 실행한 결과값을 반환하는 함수
eval(표현식)
expr1 = "2 + 5 * 3"
print(eval(expr1))

expr2 = "'hello wonder land'.upper()"
print(eval(expr2))

[Result]
17
HELLO WONDER LAND


6. Q&A

(해당 내용은 Pythond docs를 참고했습니다. 링크는 밑의 [Reference]에 있습니다.)

1) Iterable

iterable
An object capable of returning its members one at a time. Examples of iterables include all sequence types (such as list, str, and tuple) and some non-sequence types like dict, file objects, and objects of any classes you define with an iter() method or with a getitem() method that implements Sequence semantics.


Iterables can be used in a for loop and in many other places where a sequence is needed (zip(), map(), …). When an iterable object is passed as an argument to the built-in function iter(), it returns an iterator for the object. This iterator is good for one pass over the set of values. When using iterables, it is usually not necessary to call iter() or deal with iterator objects yourself. The for statement does that automatically for you, creating a temporary unnamed variable to hold the iterator for the duration of the loop. See also iterator, sequence, and generator.

  • Iterable(이터러블)
    : member를 한 번에 하나씩 반환할 수 있는 객체를 말합니다.

예시로는,
1) 모든 Sequence type(list, tuple, str)
2) NonSequence type 중 일부(dictionary, file)
3) iter() / getitem() Method로 구현된 클래스의 객체
가 있습니다.

Iterable 객체는 for문이나 Sequence(순서)가 요구되는 곳(zip(), map())에서 사용됩니다.

Iterable 객체가 사용될 때는 내장함수인 iter()에 의해 iterator가 반환됩니다.

하지만 우리가 for문 등에서 사용할 때 iter()를 직접 호출한 적은 거의 없습니다.(저도 단 한 번도 없었네요..)

그건 Python에서 for문을 실행할 때, 자동으로 임시 list, tuple 등의 객체를 만들어 iterator를 다루어주고 있기 때문입니다.

2) Iterator

iterator
An object representing a stream of data. Repeated calls to the iterator’s next() method (or passing it to the built-in function next()) return successive items in the stream. When no more data are available a StopIteration exception is raised instead. At this point, the iterator object is exhausted and any further calls to its next() method just raise StopIteration again. Iterators are required to have an iter() method that returns the iterator object itself so every iterator is also iterable and may be used in most places where other iterables are accepted. One notable exception is code which attempts multiple iteration passes. A container object (such as a list) produces a fresh new iterator each time you pass it to the iter() function or use it in a for loop. Attempting this with an iterator will just return the same exhausted iterator object used in the previous iteration pass, making it appear like an empty container.


More information can be found in Iterator Types.


CPython implementation detail: CPython does not consistently apply the requirement that an iterator define iter().

  • Iterator(이터레이터)
    : 데이터의 흐름을 나타내는 객체

next() Method를 통한 반복적인 호출에, 데이터의 순차적인 항목을 반환합니다.
즉, next() Method로 항목들을 순차적으로 호출 가능한 객체입니다.

만약, next() Method를 통해 다음 데이터를 반환할 수 없다면(제일 마지막 항목), StopIteration을 발생시킵니다.

모든 iterator는 iterator 자체를 반환하는 iter() Method를 가질 수 있기 때문에, iterable하다고 볼 수 있습니다.

하지만, iterable하다고 해서 iterator이라고 볼 수 없습니다.

lst = [1, 2, 3]

next(lst)

**[Result]**
TypeError: 'list' object is not an iterator
이처럼 list는 iteralbe하지만, next()를 호출해도 동작하지 않으므로 iterator가 아닙니다.

iterator처럼 동작시키고 싶다면, 내장함수 iter()를 이용해야 합니다.

lst = [1, 2, 3]
next(iter(lst))	# iterator로 변환
print(type(iter(lst)))

**[Result]**
<class 'list_iterator'>
이처럼 iter()함수를 사용하면 list를 list_integer로 변환할 수 있습니다.


7. 마치며

내장함수는 개발자로 하여금 직접 함수를 만들어야하는 수고를 덜어주며, 검증된 내용이기 때문에 오류를 발생시킬 가능성도 줄여줍니다.

그렇지만, 함수의 내용, 인자, 반환값, 반환 타입 등을 자세히 알고있어야지 우리가 원하는 방식으로 사용할 수 있습니다.

저 같은 경우는, map()이나 filter()함수의 반환값이 list, tuple처럼 우리가 손쉽게 사용할 수 있는 type이 아닌, map / filter 객체로 반환한다는 것을 몰랐습니다.
list()tuple()함수를 통해 원하는 type으로 변환시켜야 하는 것을 몰랐던거죠.

이처럼 내장함수는 정확히 알 때 강력하고, 계속 써봐야 이롭게 작동하는 것 같습니다😊

마지막으로 등장한 iterable과 iterator는 여러 언어에 등장하는 특성으로, container와 같은 자료구조에서는 항상 등장하는 개념이므로 잘 기억해두어야 할 것 같습니다.

[Reference] : 위 글은 다음 내용을 참고, 인용하여 만들어졌습니다.

profile
아무것도 모르는 컴공 학생의 Wonder_Land

0개의 댓글