파이썬

히든위키 코리아
필독 유닠스 계열 저작물, 성인물, 도박 프로그래밍 웹 써버 보안 대화방
필독 사항 프로젴트 트라이던트 표면 웹 싸이트 제작 파이썬 리눅스 마스터 대화방 2019년
위키 편집 리넠스 마약, 아청물, 해킹 웹 프로그래밍 웹 싸이트 보안
위키 문서 작성법 우분투 다크넽 싸이트 제작 쟁고우 정보 보안 기사

목차

개요

파이썬(Python)은 프로그래밍 언어의 일종이다.


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

C샾은 대부분 마이크로소프트용으로만 쓰이고, 오브젝티브-C(Objective-C)는 거의 애플용으로만 쓰인다.


프로그래밍을 배우기 전에 찰스 펫졸드코드라는 책을 읽어보기를 추천한다. 영어판은 구글에 charles petzold code pdf라고만 쳐도 pdf 파일이 나오며, 한국어판은 도서관에서 빌리거나 사서 봐야 한다.

  • [Book] CODE 코드

https://blog.outsider.ne.kr/1053

  • 찰스 펫졸드의 코드:CODE

http://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


11: >10 일베충은 나가 죽어라. 김대중 만세! 노무현 만세!! 문재인 만만세!!! [삭제] 2019-5-7 오전 0:10


12: >11 이승만 전쟁 나자 서울 사수한다고 방송 틀어놓고 한강철교 끊고 도망간 새끼. 박정희 위계를 이용한 여대생, 여가수, 여자 탤런트 강간마 새끼. 전두환 부산 형제복지원 대량 납치살인 지시한 새끼. [삭제] 2019-5-7 오전 0:45


13: >12 박정희, 전두환 때는 대통령 아니라 고위 공직자 중에 여자 연예인 따먹은 사람들 많은데. 계엄령이니 뭐니 해서 공포 정치 독재 정치 시기라 잡아온 다음에 강간하고 돌려보냄. 처녀 연예인이든, 유부녀 연예인이든. 그래도 어디 가서 도 못함. [삭제] 2019-5-7 오전 0:51


14: >13 그래도 이승만 시절보다 좋아진건데. 이승만 때는 아예 살해되는 경우도 많았음. 나라가 혼란하던 시기라 공산당 협력자로 몰아서 마을 하나 통째로 총살시키는 경우도 많았음. 조사 과정이든 학살 과정이든, 그 과정에서 강간이야 수없이 일어났고. [삭제] 2019-5-7 오전 0:53

http://jqu6my2mlqp4zuui.onion/p?id=11316

특징

파이썬객체 지향 프로그래밍(object-oriented programming) 언어에 속한다. 객체 지향 프로그래밍 전에 절차적 프로그래밍(procedural programming) 언어가 먼저 개발되었다. 절차적 프로그래밍 언어에서 구조적 프로그래밍(structured programming)이 나왔다. 구조적 프로그래밍은 구조화 프로그래밍으로도 불리며 프로그래밍 패러다임(programming paradigm)의 일종인 절차적 프로그래밍의 하위 개념으로 볼 수 있다.


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


인터프리터 언어

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

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

여기까지 읽었다면 그 느린 것을 왜 쓰느냐는 의문에 도달하겠지만, 인터프리터 언어는 프로그램 수정이 간단하다는 장점이 있다. 컴파일러는 소스 코드를 번역해서 실행 파일을 만들기 때문에 프로그램에 수정 사항이 발생하면 소스 코드를 다시 컴파일해야 한다. 프로그램이 작고 간단하면 문제가 없지만 프로그램 덩치가 커지면 컴파일이 시간 단위가 되는 일이 많아진다. 하지만 인터프리터는 소스 코드를 수정해서 실행시키면 끝. 이 장점 때문에 인터프리터 언어는 수정이 빈번히 발생하는 용도의 프로그래밍에서 많이 사용된다. 이 장점을 최대한 살려서 인터프리터를 적극적으로 채용한 것이 스크립트 언어다.

또한 프로그래밍 언어 차원에서 동적인 기능을 지원하기 유리하다. 물론 컴파일러도 어느 정도의 동적인 기능은 지원 가능하지만, 실행 시간에만 어떤 모듈을 사용할지 결정하는 것이나 사용자가 입력한 임의의 프로그램을 평가하는 것이라던가 심지어 이미 실행되고 있는 코드 자체를 수정하며 실행하는 등의 기능을 컴파일러로는 구현할 수가 없다. (만약 컴파일된 프로그램인데 이러한 기능을 전부 사용할 수 있다면 인터프리터가 해당 프로그램에 내장되어 있을 것이다.)

디버그를 하는 방식이 컴파일러로 컴파일하여 실행하는 경우와 다른 편이다. 컴파일러와 달리 인터프리터의 경우 코드를 한줄씩 실행시킬 수도 있기에 어떤 코드를 작성하고 바로 실행해보고 문제가 있으면 바로바로 수정하는 방식이 가능하다. 구문 오류의 경우 예전 인터프리터의 경우에는 정말로 한줄씩 읽어서 실행했기에 구문 오류가 나오는 부분 전까지는 멀쩡하게 실행되는 경우가 많았다. 그러다보니 실행되지 않는 부분에는 오류가 있어도 오류로 처리되지 않는 경우도 존재하였다. 하지만 최근에는 성능 등의 이유로 파일을 실행하면 파일 전체를 컴파일 하는 방식을 사용하기 때문에 처음부터 구문 오류를 전부 잡아주는 인터프리터도 많아지고 있다.

