From f76f73d76877dcd71de0054503b10da0b6801852 Mon Sep 17 00:00:00 2001 From: kangwonlee Date: Tue, 19 Mar 2024 01:29:42 +0000 Subject: [PATCH] Add Github badges or remove ipynb `id`s --- 00_introduction/20_python_review.ipynb | 7868 +++++++++++------------- 1 file changed, 3580 insertions(+), 4288 deletions(-) diff --git a/00_introduction/20_python_review.ipynb b/00_introduction/20_python_review.ipynb index 79c4cb3b..6752561f 100644 --- a/00_introduction/20_python_review.ipynb +++ b/00_introduction/20_python_review.ipynb @@ -1,4290 +1,3582 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "rL0hrYb_IMna" - }, - "source": [ - "# 파이썬 프로그래밍 언어
Python Programming Language\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "CTgc2JfbIMnc" - }, - "source": [ - "## `print(\"abc\")`\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "KLboSKUpIMnc" - }, - "source": [ - "* To print something on the screen, call function `print()`
`print()` 함수를 호출하여 화면에 표시\n", - "* Arguments of the functions are between `(` and `)`
`(` 와 `)`의 사이는 함수의 매개변수\n", - "* Arguments influence how the function behaves
매개변수는 함수의 거동에 영향을 미침\n", - "* Recall function $f(x)=x^2$ of the math
수학의 함수 $f(x)=x^2$ 와 비슷\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "YU052dfBIMnd" - }, - "outputs": [], - "source": [ - "print(\"string literal\")\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "fRWrCQsmIMne" - }, - "outputs": [], - "source": [ - "print(\"문자열 상수\")\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "2YyOaoU6IMne" - }, - "outputs": [], - "source": [ - "print(1 + 2)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Uva38BbkIMne" - }, - "source": [ - "What operation does `/` do ?
`/`연산자는 어떤 연산을 수행하는가?
What are the differences between `/` and `//` ?
`/` 와 `//` 연산자의 차이점은?\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "2mAZxPb2IMne" - }, - "outputs": [], - "source": [ - "print(\"60 divide by 2 equals\", 60 / 2)\n", - "60 // 2 # last result of this cell 이 셀의 마지막 결과\n", - "# Comment 주석문\n", - "# <- phrases after this symbol are for readers; python would ignore\n", - "# <- 이 기호 뒤는 읽는 사람을 위한 것으로 파이썬은 무시\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "0wDK2RNeIMne" - }, - "outputs": [], - "source": [ - "print(48/2, 48//2)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "d4b74wmcIMnf" - }, - "outputs": [], - "source": [ - "print(45//2, 45/2)\n", - "\n" - ] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "KHB22SCeIMnf" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "5ie944boIMnf" - }, - "outputs": [], - "source": [ - "print(33//4, 33/4)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Ttx_Rt4DIMnf" - }, - "outputs": [], - "source": [ - "print(10/3)\n", - "# How many digits below decimal points?\n", - "# 소숫점 아래 몇자리 까지?\n", - "print(\"##123456789012345678901234567890\")\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "RzSn5E-SIMnf" - }, - "outputs": [], - "source": [ - "10//3\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "emqrYqKJIMng" - }, - "source": [ - "What about `%` or `**` ?
`%` 나 `**` 는 어떠한가?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "LsDJHSquIMng" - }, - "outputs": [], - "source": [ - "10 % 3, 11 % 3, 12 % 3\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "xNMmJIZ1IMng" - }, - "outputs": [], - "source": [ - "10 % 4, 10 % 5, 10 % 6\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "N8DRAilNIMng" - }, - "outputs": [], - "source": [ - "(10 // 3) * 3\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "iKUj-oX5IMng" - }, - "outputs": [], - "source": [ - "(10 // 3) * 3 + (10 % 3)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ClFKgp_AIMng" - }, - "outputs": [], - "source": [ - "10 // 3.6, 10 % 3.6\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "D7GBPh-VIMnh" - }, - "outputs": [], - "source": [ - "2 ** 5 # Can you see the result of this operation? 이 연산의 결과를 볼 수 있는가?\n", - "print(\"2 ** 6 =\", 2 ** 6)\n", - "print(\"3 ** 3 =\", 3 ** 3)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "For more operators of python, please see :
파이썬에서 사용되는 연산자 목록 :
https://docs.python.org/3/library/operator.html\n", - "\n" - ], - "metadata": { - "id": "F6coK3W5IMnh" - } - }, - { - "cell_type": "markdown", - "metadata": { - "id": "C_oGXHrZIMnh" - }, - "source": [ - "Numeric literals with `_` for readability
가독성을 위해 숫자 상수 표시에 `_` 사용\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Mr_91KVRIMnh" - }, - "outputs": [], - "source": [ - "10_000_000 * 2\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "HKgpln10IMnh" - }, - "outputs": [], - "source": [ - "0.000_010 * 2\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "1DSsANV4IMnh" - }, - "source": [ - "## 변수
Variables\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "3PXQ8K7MIMnh" - }, - "outputs": [], - "source": [ - "_17\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EAMqH90rIMnh" - }, - "source": [ - "### Integers
정수\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "gais223UIMni" - }, - "outputs": [], - "source": [ - "a = 1\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "o_0U-J3dIMni" - }, - "source": [ - "여기서 `=` 을 *할당 연산자* 라고 한다.
Here, we call `=` an *assignment operator*.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "po_NhwDvIMni" - }, - "source": [ - "The phrase `a = 1` directs python to prepare a storage, store an integer 1, and label the storage as `a`.
\n", - "위 문장 `a = 1`의 의미는
파이썬에게 구두상자를 하나 준비해서 그 안에 정수 1을 넣고
구두상자에 `a`라는 이름표를 붙이라는 뜻
\n", - "Now we have variable `a` containing integer `1`.
\n", - "이렇게 해서 정수 `1`을 담은 변수 `a`가 생성\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JUPLwfPkIMni" - }, - "source": [ - "We can inspect the content of the variable `a` as follows.
\n", - "변수 `a`의 내용을 살펴 보고 싶으면 아래와 같이 가능\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "vH1RH_ZVIMni" - }, - "outputs": [], - "source": [ - "a\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "6rkTpK4GIMni" - }, - "outputs": [], - "source": [ - "print(\"a 안에 들어 있는 것은\", a)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ejbCG8aTIMni" - }, - "source": [ - "We can also make another variable `b` as follows.
또 다른 변수 `b`를 다음과 같이 생성할 수 있음\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "tgure9h9IMni" - }, - "outputs": [], - "source": [ - "b = 2\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "GEcTr27HIMnj" - }, - "outputs": [], - "source": [ - "b\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7-1EzTBwIMnj" - }, - "source": [ - "We can add two variables, too.
\n", - "이렇게 만든 두 변수의 값으로 연산도 할 수 있음\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "FVHnG53WIMnj" - }, - "outputs": [], - "source": [ - "a + b\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Zc5fUsbLIMnn" - }, - "source": [ - "### Strings
문자열\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "jFDIlBJuIMnn" - }, - "outputs": [], - "source": [ - "c = '11'\n", - "print(\"c =\", c)\n", - "d = \"22\"\n", - "print(\"d =\", d)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "vjW2H0CAIMno" - }, - "source": [ - "What is the result of the following cell?
\n", - "아래 행의 결과는?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ukQpr99RIMno" - }, - "outputs": [], - "source": [ - "print(\"c + d =\", c+d)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Zxq-YLpxIMno" - }, - "outputs": [], - "source": [ - "cc = 'abc'\n", - "dd = '가나다'\n", - "print(cc + dd)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "r7_PVpgyIMno" - }, - "source": [ - "In Python, the results of integer `+` integer and string `+` string would be different.
파이썬에서는 + 연산의 대상이 정수 정수인지 아니면 문자열 문자열인지에 따라 결과가 달라짐.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "9H1h7qrsIMno" - }, - "outputs": [], - "source": [ - "aaa = 123\n", - "bbb = 4\n", - "aaa * bbb\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "E43tNyr8IMno" - }, - "outputs": [], - "source": [ - "ccc = \"123\"\n", - "ddd = 4\n", - "ccc * ddd\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hqMaMsm3IMno" - }, - "source": [ - "We can use `repr()` to check whether a variable contains a string or an integer
\n", - "`repr()` 로 어떤 변수가 문자열을 담고 있는지 아니면 정수를 담고 있는지 알 수 있음.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "HUpD21z_IMno" - }, - "outputs": [], - "source": [ - "cc = \"11\"\n", - "print(\"cc =\", str(cc))\n", - "print(\"cc =\", repr(cc))\n", - "\n", - "dd = 22\n", - "print(\"dd =\", str(dd))\n", - "print(\"dd =\", repr(dd))\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "21Rwcr75IMnp" - }, - "source": [ - "### Complex numbers
복소수\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "z_oIZKlgIMnp" - }, - "outputs": [], - "source": [ - "a = (-1) ** (0.5)\n", - "a\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "9vcYSjraIMnp" - }, - "source": [ - "Real part 실수부\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "tCX7ptl5IMnp" - }, - "outputs": [], - "source": [ - "a.real\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lB3QEsUOIMnp" - }, - "source": [ - "Imaginary part 허수부\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "FRsu28ZCIMnp" - }, - "outputs": [], - "source": [ - "a.imag\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "F6mli_-GIMnq" - }, - "outputs": [], - "source": [ - "a = 2 + 3j\n", - "b = 3\n", - "c = a * b\n", - "c\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "-GAfWXf9IMnq" - }, - "outputs": [], - "source": [ - "# c의 실수부\n", - "c.real\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "hTL_ztM8IMnq" - }, - "outputs": [], - "source": [ - "# c의 허수부\n", - "c.imag\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "P9w20-FYIMnq" - }, - "source": [ - "conjugate complex number 켤레복소수\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "0mJlRb5SIMnq" - }, - "outputs": [], - "source": [ - "a = 5 + 2j\n", - "b = 5 - 2j\n", - "a * b\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "sqkEz1dBIMnr" - }, - "source": [ - "## 문자열 내삽
String interpolation\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Sometimes it is necessary to indicate information in a specific format.
때로 정보를 특정 형식에 맞추어 표시할 필요가 있다.\n", - "\n" - ], - "metadata": { - "id": "t5E65U35IMnr" - } - }, - { - "cell_type": "code", - "source": [ - "print(\"result =\", 10/3, \"mm\")\n", - "\n" - ], - "metadata": { - "id": "SScOY871IMnr" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "print(f\"result = {10/3:.4f} mm\")\n", - "\n" - ], - "metadata": { - "id": "qkOlweG8IMnr" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "sgpqLBgBIMns" - }, - "source": [ - "### `%`\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "j85pCcdPIMns" - }, - "outputs": [], - "source": [ - "a = 1\n", - "b = 2\n", - "# 여기서 % 연산자의 역할은?\n", - "print(\"%d + %d = %d\" % (a, b, a+b))\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "DNcakdWJIMns" - }, - "outputs": [], - "source": [ - "\"%d + %d = %d\" % (a, b, a+b)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "k2T7rz1EIMnt" - }, - "source": [ - "What if `%` is missing?
`%`이 없다면?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "JEPkkDymIMnt" - }, - "outputs": [], - "source": [ - "a = 1\n", - "b = 2\n", - "print(\"%d + %d = %d\" , (a, b, a+b))\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Bq6rAXZfIMnt" - }, - "source": [ - "C code example
\n", - "C code 예제\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Fxe0_WuuIMnt" - }, - "outputs": [], - "source": [ - "%%writefile hello.c\n", - "#include \n", - "\n", - "void main()\n", - "{\n", - "\tint a = 1;\n", - "\tconst int b = 2;\n", - "\tprintf(\"%d + %d = %d\\n\", a, b, a+b);\n", - "}\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "rmxFDfhEIMnu" - }, - "outputs": [], - "source": [ - "!hexdump -C hello.c\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "UzAx2aaJIMnu" - }, - "source": [ - "Complile : generate the machine code in binary numbers
\n", - " 컴파일 : 이진수로 된 기계어 코드 생성\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "fy-689zUIMnu" - }, - "outputs": [], - "source": [ - "!gcc hello.c\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Hxib---hIMnu" - }, - "source": [ - "Running the binary code
이진 코드 실행\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "vFUPuTjYIMnv" - }, - "outputs": [], - "source": [ - "!./a.out\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ifOT1pLXIMnv" - }, - "outputs": [], - "source": [ - "!hexdump -C a.out\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "yJRtoHkHIMnv" - }, - "source": [ - "Conversion specifiers
\n", - "출력 형식\n", - "* Reference : https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting\n", - "* 참고 : https://wikidocs.net/13#_17\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "dVxFGr-jIMnv" - }, - "outputs": [], - "source": [ - "a = 1\n", - "b = 2\n", - "print(\"%s + %s = %s\" % (a, b, a+b))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "dCl-2iVPIMnv" - }, - "outputs": [], - "source": [ - "a = 1.6\n", - "b = 2\n", - "print(\"%s + %s = %s\" % (a, b, a+b))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "dzgYaubwIMnw" - }, - "outputs": [], - "source": [ - "a = 1.6\n", - "b = 2\n", - "print(\"%d + %d = %d\" % (a, b, a+b))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "4DGsxwmrIMnw" - }, - "outputs": [], - "source": [ - "a = 1.6\n", - "b = 2\n", - "print(\"%f + %f = %f\" % (a, b, a+b))\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "In the example below, what do you think about the roles of numbers between `%` and `f`?
\n", - "아래 예에서 `%` 와 `f` 사이의 숫자들의 역할에 대해 어떻게 생각하는가?\n", - "\n" - ], - "metadata": { - "id": "eShpOSyUIMnw" - } - }, - { - "cell_type": "code", - "source": [ - "a = 1.6\n", - "b = 2\n", - "print(\"%12f + %8.4f = %010.2f\" % (a, b, a+b))\n", - "# text column ruler\n", - "# 문자 위치 자\n", - "print(\"1234567890\"*4)\n", - "\n" - ], - "metadata": { - "id": "nt2oPPLoIMnw" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "RI7pgaOLNp9e" - }, - "outputs": [], - "source": [ - "a = 0.000000000000064932\n", - "b = 234560000000000000\n", - "print(\"%f * %f = %f\" % (a, b, a*b))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "lXLwmGX2IMnw" - }, - "outputs": [], - "source": [ - "a = 0.000000000000064932\n", - "b = 234560000000000000\n", - "print(\"%e + %e = %e\" % (a, b, a*b))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "cpOf50yuIMnw" - }, - "outputs": [], - "source": [ - "a = 0.000000000000064932\n", - "b = 234560000000000000\n", - "print(\"%+g * %+g = %+g\" % (a, b, a*b))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Uej3Qm9KIMnw" - }, - "outputs": [], - "source": [ - "a = 1.0\n", - "b = 2\n", - "c = a * b\n", - "print(\"%s * %s = %s\" % (a, b, c))\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "dYJW6Y2oIMnw" - }, - "outputs": [], - "source": [ - "aa = \"real 1.0\"\n", - "bb = 3\n", - "cc = aa * bb\n", - "print(\"%s * %s = %s\" % (aa, bb, cc))\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "2wv5NsXyIMnx" - }, - "source": [ - "`%r`, `%a` : `repr()`\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "682fK3jqIMnx" - }, - "outputs": [], - "source": [ - "aa = \"real 1.0\"\n", - "bb = 3\n", - "cc = aa * bb\n", - "print(\"%a * %a = %a\" % (aa, bb, cc))\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "GLRFgvJaIMnx" - }, - "outputs": [], - "source": [ - "aa = \"real 1.0\"\n", - "bb = 3\n", - "cc = aa * bb\n", - "# 아래는 Try Except Block\n", - "# \"예외 처리\"를 위함\n", - "try:\n", - " # Error!\n", - " print(\"%f * %f = %f\" % (aa, bb, cc))\n", - "except TypeError as e:\n", - " print(e)\n", - "# Try Exception Block 끝\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Escape sequence
\n", - "* Reference : https://docs.python.org/3/reference/lexical_analysis.html#escape-sequences\n", - "* 참고 : http://www.ktword.co.kr/test/view/view.php?no=481\n", - "\n" - ], - "metadata": { - "id": "aUIOvCqdTGeL" - } - }, - { - "cell_type": "code", - "source": [ - "dd = 'a\\tb'\n", - "print('%s' % dd)\n", - "\n" - ], - "metadata": { - "id": "wx2c4LWZIMnx" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "print('%r' % dd)\n", - "\n" - ], - "metadata": { - "id": "CqSmvYKlIMnx" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wmBSyPXfIMnx" - }, - "source": [ - "### `.format()`\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "wv8z2iQfIMny" - }, - "outputs": [], - "source": [ - "print(\"{} + {} = {}\".format(a, b, a+b))\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "IRZ7_QhHIMny" - }, - "source": [ - "### f-string\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Since python 3.6, f-string is available. (Possibly the most popular)
\n", - "python 3.6 이후 f 문자열을 사용할 수 있다. (아마도 가장 널리 사용)\n" - ], - "metadata": { - "id": "I4zc6cHAIMny" - } - }, - { - "cell_type": "markdown", - "source": [ - "Unlike the other methods above, f-string enables co-locating the values and their respective locations within the string itself.
이전의 방식들과는 달리, f-문자열은 문자열 안에서 값과 위치를 일치시킬 수 있다.\n" - ], - "metadata": { - "id": "Q9SwRlphIMny" - } - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "vRicsyF1IMny" - }, - "outputs": [], - "source": [ - "print(f\"{a} + {b} = {a+b}\")\n", - "\n" - ] - }, - { - "cell_type": "code", - "source": [ - "print(f\"{a:f} + {b:16e} = {(a+b):010.2e}\")\n", - "\n" - ], - "metadata": { - "id": "azAkf-PTIMny" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "m_a2DtR3IMny" - }, - "source": [ - "## 함수
Functions\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lPZIC-7bIMnz" - }, - "source": [ - "자주 반복되는 코드는 함수로 모아 두면 편리하다.
\n", - "It is convenient to wrap a frequently used code block into a function.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "yCQR1HtVIMnz" - }, - "outputs": [], - "source": [ - "print(2 * 'abc')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8TShFfzxIMnz" - }, - "source": [ - "파이썬 함수는 `def` 로 시작한다.
`def` keyword indicates the beginning of a function.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "yyhrsUcjIMnz" - }, - "source": [ - "`def` 다음에는 함수의 이름이 자리한다.
Next to the `def` keyword is the name of the function.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "2af9ll96IMnz" - }, - "source": [ - "함수의 이름 뒤의 `(` `)` 안에는 매개변수가 들어간다.
The arguments are in the `(` `)` after the name.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "u_3dcNJ7IMnz" - }, - "source": [ - "함수의 내용에 해당하는 행은 들여쓰기로 표시한다.
The lines belong to the function are indented.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3TcSDXumIMn0" - }, - "source": [ - "`return` 으로 결과를 반환한다.
Values after the `return` will be the results of the function.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "SGisNE-kIMn0" - }, - "outputs": [], - "source": [ - "def twice(x):\n", - " return 2 * x\n", - "# end of indentation indicates the end of the function\n", - "# 들여쓰기가 끝나는 곳은 함수의 끝\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "M5N8Rw5sIMn0" - }, - "source": [ - "아래는 함수를 호출 한 예 이다.
\n", - " We can call a function as follows.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "w51SzukUIMn0" - }, - "source": [ - "함수의 이름 뒤에 괄호 `(` `)` 를 열고 전달할 매개변수 값을 나열한 뒤 괄호를 닫는다.
\n", - " Between the parenthesis `(` `)` after the function name, list the parameter valuse.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "MgUixftiIMn0" - }, - "outputs": [], - "source": [ - "twice(12)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "eRgqcNCKIMn0" - }, - "outputs": [], - "source": [ - "twice('abc')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "E7-8O3YtIMn0" - }, - "source": [ - "In iPython, `_` indicates the result from the previous cell.
iPython 에서 `_` 는 이전 셀의 결과를 가리킨다.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "EZFyRPSKIMn1" - }, - "outputs": [], - "source": [ - "_\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "G1UkVzO1IMn1" - }, - "outputs": [], - "source": [ - "twice(_)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "UKhiiRWPIMn1" - }, - "source": [ - "여기서 함수 `twice()` 가 반환한 값은 변수 `b`에 저장된다.
Here, the returned value from the function `twice()` is stored in the variable `b`.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Fkj8SZQvIMn1" - }, - "outputs": [], - "source": [ - "b = twice('a')\n", - "print(b)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "DOKmbUUTIMn1" - }, - "outputs": [], - "source": [ - "twice('zzz')\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Benefits of functions
함수의 장점\n", - "* More readable.
더 읽기 좋다.\n", - "* More maintainable.
관리하기 좋다.\n", - "* Reusable.
재사용할 수 있다.\n", - "\n" - ], - "metadata": { - "id": "pQcU15iOIMn1" - } - }, - { - "cell_type": "markdown", - "metadata": { - "id": "zPMNF86-IMn1" - }, - "source": [ - "### 변수의 유효범위
Scope of variables\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The variables defined within a function is created when the function is called and deleted when the function returns. We call them **local variables**.
함수 안에서 정의된 변수는 함수가 호출될 때 생기고 함수가 반환할 때 사라진다. 이러한 변수를 **지역변수** 라고 부른다.\n", - "\n" - ], - "metadata": { - "id": "QIN_QX0XIMn2" - } - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HGkdRt2NIMn2" - }, - "source": [ - "Outside of a function, the local variables defined inside are not accessable.
함수 안에서 정의된 지역 변수는 함수 밖에서 읽을 수 없다.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "OMg0V-F7IMn2" - }, - "outputs": [], - "source": [ - "def can_you_read_b(x):\n", - " b_in_function = 2\n", - " print(\"b_in_function =\", b_in_function)\n", - " return b_in_function + x\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "81wjATakIMn2" - }, - "outputs": [], - "source": [ - "can_you_read_b(2)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "RDE2U6FKIMn2" - }, - "outputs": [], - "source": [ - "can_you_read_b(10)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "eucAzSi0IMn2" - }, - "outputs": [], - "source": [ - "try:\n", - " # 아래 행은 오류를 발생시킬 것이다.\n", - " # Following line would cause an error\n", - " print(\"b_in_function =\", b_in_function)\n", - "except NameError as e:\n", - " # 위 try: 와 except 사이에서 오류가 발생하면 아래 행이 실행\n", - " # In case of an error between try and except, following line runs\n", - " print(\"NameError:\",e)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "j0iePHviIMn2" - }, - "source": [ - "Within a function, the **global variables** defined outside are available.
함수 안에서는 함수 밖에 정의된 **전역변수** 값에 접근할 수 있다.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "uP5DePsGIMn3" - }, - "outputs": [], - "source": [ - "a = 100\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "BxaMbGDhIMn3" - }, - "outputs": [], - "source": [ - "def can_this_use_a(x):\n", - " print(\"a =\", a)\n", - " print(\"x =\", x)\n", - " return a + x\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "RZOjVHErIMn3" - }, - "outputs": [], - "source": [ - "can_this_use_a(3)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "ATTENTION : FUNCTIONS MAY OVERWRITE GLOBAL VARIABLES!!!
주의 : 함수가 전역변수를 덮어쓸 수 있다!!!\n", - "\n" - ], - "metadata": { - "id": "6LJmtpRZIMn3" - } - }, - { - "cell_type": "code", - "source": [ - "def can_this_change_a(x):\n", - " global a\n", - " print(\"before : a =\", a, \"x = \", x)\n", - " a = x\n", - " print(\"after : a =\", a, \"x = \", x)\n", - "\n" - ], - "metadata": { - "id": "C732ZdnWIMn3" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "can_this_change_a('new a value')\n", - "print('a =', a)\n", - "\n" - ], - "metadata": { - "id": "IDEDRR4XIMn3" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7WikK9qWIMn4" - }, - "source": [ - "함수 안의 변수가 우선한다.
\n", - "Variables inside of the function has higher priority.
\n", - "함수 안에서 변수값을 할당해도 함수 밖 변수 값에 영향을 주지 않는다.
\n", - "Assigining a variable within a function does not influence the variable outside of the function.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "BE42OSSKIMn4" - }, - "outputs": [], - "source": [ - "z = 1 # Global variable 전역변수\n", - "\n", - "def x_times_z(x):\n", - " z = 2 # Local variable 지역변수\n", - " print('z in the function =', z)\n", - " return x * z\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "DxeIOUuXIMn4" - }, - "outputs": [], - "source": [ - "print(x_times_z(z))\n", - "print(\"z outside of the function =\", z)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "t2XwIKsaIMn4" - }, - "source": [ - "### 함수의 기본 매개변수
Default Arguments\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "J0CGr5uhIMn4" - }, - "source": [ - "파이썬 함수를 정의할 때 매개변수에 기본값을 정해놓을 수 있다.
\n", - "One may designate a default value when defining a python function.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "54Ch5kQ5IMn4" - }, - "outputs": [], - "source": [ - "def ax_plus_b(x, a=2, b=3):\n", - "\n", - " print(f'x = {x}', end=', ')\n", - " print(f'a = {a}', end=', ')\n", - " print(f'b = {b}')\n", - "\n", - " return a * x + b\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "XEdjbm0uIMn5" - }, - "outputs": [], - "source": [ - "ax_plus_b(1, 4, 5)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "xa7-X8IDIMn5" - }, - "outputs": [], - "source": [ - "ax_plus_b(1)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "0MZBps8jIMn5" - }, - "outputs": [], - "source": [ - "ax_plus_b(1, 1)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "rv1W1Ur1IMn5" - }, - "outputs": [], - "source": [ - "ax_plus_b(1, b=1)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "AOtg3DYXIMn5" - }, - "source": [ - "### Callback Function
콜백함수\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "A callback function is a function (let's call this `f()`) you provide as an input argument to another function (and call this `s()`).
콜백함수(`f()`함수라고 하자)는 다른 함수(`s()`라고 하자)에 입력 매개변수로 전달하는 함수이다.
The \"another\" function `s()` will call your function `f()` with specific information or results as it runs.
함수`s()`가 실행 중 특정 싯점에 함수`f()`를 호출할 것이다.\n", - "\n" - ], - "metadata": { - "id": "ziQRlCoyIMn5" - } - }, - { - "cell_type": "markdown", - "metadata": { - "id": "E6epWjBgIMn5" - }, - "source": [ - "아래 두 함수가 주어져 있다.
Following two functions are given.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "uA0ztXgzIMn6" - }, - "outputs": [], - "source": [ - "def add(a, b):\n", - " print(f\"{a} + {b}\")\n", - " return a + b\n", - "\n", - "def mul(a, b):\n", - " print(f\"{a} * {b}\")\n", - " return a * b\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Pk5MTK7oIMn6" - }, - "source": [ - "아래와 같은 함수를 생각해 보자.
Let's consider a function as follows.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "2aoth8zDIMn6" - }, - "outputs": [], - "source": [ - "def s(f, aa, bb):\n", - " return f(aa, bb)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Uj9UCbcnIMn6" - }, - "source": [ - "Here, let's pass another function's name as the argument `f`.
여기서 매개변수 `f`로 다른 함수의 이름을 전달해 보자.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "WH_33dkuIMn6" - }, - "outputs": [], - "source": [ - "print(s(add, 1, 2))\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "2PH7dXOYIMn6" - }, - "outputs": [], - "source": [ - "print(s(mul, 1, 2))\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "X99JC7bIIMn6" - }, - "source": [ - "위 두 함수 호출의 결과에 대해 어떻게 생각하는가?
What do you think about the results of the two function calls above.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Also let's think about the following function.
또한 다음 함수를 생각해 보자.\n", - "\n" - ], - "metadata": { - "id": "H8H0vXXaIMn7" - } - }, - { - "cell_type": "code", - "source": [ - "def mini_reduce(f, aa, bb, cc):\n", - " # call f with aa and bb as arguments\n", - " # 함수 f 를 매개 변수로 aa 와 bb 를 써서 호츨\n", - " first_result = f(aa, bb)\n", - " # this time, result from the previous function call and cc as arguments\n", - " # 이번에는 위 호출의 결과와 cc를 매개변수로\n", - " second_result = f(first_result, cc)\n", - " return second_result\n", - "\n" - ], - "metadata": { - "id": "r8CGA5tfIMn7" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "adj_m = 3 # adjacent leg\n", - "opp_m = 4 # opposite leg\n", - "hyp_m = 5 # hypotenuse\n", - "\n", - "perimeter_m = mini_reduce(add, adj_m, opp_m, hyp_m)\n", - "print(perimeter_m)\n", - "\n" - ], - "metadata": { - "id": "Heyb6ixUIMn7" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "width_m = 3\n", - "depth_m = 4\n", - "height_m = 5\n", - "\n", - "box_volume_m3 = mini_reduce(mul, width_m, depth_m, height_m)\n", - "print(box_volume_m3)\n", - "\n" - ], - "metadata": { - "id": "ttuuvpG3IMn7" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "### `lambda`\n", - "\n" - ], - "metadata": { - "id": "LZX3WjK2IMn7" - } - }, - { - "cell_type": "markdown", - "metadata": { - "id": "_ZzsgWcsIMn8" - }, - "source": [ - "`lambda` defines an anonymous function.
`lambda`로 이름 없는 함수를 정의할 수 있다.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "BS411uy0IMn8" - }, - "outputs": [], - "source": [ - "print(s(lambda x, y: x/y, 15, 2))\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The cell above is (almost) equivalent to the following cell.
위 셀과 아래 셀은 효과가 (거의) 같다.\n", - "\n" - ], - "metadata": { - "id": "GeHCUjflIMn8" - } - }, - { - "cell_type": "code", - "source": [ - "def div(x, y):\n", - " return x/y\n", - "print(s(div, 15, 2))\n", - "\n" - ], - "metadata": { - "id": "Sewyh0OiIMn8" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "namespace\n" - ], - "metadata": { - "id": "kKS7kE3zIMn8" - } - }, - { - "cell_type": "code", - "source": [ - "list(filter(lambda name:not name.startswith('_'), dir()))\n" - ], - "metadata": { - "id": "GnKu8bDpIMn8" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "TrNHbaQFIMn9" - }, - "source": [ - "## 모음
Collection\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lOZmZ7lbIMn9" - }, - "source": [ - "모음은 여러 데이터를 한 **이름** 아래 저장한 것이다.
\n", - "Collection contains multiple data under one **name**.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-jAMr9rVIMn9" - }, - "source": [ - "Python 에서는 기본적으로 `list()`, `tuple()`, `dict()`, `set()` 과 같은 데이터 모음이 사용가능하다.
\n", - "In python, data collections such as `list()`, `tuple()`, `dict()`, and `set()` are available built-in.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "LProezJhIMn9" - }, - "source": [ - "### 리스트
List\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Z7LK5F33IMn9" - }, - "source": [ - "리스트는 순서 대로 몇개의 자료를 모은 것이다.
\n", - "A `list()` is a collection of data in a sequnce.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "HHaXi_kKIMn-" - }, - "outputs": [], - "source": [ - "x = list([1, 3, 5, 7, 9])\n", - "x\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "FdpEPVasIMn-" - }, - "source": [ - "`len()` 함수를 이용하여 리스트의 항목 수를 알 수 있다.
\n", - "Calling function `len()` one can find the number of items within a list.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "nUPLLSmmIMn-" - }, - "outputs": [], - "source": [ - "len(x)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "YUQ_Z2JPIMn-" - }, - "source": [ - "항목을 `[` `]` 로 둘러 싸서 만들 수도 있다.
\n", - "One can also make a list by wrapping items with `[` and `]`.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "YRClKJq7IMn-" - }, - "outputs": [], - "source": [ - "y = [1, 2, ['other', 'list'], 'python']\n", - "y\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "DtAkUaWfIMn-" - }, - "outputs": [], - "source": [ - "len(y)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "BsCao5FbIMn-" - }, - "source": [ - "문자열로부터 list를 만들 수도 있다.
\n", - "A list can be made from a string.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "-HI5QegEIMn_" - }, - "outputs": [], - "source": [ - "a_list = list('abc')\n", - "a_list\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5pRoh7ASIMn_" - }, - "source": [ - "항목을 추가할 수 있다.
We may add more items.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "I5AnsQETIMn_" - }, - "outputs": [], - "source": [ - "a_list.append('d')\n", - "a_list\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HH9GxuQWIMn_" - }, - "source": [ - "다른 list를 붙인 새로운 list를 만들 수도 있다.
We may make a new list by connecting multiple lists.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "b_xYPCzFIMn_" - }, - "outputs": [], - "source": [ - "z_list = a_list + ['yy', 'zzz']\n", - "z_list\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "KAkvZVlYIMn_" - }, - "source": [ - "#### 항목 지정
Indexing an item (or items)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "eDKJuKPXIMn_" - }, - "source": [ - "각 항목을 읽거나 쓰기 위해 인덱스로 순서를 지정한다.
\n", - "To access each item, you can indicate by its index.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MSC2KLszIMoA" - }, - "source": [ - "첫 항목의 인덱스는 0 이다. 이후는 1씩 증가한다.
\n", - "Index 0 indicates the first item. Afterward, it increases by one each.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "kjXPHcPGIMoA" - }, - "source": [ - "리스트 변수 이름 뒤 대괄호 `[` `]` 사이에 해당 인덱스 값을 넣는다.
\n", - "The index places between the brakets `[` `]` after the name of the list variable.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ahoW_tlbIMoA" - }, - "outputs": [], - "source": [ - "x\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "TVnlAYJ4IMoA" - }, - "outputs": [], - "source": [ - "x[0]\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "AlKz_eH5IMoA" - }, - "outputs": [], - "source": [ - "x[1]\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Ft4xL66rIMoB" - }, - "outputs": [], - "source": [ - "try:\n", - " # Error!\n", - " x(0)\n", - "except TypeError as e:\n", - " print(e)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "532LUDq0IMoB" - }, - "source": [ - "`-1` 은 마지막 항목을 가리킨다.
\n", - "`-` indicates the last item.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "mjobxuZtIMoB" - }, - "outputs": [], - "source": [ - "x[-1]\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "CCqbjF_QIMoB" - }, - "outputs": [], - "source": [ - "y[-1]\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JIPwtC6xIMoB" - }, - "source": [ - "`:` 로 여러 항목을 선택할 수도 있다. 이를 *슬라이싱* 이라고 한다.
\n", - "`:` can indicate multiple items. It is called *slicing*.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "5dyEpmcuIMoB" - }, - "outputs": [], - "source": [ - "z = list(range(20+1))\n", - "z\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "oLUuJ-d0IMoB" - }, - "outputs": [], - "source": [ - "z[2]\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "iSWml4QPIMoC" - }, - "outputs": [], - "source": [ - "z[:2]\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ZpQu8DcWIMoC" - }, - "source": [ - "위 결과에 `z[2]` 가 포함되었는가?
\n", - "Does the result above include `z[2]`?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "WDXPtrbtIMoC" - }, - "outputs": [], - "source": [ - "z[2:]\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "fZlj3caRIMoC" - }, - "source": [ - "위 결과에 `z[2]` 가 포함되었는가?
\n", - "Does the result above include `z[2]`?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "iBIeQb0_IMoC" - }, - "outputs": [], - "source": [ - "z[2:12]\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "kGCoIZoFIMoD" - }, - "source": [ - "이번에는 무엇이 달라졌는가?
\n", - "What is different this time?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "2W_l92XCIMoD" - }, - "outputs": [], - "source": [ - "z[2:12:2]\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Ja66POrNIMoD" - }, - "source": [ - "마지막 `:2`의 역할은 무엇인가?
\n", - "What is the role of the `:2` at the end?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "DNbCsk0PIMoD" - }, - "outputs": [], - "source": [ - "z[2:12:3]\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "7FS30whgIMoD" - }, - "outputs": [], - "source": [ - "z[2:12:4]\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "YJ4-tLOPIMoD" - }, - "source": [ - "`range()` 함수의 세 매개변수의 각각의 역할은 무엇인가?
\n", - "What are the respective roles of the three arguments of the `range()` function ?\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "_rt5Mjl3IMoD" - }, - "source": [ - "#### 소속 여부
Membership\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "YhA7hhSWIMoE" - }, - "source": [ - "`in` 연산자로 어떤 항목이 어떤 list 에 포함되어 있는지 알 수 있다.
\n", - "`in` operater can tell us if a list has a certain item.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "4_KcIld2IMoE" - }, - "outputs": [], - "source": [ - "z_list\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "SZiwFybnIMoE" - }, - "outputs": [], - "source": [ - "'a' in z_list\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "2lgMzPJnIMoE" - }, - "outputs": [], - "source": [ - "\"b\" in z_list\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "YxIVkht9IMoE" - }, - "outputs": [], - "source": [ - "'z' in z_list\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "baWqw1awIMoE" - }, - "outputs": [], - "source": [ - "'zzz' in z_list\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "8YxCIU74IMoE" - }, - "outputs": [], - "source": [ - "'z' in \"zzz\"\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "OIBQAfBwIMoF" - }, - "outputs": [], - "source": [ - "'zz' in \"zzz\"\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "RcQpuk7tIMoF" - }, - "source": [ - "### list & tuple\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "xdmxnGjVIMoF" - }, - "source": [ - "리스트 `list` 와 튜플 `tuple` 모두 여러 항목을 저장할 수 있다.
Both `list` and `tuple` can store multiple items.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "jtDdPB1DIMoF" - }, - "source": [ - "또한 각 항목을 순서로 구분한다.
Also, distinguish each item with the order.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "g9HN16ooIMoF" - }, - "source": [ - "리스트는 항목을 변경 추가 삭제할 수 있으나 (mutable) 튜플은 한번 만들어지면 변경할 수 없다 (immutable).
We may change, add, or remove items in lists (mutable) but we cannot with tuples (immutable).\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-IYbwnH3IMoF" - }, - "source": [ - "예를 들어 다음을 생각해 보자.
Let's check the followings.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "RD4sz6zDIMoF" - }, - "outputs": [], - "source": [ - "x_list = [1, 2, 3]\n", - "print(\"before :\", x_list)\n", - "x_list[0] = '0'\n", - "print(\"after :\", x_list)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "f7BzBpQiIMoG" - }, - "source": [ - "튜플 tuple 의 경우, 항목을 바꿀 수 없으므로 아래 예에서 예외 Exception 가 발생한다.
\n", - "Because a tuple does not allow chaning one of its items, following example would raise an Exception.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "NlAR3CjUIMoG" - }, - "outputs": [], - "source": [ - "try:\n", - " z_tuple = (4, 5, 6)\n", - " print(\"before :\", z_tuple)\n", - " # Error!\n", - " z_tuple[0] = '0'\n", - " print(\"after :\", z_tuple)\n", - "except TypeError as e:\n", - " print(e)\n", - " print('cannot change an item in tuple')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gWP_RkMjIMoG" - }, - "source": [ - "### 딕셔너리
Dictionary\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Fdzhm__-IMoG" - }, - "source": [ - "순서로 각 요소를 구분하는 list 나 tuple 과는 달리 `dict`는 key - value 쌍을 저장한다.
Unlike list or tuple distinguishing items by the sequence, `dict` stores key - value pairs.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "RqORg_tyIMoG" - }, - "outputs": [], - "source": [ - "a_dict = {\n", - " 'name': 'Iron', # key : 'name', value : 'Iron'\n", - " 'atomic no': 26, # key : 'atomic number', value : 26\n", - "}\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "L69rinw5IMoG" - }, - "outputs": [], - "source": [ - "a_dict\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "J6AT-fnZIMoH" - }, - "outputs": [], - "source": [ - "a_dict['name']\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "yTBOizsBIMoH" - }, - "outputs": [], - "source": [ - "a_dict['atomic no']\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JIVqLL90IMoH" - }, - "source": [ - "(하나 또는 여러개의) 새로운 key - value 쌍을 추가할 수도 있다.
One can add a new key - value pair(or pairs).\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "irAZUq_ZIMoH" - }, - "outputs": [], - "source": [ - "a_dict\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "TSJETb2vIMoH" - }, - "outputs": [], - "source": [ - "a_dict['atomic weight'] = 55\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "21jlTydIIMoH" - }, - "outputs": [], - "source": [ - "a_dict\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0MXzhwBfIMoH" - }, - "source": [ - "`in`\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "QhzGFBahIMoI" - }, - "outputs": [], - "source": [ - "'name' in a_dict\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "jsuJ2FvhIMoI" - }, - "outputs": [], - "source": [ - "a_dict.keys()\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "OBoFdCQWIMoI" - }, - "outputs": [], - "source": [ - "'name' in a_dict.keys()\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "iur71s2VIMoI" - }, - "outputs": [], - "source": [ - "'Iron' in a_dict\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "IroRh3q5IMoI" - }, - "source": [ - "#### `.get()`\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "z1lwp9efIMoI" - }, - "outputs": [], - "source": [ - "a_dict['name']\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "CPXSxd2IIMoJ" - }, - "outputs": [], - "source": [ - "a_dict.get('name')\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "1IALXhQHIMoJ" - }, - "outputs": [], - "source": [ - "'price' in a_dict\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "1SzBP6p7IMoJ" - }, - "outputs": [], - "source": [ - "try:\n", - " # Error!\n", - " a_dict['price']\n", - "except KeyError as e:\n", - " print(\"KeyError:\", e)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Cae8qGHrIMoJ" - }, - "outputs": [], - "source": [ - "# No error\n", - "a_dict.get('price')\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "YXze6GpjIMoJ" - }, - "outputs": [], - "source": [ - "a_dict.get('price', '''Does not have 'price' yet.''')\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "DMT-4OviIMoJ" - }, - "outputs": [], - "source": [ - "a_dict.get(\n", - " 'atomic no',\n", - " '''Does not have 'atomic no' yet.'''\n", - ")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "c66rE8ABIMoJ" - }, - "source": [ - "#### `.update()`\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "22QxLTELIMoK" - }, - "outputs": [], - "source": [ - "dict_b = {\n", - " 'atomic weight': 55.845,\n", - " 'poisson ratio': 0.29,\n", - "}\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "I7wctqJEIMoK" - }, - "outputs": [], - "source": [ - "dict_b\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "pNH8AceIIMoK" - }, - "outputs": [], - "source": [ - "a_dict\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "o6ooefboIMoK" - }, - "outputs": [], - "source": [ - "a_dict.update(dict_b)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "0UzmMsYpIMoL" - }, - "outputs": [], - "source": [ - "a_dict\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Conditional Execution and Iteration
조건문과 반복문\n", - "\n" - ], - "metadata": { - "id": "zcnPWv6eIMoL" - } - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lRmOYEkiIMoL" - }, - "source": [ - "### `if` `elif` `else`\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "dDrZb7FaIMoL" - }, - "source": [ - "어떤 논리 연산의 결과에 따라 특정 코드를 실행시키도록 할 수 있다.
\n", - "Depending on the result of a logical operation, we may activate a certain block of code to run.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "oUJDaUocIMoL" - }, - "outputs": [], - "source": [ - "a = 1\n", - "1 == a\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "uXKwFVTCIMoL" - }, - "outputs": [], - "source": [ - "if 1 == a:\n", - " print(\"Variable `a` contains one\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "c_mb5DdxIMoM" - }, - "source": [ - "결과에 따라 특정 코드를 대신 실행시키도록 할 수 있다.
\n", - "Depending on the result, we may make a different block of code to run.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "McorL4teIMoM" - }, - "outputs": [], - "source": [ - "a = 1\n", - "if 2 == a:\n", - " print(\"Variable `a` is equal to two\")\n", - "else:\n", - " print(\"Variable `a` is not equal to two\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "SZxbORgNIMoM" - }, - "source": [ - "또한 여러 논리식을 순차적으로 검토하여 실행할 코드를 선택할 수도 있다.
\n", - "Also, we may choose which code to run by evaluating a series of logical operations.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "G5slhlg-IMoM" - }, - "outputs": [], - "source": [ - "a = 0\n", - "if 0 < a:\n", - " print(\"Variable `a` is positive\")\n", - "elif 0 > a:\n", - " print(\"Variable `a` contains a negative number\")\n", - "elif 0 == a:\n", - " print(\"`a` is zero\")\n", - "elif 0 >= a:\n", - " print(\"`a` is zero or negative\")\n", - "else:\n", - " # 상정 이외의 경우에는 오류를 발생시켜야 할 수도 있다.\n", - " # On an exceptional case, we may need to raise one.\n", - " raise NotImplementedError\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "TCLa3kEdIMoM" - }, - "source": [ - "### `for` iterations
`for` 반복문\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "SuoOHefOIMoN" - }, - "source": [ - "어떤 작업을 정해진 횟수 만큼 반복시키고 싶다면 `for` 문을 사용할 수 있다.
\n", - "`for` loops for a fixed number of iterations.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "6HXzxS77IMoN" - }, - "outputs": [], - "source": [ - "for a in [1, 'a', 3, 'b', 5]:\n", - " print(a)\n", - " print(\"end of for block\")\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "SssloiJaIMoN" - }, - "outputs": [], - "source": [ - "for a in [1, 'a', 3, 'b', 5]:\n", - " print(a)\n", - "print(\"end of for block\")\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "PVUKch6UIMoN" - }, - "outputs": [], - "source": [ - "a = 'iteration'\n", - "\n", - "for i in [0, 'a', ['b', 2],]:\n", - " print(i, a)\n", - "\n", - "print(\"end of for block\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "yzlOgDmjIMoN" - }, - "source": [ - "위 셀에서 변수 `i` 는 `in` 다음의 list 안의 값을 하나씩 짚을 것이다.
In the cell above, the variable `i` will step over the values of the list following `in`.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "C-G9E06YIMoN" - }, - "source": [ - "`n` 번 반복시키려면 0 부터 `n-1` 까지 발생시키는 `range(n)` 을 사용할 수 있다.
\n", - "To loop `n` iterations, we can use `range(n)` that will generate from 0 to `n-1`.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ZrXcGlESIMoO" - }, - "outputs": [], - "source": [ - "a = 'iteration'\n", - "n = 5\n", - "\n", - "for i in range(n):\n", - " print(i, a)\n", - "\n", - "print(\"end of for block\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NL0GXRR3IMoO" - }, - "source": [ - "`range()` 를 이용하여 새로운 list를 만들어 갈 수도 있다.
\n", - "We may make a new list using the `range()`.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "qKpVmazoIMoO" - }, - "outputs": [], - "source": [ - "square = []\n", - "n = 10\n", - "\n", - "for i in range(n):\n", - " square.append(i * i)\n", - " print(\"i =\", i, \", square =\", square)\n", - "\n", - "print(square)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pfT8j9NUIMoO" - }, - "source": [ - "Arguments of the `range()` function
\n", - "`range()` 함수의 매개변수\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "6obFJTv1IMoO" - }, - "outputs": [], - "source": [ - "for i in range(1, 10+1, 2):\n", - " print(i, end=', ')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "1zufZ13qIMoO" - }, - "source": [ - "### `while` iterations
`while` 반복문\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "kbTAJ9TcIMoP" - }, - "source": [ - "Whenever possible, please use `for` loops.
가능하면 `for` 반복문을 사용하기 바람.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "21JMPKY_IMoP" - }, - "outputs": [], - "source": [ - "i = 0\n", - "while (i < 3):\n", - " i = i + 1\n", - " # what if line above missing?\n", - " # infinite loop\n", - " print(\"Is i ==\", i, \"less than 3 ?\", i < 3)\n", - "print(\"end of while loop\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Eu232M-ZIMoP" - }, - "source": [ - "## 파일 입출력
File I/O\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Q8go_joUIMoP" - }, - "source": [ - "파이썬에서 파일을 읽고 쓸 때는 `open()` 함수를 호출한다.
\n", - "To read from or write to a file in python, we can usually start with calling `open()`.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "xMktzpRSIMoP" - }, - "outputs": [], - "source": [ - "%%writefile hello.txt\n", - "Hello python!\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "wcHUAVH8IMoP" - }, - "outputs": [], - "source": [ - "fi = open(\"hello.txt\", 'rt')\n", - "print(fi.read())\n", - "fi.close()\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "usKrnMqEIMoQ" - }, - "source": [ - "* IPython magic command\n", - "* https://ipython.readthedocs.io/en/stable/interactive/magics.html#cellmagic-writefile\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "2xRpGICLIMoQ" - }, - "source": [ - "File write mode 파일 쓰기 모드\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "BoiTfakGIMoQ" - }, - "outputs": [], - "source": [ - "fo = open(\"sample.txt\", \"wt\")\n", - "fo.write(\"Hello Python!\\n\")\n", - "fo.close()\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MKO2I4HCIMoQ" - }, - "source": [ - "`with`와 `as`, 들여쓰기로 파일이 열려 있는 구간을 표시하는 *Context Manager* 방식도 가능하다.
We may also use the *Context Manager*. It uses `with` and `as` keywords. Indentation indicates that the file is open.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "OL6A1UV0IMoQ" - }, - "outputs": [], - "source": [ - "with open(\"sample.txt\", \"rt\") as fi:\n", - " # file is open\n", - " txt = fi.read()\n", - "# file is now closed\n", - "print(txt)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Shell command `cat` will snow the content of the file.
\n", - "쉘 명령 `cat`으로 파일의 내용을 볼 수 있다.\n", - "\n" - ], - "metadata": { - "id": "WYMMh9rcIMoQ" - } - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Gs-KB-ZZIMoR" - }, - "outputs": [], - "source": [ - "!cat sample.txt\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "ipython magic command `pycat` is similar to `cat`.
\n", - "i파이썬 매직 커맨드 `pycat` 은 `cat`와 비슷하다.\n", - "\n" - ], - "metadata": { - "id": "XKTcdmByIMoR" - } - }, - { - "cell_type": "code", - "source": [ - "%pycat sample.txt\n", - "\n" - ], - "metadata": { - "id": "NgIm2MpgIMoR" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "DiUqpTAzIMoR" - }, - "source": [ - "## `import`\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lMT2zzJUIMoR" - }, - "source": [ - "파이썬의 강점 가운데 하나는 새로운 기능을 확장하는 것이 쉽다는 것이다.
\n", - "One of the strengths of the python is it can expand its capabilities easily.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "GBTRuE7DIMoR" - }, - "source": [ - "어떤 파이썬 소스 코드 파일이든 `import` 하여 그 안에 포함된 함수와 변수를 사용할 수 있다.
\n", - "We can `import` just about any python source code file and use included functions and variables.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "rLsQ_TqLIMoS" - }, - "outputs": [], - "source": [ - "%%writefile import_this.py\n", - "def three_times(x):\n", - " return 3 * x\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "QtTUlNjeIMoS" - }, - "source": [ - "Is the file created?
파일이 생성되었는가?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "nJP4khgmIMoS" - }, - "outputs": [], - "source": [ - "%ls\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MEStbfBQIMoS" - }, - "source": [ - "What is the content of the file?
\n", - "파일의 내용은?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "hIg5yZwZIMoS" - }, - "outputs": [], - "source": [ - "%pycat import_this.py\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "GZ8139a9IMoS" - }, - "source": [ - "Let's `import` the file. What happens after modifying the function?
파일을 `import` 해 보자. 함수를 수정한 후에는 어떻게 되는가?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "xzenjNT8IMoT" - }, - "outputs": [], - "source": [ - "import import_this\n", - "import imp\n", - "imp.reload(import_this)\n", - "\n", - "print(import_this.three_times('a'))\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gVv2xZ0dIMoT" - }, - "source": [ - "Any changes after first `import`?
처음 `import` 한 후 바뀐 것이 있는가?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Mf7UYyBfIMoT" - }, - "outputs": [], - "source": [ - "%ls\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JD2JIJ5CIMoT" - }, - "source": [ - "What's in the `__pycache__` folder?
\n", - "`__pycache__` 폴더의 내용은?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "iL49pr5jIMoT" - }, - "outputs": [], - "source": [ - "%ls __pycache__/\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pCTpDlk7IMoT" - }, - "source": [ - "다른 이름으로 불러올 수도 있다.
We may assign the name of the module to a different name.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "tP0RwaBcIMoT" - }, - "outputs": [], - "source": [ - "import import_this as it\n", - "\n", - "print(it.three_times('a'))\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Kq_YJ2o2IMoT" - }, - "source": [ - "`import` 하여 사용할 수 있는 다른사람들이 제공해 준 파일들도 많이 있다.
\n", - "We may `import` numerous files by generous contributors.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "xpOKWohPIMoU" - }, - "outputs": [], - "source": [ - "# 아래 os 모듈은 운영체제 관련 기능을 담고 있다.\n", - "# Following os module includes many features related to operating systems\n", - "import os\n", - "\n", - "# 예를 들어 현재 폴더에 포함된 파일의 목록은 다음과 같이 알 수 있다.\n", - "# For example, we may obtain a list of files in the current folder\n", - "os.listdir()\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Y5EIcodFIMoU" - }, - "source": [ - "현재 폴더에 `import_this.py` 파일이 포함되어 있는가?
\n", - "Does the current folder have the `import_this.py` file?\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Bx0OSWiZIMoU" - }, - "outputs": [], - "source": [ - "\"import_this.py\" in os.listdir()\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5y2391bXIMoU" - }, - "source": [ - "어떤 파일을 삭제할 수도 있다.
\n", - "We may delete an existing file.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "qTU-_VJBIMoU" - }, - "outputs": [], - "source": [ - "if \"import_this.py\" in os.listdir():\n", - " os.remove(\"import_this.py\")\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "wYO-NfIUIMoU" - }, - "outputs": [], - "source": [ - "os.listdir()\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "5ZvVK-q8IMoU" - }, - "outputs": [], - "source": [ - "\"import_this.py\" in os.listdir()\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "X-5UQuGhIMoV" - }, - "outputs": [], - "source": [ - "\"sample.txt\" in os.listdir()\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "_P0t8bg5IMoV" - }, - "outputs": [], - "source": [ - "if \"sample.txt\" in os.listdir():\n", - " os.remove(\"sample.txt\")\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "AgnaLfQvIMoV" - }, - "outputs": [], - "source": [ - "os.listdir()\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "E4blnKHBIMoV" - }, - "outputs": [], - "source": [ - "\"sample.txt\" in os.listdir()\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "E6SeRSSOIMoV" - }, - "source": [ - "## 소프트웨어 시험 함수
Software Test Functions\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0K4mG-joIMoV" - }, - "source": [ - "모든 소프트웨어는 예상 대로 작동하는지 확인해야 한다.
\n", - "We must verify all code lines work as we expect.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "9GkoLQbFIMoW" - }, - "source": [ - "예를 들어 아래와 같은 함수를 생각해 보자.
\n", - "Let's think about a function as follows.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "wlngpY3-IMoW" - }, - "outputs": [], - "source": [ - "def add(a, b):\n", - " return a + b\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tVRbJq9WIMoW" - }, - "source": [ - "아래는 위 함수가 맞게 작성되었는지 확인한다.
Following is a test function.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Jx9x26KbIMoW" - }, - "outputs": [], - "source": [ - "def test_add():\n", - " # 논리식이 참이 아니면 assert 문은 AssertionError 오류를 발생시키며 ',' 뒤의 메시지를 보여 줄 것이다.\n", - " # If the logical operation is not true, assert will raise AssertionError with the message after ','\n", - " assert 3 == add(1, 2), f\"add(1, 2) = {add(1, 2)} != 3\"\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ZiwBMtTBIMoW" - }, - "source": [ - "시험 함수를 호출해 보자.
\n", - "Let's call the test function.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "4dcJVBWVIMoW" - }, - "outputs": [], - "source": [ - "test_add()\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-9ERy_lnIMoW" - }, - "source": [ - "오류가 발생하지 않았다면 해당 함수가 위 시험은 통과한 것이다.
\n", - "If no error message, we can see that the function passed the particular test.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "aNbhgYK9IMoX" - }, - "source": [ - "`add()` 함수의 내용을 고의로 바꾸어 보자.
Let's intentionally change the `add()` function.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "fout0THjIMoX" - }, - "outputs": [], - "source": [ - "def add(a, b):\n", - " return a - b\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "_4AahAzTIMoX" - }, - "outputs": [], - "source": [ - "try:\n", - " test_add()\n", - "except AssertionError as e:\n", - " print(e)\n", - " print(\"add() did not pass this time\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uVhN8OlzIMoX" - }, - "source": [ - "## 변수형 표시
Type Hints\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-ygs4FiGIMoX" - }, - "source": [ - "어떤 변수는 어떤 형일지 표시해 주는 기능이 있다.
\n", - "Using type hints, we can take a note of types of variable.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "0Fpopjr3IMoX" - }, - "outputs": [], - "source": [ - "def twice(x):\n", - " return 2 * x\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "h3kxpc-tIMoX" - }, - "source": [ - "위 함수에 아래와 같이 type hint 를 추가할 수 있다.
\n", - "We may add type hints to the function above as follows.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "8NJkget9IMoY" - }, - "outputs": [], - "source": [ - "def twice(x:int) -> int:\n", - " return 2 * x\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wrnR_KA3IMoY" - }, - "source": [ - "여기서, `x:int` 는 `x` 가 아마도 정수형일 것으로 예상된다는 뜻이다.
\n", - "Here, `x:int` means that `x` would probably be an integer.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lylizCwkIMoc" - }, - "source": [ - "또한, `-> int:` 는 해당 함수가 아마도 정수형을 반환할 것으로 예상된다는 뜻이다.
\n", - "Also, `-> int:` means that the function would probably return an integer.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "QWxOeP5mIMod" - }, - "source": [ - "실행시 `x`는 정수가 아닐 수도 있다. 함수 `f()` 도 정수형이 아닌 값을 반환할 수도 있다.
\n", - "During the runtime, `x` may not be an integer. The function `f()` may return a value which is not an integer.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6eD-WDswIMod" - }, - "source": [ - "현재 변수형을 표시하는 까닭은 개발자와 통합개발환경을 위해서이다.
For now, type hints are for the developers and integrated development environments.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0k2cmFZRIMod" - }, - "source": [ - "변수형 표시 기능을 확장하기 위해 `typing` 모듈을 사용할 수 있다.
\n", - "To extend type hints, we may import `typing` module.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0B_KWCVGIMod" - }, - "source": [ - "예를 들어, `typing` 으로부터 `List`, `Tuple`, `Union` 을 import 할 수 있다.
For example, we may import `List`, `Tuple`, and `Union` from `typing`.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "1ivGrRGmIMod" - }, - "outputs": [], - "source": [ - "from typing import List, Tuple, Union\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "kliUVJbWIMod" - }, - "source": [ - "예상되는 `x`의 변수형이 여러가지라면, `Union` 으로 표시할 수 있다.
If `x` may be one of multiple types, `Union` may indicate them.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "7wua_bQsIMoe" - }, - "outputs": [], - "source": [ - "def g(x:Union[int, float, str]) -> Union[int, float, str]:\n", - " return 2 * x\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "BeSIhdsZIMoe" - }, - "source": [ - "`List` 와 `Tuple`로 list 또는 tuple 의 항목의 변수형을 표시할 수 있다.
`List` or `Tuple` may indicate the types of items within a list or tuple.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Pd8vueO5IMoe" - }, - "outputs": [], - "source": [ - "def h(x:List[int], y:List[float]) -> Tuple[float]:\n", - " return x + y\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "iqWtKRQiIMoe" - }, - "source": [ - "자주 사용하는 변수형을 지정하여 사용하는 것도 가능하다.
We may assign frequently used types.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "BPRF16eLIMoe" - }, - "outputs": [], - "source": [ - "Scalar = Union[int, float]\n", - "Vector = Union[List[Scalar], Tuple[Scalar]]\n", - "Matrix = Union[List[Vector], Tuple[Vector]]\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "bMpdZkmmIMoe" - }, - "outputs": [], - "source": [ - "def mat_times_scalar(a:Scalar, X:Matrix) -> Matrix:\n", - " result = []\n", - " for row in X:\n", - " new_row = []\n", - " result.append(new_row)\n", - " for x_ij in row:\n", - " new_row.append(x_ij * a)\n", - " return result\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "GsOw7zcrIMof" - }, - "source": [ - "## Final Bell
마지막 종\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "RqgahU9xIMof" - }, - "outputs": [], - "source": [ - "# stackoverfow.com/a/24634221\n", - "import os\n", - "os.system(\"printf '\\a'\");\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "LQGc7kqpIMof" - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "colab": { - "provenance": [], - "include_colab_link": true - }, - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 파이썬 프로그래밍 언어
Python Programming Language\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `print(\"abc\")`\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* To print something on the screen, call function `print()`
`print()` 함수를 호출하여 화면에 표시\n", + "* Arguments of the functions are between `(` and `)`
`(` 와 `)`의 사이는 함수의 매개변수\n", + "* Arguments influence how the function behaves
매개변수는 함수의 거동에 영향을 미침\n", + "* Recall function $f(x)=x^2$ of the math
수학의 함수 $f(x)=x^2$ 와 비슷\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"string literal\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"문자열 상수\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(1 + 2)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What operation does `/` do ?
`/`연산자는 어떤 연산을 수행하는가?
What are the differences between `/` and `//` ?
`/` 와 `//` 연산자의 차이점은?\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"60 divide by 2 equals\", 60 / 2)\n", + "60 // 2 # last result of this cell 이 셀의 마지막 결과\n", + "# Comment 주석문\n", + "# <- phrases after this symbol are for readers; python would ignore\n", + "# <- 이 기호 뒤는 읽는 사람을 위한 것으로 파이썬은 무시\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(48/2, 48//2)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(45//2, 45/2)\n", + "\n" + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(33//4, 33/4)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(10/3)\n", + "# How many digits below decimal points?\n", + "# 소숫점 아래 몇자리 까지?\n", + "print(\"##123456789012345678901234567890\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "10//3\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What about `%` or `**` ?
`%` 나 `**` 는 어떠한가?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "10 % 3, 11 % 3, 12 % 3\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "10 % 4, 10 % 5, 10 % 6\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "(10 // 3) * 3\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "(10 // 3) * 3 + (10 % 3)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "10 // 3.6, 10 % 3.6\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "2 ** 5 # Can you see the result of this operation? 이 연산의 결과를 볼 수 있는가?\n", + "print(\"2 ** 6 =\", 2 ** 6)\n", + "print(\"3 ** 3 =\", 3 ** 3)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For more operators of python, please see :
파이썬에서 사용되는 연산자 목록 :
https://docs.python.org/3/library/operator.html\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Numeric literals with `_` for readability
가독성을 위해 숫자 상수 표시에 `_` 사용\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "10_000_000 * 2\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "0.000_010 * 2\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 변수
Variables\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "_17\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Integers
정수\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 1\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "여기서 `=` 을 *할당 연산자* 라고 한다.
Here, we call `=` an *assignment operator*.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The phrase `a = 1` directs python to prepare a storage, store an integer 1, and label the storage as `a`.
\n", + "위 문장 `a = 1`의 의미는
파이썬에게 구두상자를 하나 준비해서 그 안에 정수 1을 넣고
구두상자에 `a`라는 이름표를 붙이라는 뜻
\n", + "Now we have variable `a` containing integer `1`.
\n", + "이렇게 해서 정수 `1`을 담은 변수 `a`가 생성\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can inspect the content of the variable `a` as follows.
\n", + "변수 `a`의 내용을 살펴 보고 싶으면 아래와 같이 가능\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"a 안에 들어 있는 것은\", a)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also make another variable `b` as follows.
또 다른 변수 `b`를 다음과 같이 생성할 수 있음\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "b = 2\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "b\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can add two variables, too.
\n", + "이렇게 만든 두 변수의 값으로 연산도 할 수 있음\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a + b\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Strings
문자열\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "c = '11'\n", + "print(\"c =\", c)\n", + "d = \"22\"\n", + "print(\"d =\", d)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What is the result of the following cell?
\n", + "아래 행의 결과는?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"c + d =\", c+d)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cc = 'abc'\n", + "dd = '가나다'\n", + "print(cc + dd)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Python, the results of integer `+` integer and string `+` string would be different.
파이썬에서는 + 연산의 대상이 정수 정수인지 아니면 문자열 문자열인지에 따라 결과가 달라짐.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "aaa = 123\n", + "bbb = 4\n", + "aaa * bbb\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ccc = \"123\"\n", + "ddd = 4\n", + "ccc * ddd\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use `repr()` to check whether a variable contains a string or an integer
\n", + "`repr()` 로 어떤 변수가 문자열을 담고 있는지 아니면 정수를 담고 있는지 알 수 있음.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cc = \"11\"\n", + "print(\"cc =\", str(cc))\n", + "print(\"cc =\", repr(cc))\n", + "\n", + "dd = 22\n", + "print(\"dd =\", str(dd))\n", + "print(\"dd =\", repr(dd))\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Complex numbers
복소수\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = (-1) ** (0.5)\n", + "a\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Real part 실수부\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a.real\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Imaginary part 허수부\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a.imag\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 2 + 3j\n", + "b = 3\n", + "c = a * b\n", + "c\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# c의 실수부\n", + "c.real\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# c의 허수부\n", + "c.imag\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "conjugate complex number 켤레복소수\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 5 + 2j\n", + "b = 5 - 2j\n", + "a * b\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 문자열 내삽
String interpolation\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Sometimes it is necessary to indicate information in a specific format.
때로 정보를 특정 형식에 맞추어 표시할 필요가 있다.\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "print(\"result =\", 10/3, \"mm\")\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(f\"result = {10/3:.4f} mm\")\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `%`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 1\n", + "b = 2\n", + "# 여기서 % 연산자의 역할은?\n", + "print(\"%d + %d = %d\" % (a, b, a+b))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"%d + %d = %d\" % (a, b, a+b)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What if `%` is missing?
`%`이 없다면?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 1\n", + "b = 2\n", + "print(\"%d + %d = %d\" , (a, b, a+b))\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "C code example
\n", + "C code 예제\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile hello.c\n", + "#include \n", + "\n", + "void main()\n", + "{\n", + "\tint a = 1;\n", + "\tconst int b = 2;\n", + "\tprintf(\"%d + %d = %d\\n\", a, b, a+b);\n", + "}\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!hexdump -C hello.c\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Complile : generate the machine code in binary numbers
\n", + " 컴파일 : 이진수로 된 기계어 코드 생성\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!gcc hello.c\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Running the binary code
이진 코드 실행\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!./a.out\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!hexdump -C a.out\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Conversion specifiers
\n", + "출력 형식\n", + "* Reference : https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting\n", + "* 참고 : https://wikidocs.net/13#_17\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 1\n", + "b = 2\n", + "print(\"%s + %s = %s\" % (a, b, a+b))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 1.6\n", + "b = 2\n", + "print(\"%s + %s = %s\" % (a, b, a+b))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 1.6\n", + "b = 2\n", + "print(\"%d + %d = %d\" % (a, b, a+b))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 1.6\n", + "b = 2\n", + "print(\"%f + %f = %f\" % (a, b, a+b))\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "In the example below, what do you think about the roles of numbers between `%` and `f`?
\n", + "아래 예에서 `%` 와 `f` 사이의 숫자들의 역할에 대해 어떻게 생각하는가?\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "a = 1.6\n", + "b = 2\n", + "print(\"%12f + %8.4f = %010.2f\" % (a, b, a+b))\n", + "# text column ruler\n", + "# 문자 위치 자\n", + "print(\"1234567890\"*4)\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 0.000000000000064932\n", + "b = 234560000000000000\n", + "print(\"%f * %f = %f\" % (a, b, a*b))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 0.000000000000064932\n", + "b = 234560000000000000\n", + "print(\"%e + %e = %e\" % (a, b, a*b))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 0.000000000000064932\n", + "b = 234560000000000000\n", + "print(\"%+g * %+g = %+g\" % (a, b, a*b))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 1.0\n", + "b = 2\n", + "c = a * b\n", + "print(\"%s * %s = %s\" % (a, b, c))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "aa = \"real 1.0\"\n", + "bb = 3\n", + "cc = aa * bb\n", + "print(\"%s * %s = %s\" % (aa, bb, cc))\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`%r`, `%a` : `repr()`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "aa = \"real 1.0\"\n", + "bb = 3\n", + "cc = aa * bb\n", + "print(\"%a * %a = %a\" % (aa, bb, cc))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "aa = \"real 1.0\"\n", + "bb = 3\n", + "cc = aa * bb\n", + "# 아래는 Try Except Block\n", + "# \"예외 처리\"를 위함\n", + "try:\n", + " # Error!\n", + " print(\"%f * %f = %f\" % (aa, bb, cc))\n", + "except TypeError as e:\n", + " print(e)\n", + "# Try Exception Block 끝\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Escape sequence
\n", + "* Reference : https://docs.python.org/3/reference/lexical_analysis.html#escape-sequences\n", + "* 참고 : http://www.ktword.co.kr/test/view/view.php?no=481\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "dd = 'a\\tb'\n", + "print('%s' % dd)\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print('%r' % dd)\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `.format()`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"{} + {} = {}\".format(a, b, a+b))\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### f-string\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Since python 3.6, f-string is available. (Possibly the most popular)
\n", + "python 3.6 이후 f 문자열을 사용할 수 있다. (아마도 가장 널리 사용)\n" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Unlike the other methods above, f-string enables co-locating the values and their respective locations within the string itself.
이전의 방식들과는 달리, f-문자열은 문자열 안에서 값과 위치를 일치시킬 수 있다.\n" + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(f\"{a} + {b} = {a+b}\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "source": [ + "print(f\"{a:f} + {b:16e} = {(a+b):010.2e}\")\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 함수
Functions\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "자주 반복되는 코드는 함수로 모아 두면 편리하다.
\n", + "It is convenient to wrap a frequently used code block into a function.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(2 * 'abc')\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "파이썬 함수는 `def` 로 시작한다.
`def` keyword indicates the beginning of a function.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`def` 다음에는 함수의 이름이 자리한다.
Next to the `def` keyword is the name of the function.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "함수의 이름 뒤의 `(` `)` 안에는 매개변수가 들어간다.
The arguments are in the `(` `)` after the name.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "함수의 내용에 해당하는 행은 들여쓰기로 표시한다.
The lines belong to the function are indented.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`return` 으로 결과를 반환한다.
Values after the `return` will be the results of the function.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def twice(x):\n", + " return 2 * x\n", + "# end of indentation indicates the end of the function\n", + "# 들여쓰기가 끝나는 곳은 함수의 끝\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "아래는 함수를 호출 한 예 이다.
\n", + " We can call a function as follows.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "함수의 이름 뒤에 괄호 `(` `)` 를 열고 전달할 매개변수 값을 나열한 뒤 괄호를 닫는다.
\n", + " Between the parenthesis `(` `)` after the function name, list the parameter valuse.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "twice(12)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "twice('abc')\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In iPython, `_` indicates the result from the previous cell.
iPython 에서 `_` 는 이전 셀의 결과를 가리킨다.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "_\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "twice(_)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "여기서 함수 `twice()` 가 반환한 값은 변수 `b`에 저장된다.
Here, the returned value from the function `twice()` is stored in the variable `b`.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "b = twice('a')\n", + "print(b)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "twice('zzz')\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Benefits of functions
함수의 장점\n", + "* More readable.
더 읽기 좋다.\n", + "* More maintainable.
관리하기 좋다.\n", + "* Reusable.
재사용할 수 있다.\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 변수의 유효범위
Scope of variables\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The variables defined within a function is created when the function is called and deleted when the function returns. We call them **local variables**.
함수 안에서 정의된 변수는 함수가 호출될 때 생기고 함수가 반환할 때 사라진다. 이러한 변수를 **지역변수** 라고 부른다.\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Outside of a function, the local variables defined inside are not accessable.
함수 안에서 정의된 지역 변수는 함수 밖에서 읽을 수 없다.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def can_you_read_b(x):\n", + " b_in_function = 2\n", + " print(\"b_in_function =\", b_in_function)\n", + " return b_in_function + x\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "can_you_read_b(2)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "can_you_read_b(10)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " # 아래 행은 오류를 발생시킬 것이다.\n", + " # Following line would cause an error\n", + " print(\"b_in_function =\", b_in_function)\n", + "except NameError as e:\n", + " # 위 try: 와 except 사이에서 오류가 발생하면 아래 행이 실행\n", + " # In case of an error between try and except, following line runs\n", + " print(\"NameError:\",e)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Within a function, the **global variables** defined outside are available.
함수 안에서는 함수 밖에 정의된 **전역변수** 값에 접근할 수 있다.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 100\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def can_this_use_a(x):\n", + " print(\"a =\", a)\n", + " print(\"x =\", x)\n", + " return a + x\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "can_this_use_a(3)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "ATTENTION : FUNCTIONS MAY OVERWRITE GLOBAL VARIABLES!!!
주의 : 함수가 전역변수를 덮어쓸 수 있다!!!\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "def can_this_change_a(x):\n", + " global a\n", + " print(\"before : a =\", a, \"x = \", x)\n", + " a = x\n", + " print(\"after : a =\", a, \"x = \", x)\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "can_this_change_a('new a value')\n", + "print('a =', a)\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "함수 안의 변수가 우선한다.
\n", + "Variables inside of the function has higher priority.
\n", + "함수 안에서 변수값을 할당해도 함수 밖 변수 값에 영향을 주지 않는다.
\n", + "Assigining a variable within a function does not influence the variable outside of the function.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "z = 1 # Global variable 전역변수\n", + "\n", + "def x_times_z(x):\n", + " z = 2 # Local variable 지역변수\n", + " print('z in the function =', z)\n", + " return x * z\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(x_times_z(z))\n", + "print(\"z outside of the function =\", z)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 함수의 기본 매개변수
Default Arguments\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "파이썬 함수를 정의할 때 매개변수에 기본값을 정해놓을 수 있다.
\n", + "One may designate a default value when defining a python function.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def ax_plus_b(x, a=2, b=3):\n", + "\n", + " print(f'x = {x}', end=', ')\n", + " print(f'a = {a}', end=', ')\n", + " print(f'b = {b}')\n", + "\n", + " return a * x + b\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ax_plus_b(1, 4, 5)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ax_plus_b(1)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ax_plus_b(1, 1)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ax_plus_b(1, b=1)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Callback Function
콜백함수\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "A callback function is a function (let's call this `f()`) you provide as an input argument to another function (and call this `s()`).
콜백함수(`f()`함수라고 하자)는 다른 함수(`s()`라고 하자)에 입력 매개변수로 전달하는 함수이다.
The \"another\" function `s()` will call your function `f()` with specific information or results as it runs.
함수`s()`가 실행 중 특정 싯점에 함수`f()`를 호출할 것이다.\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "아래 두 함수가 주어져 있다.
Following two functions are given.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def add(a, b):\n", + " print(f\"{a} + {b}\")\n", + " return a + b\n", + "\n", + "def mul(a, b):\n", + " print(f\"{a} * {b}\")\n", + " return a * b\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "아래와 같은 함수를 생각해 보자.
Let's consider a function as follows.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def s(f, aa, bb):\n", + " return f(aa, bb)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, let's pass another function's name as the argument `f`.
여기서 매개변수 `f`로 다른 함수의 이름을 전달해 보자.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(s(add, 1, 2))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(s(mul, 1, 2))\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "위 두 함수 호출의 결과에 대해 어떻게 생각하는가?
What do you think about the results of the two function calls above.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Also let's think about the following function.
또한 다음 함수를 생각해 보자.\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "def mini_reduce(f, aa, bb, cc):\n", + " # call f with aa and bb as arguments\n", + " # 함수 f 를 매개 변수로 aa 와 bb 를 써서 호츨\n", + " first_result = f(aa, bb)\n", + " # this time, result from the previous function call and cc as arguments\n", + " # 이번에는 위 호출의 결과와 cc를 매개변수로\n", + " second_result = f(first_result, cc)\n", + " return second_result\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "adj_m = 3 # adjacent leg\n", + "opp_m = 4 # opposite leg\n", + "hyp_m = 5 # hypotenuse\n", + "\n", + "perimeter_m = mini_reduce(add, adj_m, opp_m, hyp_m)\n", + "print(perimeter_m)\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "width_m = 3\n", + "depth_m = 4\n", + "height_m = 5\n", + "\n", + "box_volume_m3 = mini_reduce(mul, width_m, depth_m, height_m)\n", + "print(box_volume_m3)\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### `lambda`\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`lambda` defines an anonymous function.
`lambda`로 이름 없는 함수를 정의할 수 있다.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(s(lambda x, y: x/y, 15, 2))\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The cell above is (almost) equivalent to the following cell.
위 셀과 아래 셀은 효과가 (거의) 같다.\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "def div(x, y):\n", + " return x/y\n", + "print(s(div, 15, 2))\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "namespace\n" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "list(filter(lambda name:not name.startswith('_'), dir()))\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 모음
Collection\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "모음은 여러 데이터를 한 **이름** 아래 저장한 것이다.
\n", + "Collection contains multiple data under one **name**.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Python 에서는 기본적으로 `list()`, `tuple()`, `dict()`, `set()` 과 같은 데이터 모음이 사용가능하다.
\n", + "In python, data collections such as `list()`, `tuple()`, `dict()`, and `set()` are available built-in.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 리스트
List\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "리스트는 순서 대로 몇개의 자료를 모은 것이다.
\n", + "A `list()` is a collection of data in a sequnce.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x = list([1, 3, 5, 7, 9])\n", + "x\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`len()` 함수를 이용하여 리스트의 항목 수를 알 수 있다.
\n", + "Calling function `len()` one can find the number of items within a list.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(x)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "항목을 `[` `]` 로 둘러 싸서 만들 수도 있다.
\n", + "One can also make a list by wrapping items with `[` and `]`.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y = [1, 2, ['other', 'list'], 'python']\n", + "y\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(y)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "문자열로부터 list를 만들 수도 있다.
\n", + "A list can be made from a string.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_list = list('abc')\n", + "a_list\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "항목을 추가할 수 있다.
We may add more items.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_list.append('d')\n", + "a_list\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "다른 list를 붙인 새로운 list를 만들 수도 있다.
We may make a new list by connecting multiple lists.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "z_list = a_list + ['yy', 'zzz']\n", + "z_list\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 항목 지정
Indexing an item (or items)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "각 항목을 읽거나 쓰기 위해 인덱스로 순서를 지정한다.
\n", + "To access each item, you can indicate by its index.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "첫 항목의 인덱스는 0 이다. 이후는 1씩 증가한다.
\n", + "Index 0 indicates the first item. Afterward, it increases by one each.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "리스트 변수 이름 뒤 대괄호 `[` `]` 사이에 해당 인덱스 값을 넣는다.
\n", + "The index places between the brakets `[` `]` after the name of the list variable.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x[0]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x[1]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " # Error!\n", + " x(0)\n", + "except TypeError as e:\n", + " print(e)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`-1` 은 마지막 항목을 가리킨다.
\n", + "`-` indicates the last item.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x[-1]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y[-1]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`:` 로 여러 항목을 선택할 수도 있다. 이를 *슬라이싱* 이라고 한다.
\n", + "`:` can indicate multiple items. It is called *slicing*.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "z = list(range(20+1))\n", + "z\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "z[2]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "z[:2]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "위 결과에 `z[2]` 가 포함되었는가?
\n", + "Does the result above include `z[2]`?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "z[2:]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "위 결과에 `z[2]` 가 포함되었는가?
\n", + "Does the result above include `z[2]`?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "z[2:12]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "이번에는 무엇이 달라졌는가?
\n", + "What is different this time?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "z[2:12:2]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "마지막 `:2`의 역할은 무엇인가?
\n", + "What is the role of the `:2` at the end?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "z[2:12:3]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "z[2:12:4]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`range()` 함수의 세 매개변수의 각각의 역할은 무엇인가?
\n", + "What are the respective roles of the three arguments of the `range()` function ?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 소속 여부
Membership\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`in` 연산자로 어떤 항목이 어떤 list 에 포함되어 있는지 알 수 있다.
\n", + "`in` operater can tell us if a list has a certain item.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "z_list\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'a' in z_list\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"b\" in z_list\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'z' in z_list\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'zzz' in z_list\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'z' in \"zzz\"\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'zz' in \"zzz\"\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### list & tuple\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "리스트 `list` 와 튜플 `tuple` 모두 여러 항목을 저장할 수 있다.
Both `list` and `tuple` can store multiple items.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "또한 각 항목을 순서로 구분한다.
Also, distinguish each item with the order.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "리스트는 항목을 변경 추가 삭제할 수 있으나 (mutable) 튜플은 한번 만들어지면 변경할 수 없다 (immutable).
We may change, add, or remove items in lists (mutable) but we cannot with tuples (immutable).\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "예를 들어 다음을 생각해 보자.
Let's check the followings.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x_list = [1, 2, 3]\n", + "print(\"before :\", x_list)\n", + "x_list[0] = '0'\n", + "print(\"after :\", x_list)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "튜플 tuple 의 경우, 항목을 바꿀 수 없으므로 아래 예에서 예외 Exception 가 발생한다.
\n", + "Because a tuple does not allow chaning one of its items, following example would raise an Exception.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " z_tuple = (4, 5, 6)\n", + " print(\"before :\", z_tuple)\n", + " # Error!\n", + " z_tuple[0] = '0'\n", + " print(\"after :\", z_tuple)\n", + "except TypeError as e:\n", + " print(e)\n", + " print('cannot change an item in tuple')\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 딕셔너리
Dictionary\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "순서로 각 요소를 구분하는 list 나 tuple 과는 달리 `dict`는 key - value 쌍을 저장한다.
Unlike list or tuple distinguishing items by the sequence, `dict` stores key - value pairs.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict = {\n", + " 'name': 'Iron', # key : 'name', value : 'Iron'\n", + " 'atomic no': 26, # key : 'atomic number', value : 26\n", + "}\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict['name']\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict['atomic no']\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(하나 또는 여러개의) 새로운 key - value 쌍을 추가할 수도 있다.
One can add a new key - value pair(or pairs).\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict['atomic weight'] = 55\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`in`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'name' in a_dict\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict.keys()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'name' in a_dict.keys()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'Iron' in a_dict\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### `.get()`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict['name']\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict.get('name')\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'price' in a_dict\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " # Error!\n", + " a_dict['price']\n", + "except KeyError as e:\n", + " print(\"KeyError:\", e)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# No error\n", + "a_dict.get('price')\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict.get('price', '''Does not have 'price' yet.''')\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict.get(\n", + " 'atomic no',\n", + " '''Does not have 'atomic no' yet.'''\n", + ")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### `.update()`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dict_b = {\n", + " 'atomic weight': 55.845,\n", + " 'poisson ratio': 0.29,\n", + "}\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dict_b\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict.update(dict_b)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a_dict\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Conditional Execution and Iteration
조건문과 반복문\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `if` `elif` `else`\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "어떤 논리 연산의 결과에 따라 특정 코드를 실행시키도록 할 수 있다.
\n", + "Depending on the result of a logical operation, we may activate a certain block of code to run.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 1\n", + "1 == a\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "if 1 == a:\n", + " print(\"Variable `a` contains one\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "결과에 따라 특정 코드를 대신 실행시키도록 할 수 있다.
\n", + "Depending on the result, we may make a different block of code to run.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 1\n", + "if 2 == a:\n", + " print(\"Variable `a` is equal to two\")\n", + "else:\n", + " print(\"Variable `a` is not equal to two\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "또한 여러 논리식을 순차적으로 검토하여 실행할 코드를 선택할 수도 있다.
\n", + "Also, we may choose which code to run by evaluating a series of logical operations.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 0\n", + "if 0 < a:\n", + " print(\"Variable `a` is positive\")\n", + "elif 0 > a:\n", + " print(\"Variable `a` contains a negative number\")\n", + "elif 0 == a:\n", + " print(\"`a` is zero\")\n", + "elif 0 >= a:\n", + " print(\"`a` is zero or negative\")\n", + "else:\n", + " # 상정 이외의 경우에는 오류를 발생시켜야 할 수도 있다.\n", + " # On an exceptional case, we may need to raise one.\n", + " raise NotImplementedError\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `for` iterations
`for` 반복문\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "어떤 작업을 정해진 횟수 만큼 반복시키고 싶다면 `for` 문을 사용할 수 있다.
\n", + "`for` loops for a fixed number of iterations.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for a in [1, 'a', 3, 'b', 5]:\n", + " print(a)\n", + " print(\"end of for block\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for a in [1, 'a', 3, 'b', 5]:\n", + " print(a)\n", + "print(\"end of for block\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 'iteration'\n", + "\n", + "for i in [0, 'a', ['b', 2],]:\n", + " print(i, a)\n", + "\n", + "print(\"end of for block\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "위 셀에서 변수 `i` 는 `in` 다음의 list 안의 값을 하나씩 짚을 것이다.
In the cell above, the variable `i` will step over the values of the list following `in`.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`n` 번 반복시키려면 0 부터 `n-1` 까지 발생시키는 `range(n)` 을 사용할 수 있다.
\n", + "To loop `n` iterations, we can use `range(n)` that will generate from 0 to `n-1`.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 'iteration'\n", + "n = 5\n", + "\n", + "for i in range(n):\n", + " print(i, a)\n", + "\n", + "print(\"end of for block\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`range()` 를 이용하여 새로운 list를 만들어 갈 수도 있다.
\n", + "We may make a new list using the `range()`.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "square = []\n", + "n = 10\n", + "\n", + "for i in range(n):\n", + " square.append(i * i)\n", + " print(\"i =\", i, \", square =\", square)\n", + "\n", + "print(square)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Arguments of the `range()` function
\n", + "`range()` 함수의 매개변수\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(1, 10+1, 2):\n", + " print(i, end=', ')\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `while` iterations
`while` 반복문\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Whenever possible, please use `for` loops.
가능하면 `for` 반복문을 사용하기 바람.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "i = 0\n", + "while (i < 3):\n", + " i = i + 1\n", + " # what if line above missing?\n", + " # infinite loop\n", + " print(\"Is i ==\", i, \"less than 3 ?\", i < 3)\n", + "print(\"end of while loop\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 파일 입출력
File I/O\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "파이썬에서 파일을 읽고 쓸 때는 `open()` 함수를 호출한다.
\n", + "To read from or write to a file in python, we can usually start with calling `open()`.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile hello.txt\n", + "Hello python!\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fi = open(\"hello.txt\", 'rt')\n", + "print(fi.read())\n", + "fi.close()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* IPython magic command\n", + "* https://ipython.readthedocs.io/en/stable/interactive/magics.html#cellmagic-writefile\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "File write mode 파일 쓰기 모드\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fo = open(\"sample.txt\", \"wt\")\n", + "fo.write(\"Hello Python!\\n\")\n", + "fo.close()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`with`와 `as`, 들여쓰기로 파일이 열려 있는 구간을 표시하는 *Context Manager* 방식도 가능하다.
We may also use the *Context Manager*. It uses `with` and `as` keywords. Indentation indicates that the file is open.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"sample.txt\", \"rt\") as fi:\n", + " # file is open\n", + " txt = fi.read()\n", + "# file is now closed\n", + "print(txt)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Shell command `cat` will snow the content of the file.
\n", + "쉘 명령 `cat`으로 파일의 내용을 볼 수 있다.\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!cat sample.txt\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "ipython magic command `pycat` is similar to `cat`.
\n", + "i파이썬 매직 커맨드 `pycat` 은 `cat`와 비슷하다.\n", + "\n" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "%pycat sample.txt\n", + "\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `import`\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "파이썬의 강점 가운데 하나는 새로운 기능을 확장하는 것이 쉽다는 것이다.
\n", + "One of the strengths of the python is it can expand its capabilities easily.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "어떤 파이썬 소스 코드 파일이든 `import` 하여 그 안에 포함된 함수와 변수를 사용할 수 있다.
\n", + "We can `import` just about any python source code file and use included functions and variables.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile import_this.py\n", + "def three_times(x):\n", + " return 3 * x\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Is the file created?
파일이 생성되었는가?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%ls\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What is the content of the file?
\n", + "파일의 내용은?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pycat import_this.py\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's `import` the file. What happens after modifying the function?
파일을 `import` 해 보자. 함수를 수정한 후에는 어떻게 되는가?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import import_this\n", + "import imp\n", + "imp.reload(import_this)\n", + "\n", + "print(import_this.three_times('a'))\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Any changes after first `import`?
처음 `import` 한 후 바뀐 것이 있는가?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%ls\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What's in the `__pycache__` folder?
\n", + "`__pycache__` 폴더의 내용은?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%ls __pycache__/\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "다른 이름으로 불러올 수도 있다.
We may assign the name of the module to a different name.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import import_this as it\n", + "\n", + "print(it.three_times('a'))\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`import` 하여 사용할 수 있는 다른사람들이 제공해 준 파일들도 많이 있다.
\n", + "We may `import` numerous files by generous contributors.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 아래 os 모듈은 운영체제 관련 기능을 담고 있다.\n", + "# Following os module includes many features related to operating systems\n", + "import os\n", + "\n", + "# 예를 들어 현재 폴더에 포함된 파일의 목록은 다음과 같이 알 수 있다.\n", + "# For example, we may obtain a list of files in the current folder\n", + "os.listdir()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "현재 폴더에 `import_this.py` 파일이 포함되어 있는가?
\n", + "Does the current folder have the `import_this.py` file?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"import_this.py\" in os.listdir()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "어떤 파일을 삭제할 수도 있다.
\n", + "We may delete an existing file.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "if \"import_this.py\" in os.listdir():\n", + " os.remove(\"import_this.py\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.listdir()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"import_this.py\" in os.listdir()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"sample.txt\" in os.listdir()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "if \"sample.txt\" in os.listdir():\n", + " os.remove(\"sample.txt\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.listdir()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"sample.txt\" in os.listdir()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 소프트웨어 시험 함수
Software Test Functions\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "모든 소프트웨어는 예상 대로 작동하는지 확인해야 한다.
\n", + "We must verify all code lines work as we expect.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "예를 들어 아래와 같은 함수를 생각해 보자.
\n", + "Let's think about a function as follows.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "아래는 위 함수가 맞게 작성되었는지 확인한다.
Following is a test function.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def test_add():\n", + " # 논리식이 참이 아니면 assert 문은 AssertionError 오류를 발생시키며 ',' 뒤의 메시지를 보여 줄 것이다.\n", + " # If the logical operation is not true, assert will raise AssertionError with the message after ','\n", + " assert 3 == add(1, 2), f\"add(1, 2) = {add(1, 2)} != 3\"\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "시험 함수를 호출해 보자.
\n", + "Let's call the test function.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "test_add()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "오류가 발생하지 않았다면 해당 함수가 위 시험은 통과한 것이다.
\n", + "If no error message, we can see that the function passed the particular test.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`add()` 함수의 내용을 고의로 바꾸어 보자.
Let's intentionally change the `add()` function.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def add(a, b):\n", + " return a - b\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " test_add()\n", + "except AssertionError as e:\n", + " print(e)\n", + " print(\"add() did not pass this time\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 변수형 표시
Type Hints\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "어떤 변수는 어떤 형일지 표시해 주는 기능이 있다.
\n", + "Using type hints, we can take a note of types of variable.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def twice(x):\n", + " return 2 * x\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "위 함수에 아래와 같이 type hint 를 추가할 수 있다.
\n", + "We may add type hints to the function above as follows.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def twice(x:int) -> int:\n", + " return 2 * x\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "여기서, `x:int` 는 `x` 가 아마도 정수형일 것으로 예상된다는 뜻이다.
\n", + "Here, `x:int` means that `x` would probably be an integer.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "또한, `-> int:` 는 해당 함수가 아마도 정수형을 반환할 것으로 예상된다는 뜻이다.
\n", + "Also, `-> int:` means that the function would probably return an integer.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "실행시 `x`는 정수가 아닐 수도 있다. 함수 `f()` 도 정수형이 아닌 값을 반환할 수도 있다.
\n", + "During the runtime, `x` may not be an integer. The function `f()` may return a value which is not an integer.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "현재 변수형을 표시하는 까닭은 개발자와 통합개발환경을 위해서이다.
For now, type hints are for the developers and integrated development environments.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "변수형 표시 기능을 확장하기 위해 `typing` 모듈을 사용할 수 있다.
\n", + "To extend type hints, we may import `typing` module.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "예를 들어, `typing` 으로부터 `List`, `Tuple`, `Union` 을 import 할 수 있다.
For example, we may import `List`, `Tuple`, and `Union` from `typing`.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Tuple, Union\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "예상되는 `x`의 변수형이 여러가지라면, `Union` 으로 표시할 수 있다.
If `x` may be one of multiple types, `Union` may indicate them.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def g(x:Union[int, float, str]) -> Union[int, float, str]:\n", + " return 2 * x\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`List` 와 `Tuple`로 list 또는 tuple 의 항목의 변수형을 표시할 수 있다.
`List` or `Tuple` may indicate the types of items within a list or tuple.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def h(x:List[int], y:List[float]) -> Tuple[float]:\n", + " return x + y\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "자주 사용하는 변수형을 지정하여 사용하는 것도 가능하다.
We may assign frequently used types.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Scalar = Union[int, float]\n", + "Vector = Union[List[Scalar], Tuple[Scalar]]\n", + "Matrix = Union[List[Vector], Tuple[Vector]]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def mat_times_scalar(a:Scalar, X:Matrix) -> Matrix:\n", + " result = []\n", + " for row in X:\n", + " new_row = []\n", + " result.append(new_row)\n", + " for x_ij in row:\n", + " new_row.append(x_ij * a)\n", + " return result\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final Bell
마지막 종\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# stackoverfow.com/a/24634221\n", + "import os\n", + "os.system(\"printf '\\a'\");\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [], + "include_colab_link": true + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 } \ No newline at end of file