Difference between revisions of "파이썬"

Jump to navigation Jump to search
4,421 bytes removed ,  08:20, 18 April 2020
no edit summary
 
(21 intermediate revisions by 9 users not shown)
Line 1: Line 1:
{{Template:바로가기}}
{{Template:바로 가기}}
<div style="float: right; margin-left: 12px">__TOC__</div>
<div style="float: right; margin-left: 12px">__TOC__</div>
= 개요 =
= 개요 =
[[파이썬]]([[Python]])은 [[프로그래밍 언어]]의 일종이다. 창시자는 [[귀도 반 로섬]]([[Guido van Rossum]])이다. 네덜란드어 발음으로 [[히도 판 로쉼]]이다. 1989년 크리스마스 주에 연구실은 닫혀있고 심심해서 만들었다. 귀도가 즐겨 보던 영국의 6인조 개그 그룹 [[몬티 파이선]]([[Monty Python]])에서 이름을 땄다. [[귀도 반 로섬]]은 [[구글]]에 입사했다가 2012년 12월 7일부로 [[드랖박스]]([[Dropbox]])로 [[이직]]했다. 한 [[헤드헌터]]로부터 경력직 파이썬 개발자 취업 제안을 받은 적도 있다고 한다. 즉, 파이썬 창시자에게 파이썬 '경력직' 개발자를 구하는 수준의 메일을 보낸 것(...). https://plus.google.com/115212051037621986145/posts/R8jEVrobbRj ~~면접관: 파이썬 어느정도 하시나요? 귀도: '''제가 만들었는데요'''.~~
[[파이썬]]([[Python]])은 [[프로그래밍 언어]]의 일종이다.




