python - 역사와 특징, 장단점, 기본 정보와 데이터 타입

정현우·2022년 10월 21일
7
post-thumbnail

Python

파이썬은 1991년 네덜란드계 프로그래머인 귀도 반 로섬이 발표한 고급 프로그래밍 언어로, "플랫폼에 독립적" 이며 "인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어" 이다. 파이썬이라는 이름은 귀도가 좋아하는 코미디인〈Monty Python's Flying Circus〉에서 따온 것이다. 이름에서 고대신화에 나오는 커다란 뱀을 연상하는 경우도 있겠지만, 이와는 무관하다. 다만 로고에는 뱀 두마리가 형상화되어 있다. 파이썬은 비영리의 파이썬 소프트웨어 재단이 관리하는 개방형, 공동체 기반 개발 모델을 가지고 있다. 출처:위키

🔥 python의 모든 전반적인 얘기들을 가볍게 살펴보자.
🔥 python 초심자를 위한글이기보단 그 이상을 가기 위한 첫번째 정리글이다.
🔥 무거운 얘기가 필요한 부분은 따로 작성할 예정이다.

1. 릴리즈 역사와 다양한 특징

1) python 릴리즈

  • "Python 프로그래밍" 서문, Python 탄생의 만화

  • 파이썬은 1994년 1월 파이썬 1.0 버전을 시작으로 2000년 9월 파이썬 1.6 버전이 발표 후 2000년 10월 16일 버전 2.0이 발표되었다. 파이썬 2.x 버전은 2.7.11 버전이 마지막이며 2005년 12월 5일 발표 되었다.

  • 파이썬 2.7 버전이 전 세계에 선풍적인 관심과 인기를 얻으면서 사용자들이 많아지고 이를 바탕으로 한느 라이브러리들과 응용 프로그램이 제공되어 현재에도 2.x 와 3.x 버전이 현재 공존하는 상태. 클릭해서 python2에서 3으로 가면서 어떤 부분이 가장 많이 달라졌는지 확인해보자!

  • 그 후 파이썬 3.0 버전이 2008년 12월 발표되었는데, 3.x 초기에는 지원되는 라이브러리가 제한되면서 사용자들에게 많은 불편함이 있었지만 많은 세월이 지나면서 사용이 제한되었던 라이브러리 및 응용프로그램이 제공되면서 전 세계적으로 가장 많이 사용하는 프로그래밍 언어 중에 하나로 자리 잡았다.

  • python은 범용성이 굉장히 높다. 배우기 쉽고, 활용하기 편하다. 그리고 기본적으로 크로스플랫폼 지원에 설치만 하면 실행하기도 너무 쉽다. 그래서 어떤 분야라도 it가 필요하다면 높은 흡수력과 침투력을 보여주고 있다. 이제 "초-중-고-대 학생들 모두가 python은 기본으로 배우려고 하는 추세" 다. 이공계열 외에도 대학교 1학년들 대상으로는 필수로 하는 경우가 태반이다.

  • 티오베에서 발표한 2021년 8월 프로그래밍 인기 언어 순위. 아래는 23년도 6월 기준 티베오 순위. 역시 python이 1위를 차지했고 변화율은 우상향을 보여준다.

2) 기본 철학 - Zen of Python

  • import this 를 해 본적이 있는가!? .py 에 import this를 하던지, 대화형 인터프리터를 켜서 import this를 해보자. 아래와 같이 python이 추구하는 기본 철학들이 나온다.
