오늘은 지식in 같은 곳에서 가장 쉽게 접하는 질문 중 하나인 윤년을 계산하는 방법에 대해서 이야기해보자. 사실 코드만 써 놓으면 너무 간단하니까 윤년에 대해 몇 가지 이야기를 좀 해보도록 하겠다. 윤년이란 무엇인가? 1년은 지구가 태양을 한 바퀴도는 것을 일수로 표현한 것으로 우리는 통상 1년 = 365일이라고 알고 있다. 아주 엉뚱한 소리는 아닌데, 실제로 우리가 일상에서 쓰는 1년은 '회귀년'으로 춘분점이 동일한 위치로 돌아오는 데까지 걸리는 시간을 의미한다. 이는 엄밀하게는 365.2422일로 365일 하고도 약 5시간가량이 된다. 이 실제 1년이 365일보다 조금 더 긴 이 차이가 누적이 되어 몇 백 년이 지나면 8월이 한 겨울이 되는 등 실제 계절과 달력이 차이나는 문제가 생긴다. 그래서 지금..
어떤 유한한 집합이 주어지고, 여기에서 랜덤하게 중복없이 n개의 원소를 골라내는 작업을 구현해보자. 가장 간단하게 생각한다면 다음과 같은 알고리듬을 생각할 수 있다. 먼저 골라낼 원소를 가리키는 난수값을 발생시킨다. 1의 난수가 가리키는 집합의 원소를 고른다. 이 때 고르게 된 값이 이전에 뽑은 값과 중복되는지를 체크한다. 만약 한 번이라도 뽑았던 값이라면 버리고, 그렇지 않은 경우 결과에 추가한다. 1~3의 과정을 결과 집합의 크기가 n이 될때까지 반복한다. 로또 번호는 1~45 사이의 범위가 될 수 있기 때문에 random.randint(1, 45)를 통해서 랜덤하게 고를 수 있다. from random import randint result = [] while len(result) < 6: a = ..
행과 열로 이루어진 데이터를 다뤄야 하는 가장 흔한 경우는 DB의 조회 결과를 다루거나 CSV 파일을 다룰 때이다. 이 경우에 각각의 행은 필드값들이 연속된 리스트이며, 전체 데이터 테이블은 개별 행(리스트)이 중첩된 2중 리스트 구조를 갖는다. 하지만 이런 케이스들은 모두 "테이블" 형태의 데이터를 다루고 있다. 즉 대부분의 처리는 각 행 혹은 라인에 대해 반복하면서 특정한 작업을 처리한다. 그러다보니 대부분 그리드 형식의 데이터를 다루는 경우에 아무런 거리낌없이 2중 리스트를 사용하고 있는데, 개인적으로 "테이블" 형식의 데이터가 아닌 단순 그리드에 대해서는 2중 리스트를 사용하는 것을 그리 좋아하지 않는다. 이 글에서는 그리드의 데이터를 단일 리스트를 사용하여 다루는 기법에 대해서 알아보겠다. 그리..
표준입력과 input 함수 지난 글에서 파이썬에서 텍스트 파일을 액세스할 때 파일 핸들러를 만들어서 사용한다고 했고, 파일 핸들러는 내부적으로 TextIOWrapper라는 버퍼 객체라고 했다. input() 내장함수 역시 TextIOWrapper를 사용한다. 대신 열리는 것이 디스크 상의 파일이 아니라 쉘이 제공하는 표준입력이다. TextIOWrapper(name="") 과 같은 식으로 만들어지는 버퍼가 있고, 이 버퍼는 표준입력을 파일로 간주하고 한 줄씩 읽은 결과를 리턴한다. 즉 이 말은 우리는 input() 함수 자체가 파일의 readline()과 비슷하게 동작한다는 것인데, 쉘의 입출력 특성을 사용하여, input() 함수만으로 파일을 읽어들이는 것이 가능하다는 점 시사한다.다만 차이가 있다면 파..
파일 입출력 다루기 어떤 양의 정수들을 입력받고 (예를 들어 0이 입력될 때까지 계속 숫자를 입력 받음) 그 합을 구하는 코드를 작성했다고 생각해보자. 물론 이 프로그램은 매우 간단하게 작성이 될 것이다. 그런데 이 프로그램을 사용할 때를 상상해보자. 합산해야 하는 숫자가 7자리(수백만)숫자 100개 정도된다면, 이를 일일이 키보드로 하나하나 타이핑 하는 것은 매우 번거로운 일일 것이다. 게다가 엔터를 눌러 입력한 후에 숫자가 잘못됐다는 사실을 깨닫는 상황이라면 처음부터 새로 입력해야 하는 아픔이 있을 것이다. 많은 양의 데이터를 일괄적으로 처리하기에 가장 좋은 방법은 입력값을 파일에 저장해 놓은 다음, 이것을 읽어서 처리하는 것이다. 일반적으로 한 개의 레코드를 한 줄에 기록하고 한 줄씩 읽어서 처리하..
CSV 파일은 단순한 텍스트 파일을 데이터 테이블 형식으로 사용하는 포맷이다. 기본적으로 한 행을 1개의 레코드로 사용하며, 개별 필드를 컴마 (혹은 정하기에 따라서는 탭 문자나 임의의 구분자를 사용할 수 있다.)로 구분한다. csv는 기본적으로 플레인 텍스트 파일이기 때문에 텍스트 파일을 읽고 구분자 단위로 쪼개어 각 레코드/필드를 액세스하는 방식으로 처리하는 것도 가능하지만, 이는 제법 귀찮은 여러 작업들을 동반하기 때문에 파이썬 기본 라이브러리에는 csv 파일로부터 필드를 구분하여 읽고 쓸 수 있게 해주는 csv 모듈이 제공된다. 참고로 `csv` 모듈은 텍스트 파일의 내용을 구분자에 따라서 잘라서 제공해주는 것 이상의 역할을 하지 않는다. 각 필드의 값은 모두 문자열이며, 정수 및 실수 값으로 변..
파이썬의 모든 변수는 특정한 객체에 대한 참조이며, 따라서 변수에는 "대입(assignment)"라는 표현을 쓰지 않고, "바인딩(binding)"이라는 표현을 쓴다고 했다. 보통 파이썬의 변수나 값 특성에 대해서 언급하는 내용은 여기까지인데, 파이썬의 구조에 대한 이해를 좀 더 깊이있게 가지기 위해서는 개별 값의 변경 가능성(mutability)에 대해서도 조금 생각해보자. 파이썬 내의 모든 것은 객체라고 했다. 기본적으로 집합의 성격을 가지는 리스트와 사전(그리고 set)을 제외한 모든 기본 객체는 변경 불가능(immutable)하다. 우리가 표면적으로 프로그래밍 언어를 접할 때에는 실제의 값이 변수 뒤에 가려진다고 느끼기 때문에 변수명이 곧 그 값이라는 생각을 하게 된다. 일차적으로 이러한 개념은 ..
리스트 정렬하기 파이썬의 리스트는 .sort() 메소드를 이용해서 정렬할 수 있다. 단, 이 때의 정렬은 제자리 정렬로, .sort() 메소드는 리턴값이 없으며 (리턴값이 없는 파이썬 함수가 늘 그러하듯None을 리턴하기는 한다.) 메소드를 호출한 원본 리스트의 내부 원소들이 순서를 바꾸게 된다. 실제로 메모리 사용량을 극히 제한해야 하는 특수한 상황이 아니라면 제자리 정렬보다는 sorted 함수를 이용한 정렬이 보다 안전하다. (제자리 정렬은 되돌릴 수가 없다.) sorted는 말 그대로 "정렬된" 사본을 만들어주는데, .sort()가 리스트 객체의 메소드라는 한계를 갖는데 비해, sorted함수는 "연속열"을 정렬하는 함수이기 때문에 튜플이나 그외의 반복자등의 연속열을 정렬된 리스트로 만들 수 있다...
- Total
- Today
- Yesterday
- 리눅스
- 정렬키
- 우분투
- jupyter-notebook
- dict
- Lambda
- 리스트
- sorted
- leapYear
- 튜플언패킹
- ipython-notebook
- 반복자
- 파이썬노트북
- iterable
- 파이썬
- globals()
- 파일입출력
- 표준입력
- 이중리스트를 사용하지 않기
- short_circuit
- 복수기준정렬
- 사전
- Python
- locals()
- 변경가능
- 함수형
- python list
- mutability
- 단어 빈도수
- 정렬기준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |