234
edits
Line 278: | Line 278: | ||
= 대화형 | = 대화형 인터프리터 = | ||
[시작] 메뉴에서 [프로그램 → 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 파일로 저장하면 한번에 여러 줄의 코드를 순차적으로 실행시키는 것이다. | 파이썬은 대화형 모드로도 쓸 수 있고, 소스 코드를 만들어서 사용할 수도 있다. 대화형은 한 번에 한 줄씩 입력하면서 바로 바로 실행하는 것이고, 편집기에 소스 코드를 적어 py 파일로 저장하면 한번에 여러 줄의 코드를 순차적으로 실행시키는 것이다. | ||
Line 317: | Line 333: | ||
위와 같이 대화형 모드에서도 if문과 else문도 사용 가능하고, 여러 줄의 코드도 실행할 수 있다. | 위와 같이 대화형 모드에서도 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 555: | Line 631: | ||
자세한 소스 코드는 [[트킨터]](Tkinter) 문서 참조. | 자세한 소스 코드는 [[트킨터]](Tkinter) 문서 참조. | ||
= 실행 가능한 파이썬 스크맆트 = | = 실행 가능한 파이썬 스크맆트 = | ||
Line 581: | Line 658: | ||
https://python.flowdas.com/tutorial/appendix.html#executable-python-scripts | https://python.flowdas.com/tutorial/appendix.html#executable-python-scripts | ||
= 모듈 = | |||
[[모듈]]([[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 파일의 마지막 부분을 위와 같이 고친 다음에는 아무런 결과값도 출력되지 않는 것을 볼 수 있다. | |||
=== _가 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 모듈을 불러와서 사용할 수 있다. | |||
edits