소스 코드가 쉽게 공개된다는 단점이 있다. 컴파일되는 언어도 기계어를 읽으면 프로그램이 어떻게 동작하는지 알 수 있으며, 디컴파일러를 이용하여 원본 언어로 변환하는 것도 불가능은 아니다. 하지만 인터프리터를 주로 사용하는 언어의 경우 바이트코드 등으로 컴파일해서 배포하는 경우도 잘 없을 뿐더러, 지원한다고 해도 컴파일 전/후 언어가 비교적 단순한 편이라서 쉽게 디컴파일이 가능하다. 암호화를 해도 어차피 실행될 때는 복호화되니 무용지물. 그나마 식별자들을 전부 이상하게 바꾸고 해석하기 힘들게 난독화하는 정도 외에 할 수 있는 방법이 없다.

JIT 컴파일

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

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

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

최근의 자바 가상 머신과 .NET, V8(node.js)에서는 JIT 컴파일을 지원한다. 즉, 자바 컴파일러가 자바 프로그램 코드바이트코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 기계어로 변환한다.

CPythonJIT를 지원하지 않으며 PyPyPyston은 JIT를 기본으로 지원한다. JythonIronPython은 그들이 빌드(build)하는 가상 머신의 JIT 컴파일러를 사용한다. Cpython의 경우 과학이나 천체물리학에 쓰는 NumbaHOPE 모듈을 사용하여 JIT 컴파일러를 쓸 수 있다. https://numba.pydata.org/ https://github.com/jakeret/hope

동적 타입 언어

정적 타입 언어(statically typed language): 자료형(type)이 고정돼 있는 프로그래밍 언어(programming language). 설명이 어려운데 간단히 얘기하자면 정수형으로 정의한 1은 계속 정수형 1로 남아있다. 이걸 실수형 1.0으로 바꾸려면 명시적인 형변환(Type casting)을 해줘야 한다. 묵시적 형변환이 이루어지는 경우도 있지만 제한적이다.

동적 타입 언어(dynamically typed language): 자료형이 그것을 처리할 함수(function) 또는 메서드(method)에 따라 그때 그때 바뀌는 언어(language). 예를 들어 정수형 1을 정의했어도 그걸 처리할 함수가 문자열을 받아들이게 설계돼있다면 자동으로 정수형 1을 문자 1로 바꿔준다.


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

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

Python동적 타입 언어(dynamically typed language)라는 점이 큰 프로젝트에서는 단점으로 작용하여 자료 구조 설계나 디버깅이 어렵다는 지적도 있다. 다만 "정적 타입 언어 vs. 동적 타입 언어" 논쟁은 서로의 장단점이 있으며 일종의 종교논쟁 취급 받는다. 일례로 OCaml같은 강력한 타입 인터페이스(Hindly-Milner)를 가진 경우라 할지라도 타입 에러 정도는 거의 모두 컴파일 타임에 잡아내는 있는 반면에, 모든 버그가 타입 에러는 아니기 때문에 여전히 테스트 및 디버깅 과정은 필요하며, 타입 시스템으로 인한 부담 때문에 빠른 구현에는 부담이 갈 수 있다. 반면에 동적 언어는 빠른 구현의 이점이 있지만 타입 에러가 많이 나는 특징이 있다. 그러나 커버리지가 높은 테스트 세트로 어느정도 커버할 수 있으며 최근의 추세와 부합하는 방식이기도 하다.

Python 3

파이썬 2.5.6 이하 버전에서는 문법이 좀 다르다.

print "Hello, world!"

와 같이 입력해야 한다. 파이썬 3.0.0 이상에서는 print가 함수(function)가 되어

print("Hello, world!")

와 같은 문법을 쓴다. https://docs.python.org/2/whatsnew/2.6.html#pep-3105-print-as-a-function 버전 2.6 ~ 2.7에선 둘 다 사용 가능하다.


사용자가 늘다 보니 여러 단점들이 지적되었는데, 과감하게 하위 호환성을 포기하고 Python 3000이라는 코드명으로 개발하기 시작하여 발표된 버젼이다. 내부적으로는 많이 변했다고 하는데 겉보기에는 별로 변한 것 같지 않다는 것이 함정. 그러나 소소한 부분에서 문법과 기본 라이브러리에 차이가 있어 호환이 되지 않는다. 2to3이라는 python2를 python3로 바꿔주는 컨버터가 있어서 전부 갈아 엎어야 하는 수고는 덜 수 있다.

Python을 실제로 사용하게 되면, 구현에 필요한 기능을 지원하는 여러 패키지를 받아서 설치해 사용하게 된다. Python 2.x vs Python 3.x 에서 선택은 주로 "내가 사용하기 원하는 패키지가 동작하는 환경"에 따라서 선택하게 된다.


Python 3.x 부터는 C++, Java, 액션스크립트 등처럼 내부적으로 모든 문자열을 유니코드로 처리한다. 덕분에 한글 비주얼 프로그래밍 툴 중 하나인 창조처럼 변수나 함수 이름을 한글로 정할 수도 있게 되었다.

이름 = "홍길동"
나이 = 17
출력 = print

출력('{} {}'.format(이름, 나이))

예를 들면 위와 같은 식이다.

문제는 유니코드 문자열의 한 글자가 플랫폼 및 빌드 옵션에 따라 무조건 2바이트 또는 4바이트를 차지한다는 것. Python 2.x은 기본 문자열이 바이너리 문자열로 처리되기 때문에 한 글자가 1바이트만 차지한다. 하지만 Python 3.x는 기본 문자열이 항상 유니코드이고, UCS-4를 모두 지원하기 위해 문자 당 4바이트를 할당하는 "wide" 빌드의 Python 3.x는 100MB 길이의 아스키 문자열을 위해 400MB의 램을 사용한다. 따라서 문자열 처리에서 메모리가 낭비될 뿐만 아니라 처리 시간도 늦어져 성능이 떨어지는 것은 당연지사. 2.x 코드를 3.x에서 돌렸는데 많이 느리다면 문자열과 관계된 문제일 가능성이 높다.

