오경석의 개발노트

Python_개념 및 특징 본문

프로그래밍 언어/Python

Python_개념 및 특징

OHSAYU 2022. 10. 25. 13:45

파이썬 개념

    파이썬(Python)은 1991년 네덜란드계 프로그래머인 귀도 반 로섬이 발표함 고급 프로그래밍 언어로, 플랫폼에 독립적이며 인터프리터식, 객체지향적, 동적 타이핑(dynamic typed) 대화형 언어이다.

    파이썬이라는 이름은 귀도가 좋아하는 코미디인<Monty Python's Flying Cirus>에서 따온 것이다. 이름에서 고대 신화에 나오는 커다란 뱀을 연상하는 경우도 있겠지만, 이와는 무관하다. 다만 로고에는 뱀 두 마리가 형상화되어 있다.

    파이썬은 초보자부터 전문가까지 사용자층을 보유하고 있다. 동적 타이핑(dynamic typing) 범용 프로그래밍 언어로, 펄 및 루비와 자주 비교된다. 다양한 플랫폼에서 쓸 수 있고, 라이브러리(모듈)가 풍부하며, 대학을 비롯한 여러 교육 기관, 연구 기관 및 산업계에서 이용이 증가하고 있다. 또 파이썬은 순수한 프로그램 언어로서의 기능 외에도 다른 언어로 쓰인 모듈들을 연결하는 접착제 언어로써 자주 이용된다. 실제 파이썬은 많은 상용 응용 프로그램에서 스크립트 언어로 채용되고 있다. 도움말 문서도 정리가 잘 되어 있으며, 유니코드 문자열을 지원해서 다양한 언어의 문자 처리에도 능하다. 파이썬은 기본적으로 해석기(인터프리터) 위에서 실행될 것을 염두에 두고 설계되었다.

 

장점 : 빠른 개발속도

    Python은 C++, Java와 함께 구글의 3대 개발 언어 중 하나이다. 파이썬의 아이덴티티는 높은 생산성이다. 프로그래밍 언어 중에서 파이썬 정도의 낮은 난이도를 가지면서, 범용성을 갖추고, 파이썬 수준의 프로그램 개발 속도를 따라잡을 수 있는 언어가 없다. 파이썬으로 만든 프로그램들을 같은 객체 지향 프로그래밍 언어인 Java나 C++로 만들려는 순간 숨이 턱 막힐 정도. 이런 언어들을 사용하려면 설계부터 난감해진다.

    인터프리터 언어이면서 우수한 자료형과 다양한 모듈 등을 제공해 개발 기간이 단축되는 것이 특징이다. 'C언어로 2년 동안 완성하지 못한 프로젝트를 파이썬으로 한 달 만에 해냈다'는 극적인 경험담이 있을 정도다. 당장 파이썬의 집합 자료형 같은 경우 C언어로 구현하려고 하면 머리가 아파 온다. C언어와의 접착성도 좋기 때문에, 일단 파이썬으로 빨리 구현하고, 남은 시간에 속도에 병목이 되는 부분을 C++로 전환하는 전력을 내세우고 있다.

 

    버전이 올라가면서 파이썬 자체도 그리 느리지 않게 되었다. 심지어 어셈블리어 같은 저수준 언어(Low level)도 파이썬에서 호출할 수 있다. 파이썬은 어지간한 다른 프로그래밍 언어들을 지원하는 호환성 덕분에 응용할 곳이 무궁무진하다. 

    개발 속도가 빠른 데에는 친절한 Traceback도 한몫한다. 코드를 실수로 잘못 짠 곳이 있다면, 어떤 스택을 통해 어떤 어떤 파일의 어떤 줄에서 어떤 함수에서 어떤 종류의 문제가 발생했는지 아주 자세하게 알려준다. 스택을 전부 보여주기 때문에 초보자에게는 당황스러울 수 있지만, 디버깅을 하다 보면 정말 편리하다. 아래는 오류(Exception) 발생 시의 터미널 출력 예시다.

Traceback (most recent call last):
  File "/path/to/example.py", line 4, in <module>
    greet('Chad')
  File "/path/to/example.py", line 2, in greet
    print('Hello, ' + someon)
