Difference between revisions of "파이썬"

Jump to navigation Jump to search
19,131 bytes added ,  02:04, 8 April 2018
no edit summary
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 모듈을 불러와서 사용할 수 있다.




234

edits

Navigation menu