파이썬은 1991년 네덜란드계 프로그래머인 귀도 반 로섬이 발표한 고급 프로그래밍 언어로, "플랫폼에 독립적" 이며 "인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어" 이다. 파이썬이라는 이름은 귀도가 좋아하는 코미디인〈Monty Python's Flying Circus〉에서 따온 것이다. 이름에서 고대신화에 나오는 커다란 뱀을 연상하는 경우도 있겠지만, 이와는 무관하다. 다만 로고에는 뱀 두마리가 형상화되어 있다. 파이썬은 비영리의 파이썬 소프트웨어 재단이 관리하는 개방형, 공동체 기반 개발 모델을 가지고 있다. 출처:위키
🔥 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학년들 대상으로는 필수로 하는 경우가 태반이다.
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 의 노예가 되지 않기로 했다!!
python은 자유로움이 강력하다. 하지만 규모가 커지면 커질수록 개인의 자유보다는 조직의 위한 방향이어야 할때가 많다. 파이썬 소프트웨어 재단(PSF)에서는 python official docs로 파이썬 개선 제안, PEP라는 것을 작성한다. 여기서 그 글을 볼수 있다.
이 PEP에서 python의 syntax, 코딩 스타일 가이드라인에 대한 제안서가 있는데 그게 바로 유명한 PEP8 이다. 아주 기본내용은 아래와 같다.
pycharm 등의 IDE에서는 위 PEP8을 기반으로 자동 맞춤을 해준다. 하지만 python 답게, PEP8에 대한 논쟁도 많다. PEP8의 본문에도 A Foolish Consistency is the Hobgoblin of Little Minds.
라는 말이 있다.
기본적으로는 따르고, 절대적으로 PEP8만을 위한 일관성을 지키지 말라는 것이다. 보통 "가독성을 해치는 경우" 에 따라 PEP8에서 많이들 벗어난다. (하지만 가독성이라는게 꽤나 주관적인 의견이 강하다는 것이다 ㅠㅠ)
python 설치만 되어 있으면, 메모장에다가 쓰고 .py
로 저장하고 그냥 더블클릭만해도 사실 실행이 가능하다.
컴파일언어, 윈도우에서 C를 생각해보자! gcc 컴파일러,, cl 로 파일 컴파일,, obj와 exe,, 그만 알아보도록 하자..
python이 가장 선호도가 높고 인기가 있다보니 커뮤니티가 로우레벨부터 하이레벨까지 굉장히 다양하게 형성되어 있다.
글로벌 칼럼 | 파이썬이 기업을 지배하게 될 8가지 이유와 그렇지 않을 8가지 이유 이 뉴스가 굉장히 재미있다.
쉽게 표현하면 compile을 전체 파일 대상으로 진행하는 것이 아니라, 실시간으로 기계어까지 변환작업을 계속하다 보니 상대적으로, 당연히, 느릴수 밖에 없다. 게다가 type도 유추를 해야한다.
어렵게 표현하면 순수 객체 지향 언어인 python에서는 참조 방식이 원시 타입에 비해 느리기도 하고, 해당 변수가 가리키는 객체의 PyObject_HEAD를 확인해서 데이터 타입 정보를 가지고 있는 typecode를 확인하고 거기에 해당되는 C의 자료형을 확인하는 일련의 작업이 필요하다. 해당 시리즈에서 해당 작업을 해부할 예정이다.
하드웨어의 발전으로 엄청나게 큰이슈는 아닌게 되었지만, 그래도 0.01초, 0.001초의 촌극을 다루는 상황에서는 python을 사용하지 않는게 낫다.
python의 고질적(사실 태생적) 문제인 GLI는, Global Intepreter Lock의 약자로 하나의 스레드에 모든 자원을 허락하고 나머지 스레드에 락을 걸어 다른 스레드가 실행되지 않도록 막아버리는 기능이다. (추후에 GIL에 대해서만 따로 다룰 것이다.)
즉 멀티스레드가 단일스레드 처럼 활용되어 버린다.
Python은 순수 객체 지향 언어 다. 파이썬에는 원시 타입(Primitive Type)이 존재하지 않으며, 모든 것이 객체로 취급된다. 나아가 클래스, 함수 역시 객체로 취급할 수 있다. 상수 역시 상수가 저장된 객체라고 본다.
Sequence는 int 타입의 index를 통해 element에 접근이 가능하다.
python은 "순수 객체 지향"언어다. a = 3
을 init하고 id(a)
로 변수 a의 메모리 주소값을 보자. 그리고 a = 5
로 값을 바꾼 뒤 id(a)
로 주소값을 보자. 주소값은 바뀐다. 이게 불변과 가변 데이터타입의 핵심차이다.
Interning이란 이미 생성된 객체(object)를 재사용(reuse)하는 것을 말하는데, 보통 Immutable 객체에 대해 Interning을 사용한다. 이 역시 순수 객체 지향언어의 장점을 누리는 것으로 볼 수 있다!
즉 이미 한 번 사용된 "값"은 특정 제한 조건을 만족한다면 "재사용" 하는 것이다. CPython의 경우 아래 조건에 해당될 경우 Object Interning을 사용한다.
파이썬은 기본적으로 위와 같이 제한된 경우에 대해 디폴트로 Interning을 사용하고 있으며, 또한 개발자가 필요한 경우 함수를 써서 Interning을 지정할 수도 있다.
a = "Test" # string intern
b = "Test" # string intern
x = id(a)
y = id(b) # x,y 는 동일한 메모리 가리킴
()
로 감싸서 선언하는 데이터 타입. 셀수 있는 수량의 순서있는 열거라고 정의 된다. 선언 이후에 동일한 튜플에 대해 생성, 삭제, 수정
이 불가능하다! 특이하게 원소가 한 개인 튜플은 (2,)
와 같이 끝에 콤마를 꼭 붙여줘야 한다.>>> 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
"""
bytearray(): 빈 바이트 배열 객체를 생성
bytearray(길이): 정해진 길이만큼 0으로 채워진 바이트 배열 객체를 생성
bytearray(반복가능한객체): 반복 가능한 객체로 바이트 배열 객체를 생성
bytearray(바이트객체): 바이트 객체로 바이트 배열 객체를 생성
"""
>>> x = bytearray(b'hello')
>>> x[0] = ord('a') # ord는 문자의 ASCII 코드를 반환
>>> x
bytearray(b'aello')
set(집합) : set은 hashtable data structure 이다. 이해하기 쉽게 보자면, list 성질에 "중복 불가 특성" 을 추가한 것이다. (list는 hashtable이 아니다!!)
dict(매핑형) : {key: value}
의 형태를 가진 자료구조다. 사실 dict도 hashtable data structure이다. 정확하겐 set은 dict를 참조해서 구현되어 있다. 그래서 "둘 다 순서가 없다"
process가 실행될 때, 메모리영역에서 코드,데이터,힙,스택 영역을 할당받게 된다.
더이상 사용하지 않는 메모리 공간, 힙, 스택 영역에 할당된 메모리들은 정리를 해줘야 한다. c는 할당과 해제를 직접해야한다. 하지만 python, java 등의 고급 언어들은 다 "GC" 라는 친구가 있다.
파이썬에선 기본적으로 garbage collection(가비지 컬렉션)과 reference counting(레퍼런스 카운팅)을 통해 할당된 메모리를 관리한다. 기본적으로 참조 횟수가 0이 된 객체를 메모리에서 해제하는 레퍼런스 카운팅 방식을 사용하지만, 참조 횟수가 0은 아니지만 도달할 수 없지만, 상태인 reference cycles(순환 참조)가 발생했을 때는 가비지 컬렉션으로 그 상황을 해결한다.
해당 시리즈 글 python - memory optimization (2) : GC, reference counter and GIL 를 봐주세요 :) 🔥
우와! 파이썬에 대해 잘 알게 되었습니다