이런 문제를 해결하기 위해, 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-languageshttps://softwareengineering.stackexchange.com/questions/116982/what-is-the-difference-between-syntax-and-grammar 를 참조하기 바란다.

C/C++와의 결합

파이썬은 접착(glue) 언어라고도 부르는데, 그 이유는 다른 언어들과 잘 어울려 다른 언어와 결합해서 사용할 수 있기 때문이다. C나 C++로 만든 프로그램을 파이썬에서 사용할 수 있으며, 파이썬으로 만든 프로그램 역시 C나 C++에서 사용할 수 있다.

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

C 바인딩인 ctypes도 있다.

사용 용도

기계 학습에 관심을 갖는 사람이 지난 1년간 폭발적으로 증가했다. 역사적인 알파고와 이세돌의 경기가 3월에 있었고, 그 이후로 더욱 주목을 받고 있다. 숫자나 문자 데이터만을 사용하던 기계 학습 방식은 사용자들의 모바일 장비 사용 패턴을 학습하는 것으로 진화하고 있다. 이 점으로만 봐도 기계 학습은 2017년에 더 중요한 자리를 차지할 것이다.

인공 지능은 2016년의 화두였다. 음성 인식과 이미지 분류는 사용자가 접할 수 있는 극히 일부의 기술이며, 기계는 사람과 비슷한 인지 능력을 갖는 정도까지 진화했다. 인공지능과 기계 학습을 이용한 스타트업도 많이 등장하고 있다. 여기에 Google의 텐서플로우(TensorFlow)나 Microsoft의 Cognitive Toolkit과 같은 오픈 소스 프로젝트들도 발표됐다. 기계 학습은 수학과 밀접하게 연관된 분야이며, 기계학습을 시작하기에 도움이 되는 온라인 코스도 나와있다.

가상 현실(Virtual Reality, VR)과 증강 현실(Augmented Reality, AR)이 등장한 지는 좀 되었지만, 비로소 이 기술들은 흥미로운 경험을 제공할 정도까지 성숙했다. Facebook(Oculus Rift), Google(Daydream), Microsoft(Windows Holographic) 들은 가상 현실 플랫폼을 제공하고 서드 파티의 개발자들을 기다리고 있다. VR 헤드셋은 멀미를 줄이거나, 게임 이외의 분야에서도 즐거운 경험을 제공하기 위한 도전을 하고 있으며, 아직은 그 정도 단계이다.

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

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


웹 프로그래밍

일반적으로 익스플로러나 크롬, 파이어폭스와 같은 브라우저를 이용해 인터넷을 사용하는데, 누구나 한 번쯤 웹 서핑을 하면서 게시판이나 방명록에 글을 남겨 본 적이 있을 것이다. 그러한 게시판이나 방명록을 바로 웹 프로그램이라고 한다. 파이썬은 웹 프로그램을 만들기에 매우 적합한 도구이며 실제로 파이썬으로 제작된 웹사이트는 셀 수 없을 정도로 많다.

데이터베이스 프로그래밍

파이썬은 사이베이스(Sybase), 인포믹스(Infomix), 오라클(Oracle), 마이에스큐엘(MySQL), 포스트그레스큐엘(PostgreSQL) 등의 데이터베이스에 접근할 수 있게 해주는 도구들을 제공한다.

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


과학 및 공학 분야

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

수치 연산 프로그래밍

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

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

데이터 분석

파이썬으로 만들어진 팬더스(Pandas)라는 모듈을 이용하면 데이터 분석을 더 쉽고 효과적으로 할 수 있다. 데이터 분석을 할 때 아직까지는 데이터 분석에 특화된 "(R)"이라는 언어를 많이 사용하고 있지만, 팬더스가 등장한 이후로 파이썬을 이용하는 경우가 점점 증가하고 있다.

(R)과 같이 특정분야에 특화된 언어와 비교하면 꼭 파이썬 라이브러리가 더 다양하다고 볼 수도 없다.

사물 인터넷

사물 인터넷 분야에서도 파이썬은 활용도가 높다. 한 예로 라즈베리 파이(Raspberry Pi)는 리눅스 기반의 아주 작은 컴퓨터이다. 라즈베리파이를 이용하면 홈시어터나 아주 작은 게임기 등 여러 가지 재미있는 것들을 만들 수 있는데 파이썬은 이 라즈베리파이를 제어하는 도구로 사용된다. 예를 들어 라즈베리 파이에 연결된 모터를 작동시키거나 램프에 불이 들어오게 하는 일들을 파이썬으로 할 수 있다.

게임 개발

문명 4의 스크립트 언어로 쓰였다. lua와 더불어 게임 스크립트 언어의 양대산맥.

킹덤 언더 파이어의 엔진에도 쓰였다. 500여 개의 자체모듈이 누더기처럼 돌아갔다고 한다(…).

월드 오브 탱크는 상당부분이 파이썬으로 구현되어있다. 유저가 작성하는 모드도 로직 부분은 파이썬으로 구현된다.

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


소스 코드 작성

지에디트(gedit), 리프패드(Leafpad), xed, 메모장(Notepad) 등 일반적인 문서 편집기로 파이썬 소스 코드를 작성해도 된다. 하지만 이런 일반 문서 편집기보다는, 파이썬 소스 코드 편집기(editor)로 ipython notebook, Sublime Text, Rodeo, PyCharm, Visual Studio Code 등을 많이 사용한다.

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


들여쓰기

