11장 내장함수, 람다, 제너레이터, 모듈
내장 함수
파이썬 인터프리터 내부의 builtins 모듈에 저장되어 있는 함수로 파일의 형태가 아닌 컴파일된 형태로 들어 있다.
총 69개의 내장 함수들이 있고, 이 함수들은 import (모듈명)을 통해 따로 포함시킬 필요 없이 사용 가능하다. 예를 들어 숫자의 절대값을 반환하는 abs() 와 변수의 리스트를 받아 하나라도 거짓이나 0이 있다면 거짓을 아니라면 참을 반환하는, 즉 각
요소들을 and 연산하여 반환하는 all() 또는 or 연산하여 반환하는 any()가 있다.
정렬과 탐색
파이썬은 리스트를 정렬해주는 sort() 와 정렬된 임시 리스트 을 만들어 반환하는 sorted()가 있다. 또한 sort()는 리스트라는 타입
안의 메소드지만, sorted()는 내장함수로 반복 가능한 객체인 경우 기준을 지정하여 정렬이 가능하다. 또한 키와 값을 가지는
객체의 정렬의 경우 키 값이 겹칠 때 재정렬 후에도 같은 값을 가지는 키의 순서가 유지되어 안정성을 높인다.
람다식
람다식이란 이름이 없는 함수를 만드는 방법으로, 이름이 없이 몸체만 있는 함수이다. def가 아닌 lambda로 정의된다.
이름이 없으므로 단 한번만 사용되는 변수를 만드는 데 사용되며 반환값은 하나만 있어야 한다. 또한 자신만의 이름공간을 가진다.
기본적으로는 대입된 변수의 이름으로 호출한다.
이터레이터와 제너레이터
for 루프와 함께 사용할 수 있는 여러 종류의 객체를 이터레이터 라고 한다. 이때 객체가 이터레이터가 되기 위한 조건은
__iter() 함수와 __next__() 함수가 있고 각각 객체 자신을 반환하는 함수와 다음 반복을 위한 값을 반환하도록 하는 함수이다.
다음 반복을 위한 값이 없으면 stopiteration 예외를 발생시키도록 한다.
다음으로 제너레이터는 키워드 "yield" 를 사용하여 함수로부터 반복 가능한 객체를 생성하는 방법 중 하나이다. 즉, "yield"
문장을 사용하여 함수안의 변수들을 순환접근이 가능하도록 하는 것이다.
연산자 오버로딩
우리는 기본적으로 제공되는 연산자를 통해 다양한 객체들을 연산할 수 있으나 우리가 직접 정의하거나 연산자가 대응할 수 없는 객체에 대해서는 연산자를 이용해 연산할 수 없으나, 연산자 오버로딩을 통해 직접 정의함으로써 우리가 원하는 객체에 대한
연산자에 의한 연산을 할 수 있게 되고 이러한 정의 과정을 통해 대응 가능한 객체를 늘리는 과정을 연산자 오버로딩이라고 한다.
모듈
모듈이란 함수나 변수 또는 클래스를 모아 놓은 파일으로, 프로그래밍 과정에서 이러한 파일을 import할 경우 파이썬 프로그램 내부의 lib파일에서 해당 객체를 sys.modules로 로드시켜 사용할 수 있다. 모듈의 위치를 파악하려면 모듈 안의 __file__()
메소드를 호뤃하면 알 수 있다. 이러한 모듈을 작성하는 방법은 먼저 비슷한 함수들을 정의한 후 하나의 파일에 담아 보관한다.
사용 시 정의해놓은 파일의 이름에서 확장자를 제외하여 import ( 파일 이름) 또는 as "별칭" 의 형식으로 불러와 파일 내의 함수를 호출할 수 있고, 호출할 때는 함수의 이름 앞에 파일의 이름 또는 별칭과 . 을 붙여 구분해주어야 한다.
보편적으로 가장 많이 사용되는 모듈의 경우 다양한 방식의 복사를 지원하는 copy 모듈과 랜덤한 값들을 정해주는 random 모듈,
파이썬 인터프리터에 대한 정보를 알려주는 sys 모듈, 시간을 얻어오는 time 모듈 등이 있다. 이러한 모듈들은 이미 충분한 검증을 거쳐 정의되었으므로 이러한 기능들을 따로 다시 만드는 것은 좋지 않다.
python_11_func.py)
# 6
def fact(n) :
if n == 1:
return 1
else:
return n * fact(n-1)
# 7
class My_enumerate:
def __init__(self, iter):
self.iter = iter
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.iter):
raise StopIteration
result = (self.index, self.iter[self.index])
self.index += 1
return result
# 8
def count():
num = 0
while True:
num += 1
yield num
# 11
class Circle():
def __init__(self, r):
self.r = r
def __add__(self, other):
if isinstance(other, (int, float)):
return Circle(self.r + other)
elif isinstance(other, Circle):
return Circle(self.r + other.r)
else:
return NotImplemented
def __gt__(self, other):
return self.r > other.r
def __lt__(self, other):
return self.r < other.r
python_11_main.py)
import python_11_func as func
import random
import string
def main():
# 1
count = len([x for x in range(1, 101) if x % 3 == 0])
print(f"3의 배수의 개수 = {count}")
# 2
x = eval(input("정수나 실수를 입력하시오:"))
print(f"{x}는 {type(x)}타입 입니다.")
# 3
lst = [("국어", 88), ("수학", 90), ("영어", 99), ("자연", 82)]
rank = lambda x : dict(sorted(x, key=lambda x:x[1]))
print(f"원래의 리스트:\n{dict(lst)}\n정렬된 리스트:\n{rank(lst)}")
# 4
lst = [x for x in range(1, 11)]
even = lambda d : list(filter(lambda x: x%2==0, d))
odd = lambda d : list(filter(lambda x: x%2!=0, d))
print(f"원래의 리스트:\n{lst}\n짝수:\n{even(lst)}\n홀수:\n{odd(lst)}")
# 5
lst = [x for x in range(1, 11)]
triple = lambda l : list(map(lambda x: x*x*x, l))
print(f"원래 리스트:\n{lst}\n세제곱된 리스트:\n{triple(lst)}")
# 6
n = int(input("n:"))
print(func.fact(n))
# 7
for index, letter in func.My_enumerate('abc'):
print(f"{index} : {letter}")
# 8
c = func.count()
for _ in range(10):
next(c)
print(next(c))
# 9
lst = list(map(lambda x: x*x, range(1, 11)))
print(lst)
# 10
lst = list(filter(lambda x: x % 2 == 0 ,map(lambda x: x*x, range(1, 11))))
print(lst)
# 11
c1 = func.Circle(5)
c2 = func.Circle(10)
print(c1 < c2, c1 > c2, (c1 + c2).r, (c1 + 2).r)
# 12
lst = ["컴퓨터", "학습", "강화", "마우스", "키보드", "모니터", "프로그래밍"]
print(random.sample(lst, 3))
# 13
print(random.sample(string.ascii_lowercase, 10))
# 14
print(random.sample(range(100, 201, 2), 5))
if __name__ == "__main__":
main()
첫댓글 모듈을 import할때 일어나는일 sys.path의 역할, sys.modules의 역할을 잘 이해하고 잊지 말것
내장함수는 어디에 내장되어 있다는 건가?
모듈은 어디에 있다는 건가
내장함수와 모듈의 위치를 확인하는 방법은?
내장함수는 파이썬 인터프리터라는 프로그램안에 내장되어 있으니 인터프리터가 실행될때 같이 메모리(RAM)에 로드되고 일반적인 모듈은 외부(디스크)에 소스파일로 존재하고 import시 메모리(RAM)에 로드된다는거지요?
sys.modules의 키는 모듈명이고 값은 모듈객체의 주소인가요?