본문 바로가기

python58

python 표준 출력 표준 오류 파일로 저장 import sys log = open('log.log', 'at') sys.stdout = log sys.stderr = log print(1) print(1/0) 결과물 단 이렇게 하면 코드 실행 중에는 print 출력을 못 본다. 오로지 코드 실행이 다 끝나고 나서야 log.log 파일을 통해 출력과 오류를 볼 수 있다. 파이썬 코드 자동화로 돌려놓고 다른 일 하러 간다든지 어차피 print 출력을 못 보는 상황이고 코드 실행이 끝나고 나서 검토를 해야 하는 상황이면 저렇게 하는 것이 좋다. 2021. 4. 18.
dictionary changed size during iteration 해결 방법 my_dict = { 'a':1, 'b':2} for key, value in my_dict.items(): my_dict[key+'2'] = value + 1 print(my_dict) # 결과 # Traceback (most recent call last): # File "0.py", line 5, in # for key, value in my_dict.items(): # RuntimeError: dictionary changed size during iteration my_dict = { 'a':1, 'b':2} for key, value in list(my_dict.items()): my_dict[key+'2'] = value + 1 print(my_dict) # 결과 # {'a': 1, 'b':.. 2021. 4. 18.
정확한 값 보기 a = '1234' b = '1234 ' c = 1234 print(a) print(b) print(c) 위 파이썬 코드를 실행시켜보자. 1234 1234 1234 가 나올 것이다. str과 int가 구분이 안 되지 않는가? 그리고 같은 str끼리도 공백은 눈에 보이지 않으니 구분할 수가 없다. 그럼 어떻게 값을 정확하게 볼 수 있는가? 1. 리스트 안에 넣기 a = '1234' b = '1234 ' c = 1234 print([a, b, c]) 결과: ['1234', '1234 ', 1234] 타입과 공백을 명확하게 구분할 수 있다. 2. repr 함수 이용하기 a = '1234' b = '1234 ' c = 1234 print(repr(a)) print(repr(b)) print(repr(c)) 결과.. 2021. 4. 18.
실행 순서 구분 1번째 코드 from threading import Thread import time def f(): global a a = 1 thread = Thread(target=f) thread.start() a = 2 time.sleep(1) print(a) # 출력 결과 2 위 코드를 순서대로 분석해보자. (1~2) 모듈 불러오기 (3~5) 함수 f는 전역 변수 a에 1이라는 값을 넣는다. (6~7) 함수 f를 target으로 정한 thread를 시작한다. (8) 그리고 전역 변수 a에 2라는 값을 넣는다. (9~10) 1초 쉰 다음, 전역 변수 a에 무슨 값이 담겨졌는지가 출력된다. 마지막에 1초를 쉬는 이유는 스레드가 실행되는 시간을 충분히 기다리기 위함이다. 2번째 코드 from threading im.. 2021. 4. 18.
khopenapi try except문 주의할 점 내가 실행하고 싶은 모든 코드를 main 함수에 담고 그 함수를 실행시키는 코드를 try문에 담았음에도 except문은 실행되지 않는다. 왜 그런지 잘 모르겠지만 추측해보자면... _event_OnReceiveRealData는 내가 실행시킨 것이 아닌, Kiwoom API에서 이벤트를 일으켰기 때문인 것 같다. 즉 내가 실행한 함수나 내가 생성한 객체에서 발생한 예외가 아니면 try문은 내 알바 아니야 하면서 지나간다는 것이다. 해결 방법은 아마 이벤트를 connect해 놓은 함수에다 똑같은 try except문을 박아넣으면 되긴 할 텐데 그걸 모든 함수에다 일일히 박아넣을 생각하니까 귀찮기도 하고 지저분해 보일 것 같기도 하다. 사실 에러를 발생시키지 않도록 코드를 짜는 것이 최선이긴 하다... 그게 .. 2021. 4. 18.
유예 코드 import datetime while True: now = datetime.datetime.now() h = now.hour m = now.minute hm = h, m if (12, 30) 2021. 4. 18.
컴퓨터 얼마나 켜졌는지 보기 파이썬에서 time.monotonic() 을 하면 컴퓨터 부팅 시간으로부터 지금까지의 시간이 반환된다. 참고로 절전 모드로 꺼도 시스템 종료로 끈 게 아니면 time.monotonic()의 값은 계속 늘어난다. 2021. 4. 18.
py를 exe로 바꾸는 건 비효율적인 것 같다. 창 아래에 Ready{프로그램을 실행시킨 시간(초)}를 표시하는 파이썬 코드를 만들었다. 그 외엔 아무 기능도 없다. asdf.exe는 그 파이썬 코드를 하나의 exe 실행 파일로 만든 것이다. 크기는 22MB이다. 그리고 실행할 때 7초 정도 걸린다. ​ 마인크래프트 스킨을 만드는 프로그램인 MCSkin3D는 모든 파일의 용량을 다 합해도 8MB이다. 그리고 실행할 때 4초 정도 걸린다. ​ 아무리 봐도 py를 exe로 만드는 건 비효율적인 것 같다. 배포판을 만들려면 다른 언어를 배워야 할 필요가 느껴진다. 그게 아니면 모든 사람의 컴퓨터에 파이썬을 깔든지... 2021. 4. 18.
python path 환경 변수 편집 C:\python39랑 C:\python39\Scripts는 파이썬 설치할 때 path 등록 옵션에 체크하면 자동으로 등록되는 거고 C:\python39\Lib는 Pylance가 pip로 설치한 모듈을 인식을 못 했을 때 등록해 주면 된다. 2021. 4. 18.
반복에 대한 효율성 비교 a라는 함수를 5번 반복하고 싶을 때. a() a() a() a() a() for x in range(5): a() for x in [0]*5: a() 이렇게 세 가지 방법이 있다. 두 번째 방법이 압도적으로 많이 쓰일 것이고 세 번째 방법은 아마 나 말고 아무도 안 쓸 것 같다. 그런데 글자 수를 비교해보면, range(5)를 쓰는데 8글자를 써야 하는 반면, [0]*5를 쓰는데는 5글자가 끝이다. [0]*5에 띄어쓰기를 포함해서 [0] * 5 로 쓴다고 하더라도 7글자여서 여전히 range(5)보다 짧다. 물론 for문의 x가 index를 의미해야 하는 상황이라면 당근빠따로다가 두 번째 방법을 채택하는 게 맞겠지만 그냥 단순히 5번 반복만 하고 싶으면 세 번째 방법을 쓰는 것이 글자 수를 조금이라도 .. 2021. 4. 18.