{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 05wk-1: 개발환경의 변화\n",
"\n",
"최규빈 \n",
"2023-04-03\n",
"\n",
"
\n",
"\n",
"# 강의영상\n",
"\n",
"> youtube:\n",
"> \n",
"\n",
"# 파이썬이 어려웠던 이유\n",
"\n",
"`-` 파이썬 배우는 초보자에게 가장 어려운것!\n",
"\n",
"- 선생님마다 설치하는 방법이 모두 다름\n",
"\n",
"`-` 왜 저렇게 설치방법이 다른가? 왜 다른 방법으로 각각 파이썬을\n",
"실행하는가? 이런것이 너무 어려움\n",
"\n",
"- [방법1:](https://wikidocs.net/8) 파이썬프로그램 다운로드 -\\>\n",
" 시작버튼 눌러서 설치\n",
"- [방법2:](https://wikidocs.net/44) 아나콘다 설치 (그럼 자동으로\n",
" 파이썬이 설치됨)\n",
"- 방법3: 아나콘다 설치 + 가상환경\n",
"- …\n",
"\n",
"`-` 심지어 실행하는것도 다름\n",
"\n",
"- [방법1:](https://goddaehee.tistory.com/286) 파이썬 프롬프트\n",
"- [방법2:](https://null-0.tistory.com/11) .py를 이용하여 실행?\n",
"- [방법3:](https://null-0.tistory.com/11) IDLE\n",
"- [방법4:](https://tariat.tistory.com/73) 파이참\n",
"- [방법5:](https://shlee1990.tistory.com/963) 스파이더\n",
"- [방법6:](https://www.codingfactory.net/11337) Visual Studio Code\n",
"- 방법7: 주피터노트북, 주피터랩\n",
" - 가상환경을 만들어서 해라..\n",
" - 아나콘다 네비게이터에 주피터가 있다..\n",
"- …\n",
"\n",
"`-` 머리아프니까 collab을 쓰라는 사람도 있음. 아니면 도커이미지를\n",
"줄테니까 그걸 쓰라는 사람도 있음. AWS를 쓰라는 사람도 있음.. $\\to$ 이게\n",
"더 머리아픔\n",
"\n",
"`-` 핵심: 그냥 (1) 컴퓨터에 (2) 파이썬을 깔아서 (3) 실행하는 것임\n",
"\n",
"`-` 의문: 그런데 방법이 왜이렇게 많은가? 엑셀처럼 프로그램 설치하고\n",
"아이콘 더블클릭하면 끝나는 식으로 만들어야 하는것 아닌가?\n",
"\n",
"## 개발환경 구축방법이 많은 이유?\n",
"\n",
"`-` 파이썬 개발환경 구축은 수많은 방법이 있다.\n",
"\n",
"`-` 이는 마치 라면의 레시피를 검색하면 수많은 방법이 나오는것과 유사함.\n",
"\n",
"- 방법1: 스프를 먼저 넣고 끓인다음 라면을 넣어야 합니다.\n",
"- 방법2: 양은냄비에 물넣고 물이 끊으면 라면과 스프를 같이 넣고\n",
" 마지막에 계란을 넣는다.\n",
"- 방법3: 먹다남은 삼겹살을 후라이팬에 볶은다음에 물을 붓고 라면을\n",
" 넣는다.\n",
"- 방법4: 용기에 라면+스프+뜨거운물 랩을 씌운뒤에 젓가락으로 구멍을\n",
" 뚫고 전자렌지에 돌린다.\n",
"- …\n",
"\n",
"`-` 우리는 모든 방법을 나열할 순 없지만 모든 방법을 이해할 수 있다.\n",
"왜냐하면 라면을 끓이는 공통적인 맥락을 우리는 알고 있으니까\n",
"\n",
"`-` 파이썬을 설치하는 다양한 방법 역시 공통맥락을 파악하면 이해하기\n",
"쉽다.\n",
"\n",
"`-` 저의 목적: 파이썬을 설치하고 실행하는 공통맥락을 설명하고 싶음\n",
"\n",
"`-` 설치하는 방법이 다양한 이유? 파이썬이 인기있음 + 다양한 방법을\n",
"설치를 하면 각자의 장점이 뚜렷해서\n",
"\n",
"# 1세대 프로그래머\n",
"\n",
"## python\n",
"\n",
"`-` 윈도우에서 anaconda prompt 실행 -\\> python\n",
"\n",
" (base) C:\\Users\\python>python\n",
" Python 3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32\n",
" Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n",
" >>> [1,2,3]+[4]\n",
" [1, 2, 3, 4]\n",
" >>> a=[1,2,3]+[4]\n",
" >>> a\n",
" [1, 2, 3, 4]\n",
"\n",
"`-` 2개를 실행할 수도 있음. (두 환경은 각각 서로 독립적인 파이썬, 변수가\n",
"공유되지 않음) $\\star$\n",
"\n",
"`-` 아쉬운점: \\`?list’와 같이 도움말 기능이 동작하지 않음\n",
"\n",
" >>> ?list\n",
" File \"\", line 1\n",
" ?list\n",
" ^\n",
" SyntaxError: invalid syntax\n",
" >>> \n",
"\n",
"## ipython\n",
"\n",
"`-` 윈도우에서 anaconda prompt 실행 -\\> ipython\n",
"\n",
" (base) C:\\Users\\python>ipython\n",
" Python 3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)]\n",
" Type 'copyright', 'credits' or 'license' for more information\n",
" IPython 7.29.0 -- An enhanced Interactive Python. Type '?' for help.\n",
"\n",
" In [1]: a=[1,2,3]\n",
"\n",
" In [2]: a\n",
" Out[2]: [1, 2, 3]\n",
"\n",
" In [3]: a+[4]\n",
" Out[3]: [1, 2, 3, 4]\n",
"\n",
"`-` ?list가 가능\n",
"\n",
" In [4]: ?list\n",
" Init signature: list(iterable=(), /)\n",
" Docstring:\n",
" Built-in mutable sequence.\n",
"\n",
" If no argument is given, the constructor creates a new empty list.\n",
" The argument must be an iterable if specified.\n",
" Type: type\n",
" Subclasses: _HashedSeq, StackSummary, DeferredConfigList, SList, _ImmutableLineList, FormattedText, NodeList, _ExplodedList, Stack, _Accumulator, ...\n",
"\n",
"`-` 색깔이 알록달록해서 문법을 보기 편하다. (구문강조)\n",
"\n",
"## 1세대 프로그래머의 삶 with python\n",
"\n",
"`-` 1부터 10까지 합을 구하는 프로그램을 만들고 싶음\n",
"\n",
"`-` 시도1: python을 키고 아래와 같이 실행\n",
"\n",
" (base) C:\\Users\\python>python\n",
" Python 3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32\n",
" Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n",
" >>> total = 0\n",
" >>> for i in range(10):\n",
" ... total=total+i\n",
" ...\n",
" >>> total\n",
" 45\n",
" >>>\n",
"\n",
"`-` 반성: 정답은 55인데 45가 출력되었다! $\\to$ range(10)을\n",
"range(1,11)으로 바꿔야겠다!\n",
"\n",
"`-` 시도2: range(1,11)을 바꿔야겠다고 생각하고 다시 입력하다가 오타가\n",
"발생\n",
"\n",
" >>> total =0\n",
" >>> for i in range(1,11):\n",
" ... total = totla +i\n",
" ...\n",
"\n",
"- 앗 totla이라고 잘못쳤다.\n",
"\n",
"`-` 반성: 다음에는 정신을 똑바로 차려야겠다.\n",
"\n",
"`-` 불편한점: … 다..\n",
"\n",
"## 1세대 프로그래머의 삶 with ipython\n",
"\n",
"`-` ipython을 사용한 프로그래머는 좀 더 상황이 낫다\n",
"\n",
" (base) C:\\Users\\python>ipython\n",
" Python 3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)]\n",
" Type 'copyright', 'credits' or 'license' for more information\n",
" IPython 7.29.0 -- An enhanced Interactive Python. Type '?' for help.\n",
"\n",
" In [1]: total = 0\n",
"\n",
" In [2]: for i in range(1,11):\n",
" ...: total = total + i\n",
" ...:\n",
"\n",
" In [3]: total\n",
" Out[3]: 55\n",
"\n",
"- 편한점1: 자동으로 들여쓰기가 되어서 편함\n",
"- 편한점2: 화살표를 이용해서 for문을 쓰는 도중에 위아래로 이동가능\n",
"- 불편한점1: 화살표로 이동할수는 있는데 마우스로는 이동할 수 없다.\n",
"- 불편한점2: 내가 작성한 코드를 관리하기 어렵다.\n",
"\n",
"# 2세대 프로그래머\n",
"\n",
"`-` 2세대 프로그래머: 메모장 + anconda prompt를 이용 (.py를 이용한\n",
"python활용)\n",
"\n",
"`-` 메모장을 키고 아래의 내용을 적는다.\n",
"\n",
" total = 0 \n",
" for i in range(1,11): \n",
" total = total + i\n",
" print(total)\n",
"\n",
"`-` 파일이름을 `mysum.py`로 저장한다.\n",
"\n",
"`-` anaconda prompt에서 `mysum.py`파일이 저장된 폴더로 이동 -\\> 실행\n",
"\n",
" (base) C:\\Users\\python>cd Desktop\n",
"\n",
" (base) C:\\Users\\python\\Desktop>dir\n",
" C 드라이브의 볼륨에는 이름이 없습니다.\n",
" 볼륨 일련 번호: 9AFD-A05F\n",
"\n",
" C:\\Users\\python\\Desktop 디렉터리\n",
"\n",
" 2022-03-27 오전 11:32 .\n",
" 2022-03-27 오전 11:32 ..\n",
" 2022-03-27 오전 12:01 2,306 Chrome.lnk\n",
" 2022-03-26 오후 08:32 2,332 Microsoft Edge.lnk\n",
" 2022-03-27 오전 11:33 71 mysum.py\n",
" 3개 파일 4,709 바이트\n",
" 2개 디렉터리 743,643,467,776 바이트 남음\n",
"\n",
" (base) C:\\Users\\python\\Desktop>python mysum.py\n",
" 55\n",
"\n",
" (base) C:\\Users\\python\\Desktop>\n",
"\n",
"`-` 소감\n",
"\n",
"- 편한점1: 마우스를 이용하여 이동가능\n",
"- 편한점2: 내가 작업한 내용은 바탕화면의 메모장에 저장이 되어있음\n",
"- 아쉬운점: ipython의 장점은 활용못함 (구문강조, 도움말기능)\n",
"\n",
"# 3세대 프로그래머\n",
"\n",
"`-` 3세대 프로그래머: 메모장 + ipython\n",
"\n",
"`-` 전체적인 개발방식\n",
"\n",
"- 메모장: 코드를 편집, 저장\n",
"- ipython: **anaconda prompt처럼 메모장의 코드를 실행하고 결과를\n",
" 확인** + 구문강조, 도움말확인기능 등을 이용하여 짧은 코드를 빠르게\n",
" 작성\n",
"\n",
"`-` 기능\n",
"\n",
"- ipython에서 **!python mysum.py**를 입력하면 anaconda prompt에서\n",
" **python mysum.py**를 입력한 것과 같은 효과\n",
"- ipython에서 **%run mysum**을 입력하면 메모장에서 mysum.py에 입력된\n",
" 내용을 복사해서 ipython에 붙여넣어 실행한것과 같은 효과\n",
"\n",
"# 4세대 프로그래머\n",
"\n",
"`-` 4세대 프로그래머: IDE(통합개발환경)를 사용\n",
"\n",
"`-` 메모장과 ipython을 하나로 통합한 프로그램이 등장!\n",
"\n",
"- jupyter notebook, jupyter lab\n",
"- spyder\n",
"- idle\n",
"- VScode\n",
"- …\n",
"\n",
"`-` 주피터의 트릭 (실제로 주피터는 ipython에 기생할 뿐 아무런 역할도\n",
"안해요)\n",
"\n",
"1. 주피터를 실행\n",
"\n",
"2. 새노트북을 생성 (파이썬으로 선택)\n",
"\n",
"- 컴퓨터는 내부적으로 ipython을 실행하고 그 ipython이랑 여러분이\n",
" 방금만든 그 노트북과 연결\n",
"\n",
"1. 처음보이는 cell에 1+1을 입력 -\\> 쉬프트엔터 -\\> 결과2가 출력\n",
"\n",
"- 처음보이는 cell하나 = 자동으로 열린 하나의 메모장\n",
"- cell 1+1을 입력 = 메모장에 1+1을 적음\n",
"- 쉬프트+엔터후 결과2를 출력 = cell의 내용을 복사 -\\> ipython에\n",
" 붙여넣음 -\\> ipython 계산된 결과를 복사 -\\> cell로 돌아와 붙여넣기\n",
"\n",
"1. 새로운 cell을 추가하고 2+2을 입력 -\\> 쉬프트엔터 -\\> 결과4가 출력\n",
"\n",
"- 새로운 cell을 추가 = 새로운 메모장 추가\n",
"- cell 2+2을 입력 = 새로운 메모장에 2+2를 적음\n",
"- 쉬프트+엔터후 결과4를 출력 = cell의 내용을 복사 -\\> ipython에\n",
" 붙여넣음 -\\> ipython 계산된 결과를 복사 -\\> cell로 돌아와 붙여넣기\n",
"\n",
"`-` 중요한 사실들\n",
"\n",
"- IDE는 내부적으로 연산을 수행하는 능력이 없다. (생각해볼것: 왜 R을 꼭\n",
" 설치하고 Rstudio를 설치해야 했을까?)\n",
"- 주피터에서 커널을 재시작한다는 의미는 메모장이 열린채로 ipython을\n",
" 껐다가 다시 실행한다는 의미\n",
"- 주피터는 단순히 ’메모장의 내용을 복사하여 붙여넣는 기계’라고 볼 수\n",
" 있다. 이렇게 생각하면 주피터는 꼭 ipython에 연결할 이유는 없다.\n",
" 실제로 주피터에 R을 연결해서 쓸 수 있다. **즉 하나의 IDE가 여러개의\n",
" 언어와 연결될 수 있다.**\n",
"- Jupyterlab이라는 프로그램은 크롬에 있는 내용과 ipython간의 통신을\n",
" 제어하는 프로그램일 뿐이다.\n",
"\n",
"# 5세대 프로그래머\n",
"\n",
"`-` 5세대 프로그래미: 가상컴퓨터(anaconda), 원격컴퓨터(server),\n",
"클라우드컴퓨터(colab)의 개념 등장\n",
"\n",
"`-` 지금까지는 ipython이 실행되는 컴퓨터와 크롬이 실행되는 컴퓨터가\n",
"동일하다는 전제였음.\n",
"\n",
"`-` 생각해보니까 어차피 ipython이 실행된 컴퓨터에서 내가 크롬에 입력한\n",
"명령 “전달”되기만 하면 되므로 꼭 같은 컴퓨터일 필요는 없다.\n",
"\n",
"## 모델1: 원격컴퓨터\n",
"\n",
"`-` 준비상태\n",
"\n",
"- 전북대컴퓨터: ipython을 실행 + 이 컴퓨터는 인터넷 연결이\n",
" 되어있어야함\n",
"- 우리집노트북: 크롬실행 + 이 컴퓨터도 인터넷이 연결되어 있어야함\n",
"\n",
"`-` 명령입력\n",
"\n",
"- 우리집노트북 크롬에서 1+1을 입력하고 쉬프트 엔터를 누름\n",
"\n",
"`-` 우리집노트북 -\\> 전북대컴퓨터\n",
"\n",
"- 우리집 노트북의 내부의 어떤프로그램은 1+1이라는 명령을 복사하여\n",
" 카카오톡으로 전북대 컴퓨터에 전달\n",
"- 전북대 컴퓨터의 내부의 어떤프로그램은 1+1이라는 명령을 카톡으로\n",
" 받아서 그것을 ipython에게 전달\n",
"\n",
"`-` 전북대컴퓨터 -\\> 우리집노트북\n",
"\n",
"- 전북대컴퓨터 내부의 ipython은 2라는 출력결과를 계산함\n",
"- 전북대컴퓨터 내부의 어떤프로그램은 계산결과를 카톡으로 우리집\n",
" 노트북에 알려줌\n",
"- 나는 우리집 노트북에서 계산결과를 받아볼 수 있다.\n",
"\n",
"## 모델2: 원격컴퓨터 + 가상컴퓨터\n",
"\n",
"`-` 준비상태\n",
"\n",
"- 성능좋은 전북대 컴퓨터 1개\n",
"- 내 노트북 1개 (그냥 싸고 가벼운거)\n",
"- 대학원생 아이패드 1개 (그냥 싸고 가벼운거)\n",
"\n",
"`-` 아이디어\n",
"\n",
"- 성능좋은 전북대 컴퓨터를 논리적으로 3개로 분리 $\\to$ 이를 각각\n",
" (base) (py39jl17) (py38r40) 컴퓨터라고 하자.\n",
"- 나는 (py39jl17)에 접속하여 파이썬 3.9와 줄리아 1.7을 설치한뒤\n",
" 실습한다.\n",
"- 대학원생은 (py38r40)에 접속하여 파이썬 3.8과 R 4.0을 설치하고\n",
" 실습한다.\n",
"- (base)는 예비용으로 아무것도 설치안한 깨끗한 상태 유지\n",
"- 내가 뭘 실수해서 (py39jl17)컴퓨터가 망가졌으나 (py38r40)은 아무\n",
" 타격없다.\n",
"- 나는 (py39jl17)를 삭제하고 (base)로 부터 다시 새로운 컴퓨터를\n",
" 복사하여 (py39jl17)을 다시 만든다.\n",
"\n",
"## 모델3: 가상컴퓨터\n",
"\n",
"`-` 여러분들 사례\n",
"\n",
"- 여러분들의 컴퓨터는 (base), (py39) 2개의 컴퓨터로 나누어져 있음\n",
"- 여러분들이 (py39)에만 주피터랩을 설치\n",
"- (py39)에 있는 ipython과 여러분의 크롬창이 서로 통신하면서 실습\n",
"- 장점: 서로 다른 환경에 서로다른 파이썬과 R등을 설치할 수 있다. $\\to$\n",
" 패키지간의 충돌이 최소화 (파이썬 입문 수업을 듣고, 이후에 파이썬을\n",
" 이용하는 어떤수업을 들음)\n",
"\n",
"## 모델4: 클라우드\n",
"\n",
"`-` 사례1\n",
"\n",
"- 성능이 그저그런 컴퓨터 27개\n",
"- 대학원생을 포함하여 쓸 사람은 5명\n",
"- 한사람당 27/5(=5.4)대의 컴퓨터식 할당\n",
"\n",
"`-` 사례2: 구글코랩\n",
"\n",
"- 구글에 여러가지 성능을 가진 컴퓨터가 $n$대 있음\n",
"- $m$명의 사람이 $n$대의 컴퓨터에 접속\n",
"- 적당히 컴퓨터 자언을 분배하여 사용\n",
"\n",
"# 요약 및 정리\n",
"\n",
"`-` 결국 (1) 컴퓨터에 (2) 파이썬을 설치하고 (3) 실행하는 과정은 생각보다\n",
"다양한 선택의 조합이 가능하다.\n",
"\n",
"1. 그냥 내 노트북에 파이썬을 설치할지? 내 노트북안에 가상컴퓨터를\n",
" 만들고 거기에 파이썬을 설치할지? 학교의 데스크탑에 파이썬을 설치하고\n",
" 쓸지? 설치를 안하고 구글컴퓨터에 설치된 파이썬을 난 쓰기만 할지?\n",
"\n",
"2. python설치할지? ipython를 설치할지? 어차피 가상환경을 쓸꺼니가\n",
" anaconda를 설치할지? 아니면 코랩쓸꺼니까 설치안할지?\n",
"\n",
"3. 어떤 IDE를 쓸지? IDE를 쓰지 않을지? 내가 IDE를 직접구성해서 만들지?\n",
"\n",
"**하지만 공통적으로 관통하는 원리가 있다**"
],
"id": "1084ec0e-a63f-453d-87fd-9bb9e942c12c"
}
],
"nbformat": 4,
"nbformat_minor": 5,
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"codemirror_mode": {
"name": "ipython",
"version": "3"
},
"file_extension": ".py",
"mimetype": "text/x-python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.16"
}
}
}