mdn 문서를 읽다가

 

마크업을 구글링하다가

 

마크업 언어 나무위키 페이지에 들어갔다가

 

마크다운 나무위키 페이지에 들어갔다가

 

파이썬의 이스터에그를 찾음

 

재밌는 만화도 찾음

 

굿

 

import antigravity

#웹툰 링크로 이동

import this 

#파이썬의 철학이라고 함

 

 

python의 time 모듈을 불러와 오늘 날짜와 시간을 구하거나 특정 날짜를 불러올 수도 있다. 

KST는 한국 시간 기준으로 UTC보다 9시간 빠르다.

import time

utc = time.gmtime()     # time.struct_time(tm_year=2020, tm_mon=11, tm_mday=4, tm_hour=11, tm_min=12, tm_sec=23, tm_wday=2, tm_yday=309, tm_isdst=0)
kst = time.localtime()  # time.struct_time(tm_year=2020, tm_mon=11, tm_mday=4, tm_hour=20, tm_min=12, tm_sec=23, tm_wday=2, tm_yday=309, tm_isdst=0)

n1 = time.strftime('%c', utc)       # Wed Nov  4 11:12:23 2020
n2 = time.asctime(utc)              # Wed Nov  4 11:12:23 2020
n3 = time.strftime('%c %z', kst)    # Wed Nov  4 20:12:23 2020 +0900
n4 = time.ctime()                   # Wed Nov  4 20:12:23 2020

날짜와 시간을 다루는 데는 여러 가지 방법이 있는데 이건 파이썬 문서를 참고하자.

백준 코드 16430번 문제에서 '서로소'와 '기약 분수'가 나왔다.

예를 들어, 숫자 3과 5가 있을 때 각각의 공약수는 1, 3과 1, 5이다. 이 두 수의 최대공약수는 1이다. 이때 이 두 수의 관계를 '서로소'라 한다.

기약 분수는 1/2, 3/5와 같이 분자와 분모의 공약수가 1 뿐이어서 더 이상 약분할 수 없는 상태의 분수를 말한다.

만약 분수 2/4가 있을 때 이 수의 기약분수는 1/2이다.

파이썬의 math 모듈에는 gcd 함수가 있다. 주어진 두 숫자의 최대공약수를 구한다.

>>>gcd(4, 10)
2

나는 서로소를 이 함수로 검사했다.

while True:
    A, B = map(int, input().split())
    if gcd(A, B) != 1:
        print("A, B는 서로소여야 합니다.")
        continue
    elif A < 1 or B < 1 or A > 10 or B > 10:
        print("A, B는 1에서 9까지의 숫자 중 하나여야 합니다.")
        continue
    else:
        break

그리고 1 - (A / B)의 계산이 소수점으로 나오지 않고 분수로 출력되도록 Fraction으로 분수를 생성했다. 숫자 A와 B는 이미 서로소이므로 더 이상 약분할 필요가 없지만, 만약 서로소가 아닐 경우에도 Fraction 함수로 인해 자동으로 기약 분수로 약분되어 출력한다. 이후 분자와 분모를 따로 출력하기 위해 numerator 프로퍼티(분자)와 denominator 프로퍼티(분모)를 사용했다.

remain = 1 - Fraction(A, B)
print(remain.numerator, remain.denominator)

백준 코드에서 여러 문제들을 풀어보니 모르는 것들을 많이 알게 된다. 또, 검색을 통해 모르는 것을 아는 것으로 만들 수 있게 되었다. 전에는 인터넷에서 방법을 검색해도 그 말을 이해하지 못해서 해결을 못했는데, 조금씩 익숙해지니 이해가 빨라진다. 

백준 코딩 문제를 푸는데 n 줄의 입력을 받을 때 for 문으로 input을 받는 것 말고 다른 방법이 없을까 고민하다가 sys.stdin.readlines() 명령어를 알게 되었다. 이걸 쓰면 사용자가 ^Z(또는 ctrl + z)를 누르기 전까지 입력을 계속할 수 있다. 그런데 파이참에서 실행을 하면 이 키가 먹지 않아서 무한 입력을 해야 하는 상황이 생긴다. 이럴 때는 sys.stdin.readlines() 말고 sys.stdin.readline()을 써서 입력을 원하는 만큼 받을 수 있다. 결국 for문을 써야 하지만 이런 방법도 있다는 것을 알게 되어 좋다. 사실 문제에서는 입력을 받는 게 중요하지 않았지만 그래도 문제를 보면서 여러 가지 상황을 생각해볼 수 있어서 공부하는 데 많은 도움이 되었다.