NameError: name 'someon' is not defined

    빠른 아이디어 구현이 생명인 연구소에서 각광을 받고 있고, 인스타그램, 유튜브, reddit 등이 파이썬을 주로 쓰고 있다고 알려져 있으며, 외국의 구인 사이트에도 파이썬을 할 줄 아는 사람에 대한 수요가 많다. 하지만 구글만 해도 C++, Java, Python을 골고루 섞어서 쓴다고 알려져 있으며, 게임도 메인은 C++로 작성되었지만 스크립팅은 파이썬이나 Lua로 된 경우를 매우 쉽게 찾아볼 수 있다.

    따라서 필요하다면 프로그래밍 언어를 가리지 않고 매우 능숙하게 사용할 수 있도록 공부해야 하며, 알고리즘, 디자인 패턴, 테스트 기법, 동시성 프로그래밍(멀티스레드, 멀티프로세스)등의 필요한 지식을 훤하게 꿰고 있어야 제대로 된 프로그래머/개발자가 될 수 있다.

 

단점 : 느린 실행 속도

    우선 기본적으로 가장 아쉬운 점은 속도이다. 한 논문에 따르면, CLGB에서 제시한 10개의 벤치마킹을 돌려본 결과 파이썬은 C에 비해 71.90배의 시간, 2.80배의 메모리, 75.88배의 에너지를 더 소모한다고 한다.

    느린 속도를 보완하기 위해서 보통 여러 가지 방법이 동원된다. 기본적으로는 파이썬 내장 모듈을 사용해서 멀티쓰레딩이나 멀티프로세싱을 구현한다. Scipy나 Numpy와 같은 모듈의 고속 계산 함수를 꺼내 쓰기도 한다. 더 나아가서는 속도가 빠른 C와 같은 언어를 래핑(Wrapping)하여 작성하기도 한다.

    전문적으로 개발할 때는 외부 패키지에 의존하지 않고 직접 작성한 코드에서 고속화를 하기 위해 자연스럽게 더 높은 난도의 언어를 혼합해서 사용하게 된다. 이 경우 파이썬은 논리적은 부분을 담당하고, 래핑된 다른 언어는 반복 연산을 담당하게 된다. 대표적인 예시로 Numba나 Cython 같은 제3자 솔루션을 적용하기도 하며, 은히 인공지능 용도로 사용되는 Python 라이브러리인 TensorFlow는 C++로 작성되었다. Python을 이용하면 TensorFlow를 '사용'만 할 수 있을 뿐이다. TensorFlow의 로직 자체를 수정 및 커스텀하기 위해선 반드시 C++ 코드에 손을 대야 한다.

    이처럼 파이썬은 다른 언어에 비해 많이 느리기 때문에 프로그래밍 대회서 시간제한 때문에 어려움을 겪기도 한다. 시스템을 건드리거나 반복 연산이 많은 것은 하기 어렵지만 python num처럼 따로 모듈을 지원하기 때문에 크게 걱정할 필요는 없다.

    하지만 python num을 사용해도 느린 건 느린 거다. 파이썬에서는 이런 단점을 막기 위해 다른 언어도 쓸 수 있도록 만들었다. 예시로 numpy 모듈은 파이썬의 수학 모듈이지만 많은 횟수의 반복이 필요한 부분을 C로 만들었다.

 

    일반적으로 기계어로 컴파일하여 사용하는 C, C++ 보다는 당연히 느리고, Lua, JavaScript, LSIP 계열 언어 등 동적 언어들을 전체를 주욱 놓고 비교해봐도 속도가 빠른 편은 아니다. 파이썬처럼 가상 머신 위에서 실행되는 Java, JavaScript 등의 언어들의 경우, 속도 문제를 극복하기 위해서 JIT 컴파일러를 도입했다. 파이썬의 사실상의 표준 구현체인 CPython은 JIT 컴파일을 도입하지 않았고, JIT 컴파일을 도입한 별도의 구현체인 PyPy가 등장했다. 통계 분야 등 특정 분야에서는 R과 같이 그 분야에 특화된 언어를 사용하는 것이 더 편리할 수도 있다.

    한편 파이썬 언어 자체를 관리하는 사람들도 느린 실행 속도라는 단점은 인식하고 있고 속도를 개선하려고는 하는 중이다. 파이썬 창시자 귀도 반 로섬은 2021년 파이썬 회담(Python Language Summit)에서 버전 3.11에서는 속도를 2배 향상하고, 향후 4년간은 속도를 5배 향상하는 것이 목표라고 말했다. 실제로 2022년에 발표된 파이썬 3.11 버전에서는 상당한 속도 개선이 이루어진 것으로 보인다. 문제는 그래도 다른 언어랑 비교하면 여전히 느리기는 하기 때문에, 미래에도 계속 속도 개선이 지속적으로 이루어져야 할 것으로 보인다.

 