[[Java]], [[C language]], [[C++]], [[Python]], [[C#]]이 전세계에서 가장 많이 쓰이는 다섯 개의 [[프로그래밍 언어]]이다.
[[자바]]([[Java]]), [[C 언어]]([[C language]]), [[C플플]]([[C++]]), [[Python]], [[C#]]이 전세계에서 가장 많이 쓰이는 다섯 개의 [[프로그래밍 언어]]이다.


[[C샾]]은 [[마이크로소프트]]에서 만들었다. 거의 [[Apple]]용으로만 쓰이는 [[Objective-C]]처럼 C#도 거의 [[Microsoft]]용으로만 쓰인다. [[오브젝티브-C]]는 [[C 언어]] 파생 언어 중 하나이다. C#을 제외한 [[자바]], [[C 언어]], [[C플플]], 파이썬은 [[리눅스]], [[안드로이드]], [[맥OS]], [[아이OS]]([[iOS]]), [[윈도우즈]] 등 [[운영 체제]]를 가리지 않고 다양한 개발에 쓰인다.
[[C샾]]은 대부분 [[마이크로소프트]]용으로만 쓰이고, [[오브젝티브-C]]([[Objective-C]])거의 [[애플]]용으로만 쓰인다.


Python은 구글의 3대 개발 언어 중 하나로 알려져 있다. 나머지 2개는 [[C++]]과 [[Java]]이다. 하지만 최근에 [[Go]]로 넘어가려는 움직임이 보인다 [[카더라]]. [[구글]]은 [[C 언어]]와 비슷한 [[Go 언어]]([[Go language]])와 [[Java]]와 비슷한 [[코틀린]]([[Kotlin]])을 공식 언어로 지정하여 사용하고 있다. [[애플]]은 [[Objective-C]]에서 [[스위프트]]([[Swift]])라는 Objective-C와 호환되는 새로운 언어로 주력 언어를 변경 중이다.




[[루비]]([[Ruby]])라고 파이썬과 유사한 프로그래밍 언어가 일본에서 만들어졌다. 루비도 세계적으로 꽤 많이 쓰인다.
[[프로그래밍]]을 배우기 전에 [[찰스 펫졸드]]의 [[코드]]라는 책을 읽어보기를 추천한다. 영어판은 [[구글]]에 charles petzold code pdf라고만 쳐도 pdf 파일이 나오며, [[한국어]]판은 [[도서관]]에서 빌리거나 사서 봐야 한다.


* [Book] CODE 코드
https://blog.outsider.ne.kr/1053


[[안드로이드]]의 경우 [[플레이 스토어]]([[Play Store]])에서 SoloLearn에서 만든 Learn Python같은 [[앱]]([[app]])을 설치하여 파이썬 프로그래밍을 배워도 좋다. 지금은 여러 잡다한 프로그래밍 학습 앱이 "SoloLearn: Learn to Code for Free" 하나로 합쳐져서 Learn Python 대신에 새로 나온 앱을 깔아야 한다.
* 찰스 펫졸드의 코드:CODE
https://freesearch.pe.kr/archives/2406




[[프로그래밍]]을 배우기 전에 [[찰스 펫졸드]][[코드]]라는 책을 읽어보기를 추천한다. 영어판은 [[구글]]에 charles petzold code pdf라고만 쳐도 pdf 파일이 나오며, [[한국어]]판은 [[도서관]]에서 빌리거나 사서 봐야 한다.
[[리눅스]]는 파이썬 2와 3가 기본으로 깔려있으며 [[윈도우즈]]는 별도로 깔아야 한다. 윈도우즈의 경우 처음 설치할 때 Install Now와 Customize installation이 뜨는데 Install Now를 눌러 pip가 자동으로 같이 설치되게 한다. pip를 깔아야 파이썬 모듈을 간편하게 설치할 수 있다. 그리고 아래의 Add Python 3.6 to PATH에 체크하여 [[명령 프롬프트]] 내에서 어디에 있든지 python이라는 명령어만 입력하여 파이썬을 실행할 수 있게 한다. 이걸 체크하지 않고 파이썬을 실행하려면 반드시 C:\Users\username\AppData\Local\Programs\Python\Python36-32 폴더로 이동해야 한다.


* [Book] CODE 코드
https://blog.outsider.ne.kr/1053


* 찰스 펫졸드의 코드:CODE
[[디렉터리]]([[directory]]) 구분은 [[리눅스]]([[Linux]]), [[비에스디]]([[BSD]]), [[맥OS]]([[macOS]]) 등 [[유닉스]]([[Unix]]) 계열에서는 [[슬래시]]([[slash]]) 기호 /로 하고, 한글 [[윈도우즈]]([[Windows]])에서는 [[백슬래시]]([[backslash]]) 기호 \나 [[원화]] 기호 ₩로 한다. [[폴더]]([[folder]])는 [[그래픽 사용자 인터페이스]]([[GUI]])를 가진 [[운영 체제]]([[OS]])에서 디렉터리 대신에 부르는 말이다.
http://freesearch.pe.kr/archives/2406




= 언어 구현 =
보통 말하는 Python은 [[C 언어]]로 구현되었으며, 다른 구현체와 구분하여 언급할 때에는 [[CPython]]이라고 표기한다.


CLR [[바이트코드]]로 구현된, [[닷넷 프레임워크]] 위에서 동작하는 IronPython, CPython에서 C 스택을 없앤 Stackless Python, JVM 바이트코드로 구현되어 JVM 위에서 돌아가는 Jython, 파이썬 자체로 구현된 [[PyPy]] 등이 있으며 이 가운데 오리지날은 CPython이다. 이전 버전 문서에는 C#으로 구현된 Ironpython, Java로 구현된 Jython이라고 되어있었으나 이는 명백한 오류다. Jython이 JVM 바이트코드가 아니라 Java로 구현된거라면 안드로이드 Dalvik VM에서는 왜 안돌아간다고 생각하는가?
[[프로그래밍]], [[트킨터]] ([[Tkinter]]), [[팬더즈]] ([[pandas]]), [[뷰티펄 숲]] ([[Beautiful Soup]]), [[파이게임]] ([[Pygame]]) 문서 참조.


파이썬 창시자 [[Guido van Rossum]]이 다니는 [[Dropbox]]에서 [[파이썬]]을 프론트엔드로 하고 [[LLVM]]을 백엔드로 사용하는 [[Pyston]]이란 [[JIT]] 기반 파이썬을 개발하였다. https://github.com/dropbox/pyston


LLVM(이전 이름: Low Level Virtual Machine)은 컴파일러의 기반구조이다. 프로그램을 컴파일 타임, 링크 타임, 런타임 상황에서 프로그램의 작성 언어에 상관없이 최적화를 쉽게 구현할 수 있도록 구성되어 있다.
= SoloLearn =
[[안드로이드]] [[스마트폰]] 사용자의 경우 [[플레이 스토어]]([[Play Store]])에서 SoloLearn에서 만든 [[Learn Python]]같은 [[앺]]([[app]])을 설치하여 파이썬 프로그래밍을 배워도 좋다. 지금은 여러 잡다한 프로그래밍 학습 앱이 "SoloLearn: Learn to Code for Free" 앺 하나로 합쳐져서 Learn Python [[앺]] 대신에 새로 나온 [[SoloLearn]] [[앱]]을 깔아야 한다. 사실 아직도 LearnPython을 설치해서 사용할 수는 있다. 하지만 나중에 추가된 깊이 있는 내용은 SoloLearn에만 추가되므로 그냥 SoloLearn [[app]]을 까는 게 낫다.


한편 [[중국]]에서는 Chinese Python이라는, 중국어 문법으로 한자를 쳐서 돌아가는 언어를 개발했다.


== PyPy ==
본격 Python으로 직접 구현되는 Python. 언뜻 보면 CPython보다 느릴 것 같지만 실제로는 더 빠른 실행결과도 보여주는 흠좀무한 녀석이다. 어떠한 외계의 기술이 적용되어서 이것이 가능한지는 [[파이파이]]([[PyPy]]) 문서를 참조하라.


* #11316 2019-5-6 오후 9:28 [삭제]
폰겜할 시간에 solelearn깔아서 파이썬 배워보고 있는데 이거 끝내면 그냥 딱 입문 수준인거지? 지금 계산기까지 했음


2007년에 처음 발표된 [[Python]]의 언어 구현 중 하나로, [[C]]로 짜인 기존의 CPython과 달리 '''Python으로 Python을 만드는 프로젝트'''이다. [[부트스트래핑]]이라고 한다. 여기까지 얘기하면 뭔가 이상한 짓 하는 프로젝트 내지 실험적인 프로젝트처럼 느껴지겠지만, 이 프로젝트의 진짜 놀라운 점은 기존 CPython보다 전혀 느리지 않을 뿐더러, '''오히려 성능면에서 CPython을 능가하고 있다는 거다.''' 나아가 http://speed.pypy.org/ 에서 보이는 대로, '''계속해서 빨라지고 있다!'''
   
1: sole->solo    [삭제] 2019-5-6 오후 9:29


표준 구현인 CPython과의 속도비교. http://speed.pypy.org/ PyPy를 개발하면서 지속적으로 업데이트 하고 있다.
   
2: [[SoloLearn]] 끝까지 다 끝내면 파이썬 기본 [[프로그래밍]] 방법은 다 배운 거임. 그 다음에는 [[Django for Beginners]]같은 걸로 [[웹 프로그래밍]] 배우면 됨.     [삭제] 2019-5-6 오후 10:20


   
3: >2 그리고 [[마약]] 거래 [[싸이트]]든, [[페도]] 싸이트든 만들어서 [[돈]] 벌면 됨. 그 전에 [[코챈]]같은 거 만들어서 연습도 좀 하고.    [삭제] 2019-5-6 오후 10:21


이 구현은 애초에 그저 장난질 하려고 시작한 프로젝트가 아니다. [[Psyco]]( http://psyco.sourceforge.net/ )라고 하는, 기존 파이썬 위에다가 [[JIT]]([[Just-In-Time]]) [[컴파일]]을 구현해서 실행성능을 높히는 프로젝트가 있었는데, 이걸 개발하던 [[Armin Rigo]]( http://codespeak.net/~arigo/ )라는 사람이 아예 JIT 컴파일을 하는 파이썬을 처음부터 다시 구현하기로 생각했다. 그래서 2003년부터 PyPy 개발을 시작하여 [[유럽연합]]의 연구자금 지원을 받아가며 지금도 개발하고 있다.
   
4: >3 [[웹싸이트]] [[보안]][[리눅스 마스터]][[정보 보안 기사]] 공부 좀 해보든가    [삭제] 2019-5-6 오후 10:23


2017년 8월 기준으로, PyPy3는 윈도우 바이너리가 없으므로 리눅스 바이너리를 실행시켜야 한다. 윈도우 10이라면 1주년 업데이트에 포함된 리눅스 배시 기능을 쓰거나, 윈도우로 리눅스 어플리케이션을 돌리는 프로그램을 이용할 수도 있다.
   
5: >4 [[사이버 수사대]]한테 털리면 [[좆]]되니까    [삭제] 2019-5-6 오후 10:34


=== 어떻게 구현하나 ===
   
[[기계어]][[컴파일]]하지 않고 기껏해야 인터프리팅 성능을 빠르게 하기 위해 [[스크립트]]만을 쓰는 [[파이썬#s-2|Python]]을 가지고 파이썬으로 돌리는 파이썬을 어떻게 만들었을까. PyPy의 접근법은 이렇다.
9: >2 [[Django Girls]][[웹 프로그래밍]] 입문자용으로 볼만함    [삭제] 2019-5-6 오후 11:33


1. 먼저 RPython이라고 하는, 파이썬 문법을 엄격하게 만들어 컴파일이 되게 만든 해석기(translate.py)를 Python 코드로 작성한다. RPython는 Python의 일부만 구현한 언어(부분 언어)이기 때문에 모든 RPython 코드는 Python 코드이기도 하다. (반대는 성립하지 않는다.)


2. RPython의 효과적인 컴파일을 위해 다른 언어로 툴체인을 만든다. [[시뮬레이터]][[에뮬레이터]]를 제작하는 때에도 이 과정을 반드시 거친다.
16: >7 파이썬 [[프로그래밍]]의 응용을 배우려면 [[트킨터]], [[팬더즈]], [[뷰티펄 숲]], [[파이게임]] 문서 읽고 따라해봐라.     [삭제] 2019-5-7 오전 2:59


3. Python 구현(런타임)을 RPython 문법으로 작성한다.
   
8: 폰겜은 해도 남는 게 없지만, [[프로그래밍]]은 배워놓으면 두고두고 써먹지 ㅋㅋㅋ    [삭제] 2019-5-6 오후 11:28


4. 3에서 만든 구현을 1 또는 2에서 만든 RPython 해석기로 컴파일한다.
   
10: [[댓글]] 달아준 [[게이]]들 전부 고맙다    [삭제] 2019-5-6 오후 11:50


5. 4으로 만든 후보를 이전 또는 다른 구현과 비교(성능 측정), 만족스럽지 않으면 수정한다.(nightly builds)
   
11: >10 [[일베충]]은 나가 죽어라. [[김대중]] 만세! [[노무현]] 만세!! [[문재인]] 만만세!!!    [삭제] 2019-5-7 오전 0:10


6. 5에서 만족스러운 결과를 냈다면 출시하고 1 또는 2부터 다시 시작한다.(release)
   
12: >11 [[이승만]] [[전쟁]] 나자 [[서울]] 사수한다고 방송 틀어놓고 한강철교 끊고 도망간 새끼. [[박정희]] 위계를 이용한 [[여대생]], [[여가수]], [[여자 탤런트]] [[강간마]] 새끼. [[전두환]] [[부산 형제복지원]] 대량 [[납치]] 및 [[살인]] 지시한 새끼.    [삭제] 2019-5-7 오전 0:45


~~뭔가 속는 느낌이지만~~ 처음 한번만 기존 파이썬의 도움을 받으면 그 다음부터는 스스로 만든 구현으로 저 과정을 자체적으로 계속 반복할 수 있다. 이게 얼핏 보면 '닭이 먼저냐 달걀이 먼저냐' 같은 것으로 착각할 수도 있지만, 이런 식의 접근법은 실제로 프로그래밍 언어를 제작할 때 해당되는 사항이며, 더 좋은 장비의 개발을 위해 기존의 장비를 사용하는 것과 다름이 없다. 일례로 유명 c/c++언어 컴파일러인 gcc도 c/c++로 작성되었다. 파이썬이 스크립팅 언어이기 때문에 일견 특이해보이는 것일 뿐, 인터프리터는 어짜피 컴파일된 상태로 돌아가므로 같은 원리다. 이러한 이유로 로고가 [[우로보로스]]인 셈. 다만 PyPy는 문자 그대로 '''[[진화]]'''하고 있다.
   
13: >12 [[박정희]], [[전두환]] 때는 대통령 아니라 고위 공직자 중에 [[여자 연예인]] 따먹은 사람들 많은데. [[계엄령]]이니 뭐니 해서 공포 정치 [[독재]] 정치 시기라 잡아온 다음에 [[강간]]하고 돌려보냄. [[처녀]] [[연예인]]이든, [[유부녀]] 연예인이든. 그래도 어디 가서 [[]]도 못함.     [삭제] 2019-5-7 오전 0:51


사실 이런 식으로 어떤 언어로 자기 자신을 구현하는 것을 '''부트스트래핑'''(Bootstrapping) 또는 '''부팅'''(Booting. 운영체제의 부팅과 같은 어원이다.)이라고 하는데, 사실 이렇게 하는 이유는 처음부터 작업하는 것보다 생산성에서 낫기 때문이다. 처음부터 [[어셈블리어]]로 작업하면 [[이론상 최강]]의 성능을 발휘할 수는 있으나 그 가능성은 매우 낮고 생산성도 최악이다. [[최적화]]가 그래서 힘들다. 이 때문에 대부분의 [[프로그래밍 언어]]도 초창기에는 어셈블리어나 다른 고급 언어의 도움을 받지만, 일정 단계를 넘어서면서 한계가 오면 스스로의 컴파일러/인터프리터를 제작하게 된다. Haskell 컴파일러인 GHC와 C/C++ 컴파일러인 GCC가 대표적인 예. 물론 생산성에 중점을 두기 때문에 성능이 눈에 띄게 빨라지는 일은 잘 드러나지 않으며, 단지 우연한 발견 등 여러 이유로 성능이 향상되는 것 뿐이다. PyPy의 경우 Python의 한계를 극복하기 위해 정적인 컴파일이 가능한 RPython을 따로 만들었고 뒤에도 언급할 듯 성능 향상을 위해 '''7년이라는 긴 세월'''을 소모했는데, 이것도 어셈블리어로 처음부터 하는 것보다는 짧은 것이다. 컴퓨터 하드웨어의 발전도 마찬가지다. 처음 IC나 LSI를 설계할 때는 레이아웃을 손으로 그렸지만, 지금 나오는 칩들은 손으로 하기에는 회로의 규모가 지나치게 크기 때문에 전부 CAD로 개발하고 있다. 사실 이러한 일은 망치를 만들기 위해 망치를 쓰거나 간석기를 만들기 위해 뗀석기를 썼던 것 처럼 '''인류의 역사를 대표하는 방법론''' 중 하나이므로 전혀 속는 느낌 가질 거 없다.
   
14: >13 그래도 [[이승만]] 시절보다 좋아진건데. 이승만 때는 아예 [[살해]]되는 경우도 많았음. [[나라]]가 혼란하던 시기라 [[공산당]] 협력자로 몰아서 [[마을]] 하나 통째로 [[총살]]시키는 경우도 많았음. [[조사]] 과정이든 [[학살]] 과정이든, 그 과정에서 [[강간]]이야 수없이 일어났고.     [삭제] 2019-5-7 오전 0:53


http://55adq4ncecjgxfymv4tdl54g4t2dayqju65wgqpik67suvtiz67kpzad.onion/p?id=11316


= 특징 =
= 특징 =
[[파이썬]]은 [[객체 지향 프로그래밍]]([[object-oriented programming]]) 언어에 속한다. 객체 지향 프로그래밍 전에 [[절차적 프로그래밍]]([[procedural programming]]) 언어가 먼저 개발되었다. 절차적 프로그래밍 언어에서 [[구조적 프로그래밍]]이 나왔다. 현재는 [[절차적 프로그래밍]] 언어에도 [[객체 지향 프로그래밍]] 개념이 포함되어있다.
[[파이썬]]은 [[객체 지향 프로그래밍]]([[object-oriented programming]]) 언어에 속한다. 객체 지향 프로그래밍 전에 [[절차적 프로그래밍]]([[procedural programming]]) 언어가 먼저 개발되었다. 절차적 프로그래밍 언어에서 [[구조적 프로그래밍]]([[structured programming]])이 나왔다. 구조적 프로그래밍은 [[구조화 프로그래밍]]으로도 불리며 [[프로그래밍 패러다임]](programming paradigm)의 일종인 절차적 프로그래밍의 하위 개념으로 볼 수 있다.
 
 
[[객체 지향]]을 배울때 추천할만한 언어이다. 많은 대학들이 C++ 환경에서 가르치지만, 이경우 필요한 객체를 만들어서 쓰는 실습이 많은데 대부분 이미 존재하는 객체를 가져다 쓴다는 개념을 이해하지 못하는 경우가 많다. STL을 쓰면 달라지지만 실습에서 STL을 요구하는 문제가 나오는 경우도 드믈고 주로 사용되는 문자열 변환, 배열 관련 연산 등은 파이썬에서 따로 임포트할 필요없이 자료형 자체가 이미 클래스로서 편리하게 클래스 함수를 던져주기 때문에, 클래스의 재활용이라는 측면을 훨씬 이해하기 쉽다. 무엇보다 하루면 다 배울 수 있는 언어이기도 하고. 예전에는 한국을 포함하여 대부분의 대학들이 C++이나 Java 같은 실제 회사에서 많이 쓰는 언어 위주로 수업을 개설했으나, 미국대학들은 개론 수업 언어를 Python으로 옮겨가는 추세이다. [[UC 버클리]] 컴퓨터과학 개론수업인 CS 61A 를 인터넷 강의로 들어보자!


객체 지향을 배울때 추천할만한 언어이다. 많은 대학들이 C++ 환경에서 가르치지만, 이경우 필요한 객체를 만들어서 쓰는 실습이 많은데 대부분 이미 존재하는 객체를 가져다 쓴다는 개념을 이해하지 못하는 경우가 많다. STL을 쓰면 달라지지만 실습에서 STL을 요구하는 문제가 나오는 경우도 드믈고 주로 사용되는 문자열 변환, 배열 관련 연산 등은 파이썬에서 따로 임포트할 필요없이 자료형 자체가 이미 클래스로서 편리하게 클래스 함수를 던져주기 때문에, 클래스의 재활용이라는 측면을 훨씬 이해하기 쉽다. 무엇보다 하루면 다 배울 수 있는 언어이기도 하고. 예전에는 한국을 포함하여 대부분의 대학들이 C++이나 Java 같은 실제 회사에서 많이 쓰는 언어 위주로 수업을 개설했으나, 미국대학들은 개론 수업 언어를 Python으로 옮겨가는 추세이다. [[UC 버클리]] 컴퓨터과학 개론수업인 CS 61A 를 인터넷 강의로 들어보자!


== 인터프리터 언어 ==
== 인터프리터 언어 ==
Line 90: Line 101:


=== JIT 컴파일 ===
=== JIT 컴파일 ===
JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 [[기계어]]로 번역하는 [[컴파일]] 기법이다. 이 기법은 프로그램의 실행 속도를 빠르게 하기 위해 사용된다.
[[JIT 컴파일]]([[just-in-time compilation]]) 또는 [[동적 번역]]([[dynamic translation]])은 [[프로그램]]([[program]])을 실제 실행하는 시점에 [[기계어]]([[machine code]] 또는 [[machine language]])로 번역하는 [[컴파일]]([[compile]]) 기법이다. 이 기법은 프로그램의 실행 속도를 빠르게 하기 위해 사용된다.


전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두가지가 있는데, 인터프리트 방식과 정적 [[컴파일]] 방식으로 나눌 수 있다. 이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며, 반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.
전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두가지가 있는데, 인터프리트 방식과 정적 [[컴파일]] 방식으로 나눌 수 있다. 이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며, 반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.
Line 101: Line 112:


== 동적 타입 언어 ==
== 동적 타입 언어 ==
[[정적 타입 언어]]: 자료형(Type)이 고정돼 있는 언어. 설명이 어려운데 간단히 얘기하자면 정수형으로 정의한 1은 계속 정수형 1로 남아있다. 이걸 실수형 1.0으로 바꾸려면 명시적인 형변환(Type casting)을 해줘야 한다. 묵시적 형변환이 이루어지는 경우도 있지만 제한적이다.
[[정적 타입 언어]]([[statically typed language]]): [[자료형]]([[type]])이 고정돼 있는 [[프로그래밍 언어]]([[programming language]]). 설명이 어려운데 간단히 얘기하자면 정수형으로 정의한 1은 계속 정수형 1로 남아있다. 이걸 실수형 1.0으로 바꾸려면 명시적인 형변환(Type casting)을 해줘야 한다. 묵시적 형변환이 이루어지는 경우도 있지만 제한적이다.
 
[[동적 타입 언어]]: 자료형이 그것을 처리할 함수(또는 메서드)에 따라 그때그때 바뀌는 언어. 예를 들어 정수형 1을 정의했어도 그걸 처리할 함수가 문자열을 받아들이게 설계돼있다면 자동으로 정수형 1을 문자 1로 바꿔준다.
 
 
정적 타입 언어가 별 거 아닌 것처럼 느껴질 수도 있지만 실은 프로그래머들을 짜증나게 하는 주범이 바로 형변환(Type casting)이기 때문에 동적 타입 언어는 이런 점에서 매우 강점을 가진다. 특히 객체 지향 언어에서는 동적 타입 및 그것의 일반화버전이라 할 수 있는 덕 타이핑(Duck typing)이 프로그래머에게 수많은 혜택을 준다. 예를 들어 오리라는 타입과 닭이라는 타입이 있고 둘 다 날아오르는 기능이 있다면 정적 타입 언어에서는 상위 인터페이스를 추출하는 등의 부가 작업이 쩌는데 덕 타이핑을 지원하는 언어에서는 그냥 넣어버리면 알아서 난다. 물론 단점도 있는데 고래 같이 못 나는 타입을 집어넣으면 실행시간 오류(런타임 에러)를 뱉어버린다는거. 정적 타입 언어는 이런 문제가 없다...고 알려져있지만 거짓말이고 정적 타입 언어도 닭은 닭인데 통닭 같이 못 나는 타입을 집어넣는 바람에(기술적으로는 해당 메서드가 구현이 안된 객체) 런타임 에러가 나올 수 있다.
 
그런데 [[하스켈]]([[Haskell]])은 정적 타입 언어다. 그런데도 하스켈 코드에는 형 변환 연산자가 없다. 이게 어찌된 일이냐 하면 하스켈 언어는 정적 타입 언어이지만 강력한 타입 추론 기능을 내장하고 있어 형변환을 언어 차원에서 자동으로 해 준다. 동적 타입 언어 역시 자동 형변환을 제공하는데 무슨 차이가 있냐면 그 형변환을 런타임에 하느냐 컴파일 타임에 하느냐의 차이다. 즉 버그가 발생하는 시점을 런타임에서 컴파일 타임으로 끌어당긴다. 타입 추론 엔진은 딱히 하스켈 같은 선언형, 함수형 언어에만 도입할 수 있는 건 아니므로 신형 설계가 적용된 언어라면 명령형, 객체 지향 언어라도 타입 추론을 할 수 있다. 단지 정적 타입 언어로 유명한 C나 자바에 타입 추론 엔진이 없을 뿐이지. 여기서 타입 추론은 묵시적 형변환과 동의어가 아니다. 겉으로 보이는 건 묵시적 형변환하고 똑같지만.
 
파이썬이 동적 타입 언어(dynamically typed language)라는 점이 큰 프로젝트에서는 단점으로 작용하여 자료구조 설계나 디버깅이 어렵다는 지적도 있다. 다만 "정적 타입 언어 vs. 동적 타입 언어" 논쟁은 서로의 장단점이 있으며 일종의 종교논쟁 취급 받는다. 일례로 OCaml같은 강력한 타입 인터페이스(Hindly-Milner)를 가진 경우라 할지라도 타입 에러 정도는 거의 모두 컴파일 타임에 잡아내는 있는 반면에, 모든 버그가 타입 에러는 아니기 때문에 여전히 테스트 및 디버깅 과정은 필요하며, 타입 시스템으로 인한 부담 때문에 빠른 구현에는 부담이 갈 수 있다. 반면에 동적 언어는 빠른 구현의 이점이 있지만 타입 에러가 많이 나는 특징이 있다. 그러나 커버리지가 높은 테스트 세트로 어느정도 커버할 수 있으며 최근의 추세와 부합하는 방식이기도 하다.
 
== 높은 생산성 ==
http://xkcd.com/353/ 파이썬의 높은 생산성에 대한 만화 ~~뭐야 이거 2.x 버전이잖아~~


[[인터프리터]] 언어이면서 우수한 자료형과 다양한 모듈 등을 제공해 개발기간이 매우 단축되는 것이 특징. '[[C 언어]]로 2년동안 완성하지 못한 프로젝트를 파이썬으로 한달만에 해냈다'는 극적인 경험담이 있을 정도다. C언어와의 접착성도 좋기 때문에, 일단 Python으로 빨리 구현하고, 남은 시간에 속도에 병목이 되는 부분을 C로 전환하는 전략을 내세우고 있다. 버전이 올라가면서 Python 자체도 그리 느리지 않게 되었다. ~~맛들이면 다른 언어로 전환하기 힘든 부작용이 생긴다 카더라.~~
[[동적 타입 언어]]([[dynamically typed language]]): 자료형이 그것을 처리할 [[함수]]([[function]]) 또는 [[메서드]]([[method]])에 따라 그때 그때 바뀌는 [[언어]]([[language]]). 예를 들어 정수형 1을 정의했어도 그걸 처리할 함수가 문자열을 받아들이게 설계돼있다면 자동으로 정수형 1을 문자 1로 바꿔준다.  


참고로 저 [[xkcd]] 만화는 파이썬에서 import antigravity라고 하면 나오는 [[이스터 에그]]이다.(...) http://www.youtube.com/watch?v=_V0V6Rk6Fp4


== 디자인 철학 ==
[[정적 타입 언어]]가 별 거 아닌 것처럼 느껴질 수도 있지만 실은 프로그래머들을 짜증나게 하는 주범이 바로 형변환(type casting)이기 때문에 동적 타입 언어는 이런 점에서 매우 강점을 가진다. 특히 객체 지향 언어에서는 동적 타입 및 그것의 일반화버전이라 할 수 있는 덕 타이핑(duck typing)이 프로그래머에게 수많은 혜택을 준다. 예를 들어 오리라는 타입과 닭이라는 타입이 있고 둘 다 날아오르는 기능이 있다면 정적 타입 언어에서는 상위 인터페이스를 추출하는 등의 부가 작업이 쩌는데 덕 타이핑을 지원하는 언어에서는 그냥 넣어버리면 알아서 난다. 물론 단점도 있는데 고래 같이 못 나는 타입을 집어넣으면 실행시간 오류(런타임 에러)를 뱉어버린다는거. 정적 타입 언어는 이런 문제가 없다...고 알려져있지만 거짓말이고 정적 타입 언어도 닭은 닭인데 통닭 같이 못 나는 타입을 집어넣는 바람에(기술적으로는 해당 메서드가 구현이 안된 객체) 런타임 에러가 나올 수 있다.
[[]]([[Perl]])의 프로그래밍 [[모토]]([[motto]])는 "프로그래밍하는 데는 한 가지 이상의 방법이 있다.([[There's more than one way to do it]]이고 [[TMTOWTDI]] 또는 [[TIMTOWTDI]]로 줄여서 얘기함. Tim Toady라고 발음함.)"이다. 반면, [[파이썬]]([[Python]])의 20번째 PEP(Python enhancement proposal, 파이썬 향상 제안)는 파이썬의 [[젠]]([[zen]], [[선종]] [[불교]]의 [[선]]([[교지]])을 얘기함.)인 [[The Zen of Python]]인데, 파이썬의 젠 중 하나는 "문제를 해결하는 데는 명백한 하나의 방법(그리고 선호되는 오로지 하나의 방법)만 있어야 한다. There should be one-- and preferably only one --obvious way to do it.이다. 이 젠을 펄의 모토와 대비시켜서 간략화한 것이 "문제를 해결하는 데는 오직 하나의 방법만 있다.([[There's only one way to do it]], 줄여서 [[TOOWTDI]])"이다. PEP 20의 저자는 Tim Peters이다.


[[Perl]]의 '하나 이상의 해결법이 존재한다' 와는 정반대로 '가장 아름다운 하나의 답이 존재한다'라는 명제를 모토로 하고 있다. 이 모토 하에 다음과 같은 [[철학]]([[zen]])을 지니게 되었다.
그런데 [[하스켈]]([[Haskell]])은 [[정적 타입 언어]]다. 그런데도 하스켈 코드에는 형 변환 연산자가 없다. 이게 어찌된 일이냐 하면 하스켈 언어는 정적 타입 언어이지만 강력한 타입 추론 기능을 내장하고 있어 형변환을 언어 차원에서 자동으로 해 준다. 동적 타입 언어 역시 자동 형변환을 제공하는데 무슨 차이가 있냐면 그 형변환을 런타임에 하느냐 컴파일 타임에 하느냐의 차이다. 즉 버그가 발생하는 시점을 런타임에서 컴파일 타임으로 끌어당긴다. 타입 추론 엔진은 딱히 하스켈 같은 선언형, 함수형 언어에만 도입할 수 있는 건 아니므로 신형 설계가 적용된 언어라면 명령형, 객체 지향 언어라도 타입 추론을 할 수 있다. 단지 정적 타입 언어로 유명한 C나 자바에 타입 추론 엔진이 없을 뿐이지. 여기서 타입 추론은 묵시적 형변환과 동의어가 아니다. 겉으로 보이는 건 묵시적 형변환하고 똑같지만.


* 아름다운 것이 추한 것보다 낫다.(Beautiful is better than ugly)
[[Python]][[동적 타입 언어]]([[dynamically typed language]])라는 점이 큰 프로젝트에서는 단점으로 작용하여 자료 구조 설계나 디버깅이 어렵다는 지적도 있다. 다만 "정적 타입 언어 vs. 동적 타입 언어" 논쟁은 서로의 장단점이 있으며 일종의 종교논쟁 취급 받는다. 일례로 OCaml같은 강력한 타입 인터페이스(Hindly-Milner)를 가진 경우라 할지라도 타입 에러 정도는 거의 모두 컴파일 타임에 잡아내는 있는 반면에, 모든 버그가 타입 에러는 아니기 때문에 여전히 테스트 및 디버깅 과정은 필요하며, 타입 시스템으로 인한 부담 때문에 빠른 구현에는 부담이 갈 수 있다. 반면에 동적 언어는 빠른 구현의 이점이 있지만 타입 에러가 많이 나는 특징이 있다. 그러나 커버리지가 높은 테스트 세트로 어느정도 커버할 수 있으며 최근의 추세와 부합하는 방식이기도 하다.
* 명쾌한 것이 암시적인 것보다 낫다. (Explicit is better than implicit)
* 간결한 것이 복잡한 것보다 낫다. (Simple is better than complex)
 
따라서 다른 언어들의 코딩 스타일은 각자의 취향에 맞게 [[발산]] 진화 하는 반면, 파이썬은 위의 철학들을 만족시키는 하나의 스타일로 [[수렴]] 진화하는 성향이 있다. 실제로 [[C 언어]] 계열의 [[프로그래밍 언어]]에서 중괄호의 위치에 대한 논쟁은 거의 종교적 논쟁에 가깝다. 현재 한국에서 가장 많이 쓰이는 방식은 C 언어의 창시자 Kernighan과 Ritchie의 K&R 스타일이다. 그러나 Eric Allman의 방식을 고수하는 사람들도 제법 많다. 이외에도 중괄호 위치를 정하는 다른 방법들이 있으며 자세한 내용은 http://gyumee.egloos.com/1306012 에서 확인 가능. 이런 성향은 다른 언어에는 없는 파이썬스러움(pythonic)이라는 독특한 개념을 낳게 되었는데, 복잡하지 않으면서 의미가 명확하고, 심플한, 파이썬의 철학을 따르는 것들을 지칭하는 개념이다.
 
이런 철학 때문에 문법이 굉장히 엄격한 편이다. 예를 들자면, 다른 언어에서는 해도 되고 안 해도 되는 들여쓰기가 이 언어에서는 의무로 들여쓰기 자체로 하나의 코드 블럭이 된다. 코드 블럭을 명시적으로 표시하지 않아도 돼서 비쥬얼 적으로는 굉장히 깔끔한 반면, 자유도를 제약한다는 평도 있다. 특히 [[C 언어]] 코드를 종이에 출력해보면 중괄호 있고 없고의 가독성 차이가 의외로 크다.


== Python 3 ==
== Python 3 ==
파이썬 2.5 이하 버전에서는 문법이 좀 다르다.
파이썬 2.5.6 이하 버전에서는 [[문법]]이 좀 다르다.
  print "Hello, world!"
  print "Hello, world!"
와 같이 입력해야 한다. 파이썬 3 이상에서는 print가 함수가 되어
와 같이 입력해야 한다. 파이썬 3.0.0 이상에서는 print가 [[함수]]([[function]])가 되어
  print("Hello, world!")
  print("Hello, world!")
와 같은 문법을 쓴다. https://docs.python.org/2/whatsnew/2.6.html#pep-3105-print-as-a-function 버전 2.6 ~ 2.7에선 둘 다 사용 가능하다.
와 같은 문법을 쓴다. https://docs.python.org/2/whatsnew/2.6.html#pep-3105-print-as-a-function 버전 2.6 ~ 2.7에선 둘 다 사용 가능하다.
Line 158: Line 149:


이런 문제를 해결하기 위해, Python 3.3 버전 이후부터는 문자열 객체에서 가장 많은 공간(바이트)을 차지하는 문자를 기준으로 각 문자가 차지할 공간을 정하도록 변경되었다. https://www.python.org/dev/peps/pep-0393/ 따라서 문자열에 아스키 문자만 포함된다면 각 문자가 1바이트씩만 차지하므로 더 이상 이런 문제가 생기지 않는다. 이런 경우는 심지어 유니코드임에도 Python 2.x의 유니코드 문자열보다 적은 메모리 공간을 차지할 수도 있다! 또한 UCS-4를 모두 지원하는 "wide" 빌드와 UCS-2만 지원하는 "narrow" 빌드의 구분도 사라졌다. 하지만 크기가 변경될 때 그 만큼 속도가 느려지니 장단점이 있다.
이런 문제를 해결하기 위해, Python 3.3 버전 이후부터는 문자열 객체에서 가장 많은 공간(바이트)을 차지하는 문자를 기준으로 각 문자가 차지할 공간을 정하도록 변경되었다. https://www.python.org/dev/peps/pep-0393/ 따라서 문자열에 아스키 문자만 포함된다면 각 문자가 1바이트씩만 차지하므로 더 이상 이런 문제가 생기지 않는다. 이런 경우는 심지어 유니코드임에도 Python 2.x의 유니코드 문자열보다 적은 메모리 공간을 차지할 수도 있다! 또한 UCS-4를 모두 지원하는 "wide" 빌드와 UCS-2만 지원하는 "narrow" 빌드의 구분도 사라졌다. 하지만 크기가 변경될 때 그 만큼 속도가 느려지니 장단점이 있다.
=== syntax, semantics, grammar ===
[[언어학]] 또는 [[컴퓨터 과학]]([[컴퓨터 공학]])에서 syntax는 [[구문론]], [[통사론]], [[문법]]이라는 의미로 쓰이고, semantics는 [[의미론]]이라는 의미로 쓰이며, grammar는 [[문법]]이라는 의미로 쓰인다.
[[프로그래밍 언어]]에서의 [[syntax]], [[semantics]], [[grammar]]의 차이에 대해서는 https://stackoverflow.com/questions/17930267/what-is-the-difference-between-syntax-and-semantics-of-programming-languages 나 https://softwareengineering.stackexchange.com/questions/116982/what-is-the-difference-between-syntax-and-grammar 를 참조하기 바란다.


== C/C++와의 결합 ==
== C/C++와의 결합 ==
Line 176: Line 173:


파이썬으로 무엇을 할 수 있을까? https://wikidocs.net/7
파이썬으로 무엇을 할 수 있을까? https://wikidocs.net/7


== 웹 프로그래밍 ==
== 웹 프로그래밍 ==
Line 192: Line 190:
사실 파이썬은 수치 연산 프로그래밍에 적합한 언어는 아니다. 수치가 복잡하고 연산이 많다면 C같은 언어로 하는 것이 더 빠르기 때문이다. 하지만 파이썬에는 Numeric Python이라는 수치 연산 모듈이 제공된다. 이 모듈은 C로 작성되었기 때문에 파이썬에서도 수치 연산을 빠르게 할 수 있다.
사실 파이썬은 수치 연산 프로그래밍에 적합한 언어는 아니다. 수치가 복잡하고 연산이 많다면 C같은 언어로 하는 것이 더 빠르기 때문이다. 하지만 파이썬에는 Numeric Python이라는 수치 연산 모듈이 제공된다. 이 모듈은 C로 작성되었기 때문에 파이썬에서도 수치 연산을 빠르게 할 수 있다.


"[[NumPy]] + [[SciPy]] + [[matplotlib]]" 조합이 과학 공학 계산용으로 써볼만하다는 의견도 있다. ~~조금있으면 독점할 기세이다.~~ http://www.numpy.org/ http://www.scipy.org/ http://matplotlib.org/
"[[NumPy]] + [[SciPy]] + [[matplotlib]]" 조합이 과학 공학 계산용으로 써볼만하다는 의견도 있다. ~~조금있으면 독점할 기세이다.~~ https://www.numpy.org/ https://www.scipy.org/ https://matplotlib.org/


=== 데이터 분석 ===
=== 데이터 분석 ===
Line 222: Line 220:


[[들여쓰기]]([[indentation]])는 [[탭]]([[Tab]]) 키, [[스페이스 바]]([[space bar]]) 두 번 또는 네 번으로 한다. [[운영 체제]]나 [[편집기]]마다 탭 키의 간격이 다르기 때문에 동일한 스페이스 바를 사용해서 들여쓰기를 하는 게 낫다. 또한 파이썬 코딩 스타일 가이드(PEP 8)에서는 공백 4칸으로 규정하고 있으므로 스페이스 바 네 번으로 들여쓰기를 해주자.
[[들여쓰기]]([[indentation]])는 [[탭]]([[Tab]]) 키, [[스페이스 바]]([[space bar]]) 두 번 또는 네 번으로 한다. [[운영 체제]]나 [[편집기]]마다 탭 키의 간격이 다르기 때문에 동일한 스페이스 바를 사용해서 들여쓰기를 하는 게 낫다. 또한 파이썬 코딩 스타일 가이드(PEP 8)에서는 공백 4칸으로 규정하고 있으므로 스페이스 바 네 번으로 들여쓰기를 해주자.
[[윈도우즈]]에서 [[탭]]으로 [[들여쓰기]]해서 만든 [[소스 코드]]를 [[리눅스]]에서 편집하면 깊은 빡침을 느낄 수 있다. 똑같은 탭인데 리눅스에서 새로 작성한 부분이랑 기존에 윈도우즈에서 작성된 부분이 줄이 안 맞기 때문이다. 삐뚤빼뚤해서 코드가 헷갈려서 결국 전부 다 [[스페이스 바]]로 바꿔줄 수 밖에 없게 된다.




Line 413: Line 413:




[[윈도우즈]]의 경우 파이썬을 설치할 때 “Add Python 3.6 to PATH”의 체크박스를 체크해줘야 한다. 이 부분은 Python 3.6을 컴퓨터가 현재 cmd.exe의 어느 디렉토리에 있다 하더라도, 파이썬을 실행 시킬 수 있도록 해주는 것입니다. 즉, 컴퓨터 시스템 전반에 걸쳐 쉽게 참조할 수 있도록 만들어 놓은 변수인 환경 변수를 설정하는 것입니다. 이걸 설정해야 python이라는 명령어만으로 파이썬을 실행할 수 있다. "시작 → 모든 프로그램 → 보조 프로그램 → 명령 프롬프트" 또는 "시작 → 실행 → cmd"를 하고 bozy.py 파일이 있는 [[폴더]]로 이동한 후
[[윈도우즈]]의 경우 파이썬을 설치할 때 “Add Python 3.6 to PATH”의 체크박스를 체크해줘야 한다. 이 부분은 컴퓨터가 현재 어느 디렉토리에 있다 하더라도, 파이썬을 실행 시킬 수 있도록 해주는 것입니다. 즉, 컴퓨터 시스템 전반에 걸쳐 쉽게 참조할 수 있도록 만들어 놓은 변수인 환경 변수를 설정하는 것입니다. 이걸 설정해야 python이라는 명령어만으로 파이썬을 실행할 수 있다. "시작 → 모든 프로그램 → 보조 프로그램 → [[명령 프롬프트]]" 또는 "시작 → 실행 → cmd"를 하고 bozy.py 파일이 있는 [[폴더]]로 이동한 후
  python bozy.py
  python bozy.py
라고 입력하면 된다. 설치할 때 “Add Python 3.6 to PATH”를 체크하지 않았으면 이런식으로 python이라는 명령어만으로는 실행되지 않는다.
라고 입력하면 된다. 설치할 때 “Add Python 3.6 to PATH”를 체크하지 않았으면 이런식으로 [[Command Prompt]]의 아무곳에서나 python이라는 [[명령어]]를 입력하는 것만으로는 파이썬이 실행되지 않는다. 대신 [[명령 프롬프트]]의
C:\Users\username
[[디렉터리]]에서
cd \
해서
C:\
로 이동하고
cd python36
을 해서
C:\python36
으로 이동 후
python bozy.py
와 같은 식으로 실행해야 한다. 만약 설치 경로가 C:\Users\username\AppData\Local\Programs\Python\Python36-32와 같을 경우 해당 경로로 이동해야 한다. 참고로 해당 [[디렉터리]] 내의 [[폴더]]와 [[파일]] 목록을 보는 [[명령어]]는 dir이다. dir에 해당하는 리눅스 명령어는 ls이다. 상위 디렉터리로 가는 명령어는 [[리눅스]]나 [[윈도우즈]]나 모두
cd ..
이다.


== 반복 실행 ==
 
* [Python] 윈도우에서 파이썬을 설치하고 실행해보자.
https://selfc.tistory.com/27
 
 
 
== 반복 실행 ==
=== for문 ===
=== for문 ===
  for i in range(3):
  for i in range(3):
Line 583: Line 603:


== 함수 ==
== 함수 ==
함수를 사용하는 이유는 무엇일까?
[[함수]]([[function]])를 사용하는 이유는 무엇일까?


프로그래밍을 하다 보면 똑같은 내용을 반복해서 작성하고 있는 자신을 발견할 때가 종종 있다. 이때가 바로 함수가 필요한 때이다. 즉, 반복되는 부분이 있을 경우 "반복적으로 사용되는 가치 있는 부분"을 한 뭉치로 묶어서 "어떤 입력값을 주었을 때 어떤 결과값을 돌려준다"라는식의 함수로 작성하는 것이 현명하다.
프로그래밍을 하다 보면 똑같은 내용을 반복해서 작성하고 있는 자신을 발견할 때가 종종 있다. 이때가 바로 함수가 필요한 때이다. 즉, 반복되는 부분이 있을 경우 "반복적으로 사용되는 가치 있는 부분"을 한 뭉치로 묶어서 "어떤 입력값을 주었을 때 어떤 결과값을 돌려준다"라는식의 함수로 작성하는 것이 현명하다.
Line 595: Line 615:


=== 함수의 구조 ===
=== 함수의 구조 ===
이번 강의에선 함수의 기본구조(문법)에 대해 알아보고
이번 강의에선 함수의 기본 구조([[문법]])에 대해 알아보고


입력값과 결과값에 따라 그 구조가 어떻게 달라지는지 알아보는 시간을 갖도록 해요.
입력값과 결과값에 따라 그 구조가 어떻게 달라지는지 알아보는 시간을 갖도록 해요.
Line 873: Line 893:


input을 그냥 사용하면 문자열로 입력을 받으니 [[정수]](integer)로 입력을 받으라는 의미이다. factorial이라는 함수를 정의한다(define). 만약 x가 0이면 1을 돌려준다(return). 그게 아니면 x와 factorial 함수에 x-1을 대입한 것을 곱한다. x가 만약 3이라면 0이 아니니 3과 factorial(2)를 곱할테고, factorial(2)는 2와 factorial(1)을 곱한 것이고, factorial(1)은 1과 factorial(0)을 곱한 것이고, factorial(0)은 1을 돌려주라고 했으므로 뒤에서부터 하나씩 계산해 나가면 1을 돌려주고, 1과 1을 곱하고, 2와 1*1을 곱하고, 3과 2*1을 곱하여 3*2*1=6이 나온다.
input을 그냥 사용하면 문자열로 입력을 받으니 [[정수]](integer)로 입력을 받으라는 의미이다. factorial이라는 함수를 정의한다(define). 만약 x가 0이면 1을 돌려준다(return). 그게 아니면 x와 factorial 함수에 x-1을 대입한 것을 곱한다. x가 만약 3이라면 0이 아니니 3과 factorial(2)를 곱할테고, factorial(2)는 2와 factorial(1)을 곱한 것이고, factorial(1)은 1과 factorial(0)을 곱한 것이고, factorial(0)은 1을 돌려주라고 했으므로 뒤에서부터 하나씩 계산해 나가면 1을 돌려주고, 1과 1을 곱하고, 2와 1*1을 곱하고, 3과 2*1을 곱하여 3*2*1=6이 나온다.


== 클래스 ==
== 클래스 ==
Line 1,184: Line 1,203:
mod1.py 파일의 마지막 부분을 위와 같이 고친 다음에는 아무런 결과값도 출력되지 않는 것을 볼 수 있다.
mod1.py 파일의 마지막 부분을 위와 같이 고친 다음에는 아무런 결과값도 출력되지 않는 것을 볼 수 있다.


밑의 코드에서 if __name__ == ""__main__""은 왜 쓰는건가요?
if __name__ == ""__main__""
    print ""hello""
스크립트가 파이썬 인터프리터 명령어로 패싱되어 실행되면(python myscript.py 같이) 다른 언어들과는 다르게, 파이썬은 자동으로 실행되는 메인 함수가 없습니다. 파이썬은 메인 함수가 없는 대신 들여쓰기 하지 않은 모든 코드(level 0 코드)를 실행합니다. 다만, 함수나 클래스는 정의되었지만, 실행되지는 않습니다.
질문하신 경우, 최 상위 코드는 if 블록이고, __name__은 현재 모듈의 이름을 담고있는 내장 변수입니다. python myscript.py 같이 이 모듈이 직접 실행되는 경우에만, __name__ 은 "__main__"으로 설정됩니다.
따라서 질문자의 코드가 다른 모듈에 의해 import된 경우 함수와 객체의 정의는 import되지만 __name__이 "__main__"이 아니기 때문에 if문은 실행되지 않습니다.
즉, if __name__ == ""__main__""을 안 써주면 py 파일을 단독으로 실행할 때 뿐만 아니라 import로 불러왔을 때도 py 파일이 실행된다. 하지만 우리가 import를 쓰는 건 해당 py 파일을 실행하려는 게 아니라 그 파일에 있는 파일, 함수, 변수 등만 불러와서 사용하려는 것이므로 if __name__ == ""__main__""라는 코드를 써서 import를 사용하여 모듈로서 불려왔을 때는 해당 py 파일이 실행되지 않도록 하는 것이다.
https://hashcode.co.kr/questions/3/if-__name__-__main__%EC%9D%80-%EC%99%9C%EC%93%B0%EB%82%98%EC%9A%94


==== _가 2개 있는 경우 ====
==== _가 2개 있는 경우 ====
Line 1,358: Line 1,393:
예전엔 모듈 또는 패키지 설치를 위한 pip를 따로 설치해야 했지만 최신 버전의 파이썬은 pip를 내장하고 있다. 예를 들어 [[PyAutoGUI]] 패키지를 설치할 경우 [[윈도우즈]]는 [[명령 프롬프트]]에서
예전엔 모듈 또는 패키지 설치를 위한 pip를 따로 설치해야 했지만 최신 버전의 파이썬은 pip를 내장하고 있다. 예를 들어 [[PyAutoGUI]] 패키지를 설치할 경우 [[윈도우즈]]는 [[명령 프롬프트]]에서
  pip install pyautogui
  pip install pyautogui
를 입력하면 된다. 만약 최신 pip가 나와서 업그레이드하라고 뜨면
를 입력하면 된다.
 
만약 최신 pip가 나와서 업그레이드하라고 뜨면
  python -m pip install --upgrade pip
  python -m pip install --upgrade pip
를 해주면 된다. 윈도우즈에서는 파이썬 2와 3에서 모두 쓸 수 있는 pip가 설치되니 버전에 신경 쓸 필요 없다.
를 해주면 된다. 윈도우즈에서는 파이썬 2와 3에서 모두 쓸 수 있는 pip가 설치되니 pip인지, pip3인지, 버전에 신경 쓸 필요 없다.
 


만약 윈도우즈의 사용자 이름(User Name)이 [[한글]]일 경우 C:\Users\Username의 Username 부분이 한글이라 PyAutoGUI를 설치할 때 오류가 나서 설치가 안 되니 사용자 이름을 영어로 바꿔줘야 한다. 기존 사용자 이름을 바꿔도 오류가 계속 나는 경우 GUI에 뜨는 사용자 이름은 바뀌었으나 정작 [[디렉터리]] 이름은 안 바뀌어서 그럴 수 있으니 그럴 경우에는 [[폴더]] 이름을 바꿔주거나 [[영어]]로 아예 새로운 사용자를 생성한다.


[[명령 프롬프트]]는 "시작 → 모든 프로그램 → 보조 프로그램 → 명령 프롬프트" 또는 "시작 → 실행 → cmd"를 하면 뜬다. [[Command Prompt]]는 cmd.exe 파일이다.
[[명령 프롬프트]]는 "시작 → 모든 프로그램 → 보조 프로그램 → 명령 프롬프트" 또는 "시작 → 실행 → cmd"를 하면 뜬다. cmd.exe 파일을 실행하면 [[Command Prompt]] 프로그램이 뜬다.




Line 1,411: Line 1,450:


라는 프로그램을 만들어서 실행시켜본다. 그러면 프로그램 실행 후 2초 있다가 마우스 커서가 x=230, y=140 좌표로 이동한 후 "클릭 -> 그 위치에서 x축 방향(오른쪽)으로 100, y축 방향(아래)으로 40 이동 -> 1.5초 동안 쉼"을 0에서 7까지 여덟 번 반복한다.
라는 프로그램을 만들어서 실행시켜본다. 그러면 프로그램 실행 후 2초 있다가 마우스 커서가 x=230, y=140 좌표로 이동한 후 "클릭 -> 그 위치에서 x축 방향(오른쪽)으로 100, y축 방향(아래)으로 40 이동 -> 1.5초 동안 쉼"을 0에서 7까지 여덟 번 반복한다.
[[소스 코드]] 첫번째 줄의 import time, pyautogui는 time과 pyautogui 모듈을 불러오라는 의미이다. 3번째 줄의 time.sleep(2)는 time 모듈의 sleep 함수에 2를 넣고 실행하라는 의미이다. 4번째 줄의 pyautogui.moveTo(230, 140)는 pyautogui 모듈의 moveTo 함수에 230과 140을 집어넣고 실행하라는 의미이다.




Line 1,453: Line 1,495:
PyAutoGUI 사용 방법 전체 설명
PyAutoGUI 사용 방법 전체 설명
Welcome to PyAutoGUI’s documentation! — PyAutoGUI 1.0.0 documentation
Welcome to PyAutoGUI’s documentation! — PyAutoGUI 1.0.0 documentation
https://pyautogui.readthedocs.io/en/latest/keyboard.html
https://pyautogui.readthedocs.io/en/latest/




Line 1,462: Line 1,504:


== 라이브러리 ==
== 라이브러리 ==
이제 파이썬 프로그래밍 능력을 높여 줄 더 큰 날개를 달아 보자. 전 세계의 파이썬 사용자들이 만든 유용한 프로그램들을 모아 놓은 것이 바로 파이썬 라이브러리이다. "라이브러리"는 "도서관"이라는 뜻 그대로 원하는 정보를 찾아보는 곳이다. 모든 라이브러리를 다 알 필요는 없고 어떤 일을 할 때 어떤 라이브러리를 사용해야 한다는 정도만 알면 된다. 그러기 위해 어떤 라이브러리들이 존재하고 어떻게 사용되는지 알아야 할 필요가 있다. 자주 사용되고 꼭 알아두면 좋은 라이브러리들을 중심으로 하나씩 살펴보자.
이제 파이썬 프로그래밍 능력을 높여 줄 더 큰 날개를 달아 보자. 전 세계의 파이썬 사용자들이 만든 유용한 프로그램들을 모아 놓은 것이 바로 파이썬 [[라이브러리]]이다. "라이브러리"는 "도서관"이라는 뜻 그대로 원하는 정보를 찾아보는 곳이다. 모든 라이브러리를 다 알 필요는 없고 어떤 일을 할 때 어떤 라이브러리를 사용해야 한다는 정도만 알면 된다. 그러기 위해 어떤 라이브러리들이 존재하고 어떻게 사용되는지 알아야 할 필요가 있다. 자주 사용되고 꼭 알아두면 좋은 라이브러리들을 중심으로 하나씩 살펴보자.


(※ 파이썬 라이브러리는 파이썬 설치 시 자동으로 컴퓨터에 설치가 된다.)
(※ 파이썬 라이브러리는 파이썬 설치 시 자동으로 컴퓨터에 설치가 된다.)
Line 1,482: Line 1,524:




=== 뷰티풀 수프(Beautiful Soup) ===
용도: XML, HTML와 같은 구문 트리 또는 구조화된 데이터 처리.


장점: ‘뷰티플 수프’는 마크업 언어 문서를 처리하는 데 따르는 어려움을 완화해준다. 수프를 사용하면 수작업을 거쳐야 하는 여러 작업이 간소화되며, 특정 항목 또는 특정 유형의 항목을 검색하기도 훨씬 더 쉬워진다. 버전 3은 파이썬 2.x에서만 작동한다. 버전 4에서 파이썬 3 호환성이 추가되고 부팅 성능이 향상됐다. lxml 라이브러리(수프에서 코어로 사용 가능)보다 속도는 느리기는 해도, 많은 사용자들이 lxml을 직접 다루는 것보다 수프를 다루는 것을 더 편안하게 느낀다. 수프는 결함 있는 마크업에도 상당히 관대한데, 이는 스크린 스크래핑(Screen Scraping)을 하거나, 다른 다른 사람이 오래 전에 작성한 결함 있는 코드를 관리할 때 큰 도움이 된다.
[[셸]]([[shell]])은 라이브러리는 아니지만 파이썬 프로그래밍에서 매우 편리하게 쓸 수 있다. 하위 프로세스에서 외부 프로그램을 호출하고, 그 결과값을 파이썬 프로그램으로 반환하는 용도로 쓸 수 있다. 만약 호출 프로그램이 네이티브 파이썬 함수에도 마찬 가지의 기능이다. 모든 [[포직스]]([[POSIX]]) 호환 시스템에서 [[쉘]]([[Sh]])은 최고의 선물이다. 이러한 플랫폼에서 제공되는 모든 명령 줄 프로그램을 파이썬 방식으로 사용할 수 있게 해준다. 더 이상 쓸데없는 작업으로 시간을 낭비할 필요도 없고(OS에 이미 있는 ping을 다시 구현할 필요는 없다), 그 기능을 애플리케이션에 추가 하는 방식에 대해 고민할 필요도 없다. 다만 주의 사항은 이 라이브러리를 통해 전달되는 매개 변수는 정제되지 않는다는 점이다. 따라서 사용자 입력을 그대로 전달하지 않도록 해야 한다.


=== 필로우(Pillow) ===
용도: 간편한 이미지 처리


장점: 이미지 처리 경험이 있는 대부분의 파이썬 사용자들은 PIL(파이썬 이미징 라이브러리)에 익숙할 것이다. 그러나 PIL은 은 제약이 많으며, 업데이트가 잦지 않다는 단점이 있다. PIL은 현재 업데이트가 되지 않으니 필로우를 사용하자. 필로우는 PIL보다 더 사용하기 쉬우면서도, 최소한의 변경만으로 PIL과의 코드 호환성 확보에 목표를 두고 있다. 네이티브 윈도우 이미징 기능과 파이썬의 Tcl/Tk를 지원하는 Tkinter GUI 패키지를 사용하기 위한 확장이 포함되어 있다. 필로우는 깃허브(GitHub) 또는 PyPI 자료실에서 내려 받을 수 있다.


=== 구이(Gooey) ===
=== 수학, 통계학, 과학, 공학, 빅 데이터 ===
용도: 콘솔 기반 파이썬 프로그램을 플랫폼 기반의 GUI로 바꾸기
[[수학]], [[통계학]], [[과학]], [[공학]], [[빅 데이터 프로세싱]] 등에 쓰이는 [[라이브러리]]들 목록이다.


장점: 일반인들은 명령 줄 프로그램에 익숙하지 않다. 어떤 옵션을 사용해야 하는지, 또는 어떤 순서로 입력해야 하는지를 이해하는 것은 정말 어려운 일이다. ‘구이(Gooey)’는 argparse 라이브러리에 사용되는 인수를 GUI 형태로 표현한다. 모든 옵션에 레이블이 붙어 적절한 컨트롤(다중 옵션 항목 제공을 위한 드롭다운 등)과 함께 제공된다. 이미 argparse를 사용하고 있다면, 구이를 이용하기 위해 단 한 개의 include와 데코레이터(decorator, @)를 붙이기만 하면 된다.
==== 팬더즈(pandas) ====
[[팬더즈]]([[pandas]], https://pandas.pydata.org/ )는 데이터 처리와 분석을 위한 파이썬 라이브러리입니다. R의 data.frame을 본떠서 설계한 DataFrame이라는 데이터 구조를 기반으로 만들어졌습니다. 간단하게 말하면 pandas의 DataFrame은 엑셀의 스프레드시트와 비슷한 테이블 형태라고 할 수 있습니다. pandas는 이 테이블을 수정하고 조작하는 다양한 기능을 제공합니다. 특히, SQL처럼 테이블에 쿼리나 조인을 수행할 수 있습니다. 전체 배열의 원소가 동일한 타입이어야 하는 NumPy와는 달리 pandas는 각 열의 타입이 달라도 됩니다(예를 들면 정수, 날짜, 부동소숫점, 문자열). SQL, 엑셀 파일, CSV 파일 같은 다양한 파일과 데이터베이스에서 데이터를 읽어 들일 수 있는 것이 pandas가 제공하는 또 하나의 유용한 기능입니다. 이 책은 pandas의 기능을 자세히 설명하지는 않습니다. 대신 pandas에 대한 훌륭한 안내서로 웨스 맥키니Wes Makinney가 쓴 『파이썬 라이브러리를 활용한 데이터 분석』(한빛미디어, 2013)을 추천합니다.


=== 스크래피(Scrapy) ===
용도: 스크린 스크래핑 및 웹 크롤링


장점: ‘스크래피(Scrapy)는 전체 스크랩 과정을 간소화해준다. 스크랩할 항목 유형을 정의하는 클래스를 만들고 해당 데이터를 페이지에서 추출할 방법에 관한 몇 가지 규칙을 작성하면 그 결과를 JSON, XML, CSV 또는 다른 형식으로 내보내준다. 수집된 데이터를 있는 그대로 저장하거나 가져오는 과정에서 필요 없는 부분을 제거할 수 있다. 또한 스크래피는 웹사이트 로그인이나 세션 쿠키 처리와 같은 기타 다양한 작업을 지원하기 위해 확장될 수 있다. 스크래피로 자동 추출된 이미지는 스크랩된 콘텐츠에 연결된다.
팬더즈를 [[수학]], [[통계학]], [[빅 데이터]], [[과학]], [[공학]] 계산 등에 쓰는 방법은 [[팬더즈]] 문서 참조.


=== 셸(Sh) ===
하위 프로세스에서 외부 프로그램을 호출하고, 그 결과값을 파이썬 프로그램으로 반환하는 용도 – 만약 호출 프로그램이 네이티브 파이썬 함수에도 마찬 가지의 기능이다.


장점: 모든 포직스(Posix) 호환 시스템에서 셸(Sh)는 최고의 선물이다. 이러한 플랫폼에서 제공되는 모든 명령 줄 프로그램을 파이썬 방식으로 사용할 수 있게 해준다. 더 이상 쓸데없는 작업으로 시간을 낭비할 필요도 없고(OS에 이미 있는 ping을 다시 구현할 필요는 없다), 그 기능을 애플리케이션에 추가 하는 방식에 대해 고민할 필요도 없다. 다만 주의 사항은 이 라이브러리를 통해 전달되는 매개 변수는 정제되지 않는다는 점이다. 따라서 사용자 입력을 그대로 전달하지 않도록 해야 한다.
==== 넘파이(NumPy) ====
[[넘파이]]([[NumPy]])의 용도는 통계, 선형 대수, 행렬 계산, 금융 운용 등을 포함한 과학 계산과 수학 작업이다.


=== scikit-learn ===
금융 시장 분석가나 회계 담당자는 넘파이(NumPy)에 익숙하며, 이를 즐겨 사용한다. 그러나 넘파이의 응용 범위는 수학과 통계를 제외하고도 생각 외로 넓다. 예를 들어 넘파이는 다른 언어를 사용하다 파이썬을 처음 접한 개발자들이 자주 불평하는 파이썬에 다차원 배열 지원을 추가하는 작업을 가장 쉽게, 가장 유연하게 할 있는 방법 중 하나다. 다만 모든 요소를 갖춘 완벽한 파이썬 ‘과학-수학’ 기능을 원한다면 넘파이를 표준 항목으로 포함하는 사이파이(SciPy) 라이브러리 및 환경을 사용하는 편이 좋다. 넘파이를 기반으로 하는 정교한 데이터 분석에는 판다스(Pandas)가 있다.
오픈 소스인 scikit-learn사이킷런은 자유롭게 사용하거나 배포할 수 있고, 누구나 소스 코드를 보고 실제로 어떻게 동작하는지 쉽게 확인할 있습니다. scikit-learn 프로젝트는 꾸준히 개발, 향상되고 있고 커뮤니티도 매우 활발합니다. 잘 알려진 머신러닝 알고리즘들은 물론 알고리즘을 설명한 풍부한 문서(http://scikit-learn.org/stable/documentation)도 제공합니다. scikit-learn은 매우 인기가 높고 독보적인 파이썬 머신러닝 라이브러리입니다. 그래서 산업 현장이나 학계에도 널리 사용되고 많은 튜토리얼과 예제 코드를 온라인에서 쉽게 찾을 수 있습니다. 앞으로 보게 되겠지만 scikit-learn은 다른 파이썬의 과학 패키지들과도 잘 연동됩니다.


scikit-learn은 두 개의 다른 파이썬 패키지인 NumPy넘파이와 SciPy싸이파이를 사용합니다. 그래프를 그리려면 matplotlib맷플롯립을, 대화식으로 개발하려면 IPython아이파이썬과 주피터 노트북도 설치해야 합니다.
NumPy( https://www.numpy.org/ )는 파이썬으로 과학 계산을 하려면 꼭 필요한 패키지입니다. 다차원 배열을 위한 기능과 선형대수 연산과 푸리에 변환 같은 고수준 수학 함수와 유사(pseudo) 난수 생성기를 포함합니다.
 
 
==== 맽플랕립(matplotlib) ====
[[맽플랕립]]([[matplotlib]], https://matplotlib.org/ )은 파이썬의 대표적인 과학 계산용 그래프 라이브러리입니다. 선 그래프, 히스토그램, 산점도 등을 지원하며 출판에 쓸 수 있을 만큼의 고품질 그래프를 그려줍니다. 데이터와 분석 결과를 다양한 관점에서 시각화해보면 매우 중요한 통찰을 얻을 수 있습니다. 이 책의 모든 그래프는 matplotlib을 사용했습니다. 주피터 노트북에서 사용할 때는 %matplotlib notebook이나 %matplotlib inline 명령을 사용하면 브라우저에서 바로 이미지를 볼 수 있습니다. 대화식 환경을 제공하는 %matplotlib notebook 명령을 권장합니다(하지만 이 책에서는 %matplotlib inline을 사용합니다).


https://tensorflow.blog/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/1-2-%EC%99%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%B8%EA%B0%80/#1.3


=== 넘파이(NumPy) ===
==== 싸이파이(SciPy) ====
용도: 통계, 선형 대수, 행렬 계산, 금융 운용 등을 포함한 과학 계산과 수학 작업
[[싸이파이]]([[SciPy]], https://www.scipy.org/scipylib )는 과학 계산용 함수를 모아놓은 파이썬 패키지입니다. SciPy는 고성능 선형대수, 함수 최적화, 신호 처리, 특수한 수학 함수와 통계 분포 등을 포함한 많은 기능을 제공합니다. scikit-learn은 알고리즘을 구현할 때 SciPy의 여러 함수를 사용합니다. 그중에서 가장 중요한 기능은 scipy.sparse입니다. 이 모듈은 scikit-learn에서 데이터를 표현하는 또 하나의 방법인 희소 행렬 기능을 제공합니다. 희소 행렬sparse matrix, 희박 행렬은 0을 많이 포함한 2차원 배열을 저장할 때 사용합니다.


장점: 금융 시장 분석가나 회계 담당자는 넘파이(NumPy)에 익숙하며, 이를 즐겨 사용한다. 그러나 넘파이의 응용 범위는 수학과 통계를 제외하고도 생각 외로 넓다. 예를 들어 넘파이는 다른 언어를 사용하다 파이썬을 처음 접한 개발자들이 자주 불평하는 파이썬에 다차원 배열 지원을 추가하는 작업을 가장 쉽게, 가장 유연하게 할 있는 방법 중 하나다. 다만 모든 요소를 갖춘 완벽한 파이썬 ‘과학-수학’ 기능을 원한다면 넘파이를 표준 항목으로 포함하는 사이파이(SciPy) 라이브러리 및 환경을 사용하는 편이 좋다. 넘파이를 기반으로 하는 정교한 데이터 분석에는 판다스(Pandas)가 있다.
=== 기계 학습 ===
==== 싸이킽-런(scikit-learn) ====
[[오픈 소스]]인 [[싸이킽-런]]([[scikit-learn]])은 자유롭게 사용하거나 배포할 수 있고, 누구나 소스 코드를 보고 실제로 어떻게 동작하는지 쉽게 확인할 있습니다. scikit-learn 프로젝트는 꾸준히 개발, 향상되고 있고 커뮤니티도 매우 활발합니다. 잘 알려진 [[머신 러닝]]([[machine learning]]) [[알고리듬]]들은 물론 [[알고리즘]]을 설명한 풍부한 문서( https://scikit-learn.org/stable/documentation )도 제공합니다. scikit-learn은 매우 인기가 높고 독보적인 파이썬 [[기계 학습]] 라이브러리입니다. 그래서 산업 현장이나 학계에도 널리 사용되고 많은 튜토리얼과 예제 코드를 온라인에서 쉽게 찾을 수 있습니다. 앞으로 보게 되겠지만 scikit-learn은 다른 파이썬의 과학 패키지들과도 잘 연동됩니다.


NumPy(http://www.numpy.org/)는 파이썬으로 과학 계산을 하려면 꼭 필요한 패키지입니다. 다차원 배열을 위한 기능과 선형대수 연산과 푸리에 변환 같은 고수준 수학 함수와 유사pseudo 난수 생성기를 포함합니다.
scikit-learn은 두 개의 다른 파이썬 패키지인 NumPy(넘파이)와 SciPy(싸이파이)를 사용합니다. 그래프를 그리려면 matplotlib(맷플롯립)을, 대화식으로 개발하려면 IPython(아이파이썬)과 Jupyter Notebook(주피터 노트북)도 설치해야 합니다.


scikit-learn에서 NumPy 배열은 기본 데이터 구조입니다. scikit-learn은 NumPy 배열 형태의 데이터를 입력으로 받습니다. 그래서 우리가 사용할 데이터는 모두 NumPy 배열로 변환되어야 합니다. NumPy의 핵심 기능은 다차원(n-차원) 배열인 ndarray 클래스입니다. 이 배열의 모든 원소는 동일한 데이터 타입이어야 합니다.
https://tensorflow.blog/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/1-2-%EC%99%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%B8%EA%B0%80/#1.3


=== SciPy ===
SciPy(https://www.scipy.org/scipylib)는 과학 계산용 함수를 모아놓은 파이썬 패키지입니다. SciPy는 고성능 선형대수, 함수 최적화, 신호 처리, 특수한 수학 함수와 통계 분포 등을 포함한 많은 기능을 제공합니다. scikit-learn은 알고리즘을 구현할 때 SciPy의 여러 함수를 사용합니다. 그중에서 가장 중요한 기능은 scipy.sparse입니다. 이 모듈은 scikit-learn에서 데이터를 표현하는 또 하나의 방법인 희소 행렬 기능을 제공합니다. 희소 행렬sparse matrix, 희박 행렬은 0을 많이 포함한 2차원 배열을 저장할 때 사용합니다.


=== matplotlib ===
scikit-learn에서 NumPy 배열은 기본 데이터 구조입니다. scikit-learn은 NumPy 배열 형태의 데이터를 입력으로 받습니다. 그래서 우리가 사용할 데이터는 모두 NumPy 배열로 변환되어야 합니다. NumPy의 핵심 기능은 다차원(n-차원) 배열인 ndarray 클래스입니다. 이 배열의 모든 원소는 동일한 데이터 타입이어야 합니다.
matplotlib(https://matplotlib.org/)은 파이썬의 대표적인 과학 계산용 그래프 라이브러리입니다. 선 그래프, 히스토그램, 산점도 등을 지원하며 출판에 쓸 수 있을 만큼의 고품질 그래프를 그려줍니다. 데이터와 분석 결과를 다양한 관점에서 시각화해보면 매우 중요한 통찰을 얻을 수 있습니다. 이 책의 모든 그래프는 matplotlib을 사용했습니다. 주피터 노트북에서 사용할 때는 %matplotlib notebook이나 %matplotlib inline 명령을 사용하면 브라우저에서 바로 이미지를 볼 수 있습니다. 대화식 환경을 제공하는 %matplotlib notebook 명령을 권장합니다(하지만 이 책에서는 %matplotlib inline을 사용합니다).  


=== pandas ===
pandas(http://pandas.pydata.org/)는 데이터 처리와 분석을 위한 파이썬 라이브러리입니다. R의 data.frame을 본떠서 설계한 DataFrame이라는 데이터 구조를 기반으로 만들어졌습니다. 간단하게 말하면 pandas의 DataFrame은 엑셀의 스프레드시트와 비슷한 테이블 형태라고 할 수 있습니다. pandas는 이 테이블을 수정하고 조작하는 다양한 기능을 제공합니다. 특히, SQL처럼 테이블에 쿼리나 조인을 수행할 수 있습니다. 전체 배열의 원소가 동일한 타입이어야 하는 NumPy와는 달리 pandas는 각 열의 타입이 달라도 됩니다(예를 들면 정수, 날짜, 부동소숫점, 문자열). SQL, 엑셀 파일, CSV 파일 같은 다양한 파일과 데이터베이스에서 데이터를 읽어 들일 수 있는 것이 pandas가 제공하는 또 하나의 유용한 기능입니다. 이 책은 pandas의 기능을 자세히 설명하지는 않습니다. 대신 pandas에 대한 훌륭한 안내서로 웨스 맥키니Wes Makinney가 쓴 『파이썬 라이브러리를 활용한 데이터 분석』(한빛미디어, 2013)을 추천합니다.


=== 텐서플로우(TensorFlow) ===
==== 텐서플로우(TensorFlow) ====
[[텐서플로우]]([[TensorFlow]])는 다양한 작업에 대해 데이터 흐름 프로그래밍을 위한 [[오픈 소스]] 소프트웨어 [[라이브러리]]이다. 심볼릭 수학 라이브러리이자, 뉴럴 네트워크같은 [[기계 학습]]([[machine learning]]) 응용 프로그램에도 사용된다. 이것은 구글내 연구와 제품개발을 위한 목적으로 구글 브레인팀이 만들었고 2015년 11월 9일 아파치 2.0 오픈 소스 라이선스로 공개되었다.
[[텐서플로우]]([[TensorFlow]])는 다양한 작업에 대해 데이터 흐름 프로그래밍을 위한 [[오픈 소스]] 소프트웨어 [[라이브러리]]이다. 심볼릭 수학 라이브러리이자, 뉴럴 네트워크같은 [[기계 학습]]([[machine learning]]) 응용 프로그램에도 사용된다. 이것은 구글내 연구와 제품개발을 위한 목적으로 구글 브레인팀이 만들었고 2015년 11월 9일 아파치 2.0 오픈 소스 라이선스로 공개되었다.


Line 1,539: Line 1,573:


아래 링크 참조
아래 링크 참조
* tensorflow 4 : linear regression http://studioplug.tistory.com/251
* tensorflow 4 : linear regression https://studioplug.tistory.com/251




== 프레임워크 ==
==== 케라스(Keras) ====
[[프레임워크]]는 어떤 목적에 필요한 [[모듈]]과 [[패키지]]들을 모두 하나의 큰 틀에 집어넣은 도구라고 생각하면 된다. 예를 들어 웹 서비스를 할 때 [[쟁고우]]([[Django]]) 하나면 다 되는 것과 비슷하다.
[[케라스]]([[Keras]])는 TensorFlow, Theano, CNTK 등 [[딥 러닝]] 라이브러리를 포함하고 있어 쉽게 다층 퍼셉트론 신경망 모델, 컨볼루션 신경 망 모델, 순환 신경망 모델, 조합 모델 등을 구성할 수 있다.




[[메소드]] 및 [[클래스]]화, 즉 [[모듈화]]를 하는 이유 중 하나가 재사용성인데, 프레임워크는 이 재사용성을 큰 그룹 단위로 묶어주었다고 보면 된다. 재사용 가능한 수많은 [[클래스]]들과 [[라이브러리]]들을 융합한 채로 처음부터 제공해 주기 때문에, 여러 개의 표준을 만들지 않아도 돼서 개발자의 피곤함을 덜어준다.
=== 기타 라이브러리 ===
==== 뷰티펄 숲(Beautiful Soup) ====
[[뷰티펄 숲]]([[Beautiful Soup]])의 용도는 XML, HTML와 같은 구문 트리 또는 구조화된 데이터 처리이다.


[[뷰티펄 숲]]([[Beautiful Soup]])은 마크업 언어 문서를 처리하는 데 따르는 어려움을 완화해준다. 수프를 사용하면 수작업을 거쳐야 하는 여러 작업이 간소화되며, 특정 항목 또는 특정 유형의 항목을 검색하기도 훨씬 더 쉬워진다. 버전 3은 파이썬 2.x에서만 작동한다. 버전 4에서 파이썬 3 호환성이 추가되고 부팅 성능이 향상됐다. lxml 라이브러리(수프에서 코어로 사용 가능)보다 속도는 느리기는 해도, 많은 사용자들이 lxml을 직접 다루는 것보다 수프를 다루는 것을 더 편안하게 느낀다. 수프는 결함 있는 마크업에도 상당히 관대한데, 이는 스크린 스크래핑(Screen Scraping)을 하거나, 다른 다른 사람이 오래 전에 작성한 결함 있는 코드를 관리할 때 큰 도움이 된다.


=== 웹 프레임워크 ===
일반적으로 파이썬을 웹 서비스에 쓴다고 하면 [[쟁고우]]([[Django]], [ˈdʒæŋɡoʊ])나 [[플래스크]]([[Flask]], [flӕsk])를 쓴다고 생각하면 된다. Django는 풀 스택 [[웹 프레임워크]]이고, Flask는 아니다.


파이썬과 비슷한 [[루비]]([[Ruby]])에서는 [[루비 온 레일즈]]([[Ruby on Rails]])와 [[시나트라]]([[Sinatra]])라는 [[웹 프레임워크]]([[web framework]])를 많이 쓴다.
뷰티펄 숲을 사용하여 [[웹 싸이트]]의 HTML 문서들 중 자신이 원하는 부분만 긁어오는 방법은 [[뷰티펄 숲]] 문서 참조.




[[풀 스택]]([[full stack]])은 처음부터 끝까지 모든 것을 한다는 의미이다. , 풀 스택 개발자면 사용자에게 보여지는 프론트엔드(HTML, CSS, JavaScript 등)부터 서버에서 돌아가는 백엔드(Python, Ruby, PHP 등)까지 혼자서 개발하는 사람을 말한다.
==== 필로우(Pillow) ====
[[필로우]]([[Pillow]])의 용도는 간편한 이미지 처리이다.
 
이미지 처리 경험이 있는 대부분의 파이썬 사용자들은 PIL(파이썬 이미징 라이브러리)에 익숙할 것이다. 그러나 PIL은 제약이 많으며, 업데이트가 잦지 않다는 단점이 있다. PIL은 현재 업데이트가 되지 않으니 필로우를 사용하자. 필로우는 PIL보다 더 사용하기 쉬우면서도, 최소한의 변경만으로 PIL과의 코드 호환성 확보에 목표를 두고 있다. 네이티브 윈도우 이미징 기능과 파이썬의 Tcl/Tk를 지원하는 Tkinter GUI 패키지를 사용하기 위한 확장이 포함되어 있다. 필로우는 [[깃허브]]([[GitHub]]) 또는 [[PyPI]] 자료실에서 내려 받을 수 있다.
 
 
==== 스크래피(Scrapy) ====
[[스크래피]]([[Scrapy]])의 용도는 스크린 스크래핑 및 웹 크롤링이다.
 
스크래피(Scrapy)는 전체 스크랩 과정을 간소화해준다. 스크랩할 항목 유형을 정의하는 클래스를 만들고 해당 데이터를 페이지에서 추출할 방법에 관한 몇 가지 규칙을 작성하면 그 결과를 JSON, XML, CSV 또는 다른 형식으로 내보내준다. 수집된 데이터를 있는 그대로 저장하거나 가져오는 과정에서 필요 없는 부분을 제거할 수 있다. 또한 스크래피는 웹사이트 로그인이나 세션 쿠키 처리와 같은 기타 다양한 작업을 지원하기 위해 확장될 수 있다. 스크래피로 자동 추출된 이미지는 스크랩된 콘텐츠에 연결된다.
 
 
==== 구이(Gooey) ====
[[구이]]([[Gooey]])의 용도는 콘솔 기반 파이썬 프로그램을 플랫폼 기반의 GUI로 바꾸기이다.
 
명령 줄 프로그램에 익숙하지 않은 일반인들이 쉽게 사용하게 해준다. 어떤 옵션을 사용해야 하는지, 또는 어떤 순서로 입력해야 하는지를 이해하는 것은 정말 어려운 일이다. ‘구이(Gooey)’는 argparse 라이브러리에 사용되는 인수를 GUI 형태로 표현한다. 모든 옵션에 레이블이 붙어 적절한 컨트롤(다중 옵션 항목 제공을 위한 드롭다운 등)과 함께 제공된다. 이미 argparse를 사용하고 있다면, 구이를 이용하기 위해 단 한 개의 include와 데코레이터(decorator, @)를 붙이기만 하면 된다.
 
 
 
== 프레임워크 ==
[[프레임워크]]는 어떤 목적에 필요한 [[모듈]]과 [[패키지]]들을 모두 하나의 큰 틀에 집어넣은 도구라고 생각하면 된다. 예를 들어 웹 서비스를 할 때 [[쟁고우]]([[Django]]) 하나면 되는 것과 비슷하다.


풀 스택 [[프레임워크]]([[framework]])는 [[유저 인터페이스]]([[user interface]]) 개발부터 데이터 저장(data store) 개발까지 모두 다 도와주는 프레임워크를 말한다. 풀 스택이 아닌 프레임워크는 논 풀 스택 프레임워크(non full stack framework)라고 부른다.


매크로 프레임워크(macro framework)나 매크로 라이브러리(macro library)는 크기가 5 KB가 넘는 것을 말한다. 그것보다 작은 것은 마이크로 프레임워크나 마이크로 라이브러리라고 부른다.
[[메소드]] 및 [[클래스]]화, 즉 [[모듈화]]를 하는 이유 중 하나가 재사용성인데, 프레임워크는 이 재사용성을 큰 그룹 단위로 묶어주었다고 보면 된다. 재사용 가능한 수많은 [[클래스]]들과 [[라이브러리]]들을 융합한 채로 처음부터 제공해 주기 때문에, 여러 개의 표준을 만들지 않아도 돼서 개발자의 피곤함을 덜어준다.


매크로 프레임워크는 모듈라 프레임워크(modular framework)와 모놀리식 프레임워크(monolithic framework 또는 monolith)로 나뉜다. 모듈라는 모듈(module)로 기능이 나눠진 것이고, 모놀리식은 하나의 덩어리로 되어서 일부 기능을 떼어내면 정상 작동을 하지 않는 것이다.


[[운영 체제]]는 [[하드웨어]] 위의 [[커널]](kernel), 그리고 그 위의 [[]](shell), 그리고 그 위의 [[애플리케이션]]으로 구성된다. 그 중 커널은 모놀리식 커널(monolithic kernel)과 마이크로 커널(micro kernel)이 있는데, 한 덩어리로 되어서 많은 기능을 다 집어넣은 [[리눅스]]나 [[유닉스]]의 커널이 모놀리식 커널이며, [[미닉스]]([[Minix]]), [[마하]]([[Mach]]), GNU [[허드]]([[Hurd]]), [[심비안]]의 커널은 마이크로 커널, 그리고 그 둘을 섞은 하이브리드 커널(hybrid kernel)이 있다. 하이브리드 커널은 모놀리식 커널에 마이크로 커널을 포함시킨 것이다. 하이브리드 커널에는 [[윈도우즈]] NT 커널과 [[macOS]]와 [[iOS]]의 기반이 되는 [[다윈]]의 [[XNU]] 커널이 있다.
=== 웹 프레임워크 Django ===
일반적으로 파이썬을 웹 서비스에 쓴다고 하면 [[쟁고우]]([[Django]], [ˈdʒæŋɡoʊ])나 [[플래스크]]([[Flask]], [flӕsk])를 쓴다고 생각하면 된다. Django는 풀 스택 [[웹 프레임워크]]이고, Flask는 아니다.


==== Django ====
[[쟁고우]]([[Django]])는 Python기반 [[웹 프레임워크]]([[web framework]]) 중에 가장 널리 퍼져있다. [[풀 스택]]([[full stack]]) [[웹 프레임워크]]([[web framework]])이다.
[[쟁고우]]([[Django]])는 Python기반 [[웹 프레임워크]]([[web framework]]) 중에 가장 널리 퍼져있다. [[풀 스택]]([[full stack]]) [[웹 프레임워크]]([[web framework]])이다.
자세한 내용은 [[쟁고우]]([[Django]]) 문서 참조.




자세한 내용은 [[쟁고우]]([[Django]]) 문서 참조.
[[풀 스택]]([[full stack]])은 처음부터 끝까지 모든 것을 한다는 의미이다. 즉, 풀 스택 개발자면 사용자에게 보여지는 프론트엔드(HTML, CSS, JavaScript 등)부터 서버에서 돌아가는 백엔드(Python, Ruby, PHP 등)까지 혼자서 다 개발하는 사람을 말한다.


==== Flask ====
풀 스택 [[프레임워크]]([[framework]])는 [[유저 인터페이스]]([[user interface]]) 개발부터 데이터 저장(data store) 개발까지 모두 다 도와주는 프레임워크를 말한다. 풀 스택이 아닌 프레임워크는 논 풀 스택 프레임워크(non full stack framework)라고 부른다.
[[플래스크]]([[Flask]])는 Django와 함께 파이썬에서 많이 쓰이는 [[웹 프레임워크]]이다. Django와는 달리 논 풀 스택 프레임워크(non full stack web framework)이다. 즉, 최소한의 기능만 있어서 가볍고 빠르다. 그리고 필요한 기능이 있으면 추가해서 사용한다.


=== 파이게임(Pygame) ===
매크로 프레임워크(macro framework)나 매크로 라이브러리(macro library)는 크기가 5 KB가 넘는 것을 말한다. 그것보다 작은 것은 마이크로 프레임워크나 마이크로 라이브러리라고 부른다.
용도: 파이썬으로 비디오 게임을 제작하기 위한 프레임워크
 
장점: 게임 개발 분야에서 일하지 않는 사람이 이러한 프레임워크를 다룰 일이 있을까 라고 생각한다면 오산이다. 파이게임(Pygame)은 캔버스와 그래픽 그리기, 다채널 사운드 처리, 창과 클릭 이벤트 처리, 충돌 감지 등의 복잡한 작업 없이도 여러 가지 GUI 지향 동작을 편리하게 다룰 수 있는 방편을 제공한다. GUI 앱이라고 할지라도, 모든 앱에 파이게임이 제공하는 기능을 적용하지 못할 수도 있다는 사실을 감안하면서, 파이게임의 기능을 한차례 훑어보는 것도 좋다.
매크로 프레임워크는 모듈라 프레임워크(modular framework)와 모놀리식 프레임워크(monolithic framework 또는 monolith)로 나뉜다. 모듈라는 모듈(module)로 기능이 나눠진 것이고, 모놀리식은 하나의 덩어리로 되어서 일부 기능을 떼어내면 정상 작동을 하지 않는 것이다.


==== 토끼와 오소리 게임 ====
[[운영 체제]]는 [[하드웨어]] 위의 [[커널]](kernel), 그리고 그 위의 [[셸]](shell), 그리고 그 위의 [[애플리케이션]]으로 구성된다. 그 중 커널은 모놀리식 커널(monolithic kernel)과 마이크로 커널(micro kernel)이 있는데, 한 덩어리로 되어서 많은 기능을 다 집어넣은 [[리눅스]]나 [[유닉스]]의 커널이 모놀리식 커널이며, [[미닉스]]([[Minix]]), [[마하]]([[Mach]]), GNU [[허드]]([[Hurd]]), [[심비안]]의 커널은 마이크로 커널, 그리고 그 둘을 섞은 하이브리드 커널(hybrid kernel)이 있다. 하이브리드 커널은 모놀리식 커널에 마이크로 커널을 포함시킨 것이다. 하이브리드 커널에는 [[윈도우즈]] NT 커널과 [[macOS]]와 [[iOS]]의 기반이 되는 [[다윈]]의 [[XNU]] 커널이 있다.
참고로 아래 예제는 파이썬 2.7.3으로 작성되어서 파이썬 3와는 조금 안 맞을 수 있다.




* 10대들을 위한 파이선 게임 프로그램 시작하기
=== 파이게임(Pygame) ===
2014.05.22
[[Pygame]]으로 [[게임]]([[game]])을 만드는 방법은 [[파이게임]] 문서 참조.


밑의 글에도 잠시 적기는 했지만 파이선으로 만든 프로그램이 인터랙티브하게 돌아야 할 이유는 많다,


파이선은 빠른 프로토타입이나 리버스 엔지니어링에 좋다고 한다. 쉽게 말하면 나같이 게으른 사람을 위해 만든 언어라고 보아도 좋다.  
=== Cocos2d ===
Cocos2d란 2D 게임, 데모, 기타 시각적인/인터랙티브한 애플리케이션을 제작할 때 쓰이는 [[프레임워크]]입니다. Cocos2d 관련 추가 정보는 아래 링크에서 확인하실 수 있습니다.


문제는 이제 이걸로 무엇인가를 해야 하는데 몇가지의 장벽이 있다.  
https://python.cocos2d.org/doc.html


하나는 기계와 다이렉트 io 하는 부분이 약하다는 것이다. c 나 다른 언어로 무엇인가를 해주어야 한다.


펑셔널 어프로치가 아쉽다는 점... 이부분은 람다로 어느 정도 극복 가능하고 정 안되면 리스프나 스킴 인터프리터를 내재해도 된다.
간단하게 말하자면, Tkinter보다는 게임 만드는게 더 편하다는 것이죠. 일단 설치부터 해봅시다.


그래픽이나 사운드같은 것이 잘 안된다는 점 .. 이부분을 pygame 같은 것으로 만들어서 놀면 된다는..


오늘은 그래서 파이선 게임을 만드는 예제를 한번 차분하게 번역을 해보기로 했다.
[[리눅스]]의 경우 [[터미널]]에서


Beginning Game Programming for Teens with Python
sudo pip3 install cocos2d


글의 제목은 10대들을 위한 파이선 게임 프로그램 시작하기 정도로 번역할 수 있겠다. 더 좋은 이름이 있으면 제게 알려주면 이름을 고치겠다.  
를 입력한다.


원문은 https://www.raywenderlich.com/24252/beginning-game-programming-for-teens-with-python 에서 볼수 있다.


그럼 조금씩 시작해 보자.
[[윈도우즈]]의 경우 cmd를 실행시킨 뒤 다음을 입력합니다.


이 글은 튜토리얼 팀 멤버인 줄리안 메이어 , 13 세 파이썬 개발자가 적었다.  Google+ 와 Twitter 에서 찾을수 있다.
  pip install cocos2d


비디오 게임을 만드는 방법이 대다한 것이라고 생각할지도 모르지만 그다지  복잡하지 않다!


이 튜토리얼에서  토끼와 오소리라는 간단한 게임을 만들 것이다. 여기서 히어로인 토끼는 오소리떼의 공격에서 성을 방어할 것이다.
* [파이썬 게임 프로그래밍 공부] 6. Cocos2d 입문
2017-09-22


http://toyfab.tistory.com/entry/10%EB%8C%80%EB%93%A4%EC%9D%84-%EC%9C%84%ED%95%9C-%ED%8C%8C%EC%9D%B4%EC%84%A0-%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0
https://alegruz.imweb.me/blog/?idx=243177&bmode=view




= 멀티쓰레딩 문제 =
= 멀티쓰레딩 문제 =
파이썬은 멀티스레딩을 지원하기 위하여 GIL(Global Interpreter Lock), 즉 전역 인터프리터 락을 도입하여 사용하게 되었다. 따라서, python 스레드 10개를 만들어도 실제 Pthread/윈도우 쓰레드가 10개가 만들어지긴 하는데, GIL때문에 개중 동시에 하나밖에 안돌아가는 기이한 구조를 갖고 있다. 물론, 내부적으로 IO작업이 있을시 바로 다른 쓰레드로 문맥 교환을 해주고, 바이트 코트를 100번 실행한 다음에는 인터프리터 차원에서 다른 쓰레드로 교체 해주므로 동시 작업 비슷한 효과가 난다. 이것은 구현이 매우 쉬워지고 빠른 개발을 할 수 있다는 장점이 있으나 다중 코어 CPU가 보편화된 2006년 이후에는 다중 코어를 제대로 활용하지 못하는 구조적인 문제 때문에 성능에서 밀린다는 평가를 받게 되었다. 만일 특정 프로그램에 순진하게 CPU 코어를 2개 이상 동원하려고 할 경우, [[뮤텍스]]([[MutEx]]), 즉 한 쓰레드에 여러개의 CPU가 연산을 행하여 내부 정보를 오염시키는 것을 방지하는 역할을 맡는 GIL이 병목 현상을 일으켜 코어 하나를 쓸 때보다 오히려 성능이 크게 저하된다는 것. 구글 내부에서 이미 [http://blip.tv/carlfk/mindblowing-python-gil-2243379 가루가 되도록 까인 부분]이다.
파이썬은 [[멀티스레딩]]을 지원하기 위하여 [[GIL]]([[Global Interpreter Lock]]), 즉 [[전역 인터프리터 락]]을 도입하여 사용하게 되었다. 따라서, python 스레드 10개를 만들어도 실제 Pthread/윈도우 쓰레드가 10개가 만들어지긴 하는데, GIL때문에 개중 동시에 하나밖에 안돌아가는 기이한 구조를 갖고 있다. 물론, 내부적으로 IO작업이 있을시 바로 다른 쓰레드로 문맥 교환을 해주고, 바이트 코트를 100번 실행한 다음에는 인터프리터 차원에서 다른 쓰레드로 교체 해주므로 동시 작업 비슷한 효과가 난다. 이것은 구현이 매우 쉬워지고 빠른 개발을 할 수 있다는 장점이 있으나 다중 코어 CPU가 보편화된 2006년 이후에는 다중 코어를 제대로 활용하지 못하는 구조적인 문제 때문에 성능에서 밀린다는 평가를 받게 되었다. 만일 특정 프로그램에 순진하게 CPU 코어를 2개 이상 동원하려고 할 경우, [[뮤텍스]]([[MutEx]]), 즉 한 쓰레드에 여러개의 CPU가 연산을 행하여 내부 정보를 오염시키는 것을 방지하는 역할을 맡는 GIL이 병목 현상을 일으켜 코어 하나를 쓸 때보다 오히려 성능이 크게 저하된다는 것.
 


이런 문제점 때문에 파이썬에서 병렬 처리가 필요할때는 다중 [[쓰레드]]가 아닌 다중 [[프로세스]]로 GIL을 우회하는 방식을 사용한다. 2008년 이후에 Multiprocessing이라는 모듈을 제공하는데 이 모듈은 자식 프로세스를 만드는 방향으로 다중 코어 사용시 성능의 향상을 꾀하고 있다.
이런 문제점 때문에 파이썬에서 병렬 처리가 필요할때는 다중 [[쓰레드]]가 아닌 다중 [[프로세스]]로 GIL을 우회하는 방식을 사용한다. 2008년 이후에 Multiprocessing이라는 모듈을 제공하는데 이 모듈은 자식 프로세스를 만드는 방향으로 다중 코어 사용시 성능의 향상을 꾀하고 있다.


단, CPU 부하가 큰 작업을 돌리는 것이 아니면 GIL을 체감하기는 생각보다 쉽지 않다. 다중 쓰레딩으로 CPU의 여러 코어를 최대한 이용하고 싶은 경우에는 GIL가 굉장히 아쉬운 이슈지만, CPU를 별로 쓰지않거나 I/O가 주가 되는 작업은 유의미한 성능 차이가 없다. 게다가 어설프게 코어 몇개 깔짝깔짝 이용해서 계산하는 것보다는 그냥 C언어로 모듈을 짜서 붙이는게 더 빠르다. 즉, python에서 CPU를 많이 먹는 부분은 C 모듈을 짜서 붙이고 필요하다면 multiprocessing 모듈을 이용하여 멀티코어를 활용하는 편. ~~그 이상의 CPU-heavy한 작업은 동적 인터프리팅 언어 쓰지 말고 처음부터 [[C]], [[C++]]로 짜는게 맞다.~~
단, CPU 부하가 큰 작업을 돌리는 것이 아니면 GIL을 체감하기는 생각보다 쉽지 않다. 다중 쓰레딩으로 CPU의 여러 코어를 최대한 이용하고 싶은 경우에는 GIL가 굉장히 아쉬운 이슈지만, CPU를 별로 쓰지않거나 I/O가 주가 되는 작업은 유의미한 성능 차이가 없다. 게다가 어설프게 코어 몇개 깔짝깔짝 이용해서 계산하는 것보다는 그냥 C언어로 모듈을 짜서 붙이는게 더 빠르다. 즉, python에서 CPU를 많이 먹는 부분은 C 모듈을 짜서 붙이고 필요하다면 multiprocessing 모듈을 이용하여 멀티코어를 활용하는 편. 그 이상의 CPU-heavy한 작업은 동적 인터프리팅 언어 쓰지 말고 처음부터 [[C]], [[C++]]로 짜는게 맞다.
 
자세히 알고싶다면 다음 링크들을 참조.
 
* [http://www.youtube.com/watch?v=Obt-vMVdM8s Understanding the Python GIL (유튜브)]
* [http://openlook.org/blog/2006/11/12/cb-1136/ 파이썬 GIL 깊숙히! (上)]
* [http://openlook.org/blog/2007/02/27/cb-1146/ 파이썬 GIL 깊숙히! (상) 에 대한 몇 가지 변명]




== 파이썬으로 멀티코어 프로그램 만들기 ==
== 파이썬으로 멀티코어 프로그램 만들기 ==
파이썬으로 시도해보는 멀티 코어 프로세싱, 자고 있는 코어들을 깨우기
서버로 프로그래밍을 하다보면 sun grid engine을 사용하여 [[코어]]가 4개 이상인 pc cluster를 활용하곤 한다. 20개의 노드에 코어가 24개씩 있으면 job을 480개로 분할해서 하나씩 일을 주는 것이다. 개인용 pc에서는 이런 방법이 통하지 않으니 python의 multiprocessing을 사용해야한다.
 
서버로 프로그래밍을 하다보면 sun grid engine을 사용하여 코어가 4개 이상인 pc cluster를 활용하곤 한다. 20개의 노드에 코어가 24개씩 있으면 job을 480개로 분할해서 하나씩 일을 주는 것이다. 개인용 pc에서는 이런 방법이 통하지 않으니 python의 multiprocessing을 사용해야한다.


파이썬에서는 thread와 multiprocessing이라는 두 가지 내부 모듈이 있는데, 처음에는 이 둘이 어떤 이유로 성능차이를 보이는지 알 수 없었지만 관련 책자들을 찾아보다 보니 그 차이와 활용시점에 대해서 기술되어 있었다.
파이썬에서는 thread와 multiprocessing이라는 두 가지 내부 모듈이 있는데, 처음에는 이 둘이 어떤 이유로 성능차이를 보이는지 알 수 없었지만 관련 책자들을 찾아보다 보니 그 차이와 활용시점에 대해서 기술되어 있었다.
Line 1,667: Line 1,710:
아무래도 multiprocessing 하나만 사용했을 때는 속도상의 이점이 크게 느껴지지 않을 수도 있다. numba, cython과 같은 라이브러리를 사용하면 속도가 약 20배 정도 빨라지므로 이 둘을 조합하면 파이썬으로도 만족할만한 성능이 나올 것이다.
아무래도 multiprocessing 하나만 사용했을 때는 속도상의 이점이 크게 느껴지지 않을 수도 있다. numba, cython과 같은 라이브러리를 사용하면 속도가 약 20배 정도 빨라지므로 이 둘을 조합하면 파이썬으로도 만족할만한 성능이 나올 것이다.


* 파이썬으로 시도해보는 멀티 코어 프로세싱, 자고 있는 코어들을 깨우기
https://blog.naver.com/ossiriand/220548193193
https://blog.naver.com/ossiriand/220548193193


Line 1,719: Line 1,764:




make와 Makefile - 멍멍멍
* make와 Makefile - 멍멍멍
http://bowbowbow.tistory.com/12
https://bowbowbow.tistory.com/12




Line 1,726: Line 1,771:




OpenSSL 컴파일(compile) & 빌드(build)
* OpenSSL 컴파일(compile) & 빌드(build)
https://www.lesstif.com/pages/viewpage.action?pageId=6291508
https://www.lesstif.com/pages/viewpage.action?pageId=6291508


Line 1,792: Line 1,837:


https://python.flowdas.com/tutorial/appendix.html#executable-python-scripts
https://python.flowdas.com/tutorial/appendix.html#executable-python-scripts
=== cx_Freeze로 실행 파일 만들기 ===
[[cx_Freeze]]로 [[py]] 파일을 [[리눅스]], [[맥OS]], [[윈도우즈]]용 실행 파일로 만들 수 있다.
* 파이썬 실행파일 만들기(cx_Freeze활용)
July 25, 2017
https://koonhous.blogspot.kr/2017/07/create-executable-file-in-python-by-cxfreeze.html
* pygame 을 exe로 변환하기... 너무 힘들다!
2017-11-11
https://stackoverflow.com/questions/47223944/cx-freeze-no-module-named-codecs-windows-10
https://github.com/anthony-tuininga/cx_Freeze/issues/311
원작자가 알아본다니까 기대 중이다.. ㅎㅎ....
https://alegruz.imweb.me/blog/?idx=304335&bmode=view
= 함께 보기 =
* [[프로그래밍]]
* [[트킨터]] ([[Tkinter]])
* [[팬더즈]] ([[pandas]])
* [[뷰티펄 숲]] ([[Beautiful Soup]])
* [[파이게임]] ([[Pygame]])
* [[쟁고우]] ([[Django]])
* [[청부 살인]]


[[Category:프로그래밍]]
[[Category:프로그래밍]]
7

edits

Navigation menu