분류 전체보기
-
[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..
-
[SQL] Union과 Union all 차이DB 2016. 10. 12. 15:27
먼저 각 데이터베이스마다 다르겠지만 여기서는 postgresql 기준으로 설명하겠습니다.UNION집합 연산은 다음처럼 두 가지가 있습니다.UNION ALLUNION DISTINCT일반적으로 사용하는 UNION은 UNION DISTINCT의 줄임입니다.UNION ALL과 UNION DISTINCT의 차이UNION ALL은 중복을 제거하지 않고 그대로 합집합 연산을 해 결과를 보여주는 반면, UNION DISTINCT는 중복을 제거하여 결과를 보여줍니다.여기서 중복을 처리하는 기준이 무엇인지 다음과 같은 질문이 발생합니다.primary key전체 테이블의 모든 필드select 절에서 나오는 튜플에 대한 필드 여기서 UNION은 이미 SELECT된 결과를 가지고 UNION하기 때문에 SELECT되기 전의 테이..
-
[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(..
-
유니코드 BOM(Byte Order Mark)공부 2016. 10. 12. 15:02
BOM이란BOM이란 문서 맨 앞에 눈에 보이지 않는 특정 바이트(byte)를 넣은 다음 이것을 해석해서 정확히 어떤 인코딩 방식이 사용되었는지 알아내는 방법을 나타냅니다. 자세하게 유니코드가 little-endian 인지 big-endian 인지 아니면 UTF-8 인지 쉽게 알 수 있도록, 유니코드 파일이 시작되는 첫부분에 보이지 않게, 2~3바이트의 문자열을 추가하는데 이것을 BOM이라고 합니다. BOM은 텍스트 에디터 화면에서는 보이지 않고, 헥사 에디터(Hex Editor)*로 열었을 때만 보입니다.BOM의 종류인코딩 방식Byte Order Mark(BOM)UTF-8EF BB BFUTF-16 Big EndianFE FFUTF-16 Little EndianFF FEUTF-32 Big Endian00 ..
-
[Golang] 한글을 포함한 문자열 길이 자르기언어/Golang 2016. 10. 12. 14:24
한글 단어 길이를 제한을 두어 제한치를 넘어가는 글자를 자르는 함수를 설명하겠습니다.링크 에서 설명한 것과 같이 GO에서 len()함수는 byte기반으로 동작하기 때문에 한글은 3바이트 씩 계산됩니다.아래와 같이 한글+숫자+영어가 섞여있는 문자열에서 글자 제한을 20자로 두어 그 이상 넘어가면 삭제하는 함수를 설명하겠습니다. func main() { vals := "가나다라마바사1234567890abcd" } 먼저 한글을 바이트로 변환시키면 다음과 같은 리스트를 볼 수 있습니다.func main() { vals := "가나다"b := []byte(vals) fmt.Println(b) } # [234 176 128 235 130 152 235 139 164]하나의 숫자 당 1byte로 한글은 3바이트이기 ..
-
[Golang] 전각문자(double byte)를 반각문자(single byte)로 변경언어/Golang 2016. 10. 12. 13:41
//전각문자(특수문자 등)과 같은 기호들을 일반 문자(반각문자)로 변경 func convertHalfwidth(str string) string { b := []byte(str) idx := 0 var buffer bytes.Buffer dataLength := utf8.RuneCountInString(str) for i := 0; i = 0xfee0 { val = val - 0xfee0 //특수기호 공백은 아래와 같이 다른 코드값을 가지므로 하드코딩 } e..
-
[Golang] 슬라이스 데이터 삭제 및 자리 시프트 바로 실행언어/Golang 2016. 10. 12. 13:39
슬라이스는 배열과 달리 크기가 동적이고 길이가 고정되어 있지 않아 아래의 방식이 가능하지만 배열의 경우 에러가 납니다.2개 이상의 데이터가 슬라이스에 존재한다고 가정하고 중간 데이터를 삭제를 하면 슬라이스의 중간에 빈 값이 존재하게 됩니다. 이러한 경우에 삭제한 데이터 뒤에 존재하는 데이터들을 앞으로 시프트 하는 방법을 아래 예시를 통해 설명하겠습니다.예) [32, 29, 78, 16, 81]의 데이터를 가지는 슬라이스에서 78번을 삭제한 다음, [16, 81]을 앞으로 한 칸씩 당겨야 하는 경우1. [32, 29, 78, 16, 81] - 78 삭제 2. [32, 29, null, 16, 81] - 78자리에 빈 값존재3. [32, 29 16, 81] - 이와 같이 삭제된 인덱스 다음 인덱스들의 자리를..