주요 특징

 - 동적 타이핑(dynamic typing). (실행 시간에 자료형을 검사한다.)

 - 객체의 멤버에 무제한으로 접근할 수 있다. (속성이나 전용의 메서드 훅을 만들어 제한할 수는 있음.)

 - 모듈, 클래스, 객체와 같은 언어의 요소가 내부에서 접근할 수 있고, 리플렉션을 이용한 기술을 쓸 수 있다.

 

해석 프로그램의 종류

 - Cython : C로 작성된 인터프리터.

 - 스택리스 파이썬 : C 스택을 사용하지 않는 인터프리터.

 - 자이썬 : 자바 가상 머신용 인터프리터. 과거에는 제이파이썬(JPython)이라고 불렸다.

 - IronPython : .NET 플랫폼용 인터프리터.

 - PyPy : 파이썬으로 작성된 파이썬 인터프리터.

 

기능과 철학

파이썬은 다양한 프로그래밍 패러다임을 지원하는 언어이다. 객체 지향 프로그래밍과 구조적 프로그래밍을 완벽하게 지원하며 함수형 프로그래밍, 관점 지향 프로그래밍 등도 주요 기능에서 지원된다.

 

파이썬의 핵심 철학

 - "아름다운 게 추한 것보다 낫다." (Beautiful is better than ugly.)

 - "명시적인 것이 암시적인 것보다 낫다." (Explicit is better than implicit.)

 - "간결한 것이 복잡함보다 낫다." (Simple is better than complex.)

 - "복합적인 것이 복잡한 것보다 낫다." (Complex is better than complicated.)

 - "수평적인 것이 내포된 것보다 낫다." (Flat is better than nested.)

 - "여유로운 것이 밀집한 것보다 낫다." (Sparse is better than dense.)

 - "가독성은 중요하다." (Readability counts.)

 

문법

파이썬의 문법에서 가장 잘 알려진 특징은 들여 쓰기를 이용한 블록 구조를 들 수 있다. 이것은 보통 C 등에서 쓰이는 괄호를 이용한 블록 구조를 대신한 것으로 줄마다 처음 오는 공백으로 눈에 보이는 블록 구조가 논리적인 제어 구조와 일치하게 하는 방식이다. 아래는 C와 파이썬으로 재귀 호출을 사용한 계승을 계산하는 함수를 정의한 것이다.

 

문법 규칙

 - 한 줄은 79글자로 제한하기

 - import는 파일의 맨 위에 적고 내장 모듈, 제3자 모듈, 직접 만든 모듈 순서로 불러들이기

 - 인스턴스 메서드의 첫 인자는 self로 쓰고, 클래스 메서드의 첫 인자는 cls로 쓰기

 - 할당 연산자(=)의 앞뒤로 공백 넣기

 

파이썬의 문법이 PEP 8을 지키는지 확인해 주는 파이썬 패키지도 있는데, Pylint와 Flake8이 대표적이다. 코드 스타일을 자동으로 권장 사항에 맞추어 수정해 주는 파이썬 패키지도 있는데, Black이 대표적이다. PyCharm이나 Visual Studio Code 편집기를 사용할 경우에는 저 패키지들을 GUI를 통해 편리하게 사용할 수 있다.

 

파이썬

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

 

들여 쓰기가 잘 된 C

int factorial(int x) {
    if(x == 0)     {
        return 1;
    }    else      {
        return x * factorial(x - 1);
    }
}

이렇게 비교해 보면 파이썬과 정리되어 들여 쓰기가 된 C 언어와는 차이가 거의 없어 보인다. 그러나 여기서 중요한 것은 위쪽의 C 형식은 가능한 여러 스타일 가운데 하나일 뿐이라는 사실이다. 즉, C로는 똑같은 구문을 다음과 같이 쓸 수도 있다.

 

읽기 어렵게 쓰인 C

