목록분류 전체보기 (117)
ROKO
generator는 lazy evaluation(지연 평가 구현체)이다. 즉 이미 구현을 해서 가지고 있는게 아닌 필요할때 그때그때 만들어서 보내주는 형식을 의미한다. list같은 경우 print()를 했을때 내부 값이 전부 출력되게 되는데, 이미 내부 값들이 "평가"되어 있으며 구현된 상태로 container안에 들어가 있는 상태라는 뜻이다. 반대로 generator로 표현되는 것들은 만약 값을 호출할때 어떻게 값을 만들어내고 어디서 어디까지 범위를 가지고 있는지, "평가"전에 데이터를 생성하는 방법을 기억하고 있는 상태이다. generator는 반복해서 값을 생성할 수 있으므로 iterator라고도 불리는데 generator expression(generator comprehension) 또는 yie..
List [x for x in range(10) if True] 리스트를 만들때 긴 코드를 한줄로 간편히 만들 수 있다. 짧은 코드가 필요할때 comprehension을 차용하면 pythonic 한 코드를 구현하는데 많은 도움이 된다. 하지만 반복문이 많거나 조건문이 많은 경우 한줄이라도 너무 길어지면 가독성이 떨어지기에 comprehension을 지양하는 편이 좋다. comprehension은 내부에서 for문과 if문을 얼마든지 반복할 수 있다! Dictionary { x:0 for x in range(10)} Set { x for x in range(10)} Tuple ( x for x in range(10) ) Tuple은 저 comprehension값을 출력하면 generator라고 불리는 특정..

python에는 exception class를 상속받은 기본 bulit-in error들이 있다. https://docs.python.org/ko/3/library/exceptions.html Built-in Exceptions In Python, all exceptions must be instances of a class that derives from BaseException. In a try statement with an except clause that mentions a particular class, that clause also handles any excep... docs.python.org 내가 프로그래밍 중 error 호출을 통해 위험관리를 하고 싶을 때 어떻게 해야할까? raise..
python logic을 작성하거나 함수를 실행할때 부가적으로 효율성이나 flow가 잘 흐르는지 확인하기 위해 함수내부에 시간을 측정하는 코드를 넣는 등 부가적인 코드를 작성할 수 있다. 그렇다보면 기존 함수의 logic이 복잡해지고 가독성도 떨어지게 되는데 대안법으로 decorator문법을 지원해준다. def decorator(func): def new_func(*args, **kwargs): print("데코레이터 적용한 함수") result = func(*args, **kwargs) return result return new_func @decorator def add_a_b(a, b): return a + b print(add_a_b(10, 20)) # 데코레이터 적용한 함수 # 30 데코레이터로..
def func(): pass func = function(code, globals[, name[, argdefs[, closure]]]) 두 코드 모두 func이라는 함수를 생성하는 과정이다. 복잡한 과정을 def가 해결해주는데 프로그램을 구현하는 입장에서 한번밖에 사용되지 않을 함수를 위해 위와 같이 함수를 선언하는 것은 메모리와 시간 손실을 일으킬 것이다. 함수의 목적중에 코드의 재사용이 있었다는 사실을 잊지 말자. 사용 후 del 연산자를 통해 메모리 관리를 한다고 하더라도 그 과정자체가 프로그램의 최적화 관점에서 손실이다. 그렇다면 함수가 실행되어야 하는 부분에 알고리즘을 복잡하게 쓰기에는 가독성이 떨어진다. 이를 위한 대안법으로 람다 함수가 있다. lambda def func(x): # do ..

function의 목적 function은 왜 쓰는걸까? 가독성과 코드의 재사용? 성능에는 변화가 없다면 궁극적인 목표에는 안좋은게 아닌가? 파이썬은 def를 통해 함수로 지정하게되면 실행시 함수 내부 코드를 indentation을 기준으로 최적화 코드로 변환한다. 따라서 같은 반복문을 2번 반복하는것보다 함수를 2번 호출하는것이 더 빠르다. 궁금하다면 import time을 통해 각각 실행시간을 확인하는 실험을 해보면 알 수 있다. import time def func(): num = 0 for i in range(100000): num += i t1 = time.perf_counter() num = 0 for i in range(100000): num += i for i in range(100000):..
쉽게 설명하면, 변수에 값을 할당 후 코드실행과정에서 변수의 값이 변동 된다면 mutable 바뀌지 않는다면 immutable이다. bulit-in type is immutable! var = 1 var = 2 print(var) # 2 출력 1에서 2로 바뀌었으니 바뀐거 아냐? 변수에 담긴 객체가 바뀐것이지 변수의 형태가 바뀐것이 아니다. 이러한 것들로 int, float, str, tuple이 있다. 한번 선언된 이후로 type이 변형되는 것이 아닌 내포하는 객체의 값이 변경될 수 있다는 점을 인지하자. mutable mutable 객체는 값이 들어오면 immutable처럼 내부 값을 변화시켜 return하는게 아니라 객체의 형태를 변형시켜 값을 받는다. list, dict, set 과 같은 자료형들..
Container python object는 다양한 class를 상속받을 수 있다. 그 중 data type과 무관하게 데이터를 받을 수 있는 자료구조 형을 container라고 한다. 예를들어 dict, set, str 등등은 container이고, 반대로 float, int, complex는 type이 정해진 literal 형태이다. container는 type()으로는 확인할 수 없고 container를 상속받았는지 확인하기 위한 issubclass()를 통해 알 수 있다. from collections import Container print(issubclass(dict, Container)) # True print(issubclass(int, Container)) # False container..
# python recursion 형식 # tail recursion 이라고도 부름 def fun(): ''' do somethiing ''' return fun() python으로 코드를 구현할때 특히 Dynamic programming(동적프로그래밍)에서 재귀함수 형태를 사용할때가 있다. pyhton 언어를 공부하다가 알게된 사실인데 Python에는 재귀함수의 반복 횟수가 정해져있다. 그 기준이 call stack기준인지 그냥 하나의 함수자체에서 반복되는 총 개수를 의미하는 것인지는 정확히 모르겠지만 이러한 사실을 알게 되었고 그 기준을 수정하는 방법을 소개하고자 한다. import sys limit_number = 'num to maximize' sys.setrecursionlimit(limit_n..
pass 실행할 코드가 없는 경우 의미를 나타내는 코드다. python은 조건문이나 반복문에 명령어를 작성하지 않으면 에러가 발생하므로 pass를 적어 아무것도 실행하지 않는 코드로 그저 비어있음을 의미한다. x = 10 if x>10: pass else: print(x) # 10 출력 continue 이후 아래 코드는 pass와 같이 실행되지 않고 넘어간다. 반복문의 경우 다음 loop로 넘어가게 된다. for i in range(1,6): if i