PEP(Python enhancement proposal, 파이썬 향상 제안) 8은 Style Guide for Python Code이며 저자는 Guido van Rossum, Barry Warsaw, Nick Coghlan이다. PEP 8에서는 들여쓰기(indentation)에 (tab)을 쓰지말고, 스페이스 바(space bar)를 쓰라고 하며, "스페이스 바"로 4칸을 띄우라고 규정한다.

들여쓰기(indentation)는 (Tab) 키, 스페이스 바(space bar) 두 번 또는 네 번으로 한다. 운영 체제편집기마다 탭 키의 간격이 다르기 때문에 동일한 스페이스 바를 사용해서 들여쓰기를 하는 게 낫다. 또한 파이썬 코딩 스타일 가이드(PEP 8)에서는 공백 4칸으로 규정하고 있으므로 스페이스 바 네 번으로 들여쓰기를 해주자.

윈도우즈에서 으로 들여쓰기해서 만든 소스 코드리눅스에서 편집하면 깊은 빡침을 느낄 수 있다. 똑같은 탭인데 리눅스에서 새로 작성한 부분이랑 기존에 윈도우즈에서 작성된 부분이 줄이 안 맞기 때문이다. 삐뚤빼뚤해서 코드가 헷갈려서 결국 전부 다 스페이스 바로 바꿔줄 수 밖에 없게 된다.


주석

파이썬에서 사람만 알아볼 수 있도록 작성하는 부분을 주석(comment)이라고 합니다. 즉, 주석은 파이썬 인터프리터가 처리하지 않으므로 프로그램의 실행에는 영향을 주지 않습니다. 보통 주석은 코드에 대한 자세한 설명을 작성하거나, 특정 코드를 임시로 사용하지 않도록 만들 때 사용합니다.


주석은 한 줄 주석과 범위 주석 두 가지가 있는데 다음은 한 줄 주석으로 코드에 대한 설명을 작성한 모습입니다.

# Hello, world! 출력


코드 맨 앞에 #을 사용하면 해당 줄은 모두 주석이 됩니다. 따라서 다음 print 함수는 동작하지 않습니다.

#print('Hello, world!')


코드를 뒤에 #으로 주석을 작성할 수도 있습니다. 이때 앞에 있는 코드만 정상적으로 동작하며 # 뒤에 있는 코드는 동작하지 않습니다.

a = 1 + 2 # 더하기
print('Hello, world!') #printf('1234567890')


파이썬에서 여러 줄을 주석 처리할 때는 ' 또는 " 3개를 붙여서 쓰세요.

'''
i am comment!
multiline!!!!
'''


아래는 주석 사용 예시입니다.

#!/usr/bin/python
# -*- coding: cp949 -*-
# 이렇게 앞에 샤프(#) 기호가 있으면 주석문입니다.
print "안녕하세요"    # 각 행 뒤에 주석 기호를 붙일 수도 있음
print 1 + 1           # 출력 결과: 2
"""
여기는 도큐멘트 스트링인데, 블록 코멘트로 사용할 수 있고
이렇게, 큰따옴표 3개 사이에 아무 문장이나 쓸 수 있습니다.
다만, 각 들여쓰기 레벨에 맞아야 합니다.
"""
def example2(x, y):
    z = x + y
    """
    블록 코멘트
    블록 코멘트
    블록 코멘트
    """
    return z
print example2(2, 3)


그리고 소스에서

#!/usr/bin/python
# -*- coding: cp949 -*-

이런 부분은 주석이 아니고 특수한 의미를 가지고 있는 행입니다.


소스 코드 문자 인코딩

파이썬 2까지는 소스 코드의 기본 문자 인코딩(encoding)이 아스키(ASCII)라 # -*- coding: cp949 -*-와 같은 식으로 인코딩을 명시해주지 않으면 한글이 깨졌다. 아스키는 영어 알파벳, 숫자, 키보드에 있는 특수문자만 지원하기 때문이다. 그러나 파이썬 3부터는 기본 인코딩이 유니코드(UTF-8)라 이런 걸 써주지 않아도 한글이 깨지지 않는다.

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


터미널에서 실행하는 소스 코드

Sublime Text 등 파이썬 소스 코드 편집기를 아무거나 열어서 다음 소스 코드들을 입력한 후 실행시켜 보자.

만약 소스 코드 파일의 이름이 bozy.py인 경우 리눅스터미널에서 bozy.py 파일이 있는 디렉터리로 이동한 후

python3 bozy.py

python bozy.py

라고 입력하면 실행된다. 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이라는 명령어만으로 파이썬을 실행할 수 있다. "시작 → 모든 프로그램 → 보조 프로그램 → 명령 프롬프트" 또는 "시작 → 실행 → 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

와 같은 식으로 실행해야 한다. 만약 설치 경로가 C:\Users\username\AppData\Local\Programs\Python\Python36-32와 같을 경우 해당 경로로 이동해야 한다. 참고로 해당 디렉터리 내의 폴더파일 목록을 보는 명령어는 dir이다. dir에 해당하는 리눅스 명령어는 ls이다. 상위 디렉터리로 가는 명령어는 리눅스윈도우즈나 모두

cd ..

이다.


  • [Python] 윈도우에서 파이썬을 설치하고 실행해보자.

http://selfc.tistory.com/27


반복 실행

for문

for i in range(3):
    print("로리로리해!")
    print("중딩도 맛있어")
    print("상하기 직전이지만 고딩도 먹을 수는 있지")
    print("대학생 이상은 할망구라구!")

0~2 범위에서 for문을 반복한다. range 안의 숫자는 0부터 n-1까지이다. 왜 0부터냐하면은 C 언어를 비롯하여 컴퓨터에서는 일반적으로 0부터 숫자를 세기 때문이다.

while문

i=1
while i<=7:
    print(i)
    i=i+1
print("Finished!")