아름다운 것이 추한 것보다 낫다. (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.)
특별한 경우들은 규칙을 어길 정도로 특별하지 않다. (Special cases aren't special enough to break the rules.)
허나 실용성은 순수성을 이긴다. (Although practicality beats purity.)
오류는 절대로 조용히 지나가지 않는다. (Errors should never pass silently.)
명시적으로 오류를 감추려는 의도가 아니라면. (Unless explicitly silenced.)
모호함을 대할 때, 이를 추측하려는 유혹을 거부하라. (In the face of ambiguity, refuse the temptation to guess.)
명확한, 그리고 가급적이면 유일한 하나의 방법은 항상 존재한다. (There should be one-- and preferably only one --obvious way to do it.)
비록 그 방법이 처음에는 명확해 보이지 않을지라도[10]. (Although that way may not be obvious at first unless you're Dutch.)
지금 행동에 옮기는 것이 아예 안 하는 것보다는 낫다. (Now is better than never.)
비록 아예 안 하는 것이 지금 *당장* 하는 것보다 나을 때도 많지만. (Although never is often better than *right* now.)
구현 결과를 설명하기 쉽지 않다면, 그것은 나쁜 아이디어이다. (If the implementation is hard to explain, it's a bad idea.)
구현 결과를 설명하기 쉽다면, 그것은 좋은 아이디어일지도 모른다. (If the implementation is easy to explain, it may be a good idea.)
네임스페이스를 사용하는 것은 완전 좋은 생각이다! (Namespaces are one honking great idea -- let's do more of those!)
  • 이런 철학들 때문에 파이썬스러움(pythonic) 이라고 불리는 개념이 탄생한다. "복잡하지 않으면서 의미가 명확하고, 코드의 축약보다 뚜렷하게 보이는 흐름을 중시하는 파이썬의 철학을 지칭하는 개념" 이라고 한다.

  • 가장 공감이 가는 부분은 "허나 실용성은 순수성을 이긴다." 이다. python으로 수학세계인 ML과 Data-Eginnering에 대한 코드 실습을 직접할 수 있다. OS-native GUI (pyqt)도 만들어 볼 수 있으며, Full-stack으로 Web개발을, 또는 low-level network에 대한 실습등을 "다른 언어에 비해 상대적으로 굉장히 편하게" 해볼수 있다.

  • C를 배우고 java에 한창 OOP의 신세계를 깨닫고 뛰어놀때 python을 보고 "들여쓰기로 구분에,, 세미콜론도 없고,, type에 대한 선언도 아무것도 없다니,, 너무 근본 없다!" 학부생때 감히 이렇게 생각한적이 있었다. 하지만 python에 한 번 빠지고나니 벗어날수가 없다. 더 이상 jvm 의 노예가 되지 않기로 했다!!

3) PEP(Python Enhance Proposal)

  • python은 자유로움이 강력하다. 하지만 규모가 커지면 커질수록 개인의 자유보다는 조직의 위한 방향이어야 할때가 많다. 파이썬 소프트웨어 재단(PSF)에서는 python official docs로 파이썬 개선 제안, PEP라는 것을 작성한다. 여기서 그 글을 볼수 있다.

  • 이 PEP에서 python의 syntax, 코딩 스타일 가이드라인에 대한 제안서가 있는데 그게 바로 유명한 PEP8 이다. 아주 기본내용은 아래와 같다.

  1. 들여쓰기는 공백 4개로 한다.
  2. 한 줄의 최대 글자는 79자로 한다.
  3. 파일은 UTF-8 또는 ASCII로 인코딩한다.
  4. 하나의 import에는 모듈 하나만 한다.
  5. import는 표준 라이브러리, 서드파티, 로컬 라이브러리 순서로 묶는다.
  6. 소괄호, 중괄호, 대괄호 사이에 추가로 공백을 입력하지 않는다.
  • pycharm 등의 IDE에서는 위 PEP8을 기반으로 자동 맞춤을 해준다. 하지만 python 답게, PEP8에 대한 논쟁도 많다. PEP8의 본문에도 A Foolish Consistency is the Hobgoblin of Little Minds. 라는 말이 있다.

  • 기본적으로는 따르고, 절대적으로 PEP8만을 위한 일관성을 지키지 말라는 것이다. 보통 "가독성을 해치는 경우" 에 따라 PEP8에서 많이들 벗어난다. (하지만 가독성이라는게 꽤나 주관적인 의견이 강하다는 것이다 ㅠㅠ)

4) 기본 작명 규칙

  • 하지만 웬만하면 따라야할 기본적인 syntax가 있다.

5) 특징

  • 거의 핵심 특징을 위해서 언급했지만, 가볍게 체크하고 넘어가자.

(1). 플랫폼에 독립적인 인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어

(2). 표준 라이브러리 자체가 방대하고, 추가 라이브러리도 방대하다.

(3). (상대적으로) 누구나 사용하기 쉽고 편하다.

  • python 설치만 되어 있으면, 메모장에다가 쓰고 .py 로 저장하고 그냥 더블클릭만해도 사실 실행이 가능하다.

  • 컴파일언어, 윈도우에서 C를 생각해보자! gcc 컴파일러,, cl 로 파일 컴파일,, obj와 exe,, 그만 알아보도록 하자..

(4). 심플한 문법과 들여쓰기

  • 들여쓰기로 블록스코프가 구분이 된다니,, 처음엔 너무 적응이 안되었는데 지금은 너무 정확하고 명시적이게 느껴진다.

(5). 그래서 방대한 커뮤니티

(6). 느린 속도

  • 쉽게 표현하면 compile을 전체 파일 대상으로 진행하는 것이 아니라, 실시간으로 기계어까지 변환작업을 계속하다 보니 상대적으로, 당연히, 느릴수 밖에 없다. 게다가 type도 유추를 해야한다.

  • 어렵게 표현하면 순수 객체 지향 언어인 python에서는 참조 방식이 원시 타입에 비해 느리기도 하고, 해당 변수가 가리키는 객체의 PyObject_HEAD를 확인해서 데이터 타입 정보를 가지고 있는 typecode를 확인하고 거기에 해당되는 C의 자료형을 확인하는 일련의 작업이 필요하다. 해당 시리즈에서 해당 작업을 해부할 예정이다.

  • 하드웨어의 발전으로 엄청나게 큰이슈는 아닌게 되었지만, 그래도 0.01초, 0.001초의 촌극을 다루는 상황에서는 python을 사용하지 않는게 낫다.

(7). GIL(Global Intepreter Lock)

  • python의 고질적(사실 태생적) 문제인 GLI는, Global Intepreter Lock의 약자로 하나의 스레드에 모든 자원을 허락하고 나머지 스레드에 락을 걸어 다른 스레드가 실행되지 않도록 막아버리는 기능이다. (추후에 GIL에 대해서만 따로 다룰 것이다.)

  • 즉 멀티스레드가 단일스레드 처럼 활용되어 버린다.

(8). 에러, 디버깅이 상대적으로 힘들 수 있다.

  • 이건 python의 특징보다는 "스크립트 언어"의 특징이다. 전체 프로젝트를 다 컴파일 하는것이아니라, 실시간 번역을 하다보니, 에러를 만나야 에러인것을 알수 있다. 하지만 몇 에러는 IDE단에서 잘 catch해준다.

2. 데이터 타입

Python은 순수 객체 지향 언어 다. 파이썬에는 원시 타입(Primitive Type)이 존재하지 않으며, 모든 것이 객체로 취급된다. 나아가 클래스, 함수 역시 객체로 취급할 수 있다. 상수 역시 상수가 저장된 객체라고 본다.

1) Numeric Types

  • int(정수형) : 숫자형의 하나로 소수점이 없는 정수
  • float(소수형) : 숫자형의 하나로 소수점이 있는 실수
  • complex(복소수) : 실수와 허수의 합인 복소수

