파이썬(python) – 내장모듈 import, block 들여쓰기(indentation)

python 강의는 오랜만이네요.
강의할 것들이 많으니 한 종류의 강의를 자주자주하는 것이 때로는 조금 시간이 부족해서 힘드네요. ^^

오늘은 몇가지 잡다구리한 것을 배워보도록 하겠습니다. 하지만, 여러분이 꼭 알고 계셔야할 것들입니다.

(1) 모듈(module) import

프로그램 시작전에 "import 모듈이름"을 수행하면 해당 모듈이 제공하는 기능을 사용할 수 있습니다.
그리고, 그 모듈이 제공하는 기능이 무엇인지 List 를 보고 싶으면 dir 을 사용하면 됩니다.
그 기능에 대한 document 를 보고 싶으면 help 를 사용하면 됩니다.

dplee@dplee-VirtualBox:~$ python

Python 2.7.2+ (default, Oct  4 2011, 20:06:09) 

[GCC 4.6.1] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import sys  # sys 모듈을 포함시킴
>>> dir(sys)     # sys 모듈에 포함된 symbol list 를 모두 보여줌.

['__displayhook__', '__doc__', '__excepthook__', '__name__',
'__package__', '__stderr__', '__stdin__', '__stdout__',
'_clear_type_cache', '_current_frames', '_getframe', '_mercurial',
'api_version', 'argv', 'builtin_module_names', 'byteorder',
'call_tracing', 'callstats', 'copyright', 'displayhook',
'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type',
'excepthook', 'exec_prefix', 'executable', 'exit', 'flags',
'float_info', 'float_repr_style', 'getcheckinterval',
'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding',
'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof',
'gettrace', 'hexversion', 'long_info', 'maxint', 'maxsize',
'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks',
'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2',
'py3kwarning', 'pydebug', 'setcheckinterval', 'setdlopenflags',
'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin',
'stdout', 'subversion', 'version', 'version_info', 'warnoptions']

>>> help(sys)        # sys 모듈에 대한 설명을 보여주는 document
>>> help(sys.exit)  # sys 모듈에 포함된 exit 함수에 대한 document

다음과 같이 프로그램에서 사용할 수도 있습니다. sys 모듈의 argv 를 사용하는 예제입니다. c 나 c++ 프로그램에서 argument 를 사용해보셨다면 이해가 갈 것입니다.
프로그램 인자 중에서 프로그램 이름(argv[0]) 다음의 인자(argv[1])를 Hello 함수에 전달한 것입니다.

#!/usr/bin/python

import sys

# argument 를 별도로 선언할 필요도 없다.
def Hello(name):
  name = name + '!!!!!!'
  nprint 'Hello', name

def main():
  Hello(sys.argv[1])

if __name__ == '__main__':
  main()

sh> ./hello.py Alice

만약 import sys 를 주석처리(#)하면 "NameError: global name 'sys' is not defined" 라는 에러를 뱉어냅니다.
python 인터프리터를 실행하여 내장모듈인 sys 및 os 의 symbol 및 함수 list 들을 dir 로 확인해보시고 한번씩 수행해 보시기 바랍니다.

(2) python 들여쓰기

python 은 소괄호, 중괄호 등의 block 구분용 괄호들을 사용할 필요가 없습니다. 들여쓰기(indentation)가 그 역할을 대신합니다. if 문에서 사용하는 괄호도 사용할 필요가 없습니다.
다음의 소스를 보시죠.

#!/usr/bin/python

import sys

def Hello(name):
# or, and 를 이용
    if name == 'Alice' or name == 'Nick':
        print 'Alert : Alice Mode'
        name = name + '???'
    else:
        print 'Else'
    name = name + '!!!!!!'
    print 'Hello', name

def main():
    Hello(sys.argv[1])

if __name__ == '__main__':
    main()

Hello 함수를 보면 if else 구문이 같은 수준의 들여쓰기를 했고, if block 안의 내용들은 또 한번 들여쓰기가 되어 있는 것을 볼 수 있습니다. 그리고, if 구문에서는 name == 'Alice' 와 같이 괄호 없이 비교 구문만 넣으면 됩니다.

(3) Line by Line 실행되는 인터프리터

python 은 line by line 으로 즉석에서 실행해나가는 인터프리터입니다. c 나 c++, java 처럼 컴파일이라는 단계를 거치면서 구문의 오류 등을 점검하지 않습니다.
한 line 씩 바로 실행시키면서 그 때 구문 오류나 변수 오류 등을 점검합니다.
그렇다면, 다음의 코드를 실행하면 어떻게 될까요 ?

#!/usr/bin/python

import sys

def Hello(name):
    if name == 'Alice' or name == 'Nick':  # or, and 를 이용
        print 'Alert : Alice Mode'
        name = name + '???'
    else:
        NoDefFunc(name)      # 정의되지 않은 함수 사용
    name = name + '!!!!!!'
    print 'Hello', name

def main():
    Hello(sys.argv[1])

if __name__ == '__main__':
    main()

위의 소스를 c 나 c++ 처럼 컴파일을 한다면 아마 not defined 오류가 떨어질 것입니다. 하지만, python 은 다르죠. 아래 실행결과를 볼까요 ?

sh> ./hello.py Alice

Alert : Alice Mode
Hello Alice???!!!!!!

문제없이 실행되었군요. 프로그램 실행 시에 해당 라인이 수행이 되지만 않는다면 오류가 발생되지 않습니다. 재미있죠 ? ^^

다음 시간에는 가장 중요한 부분 중의 하나인 string 다루는 법에 대해서 공부해 보겠습니다.

You may also like...

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x