import sys

def readlines(count):
    result = []
    for i in range(count):
        result.append(*sys.stdin.readline().split())
    return result

print(readlines(3))

그리고 한 줄에 여러 문자를 받아서 각각 넘기고 싶으면 .split()을 사용한다. 괄호 안에 아무것도 쓰지 않으면 공백을 기준으로 값을 나누고, 괄호 안에 문자를 넣으면 그 문자를 기준으로 값을 나눈다.

>>>text = "It's a text, not a code."
>>>result = text.split()
>>>result
["It's", 'a', 'text,', 'not', 'a', 'code.']

>>>result = text.split(",")
>>>result
["It's a text", ' not a code.']

또한 문자 좌우의 공백을 제거하는 메소드도 있다. 오른쪽 공백을 제거하려면 rstrip(), 왼쪽은 lstrip(), 양쪽은 strip()이다.

만약 여러 줄로 값을 받았을 경우 아래와 같이 줄바꿈 문자가 포함된 채로 값을 받는다.

1
2
3
['1\n', '2\n', '3\n']

이 때 sys.stdin.readline().rstrip()이나 sys.stdin.readline().strip()을 사용해서 받으면 공백 문자가 사라진다.

1
2
3
['1', '2', '3']

이걸 만약 ssys.stdin.readline().split()으로 공백을 기준으로 나눠 받으면?

1
2
3
[['1'], ['2'], ['3']]

리스트로 저장되므로 *sys.stdin.readline().split()으로 입력을 풀어서 받아도 되지만 그냥 위의 방법을 쓰는 게 좋다.

 

+덧

 

그리고 input()과 raw_input()이 있다는 걸 알았다. 이전 버전에서는 input()이 raw_input()을 evaluate 한 값이어서 input()의 속도가 느렸고 출력되는 값도 달랐다. 그 때문에 raw_input()이나 sys.stdin 명령어를 쓰는 일이 있었다고 한다. 그런데 내가 쓰는 파이썬 3.7에는 raw_input()이 사라졌고 input()만 있다. input()은 더이상 evaluate를 한 값을 돌려주지 않는다. 이전 버전에서의 raw_input()의 기능을 지금 버전의 input()이 하는 거구나 하고 이해했는데, 맞으려나?

우테코 코딩 테스트를 준비하며 아직 잘 모르는 javascript보다 python으로 온라인 코딩 테스트를 보는 게 낫지 않을까 생각해서 다시 python을 복습하고 있다. 객체 지향에 관해 내가 보고 있는 책(게임으로 배우는 파이썬)에서는 역시나 클래스와 객체의 관계를 붕어빵 틀과 붕어빵으로 설명하고 있다.

 

예전에 이 개념이 잘 이해가 안 가서 인터넷으로 검색해봤는데, 클래스와 객체의 관계는 붕어빵 틀과 붕어빵이 아니라는 글을 보고 이해가 갔다. 그런데 오늘 다시 그 글을 보니 이해가 바로 안 되더라. 그 글에서는 클래스는 붕어빵 틀이 아니라 붕어빵 공장이라고 했다. 객체는 '실체'라는 것을 강조했다. 

 

곰곰이 생각해보니 객체는 실체이며 클래스는 실체가 아니라는 것, 따라서 붕어빵 틀은 실체이므로 그 비유가 잘못되었다는 말이라는 생각이 들었다. 배민 문방구 제품을 예로 들어보자.

 

배민 문방구에는 현재 세 가지 종류의 파일이 있다. 흰 바탕에 검은색 글씨가 프린트 되어 있다는 점은 똑같다. 다른 것은 프린트된 글씨의 내용이다. 여기서 '불투명한 재질'이며 '오른쪽으로 열린다'는 것, 크기는 'A4 사이즈'이고 '흰 바탕'에 '검은색 글씨'가 있다는 것이 배민 문방구 파일에 대한 약속이다. 파일을 만드는 공장에서는 이 약속에 따라 '아- 보람차다'라고 쓰인 파일과, '까먹지 말자'라고 쓰인 파일, '선생님 감사해요'라고 쓰인 파일을 만들었을 것이다. 이 세 가지 파일이 바로 클래스(약속)로 만들어진 객체다. 

 

그러므로 나는 클래스는 붕어빵 틀도 아니며 붕어빵 공장도 아니라고 말하고 싶다. 클래스는 '약속'이다. 이런 이런 조건으로 물건을 만들겠다고 정한 내용이 클래스며 그 정한 내용으로 만든 실체가 객체다.

+ Recent posts