2) Sequence Types

  • Sequence는 int 타입의 index를 통해 element에 접근이 가능하다.

  • python은 "순수 객체 지향"언어다. a = 3 을 init하고 id(a)로 변수 a의 메모리 주소값을 보자. 그리고 a = 5 로 값을 바꾼 뒤 id(a) 로 주소값을 보자. 주소값은 바뀐다. 이게 불변과 가변 데이터타입의 핵심차이다.

(1) interning

  • Interning이란 이미 생성된 객체(object)를 재사용(reuse)하는 것을 말하는데, 보통 Immutable 객체에 대해 Interning을 사용한다. 이 역시 순수 객체 지향언어의 장점을 누리는 것으로 볼 수 있다!

  • 즉 이미 한 번 사용된 "값"은 특정 제한 조건을 만족한다면 "재사용" 하는 것이다. CPython의 경우 아래 조건에 해당될 경우 Object Interning을 사용한다.

    • 문자열: 20자 미만의 공백을 포함하지 않는 문자열
    • 정수: -5 부터 256 사이의 정수
  • 파이썬은 기본적으로 위와 같이 제한된 경우에 대해 디폴트로 Interning을 사용하고 있으며, 또한 개발자가 필요한 경우 함수를 써서 Interning을 지정할 수도 있다.