int factorial(int x) {
 if(x == 0) {return 1;} else
  {return x * factorial(x - 1); } }

    파이썬으로는 이렇게 쓰는 것을 허용하지 않는다. 파이썬에서 들여 쓰기는 한 가지 스타일이 아니라 필수적인 문법에 속한다. 파이썬의 이러한 엄격한 스타일 제한은 쓰는 사람에 관계없이 통일성을 유지하게 하며, 그 결과 가독성이 향상될 수 있는 장점이 있지만, 다른 한편으로는 프로그램을 쓰는 스타일을 선택할 자유를 제약하는 것이란 의견도 있다.

    C와 다르지만 아래와 같이 줄 바꿈을 하지 않고 사용할 수도 있다. 다음과 같이 한 줄로 작성하여 표현하는 것을 'pythonic 하다'라고 말할 수 있다.

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

 

자료형

파이썬은 다음과 같은 자료형들을 가지고 있다.

 

기본 자료형

 - 정수형

 - 부동소수점형

 - 복소수형

 - 문자형

 - 유니코드 문자형

 - 함수형

 - 논리형(boolean)

 

집합형 자료형

 - 리스트형 : 내부의 값을 나중에 바꿀 수 있다.

 - 튜플형 : 한 번 값을 정하면 내부의 값을 바꿀 수 없다.

 - 사전형 : 내부의 값을 나중에 바꿀 수 있다.

 - 집합형 : 중복을 허락하지 않는다. 변경 가능하게도, 변경 불가능하게도 만들 수 있다.

 

또 많은 객체 지향 언어와 같이, 사용자가 새롭게 자신의 형을 정의할 수도 있다. 파이썬은 동적 타이핑의 일종인 덕 타이핑을 사용하는 언어이기 때문에, 변수가 아닌 값이 타입을 가지고 있고, 변수는 모두 값의 참조이다.

 

뚜렷한 권장 코드 스타일

특유의 철학 때문에 문법이 엄격한 편이다. 잘 작동하는지와는 별개로 가독성을 위해 이렇게 쓰기를 권장한다는 스타일 가이드까지 있다. 파이썬 공식문서에서는 파이썬에 맞는 코딩 스타일을 지키기를 권하는데, 이것이 바로 PEP 8이다.

 

작명 규칙

 - PEP 8에서는 작명 스타일을 명시한다. 일반적으로 스네이크 표기를 쓰되, 특정한 종류에는 파스칼 표기를 쓴다. 

 - 변수는 소문자로 시작하며, 내부변수(internal)는 맨 앞에 밑줄(underbar, _) 1개로 시작하며, 숨은변수(hidden)은 밑줄 2개로 시작한다.

attribute_name = 0

_protected_attribute_name = 0

__hidden_attribute_name = 0

종류 규칙 예시
패키지(package) 스네이크()  
모듈(module) 스네이크() import module_name
클래스(class) 파스칼() class ClassName()
예외(exception) 파스칼  
함수(function) 스네이크() def function_name()
상수(constant) 대문자+밑줄 MODULE_CONSTANT_NAME = 0
변수(variable) 스네이크 variable_name = 0
매개변수(parameter)
지역변수
인스턴스 변수(instance variable)
메쏘드(method) 스네이크() method_name()

 

파이썬의 내장 자료형 요약

종류 설명 문법 예
str 문자열 : immutable 방식의 일련의 유니코드 코드포인트 'Hello World'
"Hello World"
'''
Spanning
multiple
lines
'''
bytearray mutable 방식의 일련의 바이트 bytearray(b'Some ASCII')
bytearray(b"Some ASCII")
bytearray([119, 105, 107, 105])
bytes immutable b'Some ASCII'
b"Some ASCII"
bytes([119, 105, 107, 105])
list mutable 방식의 리스트. 혼합 형태를 포함할 수 있다. [4.0, 'string', True]
tuple immutable 방식. 혼합 형태를 포함할 수 있다 (4.0, 'string', True)
set, frozenset 순서가 정해지지 않은 집합. 중복 허용 안함. frozenset은 immutable이다 {4.0, 'string', True}
frozenset([4.0, 'string', True])
dict mutable 방식의 연관 배열의 키와 쌍 값 {key1: value1, key2: value2}
int immutable 방식의 정수로서 크기는 무제한 42
float immutable 방식의 부동소수점 수 3.14159265358979
complex immutable 방식의 복소수(실수와 허수) 3+2.7j
bool immutable 방식의 진리값 True
False

 

동작하는 플랫폼