그리고 이름은 대충 test.py로 하고, 저장한다. i=1은 i의 초기 값이 1이라는 의미이다. while i<=7:은 i가 7이 될 때까지 반복하라는 의미이다. <=는 작거나 같다는 의미이고, >=는 크거나 같다는 의미이다. i=i+1은 원래 있던 i 값에 1을 더하여 i 값을 1 늘려주라는 의미이다.

그리고 터미널에서 test.py가 있는 디렉터리로 이동 후

python3 test.py

라고 치면 아래와 같은 결과가 뜬다.

1
2
3
4
5
6
7
Finished!

조건문

if문

이제 아래와 같이 지에디트에 적고 test2.py라는 이름으로 저장해보자.

i=0
while True:
    i=i+1
    if i==3:
        print("Skipping 3")
        continue
    if i==7:
        print("Breaking")
        break
    print(i)
print("Finished")

while True:는 while문을 계속 반복하라는 의미이다. True 대신에 1을 써도 된다. 반대로 while False:나 while 0:을 쓰면 while문이 바로 종료되면서 Fihished만 출력되고 끝난다. 하지만 되도록이면 1이나 0 대신에 True와 False를 쓰는 게 좋다. if i==3:은 만약 i가 3이라면 if문을 실행하라는 의미이다. ==는 같다는 의미이다. 프로그래밍에서 =는 같다는 의미가 아니라, 변수를 선언하는 의미이다. 즉, i=0은 i라는 변수에 0을 넣으라는 의미고, i=i+3은 이전의 i 값에 3을 더한 값을 새로운 i 값으로 한다는 의미이다. continue는 if문을 계속 하라는 의미이고, break는 if문을 끝내라는 의미이다.

그리고 터미널에서

python3 test2.py

를 입력하면

1
2
Skipping 3
4
5
6
Breaking
Finished

라고 뜰 것이다.

if, else문

x = int(input("나이를 입력해: "))
if x<=13:
    print("로리로리해!")
else:
    print("중학생 이상은 할망구지!")

x가 13보다 작거가 같을 때는 "로리로리해!"를 출력하고, 그게 아닐 경우에는 "중학생 이상은 할망구지!"를 출력한다. input은 키보드 입력을 받으라는 소리이고, int는 정수값으로 입력을 받으라는 소리이다. 정수, 실수, 문자열 등 여러가지 종류의 입력을 받을 수 있으며 int나 float을 적어놓지 않고

x = input("나이를 입력해: ")

와 같이 적어놓으면 숫자를 적어놓아도 숫자가 아닌 문자열로 입력을 받는다.

정수 int, 실수 float

여기서 int는 괄호 안에 있는 값을 정수로 변환하며 문자열이든 실수든 상관없이 정수로 변환합니다. 물론 문자열의 내용이 숫자(10진 정수)가 아니라면 변환이 되지 않고 에러가 발생합니다. 이점 주의해주세요. int('10')은 10으로, int(3.5)는 3으로 입력을 받지만 int('hello')는 에러가 뜬다.

그럼 실수의 덧셈도 계산할 수 있겠죠? input으로 입력받은 값을 실수로 변환하려면 float로 묶어줍니다.

a = float(input('첫 번째 숫자를 입력하세요: '))    # float를 사용하여 입력 값을 실수로 변환
b = float(input('두 번째 숫자를 입력하세요: '))    # float를 사용하여 입력 값을 실수로 변환
 
print(a + b)

1.2 + 1.5의 결과로 2.7이 나왔습니다. 만약 float를 사용하지 않으면 문자열 '1.2'와 '1.5'가 연결되어 '1.21.5'가 됩니다.

float는 괄호 안에 있는 값을 실수로 변환하며 문자열이든 정수든 상관없이 실수로 변환합니다. 물론 문자열의 내용이 숫자(10진 정수, 실수)가 아니라면 변환이 되지 않고 에러가 발생합니다. 이점 주의해주세요. float('3.5')는 3.5이고, float(10)은 10.0이지만 float('hello')는 오류가 뜬다.

elif 사용

x = int(input("나이를 입력해: "))
if x<=13:
    print("로리로리해!")
elif 13<x<=16:
    print("중딩도 맛있어")
elif 16<x and x<=19:
    print("상하기 직전이지만 고딩도 먹을 수는 있지")
else:
    print("대학생 이상은 할망구라구!")

elif(else if)를 사용하여 조건이 여러개인 조건문을 만들 수 있다.

break로 반복문 끝내기

i = 0
while True:    # 무한 루프
    i += 1     # i를 1씩 증가시킴
    print(i)
    if i == 10:    # i가 10일 때
        break       # 반복문을 끝냄. while의 제어흐름을 벗어남

while문에서 break 사용

for i in range(0, 10000):    # 0부터 9999까지 반복
    print(i)
    if i == 13:    # i가 13일 때
        break       # 반복문을 끝냄. for의 제어흐름을 벗어남

for문에서 break 사용

continue로 코드 실행 건너뛰기

이번에는 continue를 사용하여 일부 코드를 실행하지 않고 건너뛰어 보겠습니다. 다음은 1부터 100까지 숫자 중 짝수만 출력합니다.

for i in range(1, 101):    # 1부터 100까지 증가하면서 100번 반복
    if i % 2 != 0:         # i를 2로 나누었을 때 나머지가 0이 아니면 홀수
        continue           # 홀수일 경우 아래 코드를 실행하지 않고 건너뜀
    print(i)

%는 나누라는 소리이고, ==는 같다는 의미, !=는 같지 않다는 의미이다. A=B는 A에 B를 대입하라는 소리이다.

삼각형 그리기

print('\n'.join(('*'*(2*y-1) for y in range(1,20))))

1부터 N까지 출력

for x in range(int(input("n을 입력해 주십시오: "))):
    print(x+1)