a = "Test"   # string intern
b = "Test"   # string intern
x = id(a)
y = id(b)    # x,y 는 동일한 메모리 가리킴

(2) immutable sequence types

  • str(문자열) : 문자, 단어 등으로 구성된 문자들의 집합. "char(character) type" 이 python에서는 존재하지 않는다.
  • tuple(튜플) : () 로 감싸서 선언하는 데이터 타입. 셀수 있는 수량의 순서있는 열거라고 정의 된다. 선언 이후에 동일한 튜플에 대해 생성, 삭제, 수정이 불가능하다! 특이하게 원소가 한 개인 튜플은 (2,) 와 같이 끝에 콤마를 꼭 붙여줘야 한다.
  • bytes(바이트) : 1바이트(8비트) 단위의 값을 연속적으로 저장하는 시퀀스 자료형. 0~255(0x00~0xFF)까지 정수를 사용한다.
>>> bytes(10)    # 0이 10개 들어있는 바이트 객체 생성
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> bytes([10, 20, 30, 40, 50])    # 리스트로 바이트 객체 생성
b'\n\x14\x1e(2'
>>> bytes(b'hello')    # 바이트 객체로 바이트 객체 생성
b'hello

(3) mutable sequence type

  • bytearray(바이트 열거형) : 1바이트 단위의 값을 연속적으로 저장하는 시퀀스 자료형인데, bytes와 차이점은 요소를 변경할 수 있느냐의 차이. bytes는 요소를 변경할 수 없고, bytearray는 요소를 변경할 수 있다.
"""
bytearray(): 빈 바이트 배열 객체를 생성
bytearray(길이): 정해진 길이만큼 0으로 채워진 바이트 배열 객체를 생성
bytearray(반복가능한객체): 반복 가능한 객체로 바이트 배열 객체를 생성
bytearray(바이트객체): 바이트 객체로 바이트 배열 객체를 생성
"""

>>> x = bytearray(b'hello')
>>> x[0] = ord('a')    # ord는 문자의 ASCII 코드를 반환
>>> x
bytearray(b'aello')
  • list(리스트) : 다양한 데이터 타입이 담길 수 있는 배열이다. python을 사용하면서 가장 자주만나게 되고, 정말 유용한 data type이다. list class가 가지는 method는 아주 다양해서 따로 다룰예정이다.

3) 집합형과 매핑형

  • set(집합) : set은 hashtable data structure 이다. 이해하기 쉽게 보자면, list 성질에 "중복 불가 특성" 을 추가한 것이다. (list는 hashtable이 아니다!!)

  • dict(매핑형) : {key: value} 의 형태를 가진 자료구조다. 사실 dict도 hashtable data structure이다. 정확하겐 set은 dict를 참조해서 구현되어 있다. 그래서 "둘 다 순서가 없다"


3. GC(Garbage Collector)

  • process가 실행될 때, 메모리영역에서 코드,데이터,힙,스택 영역을 할당받게 된다.

  • 더이상 사용하지 않는 메모리 공간, 힙, 스택 영역에 할당된 메모리들은 정리를 해줘야 한다. c는 할당과 해제를 직접해야한다. 하지만 python, java 등의 고급 언어들은 다 "GC" 라는 친구가 있다.

  • 파이썬에선 기본적으로 garbage collection(가비지 컬렉션)과 reference counting(레퍼런스 카운팅)을 통해 할당된 메모리를 관리한다. 기본적으로 참조 횟수가 0이 된 객체를 메모리에서 해제하는 레퍼런스 카운팅 방식을 사용하지만, 참조 횟수가 0은 아니지만 도달할 수 없지만, 상태인 reference cycles(순환 참조)가 발생했을 때는 가비지 컬렉션으로 그 상황을 해결한다.

  • 해당 시리즈 글 python - memory optimization (2) : GC, reference counter and GIL 를 봐주세요 :) 🔥


출처

profile
도메인 중심의 개발, 깊이의 가치를 이해하고 “문제 해결” 에 몰두하는 개발자가 되고싶습니다. 그러기 위해 항상 새로운 것에 도전하고 노력하는 개발자가 되고 싶습니다!

2개의 댓글

comment-user-thumbnail
2022년 10월 22일

우와! 파이썬에 대해 잘 알게 되었습니다

1개의 답글