첫 파이썬 버전은 매킨토시에서 사용할 목적으로 개발되었지만, 지금은 다양한 플랫폼에서 동작한다. 하지만 안드로이드, iOS에서는 동작하지 않는다. 또한 동작이 되도록 만들 가능성도 적어 보인다.

 

 - 마이크로소프트 윈도우

 - 매킨토스(맥)

 - 각종 유닉스

 - 리눅스

 - 팜 OS

 - 노키아 시리즈 60

 

사용 현황

파이썬은 많은 제품이나 기업 및 연구기관에서 쓰이고 있다. 대표적인 몇 가지는 다음과 같다.

 

  • 아나콘다(Anaconda)
  • 비트토렌트(BitTorrent)
  • 메일맨(MailMan)
  • 모인모인(MoinMoin Wiki)
  • 플러커(Plucker)
  • 포티지(Portage)
  • 파이솔(PySol)
  • 뷰CVS(ViewCVS)   
  • Zope / Plone
  • Trac
  • 장고 (웹 프레임워크)
  • 드롭박스(Dropbox)
  • 유튜브
  • 넷플릭스

 

파이썬을 내부적으로 사용하는 소프트웨어

  • softimage|xsi (3D 애니메이션 소프트웨어)
  • 잉크스케이프(Inkscape)
  • 페인트샵 프로(Paint Shop Pro)
  • 문명 IV
  • 셰이드(Shade)
  • TRIBON (3D CAD 소프트웨어)
  • 오토데스크 마야 (3D 애니메이션 소프트웨어)
  • MotionBuilder (3D 애니메이션 소프트웨어)
  • Softimage (3D 애니메이션 소프트웨어)
  • Cinema 4D (3D 애니메이션 소프트웨어)
  • BodyPaint 3D (3D 애니메이션 소프트웨어)
  • Blender 3D (3D 애니메이션 소프트웨어)
  • Sidefx Houdini (3D 애니메이션 소프트웨어)
  • Abaqus (유한요소 해석 소프트웨어)
  • TORRENT (공유 프로그램)
  • Rhino 3D CAD (3D 모델링 소프트웨어)
  • 카카오톡 (모바일/PC 메신저)
  • MODO 3D (3D 모델링 소프트웨어)

 

파이썬을 이용하고 있는 기업·정부 기관

  • 야후
  • 구글
  • 인더스트리얼 라이트 앤드 매직 (ILM)
  • 미국항공우주국 (NASA)
  • 미국 해양대기청 (NOAA)
  • 카카오

 

파이썬 실행 파일 종류

▷ IDLE(Python 3.6 32-bit): Python 표준 GUI 대화식 인터프리터 언어
▷ Python 3.6(32-bit): Dos 창에서 실행되는 Python 대화식 인터프리터 언어
▷ Python 3.6 Manuals(32-bit): HTML 형식의 Python 온라인 문서
▷ Python 3.6 Manuals Docs: 원하는 모듈을 찾을 수 있는 도구

 

 

* 더 알아보기 - (IDLE)이 무엇인가?

IDLE 프로그램을 실행하면 프로그램의 이름과 현재 사용시간, 버전에 대한 메시지가 실행 창의 맨 위에 쓰여 있다. 그리고 ‘>>>’ 기호가 화면에 출력되어 있다. 여기서 >>> 기호는 파이선이 사용자의 입력을 기다리고 있다는 뜻이다. 사용자가 입력을 하면 바로 결과를 보여 주는데 이것을 대화형 셸(Interactive Shell) 혹은 셸(Shell)이라고 부른다. 대화형 셸을 이용하면 파이선과 대화하듯이 명령을 내리고 그 결과를 바로 볼 수 있다.

 

 

참고자료 : https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%B4%EC%8D%AC

 

파이썬 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 이 문서는 프로그래밍 언어에 관한 것입니다. 그리스 신화의 괴물에 대해서는 피톤 문서를, 미사일에 대해서는 파이톤 5 미사일 문서를 참고하십시오. 파이썬Py

ko.wikipedia.org

참고자료 : https://namu.wiki/w/Python

 

Python - 나무위키

특유의 철학 때문에 문법이 엄격한 편이다. 잘 작동하는지와는 별개로 가독성을 위해 이렇게 쓰기를 권장한다는 스타일 가이드까지 있다. 파이썬 공식 문서에서는 파이썬에 맞는 코딩 스타일을

namu.wiki

 

Comments