또는

_ = list(print(x+1) for x in range(int(input("n을 입력해 주십시오: "))))

구구단

_ = 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))


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이라는 결과가 출력되는 것을 볼 수 있습니다.

이처럼 함수는 '입력값 -> 함수의 코드 -> 결과값' 으로 이루어져 있습니다.


하지만 입력값이나 결과값은 반드시 있어야 하는 것은 아닙니다!

아래 세 개의 예시 코드를 보면서 설명해 보겠습니다.


  1. 입력값이 없는 경우

def returnHi():
  return 'Hi!'


  1. 결과값이 없는 경우

def sayHi(signal):
  if(signal == 1):
    print "Hi!"
  else:
    print "Bye!"


  1. 입력값과 결과값이 둘 다 없는 경우

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개의 맥주병을 하나씩 꺼내면서 수가 줄어드는 걸 노래하고 있다.

start = 99
def bottles(i, leading):
    if i < 0:
        i = start
    _n = "N" if leading else "n"
    _s = "s" if i != 1 else ""
    _i = str(i) if i != 0 else _n + "o more"
    return _i + " bottle" + _s
take_or_buy = lambda i: "Go to the store and buy some more" if i == 0 else "Take one down and pass it around"
for i in range(start, -1, -1):
    print(bottles(i, True) + " of beer on the wall, " + bottles(i, False) + " of beer.")
    print(take_or_buy(i) + ", " + bottles(i - 1, False) + " of beer on the wall.")
    print("")


함수에서 재귀 호출 사용하기

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

이번에는 재귀호출을 사용하는 방법과 주의점을 알아보겠습니다. 참고로 재귀호출은 코드가 간단한 편이지만 머릿속으로 생각을 많이 해야 됩니다. 그래서 초보자들은 한 번에 이해가 되지 않을 수 있습니다.

먼저 간단한 재귀호출 함수를 만들어보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

def hello():
    print('Hello, world!')
    hello()
 
hello()

hello 함수 안에서 다시 hello 함수를 호출하고 있습니다. 소스 코드를 실행해보면 'Hello, world!' 문자열이 계속 출력되다가 에러가 발생합니다. 왜냐하면 파이썬에서는 함수 호출 스택의 깊이 제한이 1,000으로 정해져 있어서 그렇습니다. 즉, hello 함수가 자기자신을 계속 호출하다가 스택이 넘쳐서 스택 오버플로우(stack overflow)가 발생합니다.

재귀호출을 사용하려면 반드시 다음과 같이 종료 조건을 만들어주어야 합니다.

def hello(count):
    if count == 0:    # 종료 조건을 만듦. count가 0이면 다시 hello 함수를 호출하지 않고 끝냄
        return
    
    print('Hello, world!', count)
    
    count -= 1      # count를 1 감소시킨 뒤
    hello(count)    # 다시 hello에 넣음
 
hello(5)    # hello 함수 호출

먼저 hello 함수의 반복 횟수를 계산하기 위해 매개변수 count를 지정합니다. 그리고 count가 0이면 hello 함수를 호출하지 않고 끝냅니다. 만약 0이 아니면 'Hello, world!'를 출력하고, count의 값을 1씩 감소시킨 뒤 hello 함수를 호출할 때 넣어줍니다.

이제 hello 함수를 호출할 때 반복할 횟수를 넣어줍니다. 이렇게 하면 hello 함수가 재귀호출을 할 때마다 count에 들어있는 값이 1씩 감소하고, 0이 되면 재귀호출을 끝냅니다.

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


재귀 호출로 팩토리얼 구하기

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

x = int(input('팩토리얼 계산할 숫자를 넣으세요: '))

def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x - 1)

print(factorial(x))

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이 나온다.

클래스

