언어
-
[Python] Tip - 키워드 전용 인수로 명료성을 강요언어/파이썬 & 장고 2016. 10. 21. 21:00
함수에서 파라미터를 정의하고 아규먼트로 값을 넘겨줄 때 키워드 인수 사용을 강요하는 것이 함수사용에 있어 혼란을 줄일 수 있습니다.인수 리스트에 있는 *기호는 위치 인수의 끝과 키워드 전용 인수의 시작을 가리킵니다.def division(number, divisor, *, ignore_overflow=False, ignore_zero_division=False): # ... division(1,0,0) # 에러 division(1,0,ignore_overflow=True) # * 다음의 키워드를 명시해야 함요약키워드 인수는 함수 호출의 의도를 더 명확하게 해줌특히 부울 플래그를 여러 개 받는 함수처럼 헷갈리기 쉬운 함수를 호출할 때, 키워드 인수를 넘기게 하려면 키워드 전용 인수를 사용파이썬 3은 함수의..
-
[Python] Tip - 동적 기본 인수를 지정하려면 None과 docstring을 사용언어/파이썬 & 장고 2016. 10. 21. 20:54
키워드 인수의 기본값으로 비정적(non-static)타입을 사용해야 할 때도 있습니다.예를 들어 이벤트 발생 시각까지 포함해 로깅 메시지를 출력한다고 가정합니다. 보통 함수를 호출한 시각을 메시지에 포함하여 다음과 같이 처리합니다.import datetime import time def log(message, when=datetime.datetime.now()): print('%s: %s' % (when, message)) log('hi there') time.sleep(0.1) log('hi again') # 결과 # 2016-10-21 20:40:07.689163: hi there # 2016-10-21 20:40:07.689163: hi againdatetime.datetime.now()는 함수를 ..
-
[Python] assert()언어/파이썬 & 장고 2016. 10. 21. 13:34
assert()는 파이썬에만 있는 것이 아닌 거의 모든언어에 다 포함되어 있습니다. assert()는 방어적 프로그래밍(defensive programming)에서 사용하여 코드를 점검하는데 사용됩니다.assert condition보통 위와 같이 사용하며 condition이 맞지 않으면 AssertionError를 발생시킵니다. def remainder(number, divisor): return number % divisor assert remainder(20, 7) == 6 # 맞기 때문에 정상적으로 동작 assert remainder(20, 7) == 2 # AssertionError 발생assert()는 디버깅 모드에서만 효과가 있고 릴리즈에서는 아무런 일도 하지 않기 때문에 예외처리랑 비슷하지만..
-
[Python] 동적 import 추가언어/파이썬 & 장고 2016. 10. 18. 13:41
Python 의 모듈을 import 할때는 보통 파일 초기에 선언하여 사용하는게 일반적입니다. 하지만 import를 사용자의 input에 따라 다르게 선언하고 싶을 때 즉, 동적으로 import하고 싶을 때 아래와 같은 방법을 사용하면 실행할 수 있습니다. importlibimport 하고 싶은 module명을 module_name 이라는 변수로 받았다고 가정하면 아래와 같이 쉽게 사용할 수 있습니다. import importlib def load_module_func(module_name): tmp = importlib.import_module(module_name) return tmpload_module_func 함수에서 받은 결과를 통해 module 안에 있는 class를 호출할 수 있습니다.__i..
-
[Python] Tip - 가변 위치 인수로 깔끔하게 코딩언어/파이썬 & 장고 2016. 10. 16. 18:11
선택적인 위치 인수 ( 이런 파라미터 이름을 관례적으로 *args라고해서 종종 'star args'라고도 함)를 받게 만들면 함수 호출을 더 명확하게 할 수 있고 보기에 방해가 되는 요소를 없앨 수 있습니다.예를 들어 디버그 정보 몇 개를 로그로 남긴다고 할 때, 인수의 갯수가 고정되어 있다면 메시지와 값 리스트를 받는 함수가 필요합니다.def log(message, values): if not values: print(message) else: values_str=', '.join(str(x) for x in values) print('%s: %s' % (message, values_str)) log('My numbers are',[1,2]) log('Hi there',[]) # 결과 # My numb..
-
[Python] Tip - 인수를 순회할 때는 방어적으로언어/파이썬 & 장고 2016. 10. 16. 17:55
파라미터로 객체의 리스트를 받는 함수에서 리스트를 여러 번 순회해야 할 때가 종종 있습니다. 예를 들어 미국 텍사스주의 여행자 수를 분석하고 싶다고 할 때 데이터 집합은 각 도시의 방문자 수(연도별 백만 명 단위)라고 가정하고 각 도시에서 전체 여행자 중 몇 퍼센트를 받아들이는지 알고 싶을 것입니다.이런 작업을 하려면 정규화 함수가 필요합니다. 정규화 함수에서는 입력을 합산해서 연도별 총 여행자 수를 구합니다. 그러고 나서 각 도시의 방문자 수를 전체 방문자 수로 나누어 각 도시가 전체에서 차지하는 비중을 알아냅니다.def normalize(numbers): total = sum(numbers) result = [] for value in numbers: percent = 100 * value / tot..
-
[Python] Tip - 리스트 대신 제너레이터를 반환하도록 하자언어/파이썬 & 장고 2016. 10. 16. 16:58
예를 들어 문자열에 있는 모든 단어의 인덱스를 출력하는 예제를 만든다고 합니다. 다음 코드에서는 append 메서드로 리스트에 결과들을 누적하고 함수가 끝날 떄 해당 리스트를 반환합니다.def index_words(text): result = [] if text: result.append(0) for index, letter in enumerate(text): if letter == ' ': result.append(index + 1) return resultaddress = 'Four score and seven years ago...' result = index_words(address) print(result[:3]) # 결과 # [0, 5, 11] 여기서 index_words 함수에는 두 가지 문..
-
[Python] Tip - 클로저가 변수 스코프와 상호 작용하는 방법 알기언어/파이썬 & 장고 2016. 10. 16. 16:29
숫자리스트를 정렬할 때 특정 그룹의 숫자들이 먼저 오도록 우선순위를 매기는 코드를 작성한다고 가정합니다. 이런 패턴은 사용자 인터페이스를 표현하거나 다른 것보다 중요한 메시지나 예외 이벤트를 먼저 보여줘야 할 때 유용합니다.일반적인 방법은 리스트의 sort 메서드에 헬퍼함수를 key 인수로 넘기는 것입니다. def sort_priority(values, group): def helper(x): if x in group: return (0, x) return (1, x) values.sort(key=helper) numbers = [8, 3, 1, 2, 5, 4, 7, 6] group = {2, 3, 5, 7} sort_priority(numbers, group) print(numbers) # 결과 # [..
-
[Python] Tip - None을 반환하기 보단 예외 발생하도록 처리언어/파이썬 & 장고 2016. 10. 16. 15:12
파이썬 개발자들은 어떤 함수를 작성할 때 반환값 None에 특별한 의미를 부여하는 경향이 있습니다. 예를들어 어떤 숫자를 다른 숫자로 나누는 헬퍼 함수를 생각해보면 0으로 나누는 경우에는 결과가 정의되어 있지 않기 때문에 None을 반환하는게 자연스럽습니다.def devide (a,b): try: return a/b except ZeroDivisionError: return Noneresult = devide(x,y) if result is None: print ("Invalid inputs")위와 같이 코드를 해석할 수 있습니다. 그런데 분자가 0이 되면 반환 값도 0이되어 버립니다. 그러면 if 문과 같은 조건에서 결과를 평가할 때 문제가 될 수 있습니다. 오류인지 알아보려고 None 대신 실수로 F..
-
[Python] UTF-8 BOM 제거 로직언어/파이썬 & 장고 2016. 10. 12. 15:07
import io import chardet import os import codecs def file_convert(filename): convert_filename = ' 변환 파일 명' bytes = min(32, os.path.getsize(filename)) raw = open(filename, 'rb').read(bytes) if raw.startswith(codecs.BOM_UTF8): encoding = 'utf-8-sig' else: result = chardet.detect(raw) encoding = result['encoding'] infile = io.open(filename, 'r', encoding=encoding) data = infile.read() infile.close(..