Difference between revisions of "파이썬"

Jump to navigation Jump to search
50,050 bytes added ,  08:20, 18 April 2020
no edit summary
 
(42 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]])에서 이름을 땄다.
[[파이썬]]([[Python]])은 [[프로그래밍 언어]]의 일종이다.
 
 
[[자바]]([[Java]]), [[C 언어]]([[C language]]), [[C플플]]([[C++]]), [[Python]], [[C#]]이 전세계에서 가장 많이 쓰이는 다섯 개의 [[프로그래밍 언어]]이다.
 
[[C샾]]은 대부분 [[마이크로소프트]]용으로만 쓰이고, [[오브젝티브-C]]([[Objective-C]])는 거의 [[애플]]용으로만 쓰인다.
 




Line 11: Line 18:


* 찰스 펫졸드의 코드:CODE
* 찰스 펫졸드의 코드:CODE
http://freesearch.pe.kr/archives/2406
https://freesearch.pe.kr/archives/2406
 
 
[[리눅스]]는 파이썬 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 폴더로 이동해야 한다.
 
 
[[디렉터리]]([[directory]]) 구분은 [[리눅스]]([[Linux]]), [[비에스디]]([[BSD]]), [[맥OS]]([[macOS]]) 등 [[유닉스]]([[Unix]]) 계열에서는 [[슬래시]]([[slash]]) 기호 /로 하고, 한글 [[윈도우즈]]([[Windows]])에서는 [[백슬래시]]([[backslash]]) 기호 \나 [[원화]] 기호 ₩로 한다. [[폴더]]([[folder]])는 [[그래픽 사용자 인터페이스]]([[GUI]])를 가진 [[운영 체제]]([[OS]])에서 디렉터리 대신에 부르는 말이다.
 
 
 
[[프로그래밍]], [[트킨터]] ([[Tkinter]]), [[팬더즈]] ([[pandas]]), [[뷰티펄 숲]] ([[Beautiful Soup]]), [[파이게임]] ([[Pygame]]) 문서 참조.
 
 
= SoloLearn =
[[안드로이드]] [[스마트폰]] 사용자의 경우 [[플레이 스토어]]([[Play Store]])에서 SoloLearn에서 만든 [[Learn Python]]같은 [[앺]]([[app]])을 설치하여 파이썬 프로그래밍을 배워도 좋다. 지금은 여러 잡다한 프로그래밍 학습 앱이 "SoloLearn: Learn to Code for Free" 앺 하나로 합쳐져서 Learn Python [[앺]] 대신에 새로 나온 [[SoloLearn]] [[앱]]을 깔아야 한다. 사실 아직도 LearnPython을 설치해서 사용할 수는 있다. 하지만 나중에 추가된 깊이 있는 내용은 SoloLearn에만 추가되므로 그냥 SoloLearn [[app]]을 까는 게 낫다.
 
 
 
* #11316 2019-5-6 오후 9:28 [삭제]
폰겜할 시간에 solelearn깔아서 파이썬 배워보고 있는데 이거 끝내면 그냥 딱 입문 수준인거지? 지금 계산기까지 했음
 
   
1: sole->solo    [삭제] 2019-5-6 오후 9:29
 
   
2: [[SoloLearn]] 끝까지 다 끝내면 파이썬 기본 [[프로그래밍]] 방법은 다 배운 거임. 그 다음에는 [[Django for Beginners]]같은 걸로 [[웹 프로그래밍]] 배우면 됨.    [삭제] 2019-5-6 오후 10:20
 
   
3: >2 그리고 [[마약]] 거래 [[싸이트]]든, [[페도]] 싸이트든 만들어서 [[돈]] 벌면 됨. 그 전에 [[코챈]]같은 거 만들어서 연습도 좀 하고.    [삭제] 2019-5-6 오후 10:21
 
   
4: >3 [[웹싸이트]] [[보안]]은 [[리눅스 마스터]]나 [[정보 보안 기사]] 공부 좀 해보든가    [삭제] 2019-5-6 오후 10:23
 
   
5: >4 [[사이버 수사대]]한테 털리면 [[좆]]되니까    [삭제] 2019-5-6 오후 10:34
 
   
9: >2 [[Django Girls]]도 [[웹 프로그래밍]] 입문자용으로 볼만함    [삭제] 2019-5-6 오후 11:33
 
 
16: >7 파이썬 [[프로그래밍]]의 응용을 배우려면 [[트킨터]], [[팬더즈]], [[뷰티펄 숲]], [[파이게임]] 문서 읽고 따라해봐라.    [삭제] 2019-5-7 오전 2:59
 
   
8: 폰겜은 해도 남는 게 없지만, [[프로그래밍]]은 배워놓으면 두고두고 써먹지 ㅋㅋㅋ    [삭제] 2019-5-6 오후 11:28


   
10: [[댓글]] 달아준 [[게이]]들 전부 고맙다    [삭제] 2019-5-6 오후 11:50


[[안드로이드]]의 경우 [[플레이 스토어]]([[Play Store]])에서 SoloLearn에서 만든 Learn Python같은 [[]]([[app]])을 설치하여 파이썬 프로그래밍을 배워도 좋다. 지금은 여러 잡다한 프로그래밍 학습 앱이 "SoloLearn: Learn to Code for Free" 하나로 합쳐져서 Learn Python 대신에 새로 나온 앱을 깔아야 한다.
   
11: >10 [[일베충]]은 나가 죽어라. [[김대중]] 만세! [[노무현]] 만세!! [[문재인]] 만만세!!!    [삭제] 2019-5-7 오전 0:10


[[루비]]([[Ruby]])라고 파이썬과 유사한 프로그래밍 언어가 일본에서 만들어졌다. 루비도 세계적으로 꽤 많이 쓰인다.
   
12: >11 [[이승만]] [[전쟁]] 나자 [[서울]] 사수한다고 방송 틀어놓고 한강철교 끊고 도망간 새끼. [[박정희]] 위계를 이용한 [[여대생]], [[여가수]], [[여자 탤런트]] [[강간마]] 새끼. [[전두환]] [[부산 형제복지원]] 대량 [[납치]] 및 [[살인]] 지시한 새끼.    [삭제] 2019-5-7 오전 0:45
 
   
13: >12 [[박정희]], [[전두환]] 때는 대통령 아니라 고위 공직자 중에 [[여자 연예인]] 따먹은 사람들 많은데. [[계엄령]]이니 뭐니 해서 공포 정치 [[독재]] 정치 시기라 잡아온 다음에 [[강간]]하고 돌려보냄. [[처녀]] [[연예인]]이든, [[유부녀]] 연예인이든. 그래도 어디 가서 [[말]]도 못함.    [삭제] 2019-5-7 오전 0:51
 
   
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 를 인터넷 강의로 들어보자!
 


== 인터프리터 언어 ==
== 인터프리터 언어 ==
[[인터프리터]]([[interpreter]])는 [[소스 코드]]([[source code]])를 한 줄씩 읽어 내려가며 실행하는 프로그램이다. [[컴파일러]]와는 대조적이며, 이 방식을 쓰는 [[프로그래밍 언어]]는 정말 많다. 대표적인 것이 [[Python]]이다. [[스크립트 언어]]의 사실상 전부가 해당 언어의 인터프리터를 가지고 있으며, 각종 DSL(도메인 특화 언어)의 해석 엔진도 인터프리터로 구현된다.
[[인터프리터]]([[interpreter]])는 [[소스 코드]]([[source code]])를 한 줄씩 읽어 내려가며 실행하는 프로그램이다. [[컴파일러]]와는 대조적이며, 이 방식을 쓰는 [[프로그래밍 언어]]는 정말 많다. 대표적인 것이 [[Python]]이다. [[스크립트 언어]]의 사실상 전부가 해당 언어의 인터프리터를 가지고 있으며, 각종 DSL(도메인 특화 언어)의 해석 엔진도 인터프리터로 구현된다.


인터프리터는 실행 시마다 소스 코드를 한 줄씩 기계어로 번역하는 방식이기 때문에 실행 속도는 정적 컴파일 언어(이하 '컴파일 언어')보다 느리다. 이를 해결하기 위하여 바이트코드 컴파일러를 이용해 소스 코드를 [[가상머신]] 타겟의 [[바이트코드]](bytecode)로 변환하거나, 반복적으로 쓰이는 함수와 클래스 등의 기계어 코드를 캐싱하는 [[JIT]] 컴파일러를 인터프리터에 내장하는 방식이 도입되었다. 바이트코드로 변환하는 것은 [[기계어]]로 변환하는 것에 비하면 비교적 간단하다. 바이트코드(Bytecode)는 고급 언어로 작성된 소스 코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다. 가상머신은 이 바이트코드를 각각의 하드웨어 아키텍처에 맞는 기계어로 다시 컴파일한다. 어셈블리어에 가까운 형태를 띄고 있으며 어떨 때는 가상머신용 오브젝트 코드까지 바이트코드라고 부르기도 한다.
인터프리터는 실행 시마다 소스 코드를 한 줄씩 기계어로 번역하는 방식이기 때문에 실행 속도는 정적 컴파일 언어(이하 '컴파일 언어')보다 느리다. 이를 해결하기 위하여 바이트코드 컴파일러를 이용해 소스 코드를 [[가상머신]] 타겟의 [[바이트코드]](bytecode)로 변환하거나, 반복적으로 쓰이는 함수와 클래스 등의 기계어 코드를 캐싱하는 [[JIT]] 컴파일러를 인터프리터에 내장하는 방식이 도입되었다. [[바이트코드]]로 변환하는 것은 [[기계어]]로 변환하는 것에 비하면 비교적 간단하다. 바이트코드(Bytecode)는 고급 언어로 작성된 소스 코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다. 가상머신은 이 바이트코드를 각각의 하드웨어 아키텍처에 맞는 기계어로 다시 컴파일한다. 어셈블리어에 가까운 형태를 띄고 있으며 어떨 때는 가상머신용 오브젝트 코드까지 바이트코드라고 부르기도 한다.


여기까지 읽었다면 그 느린 것을 왜 쓰느냐는 의문에 도달하겠지만, 인터프리터 언어는 '''프로그램 수정이 간단하다'''는 장점이 있다. 컴파일러는 소스 코드를 번역해서 실행 파일을 만들기 때문에 프로그램에 수정 사항이 발생하면 소스 코드를 다시 컴파일해야 한다. 프로그램이 작고 간단하면 문제가 없지만 프로그램 덩치가 커지면 컴파일이 시간 단위가 되는 일이 많아진다. 하지만 인터프리터는 소스 코드를 수정해서 실행시키면 끝. 이 장점 때문에 인터프리터 언어는 수정이 빈번히 발생하는 용도의 프로그래밍에서 많이 사용된다. 이 장점을 최대한 살려서 인터프리터를 적극적으로 채용한 것이 [[스크립트 언어]]다.
여기까지 읽었다면 그 느린 것을 왜 쓰느냐는 의문에 도달하겠지만, 인터프리터 언어는 '''프로그램 수정이 간단하다'''는 장점이 있다. 컴파일러는 소스 코드를 번역해서 실행 파일을 만들기 때문에 프로그램에 수정 사항이 발생하면 소스 코드를 다시 컴파일해야 한다. 프로그램이 작고 간단하면 문제가 없지만 프로그램 덩치가 커지면 컴파일이 시간 단위가 되는 일이 많아진다. 하지만 인터프리터는 소스 코드를 수정해서 실행시키면 끝. 이 장점 때문에 인터프리터 언어는 수정이 빈번히 발생하는 용도의 프로그래밍에서 많이 사용된다. 이 장점을 최대한 살려서 인터프리터를 적극적으로 채용한 것이 [[스크립트 언어]]다.
Line 34: Line 100:
소스 코드가 쉽게 공개된다는 단점이 있다. 컴파일되는 언어도 [[기계어]]를 읽으면 [[리버스 엔지니어링|프로그램이 어떻게 동작하는지 알 수 있으며]], 디컴파일러를 이용하여 원본 언어로 변환하는 것도 불가능은 아니다. 하지만 인터프리터를 주로 사용하는 언어의 경우 바이트코드 등으로 컴파일해서 배포하는 경우도 잘 없을 뿐더러, 지원한다고 해도 컴파일 전/후 언어가 비교적 단순한 편이라서 쉽게 디컴파일이 가능하다. 암호화를 해도 어차피 실행될 때는 복호화되니 무용지물. 그나마 식별자들을 전부 이상하게 바꾸고 해석하기 힘들게 난독화하는 정도 외에 할 수 있는 방법이 없다.
소스 코드가 쉽게 공개된다는 단점이 있다. 컴파일되는 언어도 [[기계어]]를 읽으면 [[리버스 엔지니어링|프로그램이 어떻게 동작하는지 알 수 있으며]], 디컴파일러를 이용하여 원본 언어로 변환하는 것도 불가능은 아니다. 하지만 인터프리터를 주로 사용하는 언어의 경우 바이트코드 등으로 컴파일해서 배포하는 경우도 잘 없을 뿐더러, 지원한다고 해도 컴파일 전/후 언어가 비교적 단순한 편이라서 쉽게 디컴파일이 가능하다. 암호화를 해도 어차피 실행될 때는 복호화되니 무용지물. 그나마 식별자들을 전부 이상하게 바꾸고 해석하기 힘들게 난독화하는 정도 외에 할 수 있는 방법이 없다.


== 동적 타입 언어 ==
=== JIT 컴파일 ===
[[정적 타입 언어]]: 자료형(Type)이 고정돼 있는 언어. 설명이 어려운데 간단히 얘기하자면 정수형으로 정의한 1은 계속 정수형 1로 남아있다. 이걸 실수형 1.0으로 바꾸려면 명시적인 형변환(Type casting)을 해줘야 한다. 묵시적 형변환이 이루어지는 경우도 있지만 제한적이다.
[[JIT 컴파일]]([[just-in-time compilation]]) 또는 [[동적 번역]]([[dynamic translation]])은 [[프로그램]]([[program]])을 실제 실행하는 시점에 [[기계어]]([[machine code]] 또는 [[machine language]])로 번역하는 [[컴파일]]([[compile]]) 기법이다. 이 기법은 프로그램의 실행 속도를 빠르게 하기 위해 사용된다.


[[동적 타입 언어]]: 자료형이 그것을 처리할 함수(또는 메서드)에 따라 그때그때 바뀌는 언어. 예를 들어 정수형 1을 정의했어도 그걸 처리할 함수가 문자열을 받아들이게 설계돼있다면 자동으로 정수형 1을 문자 1로 바꿔준다.  
전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두가지가 있는데, 인터프리트 방식과 정적 [[컴파일]] 방식으로 나눌 수 있다. 이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며, 반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.


JIT 컴파일러는 두 가지의 방식을 혼합한 방식으로 생각할 수 있는데, 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.


정적 타입 언어가 별 거 아닌 것처럼 느껴질 수도 있지만 실은 프로그래머들을 짜증나게 하는 주범이 바로 형변환(Type casting)이기 때문에 동적 타입 언어는 이런 점에서 매우 강점을 가진다. 특히 객체 지향 언어에서는 동적 타입 및 그것의 일반화버전이라 할 수 있는 덕 타이핑(Duck typing)이 프로그래머에게 수많은 혜택을 준다. 예를 들어 오리라는 타입과 닭이라는 타입이 있고 둘 다 날아오르는 기능이 있다면 정적 타입 언어에서는 상위 인터페이스를 추출하는 등의 부가 작업이 쩌는데 덕 타이핑을 지원하는 언어에서는 그냥 넣어버리면 알아서 난다. 물론 단점도 있는데 고래 같이 못 나는 타입을 집어넣으면 실행시간 오류(런타임 에러)뱉어버린다는거. 정적 타입 언어는 이런 문제가 없다...고 알려져있지만 거짓말이고 정적 타입 언어도 닭은 닭인데 통닭 같이 못 나는 타입을 집어넣는 바람에(기술적으로는 해당 메서드가 구현이 안된 객체) 런타임 에러가 나올 수 있다.
최근의 [[자바 가상 머신]]과 .NET, [[V8]](node.js)에서는 JIT 컴파일을 지원한다. 즉, 자바 컴파일러가 [[자바 프로그래밍 언어|자바 프로그램 코드]][[바이트코드]]로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 기계어로 변환한다.


그런데 [[하스켈]]([[Haskell]])은 정적 타입 언어다. 그런데도 하스켈 코드에는 형 변환 연산자가 없다. 이게 어찌된 일이냐 하면 하스켈 언어는 정적 타입 언어이지만 강력한 타입 추론 기능을 내장하고 있어 형변환을 언어 차원에서 자동으로 해 준다. 동적 타입 언어 역시 자동 형변환을 제공하는데 무슨 차이가 있냐면 그 형변환을 런타임에 하느냐 컴파일 타임에 하느냐의 차이다. 즉 버그가 발생하는 시점을 런타임에서 컴파일 타임으로 끌어당긴다. 타입 추론 엔진은 딱히 하스켈 같은 선언형, 함수형 언어에만 도입할 수 있는 건 아니므로 신형 설계가 적용된 언어라면 명령형, 객체 지향 언어라도 타입 추론을 할 수 있다. 단지 정적 타입 언어로 유명한 C나 자바에 타입 추론 엔진이 없을 뿐이지. 여기서 타입 추론은 묵시적 형변환과 동의어가 아니다. 겉으로 보이는 건 묵시적 형변환하고 똑같지만.
[[CPython]]은 [[JIT]]를 지원하지 않으며 [[PyPy]]와 [[Pyston]]은 JIT를 기본으로 지원한다. [[Jython]]과 [[IronPython]]은 그들이 [[빌드]]([[build]])하는 가상 머신의 JIT 컴파일러를 사용한다. Cpython의 경우 [[과학]]이나 [[천체물리학]]에 쓰는 [[Numba]]나 [[HOPE]] 모듈을 사용하여 JIT 컴파일러를 쓸 수 있다. https://numba.pydata.org/ https://github.com/jakeret/hope


파이썬이 동적 타입 언어(dynamically typed language)라는 점이 큰 프로젝트에서는 단점으로 작용하여 자료구조 설계나 디버깅이 어렵다는 지적도 있다. 다만 "정적 타입 언어 vs. 동적 타입 언어" 논쟁은 서로의 장단점이 있으며 일종의 종교논쟁 취급 받는다. 일례로 OCaml같은 강력한 타입 인터페이스(Hindly-Milner)를 가진 경우라 할지라도 타입 에러 정도는 거의 모두 컴파일 타임에 잡아내는 있는 반면에, 모든 버그가 타입 에러는 아니기 때문에 여전히 테스트 및 디버깅 과정은 필요하며, 타입 시스템으로 인한 부담 때문에 빠른 구현에는 부담이 갈 수 있다. 반면에 동적 언어는 빠른 구현의 이점이 있지만 타입 에러가 많이 나는 특징이 있다. 그러나 커버리지가 높은 테스트 세트로 어느정도 커버할 수 있으며 최근의 추세와 부합하는 방식이기도 하다.
== 동적 타입 언어 ==
 
[[정적 타입 언어]]([[statically typed language]]): [[자료형]]([[type]])이 고정돼 있는 [[프로그래밍 언어]]([[programming language]]). 설명이 어려운데 간단히 얘기하자면 정수형으로 정의한 1은 계속 정수형 1로 남아있다. 이걸 실수형 1.0으로 바꾸려면 명시적인 형변환(Type casting)을 해줘야 한다. 묵시적 형변환이 이루어지는 경우도 있지만 제한적이다.
== 높은 생산성 ==
http://xkcd.com/353/ 파이썬의 높은 생산성에 대한 만화 ~~뭐야 이거 2.x 버전이잖아~~
 
[[인터프리터]] 언어이면서 우수한 자료형과 다양한 모듈 등을 제공해 개발기간이 매우 단축되는 것이 특징. '[[C 언어]]로 2년동안 완성하지 못한 프로젝트를 파이썬으로 한달만에 해냈다'는 극적인 경험담이 있을 정도다. C언어와의 접착성도 좋기 때문에, 일단 Python으로 빨리 구현하고, 남은 시간에 속도에 병목이 되는 부분을 C로 전환하는 전략을 내세우고 있다. 버전이 올라가면서 Python 자체도 그리 느리지 않게 되었다. ~~맛들이면 다른 언어로 전환하기 힘든 부작용이 생긴다 카더라.~~


참고로 저 [[xkcd]] 만화는 파이썬에서 import antigravity라고 하면 나오는 [[이스터 에그]]이다.(...) http://www.youtube.com/watch?v=_V0V6Rk6Fp4
[[동적 타입 언어]]([[dynamically typed language]]): 자료형이 그것을 처리할 [[함수]]([[function]]) 또는 [[메서드]]([[method]])에 따라 그때 그때 바뀌는 [[언어]]([[language]]). 예를 들어 정수형 1을 정의했어도 그걸 처리할 함수가 문자열을 받아들이게 설계돼있다면 자동으로 정수형 1을 문자 1로 바꿔준다.  


== 디자인 철학 ==
[[펄]]([[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]])을 지니게 되었다.
[[정적 타입 언어]]가 별 거 아닌 것처럼 느껴질 수도 있지만 실은 프로그래머들을 짜증나게 하는 주범이 바로 형변환(type casting)이기 때문에 동적 타입 언어는 이런 점에서 매우 강점을 가진다. 특히 객체 지향 언어에서는 동적 타입 및 그것의 일반화버전이라 할 수 있는 덕 타이핑(duck typing)프로그래머에게 수많은 혜택을 준다. 예를 들어 오리라는 타입과 닭이라는 타입이 있고 둘 다 날아오르는 기능이 있다면 정적 타입 언어에서는 상위 인터페이스를 추출하는 등의 부가 작업이 쩌는데 덕 타이핑을 지원하는 언어에서는 그냥 넣어버리면 알아서 난다. 물론 단점도 있는데 고래 같이 못 나는 타입을 집어넣으면 실행시간 오류(런타임 에러)를 뱉어버린다는거. 정적 타입 언어는 이런 문제가 없다...고 알려져있지만 거짓말이고 정적 타입 언어도 닭은 닭인데 통닭 같이 못 나는 타입을 집어넣는 바람에(기술적으로는 해당 메서드가 구현이 안된 객체) 런타임 에러가 나올 수 있다.


* 아름다운 것이 추한 것보다 낫다.(Beautiful is better than ugly)
그런데 [[하스켈]]([[Haskell]])은 [[정적 타입 언어]]다. 그런데도 하스켈 코드에는 형 변환 연산자가 없다. 이게 어찌된 일이냐 하면 하스켈 언어는 정적 타입 언어이지만 강력한 타입 추론 기능을 내장하고 있어 형변환을 언어 차원에서 자동으로 해 준다. 동적 타입 언어 역시 자동 형변환을 제공하는데 무슨 차이가 있냐면 그 형변환을 런타임에 하느냐 컴파일 타임에 하느냐의 차이다. 즉 버그가 발생하는 시점을 런타임에서 컴파일 타임으로 끌어당긴다. 타입 추론 엔진은 딱히 하스켈 같은 선언형, 함수형 언어에만 도입할 수 있는 건 아니므로 신형 설계가 적용된 언어라면 명령형, 객체 지향 언어라도 타입 추론을 할 수 있다. 단지 정적 타입 언어로 유명한 C나 자바에 타입 추론 엔진이 없을 뿐이지. 여기서 타입 추론은 묵시적 형변환과 동의어가 아니다. 겉으로 보이는 건 묵시적 형변환하고 똑같지만.
* 명쾌한 것이 암시적인 것보다 낫다. (Explicit is better than implicit)
* 간결한 것이 복잡한 것보다 낫다. (Simple is better than complex)


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


Python만 쓰는 것이 답은 아니다. 동적 인터프리팅 언어의 한계로 당연히 C, C++ 같은 low-level 언어의 계산속도를 따라갈 순 없으며, 사실 [[자바스크립트]]나 [[LISP]]계열 언어 등 동적 언어들을 전체를 주욱 놓고 비교 해봐도 속도가 빠른 편은 아니다. 보통 인터프리터 언어의 속도 문제를 극복하기 위해서 인터프리터에 [[JIT]] 컴파일러를 넣는 추세지만 python의 표준인 CPython에서는 구현이 안되어 있다. ~~Pyston 프로젝트가 잘되면 [[수정바람]].~~
Python만 쓰는 것이 답은 아니다. 동적 인터프리팅 언어의 한계로 당연히 C, C++ 같은 low-level 언어의 계산속도를 따라갈 순 없으며, 사실 [[자바스크립트]]나 [[LISP]]계열 언어 등 동적 언어들을 전체를 주욱 놓고 비교 해봐도 속도가 빠른 편은 아니다. 보통 인터프리터 언어의 속도 문제를 극복하기 위해서 인터프리터에 [[JIT]] 컴파일러를 넣는 추세지만 python의 표준인 CPython에서는 구현이 안되어 있다.
 
C 바인딩인 ctypes도 있다.


= 사용 용도 =
= 사용 용도 =
[[자바]]([[Java]]), [[C 언어]]([[C]]), [[C플플]]([[C++]]), [[C샾]]([[C#]]), [[파이썬]]([[Python]])이 전세계에서 가장 많이 쓰이는 다섯 개의 [[프로그래밍 언어]]이다. [[애플]]([[Apple]])에서 많이 쓰이는 [[오브젝티브-C]]([[Objective-C]])도 [[C 언어]] 파생 언어 중 하나이다. C샾은 [[마이크로소프트]]([[Microsoft]])에서 만들었다. 거의 애플용으로만 쓰이는 오프젝티브-C처럼 C#도 거의 [[MS]]용으로만 쓰인다. [[자바]], [[C 언어]], [[C++]], [[파이썬]]은 [[리눅스]], [[안드로이드]], [[맥OS]], [[아이OS]]([[iOS]]), [[윈도우즈]] 등 [[운영 체제]]를 가리지 않고 다양한 개발에 쓰인다.
[[기계 학습]]에 관심을 갖는 사람이 지난 1년간 폭발적으로 증가했다. 역사적인 알파고와 이세돌의 경기가 3월에 있었고, 그 이후로 더욱 주목을 받고 있다. 숫자나 문자 데이터만을 사용하던 기계 학습 방식은 사용자들의 모바일 장비 사용 패턴을 학습하는 것으로 진화하고 있다. 이 점으로만 봐도 기계 학습은 2017년에 더 중요한 자리를 차지할 것이다.
[[기계 학습]]에 관심을 갖는 사람이 지난 1년간 폭발적으로 증가했다. 역사적인 알파고와 이세돌의 경기가 3월에 있었고, 그 이후로 더욱 주목을 받고 있다. 숫자나 문자 데이터만을 사용하던 기계 학습 방식은 사용자들의 모바일 장비 사용 패턴을 학습하는 것으로 진화하고 있다. 이 점으로만 봐도 기계 학습은 2017년에 더 중요한 자리를 차지할 것이다.


Line 106: Line 169:


[[가상 현실]](Virtual Reality, VR)과 증강 현실(Augmented Reality, AR)이 등장한 지는 좀 되었지만, 비로소 이 기술들은 흥미로운 경험을 제공할 정도까지 성숙했다. Facebook(Oculus Rift), Google(Daydream), Microsoft(Windows Holographic) 들은 가상 현실 플랫폼을 제공하고 서드 파티의 개발자들을 기다리고 있다. VR 헤드셋은 멀미를 줄이거나, 게임 이외의 분야에서도 즐거운 경험을 제공하기 위한 도전을 하고 있으며, 아직은 그 정도 단계이다.
[[가상 현실]](Virtual Reality, VR)과 증강 현실(Augmented Reality, AR)이 등장한 지는 좀 되었지만, 비로소 이 기술들은 흥미로운 경험을 제공할 정도까지 성숙했다. Facebook(Oculus Rift), Google(Daydream), Microsoft(Windows Holographic) 들은 가상 현실 플랫폼을 제공하고 서드 파티의 개발자들을 기다리고 있다. VR 헤드셋은 멀미를 줄이거나, 게임 이외의 분야에서도 즐거운 경험을 제공하기 위한 도전을 하고 있으며, 아직은 그 정도 단계이다.
파이썬([[Python]])을 배우면 [[오픈 소스]]인 [[토어챝]]([[TorChat]])의 [[소스 코드]]를 수정하여 자신이 원하는 기능을 마음대로 추가할 수 있다.


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


== 웹 프로그래밍 ==
== 웹 프로그래밍 ==
Line 116: Line 182:


또한 이런 굵직한 데이터베이스를 직접 이용하는 것 외에도 파이썬에는 재미있는 모듈이 하나 더 있다. 바로 피클(pickle)이라는 모듈이다. 피클은 파이썬에서 사용되는 자료들을 변형없이 그대로 파일에 저장하고 불러오는 일들을 맡아 한다. 이 책에서는 외장 함수에서 피클을 어떻게 사용하고 활용하는지에 대해서 알아본다.
또한 이런 굵직한 데이터베이스를 직접 이용하는 것 외에도 파이썬에는 재미있는 모듈이 하나 더 있다. 바로 피클(pickle)이라는 모듈이다. 피클은 파이썬에서 사용되는 자료들을 변형없이 그대로 파일에 저장하고 불러오는 일들을 맡아 한다. 이 책에서는 외장 함수에서 피클을 어떻게 사용하고 활용하는지에 대해서 알아본다.


== 과학 및 공학 분야 ==
== 과학 및 공학 분야 ==
빠른 아이디어 구현이 생명인 연구계에서는 각광 받고 있다(특히 컴퓨터 과학). 연구계에서는 Java를 제외하면 [[컴퓨터 공학과]] 외에는 그나마 유일한 경쟁자가 [[MatLab]]이라 볼 수 있는데, 오픈 소스가 아니라는 점이 최근 추세와 맞지 않아 입지가 좁아지고 있다. 게다가 패키지 설치를 참 더럽게 이상하게 만들어놨다. Python의 경우는 지원 라이브러리의 대부분이 오픈 소스이기 때문에 저장소에서 그냥 커맨드 라인(pip install) 한줄로 필요한 거의 모든 라이브러리를 가져다 쓸 수 있다.
빠른 아이디어 구현이 생명인 연구계에서는 각광 받고 있다. 연구계에서는 [[자바]]([[Java]])를 제외하면 그나마 유일한 경쟁자가 [[MatLab]]이라 볼 수 있는데, [[오픈 소스]]가 아니라는 점이 최근 추세와 맞지 않아 입지가 좁아지고 있다. 게다가 패키지 설치를 참 더럽게 이상하게 만들어놨다. Python의 경우는 지원 라이브러리의 대부분이 오픈 소스이기 때문에 저장소에서 그냥 커맨드 라인(pip install) 한줄로 필요한 거의 모든 라이브러리를 가져다 쓸 수 있다.


=== 수치 연산 프로그래밍 ===
=== 수치 연산 프로그래밍 ===
사실 파이썬은 수치 연산 프로그래밍에 적합한 언어는 아니다. 수치가 복잡하고 연산이 많다면 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 142: Line 209:
[[EVE 온라인]]은 Python의 경량/고속 실행 버전인 Stackless Python으로 작성되었다. 개발사 CCP Games는 파이썬 재단의 정식 후원자이기도 하다. 2000년대 초에 싱글코어 CPU가 계속 쓰일 줄 알고 서버 코드를 구버전 파이썬으로 짰다가 다중 코어 사용이 힘들어지자, 눈물겨운 마개조를 거듭하여 파이썬이라는 언어가 제공할 수 있는 처리 능력을 한계치까지 뽑아서 쓰고 있다. 전장에서 일어나는 일을 제외한 나머지 시시콜콜한 일을 다른 코어로 돌리기는 하였으나, 게임의 최소 단위인 전장은 구조상의 한계로 하나의 코어만 동원할 수 있다. ~~버그 잡고 최적화하는 프로그래머가 게임 내에서 유명인사가 된 것은 이 게임이 유일하겠지... 이게 다 [[GIL]] 때문.~~
[[EVE 온라인]]은 Python의 경량/고속 실행 버전인 Stackless Python으로 작성되었다. 개발사 CCP Games는 파이썬 재단의 정식 후원자이기도 하다. 2000년대 초에 싱글코어 CPU가 계속 쓰일 줄 알고 서버 코드를 구버전 파이썬으로 짰다가 다중 코어 사용이 힘들어지자, 눈물겨운 마개조를 거듭하여 파이썬이라는 언어가 제공할 수 있는 처리 능력을 한계치까지 뽑아서 쓰고 있다. 전장에서 일어나는 일을 제외한 나머지 시시콜콜한 일을 다른 코어로 돌리기는 하였으나, 게임의 최소 단위인 전장은 구조상의 한계로 하나의 코어만 동원할 수 있다. ~~버그 잡고 최적화하는 프로그래머가 게임 내에서 유명인사가 된 것은 이 게임이 유일하겠지... 이게 다 [[GIL]] 때문.~~


= 대화형 모드 =
파이썬은 대화형 모드로도 쓸 수 있고, 소스 코드를 만들어서 사용할 수도 있다. 대화형은 한 번에 한 줄씩 입력하면서 바로 바로 실행하는 것이고, 편집기에 소스 코드를 적어 py 파일로 저장하면 한번에 여러 줄의 코드를 순차적으로 실행시키는 것이다.
[[리눅스]]라면 기본적으로 파이썬 2.x와 3.x가 기본으로 깔려있다. [[맥 OS]]나 [[윈도우즈]] 사용자의 경우 https://www.python.org/downloads/ 에서 다운로드 받아 설치한다.
[[칼리 리눅스]] 기준으로 설명하겠다. 우선 [[터미널]]을 띄운다. 그리고 아래와 같이 입력하면 파이썬 2.7.12가 실행된다.
python
그리고 뜬 >>>에 [[소스 코드]]를 쓰면 된다.
print("hello world")
라고 치면
hello world
라고 뜬다. print는 모니터 화면에 출력하라는 의미이다. 이제 exit()를 입력하거나 컨트롤 키(Ctrl)와 d 키를 동시에 눌러 빠져나온다.
이제 터미널에
python3
를 입력하여 파이썬 3.5.2를 실행시켜보자. 거기에
print("hello world")
를 입력하면 역시
hello world
라고 뜬다.
요즘에는 파이썬 2.x 버전은 잘 안 쓰니, 파이썬 3.x 버전을 쓰도록 하자. 아래의 모든 예문은 파이썬 3.x를 기준으로 작성되어졌다.
>>> 뒤에 2+4라고 입력하면 6이라고 뜨고, 3+2-7이라고 입력하면 -2이라고 뜬다. 3*7을 하면 21이 뜨고, 3/4를 해보면 0.75가 뜨고, 3/7을 하면 0.42857142857142855가 뜬다. *는 곱하기고, /는 나누기다. 역시 exit()를 입력하여 종료시킨다.
>>> x = 5
>>> if x == 10:
...      print('10입니다.') # ← 들여쓰기 4칸
... else:
...      print('10이 아닙니다.') # ← 들여쓰기 4칸
... # ← 빈 줄에서 엔터 키를 누름
10이 아닙니다.
위와 같이 대화형 모드에서도 if문과 else문도 사용 가능하고, 여러 줄의 코드도 실행할 수 있다.


= 소스 코드 작성 =
= 소스 코드 작성 =
Line 186: Line 214:


[[리눅스]], [[맥OS]], [[윈도우즈]]에서 모두 사용 가능한 Sublime Text가 괜찮은 것 같다.
[[리눅스]], [[맥OS]], [[윈도우즈]]에서 모두 사용 가능한 Sublime Text가 괜찮은 것 같다.


== 들여쓰기 ==
== 들여쓰기 ==
Line 191: Line 220:


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


== 주석 ==
== 주석 ==
Line 242: Line 274:
  # -*- coding: cp949 -*-
  # -*- coding: cp949 -*-
이런 부분은 주석이 아니고 특수한 의미를 가지고 있는 행입니다.
이런 부분은 주석이 아니고 특수한 의미를 가지고 있는 행입니다.


== 소스 코드 문자 인코딩 ==
== 소스 코드 문자 인코딩 ==
Line 247: Line 280:


https://python.flowdas.com/tutorial/interpreter.html#source-code-encoding
https://python.flowdas.com/tutorial/interpreter.html#source-code-encoding
= 대화형 인터프리터 =
[시작] 메뉴에서 [프로그램 → Python 3.X → Python 3.X(XX-bit)]을 선택하면 다음과 같은 화면이 나타난다.
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AM...
Type "help", "copyright", "credits" or "license" for more information.
>>>
위와 같은 것을 대화형 인터프리터라고 하는데, 앞으로 이 책에서는 이 인터프리터로 파이썬 프로그래밍의 기초적인 사항들에 대해 설명할 것이다.
대화형 인터프리터는 파이썬 쉘(Python shell)이라고도 한다. 3개의 꺾은 괄호(>>>)는 프롬프트(prompt)라고 한다.
대화형 인터프리터를 종료할 때는 Ctrl+Z 를 누른다 (유닉스 계열에서는 Ctrl+D). 또는 다음의 예와 같이 sys 모듈을 사용하여 종료할 수도 있다.
>>> import sys
>>> sys.exit()
파이썬은 대화형 모드로도 쓸 수 있고, 소스 코드를 만들어서 사용할 수도 있다. 대화형은 한 번에 한 줄씩 입력하면서 바로 바로 실행하는 것이고, 편집기에 소스 코드를 적어 py 파일로 저장하면 한번에 여러 줄의 코드를 순차적으로 실행시키는 것이다.
[[리눅스]]라면 기본적으로 파이썬 2.x와 3.x가 기본으로 깔려있다. [[맥 OS]]나 [[윈도우즈]] 사용자의 경우 https://www.python.org/downloads/ 에서 다운로드 받아 설치한다.
[[칼리 리눅스]] 기준으로 설명하겠다. 우선 [[터미널]]을 띄운다. 그리고 아래와 같이 입력하면 파이썬 2.7.12가 실행된다.
python
그리고 뜬 >>>에 [[소스 코드]]를 쓰면 된다.
print("hello world")
라고 치면
hello world
라고 뜬다. print는 모니터 화면에 출력하라는 의미이다. 이제 exit()를 입력하거나 컨트롤 키(Ctrl)와 d 키를 동시에 눌러 빠져나온다.
이제 터미널에
python3
를 입력하여 파이썬 3.5.2를 실행시켜보자. 거기에
print("hello world")
를 입력하면 역시
hello world
라고 뜬다.
요즘에는 파이썬 2.x 버전은 잘 안 쓰니, 파이썬 3.x 버전을 쓰도록 하자. 아래의 모든 예문은 파이썬 3.x를 기준으로 작성되어졌다.
>>> 뒤에 2+4라고 입력하면 6이라고 뜨고, 3+2-7이라고 입력하면 -2이라고 뜬다. 3*7을 하면 21이 뜨고, 3/4를 해보면 0.75가 뜨고, 3/7을 하면 0.42857142857142855가 뜬다. *는 곱하기고, /는 나누기다. 역시 exit()를 입력하여 종료시킨다.
>>> x = 5
>>> if x == 10:
...      print('10입니다.') # ← 들여쓰기 4칸
... else:
...      print('10이 아닙니다.') # ← 들여쓰기 4칸
... # ← 빈 줄에서 엔터 키를 누름
10이 아닙니다.
위와 같이 대화형 모드에서도 if문과 else문도 사용 가능하고, 여러 줄의 코드도 실행할 수 있다.
== 매개변수에 초깃값 지정하기 ==
지금까지 함수를 호출할 때 항상 인수를 넣어서 값을 전달했습니다. 그럼 인수를 생략할 수는 없을까요? 이때는 함수의 매개변수에 초깃값을 지정하면 됩니다. 초깃값은 다음과 같이 함수를 만들 때 매개변수=값 형식으로 지정합니다.
def 함수이름(매개변수=값):
    코드
매개변수의 초깃값은 주로 사용하는 값이 있고, 가끔 다른 값을 사용해야 할 때 활용합니다. 대표적인 예가 print 함수인데 print 함수의 sep는 초깃값이 ' '(공백)으로 지정되어 있어서 대부분 그대로 사용하고, 가끔 sep에 다른 값을 넣어서 사용합니다.
이제 personal_info 함수에서 매개변수 address의 초깃값을 '비공개'로 지정해보겠습니다.
파이썬을 대화형 모드로 실행시킨다. 리눅스의 경우 [[터미널]]에서
python3
를 입력하면 된다.
>>> def personal_info(name, age, address='비공개'):
...    print('이름: ', name)
...    print('나이: ', age)
...    print('주소: ', address)
...
address는 초깃값이 있으므로 personal_info는 다음과 같이 address 부분을 비워 두고 호출할 수 있습니다.
>>> personal_info('홍길동', 30)
이름:  홍길동
나이:  30
주소:  비공개
매개변수에 초깃값이 지정되어 있더라도 값을 넣으면 해당 값이 전달됩니다.
>>> personal_info('홍길동', 30, '서울시 용산구 이촌동')
이름:  홍길동
나이:  30
주소:  서울시 용산구 이촌동
매개변수의 초깃값을 지정할 때 한 가지 주의할 점이 있습니다. 초깃값이 지정된 매개변수 다음에는 초깃값이 없는 매개변수가 올 수 없습니다. personal_info 함수에서 address가 가장 마지막 매개변수였는데 이번에는 address를 두 번째 매개변수로 만들고, 그 다음에 초깃값을 지정하지 않은 age가 오도록 만들어보겠습니다.
>>> def personal_info(name, address='비공개', age):
...    print('이름: ', name)
...    print('나이: ', age)
...    print('주소: ', address)
...
  File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
함수를 만들어보면 문법 에러가 발생합니다. 왜냐하면 함수를 이렇게 만들어버리면 personal_info('홍길동', 30)으로 함수를 호출했을 때 30이 어디로 들어가야 할지 알 수가 없기 때문입니다. address에 들어가려니 age 부분이 비어 버리죠. 잘못된 문법이므로 이렇게 만들면 안 됩니다.
즉, 다음과 같이 초깃값이 지정된 매개변수는 뒤쪽에 몰아주면 됩니다.
def personal_info(name, age, address='비공개'):
def personal_info(name, age=0, address='비공개'):
def personal_info(name='비공개', age=0, address='비공개'):
참고로 def personal_info(name='비공개', age=0, address='비공개'):와 같이 모든 매개변수에 초깃값을 지정하면 personal_info()처럼 인수를 넣지 않고 호출할 수 있습니다.
지금까지 위치 인수, 키워드 인수, 매개변수 초깃값 사용 방법을 알아보았습니다. 함수에서 *와 **를 붙이는 문법이 조금 생소할 수도 있습니다. 여기서는 *를 리스트에 사용하고, **를 딕셔너리에 사용한다는 점만 기억하면 됩니다.
파이썬 코딩 도장: 32.4 매개변수에 초깃값 지정하기
https://dojang.io/mod/page/view.php?id=1050


= 터미널에서 실행하는 소스 코드 =
= 터미널에서 실행하는 소스 코드 =
Line 255: Line 406:
  python bozy.py
  python bozy.py
라고 입력하면 실행된다. python3라고 입력하면 파이썬 3가 실행되고, python이라고 입력하면 파이썬 2.7 버전이 실행된다. 리눅스 [[배포판]]에 따라 파이썬 3가 기본인 경우도 있다.
라고 입력하면 실행된다. python3라고 입력하면 파이썬 3가 실행되고, python이라고 입력하면 파이썬 2.7 버전이 실행된다. 리눅스 [[배포판]]에 따라 파이썬 3가 기본인 경우도 있다. 만약 my sister bozy.py처럼 파일 이름에 [[띄어쓰기]]가 들어갈 경우
python3 "my sister bozy.py"
python3 'my sister bozy.py'
처럼 [[따옴표]]로 묶어주면 된다.




[[윈도우즈]]의 경우 파이썬을 설치할 때 “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
라고 입력하면 된다. 설치할 때 “Add Python 3.6 to PATH”를 체크하지 않았으면 이런식으로 [[Command Prompt]]의 아무곳에서나 python이라는 [[명령어]]를 입력하는 것만으로는 파이썬이 실행되지 않는다. 대신 [[명령 프롬프트]]의
C:\Users\username
[[디렉터리]]에서
cd \
해서
C:\
로 이동하고
cd python36
을 해서
C:\python36
으로 이동
  python bozy.py
  python bozy.py
라고 입력하면 된다. 설치할 때 “Add Python 3.6 to PATH”를 체크하지 않았으면 이런식으로 python이라는 명령어만으로는 실행되지 않는다.
와 같은 식으로 실행해야 한다. 만약 설치 경로가 C:\Users\username\AppData\Local\Programs\Python\Python36-32와 같을 경우 해당 경로로 이동해야 한다. 참고로 해당 [[디렉터리]] 내의 [[폴더]]와 [[파일]] 목록을 보는 [[명령어]]는 dir이다. dir에 해당하는 리눅스 명령어는 ls이다. 상위 디렉터리로 가는 명령어는 [[리눅스]]나 [[윈도우즈]]나 모두
cd ..
이다.
 
 
* [Python] 윈도우에서 파이썬을 설치하고 실행해보자.
https://selfc.tistory.com/27
 
 


== 반복 실행 ==
== 반복 실행 ==
Line 406: Line 581:
  _ = list(eval(r"print(x, '*', y, '=', x*y, end = ('\n' if y == 9 else ' '))") for x in range(2,10) for y in range(1,10))
  _ = list(eval(r"print(x, '*', y, '=', x*y, end = ('\n' if y == 9 else ' '))") for x in range(2,10) for y in range(1,10))


== 99병의 맥주 ==
 
= GUI 지원되는 소스 코드 =
GUI(Graphic User Interface) 프로그래밍이란 쉽게 말해 윈도우 창처럼 화면을 보며 마우스나 키보드로 조작할 수 있는 프로그램을 만드는 것이다. 파이썬으로 GUI 프로그램을 만드는 것은 다른 언어를 이용해 만드는 것보다 훨씬 쉽다. 대표적인 예로 파이썬 프로그램을 설치할때 함께 설치되는 기본 모듈인 Tkinter(티케이인터)를 이용해 만드는 GUI 프로그램을 들 수 있다. 실제로 Tkinter를 이용한 파이썬 GUI 프로그램의 소스 코드는 매우 간단하다. Tkinter를 이용하면 단 5줄의 소스 코드만으로도 윈도우 창을 띄울 수 있다. 놀랍지 않은가!
 
파이썬에는 [[wxPython]], [[PyQT]], [[PyGTK]] 등과 같이 [[Tkinter]]보다 빠른 속도와 보기 좋은 인터페이스를 자랑하는 것들도 있다. Tkinter는 [[트킨터]] 또는 [[티케이인터]]라고 읽으면 된다.
 
 
자세한 소스 코드는 [[트킨터]](Tkinter) 문서 참조.
 
 
= 프로그램의 구조 =
[[함수]] < [[클래스]] < [[모듈]](py 파일) < [[패키지]]
 
[[라이브러리]]: 모듈과 패키지, 즉 외부 파이썬 [[프로그램]].
 
[[프레임워크]]: 특정 목적을 수행하는데 필요한 모듈과 패키지들을 모두 모아놓은 것.
 
 
def를 사용해 여러개의 명령과 [[변수]]([[variable]])를 묶어 하나의 [[함수]]로 만들 수 있다. 여러개의 함수를 묶어 하나의 [[클래스]]([[class]])로 만들 수 있다. 여러개의 변수, 함수, 클래스가 포함된 파이썬 프로그램(py 파일 형태)을 [[모듈]]([[module]]) 형태로 프로그램 안으로 불러올 수 있다. 모듈을 묶어 [[패키지]]([[package]])를 만들 수 있다.
 
 
== 함수 ==
[[함수]]([[function]])를 사용하는 이유는 무엇일까?
 
프로그래밍을 하다 보면 똑같은 내용을 반복해서 작성하고 있는 자신을 발견할 때가 종종 있다. 이때가 바로 함수가 필요한 때이다. 즉, 반복되는 부분이 있을 경우 "반복적으로 사용되는 가치 있는 부분"을 한 뭉치로 묶어서 "어떤 입력값을 주었을 때 어떤 결과값을 돌려준다"라는식의 함수로 작성하는 것이 현명하다.
 
함수를 사용하는 또 다른 이유는 자신이 만든 프로그램을 함수화하면 프로그램의 흐름을 일목요연하게 볼 수 있기 때문이다. 마치 공장에서 원재료가 여러 공정을 거쳐 하나의 상품이되는 것처럼 프로그램에서도 입력한 값이 여러 함수들을 거치면서 원하는 결과값을 내는 것을 볼 수 있다. 이렇게 되면 프로그램의 흐름도 잘 파악할 수 있고 에러가 어디에서 나는지도 금방 알아차릴 수 있다. 함수를 잘 이용하고 함수를 적절하게 만들 줄 아는 사람이 능력 있는 프로그래머이다.
 
 
04-1 함수 - 점프 투 파이썬
https://wikidocs.net/24
 
 
=== 함수의 구조 ===
이번 강의에선 함수의 기본 구조([[문법]])에 대해 알아보고
 
입력값과 결과값에 따라 그 구조가 어떻게 달라지는지 알아보는 시간을 갖도록 해요.
 
 
 
먼저 파이썬 함수의 기본 문법은 아래와 같습니다.
 
 
 
def functionName(입력값):
  #함수의 내용
  return #결과값
 
파이썬 함수는 def 라는 예약어를 이용합니다.
 
def 뒤에는 함수의 이름을 정해줄 수 있습니다.
 
이름 옆의 괄호 속에는 함수의 입력값로 전달 되는 변수를 적어주고,
 
콜론 아래에 '들여쓰기'를 한 뒤 함수 안에서 수행될 코드를 작성하면 됩니다.
 
그리고 반환 값이 있다면 뒤에  'return' 써주면 됩니다.
 
 
 
def mul(a, b):
  return a * b
 
c = mul(2, 3)
print c
 
실행 결과를 확인해보세요!
 
위 함수는 a, b로 입력값를 받고 둘을 곱한 결과를 리턴하는 함수입니다.
 
위의 코드를 직접 실행해 보면 6이라는 결과가 출력되는 것을 볼 수 있습니다.
 
이처럼 함수는 '입력값 -> 함수의 코드 -> 결과값' 으로 이루어져 있습니다.
 
 
 
하지만 입력값이나 결과값은 반드시 있어야 하는 것은 아닙니다!
 
아래 세 개의 예시 코드를 보면서 설명해 보겠습니다.
 
 
 
#입력값이 없는 경우
def returnHi():
  return 'Hi!'
 
 
#결과값이 없는 경우
def sayHi(signal):
  if(signal == 1):
    print "Hi!"
  else:
    print "Bye!"
 
 
#입력값과 결과값이 둘 다 없는 경우
def sayBye():
  print "Bye!"
 
 
위의 예시에서 볼 수 있듯이 함수에는 입력값과 결과값이 반드시 필요한 것은 아닙니다.
 
다음 장에서는 함수의 반환 값에 대해 배워보도록 하겠습니다.
 
 
함수의 구조 - 바로 실행해보면서 배우는 파이썬
https://edu.goorm.io/learn/lecture/202/%EB%B0%94%EB%A1%9C-%EC%8B%A4%ED%96%89%ED%95%B4%EB%B3%B4%EB%A9%B4%EC%84%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%ED%8C%8C%EC%9D%B4%EC%8D%AC/lesson/12335/%ED%95%A8%EC%88%98%EC%9D%98-%EA%B5%AC%EC%A1%B0
 
 
=== 함수의 반환값 ===
네, 이번 시간에는 반환 값에 대해 자세히 얘기해보고 변수의 범위에 대한 얘기도 해보겠습니다.
 
 
 
'파이썬 함수의 반환 값은 언제나 하나'
 
무슨 뜻인지 와 닿으시나요? 예시 코드를 보시죠.
 
 
def sum_sub(a, b):
  return a + b, a - b
 
코드는 간단합니다. a와 b를 인자로 받아 그 합과 차를 반환하죠.
 
그런데 이 경우에 두 개의 값이 반환될까요?
 
정답은 '아니오'입니다.
 
위 반환 값은 튜플 형태로 반환됩니다.
 
즉, (a+b, a-b)의 튜플형 변수 '하나'가 반환되는 거죠.
 
그렇다면 다음과 같은 의문이 생길 수 있습니다.
 
 
def sum_sub(a, b):
  return a + b
  return a - b
 
이렇게 하면 두 개가 반환되지 않냐!
 
아닙니다. 위의 경우에는 a + b만 반환되고 함수가 끝이 납니다.
 
즉, 첫 번째 리턴을 만나면 즉시 함수가 종료되는 거죠.
 
따라서 함수의 반환 값은 언제나 하나이고 return은 함수 내에서 한 번 수행되면 함수가 즉시 종료된다는 사실을 명심하셔야 합니다.
 
 
 
함수 안에서 선언된 변수
 
마지막으로 함수 안에서 선언된 변수의 효력 범위에 대한 이야기를 해보겠습니다.
 
def mul_two(a):
  a = a * 2
a = 6
mul_two(a)
print a
 
실행 결과를 확인해보세요!
 
위 결과로 무엇이 출력될까요? 6일까요 12일까요.
 
정답은 6입니다. 그 이유는 함수에서 선언된 변수는 그 함수만의 변수이기 때문입니다.
 
아래 코드를 보시죠.
 
def example(a):
  a = 6
example(7)
print a
 
위 코드는 에러가 납니다.
 
그 이유는 함수 안에서 선언된 a가 함수 밖을 빠져나가면 그 효력이 없어지기 때문이죠.
 
이를 해결하는 방법이 두 가지가 있는데요. 잘 이해하시고 사용하시길 바랍니다.
 
 
 
먼저 return을 이용하는 방법입니다. 아래의 코드를 보시죠.
 
def test(a):
  a = a + 1
  return a
a = 7
a = test(a)
print a
 
실행 결과를 확인해보세요!
 
8을 잘 출력합니다!
 
함수 내에서 바뀐 a를 반환하여 함수 밖의 a에 넣어줍니다. test 함수 속의 a와 밖의 a는 서로 다르지만 바뀐 결과를 출력할 수는 있습니다.
 
 
 
두 번째는 'global'이라는 예약어를 이용하는 방식입니다.
 
'global a'코드의 의미는 '함수 밖의 변수 a를 함수 안에서 사용하겠다'입니다.
 
그래서 함수 밖의 변수가 함수에 영향을 받게 되죠.
 
a = 8
def test():
  global a
  a = a + 1
 
test()
print a
 
실행 결과를 확인해보세요!
 
global에 의해 8에서 1을 더한 9가 a에 저장됩니다.
 
 
 
지금까지 총 3강에 걸쳐 함수에 대한 기본개념, 문법, 추가 개념까지 설명해 드렸는데요.
 
다음 강의에서 직접 함수를 이용하여 코딩해보면서 제대로 익히도록 해요!
 
 
함수의 반환값 - 바로 실행해보면서 배우는 파이썬
https://edu.goorm.io/learn/lecture/202/%EB%B0%94%EB%A1%9C-%EC%8B%A4%ED%96%89%ED%95%B4%EB%B3%B4%EB%A9%B4%EC%84%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%ED%8C%8C%EC%9D%B4%EC%8D%AC/lesson/12332/%ED%95%A8%EC%88%98%EC%9D%98-%EB%B0%98%ED%99%98%EA%B0%92
 
 
=== 내장 함수 ===
지금까지 파이썬으로 프로그래밍하기 위해 알아야 하는 대부분의 것들을 공부했다. 이제 여러분은 자신이 원하는 프로그램을 직접 만들 수 있을 것이다. 하지만 그 전에 먼저 여러분이 만들고자 하는 프로그램이 이미 만들어져 있는지 살펴보기 바란다. 물론 공부를 위해서라면 누군가 만들어 놓은 프로그램을 또 만들 수도 있다. 하지만 그런 목적이 아니라면 이미 만들어진 것을 다시 만드는 것은 불필요한 행동이다(Don’t Reinvent The Wheel, 이미 있는 것을 다시 만드느라 쓸데없이 시간을 낭비하지 말라). 그리고 이미 만들어진 프로그램들은 테스트 과정을 수도 없이 거쳤기 때문에 충분히 검증되어 있다. 따라서 무엇인가 새로운 프로그램을 만들기 전에는 이미 만들어진 것들, 그중에서도 특히 파이썬 배포본에 함께 들어 있는 파이썬 라이브러리들을 살펴보는 것이 매우 중요하다.
 
라이브러리들을 살펴보기 전에 파이썬 내장 함수를 먼저 살펴보도록 하자. 우리는 이미 몇 가지 내장 함수들을 배웠다. print, del, type 등이 바로 그것이다. 이러한 파이썬 내장 함수들은 외부 모듈과는 달리 import를 필요로 하지 않는다. 아무런 설정 없이 바로 사용할 수가 있다. 이 책에서는 활용 빈도가 높고 중요한 함수들을 중심으로 알파벳 순서대로 간략히 정리했다. 파이썬으로 프로그래밍을 하기 위해 이 함수들을 지금 당장 모두 알아야 하는 것은 아니므로 가벼운 마음으로 천천히 살펴보자.
 
 
05-5 내장 함수 - 점프 투 파이썬
https://wikidocs.net/32
 
 
=== 함수를 사용한 소스 코드 ===
==== 99병의 맥주 ====
[[99병의 맥주]]([[99 Bottles of Beer]])는 미국과 캐나다 등에서 자주 불리는 권주가(勸酒歌)이다. 벽장에 있는 99개의 맥주병을 하나씩 꺼내면서 수가 줄어드는 걸 노래하고 있다.
[[99병의 맥주]]([[99 Bottles of Beer]])는 미국과 캐나다 등에서 자주 불리는 권주가(勸酒歌)이다. 벽장에 있는 99개의 맥주병을 하나씩 꺼내면서 수가 줄어드는 걸 노래하고 있다.


Line 423: Line 843:
     print("")
     print("")


== 함수에서 재귀 호출 사용하기 ==
 
==== 함수에서 재귀 호출 사용하기 ====
함수 안에서 함수 자기자신을 호출하는 방식을 재귀 호출(recursive call)이라고 합니다. 재귀 호출은 일반적인 상황에서는 잘 사용하지 않지만 [[알고리듬]]을 구현할 때 매우 유용합니다(구현은 만들다와 같은 뜻입니다). 보통 [[알고리즘]]에 따라서 반복문으로 구현한 코드보다 재귀호출로 구현한 코드가 좀 더 직관적이고 이해하기 쉬운 경우가 많습니다.
함수 안에서 함수 자기자신을 호출하는 방식을 재귀 호출(recursive call)이라고 합니다. 재귀 호출은 일반적인 상황에서는 잘 사용하지 않지만 [[알고리듬]]을 구현할 때 매우 유용합니다(구현은 만들다와 같은 뜻입니다). 보통 [[알고리즘]]에 따라서 반복문으로 구현한 코드보다 재귀호출로 구현한 코드가 좀 더 직관적이고 이해하기 쉬운 경우가 많습니다.


Line 457: Line 878:
파이썬 코딩 도장: 33.1 재귀호출 사용하기 https://dojang.io/mod/page/view.php?id=1053
파이썬 코딩 도장: 33.1 재귀호출 사용하기 https://dojang.io/mod/page/view.php?id=1053


=== 재귀 호출로 팩토리얼 구하기 ===
 
===== 재귀 호출로 팩토리얼 구하기 =====
파이썬에서 [[팩토리얼]]([[factorial]])을 구하는 방법은 여러 가지가 있지만 이번에는 재귀호출을 사용하여 팩토리얼을 구현해보겠습니다. 팩토리얼은 1부터 n까지 숫자를 차례대로 곱한 값이며 !(느낌표) 기호로 표기합니다. 예를 들어 5!은 5 * 4 * 3 * 2 * 1이며 결과는 120입니다.
파이썬에서 [[팩토리얼]]([[factorial]])을 구하는 방법은 여러 가지가 있지만 이번에는 재귀호출을 사용하여 팩토리얼을 구현해보겠습니다. 팩토리얼은 1부터 n까지 숫자를 차례대로 곱한 값이며 !(느낌표) 기호로 표기합니다. 예를 들어 5!은 5 * 4 * 3 * 2 * 1이며 결과는 120입니다.


Line 472: Line 894:
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이 나온다.


= GUI 지원되는 소스 코드 =
== 클래스 ==
GUI(Graphic User Interface) 프로그래밍이란 쉽게 말해 윈도우 창처럼 화면을 보며 마우스나 키보드로 조작할 수 있는 프로그램을 만드는 것이다. 파이썬으로 GUI 프로그램을 만드는 것은 다른 언어를 이용해 만드는 것보다 훨씬 쉽다. 대표적인 예로 파이썬 프로그램을 설치할때 함께 설치되는 기본 모듈인 Tkinter(티케이인터)를 이용해 만드는 GUI 프로그램을 들 수 있다. 실제로 Tkinter를 이용한 파이썬 GUI 프로그램의 소스 코드는 매우 간단하다. Tkinter를 이용하면 단 5줄의 소스 코드만으로도 윈도우 창을 띄울 있다. 놀랍지 않은가!
초보 개발자들에게 클래스(class)는 넘기 힘든 장벽과도 같은 존재이다. 독자들 중에도 클래스라는 단어를 처음 접하는 이들이 있을 것이다. 여기서는 클래스가 왜 필요한지, 도대체 클래스라는 것은 무엇인지 아주 기초적인 것부터 차근차근 함께 알아보자.
 
 
05-1 클래스 - 점프 투 파이썬
https://wikidocs.net/28
 
 
=== 클래스는 도대체 왜 필요한가? ===
가장 많이 사용하는 프로그래밍 언어 중 하나인 C 언어에는 클래스가 없다. 이 말은 굳이 클래스 없이도 프로그램을 충분히 만들 수 있다는 말과도 같다. 파이썬으로 잘 만들어진 프로그램들을 살펴보아도 클래스를 이용하지 않고 작성된 것들이 상당히 많다. 클래스는 지금까지 공부한 함수나 자료형처럼 프로그램 작성을 위해 꼭 필요한 요소는 아니다.
 
하지만 프로그램 작성시 클래스를 적재적소에 이용하면 프로그래머가 얻을 수 있는 이익은 상당하다.
 
예제를 통해 한번 생각해 보자.
 
여러분 모두 계산기를 사용해 봤을 것이다. 계산기에 3이라는 숫자를 입력하고 + 기호를 입력한 후 4를 입력하면 결과값으로 7을 보여준다. 다시 한 번 + 기호를 입력한 후 3을 입력하면 기존 결과값 7에 3을 더해 10을 보여준다. 즉, 계산기는 이전에 계산된 결과값을 항상 메모리 어딘가에 저장하고 있어야 한다.
 
 
(※ 계산기는 이전에 계산된 결과값을 기억하고 있어야 한다.)
 
이런 내용을 우리가 앞서 익힌 함수를 이용해 구현해 보자. 계산기의 "더하기" 기능을 구현한 파이썬 코드는 다음과 같다.
 
result = 0
def adder(num):
    global result
    result += num
    return result
print(adder(3))
print(adder(4))
 
(※ adder 함수는 입력 인수로 num을 받으면 이전에 계산된 결과값에 더한 후 리턴하는 함수이다.)
 
이전에 계산된 결과값을 유지하기 위해서 result라는 전역 변수(global)를 사용했다. 실행하면 예상한 대로 다음과 같은 결과값이 출력된다.
 
3
7
 
그런데 만약 한 프로그램에서 2개의 계산기가 필요한 상황이 발생하면 어떻게 해야 할까? 각각의 계산기는 각각의 결과값을 유지해야 하기 때문에 위와 같이 adder 함수 하나만으로는결과값을 따로 유지할 수 없다.
 
이런 상황을 해결하려면 다음과 같이 함수를 각각 따로 만들어야 한다.
 
result1 = 0
result2 = 0
def adder1(num):
    global result1
    result1 += num
    return result1
def adder2(num):
    global result2
    result2 += num
    return result2
print(adder1(3))
print(adder1(4))
print(adder2(3))
print(adder2(7))
 
똑같은 일을 하는 adder1과 adder2라는 함수가 만들어졌고 각각의 함수에서 계산된 결과값을 유지하면서 저장하기 위한 전역 변수 result1, result2가 필요하게 되었다.
 
결과값은 다음과 같이 의도한 대로 출력된다.
 
3
7
3
10
 
계산기 1의 결과값이 계산기 2에 아무런 영향을 끼치지 않음을 확인할 수 있다. 하지만 계산기가 3개, 5개, 10개로 점점 더 많이 필요해진다면 어떻게 해야 할 것인가? 그때마다 전역변수와 함수를 추가할 것인가? 여기에 빼기나 곱하기등의 기능을 추가해야 한다면 상황은 점점 더 어려워 질 것이다.
 
아직 클래스에 대해서 배우진 않았지만 위와 같은 경우 클래스를 이용하면 다음과 같이 간단하게 해결할 수 있다.
 
(※ 아래 예시 클래스를 아직은 이해하지 못해도 좋다. 곧 자세하게 배울 것이다. 여기서는 클래스를 개념적으로만 이해하면 된다.)
 
class Calculator:
    def __init__(self):
        self.result = 0
    def adder(self, num):
        self.result += num
        return self.result
cal1 = Calculator()
cal2 = Calculator()
print(cal1.adder(3))
print(cal1.adder(4))
print(cal2.adder(3))
print(cal2.adder(7))
 
실행하면 함수 2개를 사용했을 때와 동일한 결과가 출력된다.
 
3
7
3
10
 
Calculator 클래스로 만들어진 cal1, cal2라는 별개의 계산기(파이썬에서는 이것을 객체라고 한다)가 각각의 역할을 수행한다. 그리고 계산기(cal1, cal2)의 결과값 역시 다른 계산기의 결과값과 상관없이 독립적인 결과값을 유지한다. 클래스를 이용하면 계산기의 개수가 늘어나더라도 객체를 생성하기만 하면 되기 때문에 함수를 사용하는 경우와 달리 매우 간단해진다.
 
만약 빼기 기능이 더해진다고 해도 Calculator 클래스에 다음과 같은 빼기 기능 함수를 추가해 주면 된다.
 
    def sub(self, num):
        self.result -= num
        return self.result
 
클래스의 이점은 단순히 이것만이 아니다. 하지만 이것 하나만으로도 "도대체 왜 클래스가 필요한 것일까?"라는 근본적인 물음에 대한 해답이 되었을 것이다.
 
 
=== 클래스와 객체 ===
클래스를 가장 잘 설명 해 주는 다음의 사진을 보자.
 
 
과자를 만드는 과자틀과 만들어진 과자들이다.
 
* 과자틀 → 클래스 (class)
* 과자틀에 의해서 만들어진 과자들 → 객체 (object)
 
이 사진을 보면 클래스가 어떤건지 감이 잡힐 것이다.
 
이 절에서 설명할 클래스는 과자틀과 비슷하다.
 
클래스(class)란 똑같은 무엇인가를 계속해서 만들어낼 수 있는 설계 도면 같은 것이고(과자 틀), 객체(object)란 클래스에 의해서 만들어진 피조물(과자틀에 의해서 만들어진 과자)을 뜻한다.
 
클래스에 의해서 만들어진 객체에는 중요한 특징이 있다. 그것은 객체별로 독립적인 성격을 갖는다는 것이다. 과자틀에 의해서 만들어진 과자에 구멍을 뚫거나 조금 베어먹더라도 다른 과자들에는 아무 영향이 없는것과 마찬가지로 동일한 클래스에의해 생성된 객체들은 서로에게 전혀 영향을 주지 않는다.
 
다음은 파이썬 클래스의 가장 간단한 예이다.
 
>>> class Cookie:
>>>    pass
 
위의 클래스는 아무런 기능도 갖고 있지 않은 껍질뿐인 클래스이다. 하지만 이렇게 껍질뿐인 클래스도 객체를 생성하는 기능은 가지고 있다. "과자 틀"로 "과자"를 만드는 것처럼 말이다.
 
객체는 클래스에 의해서 만들어지며 1개의 클래스는 무수히 많은 객체를 만들어낼 수 있다. 위에서 만든 Cookie 클래스의 객체를 만드는 방법은 다음과 같다.
 
>>> a = Cookie()
>>> b = Cookie()
 
Cookie()의 결과값을 돌려받은 a와 b가 바로 객체이다. 마치 함수를 사용해서 그 결과값을 돌려받는 모습과 비슷하다.
 
 
==== 객체와 인스턴스의 차이 ====
클래스에 의해서 만들어진 객체를 인스턴스라고도 한다. 그렇다면 객체와 인스턴스의 차이는 무엇일까? 이렇게 생각해 보자. a = Cookie() 이렇게 만들어진 a는 객체이다. 그리고 a라는 객체는 Cookie의 인스턴스이다. 즉, 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용된다. 즉, "a는 인스턴스" 보다는 "a는 객체"라는 표현이 어울리며, "a는 Cookie의 객체" 보다는 "a는 Cookie의 인스턴스"라는 표현이 훨씬 잘 어울린다.
 
 
== 모듈 ==
[[모듈]]([[module]])이란 함수나 변수 또는 클래스 들을 모아 놓은 파일이다. 모듈은 다른 파이썬 프로그램에서 불러와 사용할수 있게끔 만들어진 파이썬 파일이라고도 할 수 있다. 우리는 파이썬으로 프로그래밍을 할 때 굉장히 많은 모듈을 사용한다. 다른 사람들이 이미 만들어 놓은 모듈을 사용할 수도 있고 우리가 직접 만들어서 사용할 수도 있다. 여기서는 모듈을 어떻게 만들고 사용할 수 있는지 알아보겠다.
 
 
05-2 모듈 - 점프 투 파이썬
https://wikidocs.net/29
 
 
=== 모듈 만들고 불러 보기 ===
모듈에 대해서 자세히 살펴보기 전에 간단한 모듈을 한번 만들어 보자.
 
# mod1.py
def sum(a, b):
    return a + b
 
위와 같이 sum 함수만 있는 파일 mod1.py를 만들고 C:\Python 디렉터리에 저장하자. 이 파일이 바로 모듈이다. 지금까지 에디터로 만들어 왔던 파일과 다르지 않다.
 
우리가 만든 mod1.py라는 파일, 즉 모듈을 파이썬에서 불러와 사용하려면 어떻게 해야 할까? 먼저 아래와 같이 도스 창을 열고 mod1.py를 저장한 디렉터리(이 책에서는 C:\Python)로 이동한 다음 대화형 인터프리터를 실행한다.
 
C:\Users\pahkey>cd C:\Python
C:\Python>dir
...
2014-09-23 오후 01:53 49 mod1.py
...
C:\Python>python
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AM...
Type "help", "copyright", "credits" or "license" for more information.
>>>
 
반드시 mod1.py를 저장한 위치로 이동한 다음 이후 예제를 진행해야 한다. 그래야만 대화형 인터프리터에서 mod1.py를 읽을 수 있다. 이제 아래와 같이 따라 해보자.
 
>>> import mod1
>>> print(mod1.sum(3,4))
7
 
mod1.py를 불러오기 위해 import mod1이라고 입력하였다. import mod1.py로 입력하는 실수를 하지 않도록 주의하자. import는 이미 만들어진 파이썬 모듈을 사용할 수 있게 해주는 명령어이다. mod1.py 파일에 있는 sum 함수를 이용하기 위해서는 위의 예에서와 같이 mod1.sum처럼 모듈이름 뒤에 '.'(도트 연산자)를 붙이고 함수 이름을 써서 사용할 수 있다.
 
import는 현재 디렉터리에 있는 파일이나 파이썬 라이브러리가 저장된 디렉터리에 있는 모듈만 불러올 수 있다.
 
import의 사용 방법은 다음과 같다.
 
import 모듈이름
 
여기서 모듈이름은 mod1.py에서 .py라는 확장자를 제거한 mod1만을 가리킨다.
 
이번에는 mod1.py 파일에 다음 함수를 추가해 보자.
 
def safe_sum(a, b):
    if type(a) != type(b):
        print("더할수 있는 것이 아닙니다.")
        return
    else:
        result = sum(a, b)
    return result
 
safe_sum 함수는 서로 다른 타입의 객체끼리 더하는 것을 미리 막아 준다. 만약 서로 다른 형태의 객체가 입력으로 들어오면 "더할 수 있는 값이 아닙니다"라는 메시지를 출력한다. 그리고 return문만 단독으로 사용되어 None 값을 돌려주고 함수를 종료한다.
 
이 함수를 mod1.py에 추가한 다음 다시 대화형 인터프리터를 열고 다음과 같이 따라 해보자.
 
>>> import mod1
>>> print(mod1.safe_sum(3, 4))
7
 
import mod1으로 mod1.py 파일을 불러온 다음 mod1.safe_sum(3, 4)로 safe_sum 함수를 호출한다. 이렇게 하면 같은 타입의 객체가 입력으로 들어와서 3+4의 결과인 7이 출력된다.
 
이번에는 다음처럼 따라 해보자.
 
>>> print(mod1.safe_sum(1, 'a'))
더할 수 있는 값이 아닙니다.
None
>>>
 
위 예제에서 1은 정수형 객체, a는 문자열 객체이다. 이렇게 서로 타입이 다른 객체가 입력으로 들어오면 "더할 수 있는 값이 아닙니다."라는 메시지를 출력하고 단독으로 사용된 return에 의해서 None 값을 돌려주게 된다.
 
mod1의 sum 함수 역시 다음처럼 바로 호출할 수도 있다.
 
>>> print(mod1.sum(10, 20))
30
 
 
==== 모듈 함수를 사용하는 또 다른 방법 ====
때로는 mod1.sum, mod1.safe_sum처럼 쓰지 않고 그냥 sum, safe_sum처럼 함수를 쓰고 싶은 경우도 있을 것이다. 이럴 때는 "from 모듈이름 import 모듈함수"를 사용하면 된다.
 
from 모듈이름 import 모듈함수
 
from ~ import ~를 이용하면 위와 같이 모듈이름을 붙이지 않고 바로 해당 모듈의 함수를 쓸 수 있다. 다음과 같이 따라 해보자.
 
>>> from mod1 import sum
>>> sum(3, 4)
7
 
그런데 위와 같이 하면 mod1.py 파일의 sum 함수만 사용할 수 있다. sum 함수와 safe_sum 함수를 둘 다 사용하고 싶다면 어떻게 해야 할까?
 
2가지 방법이 있다.
 
from mod1 import sum, safe_sum
 
첫 번째 방법은 위와 같이 from 모듈이름 import 모듈함수1, 모듈함수2처럼 사용하는 방법이다. 콤마로 구분하여 필요한 함수를 불러올 수 있다.
 
from mod1 import *
 
두 번째 방법은 위와 같이 * 문자를 사용하는 방법이다. 07장에서 배울 정규 표현식에서 * 문자는 "모든것"이라는 뜻인데 파이썬에서도 마찬가지 의미로 사용된다. 따라서 from mod1 import *는 mod1.py의 모든 함수를 불러서 사용하겠다는 말이다.
 
mod1.py 파일에는 함수가 2개밖에 없기 때문에 위의 2가지 방법은 동일하게 적용된다.
 
 
=== if __name__ <nowiki>==</nowiki> "__main__": 의 의미 ===
if __name__ == "__main__": 의 의미
 
이번에는 mod1.py 파일에 다음과 같이 추가해 보자.
 
# mod1.py
def sum(a, b):
    return a+b
def safe_sum(a, b):
    if type(a) != type(b):
        print("더할수 있는 것이 아닙니다.")
        return
    else:
        result = sum(a, b)
    return result
print(safe_sum('a', 1))
print(safe_sum(1, 4))
print(sum(10, 10.4))
 
위와 같은 mod1.py 파일을 에디터로 작성해서 C:\Python이라는 디렉터리에 저장했다면 다음처럼 실행할 수 있다.
 
C:\Python>python mod1.py
더할 수 있는 것이 아닙니다.
None
5
20.4
 
결과값은 위의 예처럼 출력될 것이다. 그런데 이 mod1.py 파일의 sum과 safe_sum 함수를 사용하기 위해 mod1.py 파일을 import하면 문제가 생긴다.
 
도스 창을 열고 다음을 따라 해보자.
 
C:\WINDOWS> cd C:\Python
C:\Python>python
>>> import mod1
더할 수 있는 것이 아닙니다.
None
5
20.4
 
엉뚱하게도 import mod1을 수행하는 순간 mod1.py가 실행이 되어 결과값을 출력한다. 우리는 단지 mod1.py 파일의 sum과 safe_sum 함수만 사용하려고 했는데 말이다. 이러한 문제를 방지하려면 다음처럼 하면 된다.
 
if __name__ == "__main__":
    print(safe_sum('a', 1))
    print(safe_sum(1, 4))
    print(sum(10, 10.4))
 
if __name__ == "__main__"을 사용하면 C:\Python>python mod1.py처럼 직접 이 파일을 실행시켰을 때는 __name__ == "__main__"이 참이 되어 if문 다음 문장들이 수행된다. 반대로 대화형 인터프리터나 다른 파일에서 이 모듈을 불러서 사용할 때는 __name__ == "__main__"이 거짓이 되어 if문 다음 문장들이 수행되지 않는다.
 
파이썬 모듈을 만든 다음 그 모듈을 테스트하기 위해 보통 위와 같은 방법을 사용하는데, 실제로 그런지 대화형 인터프리터를 열고 실행해 보자.
 
>>> import mod1
>>>
 
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개 있는 경우 ====
알아두기
 
파이썬의 __name__ 변수는 파이썬이 내부적으로 사용하는 특별한 변수명이다. _가 2개 있는 다른 것돌도 마찬가지이다. 만약 C:\Python>python mod1.py처럼 직접 mod1.py 파일을 실행시킬 경우 mod1.py의 __name__ 변수에는 __main__ 이라는 값이 저장된다. 하지만 파이썬 쉘이나 다른 파이썬 모듈에서 mod1을 import 할 경우에는 mod1.py의 __name__ 변수에는 "mod1"이라는 mod1.py의 모듈이름 값이 저장된다.
 
 
=== 클래스나 변수 등을 포함한 모듈 ===
지금까지 살펴본 모듈은 함수만 포함했지만 클래스나 변수 등을 포함할 수도 있다. 다음의 프로그램을 작성해 보자.
 
# mod2.py
PI = 3.141592
class Math:
    def solv(self, r):
        return PI * (r ** 2)
def sum(a, b):
    return a+b
if __name__ == "__main__":
    print(PI)
    a = Math()
    print(a.solv(2))
    print(sum(PI , 4.4))
 
이 파일은 원의 넓이를 계산하는 Math 클래스와 두 값을 더하는 sum 함수 그리고 원주율 값에 해당되는 PI 변수처럼 클래스, 함수, 변수 등을 모두 포함하고 있다. 파일 이름을 mod2.py로 하고 C:\Python 디렉터리에 저장하자. mod2.py 파일은 다음과 같이 실행할 수 있다.
 
C:\Python>python mod2.py
3.141592
12.566368
7.541592
 
이번에는 대화형 인터프리터를 열고 다음과 같이 따라 해보자.
 
C:\Python>python
>>> import mod2
>>>
 
__name__ == "__main__"이 거짓이 되므로 아무런 값도 출력되지 않는다.
 
 
==== 모듈에 포함된 변수, 클래스, 함수 사용하기 ====
>>> print(mod2.PI)
3.141592
 
위의 예에서 볼 수 있듯이 mod2.PI처럼 입력해서 mod2.py 파일에 있는 PI라는 변수값을 사용할 수 있다.
 
>>> a = mod2.Math()
>>> print(a.solv(2))
12.566368
 
위의 예는 mod2.py에 있는 Math 클래스를 사용하는 방법을 보여 준다. 위의 예처럼 모듈 내에 있는 클래스를 이용하려면 '.'(도트 연산자)를 이용하여 클래스 이름 앞에 모듈 이름을 먼저 입력해야 한다.
 
>>> print(mod2.sum(mod2.PI, 4.4))
7.541592
 
mod2.py에 있는 sum 함수 역시 당연히 사용할 수 있다.
 
 
=== 새 파일 안에서 이전에 만든 모듈 불러오기 ===
지금까지는 만들어 놓은 모듈 파일을 사용하기 위해 대화형 인터프리터만을 이용했다. 이번에는 새롭게 만들 파이썬 파일 안에 이전에 만들어 놓았던 모듈을 불러와서 사용하는 방법에 대해 알아보자.
 
방금 전에 만든 모듈인 mod2.py 파일을 새롭게 만들 파이썬 프로그램 파일에서 불러와 사용해 보자. 그럼 에디터로 다음과 같이 작성해 보자.
 
# modtest.py
import mod2
result = mod2.sum(3, 4)
print(result)
 
위에서 볼 수 있듯이 파일에서도 import mod2로 mod2 모듈을 불러와서 사용하면 된다. 대화형 인터프리터에서 한 것과 마찬가지 방법이다. 위의 예제가 정상적으로 실행되기 위해서는 modtest.py 파일과 mod2.py 파일이 동일한 디렉터리에 있어야 한다.
 
 
==== 모듈을 불러오는 또 다른 방법 ====
우리는 지금껏 도스 창을 열고 모듈이 있는 디렉터리로 이동한 다음에나 모듈을 사용할 수 있었다. 이번에는 모듈을 저장한 디렉터리로 이동하지 않고 모듈을 불러와서 사용하는 방법에 대해서 알아보자.
 
우선 이전에 만든 mod2.py 모듈을 C:\Python\Mymodules라는 디렉터리를 새로 생성해서 저장한 후 다음의 예를 따라 해보자.
 
1. sys.path.append(모듈을 저장한 디렉터리) 사용하기
 
먼저 sys 모듈을 불러온다.
 
>>> import sys
 
sys 모듈은 파이썬을 설치할 때 함께 설치되는 라이브러리 모듈이다. sys에 대해서는 뒤에서 다시 다룰 것이다. 이 sys 모듈을 이용해서 파이썬 라이브러리가 설치되어 있는 디렉터리를 확인할 수 있다.
 
다음과 같이 작성해 보자.
 
>>> sys.path
['', 'C:\\Windows\\SYSTEM32\\python35.zip', 'c:\\Python35\\DLLs',
'c:\\Python35\\lib', 'c:\\Python35', 'c:\\Python35\\lib\\site-packages']
 
sys.path는 파이썬 라이브러리들이 설치되어 있는 디렉터리들을 보여 준다. 만약 파이썬 모듈이 위의 디렉터리에 들어 있다면 모듈이 저장된 디렉터리로 이동할 필요없이 바로 불러서 사용할 수가 있다. 그렇다면 sys.path에 C:\Python\Mymodules라는 디렉터리를 추가하면 아무데서나 불러 사용할 수 있지 않을까?
 
도스 창에서는 /, \든 상관없지만, 소스 코드 안에서는 반드시 / 또는 \\ 기호를 사용해야 한다.
 
/는 [[슬래시]]([[slash]]) 또는 [[빗금]]([[solidus]])이라고 부르며 [[유닉스]]나 [[리눅스]]에서 [[디렉터리]]를 구분할 때 사용한다. \는 [[역슬래시]]([[backslash]]) 또는 [[역사선]]([[reverse solidus]])이라고 불리며 [[윈도우즈]]에서 [[디렉터리]]구분할 때 사용한다. 한국어 윈도우즈에서는 역슬래시 대신 원화 기호 ₩를 사용한다. 대부분의 남한 키보드에는 역슬래시 대신에 원화 기호가 인쇄되어 있다.
 
 
sys.path에 C:\Python\Mymodules라는 디렉터리를 추가하면 당연히 아무데서나 불러 사용할 수 있다. sys.path의 결과값이 리스트이므로 우리는 다음과 같이 할 수 있을 것이다.
 
>>> sys.path.append("C:/Python/Mymodules")
>>> sys.path
['', 'C:\\Windows\\SYSTEM32\\python35.zip', 'c:\\Python35\\DLLs',
'c:\\Python35\\lib', 'c:\\Python35', 'c:\\Python35\\lib\\site-packages',
'C:/Python/Mymodules']
>>>
 
sys.path.append를 이용해서 C:/Python/Mymodules라는 디렉터리를 sys.path에 추가한 후 다시 sys.path를 보면 가장 마지막 요소에 C:/Python/Mymodules라고 추가된 것을 확인할 수 있다.
 
자, 실제로 모듈을 불러와서 사용할 수 있는지 확인해 보자.
 
>>> import mod2
>>> print(mod2.sum(3,4))
7
 
이상 없이 불러와서 사용할 수 있다. 이렇게 특정한 디렉터리에 있는 모듈을 불러와서 사용하고 싶을 때 사용할 수 있는 것이 바로 sys.path.append(모듈을 저장한 디렉터리)이다.
 
 
2. PYTHONPATH 환경 변수 사용하기
 
모듈을 불러와서 사용하는 또 다른 방법으로는 PYTHONPATH 환경 변수를 사용하는 방법이 있다.
 
다음과 같이 따라 해보자.
 
C:\Users\home>set PYTHONPATH=C:\Python\Mymodules
C:\Users\home>python
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AM...
Type "help", "copyright", "credits" or "license" for more information.
>>> import mod2
>>> print(mod2.sum(3,4))
7
 
set 도스 명령어를 이용해 PYTHONPATH 환경 변수에 mod2.py 파일이 있는 C:\Python\Mymodules 디렉터리를 설정한다. 그러면 디렉터리 이동이나 별도의 모듈 추가 작업 없이 mod2 모듈을 불러와서 사용할 수 있다.
 
 
== 패키지 ==
패키지란 무엇인가?
 
패키지(Packages)는 도트(.)를 이용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다. 예를 들어 모듈명이 A.B인 경우 A는 패키지명이 되고 B는 A 패키지의 B 모듈이 된다.
 
파이썬 패키지는 디렉터리와 파이썬 모듈로 이루어지며 구조는 다음과 같다.
 
가상의 game 패키지 예
 
game/
    __init__.py
    sound/
        __init__.py
        echo.py
        wav.py
    graphic/
        __init__.py
        screen.py
        render.py
    play/
        __init__.py
        run.py
        test.py
 
game, sound, graphic, play는 디렉터리명이고 .py 확장자를 가지는 파일은 파이썬 모듈이다. game 디렉터리가 이 패키지의 루트 디렉터리이고 sound, graphic, play는 서브 디렉터리이다.
 
(※ __init__.py 파일은 조금 특이한 용도로 사용되는데, 이것에 대해서는 뒤에서 자세하게 다룰 것이다.)
 
간단한 파이썬 프로그램이 아니라면 이렇게 패키지 구조로 파이썬 프로그램을 만드는 것이 공동 작업이나 유지 보수 등 여러 면에서 유리하다. 또한 패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용할 수 있다.
 
 
05-3 패키지 - 점프 투 파이썬
https://wikidocs.net/1418
 
 
=== pip로 패키지 설치 ===
예전엔 모듈 또는 패키지 설치를 위한 pip를 따로 설치해야 했지만 최신 버전의 파이썬은 pip를 내장하고 있다. 예를 들어 [[PyAutoGUI]] 패키지를 설치할 경우 [[윈도우즈]]는 [[명령 프롬프트]]에서
pip install pyautogui
를 입력하면 된다.
 
만약 최신 pip가 나와서 업그레이드하라고 뜨면
python -m pip install --upgrade pip
를 해주면 된다. 윈도우즈에서는 파이썬 2와 3에서 모두 쓸 있는 pip가 설치되니 pip인지, pip3인지, 버전에 신경 쓸 필요 없다.
 


파이썬에는 [[wxPython]], [[PyQT]], [[PyGTK]] 등과 같이 [[Tkinter]]보다 빠른 속도와 보기 좋은 인터페이스를 자랑하는 것들도 있다.
만약 윈도우즈의 사용자 이름(User Name)이 [[한글]]일 경우 C:\Users\Username의 Username 부분이 한글이라 PyAutoGUI를 설치할 때 오류가 나서 설치가 안 되니 사용자 이름을 영어로 바꿔줘야 한다. 기존 사용자 이름을 바꿔도 오류가 계속 나는 경우 GUI에 뜨는 사용자 이름은 바뀌었으나 정작 [[디렉터리]] 이름은 안 바뀌어서 그럴 수 있으니 그럴 경우에는 [[폴더]] 이름을 바꿔주거나 [[영어]]로 아예 새로운 사용자를 생성한다.


자세한 소스 코드는 [[트킨터]](Tkinter) 문서 참조.
[[명령 프롬프트]]는 "시작 → 모든 프로그램 → 보조 프로그램 → 명령 프롬프트" 또는 "시작 → 실행 → cmd"를 하면 뜬다. cmd.exe 파일을 실행하면 [[Command Prompt]] 프로그램이 뜬다.


= 실행 가능한 파이썬 스크맆트 =
파이썬 인터프리터는 보통 /usr/local/bin/python3.6 에 설치됩니다; 유닉스 셸의 검색 경로에 /usr/local/bin 를 넣으면 명령:


  python3.6
[[리눅스]]에서 pyautogui를 설치할 경우 리눅스는 최신 버전 파이썬이라도 pip가 내장되어 있지 않으므로 [[터미널]]에서
을 셸에 입력해서 실행할 수 있습니다. 유닉스에서, 파이썬 3.x 인터프리터는 보통 python 이라는 이름의 실행 파일로 설치되지 않는데, 동시에 설치되는 파이썬 2.x 실행 파일과 충돌하지 않도록 하기 위해섭니다. 인터프리터가 위치하는 디렉터리의 선택은 설치 옵션이기 때문에, 다른 장소도 가능합니다; 주변의 파이썬 전문가나 시스템 관리자에게 확인할 필요가 있습니다. 예를 들어, /usr/local/python 도 널리 사용되는 위치입니다.
  sudo apt update
해서 apt 저장소 목록을 최신으로 업데이트하고
sudo apt install python-pip
해서 apt에서 python-pip를 설치한다.




[[BSD]] 스타일의 [[유닉스]] 시스템에서 파이썬 스크립트는 [[셸 스크립트]]처럼 직접 실행할 수 있게 만들 수 있습니다. 인터프리터가 사용자의 PATH 에 있다고 가정할 때 다음과 같은 줄
그리고
  #!/usr/bin/env python3.5
pip3 install --upgrade pip
을 스크립트의 시작 부분에 넣고 파일에 실행 가능 모드를 줍니다. #! 는 반드시 파일의 처음 두 문자여야 합니다. 일부 플랫폼에서는 이 첫 번째 줄이 유닉스 스타일의 줄 종료 ('\n')로 끝나야 하며, 윈도우 줄 종료('\r\n')는 허락되지 않습니다. 파이썬에서 해시, 또는 파운드, 문자 '#' 는 주석을 시작하는 데 사용됩니다.
로 pip를 업그레이드 한다.
  sudo pip3 install setuptools
sudo pip3 install python3-xlib
해서 pyautogui 설치에 필요한 패키지들을 설치한다.
sudo pip3 install pyautogui
로 pyautogui를 설치한다. sudo를 쓴 명령어들은 sudo를 쓰지 않으면 root 권한이 없어 설치가 되지 않고, pip3라고 된 부분을 pip라고 입력하면 파이썬 2.7용 패키지가 설치된다.




스크립트는 chmod 명령을 사용하여 실행 가능한 모드, 또는 권한, 을 부여받을 있습니다.
==== 마우스 자동 클릭 스크맆트 ====
$ chmod +x myscript.py
대학교 수강 신청할 때 쓰면 좋다. 단, [[스크맆트]] 프로그램으로 너무 짧은 시간 간격으로 수많은 클릭 요청을 보내서 수강 신청하다 학교 수강 신청 웹 싸이트 접속 자체가 차단될 있으니 주의하기 바란다.




소스 코드가 유닉스 "셔뱅 (shebang)" 줄 로 시작하는 경우에, 문자 인코딩 선언은 두 번째 줄에 들어갑니다. 예를 들어:
리눅스의 경우 일단 [[터미널]]에서
  #!/usr/bin/env python3
  python3
  # -*- coding: cp-1252 -*-
를 입력하여 대화형 [[인터프리터]]를 불러온다. 그리고
와 같이 해주면 됩니다.
  import pyautogui
pyautogui.moveTo(230, 140)
를 입력하고 () 안의 x 좌표와 y 좌표의 숫자를 적당히 바꿔가면서 모니터 안에서의 적당한 위치를 찾는다. 맨 왼쪽 위가 (0, 0)이다. 숫자는 [[픽셀]]([[pixel]]) 단위이다.


pyautogui.moveTo()는 "절대 좌표"로 이동하는 것으로 괄호 안에는 0을 초과하는 숫자가 들어가야 한다. 마이너스나 0을 넣으면 오류가 난다. 화면의 최대 해상도에 해당하는 좌표나 화면을 넘어가는 좌표를 입력해도 오류가 나지는 않는다. 그냥 화면 오른쪽 제일 아래에 있는다.


윈도우 시스템에서는 "실행 가능 모드"라는 개념이 없습니다. 파이썬 설치 프로그램은 .py 파일을 python.exe``와 자동으로 연결하여, 파이썬 파일을 이중 클릭하면 스크립트로 실행합니다. 확장자는.pyw`` 일 수도 있습니다. 이 경우, 일반적으로 나타나는 콘솔 창은 표시되지 않습니다.
pyautogui.moveRel()는 "상대 좌표"로 이동하는 것으로 괄호 안에 마이너스를 입력하면 -x 방향(왼쪽)과 -y 방향(위)으로 움직인다. 화면 끝까지 가면 거기서 더 가지 않고 그 자리에서 다음 명령을 수행한다.


https://python.flowdas.com/tutorial/appendix.html#executable-python-scripts
그리고


= 프레임워크 =
import time, pyautogui
== 웹 프레임워크 ==
일반적으로 파이썬을 웹 서비스에 쓴다고 하면 [[쟁고우]]([[Django]], [ˈdʒæŋɡoʊ])나 [[플래스크]]([[Flask]], [flӕsk])를 쓴다고 생각하면 된다. Django는 풀 스택 [[웹 프레임워크]]이고, Flask는 아니다.
time.sleep(2)
pyautogui.moveTo(230, 140)
for i in range(8):
    pyautogui.click()
    pyautogui.moveRel(100, 40)
    time.sleep(1.5)


파이썬과 비슷한 [[루비]]([[Ruby]])에서는 [[루비 온 레일즈]]([[Ruby on Rails]])와 [[시나트라]]([[Sinatra]])라는 [[웹 프레임워크]]([[web framework]])를 많이 쓴다.
라는 프로그램을 만들어서 실행시켜본다. 그러면 프로그램 실행 후 2초 있다가 마우스 커서가 x=230, y=140 좌표로 이동한 후 "클릭 -> 그 위치에서 x축 방향(오른쪽)으로 100, y축 방향(아래)으로 40 이동 -> 1.5초 동안 쉼"을 0에서 7까지 여덟 번 반복한다.




[[풀 스택]]([[full stack]])은 처음부터 끝까지 모든 것을 한다는 의미이다. 즉, 풀 스택 개발자면 사용자에게 보여지는 프론트엔드(HTML, CSS, JavaScript 등)부터 서버에서 돌아가는 백엔드(Python, Ruby, PHP 등)까지 혼자서 다 개발하는 사람을 말한다.
[[소스 코드]] 첫번째 줄의 import time, pyautogui는 time과 pyautogui 모듈을 불러오라는 의미이다. 3번째 줄의 time.sleep(2)는 time 모듈의 sleep 함수에 2를 넣고 실행하라는 의미이다. 4번째 줄의 pyautogui.moveTo(230, 140)는 pyautogui 모듈의 moveTo 함수에 230과 140을 집어넣고 실행하라는 의미이다.


풀 스택 [[프레임워크]]([[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]] 커널이 있다.
==== 키보드 자동 입력 스크맆트 ====
import pyautogui, time
time.sleep(2)
pyautogui.typewrite('Rape your!')
pyautogui.press('left') 
pyautogui.press('enter')
pyautogui.press('hangul')
pyautogui.keyDown('shift') # hold down the shift key
pyautogui.press('q')
pyautogui.keyUp('shift')   # release the shift key
pyautogui.press(['h', 'w', 'l'])
pyautogui.keyDown('ctrl')
pyautogui.press('f')
pyautogui.keyUp('ctrl')
time.sleep(2.4)
pyautogui.press('esc')


=== Django ===
[[리눅스 민트]]에서 위와 같이 프로그램을 실행한 후 텍스트 편집기 [[xed]]를 열고 키보드를 영어 타자에 놓으면 2초 후 Rape your!를 입력하고, "왼쪽 화살표 키" ←를 눌러 왼쪽으로 한 칸 가고, 엔터 키를 누른 후 "한/영" 키를 눌러 한글로 전환하고, Shift 키를 누른 상태에서 ㅃ을 입력하고, Shift 키를 놓은 후 "ㅗ지"를 입력한다. # 뒤는 [[주석]]이니 입력하지 않아도 무방하다. 그리고 Ctrl 키를 누른 상태에서 f 키를 눌러 "검색"을 띄우고 Ctrl 키를 놓는다. 그리고 2.4초 후 Esc 키를 눌러 "검색"을 닫는다. 만약 [[소스 코드]]의 'hangul'이 작동하지 않으면 'hangeul'이나 'altright'를 입력한다. altright는 오른쪽 Alt 키이다.
[[쟁고우]]([[Django]])는 Python기반 [[웹 프레임워크]]([[web framework]]) 중에 가장 널리 퍼져있다. [[풀 스택]]([[full stack]]) [[웹 프레임워크]]([[web framework]])이다.


[[쟁고우]]([[Django]]) 문서 참조.
[[윈도우즈]]의 경우 [[메모장]]에서 하면 되며 "찾기"의 단축 키가 F3이므로 맨 마지막 단락을 아래와 같이 바꿔도 작동한다.


=== Flask ===
pyautogui.press('f3')
[[플래스크]]([[Flask]])는 Django와 함께 파이썬에서 많이 쓰이는 [[웹 프레임워크]]이다. Django와는 달리 논 풀 스택 웹 프레임워크(non full stack web framework)이다. 즉, 최소한의 기능만 있어서 가볍고 빠르다. 그리고 필요한 기능이 있으면 추가해서 사용한다.
time.sleep(2.4)
pyautogui.press('esc')


== 파이게임(Pygame) ==
용도: 파이썬으로 비디오 게임을 제작하기 위한 프레임워크
장점: 게임 개발 분야에서 일하지 않는 사람이 이러한 프레임워크를 다룰 일이 있을까 라고 생각한다면 오산이다. 파이게임(Pygame)은 캔버스와 그래픽 그리기, 다채널 사운드 처리, 창과 클릭 이벤트 처리, 충돌 감지 등의 복잡한 작업 없이도 여러 가지 GUI 지향 동작을 편리하게 다룰 수 있는 방편을 제공한다. GUI 앱이라고 할지라도, 모든 앱에 파이게임이 제공하는 기능을 적용하지 못할 수도 있다는 사실을 감안하면서, 파이게임의 기능을 한차례 훑어보는 것도 좋다.


=== 토끼와 오소리 게임 ===
PyAutoGUI 사용 방법 짧게 설명
참고로 아래 예제는 파이썬 2.7.3으로 작성되어서 파이썬 3와는 조금 안 맞을 수 있다.
GitHub - asweigart/pyautogui: A cross-platform GUI automation Python module for human beings. Used to programmatically control the mouse & keyboard.
https://github.com/asweigart/pyautogui




* 10대들을 위한 파이선 게임 프로그램 시작하기
PyAutoGUI 사용 방법 전체 설명
2014.05.22
Welcome to PyAutoGUI’s documentation! — PyAutoGUI 1.0.0 documentation
https://pyautogui.readthedocs.io/en/latest/


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


파이선은 빠른 프로토타입이나 리버스 엔지니어링에 좋다고 한다. 쉽게 말하면 나같이 게으른 사람을 위해 만든 언어라고 보아도 좋다.  
다른 자동화 패키지들
Controlling mouse with Python
https://stackoverflow.com/questions/1181464/controlling-mouse-with-python


문제는 이제 이걸로 무엇인가를 해야 하는데 몇가지의 장벽이 있다.


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


펑셔널 어프로치가 아쉽다는 점... 이부분은 람다로 어느 정도 극복 가능하고 정 안되면 리스프나 스킴 인터프리터를 내재해도 된다.
(※ 파이썬 라이브러리는 파이썬 설치 시 자동으로 컴퓨터에 설치가 된다.)


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


오늘은 그래서 파이선 게임을 만드는 예제를 한번 차분하게 번역을 해보기로 했다.
인터넷상 Python으로 보급되는 package는 타 어느 [[스크립트 언어]]와도 비교가 안될 만큼 다양하다. 당신이 하려는 것이 무엇이든, 무슨 언어를 써야 할지 모르겠으면 Python을 쓰면 된다. Python으로 직접 만들었던지, 다른 프로그램의 wrapper가 꼭 존재한다. 못하는 것이 없다. [[PyPI]] 또는 구글 검색을 해보면 안다.


Beginning Game Programming for Teens with Python
웹 사이트 서버를 구현하려고 하면 python web framework를 쳐보자(Django).


글의 제목은 10대들을 위한 파이선 게임 프로그램 시작하기 정도로 번역할 수 있겠다. 더 좋은 이름이 있으면 제게 알려주면 이름을 고치겠다.  
기계 학습 알고리즘을 쓰고 쉽다면 python machine learning 이라 검색하자(scikit-learn).


원문은 https://www.raywenderlich.com/24252/beginning-game-programming-for-teens-with-python 에서 볼수 있다.
얼굴 인식을 코드 몇줄로 할 수도 있다([[OpenCV]]).


그럼 조금씩 시작해 보자.
게임도 만들 수 있다([[PyGame]]). ~~Python make girlfriend도 된다 [[카더라]].~~


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


비디오 게임을 만드는 방법이 대다한 것이라고 생각할지도 모르지만 그다지  복잡하지 않다!
05-6 외장 함수 - 점프 투 파이썬
https://wikidocs.net/33


이 튜토리얼에서  토끼와 오소리라는 간단한 게임을 만들 것이다. 여기서 히어로인 토끼는 오소리떼의 공격에서 성을 방어할 것이다.


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


= 라이브러리 =
[[셸]]([[shell]])은 라이브러리는 아니지만 파이썬 프로그래밍에서 매우 편리하게 쓸 수 있다. 하위 프로세스에서 외부 프로그램을 호출하고, 그 결과값을 파이썬 프로그램으로 반환하는 용도로 쓸 수 있다. 만약 호출 프로그램이 네이티브 파이썬 함수에도 마찬 가지의 기능이다. 모든 [[포직스]]([[POSIX]]) 호환 시스템에서 [[쉘]]([[Sh]])은 최고의 선물이다. 이러한 플랫폼에서 제공되는 모든 명령 줄 프로그램을 파이썬 방식으로 사용할 수 있게 해준다. 더 이상 쓸데없는 작업으로 시간을 낭비할 필요도 없고(OS에 이미 있는 ping을 다시 구현할 필요는 없다), 그 기능을 애플리케이션에 추가 하는 방식에 대해 고민할 필요도 없다. 다만 주의 사항은 이 라이브러리를 통해 전달되는 매개 변수는 정제되지 않는다는 점이다. 따라서 사용자 입력을 그대로 전달하지 않도록 해야 한다.
인터넷상 Python으로 보급되는 package 는 타 어느 스크립트 언어와 비교가 안될 만큼 다양하다. 당신이 하려는 것이 무엇이든, 무슨 언어를 써야 할지 모르겠으면 Python 을 쓰면 된다. Python 으로 직접 만들었던지, 다른 프로그램의 wrapper가 꼭 존재한다. 못하는 것이 없다. PyPI 또는 구글 검색을 해보면 안다. 웹 사이트 서버를 구현하려고 하면 python web framework 를 쳐보자 (Django). 기계학습 알고리즘을 쓰고 쉽다면 python machine learning 이라 검색하자 (scikit-learn). 얼굴 인식을 코드 몇줄로 할 수도 있다([[OpenCV]]). 게임도 만들 수 있다([[PyGame]]). ~~Python make girlfriend 도 된다 [[카더라]].~~


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


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


== 필로우(Pillow) ==
=== 수학, 통계학, 과학, 공학, 빅 데이터 ===
용도: 간편한 이미지 처리
[[수학]], [[통계학]], [[과학]], [[공학]], [[빅 데이터 프로세싱]] 등에 쓰이는 [[라이브러리]]들 목록이다.


장점: 이미지 처리 경험이 있는 대부분의 파이썬 사용자들은 PIL(파이썬 이미징 라이브러리)에 익숙할 것이다. 그러나 PIL은 은 제약이 많으며, 업데이트가 잦지 않다는 단점이 있다. 필로우는 PIL보다 더 사용하기 쉬우면서도, 최소한의 변경만으로 PIL과의 코드 호환성 확보에 목표를 두고 있다. 네이티브 윈도우 이미징 기능과 파이썬의 Tcl/Tk를 지원하는 Tkinter GUI 패키지를 사용하기 위한 확장이 포함되어 있다. 필로우는 깃허브(GitHub) 또는 PyPI 자료실에서 내려 받을 수 있다.
==== 팬더즈(pandas) ====
[[팬더즈]]([[pandas]], https://pandas.pydata.org/ )는 데이터 처리와 분석을 위한 파이썬 라이브러리입니다. R의 data.frame을 본떠서 설계한 DataFrame이라는 데이터 구조를 기반으로 만들어졌습니다. 간단하게 말하면 pandas의 DataFrame은 엑셀의 스프레드시트와 비슷한 테이블 형태라고 할 수 있습니다. pandas는 이 테이블을 수정하고 조작하는 다양한 기능을 제공합니다. 특히, SQL처럼 테이블에 쿼리나 조인을 수행할 수 있습니다. 전체 배열의 원소가 동일한 타입이어야 하는 NumPy와는 달리 pandas는 각 열의 타입이 달라도 됩니다(예를 들면 정수, 날짜, 부동소숫점, 문자열). SQL, 엑셀 파일, CSV 파일 같은 다양한 파일과 데이터베이스에서 데이터를 읽어 들일 수 있는 것이 pandas가 제공하는 또 하나의 유용한 기능입니다. 이 책은 pandas의 기능을 자세히 설명하지는 않습니다. 대신 pandas에 대한 훌륭한 안내서로 웨스 맥키니Wes Makinney가 쓴 『파이썬 라이브러리를 활용한 데이터 분석』(한빛미디어, 2013)을 추천합니다.


== 구이(Gooey) ==
용도: 콘솔 기반 파이썬 프로그램을 플랫폼 기반의 GUI로 바꾸기


장점: 일반인들은 명령 줄 프로그램에 익숙하지 않다. 어떤 옵션을 사용해야 하는지, 또는 어떤 순서로 입력해야 하는지를 이해하는 것은 정말 어려운 일이다. ‘구이(Gooey)’는 argparse 라이브러리에 사용되는 인수를 GUI 형태로 표현한다. 모든 옵션에 레이블이 붙어 적절한 컨트롤(다중 옵션 항목 제공을 위한 드롭다운 등)과 함께 제공된다. 이미 argparse를 사용하고 있다면, 구이를 이용하기 위해 단 한 개의 include와 데코레이터(decorator, @)를 붙이기만 하면 된다.
팬더즈를 [[수학]], [[통계학]], [[빅 데이터]], [[과학]], [[공학]] 계산 등에 쓰는 방법은 [[팬더즈]] 문서 참조.


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


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


== 셸(Sh) ==
금융 시장 분석가나 회계 담당자는 넘파이(NumPy)에 익숙하며, 이를 즐겨 사용한다. 그러나 넘파이의 응용 범위는 수학과 통계를 제외하고도 생각 외로 넓다. 예를 들어 넘파이는 다른 언어를 사용하다 파이썬을 처음 접한 개발자들이 자주 불평하는 파이썬에 다차원 배열 지원을 추가하는 작업을 가장 쉽게, 가장 유연하게 할 수 있는 방법 중 하나다. 다만 모든 요소를 갖춘 완벽한 파이썬 ‘과학-수학’ 기능을 원한다면 넘파이를 표준 항목으로 포함하는 사이파이(SciPy) 라이브러리 및 환경을 사용하는 편이 좋다. 넘파이를 기반으로 하는 정교한 데이터 분석에는 판다스(Pandas)가 있다.
하위 프로세스에서 외부 프로그램을 호출하고, 그 결과값을 파이썬 프로그램으로 반환하는 용도 – 만약 호출 프로그램이 네이티브 파이썬 함수에도 마찬 가지의 기능이다.


장점: 모든 포직스(Posix) 호환 시스템에서 셸(Sh)는 최고의 선물이다. 이러한 플랫폼에서 제공되는 모든 명령 줄 프로그램을 파이썬 방식으로 사용할 수 있게 해준다. 더 이상 쓸데없는 작업으로 시간을 낭비할 필요도 없고(OS에 이미 있는 ping을 다시 구현할 필요는 없다), 그 기능을 애플리케이션에 추가 하는 방식에 대해 고민할 필요도 없다. 다만 주의 사항은 이 라이브러리를 통해 전달되는 매개 변수는 정제되지 않는다는 점이다. 따라서 사용자 입력을 그대로 전달하지 않도록 해야 한다.
NumPy( https://www.numpy.org/ )는 파이썬으로 과학 계산을 하려면 꼭 필요한 패키지입니다. 다차원 배열을 위한 기능과 선형대수 연산과 푸리에 변환 같은 고수준 수학 함수와 유사(pseudo) 난수 생성기를 포함합니다.


== scikit-learn ==
오픈 소스인 scikit-learn사이킷런은 자유롭게 사용하거나 배포할 수 있고, 누구나 소스 코드를 보고 실제로 어떻게 동작하는지 쉽게 확인할 수 있습니다. scikit-learn 프로젝트는 꾸준히 개발, 향상되고 있고 커뮤니티도 매우 활발합니다. 잘 알려진 머신러닝 알고리즘들은 물론 알고리즘을 설명한 풍부한 문서(http://scikit-learn.org/stable/documentation)도 제공합니다. scikit-learn은 매우 인기가 높고 독보적인 파이썬 머신러닝 라이브러리입니다. 그래서 산업 현장이나 학계에도 널리 사용되고 많은 튜토리얼과 예제 코드를 온라인에서 쉽게 찾을 수 있습니다. 앞으로 보게 되겠지만 scikit-learn은 다른 파이썬의 과학 패키지들과도 잘 연동됩니다.


scikit-learn은 두 개의 다른 파이썬 패키지인 NumPy넘파이와 SciPy싸이파이를 사용합니다. 그래프를 그리려면 matplotlib맷플롯립을, 대화식으로 개발하려면 IPython아이파이썬과 주피터 노트북도 설치해야 합니다.
==== 맽플랕립(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 오픈 소스 라이선스로 공개되었다.


[[인공 지능]]([[artificial intelligence]], [[AI]]), [[머신 러닝]]([[machine learning]]), [[인공 신경 망]]([[artificial neural network]]), [[딮 러닝]]([[deep learning]])에 많이 쓴다.
[[인공 지능]]([[artificial intelligence]], [[AI]]), [[머신 러닝]]([[machine learning]]), [[인공 신경 망]]([[artificial neural network]]), [[딮 러닝]]([[deep learning]])에 많이 쓴다.


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


= 언어 구현 =
보통 말하는 Python은 [[C 언어]]로 구현되었으며, 다른 구현체와 구분하여 언급할 때에는 [[CPython]]이라고 표기한다. CLR [[바이트코드]]로 구현된, 즉 닷넷프레임워크 위에서 동작하는 IronPython, CPython에서 C 스택을 없앤 Stackless Python, JVM바이트코드로 구현되어 JVM 위에서 돌아가는 Jython, 파이썬 자체로 구현된 [[PyPy]] 등이 있으며 이 가운데 오리지날은 CPython이다. 이전 버전 문서에는 C#으로 구현된 Ironpython, Java로 구현된 Jython이라고 되어있었으나 이는 명백한 오류다. Jython이 JVM 바이트 코드가 아니라 java로 구현된거라면 안드로이드 dalvik vm에서는 왜 안돌아간다고 생각하는가? 또한, 2014년 6월 [[Dropbox]]에서 [https://github.com/dropbox/pyston Pyston]이란 [[LLVM]]과 [[JIT]] 기반 파이썬을 개발 중이다.[https://tech.dropbox.com/2014/04/introducing-pyston-an-upcoming-jit-based-python-implementation/ DROPBOX TECH BLOG]


한편 [[중국]]에서는 Chinese Python이라는, 중국어 문법으로 한자를 쳐서 돌아가는 언어를 독자 개발했다. 오오 중국 오오.
==== 케라스(Keras) ====
[[케라스]]([[Keras]])는 TensorFlow, Theano, CNTK 등 [[딥 러닝]] 라이브러리를 포함하고 있어 쉽게 다층 퍼셉트론 신경망 모델, 컨볼루션 신경 망 모델, 순환 신경망 모델, 조합 모델 등을 구성할 수 있다.


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


=== 기타 라이브러리 ===
==== 뷰티펄 숲(Beautiful Soup) ====
[[뷰티펄 숲]]([[Beautiful Soup]])의 용도는 XML, HTML와 같은 구문 트리 또는 구조화된 데이터 처리이다.


2007년에 처음 발표된 [[파이썬#s-2|Python]]의 언어 구현 하나로, [[C(프로그래밍 언어)|C]]로 짜인 기존의 CPython과 달리 '''Python으로 Python을 만드는 프로젝트'''이다. [[부트스트래핑]]이라고 한다. 여기까지 얘기하면 뭔가 이상한 짓 하는 프로젝트 내지 실험적인 프로젝트처럼 느껴지겠지만, 이 프로젝트의 진짜 놀라운 점은 기존 CPython보다 전혀 느리지 않을 뿐더러, '''오히려 성능면에서 CPython을 능가하고 있다는 거다.''' 나아가 [[http://speed.pypy.org/|이 링크]]에서 보이는 대로, '''계속해서 빨라지고 있다!''' [[http://speed.pypy.org/|표준 구현인 CPython과의 속도비교. PyPy를 개발하면서 지속적으로 업데이트 하고 있다.]]
[[뷰티펄 숲]]([[Beautiful Soup]])은 마크업 언어 문서를 처리하는 데 따르는 어려움을 완화해준다. 수프를 사용하면 수작업을 거쳐야 하는 여러 작업이 간소화되며, 특정 항목 또는 특정 유형의 항목을 검색하기도 훨씬 더 쉬워진다. 버전 3은 파이썬 2.x에서만 작동한다. 버전 4에서 파이썬 3 호환성이 추가되고 부팅 성능이 향상됐다. lxml 라이브러리(수프에서 코어로 사용 가능)보다 속도는 느리기는 해도, 많은 사용자들이 lxml을 직접 다루는 것보다 수프를 다루는 것을 더 편안하게 느낀다. 수프는 결함 있는 마크업에도 상당히 관대한데, 이는 스크린 스크래핑(Screen Scraping)을 하거나, 다른 다른 사람이 오래 전에 작성한 결함 있는 코드를 관리할 때 큰 도움이 된다.




이 구현은 애초에 그저 장난질 하려고 시작한 프로젝트가 아니다. [[http://psyco.sourceforge.net/|Psyco]]라고 하는, 기존 파이썬 위에다가 [[JIT|Just-In-Time]] 컴파일을 구현해서 실행성능을 높히는 프로젝트가 있었는데, 이걸 개발하던 [[http://codespeak.net/~arigo/|Armin Rigo]]라는 사람이 아예 JIT 컴파일을 하는 파이썬을 처음부터 다시 구현하기로 생각했다. 그래서 2003년부터 PyPy 개발을 시작하여 [[유럽연합]]의 연구자금 지원을 받아가며 지금도 개발하고 있다.
뷰티펄 숲을 사용하여 [[웹 싸이트]]의 HTML 문서들 중 자신이 원하는 부분만 긁어오는 방법은 [[뷰티펄 숲]] 문서 참조.


2017년 8월 기준으로, PyPy3는 윈도우 바이너리가 없으므로 리눅스 바이너리를 실행시켜야 한다. 윈도우 10이라면 1주년 업데이트에 포함된 리눅스 배시 기능을 쓰거나, 윈도우로 리눅스 어플리케이션을 돌리는 프로그램을 이용할 수도 있다.


=== 어떻게 구현하나 ===
==== 필로우(Pillow) ====
[[기계어]]로 [[컴파일]]하지 않고 기껏해야 인터프리팅 성능을 빠르게 하기 위해 [[스크립트]]만을 쓰는 [[파이썬#s-2|Python]]을 가지고 파이썬으로 돌리는 파이썬을 어떻게 만들었을까. PyPy의 접근법은 이렇다.
[[필로우]]([[Pillow]])의 용도는 간편한 이미지 처리이다.


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


2. RPython의 효과적인 컴파일을 위해 다른 언어로 툴체인을 만든다. [[시뮬레이터]]나 [[에뮬레이터]]를 제작하는 때에도 이 과정을 반드시 거친다.


3. Python 구현(런타임)을 RPython 문법으로 작성한다.
==== 스크래피(Scrapy) ====
[[스크래피]]([[Scrapy]])의 용도는 스크린 스크래핑 및 웹 크롤링이다.


4. 3에서 만든 구현을 1 또는 2에서 만든 RPython 해석기로 컴파일한다.
스크래피(Scrapy)는 전체 스크랩 과정을 간소화해준다. 스크랩할 항목 유형을 정의하는 클래스를 만들고 해당 데이터를 페이지에서 추출할 방법에 관한 몇 가지 규칙을 작성하면 그 결과를 JSON, XML, CSV 또는 다른 형식으로 내보내준다. 수집된 데이터를 있는 그대로 저장하거나 가져오는 과정에서 필요 없는 부분을 제거할 수 있다. 또한 스크래피는 웹사이트 로그인이나 세션 쿠키 처리와 같은 기타 다양한 작업을 지원하기 위해 확장될 수 있다. 스크래피로 자동 추출된 이미지는 스크랩된 콘텐츠에 연결된다.


5. 4으로 만든 후보를 이전 또는 다른 구현과 비교(성능 측정), 만족스럽지 않으면 수정한다.(nightly builds)


6. 5에서 만족스러운 결과를 냈다면 출시하고 1 또는 2부터 다시 시작한다.(release)
==== 구이(Gooey) ====
[[구이]]([[Gooey]])의 용도는 콘솔 기반 파이썬 프로그램을 플랫폼 기반의 GUI로 바꾸기이다.


~~뭔가 속는 느낌이지만~~ 처음 한번만 기존 파이썬의 도움을 받으면 다음부터는 스스로 만든 구현으로 저 과정을 자체적으로 계속 반복할 수 있다. 이게 얼핏 보면 '닭이 먼저냐 달걀이 먼저냐' 같은 것으로 착각할 수도 있지만, 이런 식의 접근법은 실제로 프로그래밍 언어를 제작할 때 해당되는 사항이며, 더 좋은 장비의 개발을 위해 기존의 장비를 사용하는 것과 다름이 없다. 일례로 유명 c/c++언어 컴파일러인 gcc도 c/c++로 작성되었다. 파이썬이 스크립팅 언어이기 때문에 일견 특이해보이는 것일 뿐, 인터프리터는 어짜피 컴파일된 상태로 돌아가므로 같은 원리다. 이러한 이유로 로고가 [[우로보로스]]인 셈. 다만 PyPy는 문자 그대로 '''[[진화]]'''하고 있다.
명령 줄 프로그램에 익숙하지 않은 일반인들이 쉽게 사용하게 해준다. 어떤 옵션을 사용해야 하는지, 또는 어떤 순서로 입력해야 하는지를 이해하는 것은 정말 어려운 일이다. ‘구이(Gooey)’는 argparse 라이브러리에 사용되는 인수를 GUI 형태로 표현한다. 모든 옵션에 레이블이 붙어 적절한 컨트롤(다중 옵션 항목 제공을 위한 드롭다운 등)과 함께 제공된다. 이미 argparse를 사용하고 있다면, 구이를 이용하기 위해 단 한 개의 include와 데코레이터(decorator, @)를 붙이기만 하면 된다.
 
 
 
== 프레임워크 ==
[[프레임워크]]는 어떤 목적에 필요한 [[모듈]]과 [[패키지]]들을 모두 하나의 큰 틀에 집어넣은 도구라고 생각하면 된다. 예를 들어 웹 서비스를 할 때 [[쟁고우]]([[Django]]) 하나면 다 되는 것과 비슷하다.
 
 
[[메소드]] 및 [[클래스]]화, 즉 [[모듈화]]를 하는 이유 중 하나가 재사용성인데, 프레임워크는 이 재사용성을 큰 그룹 단위로 묶어주었다고 보면 된다. 재사용 가능한 수많은 [[클래스]]들과 [[라이브러리]]들을 융합한 채로 처음부터 제공해 주기 때문에, 여러 개의 표준을 만들지 않아도 돼서 개발자의 피곤함을 덜어준다.
 
 
=== 웹 프레임워크 Django ===
일반적으로 파이썬을 웹 서비스에 쓴다고 하면 [[쟁고우]]([[Django]], [ˈdʒæŋɡoʊ])나 [[플래스크]]([[Flask]], [flӕsk])를 쓴다고 생각하면 된다. Django는 풀 스택 [[웹 프레임워크]]이고, Flask는 아니다.
 
[[쟁고우]]([[Django]])는 Python기반 [[웹 프레임워크]]([[web framework]]) 중에 가장 널리 퍼져있다. [[풀 스택]]([[full stack]]) [[웹 프레임워크]]([[web framework]])이다.
 
자세한 내용은 [[쟁고우]]([[Django]]) 문서 참조.
 
 
[[풀 스택]]([[full stack]])은 처음부터 끝까지 모든 것을 한다는 의미이다. 즉, 풀 스택 개발자면 사용자에게 보여지는 프론트엔드(HTML, CSS, JavaScript 등)부터 서버에서 돌아가는 백엔드(Python, Ruby, PHP 등)까지 혼자서 다 개발하는 사람을 말한다.
 
풀 스택 [[프레임워크]]([[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]] 커널이 있다.
 
 
=== 파이게임(Pygame) ===
[[Pygame]]으로 [[게임]]([[game]])을 만드는 방법은 [[파이게임]] 문서 참조.
 
 
=== Cocos2d ===
Cocos2d란 2D 게임, 데모, 기타 시각적인/인터랙티브한 애플리케이션을 제작할 때 쓰이는 [[프레임워크]]입니다. Cocos2d 관련 추가 정보는 아래 링크에서 확인하실 수 있습니다.
 
https://python.cocos2d.org/doc.html
 
 
간단하게 말하자면, Tkinter보다는 게임 만드는게 더 편하다는 것이죠. 일단 설치부터 해봅시다.
 
 
[[리눅스]]의 경우 [[터미널]]에서
 
sudo pip3 install cocos2d
 
를 입력한다.
 
 
[[윈도우즈]]의 경우 cmd를 실행시킨 뒤 다음을 입력합니다.
 
pip install cocos2d
 
 
* [파이썬 게임 프로그래밍 공부] 6. Cocos2d 입문
2017-09-22
 
https://alegruz.imweb.me/blog/?idx=243177&bmode=view


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


= 멀티쓰레딩 문제 =
= 멀티쓰레딩 문제 =
파이썬은 멀티스레딩을 지원하기 위하여 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 718: Line 1,710:
아무래도 multiprocessing 하나만 사용했을 때는 속도상의 이점이 크게 느껴지지 않을 수도 있다. numba, cython과 같은 라이브러리를 사용하면 속도가 약 20배 정도 빨라지므로 이 둘을 조합하면 파이썬으로도 만족할만한 성능이 나올 것이다.
아무래도 multiprocessing 하나만 사용했을 때는 속도상의 이점이 크게 느껴지지 않을 수도 있다. numba, cython과 같은 라이브러리를 사용하면 속도가 약 20배 정도 빨라지므로 이 둘을 조합하면 파이썬으로도 만족할만한 성능이 나올 것이다.


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


= 여담 =
[[파이썬]]([[Python]])을 배우면 [[오픈 소스]]인 [[토어챝]]([[TorChat]])의 [[소스 코드]]를 수정하여 자신이 원하는 기능을 마음대로 추가할 수 있다.


객체 지향을 배울때 추천할만한 언어이다. 많은 대학들이 C++ 환경에서 가르치지만, 이경우 필요한 객체를 만들어서 쓰는 실습이 많은데 대부분 이미 존재하는 객체를 가져다 쓴다는 개념을 이해하지 못하는 경우가 많다. STL을 쓰면 달라지지만 실습에서 STL을 요구하는 문제가 나오는 경우도 드믈고 주로 사용되는 문자열 변환, 배열 관련 연산 등은 파이썬에서 따로 임포트할 필요없이 자료형 자체가 이미 클래스로서 편리하게 클래스 함수를 던져주기 때문에, 클래스의 재활용이라는 측면을 훨씬 이해하기 쉽다. 무엇보다 하루면 다 배울 있는 언어이기도 하고. 예전에는 한국을 포함하여 대부분의 대학들이 C++이나 Java 같은 실제 회사에서 많이 쓰는 언어 위주로 수업을 개설했으나, 미국대학들은 개론 수업 언어를 Python으로 옮겨가는 추세이다. [[UC 버클리]] 컴퓨터과학 개론수업인 CS 61A 를 인터넷 강의로 들어보자!
= 컴파일 + 링크 <nowiki>=</nowiki> 빌드 =
초창기의 [[컴퓨터]]는 [[기계어]]로 [[프로그래밍]]을 했다. 그러나 기계어는 사람이 이해하기 아주 어려워서, 이를 보다 편하게 사용하기 위해 이런 방법을 생각했다.
 
- 기계어의 집합을 더 간단하게 표현하는 텍스트 문서를 만든다. 예를 들어 C는 긴 코드를 간단하게 표현하기 위해 함수나 매크로(macro)를 사용할 수 있는데, 기계어로 10줄짜리의 코드를 매크로 A로 정의하고 문서에는 A만 써넣는 경우를 생각하자.
 
- 이 텍스트 문서를 기계어로 자동 번역하는 프로그램 A를 만든다.
 
- 텍스트 문서를 프로그램 A를 이용하여 기계어로 자동 번역한다. 이 프로그램을 실행하면 위에서 예시로 작성한 문서의 A가 기계어 10줄로 번역된다.
 
 
이렇게 하면 필요할 때마다 텍스트 문서만 수정하여 프로그램을 간단하게 만들 수 있다. 위 내용은 사실 순서가 이상한데, 다시 한 번 순서를 맞춰보자.
 
- 일정한 형식으로 작성된 문서를 기계어로 자동 번역하는 프로그램 A를 먼저 만든다.
 
- 이후에 프로그램을 만들 때마다 A가 번역할 수 있도록 일정한 형식으로 문서를 작성한다.
 
- 문서 작성이 완료되면 프로그램 A를 실행하고 파일을 넘겨서, A가 자동으로 번역해준 기계어 파일을 얻게 된다.
 
그리고 바로 여기서 사용되는 프로그램 A를 [[컴파일러]]([[compiler]])라고 하고, 이때 작성한 일정한 형식의 컴퓨터 명령을 [[소스 코드]]([[source code]]), 소스 코드가 저장된 텍스트 파일을 [[소스 코드 파일]]([[source code file]]) 또는 간단히 [[소스 파일]]([[source file]]), 그리고 이를 번역하는 행위를 [[컴파일]]([[compile]])이라고 한다.
 
 
컴퓨터가 발전하고 작성하는 소스 코드의 양이 늘어남에 따라, 한 파일에 모든 소스 코드를 작성하는 방식이 불편하다는 것을 깨닫게 되었다. 사람들은 소스 코드를 다른 파일에 분리하는 방법을 생각해냈다. 원래 하나였던 파일을 분리했으므로, 프로그램을 완성하려면 분리했던 파일은 모두 연결해야 한다. 이렇듯 분리된 파일을 모아 하나의 실행 가능한 파일을 만들면 이를 두고 파일들을 [[링크]]([[link]])했다고 하고, 이때 사용되는 프로그램을 [[링커]]([[linker]])라고 한다.
 
 
종합하면, 우리는 기계어를 이용하지 않고 실행 파일을 생성하기 위해 다음의 순서를 거친다.
 
- 소스 코드를 작성하고 파일로 저장한다.
 
- 저장한 소스 파일을 컴파일러를 이용하여 컴파일 한다. 목적 파일이 생성된다.
 
- 컴파일러가 생성한 목적 파일들을 링커를 이용하여 링크 한다. 실행 가능한 목적 파일이 생성된다.
 
링커는 실행 가능한 ‘목적’ 파일을 생성한다. 컴파일러가 생성하는 파일과 링커가 생성하는 파일의 차이는 생성한 목적 파일이 실행 가능 하느냐에 있다.
 
 
컴파일과 링크 과정을 합쳐 [[빌드]]([[build]])라고 하고, 이때 사용되는 프로그램을 [[빌더]]([[builder]])라고 한다.
 
 
컴파일 & 링크 & 빌드
https://opentutorials.org/module/1594/9734
 
 
== make와 Makefile ==
[[리눅스]]나 [[유닉스]]에서는 명령어를 여러번 입력해서 해야 하는 프로그램의 [[빌드]]를 make 한 번 입력하여 편하게 하기 위해 [[메이크]]([[make]])라는 걸 사용한다. 참고로 make는 [[윈도우즈]]에서도 사용할 수 있다. Makefile이라는 텍스트 파일 안에 자동으로 실행할 [[스크맆트]]([[script]])를 적어둔다. 그리고 [[터미널]]에서 make를 입력하면 [[소스 코드]] 파일들을 [[컴파일]]과 [[링크]]를 수행하여 Makefile에 적힌대로 [[빌드]]를 한다.
 
make clean
이라 명령하면 타겟(target) 파일을 만들기 위해 임시로 생성한 현재 디렉토리의 모든 object 파일들을 rm 명령어로 제거해 줍니다.
 
 
* make와 Makefile - 멍멍멍
https://bowbowbow.tistory.com/12
 
 
우선 [[펄]]([[Perl]])로 작성된 ./configure 스크립트를 수행하여 Makefile을 생성하고 build 환경을 구성하게 된다. ./configure 대신 ./Configure 나 ./config 인 경우도 있다. 그리고 기본적으로 [[정적 라이브러리]]로 빌드되므로 [[동적 라이브러리]]로 빌드할 경우 shared 옵션을 추가한다.
 
 
* OpenSSL 컴파일(compile) & 빌드(build)
https://www.lesstif.com/pages/viewpage.action?pageId=6291508
 
 
[[정적 라이브러리]]([[static library]])는 루틴들과 외부 함수들 그리고 변수들의 집합으로서, [[컴파일 타임]]에 호출자에 의해 리졸브되며 컴파일러와 링커에 의해 [[목적 파일]]과 독립된 실행 파일을 생성하기 위해 대상 애플리케이션에 복사된다. 이 실행 파일과 이것을 컴파일링 하는 과정 모두 프로그램의 [[정적 빌드]]로 알려져 있다. 역사적으로, 라이브러리들은 단지 정적이었었다. 정적 라이브러리들은 다른 정적 라이브러리와 [[목적 파일]]들과 빌딩/링킹 시에 단일 [[실행 파일]]을 생성하기 위해 통합되거나 [[런타임]] 시에 메모리에 올라온 실행 파일의 [[주소 공간]](컴파일 타임/[[링크 타임]]에 결정되는 정적 메모리 오프셋)에 로드된다.
 
 
[[동적 라이브러리]]([[dynamic library]]) 는 소프트웨어의 일종으로, 말 그대로 동적 링크를 사용한 라이브러리이다. 여러 프로그램이 공통으로 필요로 하는 기능을 프로그램과는 분리하여 필요할 때에만 불러내어 쓸 수 있게 만들어 놓은 라이브러리를 말한다.
 
예를 들어 「마우스 포인터가 지금 화면 어디에 있는지를 조사」하는 기능은 다양한 프로그램([[응용 프로그램]])이 공통적으로 사용하려는 기능으로 여겨지므로, 그 부분만을 [[모듈]]화하고, 여러 프로그램들이 사용할 수 있도록 하는 것이 낫다. 이러한 경우 이 기능을 동적 라이브러리로서 만들어 놓는 경우가 많다.
 
[[마이크로소프트 윈도]]에서는 [[동적 링크 라이브러리]]라고 해서 확장자(extension)가 DLL인 파일로 제공되고 있으며, [[리눅스]]에선 /lib 디렉터리 밑의 .so 파일 등으로 구현된다.
 
개인이 자유 소프트웨어 등을 작성할 때에 만들기 쉽게 하기 위해서 작성해 무료로 제공되는 것도 있다. 동적 링크 라이브러리의 일종으로 [[런타임 라이브러리]]가 있다.
 
 
[[아이뮬]]([[iMule]])의 경우
./configure --prefix=/home/user/iMule-2.3.2.3
와 같이 ./configure 뒤에 옵션을 붙여 Makefile을 생성 후
make
를 입력하여 [[소스 코드]]를 [[컴파일]] 및 [[링크]]한다. 그 후
make install
을 입력하여 iMule을 설치한다. 마지막으로
./imule
을 입력하여 설치된 iMule을 실행시킨다.
 
 
[[토어]]([[Tor]])의 경우
./configure
로 Makefile을 생성 후
make
로 [[빌드]]하고
src/or/tor
로 실행시킨다. 토어는 설치 과정이 필요없고, 실행 파일만으로 작동한다. 위 [[명령어]]는 현재 [[디렉터리]]의 하위 디렉터리인 src [[폴더]]의 하위 폴더인 or 디렉터리의 tor라는 [[파일]]을 [[실행]]시키라는 의미이다.
./configure && make && src/or/tor
와 같이 &&을 사용하여 여러 명령어를 한번에 입력하여 순차적으로 실행시킬 수도 있다.
 
 
== 실행 가능한 파이썬 스크맆트 ==
[[유닉스]]나 [[리눅스]]는 파이썬이 기본으로 설치되어 나오기 때문에 [[인터프리터]] 언어임에도 불구하고 exe 파일처럼 실행이 가능하다. 그러나 [[윈도우즈]]는 파이썬을 별도로 설치해야 하므로 exe 파일처럼 모든 컴퓨터에서 더블클릭만으로 실행할 수는 없다. 단, 윈도우즈라도 파이썬이 설치되어있고 py 파일이 파이썬 프로그램으로 연결된 컴퓨터에서는 더블클릭만으로 실행 가능하다. 그 외에 파이썬 [[소스 코드]]를 [[C 언어]] 등 다른 언어의 소스 코드로 바꾼 후 exe 파일로 [[컴파일]]([[compile]]) 및 [[링크]]([[link]])하는 방법이 있기는 하다.
 
 
파이썬 인터프리터는 보통 /usr/local/bin/python3.6 에 설치됩니다; 유닉스 셸의 검색 경로에 /usr/local/bin 를 넣으면 명령:
 
python3.6
을 셸에 입력해서 실행할 수 있습니다. 유닉스에서, 파이썬 3.x 인터프리터는 보통 python 이라는 이름의 실행 파일로 설치되지 않는데, 동시에 설치되는 파이썬 2.x 실행 파일과 충돌하지 않도록 하기 위해섭니다. 인터프리터가 위치하는 디렉터리의 선택은 설치 옵션이기 때문에, 다른 장소도 가능합니다; 주변의 파이썬 전문가나 시스템 관리자에게 확인할 필요가 있습니다. 예를 들어, /usr/local/python 도 널리 사용되는 위치입니다.
 
 
[[BSD]] 스타일의 [[유닉스]] 시스템에서 파이썬 스크립트는 [[셸 스크립트]]처럼 직접 실행할 수 있게 만들 수 있습니다. 인터프리터가 사용자의 PATH 에 있다고 가정할 때 다음과 같은 줄
#!/usr/bin/env python3.5
을 스크립트의 시작 부분에 넣고 파일에 실행 가능 모드를 줍니다. #! 는 반드시 파일의 처음 두 문자여야 합니다. 일부 플랫폼에서는 이 첫 번째 줄이 유닉스 스타일의 줄 종료 ('\n')로 끝나야 하며, 윈도우 줄 종료('\r\n')는 허락되지 않습니다. 파이썬에서 해시, 또는 파운드, 문자 '#' 는 주석을 시작하는 데 사용됩니다.
 
 
스크립트는 chmod 명령을 사용하여 실행 가능한 모드, 또는 권한, 을 부여받을 있습니다.
$ chmod +x myscript.py
 
 
소스 코드가 유닉스 "[[셔뱅]]([[shebang]])" 줄 로 시작하는 경우에, 문자 인코딩 선언은 두 번째 줄에 들어갑니다. 예를 들어:
#!/usr/bin/env python3
# -*- coding: cp-1252 -*-
와 같이 해주면 됩니다.
 
 
윈도우 시스템에서는 "실행 가능 모드"라는 개념이 없습니다. 파이썬 설치 프로그램은 .py 파일을 python.exe와 자동으로 연결하여, 파이썬 파일을 이중 클릭하면 [[스크맆트]]([[script]])로 실행합니다. 확장자는 .pyw일 수도 있습니다. 이 경우, 일반적으로 나타나는 콘솔 창은 표시되지 않습니다.
 
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
 
원작자가 알아본다니까 기대 중이다.. ㅎㅎ....


[[Python]]의 창시자 [[귀도 반 로섬]]은 [[구글]]에 입사했다. 그리고 Python 은 구글의 3대 개발 언어 중 하나로 알려져 있다.(나머지 2개는 [[C++]] 와 [[Java]] 이다.) 하지만 최근에 [[Go]]로 넘어가려는 움직임이 보인다 [[카더라]]. 2012년 12월 7일부로 [[DropBox]]에 입사했다. 한 헤드헌터로부터 경력직 파이썬 개발자 취업제안을 받았다고 한다. 즉, 파이썬 창시자에게 파이썬 '경력직' 개발자를 구하는 수준의 메일을 보낸 것(...) [https://plus.google.com/115212051037621986145/posts/R8jEVrobbRj #] ~~면접관: 파이썬 어느정도 하시나요? 귀도: '''제가 만들었는데요'''.~~
https://alegruz.imweb.me/blog/?idx=304335&bmode=view


http://www.codecademy.com/tracks/python 에서 인터프리터 설치 없이 웹 상으로 배워볼 수 있다.


2014년 6월 WWDC에서 애플이 공개한 [Swift(프로그래밍 언어)|Swift]]라는 언어에게 220배(...) 느리다고 까였다. 하지만, [[드롭박스]] 사에서 개발하고 있는 [[파이썬]]을 프론트엔드로 하고, LLVM을 백엔드로 사용하는 Pyston이 릴리즈되면 별차이 없어질 거란 전망도 나왔다.
= 함께 보기 =
http://rigvedawiki.net/w/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%20%EC%96%B8%EC%96%B4)?action=download&value=swift_objc_python_comparison.png
* [[프로그래밍]]
유저들은 C 바인딩인 ctypes를 출동시킨다고 부들부들... 하지만 테스트환경 세팅을  자사 제품에 유리하게 만드는건 벤치마크의 유서깊은 전통이므로 맹신은 금물. 파이썬의 강점은 속도에 있지 않다. 더구나 [[JIT]] 없는 동적 인터프리터 언어와 컴파일 언어의 성능을 비교하면 어떤 언어를 비교하더라도 당연히 후자가 압도적으로 유리하다(...).
* [[트킨터]] ([[Tkinter]])
* [[팬더즈]] ([[pandas]])
* [[뷰티펄 숲]] ([[Beautiful Soup]])
* [[파이게임]] ([[Pygame]])
* [[쟁고우]] ([[Django]])
* [[청부 살인]]


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

edits

Navigation menu