초보 개발자들에게 클래스(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__ == "__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 파일이 실행되지 않도록 하는 것이다.

http://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인지, 버전에 신경 쓸 필요 없다.


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

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


리눅스에서 pyautogui를 설치할 경우 리눅스는 최신 버전 파이썬이라도 pip가 내장되어 있지 않으므로 터미널에서

sudo apt update

해서 apt 저장소 목록을 최신으로 업데이트하고

sudo apt install python-pip

해서 apt에서 python-pip를 설치한다.


그리고

pip3 install --upgrade pip

로 pip를 업그레이드 한다.

sudo pip3 install setuptools
sudo pip3 install python3-xlib

해서 pyautogui 설치에 필요한 패키지들을 설치한다.

sudo pip3 install pyautogui

로 pyautogui를 설치한다. sudo를 쓴 명령어들은 sudo를 쓰지 않으면 root 권한이 없어 설치가 되지 않고, pip3라고 된 부분을 pip라고 입력하면 파이썬 2.7용 패키지가 설치된다.


마우스 자동 클릭 스크맆트

대학교 수강 신청할 때 쓰면 좋다. 단, 스크맆트 프로그램으로 너무 짧은 시간 간격으로 수많은 클릭 요청을 보내서 수강 신청하다 학교 수강 신청 웹 싸이트 접속 자체가 차단될 수 있으니 주의하기 바란다.


리눅스의 경우 일단 터미널에서

python3

를 입력하여 대화형 인터프리터를 불러온다. 그리고

import pyautogui
pyautogui.moveTo(230, 140)

를 입력하고 () 안의 x 좌표와 y 좌표의 숫자를 적당히 바꿔가면서 모니터 안에서의 적당한 위치를 찾는다. 맨 왼쪽 위가 (0, 0)이다. 숫자는 픽셀(pixel) 단위이다.

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

pyautogui.moveRel()는 "상대 좌표"로 이동하는 것으로 괄호 안에 마이너스를 입력하면 -x 방향(왼쪽)과 -y 방향(위)으로 움직인다. 화면 끝까지 가면 거기서 더 가지 않고 그 자리에서 다음 명령을 수행한다.

그리고

import time, pyautogui

time.sleep(2)
pyautogui.moveTo(230, 140)

for i in range(8):
    pyautogui.click()
    pyautogui.moveRel(100, 40)
    time.sleep(1.5)

라는 프로그램을 만들어서 실행시켜본다. 그러면 프로그램 실행 후 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을 집어넣고 실행하라는 의미이다.


이 외에도 더블클릭을 하거나 키보드를 누르거나 스크린샷을 찍는 등 다양한 동작을 시킬 수 있다.


키보드 자동 입력 스크맆트

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')

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

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

pyautogui.press('f3')
time.sleep(2.4)
pyautogui.press('esc')


PyAutoGUI 사용 방법 짧게 설명 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


PyAutoGUI 사용 방법 전체 설명 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


라이브러리

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

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


인터넷상 Python으로 보급되는 package는 타 어느 스크립트 언어와도 비교가 안될 만큼 다양하다. 당신이 하려는 것이 무엇이든, 무슨 언어를 써야 할지 모르겠으면 Python을 쓰면 된다. Python으로 직접 만들었던지, 다른 프로그램의 wrapper가 꼭 존재한다. 못하는 것이 없다. PyPI 또는 구글 검색을 해보면 안다.

웹 사이트 서버를 구현하려고 하면 python web framework를 쳐보자(Django).

기계 학습 알고리즘을 쓰고 쉽다면 python machine learning 이라 검색하자(scikit-learn).

얼굴 인식을 코드 몇줄로 할 수도 있다(OpenCV).

게임도 만들 수 있다(PyGame). ~~Python make girlfriend도 된다 카더라.~~


05-6 외장 함수 - 점프 투 파이썬 https://wikidocs.net/33


(shell)은 라이브러리는 아니지만 파이썬 프로그래밍에서 매우 편리하게 쓸 수 있다. 하위 프로세스에서 외부 프로그램을 호출하고, 그 결과값을 파이썬 프로그램으로 반환하는 용도로 쓸 수 있다. 만약 호출 프로그램이 네이티브 파이썬 함수에도 마찬 가지의 기능이다. 모든 포직스(POSIX) 호환 시스템에서 (Sh)은 최고의 선물이다. 이러한 플랫폼에서 제공되는 모든 명령 줄 프로그램을 파이썬 방식으로 사용할 수 있게 해준다. 더 이상 쓸데없는 작업으로 시간을 낭비할 필요도 없고(OS에 이미 있는 ping을 다시 구현할 필요는 없다), 그 기능을 애플리케이션에 추가 하는 방식에 대해 고민할 필요도 없다. 다만 주의 사항은 이 라이브러리를 통해 전달되는 매개 변수는 정제되지 않는다는 점이다. 따라서 사용자 입력을 그대로 전달하지 않도록 해야 한다.


수학, 통계학, 과학, 공학, 빅 데이터

수학, 통계학, 과학, 공학, 빅 데이터 프로세싱 등에 쓰이는 라이브러리들 목록이다.

팬더즈(pandas)

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


팬더즈를 수학, 통계학, 빅 데이터, 과학, 공학 계산 등에 쓰는 방법은 팬더즈 문서 참조.


넘파이(NumPy)

넘파이(NumPy)의 용도는 통계, 선형 대수, 행렬 계산, 금융 운용 등을 포함한 과학 계산과 수학 작업이다.

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

NumPy( http://www.numpy.org/ )는 파이썬으로 과학 계산을 하려면 꼭 필요한 패키지입니다. 다차원 배열을 위한 기능과 선형대수 연산과 푸리에 변환 같은 고수준 수학 함수와 유사(pseudo) 난수 생성기를 포함합니다.


맽플랕립(matplotlib)

맽플랕립(matplotlib, https://matplotlib.org/ )은 파이썬의 대표적인 과학 계산용 그래프 라이브러리입니다. 선 그래프, 히스토그램, 산점도 등을 지원하며 출판에 쓸 수 있을 만큼의 고품질 그래프를 그려줍니다. 데이터와 분석 결과를 다양한 관점에서 시각화해보면 매우 중요한 통찰을 얻을 수 있습니다. 이 책의 모든 그래프는 matplotlib을 사용했습니다. 주피터 노트북에서 사용할 때는 %matplotlib notebook이나 %matplotlib inline 명령을 사용하면 브라우저에서 바로 이미지를 볼 수 있습니다. 대화식 환경을 제공하는 %matplotlib notebook 명령을 권장합니다(하지만 이 책에서는 %matplotlib inline을 사용합니다).


싸이파이(SciPy)

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

기계 학습

싸이킽-런(scikit-learn)

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

scikit-learn은 두 개의 다른 파이썬 패키지인 NumPy(넘파이)와 SciPy(싸이파이)를 사용합니다. 그래프를 그리려면 matplotlib(맷플롯립)을, 대화식으로 개발하려면 IPython(아이파이썬)과 Jupyter Notebook(주피터 노트북)도 설치해야 합니다.

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


scikit-learn에서 NumPy 배열은 기본 데이터 구조입니다. scikit-learn은 NumPy 배열 형태의 데이터를 입력으로 받습니다. 그래서 우리가 사용할 데이터는 모두 NumPy 배열로 변환되어야 합니다. NumPy의 핵심 기능은 다차원(n-차원) 배열인 ndarray 클래스입니다. 이 배열의 모든 원소는 동일한 데이터 타입이어야 합니다.


텐서플로우(TensorFlow)

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

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


아래 링크 참조


케라스(Keras)

케라스(Keras)는 TensorFlow, Theano, CNTK 등 딥 러닝 라이브러리를 포함하고 있어 쉽게 다층 퍼셉트론 신경망 모델, 컨볼루션 신경 망 모델, 순환 신경망 모델, 조합 모델 등을 구성할 수 있다.


기타 라이브러리

뷰티펄 숲(Beautiful Soup)

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

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


뷰티펄 숲을 사용하여 웹 싸이트의 HTML 문서들 중 자신이 원하는 부분만 긁어오는 방법은 뷰티펄 숲 문서 참조.


필로우(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) 하나면 다 되는 것과 비슷하다.


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


웹 프레임워크 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 커널과 macOSiOS의 기반이 되는 다윈XNU 커널이 있다.


파이게임(Pygame)

Pygame으로 게임(game)을 만드는 방법은 파이게임 문서 참조.


Cocos2d

Cocos2d란 2D 게임, 데모, 기타 시각적인/인터랙티브한 애플리케이션을 제작할 때 쓰이는 프레임워크입니다. Cocos2d 관련 추가 정보는 아래 링크에서 확인하실 수 있습니다.

http://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


멀티쓰레딩 문제

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


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

단, CPU 부하가 큰 작업을 돌리는 것이 아니면 GIL을 체감하기는 생각보다 쉽지 않다. 다중 쓰레딩으로 CPU의 여러 코어를 최대한 이용하고 싶은 경우에는 GIL가 굉장히 아쉬운 이슈지만, CPU를 별로 쓰지않거나 I/O가 주가 되는 작업은 유의미한 성능 차이가 없다. 게다가 어설프게 코어 몇개 깔짝깔짝 이용해서 계산하는 것보다는 그냥 C언어로 모듈을 짜서 붙이는게 더 빠르다. 즉, python에서 CPU를 많이 먹는 부분은 C 모듈을 짜서 붙이고 필요하다면 multiprocessing 모듈을 이용하여 멀티코어를 활용하는 편. 그 이상의 CPU-heavy한 작업은 동적 인터프리팅 언어 쓰지 말고 처음부터 C, C++로 짜는게 맞다.


파이썬으로 멀티코어 프로그램 만들기

서버로 프로그래밍을 하다보면 sun grid engine을 사용하여 코어가 4개 이상인 pc cluster를 활용하곤 한다. 20개의 노드에 코어가 24개씩 있으면 job을 480개로 분할해서 하나씩 일을 주는 것이다. 개인용 pc에서는 이런 방법이 통하지 않으니 python의 multiprocessing을 사용해야한다.

파이썬에서는 thread와 multiprocessing이라는 두 가지 내부 모듈이 있는데, 처음에는 이 둘이 어떤 이유로 성능차이를 보이는지 알 수 없었지만 관련 책자들을 찾아보다 보니 그 차이와 활용시점에 대해서 기술되어 있었다.

thread는 CPU보다는 latency time이 있는 일에 효과적이고 multiprocessing은 CPU 의존적인 작업에 활용하는 것에 효과적이다.

따라서 thread를 4개를 쓴다고 해서 CPU 의존적인 작업의 처리에 속도향상이 나타나지 않는다. multiprocessing을 사용해야 다중 코어의 속도향상을 체험할 수 있다.

다중코어를 사용한다고 해서 속도가 선형적으로 증가하는 것은 아니다. 따라서 코어를 8개 동시에 쓰는 작업이 8배의 성능 향상을 가져오지는 못한다. 해당 코어의 효율을 대략적으로 나타낸 그래프는 다음과 같다.

https://philipwfowler.github.io/2015-01-13-oxford/intermediate/python/04-multiprocessing.html

파이썬에서 다중 코어를 쓰는 방법은.. 정말 간단하다.

import multiprocessing as mp

def work(job_list):
    return job_list + 1

p = mp.Pool(4)
p.map_async(work, job_list).get()

보통 이런 형태로 만들면 된다. 분할해야할 작업들은 list 안에 하나씩 넣으면 되고, map의 기능을 활용해서 함수에 리스트 요소들을 순차적으로 처리한다.

참고로 windows에서는 맨 아래 추가로 적어두어야 할 코드가 있다.

if __name__ == '__main__':
    mp.freeze_support()

이 한 줄의 넣지 않으면 에러가 나면서 작동되지 않는다. windows에서는 fork()라는 기능이 부족해서 이러한 기능을 사용한다고 해야하는데 자세한 내용은 아직 모른다. 정확하게 얘기하면 리눅스BSD유닉스 계열에는 fork 함수가 있고, 윈도우즈에는 없다.

multiprocessing를 사용하지 않았을 때와 multiprocessing을 사용했을 때 CPU 사용량에 확연한 차이가 있다. 속도는 보통 약 3배정도 차이가 난다. multiprocessing을 사용하지 않는다고 하더라도 CPU가 완전히 single로 작동하지는 않는 것 같다.

아무래도 multiprocessing 하나만 사용했을 때는 속도상의 이점이 크게 느껴지지 않을 수도 있다. numba, cython과 같은 라이브러리를 사용하면 속도가 약 20배 정도 빨라지므로 이 둘을 조합하면 파이썬으로도 만족할만한 성능이 나올 것이다.


  • 파이썬으로 시도해보는 멀티 코어 프로세싱, 자고 있는 코어들을 깨우기

https://blog.naver.com/ossiriand/220548193193


컴파일 + 링크 = 빌드

초창기의 컴퓨터기계어프로그래밍을 했다. 그러나 기계어는 사람이 이해하기 아주 어려워서, 이를 보다 편하게 사용하기 위해 이런 방법을 생각했다.

- 기계어의 집합을 더 간단하게 표현하는 텍스트 문서를 만든다. 예를 들어 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 - 멍멍멍 http://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_Freezepy 파일을 리눅스, 맥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


함께 보기