| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Life is short, you need 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.) 그 방법이 처음에는 명확해 보이지 않을 수 있다.[3]. (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!)
let mut hello = "world!";
hello = "world!"
from typing import Final
# 작명 규칙을 이용한 상수 표기
HELLO = "world!"
# 작명 규칙과 타입 힌트를 이용한 상수 표기
HELLO_WORLD: Final = "hello, world!"
# 상수 표기는 단순한 convention이기 때문에 재할당도 가능하다.
HELLO = 3
range()
, re.Match.finditer()
, 제너레이터 함수 등의 이터러블이나 이터레이터에서 쓰이고 있다.# 제너레이터 함수
def get_multipe(number_to_muliply, limit=100):
for multiple in range(1, limit + 1):
yield number_to_muliply * multiple
multiple = get_multipe(2)
print(next(multiple)) # 결과: 2
print(next(multiple)) # 결과: 4
print(next(multiple)) # 결과: 6
...
print(next(multiple)) # 결과: 200
for multiple in get_multipe(3):
print(multiple, end=', ')
# 3, 6, 9, ... 300, 으로 출력됨.
next()
함수와 같은 문법들을 이용하여 순서대로 값을 호출할 수 있다. for ... in <이터러블>:
과 같은 문법은 내부적으로 iter(<이터러블>)
을 통해 이터레이터를 생성한 뒤 next(<이터레이터>)
를 반복적으로 사용한다.list(range(100))
은 0부터 99까지의 모든 숫자를 담은 리스트를 모두 메모리에 담아야 하지만 range(100)
은 0부터 99까지 모든 숫자가 있다는 정보만 담고 있기에 메모리에 전체 리스트를 담을 필요가 없다.range()
는 리스트를 반환했고 대신해 xrange()
를 사용해야 했었다. 파이썬 3부터는 range()
를 이터러블로 변경하면서 range()
함수 안의 값이 얼마나 크든 간에 메모리 효율적으로 사용할 수 있게 되었다.[f"{i:03d}" for i in range(100) if i % 3 == 0 or i % 2 == 0]
# 비효율적인 프로그래밍의 예시
sum_result = 0
for i in range(1, 10001):
sum_result += i
# 1부터 10000까지 모두 더한 값인 50005000이 나옴.
print(sum_result)
sum
을 이용한 다음의 코드는 효율적이며, 더 깔끔하다. sum
은 파이썬이 아닌 C언어로 구현되어 있기 때문이다.# 효율적인 프로그래밍의 예시
# 1부터 10000까지 모두 더한 값인 50005000이 나옴.
print(sum(range(1, 10001)))
pip install package
poetry add package
conda
라는 명령줄 프로그램을 제공하며, 이는 별도의 가상 환경 생성 및 관리 기능을 가지고 있고 같은 명령어로 해당 가상 환경에 패키지를 설치할 수 있다. 파이썬 패키지만 지원하는 PyPI와 달리 blas, cuda, boost 등의 패키지 또한 등록되어 있어 anaconda에서 관리하는 가상 환경에 설치할 수 있다. conda
의 경우 의존성 트리를 철저하게 확인하여 그러한 의존성 모순이 없도록 강제한다. 따라서 의존성 관계가 복잡한 경우 conda
를 사용하여 관리하는 것이 편리하다.conda
사용에 숙련되면 Miniconda를 쓰는 것도 좋다. Miniconda는 패키지를 자신이 직접 찾아서 깔아야 하지만, 어차피 필요한 패키지를 설치하는 것은 #conda install <패키지명>
몇 번만 두드려 보면 간단히 해결된다.conda install package
conda
에는 등록되지 않아서 PyPI으로만 설치할 수 있는 패키지는 어쩔 수 없이 PyPI을 사용해야 한다. 그리고 PyPI로 설치할 수 없는 시스템 의존성(dependency)이 있으면 conda
로 설치해야 한다.pip install --user
.venv
로 작명하는 것이 일반적이다.python -m venv <가상 환경 이름>
라는 단 한 줄의 명령만으로 매우 간편하게 사용이 가능하다. 가상 환경 설치 후 < 가상 환경 이름 >/bin/activate
을 실행하면 가상 환경이 실행된다. 가상 환경 실행 중 deactive
라는 명령으로 바로 가상 환경을 종료할 수 있다.virtualenv my-venv
# 특정 파이썬 버전으로 된 환경을 구성하려는 경우에는...
virtualenv my-venv --python=<특정 버전>
conda create --name my-venv
# 특정 파이썬 버전으로 된 환경을 구성하려는 경우에는...
conda create --name my-venv --python=<특정 버전>
""
/''
) 등 사람마다 스타일이 다를 수 있는 부분은 많다. 따라서 코딩 스타일을 통일하는 도구를 사용하면 여러 사람이 협업하면서 생기는 코드의 가독성이나 일관성 문제를 개선할 수 있다.sudo apt-get install python3
import antigravity
라고 치면 해당 만화의 링크를 웹 브라우저에서 연다.[9] 일반적인 프로그래밍 언어들은 정수의 크기를 32비트 혹은 64비트 등으로 제한을 하는 경우가 많은데, 파이썬의 경우에는 메모리가 버텨주는 한 무한한 크기의 정수를 만들 수 있다.[10] 메타클래스를 쓴다는 건 데이터베이스를 자기가 원하는 형태로 변환시켜 저장한다는 의미이기에 코딩을 하는 이유이자 목적이다. 만약 메타클래스를 못하면 어떤 언어를 쓰건 프로그래머가 아닌 코더로 불려도 할 말이 없을 것이다. 그리고 이쯤 되면 코딩 실력도 본 궤도에 올랐을 텐데 여기서 메타클래스를 파이썬으로 쓰며 개고생을 여는 개발자는 거의 없을 것이다.[11] 외국어 중 영어와 같은 케이스라고 생각하면 된다. 아랍어, 러시아어 같은 언어는 어느 정도만 할 줄 알아도 대우를 받는 반면, 영어는 누구나 배우는 언어이기에 웬만큼 잘해서는 경쟁력조차 없다.[12] 여기서 말하는 교양이란 회귀 분석이나 최소 제곱법, 기계학습 등의 통계적 방법에 대한 이해, 그리고 수학 쪽으로는 행렬과 집합, 선형 대수학 등에 대한 간단한 개념만 있으면 된다. 공부해 본 사람들은 알겠지만 이것들은 심화가 아니라 기본 중의 기본이다.[13] 때문에 C나 C++로 만들어진 NumPy와 같은 라이브러리가 없었다면 절대로 쓰지 않았을 언어라는 폄하도 간혹 존재할 정도다. 결국 파이썬의 핵심이 되는 개발 편의가 있는 상태에서 파이썬의 맹점인 속도를 다른 언어로 라이브러리를 만들어 극복했던 것이다. 이런 와중에도 결국 기본 타입에 더해 ndarray와 DataFrame 등의 제네릭 타입들이 생겨나 타입 에러를 일으키는 꼴을 보자면 개발자는 뒷목을 잡지 않을 수 없다. 정적 타입 언어라면 코드를 적는 순간 IDE에서 에러 체킹이 되는데 파이썬은 런타임에서 에러가 터지니까 말이다.[14] 이는 JavaScript도 같은 문제점을 공유하지만 객체지향의 구색을 그나마 갖춘 파이썬과 달리 흉내 정도에 그치는 JavaScript와 비교할 정도는 아니다.[15] 당연히 실무에서 리스트나 이진 트리를 하나하나 직접 구현할 일은 없으나 그 원리를 이해하는 상태에서 개발하는 것은 전혀 별개의 문제다. 가령 스레드가 꼬여 에러가 났을 때, 스레드가 무엇이고 내부적으로 어떻게 처리되는지를 이해하는 사람이라면 어디서 에러가 나는지 바로 유추하고 대응이 가능하지만, 이런 배경 없이 메소드만 쓸 줄 아는 사람은 에러 메세지를 읽는 것부터 난관이다.[16] 그리고 졸업할 때가 되면 대학에서 안 가르쳐도 학생들은 실무에서 필요한 언어를 알아서 찾아 배우고 습득할 정도의 실력에 도달하게 된다. 다시 말해서 언어를 뭘 쓰냐는 크게 중요하지 않은 것이다. 필요에 따라 언어를 바꿀 수 있는 마인드가 없다면 개발자로서의 삶이 불가능하다. 어차피 학교에서 가르치는 언어들은 내부적으로만 깊게 파헤치기에 실무에서 쓰는 프레임워크 또는 서드 파티 라이브러리는 모조리 알아서 공부해야만 한다. 그래서 만약 학교만 믿고 본인 스스로가 공부를 안한 대졸자라면 아예 안배우니만도 못한 결과가 나오기도 한다.[17] 파이썬을 하기 위해 코딩을 하지 말라는 이야기다. 만약 어떤 프로그램을 만드는데 파이썬을 사용해 좋은 결과를 낸다면 파이썬을 사용하고, 그렇지 않다면 다른 언어를 사용해야 한다. 단순히 파이썬을 하기 위해 코딩을 한다면 실무는 커녕 습작이나 공부에서도 제대로 된 결과물이 나올리가 없다. 이는 다른 언어 또한 마찬가지다.[18] 특히 비 개발자 대상으로[19] 같은 인터프리터 언어인 Java나 C# 도 JRE,.NET 런타임이 미리 깔려야 하는 문제가 있지만 Java의 경우에는 오라클 측에서 배포하는 표준화된 JRE 하나만 깔아도 대부분의 자바 프로그램이 동작될 정도로 표준화되어 있으며 .NET은 MS가 OS를 깔 때 아예 같이 설치해 주기 때문에 유저는 설치 자체를 할 필요가 없는 경우가 많다.[20] 기본적으로 'Python을 설치하고 개발 환경을 구성한 사람이' '자기 컴퓨터나 자기가 관리하는 시스템 속에서 돌릴 프로그램을' '직접 만들어 쓰는' 것을 최대의 목적으로 발달해 왔기 때문에[21] 'Visual C++ 20xx Redistributable'(vc_redist.exe) 등이 첨부된다[22] Java Runtime Environment. 자바 런타임 환경[23] 이마저도 JDK, JRE 등의 복잡한 구분 없이 그냥 Java를 설치한다고만 안내하는 등 설치를 까다롭거나 위협적으로 느끼기는커녕 지금 설치하는 게 정확히 JRE라는 점조차 몰라도 되도록 배려하고 있다.[24] 이 때문에 많은 사람들이 눈치채지 못하는 부가 효과가 있는데, 바로 이 윈도우 내장 .Net은 동시에 프로그램 개발 환경으로도 쓰일 수 있다는 점이다. 프레임워크가 깔릴때 SDK도 같이 깔리기 때문에 터미널로 SDK를 불러와 프로젝트 생성과 프로젝트 빌드까지 가능하다.[25] Java가 jlink라는 표준화된 방식을 제공하는 것과 대조적이다.[26] https://realpython.com/python-gil/[27] https://discuss.python.org/t/a-steering-council-notice-about-pep-703-making-the-global-interpreter-lock-optional-in-cpython/30474[28] https://www.python.org/downloads/release/python-3130/[29] https://x.com/pyblogsal/status/1843329493118964009[30] read-evaluation-print loop라는 의미로, 코드를 치면 바로 값이 프린트되어 나오고 이것이 반복되는 환경을 의미한다.[31] Python 확장 설치 시 파이썬에 대한 IDE로 사용할 수 있다.[32] setuptools나 설치에 필요한 다른 기능. 또한 C/C++ 코드를 사용하는 경우에는 해당 시스템에 C/C++ 컴파일러도 설치되어 있어야 한다.[33] 2020년부터 정부 및 200인 이상 기업에게는 유료로 바뀌었다.[34] libjpg, bzip 등 시스템에서 자주 사용되는 패키지 다수가 포함됨[35] 물론 필요에 따라 직접 빌드해서 설치하면 당연히 사용할 수 있지만, 매우 귀찮고 번거로우며 기술적 지식을 요구하므로....[36] 심지어 C++도 사용할 수 있다.[37] 단지 헤더 파일을 복붙하는 것으로 작동한다.[38] PEP 8이 유일한 스타일 가이드라인은 아니다. 대표적인 다른 가이드라인으로는 구글 파이썬 스타일 가이드라인이 있다. 하지만 내용은 PEP 8과 대동소이하다. 사람마다 가장 차이가 심한 스타일로는 docstring 스타일이다. 주요 골자는 PEP 257에서 정의되고 있지만, 세부적인 방법은 sphinx, 구글 스타일 가이드라인 등 다양하다.[39] 예외나 경고를 포함한다.[40] 변수명, 함수명, 일부 내장 타입, 파일명, 패키지명 등.[41] 당연하지만 정규 교육 기관부터 인터넷 강의까지 파이썬이 권장하는 스네이크 케이스를 지키는 경우는 거의 없다. 프로그래머가 투입되는 프로젝트마다 코딩 컨벤션이 달라지기에 교육자의 코딩 스타일이나 공식 가이드라인은 참고만 하는 것이 좋다.[42] 대신 맹글링(mangling)은 지원한다. 맨 앞에 밑줄이 두 개이고 매직 메소드가 아닌 경우 맹글링이 된다.[43] 정확히는 protected. private는 2개를 사용한다. 비슷한 언어로 Dart가 있는데 다트의 경우 protected가 존재하지 않으며 밑줄 하나가 private를 의미한다.[44] 구글 스타일 가이드는 80자로 제한하고, black는 88자가 기본값이다.[45] 출처[46] 혹은 Integrated DeveLopment Environment#[47] https://stackoverflow.com/a/21581930[48] https://x.com/gvanrossum/status/1355310333875773444[49] 강남 코엑스에서 13~14일 아카마이에서 15일(튜토리얼).[50] CVE-2007-4559
이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외)
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.
나무위키는 백과사전이 아니며 검증되지 않았거나, 편향적이거나, 잘못된 서술이 있을 수 있습니다.
나무위키는 위키위키입니다. 여러분이 직접 문서를 고칠 수 있으며, 다른 사람의 의견을 원할 경우 직접 토론을 발제할 수 있습니다.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply. This site is protected by hCaptcha and its Privacy Policy and Terms of Service apply.