From 4507048eaac616aed43889092054032c3f85b6ab Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 12 Sep 2016 19:57:25 +0900 Subject: [PATCH 001/124] =?UTF-8?q?Supplment=202016=EB=85=84=202=ED=95=99?= =?UTF-8?q?=EA=B8=B0=20=EC=9A=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- supplement-2016-09.ipynb | 273 +++++++++++++++++++++++++++++++++++++++ supplement.ipynb | 7 +- 2 files changed, 277 insertions(+), 3 deletions(-) create mode 100644 supplement-2016-09.ipynb diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb new file mode 100644 index 0000000..3b39d8e --- /dev/null +++ b/supplement-2016-09.ipynb @@ -0,0 +1,273 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 수업 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. E-learning 1, 2 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 현재 이름 공간에 있는 이름 리스트 출력" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- dir() 내장 함수 사용\n", + " - 리턴형: 리스트 \n", + " \n", + "- 아래 리스트 중 python 기본 이름\n", + " - \\_\\_builtin\\_\\_\n", + " - \\_\\_doc\\_\\_\n", + " - \\_\\_name\\_\\_\n", + " - \\_\\_package\\_\\_\n", + " \n", + "- 나머지는 ipython이 자체적으로 생성한 이름들" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 단순 이름만 출력: dir()\n", + " - 리턴형: 리스트" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['In',\n", + " 'Out',\n", + " '_',\n", + " '__',\n", + " '___',\n", + " '__builtin__',\n", + " '__builtins__',\n", + " '__doc__',\n", + " '__name__',\n", + " '_dh',\n", + " '_i',\n", + " '_i1',\n", + " '_ih',\n", + " '_ii',\n", + " '_iii',\n", + " '_oh',\n", + " '_sh',\n", + " 'exit',\n", + " 'get_ipython',\n", + " 'quit']" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 특정 객체가 지니고 있는 이름 리스트 출력" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']\n" + ] + } + ], + "source": [ + "a = 10\n", + "print dir(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '__IPYTHON__', '__IPYTHON__active', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'dreload', 'enumerate', 'eval', 'execfile', 'file', 'filter', 'float', 'format', 'frozenset', 'get_ipython', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']\n" + ] + } + ], + "source": [ + "print dir(__builtin__)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 파이썬 버전 및 모듈들이 존재할 수 있는 패스 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.7.9 | 64-bit | (default, Jun 30 2015, 22:40:22) \n", + "[GCC 4.1.2 20080704 (Red Hat 4.1.2-55)]\n", + "\n", + "['', '/home/goslim/Canopy/appdata/canopy-1.5.5.3123.rh5-x86_64/lib/python27.zip', '/home/goslim/Canopy/appdata/canopy-1.5.5.3123.rh5-x86_64/lib/python2.7', '/home/goslim/Canopy/appdata/canopy-1.5.5.3123.rh5-x86_64/lib/python2.7/plat-linux2', '/home/goslim/Canopy/appdata/canopy-1.5.5.3123.rh5-x86_64/lib/python2.7/lib-tk', '/home/goslim/Canopy/appdata/canopy-1.5.5.3123.rh5-x86_64/lib/python2.7/lib-old', '/home/goslim/Canopy/appdata/canopy-1.5.5.3123.rh5-x86_64/lib/python2.7/lib-dynload', '/home/goslim/Enthought/Canopy_64bit/User/lib/python2.7/site-packages', '/home/goslim/Canopy/appdata/canopy-1.5.5.3123.rh5-x86_64/lib/python2.7/site-packages', '/home/goslim/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/IPython/extensions']\n" + ] + } + ], + "source": [ + "import sys\n", + "print sys.version\n", + "print\n", + "print sys.path" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', '_home', '_mercurial', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'exitfunc', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'hexversion', 'long_info', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'ps3', 'py3kwarning', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions']\n" + ] + } + ], + "source": [ + "print dir(sys)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4) 연습문제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음은 math 모듈을 가져오는 코딩이다. math 모듈을 가져온 후 math 모듈에 정의된 함수를 이용하여 -4.3 값을 반올림한 후 절대값을 계산하여 출력하는 코딩을 한 줄로 완성하라." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import math" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음은 두 점의 좌표 (x1, y1), (x2, y2)를 나타내는 변수 값들이다. math 모듈에 정의된 함수를 이용하여 이 두 점 사이의 거리를 계산하여 출력하는 코딩을 한 줄로 완성하라. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x1 = 10\n", + "y1 = 20\n", + "x2 = 30\n", + "y2 = 40" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python [Root]", + "language": "python", + "name": "Python [Root]" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/supplement.ipynb b/supplement.ipynb index 4587940..3c9374f 100644 --- a/supplement.ipynb +++ b/supplement.ipynb @@ -3887,10 +3887,11 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [Root]", "language": "python", - "name": "python2" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -3902,7 +3903,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.12" } }, "nbformat": 4, From 895d020f3285d6d38552e644a838305b8f6b7904 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 12 Sep 2016 20:01:58 +0900 Subject: [PATCH 002/124] m.c. --- supplement-2016-09.ipynb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb index 3b39d8e..f1e4cfb 100644 --- a/supplement-2016-09.ipynb +++ b/supplement-2016-09.ipynb @@ -29,10 +29,9 @@ " - 리턴형: 리스트 \n", " \n", "- 아래 리스트 중 python 기본 이름\n", - " - \\_\\_builtin\\_\\_\n", + " - \\_\\_builtins\\_\\_\n", " - \\_\\_doc\\_\\_\n", " - \\_\\_name\\_\\_\n", - " - \\_\\_package\\_\\_\n", " \n", "- 나머지는 ipython이 자체적으로 생성한 이름들" ] @@ -242,7 +241,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [] From 9acd4ed2cbc3c286a1145874fccafeee0d46e37a Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 21 Sep 2016 17:29:22 +0900 Subject: [PATCH 003/124] m.c. --- supplement-2016-09.ipynb | 420 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 420 insertions(+) diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb index f1e4cfb..51989ea 100644 --- a/supplement-2016-09.ipynb +++ b/supplement-2016-09.ipynb @@ -7,6 +7,426 @@ "# 수업 보충 자료" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. E-learning 3, 4 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 파이썬에서 지원하는 각종 타입들 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['BooleanType',\n", + " 'BufferType',\n", + " 'BuiltinFunctionType',\n", + " 'BuiltinMethodType',\n", + " 'ClassType',\n", + " 'CodeType',\n", + " 'ComplexType',\n", + " 'DictProxyType',\n", + " 'DictType',\n", + " 'DictionaryType',\n", + " 'EllipsisType',\n", + " 'FileType',\n", + " 'FloatType',\n", + " 'FrameType',\n", + " 'FunctionType',\n", + " 'GeneratorType',\n", + " 'GetSetDescriptorType',\n", + " 'InstanceType',\n", + " 'IntType',\n", + " 'LambdaType',\n", + " 'ListType',\n", + " 'LongType',\n", + " 'MemberDescriptorType',\n", + " 'MethodType',\n", + " 'ModuleType',\n", + " 'NoneType',\n", + " 'NotImplementedType',\n", + " 'ObjectType',\n", + " 'SliceType',\n", + " 'StringType',\n", + " 'StringTypes',\n", + " 'TracebackType',\n", + " 'TupleType',\n", + " 'TypeType',\n", + " 'UnboundMethodType',\n", + " 'UnicodeType',\n", + " 'XRangeType',\n", + " '__all__',\n", + " '__builtins__',\n", + " '__doc__',\n", + " '__file__',\n", + " '__name__',\n", + " '__package__']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import types\n", + "\n", + "dir(types)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "print type(123) is types.IntType\n", + "print type(123.0) is types.FloatType\n", + "print type('abc') is types.StringType\n", + "print type([]) is types.ListType\n", + "print type(()) is types.TupleType\n", + "print type({}) is types.DictionaryType" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 레퍼런스 카운트 (Reference Count)와 쓰레기 수집 (Garbage Collection) " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x = y = z = 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/referenceCount1.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "del x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/referenceCount2.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "y = 200\n", + "z = 300" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/referenceCount3.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 레퍼런스 카운트를 얻는 법\n", + " - sys 모듈의 getrefcount() 함수: 함수 수행 결과의 레퍼런스 카운트가 생각보다 큰 이유 --> 본 함수가 작업 처리를 하기 위해서 순간적으로 레퍼런스가 증가할 수도 있고, 파이썬 가상머신 자체가 관리의 용도로 레퍼런스를 지니고 있을 수 있음" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "\n", + "4\n", + "4\n", + "\n", + "5\n", + "5\n", + "5\n" + ] + } + ], + "source": [ + "import sys\n", + "\n", + "a1 = 191919\n", + "print sys.getrefcount(a1) # 새로운 191919 객체를 만들고 이 객체에 대한 reference count 반환\n", + "\n", + "print\n", + "\n", + "a2 = a1\n", + "print sys.getrefcount(a1) # a1과 a3가 참조하는 객체는 동일하며, reference count는 기존보다 1이 증가되어 있음 \n", + "print sys.getrefcount(a2) # a2는 여전히 reference count가 이전 값과 동일함\n", + "print\n", + "\n", + "aa1 = aa2 = aa3 = 202020\n", + "print sys.getrefcount(aa1)\n", + "print sys.getrefcount(aa2)\n", + "print sys.getrefcount(aa3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "4) [참고] turtle 모듈 활용하기\n", + "- https://opentechschool.github.io/python-beginners/ko/simple_drawing.html\n", + "- http://openbookproject.net/thinkcs/python/english3e/hello_little_turtles.html\n", + "- https://www.youtube.com/watch?v=vEkiaHtdwIk\n", + "- https://python-turtle-demo.googlecode.com/files/SevenWaysToUseTurtle-PyCon2009.pdf" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import turtle\n", + "\n", + "t = turtle.Turtle()\n", + "t.shape(\"turtle\")\n", + "t.color(\"blue\")\n", + "\n", + "t.pensize(3) # 펜 사이즈를 3으로 설정한다.\n", + "t.penup() # 펜을 종이로 부터 들어올린다.\n", + "t.goto(-200, -50) # 해당 좌표로 이동한다.\n", + "t.pendown() # 펜을 종이에 놓는다.\n", + "t.circle(40, steps=3) # 반지름이 40인 원을 3 step으로만 그린다. ==> 삼각형이 그려짐\n", + "\n", + "t.penup()\n", + "t.goto(-100, -50)\n", + "t.pendown()\n", + "t.circle(40, steps=4)\n", + "\n", + "t.penup()\n", + "t.goto(0, -50)\n", + "t.pendown()\n", + "t.circle(40, steps=5)\n", + "\n", + "t.penup()\n", + "t.goto(100, -50)\n", + "t.pendown()\n", + "t.circle(40, steps=6)\n", + "\n", + "t.penup()\n", + "t.goto(200, -50)\n", + "t.pendown()\n", + "t.circle(40, steps=40)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Turtle의 펜 그리기 상태 메소드

\n", + " \n", + "| 메소드 명 | 설명 | \n", + "| ---------- | :--------- |\n", + "|turtle.pendown()|펜을 내려놓는다 - 움직일 때 그려진다.|\n", + "|turtle.penup()|펜을 들어올린다 - 움직일 때 그려지지 않는다.|\n", + "|turtle.pensize()|선의 두께를 특정 폭으로 설정한다.|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Turtle의 이동 메소드

\n", + "\n", + "|
메소드 명
|
설명
| \n", + "| ---------- | :--------- |\n", + "|turtle.forward(d)|turtle이 향하고 있는 방향으로 특정 거리 d만큼 앞으로 이동시킨다.|\n", + "|turtle.backward(d)|turtle이 향하고 있는 반대 방향으로 특정 거리 d만큼 뒤로 이동시킨다. turtle의 방향은 바뀌지 않는다.|\n", + "|turtle.right(angle)|turtle을 특정 각만큼 오른쪽으로 회전시킨다.|\n", + "|turtle.left(angle)|turtle을 특정 각만큼 왼쪽으로 회전시킨다.|\n", + "|turtle.goto(x,y)|turtle을 절대 위치 (x,y)로 옮긴다.|\n", + "|turtle.setx(x)|turtle의 x 좌표를 특정 위치로 옮긴다.|\n", + "|turtle.setx(y)|turtle의 y 좌표를 특정 위치로 옮긴다.|\n", + "|turtle.setheading(angle)|특정 각도로 turtle의 방향을 설정한다. 0-동쪽, 90-북쪽, 180-서쪽, 270-남쪽.|\n", + "|turtle.home()|turtle을 원점 (0,0)으로 옮기고 동쪽 방향으로 설정한다.|\n", + "|turtle.circle(r, ext, steps)|특정 반지름 r, 경계 ext와 단계 step인 원을 그린다.|\n", + "|turtle.dot(diameter, color)|특정 지름 diameter와 색상 color인 원을 그린다.|\n", + "|turtle.undo()|turtle의 마지막 명령을 (반복적으로)되돌린다.|\n", + "|turtle.speed(s)|1부터 10사이의 정수(10이 최대) s로 turtle의 속도를 설정한다.|\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Turtle 펜 색상, 채우기와 그리기 메소드

\n", + "\n", + "|
메소드 명
|
설명
|\n", + "| ---------- | :--------- |\n", + "|turtle.color(c)|펜 색상을 c로 설정한다.|\n", + "|turtle.fillcolor(c)|펜 채우기 색상을 c로 설정한다.|\n", + "|turtle.begin_fill()|도형을 채우기 전에 이 메소드를 호출한다.|\n", + "|turtle.end_fill()|begin_fill에 대한 마지막 호출전까지 그려진 도형을 채운다.|\n", + "|turtle.filling()|채우기 상태를 반환한다. 채우기 상태이면 True, 그렇지 않으면 False|\n", + "|turtle.clear()|창을 깨끗하게 지운다. turtle의 상태와 위치는 영향을 받지 않는다.|\n", + "|turtle.reset()|창을 깨끗하게 지우고 turtle의 상태와 위치를 원래 기본값으로 재설정한다.|\n", + "|turtle.screensize(w,h)|캔버스의 폭과 높이를 w와 h로 설정한다.|\n", + "|turtle.hideturtle()|turtle을 보이지 않게 만든다.|\n", + "|turtle.showturtle()|turtle을 보이게 만든다.|\n", + "|turtle.isvisible()|turtle이 보이면 True를 반환한다.|\n", + "|turtle.write(s,font=(\"Arial\",8,\"normal\"))|현재 turtle의 위치에 문자열 s를 쓴다. 폰트는 폰트명, 폰트크기, 폰트유형의 세 값으로 구성된다.|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 연습문제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- (1) 다음 사항을 읽고 요구하는 프로그램을 작성하시오.\n", + " * 정다각형은 모든 변의 길이와 내각의 크기가 같은 $n$개의 변으로 이루어진 다각형이다 (즉, 다각형이 등변이고 등각이다). \n", + " * 한변의 길이가 $s$일 때 정다각형의 넓이를 계산하는 공식은 다음과 같다.\n", + " * $정다각형의 넓이 = (n \\times s^2) / (4 \\times tan(\\pi / n))$\n", + " * 사용자로 부터 정다각형의 변의 개수와 변의 길이를 입력받고 정다각형의 넓이를 출력하는 프로그램을 작성하시오.\n", + " * 출력예는 다음과 같다.\n", + " \n", + " [출력예]\n", + " ```\n", + " 변의 개수를 입력하세요: 5 \n", + " 변의 길이를 입력하세요: 6.5\n", + " 다각형의 넓이는 73.69017017488385 입니다.\n", + " ```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- (2) 다음 사항을 읽고 요구하는 프로그램을 작성하시오.\n", + " * 사용자로 부터 ASCII 코드 (0부터 127 사이의 정수)를 입력받는다. \n", + " * 입력받은 코드에 대한 문자를 출력하는 프로그램을 작성하시오.\n", + " * 출력예는 다음과 같다.\n", + " \n", + " [출력예]\n", + " ```\n", + " ASCII코드를 입력하세요: 69 \n", + " 문자는 E 입니다.\n", + " ```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- (3) 다음 프로그램을 분석해보고, 어떤 목적의 프로그램인지 파악해보시오. 또한, assert 예약어가 무엇인지 Googling 하여 알아보시오." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import math\n", + "\n", + "def distance( x0, y0, x1, y1 ):\n", + " \"\"\"( x0, y0 )와 ( x1, y1 ) 사이의 거리를 계산한다.\"\"\"\n", + " return math.sqrt( (x1-x0) ** 2 + (y1-y0) ** 2 )\n", + "\n", + "def close( left, right ):\n", + " \"\"\"두 부동소수점 값이 근사한지 테스트 한다.\"\"\"\n", + " return abs( left - right ) < 1.0e-6\n", + "\n", + "def test_distance():\n", + " \"\"\"distance 함수가 올바르게 동작하는지 테스트 한다.\"\"\"\n", + " assert close( distance( 1.0, 0.0, 1.0, 0.0 ), 0.0 ), '동일 지점 실패'\n", + " assert close( distance( 0.0, 0.0, 1.0, 0.0 ), 1.0 ), '단위 거리 실패'\n", + "\n", + "test_distance() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- (4) Python 터틀로 다음 그림을 그려보시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](http://openbookproject.net/thinkcs/python/english3e/_images/tess07.png)" + ] + }, { "cell_type": "markdown", "metadata": {}, From 64e7ea356a38a943550dbdaa9321228edb1eb498 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Thu, 22 Sep 2016 12:01:40 +0900 Subject: [PATCH 004/124] =?UTF-8?q?=E3=85=A1=E3=85=A1=E3=85=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-1.ipynb | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/assignment-1.ipynb b/assignment-1.ipynb index 4d74d73..33561a1 100644 --- a/assignment-1.ipynb +++ b/assignment-1.ipynb @@ -6,9 +6,8 @@ "source": [ "# Assignment 1\n", "### [정보]\n", - "#### 1) Due Date: 2015년 9월 23일 (수), 23시 59분\n", - "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github에 올려 해당 URL을 EL 사이트에 제출\n", - "##### - github url을 http://nbviewer.ipython.org에 넣어서 산출된 URL을 EL사이트에 제출해도 됨\n", + "#### 1) Due Date: 2015년 9월 30일 (금), 23시 59분\n", + "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.ipython.org에 넣어서 산출된 URL을 EL사이트에 제출\n", "#### 3) 내용: 반드시 python code와 수행 결과를 ipython notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 11개의 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", "#### 5) 문제 (프로젝트 오일러 3문제 포함하여 총 11개)" @@ -108,9 +107,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [Root]", "language": "python", - "name": "python2" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -122,7 +121,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.12" } }, "nbformat": 4, From ac67e0813e68326e3e8239ee49c40d07c1cf84c5 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Thu, 29 Sep 2016 00:34:00 +0900 Subject: [PATCH 005/124] m.c. --- supplement-2016-09.ipynb | 271 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 271 insertions(+) diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb index 51989ea..00dc0fb 100644 --- a/supplement-2016-09.ipynb +++ b/supplement-2016-09.ipynb @@ -7,6 +7,277 @@ "# 수업 보충 자료" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. E-learning 5, 6 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 조심해야 할 나누기 연산 " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "1.25\n", + "\n", + "-2\n", + "-1.25\n" + ] + } + ], + "source": [ + "print 5 / 4 # 자동으로 floor 처리 됨\n", + "print 5.0 / 4\n", + "print\n", + "print -5 / 4 # 자동으로 floor 처리 됨\n", + "print -5.0 / 4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- //: floor division\n", + " - 그러므로 '정수 // 정수' 결과는 '정수 / 정수'와 항상 동일 \n", + " - 하지만 실수에 대한 // 연산 결과는 floor division 이므로 정수형 실수로 결과나 나옴" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.5\n", + "0.0\n", + "\n", + "1.25\n", + "1.0\n", + "1\n", + "1\n", + "\n", + "-1.25\n", + "-2.0\n", + "-2\n", + "-2\n" + ] + } + ], + "source": [ + "print 1.0 / 2\n", + "print 1.0 // 2 # floor division\n", + "print\n", + "print 5.0 / 4\n", + "print 5.0 // 4 # floor division\n", + "print 5 / 4\n", + "print 5 // 4 # floor division\n", + "print \n", + "print -5.0 / 4\n", + "print -5.0 // 4 # floor division\n", + "print -5 / 4\n", + "print -5 // 4 # floor division" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 함수 내 디폴트 인자 선언시 조심할 점" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "non-default argument follows default argument (, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m def incr(x=1, y): # 디폴트 인자 뒤에 정상적인 인자 선언 안됨\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-default argument follows default argument\n" + ] + } + ], + "source": [ + "def incr(x=1, y): # 디폴트 인자 뒤에 정상적인 인자 선언 안됨\n", + " return x + y\n", + "\n", + "print incr(5)\n", + "\n", + "print incr(5, 10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 유용한 모듈 학습: 시각 다루기" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1475076684.95\n", + "\n", + "\n", + "totalSeconds - 1475076684\n", + "totalMinutes - 24584611\n", + "totalHours - 409743\n", + "현재 시각은 15 : 31 : 24 GMT 입니다.\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "currentTime = time.time() # Unix Epoch 부터 현재까지 경과된 시각 (GMT/UST 기준)을 실수형 초 단위로 최대한 정확하게 얻어온다.\n", + "print currentTime\n", + "print type(currentTime)\n", + "print\n", + "\n", + "totalSeconds = int(currentTime) # 1970년 1월 1일 0시 이후부터 현재시각까지의 정수형 초 값을 얻어온다.\n", + "print \"totalSeconds -\", totalSeconds\n", + "currentSecond = totalSeconds % 60 # 현재 시각의 초 값을 얻어온다.\n", + "\n", + "totalMinutes = totalSeconds // 60 # 전체 분 값을 계산한다. \n", + "print \"totalMinutes -\", totalMinutes\n", + "currentMinute = totalMinutes % 60 # 현재 시각의 분 값을 얻어온다.\n", + "\n", + "totalHours = totalMinutes // 60 # 전체 시 값을 계산한다.\n", + "print \"totalHours -\", totalHours\n", + "currentHours = totalHours % 24 # 현재 시각의 시 값을 얻어온다.\n", + "\n", + "print \"현재 시각은\", currentHours, \":\", currentMinute, \":\", currentSecond, \"GMT 입니다.\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 대한민국의 Time Zone 및 로컬타임 얻기" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('KST', 'KST')\n", + "\n", + "time.struct_time(tm_year=2016, tm_mon=9, tm_mday=29, tm_hour=0, tm_min=31, tm_sec=19, tm_wday=3, tm_yday=273, tm_isdst=0)\n" + ] + } + ], + "source": [ + "print time.tzname\n", + "print\n", + "localtime = time.localtime()\n", + "print localtime" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 코드 학습: 숫자 맞추기 게임 소스" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello! What is your name?\n", + "YHHAN\n", + "Well, YHHAN, I am thinking of a number between 1 and 20.\n", + "Take a guess.\n", + "10\n", + "Your guess is too low.\n", + "Take a guess.\n", + "15\n", + "Good job, YHHAN! You guessed my number in 2 guesses!\n" + ] + } + ], + "source": [ + "# This is a guess the number game.\n", + "import random\n", + "\n", + "guessesTaken = 0\n", + "\n", + "print('Hello! What is your name?')\n", + "myName = raw_input()\n", + "\n", + "number = random.randint(1, 20) # return random integer in range [a, b], including both end points.\n", + "print('Well, ' + myName + ', I am thinking of a number between 1 and 20.')\n", + "\n", + "while guessesTaken < 6:\n", + " print('Take a guess.') \n", + " guess = int(input())\n", + "\n", + " guessesTaken = guessesTaken + 1\n", + "\n", + " if guess < number:\n", + " print('Your guess is too low.')\n", + "\n", + " if guess > number:\n", + " print('Your guess is too high.')\n", + "\n", + " if guess == number:\n", + " break\n", + "\n", + "if guess == number:\n", + " guessesTaken = str(guessesTaken)\n", + " print('Good job, ' + myName + '! You guessed my number in ' + guessesTaken + ' guesses!')\n", + "\n", + "if guess != number:\n", + " number = str(number)\n", + " print('Nope. The number I was thinking of was ' + number)" + ] + }, { "cell_type": "markdown", "metadata": {}, From 62dd31048477c7e558d3a0f19a9b246b07a53841 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 5 Oct 2016 23:11:43 +0900 Subject: [PATCH 006/124] m.c. --- python07.ipynb | 1656 ++++++++++++++++++++++++------------------------ 1 file changed, 824 insertions(+), 832 deletions(-) diff --git a/python07.ipynb b/python07.ipynb index 7114e52..91eb40f 100644 --- a/python07.ipynb +++ b/python07.ipynb @@ -1,861 +1,853 @@ { - "metadata": { - "name": "", - "signature": "sha256:342e817c3bc43d8075a9acdfa4df23577c0a6c6e32d12981b3098f6af120183c" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 7. \ubb38\uc790\uc5f4 \uc815\uc758 \ubc0f \uae30\ucd08 \uc5f0\uc0b0\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc758 \uc9c0\uc6d0 \uc5f0\uc0b0\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774\ub780?\n", - "- \uc800\uc7a5\ub41c \uac01 \uc694\uc18c\ub97c \uc815\uc218 Index\ub97c \uc774\uc6a9\ud558\uc5ec \ucc38\uc870\uac00 \uac00\ub2a5\ud55c \uc790\ub8cc\ud615 \n", - "- \uc2dc\ud000\uc2a4(Sequence) \uc790\ub8cc\ud615: \ubb38\uc790\uc5f4, \ub9ac\uc2a4\ud2b8, \ud29c\ud50c" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'abcdef'\n", - "L = [100,200,300]\n", - "t = ('tuple', 'object', 1, 2)" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774 \uac00\uc9c0\ub294 \uacf5\ud1b5\uc801\uc778 \uc5f0\uc0b0\n", - " - \uc778\ub371\uc2f1 (Indexing)\n", - " - \uc2ac\ub77c\uc774\uc2f1 (Slicing)\n", - " - \ud655\uc7a5 \uc2ac\ub77c\uc774\uc2f1 (Extended Slicing)\n", - " - \uc5f0\uacb0 (Concatenation)\n", - " - \ubc18\ubcf5 (Repitition)\n", - " - \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8 (Membership Test)\n", - " - \uae38\uc774 \uc815\ubcf4 (Length)\n", - " - for ~ in \ubb38" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \uc778\ub371\uc2f1" + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 7. 문자열 정의 및 기초 연산\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 시퀀스 자료형의 지원 연산\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 시퀀스 자료형이란?\n", + "- 저장된 각 요소를 정수 Index를 이용하여 참조가 가능한 자료형 \n", + "- 시퀀스(Sequence) 자료형: 문자열, 리스트, 튜플" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = 'abcdef'\n", + "L = [100,200,300]\n", + "t = ('tuple', 'object', 1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 시퀀스 자료형이 가지는 공통적인 연산\n", + " - 인덱싱 (Indexing)\n", + " - 슬라이싱 (Slicing)\n", + " - 확장 슬라이싱 (Extended Slicing)\n", + " - 연결 (Concatenation)\n", + " - 반복 (Repitition)\n", + " - 멤버쉽 테스트 (Membership Test)\n", + " - 길이 정보 (Length)\n", + " - for ~ in 문" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 인덱싱" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a\n", + "b\n", + "f\n", + "\n", + "200\n", + "900\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'abcdef'\n", - "l = [100, 200, 300]\n", - "print s[0]\n", - "print s[1]\n", - "print s[-1]\n", - "print\n", - "print l[1]\n", - "l[1] = 900\n", - "print l[1]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "a\n", - "b\n", - "f\n", - "\n", - "200\n", - "900\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print l[100]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "IndexError", - "evalue": "list index out of range", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mIndexError\u001b[0m: list index out of range" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \uc2ac\ub77c\uc774\uc2f1\n", - "- L[start:end]: start\ub294 exclusive, end\ub294 inclusive" + } + ], + "source": [ + "s = 'abcdef'\n", + "l = [100, 200, 300]\n", + "print s[0]\n", + "print s[1]\n", + "print s[-1]\n", + "print\n", + "print l[1]\n", + "l[1] = 900\n", + "print l[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "IndexError", + "evalue": "list index out of range", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'abcdef'\n", - "L = [100, 200, 300]\n", + } + ], + "source": [ + "print l[100]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 슬라이싱\n", + "- L[start:end]: start는 inclusive, end는 exclusive" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bc\n", + "bcdef\n", + "abcdef\n", + "abcdef\n", "\n", - "print s[1:3]\n", - "print s[1:]\n", - "print s[:]\n", - "print s[-100:100]\n", - "print\n", - "print L[:-1] # L[:2] \uc640 \ub3d9\uc77c\n", - "print L[:2]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "bc\n", - "bcdef\n", - "abcdef\n", - "abcdef\n", - "\n", - "[100, 200]\n", - "[100, 200]\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ud655\uc7a5 \uc2ac\ub77c\uc774\uc2f1\n", - "- L[start:end:step]: \uc778\ub371\uc2f1\ub418\uc5b4\uc9c0\ub294 \uac01 \uc6d0\uc18c\ub4e4 \uc0ac\uc774\uc758 \uac70\ub9ac\uac00 \uc778\ub371\uc2a4 \uae30\uc900\uc73c\ub85c step \ub9cc\ud07c \ub5a8\uc5b4\uc9d0 " + "[100, 200]\n", + "[100, 200]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'abcd'\n", - "print s[::2] #step:2 - \uac01 \uc6d0\uc18c\ub4e4 \uc0ac\uc774\uc758 \uac70\ub9ac\uac00 \uc778\ub371\uc2a4 \uae30\uc900\uc73c\ub85c 2\uac00 \ub428\n", - "print s[::-1] #step:-1 - \uc67c\ucabd \ubc29\ud5a5\uc73c\ub85c 1\uce78\uc529" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ac\n", - "dcba\n" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-5 \uc5f0\uacb0\ud558\uae30" + } + ], + "source": [ + "s = 'abcdef'\n", + "L = [100, 200, 300]\n", + "\n", + "print s[1:3]\n", + "print s[1:]\n", + "print s[:]\n", + "print s[-100:100]\n", + "print\n", + "print L[:-1] # L[:2] 와 동일\n", + "print L[:2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 확장 슬라이싱\n", + "- L[start:end:step]: 인덱싱되어지는 각 원소들 사이의 거리가 인덱스 기준으로 step 만큼 떨어짐 " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ac\n", + "dcba\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'abc' + 'def'\n", - "print s\n", - "\n", - "L = [1,2,3] + [4,5,6]\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "abcdef\n", - "[1, 2, 3, 4, 5, 6]\n" - ] - } - ], - "prompt_number": 21 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-6 \ubc18\ubcf5\ud558\uae30" + } + ], + "source": [ + "s = 'abcd'\n", + "print s[::2] #step:2 - 각 원소들 사이의 거리가 인덱스 기준으로 2가 됨\n", + "print s[::-1] #step:-1 - 왼쪽 방향으로 1칸씩" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 연결하기" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abcdef\n", + "[1, 2, 3, 4, 5, 6]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'abc'\n", - "print s * 4\n", - "\n", - "L = [1,2,3]\n", - "print L * 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "abcabcabcabc\n", - "[1, 2, 3, 1, 2, 3]\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-7 \uba64\ubc84\uc2ed \ud14c\uc2a4\ud2b8" + } + ], + "source": [ + "s = 'abc' + 'def'\n", + "print s\n", + "\n", + "L = [1,2,3] + [4,5,6]\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-6 반복하기" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abcabcabcabc\n", + "[1, 2, 3, 1, 2, 3]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'abcde'\n", - "print 'c' in s\n", - "\n", - "t = (1,2,3,4,5)\n", - "print 2 in t\n", - "print 10 in t\n", - "print 10 not in t" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n", - "False\n", - "True\n" - ] - } - ], - "prompt_number": 25 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 'ab' in 'abcd'\n", - "print 'ad' in 'abcd'\n", - "print ' ' in 'abcd'\n", - "print ' ' in 'abcd '" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "False\n", - "False\n", - "True\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-8 \uae38\uc774 \uc815\ubcf4" + } + ], + "source": [ + "s = 'abc'\n", + "print s * 4\n", + "\n", + "L = [1,2,3]\n", + "print L * 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-7 멤버십 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "False\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'abcde'\n", - "l = [1,2,3]\n", - "t = (1, 2, 3, 4)\n", - "print len(s)\n", - "print len(l)\n", - "print len(t)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "5\n", - "3\n", - "4\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-9 for~in \ubb38" + } + ], + "source": [ + "s = 'abcde'\n", + "print 'c' in s\n", + "\n", + "t = (1,2,3,4,5)\n", + "print 2 in t\n", + "print 10 in t\n", + "print 10 not in t" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "False\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for c in 'abcd':\n", - " print c," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "a b c d\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ubb38\uc790\uc5f4 \uc815\uc758\ud558\uae30\n", - "***" + } + ], + "source": [ + "print 'ab' in 'abcd'\n", + "print 'ad' in 'abcd'\n", + "print ' ' in 'abcd'\n", + "print ' ' in 'abcd '" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-8 길이 정보" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n", + "3\n", + "4\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ud55c \uc904 \ubb38\uc790\uc5f4" + } + ], + "source": [ + "s = 'abcde'\n", + "l = [1,2,3]\n", + "t = (1, 2, 3, 4)\n", + "print len(s)\n", + "print len(l)\n", + "print len(t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-9 for~in 문" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a b c d\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = ''\n", - "str1 = 'Python is great!'\n", - "str2 = \"Yes, it is.\"\n", - "str3 = \"It's not like any other languages\"" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 30 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "str4 = 'Don\\'t walk. \"Run\"'\n", - "print str4" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Don't walk. \"Run\"\n" - ] - } - ], - "prompt_number": 32 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \\ : \ub2e4\uc74c \ub77c\uc778\uc774 \ud604\uc7ac \ub77c\uc778\uc758 \ub4a4\uc5d0 \uc774\uc5b4\uc9d0\uc744 \ub098\ud0c0\ub0c4 " + } + ], + "source": [ + "for c in 'abcd':\n", + " print c," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 문자열 정의하기\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 한 줄 문자열" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = ''\n", + "str1 = 'Python is great!'\n", + "str2 = \"Yes, it is.\"\n", + "str3 = \"It's not like any other languages\"" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Don't walk. \"Run\"\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "long_str = \"This is a rather long string \\\n", - "containing back slash and new line.\\nGood!\"\n", - "print long_str" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "This is a rather long string containing back slash and new line.\n", - "Good!\n" - ] - } - ], - "prompt_number": 33 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \uc5ec\ub7ec \uc904 \ubb38\uc790\uc5f4" + } + ], + "source": [ + "str4 = 'Don\\'t walk. \"Run\"'\n", + "print str4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \\ : 다음 라인이 현재 라인의 뒤에 이어짐을 나타냄 " + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is a rather long string containing back slash and new line.\n", + "Good!\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "multiline = \"\"\" While the rest of the world has been catching on to\n", + } + ], + "source": [ + "long_str = \"This is a rather long string \\\n", + "containing back slash and new line.\\nGood!\"\n", + "print long_str" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 여러 줄 문자열" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " While the rest of the world has been catching on to\n", "the Perl scripting language, the Linux commnunity,\n", "long since past the pleasing shock of Perl's power,\n", - "has been catching on to a different scripting animal -- Python.\"\"\"\n", - "print multiline\n", - "print\n", - "ml = ''' While the rest of the world has been catching on to\n", + "has been catching on to a different scripting animal -- Python.\n", + "\n", + " While the rest of the world has been catching on to\n", "the Perl scripting language, the Linux commnunity,\n", "long since past the pleasing shock of Perl's power,\n", - "has been catching on to a different scripting animal -- Python.'''\n", - "print ml" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " While the rest of the world has been catching on to\n", - "the Perl scripting language, the Linux commnunity,\n", - "long since past the pleasing shock of Perl's power,\n", - "has been catching on to a different scripting animal -- Python.\n", - "\n", - " While the rest of the world has been catching on to\n", - "the Perl scripting language, the Linux commnunity,\n", - "long since past the pleasing shock of Perl's power,\n", - "has been catching on to a different scripting animal -- Python.\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790 (Escape Characters)\n", - "- \ubb38\uc790\uc5f4 \ub0b4\ubd80\uc758 \uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790\n", + "has been catching on to a different scripting animal -- Python.\n" + ] + } + ], + "source": [ + "multiline = \"\"\" While the rest of the world has been catching on to\n", + "the Perl scripting language, the Linux commnunity,\n", + "long since past the pleasing shock of Perl's power,\n", + "has been catching on to a different scripting animal -- Python.\"\"\"\n", + "print multiline\n", + "print\n", + "ml = ''' While the rest of the world has been catching on to\n", + "the Perl scripting language, the Linux commnunity,\n", + "long since past the pleasing shock of Perl's power,\n", + "has been catching on to a different scripting animal -- Python.'''\n", + "print ml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 이스케이프 문자 (Escape Characters)\n", + "- 문자열 내부의 이스케이프 문자\n", + "\n", + "| 이스케이프 문자 | 의미 |\n", + "|--------------|--------------|\n", + "| \\ \\ | \\ |\n", + "| \\' | ' |\n", + "| \\\" | \" |\n", + "| \\b | 백스페이스 |\n", + "| \\n | 개행 |\n", + "| \\t | 탭 |\n", + "| \\0nn | 8진법 수 nn |\n", + "| \\xnn | 16진법 수 nn |" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\abc\\\n", + "\n", + "abc\tdef\tghi\n", "\n", - "| \uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790 | \uc758\ubbf8 |\n", - "|--------------|--------------|\n", - "| \\ \\ | \\ |\n", - "| \\' | ' |\n", - "| \\\" | \" |\n", - "| \\b | \ubc31\uc2a4\ud398\uc774\uc2a4 |\n", - "| \\n | \uac1c\ud589 |\n", - "| \\t | \ud0ed |\n", - "| \\0nn | 8\uc9c4\ubc95 \uc218 nn |\n", - "| \\xnn | 16\uc9c4\ubc95 \uc218 nn |" + "a\n", + "b\n", + "c\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print '\\\\abc\\\\'\n", - "print\n", - "print 'abc\\tdef\\tghi'\n", - "print\n", - "print 'a\\nb\\nc'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\\abc\\\n", - "\n", - "abc\tdef\tghi\n", - "\n", - "a\n", - "b\n", - "c\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \ubb38\uc790\uc5f4 \uc5f0\uc0b0" + } + ], + "source": [ + "print '\\\\abc\\\\'\n", + "print\n", + "print 'abc\\tdef\\tghi'\n", + "print\n", + "print 'a\\nb\\nc'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 문자열 연산" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "First String Second String\n", + "First StringFirst StringFirst String\n", + "\n", + "r\n", + "irst Strin\n", + "12\n", + "\n", + "First String\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "str1 = 'First String'\n", - "str2 = 'Second String'\n", - "str3 = str1 + ' ' + str2\n", - "print str3\n", - "print str1 * 3\n", - "print\n", - "print str1[2]\n", - "print str1[1:-1]\n", - "print len(str1)\n", - "print\n", - "print str1[0:len(str1)]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "First String Second String\n", - "First StringFirst StringFirst String\n", - "\n", - "r\n", - "irst Strin\n", - "12\n", - "\n", - "First String\n" - ] - } - ], - "prompt_number": 21 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubb38\uc790\uc5f4 \uc790\ub8cc - Immutable (\ubcc0\uacbd\ubd88\uac00\ub2a5)" + } + ], + "source": [ + "str1 = 'First String'\n", + "str2 = 'Second String'\n", + "str3 = str1 + ' ' + str2\n", + "print str3\n", + "print str1 * 3\n", + "print\n", + "print str1[2]\n", + "print str1[1:-1]\n", + "print len(str1)\n", + "print\n", + "print str1[0:len(str1)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열 자료 - Immutable (변경불가능)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'str' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstr1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'f'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "str1[0] = 'f'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'str' object does not support item assignment", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstr1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'f'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" - ] - } - ], - "prompt_number": 47 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "str1[0:3] = 'abc'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'str' object does not support item assignment", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstr1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" - ] - } - ], - "prompt_number": 48 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubb38\uc790\uc5f4 \ubcc0\uacbd\uc744 \uc704\ud574\uc11c\ub294 \uc5ec\ub7ec Slicing \uc5f0\uacb0 \ud65c\uc6a9\n", - " - [\uc8fc\uc758] \ubb38\uc790\uc5f4 \uc790\uccb4\uac00 \ubcc0\uacbd\ub418\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4\uc744 \uc0dd\uc131\ud558\uc5ec \uc7ac\ud560\ub2f9\ud558\ub294 \uac83\uc784" + } + ], + "source": [ + "str1[0] = 'f'" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'str' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstr1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'spam and egg'\n", - "s = s[:4] + ', cheese, ' + s[5:]\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "spam, cheese, and egg\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-4 \uc720\ub2c8\ucf54\ub4dc" + } + ], + "source": [ + "str1[0:3] = 'abc'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열 변경을 위해서는 여러 Slicing 연결 활용\n", + " - [주의] 문자열 자체가 변경되는 것이 아니라 새로운 문자열을 생성하여 재할당하는 것임" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "spam, cheese, and egg\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub2e4\uad6d\uc5b4 \ubb38\uc790\uc758 \uc62c\ubc14\ub978 \ud45c\ud604\uc744 \uc704\ud558\uc5ec \uc720\ub2c8\ucf54\ub4dc \ud0c0\uc785 \uc9c0\uc6d0\uc774 \ub428\n", - "- \uc720\ub2c8\ucf54\ub4dc \ud0c0\uc785\uc758 \ubb38\uc790\uc5f4 \ub9ac\ud130\ub7f4: u'Hello'" + } + ], + "source": [ + "s = 'spam and egg'\n", + "s = s[:4] + ', cheese, ' + s[5:]\n", + "print s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 유니코드" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다국어 문자의 올바른 표현을 위하여 유니코드 타입 지원이 됨\n", + "- 유니코드 타입의 문자열 리터럴: u'Hello'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Spam and Egg\n", + "\n", + "\n", + "a\n", + "\n", + "bc\n", + "\n", + "\n", + "abc\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print u'Spam and Egg'\n", - "print \n", - "a = 'a'\n", - "b = u'bc'\n", - "print type(a)\n", - "print a\n", - "print type(b)\n", - "print b\n", - "print\n", - "c = a + b # \uc77c\ubc18 \ubb38\uc790\uc5f4\uacfc \uc720\ub2c8\ucf54\ub4dc\ub97c \ud569\uce58\uba74 \uc720\ub2c8\ucf54\ub4dc\ub85c \ubcc0\ud658\n", - "print type(c)\n", - "print c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Spam and Egg\n", - "\n", - "\n", - "a\n", - "\n", - "bc\n", - "\n", - "\n", - "abc\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print u'Spam \\uB610 Egg' # \ubb38\uc790\uc5f4 \ub0b4\uc5d0 \uc720\ud2f0\ucf54\ub4dc \uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790\uc778 \\uHHHH \uc0ac\uc6a9\uac00\ub2a5, HHHH\ub294 4\uc790\ub9ac 16\uc9c4\uc218 (unicode \ud3ec\ub9f7)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Spam \ub610 Egg\n" - ] - } - ], - "prompt_number": 20 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = unicode('\ud55c\uae00', 'utf-8') # '\ud55c\uae00' \ubb38\uc790\uc5f4\uc758 \uc778\ucf54\ub529 \ubc29\uc2dd\uc744 'utf-8'\ud615\ud0dc\ub85c \uc778\uc2dd\uc2dc\ud0a4\uba74\uc11c \ud574\ub2f9 \ubb38\uc790\uc5f4\uc744 unicode\ub85c \ubcc0\ud658\n", - "print type(a)\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\ud55c\uae00\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print len('\ud55c\uae00\uacfc \uc138\uc885\ub300\uc655')\n", - "print len(unicode('\ud55c\uae00\uacfc \uc138\uc885\ub300\uc655', 'utf-8')) #\uc720\ub2c8\ucf54\ub4dc \ud0c0\uc785\uc758 \ubb38\uc790\uc5f4\uc740 \ud55c\uae00 \ubb38\uc790\uc5f4 \uae38\uc774\ub97c \uc62c\ubc14\ub974\uac8c \ubc18\ud658\ud568\n", - "print len(u'\ud55c\uae00\uacfc \uc138\uc885\ub300\uc655')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "22\n", - "8\n", - "8\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "u = unicode('\ud55c\uae00\uacfc \uc138\uc885\ub300\uc655', 'utf-8') #\uc720\ub2c8\ucf54\ub4dc \ud0c0\uc785\uc758 \ud55c\uae00 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud574\uc11c\ub294 \uc778\ub371\uc2f1 \ubc0f \uc2ac\ub77c\uc774\uc2f1\uc774 \uc62c\ubc14\ub974\uac8c \uc218\ud589\ub428 \n", - "print u[0]\n", - "print u[1]\n", - "print u[:3]\n", - "print u[4:]\n", - "print u[::-1]\n", - "print\n", - "u2 = u'\ud55c\uae00\uacfc \uc138\uc885\ub300\uc655' \n", - "print u2[0]\n", - "print u2[1]\n", - "print u2[:3]\n", - "print u2[4:]\n", - "print u2[::-1]\n", - "print \n", - "u3 = '\ud55c\uae00\uacfc \uc138\uc885\ub300\uc655'\n", - "print u3[0]\n", - "print u3[1]\n", - "print u3[:3]\n", - "print u3[4:]\n", - "print u3[::-1]\n", - "print" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\ud55c\n", - "\uae00\n", - "\ud55c\uae00\uacfc\n", - "\uc138\uc885\ub300\uc655\n", - "\uc655\ub300\uc885\uc138 \uacfc\uae00\ud55c\n", - "\n", - "\ud55c\n", - "\uae00\n", - "\ud55c\uae00\uacfc\n", - "\uc138\uc885\ub300\uc655\n", - "\uc655\ub300\uc885\uc138 \uacfc\uae00\ud55c\n", - "\n", - "\ufffd\n", - "\ufffd\n", - "\ud55c\n", - "\ufffd\ufffd\uacfc \uc138\uc885\ub300\uc655\n", - "\ufffd\ufffd\uc00c\ub162\uce04\ufffd \ufffd\ufffd\ua038\ua715\ufffd\n", - "\n" - ] - } - ], - "prompt_number": 22 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "print u'Spam and Egg'\n", + "print \n", + "a = 'a'\n", + "b = u'bc'\n", + "print type(a)\n", + "print a\n", + "print type(b)\n", + "print b\n", + "print\n", + "c = a + b # 일반 문자열과 유니코드를 합치면 유니코드로 변환\n", + "print type(c)\n", + "print c" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Spam 또 Egg\n" + ] + } + ], + "source": [ + "print u'Spam \\uB610 Egg' # 문자열 내에 유티코드 이스케이프 문자인 \\uHHHH 사용가능, HHHH는 4자리 16진수 (unicode 포맷)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "한글\n" + ] + } + ], + "source": [ + "a = unicode('한글', 'utf-8') # '한글' 문자열의 인코딩 방식을 'utf-8'형태로 인식시키면서 해당 문자열을 unicode로 변환\n", + "print type(a)\n", + "print a" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22\n", + "8\n", + "8\n" + ] + } + ], + "source": [ + "print len('한글과 세종대왕')\n", + "print len(unicode('한글과 세종대왕', 'utf-8')) #유니코드 타입의 문자열은 한글 문자열 길이를 올바르게 반환함\n", + "print len(u'한글과 세종대왕')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "한\n", + "글\n", + "한글과\n", + "세종대왕\n", + "왕대종세 과글한\n", + "\n", + "한\n", + "글\n", + "한글과\n", + "세종대왕\n", + "왕대종세 과글한\n", + "\n", + "�\n", + "�\n", + "한\n", + "��과 세종대왕\n", + "��쀌녢츄� ��ꀸ꜕�\n", + "\n" ] } ], - "metadata": {} + "source": [ + "u = unicode('한글과 세종대왕', 'utf-8') #유니코드 타입의 한글 문자열에 대해서는 인덱싱 및 슬라이싱이 올바르게 수행됨 \n", + "print u[0]\n", + "print u[1]\n", + "print u[:3]\n", + "print u[4:]\n", + "print u[::-1]\n", + "print\n", + "u2 = u'한글과 세종대왕' \n", + "print u2[0]\n", + "print u2[1]\n", + "print u2[:3]\n", + "print u2[4:]\n", + "print u2[::-1]\n", + "print \n", + "u3 = '한글과 세종대왕'\n", + "print u3[0]\n", + "print u3[1]\n", + "print u3[:3]\n", + "print u3[4:]\n", + "print u3[::-1]\n", + "print" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 0 +} From 558c0783cb9006cbffd9d50159deeb7f81f8bbe1 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 5 Oct 2016 23:26:07 +0900 Subject: [PATCH 007/124] m.c. --- python08.ipynb | 1276 ++++++++++++++++++++++++------------------------ 1 file changed, 634 insertions(+), 642 deletions(-) diff --git a/python08.ipynb b/python08.ipynb index 5bfdf35..d5aa40c 100644 --- a/python08.ipynb +++ b/python08.ipynb @@ -1,683 +1,675 @@ { - "metadata": { - "name": "", - "signature": "sha256:f8e3501595a8ca4a8002bf601a3a1e5435ccb725a2f0bdd39beb4f77729396d9" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 8. 문자열 메소드와 포멧팅\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 문자열 메소드(Methods)\n", + "***" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 8. \ubb38\uc790\uc5f4 \uba54\uc18c\ub4dc\uc640 \ud3ec\uba67\ud305\n", - "***\n", - "***" + "name": "stdout", + "output_type": "stream", + "text": [ + "I LIKE PROGRAMMING.\n", + "i like programming.\n", + "i lIKE pROGRAMMING\n", + "I like programming.\n", + "I Like Programming.\n" ] - }, + } + ], + "source": [ + "s = 'i like programming.'\n", + "print s.upper()\n", + "print s.upper().lower()\n", + "print 'I Like Programming'.swapcase() # 대문자는 소문자로, 소문자는 대문자로 변환\n", + "print s.capitalize() # 첫 문자를 대문자로 변환\n", + "print s.title() # 각 단어의 첫 문자를 대문자로 변환 " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ubb38\uc790\uc5f4 \uba54\uc18c\ub4dc(Methods)\n", - "***" + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "\n", + "2\n", + "7\n", + "7\n", + "-1\n", + "\n", + "22\n", + "-1\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'i like programming.'\n", - "print s.upper()\n", - "print s.upper().lower()\n", - "print 'I Like Programming'.swapcase() # \ub300\ubb38\uc790\ub294 \uc18c\ubb38\uc790\ub85c, \uc18c\ubb38\uc790\ub294 \ub300\ubb38\uc790\ub85c \ubcc0\ud658\n", - "print s.capitalize() # \uccab \ubb38\uc790\ub97c \ub300\ubb38\uc790\ub85c \ubcc0\ud658\n", - "print s.title() # \uac01 \ub2e8\uc5b4\uc758 \uccab \ubb38\uc790\ub97c \ub300\ubb38\uc790\ub85c \ubcc0\ud658 " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "I LIKE PROGRAMMING.\n", - "i like programming.\n", - "i lIKE pROGRAMMING\n", - "I like programming.\n", - "I Like Programming.\n" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'i like programming, i like swimming.'\n", - "print s.count('like') # 'like' \ubb38\uc790\uc5f4\uc774 \ucd9c\ud604\ud55c \ud69f\uc218\ub97c \ubc18\ud658\n", - "print\n", - "print s.find('like') # 'like'\uc758 \uccab\uae00\uc790 \uc704\uce58 (offset)\ub97c \ubc18\ud658\n", - "print s.find('programming') # 'programming'\uc758 \uccab\uae00\uc790 \uc704\uce58\ub97c \ubc18\ud658\n", - "print s.find('programmin') # 'programmin'\uc758 \uccab\uae00\uc790 \uc704\uce58\ub97c \ubc18\ud658\n", - "print s.find('programmii') # 'programmii' \ub2e8\uc5b4\ub294 \uc5c6\uae30 \ub54c\ubb38\uc5d0 -1 \ubc18\ud658\n", - "print\n", - "print s.find('like', 3) # offset=3 \ubd80\ud130 'like'\uc744 \uac80\uc0c9\ud558\uc5ec 'like'\uc758 \uccab\uae00\uc790 \uc704\uce58 \ubc18\ud658 \n", - "print s.find('my') # 'my' \ub2e8\uc5b4\ub294 \uc5c6\uae30 \ub54c\ubb38\uc5d0 -1 \ubc18\ud658" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "\n", - "2\n", - "7\n", - "7\n", - "-1\n", - "\n", - "22\n", - "-1\n" - ] - } - ], - "prompt_number": 1 - }, + } + ], + "source": [ + "s = 'i like programming, i like swimming.'\n", + "print s.count('like') # 'like' 문자열이 출현한 횟수를 반환\n", + "print\n", + "print s.find('like') # 'like'의 첫글자 위치 (offset)를 반환\n", + "print s.find('programming') # 'programming'의 첫글자 위치를 반환\n", + "print s.find('programmin') # 'programmin'의 첫글자 위치를 반환\n", + "print s.find('programmii') # 'programmii' 단어는 없기 때문에 -1 반환\n", + "print\n", + "print s.find('like', 3) # offset=3 부터 'like'을 검색하여 'like'의 첫글자 위치 반환 \n", + "print s.find('my') # 'my' 단어는 없기 때문에 -1 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'i like programming, i like swimming.'\n", - "print s.startswith('i like') # 'i like'\ub85c \uc2dc\uc791\ud558\ub294 \ubb38\uc790\uc5f4\uc778\uc9c0 \ud310\ub2e8\n", - "print s.startswith('I like') # \ub300\uc18c\ubb38\uc790 \uad6c\ubcc4\n", - "print\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", "\n", - "print s.endswith('swimming.') # 'swimming.'\ub85c \ub05d\ub098\ub294 \ubb38\uc790\uc5f4\uc778\uc9c0 \ud310\ub2e8\n", - "print s.startswith('progr', 7) # 7\ubc88\uc9f8 \ubb38\uc790\uc5f4\uc774 'progr'\ub85c \uc2dc\uc791\ud558\ub294\uc9c0 \ud310\ub2e8\n", - "print" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "False\n", - "\n", - "True\n", - "True\n", - "\n" - ] - } - ], - "prompt_number": 2 - }, + "True\n", + "True\n", + "\n" + ] + } + ], + "source": [ + "s = 'i like programming, i like swimming.'\n", + "print s.startswith('i like') # 'i like'로 시작하는 문자열인지 판단\n", + "print s.startswith('I like') # 대소문자 구별\n", + "print\n", + "\n", + "print s.endswith('swimming.') # 'swimming.'로 끝나는 문자열인지 판단\n", + "print s.startswith('progr', 7) # 7번째 문자열이 'progr'로 시작하는지 판단\n", + "print" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "u = ' spam and ham '\n", - "print u.strip() # \uc88c\uc6b0 \uacf5\ubc31\uc744 \uc81c\uac70\ud558\uc5ec \uc0c8\ub85c\uc6b4 \uc2a4\ud2b8\ub9c1 \uc0dd\uc131\n", - "print u # \uc2a4\ud2b8\ub9c1\uc740 \ubcc0\uacbd\ubd88\uac00\ub2a5 \n", - "y = u.strip() # strip()\ub294 \uc0c8\ub85c\uc6b4 \uc2a4\ud2b8\ub9c1\uc744 \uc0dd\uc131\ud568\n", - "print y\n", - "print\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "spam and ham\n", + " spam and ham \n", + "spam and ham\n", "\n", - "print u.rstrip() # \uc624\ub978\ucabd \uacf5\ubc31 \uc81c\uac70\n", - "print u.lstrip() # \uc67c\ucabd \uacf5\ubc31 \uc81c\uac70 \n", - "print ' abc '.strip() \n", - "print '><><><>'.strip('<>') # \uc778\uc790\ub85c \uc8fc\uc5b4\uc9c4 \uc2a4\ud2b8\ub9c1 \uc548\uc5d0 \uc9c0\uc815\ub41c \ubaa8\ub4e0 \ubb38\uc790\ub97c \uc88c\uc6b0\uc5d0\uc11c \uc81c\uac70" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "spam and ham\n", - " spam and ham \n", - "spam and ham\n", - "\n", - " spam and ham\n", - "spam and ham \n", - "abc\n", - "abc\n" - ] - } - ], - "prompt_number": 4 - }, + " spam and ham\n", + "spam and ham \n", + "abc\n", + "abc\n" + ] + } + ], + "source": [ + "u = ' spam and ham '\n", + "print u.strip() # 좌우 공백을 제거하여 새로운 스트링 생성\n", + "print u # 스트링은 변경불가능 \n", + "y = u.strip() # strip()는 새로운 스트링을 생성함\n", + "print y\n", + "print\n", + "\n", + "print u.rstrip() # 오른쪽 공백 제거\n", + "print u.lstrip() # 왼쪽 공백 제거 \n", + "print ' abc '.strip() \n", + "print '><><><>'.strip('<>') # 인자로 주어진 스트링 안에 지정된 모든 문자를 좌우에서 제거" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "p = ' \\t abc \\t '\n", - "print p\n", - "print p.strip() # \\t\ub3c4 \uacf5\ubc31\ubb38\uc790\uc774\ubbc0\ub85c \uc81c\uac70\ub428" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " \t abc \t \n", - "abc\n" - ] - } - ], - "prompt_number": 2 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + " \t abc \t \n", + "abc\n" + ] + } + ], + "source": [ + "p = ' \\t abc \\t '\n", + "print p\n", + "print p.strip() # \\t도 공백문자이므로 제거됨" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "u = 'spam and ham'\n", - "print u.replace('spam', 'spam, egg') # replace()\ub294 \uc0c8\ub85c\uc6b4 \uc2a4\ud2b8\ub9c1\uc744 \uc0dd\uc131\ud568\n", - "print u" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "spam, egg and ham\n", - "spam and ham\n" - ] - } - ], - "prompt_number": 3 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "spam, egg and ham\n", + "spam and ham\n" + ] + } + ], + "source": [ + "u = 'spam and ham'\n", + "print u.replace('spam', 'spam, egg') # replace()는 새로운 스트링을 생성함\n", + "print u" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "u = ' spam and ham '\n", - "print u.split() # \uacf5\ubc31\uc73c\ub85c \ubd84\ub9ac (\ubaa8\ub4e0 \uacf5\ubc31 \uc81c\uac70 \ubc0f \ubb38\uc790\uc5f4 \ub0b4\uc758 \ub2e8\uc5b4 \ub9ac\uc2a4\ud2b8\ub97c \uc5bb\uc744 \uc218 \uc788\uc74c)\n", - "print u.split('and') # 'and'\ub85c \ubd84\ub9ac\n", - "print\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "['spam', 'and', 'ham']\n", + "[' spam ', ' ham ']\n", "\n", - "u2 = 'spam and ham\\tegg\\ncheese'\n", - "print u2.split()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['spam', 'and', 'ham']\n", - "[' spam ', ' ham ']\n", - "\n", - "['spam', 'and', 'ham', 'egg', 'cheese']\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "u = 'spam ham\\tegg\\ncheese'\n", - "t = u.split() # \ubb38\uc790\uc5f4 \ub0b4\uc758 \ub2e8\uc5b4 \ub9ac\uc2a4\ud2b8 \n", - "print t\n", - "print\n", - "t2 = ':'.join(t) # \ub9ac\uc2a4\ud2b8 t \ub0b4\ubd80\uc758 \uac01 \uc6d0\uc18c\ub4e4\uc744 ':'\ub85c \uc5f0\uacb0\ud55c \ubb38\uc790\uc5f4 \ubc18\ud658\n", - "print type(t2)\n", - "print t2\n", - "print\n", - "t3 = \",\".join(t) # \ub9ac\uc2a4\ud2b8 t \ub0b4\ubd80\uc758 \uac01 \uc6d0\uc18c\ub4e4\uc744 ','\uc73c\ub85c \uc5f0\uacb0\ud55c \ubb38\uc790\uc5f4 \ubc18\ud658\n", - "print t3\n", - "print\n", - "t4 = '\\n'.join(t) # \ub9ac\uc2a4\ud2b8 t \ub0b4\ubd80\uc758 \uac01 \uc6d0\uc18c\ub4e4\uc744 '\\n'\uc73c\ub85c \uc5f0\uacb0\ud55c \ubb38\uc790\uc5f4 \ubc18\ud658\n", - "print t4\n", - "print" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['spam', 'ham', 'egg', 'cheese']\n", - "\n", - "\n", - "spam:ham:egg:cheese\n", - "\n", - "spam,ham,egg,cheese\n", - "\n", - "spam\n", - "ham\n", - "egg\n", - "cheese\n", - "\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "u2 = u\"\uc2a4\ud338 \ud584 \uacc4\ub780 \uce58\uc988\"\n", - "t2 = u2.split()\n", - "print t2\n", - "print t2[0], t2[1], t2[2], t2[3]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[u'\\uc2a4\\ud338', u'\\ud584', u'\\uacc4\\ub780', u'\\uce58\\uc988']\n", - "\uc2a4\ud338 \ud584 \uacc4\ub780 \uce58\uc988\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "lines = '''first line\n", - "second line\n", - "third line'''\n", - "print type(lines)\n", - "lines2 = lines.splitlines() # \ubb38\uc790\uc5f4\uc744 \ub77c\uc778 \ub2e8\uc704\ub85c \ubd84\ub9ac\ud55c \uac01 \uc6d0\uc18c\ub4e4\uc744 \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", - "print type(lines2)\n", - "print lines2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "['first line', 'second line', 'third line']\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "u = 'spam and egg'\n", - "c = u.center(60) # 60\uc790\ub9ac\ub97c \ud655\ubcf4\ud558\ub418 \uae30\uc874 \ubb38\uc790\uc5f4\uc744 \uac00\uc6b4\ub370 \uc815\ub82c\ud55c \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4 \ubc18\ud658\n", - "print type(c)\n", - "print c\n", - "print u.ljust(60) # 60\uc790\ub9ac\ub97c \ud655\ubcf4\ud558\ub418 \uae30\uc874 \ubb38\uc790\uc5f4\uc744 \uc67c\ucabd \uc815\ub82c\ud55c \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4 \ubc18\ud658\n", - "print u.rjust(60) # 60\uc790\ub9ac\ub97c \ud655\ubcf4\ud558\ub418 \uae30\uc874 \ubb38\uc790\uc5f4\uc744 \uc624\ub978\ucabd \uc815\ub82c\ud55c \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4 \ubc18\ud658" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - " spam and egg \n", - "spam and egg \n", - " spam and egg\n" - ] - } - ], - "prompt_number": 34 - }, + "['spam', 'and', 'ham', 'egg', 'cheese']\n" + ] + } + ], + "source": [ + "u = ' spam and ham '\n", + "print u.split() # 공백으로 분리 (모든 공백 제거 및 문자열 내의 단어 리스트를 얻을 수 있음)\n", + "print u.split('and') # 'and'로 분리\n", + "print\n", + "\n", + "u2 = 'spam and ham\\tegg\\ncheese'\n", + "print u2.split()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "u = 'spam and egg'\n", - "print u.center(60, '-') # \uacf5\ubc31\uc5d0 \ucc44\uc6cc\uc9c8 \ubb38\uc790\ub97c \uc120\ud0dd\ud560 \uc218 \uc788\uc74c\n", - "print u.ljust(60, '-')\n", - "print u.rjust(60, '-')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "------------------------spam and egg------------------------\n", - "spam and egg------------------------------------------------\n", - "------------------------------------------------spam and egg\n" - ] - } - ], - "prompt_number": 12 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "['spam', 'ham', 'egg', 'cheese']\n", + "\n", + "\n", + "spam:ham:egg:cheese\n", + "\n", + "spam,ham,egg,cheese\n", + "\n", + "spam\n", + "ham\n", + "egg\n", + "cheese\n", + "\n" + ] + } + ], + "source": [ + "u = 'spam ham\\tegg\\ncheese'\n", + "t = u.split() # 문자열 내의 단어 리스트 \n", + "print t\n", + "print\n", + "t2 = ':'.join(t) # 리스트 t 내부의 각 원소들을 ':'로 연결한 문자열 반환\n", + "print type(t2)\n", + "print t2\n", + "print\n", + "t3 = \",\".join(t) # 리스트 t 내부의 각 원소들을 ','으로 연결한 문자열 반환\n", + "print t3\n", + "print\n", + "t4 = '\\n'.join(t) # 리스트 t 내부의 각 원소들을 '\\n'으로 연결한 문자열 반환\n", + "print t4\n", + "print" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "print '1234'.isdigit() # \ubb38\uc790\uc5f4 \ub0b4\uc758 Character\ub4e4\uc774 \ubaa8\ub450 \uc22b\uc790\uc778\uac00?\n", - "print 'abcd'.isalpha() # \ubb38\uc790\uc5f4 \ub0b4\uc758 Character\ub4e4\uc774 \ubaa8\ub450 \uc601\ubb38\uc790\uc778\uac00?\n", - "print '1abc234'.isalnum() # \ubb38\uc790\uc5f4 \ub0b4\uc758 Character\ub4e4\uc774 \ubaa8\ub450 \uc601\ubb38\uc790 \ub610\ub294 \uc22b\uc790\uc778\uac00? \n", - "print 'abc'.islower() # \ubb38\uc790\uc5f4 \ub0b4\uc758 Character\ub4e4\uc774 \ubaa8\ub450 \uc18c\ubb38\uc790\uc778\uac00?\n", - "print 'ABC'.isupper() # \ubb38\uc790\uc5f4 \ub0b4\uc758 Character\ub4e4\uc774 \ubaa8\ub450 \ub300\ubb38\uc790\uc778\uac00?\n", - "print '\\t\\r\\n'.isspace() # \ubb38\uc790\uc5f4 \ub0b4\uc758 Character\ub4e4\uc774 \ubaa8\ub450 \uacf5\ubc31 \ubb38\uc790\uc778\uac00?\n", - "print 'This Is A Title'.istitle() # \ubb38\uc790\uc5f4\uc774 Title \ud615\uc2dd (\uac01 \ub2e8\uc5b4\uc758 \uccab\uae00\uc790\uac00 \ub300\ubb38\uc790)\uc778\uac00?" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n", - "True\n", - "True\n", - "True\n", - "True\n", - "True\n" - ] - } - ], - "prompt_number": 42 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "[u'\\uc2a4\\ud338', u'\\ud584', u'\\uacc4\\ub780', u'\\uce58\\uc988']\n", + "스팸 햄 계란 치즈\n" + ] + } + ], + "source": [ + "u2 = u\"스팸 햄 계란 치즈\"\n", + "t2 = u2.split()\n", + "print t2\n", + "print t2[0], t2[1], t2[2], t2[3]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = '123'\n", - "print s.zfill(5) # 5\uae00\uc790 \uc790\ub9ac \ud655\ubcf4\ub4a4 \ubb38\uc790\uc5f4\uc744 \uc4f0\ub418 \ub0a8\ub294 \uacf5\ubc31\uc5d0\ub294 zero (0)\ub97c \ucc44\uc6c0 \n", - "print 'goofy'.zfill(6) # 6\uae00\uc790 \uc790\ub9ac \ud655\ubcf4\ub4a4 ..." - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "00123\n", - "0goofy\n" - ] - } - ], - "prompt_number": 45 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "['first line', 'second line', 'third line']\n" + ] + } + ], + "source": [ + "lines = '''first line\n", + "second line\n", + "third line'''\n", + "print type(lines)\n", + "lines2 = lines.splitlines() # 문자열을 라인 단위로 분리한 각 원소들을 지닌 리스트 반환\n", + "print type(lines2)\n", + "print lines2" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ubb38\uc790\uc5f4 \ud3ec\ub9e4\ud305\n", - "***" + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " spam and egg \n", + "spam and egg \n", + " spam and egg\n" ] - }, + } + ], + "source": [ + "u = 'spam and egg'\n", + "c = u.center(60) # 60자리를 확보하되 기존 문자열을 가운데 정렬한 새로운 문자열 반환\n", + "print type(c)\n", + "print c\n", + "print u.ljust(60) # 60자리를 확보하되 기존 문자열을 왼쪽 정렬한 새로운 문자열 반환\n", + "print u.rjust(60) # 60자리를 확보하되 기존 문자열을 오른쪽 정렬한 새로운 문자열 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ud29c\ud50c\uc744 \uc774\uc6a9\ud55c \ud3ec\ub9e4\ud305" + "name": "stdout", + "output_type": "stream", + "text": [ + "------------------------spam and egg------------------------\n", + "spam and egg------------------------------------------------\n", + "------------------------------------------------spam and egg\n" ] - }, + } + ], + "source": [ + "u = 'spam and egg'\n", + "print u.center(60, '-') # 공백에 채워질 문자를 선택할 수 있음\n", + "print u.ljust(60, '-')\n", + "print u.rjust(60, '-')" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1) \ubb38\uc790\uc5f4 \ubcc0\ud658" + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n", + "True\n", + "True\n", + "True\n" ] - }, + } + ], + "source": [ + "print '1234'.isdigit() # 문자열 내의 Character들이 모두 숫자인가?\n", + "print 'abcd'.isalpha() # 문자열 내의 Character들이 모두 영문자인가?\n", + "print '1abc234'.isalnum() # 문자열 내의 Character들이 모두 영문자 또는 숫자인가? \n", + "print 'abc'.islower() # 문자열 내의 Character들이 모두 소문자인가?\n", + "print 'ABC'.isupper() # 문자열 내의 Character들이 모두 대문자인가?\n", + "print '\\t\\r\\n'.isspace() # 문자열 내의 Character들이 모두 공백 문자인가?\n", + "print 'This Is A Title'.istitle() # 문자열이 Title 형식 (각 단어의 첫글자가 대문자)인가?" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud3ec\ub9f7\ud305 \ubb38\uc790\n", - " - \ubb38\uc790\uc5f4 \ub0b4\uc5d0 \uc874\uc7ac\ud558\ub294 %\n", - "- \ud3ec\ucea3\ud305\uc744 \ud65c\uc6a9\ud55c \ubb38\uc790\uc5f4 \ubcc0\ud658\n", - " - \ud3ec\ub9f7\ud305 \ubb38\uc790\ub97c \ud3ec\ud568\ud558\ub294 \ubb38\uc790\uc5f4 % \ud29c\ud50c" + "name": "stdout", + "output_type": "stream", + "text": [ + "00123\n", + "0goofy\n" ] - }, + } + ], + "source": [ + "s = '123'\n", + "print s.zfill(5) # 5글자 자리 확보뒤 문자열을 쓰되 남는 공백에는 zero (0)를 채움 \n", + "print 'goofy'.zfill(6) # 6글자 자리 확보뒤 ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 문자열 포매팅\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 튜플을 이용한 포매팅" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) 문자열 변환" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 포맷팅 문자\n", + " - 문자열 내에 존재하는 %\n", + "- 포캣팅을 활용한 문자열 변환\n", + " - 포맷팅 문자를 포함하는 문자열 % 튜플" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 'name = %s, age = %s' % ('gslee', '24')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "name = gslee, age = 24\n" - ] - } - ], - "prompt_number": 7 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "name = gslee, age = 24\n" + ] + } + ], + "source": [ + "print 'name = %s, age = %s' % ('gslee', '24')" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "letter = '''\n", - "\uc548\ub155\ud558\uc138\uc694 %s\ub2d8,\n", + "name": "stdout", + "output_type": "stream", + "text": [ "\n", - "\uc624\ub298 \ubc24 \ud30c\ud2f0\uc5d0 \ucc38\uc11d\ud574 \uc8fc\uc2e4 \uc218 \uc788\ub098\uc694?\n", + "안녕하세요 홍길동님,\n", "\n", - "\uadf8\ub7fc..\n", + "오늘 밤 파티에 참석해 주실 수 있나요?\n", "\n", - "\uc774\uac15\uc131 \ub4dc\ub9bc'''\n", - "name = '\ud64d\uae38\ub3d9'\n", - "print letter % name\n", - "print \n", - "names = ['\ud55c\ud559\uc2e0', '\uc815\uc778\uc219', '\ubc15\ubbf8\uacbd']\n", - "for name in names:\n", - " print letter % name\n", - " print '-' * 40\n", - " print" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\uc548\ub155\ud558\uc138\uc694 \ud64d\uae38\ub3d9\ub2d8,\n", - "\n", - "\uc624\ub298 \ubc24 \ud30c\ud2f0\uc5d0 \ucc38\uc11d\ud574 \uc8fc\uc2e4 \uc218 \uc788\ub098\uc694?\n", - "\n", - "\uadf8\ub7fc..\n", - "\n", - "\uc774\uac15\uc131 \ub4dc\ub9bc\n", - "\n", - "\n", - "\uc548\ub155\ud558\uc138\uc694 \ud55c\ud559\uc2e0\ub2d8,\n", - "\n", - "\uc624\ub298 \ubc24 \ud30c\ud2f0\uc5d0 \ucc38\uc11d\ud574 \uc8fc\uc2e4 \uc218 \uc788\ub098\uc694?\n", - "\n", - "\uadf8\ub7fc..\n", - "\n", - "\uc774\uac15\uc131 \ub4dc\ub9bc\n", - "----------------------------------------\n", - "\n", - "\n", - "\uc548\ub155\ud558\uc138\uc694 \uc815\uc778\uc219\ub2d8,\n", - "\n", - "\uc624\ub298 \ubc24 \ud30c\ud2f0\uc5d0 \ucc38\uc11d\ud574 \uc8fc\uc2e4 \uc218 \uc788\ub098\uc694?\n", - "\n", - "\uadf8\ub7fc..\n", - "\n", - "\uc774\uac15\uc131 \ub4dc\ub9bc\n", - "----------------------------------------\n", - "\n", - "\n", - "\uc548\ub155\ud558\uc138\uc694 \ubc15\ubbf8\uacbd\ub2d8,\n", - "\n", - "\uc624\ub298 \ubc24 \ud30c\ud2f0\uc5d0 \ucc38\uc11d\ud574 \uc8fc\uc2e4 \uc218 \uc788\ub098\uc694?\n", - "\n", - "\uadf8\ub7fc..\n", - "\n", - "\uc774\uac15\uc131 \ub4dc\ub9bc\n", - "----------------------------------------\n", - "\n" - ] - } - ], - "prompt_number": 27 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) \uc22b\uc790 \ubcc0\ud658" + "그럼..\n", + "\n", + "이강성 드림\n", + "\n", + "\n", + "안녕하세요 한학신님,\n", + "\n", + "오늘 밤 파티에 참석해 주실 수 있나요?\n", + "\n", + "그럼..\n", + "\n", + "이강성 드림\n", + "----------------------------------------\n", + "\n", + "\n", + "안녕하세요 정인숙님,\n", + "\n", + "오늘 밤 파티에 참석해 주실 수 있나요?\n", + "\n", + "그럼..\n", + "\n", + "이강성 드림\n", + "----------------------------------------\n", + "\n", + "\n", + "안녕하세요 박미경님,\n", + "\n", + "오늘 밤 파티에 참석해 주실 수 있나요?\n", + "\n", + "그럼..\n", + "\n", + "이강성 드림\n", + "----------------------------------------\n", + "\n" ] - }, + } + ], + "source": [ + "letter = '''\n", + "안녕하세요 %s님,\n", + "\n", + "오늘 밤 파티에 참석해 주실 수 있나요?\n", + "\n", + "그럼..\n", + "\n", + "이강성 드림'''\n", + "name = '홍길동'\n", + "print letter % name\n", + "print \n", + "names = ['한학신', '정인숙', '박미경']\n", + "for name in names:\n", + " print letter % name\n", + " print '-' * 40\n", + " print" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 포맷팅 문자" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 포맷팅 문자 | 설명 |\n", + "|-------------|------------------------------------------------------------------------------|\n", + "| %s | 문자열을 포함한 임의의 객체를 문자열로 변환하여 출력 (str() 내장 함수 사용) |\n", + "| %r | 문자열을 포함한 임의의 객체를 문자열로 변환하여 출력 (repr() 내장 함수 사용) |\n", + "| %c | 1글자 문자 (ex. '%c' % 'k) |\n", + "| %d | 10진 정수 (%5d: 5자리를 확보한 후 정수 포맷팅) |\n", + "| %i | %d와 동일 |\n", + "| %u | 부호 없는 정수. 음수는 양수처럼 해석함 (ex. '%u' % -12 --> '4294967284') |\n", + "| %o | 8진수 정수 (ex. '%o' % 13 --> 15) |\n", + "| %x | 16진수 정수 (소문자 표현) (ex. '%x' % 13 --> 'd') |\n", + "| %X | 16진수 정수 (대문자 표현) (ex. '%X' % 13 --> 'D') |\n", + "| %e | 부동 소수점 실수를 지수 형태로 표현 (%.2e: 2자리는 소수점 이하 자리수) |\n", + "| %E | %e 와 동일 (대문자 E 표현) |\n", + "| %f | 부동 소수점 실수 (%5.2f: 소수점 포함 총 5자리 확보한 후 2자리는 소수점 이하 자리수) |\n", + "| %g | 부동 소수점을 편의에 따라 일반 실수 형식이나 지수 형식으로 변환 |\n", + "| %G | %g와 동일 (대문자 E 표현) |" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "| \ud3ec\ub9f7\ud305 \ubb38\uc790 | \uc124\uba85 |\n", - "|-------------|------------------------------------------------------------------------------|\n", - "| %s | \ubb38\uc790\uc5f4\uc744 \ud3ec\ud568\ud55c \uc784\uc758\uc758 \uac1d\uccb4\ub97c \ubb38\uc790\uc5f4\ub85c \ubcc0\ud658\ud558\uc5ec \ucd9c\ub825 (str() \ub0b4\uc7a5 \ud568\uc218 \uc0ac\uc6a9) |\n", - "| %r | \ubb38\uc790\uc5f4\uc744 \ud3ec\ud568\ud55c \uc784\uc758\uc758 \uac1d\uccb4\ub97c \ubb38\uc790\uc5f4\ub85c \ubcc0\ud658\ud558\uc5ec \ucd9c\ub825 (repr() \ub0b4\uc7a5 \ud568\uc218 \uc0ac\uc6a9) |\n", - "| %c | 1\uae00\uc790 \ubb38\uc790 (ex. '%c' % 'k) |\n", - "| %d | 10\uc9c4 \uc815\uc218 (%5d: 5\uc790\ub9ac\ub97c \ud655\ubcf4\ud55c \ud6c4 \uc815\uc218 \ud3ec\ub9f7\ud305) |\n", - "| %i | %d\uc640 \ub3d9\uc77c |\n", - "| %u | \ubd80\ud638 \uc5c6\ub294 \uc815\uc218. \uc74c\uc218\ub294 \uc591\uc218\ucc98\ub7fc \ud574\uc11d\ud568 (ex. '%u' % -12 --> '4294967284') |\n", - "| %o | 8\uc9c4\uc218 \uc815\uc218 (ex. '%o' % 13 --> 15) |\n", - "| %x | 16\uc9c4\uc218 \uc815\uc218 (\uc18c\ubb38\uc790 \ud45c\ud604) (ex. '%x' % 13 --> 'd') |\n", - "| %X | 16\uc9c4\uc218 \uc815\uc218 (\ub300\ubb38\uc790 \ud45c\ud604) (ex. '%X' % 13 --> 'D') |\n", - "| %e | \ubd80\ub3d9 \uc18c\uc218\uc810 \uc2e4\uc218\ub97c \uc9c0\uc218 \ud615\ud0dc\ub85c \ud45c\ud604 (%.2e: 2\uc790\ub9ac\ub294 \uc18c\uc218\uc810 \uc774\ud558 \uc790\ub9ac\uc218) |\n", - "| %E | %e \uc640 \ub3d9\uc77c (\ub300\ubb38\uc790 E \ud45c\ud604) |\n", - "| %f | \ubd80\ub3d9 \uc18c\uc218\uc810 \uc2e4\uc218 (%5.2f: \uc18c\uc218\uc810 \ud3ec\ud568 \ucd1d 5\uc790\ub9ac \ud655\ubcf4\ud55c \ud6c4 2\uc790\ub9ac\ub294 \uc18c\uc218\uc810 \uc774\ud558 \uc790\ub9ac\uc218) |\n", - "| %g | \ubd80\ub3d9 \uc18c\uc218\uc810\uc744 \ud3b8\uc758\uc5d0 \ub530\ub77c \uc77c\ubc18 \uc2e4\uc218 \ud615\uc2dd\uc774\ub098 \uc9c0\uc218 \ud615\uc2dd\uc73c\ub85c \ubcc0\ud658 |\n", - "| %G | %g\uc640 \ub3d9\uc77c (\ub300\ubb38\uc790 E \ud45c\ud604) |" + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 2) -- [3, 4, 5] -- 5 -- 5.300000 -- 1.013000e+02\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print \"%s -- %s -- %d -- %f -- %e\" % ((1, 2), [3,4,5], 5, 5.3, 101.3)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "(1, 2) -- [3, 4, 5] -- 5 -- 5.300000 -- 1.013000e+02\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print \"%3d -- %5.2f -- %.2e\" % (5, 5.356, 101.3)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " 5 -- 5.36 -- 1.01e+02\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 456\n", - "print '%d -- %o -- %x -- %X' % (a, a, a, a)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "456 -- 710 -- 1c8 -- 1C8\n" - ] - } - ], - "prompt_number": 5 - }, + } + ], + "source": [ + "print \"%s -- %s -- %d -- %f -- %e\" % ((1, 2), [3,4,5], 5, 5.3, 101.3)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \uc0ac\uc804(Dictionary)\uc744 \uc774\uc6a9\ud55c \ud3ec\ub9e4\ud305" + "name": "stdout", + "output_type": "stream", + "text": [ + " 5 -- 5.36 -- 1.01e+02\n" ] - }, + } + ], + "source": [ + "print \"%3d -- %5.2f -- %.2e\" % (5, 5.356, 101.3)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "print '%(\uc774\ub984)s -- %(\uc804\ud654\ubc88\ud638)s' %{'\uc774\ub984':'\ud64d\uae38\ub3d9', '\uc804\ud654\ubc88\ud638':5284}\n", - "print '%(\uc774\ub984)s -- %(\uc804\ud654\ubc88\ud638)s' %{'\uc804\ud654\ubc88\ud638':5284, '\uc774\ub984':'\ud64d\uae38\ub3d9'}\n", - "print '%(\uc774\ub984)s -- %(\uc804\ud654\ubc88\ud638)s' %{'\uc804\ud654\ubc88\ud638':5284, '\uc774\ub984':'\ud64d\uae38\ub3d9', '\uc8fc\uc18c':'Seoul'}" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\ud64d\uae38\ub3d9 -- 5284\n", - "\ud64d\uae38\ub3d9 -- 5284\n", - "\ud64d\uae38\ub3d9 -- 5284\n" - ] - } - ], - "prompt_number": 1 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "456 -- 710 -- 1c8 -- 1C8\n" + ] + } + ], + "source": [ + "a = 456\n", + "print '%d -- %o -- %x -- %X' % (a, a, a, a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 사전(Dictionary)을 이용한 포매팅" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + "name": "stdout", + "output_type": "stream", + "text": [ + "홍길동 -- 5284\n", + "홍길동 -- 5284\n", + "홍길동 -- 5284\n" ] } ], - "metadata": {} + "source": [ + "print '%(이름)s -- %(전화번호)s' %{'이름':'홍길동', '전화번호':5284}\n", + "print '%(이름)s -- %(전화번호)s' %{'전화번호':5284, '이름':'홍길동'}\n", + "print '%(이름)s -- %(전화번호)s' %{'전화번호':5284, '이름':'홍길동', '주소':'Seoul'}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 0 +} From 888e311604bfe19b7a04a008c04b6c6e7ce8f301 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 5 Oct 2016 23:50:39 +0900 Subject: [PATCH 008/124] m.c. --- assignment-2.ipynb | 11 +- supplement-2016-09.ipynb | 606 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 611 insertions(+), 6 deletions(-) diff --git a/assignment-2.ipynb b/assignment-2.ipynb index 3856fa4..4b3ef62 100644 --- a/assignment-2.ipynb +++ b/assignment-2.ipynb @@ -6,9 +6,8 @@ "source": [ "# Assignment 2\n", "### [정보]\n", - "#### 1) Due Date: 2015년 10월 07일 (수), 23시 59분\n", - "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github에 올려 해당 URL을 EL 사이트에 제출\n", - "##### - github url을 http://nbviewer.ipython.org 에 넣어서 산출된 URL을 EL사이트에 제출해도 됨\n", + "#### 1) Due Date: 2016년 10월 12일 (수), 23시 59분\n", + "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.ipython.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", "#### 3) 내용: 반드시 python code와 수행 결과를 ipython notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", "#### 5) 문제 (프로젝트 오일러 3문제 포함하여 총 8개)" @@ -143,9 +142,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [Root]", "language": "python", - "name": "python2" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -157,7 +156,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.12" } }, "nbformat": 4, diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb index 00dc0fb..12d8e19 100644 --- a/supplement-2016-09.ipynb +++ b/supplement-2016-09.ipynb @@ -7,6 +7,612 @@ "# 수업 보충 자료" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. E-learning 7, 8 보충 자료\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) unicode 추가 설명" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = unicode(\"한글과 세종대왕\", 'utf-8')\n", + "b = u\"한글과 세종대왕\"" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n" + ] + } + ], + "source": [ + "print a == b\n", + "print a is b" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "65\n", + "A\n" + ] + } + ], + "source": [ + "print ord('A') # ord(): 문자의 ASCII 코드값 반환\n", + "print chr(65) # char(): ASCII 코드 65를 지니는 문자를 반환" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://www.fileformat.info/info/unicode/char/ac00/index.htm" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "가\n", + "가\n" + ] + } + ], + "source": [ + "print unichr(0xac00) # unichr(): UNICODE 코드 0xac00를 지니는 문자를 반환\n", + "print unichr(44032) " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 검 겁 겂 것 겄 겅 겆 겇 겈 겉 겊 겋 게 겍 겎 겏 겐 겑 겒 겓 겔 겕 겖 겗 겘 겙 겚 겛 겜 겝 겞 겟 겠 겡 겢 겣 겤 겥 겦 겧 겨 격 겪 겫 견 겭 겮 겯 결 겱 겲 겳 겴 겵 겶 겷 겸 겹 겺 겻 겼 경 겾 겿 곀 곁 곂 곃 계 곅 곆 곇 곈 곉 곊 곋 곌 곍 곎 곏 곐 곑 곒 곓 곔 곕 곖 곗 곘 곙 곚 곛 곜 곝 곞 곟 고 곡 곢 곣 곤 곥 곦 곧 골 곩 곪 곫 곬 곭 곮 곯 곰 곱 곲 곳 곴 공 곶 곷 곸 곹 곺 곻 과 곽 곾 곿 관 괁 괂 괃 괄 괅 괆 괇 괈 괉 괊 괋 괌 괍 괎 괏 괐 광 괒 괓 괔 괕 괖 괗 괘 괙 괚 괛 괜 괝 괞 괟 괠 괡 괢 괣 괤 괥 괦 괧 괨 괩 괪 괫 괬 괭 괮 괯 괰 괱 괲 괳 괴 괵 괶 괷 괸 괹 괺 괻 괼 괽 괾 괿 굀 굁 굂 굃 굄 굅 굆 굇 굈 굉 굊 굋 굌 굍 굎 굏 교 굑 굒 굓 굔 굕 굖 굗 굘 굙 굚 굛 굜 굝 굞 굟 굠 굡 굢 굣 굤 굥 굦 굧 굨 굩 굪 굫 구 국 굮 굯 군 굱 굲 굳 굴 굵 굶 굷 굸 굹 굺 굻 굼 굽 굾 굿 궀 궁 궂 궃 궄 궅 궆 궇 궈 궉 궊 궋 권 궍 궎 궏 궐 궑 궒 궓 궔 궕 궖 궗 궘 궙 궚 궛 궜 궝 궞 궟 궠 궡 궢 궣 궤 궥 궦 궧 궨 궩 궪 궫 궬 궭 궮 궯 궰 궱 궲 궳 궴 궵 궶 궷 궸 궹 궺 궻 궼 궽 궾 궿 귀 귁 귂 귃 귄 귅 귆 귇 귈 귉 귊 귋 귌 귍 귎 귏 귐 귑 귒 귓 귔 귕 귖 귗 귘 귙 귚 귛 규 귝 귞 귟 균 귡 귢 귣 귤 귥 귦 귧 귨 귩 귪 귫 귬 귭 귮 귯 귰 귱 귲 귳 귴 귵 귶 귷 그 극 귺 귻 근 귽 귾 귿 글 긁 긂 긃 긄 긅 긆 긇 금 급 긊 긋 긌 긍 긎 긏 긐 긑 긒 긓 긔 긕 긖 긗 긘 긙 긚 긛 긜 긝 긞 긟 긠 긡 긢 긣 긤 긥 긦 긧 긨 긩 긪 긫 긬 긭 긮 긯 기 긱 긲 긳 긴 긵 긶 긷 길 긹 긺 긻 긼 긽 긾 긿 김 깁 깂 깃 깄 깅 깆 깇 깈 깉 깊 깋 까 깍 깎 깏 깐 깑 깒 깓 깔 깕 깖 깗 깘 깙 깚 깛 깜 깝 깞 깟 깠 깡 깢 깣 깤 깥 깦 깧 깨 깩 깪 깫 깬 깭 깮 깯 깰 깱 깲 깳 깴 깵 깶 깷 깸 깹 깺 깻 깼 깽 깾 깿 꺀 꺁 꺂 꺃 꺄 꺅 꺆 꺇 꺈 꺉 꺊 꺋 꺌 꺍 꺎 꺏 꺐 꺑 꺒 꺓 꺔 꺕 꺖 꺗 꺘 꺙 꺚 꺛 꺜 꺝 꺞 꺟 꺠 꺡 꺢 꺣 꺤 꺥 꺦 꺧 꺨 꺩 꺪 꺫 꺬 꺭 꺮 꺯 꺰 꺱 꺲 꺳 꺴 꺵 꺶 꺷 꺸 꺹 꺺 꺻 꺼 꺽 꺾 꺿 껀 껁 껂 껃 껄 껅 껆 껇 껈 껉 껊 껋 껌 껍 껎 껏 껐 껑 껒 껓 껔 껕 껖 껗 께 껙 껚 껛 껜 껝 껞 껟 껠 껡 껢 껣 껤 껥 껦 껧 껨 껩 껪 껫 껬 껭 껮 껯 껰 껱 껲 껳 껴 껵 껶 껷 껸 껹 껺 껻 껼 껽 껾 껿 꼀 꼁 꼂 꼃 꼄 꼅 꼆 꼇 꼈 꼉 꼊 꼋 꼌 꼍 꼎 꼏 꼐 꼑 꼒 꼓 꼔 꼕 꼖 꼗 꼘 꼙 꼚 꼛 꼜 꼝 꼞 꼟 꼠 꼡 꼢 꼣 꼤 꼥 꼦 꼧 꼨 꼩 꼪 꼫 꼬 꼭 꼮 꼯 꼰 꼱 꼲 꼳 꼴 꼵 꼶 꼷 꼸 꼹 꼺 꼻 꼼 꼽 꼾 꼿 꽀 꽁 꽂 꽃 꽄 꽅 꽆 꽇 꽈 꽉 꽊 꽋 꽌 꽍 꽎 꽏 꽐 꽑 꽒 꽓 꽔 꽕 꽖 꽗 꽘 꽙 꽚 꽛 꽜 꽝 꽞 꽟 꽠 꽡 꽢 꽣 꽤 꽥 꽦 꽧 꽨 꽩 꽪 꽫 꽬 꽭 꽮 꽯 꽰 꽱 꽲 꽳 꽴 꽵 꽶 꽷 꽸 꽹 꽺 꽻 꽼 꽽 꽾 꽿 꾀 꾁 꾂 꾃 꾄 꾅 꾆 꾇 꾈 꾉 꾊 꾋 꾌 꾍 꾎 꾏 꾐 꾑 꾒 꾓 꾔 꾕 꾖 꾗 꾘 꾙 꾚 꾛 꾜 꾝 꾞 꾟 꾠 꾡 꾢 꾣 꾤 꾥 꾦 꾧 꾨 꾩 꾪 꾫 꾬 꾭 꾮 꾯 꾰 꾱 꾲 꾳 꾴 꾵 꾶 꾷 꾸 꾹 꾺 꾻 꾼 꾽 꾾 꾿 꿀 꿁 꿂 꿃 꿄 꿅 꿆 꿇 꿈 꿉 꿊 꿋 꿌 꿍 꿎 꿏 꿐 꿑 꿒 꿓 꿔 꿕 꿖 꿗 꿘 꿙 꿚 꿛 꿜 꿝 꿞 꿟 꿠 꿡 꿢 꿣 꿤 꿥 꿦 꿧\n" + ] + } + ], + "source": [ + "i = 0\n", + "while i < 1000:\n", + " print unichr(0xac00 + i),\n", + " i = i + 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) str()과 repr()의 차이\n", + "- str(): 객체의 비공식적인 (informal) 문자열 표현 - 가능하면 읽기 편하게...\n", + "- repr(): 객체의 공식적인 (official) 문자열 표현 - 가능하면 실제 객체를 완벽하게 표현할 수 있도록...\n", + "- [참고] http://pinocc.tistory.com/168" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.23456789123\n", + "1.23456789123\n", + "1.234567891234568\n" + ] + } + ], + "source": [ + "f = 1.23456789123456789\n", + "print f\n", + "print str(f)\n", + "print repr(f) # repr()은 유효 숫자를 길게 출력" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.23456789123, 1.234567891234568\n" + ] + } + ], + "source": [ + "print \"%s, %r\" % (f, f) # str()과 repr() 호출" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 2) -- [3, 4, 5]\n" + ] + } + ], + "source": [ + "print \"%s -- %s\" % ((1, 2), [3, 4, 5]) # str() 호출" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 2) -- [3, 4, 5]\n" + ] + } + ], + "source": [ + "print \"%r -- %r\" % ((1, 2), [3, 4, 5]) # str() 대신에 repr() 내장 함수 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.3\n", + "0.3\n" + ] + } + ], + "source": [ + "g = 0.3\n", + "print str(g)\n", + "print repr(g)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello\n", + "'Hello'\n" + ] + } + ], + "source": [ + "h = 'Hello'\n", + "print str(h)\n", + "print repr(h)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'Hello' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0meval\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mh\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'Hello' is not defined" + ] + } + ], + "source": [ + "x = eval(str(h))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- repr() 내장함수에 의하여 반환된 문자열은 eval() 내장함수에 의하여 Evaluation이 가능함 " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x = eval(repr(h))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n" + ] + } + ], + "source": [ + "a = '1 + 2 + 3'\n", + "b = eval(a)\n", + "print b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) [중요] 문서 문자열 (Documentation String, docstring)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def add(a, b):\n", + " \"add(a, b) returns a+b\"\n", + " return a + b" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "add(a, b) returns a+b\n" + ] + } + ], + "source": [ + "print add.__doc__" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function add in module __main__:\n", + "\n", + "add(a, b)\n", + " add(a, b) returns a+b\n", + "\n" + ] + } + ], + "source": [ + "help(add)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "? add" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4) string 모듈 상수" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0123456789\n", + "01234567\n", + "0123456789abcdefABCDEF\n", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\n", + "abcdefghijklmnopqrstuvwxyz\n", + "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n", + "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n", + "\n", + "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n", + "\r", + "\u000b", + "\f", + "\n", + "\t\n", + "\u000b", + "\f", + "\r", + " \n" + ] + } + ], + "source": [ + "import string\n", + "\n", + "print string.digits\n", + "print string.octdigits\n", + "print string.hexdigits\n", + "print string.letters\n", + "print string.lowercase\n", + "print string.uppercase\n", + "print string.punctuation # 각종 기호들\n", + "print\n", + "print string.printable # 인쇄 가능한 모든 문자들\n", + "print string.whitespace # 공백 문자들 '\\011\\012\\013\\014\\015'" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n" + ] + } + ], + "source": [ + "x = 'a'\n", + "print x in string.uppercase\n", + "print x in string.lowercase" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\n" + ] + } + ], + "source": [ + "d = string.letters + string.digits\n", + "print d" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "your id:3##\n" + ] + } + ], + "source": [ + "userid = raw_input('your id:')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "invalid user id\n" + ] + } + ], + "source": [ + "d = string.letters + string.digits\n", + "for ch in userid:\n", + " if ch not in d:\n", + " print 'invalid user id'\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5) [중요] 문자열 붙이기 코딩 방법 비교" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.534403085709\n" + ] + } + ], + "source": [ + "import time\n", + "start_time = time.time()\n", + "s = ''\n", + "for k in range(1000000):\n", + " s += 'python'\n", + "end_time = time.time()\n", + "print end_time - start_time" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.396770954132\n" + ] + } + ], + "source": [ + "start_time = time.time()\n", + "t = []\n", + "for k in range(1000000):\n", + " t.append('python')\n", + "s = ''.join(t)\n", + "end_time = time.time()\n", + "print end_time - start_time" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.00274300575256\n" + ] + } + ], + "source": [ + "start_time = time.time()\n", + "s = 'python' * 1000000\n", + "end_time = time.time()\n", + "print end_time - start_time" + ] + }, { "cell_type": "markdown", "metadata": {}, From b96a7ec5cfd700e6318de3d21d800b4bd4366f28 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 5 Oct 2016 23:53:33 +0900 Subject: [PATCH 009/124] m.c. --- assignment-1.ipynb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assignment-1.ipynb b/assignment-1.ipynb index 33561a1..57f18db 100644 --- a/assignment-1.ipynb +++ b/assignment-1.ipynb @@ -6,7 +6,7 @@ "source": [ "# Assignment 1\n", "### [정보]\n", - "#### 1) Due Date: 2015년 9월 30일 (금), 23시 59분\n", + "#### 1) Due Date: 2016년 9월 30일 (금), 23시 59분\n", "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.ipython.org에 넣어서 산출된 URL을 EL사이트에 제출\n", "#### 3) 내용: 반드시 python code와 수행 결과를 ipython notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 11개의 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", @@ -106,6 +106,7 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [Root]", "language": "python", From 7fcd84268120b5723ab927b916b110926315f64c Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Thu, 6 Oct 2016 12:07:13 +0900 Subject: [PATCH 010/124] m.c. --- assignment-2.ipynb | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/assignment-2.ipynb b/assignment-2.ipynb index 4b3ef62..1472683 100644 --- a/assignment-2.ipynb +++ b/assignment-2.ipynb @@ -10,7 +10,7 @@ "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.ipython.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", "#### 3) 내용: 반드시 python code와 수행 결과를 ipython notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", - "#### 5) 문제 (프로젝트 오일러 3문제 포함하여 총 8개)" + "#### 5) 문제 (프로젝트 오일러 3문제 포함하여 총 7개)" ] }, { @@ -26,15 +26,6 @@ " - (1 or 2) and (3 or 4)" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 키보드로 정수값을 입력 받고 그 값이 양수인지 음수인지를 비트 연산자를 이용하여 판단하는 프로그램을 작성하시오.\n", - " - [참고] 가장 왼쪽에 있는 비트가 0이면 양수이며, 1이면 음수이다.\n", - " - [참고] 수업보충자료 (https://github.com/bluebibi/python-e-learning/blob/master/supplement.ipynb) 를 참고하시오." - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -141,6 +132,7 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [Root]", "language": "python", From ed1475b6119bbe3366a161b26291c5b43fcd781b Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 12 Oct 2016 22:07:16 +0900 Subject: [PATCH 011/124] m.c. --- supplement-2016-09.ipynb | 361 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 361 insertions(+) diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb index 12d8e19..71171de 100644 --- a/supplement-2016-09.ipynb +++ b/supplement-2016-09.ipynb @@ -7,6 +7,367 @@ "# 수업 보충 자료" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. E-learning 9, 10 보충 자료\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 리스트를 배열처럼 활용하기\n", + "- 1차원 배열처럼 활용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 4, 5]\n", + "1\n", + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "2\n" + ] + } + ], + "source": [ + "a = [1, 2, 3, 4, 5]\n", + "b = range(10)\n", + "print a\n", + "print a[0]\n", + "print b\n", + "print b[2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 0으로 초기화된 사이즈 10인 1차원 배열 생성" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = [0] * 10\n", + "a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 2차원 배열처럼 활용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n", + "6\n" + ] + } + ], + "source": [ + "mat = [[1, 2, 3],\n", + " [4, 5, 6],\n", + " [7, 8, 9]]\n", + "print mat\n", + "print mat[1][2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 리스트 내포\n", + "- 다음은 고등학교 수학에서 배운 집합의 표기 방법이다.\n", + " - A = {x^2 | x in {0, ..., 9}}\n", + " - B = {1, 2, 4, 8, 16, ..., 2^16}\n", + " - C = {x | x in S and x is odd}\n", + "\n", + "- 파이썬의 리스트 내포(list comprehension)는 바로 위 집합 표기법과 유사한 방식의 리터럴이다. \n", + "- 위 집합들을 리스트 내포 방식으로 표현하면 다음과 같다. \n", + " - A = [x**2 for x in range(10)]\n", + " - B = [2**i for i in range(17)]\n", + " - C = [x for x in S if x % 2 == 1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예 1. 피타고라스 삼각형의 각 3변의 길이 리스트 (조건: 각 변 x, y, z의 길이는 30 보다 작아야 하며, x <= y <= z 이어야 함)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(3, 4, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 15, 17), (9, 12, 15), (10, 24, 26), (12, 16, 20), (15, 20, 25), (20, 21, 29)]\n" + ] + } + ], + "source": [ + "k = [(x,y,z) for x in range(1,30) for y in range(x,30) for z in range(y,30) if x**2 + y**2 == z**2]\n", + "print k" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 바로 위 코드는 아래와 동일하다." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(3, 4, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 15, 17), (9, 12, 15), (10, 24, 26), (12, 16, 20), (15, 20, 25), (20, 21, 29)]\n" + ] + } + ], + "source": [ + "l = []\n", + "for x in range(1,30):\n", + " for y in range(x,30):\n", + " for z in range (y, 30):\n", + " if x**2 + y**2 == z**2:\n", + " l.append((x, y, z))\n", + "print l" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예 2. 중첩 리스트 내포" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['AC', 'AD', 'BC', 'BD']\n", + "\n", + "[['AC', 'BC'], ['AD', 'BD']]\n" + ] + } + ], + "source": [ + "list_a = ['A', 'B']\n", + "list_b = ['C', 'D']\n", + "print [x + y for x in list_a for y in list_b]\n", + "print\n", + "print [[x + y for x in list_a] for y in list_b]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 바로 위 코드는 아래와 동일하다." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[['AC', 'BC'], ['AD', 'BD']]\n" + ] + } + ], + "source": [ + "l = []\n", + "for y in list_b:\n", + " l2 = []\n", + " for x in list_a:\n", + " l2.append(x+y)\n", + " l.append(l2)\n", + "print l" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예 3. 리스트 내포를 활용한 2차원 배열 생성" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]\n", + "[[100, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]\n" + ] + } + ], + "source": [ + "mat = [ [0]*4 for x in range(3)]\n", + "print mat\n", + "\n", + "mat[0][0] = 100\n", + "print mat" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 특별 속성\n", + "- 특별 속성: 파이썬 내에 존재하는 모든 객체 마다 부여되는 특별한 Read-only 속성\n", + " - [참고]: https://docs.python.org/2/library/stdtypes.html#object.__dict__" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__main__\n", + "\n", + "Automatically created module for IPython interactive environment\n", + "\n" + ] + } + ], + "source": [ + "print __name__ # 로컬 이름 \n", + "print\n", + "\n", + "print __doc__ # 로컬에 지정된 문서문자열\n", + "print" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "math.__name__: math\n", + "\n", + "math.__doc__: This module is always available. It provides access to the\n", + "mathematical functions defined by the C standard.\n", + "\n", + "math.log10.__name__: log10\n", + "\n", + "math.log10.__doc__: log10(x)\n", + "\n", + "Return the base 10 logarithm of x.\n", + "\n", + "\n" + ] + } + ], + "source": [ + "import math\n", + "\n", + "print \"math.__name__: \", math.__name__\n", + "print\n", + "print \"math.__doc__:\", math.__doc__\n", + "print\n", + "print \"math.log10.__name__: \", math.log10.__name__\n", + "print\n", + "print \"math.log10.__doc__: \", math.log10.__doc__\n", + "print\n", + "print type(math.log10)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "? math.log10" + ] + }, { "cell_type": "markdown", "metadata": {}, From db103a0e5e22ce83ca1a9f5858f0c70db3b12722 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Thu, 20 Oct 2016 00:22:55 +0900 Subject: [PATCH 012/124] m.c. --- assignment-3.ipynb | 11 +- supplement-2016-09.ipynb | 248 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 253 insertions(+), 6 deletions(-) diff --git a/assignment-3.ipynb b/assignment-3.ipynb index fa20ffe..738ca36 100644 --- a/assignment-3.ipynb +++ b/assignment-3.ipynb @@ -6,9 +6,8 @@ "source": [ "# Assignment 3\n", "### [정보]\n", - "#### 1) Due Date: 2015년 10월 21일 (수), 23시 59분\n", - "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github에 올려 해당 URL을 EL 사이트에 제출\n", - "##### - github url을 http://nbviewer.ipython.org 에 넣어서 산출된 URL을 EL사이트에 제출해도 됨\n", + "#### 1) Due Date: 2016년 11월 02일 (수), 23시 59분\n", + "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.ipython.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", "#### 3) 내용: 반드시 python code와 수행 결과를 ipython notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", "#### 5) 문제 (프로젝트 오일러 3문제 포함하여 총 11개)" @@ -177,9 +176,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [Root]", "language": "python", - "name": "python2" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -191,7 +190,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.12" } }, "nbformat": 4, diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb index 71171de..8984c6c 100644 --- a/supplement-2016-09.ipynb +++ b/supplement-2016-09.ipynb @@ -7,6 +7,254 @@ "# 수업 보충 자료" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. E-learning 11, 12 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 프로그램 예제\n", + "- 100개의 소문자를 랜덤하게 생성하여 출력한다.\n", + "- 생성된 각 소문자의 개수를 카운트하여 출력한다." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "e d t p p q d e l f q d w x h k r p c h\n", + "j b a e p x o x z h d t i v w s y r p q\n", + "e s y d f m e w l r u b l t j s h m r q\n", + "r n l k g a d o o w r q p b u n e f g d\n", + "i l g y u l r j z b p o d t u l e o u e\n", + "\n", + "a 2 b 4 c 1 d 8 e 8 f 3 g 3 h 4 i 2 j 3\n", + "k 2 l 7 m 2 n 2 o 5 p 7 q 5 r 7 s 3 t 4\n", + "u 5 v 1 w 4 x 3 y 3 z 2\n" + ] + } + ], + "source": [ + "import random\n", + "\n", + "def getRandomLowerCaseLetter():\n", + " return chr(random.randint(ord('a'), ord('z')))\n", + "\n", + "def createList():\n", + " '''\n", + " 소문자를 랜덤하게 생성하여 담은 리스트를 반환한다.\n", + " '''\n", + " chars = []\n", + " \n", + " for i in range(100):\n", + " chars.append(getRandomLowerCaseLetter())\n", + " \n", + " #위 코드는 아래 코드와 동일\n", + " #chars = [getRandomLowerCaseLetter() for i in range(100)]\n", + " \n", + " return chars\n", + "\n", + "def displayList(chars):\n", + " '''\n", + " 리스트에 포함된 문자를 한 행에 20개씩 출력한다.\n", + " '''\n", + " for i in range(len(chars)):\n", + " if (i + 1) % 20 == 0:\n", + " print chars[i]\n", + " else:\n", + " print chars[i],\n", + "\n", + "def countLetters(chars):\n", + " '''\n", + " 0으로 초기화된 26개의 정수리스트를 생성한 후 인자로 주어진 chars에 있는 각 문자들의 개수를 저장한다.\n", + " '''\n", + " counts = [0] * 26\n", + " \n", + " for i in range(len(chars)):\n", + " counts[ord(chars[i]) - ord('a')] += 1 \n", + " \n", + " return counts\n", + "\n", + "def displayCounts(counts):\n", + " '''\n", + " 각 문자별로 카운트를 한 행에 10개씩 출력한다.\n", + " '''\n", + " for i in range(len(counts)):\n", + " if (i + 1) % 10 == 0:\n", + " print chr(i + ord('a')), counts[i]\n", + " else:\n", + " print chr(i + ord('a')), counts[i],\n", + "\n", + "if __name__ == '__main__':\n", + " chars = createList()\n", + " displayList(chars)\n", + " print\n", + " counts = countLetters(chars)\n", + " displayCounts(counts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 집합의 성능" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5601, 7177, 661, 7579, 347, 6173, 2121, 4834, 2932, 9408]\n", + "The elapsed time to check into a set is 4 ms\n", + "The elapsed time to check into a list is 1204 ms\n", + "The elapsed time to remove each element from a set is 2 ms\n", + "The elapsed time to remove each element from a list is 488 ms\n" + ] + } + ], + "source": [ + "import random\n", + "import time\n", + "\n", + "NUMBER_OF_ELEMENTS = 10000\n", + "\n", + "lst = list(range(NUMBER_OF_ELEMENTS))\n", + "random.shuffle(lst)\n", + "print lst[0:10]\n", + "\n", + "s = set(lst)\n", + "\n", + "# 해당 원소가 집합/리스트에 포함되어 있는지 검사\n", + "startTime = time.time()\n", + "for i in range(NUMBER_OF_ELEMENTS):\n", + " i in s\n", + "endTime = time.time()\n", + "runTime = int((endTime - startTime) * 1000)\n", + "print 'The elapsed time to check into a set is %s ms' % runTime\n", + "\n", + "startTime = time.time()\n", + "for i in range(NUMBER_OF_ELEMENTS):\n", + " i in lst\n", + "endTime = time.time()\n", + "runTime = int((endTime - startTime) * 1000)\n", + "print 'The elapsed time to check into a list is %s ms' % runTime\n", + "\n", + "# 해당 원소를 집합/리스트로 부터 제거\n", + "startTime = time.time()\n", + "for i in range(NUMBER_OF_ELEMENTS):\n", + " s.remove(i)\n", + "endTime = time.time()\n", + "runTime = int((endTime - startTime) * 1000)\n", + "print 'The elapsed time to remove each element from a set is %s ms' % runTime\n", + "\n", + "startTime = time.time()\n", + "for i in range(NUMBER_OF_ELEMENTS):\n", + " lst.remove(i)\n", + "endTime = time.time()\n", + "runTime = int((endTime - startTime) * 1000)\n", + "print 'The elapsed time to remove each element from a list is %s ms' % runTime" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 단어 세기\n", + "- 다음 주어진 문자열 s에서 ,와 .을 제거하고\n", + "- 모든 문자를 소문자로 변경하고\n", + "- 각각의 단어의 출현 빈도를 출력하시오." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "and : 2\n", + "it : 2\n", + "existing : 1\n", + "in : 1\n", + "for : 1\n", + "start : 1\n", + "enviroment : 1\n", + "to : 3\n", + "new : 1\n", + "development : 1\n", + "we : 1\n", + "creating : 1\n", + "python : 1\n", + "propose : 1\n", + "possible : 1\n", + "focus : 1\n", + "teaching : 1\n", + "teach : 1\n", + "an : 1\n", + "by : 1\n", + "a : 1\n", + "on : 1\n", + "language : 1\n", + "programming : 1\n", + "materials : 1\n", + "making : 1\n", + "scripting : 1\n" + ] + } + ], + "source": [ + "# -*-coding:utf-8 -*-\n", + "s = \"We propose to start by making it possible to teach progra\\\n", + "mming in python, an existing scripting language, and to focus \\\n", + "on creating a new development enviroment and teaching \\\n", + "materials for it.\"\n", + " \n", + "# 대치 과정\n", + "s=s.replace(',','')\n", + "s=s.replace('.','')\n", + "s=s.lower()\n", + " \n", + "#공백 단위로 단어 쪼개고 단어 넣을 딕셔너리 선언\n", + "listSplited = s.split()\n", + "words = {}\n", + " \n", + "#단어 쪼개놓은 리스트에서 각각 단어의 개수 세기\n", + "for i in listSplited:\n", + " if not i in words.keys():\n", + " words[i]=1\n", + " else:\n", + " words[i]=words[i]+1\n", + " \n", + "#포맷을 이용한 출력\n", + "format = \"%s : %d\"\n", + " \n", + "for i in words:\n", + " print format % (i, words[i])" + ] + }, { "cell_type": "markdown", "metadata": {}, From 5969da3f2d4f7eb0714b3a038e016eea6ef771c5 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Tue, 25 Oct 2016 12:45:56 +0900 Subject: [PATCH 013/124] m.c. --- assignment-3.ipynb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/assignment-3.ipynb b/assignment-3.ipynb index fa20ffe..767e544 100644 --- a/assignment-3.ipynb +++ b/assignment-3.ipynb @@ -90,7 +90,8 @@ " 1\n", " -
>>> addallodd([1, 2, 3, 4, 5, 6, 7, 8, 9])\n",
     "    25
\n", - " - [참고]: 리스트 내포 방식으로 addall() 및 addallodd()함수를 만들 때엔 리스트 내포에 의해 생성된 리스트 결과에 대해 내장 함수를 사용하는 방식을 고려해보시오 (주의: 리스트 내포 방식의 addall() 및 addallodd() 함수의 몸체는 단 1줄로 작성되어야 한다.) " + " - [참고 1]: 리스트 내포 방식으로 addall() 및 addallodd()함수를 만들 때엔 리스트 내포에 의해 생성된 리스트 결과에 대해 내장 함수를 사용하는 방식을 고려해보시오 (주의: 리스트 내포 방식의 addall() 및 addallodd() 함수의 몸체는 단 1줄로 작성되어야 한다.)\n", + " - [참고 2]: sum() 등의 내장함수 사용 가능함" ] }, { @@ -176,10 +177,11 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [Root]", "language": "python", - "name": "python2" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -191,7 +193,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.12" } }, "nbformat": 4, From fbccdb49886eb13a83d328ef529c275df67d94a5 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 2 Nov 2016 19:33:10 +0900 Subject: [PATCH 014/124] ... --- Untitled.ipynb | 322 +++++++++++++++++++++++++++++++- supplement-2016-09.ipynb | 392 +++++++++++++++++++++++++++++++++++++++ t.txt | 4 + t1.txt | 3 + 4 files changed, 714 insertions(+), 7 deletions(-) create mode 100644 t.txt create mode 100644 t1.txt diff --git a/Untitled.ipynb b/Untitled.ipynb index 975e1dc..6a71bbb 100644 --- a/Untitled.ipynb +++ b/Untitled.ipynb @@ -11,14 +11,22 @@ "name": "stdout", "output_type": "stream", "text": [ - "4\n" + "first line\n", + "second line\n", + "third line\n", + "\n" ] } ], "source": [ - "a = 2\n", - "b = 2\n", - "print a+b" + "lines = ['first line\\n', 'second line\\n', 'third line\\n']\n", + "f = open('t1.txt', 'w')\n", + "f.writelines(lines)\n", + "f.close()\n", + "\n", + "f = open('t1.txt')\n", + "print f.read()\n", + "f.close()" ] }, { @@ -28,6 +36,306 @@ "### 타이틀" ] }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import sys\n", + "import StringIO\n", + "\n", + "stdout = sys.stdout # 표준 출력 저장해 두기\n", + "sys.stdout = f = StringIO.StringIO() \n", + "\n", + "print type(f)\n", + "print 'Sample output'\n", + "print 'Good'\n", + "print 'Good'\n", + "\n", + "sys.stdout = stdout\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning\n", + "\n", + "/Users/yhhan/git/python-e-learning *** ['.git', '.ipynb_checkpoints', 'aaa', 'example', 'files', 'images'] *** ['.DS_Store', '.gitignore', 'assignment-1.ipynb', 'assignment-2.ipynb', 'assignment-3.ipynb', 'assignment-4.ipynb', 'assignment-5.ipynb', 'module_test.py', 'music', 'mymath.py', 'mymath.pyc', 'pickle.txt', 'pickle2.txt', 'python01.ipynb', 'python02.ipynb', 'python03.ipynb', 'python04.ipynb', 'python05.ipynb', 'python06.ipynb', 'python07.ipynb', 'python08.ipynb', 'python09.ipynb', 'python10.ipynb', 'python11.ipynb', 'python12.ipynb', 'python13.ipynb', 'python14.ipynb', 'python15.ipynb', 'python16.ipynb', 'python17.ipynb', 'python18.ipynb', 'python19.ipynb', 'python20.ipynb', 'python21.ipynb', 'python22.ipynb', 'python23.ipynb', 'README.md', 'readme.txt', 'removeme.txt', 'sample.txt', 'sample_new.txt', 'supplement-2016-09.ipynb', 'supplement.ipynb', 't.txt', 't1.txt', 't2.txt', 'The Python Challenge.webloc', 'turtle_example.png', 'turtle_method-1.png', 'turtle_method-2.png', 'turtle_method-3.png', 'Untitled.ipynb', 'Untitled1.ipynb', 'Untitled2.ipynb', '\\xe1\\x84\\x87\\xe1\\x85\\xa5\\xe1\\x86\\xb7\\xe1\\x84\\x8b\\xe1\\x85\\xb5\\xe1\\x84\\x8b\\xe1\\x85\\xb4 \\xe1\\x84\\x83\\xe1\\x85\\xa6\\xe1\\x84\\x8b\\xe1\\x85\\xb5\\xe1\\x84\\x90\\xe1\\x85\\xa5 \\xe1\\x84\\x8b\\xe1\\x85\\xa1\\xe1\\x84\\x8f\\xe1\\x85\\xb5\\xe1\\x84\\x90\\xe1\\x85\\xa6\\xe1\\x86\\xa8\\xe1\\x84\\x8e\\xe1\\x85\\xa5 -- [Python] [\\xe1\\x84\\x80\\xe1\\x85\\xa2\\xe1\\x84\\x82\\xe1\\x85\\xa7\\xe1\\x86\\xb7\\xe1\\x84\\x8b\\xe1\\x85\\xb3\\xe1\\x86\\xaf \\xe1\\x84\\x8c\\xe1\\x85\\xa1\\xe1\\x86\\xb8\\xe1\\x84\\x8b\\xe1\\x85\\xa1\\xe1\\x84\\x8c\\xe1\\x85\\xae\\xe1\\x84\\x82\\xe1\\x85\\xb3\\xe1\\x86\\xab \\xe1\\x84\\x91\\xe1\\x85\\xb3\\xe1\\x84\\x85\\xe1\\x85\\xa9\\xe1\\x84\\x80\\xe1\\x85\\xb3\\xe1\\x84\\x85\\xe1\\x85\\xa2\\xe1\\x84\\x86\\xe1\\x85\\xb5\\xe1\\x86\\xbc \\xe1\\x84\\x8c\\xe1\\x85\\xa5\\xe1\\x86\\xbc\\xe1\\x84\\x89\\xe1\\x85\\xa5\\xe1\\x86\\xa8] 4.8 \\xe1\\x84\\x8b\\xe1\\x85\\xa7\\xe1\\x86\\xab\\xe1\\x84\\x89\\xe1\\x85\\xb3\\xe1\\x86\\xb8\\xe1\\x84\\x86\\xe1\\x85\\xae\\xe1\\x86\\xab\\xe1\\x84\\x8c\\xe1\\x85\\xa6.webloc']\n", + "/Users/yhhan/git/python-e-learning/.git *** ['logs', 'objects', 'refs'] *** ['COMMIT_EDITMSG', 'config', 'FETCH_HEAD', 'HEAD', 'index', 'ORIG_HEAD', 'packed-refs', 'sourcetreeconfig']\n", + "/Users/yhhan/git/python-e-learning/.git/logs *** ['refs'] *** ['HEAD']\n", + "/Users/yhhan/git/python-e-learning/.git/logs/refs *** ['heads', 'remotes'] *** []\n", + "/Users/yhhan/git/python-e-learning/.git/logs/refs/heads *** [] *** ['master']\n", + "/Users/yhhan/git/python-e-learning/.git/logs/refs/remotes *** ['origin'] *** []\n", + "/Users/yhhan/git/python-e-learning/.git/logs/refs/remotes/origin *** [] *** ['HEAD', 'master']\n", + "/Users/yhhan/git/python-e-learning/.git/objects *** ['00', '01', '02', '03', '04', '05', '06', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '14', '15', '16', '18', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8b', '8c', '8d', '8e', '8f', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a3', 'a4', 'a6', 'a7', 'a8', 'a9', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b5', 'b6', 'b7', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c6', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'e0', 'e1', 'e2', 'e3', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff', 'info', 'pack'] *** []\n", + "/Users/yhhan/git/python-e-learning/.git/objects/00 *** [] *** ['dc0fb450c30ff4abe40bb368df52f6aa75b14f', 'e291c4ba6cdd8905bb71e103a12403df2b61e6']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/01 *** [] *** ['8ea088a03980389996840bdb39789cdea91078']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/02 *** [] *** ['2ee896022a03777737235ea3d05632de9c350b', 'a42c730cba4ef3f924ecf34a9b626ad2aabdd4']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/03 *** [] *** ['70950d9821a67ebbbff71dd7a86662ec0661e4', 'a3a75820306c968bbfaf47c79fcf81d86e7880', 'b355b06a72adcc747076c87f4a7e9e2acaa0e5']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/04 *** [] *** ['014ebcea161d860a309be206454927ea5f9dcf', '31058c67f9079304a01f436bb976078a79a9ff']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/05 *** [] *** ['33b5b5cdbccb5a39352dfc432d544b8ef7bbab', 'cfe2e3b78a69d1a95bd1acaf79aa8238e5fed2']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/06 *** [] *** ['8c23c6f616f9dd1ac629a4ad964b9334bc46ef']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/08 *** [] *** ['6bb0ee4465e94ef29f1fed3f3a4788619384a6', '9d59902c936d726a2fa825af3025c0c69fca28']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/09 *** [] *** ['7378cae729298b9908879dcef7a56a35015c5c']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/0a *** [] *** ['9b262e639e107323b45730be786609ba7d0070', 'cb1ebade7a7b1d92a4048510e515483cea047f', 'eddf75b65956e280a73f59ff54af4ece407cfc']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/0b *** [] *** ['2954128caae8061907a68f34ff16f5b8db83a4', 'd44b7f27f5012d4f83adbdface554384689e54']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/0c *** [] *** ['2e881a3bc1187680f1f17980c169bc8457b803', '3510bcf370ec7774a8e2eecf4ad9cbe4150028', 'cd1e826dccef3c3c10d6e78084f36c49d98cfe']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/0d *** [] *** ['f309204b9c9518b7743257bcdaeee2f407869b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/0e *** [] *** ['5c89079e832b98627a8b51e5329e0ff46863d8', 'a664ceff2868464b257e563cbfba1e8ccdf0a4', 'cc3038dbdccc752406cbaae0133b4f9863ce2c']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/0f *** [] *** ['10b5de45a81df663a26c9f282ce9e3246a2a2c', '74c78d073883ae0221dd5115ee89f01f982b57', '935e921a8749ec6a4a142fcf0c8fc759c2fa72']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/10 *** [] *** ['3012506f04ca254fd96cd0d95c8f3d9df26b16', 'd3966cbc20d3d4321c55603e6099ef8145daf1']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/11 *** [] *** ['2c131b27cc2155b2d466153aa358674bc09418', 'd56abb81f594062a1698eb17a4953d0a440bdf']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/12 *** [] *** ['8a0178ee5079a04a8ad3561adcb4220cb91f4a', 'a52397148d6471ab33263bfa72a2917714d0ec', 'b8091616916b40b4244391f77ed3d38e538e0c', 'd8e1935744dcb736d5c42fa848c5baa957dd25', 'f5f10848807b338469ed3f16ae64338f9fd8b7']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/14 *** [] *** ['30f9d8a51116b87405377e5edf2bff6f6d6207', '3717079d0c6a85cfabfe27c18e9de41715e11d', '3fdb47817733b3dc761c0ab0888b6714f430b5', '72683c244c8ead51854b89f010d0f787cd438b', 'df3b3de28da50e977e161aa6d7664dc5889a34']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/15 *** [] *** ['d10897b176849d2568bc86e5fe3ee1da8122b1']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/16 *** [] *** ['475d8f8a4f549a6c08a1af237b8d6b1792f76e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/18 *** [] *** ['08037e810600875bf4671a698c3aa48bea516d', '7bdf10fe2ca8caa4bc08fa8b90b458ffb88302']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/1a *** [] *** ['fbf19581aacdd49c996081131799ec946feb39']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/1b *** [] *** ['d777a883e14c8fc9631b8830904aa50b6154f3']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/1c *** [] *** ['bf0ab06828fc2ed4e8c7e1f5b6d9cb398c80e2']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/1d *** [] *** ['1ba2142b09d0b61f7dede3f363f9d07ae96583', 'aa1ce93f1ac9dfd9d7a8774ae8129f282a1479', 'd545a4a96d6f1bd6ac5a148cd4695564a586eb']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/1e *** [] *** ['10fc3c24df25123e049b6986ddf7a879877f00']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/1f *** [] *** ['4fa1e120396bf101c7b9e78bacc8d409d80017', '75e3b2b4482c0fe5509fd30b8985a8c8e7d115', 'b76a52139b243ea3c1567b5b4b01a4dd52ded7']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/20 *** [] *** ['2e4ea6d7e9d2afa5ad3db0e7c3406a1497f66e', 'aeba2bad864cf6904f9caaea55f46f03ce6ac1', 'd4013e966ca738471d4af3cacf20ed9d561dde']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/21 *** [] *** ['677075348491a910d4f29c5eb22fd670cc3a68']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/22 *** [] *** ['22ae1bcb862d387425e3295f4b7cec38cf6f33', '797c26f7df17aae23c71ae39342887d9f3a20c', 'b2d82ab504adeade90b533508d4993a51ac82d', 'c1a7209add2817c8694e85d0826227308ac3fb', 'c465e349128d22ea0e3ebfa9934781a1ece02c', 'cd091b526164f8ee854763390148fa6fc67161']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/23 *** [] *** ['449e590197d29623ba180ccb14729bc932497e', '4d709617672ec10086af7cdc132e8ffd1d125a', '860f9a6d93c0898ba6cf387cf047cc76422410']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/24 *** [] *** ['8c8d57ec3bc7b76aaa665ed9231f16f78fb4df']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/25 *** [] *** ['8699d65bdd64d640a9eaf780ebbfa59dcf4f5f']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/26 *** [] *** ['ce69d4bf834552ae0abb9b7604b3315f1906b4']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/27 *** [] *** ['002d9e0f1859182c469c92a540ab54cfe7a099', '493a5f64c4a53f6534ba12dd4ba775ed0bbb0f', '5a0babbd20c2d1ac9f9adab778f5b51a77d862', '8ad5d52fa819bcf375b8e6886073a4b000e8cb', '8ecaefecbba818f3b5b64f9c71b27770c9aa12', 'f0707ce533adb72597006e1d4d2d07bbc6ee6e', 'f2dcd7555855ee8bc85755a0bad9afca9d8834']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/28 *** [] *** ['c83c93ce00bef3db62c7baf7db9adfda023a62']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/29 *** [] *** ['1e2118c478face7f4f203db1594cdee7dd8b61', '97b58ace0492949543a228e0a1ac18827e01ed']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/2a *** [] *** ['25d79063d8d5c83a549bb1a4f8c0cab0d1af8b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/2b *** [] *** ['38089574b7c7c68120daabc1876021649e3c98', '7d6baad45aa15b714f70665f94cd2000033174', 'bee8941d650e65eed2f3d953618b78d7c5af51', 'f1d8508d800884c38b4f0904d906e4e0b02c39']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/2c *** [] *** ['7f7c41d9977089347554a72395cbd95bdeb600', 'c4516984cde6a905a53cd2b572fb824a59b9a7', 'dda2457043b35d415c985871fc70c8758f27df']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/2d *** [] *** ['41fdcc27b6a964e3a31b6e7623357fa9b3e6d8', 'e35a602dbab4249e9555427c58a3de747d0673', 'e61c953d5f4318cdbfb4bc280a0e3f9ee116d7']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/2f *** [] *** ['85145fc29380524a9eadd52b388147bbf77b75', 'b157bfb6c1cdc2bc33dac08cee4c4369f346b8', 'b35e8ddc751e05f730b7384fb786898c5b2c9b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/30 *** [] *** ['e10c0677ed5275b9b29738a309abde0590ee2e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/31 *** [] *** ['682db5c4a03f96beba3c1a97a92fa65b8570f1']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/32 *** [] *** ['3a9b7f736990ddc76ab34ac0185a3e9b11a9a2', '6c37dc490e99611692991e89a9411eb5c5215a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/33 *** [] *** ['561a12687ba7037cbe41180a7e132d96250c97', 'a6d0c336e72ceb120d674b0ed386b135bb676f', 'b8e396f364b05c0fe09ab58c2a238348c00094', 'e5b3b698ece45390a3188c7dae3bc8b0a212ed']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/34 *** [] *** ['11af090632115806980de3af23932afe0678e9']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/35 *** [] *** ['09401f3dab7f86bdf7df2145e9d9f38f8aa9de', '5b7193e247aa405f253905e5eac51436b1c3f8']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/36 *** [] *** ['071370538d2e3a9759d4c370e00af71cf80d01', 'e877dfeb9e99805e71e93ef31d643b7f522d3a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/37 *** [] *** ['0f177d39604001b5c5f2e3977313885f648c99', 'e7d2d4c212a30e27959c85a1979daa18b4754e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/38 *** [] *** ['56fa4126f53d0d9c26d3e9c0dcd3594662773e', '5c713793eecb2bf6937e2a29b522252084b7b5', '8ec2a9b196f8ff12424c1e8a2d91670f805773']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/39 *** [] *** ['31feac1c630779e92f7faa1ca0831fc0584f41']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/3b *** [] *** ['39d8ee661833f3cf2fe492efcad4a931da4851', 'c1e6957fe70446ec22e98cad0c87b5c6e2baf9']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/3c *** [] *** ['9374fa01b50a022df1bb2e74497b6158d1b00f']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/3d *** [] *** ['45f541c834df6469ff717eb13372fea2b0756d', '5ce6edbbe73596f8053e6fb3c3a099d92e5fb7', 'e570fd4f59b10761fbbc0eec0986aae159d4f1']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/3e *** [] *** ['88e1f24d8b21d2e1fb93dabda2b9826681cc02']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/3f *** [] *** ['11b0836f013af6501afeac263fe09e084d4102', '50c0a945225473767f4d0ae3b85ac581b2e29a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/40 *** [] *** ['4c87be6d27ad1ce23d9c42ab06261db927113c', '7805dc4d22b0820ff9dafcb4e88ed458b25dc3', 'd30b21e7b3b89aeaab97faf10404b99b09bcd1']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/41 *** [] *** ['0e6cb502ce984794c83fe65f73f530ed85ff38', '5fa538df577038ac614057b613769cf0d46bbe', '872427df71c974980bb334a359e3532e4b75e0']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/42 *** [] *** ['ba78fec5058d71d3d2df5e324186b79051b05f']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/43 *** [] *** ['1941e979713fcdbbc93076a580506f8d7dda86', '742bf45a4bdc2f8d4c0b948470a5848c4838e1', 'd1da0f13e8270aa7e9866e74c880ba2225061e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/44 *** [] *** ['95ce53027f4d7223f1c26c389b5f4b43ee90de', 'b5d06a34c313e6729635c7f7932b446d6791f4', 'c619307db8fd874fc916e3d79885e60f167d17']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/45 *** [] *** ['07048eaac616aed43889092054032c3f85b6ab', '497c4fd74cb5406a3befd1a9295b99c26ffd03', '4f6b314bf7424cada3eeabf6b7d8d52850db6a', '87940394951b2086bf151e9a73a8425ad06ae9', '9c3cb4f1e35074e66c35804bd2145d7d82b29a', 'c359199ce588261420c74420492510659d5d22', 'eeb5aad59e8362c862315e2d7846d30ee1caa6']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/46 *** [] *** ['02383aadae4f231e45c51c9eb1cd14e9e048e1', '54aba41a88c480a1413c35bb21561176653db8', '992ce000adb51bac9d89ce4e3fb574e4c771d6', 'c155ac6a63084c3210c28364c05ca910732cee']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/47 *** [] *** ['36066f4c7f2bfc87e67b66d1b962cbc5d7a0ad', 'b0f189cc887631e216bee8d31f53c61b97942f']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/48 *** [] *** ['0954c6ac5e495539fe3909f20558df77c5e5b7', 'c84d8fbd3407c746320917e4f29674717501a9']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/49 *** [] *** ['45f6110aee623fe3f9731ef2798db308e0d564']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/4a *** [] *** ['41b0211f0644f8a837e11f46c523b631e1de8c', '487566b262094be8a504c0d3fd97509bfaab9f', '6cb584042d41189d0e2fbafe0ab74a47eb5b6b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/4b *** [] *** ['0881c66a6eb52f771cecfde83674b422a7d0b9', '3ef622b9306847c3f260361b8d2d6e57e521b7', '4f2576a255179d3e5515e5553000611f03aa00', 'f29c580cdda2b94714823712e3a79a9c4ec3d1']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/4c *** [] *** ['05736ea0a9290fb66cedc588846903b87a0253', 'a3fbadc1725a7d392d2c7a05d19ad5670d6cf2', 'cbc8976df23f9b0bcde414eecb63bb9f98b8be']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/4d *** [] *** ['74d73b9b3d703993547b835ad3ee9096f91458']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/4e *** [] *** ['5a5e2e7d7652003bbbb7969b94c599b7217c0e', 'ac83031c721d645b6457722343415d40251d99']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/4f *** [] *** ['3b49af565c1cf08a0f88289e832df9839505a7']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/51 *** [] *** ['0ad02018ae0e2cf0cb8f77d3722fb20aa73584', '330e1661534f43c1181e8c46393b729aaf4c44', '4ae34cf7ae1534d5a0d13fb079263bb98877ff', '989ea290f00d36c9d59e7fc014822b5d5edd78', 'ed5dd56915c9cd9800ab2e3d2c25489d35fd24']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/52 *** [] *** ['1e760e53ad1a8bcac9d71aebf0c88b40fa4f8b', '524cd78a26ae9e3b9c0d298464d5af631a50ef', 'e545df8a0166b46b34c2c85fcd1f42ce6a406b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/53 *** [] *** ['25dbf05113e22432c1071556d59cdf2e50c1b2', '8979cee39a7283bea7e2e161144ef7eecc7ac3', 'c6412db6d5c9fdf296866c4f0237a481b70469', 'cd407533db65f446555a5237a6e4abce62cacc', 'f37b296d1e9f19ffddf637c59b4f27a8a7b323']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/54 *** [] *** ['3953cbc20a2be4ef4f61ee6c2404c0e83fb1ac', '848ca740f44e12bcaa329b3ce274da51d7ab8a', 'b5413ccc723e74a91371cece0ca439d83174b0']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/55 *** [] *** ['8c0783cb9006cbffd9d50159deeb7f81f8bbe1', '94a5641edc9b030555893d2ee4bcde9e628766']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/56 *** [] *** ['a9a2e1b47e41e73beb48bd4527070213310383', 'ad7f1a465815b9dcdfaec8e23091611b4d2061', 'ecfe7cf3cf6f14b12c5a384ade2a162f1ef96e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/57 *** [] *** ['2ba26b61d6841a3b1e2766ba7ddd82fd743b4d', '97bddbffe8e27a6912e3edb865813c92ea28fd', 'f18db37f2d815f66c3508e507c198bc8de6382', 'fc7e448f123b342fec5540b17c2b75fdd83a7c']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/58 *** [] *** ['09dfad15650fded95412f7e0a0408ffefe031f', '113ea6cfa57f1ebe243a6e203aa63f4544f6cc']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/59 *** [] *** ['2329771881ee98fc62335eb45f3903ca27c955', '69da3f2d4f7eb0714b3a038e016eea6ef771c5', '75dde80c9bc6c4e0a3cf4618dda9fe82908670', 'c058689387bff30675ac89913e224aa9ad8fca']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/5a *** [] *** ['4566ad5d51b35096f9f0b7d52371d67bf4f94e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/5b *** [] *** ['723b0fc2bbc167689e756853e33da061104598', 'fdf352787348ee5b5dee092159f93392bf30a5']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/5c *** [] *** ['2fd007c8907d93ee4ef97c7f29e99008bde520', '3cd545efa6c4d3b0bcd1b07e092bb133cac792', '82f14cebcbea65a0319aa0ac7a96b4f961759d', '9c77f033848c8165939689a09ff0ca79645f45', 'e7baf903851b4753a0e0c2c460c7b7a02a671c', 'f59b123426244127e7fc4b350cb2b756f391d2']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/5d *** [] *** ['7f5b2f6a58ef55c368eff8ce51903f8ac70271', '89e33bf5679736fc159bb11fcf88bd08faaed1', 'ef3210e2a2d5a454276825498dd05b44f6bc58']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/5e *** [] *** ['173336fa2f82d55de2d5bdbc61a9a58785b6dd', '568e1a85b1ade65e044e5f434fafe10b4b6920', '87bd67095fbc306958afdb8e7c0b4c73cc6924']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/5f *** [] *** ['554823945ba397dc1c24be7b52889924220139', '8f0c2deb6df573ff222e002ad462791b0872d9']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/60 *** [] *** ['17e640121d2e60c29199d1ba884f04b983fc2c', '7a78605b7779c023333e02579b1605d591df70', '8e4742853f142d7f4131b96cf33b3d139d6455']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/62 *** [] *** ['370a4082f8d23c53d2b1b2819d3ee35078dbed', '42b1383739cf4f3d6a5a6e9710d942e3e0bd31', '444c4c8f417ba05de1ba9d20bdd26e572735bf', '99ae6e2c1593a0d792fa1ea3a0b6844a752bd3', 'aa85e99781f4192642f5e72b9dc814cd834064', 'bfbff844b1ca51c92442a540140ba55770126a', 'dd31048477c7e558d3a0f19a9b246b07a53841']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/63 *** [] *** ['170470eb1cb040286e3436622643e5a786b452', '918408f9172a97405d56d2c5f8ed23c9a2f101', 'ac5d9dd38a2cc18b4e7dfe762b3e9b43a14c22']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/64 *** [] *** ['0d959d55b9be1e122cb6c4d71d7a84e9900ebe', '2488bac2f6a31bad259e71f94a71b5c07cb83a', 'e7ea356a38a943550dbdaa9321228edb1eb498', 'fad5e89e8b653b34cfadc21c09d292977cc57f']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/65 *** [] *** ['12a7f1e213dcb4fd8861c9beec5bd841caca18', '529d57fe2821271097d8e3df735dc4e36da044', '91ad17340c733d533b5288d3a5eabe098c5d61']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/66 *** [] *** ['f560e09b0ff78b5ab2a723309be16216058354']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/67 *** [] *** ['096333bb15babfbeeb2abe00daf4503c70541b', '12e5be3a6399b9782b1fcbd6300b3947329127', '2e32127d3465ed4ad78bda65170be89c99df15', '9c5975a397bbdff85097f72d4de2ffd186d37f', 'e13a09e292b40f111e00bd6d61629c27f553cf']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/68 *** [] *** ['bc7cabadcd491379249ca8c95aeeaf3ad351fa', 'dc53ece1c32f64bcec2cbe4d77533a6a35b49f', 'e23310d730c60c86c9863fb494ca2dd2adae6f']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/69 *** [] *** ['25ee04f83882ea917d28d88f6b9ede18406422', '29b58d31f16d6262161bcbbd0d313fe404fc0c', '2cc021ae66254ed50a4bcae9f70cc2033184bf', '3a4e7a831a1a5e9cbb4d3dde65f2876e66a4ac', '6a9192658eabe346855f251462f61a95ea2796']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/6a *** [] *** ['bd9cf781bf93d74c32bf77e7317524ded77343', 'f70956db5aab3149e7d0dce4269d9783ab802c', 'fe21ed95e2b0b13b57b58f9b1348910dc9d16d']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/6c *** [] *** ['14cae44ff5dbdbf0e18d3b3b2fc1eec7e5ad82', '40710f5a85817858401a1e33cb3cab7c9eb5b3', '6d216fb58c38fb5f7ac4fc117049d731cb6f1f', '825e861d9d3129e0af4f331b3e192409848d61', 'a71b8206b22d41498681243e96330ac1544fa5', 'd1d09afb11ab8cf58cda9dd3c214b01f47c47a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/6d *** [] *** ['13d1bb361be1038d6711abb9b813f0e39f8c86', '187a094dea87bdc8e431d955e0385311a3be3a', '277ae9afbf705af55352308566f09ca099bb0b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/6e *** [] *** ['15b3fbc8fd94059fdb9d006b19f7fdf98382da', 'f55b9a1e667402fcdea04ac09ee1fe9d326140']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/6f *** [] *** ['59276eda6298e2ab203eba5130eefe875d10fa', 'dec20cfc197eac9001c9c52daca1c36f8aeaa3', 'ff2042cb3850cb4f34079f72e0eafce1dc06dd']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/70 *** [] *** ['6efa796882f4039ea0016846cafab48b3d4f6a', 'a35887f591e58227f9c627ce13dc02b1b6f40a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/71 *** [] *** ['14e52bd7220a6009099ff1ecd6d6fab6fd370f', '171decf92df3e0561038d092843fbee1a7b005', '241f43a21fe129ddc2cc3a35b8c4fda0fa63cc', '41e40ca6b29c0908ba6c62afa7cc57502fde5f', '73e25c1e43440c68e20eaf3b9ad55229006b10', 'f881e350c67873da18f26a1868552e14d07a52']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/72 *** [] *** ['79fb58511b17c4668fb5de7fa1dcbd02b3932a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/73 *** [] *** ['8ca364f23373d02123e028d0bed4bb239eea54']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/74 *** [] *** ['02c71afae0497433806244b96433cb854073c4']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/75 *** [] *** ['3ab3802acc73b6f360ee06e6d3dccaca3e173a', '705eb0784cc2bba52ae6c895077e2b344ce2e5', 'bbb70d421a47dd816790015feb402d6e64119f', 'f41677eaa11a1cfaeed66a755a25db17b6423b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/76 *** [] *** ['19253fe874851e4c2fbac3deb719e07f8e1008', '78dc22f1bc2e8bdce8467edb220f6136ac761e', '7e544e489278c3a99009d98bde268d78f3d206', 'f0c204c4418e19594cf7eca0af2e6caace550a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/77 *** [] *** ['f2d095709bdddaab0e52bfb6a3d7c88c0e8d25']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/78 *** [] *** ['123ba23ec397b2070b8833492233989e734b04', 'd59d409e1f3587fd83a478f45d7abeb11c9b35']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/79 *** [] *** ['e24c10754994afaac8d039ef874c23e4393a18']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/7a *** [] *** ['9a287c28f576f20a4f757a5d952c98d00db1ae', 'f69dc7baec8c0bd5c50a155a8bd942d829410b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/7b *** [] *** ['3812ea0bd943a043bcfeef3994d87963495517', 'ef4b70eb2fb0a01ab2b9781cf45ab3d4518977']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/7c *** [] *** ['347e4f08b4b9cbb6e4faa1614bcae8206a92e7', '56d63dcdc4f4df717e18d87dfdb69e68c06189']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/7d *** [] *** ['0cdf50deefd79339b1e8ca1774cc9854cea2be', '38fb3517738958eff875c52d4ff1cb0b880915', '3a5750a2def5fb2534e1ef6e7c412a6d67a276', '540cb2d39ebaa150aef248e9e717f1fd057ae2']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/7e *** [] *** ['afbb34c45312b9388fa2bcaf30775932b922ad']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/7f *** [] *** ['4df29675aa94a3081d4c99c16c5b492b22327b', 'cd84268120b5723ab927b916b110926315f64c', 'd082a75b551746b629b1b7d6dd1b3071bc3996', 'e46663137e34f17e6373a41e5b7e1d5656089b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/80 *** [] *** ['49a457bbe475adbe9e2c990c1cd34d41ad6027', 'a910f2e3afb8affea6a1224bffb0d4153c0f9d']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/81 *** [] *** ['5857a2c87898558a04888736bbb0d1e0bd81cc']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/82 *** [] *** ['1f500977ba1d133fd76a3d231bfa97991bc224']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/83 *** [] *** ['0fcbb2aa0673e6f5e58359d7f6c22876625b9f', 'b740263e0c6560f9404944469fa067c9f690ff']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/84 *** [] *** ['73fed03666a862f6b4c0e6c9c8a2b7b7506eb2', 'c90103e8a2655519dae0db9e0d047b5b8de15d']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/85 *** [] *** ['7a3be043ad09271465b0b7a4e0b9efdc3bbd01', 'ca06dc7a20cc818580c89cb6d52caa27b2fde8']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/86 *** [] *** ['068d93d28a7dc6819bb7cac07ee2f20d25206d', '37a361d362dd9a57b23d59aafe2fa5f5d33cac', '579302660e99078e0cf3c3756f8526ee4210d9']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/87 *** [] *** ['40af0f002d754897f4f6ba40e29711d556cf34']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/88 *** [] *** ['1380aa3da8e5a4b578d01fd9455c5fb30d0c2a', '512ac1943518429b68422ab2743f3857fd589d', '527d0cb2bf0dbb210c7b3b71628be904fda844', '8e311604bfe19b7a04a008c04b6c6e7ce8f301', 'a265303456ddcd5660caacfde362bafb74785f']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/89 *** [] *** ['5d020f3285d6d38552e644a838305b8f6b7904', '84c6c8b7eb8cb97e520637500305d03febfb6a', 'eb998c603da7ece18c34b300f5d87284440b25']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/8b *** [] *** ['1f29afb068a3fae13f4bcbe4dfa225c7ef1e9a', '5520f47aa8e745cffe9ec8b520b230cd0973ab', 'e160fe01457e1a95aa84e01a4fc5af15619170']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/8c *** [] *** ['360c3bb449d7abba07b380cb8ccf5050cda7ed', '5866b7c0a5e6a43208b79893c356fd288c4075', '65d42b03eb34c67e482c7046bf551e8c90c61e', '9c469e5da4e1a96c1b28d20b6da8037eb8a46b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/8d *** [] *** ['16a36ae2c7407607597bf74457c21b151bb0b2', '935860869c10488ed29dc4dae54051f58b7e7a', '9f22258a45249a10904028fa7e229ed3b5cbd5']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/8e *** [] *** ['57cbc6c3a0d77616b62f5f534cf0543cf9c018', '605c0fc8b4a6183b45a1abb26c89af5a1480b1', 'db37e36dfbc0094246c945074c1f0a41d9047d']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/8f *** [] *** ['b27fde3923adadefc15a17c9f9a3b4f25393e2']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/91 *** [] *** ['36aabd47693ab3f52543d9ab4ba86ada86487d', 'e20f024a4d0cf411ad5a65321eb3532ea0e12f', 'eb40fd587726a56a229d8a1a1bd7194d764a18']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/92 *** [] *** ['1ec97807d3c4a38242c6ee86230ef4ec4e9894', '27fd0846778b16825d880217c4194a65bf5630', 'bbd65603b25da5670386dbf299cd5734095f20']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/93 *** [] *** ['0767251ec378ea6554ab88f1f870408b5a0eab', '79a78f14e3a7fae952f8903d6aa2f91e90f4ac']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/94 *** [] *** ['5e9f339be078d36006cf9a9ce8c9f3890838b3']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/95 *** [] *** ['8b4cb226cff47ac997d83f74f9b9fb990da746', 'a907d0526436b2142d68564fe0084b03fcc659']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/96 *** [] *** ['922d1b3dd832c33a6e4d4b89d4a3f63201e646', '93b226b35b30ae58349a184a50abd99528a3c6', 'bee251dacbbd3edfd77b1b855f71bc0e9316fa', 'c5bd6c7801ce7531b69771958faf7e89a9c9e9', 'f8a195a17d1d2a92f5a513ce2c69205fc068ce']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/97 *** [] *** ['1796e212e6e5240d9808d82d1cad9b98b56d51', '543defd3fdb0fc7f10ed6df9850ca0909578d1', '5e1dc30b3d8d8b0b124b188dbde2cd394695fe', 'df9bb42562da542122f4c0abb42de18a995920']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/98 *** [] *** ['8c55780886d53a5336af1c13053acc54ad1a63', '8c5d6f50287365c8c4eb4e09c5132a17c7ac42']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/99 *** [] *** ['003d36e856cd7e5ab4fe1d5c4acfd3ebc714cb', '38518fe857987442a8db3c564474633cc80850', '7dcb6d8a2680f516655cc253d4020dd85d4d8b', 'ed3600840d86db3e1cd96afed466d75e809234']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/9a *** [] *** ['36ecca6b05fa951f9a0bea8985e07617617f87', '610f944c6ca0fada1c53de569c7b8a2cc45b87', 'cd4ed2cbc3c286a1145874fccafeee0d46e37a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/9b *** [] *** ['b6b3412d9db8eb23450167929d85d2466aba9a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/9c *** [] *** ['553121d960d75d9bd04d2ce59361b1795fa14c', '7564c32d09020d6ce604aa2881b090e6951455', 'a64297398ad74416f56f43ecc29c5a0af2953f']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/9d *** [] *** ['df16f803ddc744b50cd8d93079f2488ae6e35e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/9e *** [] *** ['28dd8457628229fe74e58acb6b75c64bbc7e78', 'b20b218142368534b88aad0397685fabcdeb6f']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/9f *** [] *** ['1588da048998397a49abae1c208448666a351c', '4a920aff42a7f3cdba9c37b72fe44b2bb65843']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/a0 *** [] *** ['27ae2f7a6446d3e6091bfffdaf6c6c3933fa20', '83370b434088b441eb76971e436c61a69eba2f', 'd77b1a3ab741f5724337649030a8dcb5e4342f', 'f81294e271cb903263275a525816ac7c2968bd']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/a1 *** [] *** ['55e5d31e0500f5f0c921e94eb69f16795e2a40', '5cd0837f704a358ba7511323d33f7a6bec4fe7', 'bdf8a7c1bbe921f234023c4b0437b6cb53f858', 'c26a4abdcac745630b22808487e07abc04aeeb']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/a3 *** [] *** ['af1876d15f0cd8637b1d9044125328c016d66f']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/a4 *** [] *** ['0702f9f732c24dca8514dd899d5b9fae096d61', '93587fa0624e5984846258fb2fadcb59cfe4ef']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/a6 *** [] *** ['2792b74441c1693ec7102d6f2b2acc66b988e6']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/a7 *** [] *** ['37238a77f2430e69a9e3ba0a0db081d5832764', '52b6d05ffe64dbd2c5aee88dd9b9ba3d602f64', 'e1e20bb363d5bb5105936d8e0fc4d4fbf3db63']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/a8 *** [] *** ['04f8e7567925c8a6de0c473a0d652b861060a0', '1eb7e086e9f98cac60f5d6c5117b9e77e25fcb']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/a9 *** [] *** ['a2874f7720fd14c506c2dd79661e2c77ab9370']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ab *** [] *** ['00090564b3b0bd1dfba444e59948f6edf03c46', '6e0002907f1b8aaab994f8b55119bb172586be', '73d5217dae311c55a6821924d1c066cdba3e35', 'd194205eb656bfc6e8cbb34e620d12e2421049', 'ff9fcf69c448f031dfff76534acac3b22dd863']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ac *** [] *** ['66eb5f551409dae8186aabcf4015ce0a0f697d', '67e0813e68326e3e8239ee49c40d07c1cf84c5', '75debf22b6acab629456153358e89a28692898', 'f9cd8989d00496b7af125b4b913e46fddd1dd9']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ad *** [] *** ['092aa7afc9248e089d584a9744adb3653b61f6', 'dfa8e6639a4282b86b1e9a29f1dcfb0b6cbe28']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ae *** [] *** ['bc08077b8f8d35f34b414aed15c9bce9a3bbcd']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/af *** [] *** ['15c74e2d5bbba4d25ce9bac37b68aee038b806', '457d2d05fc7386886ed18c995df4fbcfb978f2', '664c6b38ed13e1d481d8b2c6fad56f58332f93', '9e5f0f4dfb3f095f1161daad8bf2f8c2d609e8', 'b02eeffdadfb74ae88ff07f4e340347727c485', 'c66079b62dbd01b236959563201efbe73a33ba', 'de49b21880b8ba4cbdaaa3fb20155ccf808509']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/b0 *** [] *** ['2910db06e40b3c245c88bfea7622853154a332']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/b1 *** [] *** ['33efe17d505720234c0509f898b4b56439f91e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/b2 *** [] *** ['43279e6b38bf93cfb12423f9e03ce8c26e2096']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/b3 *** [] *** ['3c3fe9a8b57dbedcfbc7c1889a01009b29645d', '72796cb7e5fa0bea97a06d83336389093b8b36', 'a514be327d06cf57a8f370d484ec6a5f175f9c', 'd8d12763a7725626e3174a67b59cb55a68dd91']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/b5 *** [] *** ['3ab448938c5a046c6f125c715c69cff47cee9a', '4ae04a3e3ee366a049dd549f03dd26c50cb400', '66754f04e5fe3c9a67edd37732fd4adb450f2d']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/b6 *** [] *** ['b59d7be2b207d42abb3175a559eb2aea2d1bfc']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/b7 *** [] *** ['25c2d6da75d383f33783111531892b874cbeca', '325a7ce662151c140aba466c4dd5f18d7296d1', 'e9d907f9a97d364e5da9fbd933f0bc7eff44c1', 'f0e0b649ef121bd6c2ad6a0a828173a4d297d0']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/b9 *** [] *** ['4552462eff47e9904d072a558e6c302624cd9f', '6a7ec5cfd700e6318de3d21d800b4bd4366f28', '85a1dea56aac47b14c2d3ee51c45e2453168b8', 'c73287a2be13eb086011e6e358cd93d59a30d4']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ba *** [] *** ['aa733ced6144dcb71ce57270d6c557bafe4baa', 'b65b6615906c741888742db6f2a894c0a43146']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/bb *** [] *** ['43bb629cee4365ab131e7e2085f5b179aad4ef', '7e0ee8021ee240a1e7535074dec713652f2556', '86a6c6471d0626d64b30d1daa2f760d5efe3ab', 'ea131a3fb78f0e3cf49103d006e04b4b9a7684']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/bc *** [] *** ['27fbb8d9ab131d9fabcc2f51932c2b675cfba4', '800db573000e74074a36ace8d91035d937a819', 'cf9c0c8d6b694e68b4c9d71cf514f9f21e3409']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/bd *** [] *** ['5fa976d71ef6a6bc25c7a81c0bd2739f5b4f40', '840eb7afe479bea35ec1b24ad3eb4eda4424c9']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/be *** [] *** ['5f699de8f6f8d1a91e11dd6725d55c63643c58', 'b2d8d906fb2f82106751457bb4cbacc681ef36', 'd075fe5f0c6ab0c4a04bdc85051fa0428817e6']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/bf *** [] *** ['68effef1e43fde8cde0475f8d52f5c02014b90', 'a59c91da06d4b9cf87014b676b8bb79a5169f0']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/c0 *** [] *** ['185173317caaea2d4469ec9faf15a44cc7ed56', 'a0c6aa8806287f2d5df083fadb648014e6ddbf']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/c1 *** [] *** ['efdc7c6ed37f3b6377e77ba6aef2d4f55ffb53']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/c2 *** [] *** ['4766741a28b6179ebfd04652a6cc24afc936e9', '86acc2dad4cefdf55603321acb6fbe0c1a721f', '8ea9dee2891623915f602aa7bd9576cc1e8499', 'ea516bf0e7af32ac0027d2e8d9a0bfbd4e3a4b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/c3 *** [] *** ['2a2b1d4df2707b8885a72cf0353bc2ec3d270f', '2c14b83657b9e78817ce53dcbafc7b75bdcf6a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/c4 *** [] *** ['133bd336a4bb6f483ce4bc9683f943809e0e84', '1b2f8d9c6c52458f73305c03e49e47eaca8714', 'eeb6e2832616af56d8f5a04433ea3c35ead464']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/c6 *** [] *** ['0103a3c2d69d498968f17f31ff2da79c35250d', '3ae0cc581c3bc98b6b9d89b01549e2cc93c140', '7a7e9e17bae59040c6c49e2b74e2f64b0e85e3']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/c8 *** [] *** ['d297a1de21691704bb75bccd11022a0ccbb0a3', 'd5fb5f77a4056c3a5374b3c484ea2b04a40e6f', 'e0ba6fe593e3cadf321968e863067e93fcd34d']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/c9 *** [] *** ['1b4288c49496b0a0f97139f2576fd5bd8da46f']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ca *** [] *** ['a5ab547f68b4f22646195ab4406b13acebeb3a', 'b8d02963da13b0bf60b07698574418fc09aa4d']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/cb *** [] *** ['833a6413106dff440be630cfa575d846daed2e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/cc *** [] *** ['07c7f08779852c62c0f05286e277498a840567', 'b6cc88aabeb979f46ac9b36719656fa7bb51af']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/cd *** [] *** ['088d78682977ba63eeb3a762b345e9dd0737fe', '12af73e56129987fcad94edca8533228f5ab06', '63ca647d576fb6958ce54b83ff363290c71dea', 'd4270aca13720856c1be13e7fa245b54f3cf68']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ce *** [] *** ['1fd4596d68dc021de8d7b2513f96210c2b949c', 'd5820b41371010e88dbdcee0fec2b9e59bc27b', 'da9b044072282c24ede695bcda4a579321a1a6']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/cf *** [] *** ['67398aaf32a7a85611c80566e56b9be4d6d1ee', '790f94d2255ce7e5e047ce04ccce1ba228d471', '9325c7fdb5f1b30e08dd74e73fc3df83ad04e3']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/d0 *** [] *** ['7c9eb5a28ba60faa6c7cff4291211a1c370896']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/d2 *** [] *** ['4512ea760db09b5e77a65397a31a3dc06d3134', 'e94611d75b78e964aba3e119a31d963af9967d']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/d3 *** [] *** ['27ff470eb67030f177cfb1573e3190e8d06290', '827e75a5cadb9fe4a27e1cb9b6d192e7323120', '97614ac13bb294220b7e99e64903986248686b', 'c1bfe2f1f9084fe3a7106b90c58025754b6c82']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/d4 *** [] *** ['37c84b2d7b7633d9c225d772a1daae737edecf', '4549e2f37bbfd6cf5e6c0f5fc0aa8c49cb19e9', 'f2392e30b4142386639484002db68f2a5e3fe3']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/d5 *** [] *** ['9af0aa43054ffcc84c6bddbb0a37ddb5aa06dd', 'aa40c4965969293110769e7dd9b61eb432a5b3']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/d6 *** [] *** ['7b5a8f178d23d6f9ffb23a72074c7014ae25ad', 'e562b9e450e250ad034b7b8224b7f08223bac5']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/d7 *** [] *** ['0de4ad7dd7a627e8b835812c9da7a94682c0dd', '531bba26f68167bafa9ab1a51ceafda72b75ad']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/d8 *** [] *** ['53a99c170ccc9d1c79a058ca7d302421317602', 'e4cbae3243dd6208af465b47c4de97a338508e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/d9 *** [] *** ['20e7c4a40aa6eee70ca39cfe6d43c6a10edfd7', '9f55ddeed3866e983d7dd86c0737192e65a7b0']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/da *** [] *** ['348c0f658039564edf34066c74a3f53b3aca52', 'b682beefeac886bff91db5771a7bf2dc27299a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/db *** [] *** ['103a0e5e22ce83ca1a9f5858f0c70db3b12722', '60ddcf687e3ea76ec7fa52e563874c0797e009', 'c336db863f5a185165ceeaf238c3a23ace9c73', 'd9bab3d5e34e825930201025976979661aba92']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/dc *** [] *** ['0d24f1851cdad36079ca3c647b622c956be5f9', 'a93520979ba8c89d4a13ab737efebe542c92f0', 'ec827fabd31aee7ac21bfe55ebcad6128f0792']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/dd *** [] *** ['79046934146fcccf9fc9c329696acce3a4d2cf', 'cb48c467f676992b81db3946cce1eed7cf6978']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/de *** [] *** ['80333d46fc6e1c0aa9a99b6e8dddf34646f7e2']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/e0 *** [] *** ['bfc813fb1d9cc584b3fc53a9981a47f46de58a']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/e1 *** [] *** ['37b1f15e85ee237e173ff78380f723a1c668ab', 'bf96fa317c76a3231420655a32111d1c1da555', 'e99d0be0feb9e6d93efeb90c36c8919f706038']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/e2 *** [] *** ['24506cc6388de47b6c6a0d08f54eabbec16a19', '732827162cdf57f9ce53b8eb3513a95a02417b']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/e3 *** [] *** ['149b9473eb3c169d6e925120ced9f89c76af2c']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/e5 *** [] *** ['d1970d5528a8270fdf284c7495a11467466a4e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/e6 *** [] *** ['0712f7ebf24daaee3021a108de2366038844dd', '9de29bb2d1d6434b8b29ae775ad8c2e48c5391', 'd095b9201ec40c49a5db062b61391db44cf8ac']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/e7 *** [] *** ['32f21aa94585af4282bb587a266634c4c99d8f', '42800bace72166bed3178ffe277f4dd8252c60', '4d7f3ac2c39cd0866d1f60dae55cec59b0710c', '78cf7ef429af3b886573ee859b6cb94a595660', 'd42b6227580375d3ed2c8a1d7d766295fa493e']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/e8 *** [] *** ['884573084ccd674cda1817b66dfe86e69d5ceb']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/e9 *** [] *** ['84a80d267924e1b00d51aa85ab79a485a82ab3', 'fd2645069592448efac4b761335128b658dfec']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ea *** [] *** ['0d6dd7bc55b5036bc75b686b2e85db39c946f6', '2b1668ca46e80511228c58911e1b289d6e7d2b', '563b08363fddaa3494c2bca0b08fb5f62af614']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/eb *** [] *** ['04c627e1fcf84af082c5d8d7eb832291d2080a', '38943c606f4554f5a09ff82dd353ae86a3e507', '48f4c3d45fe72330d8e3ac3ae2929c62cfbd12', 'f2cc464882a695431f353affa8223c20ab10d2']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ed *** [] *** ['1475b6119bbe3366a161b26291c5b43fcd781b', '52d616af517ee2de0590e146dbe04e955e0810', 'ad4fb88415ea29d66233cc2055d6ea10930773', 'b2dffaa904e122649e8b8737fad6af7b7ef0a0', 'b907b8d6678f7d87cd9ec0c0047a9777b39209', 'db3d0d4d3676f63ba03e0bcd187c85fec24976']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ee *** [] *** ['0646ace1c987151d5ef65c5891e1894b2eafec', '10c9042d453594145ab7154b69561b9674ff86']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ef *** [] *** ['1f1c359f79446d8ee9483d21a559d3183f4175', 'b2262152b9e14e1db65f0f3b816d3a8493c856', 'c93a2564bfafe9604a2bd9da9ed999c3db42d5']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/f0 *** [] *** ['84f0ef59bb28bb17d863409c0445a949e48f8c']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/f1 *** [] *** ['222fcdb957ebb8e838a78934dd2cbd764e27da', '6a748911a7e98d3349393b02479d7ad6fea92a', '7b7f589d1f0c9c76c5fd65108ec3e00d62f554', 'e4cfbf0f9e004b5c205caca5f0a761408a9fda']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/f2 *** [] *** ['ce2e3495270e15ceb15c6b04c0489e438854b2']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/f3 *** [] *** ['4b13139c66f15eafdbfd44a01f52861c056ba1', '5445a565979f9bf6c5cb3b49078ebba88cbc3f', 'c1e0bf833f9fc134b3c3b655b1b89af0bfd87f', 'c5e538dec6f536613f099f1c663d4efd291340']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/f4 *** [] *** ['417f1210b5de02707f87a68998587d2845fa42']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/f5 *** [] *** ['1f3fb3d901204ab8ae80bb379e11cead0fe2d3']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/f8 *** [] *** ['0cda1b6057ba30380479c6d2578e3ab834efd4', '0e49d6ea3f0025be69ac7b686fb314f52a413f', 'f471c4e7104574a6bd5f55393cd6b8f059de2d']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/f9 *** [] *** ['1db927d0e1fa90ac5a9f97604ee5cbb3f0697d', '4113935ef38cdc961a42c21864abda1e529f2f', 'c12eb476aff9488a1393d7ce4b781a69fbf61c', 'c788d0a2a87dc9cbe946824ef494230198401b', 'ffbfe5647b2074fef331d7d5dd6782d237a254']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/fa *** [] *** ['1f971a12d044a6efe36fb38bba3345b88ae4dd', '20ffe1a171be3138d8c8b4388da4f753e6d696', '931c6e0c6f994808fb284ea7a0099ba3b7bbcf', 'a4af576019cea17aa732c86377e22403553ee1', 'f27b201190f675a23fdcf8bac46267050b5a80']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/fb *** [] *** ['14b29ef59c3b403cb3d0eb83597adac1df14fe', '1ad6e8ca735e12eb61b24b4136cf99c9e4b99b', '2fbfb6168a70b82fef1f3c59c4a282cd91787c', '5dc712130744c28d1bf44b1eb8fc3b6a59ea72', '6aa651d1abd249c085479f15e4a80a87918415', '7b84f1d3cde6ebc6f03a7e36935be883779c21']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/fc *** [] *** ['f79bd3f5ef211f1e86795424ac263f48bee804']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/fd *** [] *** ['85e782bdd61fb6b0d0d0fdba87ccacd66e3a09']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/fe *** [] *** ['82f2c6b9d01846bef684091290a17d5e8cf509', 'e9b14ffcf558acf4bb142c938ef77ecbb35aa3', 'fa1b46f9a5127be0880e6673cc309e50bdfe20']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/ff *** [] *** ['20f5dd7d01b98aa046f3bab1a7829881daeb43']\n", + "/Users/yhhan/git/python-e-learning/.git/objects/info *** [] *** []\n", + "/Users/yhhan/git/python-e-learning/.git/objects/pack *** [] *** []\n", + "/Users/yhhan/git/python-e-learning/.git/refs *** ['heads', 'remotes', 'tags'] *** []\n", + "/Users/yhhan/git/python-e-learning/.git/refs/heads *** [] *** ['master']\n", + "/Users/yhhan/git/python-e-learning/.git/refs/remotes *** ['origin'] *** []\n", + "/Users/yhhan/git/python-e-learning/.git/refs/remotes/origin *** [] *** ['HEAD', 'master']\n", + "/Users/yhhan/git/python-e-learning/.git/refs/tags *** [] *** []\n", + "/Users/yhhan/git/python-e-learning/.ipynb_checkpoints *** [] *** ['assignment-1-checkpoint.ipynb', 'assignment-2-checkpoint.ipynb', 'assignment-3-checkpoint.ipynb', 'assignment-4-checkpoint.ipynb', 'assignment-5-checkpoint.ipynb', 'python01-checkpoint.ipynb', 'python02-checkpoint.ipynb', 'python03-checkpoint.ipynb', 'python04-checkpoint.ipynb', 'python05-checkpoint.ipynb', 'python06-checkpoint.ipynb', 'python07-checkpoint.ipynb', 'python08-checkpoint.ipynb', 'python09-checkpoint.ipynb', 'python10-checkpoint.ipynb', 'python11-checkpoint.ipynb', 'python12-checkpoint.ipynb', 'python13-checkpoint.ipynb', 'python14-checkpoint.ipynb', 'python15-checkpoint.ipynb', 'python16-checkpoint.ipynb', 'python17-checkpoint.ipynb', 'python18-checkpoint.ipynb', 'python19-checkpoint.ipynb', 'python20-checkpoint.ipynb', 'python21-checkpoint.ipynb', 'supplement-2016-09-checkpoint.ipynb', 'supplement-checkpoint.ipynb', 'Untitled-checkpoint.ipynb']\n", + "/Users/yhhan/git/python-e-learning/aaa *** ['bbb'] *** ['__init__.py', '__init__.pyc']\n", + "/Users/yhhan/git/python-e-learning/aaa/bbb *** [] *** ['__init__.py', '__init__.pyc', 'ccc.py', 'ccc.pyc']\n", + "/Users/yhhan/git/python-e-learning/example *** [] *** ['t1.txt']\n", + "/Users/yhhan/git/python-e-learning/files *** [] *** ['cal.py']\n", + "/Users/yhhan/git/python-e-learning/images *** [] *** ['.DS_Store', '2d_array.graphml', '2d_array.png', '2d_array2.graphml', '2d_array2.png', 'assignment.graphml', 'assignment.png', 'bytecode.graphml', 'bytecode.png', 'changeListElement.graphml', 'changeListElement.png', 'chmod.png', 'compiler_interpreter2.graphml', 'compiler_interpreter2.png', 'cyclic_ref.graphml', 'cyclic_ref.png', 'cyclingref.graphml', 'cyclingref.png', 'function_arg_dict.graphml', 'function_arg_dict.png', 'function_arg_int.graphml', 'function_arg_int.png', 'function_arg_list.graphml', 'function_arg_list.png', 'function_arg_list2.graphml', 'function_arg_list2.png', 'function_arg_str.graphml', 'function_arg_str.png', 'function_arg_tuple.graphml', 'function_arg_tuple.png', 'inheritance.graphml', 'inheritance.png', 'inheritance2.graphml', 'inheritance2.png', 'inheritance3.graphml', 'inheritance3.png', 'instance.graphml', 'instance.png', 'instance2.graphml', 'instance2.png', 'instance3.graphml', 'instance3.png', 'multi_inheritance.graphml', 'multi_inheritance.png', 'multi_inheritance2.graphml', 'multi_inheritance2.png', 'object_copy.graphml', 'object_copy.png', 'object_deep_copy.graphml', 'object_deep_copy.png', 'object_shallow_copy.graphml', 'object_shallow_copy.png', 'objectIdentity.graphml', 'objectIdentity.png', 'package.png', 'package2.png', 'pythonpath_eclipse.png', 'queue.graphml', 'queue.png', 'referenceChangeList.graphml', 'referenceChangeList.png', 'referenceChangeNumerical.graphml', 'referenceChangeNumerical.png', 'referenceCount1.graphml', 'referenceCount1.png', 'referenceCount2.graphml', 'referenceCount2.png', 'referenceCount3.graphml', 'referenceCount3.png', 'scoping_rule.graphml', 'scoping_rule.png', 'shallow_copy.graphml', 'shallow_copy.png', 'stack.graphml', 'stack.png', 'win_os_linesep.png']\n" + ] + } + ], + "source": [ + "import os\n", + "os.chdir('/Users/yhhan/git/python-e-learning')\n", + "print os.getcwd()\n", + "print\n", + "for path, subdirs, files in os.walk(os.getcwd()):\n", + " print path, \" *** \", subdirs, \" *** \", files" + ] + }, { "cell_type": "code", "execution_count": null, @@ -40,9 +348,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [Root]", "language": "python", - "name": "python2" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -54,7 +362,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.12" } }, "nbformat": 4, diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb index 8984c6c..77c6336 100644 --- a/supplement-2016-09.ipynb +++ b/supplement-2016-09.ipynb @@ -7,6 +7,398 @@ "# 수업 보충 자료" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. E-learning 13, 14 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) text file vs. binary file\n", + "- 참고: http://stackoverflow.com/questions/2665866/what-is-the-wb-mean-in-this-code-using-python\n", + "\n", + " - On Unix systems (Linux, Mac OS X, etc.), binary mode does nothing - they treat text files the same way that any other files are treated. On Windows, however, text files are written with slightly modified line endings. This causes a serious problem when dealing with actual binary files, like exe or jpg files. Therefore, when opening files which are not supposed to be text, even in Unix, you should use wb or rb. Use plain w or r only for text files.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) with ~ as ~\n", + "- 자동으로 자원 해제" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = \"\"\"Its power: Python developers typically report \n", + "they are able to develop applications in a half\n", + "to a tenth the amount of time it takes them to do\n", + "the same work in such languages as C.\"\"\"\n", + "with open('t.txt', 'w') as f: # f = open('t.txt', 'w')과 동일\n", + " f.write(s) \n", + " # f.close() 작성할 필요 없음. 자동으로 닫힘" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) os.work" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import os\n", + "os.chdir('/Users/yhhan/git/python-e-learning')\n", + "print os.getcwd()\n", + "print\n", + "for path, subdirs, files in os.walk(os.getcwd()):\n", + " print path, \" *** \", subdirs, \" *** \", files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4) 프로그램 예제-1\n", + "#### 임의의 텍스트 파일 내 문자 수를 출력하는 프로그램을 작성하라." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 1" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "70122\n" + ] + } + ], + "source": [ + "f = open('supplement-2016-09.ipynb')\n", + "print len(f.read())\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 2" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "70122" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os\n", + "os.path.getsize('supplement-2016-09.ipynb')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 윈도우즈에서 만든 파일에 위 예제들을 수행하면 os.path.getsize('t.txt')가 라인수만큼 더 큼\n", + " - 이유\n", + " - 리눅스와 Mac에서는 라인 구분 제어 문자로 '\\012' 한 문자를 사용\n", + " - 윈도우즈에서는 라인을 구분하는 제어 문자로 '\\015\\012' 두 개의 문자를 사용함" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\n'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os\n", + "os.linesep" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- ![linesep](images/win_os_linesep.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5) 프로그램 예제-2\n", + "#### 임의의 텍스트 파일 내 단어 수를 출력하는 프로그램을 작성하라. 여기서 단어란, 공백으로 분리된 문자의 모임을 뜻한다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 1" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8130\n" + ] + } + ], + "source": [ + "f = open('supplement-2016-09.ipynb')\n", + "s = f.read()\n", + "n = len(s.split())\n", + "print n\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 2" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8130\n" + ] + } + ], + "source": [ + "n = len(open('supplement-2016-09.ipynb').read().split())\n", + "print n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6) 프로그램 예제-3\n", + "#### 임의의 텍스트 파일 내 라인 수를 출력하는 프로그램을 작성하라." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 1" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2570\n" + ] + } + ], + "source": [ + "f = open('supplement-2016-09.ipynb')\n", + "s = f.read()\n", + "print s.count('\\n')\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 2" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2570\n" + ] + } + ], + "source": [ + "f = open('supplement-2016-09.ipynb')\n", + "print len(f.readlines())\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 3" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2570\n" + ] + } + ], + "source": [ + "print open('supplement-2016-09.ipynb').read().count('\\n')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 4" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2570\n" + ] + } + ], + "source": [ + "print len(open('supplement-2016-09.ipynb').readlines())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 7) 다양한 파일 처리 모드" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- open 내장 함수의 두번째 인자 mode 설명\n", + " - 두번째 인자 mode 생략시에는 읽기 전용(r) 모드로 설정\n", + " \n", + "| Mode | 간단 설명 | 자세한 설명\n", + "|--------|-----------------------------|------------|\n", + "| 'r' | 읽기 전용(기본 모드) | 파일 객체를 읽기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다.|\n", + "| 'w' | 쓰기 전용(기존 파일 내용 삭제) | 파일이 존재하지 않으면 새로운 파일을 쓰기 모드로 생성하고, 해당 파일이 이미 존재하면 내용을 모두 없에면서 쓰기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다. |\n", + "| 'a' | 파일 끝에 추가(쓰기 전용) | 파일이 존재하지 않으면 새롭게 파일을 생성하면서 쓰기 모드로 생성하고, 해당 파일이 이미 존재하면 파일 객체을 쓰기 모드로 생성하면서 파일 포인터를 파일의 마지막 위치에 놓는다 (그래서, 이후 작성되는 내용은 파일의 뒷 부분에 추가).|\n", + "| 'r+' | 읽고 쓰기 | 파일 객체를 읽고 쓸 수 있도록 생성한다. 파일 포인터를 파일 처음 위치에 놓는다. |\n", + "| 'w+' | 읽고 쓰기(기존 파일 내용 삭제) | 파일 객체를 읽고 쓸 수 있도록 생성한다. 파일이 존재하지 않으면 새로운 파일을 생성하고, 해당 파일이 이미 존재하면 내용을 모두 없에면서 생성하고, 파일 포인터를 파일 처음 위치에 놓는다.|\n", + "| 'a+' | 읽고 쓰기(파일 끝에 추가) | 파일 객체를 읽고 쓸 수 있도록 생성한다. 파일이 존재하지 않으면 새롭게 파일을 생성하고, 해당 파일이 이미 존재하면 파일 객체을 생성하면서 파일 포인터를 파일의 마지막 위치에 놓는다 (그래서, 이후 작성되는 내용은 파일의 뒷 부분에 추가). |\n", + "\n", + "\n", + " - 이진 파일로 저장을 위해서는 아래 모드 사용\n", + "\n", + "| Mode | 간단 설명 |\n", + "|--------|-----------------------------|\n", + "| 'rb' | 이진 파일 읽기 전용 |\n", + "| 'wb' | 이진 파일 쓰기 전용(기존 파일 내용 삭제) |\n", + "| 'ab' | 이진 파일 끝에 추가(쓰기 전용) |\n", + "| 'rb+' | 이진 파일 읽고 쓰기 |\n", + "| 'wb+' | 이진 파일 읽고 쓰기(기존 파일 내용 삭제) |\n", + "| 'ab+' | 이진 파일 끝에 추가(읽기도 가능) |\n", + "\n", + "\n" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/t.txt b/t.txt new file mode 100644 index 0000000..de02ddc --- /dev/null +++ b/t.txt @@ -0,0 +1,4 @@ +Its power: Python developers typically report +they are able to develop applications in a half +to a tenth the amount of time it takes them to do +the same work in such languages as C. \ No newline at end of file diff --git a/t1.txt b/t1.txt new file mode 100644 index 0000000..20aeba2 --- /dev/null +++ b/t1.txt @@ -0,0 +1,3 @@ +first line +second line +third line From ee0de74f3dfa7839c20bfef7a4760689b15f63aa Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 9 Nov 2016 21:13:31 +0900 Subject: [PATCH 015/124] =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python16.ipynb | 1420 +++++++++++++++++++------------------- supplement-2016-09.ipynb | 612 ++++++++++++++++ 2 files changed, 1320 insertions(+), 712 deletions(-) diff --git a/python16.ipynb b/python16.ipynb index 8b1f29a..b84b26f 100644 --- a/python16.ipynb +++ b/python16.ipynb @@ -1,736 +1,732 @@ { - "metadata": { - "name": "", - "signature": "sha256:3ae2623370586f3027ff82aa2b97a43e1601bbcbffa2e214ad0fddd7ae733f03" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 16. \ub78c\ub2e4 \ud568\uc218\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "## 1. \ub78c\ub2e4(lambda) \ud568\uc218 \uc815\uc758\n", - "---\n", - "- \ub78c\ub2e4(lambda) \ud568\uc218 (or \ucd95\uc57d \ud568\uc218): https://wikidocs.net/64\n", - " - \uc77c\ubc18\uc801\uc778 \ud568\uc218\ub97c \ud55c \uc904\uc758 \ubb38(Statement)\uc73c\ub85c \uc815\uc758\ud560 \uc218 \uc788\ub294 \uc0c8\ub85c\uc6b4 \ud568\uc218 \uc815\uc758 \ub9ac\ud130\ub7f4\n", - " - \ud568\uc218 \ubab8\uccb4\uc5d0\ub294 \uc2dd(expression)\ub9cc\uc774 \uc62c \uc218 \uc788\ub2e4. \n", - " - \ub300\ubd80\ubd84\uc758 \uacbd\uc6b0 \ud568\uc218 \uc774\ub984\uc744 \uc815\uc758\ud558\uc9c0 \uc54a\uc73c\uba74\uc11c \uc77c\ud68c\uc131\uc73c\ub85c \ud65c\uc6a9\ud560 \ud568\uc218\ub97c \uc815\uc758\ud560 \ub54c \ud65c\uc6a9\n", - " - \uad6c\ubb38(syntax)\n", - " - lambda \ucf64\ub9c8\ub85c \uad6c\ubd84\ub41c \uc778\uc218\ub4e4: \uc2dd(expression)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ub78c\ub2e4 \ud568\uc218 \uc815\uc758 \uc608" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc778\uc218\uac00 \ud55c \uac1c \uc788\ub294 \ub78c\ub2e4 \ud568\uc218" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = lambda x: x + 1\n", - "print f(1)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc778\uc218\uac00 \ub450 \uac1c \uc788\ub294 \ub78c\ub2e4 \ud568\uc218\ub97c \uc9c0\ub2c8\ub294 \ubcc0\uc218 \uc9c0\uc815 \ubc0f \ud568\uc218 \ud638\ucd9c" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "g = lambda x, y: x + y\n", - "print g(1, 2)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uae30\ubcf8 \uc778\uc218\ub97c \uc9c0\ub2c8\ub294 \ub78c\ub2e4 \ud568\uc218 \uc815\uc758" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "incr = lambda x, inc = 1: x + inc\n", - "print incr(10) #inc \uae30\ubcf8 \uc778\uc218 \uac12\uc73c\ub85c 1 \uc0ac\uc6a9\n", - "print incr(10, 5)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "11\n", - "15\n" - ] - } - ], - "prompt_number": 99 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uac00\ubcc0 \uc778\uc218\ub97c \uc9c0\ub2c8\ub294 \ub78c\ub2e4 \ud568\uc218 \uc815\uc758" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "vargs = lambda x, *args: args\n", - "print vargs(1,2,3,4,5)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "(2, 3, 4, 5)\n" - ] - } - ], - "prompt_number": 100 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \ub78c\ub2e4 \ud568\uc218 \uc0ac\uc6a9\ud558\uae30" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f1(x):\n", - " return x*x + 3*x - 10\n", - "\n", - "def f2(x):\n", - " return x*x*x\n", - "\n", - "def g(func):\n", - " return [func(x) for x in range(-10, 10)]\n", - "\n", - "print g(f1)\n", - "print g(f2)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", - "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def g(func):\n", - " return [func(x) for x in range(-10, 10)]\n", - "\n", - "print g(lambda x: x*x + 3*x - 10)\n", - "print g(lambda x: x*x*x)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", - "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub78c\ub2e4 \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc \uc608\uc81c" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# \ub354\ud558\uae30, \ube7c\uae30, \uacf1\ud558\uae30, \ub098\ub204\uae30\uc5d0 \ud574\ub2f9\ud558\ub294 \ub78c\ub2e4 \ud568\uc218 \ub9ac\uc2a4\ud2b8 \uc815\uc758\n", - "func = [lambda x, y: x + y, lambda x, y: x - y, lambda x, y: x * y, lambda x, y: x / y]\n", - "\n", - "def menu():\n", - " print \"0. add\"\n", - " print \"1. sub\"\n", - " print \"2. mul\"\n", - " print \"3. div\"\n", - " print \"4. quit\"\n", - " return input('Select menu:')\n", - "\n", - "while 1:\n", - " sel = menu() \n", - " if sel < 0 or sel > len(func): \n", - " continue\n", - " if sel == len(func): \n", - " break\n", - " x = input('First operand:') \n", - " y = input('Second operand:') \n", - " print 'Result =', func[sel](x,y) " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0. add\n", - "1. sub\n", - "2. mul\n", - "3. div\n", - "4. quit\n" - ] - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 16. 람다 함수\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. 람다(lambda) 함수 정의\n", + "---\n", + "- 람다(lambda) 함수 (or 축약 함수): https://wikidocs.net/64\n", + " - 일반적인 함수를 한 줄의 문(Statement)으로 정의할 수 있는 새로운 함수 정의 리터럴\n", + " - 함수 몸체에는 식(expression)만이 올 수 있다. \n", + " - 대부분의 경우 함수 이름을 정의하지 않으면서 일회성으로 활용할 함수를 정의할 때 활용\n", + " - 구문(syntax)\n", + " - lambda 콤마로 구분된 인수들: 식(expression)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 람다 함수 정의 예" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인수가 한 개 있는 람다 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub78c\ub2e4 \ud568\uc218\uc758 \ud65c\uc6a9\n", - "***\n", - "- map, filter, reduce \ub0b4\uc7a5 \ud568\uc218\n", - " - \uccab\ubc88\uc9f8 \uc778\uc790: function\n", - " - \uccab\ubc88\uc9f8 \uc77c\ubc18\uc801\uc73c\ub85c \ub78c\ub2e4 \ud568\uc218\ub97c \uc778\uc790\ub85c \ubc1b\ub294\ub2e4.\n", - " - \ub450\ubc88\uc9f8 \uc778\uc790: \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615 (\ubb38\uc790\uc5f4, \ub9ac\uc2a4\ud2b8, \ud29c\ud50c)" + } + ], + "source": [ + "f = lambda x: x + 1\n", + "print f(1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인수가 두 개 있는 람다 함수를 지니는 변수 지정 및 함수 호출" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 map \ub0b4\uc7a5 \ud568\uc218\n", - "- map(function, seq)\n", - " - seq \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774 \uc9c0\ub2cc \uac01 \uc6d0\uc18c\uac12\ub4e4\uc5d0 \ub300\ud574 function\uc5d0 \uc801\uc6a9\ud55c \uacb0\uacfc\ub97c \ub3d9\uc77c \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc73c\ub85c \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "g = lambda x, y: x + y\n", + "print g(1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 기본 인수를 지니는 람다 함수 정의" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11\n", + "15\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f(x):\n", - " return x * x\n", - "\n", - "X = [1, 2, 3, 4, 5]\n", - "Y = map(f, X)\n", - "print Y" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 4, 9, 16, 25]\n" - ] - } - ], - "prompt_number": 22 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- map \ub0b4\uc7a5 \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc744 \ub54c \ucf54\ub4dc" + } + ], + "source": [ + "incr = lambda x, inc = 1: x + inc\n", + "print incr(10) #inc 기본 인수 값으로 1 사용\n", + "print incr(10, 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 가변 인수를 지니는 람다 함수 정의" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(2, 3, 4, 5)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f(x):\n", - " return x * x\n", - "\n", - "X = [1, 2, 3, 4, 5]\n", - "Y = []\n", - "for x in X:\n", - " y = f(x)\n", - " Y.append(y)\n", - "print Y" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 4, 9, 16, 25]\n" - ] - } - ], - "prompt_number": 24 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- map\uacfc \ub78c\ub2e4 \ud568\uc218\ub97c \ub3d9\uc2dc\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc (\uac00\uc7a5 \ucd94\ucc9c\ud558\ub294 \ucf54\ub4dc)" + } + ], + "source": [ + "vargs = lambda x, *args: args\n", + "print vargs(1,2,3,4,5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 람다 함수 사용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "X = [1, 2, 3, 4, 5]\n", - "print map(lambda x: x * x, X)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 4, 9, 16, 25]\n" - ] - } - ], - "prompt_number": 25 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- range(10)\uc758 \ubaa8\ub4e0 \uac12 x\uc5d0 \ub300\ud574 f = x \\* x + 4 * x + 5\uc758 \uacc4\uc0b0 \uacb0\uacfc\ub97c \ub9ac\uc2a4\ud2b8\ub85c \uad6c\ud568" + } + ], + "source": [ + "def f1(x):\n", + " return x*x + 3*x - 10\n", + "\n", + "def f2(x):\n", + " return x*x*x\n", + "\n", + "def g(func):\n", + " return [func(x) for x in range(-10, 10)]\n", + "\n", + "print g(f1)\n", + "print g(f2)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "Y = map(lambda x: x * x + 4 * x + 5, range(10))\n", - "print Y" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[5, 10, 17, 26, 37, 50, 65, 82, 101, 122]\n" - ] - } - ], - "prompt_number": 26 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uac01 \ub2e8\uc5b4\ub4e4\uc758 \uae38\uc774 \ub9ac\uc2a4\ud2b8" + } + ], + "source": [ + "def g(func):\n", + " return [func(x) for x in range(-10, 10)]\n", + "\n", + "print g(lambda x: x*x + 3*x - 10)\n", + "print g(lambda x: x*x*x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 람다 함수를 사용하는 코드 예제" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0. add\n", + "1. sub\n", + "2. mul\n", + "3. div\n", + "4. quit\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "y = map(lambda x: len(x), [\"Hello\", \"Python\", \"Programming\"])\n", - "print y" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[5, 6, 11]\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 filter \ub0b4\uc7a5 \ud568\uc218\n", - "- filter(function, seq)\n", - " - seq \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774 \uc9c0\ub2cc \uac01 \uc6d0\uc18c\uac12\ub4e4\uc5d0 \ub300\ud574 function\uc5d0 \uc801\uc6a9\ud55c \uacb0\uacfc\uac00 \ucc38\uc778 \uc6d0\uc18c\uac12\ub4e4\ub9cc\uc744 \ub3d9\uc77c \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc73c\ub85c \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "# 더하기, 빼기, 곱하기, 나누기에 해당하는 람다 함수 리스트 정의\n", + "func = [lambda x, y: x + y, lambda x, y: x - y, lambda x, y: x * y, lambda x, y: x / y]\n", + "\n", + "def menu():\n", + " print \"0. add\"\n", + " print \"1. sub\"\n", + " print \"2. mul\"\n", + " print \"3. div\"\n", + " print \"4. quit\"\n", + " return input('Select menu:')\n", + "\n", + "while 1:\n", + " sel = menu() \n", + " if sel < 0 or sel > len(func): \n", + " continue\n", + " if sel == len(func): \n", + " break\n", + " x = input('First operand:') \n", + " y = input('Second operand:') \n", + " print 'Result =', func[sel](x,y) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 람다 함수의 활용\n", + "***\n", + "- map, filter, reduce 내장 함수\n", + " - 첫번째 인자: function\n", + " - 첫번째 일반적으로 람다 함수를 인자로 받는다.\n", + " - 두번째 인자: 시퀀스 자료형 (문자열, 리스트, 튜플)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 map 내장 함수\n", + "- map(function, seq)\n", + " - seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 결과를 동일 시퀀스 자료형으로 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 4, 9, 16, 25]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print filter(lambda x: x > 2, [1, 2, 3, 34])" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc704 \ucf54\ub4dc\ub294 \uc544\ub798\uc640 \ub3d9\uc77c\ud558\ub2e4." + } + ], + "source": [ + "def f(x):\n", + " return x * x\n", + "\n", + "X = [1, 2, 3, 4, 5]\n", + "Y = map(f, X)\n", + "print Y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- map 내장 함수를 사용하지 않을 때 코드" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 4, 9, 16, 25]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "y = []\n", - "for x in [1, 2, 3, 34]:\n", - " if x > 2:\n", - " y.append(x)\n", - "print y" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[3, 34]\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc8fc\uc5b4\uc9c4 \uc2dc\ud000\uc2a4 \ub0b4\uc5d0 \uc788\ub294 \uc815\uc218\uc911 \ud640\uc218\ub9cc \ud544\ud130\ub9c1" + } + ], + "source": [ + "def f(x):\n", + " return x * x\n", + "\n", + "X = [1, 2, 3, 4, 5]\n", + "Y = []\n", + "for x in X:\n", + " y = f(x)\n", + " Y.append(y)\n", + "print Y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- map과 람다 함수를 동시에 사용하는 코드 (가장 추천하는 코드)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 4, 9, 16, 25]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print filter(lambda x: x % 2, [1, 2, 3, 4, 5, 6])" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc8fc\uc5b4\uc9c4 \uc2dc\ud000\uc2a4 \ub0b4\uc5d0 \uc788\ub294 \uc815\uc218\uc911 \uc9dd\uc218\ub9cc \ud544\ud130\ub9c1" + } + ], + "source": [ + "X = [1, 2, 3, 4, 5]\n", + "print map(lambda x: x * x, X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- range(10)의 모든 값 x에 대해 f = x \\* x + 4 * x + 5의 계산 결과를 리스트로 구함" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 10, 17, 26, 37, 50, 65, 82, 101, 122]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print filter(lambda x: x % 2 - 1, [1, 2, 3, 4, 5, 6])" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud2b9\uc815 \ubc94\uc704\uc5d0 \uc788\ub294 \uc815\uc218\ub9cc \ud544\ud130\ub9c1" + } + ], + "source": [ + "Y = map(lambda x: x * x + 4 * x + 5, range(10))\n", + "print Y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 각 단어들의 길이 리스트" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 6, 11]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def F():\n", - " x = 1\n", - " print filter(lambda a: a > x, range(-5, 5))\n", - " \n", - "F()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[2, 3, 4]\n" - ] - } - ], - "prompt_number": 77 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- filter\uc758 \uacb0\uacfc\ub294 \uc8fc\uc5b4\uc9c4 seq \uc790\ub8cc\ud615\uacfc \ub3d9\uc77c\ud568" + } + ], + "source": [ + "y = map(lambda x: len(x), [\"Hello\", \"Python\", \"Programming\"])\n", + "print y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 filter 내장 함수\n", + "- filter(function, seq)\n", + " - seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 결과가 참인 원소값들만을 동일 시퀀스 자료형으로 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print filter(lambda x: x > 2, [1, 2, 3, 34])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위 코드는 아래와 동일하다." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[3, 34]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print filter(lambda x: x > 2, [1, 2, 3, 34])\n", - "print filter(lambda x: x > 2, (1, 2, 3, 34))\n", - "print filter(lambda x: x < 'a', 'abcABCdefDEF')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[3, 34]\n", - "(3, 34)\n", - "ABCDEF\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-4 reduce \ub0b4\uc7a5 \ud568\uc218\n", - "- reduce (function, seq[, initial])\n", - " - seq \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774 \uc9c0\ub2cc \uc6d0\uc18c\uac12\ub4e4\uc5d0 \ub300\ud574 function \ud568\uc218\ub97c \uc801\uc6a9\ud558\uba74\uc11c \ud558\ub098\uc758 \uac12\uc73c\ub85c \ub9e4\ud551\ud55c\ub2e4.\n", - " - \uccab\ubc88\uc9f8 \uc778\uc790\uc778 function \ud568\uc218\ub294 \ubc18\ub4dc\uc2dc \ub450 \uac1c\uc758 \uc778\uc790 (\uc608\ub97c \ub4e4\uc5b4, x, y)\ub97c \ubc1b\uc544\uc57c \ud55c\ub2e4.\n", - " - seq \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc758 \uac01 \uc6d0\uc18c\uac12\ub4e4\uc740 \uac01 \ub2e8\uacc4\ubcc4\ub85c y\uc5d0 \uc21c\ucc28\uc801\uc73c\ub85c \ub4e4\uc5b4\uac04\ub2e4. \n", - " - \ud568\uc218\uac00 \uc218\ud589\ub41c \uac12\uc740 \uac01 \ub2e8\uacc4\ubcc4\ub85c x\uc5d0 \uc21c\ucc28\uc801\uc73c\ub85c \ub4e4\uc5b4\uac04\ub2e4.\n", - " - \ucd94\uac00\uc801\uc73c\ub85c \uc81c\uacf5\uac00\ub2a5\ud55c \uc138\ubc88\uc9f8 \uc778\uc790\uc778 initial\uc740 \uccab\ubc88\uc9f8 \ub2e8\uacc4\uc5d0 x\uc5d0 \ud560\ub2f9\ud560 \ucd08\uae30\uac12\uc73c\ub85c \uc0ac\uc6a9\ub41c\ub2e4. " + } + ], + "source": [ + "y = []\n", + "for x in [1, 2, 3, 34]:\n", + " if x > 2:\n", + " y.append(x)\n", + "print y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 주어진 시퀀스 내에 있는 정수중 홀수만 필터링" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print filter(lambda x: x % 2, [1, 2, 3, 4, 5, 6])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 주어진 시퀀스 내에 있는 정수중 짝수만 필터링" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print filter(lambda x: x % 2 - 1, [1, 2, 3, 4, 5, 6])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 특정 범위에 있는 정수만 필터링" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 3, 4]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "15\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "| \ub2e8\uacc4 | x | y | reduce |\n", - "|-----|---|---|---------|\n", - "| 1 | 0 | 1 | 1 |\n", - "| 2 | 1 | 2 | 3 |\n", - "| 3 | 3 | 3 | 6 |\n", - "| 4 | 6 | 4 | 10 |\n", - "| 5 | 10| 5 | 15 | " + } + ], + "source": [ + "def F():\n", + " x = 1\n", + " print filter(lambda a: a > x, range(-5, 5))\n", + " \n", + "F()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- filter의 결과는 주어진 seq 자료형과 동일함" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[3, 34]\n", + "(3, 34)\n", + "ABCDEF\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- initial \uac12 \ud560\ub2f9" + } + ], + "source": [ + "print filter(lambda x: x > 2, [1, 2, 3, 34])\n", + "print filter(lambda x: x > 2, (1, 2, 3, 34))\n", + "print filter(lambda x: x < 'a', 'abcABCdefDEF')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 reduce 내장 함수\n", + "- reduce (function, seq[, initial])\n", + " - seq 시퀀스 자료형이 지닌 원소값들에 대해 function 함수를 적용하면서 하나의 값으로 매핑한다.\n", + " - 첫번째 인자인 function 함수는 반드시 두 개의 인자 (예를 들어, x, y)를 받아야 한다.\n", + " - seq 시퀀스 자료형의 각 원소값들은 각 단계별로 y에 순차적으로 들어간다. \n", + " - 함수가 수행된 값은 각 단계별로 x에 순차적으로 들어간다.\n", + " - 추가적으로 제공가능한 세번째 인자인 initial은 첫번째 단계에 x에 할당할 초기값으로 사용된다. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "15\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print reduce(lambda x, y: x + y, [1, 2, 3, 4, 5], 100)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "115\n" - ] - } - ], - "prompt_number": 14 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 1\ubd80\ud130 10\uae4c\uc9c0 \uac01 \uc218\uc5d0 \ub300\ud55c \uc81c\uacf1\uac12\uc744 \ubaa8\ub450 \ub354\ud55c \uacb0\uacfc \uad6c\ud568" + } + ], + "source": [ + "print reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 단계 | x | y | reduce |\n", + "|-----|---|---|---------|\n", + "| 1 | 0 | 1 | 1 |\n", + "| 2 | 1 | 2 | 3 |\n", + "| 3 | 3 | 3 | 6 |\n", + "| 4 | 6 | 4 | 10 |\n", + "| 5 | 10| 5 | 15 | " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- initial 값 할당" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "115\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print reduce(lambda x, y: x + y * y, range(1, 11), 0)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "385\n" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = 0\n", - "for y in range(1, 11):\n", - " x = x + y * y\n", - "print x" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "385\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubb38\uc790\uc5f4 \uc21c\uc11c \ub4a4\uc9d1\uae30" + } + ], + "source": [ + "print reduce(lambda x, y: x + y, [1, 2, 3, 4, 5], 100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 1부터 10까지 각 수에 대한 제곱값을 모두 더한 결과 구함" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "385\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print reduce(lambda x, y: y + x, 'abcde')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "edcba\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "| \ub2e8\uacc4 | x | y | reduce |\n", - "|-----|---|---|---------|\n", - "| 1 | 0 | 'a' | 'a' |\n", - "| 2 | 'a' | 'b' | 'ba' |\n", - "| 3 | 'ba' | 'c' | 'cba' |\n", - "| 4 | 'cba' | 'd' | 'dcba' |\n", - "| 5 | 'dcba' | 'e' | 'edcba' | " + } + ], + "source": [ + "print reduce(lambda x, y: x + y * y, range(1, 11), 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "385\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "x = 0\n", + "for y in range(1, 11):\n", + " x = x + y * y\n", + "print x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열 순서 뒤집기" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "edcba\n" ] } ], - "metadata": {} + "source": [ + "print reduce(lambda x, y: y + x, 'abcde')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 단계 | x | y | reduce |\n", + "|-----|---|---|---------|\n", + "| 1 | '' | 'a' | 'a' |\n", + "| 2 | 'a' | 'b' | 'ba' |\n", + "| 3 | 'ba' | 'c' | 'cba' |\n", + "| 4 | 'cba' | 'd' | 'dcba' |\n", + "| 5 | 'dcba' | 'e' | 'edcba' | " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb index 77c6336..20d70e4 100644 --- a/supplement-2016-09.ipynb +++ b/supplement-2016-09.ipynb @@ -7,6 +7,618 @@ "# 수업 보충 자료" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. E-learning 15, 16 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 함수 정의시에 예상할 수 없는 키워드 인수 처리하기\n", + "- 함수를 정의할 때 예측할 수 없는 인수를 선언하여 사전 타입으로 그러한 인수를 받을 수 있다.\n", + " - 함수 정의시에 **var 형태의 인수 정의" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10 5\n", + "{'depth': 10, 'diamension': 3}\n", + "13\n" + ] + } + ], + "source": [ + "def f(width, height, **kw):\n", + " print width, height\n", + " print kw\n", + " value = 0\n", + " for key in kw:\n", + " value += kw[key]\n", + " return value\n", + "\n", + "print f(width=10, height=5, depth=10, diamension=3)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10 5\n", + "{'depth': 10, 'diamension': 3}\n", + "13\n" + ] + } + ], + "source": [ + "print f(10, 5, depth=10, diamension=3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 첫 두 개의 인수 다음에는 반드시 키워드 인수로만 함수 호출 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "non-keyword arg after keyword arg (, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m print f(width=10, height=5, 10, 3)\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-keyword arg after keyword arg\n" + ] + } + ], + "source": [ + "print f(width=10, height=5, 10, 3)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "f() takes exactly 2 arguments (4 given)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: f() takes exactly 2 arguments (4 given)" + ] + } + ], + "source": [ + "print f(10, 5, 10, 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 선언시에 예상할 수 없는 키워드 인수는 맨 마지막에 선언해야 한다.\n", + " - 함수 선언시 인수 선언 나열 방법\n", + " - 일반 인수 -> 키워드 인수 -> 가변 인수 -> 예상치 못하는 키워드 인수" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2\n", + "(4, 5)\n", + "{'c': 6, 'd': 7}\n" + ] + } + ], + "source": [ + "def g(a, b, k = 1, *args, **kw):\n", + " print a, b\n", + " print args\n", + " print kw\n", + "\n", + "g(1, 2, 3, 4, 5, c=6, d=7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 함수 호출시에 사용 가능한 튜플 인수 및 사전 인수\n", + "- 함수 호출에 사용될 인수값들이 튜플에 있다면 \"*튜플변수\"를 이용하여 함수 호출이 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3\n" + ] + } + ], + "source": [ + "def h(a, b, c):\n", + " print a, b, c\n", + " \n", + "args = (1, 2, 3)\n", + "h(*args)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 호출에 사용될 인수값들이 사전에 있다면 \"**사전변수\"를 이용하여 함수 호출이 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3\n" + ] + } + ], + "source": [ + "dargs = {'a':1, 'b':2, 'c':3}\n", + "h(**dargs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 튜플 인수와 사전 인수를 동시에 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3\n" + ] + } + ], + "source": [ + "args = (1,2)\n", + "dargs = {'c':3}\n", + "h(*args, **dargs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 람다 함수 보충\n", + "- 다음 4가지 프로그램은 동일함" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" + ] + } + ], + "source": [ + "def f1(x):\n", + " return x*x + 3*x - 10\n", + "\n", + "def f2(x):\n", + " return x*x*x\n", + "\n", + "def g(func):\n", + " return [func(x) for x in range(-10, 10)]\n", + "\n", + "print g(f1)\n", + "print g(f2)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" + ] + } + ], + "source": [ + "def g(func):\n", + " return [func(x) for x in range(-10, 10)]\n", + "\n", + "print g(lambda x: x*x + 3*x - 10)\n", + "print g(lambda x: x*x*x)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" + ] + } + ], + "source": [ + "print [(lambda x: x*x + 3*x - 10)(x) for x in range(-10, 10)]\n", + "print [(lambda x: x*x*x)(x) for x in range(-10, 10)]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" + ] + } + ], + "source": [ + "print map(lambda x: x*x + 3*x - 10, range(-10, 10))\n", + "print map(lambda x: x*x*x, range(-10, 10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4) map 및 filter 함수 보충" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- map함수에 시퀀스 자료형을 두 개 이상 할당할 수 있다.\n", + " - 시퀀스 자료형이 n개 이면 function의 인자도 n개 이어야 함" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[7, 9, 11, 13, 15]\n", + "[12, 15, 18]\n" + ] + } + ], + "source": [ + "Y1 = map(lambda x, y: x + y, [1, 2, 3, 4, 5], [6, 7, 8, 9, 10])\n", + "Y2 = map(lambda x, y, z: x + y + z, [1, 2, 3], [4, 5, 6], [7, 8, 9])\n", + "print Y1\n", + "print Y2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 두 개 이상의 시퀀스 자료형들에 대해 map 함수를 사용하여 순서쌍 만들기\n", + " - function 인자를 None으로 할당" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['a', 'b', 'c', 'd']\n" + ] + } + ], + "source": [ + "a = ['a', 'b', 'c', 'd']\n", + "print map(None, a)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('a', 1), ('b', 2), ('c', 3), ('d', 4)]\n" + ] + } + ], + "source": [ + "a = ['a', 'b', 'c', 'd']\n", + "b = [1, 2, 3, 4]\n", + "print map(None, a, b)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('a', 1, 5), ('b', 2, 6), ('c', 3, 7), ('d', 4, 8)]\n" + ] + } + ], + "source": [ + "a = ['a', 'b', 'c', 'd']\n", + "b = [1, 2, 3, 4]\n", + "c = [5, 6, 7, 8]\n", + "print map(None, a, b, c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 두 개의 시퀀스 자료형의 원소의 개수가 다르면 부족한 원소에는 None을 할당" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('a', 1), ('b', 2), (None, 3), (None, 4)]\n" + ] + } + ], + "source": [ + "a = ['a', 'b']\n", + "b = [1, 2, 3, 4]\n", + "print map(None, a, b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 순서쌍을 만드는 전용 내장 함수 zip은 None을 추가하지 않고 짧은 인자를 기준으로 나머지는 버린다." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('a', 1), ('b', 2)]\n" + ] + } + ], + "source": [ + "a = ['a', 'b']\n", + "b = [1, 2, 3, 4]\n", + "print zip(a, b)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(1, 4), (2, 5), (3, 6)]\n" + ] + } + ], + "source": [ + "print zip([1, 2, 3], [4, 5, 6, 7, 8])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- filter의 첫 인자의 함수로서 None을 할당하면 seq 자료형에 있는 각 원소값 자체들을 평가하여 참인 것들만 필터링한다." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['high', 'level', 'built-in', 'function', 10]\n" + ] + } + ], + "source": [ + "L = ['high', False, 'level', '', 'built-in', '', 'function', 0, 10]\n", + "L = filter(None, L)\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6) 함수 객체의 속성\n", + "- 함수도 객체이며 속성을 지닌다.\n", + " - \\_\\_doc\\_\\_, func_doc: 문서 문자열\n", + " - \\_\\_name\\_\\_, func_name: 함수 이름\n", + " - func_defaults: 기본 인수 값들" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def f(a, b, c=1):\n", + " 'func attribute testing'\n", + " localx = 1\n", + " localy = 2\n", + " return 1 " + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "func attribute testing\n", + "func attribute testing\n", + "\n", + "f\n", + "f\n", + "\n", + "(1,)\n" + ] + } + ], + "source": [ + "print f.__doc__ # 문서 문자열\n", + "print f.func_doc\n", + "print\n", + "\n", + "print f.__name__ # 함수의 이름\n", + "print f.func_name\n", + "print\n", + "\n", + "print f.func_defaults # 기본 인수값들" + ] + }, { "cell_type": "markdown", "metadata": {}, From f9ab80c099aaebc205602875451bec6842a808a9 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Thu, 10 Nov 2016 10:18:10 +0900 Subject: [PATCH 016/124] =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-4.ipynb | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/assignment-4.ipynb b/assignment-4.ipynb index 92bbd65..49114e9 100644 --- a/assignment-4.ipynb +++ b/assignment-4.ipynb @@ -6,9 +6,8 @@ "source": [ "# Assignment 4\n", "### [정보]\n", - "#### 1) Due Date: 2015년 11월 18일 (수), 23시 59분\n", - "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github에 올려 해당 URL을 EL 사이트에 제출\n", - "##### - github url을 http://nbviewer.ipython.org 에 넣어서 산출된 URL을 EL사이트에 제출해도 됨\n", + "#### 1) Due Date: 2016년 11월 23일 (수), 23시 59분\n", + "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.ipython.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", "#### 3) 내용: 반드시 python code와 수행 결과를 ipython notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", "#### 5) 문제 (프로젝트 오일러 6문제 포함하여 총 14개)" @@ -209,9 +208,9 @@ "source": [ "##### [14번 문제] \n", "이전 Assignment 3의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3를 확장하여 다음과 같은 조건을 만족하도록 구현하시오.\n", - " - 1) 다음 사이트에서 제시되는 영어 불용어를 참고하여 이전 숙제에서 구성했던 단어 사전에서 영어 불용어들을 모두 제거하는 코드를 추가하시오.\n", - " - http://egloos.zum.com/wyb330/v/3029348\n", - " - 영어 불용어: [ 'a', 'and', 'are', 'as', 'at', 'be', 'but', 'by', 'for', 'if', 'in', 'into', 'is', 'it', 'no', 'not', 'of', 'on', 'or', 's', 'such', 't', 'that', 'the', 'their', 'then', 'there', 'these', 'they', 'this', 'to', 'was', 'will', 'with']\n", + " - 1) 다음 사이트에서 제시되는 영어 불용어 (Stop words)를 참고하여 이전 숙제에서 구성했던 단어 사전에서 영어 불용어들을 모두 제거하는 코드를 추가하시오.\n", + " - http://www.lextek.com/manuals/onix/stopwords1.html\n", + "\n", " - 2) 각 URL로 지정된 웹페이지의 HTML 소스를 파일로 저장하시오. \n", " - URL이 http://URL 이라면 파일명은 URL.html 이다. \n", " - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.html 이다. \n", @@ -219,19 +218,38 @@ " - 파일입출력 (E-learning 13주차) 마지막에 학습한 pickle 모듈을 활용하시오. \n", " - URL이 http://URL 이라면 사전 객체를 담고 있는 파일명은 URL.words.frequency 이다.\n", " - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.words.frequency 이다.\n", - " - 4) 최소 5개 이상의 영어 웹 사이트에 대한 HTML 소스 파일과 단어 출현빈도 파일을 저장하시오. \n", + " - 4) 최소 5개 이상의 영어 웹 사이트 각각에 대한 HTML 소스 파일과 단어 출현빈도 파일을 저장하시오. \n", " - 즉, 총 10개의 파일을 동일한 폴더에 생성하시오.\n", " - [주의] 영어 웹사이트 URL로만 5개 이상\n", - " - 5) 위 문제에서 저장한 모든 words.frequency 파일들을 객체로 다시 로드하여 본인이 저장하여 분석한 사이트들에서 가장 많이 출현한 단어 3개를 뽑아 제시하시오. \n", - " - 반드시 pickle 모듈로 저장한 5개 이상의 words.frequency를 다시 5개 이상의 사전 객체로 로드 하는 코드가 추가되어야 함" + " - 가능하면 주제가 서로 다른 웹 사이트들로 선정\n", + " - 5) 위 문제에서 저장한 모든 words.frequency 파일들을 객체로 다시 로드하여 본인이 저장하여 분석한 사이트들 각각에 대해서 가장 많이 출현한 단어 3개씩를 뽑아 제시하시오. \n", + " - 반드시 pickle 모듈로 저장한 5개 이상의 words.frequency를 다시 5개 이상의 사전 객체로 로드 하는 코드가 추가되어야 함\n", + " - 6) 간단한 검색엔진 코딩 (Like Google!!!)\n", + " - 사용자에게 임의의 단어 1개를 입력받으시오.\n", + " - 입력 받은 단어와 유사도(Similarity)가 높은 웹 사이트 기준으로 위 4)에서 미리 지정해 놓은 5개 이상의 웹 사이트 URL들을 일렬로 나열하여 출력하시오.\n", + " - 단어와 웹 사이트 간의 유사도는 본인이 스스로 정하시오.\n", + " - 유사도를 정하는 최소한의 기준은 단어 출현 빈도를 기반으로 해야 하며, 이외의 본인이 생각하는 방안이 있으면 함께 사용해도 됨.\n", + " - 반드시 코딩 내에 similarity 라는 사전 자료 구조가 있어야 함 (즉, 다음과 유사한 코드가 있어야 함).\n", + " - similarity = {}\n", + " - ...\n", + " - similarity[url1] = x1\n", + " - ...\n", + " - similarity[url2] = x2\n", + " - ...\n", + " \n", + " - 유사도가 높은 웹 사이트가 상위에 출력되어야 함 (즉, 유사도 기준 내림 차순)\n", + " - 유사도가 동일한 웹 사이트들에 대해서는 임의 배치함.\n", + " - 7) [주의] 필수사항\n", + " - 위에서 만든 검색엔진 코딩은 매우 간단한 것이라 부족한 점이 많이 존재한다.\n", + " - 본인이 생각하기에 상업적인 완성도 높은 검색 로봇/엔진이 되려면 어떤 기능들이 추가적으로 구현되어야 할지 최소 3가지 이상 제시하시오. " ] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [Root]", "language": "python", - "name": "python2" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -243,7 +261,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.12" } }, "nbformat": 4, From 20270fc133f8a979fd8995bb7f3816e989d70591 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 16 Nov 2016 22:35:23 +0900 Subject: [PATCH 017/124] sss --- Untitled.ipynb | 329 +++++-------------------------------------------- 1 file changed, 28 insertions(+), 301 deletions(-) diff --git a/Untitled.ipynb b/Untitled.ipynb index 6a71bbb..c645175 100644 --- a/Untitled.ipynb +++ b/Untitled.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -11,56 +11,29 @@ "name": "stdout", "output_type": "stream", "text": [ - "first line\n", - "second line\n", - "third line\n", - "\n" + "y_4:0\n", + "40\n", + "y_4:0\n" ] } ], "source": [ - "lines = ['first line\\n', 'second line\\n', 'third line\\n']\n", - "f = open('t1.txt', 'w')\n", - "f.writelines(lines)\n", - "f.close()\n", + "import tensorflow as tf\n", "\n", - "f = open('t1.txt')\n", - "print f.read()\n", - "f.close()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 타이틀" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import sys\n", - "import StringIO\n", - "\n", - "stdout = sys.stdout # 표준 출력 저장해 두기\n", - "sys.stdout = f = StringIO.StringIO() \n", + "x = tf.constant(35, name='x')\n", + "y = tf.Variable(x + 5, name='y')\n", "\n", - "print type(f)\n", - "print 'Sample output'\n", - "print 'Good'\n", - "print 'Good'\n", + "print y.name\n", + "model = tf.initialize_all_variables()\n", "\n", - "sys.stdout = stdout\n" + "with tf.Session() as session:\n", + " session.run(model)\n", + " print(session.run(y)) " ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 32, "metadata": { "collapsed": false }, @@ -69,271 +42,25 @@ "name": "stdout", "output_type": "stream", "text": [ - "/Users/yhhan/git/python-e-learning\n", - "\n", - "/Users/yhhan/git/python-e-learning *** ['.git', '.ipynb_checkpoints', 'aaa', 'example', 'files', 'images'] *** ['.DS_Store', '.gitignore', 'assignment-1.ipynb', 'assignment-2.ipynb', 'assignment-3.ipynb', 'assignment-4.ipynb', 'assignment-5.ipynb', 'module_test.py', 'music', 'mymath.py', 'mymath.pyc', 'pickle.txt', 'pickle2.txt', 'python01.ipynb', 'python02.ipynb', 'python03.ipynb', 'python04.ipynb', 'python05.ipynb', 'python06.ipynb', 'python07.ipynb', 'python08.ipynb', 'python09.ipynb', 'python10.ipynb', 'python11.ipynb', 'python12.ipynb', 'python13.ipynb', 'python14.ipynb', 'python15.ipynb', 'python16.ipynb', 'python17.ipynb', 'python18.ipynb', 'python19.ipynb', 'python20.ipynb', 'python21.ipynb', 'python22.ipynb', 'python23.ipynb', 'README.md', 'readme.txt', 'removeme.txt', 'sample.txt', 'sample_new.txt', 'supplement-2016-09.ipynb', 'supplement.ipynb', 't.txt', 't1.txt', 't2.txt', 'The Python Challenge.webloc', 'turtle_example.png', 'turtle_method-1.png', 'turtle_method-2.png', 'turtle_method-3.png', 'Untitled.ipynb', 'Untitled1.ipynb', 'Untitled2.ipynb', '\\xe1\\x84\\x87\\xe1\\x85\\xa5\\xe1\\x86\\xb7\\xe1\\x84\\x8b\\xe1\\x85\\xb5\\xe1\\x84\\x8b\\xe1\\x85\\xb4 \\xe1\\x84\\x83\\xe1\\x85\\xa6\\xe1\\x84\\x8b\\xe1\\x85\\xb5\\xe1\\x84\\x90\\xe1\\x85\\xa5 \\xe1\\x84\\x8b\\xe1\\x85\\xa1\\xe1\\x84\\x8f\\xe1\\x85\\xb5\\xe1\\x84\\x90\\xe1\\x85\\xa6\\xe1\\x86\\xa8\\xe1\\x84\\x8e\\xe1\\x85\\xa5 -- [Python] [\\xe1\\x84\\x80\\xe1\\x85\\xa2\\xe1\\x84\\x82\\xe1\\x85\\xa7\\xe1\\x86\\xb7\\xe1\\x84\\x8b\\xe1\\x85\\xb3\\xe1\\x86\\xaf \\xe1\\x84\\x8c\\xe1\\x85\\xa1\\xe1\\x86\\xb8\\xe1\\x84\\x8b\\xe1\\x85\\xa1\\xe1\\x84\\x8c\\xe1\\x85\\xae\\xe1\\x84\\x82\\xe1\\x85\\xb3\\xe1\\x86\\xab \\xe1\\x84\\x91\\xe1\\x85\\xb3\\xe1\\x84\\x85\\xe1\\x85\\xa9\\xe1\\x84\\x80\\xe1\\x85\\xb3\\xe1\\x84\\x85\\xe1\\x85\\xa2\\xe1\\x84\\x86\\xe1\\x85\\xb5\\xe1\\x86\\xbc \\xe1\\x84\\x8c\\xe1\\x85\\xa5\\xe1\\x86\\xbc\\xe1\\x84\\x89\\xe1\\x85\\xa5\\xe1\\x86\\xa8] 4.8 \\xe1\\x84\\x8b\\xe1\\x85\\xa7\\xe1\\x86\\xab\\xe1\\x84\\x89\\xe1\\x85\\xb3\\xe1\\x86\\xb8\\xe1\\x84\\x86\\xe1\\x85\\xae\\xe1\\x86\\xab\\xe1\\x84\\x8c\\xe1\\x85\\xa6.webloc']\n", - "/Users/yhhan/git/python-e-learning/.git *** ['logs', 'objects', 'refs'] *** ['COMMIT_EDITMSG', 'config', 'FETCH_HEAD', 'HEAD', 'index', 'ORIG_HEAD', 'packed-refs', 'sourcetreeconfig']\n", - "/Users/yhhan/git/python-e-learning/.git/logs *** ['refs'] *** ['HEAD']\n", - "/Users/yhhan/git/python-e-learning/.git/logs/refs *** ['heads', 'remotes'] *** []\n", - "/Users/yhhan/git/python-e-learning/.git/logs/refs/heads *** [] *** ['master']\n", - "/Users/yhhan/git/python-e-learning/.git/logs/refs/remotes *** ['origin'] *** []\n", - "/Users/yhhan/git/python-e-learning/.git/logs/refs/remotes/origin *** [] *** ['HEAD', 'master']\n", - "/Users/yhhan/git/python-e-learning/.git/objects *** ['00', '01', '02', '03', '04', '05', '06', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '14', '15', '16', '18', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8b', '8c', '8d', '8e', '8f', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a3', 'a4', 'a6', 'a7', 'a8', 'a9', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b5', 'b6', 'b7', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c6', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'e0', 'e1', 'e2', 'e3', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff', 'info', 'pack'] *** []\n", - "/Users/yhhan/git/python-e-learning/.git/objects/00 *** [] *** ['dc0fb450c30ff4abe40bb368df52f6aa75b14f', 'e291c4ba6cdd8905bb71e103a12403df2b61e6']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/01 *** [] *** ['8ea088a03980389996840bdb39789cdea91078']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/02 *** [] *** ['2ee896022a03777737235ea3d05632de9c350b', 'a42c730cba4ef3f924ecf34a9b626ad2aabdd4']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/03 *** [] *** ['70950d9821a67ebbbff71dd7a86662ec0661e4', 'a3a75820306c968bbfaf47c79fcf81d86e7880', 'b355b06a72adcc747076c87f4a7e9e2acaa0e5']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/04 *** [] *** ['014ebcea161d860a309be206454927ea5f9dcf', '31058c67f9079304a01f436bb976078a79a9ff']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/05 *** [] *** ['33b5b5cdbccb5a39352dfc432d544b8ef7bbab', 'cfe2e3b78a69d1a95bd1acaf79aa8238e5fed2']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/06 *** [] *** ['8c23c6f616f9dd1ac629a4ad964b9334bc46ef']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/08 *** [] *** ['6bb0ee4465e94ef29f1fed3f3a4788619384a6', '9d59902c936d726a2fa825af3025c0c69fca28']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/09 *** [] *** ['7378cae729298b9908879dcef7a56a35015c5c']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/0a *** [] *** ['9b262e639e107323b45730be786609ba7d0070', 'cb1ebade7a7b1d92a4048510e515483cea047f', 'eddf75b65956e280a73f59ff54af4ece407cfc']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/0b *** [] *** ['2954128caae8061907a68f34ff16f5b8db83a4', 'd44b7f27f5012d4f83adbdface554384689e54']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/0c *** [] *** ['2e881a3bc1187680f1f17980c169bc8457b803', '3510bcf370ec7774a8e2eecf4ad9cbe4150028', 'cd1e826dccef3c3c10d6e78084f36c49d98cfe']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/0d *** [] *** ['f309204b9c9518b7743257bcdaeee2f407869b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/0e *** [] *** ['5c89079e832b98627a8b51e5329e0ff46863d8', 'a664ceff2868464b257e563cbfba1e8ccdf0a4', 'cc3038dbdccc752406cbaae0133b4f9863ce2c']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/0f *** [] *** ['10b5de45a81df663a26c9f282ce9e3246a2a2c', '74c78d073883ae0221dd5115ee89f01f982b57', '935e921a8749ec6a4a142fcf0c8fc759c2fa72']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/10 *** [] *** ['3012506f04ca254fd96cd0d95c8f3d9df26b16', 'd3966cbc20d3d4321c55603e6099ef8145daf1']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/11 *** [] *** ['2c131b27cc2155b2d466153aa358674bc09418', 'd56abb81f594062a1698eb17a4953d0a440bdf']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/12 *** [] *** ['8a0178ee5079a04a8ad3561adcb4220cb91f4a', 'a52397148d6471ab33263bfa72a2917714d0ec', 'b8091616916b40b4244391f77ed3d38e538e0c', 'd8e1935744dcb736d5c42fa848c5baa957dd25', 'f5f10848807b338469ed3f16ae64338f9fd8b7']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/14 *** [] *** ['30f9d8a51116b87405377e5edf2bff6f6d6207', '3717079d0c6a85cfabfe27c18e9de41715e11d', '3fdb47817733b3dc761c0ab0888b6714f430b5', '72683c244c8ead51854b89f010d0f787cd438b', 'df3b3de28da50e977e161aa6d7664dc5889a34']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/15 *** [] *** ['d10897b176849d2568bc86e5fe3ee1da8122b1']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/16 *** [] *** ['475d8f8a4f549a6c08a1af237b8d6b1792f76e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/18 *** [] *** ['08037e810600875bf4671a698c3aa48bea516d', '7bdf10fe2ca8caa4bc08fa8b90b458ffb88302']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/1a *** [] *** ['fbf19581aacdd49c996081131799ec946feb39']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/1b *** [] *** ['d777a883e14c8fc9631b8830904aa50b6154f3']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/1c *** [] *** ['bf0ab06828fc2ed4e8c7e1f5b6d9cb398c80e2']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/1d *** [] *** ['1ba2142b09d0b61f7dede3f363f9d07ae96583', 'aa1ce93f1ac9dfd9d7a8774ae8129f282a1479', 'd545a4a96d6f1bd6ac5a148cd4695564a586eb']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/1e *** [] *** ['10fc3c24df25123e049b6986ddf7a879877f00']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/1f *** [] *** ['4fa1e120396bf101c7b9e78bacc8d409d80017', '75e3b2b4482c0fe5509fd30b8985a8c8e7d115', 'b76a52139b243ea3c1567b5b4b01a4dd52ded7']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/20 *** [] *** ['2e4ea6d7e9d2afa5ad3db0e7c3406a1497f66e', 'aeba2bad864cf6904f9caaea55f46f03ce6ac1', 'd4013e966ca738471d4af3cacf20ed9d561dde']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/21 *** [] *** ['677075348491a910d4f29c5eb22fd670cc3a68']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/22 *** [] *** ['22ae1bcb862d387425e3295f4b7cec38cf6f33', '797c26f7df17aae23c71ae39342887d9f3a20c', 'b2d82ab504adeade90b533508d4993a51ac82d', 'c1a7209add2817c8694e85d0826227308ac3fb', 'c465e349128d22ea0e3ebfa9934781a1ece02c', 'cd091b526164f8ee854763390148fa6fc67161']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/23 *** [] *** ['449e590197d29623ba180ccb14729bc932497e', '4d709617672ec10086af7cdc132e8ffd1d125a', '860f9a6d93c0898ba6cf387cf047cc76422410']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/24 *** [] *** ['8c8d57ec3bc7b76aaa665ed9231f16f78fb4df']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/25 *** [] *** ['8699d65bdd64d640a9eaf780ebbfa59dcf4f5f']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/26 *** [] *** ['ce69d4bf834552ae0abb9b7604b3315f1906b4']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/27 *** [] *** ['002d9e0f1859182c469c92a540ab54cfe7a099', '493a5f64c4a53f6534ba12dd4ba775ed0bbb0f', '5a0babbd20c2d1ac9f9adab778f5b51a77d862', '8ad5d52fa819bcf375b8e6886073a4b000e8cb', '8ecaefecbba818f3b5b64f9c71b27770c9aa12', 'f0707ce533adb72597006e1d4d2d07bbc6ee6e', 'f2dcd7555855ee8bc85755a0bad9afca9d8834']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/28 *** [] *** ['c83c93ce00bef3db62c7baf7db9adfda023a62']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/29 *** [] *** ['1e2118c478face7f4f203db1594cdee7dd8b61', '97b58ace0492949543a228e0a1ac18827e01ed']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/2a *** [] *** ['25d79063d8d5c83a549bb1a4f8c0cab0d1af8b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/2b *** [] *** ['38089574b7c7c68120daabc1876021649e3c98', '7d6baad45aa15b714f70665f94cd2000033174', 'bee8941d650e65eed2f3d953618b78d7c5af51', 'f1d8508d800884c38b4f0904d906e4e0b02c39']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/2c *** [] *** ['7f7c41d9977089347554a72395cbd95bdeb600', 'c4516984cde6a905a53cd2b572fb824a59b9a7', 'dda2457043b35d415c985871fc70c8758f27df']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/2d *** [] *** ['41fdcc27b6a964e3a31b6e7623357fa9b3e6d8', 'e35a602dbab4249e9555427c58a3de747d0673', 'e61c953d5f4318cdbfb4bc280a0e3f9ee116d7']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/2f *** [] *** ['85145fc29380524a9eadd52b388147bbf77b75', 'b157bfb6c1cdc2bc33dac08cee4c4369f346b8', 'b35e8ddc751e05f730b7384fb786898c5b2c9b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/30 *** [] *** ['e10c0677ed5275b9b29738a309abde0590ee2e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/31 *** [] *** ['682db5c4a03f96beba3c1a97a92fa65b8570f1']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/32 *** [] *** ['3a9b7f736990ddc76ab34ac0185a3e9b11a9a2', '6c37dc490e99611692991e89a9411eb5c5215a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/33 *** [] *** ['561a12687ba7037cbe41180a7e132d96250c97', 'a6d0c336e72ceb120d674b0ed386b135bb676f', 'b8e396f364b05c0fe09ab58c2a238348c00094', 'e5b3b698ece45390a3188c7dae3bc8b0a212ed']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/34 *** [] *** ['11af090632115806980de3af23932afe0678e9']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/35 *** [] *** ['09401f3dab7f86bdf7df2145e9d9f38f8aa9de', '5b7193e247aa405f253905e5eac51436b1c3f8']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/36 *** [] *** ['071370538d2e3a9759d4c370e00af71cf80d01', 'e877dfeb9e99805e71e93ef31d643b7f522d3a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/37 *** [] *** ['0f177d39604001b5c5f2e3977313885f648c99', 'e7d2d4c212a30e27959c85a1979daa18b4754e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/38 *** [] *** ['56fa4126f53d0d9c26d3e9c0dcd3594662773e', '5c713793eecb2bf6937e2a29b522252084b7b5', '8ec2a9b196f8ff12424c1e8a2d91670f805773']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/39 *** [] *** ['31feac1c630779e92f7faa1ca0831fc0584f41']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/3b *** [] *** ['39d8ee661833f3cf2fe492efcad4a931da4851', 'c1e6957fe70446ec22e98cad0c87b5c6e2baf9']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/3c *** [] *** ['9374fa01b50a022df1bb2e74497b6158d1b00f']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/3d *** [] *** ['45f541c834df6469ff717eb13372fea2b0756d', '5ce6edbbe73596f8053e6fb3c3a099d92e5fb7', 'e570fd4f59b10761fbbc0eec0986aae159d4f1']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/3e *** [] *** ['88e1f24d8b21d2e1fb93dabda2b9826681cc02']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/3f *** [] *** ['11b0836f013af6501afeac263fe09e084d4102', '50c0a945225473767f4d0ae3b85ac581b2e29a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/40 *** [] *** ['4c87be6d27ad1ce23d9c42ab06261db927113c', '7805dc4d22b0820ff9dafcb4e88ed458b25dc3', 'd30b21e7b3b89aeaab97faf10404b99b09bcd1']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/41 *** [] *** ['0e6cb502ce984794c83fe65f73f530ed85ff38', '5fa538df577038ac614057b613769cf0d46bbe', '872427df71c974980bb334a359e3532e4b75e0']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/42 *** [] *** ['ba78fec5058d71d3d2df5e324186b79051b05f']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/43 *** [] *** ['1941e979713fcdbbc93076a580506f8d7dda86', '742bf45a4bdc2f8d4c0b948470a5848c4838e1', 'd1da0f13e8270aa7e9866e74c880ba2225061e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/44 *** [] *** ['95ce53027f4d7223f1c26c389b5f4b43ee90de', 'b5d06a34c313e6729635c7f7932b446d6791f4', 'c619307db8fd874fc916e3d79885e60f167d17']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/45 *** [] *** ['07048eaac616aed43889092054032c3f85b6ab', '497c4fd74cb5406a3befd1a9295b99c26ffd03', '4f6b314bf7424cada3eeabf6b7d8d52850db6a', '87940394951b2086bf151e9a73a8425ad06ae9', '9c3cb4f1e35074e66c35804bd2145d7d82b29a', 'c359199ce588261420c74420492510659d5d22', 'eeb5aad59e8362c862315e2d7846d30ee1caa6']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/46 *** [] *** ['02383aadae4f231e45c51c9eb1cd14e9e048e1', '54aba41a88c480a1413c35bb21561176653db8', '992ce000adb51bac9d89ce4e3fb574e4c771d6', 'c155ac6a63084c3210c28364c05ca910732cee']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/47 *** [] *** ['36066f4c7f2bfc87e67b66d1b962cbc5d7a0ad', 'b0f189cc887631e216bee8d31f53c61b97942f']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/48 *** [] *** ['0954c6ac5e495539fe3909f20558df77c5e5b7', 'c84d8fbd3407c746320917e4f29674717501a9']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/49 *** [] *** ['45f6110aee623fe3f9731ef2798db308e0d564']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/4a *** [] *** ['41b0211f0644f8a837e11f46c523b631e1de8c', '487566b262094be8a504c0d3fd97509bfaab9f', '6cb584042d41189d0e2fbafe0ab74a47eb5b6b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/4b *** [] *** ['0881c66a6eb52f771cecfde83674b422a7d0b9', '3ef622b9306847c3f260361b8d2d6e57e521b7', '4f2576a255179d3e5515e5553000611f03aa00', 'f29c580cdda2b94714823712e3a79a9c4ec3d1']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/4c *** [] *** ['05736ea0a9290fb66cedc588846903b87a0253', 'a3fbadc1725a7d392d2c7a05d19ad5670d6cf2', 'cbc8976df23f9b0bcde414eecb63bb9f98b8be']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/4d *** [] *** ['74d73b9b3d703993547b835ad3ee9096f91458']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/4e *** [] *** ['5a5e2e7d7652003bbbb7969b94c599b7217c0e', 'ac83031c721d645b6457722343415d40251d99']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/4f *** [] *** ['3b49af565c1cf08a0f88289e832df9839505a7']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/51 *** [] *** ['0ad02018ae0e2cf0cb8f77d3722fb20aa73584', '330e1661534f43c1181e8c46393b729aaf4c44', '4ae34cf7ae1534d5a0d13fb079263bb98877ff', '989ea290f00d36c9d59e7fc014822b5d5edd78', 'ed5dd56915c9cd9800ab2e3d2c25489d35fd24']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/52 *** [] *** ['1e760e53ad1a8bcac9d71aebf0c88b40fa4f8b', '524cd78a26ae9e3b9c0d298464d5af631a50ef', 'e545df8a0166b46b34c2c85fcd1f42ce6a406b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/53 *** [] *** ['25dbf05113e22432c1071556d59cdf2e50c1b2', '8979cee39a7283bea7e2e161144ef7eecc7ac3', 'c6412db6d5c9fdf296866c4f0237a481b70469', 'cd407533db65f446555a5237a6e4abce62cacc', 'f37b296d1e9f19ffddf637c59b4f27a8a7b323']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/54 *** [] *** ['3953cbc20a2be4ef4f61ee6c2404c0e83fb1ac', '848ca740f44e12bcaa329b3ce274da51d7ab8a', 'b5413ccc723e74a91371cece0ca439d83174b0']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/55 *** [] *** ['8c0783cb9006cbffd9d50159deeb7f81f8bbe1', '94a5641edc9b030555893d2ee4bcde9e628766']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/56 *** [] *** ['a9a2e1b47e41e73beb48bd4527070213310383', 'ad7f1a465815b9dcdfaec8e23091611b4d2061', 'ecfe7cf3cf6f14b12c5a384ade2a162f1ef96e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/57 *** [] *** ['2ba26b61d6841a3b1e2766ba7ddd82fd743b4d', '97bddbffe8e27a6912e3edb865813c92ea28fd', 'f18db37f2d815f66c3508e507c198bc8de6382', 'fc7e448f123b342fec5540b17c2b75fdd83a7c']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/58 *** [] *** ['09dfad15650fded95412f7e0a0408ffefe031f', '113ea6cfa57f1ebe243a6e203aa63f4544f6cc']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/59 *** [] *** ['2329771881ee98fc62335eb45f3903ca27c955', '69da3f2d4f7eb0714b3a038e016eea6ef771c5', '75dde80c9bc6c4e0a3cf4618dda9fe82908670', 'c058689387bff30675ac89913e224aa9ad8fca']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/5a *** [] *** ['4566ad5d51b35096f9f0b7d52371d67bf4f94e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/5b *** [] *** ['723b0fc2bbc167689e756853e33da061104598', 'fdf352787348ee5b5dee092159f93392bf30a5']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/5c *** [] *** ['2fd007c8907d93ee4ef97c7f29e99008bde520', '3cd545efa6c4d3b0bcd1b07e092bb133cac792', '82f14cebcbea65a0319aa0ac7a96b4f961759d', '9c77f033848c8165939689a09ff0ca79645f45', 'e7baf903851b4753a0e0c2c460c7b7a02a671c', 'f59b123426244127e7fc4b350cb2b756f391d2']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/5d *** [] *** ['7f5b2f6a58ef55c368eff8ce51903f8ac70271', '89e33bf5679736fc159bb11fcf88bd08faaed1', 'ef3210e2a2d5a454276825498dd05b44f6bc58']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/5e *** [] *** ['173336fa2f82d55de2d5bdbc61a9a58785b6dd', '568e1a85b1ade65e044e5f434fafe10b4b6920', '87bd67095fbc306958afdb8e7c0b4c73cc6924']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/5f *** [] *** ['554823945ba397dc1c24be7b52889924220139', '8f0c2deb6df573ff222e002ad462791b0872d9']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/60 *** [] *** ['17e640121d2e60c29199d1ba884f04b983fc2c', '7a78605b7779c023333e02579b1605d591df70', '8e4742853f142d7f4131b96cf33b3d139d6455']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/62 *** [] *** ['370a4082f8d23c53d2b1b2819d3ee35078dbed', '42b1383739cf4f3d6a5a6e9710d942e3e0bd31', '444c4c8f417ba05de1ba9d20bdd26e572735bf', '99ae6e2c1593a0d792fa1ea3a0b6844a752bd3', 'aa85e99781f4192642f5e72b9dc814cd834064', 'bfbff844b1ca51c92442a540140ba55770126a', 'dd31048477c7e558d3a0f19a9b246b07a53841']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/63 *** [] *** ['170470eb1cb040286e3436622643e5a786b452', '918408f9172a97405d56d2c5f8ed23c9a2f101', 'ac5d9dd38a2cc18b4e7dfe762b3e9b43a14c22']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/64 *** [] *** ['0d959d55b9be1e122cb6c4d71d7a84e9900ebe', '2488bac2f6a31bad259e71f94a71b5c07cb83a', 'e7ea356a38a943550dbdaa9321228edb1eb498', 'fad5e89e8b653b34cfadc21c09d292977cc57f']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/65 *** [] *** ['12a7f1e213dcb4fd8861c9beec5bd841caca18', '529d57fe2821271097d8e3df735dc4e36da044', '91ad17340c733d533b5288d3a5eabe098c5d61']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/66 *** [] *** ['f560e09b0ff78b5ab2a723309be16216058354']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/67 *** [] *** ['096333bb15babfbeeb2abe00daf4503c70541b', '12e5be3a6399b9782b1fcbd6300b3947329127', '2e32127d3465ed4ad78bda65170be89c99df15', '9c5975a397bbdff85097f72d4de2ffd186d37f', 'e13a09e292b40f111e00bd6d61629c27f553cf']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/68 *** [] *** ['bc7cabadcd491379249ca8c95aeeaf3ad351fa', 'dc53ece1c32f64bcec2cbe4d77533a6a35b49f', 'e23310d730c60c86c9863fb494ca2dd2adae6f']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/69 *** [] *** ['25ee04f83882ea917d28d88f6b9ede18406422', '29b58d31f16d6262161bcbbd0d313fe404fc0c', '2cc021ae66254ed50a4bcae9f70cc2033184bf', '3a4e7a831a1a5e9cbb4d3dde65f2876e66a4ac', '6a9192658eabe346855f251462f61a95ea2796']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/6a *** [] *** ['bd9cf781bf93d74c32bf77e7317524ded77343', 'f70956db5aab3149e7d0dce4269d9783ab802c', 'fe21ed95e2b0b13b57b58f9b1348910dc9d16d']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/6c *** [] *** ['14cae44ff5dbdbf0e18d3b3b2fc1eec7e5ad82', '40710f5a85817858401a1e33cb3cab7c9eb5b3', '6d216fb58c38fb5f7ac4fc117049d731cb6f1f', '825e861d9d3129e0af4f331b3e192409848d61', 'a71b8206b22d41498681243e96330ac1544fa5', 'd1d09afb11ab8cf58cda9dd3c214b01f47c47a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/6d *** [] *** ['13d1bb361be1038d6711abb9b813f0e39f8c86', '187a094dea87bdc8e431d955e0385311a3be3a', '277ae9afbf705af55352308566f09ca099bb0b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/6e *** [] *** ['15b3fbc8fd94059fdb9d006b19f7fdf98382da', 'f55b9a1e667402fcdea04ac09ee1fe9d326140']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/6f *** [] *** ['59276eda6298e2ab203eba5130eefe875d10fa', 'dec20cfc197eac9001c9c52daca1c36f8aeaa3', 'ff2042cb3850cb4f34079f72e0eafce1dc06dd']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/70 *** [] *** ['6efa796882f4039ea0016846cafab48b3d4f6a', 'a35887f591e58227f9c627ce13dc02b1b6f40a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/71 *** [] *** ['14e52bd7220a6009099ff1ecd6d6fab6fd370f', '171decf92df3e0561038d092843fbee1a7b005', '241f43a21fe129ddc2cc3a35b8c4fda0fa63cc', '41e40ca6b29c0908ba6c62afa7cc57502fde5f', '73e25c1e43440c68e20eaf3b9ad55229006b10', 'f881e350c67873da18f26a1868552e14d07a52']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/72 *** [] *** ['79fb58511b17c4668fb5de7fa1dcbd02b3932a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/73 *** [] *** ['8ca364f23373d02123e028d0bed4bb239eea54']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/74 *** [] *** ['02c71afae0497433806244b96433cb854073c4']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/75 *** [] *** ['3ab3802acc73b6f360ee06e6d3dccaca3e173a', '705eb0784cc2bba52ae6c895077e2b344ce2e5', 'bbb70d421a47dd816790015feb402d6e64119f', 'f41677eaa11a1cfaeed66a755a25db17b6423b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/76 *** [] *** ['19253fe874851e4c2fbac3deb719e07f8e1008', '78dc22f1bc2e8bdce8467edb220f6136ac761e', '7e544e489278c3a99009d98bde268d78f3d206', 'f0c204c4418e19594cf7eca0af2e6caace550a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/77 *** [] *** ['f2d095709bdddaab0e52bfb6a3d7c88c0e8d25']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/78 *** [] *** ['123ba23ec397b2070b8833492233989e734b04', 'd59d409e1f3587fd83a478f45d7abeb11c9b35']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/79 *** [] *** ['e24c10754994afaac8d039ef874c23e4393a18']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/7a *** [] *** ['9a287c28f576f20a4f757a5d952c98d00db1ae', 'f69dc7baec8c0bd5c50a155a8bd942d829410b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/7b *** [] *** ['3812ea0bd943a043bcfeef3994d87963495517', 'ef4b70eb2fb0a01ab2b9781cf45ab3d4518977']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/7c *** [] *** ['347e4f08b4b9cbb6e4faa1614bcae8206a92e7', '56d63dcdc4f4df717e18d87dfdb69e68c06189']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/7d *** [] *** ['0cdf50deefd79339b1e8ca1774cc9854cea2be', '38fb3517738958eff875c52d4ff1cb0b880915', '3a5750a2def5fb2534e1ef6e7c412a6d67a276', '540cb2d39ebaa150aef248e9e717f1fd057ae2']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/7e *** [] *** ['afbb34c45312b9388fa2bcaf30775932b922ad']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/7f *** [] *** ['4df29675aa94a3081d4c99c16c5b492b22327b', 'cd84268120b5723ab927b916b110926315f64c', 'd082a75b551746b629b1b7d6dd1b3071bc3996', 'e46663137e34f17e6373a41e5b7e1d5656089b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/80 *** [] *** ['49a457bbe475adbe9e2c990c1cd34d41ad6027', 'a910f2e3afb8affea6a1224bffb0d4153c0f9d']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/81 *** [] *** ['5857a2c87898558a04888736bbb0d1e0bd81cc']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/82 *** [] *** ['1f500977ba1d133fd76a3d231bfa97991bc224']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/83 *** [] *** ['0fcbb2aa0673e6f5e58359d7f6c22876625b9f', 'b740263e0c6560f9404944469fa067c9f690ff']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/84 *** [] *** ['73fed03666a862f6b4c0e6c9c8a2b7b7506eb2', 'c90103e8a2655519dae0db9e0d047b5b8de15d']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/85 *** [] *** ['7a3be043ad09271465b0b7a4e0b9efdc3bbd01', 'ca06dc7a20cc818580c89cb6d52caa27b2fde8']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/86 *** [] *** ['068d93d28a7dc6819bb7cac07ee2f20d25206d', '37a361d362dd9a57b23d59aafe2fa5f5d33cac', '579302660e99078e0cf3c3756f8526ee4210d9']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/87 *** [] *** ['40af0f002d754897f4f6ba40e29711d556cf34']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/88 *** [] *** ['1380aa3da8e5a4b578d01fd9455c5fb30d0c2a', '512ac1943518429b68422ab2743f3857fd589d', '527d0cb2bf0dbb210c7b3b71628be904fda844', '8e311604bfe19b7a04a008c04b6c6e7ce8f301', 'a265303456ddcd5660caacfde362bafb74785f']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/89 *** [] *** ['5d020f3285d6d38552e644a838305b8f6b7904', '84c6c8b7eb8cb97e520637500305d03febfb6a', 'eb998c603da7ece18c34b300f5d87284440b25']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/8b *** [] *** ['1f29afb068a3fae13f4bcbe4dfa225c7ef1e9a', '5520f47aa8e745cffe9ec8b520b230cd0973ab', 'e160fe01457e1a95aa84e01a4fc5af15619170']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/8c *** [] *** ['360c3bb449d7abba07b380cb8ccf5050cda7ed', '5866b7c0a5e6a43208b79893c356fd288c4075', '65d42b03eb34c67e482c7046bf551e8c90c61e', '9c469e5da4e1a96c1b28d20b6da8037eb8a46b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/8d *** [] *** ['16a36ae2c7407607597bf74457c21b151bb0b2', '935860869c10488ed29dc4dae54051f58b7e7a', '9f22258a45249a10904028fa7e229ed3b5cbd5']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/8e *** [] *** ['57cbc6c3a0d77616b62f5f534cf0543cf9c018', '605c0fc8b4a6183b45a1abb26c89af5a1480b1', 'db37e36dfbc0094246c945074c1f0a41d9047d']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/8f *** [] *** ['b27fde3923adadefc15a17c9f9a3b4f25393e2']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/91 *** [] *** ['36aabd47693ab3f52543d9ab4ba86ada86487d', 'e20f024a4d0cf411ad5a65321eb3532ea0e12f', 'eb40fd587726a56a229d8a1a1bd7194d764a18']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/92 *** [] *** ['1ec97807d3c4a38242c6ee86230ef4ec4e9894', '27fd0846778b16825d880217c4194a65bf5630', 'bbd65603b25da5670386dbf299cd5734095f20']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/93 *** [] *** ['0767251ec378ea6554ab88f1f870408b5a0eab', '79a78f14e3a7fae952f8903d6aa2f91e90f4ac']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/94 *** [] *** ['5e9f339be078d36006cf9a9ce8c9f3890838b3']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/95 *** [] *** ['8b4cb226cff47ac997d83f74f9b9fb990da746', 'a907d0526436b2142d68564fe0084b03fcc659']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/96 *** [] *** ['922d1b3dd832c33a6e4d4b89d4a3f63201e646', '93b226b35b30ae58349a184a50abd99528a3c6', 'bee251dacbbd3edfd77b1b855f71bc0e9316fa', 'c5bd6c7801ce7531b69771958faf7e89a9c9e9', 'f8a195a17d1d2a92f5a513ce2c69205fc068ce']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/97 *** [] *** ['1796e212e6e5240d9808d82d1cad9b98b56d51', '543defd3fdb0fc7f10ed6df9850ca0909578d1', '5e1dc30b3d8d8b0b124b188dbde2cd394695fe', 'df9bb42562da542122f4c0abb42de18a995920']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/98 *** [] *** ['8c55780886d53a5336af1c13053acc54ad1a63', '8c5d6f50287365c8c4eb4e09c5132a17c7ac42']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/99 *** [] *** ['003d36e856cd7e5ab4fe1d5c4acfd3ebc714cb', '38518fe857987442a8db3c564474633cc80850', '7dcb6d8a2680f516655cc253d4020dd85d4d8b', 'ed3600840d86db3e1cd96afed466d75e809234']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/9a *** [] *** ['36ecca6b05fa951f9a0bea8985e07617617f87', '610f944c6ca0fada1c53de569c7b8a2cc45b87', 'cd4ed2cbc3c286a1145874fccafeee0d46e37a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/9b *** [] *** ['b6b3412d9db8eb23450167929d85d2466aba9a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/9c *** [] *** ['553121d960d75d9bd04d2ce59361b1795fa14c', '7564c32d09020d6ce604aa2881b090e6951455', 'a64297398ad74416f56f43ecc29c5a0af2953f']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/9d *** [] *** ['df16f803ddc744b50cd8d93079f2488ae6e35e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/9e *** [] *** ['28dd8457628229fe74e58acb6b75c64bbc7e78', 'b20b218142368534b88aad0397685fabcdeb6f']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/9f *** [] *** ['1588da048998397a49abae1c208448666a351c', '4a920aff42a7f3cdba9c37b72fe44b2bb65843']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/a0 *** [] *** ['27ae2f7a6446d3e6091bfffdaf6c6c3933fa20', '83370b434088b441eb76971e436c61a69eba2f', 'd77b1a3ab741f5724337649030a8dcb5e4342f', 'f81294e271cb903263275a525816ac7c2968bd']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/a1 *** [] *** ['55e5d31e0500f5f0c921e94eb69f16795e2a40', '5cd0837f704a358ba7511323d33f7a6bec4fe7', 'bdf8a7c1bbe921f234023c4b0437b6cb53f858', 'c26a4abdcac745630b22808487e07abc04aeeb']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/a3 *** [] *** ['af1876d15f0cd8637b1d9044125328c016d66f']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/a4 *** [] *** ['0702f9f732c24dca8514dd899d5b9fae096d61', '93587fa0624e5984846258fb2fadcb59cfe4ef']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/a6 *** [] *** ['2792b74441c1693ec7102d6f2b2acc66b988e6']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/a7 *** [] *** ['37238a77f2430e69a9e3ba0a0db081d5832764', '52b6d05ffe64dbd2c5aee88dd9b9ba3d602f64', 'e1e20bb363d5bb5105936d8e0fc4d4fbf3db63']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/a8 *** [] *** ['04f8e7567925c8a6de0c473a0d652b861060a0', '1eb7e086e9f98cac60f5d6c5117b9e77e25fcb']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/a9 *** [] *** ['a2874f7720fd14c506c2dd79661e2c77ab9370']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ab *** [] *** ['00090564b3b0bd1dfba444e59948f6edf03c46', '6e0002907f1b8aaab994f8b55119bb172586be', '73d5217dae311c55a6821924d1c066cdba3e35', 'd194205eb656bfc6e8cbb34e620d12e2421049', 'ff9fcf69c448f031dfff76534acac3b22dd863']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ac *** [] *** ['66eb5f551409dae8186aabcf4015ce0a0f697d', '67e0813e68326e3e8239ee49c40d07c1cf84c5', '75debf22b6acab629456153358e89a28692898', 'f9cd8989d00496b7af125b4b913e46fddd1dd9']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ad *** [] *** ['092aa7afc9248e089d584a9744adb3653b61f6', 'dfa8e6639a4282b86b1e9a29f1dcfb0b6cbe28']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ae *** [] *** ['bc08077b8f8d35f34b414aed15c9bce9a3bbcd']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/af *** [] *** ['15c74e2d5bbba4d25ce9bac37b68aee038b806', '457d2d05fc7386886ed18c995df4fbcfb978f2', '664c6b38ed13e1d481d8b2c6fad56f58332f93', '9e5f0f4dfb3f095f1161daad8bf2f8c2d609e8', 'b02eeffdadfb74ae88ff07f4e340347727c485', 'c66079b62dbd01b236959563201efbe73a33ba', 'de49b21880b8ba4cbdaaa3fb20155ccf808509']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/b0 *** [] *** ['2910db06e40b3c245c88bfea7622853154a332']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/b1 *** [] *** ['33efe17d505720234c0509f898b4b56439f91e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/b2 *** [] *** ['43279e6b38bf93cfb12423f9e03ce8c26e2096']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/b3 *** [] *** ['3c3fe9a8b57dbedcfbc7c1889a01009b29645d', '72796cb7e5fa0bea97a06d83336389093b8b36', 'a514be327d06cf57a8f370d484ec6a5f175f9c', 'd8d12763a7725626e3174a67b59cb55a68dd91']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/b5 *** [] *** ['3ab448938c5a046c6f125c715c69cff47cee9a', '4ae04a3e3ee366a049dd549f03dd26c50cb400', '66754f04e5fe3c9a67edd37732fd4adb450f2d']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/b6 *** [] *** ['b59d7be2b207d42abb3175a559eb2aea2d1bfc']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/b7 *** [] *** ['25c2d6da75d383f33783111531892b874cbeca', '325a7ce662151c140aba466c4dd5f18d7296d1', 'e9d907f9a97d364e5da9fbd933f0bc7eff44c1', 'f0e0b649ef121bd6c2ad6a0a828173a4d297d0']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/b9 *** [] *** ['4552462eff47e9904d072a558e6c302624cd9f', '6a7ec5cfd700e6318de3d21d800b4bd4366f28', '85a1dea56aac47b14c2d3ee51c45e2453168b8', 'c73287a2be13eb086011e6e358cd93d59a30d4']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ba *** [] *** ['aa733ced6144dcb71ce57270d6c557bafe4baa', 'b65b6615906c741888742db6f2a894c0a43146']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/bb *** [] *** ['43bb629cee4365ab131e7e2085f5b179aad4ef', '7e0ee8021ee240a1e7535074dec713652f2556', '86a6c6471d0626d64b30d1daa2f760d5efe3ab', 'ea131a3fb78f0e3cf49103d006e04b4b9a7684']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/bc *** [] *** ['27fbb8d9ab131d9fabcc2f51932c2b675cfba4', '800db573000e74074a36ace8d91035d937a819', 'cf9c0c8d6b694e68b4c9d71cf514f9f21e3409']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/bd *** [] *** ['5fa976d71ef6a6bc25c7a81c0bd2739f5b4f40', '840eb7afe479bea35ec1b24ad3eb4eda4424c9']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/be *** [] *** ['5f699de8f6f8d1a91e11dd6725d55c63643c58', 'b2d8d906fb2f82106751457bb4cbacc681ef36', 'd075fe5f0c6ab0c4a04bdc85051fa0428817e6']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/bf *** [] *** ['68effef1e43fde8cde0475f8d52f5c02014b90', 'a59c91da06d4b9cf87014b676b8bb79a5169f0']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/c0 *** [] *** ['185173317caaea2d4469ec9faf15a44cc7ed56', 'a0c6aa8806287f2d5df083fadb648014e6ddbf']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/c1 *** [] *** ['efdc7c6ed37f3b6377e77ba6aef2d4f55ffb53']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/c2 *** [] *** ['4766741a28b6179ebfd04652a6cc24afc936e9', '86acc2dad4cefdf55603321acb6fbe0c1a721f', '8ea9dee2891623915f602aa7bd9576cc1e8499', 'ea516bf0e7af32ac0027d2e8d9a0bfbd4e3a4b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/c3 *** [] *** ['2a2b1d4df2707b8885a72cf0353bc2ec3d270f', '2c14b83657b9e78817ce53dcbafc7b75bdcf6a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/c4 *** [] *** ['133bd336a4bb6f483ce4bc9683f943809e0e84', '1b2f8d9c6c52458f73305c03e49e47eaca8714', 'eeb6e2832616af56d8f5a04433ea3c35ead464']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/c6 *** [] *** ['0103a3c2d69d498968f17f31ff2da79c35250d', '3ae0cc581c3bc98b6b9d89b01549e2cc93c140', '7a7e9e17bae59040c6c49e2b74e2f64b0e85e3']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/c8 *** [] *** ['d297a1de21691704bb75bccd11022a0ccbb0a3', 'd5fb5f77a4056c3a5374b3c484ea2b04a40e6f', 'e0ba6fe593e3cadf321968e863067e93fcd34d']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/c9 *** [] *** ['1b4288c49496b0a0f97139f2576fd5bd8da46f']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ca *** [] *** ['a5ab547f68b4f22646195ab4406b13acebeb3a', 'b8d02963da13b0bf60b07698574418fc09aa4d']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/cb *** [] *** ['833a6413106dff440be630cfa575d846daed2e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/cc *** [] *** ['07c7f08779852c62c0f05286e277498a840567', 'b6cc88aabeb979f46ac9b36719656fa7bb51af']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/cd *** [] *** ['088d78682977ba63eeb3a762b345e9dd0737fe', '12af73e56129987fcad94edca8533228f5ab06', '63ca647d576fb6958ce54b83ff363290c71dea', 'd4270aca13720856c1be13e7fa245b54f3cf68']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ce *** [] *** ['1fd4596d68dc021de8d7b2513f96210c2b949c', 'd5820b41371010e88dbdcee0fec2b9e59bc27b', 'da9b044072282c24ede695bcda4a579321a1a6']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/cf *** [] *** ['67398aaf32a7a85611c80566e56b9be4d6d1ee', '790f94d2255ce7e5e047ce04ccce1ba228d471', '9325c7fdb5f1b30e08dd74e73fc3df83ad04e3']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/d0 *** [] *** ['7c9eb5a28ba60faa6c7cff4291211a1c370896']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/d2 *** [] *** ['4512ea760db09b5e77a65397a31a3dc06d3134', 'e94611d75b78e964aba3e119a31d963af9967d']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/d3 *** [] *** ['27ff470eb67030f177cfb1573e3190e8d06290', '827e75a5cadb9fe4a27e1cb9b6d192e7323120', '97614ac13bb294220b7e99e64903986248686b', 'c1bfe2f1f9084fe3a7106b90c58025754b6c82']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/d4 *** [] *** ['37c84b2d7b7633d9c225d772a1daae737edecf', '4549e2f37bbfd6cf5e6c0f5fc0aa8c49cb19e9', 'f2392e30b4142386639484002db68f2a5e3fe3']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/d5 *** [] *** ['9af0aa43054ffcc84c6bddbb0a37ddb5aa06dd', 'aa40c4965969293110769e7dd9b61eb432a5b3']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/d6 *** [] *** ['7b5a8f178d23d6f9ffb23a72074c7014ae25ad', 'e562b9e450e250ad034b7b8224b7f08223bac5']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/d7 *** [] *** ['0de4ad7dd7a627e8b835812c9da7a94682c0dd', '531bba26f68167bafa9ab1a51ceafda72b75ad']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/d8 *** [] *** ['53a99c170ccc9d1c79a058ca7d302421317602', 'e4cbae3243dd6208af465b47c4de97a338508e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/d9 *** [] *** ['20e7c4a40aa6eee70ca39cfe6d43c6a10edfd7', '9f55ddeed3866e983d7dd86c0737192e65a7b0']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/da *** [] *** ['348c0f658039564edf34066c74a3f53b3aca52', 'b682beefeac886bff91db5771a7bf2dc27299a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/db *** [] *** ['103a0e5e22ce83ca1a9f5858f0c70db3b12722', '60ddcf687e3ea76ec7fa52e563874c0797e009', 'c336db863f5a185165ceeaf238c3a23ace9c73', 'd9bab3d5e34e825930201025976979661aba92']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/dc *** [] *** ['0d24f1851cdad36079ca3c647b622c956be5f9', 'a93520979ba8c89d4a13ab737efebe542c92f0', 'ec827fabd31aee7ac21bfe55ebcad6128f0792']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/dd *** [] *** ['79046934146fcccf9fc9c329696acce3a4d2cf', 'cb48c467f676992b81db3946cce1eed7cf6978']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/de *** [] *** ['80333d46fc6e1c0aa9a99b6e8dddf34646f7e2']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/e0 *** [] *** ['bfc813fb1d9cc584b3fc53a9981a47f46de58a']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/e1 *** [] *** ['37b1f15e85ee237e173ff78380f723a1c668ab', 'bf96fa317c76a3231420655a32111d1c1da555', 'e99d0be0feb9e6d93efeb90c36c8919f706038']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/e2 *** [] *** ['24506cc6388de47b6c6a0d08f54eabbec16a19', '732827162cdf57f9ce53b8eb3513a95a02417b']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/e3 *** [] *** ['149b9473eb3c169d6e925120ced9f89c76af2c']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/e5 *** [] *** ['d1970d5528a8270fdf284c7495a11467466a4e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/e6 *** [] *** ['0712f7ebf24daaee3021a108de2366038844dd', '9de29bb2d1d6434b8b29ae775ad8c2e48c5391', 'd095b9201ec40c49a5db062b61391db44cf8ac']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/e7 *** [] *** ['32f21aa94585af4282bb587a266634c4c99d8f', '42800bace72166bed3178ffe277f4dd8252c60', '4d7f3ac2c39cd0866d1f60dae55cec59b0710c', '78cf7ef429af3b886573ee859b6cb94a595660', 'd42b6227580375d3ed2c8a1d7d766295fa493e']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/e8 *** [] *** ['884573084ccd674cda1817b66dfe86e69d5ceb']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/e9 *** [] *** ['84a80d267924e1b00d51aa85ab79a485a82ab3', 'fd2645069592448efac4b761335128b658dfec']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ea *** [] *** ['0d6dd7bc55b5036bc75b686b2e85db39c946f6', '2b1668ca46e80511228c58911e1b289d6e7d2b', '563b08363fddaa3494c2bca0b08fb5f62af614']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/eb *** [] *** ['04c627e1fcf84af082c5d8d7eb832291d2080a', '38943c606f4554f5a09ff82dd353ae86a3e507', '48f4c3d45fe72330d8e3ac3ae2929c62cfbd12', 'f2cc464882a695431f353affa8223c20ab10d2']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ed *** [] *** ['1475b6119bbe3366a161b26291c5b43fcd781b', '52d616af517ee2de0590e146dbe04e955e0810', 'ad4fb88415ea29d66233cc2055d6ea10930773', 'b2dffaa904e122649e8b8737fad6af7b7ef0a0', 'b907b8d6678f7d87cd9ec0c0047a9777b39209', 'db3d0d4d3676f63ba03e0bcd187c85fec24976']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ee *** [] *** ['0646ace1c987151d5ef65c5891e1894b2eafec', '10c9042d453594145ab7154b69561b9674ff86']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ef *** [] *** ['1f1c359f79446d8ee9483d21a559d3183f4175', 'b2262152b9e14e1db65f0f3b816d3a8493c856', 'c93a2564bfafe9604a2bd9da9ed999c3db42d5']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/f0 *** [] *** ['84f0ef59bb28bb17d863409c0445a949e48f8c']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/f1 *** [] *** ['222fcdb957ebb8e838a78934dd2cbd764e27da', '6a748911a7e98d3349393b02479d7ad6fea92a', '7b7f589d1f0c9c76c5fd65108ec3e00d62f554', 'e4cfbf0f9e004b5c205caca5f0a761408a9fda']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/f2 *** [] *** ['ce2e3495270e15ceb15c6b04c0489e438854b2']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/f3 *** [] *** ['4b13139c66f15eafdbfd44a01f52861c056ba1', '5445a565979f9bf6c5cb3b49078ebba88cbc3f', 'c1e0bf833f9fc134b3c3b655b1b89af0bfd87f', 'c5e538dec6f536613f099f1c663d4efd291340']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/f4 *** [] *** ['417f1210b5de02707f87a68998587d2845fa42']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/f5 *** [] *** ['1f3fb3d901204ab8ae80bb379e11cead0fe2d3']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/f8 *** [] *** ['0cda1b6057ba30380479c6d2578e3ab834efd4', '0e49d6ea3f0025be69ac7b686fb314f52a413f', 'f471c4e7104574a6bd5f55393cd6b8f059de2d']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/f9 *** [] *** ['1db927d0e1fa90ac5a9f97604ee5cbb3f0697d', '4113935ef38cdc961a42c21864abda1e529f2f', 'c12eb476aff9488a1393d7ce4b781a69fbf61c', 'c788d0a2a87dc9cbe946824ef494230198401b', 'ffbfe5647b2074fef331d7d5dd6782d237a254']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/fa *** [] *** ['1f971a12d044a6efe36fb38bba3345b88ae4dd', '20ffe1a171be3138d8c8b4388da4f753e6d696', '931c6e0c6f994808fb284ea7a0099ba3b7bbcf', 'a4af576019cea17aa732c86377e22403553ee1', 'f27b201190f675a23fdcf8bac46267050b5a80']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/fb *** [] *** ['14b29ef59c3b403cb3d0eb83597adac1df14fe', '1ad6e8ca735e12eb61b24b4136cf99c9e4b99b', '2fbfb6168a70b82fef1f3c59c4a282cd91787c', '5dc712130744c28d1bf44b1eb8fc3b6a59ea72', '6aa651d1abd249c085479f15e4a80a87918415', '7b84f1d3cde6ebc6f03a7e36935be883779c21']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/fc *** [] *** ['f79bd3f5ef211f1e86795424ac263f48bee804']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/fd *** [] *** ['85e782bdd61fb6b0d0d0fdba87ccacd66e3a09']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/fe *** [] *** ['82f2c6b9d01846bef684091290a17d5e8cf509', 'e9b14ffcf558acf4bb142c938ef77ecbb35aa3', 'fa1b46f9a5127be0880e6673cc309e50bdfe20']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/ff *** [] *** ['20f5dd7d01b98aa046f3bab1a7829881daeb43']\n", - "/Users/yhhan/git/python-e-learning/.git/objects/info *** [] *** []\n", - "/Users/yhhan/git/python-e-learning/.git/objects/pack *** [] *** []\n", - "/Users/yhhan/git/python-e-learning/.git/refs *** ['heads', 'remotes', 'tags'] *** []\n", - "/Users/yhhan/git/python-e-learning/.git/refs/heads *** [] *** ['master']\n", - "/Users/yhhan/git/python-e-learning/.git/refs/remotes *** ['origin'] *** []\n", - "/Users/yhhan/git/python-e-learning/.git/refs/remotes/origin *** [] *** ['HEAD', 'master']\n", - "/Users/yhhan/git/python-e-learning/.git/refs/tags *** [] *** []\n", - "/Users/yhhan/git/python-e-learning/.ipynb_checkpoints *** [] *** ['assignment-1-checkpoint.ipynb', 'assignment-2-checkpoint.ipynb', 'assignment-3-checkpoint.ipynb', 'assignment-4-checkpoint.ipynb', 'assignment-5-checkpoint.ipynb', 'python01-checkpoint.ipynb', 'python02-checkpoint.ipynb', 'python03-checkpoint.ipynb', 'python04-checkpoint.ipynb', 'python05-checkpoint.ipynb', 'python06-checkpoint.ipynb', 'python07-checkpoint.ipynb', 'python08-checkpoint.ipynb', 'python09-checkpoint.ipynb', 'python10-checkpoint.ipynb', 'python11-checkpoint.ipynb', 'python12-checkpoint.ipynb', 'python13-checkpoint.ipynb', 'python14-checkpoint.ipynb', 'python15-checkpoint.ipynb', 'python16-checkpoint.ipynb', 'python17-checkpoint.ipynb', 'python18-checkpoint.ipynb', 'python19-checkpoint.ipynb', 'python20-checkpoint.ipynb', 'python21-checkpoint.ipynb', 'supplement-2016-09-checkpoint.ipynb', 'supplement-checkpoint.ipynb', 'Untitled-checkpoint.ipynb']\n", - "/Users/yhhan/git/python-e-learning/aaa *** ['bbb'] *** ['__init__.py', '__init__.pyc']\n", - "/Users/yhhan/git/python-e-learning/aaa/bbb *** [] *** ['__init__.py', '__init__.pyc', 'ccc.py', 'ccc.pyc']\n", - "/Users/yhhan/git/python-e-learning/example *** [] *** ['t1.txt']\n", - "/Users/yhhan/git/python-e-learning/files *** [] *** ['cal.py']\n", - "/Users/yhhan/git/python-e-learning/images *** [] *** ['.DS_Store', '2d_array.graphml', '2d_array.png', '2d_array2.graphml', '2d_array2.png', 'assignment.graphml', 'assignment.png', 'bytecode.graphml', 'bytecode.png', 'changeListElement.graphml', 'changeListElement.png', 'chmod.png', 'compiler_interpreter2.graphml', 'compiler_interpreter2.png', 'cyclic_ref.graphml', 'cyclic_ref.png', 'cyclingref.graphml', 'cyclingref.png', 'function_arg_dict.graphml', 'function_arg_dict.png', 'function_arg_int.graphml', 'function_arg_int.png', 'function_arg_list.graphml', 'function_arg_list.png', 'function_arg_list2.graphml', 'function_arg_list2.png', 'function_arg_str.graphml', 'function_arg_str.png', 'function_arg_tuple.graphml', 'function_arg_tuple.png', 'inheritance.graphml', 'inheritance.png', 'inheritance2.graphml', 'inheritance2.png', 'inheritance3.graphml', 'inheritance3.png', 'instance.graphml', 'instance.png', 'instance2.graphml', 'instance2.png', 'instance3.graphml', 'instance3.png', 'multi_inheritance.graphml', 'multi_inheritance.png', 'multi_inheritance2.graphml', 'multi_inheritance2.png', 'object_copy.graphml', 'object_copy.png', 'object_deep_copy.graphml', 'object_deep_copy.png', 'object_shallow_copy.graphml', 'object_shallow_copy.png', 'objectIdentity.graphml', 'objectIdentity.png', 'package.png', 'package2.png', 'pythonpath_eclipse.png', 'queue.graphml', 'queue.png', 'referenceChangeList.graphml', 'referenceChangeList.png', 'referenceChangeNumerical.graphml', 'referenceChangeNumerical.png', 'referenceCount1.graphml', 'referenceCount1.png', 'referenceCount2.graphml', 'referenceCount2.png', 'referenceCount3.graphml', 'referenceCount3.png', 'scoping_rule.graphml', 'scoping_rule.png', 'shallow_copy.graphml', 'shallow_copy.png', 'stack.graphml', 'stack.png', 'win_os_linesep.png']\n" + "[ 21 440 945 ..., 926 661 62]\n", + "[ 21 440 945 ..., 926 661 62]\n", + "[ 2157 966695 4462305 ..., 4284617 2182637 19049]\n" ] } ], "source": [ - "import os\n", - "os.chdir('/Users/yhhan/git/python-e-learning')\n", - "print os.getcwd()\n", - "print\n", - "for path, subdirs, files in os.walk(os.getcwd()):\n", - " print path, \" *** \", subdirs, \" *** \", files" + "import numpy as np\n", + "data = np.random.randint(1000, size=10000)\n", + "x = tf.constant(data, name= 'x')\n", + "y = tf.Variable(5 * x ** 2 - 3 * x + 15)\n", + "\n", + "model = tf.initialize_all_variables()\n", + "\n", + "with tf.Session() as session:\n", + " session.run(model)\n", + " print x.eval()\n", + " print(session.run(x))\n", + " print(session.run(y))" ] }, { From 08b95944a2d3cc64227ef0e665a1c0f483032497 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 16 Nov 2016 23:25:13 +0900 Subject: [PATCH 018/124] . --- Speech/Recognition/HMM.py | 11 ++ Speech/Recognition/HMM.pyc | Bin 0 -> 534 bytes Speech/Recognition/__init__.py | 0 Speech/Recognition/__init__.pyc | Bin 0 -> 117 bytes Speech/__init__.py | 0 Speech/__init__.pyc | Bin 0 -> 105 bytes mymath.pyc | Bin 380 -> 380 bytes python17.ipynb | 11 +- python18.ipynb | 9 +- supplement-2016-09.ipynb | 182 ++++++++++++++++++++++++++++++++ 10 files changed, 204 insertions(+), 9 deletions(-) create mode 100644 Speech/Recognition/HMM.py create mode 100644 Speech/Recognition/HMM.pyc create mode 100644 Speech/Recognition/__init__.py create mode 100644 Speech/Recognition/__init__.pyc create mode 100644 Speech/__init__.py create mode 100644 Speech/__init__.pyc diff --git a/Speech/Recognition/HMM.py b/Speech/Recognition/HMM.py new file mode 100644 index 0000000..5786f6b --- /dev/null +++ b/Speech/Recognition/HMM.py @@ -0,0 +1,11 @@ +def train(): + print "Train" + pass + +def loadModel(): + print "LoadModel" + pass + +def saveModel(): + print "SaveModel" + pass diff --git a/Speech/Recognition/HMM.pyc b/Speech/Recognition/HMM.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0581a0c0427bcad594654b215231f79e53e191d GIT binary patch literal 534 zcmZSn%*(}+r4y0N00oRd+5w1*<$**B149b~Llls~2xc%cq%eUQObjW^48a;KKs6{j zok2P|K{^>3+&zHWgEg3dJiiiFAQ@7Wn3<;mWH6u+#gag=;DXfDCb`b2YG@F z`-2n9QYo>&7^WZO7`Xj@8q7d$5GYK7z$}pK(0oY1a~wb&Ho5sJr8%i~@UZ1%;bZ{- DI^kC} literal 0 HcmV?d00001 diff --git a/Speech/Recognition/__init__.py b/Speech/Recognition/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Speech/Recognition/__init__.pyc b/Speech/Recognition/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0f6c28bab027231c1acae2dd63e3f64702ccbaf GIT binary patch literal 117 zcmZSn%*(YiQzs&s0SXv_v;zPN@-529mt?!AZ7pnF;Nwq literal 0 HcmV?d00001 diff --git a/Speech/__init__.py b/Speech/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Speech/__init__.pyc b/Speech/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53714fcf7e982ad887975ebf05153b5412e5de09 GIT binary patch literal 105 zcmZSn%*(YTQzs&s0SXv_v;z\n", + "name = upper , type = \n", + "name = _re , type = \n", + "name = letters , type = \n", + "name = atol_error , type = \n", + "name = lstrip , type = \n", + "name = uppercase , type = \n", + "name = ascii_letters , type = \n", + "name = find , type = \n", + "name = atof , type = \n", + "name = replace , type = \n", + "name = capwords , type = \n", + "name = index_error , type = \n", + "name = expandtabs , type = \n", + "name = Template , type = \n", + "name = strip , type = \n", + "name = ascii_uppercase , type = \n", + "name = octdigits , type = \n", + "name = index , type = \n", + "name = ljust , type = \n", + "name = whitespace , type = \n", + "name = _int , type = \n", + "name = rindex , type = \n", + "name = _float , type = \n", + "name = punctuation , type = \n", + "name = __package__ , type = \n", + "name = printable , type = \n", + "name = splitfields , type = \n", + "name = split , type = \n", + "name = rstrip , type = \n", + "name = translate , type = \n", + "name = __doc__ , type = \n", + "name = _multimap , type = \n", + "name = count , type = \n", + "name = joinfields , type = \n", + "name = rjust , type = \n", + "name = __builtins__ , type = \n", + "name = __file__ , type = \n", + "name = lower , type = \n", + "name = swapcase , type = \n", + "name = atof_error , type = \n", + "name = atoi , type = \n", + "name = hexdigits , type = \n", + "name = Formatter , type = \n", + "name = atol , type = \n", + "name = __name__ , type = \n", + "name = rsplit , type = \n", + "name = _idmapL , type = \n", + "name = digits , type = \n", + "name = lowercase , type = \n", + "name = join , type = \n", + "name = center , type = \n", + "name = _long , type = \n", + "name = rfind , type = \n", + "name = atoi_error , type = \n", + "name = maketrans , type = \n", + "name = capitalize , type = \n", + "name = _TemplateMetaclass , type = \n", + "name = zfill , type = \n", + "name = _idmap , type = \n" + ] + } + ], + "source": [ + "for name, val in string.__dict__.items():\n", + " print 'name = %-20s, type = %s' % (name, type(val))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 모듈의 재적재\n", + "- 이미 메모리에 적재되어 있는 모듈은 다시 import 하더라도 기존에 적재되어 있는 모듈이 그대로 다시 이용된다." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "50.24\n", + "6.2\n" + ] + } + ], + "source": [ + "import mymath\n", + "mymath.mypi = 6.2 # 값 수정(원래 모듈 파일에 정의된 값은 3.14)\n", + "\n", + "import mymath # 다시 import\n", + "print mymath.mypi # 3.14가 아니라 6.2 -> 즉 이미 적재되어 있는 모듈 그냥 이용" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- reload(모듈)\n", + " - 메모리에 등록된 것과 관계없이 해당 모듈의 파일에서 새롭게 다시 메모리에 재적재 시키는 내장 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6.2\n", + "50.24\n", + "3.14\n" + ] + } + ], + "source": [ + "print mymath.mypi\n", + "reload(mymath)\n", + "print mymath.mypi" + ] + }, { "cell_type": "markdown", "metadata": {}, From 3a46450f94269a137053a50bdf4a7f6bc2ea1947 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Thu, 24 Nov 2016 00:27:30 +0900 Subject: [PATCH 019/124] aaa --- Untitled.ipynb | 81 ++++++++++++++++++++++++++++++++++++++++ python19.ipynb | 9 +++-- supplement-2016-09.ipynb | 14 +++++++ 3 files changed, 100 insertions(+), 4 deletions(-) diff --git a/Untitled.ipynb b/Untitled.ipynb index c645175..ddec1ba 100644 --- a/Untitled.ipynb +++ b/Untitled.ipynb @@ -63,6 +63,86 @@ " print(session.run(y))" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class S1:\n", + " a = 1" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n" + ] + } + ], + "source": [ + "print S1.a" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "S1.b = 2" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + } + ], + "source": [ + "print S1.b" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['__doc__', '__module__', 'a', 'b']\n" + ] + } + ], + "source": [ + "print dir(S1)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -74,6 +154,7 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [Root]", "language": "python", diff --git a/python19.ipynb b/python19.ipynb index c4133bd..502c000 100644 --- a/python19.ipynb +++ b/python19.ipynb @@ -196,7 +196,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![inheritance](images/instance.png)" + "![inheritance](https://raw.githubusercontent.com/bluebibi/python-e-learning/master/images/instance.png)" ] }, { @@ -814,10 +814,11 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [Root]", "language": "python", - "name": "python2" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -829,7 +830,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.12" } }, "nbformat": 4, diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb index 7a8070b..bbef037 100644 --- a/supplement-2016-09.ipynb +++ b/supplement-2016-09.ipynb @@ -7,6 +7,20 @@ "# 수업 보충 자료" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 10. E-learning 19, 20 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 보충 내용 없음" + ] + }, { "cell_type": "markdown", "metadata": {}, From cc0c62a01a9ffa69718d1a55f76de829bfd68734 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Thu, 24 Nov 2016 01:13:39 +0900 Subject: [PATCH 020/124] aaa --- Untitled.ipynb | 205 +++++++++++++++++++++++++++++++++++++++++++++++++ python20.ipynb | 33 ++++---- 2 files changed, 222 insertions(+), 16 deletions(-) diff --git a/Untitled.ipynb b/Untitled.ipynb index ddec1ba..9de5455 100644 --- a/Untitled.ipynb +++ b/Untitled.ipynb @@ -143,6 +143,211 @@ "print dir(S1)" ] }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class MyClass:\n", + " def set(self, v):\n", + " self.value = v\n", + " def get(self):\n", + " return self.value" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class MyClass2:\n", + " def set(self, v):\n", + " self.value = v\n", + " def get(self):\n", + " return self.value\n", + " @staticmethod\n", + " def spam(x, y): # self가 없다.\n", + " print 'static method', x.value" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "20" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = MyClass()\n", + "b = MyClass2()\n", + "a.set(10)\n", + "a.value = 20\n", + "a.get()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "MyClass.set(a, \"egg\")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "static method egg\n" + ] + } + ], + "source": [ + "MyClass2.spam(a, \"egg2\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__main__.MyClass\n" + ] + } + ], + "source": [ + "print MyClass" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__main__\n" + ] + } + ], + "source": [ + "print __name__" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['In',\n", + " 'MyClass',\n", + " 'MyClass2',\n", + " 'Out',\n", + " 'S1',\n", + " '_',\n", + " '_25',\n", + " '_26',\n", + " '__',\n", + " '___',\n", + " '__builtin__',\n", + " '__builtins__',\n", + " '__doc__',\n", + " '__name__',\n", + " '_dh',\n", + " '_i',\n", + " '_i1',\n", + " '_i10',\n", + " '_i11',\n", + " '_i12',\n", + " '_i13',\n", + " '_i14',\n", + " '_i15',\n", + " '_i16',\n", + " '_i17',\n", + " '_i18',\n", + " '_i19',\n", + " '_i2',\n", + " '_i20',\n", + " '_i21',\n", + " '_i22',\n", + " '_i23',\n", + " '_i24',\n", + " '_i25',\n", + " '_i26',\n", + " '_i27',\n", + " '_i28',\n", + " '_i29',\n", + " '_i3',\n", + " '_i30',\n", + " '_i31',\n", + " '_i4',\n", + " '_i5',\n", + " '_i6',\n", + " '_i7',\n", + " '_i8',\n", + " '_i9',\n", + " '_ih',\n", + " '_ii',\n", + " '_iii',\n", + " '_oh',\n", + " '_sh',\n", + " 'a',\n", + " 'b',\n", + " 'exit',\n", + " 'get_ipython',\n", + " 'quit']" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir()" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/python20.ipynb b/python20.ipynb index 99ed360..f2c7214 100644 --- a/python20.ipynb +++ b/python20.ipynb @@ -298,7 +298,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -374,7 +374,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": { "collapsed": false }, @@ -423,7 +423,7 @@ "metadata": {}, "source": [ "- 클래스를 개발할 때 다음 메소드들을 적절하게 구현하면 자신만의 시퀀스 자료형을 만들 수 있음\n", - "- 변경불가능한 (Immutable) 시퀀스 자료형 및 매핑 자료형을 위해 구현이 필요한 메소드" + "- 시퀀스 자료형 및 매핑 자료형을 위해 구현이 필요한 메소드" ] }, { @@ -453,13 +453,13 @@ "- len(s1) --> s1.\\_\\_len\\_\\_() 메소드 호출\n", "- sl[4] --> s1.\\_\\_getitem\\_\\_(4) 호출\n", "- IndexError\n", - " - 시퀀스 자료형이 범위를 벗어난 인덱스 참조 요구시에 발생됨\n", - " - 리스트, 튜플, 문자열등에서도 동일한 조건에서 발생됨 " + " - 시퀀스 자료형이 범위를 벗어난 인덱스 참조 요구시에 발생시킴\n", + " - 리스트, 튜플, 문자열등에서도 동일한 조건에서 발생됨" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -478,9 +478,10 @@ "evalue": "20", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m#s1.__getitem__(1)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m#s1.__getitem__(1)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mIndexError\u001b[0m: 20" ] } @@ -512,7 +513,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -539,7 +540,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -791,12 +792,12 @@ "source": [ "### 3-2 호출 가능한 클래스 인스턴스 만들기\n", "- 클래스 인스턴스에 \\_\\_call\\_\\_ 메소드가 구현되어 있다면 해당 인스턴스는 함수와 같이 호출될 수 있다.\n", - " - 인슽너스 x에 대해 x(a1, a2, a3)와 같이 호출된다면 x.\\_\\_call\\_\\_(a1, a2, a3)가 호출된다." + " - 인스턴스 x에 대해 x(a1, a2, a3)와 같이 호출된다면 x.\\_\\_call\\_\\_(a1, a2, a3)가 호출된다." ] }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -886,9 +887,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [Root]", "language": "python", - "name": "python2" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -900,7 +901,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.12" } }, "nbformat": 4, From 1027f474f23c5c682e4b30bed413cc6afa0422fd Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 30 Nov 2016 23:54:31 +0900 Subject: [PATCH 021/124] aaa --- Untitled2.ipynb | 806 +-------------------------------------- python20.ipynb | 80 ++-- supplement-2016-09.ipynb | 40 ++ 3 files changed, 101 insertions(+), 825 deletions(-) diff --git a/Untitled2.ipynb b/Untitled2.ipynb index 323a9b7..83520f6 100644 --- a/Untitled2.ipynb +++ b/Untitled2.ipynb @@ -1,804 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Seq:\n", - " def __init__(self, fname):\n", - " self.file = open(fname)\n", - " def __getitem__(self, n):\n", - " if n == 10:\n", - " raise StopIteration\n", - " return n\n", - " def __iter__(self):\n", - " return self\n", - " def next(self):\n", - " line = self.file.readline() # 한 라인을 읽는다.\n", - " if not line: \n", - " raise StopIteration # 읽을 수 없으면 예외 발생\n", - " return line # 읽은 라인을 리턴한다." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 Untitled1.ipynb dblp_doi_extractor.py\r\n", - "10.1007.s11227-011-0646-9.sql Untitled2.ipynb meta_info_extractor.py\r\n", - "10.1007.s11227-011-0646-9.xml dblp-2015-07-01-new.xml \u001b[34mpdfminer-20140328\u001b[m\u001b[m/\r\n", - "1123.xml dblp-2015-07-01.xml simple_dblp.xml\r\n", - "Untitled.ipynb dblp.dtd\r\n" - ] - } - ], - "source": [ - "ls" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "s = Seq('dblp.dtd')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "for line in s:\n", - " print line" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', '\\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', '\\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', ' \\n', '\\n']\n" - ] - } - ], - "source": [ - "print list(Seq('dblp.dtd'))" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "four\n", - "four\n", - "four 4\n", - "three 3\n", - "five 5\n", - "two 2\n", - "one 1\n" - ] - } - ], - "source": [ - "d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}\n", - "print iter(d).next()\n", - "print iter(d).next()\n", - "for key in d:\n", - " print key, d[key]" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "four three five two one\n" - ] - } - ], - "source": [ - "for key in d.iterkeys():\n", - " print key," - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "four three five two one\n" - ] - } - ], - "source": [ - "for key in d.keys():\n", - " print key," - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['__class__',\n", - " '__cmp__',\n", - " '__contains__',\n", - " '__delattr__',\n", - " '__delitem__',\n", - " '__doc__',\n", - " '__eq__',\n", - " '__format__',\n", - " '__ge__',\n", - " '__getattribute__',\n", - " '__getitem__',\n", - " '__gt__',\n", - " '__hash__',\n", - " '__init__',\n", - " '__iter__',\n", - " '__le__',\n", - " '__len__',\n", - " '__lt__',\n", - " '__ne__',\n", - " '__new__',\n", - " '__reduce__',\n", - " '__reduce_ex__',\n", - " '__repr__',\n", - " '__setattr__',\n", - " '__setitem__',\n", - " '__sizeof__',\n", - " '__str__',\n", - " '__subclasshook__',\n", - " 'clear',\n", - " 'copy',\n", - " 'fromkeys',\n", - " 'get',\n", - " 'has_key',\n", - " 'items',\n", - " 'iteritems',\n", - " 'iterkeys',\n", - " 'itervalues',\n", - " 'keys',\n", - " 'pop',\n", - " 'popitem',\n", - " 'setdefault',\n", - " 'update',\n", - " 'values',\n", - " 'viewitems',\n", - " 'viewkeys',\n", - " 'viewvalues']" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dir(d)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.0\n", - "TypeError or IOError !!! [Errno 2] No such file or directory: 'aaa.txt'\n", - "Exit !!!\n" - ] - } - ], - "source": [ - "b = 1.0\n", - "name = 'aaa.txt'\n", - "try:\n", - " print 1.0 / b\n", - " #spam()\n", - " f = open(name, 'r')\n", - " '2' + 2\n", - "except NameError:\n", - " print 'NameError !!!'\n", - "except ZeroDivisionError:\n", - " print 'ZeroDivisionError !!!'\n", - "except (TypeError, IOError) as msg:\n", - " print 'TypeError or IOError !!!', msg\n", - "else:\n", - " print 'No Exception !!!'\n", - "finally:\n", - " print 'Exit !!!'" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 4 16\n", - "0 1 4 9 16 25 36 49 64 81\n" - ] - } - ], - "source": [ - "class SquareSeq:\n", - " def __init__(self, n):\n", - " self.n = n\n", - " def __getitem__(self, k):\n", - " if k >= self.n or k < 0 :\n", - " raise IndexError # 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\n", - " return k * k\n", - " def __len__(self):\n", - " return self.n\n", - " \n", - "s = SquareSeq(10)\n", - "print s[2], s[4]\n", - "for x in s: # IndexError가 발생하는 시점까지 반복한다\n", - " print x,\n", - "print s[20] # 첨자 범위가 넘었다" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Exception occurs!\n", - "Exception occurs!\n" - ] - } - ], - "source": [ - "class Big(Exception):\n", - " pass\n", - "\n", - "class Small(Big):\n", - " pass\n", - "\n", - "def dosomething1():\n", - " x = Big()\n", - " raise x\n", - " \n", - "def dosomething2():\n", - " raise Small()\n", - " \n", - "for f in (dosomething1, dosomething2):\n", - " try:\n", - " f()\n", - " except Big:\n", - " print \"Exception occurs!\"" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "message!!!\n" - ] - } - ], - "source": [ - "def f():\n", - " raise Exception('message!!!')\n", - " \n", - "try:\n", - " f()\n", - "except Exception as a:\n", - " print a" - ] - }, { "cell_type": "code", "execution_count": null, @@ -810,10 +11,11 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [Root]", "language": "python", - "name": "python2" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -825,7 +27,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.12" } }, "nbformat": 4, diff --git a/python20.ipynb b/python20.ipynb index f2c7214..bbe35a3 100644 --- a/python20.ipynb +++ b/python20.ipynb @@ -112,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 1, "metadata": { "collapsed": false }, @@ -154,7 +154,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -195,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 3, "metadata": { "collapsed": false }, @@ -230,7 +230,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 4, "metadata": { "collapsed": false }, @@ -298,7 +298,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": { "collapsed": false }, @@ -336,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 6, "metadata": { "collapsed": false }, @@ -374,7 +374,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -459,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -480,8 +480,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m#s1.__getitem__(1)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m#s1.__getitem__(1)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mIndexError\u001b[0m: 20" ] } @@ -513,7 +513,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 9, "metadata": { "collapsed": false }, @@ -540,7 +540,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 10, "metadata": { "collapsed": false }, @@ -576,7 +576,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -585,7 +585,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "<__main__.MyDict instance at 0x10bb37638>\n", + "<__main__.MyDict instance at 0x103cc7ab8>\n", "light\n", "darkness\n", "2\n" @@ -615,7 +615,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -679,7 +679,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -719,7 +719,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -758,7 +758,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -768,9 +768,9 @@ "output_type": "stream", "text": [ "str called\n", - "<__main__.StringRepr instance at 0x101d3f908>\n", + "<__main__.StringRepr instance at 0x103cc7f80>\n", "str called\n", - "<__main__.StringRepr instance at 0x101d3f908>\n" + "<__main__.StringRepr instance at 0x103cc7f80>\n" ] } ], @@ -828,6 +828,39 @@ "print acc.sum" ] }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "15\n", + "6\n", + "24\n", + "24\n" + ] + } + ], + "source": [ + "class Accumulator:\n", + " def __init__(self):\n", + " self.sum = 0\n", + " def __call__(self, *args):\n", + " self.sum = reduce(lambda x, y: x + y, args)\n", + " return self.sum\n", + " \n", + "acc = Accumulator()\n", + "print acc(1,2,3,4,5)\n", + "print acc(6)\n", + "print acc(7,8,9)\n", + "print acc.sum" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -837,7 +870,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -855,8 +888,8 @@ } ], "source": [ - "def check(func):\n", - " if callable(func):\n", + "def check(obj):\n", + " if callable(obj):\n", " print 'callable'\n", " else:\n", " print 'not callable'\n", @@ -864,6 +897,7 @@ "class B:\n", " def func(self, v):\n", " return v\n", + " \n", "class A:\n", " def __call__(self, v):\n", " return v\n", diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb index bbef037..a2fcf20 100644 --- a/supplement-2016-09.ipynb +++ b/supplement-2016-09.ipynb @@ -6,6 +6,46 @@ "source": [ "# 수업 보충 자료" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 12. E-learning 22, 23 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 보충 내용 없음" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 11. E-learning 21 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1) Python 에서 Java에서 문법적으로 제공되는 것과 비슷하게 abstract class를 생성할 수 있나?\n", + "- Python 문법 자체적으로 abstract class 지원하지 않음\n", + "- abc 모듈을 활용하여 abstract class 생성할 수 있음 (참고적으로만 알아둘 것)\n", + " - http://zaiste.net/2013/01/abstract_classes_in_python/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2) Python 에서 Java에서 문법적으로 제공되는 것과 비슷하게 interface를 생성할 수 있나?\n", + "- Python 문법 자체적으로 interface 지원하지 않음\n", + "- interface를 지원하는 모듈도 존재하지 않음" + ] }, { "cell_type": "markdown", From bc51b9d452c2d92128584c6c1a56e79d83f129f7 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Thu, 1 Dec 2016 11:13:15 +0900 Subject: [PATCH 022/124] 111 --- assignment-5.ipynb | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/assignment-5.ipynb b/assignment-5.ipynb index 1d1ba21..0c39254 100644 --- a/assignment-5.ipynb +++ b/assignment-5.ipynb @@ -6,10 +6,8 @@ "source": [ "# Assignment 5\n", "### [정보]\n", - "#### 1) Due Date: 2014년 12월 9일 (수요일), 23시 59분\n", - "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github에 올려 해당 URL을 EL 사이트에 제출\n", - "##### - github url을 http://nbviewer.ipython.org 에 넣어서 산출된 URL을 EL사이트에 제출해도 됨\n", - "\n", + "#### 1) Due Date: 2016년 12월 12일 (월요일), 23시 59분\n", + "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.ipython.org에 넣어서 산출된 URL을 EL사이트에 제출\n", "#### 3) 내용: 반드시 python code와 수행 결과를 ipython notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 모든 문제의 답을 적은 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", "#### 5) 문제 (총 9개)" @@ -208,24 +206,20 @@ "프로젝트 오일러 문제 19\n", "\n", "##### [11번 문제]\n", - "프로젝트 오일러 문제 20\n", - "\n", - "##### [12번 문제]\n", - "프로젝트 오일러 문제 21" + "프로젝트 오일러 문제 20" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "##### [13번 문제] \n", + "##### [12번 문제] \n", "\n", "이전 Assignment 3 (Assignment 4가 아님)의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3을 다시 확장/변형하여 다음과 같은 조건을 만족하도록 구현하시오.\n", " - 1) 새로운 클래스 WebWordsFrequency를 정의하시오.\n", " - 이전 Assignment 4에서 고려했던 pickle 모듈등은 전혀 고려하지 마시오.\n", - " - 즉, 하드시스크에 저장하고 다시 로드하는 기능은 본 숙제에는 배제하시오.\n", + " - 즉, 하드디스크에 저장하고 다시 로드하는 기능은 본 숙제에는 배제하시오.\n", " - Assignment 4에서 고려했던 영어 불용어 처리는 적용하시오.\n", - " - 영어 불용어: [ 'a', 'and', 'are', 'as', 'at', 'be', 'but', 'by', 'for', 'if', 'in', 'into', 'is', 'it', 'no', 'not', 'of', 'on', 'or', 's', 'such', 't', 'that', 'the', 'their', 'then', 'there', 'these', 'they', 'this', 'to', 'was', 'will', 'with']\n", " - Assignment 4에서 처럼 국문 사이트가 아닌 영어 사이트만을 고려하여 아래 사항을 코딩하시오.\n", " - 2) 생성자에 URL을 0개에서 임의의 개수를 넣을 수 있도록 생성자 인수를 가변인수로 정의하여 각각의 URL을 리스트 자료형에 유지하시오.\n", " > \\>\\>\\> w1 = WebWordsFrequency('http://www.cnn.com', 'http://www.times.com', 'https://www.amazon.com')
\n", @@ -263,6 +257,11 @@ " > science\n", " \n", " - 만약 등록된 URL이 없다면 None을 반환\n", + " - 8) 임의의 단어 1개를 파라미터로 받는 searchUrlByWord() 메소드를 구현하여 유사도가 높은 웹 사이트를 출력하시오.\n", + " > \\>\\>\\> w1.searchUrlByWord(\"news\")
\n", + " > http://www.cnn.com
\n", + " \n", + " - 파라미터로 받은 단어와 유사도가 동일한 URL이 여러 개이면 해당 URL을 모두 출력하시오. \n", " " ] }, @@ -270,9 +269,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "##### [14번 문제] \n", + "##### [13번 문제] \n", "\n", - "13번 문제에서 정의한 WebWordsFrequency 클래스를 상속하여 OrderedWebWordsFrequency 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 오버라이드 하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.\n", + "12번 문제에서 정의한 WebWordsFrequency 클래스를 상속하여 OrderedWebWordsFrequency 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 오버라이드 하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.\n", " - 리스트 내의 각 원소는 단어와 빈도를 쌍으로 지니는 튜플이다.\n", " - getWordFrequence() 메소드에 reverse 라는 인자를 만들고 true 또는 false를 인자로 받을 수 있도록 한다.\n", " - reverse 인자의 디폴트 값은 false 이며, 기본적으로 내림차순으로 정렬한다.\n", @@ -291,7 +290,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "##### [15번 문제]\n", + "##### [14번 문제]\n", "\n", "다음과 같은 코딩이 가능하도록 OrderedWebWordsFrequency 안에 반복자와 관련된 메소드를 추가하시오.\n", "\n", @@ -308,9 +307,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [Root]", "language": "python", - "name": "python2" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -322,7 +321,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.12" } }, "nbformat": 4, From 74755b087d6fabe5f6360bdd06d1df3172431e65 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Fri, 9 Dec 2016 17:12:26 +0900 Subject: [PATCH 023/124] =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-5.ipynb | 37 +- python23.ipynb | 1844 ++++++++++++++++++++++---------------------- 2 files changed, 934 insertions(+), 947 deletions(-) diff --git a/assignment-5.ipynb b/assignment-5.ipynb index 0c39254..4e0d834 100644 --- a/assignment-5.ipynb +++ b/assignment-5.ipynb @@ -10,7 +10,7 @@ "#### 2) 제출방법: ipython notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.ipython.org에 넣어서 산출된 URL을 EL사이트에 제출\n", "#### 3) 내용: 반드시 python code와 수행 결과를 ipython notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 모든 문제의 답을 적은 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", - "#### 5) 문제 (총 9개)" + "#### 5) 문제 (총 12개)" ] }, { @@ -169,7 +169,7 @@ " > \\>\\>\\> t = MySet([3, 4, 5])
\n", " > \\>\\>\\> u = s - t
\n", " > \\>\\>\\> print u
\n", - " > MySet: {1}
" + " > MySet: {1, 2}
" ] }, { @@ -179,14 +179,14 @@ "##### [6번 문제] \n", "\n", "5번 문제에서 정의한 MySet 클래스에 대해 다음 예제를 수행하면 오류없이 올바르게 동작하는 것을 확인할 수 있다. 다음 예제 내에 있는 len(), bool() 내장함수와 in 키워드 사용 예제가 별다른 메소드 정의를 하지 않았는 데도 올바르게 수행되는 이유를 설명하시오.\n", - "\n", - " > \\>\\>\\> s = MySet([1, 2, 3, 4, 5, 6])
\n", - " > \\>\\>\\> print len(s)
\n", - " > 6
\n", - " > \\>\\>\\> print bool(s)
\n", - " > True
\n", - " > \\>\\>\\> print 2 in s
\n", - " > True
\n" + " \n", + " >>> s = MySet([1, 2, 3, 4, 5, 6])\n", + " >>> print len(s)\n", + " > 6\n", + " >>> print bool(s)\n", + " > True\n", + " >>> print 2 in s\n", + " > True\n" ] }, { @@ -200,20 +200,14 @@ "프로젝트 오일러 문제 17\n", "\n", "##### [9번 문제]\n", - "프로젝트 오일러 문제 18\n", - "\n", - "##### [10번 문제]\n", - "프로젝트 오일러 문제 19\n", - "\n", - "##### [11번 문제]\n", - "프로젝트 오일러 문제 20" + "프로젝트 오일러 문제 18" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "##### [12번 문제] \n", + "##### [10번 문제] \n", "\n", "이전 Assignment 3 (Assignment 4가 아님)의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3을 다시 확장/변형하여 다음과 같은 조건을 만족하도록 구현하시오.\n", " - 1) 새로운 클래스 WebWordsFrequency를 정의하시오.\n", @@ -269,9 +263,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "##### [13번 문제] \n", + "##### [11번 문제] \n", "\n", - "12번 문제에서 정의한 WebWordsFrequency 클래스를 상속하여 OrderedWebWordsFrequency 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 오버라이드 하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.\n", + "위 10번 문제에서 정의한 WebWordsFrequency 클래스를 상속하여 OrderedWebWordsFrequency 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 오버라이드 하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.\n", " - 리스트 내의 각 원소는 단어와 빈도를 쌍으로 지니는 튜플이다.\n", " - getWordFrequence() 메소드에 reverse 라는 인자를 만들고 true 또는 false를 인자로 받을 수 있도록 한다.\n", " - reverse 인자의 디폴트 값은 false 이며, 기본적으로 내림차순으로 정렬한다.\n", @@ -290,7 +284,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "##### [14번 문제]\n", + "##### [12번 문제]\n", "\n", "다음과 같은 코딩이 가능하도록 OrderedWebWordsFrequency 안에 반복자와 관련된 메소드를 추가하시오.\n", "\n", @@ -306,6 +300,7 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [Root]", "language": "python", diff --git a/python23.ipynb b/python23.ipynb index 6d13d1b..e2c9ec7 100644 --- a/python23.ipynb +++ b/python23.ipynb @@ -1,957 +1,949 @@ { - "metadata": { - "name": "", - "signature": "sha256:1129ada8bea533775e5222c2157b572fbfef33239fe0b2b06d5d1b1085944d84" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 23. \uc608\uc678\ucc98\ub9ac\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud30c\uc774\uc36c \uc608\uc678\uc758 \uc885\ub958\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uad6c\ubb38 \uc5d0\ub7ec (Syntax Error)\n", - " - \ubb38\ubc95\uc801 \uc5d0\ub7ec\n", - " - \uc774\ud074\ub9bd\uc2a4 \ub4f1\uc758 \ud1b5\ud569\uac1c\ubc1c\ud658\uacbd \ub3c4\uad6c\uc5d0\uc11c\ub294 \uc790\ub3d9\uc73c\ub85c \uc2e4\ud589 \uc804\uc5d0 \uad6c\ubb38 \uc5d0\ub7ec\ub97c \uccb4\ud06c \ud574 \uc90c\n", - " - \ud30c\uc774\uc36c\uc740 \uc0c1\ub300\uc801\uc73c\ub85c \uc5b8\uc5b4\uc801 \ubb38\ubc95\uc774 \uac04\ub2e8\ud558\uae30 \ub54c\ubb38\uc5d0 \uad6c\ubb38 \uc790\uccb4\uc758 \uc5d0\ub7ec \ubc1c\uc0dd \ube44\uc728\uc774 \ub0ae\uac70\ub098 \ub2e4\ub978 \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc644\ubcbd\ud558\uac8c \uc81c\uac70\ud560 \uc218 \uc788\uc74c\n", - "\n", - "- \uc608\uc678 (Exception)\n", - " - \uad6c\ubb38 \uc5d0\ub7ec\ub294 \uc5c6\uc73c\ub098 \ud504\ub85c\uadf8\ub7a8 \uc2e4\ud589 \uc911 \ub354 \uc774\uc0c1 \uc9c4\ud589 \ud560 \uc218 \uc5c6\ub294 \uc0c1\ud669" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c \ubcf4\uae30\n", - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 1: \uc815\uc758\ub418\uc9c0 \uc54a\uc740 \ubcc0\uc218 \uc0ac\uc6a9\ud558\uae30\n", - " - NameError" + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 23. 예외처리\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 파이썬 예외의 종류\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 구문 에러 (Syntax Error)\n", + " - 문법적 에러\n", + " - 이클립스 등의 통합개발환경 도구에서는 자동으로 실행 전에 구문 에러를 체크 해 줌\n", + " - 파이썬은 상대적으로 언어적 문법이 간단하기 때문에 구문 자체의 에러 발생 비율이 낮거나 다른 도구를 사용하여 완벽하게 제거할 수 있음\n", + "\n", + "- 예외 (Exception)\n", + " - 구문 에러는 없으나 프로그램 실행 중 더 이상 진행 할 수 없는 상황" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 예외 발생 예제 보기\n", + "- 예외 발생 예제 1: 정의되지 않은 변수 사용하기\n", + " - NameError" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'spam' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m4\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mspam\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'spam' is not defined" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "4 + spam*3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'spam' is not defined", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m4\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mspam\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'spam' is not defined" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 2: 0\uc73c\ub85c \uc22b\uc790 \ub098\ub204\uae30\n", - " - ZeroDivisionError" + } + ], + "source": [ + "4 + spam*3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 발생 예제 2: 0으로 숫자 나누기\n", + " - ZeroDivisionError" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "integer division or modulo by zero", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m: integer division or modulo by zero" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10\n", - "b = 0 \n", - "c = a / b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "ZeroDivisionError", - "evalue": "integer division or modulo by zero", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mZeroDivisionError\u001b[0m: integer division or modulo by zero" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [note] \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uba74 \ud504\ub85c\uadf8\ub7a8\uc740 \ubc14\ub85c \uc885\ub8cc\ub41c\ub2e4." + } + ], + "source": [ + "a = 10\n", + "b = 0 \n", + "c = a / b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [note] 예외가 발생하면 프로그램은 바로 종료된다." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "float division by zero", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mdivision\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def division():\n", - " for n in range(0, 5):\n", - " print 10.0 / n\n", - "\n", - "division() " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "ZeroDivisionError", - "evalue": "float division by zero", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mdivision\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" - ] - } - ], - "prompt_number": 48 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 3: \ubb38\uc790\uc5f4\uacfc \uc22b\uc790 \ub354\ud558\uae30\n", - " - TypeError" + } + ], + "source": [ + "def division():\n", + " for n in range(0, 5):\n", + " print 10.0 / n\n", + "\n", + "division() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 발생 예제 3: 문자열과 숫자 더하기\n", + " - TypeError" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "cannot concatenate 'str' and 'int' objects", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m'2'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: cannot concatenate 'str' and 'int' objects" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "'2' + 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "cannot concatenate 'str' and 'int' objects", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m'2'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: cannot concatenate 'str' and 'int' objects" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 4: \ucc38\uc870 \ubc94\uc704\ub97c \ub118\uc5b4\uc11c \uc778\ub371\uc2a4 \uc0ac\uc6a9\n", - " - IndexError" + } + ], + "source": [ + "'2' + 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 발생 예제 4: 참조 범위를 넘어서 인덱스 사용\n", + " - IndexError" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "IndexError", + "evalue": "list index out of range", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l = [1, 2]\n", - "print l[2]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "IndexError", - "evalue": "list index out of range", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mIndexError\u001b[0m: list index out of range" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 5: \ub4f1\ub85d\ub418\uc9c0 \uc54a\uc740 \ud0a4\ub85c \uc0ac\uc804 \uac80\uc0c9\n", - " - KeyError" + } + ], + "source": [ + "l = [1, 2]\n", + "print l[2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 발생 예제 5: 등록되지 않은 키로 사전 검색\n", + " - KeyError" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'c'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"a\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 'c'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {\"a\": 1, \"b\": 2}\n", - "print d['c']" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'c'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"a\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m: 'c'" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 6: \uc788\uc9c0\ub3c4 \uc54a\uc740 \ud30c\uc77c\uc744 \uc5f4\ub824\uace0 \ud560 \ub54c\n", - " - IOError" + } + ], + "source": [ + "d = {\"a\": 1, \"b\": 2}\n", + "print d['c']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 발생 예제 6: 있지도 않은 파일을 열려고 할 때\n", + " - IOError" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "IOError", + "evalue": "[Errno 2] No such file or directory: 'aaa.txt'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIOError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'aaa.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIOError\u001b[0m: [Errno 2] No such file or directory: 'aaa.txt'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = open('aaa.txt')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "IOError", - "evalue": "[Errno 2] No such file or directory: 'aaa.txt'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIOError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'aaa.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mIOError\u001b[0m: [Errno 2] No such file or directory: 'aaa.txt'" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \ub0b4\uc7a5 \uc608\uc678\uc758 \uc885\ub958\n", - "- \uc608\uc678 \ud074\ub798\uc2a4\uc758 \uacc4\uce35 \uad6c\uc870 ([\ucc38\uace0] https://docs.python.org/2/library/exceptions.html)\n", - "
BaseException\n",
-      " +-- SystemExit\n",
-      " +-- KeyboardInterrupt\n",
-      " +-- GeneratorExit\n",
-      " +-- Exception\n",
-      "      +-- StopIteration\n",
-      "      +-- StandardError\n",
-      "      |    +-- BufferError\n",
-      "      |    +-- ArithmeticError\n",
-      "      |    |    +-- FloatingPointError\n",
-      "      |    |    +-- OverflowError\n",
-      "      |    |    +-- ZeroDivisionError\n",
-      "      |    +-- AssertionError\n",
-      "      |    +-- AttributeError\n",
-      "      |    +-- EnvironmentError\n",
-      "      |    |    +-- IOError\n",
-      "      |    |    +-- OSError\n",
-      "      |    |         +-- WindowsError (Windows)\n",
-      "      |    |         +-- VMSError (VMS)\n",
-      "      |    +-- EOFError\n",
-      "      |    +-- ImportError\n",
-      "      |    +-- LookupError\n",
-      "      |    |    +-- IndexError\n",
-      "      |    |    +-- KeyError\n",
-      "      |    +-- MemoryError\n",
-      "      |    +-- NameError\n",
-      "      |    |    +-- UnboundLocalError\n",
-      "      |    +-- ReferenceError\n",
-      "      |    +-- RuntimeError\n",
-      "      |    |    +-- NotImplementedError\n",
-      "      |    +-- SyntaxError\n",
-      "      |    |    +-- IndentationError\n",
-      "      |    |         +-- TabError\n",
-      "      |    +-- SystemError\n",
-      "      |    +-- TypeError\n",
-      "      |    +-- ValueError\n",
-      "      |         +-- UnicodeError\n",
-      "      |              +-- UnicodeDecodeError\n",
-      "      |              +-- UnicodeEncodeError\n",
-      "      |              +-- UnicodeTranslateError\n",
-      "      +-- Warning\n",
-      "           +-- DeprecationWarning\n",
-      "           +-- PendingDeprecationWarning\n",
-      "           +-- RuntimeWarning\n",
-      "           +-- SyntaxWarning\n",
-      "           +-- UserWarning\n",
-      "           +-- FutureWarning\n",
-      "\t   +-- ImportWarning\n",
-      "\t   +-- UnicodeWarning\n",
-      "\t   +-- BytesWarning\n",
-      "
" + } + ], + "source": [ + "a = open('aaa.txt')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 내장 예외의 종류\n", + "- 예외 클래스의 계층 구조 ([참고] https://docs.python.org/2/library/exceptions.html)\n", + "
BaseException\n",
+    " +-- SystemExit\n",
+    " +-- KeyboardInterrupt\n",
+    " +-- GeneratorExit\n",
+    " +-- Exception\n",
+    "      +-- StopIteration\n",
+    "      +-- StandardError\n",
+    "      |    +-- BufferError\n",
+    "      |    +-- ArithmeticError\n",
+    "      |    |    +-- FloatingPointError\n",
+    "      |    |    +-- OverflowError\n",
+    "      |    |    +-- ZeroDivisionError\n",
+    "      |    +-- AssertionError\n",
+    "      |    +-- AttributeError\n",
+    "      |    +-- EnvironmentError\n",
+    "      |    |    +-- IOError\n",
+    "      |    |    +-- OSError\n",
+    "      |    |         +-- WindowsError (Windows)\n",
+    "      |    |         +-- VMSError (VMS)\n",
+    "      |    +-- EOFError\n",
+    "      |    +-- ImportError\n",
+    "      |    +-- LookupError\n",
+    "      |    |    +-- IndexError\n",
+    "      |    |    +-- KeyError\n",
+    "      |    +-- MemoryError\n",
+    "      |    +-- NameError\n",
+    "      |    |    +-- UnboundLocalError\n",
+    "      |    +-- ReferenceError\n",
+    "      |    +-- RuntimeError\n",
+    "      |    |    +-- NotImplementedError\n",
+    "      |    +-- SyntaxError\n",
+    "      |    |    +-- IndentationError\n",
+    "      |    |         +-- TabError\n",
+    "      |    +-- SystemError\n",
+    "      |    +-- TypeError\n",
+    "      |    +-- ValueError\n",
+    "      |         +-- UnicodeError\n",
+    "      |              +-- UnicodeDecodeError\n",
+    "      |              +-- UnicodeEncodeError\n",
+    "      |              +-- UnicodeTranslateError\n",
+    "      +-- Warning\n",
+    "           +-- DeprecationWarning\n",
+    "           +-- PendingDeprecationWarning\n",
+    "           +-- RuntimeWarning\n",
+    "           +-- SyntaxWarning\n",
+    "           +-- UserWarning\n",
+    "           +-- FutureWarning\n",
+    "\t       +-- ImportWarning\n",
+    "\t       +-- UnicodeWarning\n",
+    "\t       +-- BytesWarning\n",
+    "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 예외 처리 방법\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 try/except/else/finally 절 사용하기\n", + "- 예외가 발생할 수 있는 상황을 예상하여 예외 발생 상황을 전체 코드 흐름을 함께 제어할 수 있다.\n", + "- try/except/else/finally 절\n", + " - 구문\n", + "> try:
\n", + ">     (예외 발생 가능한) 일반적인 수행문들
\n", + "> except Exception:
\n", + ">     예외가 발생하였을 때 수행되는 문들
\n", + "> else:
\n", + ">     예외가 발생하지 않았을 때 수행되는 문들
\n", + "> finally:
\n", + ">     예외 발생 유무와 관계없이 무조건 수행되는 문들
" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "zero division error!!!\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \uc608\uc678 \ucc98\ub9ac \ubc29\ubc95\n", - "***" + } + ], + "source": [ + "try:\n", + " print 1.0 / 0.0\n", + "except ZeroDivisionError:\n", + " print 'zero division error!!!'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 처리를 하면 예외 발생시 프로그램 종료가 되지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "float division by zero\n", + "10.0\n", + "5.0\n", + "3.33333333333\n", + "2.5\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 try/except/else/finally \uc808 \uc0ac\uc6a9\ud558\uae30\n", - "- \uc608\uc678\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \uc0c1\ud669\uc744 \uc608\uc0c1\ud558\uc5ec \uc608\uc678 \ubc1c\uc0dd \uc0c1\ud669\uc744 \uc804\uccb4 \ucf54\ub4dc \ud750\ub984\uc744 \ud568\uaed8 \uc81c\uc5b4\ud560 \uc218 \uc788\ub2e4.\n", - "- try/except/else/finally \uc808\n", - " - \uad6c\ubb38\n", - "> try:
\n", - ">     (\uc608\uc678 \ubc1c\uc0dd \uac00\ub2a5\ud55c) \uc77c\ubc18\uc801\uc778 \uc218\ud589\ubb38\ub4e4
\n", - "> except Exception:
\n", - ">     \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc600\uc744 \ub54c \uc218\ud589\ub418\ub294 \ubb38\ub4e4
\n", - "> else:
\n", - ">     \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc558\uc744 \ub54c \uc218\ud589\ub418\ub294 \ubb38\ub4e4
\n", - "> finally:
\n", - ">     \uc608\uc678 \ubc1c\uc0dd \uc720\ubb34\uc640 \uad00\uacc4\uc5c6\uc774 \ubb34\uc870\uac74 \uc218\ud589\ub418\ub294 \ubb38\ub4e4
" + } + ], + "source": [ + "def division():\n", + " for n in range(0, 5):\n", + " try:\n", + " print 10.0 / n\n", + " except ZeroDivisionError, msg:\n", + " print msg\n", + "\n", + "division()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- else: 구문은 except: 구문없이 사용 못한다. " + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 5)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m else:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "try:\n", - " print 1.0 / 0.0\n", - "except ZeroDivisionError:\n", - " print 'zero division error!!!'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "zero division error!!!\n" - ] - } - ], - "prompt_number": 14 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ucc98\ub9ac\ub97c \ud558\uba74 \uc608\uc678 \ubc1c\uc0dd\uc2dc \ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4." + } + ], + "source": [ + "def division():\n", + " for n in range(0, 5):\n", + " try:\n", + " print 10.0 / n\n", + " else:\n", + " print \"Success\"\n", + "\n", + "division() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 상황에 따라서는 에러와 함께 따라오는 정보를 함께 받을 수도 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error - name 'spam' is not defined\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def division():\n", - " for n in range(0, 5):\n", - " try:\n", - " print 10.0 / n\n", - " except ZeroDivisionError, msg:\n", - " print msg\n", - "\n", - "division()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "float division by zero\n", - "10.0\n", - "5.0\n", - "3.33333333333\n", - "2.5\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- else: \uad6c\ubb38\uc740 except: \uad6c\ubb38\uc5c6\uc774 \uc0ac\uc6a9 \ubabb\ud55c\ub2e4. " + } + ], + "source": [ + "try:\n", + " spam()\n", + "except NameError, msg:\n", + " print 'Error -', msg" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error - name 'spam' is not defined\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def division():\n", - " for n in range(0, 5):\n", - " try:\n", - " print 10.0 / n\n", - " else:\n", - " print \"Success\"\n", - "\n", - "division() " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 5)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m else:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" - ] - } - ], - "prompt_number": 49 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0c1\ud669\uc5d0 \ub530\ub77c\uc11c\ub294 \uc5d0\ub7ec\uc640 \ud568\uaed8 \ub530\ub77c\uc624\ub294 \uc815\ubcf4\ub97c \ud568\uaed8 \ubc1b\uc744 \uc218\ub3c4 \uc788\ub2e4." + } + ], + "source": [ + "try:\n", + " spam()\n", + "except NameError as msg:\n", + " print 'Error -', msg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- try 절 안에서 간접적으로 호출한 함수의 내부 예외도 처리할 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "zero division error!!! - integer division or modulo by zero\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "try:\n", - " spam()\n", - "except NameError, msg:\n", - " print 'Error -', msg" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Error - name 'spam' is not defined\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "try:\n", - " spam()\n", - "except NameError as msg:\n", - " print 'Error -', msg" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Error - name 'spam' is not defined\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- try \uc808 \uc548\uc5d0\uc11c \uac04\uc811\uc801\uc73c\ub85c \ud638\ucd9c\ud55c \ud568\uc218\uc758 \ub0b4\ubd80 \uc608\uc678\ub3c4 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4." + } + ], + "source": [ + "def zero_division():\n", + " x = 1 / 0\n", + "\n", + "try:\n", + " zero_division()\n", + "except ZeroDivisionError, msg:\n", + " print 'zero division error!!! -', msg" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "zero division error!!! - integer division or modulo by zero\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def zero_division():\n", - " x = 1 / 0\n", - "\n", - "try:\n", - " zero_division()\n", - "except ZeroDivisionError, msg:\n", - " print 'zero division error!!! -', msg" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "zero division error!!! - integer division or modulo by zero\n" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def zero_division():\n", - " x = 1 / 0\n", - "\n", - "try:\n", - " zero_division()\n", - "except ZeroDivisionError as msg:\n", - " print 'zero division error!!! -', msg" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "zero division error!!! - integer division or modulo by zero\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- except \ub4a4\uc5d0 \uc544\ubb34\ub7f0 \uc608\uc678\ub3c4 \uae30\uc220\ud558\uc9c0 \uc54a\uc73c\uba74 \ubaa8\ub4e0 \uc608\uc678\uc5d0 \ub300\ud574 \ucc98\ub9ac\ub41c\ub2e4." + } + ], + "source": [ + "def zero_division():\n", + " x = 1 / 0\n", + "\n", + "try:\n", + " zero_division()\n", + "except ZeroDivisionError as msg:\n", + " print 'zero division error!!! -', msg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- except 뒤에 아무런 예외도 기술하지 않으면 모든 예외에 대해 처리된다." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "try:\n", - " spam()\n", - " print 1.0 / 0.0\n", - "except:\n", - " print 'Error'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Error\n" - ] - } - ], - "prompt_number": 31 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc5ec\ub7ec \uc608\uc678\ub4e4 \uac01\uac01\uc5d0 \ub300\ud574 except \uc808\uc744 \ub2e4\uc911\uc73c\ub85c \uc0bd\uc785\ud560 \uc218 \uc788\ub2e4." + } + ], + "source": [ + "try:\n", + " spam()\n", + " print 1.0 / 0.0\n", + "except:\n", + " print 'Error'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 여러 예외들 각각에 대해 except 절을 다중으로 삽입할 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ZeroDivisionError !!!\n", + "Exit !!!\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "b = 0.0\n", - "name = 'aaa.txt'\n", - "try:\n", - " print 1.0 / b\n", - " spam()\n", - " f = open(name, 'r')\n", - " '2' + 2\n", - "except NameError:\n", - " print 'NameError !!!'\n", - "except ZeroDivisionError:\n", - " print 'ZeroDivisionError !!!'\n", - "except (TypeError, IOError):\n", - " print 'TypeError or IOError !!!'\n", - "else:\n", - " print 'No Exception !!!'\n", - "finally:\n", - " print 'Exit !!!'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ZeroDivisionError !!!\n", - "Exit !!!\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc77c\uc5d0\uc11c \uc22b\uc790\ub97c \uc77d\uc5b4\uc640\uc11c \uc77d\uc740 \uc22b\uc790\ub85c \ub098\ub204\uae30\ub97c \ud558\ub294 \uc608\uc81c\n", - " - \uaf3c\uaf3c\ud55c \uc608\uc678 \ucc98\ub9ac \uc608\uc81c" + } + ], + "source": [ + "b = 0.0\n", + "name = 'aaa.txt'\n", + "try:\n", + " print 1.0 / b\n", + " spam()\n", + " f = open(name, 'r')\n", + " '2' + 2\n", + "except NameError:\n", + " print 'NameError !!!'\n", + "except ZeroDivisionError:\n", + " print 'ZeroDivisionError !!!'\n", + "except (TypeError, IOError):\n", + " print 'TypeError or IOError !!!'\n", + "else:\n", + " print 'No Exception !!!'\n", + "finally:\n", + " print 'Exit !!!'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파일에서 숫자를 읽어와서 읽은 숫자로 나누기를 하는 예제\n", + " - 꼼꼼한 예외 처리 예제" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning\n", + "1.0\n", + "Finally!!!\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "print os.getcwd()\n", - "filename = 't.txt'\n", - "\n", - "try:\n", - " f = open(filename, 'r')\n", - "except IOError, msg:\n", - " print msg\n", - "else:\n", - " a = float(f.readline())\n", - " try:\n", - " answer = 1.0 / a\n", - " except ZeroDivisionError, msg:\n", - " print msg\n", - " else:\n", - " print answer\n", - " finally:\n", - " print \"Finally!!!\"\n", - " f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/git/python-e-learning\n", - "1.0\n", - "Finally!!!\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \uac19\uc740 \ubd80\ub958\uc758 \uc608\uc678 \ub2e4 \uc7a1\uc544\ub0b4\uae30\n", - "- \uc608\uc678 \ud074\ub798\uc2a4\ub4e4\uc740 \uc0c1\uc18d\uc5d0 \uc758\ud55c \uacc4\uce35 \uad00\uacc4\ub97c \uc9c0\ub2c8\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc774\ub97c \uc774\uc6a9\ud558\uba74 \uc5ec\ub7ec \uc608\uc678\ub4e4\uc744 \ud55c\uaebc\ubc88\uc5d0 \uc7a1\uc744 \uc218 \uc788\ub2e4.\n", - "- \uc608\ub97c \ub4e4\uc5b4, ArithmeticError\uc758 \ud558\uc704 \ud074\ub798\uc2a4\ub85c\uc11c FloatingPointError, OverflowError, ZeroDivisionError\uac00 \uc874\uc7ac\ud558\uae30 \ub54c\ubb38\uc5d0 \uc774\ub4e4 \ud558\uc704 \ud074\ub798\uc2a4 \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc600\uc744 \uacbd\uc6b0 ArithmeticError\ub85c\uc11c \uc7a1\uc544\ub0bc \uc218 \uc788\ub2e4. " + } + ], + "source": [ + "import os\n", + "print os.getcwd()\n", + "filename = 't.txt'\n", + "\n", + "try:\n", + " f = open(filename, 'r')\n", + "except IOError, msg:\n", + " print msg\n", + "else:\n", + " a = float(f.readline())\n", + " try:\n", + " answer = 1.0 / a\n", + " except ZeroDivisionError, msg:\n", + " print msg\n", + " else:\n", + " print answer\n", + " finally:\n", + " print \"Finally!!!\"\n", + " f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 같은 부류의 예외 다 잡아내기\n", + "- 예외 클래스들은 상속에 의한 계층 관계를 지니고 있기 때문에 이를 이용하면 여러 예외들을 한꺼번에 잡을 수 있다.\n", + "- 예를 들어, ArithmeticError의 하위 클래스로서 FloatingPointError, OverflowError, ZeroDivisionError가 존재하기 때문에 이들 하위 클래스 예외가 발생하였을 경우 ArithmeticError로서 잡아낼 수 있다. " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ArithmeticException occured\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def dosomething():\n", - " a = 1/0\n", - "\n", - "try:\n", - " dosomething()\n", - "except ArithmeticError:\n", - " print \"ArithmeticException occured\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ArithmeticException occured\n" - ] - } - ], - "prompt_number": 16 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678\uac00 \uc784\uc758\uc758 except\uc5d0 \uc758\ud574 \uc7a1\ud788\uba74 \ub2e4\ub978 except\uc5d0 \uc758\ud574\uc11c\ub294 \uc7a1\ud788\uc9c0 \uc54a\ub294\ub2e4. " + } + ], + "source": [ + "def dosomething():\n", + " a = 1/0\n", + "\n", + "try:\n", + " dosomething()\n", + "except ArithmeticError:\n", + " print \"ArithmeticException occured\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외가 임의의 except에 의해 잡히면 다른 except에 의해서는 잡히지 않는다. " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ZeroDivisionError occured\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def dosomething():\n", - " a = 1/0\n", - "\n", - "try:\n", - " dosomething()\n", - "except ZeroDivisionError: # ZeroDivisionError\ub294 \uc774\uacf3\uc5d0\uc11c \uc7a1\ud78c\ub2e4.\n", - " print \"ZeroDivisionError occured\"\n", - "except ArithmeticError: # FloatingPointError, OverflowError\ub294 \uc774\uacf3\uc5d0\uc11c \uc7a1\ud78c\ub2e4.\n", - " print \"ArithmeticException occured\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ZeroDivisionError occured\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def dosomething():\n", - " a = 1/0\n", - "\n", - "try:\n", - " dosomething()\n", - "except ArithmeticError:\n", - " print \"ArithmeticException occured\"\n", - "except ZeroDivisionError: # \uc774\uacf3\uc5d0\uc11c ZeroDivisionError\ub294 \uc7a1\ud788\uc9c0 \uc54a\ub294\ub2e4. ==> \uc798\ubabb\ub41c \ucf54\ub4dc\n", - " print \"ZeroDivisionError occured\" " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ArithmeticException occured\n" - ] - } - ], - "prompt_number": 20 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \uc608\uc678 \ubc1c\uc0dd\n", - "***\n", - "### 3-1 raise\ub85c \uc608\uc678 \ubc1c\uc0dd\ud558\uae30" + } + ], + "source": [ + "def dosomething():\n", + " a = 1/0\n", + "\n", + "try:\n", + " dosomething()\n", + "except ZeroDivisionError: # ZeroDivisionError는 이곳에서 잡힌다.\n", + " print \"ZeroDivisionError occured\"\n", + "except ArithmeticError: # FloatingPointError, OverflowError는 이곳에서 잡힌다.\n", + " print \"ArithmeticException occured\"" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ArithmeticException occured\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678\ub97c \ud2b9\uc815 \uc0c1\ud669 \uc870\uac74\uc5d0\uc11c raise \ud0a4\uc6cc\ub4dc\ub97c \ud1b5\ud574 \ubc1c\uc0dd\uc2dc\ud0ac \uc218 \uc788\ub2e4.\n", - "- \uc544\ub798 \uc608\ub294 \uc2dc\ud000\uc2a4 \ud615 \ud074\ub798\uc2a4\ub97c \uc124\uacc4\ud560 \ub54c \uc778\ub371\uc2f1\uc744 \uad6c\ud604\ud558\ub294 \\_\\_getitem\\_\\_ \uba54\uc18c\ub4dc\uc5d0\uc11c \uc778\ub371\uc2a4\uac00 \ubc94\uc704\ub97c \ub118\uc744 \ub54c IndexError\ub97c \ubc1c\uc0dd\uc2dc\ud0a8\ub2e4." + } + ], + "source": [ + "def dosomething():\n", + " a = 1/0\n", + "\n", + "try:\n", + " dosomething()\n", + "except ArithmeticError:\n", + " print \"ArithmeticException occured\"\n", + "except ZeroDivisionError: # 이곳에서 ZeroDivisionError는 잡히지 않는다. ==> 잘못된 코드\n", + " print \"ZeroDivisionError occured\" " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 예외 발생\n", + "***\n", + "### 3-1 raise로 예외 발생하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외를 특정 상황 조건에서 raise 키워드를 통해 발생시킬 수 있다.\n", + "- 아래 예는 시퀀스 형 클래스를 설계할 때 인덱싱을 구현하는 \\_\\_getitem\\_\\_ 메소드에서 인덱스가 범위를 넘을 때 IndexError를 발생시킨다." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4 16\n", + "0 1 4 9 16 25 36 49 64 81" ] }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "class SquareSeq:\n", - " def __init__(self, n):\n", - " self.n = n\n", - " def __getitem__(self, k):\n", - " if k >= self.n or k < 0 :\n", - " raise IndexError # \ucca8\uc790 \ubc94\uc704\ub97c \ubc97\uc5b4\ub098\uba74 IndexError \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0b4\n", - " return k * k\n", - " def __len__(self):\n", - " return self.n\n", - " \n", - "s = SquareSeq(10)\n", - "print s[2], s[4]\n", - "for x in s: # IndexError\uac00 \ubc1c\uc0dd\ud558\ub294 \uc2dc\uc810\uae4c\uc9c0 \ubc18\ubcf5\ud55c\ub2e4\n", - " print x,\n", - "print s[20] # \ucca8\uc790 \ubc94\uc704\uac00 \ub118\uc5c8\ub2e4" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "4 16\n", - "0 1 4 9 16 25 36 49 64 81" - ] - }, - { - "ename": "IndexError", - "evalue": "", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# IndexError\uac00 \ubc1c\uc0dd\ud558\ub294 \uc2dc\uc810\uae4c\uc9c0 \ubc18\ubcf5\ud55c\ub2e4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# \ucca8\uc790 \ubc94\uc704\uac00 \ub118\uc5c8\ub2e4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m \u001b[0;31m# \ucca8\uc790 \ubc94\uc704\ub97c \ubc97\uc5b4\ub098\uba74 IndexError \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0b4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mIndexError\u001b[0m: " - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-2 \uc0ac\uc6a9\uc790 \ud074\ub798\uc2a4 \uc608\uc678 \uc815\uc758 \ubc0f \ubc1c\uc0dd\uc2dc\ud0a4\uae30\n", - "- \uc0ac\uc6a9\uc790 \uc815\uc758 \uc608\uc678 \ud074\ub798\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \uc77c\ubc18\uc801\uc778 \ubc29\ubc95\uc740 Exception \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d \ubc1b\uc544 \uad6c\ud604\ud55c\ub2e4.\n", - " - Exception \ud074\ub798\uc2a4\uc758 \uc11c\ube0c \ud074\ub798\uc2a4 \uc911 \ud558\ub098\ub97c \uc0c1\uc18d \ubc1b\uc544\ub3c4 \ub41c\ub2e4.\n", - "- \uc0ac\uc6a9\uc790 \uc815\uc758 \uc608\uc678 \ubc1c\uc0dd \ubc29\ubc95\n", - " - \ub0b4\uc7a5 \uc608\uc678 \ubc1c\uc0dd \ubc29\ubc95\uacfc \ub3d9\uc77c\ud558\uac8c raise [\ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4] \uc640 \uac19\uc774 \ud574\ub2f9 \uc608\uc678 \ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4\ub97c \ub358\uc9c4\ub2e4.\n", - "- \uc0ac\uc6a9\uc790 \uc815\uc758 \uc608\uc678\ub97c \uc7a1\ub294 \ubc29\ubc95\n", - " - except [\ud074\ub798\uc2a4 \uc774\ub984] \uacfc \uac19\uc774 \ud574\ub2f9 \uc608\uc678 \ud074\ub798\uc2a4 \uc774\ub984\uc744 \uc0ac\uc6a9\ud55c\ub2e4.\n", - "- \uc544\ub798 \uc608\uc5d0\uc11c except Big\uc774 \uc7a1\ub294 \uc608\uc678\ub294 Big\uacfc Small \uc774\ub2e4.\n", - " - \uc774\uc720: Small\uc740 Big\uc758 \ud558\uc704 \ud074\ub798\uc2a4\uc774\uae30 \ub54c\ubb38" + "ename": "IndexError", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# IndexError가 발생하는 시점까지 반복한다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# 첨자 범위가 넘었다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m \u001b[0;31m# 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mIndexError\u001b[0m: " ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Big(Exception):\n", - " pass\n", - "\n", - "class Small(Big):\n", - " pass\n", - "\n", - "def dosomething1():\n", - " x = Big()\n", - " raise x\n", - " \n", - "def dosomething2():\n", - " raise Small()\n", - " \n", - "for f in (dosomething1, dosomething2):\n", - " try:\n", - " f()\n", - " except Big:\n", - " print \"Exception occurs!\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Exception occurs!\n", - "Exception occurs!\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-3 \uc608\uc678\uac12 \uc804\ub2ec\ud558\uae30 \n", - "- raise \ud0a4\uc6cc\ub4dc \ub4a4\uc5d0 \uc608\uc678\uc640 \ud568\uaed8, \ucd94\uac00 \uba54\uc2dc\uc9c0\ub97c \ud568\uaed8 \ub358\uc9c8 \uc218 \uc788\ub2e4." + } + ], + "source": [ + "class SquareSeq:\n", + " def __init__(self, n):\n", + " self.n = n\n", + " def __getitem__(self, k):\n", + " if k >= self.n or k < 0 :\n", + " raise IndexError # 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\n", + " return k * k\n", + " def __len__(self):\n", + " return self.n\n", + " \n", + "s = SquareSeq(10)\n", + "print s[2], s[4]\n", + "for x in s: # IndexError가 발생하는 시점까지 반복한다\n", + " print x,\n", + "print s[20] # 첨자 범위가 넘었다" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 사용자 클래스 예외 정의 및 발생시키기\n", + "- 사용자 정의 예외 클래스를 구현하는 일반적인 방법은 Exception 클래스를 상속 받아 구현한다.\n", + " - Exception 클래스의 서브 클래스 중 하나를 상속 받아도 된다.\n", + "- 사용자 정의 예외 발생 방법\n", + " - 내장 예외 발생 방법과 동일하게 raise [클래스의 인스턴스] 와 같이 해당 예외 클래스의 인스턴스를 던진다.\n", + "- 사용자 정의 예외를 잡는 방법\n", + " - except [클래스 이름] 과 같이 해당 예외 클래스 이름을 사용한다.\n", + "- 아래 예에서 except Big이 잡는 예외는 Big과 Small 이다.\n", + " - 이유: Small은 Big의 하위 클래스이기 때문" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exception occurs!\n", + "Exception occurs!\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f():\n", - " raise Exception, 'message!!!'\n", - " \n", - "try:\n", - " f()\n", - "except Exception, a:\n", - " print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "message!!!\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0dd\uc131\uc790 \uc548\uc5d0 \ub123\uc5b4\uc900 \uc5d0\ub7ec \uba54\uc2dc\uc9c0\ub294 except \ud0a4\uc6cc\ub4dc \uc0ac\uc6a9\uc2dc\uc5d0 \ub450 \ubc88\uc9f8 \uc778\uc790\ub85c \ud574\ub2f9 \uba54\uc2dc\uc9c0\ub97c \ubc1b\uc744 \uc218 \uc788\ub2e4." + } + ], + "source": [ + "class Big(Exception):\n", + " pass\n", + "\n", + "class Small(Big):\n", + " pass\n", + "\n", + "def dosomething1():\n", + " x = Big()\n", + " raise x\n", + " \n", + "def dosomething2():\n", + " raise Small()\n", + " \n", + "for f in (dosomething1, dosomething2):\n", + " try:\n", + " f()\n", + " except Big:\n", + " print \"Exception occurs!\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-3 예외값 전달하기 \n", + "- raise 키워드 뒤에 예외와 함께, 추가 메시지를 함께 던질 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "message!!!\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10\n", - "b = 0\n", - "try:\n", - " if b == 0:\n", - " raise ArithmeticError('0\uc73c\ub85c \ub098\ub204\uace0 \uc788\uc2b5\ub2c8\ub2e4.')\n", - " a / b\n", - "except ArithmeticError, v:\n", - " print v" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0\uc73c\ub85c \ub098\ub204\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n" - ] - } - ], - "prompt_number": 28 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "def f():\n", + " raise Exception, 'message!!!'\n", + " \n", + "try:\n", + " f()\n", + "except Exception, a:\n", + " print a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 생성자 안에 넣어준 에러 메시지는 except 키워드 사용시에 두 번째 인자로 해당 메시지를 받을 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0으로 나누고 있습니다.\n" ] } ], - "metadata": {} + "source": [ + "a = 10\n", + "b = 0\n", + "try:\n", + " if b == 0:\n", + " raise ArithmeticError('0으로 나누고 있습니다.')\n", + " a / b\n", + "except ArithmeticError, v:\n", + " print v" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 0 +} From 8252f0630124ef84c3dc47fe8d54458910b5461f Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 14 Aug 2017 12:21:51 +0900 Subject: [PATCH 024/124] python3.6 --- python3.6/python01.ipynb | 554 +++++++++++++++++ python3.6/python02.ipynb | 1193 ++++++++++++++++++++++++++++++++++++ python3.6/python03.ipynb | 732 +++++++++++++++++++++++ python3.6/python04.ipynb | 644 ++++++++++++++++++++ python3.6/python05.ipynb | 734 +++++++++++++++++++++++ python3.6/python06.ipynb | 1104 ++++++++++++++++++++++++++++++++++ python3.6/python07.ipynb | 853 ++++++++++++++++++++++++++ python3.6/python08.ipynb | 675 +++++++++++++++++++++ python3.6/python09.ipynb | 830 +++++++++++++++++++++++++ python3.6/python10.ipynb | 675 +++++++++++++++++++++ python3.6/python11.ipynb | 989 ++++++++++++++++++++++++++++++ python3.6/python12.ipynb | 694 +++++++++++++++++++++ python3.6/python13.ipynb | 843 ++++++++++++++++++++++++++ python3.6/python14.ipynb | 871 +++++++++++++++++++++++++++ python3.6/python15.ipynb | 1117 ++++++++++++++++++++++++++++++++++ python3.6/python16.ipynb | 732 +++++++++++++++++++++++ python3.6/python17.ipynb | 653 ++++++++++++++++++++ python3.6/python18.ipynb | 751 +++++++++++++++++++++++ python3.6/python19.ipynb | 837 ++++++++++++++++++++++++++ python3.6/python20.ipynb | 908 ++++++++++++++++++++++++++++ python3.6/python21.ipynb | 808 +++++++++++++++++++++++++ python3.6/python22.ipynb | 1230 ++++++++++++++++++++++++++++++++++++++ python3.6/python23.ipynb | 957 +++++++++++++++++++++++++++++ 23 files changed, 19384 insertions(+) create mode 100644 python3.6/python01.ipynb create mode 100644 python3.6/python02.ipynb create mode 100644 python3.6/python03.ipynb create mode 100644 python3.6/python04.ipynb create mode 100644 python3.6/python05.ipynb create mode 100644 python3.6/python06.ipynb create mode 100644 python3.6/python07.ipynb create mode 100644 python3.6/python08.ipynb create mode 100644 python3.6/python09.ipynb create mode 100644 python3.6/python10.ipynb create mode 100644 python3.6/python11.ipynb create mode 100644 python3.6/python12.ipynb create mode 100644 python3.6/python13.ipynb create mode 100644 python3.6/python14.ipynb create mode 100644 python3.6/python15.ipynb create mode 100644 python3.6/python16.ipynb create mode 100644 python3.6/python17.ipynb create mode 100644 python3.6/python18.ipynb create mode 100644 python3.6/python19.ipynb create mode 100644 python3.6/python20.ipynb create mode 100644 python3.6/python21.ipynb create mode 100644 python3.6/python22.ipynb create mode 100644 python3.6/python23.ipynb diff --git a/python3.6/python01.ipynb b/python3.6/python01.ipynb new file mode 100644 index 0000000..5c9c77f --- /dev/null +++ b/python3.6/python01.ipynb @@ -0,0 +1,554 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:4d452e8a9501dfb7f3440f3f4366393799f168ed4672fcf6d2d42fa765b2406d" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 1\ud68c. Python \uc2dc\uc791\ud558\uae30\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1. \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\uc758 \uc774\ud574\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \uc2a4\ud06c\ub9bd\ud2b8(Script) \uc5b8\uc5b4\ub780 \ubb34\uc5c7\uc778\uac00?\n", + "- \uc2a4\ud06c\ub9bd\ud2b8(scripts)\uc758 \uc0ac\uc804\uc801 \uc758\ubbf8 - \uc5f0\uadf9\uc758 \ub300\uc0ac\ub4f1\uc774 \uc801\ud600 \uc788\ub294 \uc2a4\ud06c\ub9bd\ud2b8\uc5d0\uc11c \uc720\ub798\n", + "- Script Language\uc758 wikipedia \uc815\uc758 (http://en.wikipedia.org/wiki/Scripting_language)\n", + " - a programming language that supports scripts, programs written for a special run-time environment that can interpret (rather than compile) and automate the execution of tasks that could alternatively be executed one-by-one by a human operator" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 \ucef4\ud30c\uc77c \uc5b8\uc5b4\uc640 \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\uc640\uc758 \ube44\uad50 \n", + "- \ucef4\ud30c\uc77c(Compile) \ubc29\uc2dd\uc758 \uc5b8\uc5b4\uc5d0 \uc758\ud574 \uc791\uc131\ub418\ub294 \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uc740 \ucef4\ud30c\uc77c\ub7ec\uc5d0 \uc758\ud574 \uae30\uacc4\uc5b4\ub85c \ubc88\uc5ed\ub41c \ucc44\ub85c \uc2e4\ud589\ub418\uae30 \ub54c\ubb38\uc5d0, \uc218\uc815\uc774 \ube48\ubc88\ud558\uac8c \ubc1c\uc0dd\ud560 \uacbd\uc6b0\uc5d0\ub294 \uc218\uc815 \ud6c4 \ub2e4\uc2dc \ucef4\ud30c\uc77c\uc744 \ud574\uc57c\ud568.\n", + " - \ub369\uce58\uac00 \ud070 \ud504\ub85c\uadf8\ub7a8\uc740 \ucef4\ud30c\uc77c \uc2dc\uac04\uc774 \uaf64 \uae38\ub2e4. \uc989, \uac04\ub2e8\ud55c \uc218\uc815\uc5d0\ub3c4 \uc624\ub79c\uae30\uac04\uc758 \ucef4\ud30c\uc77c \uc2dc\uac04\uc774 \uc694\uad6c\ub41c\ub2e4. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](./images/compiler_interpreter2.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ubc18\uba74\uc5d0 \uc218\uc815\uc774 \ube48\ubc88\ud558\uac8c \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 \uc18c\uc2a4 \ucf54\ub4dc\ub97c \ud55c\uc904 \ud55c\uc904 \uc77d\uc5b4 \ubc14\ub85c\ubc14\ub85c \uc2e4\ud589\ud558\ub294 \uc778\ud130\ud504\ub9ac\ud130 \ubc29\uc2dd\uc774 \uc0c1\ub2f9\ud788 \uc720\ub9ac\ud558\ub2e4. \n", + "- \uc2a4\ud06c\ub9bd\ud2b8 \uc18c\uc2a4\ucf54\ub4dc\ub97c \ucef4\ud30c\uc77c \ubc29\uc2dd\uc5d0 \uc758\ud574 \uc911\uac04 \ucf54\ub4dc(Bytecode)\ub85c \uc6b0\uc120 \ub9cc\ub4e4\uace0, \uc774\ub97c \ub2e4\uc2dc \uc778\ud130\ud504\ub9ac\ud130 \ubc29\uc2dd\uc73c\ub85c \ud574\uc11d\ud558\uc5ec \uc218\ud589\ud558\ub294 \ubc29\ubc95\ub3c4 \uc885\uc885 \ud65c\uc6a9\ub41c\ub2e4." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](./images/bytecode.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\uc758 \uc7a5\uc810\n", + " - \uac1c\ubc1c \uc2dc\uac04\uc774 \ub2e8\ucd95\ub41c\ub2e4.\n", + " - \uc18c\uc2a4 \ucf54\ub4dc \uc218\uc815\uc774 \ube60\ub974\uace0 \uac04\ub2e8\ud558\uac8c \uc774\ub8e8\uc5b4\uc9c4\ub2e4.\n", + "- \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\uc758 \ub2e8\uc810\n", + " - \uc911\uac04 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uac83\uc740 \uac04\ub2e8\ud558\uc9c0\ub9cc \uadf8\uac83\uc744 \uc2e4\uc81c\ub85c \uc2e4\ud589\uc2dc\ud0a4\ub294 \uac83\uc740 \ub9ce\uc740 \uc791\uc5c5\uc744 \ud544\uc694\ub85c \ud55c\ub2e4.\n", + " - \uc2e4\ud589 \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub9b0\ub2e4." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 \ub300\ud45c\uc801\uc778 \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4 \n", + "- JavaScript\n", + "- ActionScript\n", + "- Perl\n", + "- PHP\n", + "- Python\n", + "- Lua\n", + "- Ruby" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ud30c\uc774\uc36c \uc5b8\uc5b4\uc758 \uc720\ub798 \ubc0f \ud30c\uc774\uc36c \uc5b8\uc5b4\uc758 \ud2b9\uc9d5\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 \ud30c\uc774\uc36c(Python)\uc758 \uc0ac\uc804\uc801 \uc758\ubbf8" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Python\uc758 \uc0ac\uc804\uc801 \uc758\ubbf8\ub294 \ub3c5\uc774 \uc5c6\ub294 \ubc40\uc73c\ub85c \uba39\uc774\ub97c \ubab8\uc73c\ub85c \uac10\uc544\uc11c \uc555\uc0ac\uc2dc\ud0a4\ub294 \ud070\ubc40, \ub610\ub294 \uadf8\ub9ac\uc2a4 \uc2e0\ud654\uc5d0 \ub098\uc624\ub294 \uc545\ub9c8" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \uc65c \ud30c\uc774\uc36c\uc774\ub780 \uc774\ub984\uc774 \ubd99\uc5c8\ub098?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\ub85c\uc11c Python \uc774\ub984\uc758 \uc720\ub798\ub294 1970\ub144\ub300\uc5d0 \uc601\uad6d BBC\uc5d0\uc11c \ubc29\uc601\ud55c \"Monty Python's Flying Circus\" \ubc29\uc601 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc720\ub798\ub418\uc5c8\ub2e4. \uc774 \ud504\ub85c\uadf8\ub7a8\uc740 \ub9e4\uc6b0 \uc5b4\uc0c9\ud558\uace0 \uc774\uc0c1\ud55c \ud589\ub3d9\uc744 \ubcf4\uc774\ub294 \uc0ac\ub78c\ub4e4\uc744 \uc1fc\ud615\ud0dc\ub85c \ubc29\uc601\ud558\uc5ec \ub9ce\uc740 \uc778\uae30\ub97c \ub204\ub838\ub2e4. \n", + "- \uc774 \uc5b8\uc5b4\ub97c \ub9cc\ub4e0 Guido van Rossum\uc774 \uc774 \ud504\ub85c\uadf8\ub7a8\uc758 \ub300\ub2e8\ud55c \ud32c\uc774\uc5c8\uae30 \ub54c\ubb38\uc774\uc5c8\ub2e4. \n", + "- 1989\ub144 12\uc6d4 \ud06c\ub9ac\uc2a4\ub9c8\uc2a4 \ud734\uac00\ub97c \ubcf4\ub0b4\uace0 \uc788\ub358 Guido\ub294 \ud734\uac00 \uae30\uac04\ub3d9\uc548 \ubb34\uc5c7\uc778\uac00 \uc7ac\ubbf8\uc788\uac8c \ud560 \uc218 \uc788\ub294 \ubb34\uc5b8\uac00\ub97c \ucc3e\uace0 \uc788\uc5c8\ub2e4. \n", + "- \uc5f0\ud734\ub77c\uc11c \uc5f0\uad6c\uc2e4\uc774 \ub2eb\ud78c \uc0c1\ud669\uc5d0\uc11c \uc9d1\uc5d0\uc11c \ucef4\ud4e8\ud130\ub97c \uac00\uc9c0\uace0 \uc608\uc804\ubd80\ud130 \uc0dd\uac01\ud558\uace0 \uc788\uc5c8\ub358 \uc778\ud130\ud504\ub9ac\ud130(interpreter)\ub97c \ub9cc\ub4e4\uc5b4 \ubcf4\uae30\ub85c \uacb0\uc2ec\ud558\uc600\ub2e4. \n", + "- \uc989, Guido\uac00 \ubb34\ub8cc\ud55c \ud55c\ub54c\ub97c \ubcf4\ub0b4\uae30 \uc704\ud558\uc5ec \ub9cc\ub4e4\uae30 \uc2dc\uc791\ud588\ub358 \uc5b8\uc5b4\uac00 \uc9c0\uae08 \ub9ce\uc740 \uc0ac\ub78c\ub4e4\uc774 \uc0ac\uc6a9\ud558\ub294 Python \uc5b8\uc5b4\uac00 \ub418\uc5c8\ub2e4." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 \ud30c\uc774\uc36c\uc758 \ucd9c\ubc1c" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud30c\uc774\uc36c\uc758 \uae30\ubc18\uc740 80\ub144\ub300 \ucd08\ubc18\uc5d0 Guido\uac00 \ub3d9\ub8cc\ub4e4\uacfc \ud568\uaed8 \uac1c\ubc1c\uc744 \ud558\uc600\ub358 ABC\ub77c\ub294 \uc5b8\uc5b4\uc774\ub2e4. \n", + "- 80\ub144\ub300\uc5d0 ABC\ub77c\ub294 \uc5b8\uc5b4\ub294 \ucd5c\uace0\uc758 \uad50\uc721\uc6a9 \uc5b8\uc5b4\ub85c \uc54c\ub824\uc84c\uc5c8\uace0 \uc804\ubb38 \ud504\ub85c\uadf8\ub798\uba38\uac00 \uc544\ub2cc \uc0ac\ub78c\uc774 \ubc30\uc6b0\uae30 \ud3b8\ud558\uac8c \ub9cc\ub4e4\uc5b4\uc9c4 \uc544\uc8fc \ud6cc\ub96d\ud55c \uc5b8\uc5b4\uc600\ub2e4. \n", + "- \uadf8\ub7fc\uc5d0\ub3c4 \ubd88\uad6c\ud558\uace0 \uc804\ubb38 \ud504\ub85c\uadf8\ub798\uba38\ub4e4\uc5d0\uac8c\ub294 \uac70\uc758 \ubc1b\uc544 \ub4e4\uc5ec\uc9c0\uc9c0\ub3c4 \uc54a\uc558\uace0 \uc798 \uc0ac\uc6a9\ub418\uc9c0\ub3c4 \uc54a\uc558\ub2e4.\n", + "- \uc774\ub294 \ud504\ub85c\uadf8\ub798\ubc0d\uc774 \ub300\uc911\ud654\uac00 \ub9ce\uc774 \ub418\uc9c0 \uc54a\uc740 \uc0c1\ud669\uc5d0\uc11c \uc804\ubb38 \ud504\ub85c\uadf8\ub798\uba38\ub4e4\uc5d0\uac8c \uc678\uba74\ubc1b\uc558\uc744 \ub54c\uc5d0 \ub098\uc62c \uc218 \uc788\ub294 \uacb0\uacfc\ub77c\uace0 \ubcfc \uc218 \uc788\ub2e4. \n", + "- Guido\ub294 \ud30c\uc774\uc36c\uc73c\ub85c \uc2e4\uc81c \ubb38\uc81c\ub97c \ub354\uc6b1\ub354 \uc27d\uac8c \ud574\uacb0\ud560 \uc218 \uc788\ub3c4\ub85d \uc124\uacc4\ud558\uc600\uc73c\uba70 C\uc5b8\uc5b4\ub098 \uc720\ub2c9\uc2a4 \uc258\uc744 \ub300\uc2e0\ud574\uc11c \uc880 \ub354 \ud3b8\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc5b8\uc5b4\ub97c \uac1c\ubc1c\ud558\ub294 \ub370 \ucd08\uc810\uc744 \ub9de\ucd94\uc5c8\ub2e4. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 \uc65c \ud30c\uc774\uc36c\uc744 \ubc30\uc6cc\uc57c \ud558\ub294\uac00?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uac00\uc7a5 \uc911\uc694\ud55c \ub300\ub2f5: \"\uc0dd\uc0b0\uc131\uc774 \ub192\uae30 \ub54c\ubb38\"\n", + "- \uba3c\uc800 \uac1c\ubc1c\ud558\ub77c! \uadf8\ub9ac\uace0 \ub098\uc11c \uc131\ub2a5\uc744 \uac1c\uc120\ud558\ub77c." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-5 \ud30c\uc774\uc36c\uc740 \uc5b4\ub5a4 \uc5b8\uc5b4\uc778\uac00?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub300\ud654 \uae30\ub2a5\uc758 \uc778\ud130\ud504\ub9ac\ud130 \uc5b8\uc5b4\n", + "- \ub3d9\uc801\uc778 \ub370\uc774\ud130 \ud0c0\uc785 \uacb0\uc815 \uc9c0\uc6d0" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def add(a,b):\n", + " return a+b\n", + "\n", + "print add(1,2)\n", + "print add('abc', 'def')\n", + "print add([1, 2, 3], [4, 5, 6])" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "3\n", + "abcdef\n", + "[1, 2, 3, 4, 5, 6]\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud50c\ub7ab\ud3fc \ub3c5\ub9bd\uc801 \uc5b8\uc5b4\n", + "- \uac1c\ubc1c \uae30\uac04 \ub2e8\ucd95\uc5d0 \ucd1b\uc810\uc744 \ub454 \uc5b8\uc5b4\n", + "- \uac04\ub2e8\ud558\uace0 \uc26c\uc6b4 \ubb38\ubc95\n", + "- \uace0\uc218\uc900\uc758 \ub0b4\uc7a5 \uac1d\uccb4 \uc790\ub8cc\ud615 \uc81c\uacf5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a=[12, 'abcde', 4+2j, [3,4,5]]\n", + "a.append('add')\n", + "print a;" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[12, 'abcde', (4+2j), [3, 4, 5], 'add']\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uba54\ubaa8\ub9ac \uc790\ub3d9 \uad00\ub9ac\n", + "- \uc26c\uc6b4 \uc720\uc9c0 \ubcf4\uc218\n", + "- \ub9ce\uc740 \uc218\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc81c\uacf5\n", + "- \uc9e7\uc544\uc9c0\ub294 \ucf54\ub4dc\n", + "- \ub192\uc740 \ud655\uc7a5\uc131" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-6 \ud30c\uc774\uc36c\uc744 \uc5b4\ub514\uc5d0 \uc0ac\uc6a9\ud558\uba74 \uc801\ub2f9\ud55c\uac00?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc2dc\uc2a4\ud15c \uc720\ud2f8\ub9ac\ud2f0\n", + "- GUI\n", + " - wxpython, tkinter\n", + "- \uac8c\uc784 \ud504\ub85c\uadf8\ub798\ubc0d\n", + " - \ud30c\uc774\uc36c \uac8c\uc784\uc5d4\uc9c4: PyOpenGL PySDL PyGame Kivy PyOgre Panda3D Cocos2D PySoy\n", + "- \uc6f9 \ud504\ub85c\uadf8\ub798\ubc0d\n", + " - django \ud504\ub808\uc784\uc6cc\ud06c\n", + "- \uc218\uce58 \ud504\ub85c\uadf8\ub798\ubc0d\n", + " - nextworkx \ubaa8\ub4c8\n", + "- \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud504\ub85c\uadf8\ub798\ubc0d\n", + "- \uae30\ud0c0\n", + "- \ucc38\uace0: http://mulgu.kr/73" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-7 \ud30c\uc774\uc36c\uc758 \uc7a5\uc810" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Guido\uac00 \uc0dd\uac01\ud588\ub358 Python \ubb38\ubc95\uc801 \ud2b9\uc9d5\uc740 \ub4e4\uc5ec\uc4f0\uae30\ub97c \ucca0\uc800\ud558\uac8c \uc9c0\ud0a8\ub3c4\ub85d \uc5b8\uc5b4\ub97c \uc124\uacc4\ud588\ub2e4\ub294 \uc810\uc774\ub2e4. \n", + "- \uc774\ub294 \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ud604\uaca9\ud788 \ub192\ud600\uc900\ub2e4.\n", + "- C \uc5b8\uc5b4\uc5d0\uc11c\ucc98\ub7fc {} \ub4f1\uc758 \uad04\ud638\ub97c \ub123\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \ud504\ub85c\uadf8\ub7a8\uc744 \uc880\ub354 \uae54\ub054\ud558\uac8c \ub9cc\ub4e4\uc5b4\uc900\ub2e4. \n", + "- \ud30c\uc774\uc36c \ucf54\ub4dc\ub294 \uc7ac\uc0ac\uc6a9\ud558\uae30\uac00 \uc27d\ub2e4. \n", + "- \ucf54\ub4dc\uc758 \ubd84\uc11d\uc774 \uc27d\uae30 \ub54c\ubb38\uc5d0 \ub2e4\ub978 \uc0ac\ub78c\uc774 \uc791\uc131\ud55c \ucf54\ub4dc\ub97c \ubc1b\uc544\uc11c \uc791\uc5c5\ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \ud6e8\uc52c \ub354 \uc791\uc5c5\uc744 \ud3b8\ud558\uac8c \ud574\uc900\ub2e4. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 03 \ud30c\uc774\uc36c \ucf54\ub529 \ud658\uacbd \uad6c\uc131\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 \ud30c\uc774\uc36c \ucf54\ub529 \ud658\uacbd \uad6c\ucd95 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3-1-1 Python \uc804\uc6a9 \ud1b5\ud569\uac1c\ubc1c\ud658\uacbd(IDE) \uc0ac\uc6a9 \n", + "- Enthought Canopy\n", + " - \ubcc4\ub3c4\uc758 \ud30c\uc774\uc36c \uc124\uce58 \uc5c6\uc774 \uc544\ub798 \ud1b5\ud569\uac1c\ubc1c\ud658\uacbd\uc744 \uc0ac\uc6a9\ud558\uba74 \uc790\ub3d9\uc73c\ub85c \ud30c\uc774\uc36c\uc774 \uc124\uce58\ub428\n", + " - CANOPY EXPRESS (Free) \ub2e4\uc6b4\ub85c\ub4dc \uc0ac\uc774\ud2b8: https://www.enthought.com/products/canopy/ \n", + "- Python \uc2e4\ud589\n", + " - Enthought Canopy \uc9c1\uc811 \ud65c\uc6a9\n", + " - \ucee4\ub9e8\ub4dc \ucc3d (\ud130\ubbf8\ub110)\n", + " - ipython \uba85\ub839\uc5b4 \uc774\uc6a9\n", + "\n", + "#### 3-1-2 \uc774\ud074\ub9bd\uc2a4 \uc0ac\uc6a9\n", + "- \ud30c\uc774\uc36c \uc124\uce58\n", + " - \ud30c\uc774\uc36c \ub2e4\uc6b4\ub85c\ub4dc \uc0ac\uc774\ud2b8: https://www.python.org/downloads/\n", + " - \ubcf8 \uac15\uc88c\uc5d0\uc11c\ub294 \ud30c\uc774\uc36c 2.7.x \ubc84\uc804 \uc0ac\uc6a9\n", + "- \uc774\ud074\ub9bd\uc2a4\uc5d0\uc11c \ud30c\uc774\uc36c \uc124\uce58 \ubc29\ubc95\n", + " - PyDev \ud50c\ub7ec\uadf8\uc778 \uc124\uce58\n", + " - \ucc38\uace0 \uc0ac\uc774\ud2b8: http://arisu1000.tistory.com/27707\n", + "\n", + "#### 3-1-3 \ucd94\ucc9c\ud558\ub294 \ucf54\ub529 \ud658\uacbd \uad6c\uc131 \ubc29\ubc95\n", + "- 1) Enthought Canopy \uc124\uce58\n", + "- 2) \uc774\ud074\ub9bd\uc2a4 \uc124\uce58 (\uc124\uce58\uac00 \uc548\ub418\uc5b4 \uc788\ub294 \uacbd\uc6b0)\n", + "- 3) PyDev \ud50c\ub7ec\uadf8\uc778 \uc124\uce58" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 \ub300\ud654\uc2dd \ubaa8\ub4dc\ub85c \uac04\ub2e8\ud55c \ud30c\uc774\uc36c \uc608\uc81c \uc2e4\ud589\ud558\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 4+5\n", + "print \"Hello World!\"" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "9\n", + "Hello World!\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "3-3 \uc0b0\uc220 \uc5f0\uc0b0\ud558\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# -*- coding: utf-8 -*-\n", + "print 4 + 5\n", + "print 12 - 32\n", + "print (4 + 5) * 6\n", + "print 4 + 5 * 6\n", + "print 9 / 5 # \uc815\uc218/\uc815\uc218 \uc5f0\uc0b0 \uacb0\uacfc\ub294 \uc815\uc218\n", + "print 9.0 / 5.0\n", + "print 9 / 5.0" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "9\n", + "-20\n", + "54\n", + "34\n", + "1\n", + "1.8\n", + "1.8\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###3-4 \uac04\ub2e8\ud55c \ubb38\uc790\uc5f4 \uc5f0\uc0b0\ud558\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 'Hello'\n", + "print \"Hi there!\"" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Hello\n", + "Hi there!\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 'My name is '\n", + "b = 'Amenda'\n", + "print a + b" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "My name is Amenda\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-5 \ud30c\uc774\uc36c \ubc84\uc804 \uc54c\uc544\ubcf4\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import sys\n", + "print sys.version\n", + "print\n", + "print sys.version_info" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2.7.6 | 64-bit | (default, Jun 4 2014, 16:42:26) \n", + "[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]\n", + "\n", + "sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-6 \ud30c\uc77c\ub85c \uc800\uc7a5\ud558\uc5ec \uc2e4\ud589\ud558\uae30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub2e4\uc74c \ub0b4\uc6a9\uc758 cal.py \ub9cc\ub4e4\uae30\n", + "```\n", + "# file: cal.py\n", + "import calendar\n", + "calendar.prmonth(2014, 11)\n", + "```\n", + "- \ucee4\ub9e8\ud2b8 \ucc3d (\ud130\ubbf8\ub110 \ucc3d)\uc5d0\uc11c \ud574\ub2f9 \ud3f4\ub354\ub85c \uc774\ub3d9 \ud6c4 \ub2e4\uc74c \uba85\ub839\uc5b4 \uc218\ud589 python.py\n", + " - python cal.py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-7 \ub300\ud654\uc2dd \ubaa8\ub4dc\uc5d0\uc11c \ud639\uc740 \ub2e4\ub978 \ubaa8\ub4c8\uc5d0\uc11c \ubaa8\ub4c8 \ud30c\uc77c \uc2e4\ud589\ud558\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "execfile('/Users/yhhan/Documents/workspace/python/01/cal.py')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " November 2014\n", + "Mo Tu We Th Fr Sa Su\n", + " 1 2\n", + " 3 4 5 6 7 8 9\n", + "10 11 12 13 14 15 16\n", + "17 18 19 20 21 22 23\n", + "24 25 26 27 28 29 30\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python02.ipynb b/python3.6/python02.ipynb new file mode 100644 index 0000000..7d3a575 --- /dev/null +++ b/python3.6/python02.ipynb @@ -0,0 +1,1193 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:ab93534d35b1345ad96d879e8a7dc685b8037f9ba9a30fa7da8dd5ab6183eed8" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 2. \ud30c\uc774\uc36c \uc5b8\uc5b4\uc758 \uae30\ubcf8\ubb38\ud615\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \ud30c\uc774\uc36c \uc608\uc57d\uc5b4 \ubc0f \ub0b4\uc7a5 \ud568\uc218\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \uc608\uc57d\uc5b4 (Reserved Words)\n", + "- \uc608\uc57d\uc5b4 (\ub610\ub294 \ud0a4\uc6cc\ub4dc)\n", + " - \ud30c\uc774\uc36c\uc5d0\uc11c \uc774\ubbf8 \ubb38\ubc95\uc801\uc778 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub418\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \ubcc0\uc218\uba85\ub4f1\uc758 \uc2dd\ubcc4\uc790\ub85c \uc0ac\uc6a9\ud558\uba74 \uc548\ub418\ub294 \ub2e8\uc5b4\ub4e4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 \uc608\uc57d\uc5b4\uc758 \uc885\ub958 \uc54c\uc544\ubcf4\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import keyword\n", + "\n", + "print keyword.kwlist\n", + "print\n", + "print len(keyword.kwlist)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']\n", + "\n", + "31\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 \ub0b4\uc7a5 \ud568\uc218 (Built-in Function)\n", + "- \ubcc4\ub3c4\uc758 \ubaa8\ub4c8(Module)\uc758 \ucd94\uac00 \uc5c6\uc774 \uae30\ubcf8\uc801\uc73c\ub85c \uc81c\uacf5\ub418\ub294 \ud568\uc218\ub4e4\n", + "- \ucc38\uace0 \uc0ac\uc774\ud2b8\n", + " 1. \ub0b4\uc7a5(Built-in) \ud568\uc218: https://docs.python.org/2/library/functions.html\n", + "- \ub300\ud45c\uc801\uc778 \ub0b4\uc7a5 \ud568\uc218\n", + " - abs, max, min, pow, chr, str, range, type, ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- abs(x)\n", + " - \uc218\uce58\ud615 \uc790\ub8cc x\uc5d0 \ub300\ud574 x\uc758 \uc808\ub300\uac12\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print abs(3)\n", + "print abs(-3)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "3\n", + "3\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- max(s)\n", + " - \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615(\ubb38\uc790\uc5f4, \ub9ac\uc2a4\ud2b8, \ud29c\ud50c)\uc744 \uc785\ub825\ubc1b\uc544 \uadf8 \uc790\ub8cc\uac00 \uc9c0\ub2cc \uc6d0\uc18c \uc911 \ucd5c\ub300\uac12\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print max(1, 2)\n", + "print max([1, 2, 3])\n", + "print max(\"python\")" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n", + "3\n", + "y\n" + ] + } + ], + "prompt_number": 20 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- min(s)\n", + " - \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615(\ubb38\uc790\uc5f4, \ub9ac\uc2a4\ud2b8, \ud29c\ud50c)\uc744 \uc785\ub825\ubc1b\uc544 \uadf8 \uc790\ub8cc\uac00 \uc9c0\ub2cc \uc6d0\uc18c \uc911 \ucd5c\uc18c\uac12\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print min(1, 2)\n", + "print min([1, 2, 3])\n", + "print min(\"python\")" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1\n", + "1\n", + "h\n" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- pow(x,y)\n", + " - \uc218\uce58\ud615 \uc790\ub8cc\ud615 x, y\uc5d0 \ub300\ud574 x\uc758 y\uc2b9\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print pow(2, 4)\n", + "print pow(3, 3)\n", + "print pow(2, -1)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "16\n", + "27\n", + "0.5\n" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- chr(i)\n", + " - \uc815\uc218 \ud615\ud0dc\uc758 ASCII\ucf54\ub4dc \uac12\uc744 \uc785\ub825\uc73c\ub85c \ubc1b\uc544 \uadf8\uc5d0 \ud574\ub2f9\ud558\ub294 \ubb38\uc790\ub97c \ubc18\ud658\ud558\ub294 \ud568\uc218\n", + " - \uc778\uc218 i\uc758 \ubc94\uc704: 0\ubd80\ud130 255\uae4c\uc9c0" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print chr(97)\n", + "print chr(65)\n", + "print chr(48)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "a\n", + "A\n", + "0\n" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- str(object)\n", + " - \uc784\uc758\uc758 \uac1d\uccb4 object\uc5d0 \ub300\ud574 \ud574\ub2f9 \uac1d\uccb4\ub97c \ud45c\ud604\ud558\ub294 \ubb38\uc790\uc5f4\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print str(3)\n", + "print str([1, 2])" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "3\n", + "[1, 2]\n" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- range([start,]stop[,step])\n", + " - \uc218\uce58\ud615 \uc790\ub8cc\ud615\uc73c\ub85c start, stop, step \ub4f1\uc744 \uc785\ub825\ubc1b\uc544 \ud574\ub2f9 \ubc94\uc704\uc5d0 \ud574\ub2f9\ud558\ub294 \uc815\uc218\ub97c \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\ud558\ub294 \ud568\uc218\n", + " - \uc778\uc218\uac00 \ud558\ub098(stop)\uc778 \uacbd\uc6b0\n", + " - 0\ubd80\ud130 stop-1\uae4c\uc9c0\uc758 \uc815\uc218 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud55c\ub2e4.\n", + " - \uc778\uc218\uac00 \ub450 \uac1c(start, stop)\uc778 \uacbd\uc6b0\n", + " - start\ubd80\ud130 stop-1\uae4c\uc9c0\uc758 \uc815\uc218 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud55c\ub2e4.\n", + " - \uc778\uc218\uac00 \uc138 \uac1c(start, stop, step)\uc778 \uacbd\uc6b0\n", + " - start\ubd80\ud130 stop-1\uae4c\uc9c0\uc758 \uc815\uc218\ub97c \ubc18\ud658\ud558\ub418 \uac01 \uc815\uc218 \uc0ac\uc774\uc758 \uac70\ub9ac\uac00 step\uc778 \uac83\ub4e4\ub9cc \ubc18\ud658\ud55c\ub2e4.\n", + " " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print range(10)\n", + "print range(3, 10)\n", + "print range(3, 10, 2)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "[3, 4, 5, 6, 7, 8, 9]\n", + "[3, 5, 7, 9]\n" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- type(object)\n", + " - \uc784\uc758\uc758 \uac1d\uccb4 object\uc758 \uc790\ub8cc\ud615\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print type(-1)\n", + "print type('abc')\n", + "print type([1, 2, 3])" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n", + "\n" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ud30c\uc774\uc36c \uc2dd\ubcc4\uc790\uc640 \ubcc0\uc218 \uc0ac\uc6a9\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 \uc2dd\ubcc4\uc790 \ub9cc\ub4dc\ub294 \ubc95" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud30c\uc774\uc36c \uc2dd\ubcc4\uc790\ub294 \ubcc0\uc218, \ud568\uc218, \ubaa8\ub4c8, \ud074\ub798\uc2a4 \ub610\ub294 \uac1d\uccb4\ub97c \uc2dd\ubcc4\ud558\ub294\ub370 \uc0ac\uc6a9\ub418\ub294 \uc774\ub984\uc774\ub2e4.\n", + "- \uc2dd\ubcc4\uc790\uc758 \uc870\uac74\n", + " - \ub300\uc18c\ubb38\uc790 \uad6c\ubcc4\ud568\n", + " - \uc2dd\ubcc4\uc790\ub294 \ubb38\uc790 A~Z \ub610\ub294 a~z\uacfc \uc5b8\ub354\ubc14(\\_)\ub85c \uc2dc\uc791\ud560 \uc218 \uc788\ub2e4. \n", + " - \uc2dd\ubcc4\uc790 \uccab \uc2dc\uc791\uc744 \uc81c\uc678\ud558\uace0 \uc2dd\ubcc4\uc790 \ub0b4\uc5d0 \uc22b\uc790(0~9)\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\n", + " - \ud2b9\uc218\ubb38\uc790 @, $, %\ub4f1\uc740 \uc2dd\ubcc4\uc790\uc5d0 \uc62c \uc218 \uc5c6\ub2e4.\n", + " - \uc608\ub97c \ub4e4\uc5b4 \ub2e4\uc74c\uacfc \uac19\uc740 \uac83\uc740 \uc2dd\ubcc4\uc790\uac00 \ub420 \uc218 \uc5c6\uc74c\n", + " - 1abc, @file, %x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \ubcc0\uc218\uba85 \ub9cc\ub4e4 \ub54c \uc870\uc2ec\ud560 \uc810" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc608\uc57d\uc5b4, \ub0b4\uc7a5\ud568\uc218, \ubaa8\ub4c8 \uc774\ub984\uc744 \ubcc0\uc218\uba85\uc73c\ub85c \ub9cc\ub4dc\ub294 \uc77c\uc774 \uc5c6\ub3c4\ub85d \ud560\uac83" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print str(12345)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "12345\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "str = 'abc'\n", + "\n", + "print str(12345)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'str' object is not callable", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m12345\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'str' object is not callable" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 \ubcc0\uc218\uc758 \uc0dd\uc131 \ubc0f \uc0ac\uc6a9\n", + "- \ud30c\uc774\uc36c\uc5d0\uc11c \ubcc0\uc218\uac00 \uc0dd\uc131\ub418\ub294 \uc2dc\uc810\uc740 \ud574\ub2f9 \ubcc0\uc218\uc5d0 \uc784\uc758\uc758 \uac12\uc774 \ud560\ub2f9\ub420 \ub54c\uc774\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 1\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1\n" + ] + } + ], + "prompt_number": 21 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ubcc0\uc218\uc758 \uc0dd\uc131 \uc5c6\uc774 \uace7\ubc14\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print b" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'b' is not defined", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'b' is not defined" + ] + } + ], + "prompt_number": 22 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 \ubcc0\uc218\uc758 \uc0ad\uc81c\n", + "- del \uc774\ub77c\ub294 \uc608\uc57d\uc5b4 \uc0ac\uc6a9" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "b = 2\n", + "print b\n", + "\n", + "del b\n", + "print b" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n" + ] + }, + { + "ename": "NameError", + "evalue": "name 'b' is not defined", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'b' is not defined" + ] + } + ], + "prompt_number": 24 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 \ud30c\uc774\uc36c \uae30\ucd08 \ubb38\ud615\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 \uc8fc\uc11d\ubb38" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#\uc774\uac83\uc740 \uc8fc\uc11d\uc785\ub2c8\ub2e4.\n", + "import sys #\uc774\uac83\ub3c4 \uc8fc\uc11d\uc785\ub2c8\ub2e4." + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 \uc5f0\uc18d\ub77c\uc778" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 1\n", + "b = 3\n", + "if (a == 1) and \\\n", + "(b == 3):\n", + " print 'connected lines'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "connected lines\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 1\n", + "b = 3\n", + "if (a == 1) and (b == 3):\n", + " print 'connected lines'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "connected lines\n" + ] + } + ], + "prompt_number": 25 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-3 \ud560\ub2f9\ubb38 (Assignment)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 1\n", + "b = a" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 14 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "1 + 3 = a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "can't assign to operator (, line 1)", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 1 + 3 = a\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m can't assign to operator\n" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 1\n", + "a = a + 1\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n" + ] + } + ], + "prompt_number": 26 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "c, d = 3, 4\n", + "print c, d\n", + "\n", + "x = y = z = 0\n", + "print x, y, z\n", + "\n", + "e = 3.5; f = 5.6\n", + "print e, f\n" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "3 4\n", + "0 0 0\n", + "3.5 5.6\n" + ] + } + ], + "prompt_number": 27 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub450 \ubcc0\uc218\uc758 \uac12\uc744 swap\ud558\ub294 \ubc29\ubc95" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "e = 3.5; f = 5.6\n", + "e, f = f, e\n", + "print e, f" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "5.6 3.5\n" + ] + } + ], + "prompt_number": 28 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc544\ub798\uc5d0\uc11c b = c + d\ub294 \uc2dd(Expression)\uc774 \uc544\ub2c8\ub77c \ubb38(Statement)\uc774\uae30 \ub54c\ubb38\uc5d0 a\uc5d0 \ud560\ub2f9\ub420 \uc218 \uc5c6\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = (b = c + d)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 1)", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m a = (b = c + d)\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "prompt_number": 29 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-4 \ud655\uc7a5 \ud560\ub2f9\ubb38" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 1\n", + "a += 4\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "5\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 10\n", + "a -= 3\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "7\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 10\n", + "a *= 2+3\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "50\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-5 \uac1d\uccb4\uc640 \ud560\ub2f9\n", + "- \uac1d\uccb4\uc758 \ubcc0\uc218\ub294 \ud574\ub2f9 \uac1d\uccb4\uc758 \ub808\ud37c\ub7f0\uc2a4\ub97c \uc9c0\ub2c8\uace0 \uc788\uc74c\n", + "- a = 1\uc774\ub77c\ub294 Statement\uc5d0\uc11c a\ub294 \uc774\ub984, 1\uc740 \uac1d\uccb4\uc774\uba70 a \ubcc0\uc218\ub294 1\uc774\ub77c\ub294 \uac1d\uccb4\ub97c \uac00\ub9ac\ud0a8\ub2e4.\n", + " - \uc989, a \ubcc0\uc218\ub294 1 \uac1d\uccb4\uc758 \ub808\ud37c\ub7f0\uc2a4\ub97c \uc9c0\ub2c8\uace0 \uc788\uc74c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = [1,2,3]\n", + "b = [10, a, 20]\n", + "c = ['x', a, 'y']\n", + "\n", + "print a\n", + "print b\n", + "print c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 2, 3]\n", + "[10, [1, 2, 3], 20]\n", + "['a', [1, 2, 3], 'b']\n" + ] + } + ], + "prompt_number": 42 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/assignment.png)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a[1] = 1000\n", + "\n", + "print a\n", + "print b\n", + "print c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 1000, 3]\n", + "[10, [1, 1000, 3], 20]\n", + "['a', [1, 1000, 3], 'b']\n" + ] + } + ], + "prompt_number": 43 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 4 \ucf58\uc194 \uc785\ucd9c\ub825\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4-1 \ucf58\uc194 \uc785\ub825" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ucf58\uc194 (Console)\n", + " - \uc708\ub3c4\uc6b0\uc988\uc5d0\uc11c\ub294 Command\ucc3d, \ub9ac\ub205\uc2a4/\ub9e5\uc5d0\uc11c\ub294 Terminal\ucc3d\n", + " - \uac01 IDE (\uc608, \uc774\ud074\ub9bd\uc2a4)\uc5d0\uc11c\ub294 \ubcc4\ub3c4\uc758 \ucf58\uc194 \ucc3d\uc774 \uc81c\uacf5\ub428\n", + "- raw_input(): \ubb38\uc790\uc5f4 \uc785\ub825 \ub0b4\uc7a5\ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "name = raw_input('name?')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "name?\ud64d\uae38\ub3d9\n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print name" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\ud64d\uae38\ub3d9\n" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- int(): \ubb38\uc790\uc5f4\uc744 \uc815\uc218\ub85c \ubcc0\ud658\ud558\ub294 \ub0b4\uc7a5\ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "k = int(raw_input('int : '))\n", + "print k" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "int : 12\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "12\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- input(): \uc815\uc218, \uc2e4\uc218, Expression \uc785\ub825 \ub0b4\uc7a5\ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "i = input('int :')\n", + "print i" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "int :45\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "45\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "k = input('expr:')\n", + "print k" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "expr:30 + 50\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "80\n" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4-2 \ucf58\uc194 \ucd9c\ub825" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- print: \ud654\uba74\uc5d0 \uc790\ub8cc\ub97c \ucd9c\ub825\ud558\ub294 \ubcf4\ud3b8\uc801\uc778 statement\n", + "- \uc5ec\ub7ec \uc790\ub8cc\ub97c \ud55c\uaebc\ubc88\uc5d0 \ucd9c\ub825\ud560 \ub54c\uc5d0\ub294 \ucf64\ub9c8(,)\ub97c \uc0ac\uc6a9" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 4 + 5, 4 - 2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "9 2\n" + ] + } + ], + "prompt_number": 68 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc138\ubbf8\ucf5c\ub860(;)\uc740 \uc21c\ucc28\uc801\uc73c\ub85c \uc785\ub825\ub41c \uac01 statement\ub97c \ubd84\ub9ac\ud568 " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 1; print 2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1\n", + "2\n" + ] + } + ], + "prompt_number": 69 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uae30\ubcf8\uc801\uc73c\ub85c print\ub294 \ub9c8\uc9c0\ub9c9\uc5d0 \uc904\ubc14\uafc8\uc744 \ud558\uc9c0\ub9cc \ucf64\ub9c8(,)\uac00 \ub9c8\uc9c0\ub9c9\uc5d0 \uc788\uc73c\uba74 \uc904\ubc14\uafc8\uc744 \ud558\uc9c0 \uc54a\ub294\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 1,\n", + "print 2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 2\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- +\uc5f0\uc0b0\uc790\ub294 \uc22b\uc790\uc640 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc5f0\uc0b0\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 12 + 'spam'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unsupported operand type(s) for +: 'int' and 'str'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0;36m12\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m'spam'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'int' and 'str'" + ] + } + ], + "prompt_number": 71 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print '12' + 'spam'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "12spam\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python03.ipynb b/python3.6/python03.ipynb new file mode 100644 index 0000000..57fc7e4 --- /dev/null +++ b/python3.6/python03.ipynb @@ -0,0 +1,732 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:d2b18d2f5552e66fe8f48d6e54a9f87d03ee81aa1915bdaf92fe23d868aca4fc" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 3. \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc758 \uae30\ucd08\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \uc218\uce58 \uc790\ub8cc\ud615\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \uc815\uc218\ud615 \uc0c1\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 23 # 10\uc9c4 \uc815\uc218\n", + "b = 023 # 8\uc9c4 \uc815\uc218\n", + "c = 0x23 # 16\uc9c4 \uc815\uc218\n", + "print type(a), type(b), type(c)\n", + "print a, b, c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " \n", + "23 19 35\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import sys\n", + "print sys.maxint # \ucd5c\ub300 \uc815\uc218 \uac12 \ud655\uc778" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "9223372036854775807\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 \uc2e4\uc218\ud615 \uc0c1\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 1.2\n", + "b = 3.5e3\n", + "c = -0.2e-4\n", + "print type(a), type(b), type(c)\n", + "print a, b, c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " \n", + "1.2 3500.0 -2e-05\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 \ub871\ud615 \uc0c1\uc218\n", + "- \uba54\ubaa8\ub9ac\uac00 \ud5c8\uc6a9\ud558\ub294 \ud55c \uc720\ud6a8\uc790\ub9ac\uc218\ub294 \ubb34\ud55c\ub300" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "h1 = 123456789012345678901234567890L # \ub9c8\uc9c0\ub9c9\uc5d0 L\uc744 \ubd99\uc5ec\uc11c \uba85\uc2dc\uc801\uc73c\ub85c long \ud615\uc774\ub77c\uace0 \uc54c\ub824\ub3c4 \ub418\uace0\n", + "print type(h1)\n", + "print h1 * h1\n", + "print\n", + "\n", + "h2 = 123456789012345678901234567890 # L\uc744 \ubd99\uc774\uc9c0 \uc54a\uc544\ub3c4 int\ud615\uc774 \ub2f4\uc744 \uc218 \uc788\ub294 \uc218\uce58\ub97c \ucd08\uacfc\ud558\uba74 \uc790\ub3d9\uc73c\ub85c long\ud615\uc774 \ub41c\ub2e4. \n", + "print type(h2)\n", + "print h2 * h2\n", + "print\n", + "\n", + "h3 = 123L\n", + "print type(h3)\n", + "print\n", + "\n", + "h4 = 123\n", + "print type(h4)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "15241578753238836750495351562536198787501905199875019052100\n", + "\n", + "\n", + "15241578753238836750495351562536198787501905199875019052100\n", + "\n", + "\n", + "\n", + "\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "123456789012345678890 # \uc790\ub3d9 long\ud615 \ubcc0\ud658" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 15, + "text": [ + "123456789012345678890L" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 \ubcf5\uc18c\uc218\ud615 \uc0c1\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 10 + 20j\n", + "print a\n", + "\n", + "b = 10 + 5j\n", + "print a + b" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "(10+20j)\n", + "(20+25j)\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 \uc218\uce58 \uc790\ub8cc\ud615\uc758 \uce58\ud658\n", + "- \uc544\ub798 \uc608\uc5d0\uc11c\ub294 x\uac00 \uc9c0\ub2c8\uace0 \uc788\ub294 1\uc758 \uac12\uc774 \ubcc0\uacbd\ub418\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uc0c8\ub85c\uc6b4 \uac1d\uccb4 2\ub85c \ub808\ud37c\ub7f0\uc2a4\ub97c \ubcc0\uacbd\ud558\ub294 \uac83\uc784" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "x = 1\n", + "x = 2" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image1](images/referenceChangeNumerical.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-6 \uc218\uce58 \uc5f0\uc0b0\uacfc \uad00\ub828\ub41c \ub0b4\uc7a5 \ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print abs(-3)\n", + "print int(3.141592)\n", + "print int(-3.1415)\n", + "print long(3)\n", + "print float(5)\n", + "print complex(3.4, 5)\n", + "print complex(6)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "3\n", + "3\n", + "-3\n", + "3\n", + "5.0\n", + "(3.4+5j)\n", + "(6+0j)\n" + ] + } + ], + "prompt_number": 105 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print divmod(5, 2)\n", + "print\n", + "print pow(2, 3)\n", + "print pow(2.3, 3.5)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "(2, 1)\n", + "\n", + "8\n", + "18.4521691056\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-7 math \ubaa8\ub4c8\uc758 \uc218\uce58 \uc5f0\uc0b0 \ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import math\n", + "\n", + "print math.pi\n", + "print math.e\n", + "print math.sin(1.0) # 1.0 \ub77c\ub514\uc548\uc5d0 \ub300\ud55c \uc0ac\uc778 \uac12\n", + "print math.sqrt(2) # \uc81c\uacf1\uadfc" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "3.14159265359\n", + "2.71828182846\n", + "0.841470984808\n", + "1.41421356237\n" + ] + } + ], + "prompt_number": 109 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "r = 5.0 # \ubc18\uc9c0\ub984\n", + "a = math.pi * r * r # \uba74\uc801\n", + "\n", + "degree = 60.0\n", + "rad = math.pi * degree / 180.0 # \uac01\ub3c4\ub97c \ub77c\ub514\uc548\uc73c\ub85c \ubcc0\ud658\n", + "print math.sin(rad), math.cos(rad), math.tan(rad) #sin, cos, tan" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0.866025403784 0.5 1.73205080757\n" + ] + } + ], + "prompt_number": 111 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ubb38\uc790\uc5f4\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 \ubb38\uc790\uc5f4 \ud615\uc2dd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud55c \uc904 \ubb38\uc790\uc5f4 \ud615\uc2dd\n", + " - \ub2e8\uc77c \ub530\uc634\ud45c\n", + " - \uc774\uc911 \ub530\uc634\ud45c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 'Hello World!'\n", + "\n", + "print \"Hello World!\"" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Hello World!\n", + "Hello World!\n" + ] + } + ], + "prompt_number": 81 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc5ec\ub7ec \uc904 \ubb38\uc790\uc5f4 \ud615\uc2dd\n", + " - \uc5f0\uc18d\ub41c \ub2e8\uc77c \ub530\uc634\ud45c \uc138 \uac1c\n", + " - \uc5f0\uc18d\ub41c \uc774\uc911 \ub530\uc634\ud45c \uc138 \uac1c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "multiline = '''\n", + "To be, or not to be\n", + "that is the question\n", + "'''\n", + "print multiline\n", + "\n", + "multiline2 = \"\"\"\n", + "To be, or not to be\n", + "that is the question\n", + "\"\"\"\n", + "print multiline2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "To be, or not to be\n", + "that is the question\n", + "\n", + "\n", + "To be, or not to be\n", + "that is the question\n", + "\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \uc778\ub371\uc2f1(Indexing)\uacfc \uc2ac\ub77c\uc774\uc2f1(Slicing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Indexing" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = \"Hello world!\"\n", + "print s[0]\n", + "print s[1]\n", + "print s[-1]\n", + "print s[-2]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "H\n", + "e\n", + "!\n", + "d\n" + ] + } + ], + "prompt_number": 82 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Slicing\n", + " - \ud615\uc2dd: [start(included) : stop(excluded) : step]\n", + " - \uae30\ubcf8\uac12: start - 0, stop - \uc790\ub8cc\ud615\uc758 \ud06c\uae30, step - 1" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = \"Hello world!\"\n", + "print s[1:3]\n", + "print s[0:5]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "el\n", + "Hello\n" + ] + } + ], + "prompt_number": 83 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = 'Hello'\n", + "print s[1:]\n", + "print s[:3]\n", + "print s[:]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "ello\n", + "Hel\n", + "Hello\n" + ] + } + ], + "prompt_number": 85 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = 'abcd'\n", + "print s[::2]\n", + "print s[::-1]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "ac\n", + "dcba\n" + ] + } + ], + "prompt_number": 86 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ubb38\uc790\uc5f4 \uc790\ub8cc\ud615\uc740 \ubcc0\uacbd\ub418\uc9c0 \uc54a\ub294\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = 'Hello World'\n", + "s[0] = 'h'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'str' object does not support item assignment", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'Hello World'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'h'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" + ] + } + ], + "prompt_number": 88 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ubb38\uc790\uc5f4\uc744 \ubcc0\uacbd\ud558\ub824\uba74 Slicing \ubc0f \uc5f0\uacb0 \uc5f0\uc0b0 (+)\uc744 \uc8fc\ub85c \uc774\uc6a9\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = 'Hello World'\n", + "s = 'h' + s[1:]\n", + "s" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 9, + "text": [ + "'hello World'" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 \ubb38\uc790\uc5f4 \uc5f0\uc0b0\n", + "- +: \uc5f0\uacb0\n", + "- *: \ubc18\ubcf5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 'Hello' + '' + 'World'\n", + "print 'Hello' * 3\n", + "print '-' * 60" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "HelloWorld\n", + "HelloHelloHello\n", + "------------------------------------------------------------\n" + ] + } + ], + "prompt_number": 87 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 \ubb38\uc790\uc5f4\uc758 \uae38\uc774\n", + "- len(): \ubb38\uc790\uc5f4\uc758 \uae38\uc774\ub97c \ubc18\ud658\ud558\ub294 \ub0b4\uc7a5\ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = 'Hello World'\n", + "len(s)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 90, + "text": [ + "11" + ] + } + ], + "prompt_number": 90 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-5 \ubb38\uc790\uc5f4\ub0b4 \ud3ec\ud568 \uad00\uacc4 \uc5ec\ubd80\n", + "- in, not in: \ubb38\uc790\uc5f4\ub0b4\uc5d0 \uc77c\ubd80 \ubb38\uc790\uc5f4\uc774 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uc9c0\ub97c \ud30c\uc545\ud558\ub294 \ud0a4\uc6cc\ub4dc" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = 'Hello World'\n", + "print 'World' in s\n", + "print 'World' not in s" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n", + "False\n" + ] + } + ], + "prompt_number": 92 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python04.ipynb b/python3.6/python04.ipynb new file mode 100644 index 0000000..0431058 --- /dev/null +++ b/python3.6/python04.ipynb @@ -0,0 +1,644 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:d741b33c2e388a74e523537b59691d549be7e1f2e8d247cdb03a101bac3eea2b" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 4. \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804 \ubc0f \ub0b4\uc7a5 \uc790\ub8cc\ud615 \ud2b9\uc131\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \ub9ac\uc2a4\ud2b8\uc758 \uc815\uc758\uc640 \ub9ac\uc2a4\ud2b8 \uae30\ubcf8 \uc5f0\uc0b0\n", + "- \ub9ac\uc2a4\ud2b8: \uc784\uc758\uc758 \uac1d\uccb4\ub97c \uc21c\ucc28\uc801\uc73c\ub85c \uc800\uc7a5\ud558\ub294 \uc9d1\ud569\uc801 \uc790\ub8cc\ud615\n", + "- \ubb38\uc790\uc5f4\uc774 \uc9c0\ub2cc \ub300\ubd80\ubd84\uc758 \uc5f0\uc0b0\ub4e4\uc740 \ub9ac\uc2a4\ud2b8\ub3c4 \uc9c0\uc6d0" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [1,2,3]\n", + "print type(L)\n", + "print\n", + "print len(L)\n", + "print\n", + "print L[1]\n", + "print L[-1]\n", + "print L[1:3]\n", + "print\n", + "print L + L\n", + "print L * 3" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n", + "3\n", + "\n", + "2\n", + "3\n", + "[2, 3]\n", + "\n", + "[1, 2, 3, 1, 2, 3]\n", + "[1, 2, 3, 1, 2, 3, 1, 2, 3]\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8\ub294 \ubcc0\uacbd \uac00\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "l1 = [4,5,6]\n", + "l1[0] = 10\n", + "print l1" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[10, 5, 6]\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/changeListElement.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub3d9\uc77c\ud55c \ubcc0\uc218\uc5d0 \ub2e4\ub978 \ub9ac\uc2a4\ud2b8\ub97c \ud560\ub2f9\ud558\ub294 \uac83\uc740 \ud574\ub2f9 \ubcc0\uc218\uc758 \ub808\ud37c\ub7f0\uc2a4\ub97c \ubcc0\uacbd\ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "l1 = [1,2,3]\n", + "l1 = [4,5,6]\n", + "print l1" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[4, 5, 6]\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/referenceChangeList.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 range() \ud568\uc218\ub97c \ud1b5\ud55c \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8 \uc0dd\uc131\n", + "- range(k): 0\ubd80\ud130 k-1\uae4c\uc9c0\uc758 \uc22b\uc790\uc758 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud568 " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = range(10)\n", + "print L\n", + "print L[::2]\n", + "print L[::-1]\n", + "print 4 in L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "[0, 2, 4, 6, 8]\n", + "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n", + "True\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 \ud29c\ud50c\uc758 \uc815\uc758\uc640 \uae30\ubcf8 \uc5f0\uc0b0\n", + "- \ud29c\ud50c: \ub9ac\uc2a4\ud2b8\uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc \ud29c\ud50c \ub0b4\uc758 \uac12\uc744 \ubcc0\uacbd\ud560 \uc218 \uc5c6\uc74c\n", + " - \uc801\ud569\ud55c \uc0ac\uc6a9 \uc608\n", + " - months = ('January','February','March','April','May','June','July','August','September','October','November',' December')\n", + " - \uac01 \uac12\uc5d0 \ub300\ud574 \uc778\ub371\uc2a4\uac00 \ubd80\uc5ec\ub428\n", + "- \ubb38\uc790\uc5f4\uc774 \uc9c0\ub2cc \ub300\ubd80\ubd84\uc758 \uc5f0\uc0b0\ub4e4\uc740 \ud29c\ud50c\ub3c4 \uc9c0\uc6d0" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t = (1,2,3)\n", + "\n", + "print len(t)\n", + "print\n", + "print t[0]\n", + "print t[-1]\n", + "print t[0:2]\n", + "print t[::2]\n", + "print\n", + "print t + t + t\n", + "print t * 3\n", + "print\n", + "print 3 in t" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "3\n", + "\n", + "1\n", + "3\n", + "(1, 2)\n", + "(1, 3)\n", + "\n", + "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", + "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", + "\n", + "True\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 \ud29c\ud50c\uc758 \uc0c1\uc218\uc801 \uc131\uaca9\n", + "- \ud29c\ud50c\uc740 \ub0b4\uc6a9 \ubcc0\uacbd \ubd88\uac00" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t = (1,2,3)\n", + "\n", + "t[0] = 100" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'tuple' object does not support item assignment", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" + ] + } + ], + "prompt_number": 105 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ubc18\uba74\uc5d0 \ub9ac\uc2a4\ud2b8\ub294 \ub0b4\uc6a9 \ubcc0\uacbd \uac00\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [1,2,3]\n", + "L[0] = 100\n", + "\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[100, 2, 3]\n" + ] + } + ], + "prompt_number": 107 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 \uc0ac\uc804\uc758 \uc815\uc758\uc640 \uae30\ubcf8 \uc0ac\uc6a9\ubc95\n", + "- \uc815\uc218\ud615 \uc778\ub371\uc2a4\uac00 \uc544\ub2cc \ud0a4\ub97c \uc774\uc6a9\ud558\uc5ec \uac12\uc744 \uc800\uc7a5\ud558\ub294 \uc790\ub8cc \uad6c\uc870\n", + " - \uc800\uc7a5\ub41c \uac01 \uc790\ub8cc\uc5d0 \ub300\ud55c \uc21c\uc11c\ub294 \uc758\ubbf8 \uc5c6\uc74c\n", + "- \ub9e4\ud551(Mapping) \ud568\uc218\uc640 \ube44\uc2b7\ud55c \uc5ed\ud560\uc744 \ud568\n", + " - x\ub77c\ub294 \ud0a4\uac12\uc744 \ub123\uc73c\uba74 \uac12 y\ub97c \ubc18\ud658\ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", + "print d['one']\n" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "hana\n" + ] + } + ], + "prompt_number": 109 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", + "d['four'] = 'net' # \uc0c8 \ud56d\ubaa9\uc758 \uc0bd\uc785\n", + "print d\n", + "d['one'] = 1 # \uae30\uc874 \ud56d\ubaa9\uc758 \uac12 \ubcc0\uacbd\n", + "print d\n", + "print 'one' in d # \ud0a4\uc5d0 \ub300\ud55c \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 'hana'}\n", + "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 1}\n", + "True\n" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d = {'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", + "print d.keys() # \ud0a4\ub9cc \ub9ac\uc2a4\ud2b8\ub85c \ucd94\ucd9c\ud568\n", + "print d.values() # \uac12\ub9cc \ub9ac\uc2a4\ud2b8\ub85c \ucd94\ucd9c\ud568\n", + "print d.items() # \ud0a4\uc640 \uac12\uc758 \ud29c\ud50c\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\ud568" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['four', 'three', 'two', 'one']\n", + "['net', 'set', 'dul', 1]\n", + "[('four', 'net'), ('three', 'set'), ('two', 'dul'), ('one', 1)]\n" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc758 \uc815\ub9ac\uc640 \uac1d\uccb4 \uc2e0\uc6d0 \ud30c\uc545\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc758 \ud2b9\uc131 \uc815\ub9ac" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| \uc790\ub8cc\ud615 | \uc800\uc7a5/\uc811\uadfc \ubc29\ubc95 | \ubcc0\uacbd \uac00\ub2a5\uc131 | \uc800\uc7a5 \ubaa8\ub378 |\n", + "|:------:|:-----------------:|:-----------:|:--------------------:|\n", + "| \uc218\uce58\ud615 | \uc9c1\uc811(Direct) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ub9ac\ud130\ub7f4 (Literal) |\n", + "| \ubb38\uc790\uc5f4 | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ub9ac\ud130\ub7f4 (Literal) |\n", + "| \ub9ac\uc2a4\ud2b8 | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\uac00\ub2a5(Mutable) | \ucee8\ud14c\uc774\ub108 (Container) |\n", + "| \ud29c\ud50c | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ucee8\ud14c\uc774\ub108 (Container) |\n", + "| \uc0ac\uc804 | \ub9e4\ud551 (Mapping) | \ubcc0\uacbd\uac00\ub2a5(Mutable) | \ucee8\ud14c\uc774\ub108 (Container) |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \ub0b4\uc7a5 \uc790\ub8cc\ud615 \uc54c\uc544\ubcf4\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print type(3) #\uc815\uc218\n", + "print type(3.3) #\uc2e4\uc218\n", + "print type('abc') #\ubb38\uc790\uc5f4" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n", + "\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print type([]) #\ub9ac\uc2a4\ud2b8\n", + "print type(()) #\ud29c\ud50c\n", + "print type({}) #\uc0ac\uc804(dict)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n", + "\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc790\ub8cc\ud615\uc758 \ube44\uad50" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 0\n", + "L = [1,2,3]\n", + "print type(a) == type(0)\n", + "print type(L) == type([])\n", + "print type(L[0]) == type(0)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n", + "True\n", + "True\n" + ] + } + ], + "prompt_number": 41 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print type(None) #None \uac1d\uccb4, \uc544\ubb34 \uac12\ub3c4 \uc5c6\ub2e4(\ud639\uc740 \uc544\ub2c8\ub2e4)\ub97c \ub098\ud0c0\ub0b4\ub294 \uac1d\uccb4\n", + "print\n", + "a = None\n", + "print a\n", + "print type(a)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n", + "None\n", + "\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 \uac1d\uccb4\uc758 \uc2e0\uc6d0 \uc2dd\ubcc4\ud558\uae30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- id(): \uac1d\uccb4\uc758 \uc2dd\ubcc4\uc790\ub97c \ubc18\ud658\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 500\n", + "b = a\n", + "print id(a)\n", + "print id(b)\n", + "print\n", + "x = 1\n", + "y = 1\n", + "print id(x)\n", + "print id(y)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "4478569376\n", + "4478569376\n", + "\n", + "4298182776\n", + "4298182776\n" + ] + } + ], + "prompt_number": 58 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- is \ud0a4\uc6cc\ub4dc: \ub450 \uac1d\uccb4\uc758 \uc2dd\ubcc4\uc790\uac00 \ub3d9\uc77c\ud55c\uc9c0 \ud14c\uc2a4\ud2b8\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "c = [1,2,3]\n", + "d = [1,2,3]\n", + "print c is d\n", + "\n", + "a = 500\n", + "b = a\n", + "print a is b\n", + "\n", + "x = 1\n", + "y = 1\n", + "print x is y\n", + "\n", + "e = f = [4,5,6]\n", + "print e is f" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "False\n", + "True\n", + "True\n", + "True\n" + ] + } + ], + "prompt_number": 60 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- == \uc5f0\uc0b0\uc790: \ub450 \uac1d\uccb4\uc758 \uac12\uc774 \ub3d9\uc77c\ud55c\uc9c0\ub97c \ud14c\uc2a4\ud2b8\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "c = [1,2,3]\n", + "d = [1,2,3]\n", + "c == d" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 150, + "text": [ + "True" + ] + } + ], + "prompt_number": 150 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python05.ipynb b/python3.6/python05.ipynb new file mode 100644 index 0000000..2d41fdc --- /dev/null +++ b/python3.6/python05.ipynb @@ -0,0 +1,734 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:7cd7f3f2924b132a4999a6a44ccc57b6b4603c593c705bafa1e22da085a44552" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 5. \ud30c\uc774\uc36c\uc758 \uac01\uc885 \uc5f0\uc0b0\uc790\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \uc0b0\uc220 \uc5f0\uc0b0\uc790\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| \uc5f0\uc0b0\uc790 | \uc6b0\uc120\uc21c\uc704 | \uc124\uba85 | \uacb0\ud569\uc21c\uc11c |\n", + "|:------:|:------:|:-----------------:|:-----------:|\n", + "| +, - | 1 | \ub2e8\ud56d \uc5f0\uc0b0\uc790 | - | \n", + "| ** | 2 |\uc9c0\uc218 \uc5f0\uc0b0\uc790 | \uc67c\ucabd <- \uc624\ub978\ucabd | \n", + "| *,/,%,// | 3 |\uacf1\ud558\uae30,\ub098\ub204\uae30,\ub098\uba38\uc9c0,\ubaab | \uc67c\ucabd -> \uc624\ub978\ucabd | \n", + "| +, - | 4 |\ub354\ud558\uae30,\ube7c\uae30 | \uc67c\ucabd -> \uc624\ub978\ucabd |" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 2 ** 3\n", + "print 5 % 2\n", + "print -5 % 2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "8\n", + "1\n", + "1\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 3 + 5\n", + "print 3 + 5.0 # \uc815\uc218 + \uc2e4\uc218\uc758 \uacb0\uacfc\ub294 \uc2e4\uc218" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "8\n", + "8.0\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 5 / 2.0 # \uc815\uc218 / \uc2e4\uc218\uc758 \uacb0\uacfc\ub294 \uc2e4\uc218\n", + "print 5 / 2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2.5\n", + "2\n" + ] + } + ], + "prompt_number": 64 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 5 / 3\n", + "b = 5 % 3\n", + "\n", + "print a, b\n", + "\n", + "print divmod(5,3)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 2\n", + "(1, 2)\n" + ] + } + ], + "prompt_number": 44 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 5 / 3\n", + "print 5 // 3" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1\n", + "1\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub2e8\ud56d \uc5f0\uc0b0\uc790(-)\uc758 \uc6b0\uc120\uc21c\uc704\uac00 \uc774\ud56d \uc5f0\uc0b0\uc790(/)\uc758 \uc6b0\uc120\uc21c\uc704\ubcf4\ub2e4 \ub192\ub2e4" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print -7/4 # -7\uc744 4\ub85c \ub098\ub208\ub2e4\n", + "print -(7/4) " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "-2\n", + "-1\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 2 + 3 * 4\n", + "print (2 + 3) * 4" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "14\n", + "20\n" + ] + } + ], + "prompt_number": 51 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 4 / 2 * 2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "4\n" + ] + } + ], + "prompt_number": 53 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- ** \uc5f0\uc0b0\uc790\uc758 \uacb0\ud569\uc21c\uc11c\ub294 \uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 2 ** 3 ** 2\n", + "print (2 ** 3) ** 2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "512\n", + "64\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \uad00\uacc4 \uc5f0\uc0b0\uc790\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uad00\uacc4 \uc5f0\uc0b0\uc790: \uac1d\uccb4\uac00 \uc9c0\ub2cc \uac12\uc758 \ud06c\uae30(\ub300\uc18c)\ub97c \ube44\uad50\ud558\uc5ec True \ub610\ub294 False\ub97c \ubc18\ud658\ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 6 == 9\n", + "print 6 != 9\n", + "print 1 > 3\n", + "print 4 <= 5\n", + "\n", + "a = 5\n", + "b = 10\n", + "print a < b" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "False\n", + "True\n", + "False\n", + "True\n", + "True\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 5\n", + "b = 10\n", + "print 0 < a < b" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 5\n", + "b = 10\n", + "print 0 < a and a < b" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ubb38\uc790\uc5f4, \ud29c\ud50c, \ub9ac\uc2a4\ud2b8\uc758 \uad00\uacc4 \uc5f0\uc0b0 \ube44\uad50\ub294 \uc77c\ubc18 \uc0ac\uc804 \uc21c\uc11c \n", + "- \uc0ac\uc804\uc5d0\uc11c \uc55e\uc5d0 \ub098\uc624\ub294 \uac12\uc774 \uc791\uc740 \uac12\uc73c\ub85c \ud3c9\uac00\ub428" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 'abcd' > 'abd' \n", + "print (1, 2, 4) < (2, 1, 0) \n", + "print [1, 3, 2] == [1, 2, 3]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "False\n", + "True\n", + "False\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc11c\ub85c \ub2e4\ub978 \uc790\ub8cc\ud615\uac04\uc758 \ud06c\uae30 \uad00\uacc4\n", + " - \uc22b\uc790 < \uc0ac\uc804 < \ub9ac\uc2a4\ud2b8 < \ubb38\uc790\uc5f4 < \ud29c\ud50c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 9999999999999999999999L < 'abc'\n", + "print {3:2} < [1,2,3] < (1,2,3)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n", + "True\n" + ] + } + ], + "prompt_number": 64 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [1,2,3, 'abc', 'a', 'z', (1,2,3), [1,2,3], {1:2}, ['abc']]\n", + "L.sort()\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 2, 3, {1: 2}, [1, 2, 3], ['abc'], 'a', 'abc', 'z', (1, 2, 3)]\n" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "x = [1,2,3]\n", + "y = [1,2,3]\n", + "z = y\n", + "\n", + "print x == y\n", + "print x == z\n", + "print x is y\n", + "print x is z\n", + "print y is z" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n", + "True\n", + "False\n", + "False\n", + "True\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/objectIdentity.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 \ub17c\ub9ac \uc5f0\uc0b0\uc790 (or \ubd80\uc6b8 \uc5f0\uc0b0\uc790)\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud53c\uc5f0\uc0b0\uc790\uc758 \uac12\uc73c\ub85c \uc9c4\ub9ac\uac12\uc778 True \ub610\ub294 False\uc744 \ucde8\ud558\uc5ec \ub17c\ub9ac \uc801\uc778 \uacc4\uc0b0\uc744 \uc218\ud589\ud558\ub294 \uc5f0\uc0b0\uc790\n", + " - and\n", + " - or\n", + " - not\n", + "- [\uc8fc\uc758] \ub17c\ub9ac \uc5f0\uc0b0\uc790 \uc790\uccb4\uac00 \uac12\uc744 \ubc18\ud658\ud558\uc9c0\ub294 \uc54a\ub294\ub2e4. \n", + " - \ub17c\ub9ac \uc5f0\uc0b0\uc744 \ub530\ub77c \ucd5c\uc885\uc801\uc73c\ub85c \ud3c9\uac00(Evaluation)\ub418\uc5b4\uc9c4 \uac12\uc774 \ubc18\ud658\ub41c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 20\n", + "b = 30\n", + "print a > 10 and b < 50" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc9c4\ub9ac\uac12\uc5d0 \ud574\ub2f9\ud558\ub294 True\uc640 False\ub294 \ub2e4\ub978 \uc0ac\uce59\uc5f0\uc0b0\uc790\ub97c \ub9cc\ub098\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ud3c9\uac00\ub428\n", + " - True: 1\n", + " - False: 0" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print True + 1\n", + "print False + 1\n", + "print False * 75\n", + "print True * 75" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n", + "1\n", + "0\n", + "75\n" + ] + } + ], + "prompt_number": 77 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- bool() \ub0b4\uc7a5 \ud568\uc218\ub97c \uc774\uc6a9\ud574\uc11c \uc218\uce58 \uac12\uc744 \uc9c4\ub9ac \uac12\uc73c\ub85c \uad50\ud658 \uac00\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print bool(0) # \uc815\uc218 0\uc740 \uac70\uc9d3\n", + "print bool(1)\n", + "print bool(100)\n", + "print bool(-100)\n", + "print\n", + "print bool(0.0) # \uc2e4\uc218 0.0\uc740 \uac70\uc9d3\n", + "print bool(0.1)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "False\n", + "True\n", + "True\n", + "True\n", + "\n", + "False\n", + "True\n" + ] + } + ], + "prompt_number": 82 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uac12\uc774 \uc5c6\ub294 \ube48 \uac1d\uccb4\ub098 None \uac1d\uccb4\ub294 False\ub85c \ud3c9\uac00\ub428" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print bool('abc')\n", + "print bool('')\n", + "print\n", + "print bool([]) # \uacf5 \ub9ac\uc2a4\ud2b8\ub294 \uac70\uc9d3\n", + "print bool([1,2,3])\n", + "print \n", + "print bool(()) # \uacf5 \ud29c\ud50c\uc740 \uac70\uc9d3\n", + "print bool((1,2,3))\n", + "print \n", + "print bool({}) # \uacf5 \uc0ac\uc804\uc740 \uac70\uc9d3\n", + "print bool({1:2})\n", + "print\n", + "print bool(None) # None \uac1d\uccb4\ub294 \uac70\uc9d3" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n", + "False\n", + "\n", + "False\n", + "True\n", + "\n", + "False\n", + "True\n", + "\n", + "False\n", + "True\n", + "\n", + "False\n" + ] + } + ], + "prompt_number": 81 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 1 and 1\n", + "print 1 and 0\n", + "print 0 or 0 \n", + "print 1 or 0\n", + "print \n", + "print [] or 1 # [] \uac70\uc9d3\n", + "print [] or () # [], () \uac70\uc9d3\n", + "print [] and 1 # [] \uac70\uc9d3\uc774\ubbc0\ub85c 1\uc740 \ucc38\uc870\ud560 \ud544\uc694 \uc5c6\uc74c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1\n", + "0\n", + "0\n", + "1\n", + "\n", + "1\n", + "()\n", + "[]\n" + ] + } + ], + "prompt_number": 85 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 1 and 2 \n", + "print 1 or 2\n", + "print \n", + "print [[]] or 1 # [[]] \ucc38\uc73c\ub85c \uac04\uc8fc\n", + "print [{}] or 1 # [{}] \ucc38\uc73c\ub85c \uac04\uc8fc\n", + "print '' or 1 # \ube48 \ubb38\uc790\uc5f4('')\uc740 \uac70\uc9d3" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n", + "1\n", + "\n", + "[[]]\n", + "[{}]\n", + "1\n" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print not(True)\n", + "print not(1 and 2)\n", + "print not('' or 1)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "False\n", + "False\n", + "False\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## [\ucc38\uace0] \uc5f0\uc0b0\uc790 \uc6b0\uc120 \uc21c\uc704 \ud45c\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc5f0\uc0b0\uc790 \uc6b0\uc120 \uc21c\uc704 \ud45c: https://wikidocs.net/1165\n", + "- \uc2e4\uc81c \ucf54\ub4dc \uac1c\ubc1c\uc744 \ud560 \ub54c\uc5d0\ub294 \uc5f0\uc0b0\uc790 \uc6b0\uc120 \uc21c\uc704\uc5d0 \ub9ce\uc740 \uc758\uc874 \uc5c6\uc774 \uad04\ud638(())\ub97c \uc801\uc808\ud558\uac8c \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ub192\uc774\ub294 \uac83\uc774 \uc88b\ub2e4." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python06.ipynb b/python3.6/python06.ipynb new file mode 100644 index 0000000..5b723b0 --- /dev/null +++ b/python3.6/python06.ipynb @@ -0,0 +1,1104 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:6f27a552542890768672efb0fe113387ea0d8e173bd95364d1cec38a4bfa7a1c" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 6. \uc81c\uc5b4\ubb38\uacfc \ud568\uc218 \uae30\ucd08\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \ud30c\uc774\uc36c \uc81c\uc5b4\ubb38\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \ub4e4\uc5ec\uc4f0\uae30\uc640 \uc81c\uc5b4\ubb38" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud30c\uc774\uc36c\uc740 \ub4e4\uc5ec\uc4f0\uae30\ub97c \uac15\uc81c\ud558\uc5ec \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ub192\uc778\ub2e4.\n", + "- \uac00\uc7a5 \ubc14\uae65\ucabd\uc758 \ucf54\ub4dc\ub294 \ubc18\ub4dc\uc2dc 1\uc5f4\uc5d0 \uc2dc\uc791\ud55c\ub2e4.\n", + "- \ube14\ub85d \ub0b4\ubd80\uc5d0 \uc788\ub294 statement\ub4e4\uc740 \ub3d9\uc77c\ud55c \uc5f4\uc5d0 \uc704\uce58\ud574\uc57c \ud55c\ub2e4.\n", + "- \ube14\ub85d\uc758 \ub05d\uc740 \ub4e4\uc5ec\uc4f0\uae30\uac00 \ub05d\ub098\ub294 \ubd80\ubd84\uc73c\ub85c \uac04\uc8fc\ub41c\ub2e4.\n", + " - python\uc5d0\ub294 {, }, begin, end \ub4f1\uc758 \ud0a4\uc6cc\ub4dc\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4.\n", + "- \ub4e4\uc5ec\uc4f0\uae30\ub97c \ud560 \ub54c\uc5d0\ub294 \ud0ed\uacfc \uacf5\ubc31\uc744 \uc11e\uc5b4 \uc4f0\uc9c0 \uc54a\ub294\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 1 # \uc131\uacf5\n", + " a = 1 # \uc2e4\ud328" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "IndentationError", + "evalue": "unexpected indent (, line 2)", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m a = 1 # \uc2e4\ud328\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" + ] + } + ], + "prompt_number": 160 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "if a > 1:\n", + " print 'big'\n", + " print 'really?'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "IndentationError", + "evalue": "unexpected indent (, line 3)", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m3\u001b[0m\n\u001b[0;31m print 'really?'\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" + ] + } + ], + "prompt_number": 161 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 if\ubb38\n", + "- if\ubb38\uc758 \ud615\uc2dd\n", + "\n", + "> if \uc870\uac74\uc2dd1:\n", + "\n", + ">   statements\n", + "\n", + "> elif \uc870\uac74\uc2dd2:\n", + "\n", + ">   statements\n", + "\n", + "> elif \uc870\uac74\uc2dd3:\n", + "\n", + ">   statements\n", + "\n", + "> else:\n", + "\n", + ">   statements\n", + "\n", + "- \uc870\uac74\uc2dd\uc774\ub098 else \ub2e4\uc74c\uc5d0 \ucf5c\ub860(:) \ud45c\uae30 \ud544\uc694\n", + "- \ub4e4\uc5ec\uc4f0\uae30(indentation)\ub97c \uc798 \uc9c0\ucf1c\uc57c \ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "score = 90\n", + "if score >= 90:\n", + " print 'Congratulations!!! '" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Congratulations!!! \n" + ] + } + ], + "prompt_number": 153 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 10\n", + "if a > 5:\n", + " print 'Big'\n", + "else:\n", + " print 'Small'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Big\n" + ] + } + ], + "prompt_number": 61 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- statement\uac00 1\uac1c\uc778 \uacbd\uc6b0 \uc870\uac74\uc2dd\uacfc \ud55c \uc904\uc5d0 \uc704\uce58 \uac00\ub2a5 (\ucd94\ucc9c\ud558\uc9c0\ub294 \uc54a\uc74c)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 10\n", + "if a > 5: print 'Big'\n", + "else: print 'Small'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Big\n" + ] + } + ], + "prompt_number": 155 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "n = -2\n", + "if n > 0:\n", + " print 'Positive'\n", + "elif n < 0:\n", + " print 'Negative'\n", + "else:\n", + " print 'Zero'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Negative\n" + ] + } + ], + "prompt_number": 156 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "order = 'spagetti'\n", + "\n", + "if order == 'spam':\n", + " price = 500\n", + "elif order == 'ham':\n", + " price = 700\n", + "elif order == 'egg':\n", + " price = 300\n", + "elif order == 'spagetti':\n", + " price = 900\n", + " \n", + "print price" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "900\n" + ] + } + ], + "prompt_number": 65 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc704 \ucf54\ub4dc\uc640 \ub3d9\uc77c\ud55c dictionary \uc790\ub8cc\uad6c\uc870\ub97c \uc0ac\uc6a9\ud55c \ucf54\ub4dc" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "order = 'spagetti'\n", + "menu = {'spam':500, 'ham':700, 'egg':300, 'spagetti':900}\n", + "price = menu[order]\n", + "print price" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "900\n" + ] + } + ], + "prompt_number": 66 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 for\ubb38\n", + "\n", + "> for <\ud0c0\uac9f> in <\ucee8\ud14c\uc774\ub108 \uac1d\uccb4>:\n", + "\n", + ">   statements\n", + "\n", + "> else:\n", + "\n", + ">   statements" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = ['cat', 'cow', 'tiger']\n", + "for x in a:\n", + " print len(x), x" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "3 cat\n", + "3 cow\n", + "5 tiger\n" + ] + } + ], + "prompt_number": 168 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for x in [1,2,3]:\n", + " print x," + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 2 3\n" + ] + } + ], + "prompt_number": 169 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print range(10)\n", + "\n", + "for x in range(10):\n", + " print x," + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "0 1 2 3 4 5 6 7 8 9\n" + ] + } + ], + "prompt_number": 172 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "sum = 0\n", + "for x in range(1, 11):\n", + " sum = sum + x\n", + " \n", + "print sum" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "55\n" + ] + } + ], + "prompt_number": 174 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "prod = 1\n", + "for x in range(1, 11):\n", + " prod = prod * x\n", + " \n", + "print prod" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "3628800\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- enumerate() \ub0b4\uc7a5 \ud568\uc218: \ucee8\ud14c\uc774\ub108 \uac1d\uccb4\uac00 \uc9c0\ub2cc \uac01 \uc694\uc18c\uac12\ubfd0\ub9cc \uc544\ub2c8\ub77c \uc778\ub371\uc2a4 \uac12\ub3c4 \ud568\uaed8 \ubc18\ud658\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "l = ['cat', 'dog', 'bird', 'pig']\n", + "for k, animal in enumerate(l):\n", + " print k, animal" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0 cat\n", + "1 dog\n", + "2 bird\n", + "3 pig\n" + ] + } + ], + "prompt_number": 67 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t = ('cat', 'dog', 'bird', 'pig')\n", + "for k, animal in enumerate(t):\n", + " print k, animal" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0 cat\n", + "1 dog\n", + "2 bird\n", + "3 pig\n" + ] + } + ], + "prompt_number": 68 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d = {'c':'cat', 'd':'dog', 'b':'bird', 'p':'pig'}\n", + "for k, key in enumerate(d):\n", + " print k, key, d[key]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0 p pig\n", + "1 c cat\n", + "2 b bird\n", + "3 d dog\n" + ] + } + ], + "prompt_number": 71 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- break: \ub8e8\ud504\ub97c \ube60\uc838\ub098\uac04\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for x in range(10):\n", + " if x > 3: \n", + " break\n", + " print x\n", + " \n", + "print 'done'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "done\n" + ] + } + ], + "prompt_number": 176 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- continue: \ub8e8\ud504 \ube14\ub85d \ub0b4\uc758 continue \uc774\ud6c4 \ubd80\ubd84\uc740 \uc218\ud589\ud558\uc9c0 \uc54a\uace0 \ub8e8\ud504\uc758 \uc2dc\uc791\ubd80\ubd84\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for x in range(10):\n", + " if x < 8:\n", + " continue\n", + " print x\n", + " \n", + "print 'done'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "8\n", + "9\n", + "done\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- else: \ub8e8\ud504\uac00 break\uc5d0 \uc758\ud55c \uc911\ub2e8 \uc5c6\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ubaa8\ub450 \uc218\ud589\ub418\uba74 else \ube14\ub85d\uc774 \uc218\ud589\ub41c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for x in range(10):\n", + " print x, # \ucf64\ub9c8(,) \ub54c\ubb38\uc5d0 \uc904\uc774 \ubc14\ub00c\uc9c0 \uc54a\ub294\ub2e4.\n", + "else:\n", + " print 'else block'\n", + "\n", + "print 'done'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0 1 2 3 4 5 6 7 8 9 else block\n", + "done\n" + ] + } + ], + "prompt_number": 73 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- break\uc5d0 \uc758\ud558\uc5ec \ub8e8\ud504\ub97c \ube60\uc838\ub098\uac00\uba74 else \ube14\ub85d\ub3c4 \uc218\ud589\ub418\uc9c0 \uc54a\ub294\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for x in range(10):\n", + " break\n", + " print x,\n", + "else:\n", + " print 'else block'\n", + " \n", + "print 'done'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "done\n" + ] + } + ], + "prompt_number": 179 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- for \ub8e8\ud504\uc758 \uc911\ucca9" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for x in range(2, 4):\n", + " for y in range(2, 10):\n", + " print x, '*', y, '=', x*y\n", + " print" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2 * 2 = 4\n", + "2 * 3 = 6\n", + "2 * 4 = 8\n", + "2 * 5 = 10\n", + "2 * 6 = 12\n", + "2 * 7 = 14\n", + "2 * 8 = 16\n", + "2 * 9 = 18\n", + "\n", + "3 * 2 = 6\n", + "3 * 3 = 9\n", + "3 * 4 = 12\n", + "3 * 5 = 15\n", + "3 * 6 = 18\n", + "3 * 7 = 21\n", + "3 * 8 = 24\n", + "3 * 9 = 27\n", + "\n" + ] + } + ], + "prompt_number": 182 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 while\ubb38" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- while \uc870\uac74\uc2dd\uc774 \ub9cc\uc871\ud558\ub294 \ub3d9\uc548 while \ube14\ub85d\ub0b4\uc758 statements \ub4e4\uc744 \ubc18\ubcf5 \uc218\ud589\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "count = 1\n", + "while count < 11:\n", + " print count\n", + " count = count + 1" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "10\n" + ] + } + ], + "prompt_number": 183 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "sum = 0\n", + "a = 0\n", + "while a < 10:\n", + " a = a + 1\n", + " sum = sum + a\n", + "print sum" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "55\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "x = 0\n", + "while x < 10:\n", + " print x, # \ucf64\ub9c8(,) \ub54c\ubb38\uc5d0 \uc904\uc774 \ubc14\ub00c\uc9c0 \uc54a\ub294\ub2e4.\n", + " x = x + 1\n", + "else:\n", + " print 'else block'\n", + "\n", + "print 'done'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0 1 2 3 4 5 6 7 8 9 else block\n", + "done\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ud30c\uc774\uc36c \ud568\uc218 \uae30\ucd08\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1. \ud568\uc218\uc758 \uc7a5\uc810 \ubc0f \ud568\uc218 \uc0ac\uc6a9\ubc95\n", + "- \ud568\uc218\uc758 \uc7a5\uc810\n", + " - \ud568\uc218\ub294 \ubc18\ubcf5\uc801\uc778 \ucf54\ub4dc\ub97c \uc5c6\uc5d0 \uc8fc\uc5b4 \ucf54\ub4dc\uc758 \uae38\uc774\ub97c \uc9e7\uac8c \ub9cc\ub4e4\uc5b4 \uc900\ub2e4.\n", + " - \ucf54\ub4dc\uc758 \uc720\uc9c0\ubcf4\uc218\ub97c \uc27d\uac8c \ub9cc\ub4e4\uc5b4 \uc900\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "print add(3, 4)\n", + "\n", + "print add([1,2,3], [4,5,6])" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "7\n", + "[1, 2, 3, 4, 5, 6]\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "c = add(10, 30)\n", + "print c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "40\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \uc774\ub984\uc5d0 \uc800\uc7a5\ub41c \ub808\ud37c\ub7f0\uc2a4\ub97c \ub2e4\ub978 \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud558\uc5ec \uadf8 \ubcc0\uc218\ub97c \uc774\uc6a9\ud55c \ud568\uc218 \ud638\ucd9c \uac00\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = add\n", + "print f(4, 5)\n", + "\n", + "print f\n", + "\n", + "print f is add" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "9\n", + "\n", + "True\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218\uc758 \ubab8\uccb4\uc5d0\ub294 \ucd5c\uc18c\ud55c \ud55c\uac1c \uc774\uc0c1\uc758 statement\uac00 \uc874\uc7ac\ud574\uc57c \ud568\n", + " - \uadf8\ub7ec\ubbc0\ub85c, \uc544\ubb34\ub7f0 \ub0b4\uc6a9\uc774 \uc5c6\ub294 \ubab8\uccb4\ub97c \uc9c0\ub2cc \ud568\uc218\ub97c \ub9cc\ub4e4 \ub54c\uc5d0\ub294 pass \ub77c\ub294 \ud0a4\uc6cc\ub4dc\ub97c \ubab8\uccb4\uc5d0 \uc801\uc5b4\uc8fc\uc5b4\uc57c \ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def simple():\n", + " pass\n", + "\n", + "print simple()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "None\n" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218\uc5d0\uc11c \ub2e4\ub978 \ud568\uc218 \ud638\ucd9c \uac00\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "def myabs(x):\n", + " if x < 0: \n", + " x = -x\n", + " return x\n", + "\n", + "def addabs(a, b):\n", + " c = add(a, b)\n", + " return myabs(c)\n", + "\n", + "print addabs(-5, -7)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "12\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc778\uc790\uc758 \uc774\ub984\uacfc \ud568\uaed8 \uc778\uc790 \uac12\uc744 \ub118\uaca8\uc904 \uc218 \uc788\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def minus(a, b):\n", + " return a - b\n", + "print minus(a=12, b=20)\n", + "print minus(b=20, a=12)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "-8\n", + "-8\n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc778\uc790\uc758 \ub514\ud3f4\ud2b8 \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def incr(x, y=1):\n", + " return x + y\n", + "\n", + "print incr(5)\n", + "\n", + "print incr(5, 10)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "6\n", + "15\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub450 \uac1c \uc774\uc0c1\uc758 \uac12\uc744 \ub3d9\uc2dc\uc5d0 \ubc18\ud658\ud560 \uc218 \uc788\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def calc(x, y):\n", + " return x + y, x - y, x * y, x / y\n", + "\n", + "print calc(10, 2)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "(12, 8, 20, 5)\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \ud568\uc218 \ud638\ucd9c\uc2dc \ub3d9\uc801\uc778 \uc790\ub8cc\ud615 \uacb0\uc815" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud30c\uc774\uc36c\uc5d0\uc11c\ub294 \ubaa8\ub4e0 \uac1d\uccb4\ub294 \ub3d9\uc801\uc73c\ub85c (\uc2e4\ud589\uc2dc\uac04\uc5d0) \uadf8 \ud0c0\uc785\uc774 \uacb0\uc815\ub41c\ub2e4.\n", + " - \ud568\uc218 \uc778\uc790\ub294 \ud568\uc218\uac00 \ud638\ucd9c\ub418\ub294 \uc21c\uac04 \ud574\ub2f9 \uc778\uc790\uc5d0 \uc804\ub2ec\ub418\ub294 \uac1d\uccb4\uc5d0 \ub530\ub77c \uadf8 \ud0c0\uc785\uc774 \uacb0\uc815\ub41c\ub2e4.\n", + " - \ud568\uc218 \ubab8\uccb4 \ub0b4\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \uc5ec\ub7ec \uac00\uc9c0 \uc5f0\uc0b0\uc790\ub4e4\uc740 \ud568\uc218 \ud638\ucd9c\uc2dc\uc5d0 \uacb0\uc815\ub41c \uac1d\uccb4 \ud0c0\uc785\uc5d0 \ub9de\uac8c \uc2e4\ud589\ub41c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "c = add(1, 3.4)\n", + "d = add('dynamic', 'typing')\n", + "e = add(['list'], ['and', 'list'])\n", + "print c\n", + "print d\n", + "print e" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "4.4\n", + "dynamictyping\n", + "['list', 'and', 'list']\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 \uc7ac\uadc0\uc801 \ud568\uc218 \ud638\ucd9c\n", + "- \uc7ac\uadc0(Recursive) \ud568\uc218: \ud568\uc218 \ubab8\uccb4\uc5d0\uc11c \uc790\uae30 \uc790\uc2e0\uc744 \ud638\ucd9c\ud558\ub294 \ud568\uc218\n", + " - \uc218\ud559\uc5d0\uc11c \uc810\ud654\uc2dd\uacfc \uc720\uc0ac\ud55c \ucf54\ub4dc\n", + " - \ubc18\ub4dc\uc2dc \uc885\uacb0 \uc870\uac74 \ubc0f \uc885\uacb0 \uc870\uac74\uc774 \ub9cc\uc871\ud560 \ub54c\uc758 \ubc18\ud658 \uac12\uc774 \uc788\uc5b4\uc57c \ud55c\ub2e4.\n", + "\n", + "- 1\ubd80\ud130 N\uae4c\uc9c0 \ub354\ud558\ub294 \uc7ac\uadc0 \ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def sum(N):\n", + " if N == 1: # \uc885\uacb0 \uc870\uac74\n", + " return 1 # \uc885\uacb0 \uc870\uac74\uc774 \ub9cc\uc871\ud560 \ub54c\uc758 \ubc18\ud658 \uac12\n", + " return N + sum(N-1) # \uc7ac\uadc0 \ud638\ucd9c\n", + "\n", + "print sum(10)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "55\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python07.ipynb b/python3.6/python07.ipynb new file mode 100644 index 0000000..91eb40f --- /dev/null +++ b/python3.6/python07.ipynb @@ -0,0 +1,853 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 7. 문자열 정의 및 기초 연산\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 시퀀스 자료형의 지원 연산\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 시퀀스 자료형이란?\n", + "- 저장된 각 요소를 정수 Index를 이용하여 참조가 가능한 자료형 \n", + "- 시퀀스(Sequence) 자료형: 문자열, 리스트, 튜플" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = 'abcdef'\n", + "L = [100,200,300]\n", + "t = ('tuple', 'object', 1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 시퀀스 자료형이 가지는 공통적인 연산\n", + " - 인덱싱 (Indexing)\n", + " - 슬라이싱 (Slicing)\n", + " - 확장 슬라이싱 (Extended Slicing)\n", + " - 연결 (Concatenation)\n", + " - 반복 (Repitition)\n", + " - 멤버쉽 테스트 (Membership Test)\n", + " - 길이 정보 (Length)\n", + " - for ~ in 문" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 인덱싱" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a\n", + "b\n", + "f\n", + "\n", + "200\n", + "900\n" + ] + } + ], + "source": [ + "s = 'abcdef'\n", + "l = [100, 200, 300]\n", + "print s[0]\n", + "print s[1]\n", + "print s[-1]\n", + "print\n", + "print l[1]\n", + "l[1] = 900\n", + "print l[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "IndexError", + "evalue": "list index out of range", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m: list index out of range" + ] + } + ], + "source": [ + "print l[100]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 슬라이싱\n", + "- L[start:end]: start는 inclusive, end는 exclusive" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bc\n", + "bcdef\n", + "abcdef\n", + "abcdef\n", + "\n", + "[100, 200]\n", + "[100, 200]\n" + ] + } + ], + "source": [ + "s = 'abcdef'\n", + "L = [100, 200, 300]\n", + "\n", + "print s[1:3]\n", + "print s[1:]\n", + "print s[:]\n", + "print s[-100:100]\n", + "print\n", + "print L[:-1] # L[:2] 와 동일\n", + "print L[:2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 확장 슬라이싱\n", + "- L[start:end:step]: 인덱싱되어지는 각 원소들 사이의 거리가 인덱스 기준으로 step 만큼 떨어짐 " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ac\n", + "dcba\n" + ] + } + ], + "source": [ + "s = 'abcd'\n", + "print s[::2] #step:2 - 각 원소들 사이의 거리가 인덱스 기준으로 2가 됨\n", + "print s[::-1] #step:-1 - 왼쪽 방향으로 1칸씩" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 연결하기" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abcdef\n", + "[1, 2, 3, 4, 5, 6]\n" + ] + } + ], + "source": [ + "s = 'abc' + 'def'\n", + "print s\n", + "\n", + "L = [1,2,3] + [4,5,6]\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-6 반복하기" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abcabcabcabc\n", + "[1, 2, 3, 1, 2, 3]\n" + ] + } + ], + "source": [ + "s = 'abc'\n", + "print s * 4\n", + "\n", + "L = [1,2,3]\n", + "print L * 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-7 멤버십 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "s = 'abcde'\n", + "print 'c' in s\n", + "\n", + "t = (1,2,3,4,5)\n", + "print 2 in t\n", + "print 10 in t\n", + "print 10 not in t" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "print 'ab' in 'abcd'\n", + "print 'ad' in 'abcd'\n", + "print ' ' in 'abcd'\n", + "print ' ' in 'abcd '" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-8 길이 정보" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n", + "3\n", + "4\n" + ] + } + ], + "source": [ + "s = 'abcde'\n", + "l = [1,2,3]\n", + "t = (1, 2, 3, 4)\n", + "print len(s)\n", + "print len(l)\n", + "print len(t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-9 for~in 문" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a b c d\n" + ] + } + ], + "source": [ + "for c in 'abcd':\n", + " print c," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 문자열 정의하기\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 한 줄 문자열" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = ''\n", + "str1 = 'Python is great!'\n", + "str2 = \"Yes, it is.\"\n", + "str3 = \"It's not like any other languages\"" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Don't walk. \"Run\"\n" + ] + } + ], + "source": [ + "str4 = 'Don\\'t walk. \"Run\"'\n", + "print str4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \\ : 다음 라인이 현재 라인의 뒤에 이어짐을 나타냄 " + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is a rather long string containing back slash and new line.\n", + "Good!\n" + ] + } + ], + "source": [ + "long_str = \"This is a rather long string \\\n", + "containing back slash and new line.\\nGood!\"\n", + "print long_str" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 여러 줄 문자열" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " While the rest of the world has been catching on to\n", + "the Perl scripting language, the Linux commnunity,\n", + "long since past the pleasing shock of Perl's power,\n", + "has been catching on to a different scripting animal -- Python.\n", + "\n", + " While the rest of the world has been catching on to\n", + "the Perl scripting language, the Linux commnunity,\n", + "long since past the pleasing shock of Perl's power,\n", + "has been catching on to a different scripting animal -- Python.\n" + ] + } + ], + "source": [ + "multiline = \"\"\" While the rest of the world has been catching on to\n", + "the Perl scripting language, the Linux commnunity,\n", + "long since past the pleasing shock of Perl's power,\n", + "has been catching on to a different scripting animal -- Python.\"\"\"\n", + "print multiline\n", + "print\n", + "ml = ''' While the rest of the world has been catching on to\n", + "the Perl scripting language, the Linux commnunity,\n", + "long since past the pleasing shock of Perl's power,\n", + "has been catching on to a different scripting animal -- Python.'''\n", + "print ml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 이스케이프 문자 (Escape Characters)\n", + "- 문자열 내부의 이스케이프 문자\n", + "\n", + "| 이스케이프 문자 | 의미 |\n", + "|--------------|--------------|\n", + "| \\ \\ | \\ |\n", + "| \\' | ' |\n", + "| \\\" | \" |\n", + "| \\b | 백스페이스 |\n", + "| \\n | 개행 |\n", + "| \\t | 탭 |\n", + "| \\0nn | 8진법 수 nn |\n", + "| \\xnn | 16진법 수 nn |" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\abc\\\n", + "\n", + "abc\tdef\tghi\n", + "\n", + "a\n", + "b\n", + "c\n" + ] + } + ], + "source": [ + "print '\\\\abc\\\\'\n", + "print\n", + "print 'abc\\tdef\\tghi'\n", + "print\n", + "print 'a\\nb\\nc'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 문자열 연산" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "First String Second String\n", + "First StringFirst StringFirst String\n", + "\n", + "r\n", + "irst Strin\n", + "12\n", + "\n", + "First String\n" + ] + } + ], + "source": [ + "str1 = 'First String'\n", + "str2 = 'Second String'\n", + "str3 = str1 + ' ' + str2\n", + "print str3\n", + "print str1 * 3\n", + "print\n", + "print str1[2]\n", + "print str1[1:-1]\n", + "print len(str1)\n", + "print\n", + "print str1[0:len(str1)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열 자료 - Immutable (변경불가능)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'str' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstr1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'f'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" + ] + } + ], + "source": [ + "str1[0] = 'f'" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'str' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstr1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" + ] + } + ], + "source": [ + "str1[0:3] = 'abc'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열 변경을 위해서는 여러 Slicing 연결 활용\n", + " - [주의] 문자열 자체가 변경되는 것이 아니라 새로운 문자열을 생성하여 재할당하는 것임" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "spam, cheese, and egg\n" + ] + } + ], + "source": [ + "s = 'spam and egg'\n", + "s = s[:4] + ', cheese, ' + s[5:]\n", + "print s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 유니코드" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다국어 문자의 올바른 표현을 위하여 유니코드 타입 지원이 됨\n", + "- 유니코드 타입의 문자열 리터럴: u'Hello'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Spam and Egg\n", + "\n", + "\n", + "a\n", + "\n", + "bc\n", + "\n", + "\n", + "abc\n" + ] + } + ], + "source": [ + "print u'Spam and Egg'\n", + "print \n", + "a = 'a'\n", + "b = u'bc'\n", + "print type(a)\n", + "print a\n", + "print type(b)\n", + "print b\n", + "print\n", + "c = a + b # 일반 문자열과 유니코드를 합치면 유니코드로 변환\n", + "print type(c)\n", + "print c" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Spam 또 Egg\n" + ] + } + ], + "source": [ + "print u'Spam \\uB610 Egg' # 문자열 내에 유티코드 이스케이프 문자인 \\uHHHH 사용가능, HHHH는 4자리 16진수 (unicode 포맷)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "한글\n" + ] + } + ], + "source": [ + "a = unicode('한글', 'utf-8') # '한글' 문자열의 인코딩 방식을 'utf-8'형태로 인식시키면서 해당 문자열을 unicode로 변환\n", + "print type(a)\n", + "print a" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22\n", + "8\n", + "8\n" + ] + } + ], + "source": [ + "print len('한글과 세종대왕')\n", + "print len(unicode('한글과 세종대왕', 'utf-8')) #유니코드 타입의 문자열은 한글 문자열 길이를 올바르게 반환함\n", + "print len(u'한글과 세종대왕')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "한\n", + "글\n", + "한글과\n", + "세종대왕\n", + "왕대종세 과글한\n", + "\n", + "한\n", + "글\n", + "한글과\n", + "세종대왕\n", + "왕대종세 과글한\n", + "\n", + "�\n", + "�\n", + "한\n", + "��과 세종대왕\n", + "��쀌녢츄� ��ꀸ꜕�\n", + "\n" + ] + } + ], + "source": [ + "u = unicode('한글과 세종대왕', 'utf-8') #유니코드 타입의 한글 문자열에 대해서는 인덱싱 및 슬라이싱이 올바르게 수행됨 \n", + "print u[0]\n", + "print u[1]\n", + "print u[:3]\n", + "print u[4:]\n", + "print u[::-1]\n", + "print\n", + "u2 = u'한글과 세종대왕' \n", + "print u2[0]\n", + "print u2[1]\n", + "print u2[:3]\n", + "print u2[4:]\n", + "print u2[::-1]\n", + "print \n", + "u3 = '한글과 세종대왕'\n", + "print u3[0]\n", + "print u3[1]\n", + "print u3[:3]\n", + "print u3[4:]\n", + "print u3[::-1]\n", + "print" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python3.6/python08.ipynb b/python3.6/python08.ipynb new file mode 100644 index 0000000..d5aa40c --- /dev/null +++ b/python3.6/python08.ipynb @@ -0,0 +1,675 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 8. 문자열 메소드와 포멧팅\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 문자열 메소드(Methods)\n", + "***" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I LIKE PROGRAMMING.\n", + "i like programming.\n", + "i lIKE pROGRAMMING\n", + "I like programming.\n", + "I Like Programming.\n" + ] + } + ], + "source": [ + "s = 'i like programming.'\n", + "print s.upper()\n", + "print s.upper().lower()\n", + "print 'I Like Programming'.swapcase() # 대문자는 소문자로, 소문자는 대문자로 변환\n", + "print s.capitalize() # 첫 문자를 대문자로 변환\n", + "print s.title() # 각 단어의 첫 문자를 대문자로 변환 " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "\n", + "2\n", + "7\n", + "7\n", + "-1\n", + "\n", + "22\n", + "-1\n" + ] + } + ], + "source": [ + "s = 'i like programming, i like swimming.'\n", + "print s.count('like') # 'like' 문자열이 출현한 횟수를 반환\n", + "print\n", + "print s.find('like') # 'like'의 첫글자 위치 (offset)를 반환\n", + "print s.find('programming') # 'programming'의 첫글자 위치를 반환\n", + "print s.find('programmin') # 'programmin'의 첫글자 위치를 반환\n", + "print s.find('programmii') # 'programmii' 단어는 없기 때문에 -1 반환\n", + "print\n", + "print s.find('like', 3) # offset=3 부터 'like'을 검색하여 'like'의 첫글자 위치 반환 \n", + "print s.find('my') # 'my' 단어는 없기 때문에 -1 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "\n", + "True\n", + "True\n", + "\n" + ] + } + ], + "source": [ + "s = 'i like programming, i like swimming.'\n", + "print s.startswith('i like') # 'i like'로 시작하는 문자열인지 판단\n", + "print s.startswith('I like') # 대소문자 구별\n", + "print\n", + "\n", + "print s.endswith('swimming.') # 'swimming.'로 끝나는 문자열인지 판단\n", + "print s.startswith('progr', 7) # 7번째 문자열이 'progr'로 시작하는지 판단\n", + "print" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "spam and ham\n", + " spam and ham \n", + "spam and ham\n", + "\n", + " spam and ham\n", + "spam and ham \n", + "abc\n", + "abc\n" + ] + } + ], + "source": [ + "u = ' spam and ham '\n", + "print u.strip() # 좌우 공백을 제거하여 새로운 스트링 생성\n", + "print u # 스트링은 변경불가능 \n", + "y = u.strip() # strip()는 새로운 스트링을 생성함\n", + "print y\n", + "print\n", + "\n", + "print u.rstrip() # 오른쪽 공백 제거\n", + "print u.lstrip() # 왼쪽 공백 제거 \n", + "print ' abc '.strip() \n", + "print '><><><>'.strip('<>') # 인자로 주어진 스트링 안에 지정된 모든 문자를 좌우에서 제거" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \t abc \t \n", + "abc\n" + ] + } + ], + "source": [ + "p = ' \\t abc \\t '\n", + "print p\n", + "print p.strip() # \\t도 공백문자이므로 제거됨" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "spam, egg and ham\n", + "spam and ham\n" + ] + } + ], + "source": [ + "u = 'spam and ham'\n", + "print u.replace('spam', 'spam, egg') # replace()는 새로운 스트링을 생성함\n", + "print u" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['spam', 'and', 'ham']\n", + "[' spam ', ' ham ']\n", + "\n", + "['spam', 'and', 'ham', 'egg', 'cheese']\n" + ] + } + ], + "source": [ + "u = ' spam and ham '\n", + "print u.split() # 공백으로 분리 (모든 공백 제거 및 문자열 내의 단어 리스트를 얻을 수 있음)\n", + "print u.split('and') # 'and'로 분리\n", + "print\n", + "\n", + "u2 = 'spam and ham\\tegg\\ncheese'\n", + "print u2.split()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['spam', 'ham', 'egg', 'cheese']\n", + "\n", + "\n", + "spam:ham:egg:cheese\n", + "\n", + "spam,ham,egg,cheese\n", + "\n", + "spam\n", + "ham\n", + "egg\n", + "cheese\n", + "\n" + ] + } + ], + "source": [ + "u = 'spam ham\\tegg\\ncheese'\n", + "t = u.split() # 문자열 내의 단어 리스트 \n", + "print t\n", + "print\n", + "t2 = ':'.join(t) # 리스트 t 내부의 각 원소들을 ':'로 연결한 문자열 반환\n", + "print type(t2)\n", + "print t2\n", + "print\n", + "t3 = \",\".join(t) # 리스트 t 내부의 각 원소들을 ','으로 연결한 문자열 반환\n", + "print t3\n", + "print\n", + "t4 = '\\n'.join(t) # 리스트 t 내부의 각 원소들을 '\\n'으로 연결한 문자열 반환\n", + "print t4\n", + "print" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[u'\\uc2a4\\ud338', u'\\ud584', u'\\uacc4\\ub780', u'\\uce58\\uc988']\n", + "스팸 햄 계란 치즈\n" + ] + } + ], + "source": [ + "u2 = u\"스팸 햄 계란 치즈\"\n", + "t2 = u2.split()\n", + "print t2\n", + "print t2[0], t2[1], t2[2], t2[3]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "['first line', 'second line', 'third line']\n" + ] + } + ], + "source": [ + "lines = '''first line\n", + "second line\n", + "third line'''\n", + "print type(lines)\n", + "lines2 = lines.splitlines() # 문자열을 라인 단위로 분리한 각 원소들을 지닌 리스트 반환\n", + "print type(lines2)\n", + "print lines2" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " spam and egg \n", + "spam and egg \n", + " spam and egg\n" + ] + } + ], + "source": [ + "u = 'spam and egg'\n", + "c = u.center(60) # 60자리를 확보하되 기존 문자열을 가운데 정렬한 새로운 문자열 반환\n", + "print type(c)\n", + "print c\n", + "print u.ljust(60) # 60자리를 확보하되 기존 문자열을 왼쪽 정렬한 새로운 문자열 반환\n", + "print u.rjust(60) # 60자리를 확보하되 기존 문자열을 오른쪽 정렬한 새로운 문자열 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "------------------------spam and egg------------------------\n", + "spam and egg------------------------------------------------\n", + "------------------------------------------------spam and egg\n" + ] + } + ], + "source": [ + "u = 'spam and egg'\n", + "print u.center(60, '-') # 공백에 채워질 문자를 선택할 수 있음\n", + "print u.ljust(60, '-')\n", + "print u.rjust(60, '-')" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n", + "True\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "print '1234'.isdigit() # 문자열 내의 Character들이 모두 숫자인가?\n", + "print 'abcd'.isalpha() # 문자열 내의 Character들이 모두 영문자인가?\n", + "print '1abc234'.isalnum() # 문자열 내의 Character들이 모두 영문자 또는 숫자인가? \n", + "print 'abc'.islower() # 문자열 내의 Character들이 모두 소문자인가?\n", + "print 'ABC'.isupper() # 문자열 내의 Character들이 모두 대문자인가?\n", + "print '\\t\\r\\n'.isspace() # 문자열 내의 Character들이 모두 공백 문자인가?\n", + "print 'This Is A Title'.istitle() # 문자열이 Title 형식 (각 단어의 첫글자가 대문자)인가?" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "00123\n", + "0goofy\n" + ] + } + ], + "source": [ + "s = '123'\n", + "print s.zfill(5) # 5글자 자리 확보뒤 문자열을 쓰되 남는 공백에는 zero (0)를 채움 \n", + "print 'goofy'.zfill(6) # 6글자 자리 확보뒤 ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 문자열 포매팅\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 튜플을 이용한 포매팅" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) 문자열 변환" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 포맷팅 문자\n", + " - 문자열 내에 존재하는 %\n", + "- 포캣팅을 활용한 문자열 변환\n", + " - 포맷팅 문자를 포함하는 문자열 % 튜플" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name = gslee, age = 24\n" + ] + } + ], + "source": [ + "print 'name = %s, age = %s' % ('gslee', '24')" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "안녕하세요 홍길동님,\n", + "\n", + "오늘 밤 파티에 참석해 주실 수 있나요?\n", + "\n", + "그럼..\n", + "\n", + "이강성 드림\n", + "\n", + "\n", + "안녕하세요 한학신님,\n", + "\n", + "오늘 밤 파티에 참석해 주실 수 있나요?\n", + "\n", + "그럼..\n", + "\n", + "이강성 드림\n", + "----------------------------------------\n", + "\n", + "\n", + "안녕하세요 정인숙님,\n", + "\n", + "오늘 밤 파티에 참석해 주실 수 있나요?\n", + "\n", + "그럼..\n", + "\n", + "이강성 드림\n", + "----------------------------------------\n", + "\n", + "\n", + "안녕하세요 박미경님,\n", + "\n", + "오늘 밤 파티에 참석해 주실 수 있나요?\n", + "\n", + "그럼..\n", + "\n", + "이강성 드림\n", + "----------------------------------------\n", + "\n" + ] + } + ], + "source": [ + "letter = '''\n", + "안녕하세요 %s님,\n", + "\n", + "오늘 밤 파티에 참석해 주실 수 있나요?\n", + "\n", + "그럼..\n", + "\n", + "이강성 드림'''\n", + "name = '홍길동'\n", + "print letter % name\n", + "print \n", + "names = ['한학신', '정인숙', '박미경']\n", + "for name in names:\n", + " print letter % name\n", + " print '-' * 40\n", + " print" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 포맷팅 문자" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 포맷팅 문자 | 설명 |\n", + "|-------------|------------------------------------------------------------------------------|\n", + "| %s | 문자열을 포함한 임의의 객체를 문자열로 변환하여 출력 (str() 내장 함수 사용) |\n", + "| %r | 문자열을 포함한 임의의 객체를 문자열로 변환하여 출력 (repr() 내장 함수 사용) |\n", + "| %c | 1글자 문자 (ex. '%c' % 'k) |\n", + "| %d | 10진 정수 (%5d: 5자리를 확보한 후 정수 포맷팅) |\n", + "| %i | %d와 동일 |\n", + "| %u | 부호 없는 정수. 음수는 양수처럼 해석함 (ex. '%u' % -12 --> '4294967284') |\n", + "| %o | 8진수 정수 (ex. '%o' % 13 --> 15) |\n", + "| %x | 16진수 정수 (소문자 표현) (ex. '%x' % 13 --> 'd') |\n", + "| %X | 16진수 정수 (대문자 표현) (ex. '%X' % 13 --> 'D') |\n", + "| %e | 부동 소수점 실수를 지수 형태로 표현 (%.2e: 2자리는 소수점 이하 자리수) |\n", + "| %E | %e 와 동일 (대문자 E 표현) |\n", + "| %f | 부동 소수점 실수 (%5.2f: 소수점 포함 총 5자리 확보한 후 2자리는 소수점 이하 자리수) |\n", + "| %g | 부동 소수점을 편의에 따라 일반 실수 형식이나 지수 형식으로 변환 |\n", + "| %G | %g와 동일 (대문자 E 표현) |" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 2) -- [3, 4, 5] -- 5 -- 5.300000 -- 1.013000e+02\n" + ] + } + ], + "source": [ + "print \"%s -- %s -- %d -- %f -- %e\" % ((1, 2), [3,4,5], 5, 5.3, 101.3)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 5 -- 5.36 -- 1.01e+02\n" + ] + } + ], + "source": [ + "print \"%3d -- %5.2f -- %.2e\" % (5, 5.356, 101.3)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "456 -- 710 -- 1c8 -- 1C8\n" + ] + } + ], + "source": [ + "a = 456\n", + "print '%d -- %o -- %x -- %X' % (a, a, a, a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 사전(Dictionary)을 이용한 포매팅" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "홍길동 -- 5284\n", + "홍길동 -- 5284\n", + "홍길동 -- 5284\n" + ] + } + ], + "source": [ + "print '%(이름)s -- %(전화번호)s' %{'이름':'홍길동', '전화번호':5284}\n", + "print '%(이름)s -- %(전화번호)s' %{'전화번호':5284, '이름':'홍길동'}\n", + "print '%(이름)s -- %(전화번호)s' %{'전화번호':5284, '이름':'홍길동', '주소':'Seoul'}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python3.6/python09.ipynb b/python3.6/python09.ipynb new file mode 100644 index 0000000..9a36ecc --- /dev/null +++ b/python3.6/python09.ipynb @@ -0,0 +1,830 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:c1c3f4f13845f8b92c98b7fdc07017380320b4dfeb43cc5c398d9851cd7751ea" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 9. \ub9ac\uc2a4\ud2b8\uc758 \uae30\ucd08\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \ub9ac\uc2a4\ud2b8 \uc0dd\uc131 \ubc0f \uae30\ubcf8 \uc5f0\uc0b0\n", + "***\n", + "- \ub9ac\uc2a4\ud2b8: \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774\uba74\uc11c \ubcc0\uacbd \uac00\ub2a5(Mutable)\n", + "- \ub9ac\uc2a4\ud2b8\uc5d0\uc11c \uc9c0\uc6d0\ud558\ub294 \uc77c\ubc18\uc801\uc778 \uc5f0\uc0b0\n", + " - \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc5f0\uacb0, \ubc18\ubcf5, \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "l = []\n", + "l = [1, 2, \"Great\"]\n", + "print l[0], l[-1]\n", + "print l[1:3], l[:]\n", + "print\n", + "\n", + "L = range(10)\n", + "print L[::2]\n", + "print\n", + "\n", + "print l * 2\n", + "print l + [3, 4, 5]\n", + "print len(l)\n", + "print\n", + "print 4 in L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 Great\n", + "[2, 'Great'] [1, 2, 'Great']\n", + "\n", + "[0, 2, 4, 6, 8]\n", + "\n", + "[1, 2, 'Great', 1, 2, 'Great']\n", + "[1, 2, 'Great', 3, 4, 5]\n", + "3\n", + "\n", + "True\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Mutable \ud2b9\uc131\uc744 \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8\uc758 \uac12 \ubcc0\uacbd" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = ['spam', 'eggs', 100, 1234]\n", + "a[2] = a[2] + 23\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['spam', 'eggs', 123, 1234]\n" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = ['spam', 'eggs', 123, 1234]\n", + "a[0:2] = [1,12] # \ub3d9\uc77c\ud55c \ud06c\uae30\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658\n", + "print a\n", + "\n", + "a[0:2] = [1] # \uc11c\ub85c \ub2e4\ub978 \ud06c\uae30\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658\n", + "print a\n", + "\n", + "a[0:1] = [1, 2, 3] # \uc11c\ub85c \ub2e4\ub978 \ud06c\uae30\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 12, 123, 1234]\n", + "[1, 123, 1234]\n", + "[1, 2, 3, 123, 1234]\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uc0ad\uc81c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = [1, 12, 123, 1234]\n", + "a[0:2] = []\n", + "\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[123, 1234]\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c \uc0ac\uc774\uc5d0 \uc2ac\ub77c\uc774\uc2a4 \uc0bd\uc785" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = [123, 1234]\n", + "a[1:1] = ['spam', 'ham'] # 1\ubc88\uc9f8 \uc778\ub371\uc2a4\uc5d0 \uc0bd\uc785\n", + "print a\n", + "\n", + "b = [123, 1234] \n", + "b[1:2] = ['spam', 'ham'] # 1\ubc88\uc9f8 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uce58\ud658\n", + "print b\n", + "\n", + "a[:0] = a # \ub9ac\uc2a4\ud2b8 \ub9e8 \uc55e\uc5d0 \uc790\uae30 \uc790\uc2e0\uc744 \uc0bd\uc785\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[123, 'spam', 'ham', 1234]\n", + "[123, 'spam', 'ham']\n", + "[123, 'spam', 'ham', 1234, 123, 'spam', 'ham', 1234]\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- del\uc744 \uc774\uc6a9\ud55c \ub9ac\uc2a4\ud2b8 \uc694\uc18c \uc0ad\uc81c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = [1, 2, 3, 4]\n", + "del a[0]\n", + "print a\n", + "\n", + "del a[1:]\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[2, 3, 4]\n", + "[2]\n" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = range(4)\n", + "print a\n", + "print a[::2]\n", + "\n", + "del a[::2]\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[0, 1, 2, 3]\n", + "[0, 2]\n", + "[1, 3]\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8 \uc790\uccb4\uc5d0 \ub300\ud55c \uc0ad\uc81c\n", + " - \uc815\ud655\ud788\ub294 \ub9ac\uc2a4\ud2b8\ub97c \uac00\ub9ac\ud0a4\ub294 \ub808\ud37c\ub7f0\uc2a4\ub97c \uc9c0\ub2cc \ubcc0\uc218 a \uc0ad\uc81c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = range(5)\n", + "del a\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'a' is not defined", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'a' is not defined" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc911\ucca9 \ub9ac\uc2a4\ud2b8: \ub9ac\uc2a4\ud2b8 \uc548\uc5d0 \uc694\uc18c\ub85c\uc11c \ub9ac\uc2a4\ud2b8\ub97c \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = [1, 2, 3]\n", + "t = ['begin', s, 'end']\n", + "print t\n", + "\n", + "print t[1][1]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['begin', [1, 2, 3], 'end']\n", + "2\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s[1] = 100\n", + "print t" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['begin', [1, 100, 3], 'end']\n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [1, ['a', ['x', 'y'], 'b'], 3]\n", + "print L[0]\n", + "print L[1]\n", + "print L[1][1]\n", + "print L[1][1][1]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1\n", + "['a', ['x', 'y'], 'b']\n", + "['x', 'y']\n", + "y\n" + ] + } + ], + "prompt_number": 22 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- range: \uc21c\ucc28\uc801\uc778 \uc815\uc218 \ub9ac\uc2a4\ud2b8 \ub9cc\ub4e4\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print range(10) # 0(Included)\ubd80\ud130 10(Excluded)\uae4c\uc9c0\n", + "\n", + "print range(5, 15) # 5(Included)\ubd80\ud130 15(Excluded)\uae4c\uc9c0\n", + "\n", + "print range(5, 15, 2) # 0(Included)\ubd80\ud130 10(Excluded)\uae4c\uc9c0, Step: 2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]\n", + "[5, 7, 9, 11, 13]\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for el in range(10):\n", + " print el, 'inch=', el * 2.54, 'centi'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0 inch= 0.0 centi\n", + "1 inch= 2.54 centi\n", + "2 inch= 5.08 centi\n", + "3 inch= 7.62 centi\n", + "4 inch= 10.16 centi\n", + "5 inch= 12.7 centi\n", + "6 inch= 15.24 centi\n", + "7 inch= 17.78 centi\n", + "8 inch= 20.32 centi\n", + "9 inch= 22.86 centi\n" + ] + } + ], + "prompt_number": 80 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "sun, mon, tue, wed, thu, fri, sat = range(7)\n", + "print sun, mon, tue, wed, thu, fri, sat" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0 1 2 3 4 5 6\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8 \uc548\uc758 \uac01 \uc790\ub8cc\uac00 \ud29c\ud50c\uc77c \ub54c for \ubb38\uc744 \uc0ac\uc6a9\ud558\uc5ec \uac12 \ucd94\ucd9c \ubc29\ubc95" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "lt = [('one', 1), ('two', 2), ('three', 3)]\n", + "for t in lt:\n", + " print 'name =', t[0] ,', num =', t[1]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "name = one , num = 1\n", + "name = two , num = 2\n", + "name = three , num = 3\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc544\ub798 \ucf54\ub4dc\uac00 \ub354 \ud6a8\uc728\uc801" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "lt = [('one', 1), ('two', 2), ('three', 3)]\n", + "for t in lt:\n", + " print 'name = %s, num = %s' % t" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "name = one, num = 1\n", + "name = two, num = 2\n", + "name = three, num = 3\n" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- for \ubb38\uc758 \ud5e4\ub354\uc5d0\uc11c \uac01 \ud29c\ud50c\uc758 \uac12 \ucd94\ucd9c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "lt = [('one', 1), ('two', 2), ('three', 3)]\n", + "for name, num in lt:\n", + " print name, num" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "one 1\n", + "two 2\n", + "three 3\n" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8 \uc548\uc758 \uac01 \uc790\ub8cc\uac00 \ub9ac\uc2a4\ud2b8\uc5ec\ub3c4 for \ubb38\uc758 \ud5e4\ub354\uc5d0\uc11c \ub3d9\uc77c\ud558\uac8c \uac12 \ucd94\ucd9c \uac00\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "LL = [['one', 1], ['two', 2], ['three', 3]]\n", + "for name, num in LL:\n", + " print name, num" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "one 1\n", + "two 2\n", + "three 3\n" + ] + } + ], + "prompt_number": 38 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ub9ac\uc2a4\ud2b8 \uba54\uc18c\ub4dc\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 \ub9ac\uc2a4\ud2b8\uac00 \uc9c0\uc6d0\ud558\ub294 \uba54\uc18c\ub4dc" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = [1, 2, 3]\n", + "\n", + "s.append(5) # \ub9ac\uc2a4\ud2b8 \ub9e8 \ub9c8\uc9c0\ub9c9\uc5d0 \uc815\uc218 \uac12 5 \ucd94\uac00\n", + "print s\n", + "\n", + "s.insert(3, 4) # 3 \uc778\ub371\uc2a4 \uc704\uce58\uc5d0 \uc815\uc218 \uac12 4 \ucd94\uac00\n", + "print s" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 2, 3, 5]\n", + "[1, 2, 3, 4, 5]\n" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = [1, 2, 3, 4, 5]\n", + "\n", + "print s.index(3) # \uac12 3\uc758 \uc778\ub371\uc2a4 \ubc18\ud658\n", + "\n", + "print s.count(2) # \uac12 2\uc758 \uac1c\uc218 \ubc18\ud658\n", + "\n", + "s = [1, 2, 2, 2, 2, 2, 3, 4, 5]\n", + "print s.count(2)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n", + "1\n", + "5\n" + ] + } + ], + "prompt_number": 24 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- python\uc758 \uc18c\ud305 \uc54c\uace0\ub9ac\uc998: Timsort (\ubcc0\ud615\ub41c merge sort)\n", + " - \ucc38\uace0: http://orchistro.tistory.com/175" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = [1, 2, -10, -7, 100]\n", + "s.reverse() # \uc790\ub8cc\uc758 \uc21c\uc11c\ub97c \ub4a4\uc9d1\uae30 (\ubc18\ud658\uac12 \uc5c6\uc74c) \n", + "print s\n", + "\n", + "s.sort() # \uc815\ub82c (\ubc18\ud658\uac12 \uc5c6\uc74c)\n", + "print s" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[100, -7, -10, 2, 1]\n", + "[-10, -7, 1, 2, 100]\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = [10, 20, 30, 40, 50]\n", + "s.remove(10) # \uc790\ub8cc \uac12 10 \uc0ad\uc81c\n", + "print s\n", + "\n", + "s = [10, 20, 30, 20, 40, 50] # \uc790\ub8cc \uac12\uc774 \uc5ec\ub7ec\uac1c \uc874\uc7ac\ud558\uba74 \uccab\ubc88\uc9f8 \uac83\ub9cc \uc0ad\uc81c\n", + "s.remove(20)\n", + "print s\n", + "\n", + "s.extend([60, 70]) # \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8([60, 70]\ub97c \uae30\uc874 \ub9ac\uc2a4\ud2b8 s \ub4a4\uc5d0 \ubcd1\ud569\n", + "print s\n", + "\n", + "s.append([60, 70]) # \uc8fc\uc758: append\ub85c \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8\ub97c \ucd94\uac00\ud558\uba74 \ud558\ub098\uc758 \uc790\ub8cc \uc694\uc18c\ub85c\uc11c \ucd94\uac00\n", + "print s" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[20, 30, 40, 50]\n", + "[10, 30, 20, 40, 50]\n", + "[10, 30, 20, 40, 50, 60, 70]\n", + "[10, 30, 20, 40, 50, 60, 70, [60, 70]]\n" + ] + } + ], + "prompt_number": 36 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \ub9ac\uc2a4\ud2b8\ub97c \uc2a4\ud0dd(Stack)\uc73c\ub85c \uc0ac\uc6a9\ud558\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = [10, 20, 30, 40, 50]\n", + "s.append(60)\n", + "print s\n", + "\n", + "print s.pop()\n", + "\n", + "print s" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[10, 20, 30, 40, 50, 60]\n", + "60\n", + "[10, 20, 30, 40, 50]\n" + ] + } + ], + "prompt_number": 37 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/stack.png)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = [10, 20, 30, 40, 50]\n", + "print s.pop(0) #0 \ubc88\uc9f8 \uc778\ub371\uc2a4 \uac12\uc744 \uaebc\ub0b8\ub2e4.\n", + "\n", + "print s\n", + "\n", + "print s.pop(1) #1 \ubc88\uc9f8 \uc778\ub371\uc2a4 \uac12\uc744 \uaebc\ub0b8\ub2e4.\n", + "\n", + "print s" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "10\n", + "[20, 30, 40, 50]\n", + "30\n", + "[20, 40, 50]\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 \ub9ac\uc2a4\ud2b8\ub97c \ud050(Queue)\ub85c \uc0ac\uc6a9\ud558\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "q = [10, 20, 30, 40, 50]\n", + "q.append(60)\n", + "print q.pop(0)\n", + "\n", + "print q" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "10\n", + "[20, 30, 40, 50, 60]\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/queue.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python10.ipynb b/python3.6/python10.ipynb new file mode 100644 index 0000000..e1bf96f --- /dev/null +++ b/python3.6/python10.ipynb @@ -0,0 +1,675 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:751463e29cb1f77a958f648aa418de343a35c9ebe451d93376ba1eec3e5dda1c" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 10. \ub9ac\uc2a4\ud2b8\uc758 \ud65c\uc6a9\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \ub9ac\uc2a4\ud2b8 \uc815\ub82c\ud558\uae30\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \ub9ac\uc2a4\ud2b8\uc758 sort \uba54\uc18c\ub4dc\n", + "- L.sort() \ud568\uc218\ub294 \ub9ac\uc2a4\ud2b8 L \uc790\uccb4\ub97c \ubcc0\uacbd\ud558\uba70 \ub9ac\ud134\uac12\uc744 \ubc18\ud658\ud558\uc9c0 \uc54a\ub294\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [1, 5, 3, 9, 8, 4, 2]\n", + "print L.sort()\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "None\n", + "[1, 2, 3, 4, 5, 8, 9]\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud30c\uc774\uc36c\uc740 \ub514\ud3f4\ud2b8\ub85c cmp(a, b) \ub0b4\uc7a5 \ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \uc815\ub82c \ubc29\uc2dd\uc744 \uacb0\uc815\ud55c\ub2e4.\n", + "- cmp(a, b)\n", + " - if a < b: return -1\n", + " - if a > b: return 1\n", + " - if a == b: return 0" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print cmp(1,2)\n", + "\n", + "print cmp(5,2)\n", + "\n", + "print cmp('abc', 'abc')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "-1\n", + "1\n", + "0\n" + ] + } + ], + "prompt_number": 45 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uae30\ubcf8 \uc815\ub82c \ubc29\uc2dd\uc744 \ubcc0\uacbd\ud558\ub824\uba74 cmp(a, b)\uc640 \uac19\uc740 \ube44\uad50 \ud568\uc218\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\uc11c sort() \ud568\uc218\uc758 \uc778\uc790\ub85c \ub123\ub294\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def mycmp(a1, a2): # \ub300\uc18c\uad00\uacc4\uc5d0 \ub530\ub978 \uc21c\uc11c\ub97c \ubc18\ub300\ub85c \ubc14\uafb8\uc5c8\uc74c\n", + " return cmp(a2, a1)\n", + "\n", + "L = [1, 5, 3, 2, 4, 6]\n", + "L.sort(mycmp) # \uc5ed\uc21c\uc73c\ub85c \uc815\ub82c\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[6, 5, 4, 3, 2, 1]\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc5ec\ub7ec \ud29c\ud50c\uc744 \uc694\uc18c\ub85c \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8\uc778 \uacbd\uc6b0, \ud29c\ud50c\uc758 \uccab\ubc88\uc9f8 \uac12\uc774 \uc544\ub2cc \ub2e4\ub978 \uc704\uce58\uc5d0 \uc788\ub294 \uac12\uc744 \uae30\uc900\uc73c\ub85c \uc815\ub82c " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def cmp_1(a1, a2):\n", + " return cmp(a1[1], a2[1])\n", + "\n", + "def cmp_2(a1, a2):\n", + " return cmp(a1[2], a2[2])\n", + "\n", + "L = [ ('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", + "L.sort()\n", + "print 'sorted by name:', L\n", + "\n", + "L.sort(cmp_1)\n", + "print 'sorted by experience:', L\n", + "\n", + "L.sort(cmp_2)\n", + "print 'sorted by age:', L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "sorted by name: [('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n", + "sorted by experience: [('kim', 3, 28), ('lee', 5, 38), ('jung', 10, 36)]\n", + "sorted by age: [('kim', 3, 28), ('jung', 10, 36), ('lee', 5, 38)]\n" + ] + } + ], + "prompt_number": 49 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- sort() \ud568\uc218 \uc778\uc790\ub85c reverse \uac12\uc744 \ubc1b\uc744 \uc218 \uc788\ub2e4.\n", + " - \ub514\ud3f4\ud2b8 reverse \uc778\uc790\uac12\uc740 False\n", + " - reverse \uc778\uc790\uac12\uc744 True\ub85c \uc8fc\uba74 \uc5ed\uc21c\uc73c\ub85c \uc815\ub82c\ub428" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "L.sort(reverse = True)\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[9, 8, 6, 6, 3, 2, 1]\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- sort() \ud568\uc218 \uc778\uc790\ub85c key\uc5d0 \ud568\uc218\ub97c \ub123\uc5b4\uc904 \uc218 \uc788\ub2e4.\n", + " - key \uc778\uc790\uc5d0 \ud568\uc218\uac00 \ud560\ub2f9\ub418\uc5b4 \uc788\uc73c\uba74 \uac01 \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c\uc5d0 \ub300\ud574 \ube44\uad50\ud568\uc218 \ud638\ucd9c \uc9c1\uc804\uc5d0 key \ud568\uc218\ub97c \uba3c\uc800 \ud638\ucd9c\ud55c\ub2e4. " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = ['123', '34', '56', '2345']\n", + "L.sort()\n", + "print L\n", + "\n", + "L.sort(key=int)\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['123', '2345', '34', '56']\n", + "['34', '56', '123', '2345']\n" + ] + } + ], + "prompt_number": 51 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 sorted \ub0b4\uc7a5 \ud568\uc218\n", + "- sorted() \ub0b4\uc7a5\ud568\uc218\ub294 L \uc790\uccb4\uc5d0\ub294 \ub0b4\uc6a9 \ubcc0\uacbd \uc5c6\uc774 \uc815\ub82c\uc774 \ub418\uc5b4\uc9c4 \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "newList = sorted(L)\n", + "print newList\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 2, 3, 6, 6, 8, 9]\n", + "[1, 6, 3, 8, 6, 2, 9]\n" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for ele in sorted(L):\n", + " print ele," + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 2 3 6 6 8 9\n" + ] + } + ], + "prompt_number": 55 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- sorted() \ud568\uc218\uc758 \ub450\ubc88\uc9f8 \uc778\uc790\ub85c cmp \ud568\uc218 \uc9c0\uc815 \uac00\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def mycmp(a1, a2): # \ub300\uc18c\uad00\uacc4\uc5d0 \ub530\ub978 \uc21c\uc11c\ub97c \ubc18\ub300\ub85c \ubc14\uafb8\uc5c8\uc74c\n", + " return cmp(a2, a1)\n", + "\n", + "L = [1, 5, 3, 2, 4, 6]\n", + "print sorted(L, mycmp) # \uc5ed\uc21c\uc73c\ub85c \uc815\ub82c\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[6, 5, 4, 3, 2, 1]\n", + "[1, 5, 3, 2, 4, 6]\n" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc778\uc790\ub85c reverse\uc640 key \uc9c0\uc815 \uac00\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "print sorted(L, reverse=True)\n", + "\n", + "L = ['123', '34', '56', '2345']\n", + "print sorted(L, key=int)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[9, 8, 6, 6, 3, 2, 1]\n", + "['34', '56', '123', '2345']\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 L.reverse() \uc640 reversed() \ub0b4\uc7a5 \ud568\uc218\n", + "- L.reverse()\ub3c4 \ubc18\ud658\uac12\uc774 \uc5c6\ub2e4.\n", + " - \uc989, L \uc790\uccb4\ub97c \uc5ed\uc21c\uc73c\ub85c \ub4a4\uc9d1\ub294\ub2e4.\n", + " - [\uc8fc\uc758] \uc5ed\uc21c \uc815\ub82c\uc774 \uc544\ub2c8\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "print L.reverse()\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "None\n", + "[9, 2, 6, 8, 3, 6, 1]\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "L.reverse() # \uc5ed\uc21c\uc73c\ub85c \ub4a4\uc9d1\ub294\ub2e4.\n", + "for ele in L:\n", + " print ele + 2,\n", + "\n", + "print\n", + "L.reverse() # \ub2e4\uc2dc \uc6d0\uc0c1\ud0dc\ub85c \ubcf5\uadc0\uc2dc\ud0a8\ub2e4.\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "11 4 8 10 5 8 3\n", + "[1, 6, 3, 8, 6, 2, 9]\n" + ] + } + ], + "prompt_number": 27 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- reversed() \ub0b4\uc7a5\ud568\uc218\ub294 sorted() \ucc98\ub7fc \ub0b4\uc6a9\uc774 \ub4a4\uc9d1\ud78c \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud55c\ub2e4.\n", + " - sorted() \ucc98\ub7fc \uc6d0\ub798 \ub9ac\uc2a4\ud2b8 \ub0b4\uc6a9\uc5d0\ub294 \ubcc0\ud568\uc5c6\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "print L\n", + "for ele in reversed(L):\n", + " print ele + 2, \n", + "print\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 6, 3, 8, 6, 2, 9]\n", + "11 4 8 10 5 8 3\n", + "[1, 6, 3, 8, 6, 2, 9]\n" + ] + } + ], + "prompt_number": 31 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec(List Comprehension)\n", + "***\n", + "- \uc77c\ubc18\uc801\uc778 \ub9ac\uc2a4\ud2b8 \uc0dd\uc131\ubc95" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = []\n", + "for k in range(10):\n", + " L.append(k*k)\n", + " \n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" + ] + } + ], + "prompt_number": 74 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc704 \ucf54\ub529\uc740 \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec \ub9ac\ud130\ub7f4 \ubc29\uc2dd\uc744 \ud65c\uc6a9\ud574\uc11c \uc544\ub798\uc640 \uac19\uc774 \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [k * k for k in range(10)]\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" + ] + } + ], + "prompt_number": 32 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec \ub9ac\ud130\ub7f4\n", + "
\n",
+      "[expression for expr1 in sequence1\n",
+      "              for expr2 in sequence2 \n",
+      "              ...\n",
+      "              for exprN in sequenceN\n",
+      "              if condition]\n",
+      "
\n", + "- expression\uc758 \ud3c9\uac00 \uacb0\uacfc \ubc18\ub4dc\uc2dc \ud55c \uac1c\uc758 \uc6d0\uc18c\uac00 \ub098\uc640\uc57c \ud55c\ub2e4.\n", + " - \ud2c0\ub9b0 \uc608: [ x, y for x in seq1 for u in seq2 ]\n", + "- \ub9cc\uc57d \ub450 \uac1c\uc758 \uc774\uc0c1\uc758 \ud3c9\uac00 \uacb0\uacfc\uac00 \ub098\uc624\uba74 \ud29c\ud50c \ub4f1\uc73c\ub85c \uac10\uc2f8 \uc8fc\uc5b4\uc57c \ud55c\ub2e4.\n", + " - \uc62c\ubc14\ub978 \uc608: [ (x, y) for x in seq1 for u in seq2 ]\n", + "- \uc704 \ub9ac\ud130\ub7f4\uc740 \ub2e4\uc74c\uc758 \uc77c\ubc18\uc801\uc778 for \ubb38\uc758 \ub9ac\ud138\ub7ec\uacfc \ub3d9\uc77c\n", + "
\n",
+      "l = []\n",
+      "for expr1 in sequence1:\n",
+      "  for expr2 in sequence2:\n",
+      "      ...\n",
+      "         for exprtN in sequenceN:\n",
+      "            if condition:\n",
+      "               l.append(expression)\n",
+      "
\n", + " " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [k * k for k in range(10) if k % 2] # \ud640\uc218\uc758 \uc81c\uacf1\ub9cc \ub9ac\uc2a4\ud2b8\ub85c \ud615\uc131\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 9, 25, 49, 81]\n" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc704\uc758 \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec \ucf54\ub4dc\ub294 \uc544\ub798\uc640 \ub3d9\uc77c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = []\n", + "for k in range(10):\n", + " if k%2:\n", + " L.append(k*k)\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 9, 25, 49, 81]\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 20\ubcf4\ub2e4 \uc791\uc740 2\uc758 \ubc30\uc218\uc640 3\uc758 \ubc30\uc218\uc5d0 \ub300\ud574 \uadf8 \ub450 \uc218\uc758 \ud569\uc774 7\uc758 \ubc30\uc218\uc778 \uac83\ub4e4\uc5d0 \ub300\ud574 \uadf8 \ub450 \uc218\uc758 \uacf1\uc744 \ucd9c\ub825\ud558\ub294 \ucf54\ub4dc" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "L = [(i, j, i*j) for i in range(2, 20, 2) for j in range(3, 20, 3) if (i + j) % 7 == 0]\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[(2, 12, 24), (4, 3, 12), (6, 15, 90), (8, 6, 48), (10, 18, 180), (12, 9, 108), (16, 12, 192), (18, 3, 54)]\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub450 \uac1c\uc758 \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc5d0 \ub300\ud574 \uac01\uac01\uc758 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uc30d\uc744 \ud29c\ud50c \ud615\ud0dc\ub85c \ub9cc\ub4e4\uba74\uc11c \ub9ac\uc2a4\ud2b8\uc5d0 \uc800\uc7a5\ud558\ub294 \ucf54\ub4dc" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "seq1 = 'abc'\n", + "seq2 = (1, 2, 3)\n", + "print [(x, y) for x in seq1 for y in seq2]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "words = 'The quick brown fox jumps over the lazy dog'.split()\n", + "stuff = [[w.upper(), w.lower(), len(w)] for w in words]\n", + "for i in stuff:\n", + " print i" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['THE', 'the', 3]\n", + "['QUICK', 'quick', 5]\n", + "['BROWN', 'brown', 5]\n", + "['FOX', 'fox', 3]\n", + "['JUMPS', 'jumps', 5]\n", + "['OVER', 'over', 4]\n", + "['THE', 'the', 3]\n", + "['LAZY', 'lazy', 4]\n", + "['DOG', 'dog', 3]\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python11.ipynb b/python3.6/python11.ipynb new file mode 100644 index 0000000..4ca3fba --- /dev/null +++ b/python3.6/python11.ipynb @@ -0,0 +1,989 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:f605b6651a091856e85ef998f6e29cc76ddb9f4c91c5080420c4886641d801ea" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 11. \ud29c\ud50c\uacfc \uc9d1\ud569\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \ud29c\ud50c \ud65c\uc6a9\ubc95\n", + "***\n", + "- \ud29c\ud50c(Tuples): \uc21c\uc11c\uc788\ub294 \uc784\uc758\uc758 \uac1d\uccb4 \ubaa8\uc74c (\uc2dc\ud000\uc2a4\ud615)\n", + "- \ud29c\ud50c\uc740 \ubcc0\uacbd \ubd88\uac00\ub2a5(Immutable)\n", + "- \uc2dc\ud000\uc2a4\ud615\uc774 \uac00\uc9c0\ub294 \ub2e4\uc74c \uc5f0\uc0b0 \ubaa8\ub450 \uc9c0\uc6d0\n", + " - \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc5f0\uacb0, \ubc18\ubcf5, \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \ud29c\ud50c \uc5f0\uc0b0" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t1 = () # \ube44\uc5b4\uc788\ub294 \ud29c\ud50c\n", + "t2 = (1,2,3) # \uad04\ud638 \uc0ac\uc6a9\n", + "\n", + "t3 = 1,2,3 # \uad04\ud638\uac00 \uc5c6\uc5b4\ub3c4 \ud29c\ud50c\uc774 \ub428\n", + "print type(t1), type(t2), type(t3)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " \n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "r1 = (1,) # \uc790\ub8cc\uac00 \ud55c \uac1c\uc77c \ub54c\ub294 \ubc18\ub4dc\uc2dc \ucf64\ub9c8\uac00 \uc788\uc5b4\uc57c \ud55c\ub2e4.\n", + "r2 = 1, # \uad04\ud638\ub294 \uc5c6\uc5b4\ub3c4 \ucf64\ub9c8\ub294 \uc788\uc5b4\uc57c \ud55c\ub2e4.\n", + "print type(r1)\n", + "print type(r2)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t = (1, 2, 3)\n", + "print t * 2 # \ubc18\ubcf5\n", + "print t + ('PyKUG', 'users') # \uc5f0\uacb0\n", + "print t\n", + "print\n", + "\n", + "print t[0], t[1:3] # \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1\n", + "print len(t) # \uae38\uc774\n", + "print 1 in t # \uba64\ubc84\uc2ed \ud14c\uc2a4\ud2b8" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "(1, 2, 3, 1, 2, 3)\n", + "(1, 2, 3, 'PyKUG', 'users')\n", + "(1, 2, 3)\n", + "\n", + "1 (2, 3)\n", + "3\n", + "True\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t[0] = 100 # \ud29c\ud50c\uc740 \ubcc0\uacbd \ubd88\uac00\ub2a5, \uc5d0\ub7ec\ubc1c\uc0dd" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'tuple' object does not support item assignment", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m \u001b[0;31m# \ud29c\ud50c\uc740 \ubcc0\uacbd \ubd88\uac00\ub2a5, \uc5d0\ub7ec\ubc1c\uc0dd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t = (12345, 54321, 'hello!') \n", + "u = t, (1, 2, 3, 4, 5) # \ud29c\ud50c \ub0b4\ubd80 \uc6d0\uc18c\ub85c \ub2e4\ub978 \ud29c\ud50c\uc744 \uac00\uc9c8 \uc218 \uc788\uc74c\n", + "print u\n", + "\n", + "t2 = [1, 2, 3] # \ud29c\ud50c \ub0b4\ubd80 \uc6d0\uc18c\ub85c \ub9ac\uc2a4\ud2b8 \uac00\uc9c8 \uc218 \uc788\uc74c \n", + "u2 = t2, (1, 2, 4)\n", + "print u2\n", + "\n", + "t3 = {1:\"abc\", 2:\"def\"} # \ud29c\ud50c \ub0b4\ubd80 \uc6d0\uc18c\ub85c \uc0ac\uc804 \uac00\uc9c8 \uc218 \uc788\uc74c \n", + "u3 = t3, (1, 2, 3)\n", + "print u3" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))\n", + "([1, 2, 3], (1, 2, 4))\n", + "({1: 'abc', 2: 'def'}, (1, 2, 3))\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "x, y, z = 1, 2, 3 # \ud29c\ud50c\uc744 \uc774\uc6a9\ud55c \ubcf5\uc218 \uac1c\uc758 \uc790\ub8cc \ud560\ub2f9\n", + "print type(x), type(y), type(z)\n", + "print x\n", + "print y\n", + "print z" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " \n", + "1\n", + "2\n", + "3\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "x = 1\n", + "y = 2\n", + "x, y = y, x # \ud29c\ud50c\uc744 \uc774\uc6a9\ud55c \ub450 \uc790\ub8cc\uc758 \uac12 \ubcc0\uacbd\n", + "print x, y" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2 1\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 \ud328\ud0b9\uacfc \uc5b8\ud328\ud0b9" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud328\ud0b9 (Packing): \ud558\ub098\uc758 \ud29c\ud50c \uc548\uc5d0 \uc5ec\ub7ec \uac1c\uc758 \ub370\uc774\ud130\ub97c \ub123\ub294 \uc791\uc5c5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t = 1, 2, 'hello'" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc5b8\ud328\ud0b9 (Unpacking): \ud558\ub098\uc758 \ud29c\ud50c\uc5d0\uc11c \uc5ec\ub7ec \uac1c\uc758 \ub370\uc774\ud130\ub97c \ud55c\uaebc\ubc88\uc5d0 \uaebc\ub0b4\uc640 \uac01\uac01 \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud558\ub294 \uc791\uc5c5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "x, y, z = t" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 19 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8\ub85c\ub3c4 \ube44\uc2b7\ud55c \uc791\uc5c5\uc774 \uac00\ub2a5\ud558\uc9c0\ub9cc, \ub2e8\uc21c \ud328\ud0b9/\uc5b8\ud328\ud0b9 \uc791\uc5c5\ub9cc\uc744 \ubaa9\uc801\uc73c\ub85c \ud55c\ub2e4\uba74 \ud29c\ud50c \uc0ac\uc6a9 \ucd94\ucc9c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = ['foo', 'bar', 4, 5]\n", + "[x, y, z, w] = a" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 22 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud29c\ud50c\uacfc \ub9ac\uc2a4\ud2b8\uc640\uc758 \uacf5\ud1b5\uc810\n", + " - \uc6d0\uc18c\ub85c\uc11c \uc784\uc758\uc758 \uac1d\uccb4\ub97c \uc800\uc7a5\n", + " - \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\n", + " - \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc5f0\uacb0, \ubc18\ubcf5, \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8 \uc5f0\uc0b0 \uc9c0\uc6d0\n", + " \n", + "- \ub9ac\uc2a4\ud2b8\uc640 \ub2e4\ub978 \ud29c\ud50c\ub9cc\uc758 \ud2b9\uc9d5\n", + " - \ubcc0\uacbd \ubd88\uac00\ub2a5 (Immutable)\n", + " - \uba54\uc18c\ub4dc\ub97c \uac00\uc9c0\uc9c0 \uc54a\ub294\ub2e4.\n", + "\n", + "- list() \uc640 tuple() \ub0b4\uc7a5 \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub9ac\uc2a4\ud2b8\uc640 \ud29c\ud50c\uc744 \uc0c1\ud638 \ubcc0\ud658\ud560 \uc218 \uc788\uc74c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "T = (1,2,3,4,5)\n", + "L = list(T)\n", + "L[0] = 100\n", + "print L\n", + "\n", + "T = tuple(L)\n", + "print T" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[100, 2, 3, 4, 5]\n", + "(100, 2, 3, 4, 5)\n" + ] + } + ], + "prompt_number": 25 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 \ud29c\ud50c\uc758 \uc0ac\uc6a9 \uc6a9\ub3c4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud29c\ud50c\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 1: \ud568\uc218\uac00 \ud558\ub098 \uc774\uc0c1\uc758 \uac12\uc744 \ub9ac\ud134\ud558\ub294 \uacbd\uc6b0" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def calc(a, b):\n", + " return a+b, a*b\n", + "\n", + "x, y = calc(5, 4)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 27 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud29c\ud50c\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 2: \ubb38\uc790\uc5f4 \ud3ec\uba67\ud305" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 'id : %s, name : %s' % ('gslee', 'GangSeong')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "id : gslee, name : GangSeong\n" + ] + } + ], + "prompt_number": 28 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud29c\ud50c\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 3: \uace0\uc815\ub41c \uac12\uc744 \uc30d\uc73c\ub85c \ud45c\ud604\ud558\ub294 \uacbd\uc6b0" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d = {'one':1, 'two':2}\n", + "print d.items()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[('two', 2), ('one', 1)]\n" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \uc9d1\ud569 \uc790\ub8cc\ud615\n", + "***\n", + "- set \ub0b4\uc7a5 \ud568\uc218\ub97c \uc0ac\uc6a9\ud55c \uc9d1\ud569 \uc790\ub8cc \uc0dd\uc131 \n", + " - \ubcc0\uacbd \uac00\ub2a5(Mutable)\ud55c \uac1d\uccb4\uc774\ub2e4.\n", + " - \uac01 \uc6d0\uc18c\uac04\uc5d0 \uc21c\uc11c\ub294 \uc5c6\ub2e4.\n", + " - \uac01 \uc6d0\uc18c\ub294 \uc911\ubcf5\ub420 \uc218 \uc5c6\ub2e4.\n", + " - [note] \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774 \uc544\ub2c8\ub2e4." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 \uc9d1\ud569 \uc790\ub8cc\ud615 \uc0dd\uc131" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = set([1, 2, 3])\n", + "print type(a)\n", + "print a\n", + "print\n", + "\n", + "b = set((1, 2, 3))\n", + "print type(b)\n", + "print b\n", + "print\n", + "\n", + "c = set({'a':1, 'b':2, 'c':3})\n", + "print type(c)\n", + "print c\n", + "print\n", + "\n", + "d = set({'a':1, 'b':2, 'c':3}.values())\n", + "print type(d)\n", + "print d" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "set([1, 2, 3])\n", + "\n", + "\n", + "set([1, 2, 3])\n", + "\n", + "\n", + "set(['a', 'c', 'b'])\n", + "\n", + "\n", + "set([1, 2, 3])\n" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set\uc758 \uc6d0\uc18c\ub85c\ub294 \ubcc0\uacbd \ubd88\uac00\ub2a5(Immutable)\ud55c \uac83\ub9cc \ud560\ub2f9 \uac00\ub2a5\ud558\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print set() # \ube48 set \uac1d\uccb4 \uc0dd\uc131\n", + "print set([1,2,3,4,5]) # \ucd08\uae30 \uac12\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc778 \ub9ac\uc2a4\ud2b8\ub97c \ub123\uc5b4\uc900\ub2e4.\n", + "print set([1,2,3,2,3,4]) # \uc911\ubcf5\ub41c \uc6d0\uc18c\ub294 \ud55c \ubc88\ub9cc \ud45c\ud604\n", + "print set('abc') # \ubb38\uc790\uc5f4\uc740 \uac01 \ubb38\uc790\ub97c \uc9d1\ud569 \uc6d0\uc18c\ub85c \uc9c0\ub2cc\ub2e4. \n", + "print set([(1,2,3),(4,5,6)]) # \uac01 \ud29c\ud50c\uc740 \uc6d0\uc18c\ub85c \uac00\uc9c8 \uc218 \uc788\uc74c \n", + "print set([[1,2,3],[4,5,6]]) # \ubcc0\uacbd \uac00\ub2a5 \uc790\ub8cc\uc778 \ub9ac\uc2a4\ud2b8\ub294 \uc9d1\ud569\uc758 \uc6d0\uc18c\uac00 \ub420 \uc218 \uc5c6\ub2e4." + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "set([])\n", + "set([1, 2, 3, 4, 5])\n", + "set([1, 2, 3, 4])\n", + "set(['a', 'c', 'b'])\n", + "set([(4, 5, 6), (1, 2, 3)])\n" + ] + }, + { + "ename": "TypeError", + "evalue": "unhashable type: 'list'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubb38\uc790\uc5f4\uc740 \uac01 \ubb38\uc790\ub97c \uc9d1\ud569 \uc6d0\uc18c\ub85c \uc9c0\ub2cc\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \uac01 \ud29c\ud50c\uc740 \uc6d0\uc18c\ub85c \uac00\uc9c8 \uc218 \uc788\uc74c\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubcc0\uacbd \uac00\ub2a5 \uc790\ub8cc\uc778 \ub9ac\uc2a4\ud2b8\ub294 \uc9d1\ud569\uc758 \uc6d0\uc18c\uac00 \ub420 \uc218 \uc5c6\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set\uc758 \uae30\ubcf8 \uc5f0\uc0b0\n", + "\n", + "| set \uc5f0\uc0b0 | \ub3d9\uc77c \uc5f0\uc0b0\uc790 | \ub0b4\uc6a9 |\n", + "|---------------------------|-------------|-----------------------------|\n", + "| len(s) | | \uc6d0\uc18c\uc758 \uac1c\uc218 |\n", + "| x in s | | x\uac00 \uc9d1\ud569 s\uc758 \uc6d0\uc18c\uc778\uac00? |\n", + "| x not in s | | x\uac00 \uc9d1\ud569 s\uc758 \uc6d0\uc18c\uac00 \uc544\ub2cc\uac00? |" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "\n", + "print len(A) # \uc9d1\ud569\uc758 \uc6d0\uc18c\uc758 \uc218\n", + "print 5 in A # \uba64\ubc84\uc2ed \ud14c\uc2a4\ud2b8\n", + "print 10 not in A # \uba64\ubc84\uc2ed \ud14c\uc2a4\ud2b8" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "9\n", + "True\n", + "True\n" + ] + } + ], + "prompt_number": 34 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \uc9d1\ud569 \uc790\ub8cc\ud615 \uba54\uc18c\ub4dc" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set\uc758 \uc8fc\uc694 \uba54\uc18c\ub4dc\n", + " - \ub2e4\uc74c \uc5f0\uc0b0\uc740 \uc6d0\ub798 \uc9d1\ud569\uc740 \ubcc0\uacbd\ud558\uc9c0 \uc54a\uace0 \uc0c8\ub85c\uc6b4 \uc9d1\ud569\uc744 \ubc18\ud658\ud55c\ub2e4. \n", + "\n", + "| set \uc5f0\uc0b0 | \ub3d9\uc77c \uc5f0\uc0b0\uc790 | \ub0b4\uc6a9 |\n", + "|---------------------------|-------------|-----------------------------|\n", + "| s.issubset(t) | s <= t | s\uac00 t\uc758 \ubd80\ubd84\uc9d1\ud569\uc778\uac00? |\n", + "| s.issuperset(t) | s >= t | s\uac00 t\uc758 \uc288\ud37c\uc9d1\ud569\uc778\uac00? |\n", + "| s.union(t) | s | t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \ud569\uc9d1\ud569 |\n", + "| s.intersection(t) | s & t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \uad50\uc9d1\ud569 |\n", + "| s.difference(t) | s - t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \ucc28\uc9d1\ud569 |\n", + "| s.symmetric_difference(t) | s ^ t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \ubc30\ud0c0\uc9d1\ud569 |\n", + "| s.copy() | | \uc9d1\ud569 s\uc758 shallow \ubcf5\uc0ac |" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "B = set([4,5,6,10,20,30])\n", + "C = set([10,20,30])\n", + "\n", + "print C.issubset(B) # C\uac00 B\uc758 \ubd80\ubd84\uc9d1\ud569?\n", + "print C <= B\n", + "print B.issuperset(C) # B\uac00 C\ub97c \ud3ec\ud568\ud558\ub294 \uc9d1\ud569?\n", + "print B >= C\n", + "print" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n", + "\n" + ] + } + ], + "prompt_number": 33 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "B = set([4,5,6,10,20,30])\n", + "\n", + "print A.union(B) # A\uc640 B\uc758 \ud569\uc9d1\ud569\n", + "print A\n", + "print\n", + "\n", + "print A.intersection(B) # A\uc640 B\uc758 \uad50\uc9d1\ud569\n", + "print A\n", + "print\n", + "\n", + "print A.difference(B) # A - B (\ucc28\uc9d1\ud569)\n", + "print A\n", + "print\n", + "\n", + "print A.symmetric_difference(B) # \ubca0\ud0c0\uc9d1\ud569. A\uc640 B\uc758 \ud569\uc9d1\ud569\uc5d0\uc11c \uad50\uc9d1\ud569\uc758 \uc6d0\uc18c\ub97c \uc81c\uc678\ud55c \uc9d1\ud569\n", + "print A" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "set([4, 5, 6])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "set([1, 2, 3, 7, 8, 9])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "B = set([4,5,6,10,20,30])\n", + "\n", + "print A | B # A\uc640 B\uc758 \ud569\uc9d1\ud569\n", + "print A\n", + "print\n", + "\n", + "print A & B # A\uc640 B\uc758 \uad50\uc9d1\ud569\n", + "print A\n", + "print\n", + "\n", + "print A - B #A - B (\ucc28\uc9d1\ud569)\n", + "print A\n", + "print\n", + "\n", + "print A.symmetric_difference(B) # \ubca0\ud0c0\uc9d1\ud569. A\uc640 B\uc758 \ud569\uc9d1\ud569\uc5d0\uc11c \uad50\uc9d1\ud569\uc758 \uc6d0\uc18c\ub97c \uc81c\uc678\ud55c \uc9d1\ud569\n", + "print A ^ B\n", + "print A" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "set([4, 5, 6])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "set([1, 2, 3, 7, 8, 9])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", + "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "D = A.copy()\n", + "print D\n", + "print\n", + "\n", + "print A == D #\uc790\ub8cc\uac12 \ube44\uad50\n", + "print A is D #\uac1d\uccb4 \ub3d9\ub4f1\uc131 \ube44\uad50" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "True\n", + "False\n" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set\uc740 \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774 \uc544\ub2c8\ubbc0\ub85c \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc815\ub82c \ub4f1\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294\ub2e4. " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "print A[0]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'set' object does not support indexing", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'set' object does not support indexing" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print A[1:4]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'set' object has no attribute '__getitem__'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'set' object has no attribute '__getitem__'" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print A.sort()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'set' object has no attribute 'sort'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: 'set' object has no attribute 'sort'" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc9d1\ud569\uc744 \ub9ac\uc2a4\ud2b8\ub098 \ud29c\ud50c\ub85c \ubcc0\uacbd\uac00\ub2a5\n", + " - \uc9d1\ud569\uc5d0 \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc815\ub82c \ub4f1\uc744 \uc801\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub9ac\uc2a4\ud2b8\ub098 \ud29c\ud50c\ub85c \ubcc0\uacbd\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print list(A)\n", + "print tuple(A)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "(1, 2, 3, 4, 5, 6, 7, 8, 9)\n" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud558\uc9c0\ub9cc \uc9d1\ud569\uc5d0 for ~ in \uc5f0\uc0b0\uc740 \uc801\uc6a9 \uac00\ub2a5\ud558\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "for ele in A:\n", + " print ele," + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 2 3 4 5 6 7 8 9\n" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set\uc740 \ubcc0\uacbd \uac00\ub2a5(Mutable)\ud55c \uc790\ub8cc \uad6c\uc870 \uac1d\uccb4 \n", + "- \ub2e4\uc74c \uba54\uc18c\ub4dc\ub4e4\uc740 set\uc744 \ubcc0\uacbd\ud558\ub294 \uc9d1\ud569 \uc790\ub8cc \uad6c\uc870 \uba54\uc18c\ub4dc\ub4e4\uc784\n", + "\n", + "| set \uc5f0\uc0b0 | \ub3d9\uc77c \uc5f0\uc0b0\uc790 | \ub0b4\uc6a9 |\n", + "|---------------------------|-------------|-----------------------------|\n", + "| s.update(t) | s |= t | s\uc640 t\uc758 \ud569\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", + "| s.intersection_update(t) | s &= t | s\uc640 t\uc758 \uad50\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", + "| s.difference_update(t) | s -= t | s\uc640 t\uc758 \ucc28\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", + "| s.symmetric_difference_update(t)| s ^= t | s\uc640 t\uc758 \ubc30\ud0c0\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", + "| s.add(x) | | \uc6d0\uc18c x\ub97c \uc9d1\ud569 s\uc5d0 \ucd94\uac00 |\n", + "| s.remove(x) | | \uc6d0\uc18c x\ub97c \uc9d1\ud569 s\uc5d0\uc11c \uc81c\uac70, \uc6d0\uc18c x\uac00 \uc9d1\ud569 s\uc5d0 \uc5c6\uc73c\uba74 \uc608\uc678 \ubc1c\uc0dd |\n", + "| s.discard(x) | | \uc6d0\uc18c x\ub97c \uc9d1\ud569 s\uc5d0\uc11c \uc81c\uac70 |\n", + "| s.pop() | | \uc784\uc758\uc758 \uc6d0\uc18c\ub97c \uc9d1\ud569 s\uc5d0\uc11c \uc81c\uac70, \uc9d1\ud569 s\uac00 \uacf5\uc9d1\ud569\uc774\uba74 \uc608\uc678 \ubc1c\uc0dd |\n", + "| s.clear() | | \uc9d1\ud569 s\uc758 \ubaa8\ub4e0 \uc6d0\uc18c \uc81c\uac70 |" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "A = set([1,2,3,4])\n", + "B = set([3,4,5,6])\n", + "\n", + "A.update(B) # A\uc5d0 B \uc9d1\ud569\uc758 \uc6d0\uc18c\ub97c \ucd94\uac00 \uc2dc\ud0b4\n", + "print A\n", + "\n", + "A.intersection_update([4,5,6,7,8]) # &=\n", + "print A\n", + "\n", + "A.difference_update([6,7,8]) # -=\n", + "print A\n", + "\n", + "A.symmetric_difference_update([5,6,7]) # ^=\n", + "print A\n", + "\n", + "A.add(8) # \uc6d0\uc18c \ucd94\uac00\n", + "print A\n", + "\n", + "A.remove(8) # \uc6d0\uc18c \uc81c\uac70\n", + "print A" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "set([1, 2, 3, 4, 5, 6])\n", + "set([4, 5, 6])\n", + "set([4, 5])\n", + "set([4, 6, 7])\n", + "set([8, 4, 6, 7])\n", + "set([4, 6, 7])\n" + ] + } + ], + "prompt_number": 40 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "A.remove(10) # \uc5c6\ub294 \uc6d0\uc18c\ub97c \uc81c\uac70\ud558\uba74 KeyError \ubc1c\uc0dd" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "10", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#\uc5c6\ub294 \uc6d0\uc18c\ub97c \uc81c\uac70\ud558\uba74 KeyError \ubc1c\uc0dd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 10" + ] + } + ], + "prompt_number": 21 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "A.discard(10) # remove\uc640 \uac19\uc73c\ub098 \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc74c\n", + "A.discard(6) # \uc6d0\uc18c 6\uc81c\uac70\n", + "print A\n", + "\n", + "A.pop() # \uc784\uc758\uc758 \uc6d0\uc18c \ud558\ub098 \uaebc\ub0b4\uae30\n", + "print A \n", + "\n", + "A = set([1,2,3,4])\n", + "A.clear() # \uc6d0\uc18c\ub4e4 \uc5c6\uc560\uae30\n", + "print A" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "set([4, 7])\n", + "set([7])\n", + "set([])\n" + ] + } + ], + "prompt_number": 41 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python12.ipynb b/python3.6/python12.ipynb new file mode 100644 index 0000000..0aeddf7 --- /dev/null +++ b/python3.6/python12.ipynb @@ -0,0 +1,694 @@ +{ + "metadata": { + "celltoolbar": "Raw Cell Format", + "name": "", + "signature": "sha256:118de544f1b6b0240b193fd4cb88dd0599a38507af3056036f93153d7914bf90" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 12. \uc0ac\uc804(Dictionaries)\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \uc0ac\uc804 \ud65c\uc6a9\ubc95\n", + "***\n", + "- \uc0ac\uc804(Dictionary) \uac1d\uccb4\uc758 \ud2b9\uc9d5\n", + " - \uc9d1\ud569\uc801 \uc790\ub8cc\ud615\n", + " - \uc790\ub8cc\uc758 \uc21c\uc11c\ub97c \uc815\ud558\uc9c0 \uc54a\ub294 \ub9e4\ud551(Mapping)\ud615\n", + " - \ud0a4(Key)\ub97c \uc774\uc6a9\ud558\uc5ec \uac12(Value)\uc5d0 \uc811\uadfc\n", + " - \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc740 \uc544\ub2d8\n", + " - \ud0a4\uc640 \uac12\uc758 \ub9e4\ud551 1\uac1c\ub97c \uc544\uc774\ud15c(item)\uc774\ub77c\uace0 \ubd80\ub984" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", + "print member['baseball'] # \uac80\uc0c9" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "9\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uac12\uc744 \uc800\uc7a5\ud560 \uc2dc\uc5d0 \ud0a4\ub97c \uc0ac\uc6a9\n", + " - \ud0a4\uac00 \uc5c6\ub2e4\uba74 \uc0c8\ub85c\uc6b4 \ud0a4\uc640 \uac12\uc758 \uc544\uc774\ud15c\uc774 \uc0dd\uc131\n", + " - \ud0a4\uac00 \uc774\ubbf8 \uc874\uc7ac\ud55c\ub2e4\uba74 \uadf8 \ud0a4\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\uc774 \ubcc0\uacbd" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", + "member['volleyball'] = 7 # \uc0c8\ub85c\uc6b4 \uc544\uc774\ud15c \uc124\uc815\n", + "member['volleyball'] = 6 # \ubcc0\uacbd\n", + "print member\n", + "print len(member) # \uc544\uc774\ud15c\uc758 \uac1c\uc218 \ubc18\ud658 " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "{'soccer': 11, 'basketball': 5, 'baseball': 9, 'volleyball': 6}\n", + "4\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc0ac\uc804\uc744 \ucd9c\ub825\ud558\uba74 \uac01 \uc544\uc774\ud15c\ub4e4\uc774 \uc784\uc758\uc758 \uc21c\uc11c\ub85c \ucd9c\ub825\ub41c\ub2e4.\n", + "- \uc0c8\ub85c\uc6b4 \uc544\uc774\ud15c\uc774 \ub4e4\uc5b4\uc624\uba74 \ud0a4 \ub0b4\uc6a9\uc5d0 \ub530\ub77c \uadf8 \uc21c\uc11c\uac00 \ub2ec\ub77c\uc9c4\ub2e4.\n", + "- \ub0b4\ubd80\uc801\uc73c\ub85c \ud0a4 \ub0b4\uc6a9\uc5d0 \ub300\ud574 \ud574\uc26c(Hash) \uae30\ubc95\uc744 \uc0ac\uc6a9\n", + " - \uac80\uc0c9 \uc18d\ub3c4\uac00 \ub9e4\uc6b0 \ube60\ub984\n", + " - [\ucc38\uace0]: http://www.laurentluce.com/posts/python-dictionary-implementation/\n", + "- \ud0a4\uc640 \uac12 \ub9e4\ud551\uc5d0 \ub300\ud55c \uc544\uc774\ud15c\uc744 \uc0ad\uc81c\ud560 \ub54c\uc5d0\ub294 del\uacfc \ud568\uaed8 \ud0a4\uac12 \uba85\uc2dc " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", + "del member['basketball'] # \ud56d\ubaa9 \uc0ad\uc81c\n", + "print member" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "{'soccer': 11, 'baseball': 9}\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [\uc911\uc694] \ud0a4\ub294 \ubcc0\uacbd \ubd88\uac00\ub2a5 (Immutable) \uc790\ub8cc\ub9cc \uac00\ub2a5\n", + " - \ubb38\uc790\uc5f4, \uc22b\uc790, \ud29c\ud50c\uc740 \uac00\ub2a5\n", + " - \ub9ac\uc2a4\ud2b8, \uc0ac\uc804\uc740 \ud0a4\uac00 \ub420 \uc218 \uc5c6\uc74c\n", + "- \ubc18\uba74\uc5d0 \uc0ac\uc804\uc5d0 \uc785\ub825\ub418\ub294 \uac12\uc740 \uc784\uc758\uc758 \uac1d\uccb4" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d = {}\n", + "d['str'] = 'abc'\n", + "d[1] = 4\n", + "d[(1,2,3)] = 'tuple'\n", + "d[[1,2,3]] = 'list' # \ub9ac\uc2a4\ud2b8\ub294 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4." + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unhashable type: 'list'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'tuple'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'list'\u001b[0m \u001b[0;31m# \ub9ac\uc2a4\ud2b8\ub294 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d[{1:2}] = 3 # \uc0ac\uc804\uc740 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4." + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unhashable type: 'dict'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m3\u001b[0m \u001b[0;31m# \uc0ac\uc804\uc740 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'dict'" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \uc774\ub984\uc740 \uc0ac\uc804\uc758 \ud0a4\ub098 \uac12\uc73c\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "def sub(a, b):\n", + " return a - b\n", + "\n", + "action = {0: add, 1: sub} # \ud568\uc218 \uc774\ub984\uc744 \uc0ac\uc804\uc758 \uac12\uc73c\ub85c \uc0ac\uc6a9\n", + "print action[0](4, 5)\n", + "print action[1](4, 5)\n", + "print\n", + "action2 = {add: 1, sub: 2} # \ud568\uc218 \uc774\ub984\uc744 \uc0ac\uc804\uc758 \ud0a4\ub85c \uc0ac\uc6a9\n", + "print action2[add]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "9\n", + "-1\n", + "\n", + "1\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc0ac\uc804\uc744 \uc0dd\uc131\ud558\ub294 \ub2e4\ub978 \ubc29\ubc95: \ub0b4\uc7a5\ud568\uc218 dict() \uc0ac\uc6a9" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d = dict()\n", + "print type(d)\n", + "print \n", + "\n", + "print dict(one=1, two=2)\n", + "print dict([('one', 1), ('two', 2)])\n", + "print dict({'one':1, 'two':2})" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n", + "{'two': 2, 'one': 1}\n", + "{'two': 2, 'one': 1}\n", + "{'two': 2, 'one': 1}\n" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "keys = ['one', 'two', 'three']\n", + "values = (1, 2, 3)\n", + "print zip(keys, values) # zip(): \ub450 \uac1c\uc758 \uc790\ub8cc\ub97c \uc21c\uc11c\ub300\ub85c \uc30d\uc73c\ub85c \ubb36\uc740 \ud29c\ud50c\ub4e4\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", + "print dict(zip(keys, values))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[('one', 1), ('two', 2), ('three', 3)]\n", + "{'three': 3, 'two': 2, 'one': 1}\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \uc0ac\uc804 \uba54\uc18c\ub4dc\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc0ac\uc804\uc774 \uc9c0\uc6d0\ud558\ub294 \uc911\uc694 \uba54\uc18c\ub4dc\n", + " - D.keys(): \uc0ac\uc804 D\uc5d0\uc11c \ud0a4\ub4e4\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\n", + " - D.values(): \uc0ac\uc804 D\uc5d0\uc11c \uac12\ub4e4\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\n", + " - D.items(): \uc0ac\uc804 D\uc5d0\uc11c \uac01 \uc544\uc774\ud15c\uc744 \ud29c\ud50c\ud615\ud0dc\ub85c \uac00\uc838\uc640 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\n", + "- key in D: \uc0ac\uc804 D\uc548\uc5d0 key\ub97c \ud0a4\uac12\uc744 \uac00\uc9c4 \uc544\uc774\ud15c\uc774 \uc788\ub294\uc9c0 \ud655\uc778" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "\n", + "print phone.keys() # \ud0a4\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", + "print phone.values() # \uac12\ub4e4\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", + "print phone.items() # (\ud0a4, \uac12)\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", + "print\n", + "print 'jack' in phone # 'jack'\uc774 phone\uc758 \ud0a4\uc5d0 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n", + "print 'lee' in phone" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['jin', 'Joseph', 'jack']\n", + "[1111, 6584321, 9465215]\n", + "[('jin', 1111), ('Joseph', 6584321), ('jack', 9465215)]\n", + "\n", + "True\n", + "False\n" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- D2 = D.copy(): \uc0ac\uc804 D\ub97c \ubcf5\uc0ac\ud558\uc5ec D2 \uc0ac\uc804\uc5d0 \ud560\ub2f9\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "p = phone # \uc0ac\uc804 \ub808\ud37c\ub7f0\uc2a4 \ubcf5\uc0ac. \uc0ac\uc804 \uac1d\uccb4\ub294 \uacf5\uc720\ub41c\ub2e4.\n", + "\n", + "phone['jack'] = 1234 # phone\uc744 \ubcc0\uacbd\ud558\uba74\n", + "print phone\n", + "print p # p\ub3c4 \ud568\uaed8 \ubcc0\uacbd\ub41c\ub2e4.\n", + "print\n", + "\n", + "ph = phone.copy() # \uc0ac\uc804\ubcf5\uc0ac. \ubcc4\ub3c4\uc758 \uc0ac\uc804 \uac1d\uccb4\uac00 \ub9c8\ub828\ub41c\ub2e4.\n", + "phone['jack'] = 1111 # phone\uc744 \ubc14\uafd4\ub3c4\n", + "print phone\n", + "print ph # ph\ub294 \ubc14\ub00c\uc9c0 \uc54a\ub294\ub2e4." + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n", + "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n", + "\n", + "{'jin': 1111, 'Joseph': 6584321, 'jack': 1111}\n", + "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [\uc8fc\uc758] D.copy()\ub294 Shallow Copy\ub97c \uc218\ud589\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "phone = {'a': [1,2,3], 'b': 4}\n", + "phone2 = phone.copy()\n", + "print phone\n", + "print phone2\n", + "print\n", + "\n", + "phone['b'] = 100\n", + "print phone\n", + "print phone2\n", + "print\n", + "\n", + "phone['a'][0] = 100\n", + "print phone\n", + "print phone2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "{'a': [1, 2, 3], 'b': 4}\n", + "{'a': [1, 2, 3], 'b': 4}\n", + "\n", + "{'a': [1, 2, 3], 'b': 100}\n", + "{'a': [1, 2, 3], 'b': 4}\n", + "\n", + "{'a': [100, 2, 3], 'b': 100}\n", + "{'a': [100, 2, 3], 'b': 4}\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/shallow_copy.png)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "\n", + "print ph.get('jack') # 'jack'\uc5d0 \ub300\ud55c \uac12\uc744 \uc5bb\ub294\ub2e4. ph['jack']\uacfc \uac19\ub2e4.\n", + "print ph.get('gslee') # 'gslee'\uc5d0 \ub300\ud55c \uac12\uc744 \uc5bb\ub294\ub2e4. \uac12\uc774 \uc5c6\ub294 \uacbd\uc6b0 None\ubc18\ud658" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "9465215\n", + "None\n" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "print ph['gslee'] # ph['gslee']\ub294 \ud0a4\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc608\uc678\ubc1c\uc0dd" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'gslee'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'jack'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m9465215\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'jin'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m1111\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Joseph'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m6584321\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mph\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'gslee'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# ph['gslee']\ub294 \ud0a4\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc608\uc678\ubc1c\uc0dd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 'gslee'" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "print ph.get('gslee', 5284) # \uc778\uc218\ub97c \ud558\ub098 \ub354 \uc81c\uacf5\ud558\uba74 'gslee'\uac00 \uc5c6\ub294 \uacbd\uc6b0\uc5d0 5284 \ub9ac\ud134\n", + "print ph # \uc0ac\uc804\uc5d0\ub294 \ubcc0\ud654\uac00 \uc5c6\ub2e4\n", + "print \n", + "\n", + "print ph.popitem() # \uc784\uc758\uc758 \uc544\uc774\ud15c\uc744 \uaebc\ub0b8\ub2e4.\n", + "print ph\n", + "print\n", + "\n", + "print ph.popitem() # \uc784\uc758\uc758 \uc544\uc774\ud15c\uc744 \uaebc\ub0b8\ub2e4.\n", + "print ph \n", + "print\n", + "\n", + "print ph.pop('jack') # \ud0a4 \uac12\uc744 \ud1b5\ud574 \ud574\ub2f9 \uc544\uc774\ud15c\uc744 \uc9c0\uc815\ud558\uc5ec \uaebc\ub0b8\ub2e4.\n", + "print ph" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "5284\n", + "{'jin': 1111, 'Joseph': 6584321, 'jack': 9465215}\n", + "\n", + "('jin', 1111)\n", + "{'Joseph': 6584321, 'jack': 9465215}\n", + "\n", + "('Joseph', 6584321)\n", + "{'jack': 9465215}\n", + "\n", + "9465215\n", + "{}\n" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "ph = {'kim':12312, 'lee': 9090}\n", + "phone.update(ph) # \uc0ac\uc804 phone\uc758 \ub0b4\uc6a9\uc744 ph\uc73c\ub85c \ucd94\uac00 \uac31\uc2e0\n", + "print phone\n", + "print\n", + "phone.clear() # \uc0ac\uc804\uc758 \ubaa8\ub4e0 \uc785\ub825\uc744 \uc5c6\uc564\ub2e4.\n", + "print phone" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "{'jin': 1111, 'Joseph': 6584321, 'jack': 9465215, 'kim': 12312, 'lee': 9090}\n", + "\n", + "{}\n" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 \ub8e8\ud504\ub97c \uc774\uc6a9\ud55c \uc0ac\uc804 \ub0b4\uc6a9 \ucc38\uc870\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc0ac\uc804\uc758 \ubaa8\ub4e0 \ud0a4\uac12\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \ucc38\uc870\ud558\ub294 \ubc29\ubc95" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "D = {'a':1, 'b':2, 'c':3}\n", + "for key in D.keys():\n", + " print key, D[key]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "a 1\n", + "c 3\n", + "b 2\n" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc0ac\uc804 \uc790\uccb4\ub97c for\ub8e8\ud504\uc5d0 \ud65c\uc6a9\ud558\uba74 \ud0a4\uc5d0 \ub300\ud55c \ub8e8\ud504\uac00 \uc2e4\ud589\ub41c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "D = {'a':1, 'b':2, 'c':3}\n", + "for key in D:\n", + " print key, D[key]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "a 1\n", + "c 3\n", + "b 2\n" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud0a4\uc640 \uac12\uc744 \ub3d9\uc2dc\uc5d0 \ucc38\uc870\ud558\ub824\uba74 D.items()\ub97c \ud65c\uc6a9\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for key, value in D.items():\n", + " print key, value" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "a 1\n", + "c 3\n", + "b 2\n" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc0ac\uc804\uc5d0 \uc785\ub825\ub41c \uc544\uc774\ud15c\ub4e4\uc740 \uc77c\uc815\ud55c \uc21c\uc11c\uac00 \uc5c6\ub2e4.\n", + "- \ud0a4\uac12\uc5d0 \ub300\ud55c \uc815\ub82c\uc740 \uc544\uc774\ud15c\ub4e4\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubf51\uc740 \ub2e4\uc74c\uc5d0 \ud574\ub2f9 \ub9ac\uc2a4\ud2b8\uc5d0 \uc788\ub294 sort() \ud568\uc218\ub97c \ud65c\uc6a9\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "D = {'a':1, 'b':2, 'c':3}\n", + "items = D.items()\n", + "print items\n", + "print\n", + "\n", + "items.sort()\n", + "print items\n", + "print \n", + "\n", + "for k,v in items:\n", + " print k, v" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[('a', 1), ('c', 3), ('b', 2)]\n", + "\n", + "[('a', 1), ('b', 2), ('c', 3)]\n", + "\n", + "a 1\n", + "b 2\n", + "c 3\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python13.ipynb b/python3.6/python13.ipynb new file mode 100644 index 0000000..642488b --- /dev/null +++ b/python3.6/python13.ipynb @@ -0,0 +1,843 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:c387afc0482bfe7414617f8b0ed2da8e5a212c552ab5fb398cf546389f46f5e1" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 13. \ud30c\uc77c \uc785\ucd9c\ub825\n", + "***\n", + "***\n", + "- \ud30c\uc77c\uc744 \uc5f4\uc5b4\uc11c \uc77d\uace0, \uc4f0\uace0, \ub367\ubd99\uc774\ub294 \ubc29\ubc95\n", + " - open(filename, mode) \ub0b4\uc7a5 \ud568\uc218\ub85c filename \uc774\ub984\uc744 \uc9c0\ub2cc file \uac1d\uccb4\ub97c \uc5bb\ub294\ub2e4. \n", + " - \uc5bb\uc5b4\uc9c4 \ud30c\uc77c \uac1d\uccb4\uc5d0\uc11c \uc790\ub8cc\ub97c \uc77d\uac70\ub098, \uc4f0\uac70\ub098, \ub367\ubd99\uc774\ub294 \uc791\uc5c5 \uc218\ud589\n", + " - \ubaa8\ub4e0 \uc791\uc5c5\uc774 \ub05d\ub098\uba74 close()\ub97c \ud638\ucd9c\ud558\uc5ec \uc791\uc5c5 \ud504\ub85c\uc138\uc2a4\uc758 \uc790\uc6d0 \uc810\uc720 \ud574\uc81c" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \ud30c\uc77c \uc785\ucd9c\ub825 \ubc29\ubc95\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \ud30c\uc77c \ucc98\ub9ac \ubaa8\ub4dc\uc758 \uc885\ub958\n", + "- open \ub0b4\uc7a5 \ud568\uc218\uc758 \ub450\ubc88\uc9f8 \uc778\uc790 mode \uc124\uba85\n", + " - \ub450\ubc88\uc9f8 \uc778\uc790 mode \uc0dd\ub7b5\uc2dc\uc5d0\ub294 \uc77d\uae30 \uc804\uc6a9(r) \ubaa8\ub4dc\ub85c \uc124\uc815\n", + " \n", + "| Mode | \uac04\ub2e8 \uc124\uba85 | \uc790\uc138\ud55c \uc124\uba85\n", + "|--------|-----------------------------|------------|\n", + "| 'r' | \uc77d\uae30 \uc804\uc6a9 (\uae30\ubcf8 \ubaa8\ub4dc) | \ud30c\uc77c \uac1d\uccb4\ub97c \uc77d\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uace0, \ud30c\uc77c \ud3ec\uc778\ud130\ub97c \ud30c\uc77c \ucc98\uc74c \uc704\uce58\uc5d0 \ub193\ub294\ub2e4.|\n", + "| 'w' | \uc4f0\uae30 \uc804\uc6a9 | \uc0c8\ub85c\uc6b4 \ud30c\uc77c\uc744 \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uac70\ub098 \ud574\ub2f9 \ud30c\uc77c\uc774 \uc774\ubbf8 \uc874\uc7ac\ud558\uba74 \ub0b4\uc6a9\uc744 \ubaa8\ub450 \uc5c6\uc5d0\uba74\uc11c \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uace0, \ud30c\uc77c \ud3ec\uc778\ud130\ub97c \ud30c\uc77c \ucc98\uc74c \uc704\uce58\uc5d0 \ub193\ub294\ub2e4. |\n", + "| 'a' | \ud30c\uc77c \ub05d\uc5d0 \ucd94\uac00 | \uc774\ubbf8 \uc874\uc7ac\ud558\ub294 \ud30c\uc77c\uc744 \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uac70\ub098 \ud30c\uc77c\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc73c\uba74 \uc0c8\ub86d\uac8c \ud30c\uc77c\uc744 \uc0dd\uc131\ud558\uba74\uc11c \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uace0, \ud30c\uc77c \ud3ec\uc778\ud130\ub97c \ud30c\uc77c\uc758 \ub9c8\uc9c0\ub9c9 \uc704\uce58\uc5d0 \ub193\ub294\ub2e4. \uadf8\ub798\uc11c, \uc774\ud6c4 \uc791\uc131\ub418\ub294 \ub0b4\uc6a9\uc740 \ud30c\uc77c\uc758 \ub4b7 \ubd80\ubd84\uc5d0 \ucd94\uac00\ub41c\ub2e4.|\n", + "\n", + " - \uc774\uc9c4 \ud30c\uc77c\ub85c \uc800\uc7a5\uc744 \uc704\ud574\uc11c\ub294 \uc544\ub798 \ubaa8\ub4dc \uc0ac\uc6a9\n", + "\n", + "| Mode | \uac04\ub2e8 \uc124\uba85 |\n", + "|--------|-----------------------------|\n", + "| 'rb' | \uc774\uc9c4 \ud30c\uc77c \uc77d\uae30 \uc804\uc6a9 |\n", + "| 'wb' | \uc774\uc9c4 \ud30c\uc77c \uc4f0\uae30 \uc804\uc6a9 |\n", + "| 'ab' | \uc774\uc9c4 \ud30c\uc77c \ub05d\uc5d0 \ucd94\uac00 |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 \ud30c\uc77c \uc4f0\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "\n", + "print os.getcwd()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "/Users/yhhan/git/python-e-learning\n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = \"\"\"Its power: Python developers typically report \n", + "they are able to develop applications in a half\n", + "to a tenth the amount of time it takes them to do\n", + "the same work in such languages as C.\"\"\"\n", + "f = open('t.txt', 'w')\n", + "f.write(s) # \ubb38\uc790\uc5f4\uc744 \ud30c\uc77c\uc5d0 \uae30\ub85d\n", + "f.close()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 \ud30c\uc77c \uc77d\uae30\n" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = file('t.txt') # f = open('t.txt', 'r')\uacfc \ub3d9\uc77c\n", + "s = f.read()\n", + "print s" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Its power: Python developers typically report \n", + "they are able to develop applications in a half\n", + "to a tenth the amount of time it takes them to do\n", + "the same work in such languages as C.\n" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- close()\uc744 \ub9c8\uc9c0\ub9c9\uc5d0 \ud638\ucd9c\ud558\uc9c0 \uc54a\uc73c\uba74 \ud574\ub2f9 file \uac1d\uccb4\uac00 \ub2e4\ub978 \uac12\uc73c\ub85c \uce58\ud658\ub418\uac70\ub098 \ud504\ub85c\uadf8\ub7a8\uc774 \uc885\ub8cc\ub420 \ub54c \uc790\ub3d9\uc73c\ub85c close()\uac00 \ubd88\ub9ac\uc6cc\uc9c4\ub2e4.\n", + " - \ud558\uc9c0\ub9cc \uba85\uc2dc\uc801\uc73c\ub85c close()\ub97c \ud638\ucd9c\ud558\ub294 \uac83\uc744 \uad8c\uc7a5\ud568" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 \ub77c\uc778 \ub2e8\uc704\ub85c \ud30c\uc77c \uc77d\uae30\n", + "- \ucd1d 4\uac00\uc9c0 \ubc29\ubc95 \uc874\uc7ac\n", + " - \ud30c\uc77c \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790(iterator) \uc774\uc6a9\ud558\uae30\n", + " - \ud30c\uc77c \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790\ub294 \uac01 \ub77c\uc778\ubcc4\ub85c \ub0b4\uc6a9\uc744 \uc77d\uc5b4\uc624\ub3c4\ub85d \uc124\uc815\ub418\uc5b4 \uc788\uc74c\n", + " - \ud30c\uc77c\uc744 \ub77c\uc778\ubcc4\ub85c \uc77d\ub294 \ubc29\ubc95 \uc911 \uac00\uc7a5 \ud6a8\uacfc\uc801\uc784\n", + " - readline(): \ud55c\ubc88\uc5d0 \ud55c\uc904\uc529 \uc77d\ub294\ub2e4.\n", + " - readlines(): \ud30c\uc77c \uc804\uccb4\ub97c \ub77c\uc778 \ub2e8\uc704\ub85c \ub04a\uc5b4\uc11c \ub9ac\uc2a4\ud2b8\uc5d0 \uc800\uc7a5\ud55c\ub2e4.\n", + " - xreadlines(): readlines()\uacfc \uc720\uc0ac\ud558\uc9c0\ub9cc \ud30c\uc77c \uc804\uccb4\ub97c \ud55c\uaebc\ubc88\uc5d0 \uc77d\uc9c0 \uc54a\uace0, \uc0c1\ud669\ubcc4\ub85c \ud544\uc694\ud55c \ub77c\uc778\ub9cc \uc77d\ub294\ub2e4. \ub300\uc6a9\ub7c9\uc758 \ud30c\uc77c\uc744 for \ubb38 \ub4f1\uc73c\ub85c \ub77c\uc778 \ub2e8\uc704\ub85c \uc77d\uc744 \ub54c \ud6a8\uc728\uc801\uc774\ub2e4. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud30c\uc77c \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790 \uc0ac\uc6a9" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = open('t.txt')\n", + "i = 1\n", + "for line in f:\n", + " print i, \":\", line,\n", + " i += 1\n", + "f.close()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 : Its power: Python developers typically report \n", + "2 : they are able to develop applications in a half\n", + "3 : to a tenth the amount of time it takes them to do\n", + "4 : the same work in such languages as C.\n" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- readline() \uc0ac\uc6a9" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = open('t.txt')\n", + "line = f.readline()\n", + "i = 1\n", + "while line:\n", + " print i, \":\", line,\n", + " line = f.readline()\n", + " i += 1\n", + "f.close()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 : Its power: Python developers typically report \n", + "2 : they are able to develop applications in a half\n", + "3 : to a tenth the amount of time it takes them to do\n", + "4 : the same work in such languages as C.\n" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- readlines() \uc0ac\uc6a9\n", + " - \uac01 \ub77c\uc778\uc744 \ubaa8\ub450 \uc77d\uc5b4\uc11c \uba54\ubaa8\ub9ac\uc5d0 \ub9ac\uc2a4\ud2b8\ub85c \uc800\uc7a5\ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = open('t.txt')\n", + "print f.readlines()\n", + "print\n", + "\n", + "f.seek(0)\n", + "i = 1\n", + "for line in f.readlines():\n", + " print i, \":\", line,\n", + " i += 1\n", + "f.close()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['Its power: Python developers typically report \\n', 'they are able to develop applications in a half\\n', 'to a tenth the amount of time it takes them to do\\n', 'the same work in such languages as C.']\n", + "\n", + "1 : Its power: Python developers typically report \n", + "2 : they are able to develop applications in a half\n", + "3 : to a tenth the amount of time it takes them to do\n", + "4 : the same work in such languages as C.\n" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- xreadlines() \uc0ac\uc6a9" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = open('t.txt')\n", + "print f.xreadlines()\n", + "print\n", + "\n", + "f.seek(0)\n", + "i = 1\n", + "for line in f.xreadlines():\n", + " print i, \":\", line,\n", + " i += 1\n", + "f.close()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n", + "1 : 0123456789abcdef\n" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 \ub77c\uc778 \ub2e8\uc704\ub85c \ud30c\uc77c \uc4f0\uae30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- writelines(): \ub9ac\uc2a4\ud2b8 \uc548\uc5d0 \uc788\ub294 \uac01 \ubb38\uc790\uc5f4\uc744 \uc5f0\uc18d\ud574\uc11c \ud30c\uc77c\ub85c \ucd9c\ub825\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "lines = ['first line\\n', 'second line\\n', 'third line\\n']\n", + "f = open('t1.txt', 'w')\n", + "f.writelines(lines)\n", + "f.close()\n", + "\n", + "f = open('t1.txt')\n", + "f.seek(0)\n", + "print f.read()\n", + "f.close()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "first line\n", + "second line\n", + "third line\n", + "\n" + ] + } + ], + "prompt_number": 20 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- write() \uc774\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubb38\uc790\uc5f4\uc744 \uac01 \ub77c\uc778\ubcc4\ub85c \ud30c\uc77c\ub85c \ucd9c\ub825\ud558\ub294 \ubc29\ubc95" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "lines = ['first line', 'second line', 'third line']\n", + "f = open('t1.txt', 'w')\n", + "f.write('\\n'.join(lines))\n", + "f.close()\n", + "\n", + "f = open('t1.txt')\n", + "f.seek(0)\n", + "print f.read()\n", + "f.close()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "first line\n", + "second line\n", + "third line\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud14d\uc2a4\ud2b8 \ud30c\uc77c t.txt\uc758 \ub2e8\uc5b4(\uacf5\ubc31\uc73c\ub85c \ubd84\ub9ac\ub41c \ubb38\uc790\uc5f4) \uc218\ub97c \ucd9c\ub825\ud558\ub294 \ubc29\ubc95" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = open('t.txt')\n", + "s = f.read()\n", + "n = len(s.split())\n", + "print n\n", + "f.close()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "35\n" + ] + } + ], + "prompt_number": 40 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-6 \uae30\uc874 \ud30c\uc77c\uc5d0 \ub0b4\uc6a9 \ucd94\uac00" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = open('removeme.txt', 'w') # \ud30c\uc77c\uc758 \uc0dd\uc131\n", + "f.write('first line\\n')\n", + "f.write('second line\\n')\n", + "f.close()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 23 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = open('removeme.txt', 'a') # \ud30c\uc77c \ucd94\uac00 \ubaa8\ub4dc\ub85c \uc624\ud508\n", + "f.write('third line\\n')\n", + "f.close()\n", + "\n", + "f = open('removeme.txt') # \ud30c\uc77c \uc77d\uae30\n", + "print f.read()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "first line\n", + "second line\n", + "third line\n", + "\n" + ] + } + ], + "prompt_number": 24 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-7 \ud30c\uc77c \ub0b4 \uc784\uc758 \uc704\uce58\ub85c \uc811\uadfc\n", + "- \ud30c\uc77c \ud3ec\uc778\ud130 (pointer)\n", + " - \ud30c\uc77c \ub0b4\uc5d0\uc11c \ud604\uc7ac \uc704\uce58\ub97c \uac00\ub9ac\ud0a4\uace0 \uc788\uc74c\n", + "- \ud30c\uc77c \uc811\uadfc \ubc29\ubc95\n", + " - \uc21c\ucc28 \uc811\uadfc (\uae30\ubcf8 \ubc29\uc2dd): \ud30c\uc77c\uc744 \uc55e\uc5d0\uc11c \ubd80\ud130 \uc21c\ucc28\uc801\uc73c\ub85c \uc77d\uace0 \uc4f0\ub294 \ubc29\uc2dd\n", + " - \uc784\uc758 \uc811\uadfc: \ud30c\uc77c \ub0b4 \uc784\uc758 \uc704\uce58\uc5d0\uc11c \uc77d\uace0 \uc4f0\ub294 \ubc29\uc2dd\n", + " - \uc784\uc758 \uc811\uadfc\uc744 \uc704\ud55c file \uac1d\uccb4 \ud3ec\uc778\ud130 (pointer) \uad00\ub828 \uba54\uc18c\ub4dc\n", + " - seek(n): \ud30c\uc77c\uc758 \uac00\uc7a5 \uccab\ubc88\uc9f8 \uc704\uce58\uc5d0\uc11c n\ubc88\uc9f8 \ubc14\uc774\ud2b8\ub85c \ud3ec\uc778\ud130 \uc774\ub3d9\n", + " - tell(): \ud30c\uc77c \ub0b4 \ud604\uc7ac \ud3ec\uc778\ud130 \uc704\uce58\ub97c \ubc18\ud658" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "name = 't.txt' \n", + "f = open(name, 'w+') # \uc77d\uace0 \uc4f0\uae30\ub85c \uc624\ud508, \ub2e8, \ud30c\uc77c\uc774 \uc774\ubbf8 \uc874\uc7ac\ud55c\ub2e4\uba74 \uae30\uc874 \ud30c\uc77c\uc740 \uc5c6\uc5b4\uc9c0\uace0 \ub2e4\uc2dc \uc0dd\uc131\ub41c\ub2e4.\n", + "s = '0123456789abcdef'\n", + "f.write(s)\n", + "\n", + "f.seek(5) # \uc2dc\uc791\ubd80\ud130 5\ubc14\uc774\ud2b8 \ud3ec\uc778\ud130 \uc774\ub3d9\n", + "print f.tell() # \ud604\uc7ac \uc704\uce58 \ub3cc\ub824\uc90c\n", + "print f.read(1) # 1\ubb38\uc790 \uc77d\uae30\n", + "print f.tell()\n", + "print" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "5\n", + "5\n", + "6\n", + "\n" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ud45c\uc900 \ucd9c\ub825 \ubc29\ud5a5 \uc804\ud658\n", + "***\n", + "\n", + "- sys \ubaa8\ub4c8\uc758 \ud45c\uc900 \uc785\ucd9c\ub825 \uad00\ub828 \uac1d\uccb4\n", + " - sys.stdout: \ud45c\uc900 \ucd9c\ub825\n", + " - sys.stderr: \ud45c\uc900 \uc5d0\ub7ec \ucd9c\ub825\n", + " - sys.stdin: \ud45c\uc900 \uc785\ub825\n", + "- \uc608\ub97c \ub4e4\uc5b4, sys.stdout\uc744 \ud30c\uc77c \uac1d\uccb4\ub85c \ubcc0\ud658\ud558\uba74 \ubaa8\ub4e0 \ud45c\uc900 \ucd9c\ub825(print \ucd9c\ub825)\uc740 \ud574\ub2f9 \ud30c\uc77c\ub85c \uc800\uc7a5\ub41c\ub2e4." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 \ud45c\uc900 \ucd9c\ub825\uc744 \ud30c\uc77c\ub85c \uc800\uc7a5\ud558\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import sys\n", + "\n", + "f = open('t.txt', 'w')\n", + "stdout = sys.stdout # \ud45c\uc900 \ucd9c\ub825 \uc800\uc7a5\ud574 \ub450\uae30\n", + "sys.stdout = f # \ud30c\uc77c \uac1d\uccb4\ub85c \ud45c\uc900 \ucd9c\ub825 \ubcc0\uacbd\n", + "print 'Sample output'\n", + "print 'Good'\n", + "print 'Good'\n", + "f.close()\n", + "sys.stdout = stdout # \ud544\uc694\ud558\uba74 \ud45c\uc900 \ucd9c\ub825 \uc6d0\uc0c1 \ubcf5\uad6c" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = open('t.txt')\n", + "print f.read()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Sample output\n", + "Good\n", + "Good\n" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- print\ub97c \uc9c1\uc811 \uc774\uc6a9\ud558\uc5ec \ucd9c\ub825\uc744 \ub2e4\ub978 \uac1d\uccb4\ub85c \uc804\ud658\ud558\uae30 " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print >> sys.stderr, \"Warning, action field not supplied\"" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stderr", + "text": [ + "Warning, action field not supplied\n" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub3d9\uc77c \ubc29\ubc95\uc73c\ub85c \ud45c\uc900 \ucd9c\ub825(print)\uc744 \ud30c\uc77c \uac1d\uccb4\ub85c \uc804\ud658" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = open('t.txt', 'w')\n", + "print >> f, 'spam string'\n", + "f.close()\n", + "\n", + "f = open('t.txt')\n", + "print f.read()\n", + "f.close()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "spam string\n", + "\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 StringIO \ubaa8\ub4c8 \uc0ac\uc6a9\ud558\uae30\n", + "- StringIO \ubaa8\ub4c8\uc758 StringIO \ud074\ub798\uc2a4 \uac1d\uccb4\n", + " - \ud30c\uc77c \uac1d\uccb4\ucc98\ub7fc \uc785\ucd9c\ub825 \uac00\ub2a5\ud55c \ubb38\uc790\uc5f4 \uac1d\uccb4\n", + " - StringIO\uc5d0 \uc9c0\uc6d0\ub418\ub294 \uba54\uc18c\ub4dc\ub294 \ud30c\uc77c \uac1d\uccb4\uac00 \uc9c0\uc6d0\ud558\ub294 \uba54\uc18c\ub4dc\uc640 \uac70\uc758 \ub3d9\uc77c\ud558\ub2e4.\n", + " - getvalue() \uba54\uc18c\ub4dc\n", + " - \ud604\uc7ac\uae4c\uc9c0 \ub2f4\uc544 \ub193\uc740 \uc804\uccb4 \ub0b4\uc6a9\uc744 \ubc18\ud658\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import StringIO\n", + "\n", + "f = StringIO.StringIO()\n", + "f.write(\"abc\")\n", + "f.seek(0)\n", + "s = f.read()\n", + "print s\n", + "print\n", + "\n", + "s2 = f.getvalue()\n", + "print s2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "abc\n", + "\n", + "abc\n" + ] + } + ], + "prompt_number": 29 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud45c\uc900 \ucd9c\ub825\uc73c\ub85c \ubb38\uc790\uc5f4 \uac1d\uccb4\uc5d0 \ub0b4\uc6a9 \uc791\uc131\ud558\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import sys\n", + "import StringIO\n", + "\n", + "stdout = sys.stdout # \ud45c\uc900 \ucd9c\ub825 \uc800\uc7a5\ud574 \ub450\uae30\n", + "sys.stdout = f = StringIO.StringIO() \n", + "\n", + "print type(f)\n", + "print 'Sample output'\n", + "print 'Good'\n", + "print 'Good'\n", + "\n", + "sys.stdout = stdout" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 30 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = f.getvalue()\n", + "\n", + "print 'Done-------'\n", + "print s" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Done-------\n", + "\n", + "Sample output\n", + "Good\n", + "Good\n", + "\n" + ] + } + ], + "prompt_number": 31 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 \ud30c\uc77c\ub85c\uc758 \uc9c0\uc18d \ubaa8\ub4c8\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc9c0\uc18d\uc131(Persistence)\n", + " - \ud504\ub85c\uadf8\ub7a8 \ub0b4\uc5d0 \uc0dd\uc131\ub41c \uac01\uc885 \uac1d\uccb4\ub4e4\uc744 \ud574\ub2f9 \ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc \uc774\ud6c4\uc5d0\ub3c4 \uc874\uc7ac\ud558\uac8c \ub9cc\ub4e4\uace0, \uadf8\uac83\ub4e4\uc744 \ub3d9\uc77c\ud55c \ub610\ub294 \ub2e4\ub978 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uae30\ub2a5\n", + "- \uc9c0\uc18d\uc131 \uae30\ub2a5\uc744 \uc9c0\uc6d0\ud558\ub294 \ubaa8\ub4c8\n", + " - DBM \uad00\ub828 \ubaa8\ub4c8\n", + " - anydbm, dbm, gdbm, dbhash, dumbdbm\n", + " - anydbm: \uc2dc\uc2a4\ud15c\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud55c \ubaa8\ub4c8 \uc911 \uac00\uc7a5 \ucd5c\uc801\uc758 \ubaa8\ub4c8\uc744 \ubc18\ud658\ud568\n", + " - \uae30\ubcf8\uc801\uc73c\ub85c dumbdbm\uc744 \ubc18\ud658\ud55c\ub2e4\n", + " - \uc0ac\uc804 \uc790\ub8cc\ud615\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uacfc \ub3d9\uc77c\ud55c \ubc29\ubc95\uc73c\ub85c \uc0ac\uc6a9\n", + " - pickle \ubaa8\ub4c8\n", + " - \ud30c\uc774\uc36c\uc758 \uac1d\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \uc77c\ubc18\ud654\ub41c \uc9c0\uc18d\uc131 \ubaa8\ub4c8\n", + " - \ud30c\uc774\uc36c\uc758 \uae30\ubcf8 \uac1d\uccb4\ubfd0\ub9cc \uc544\ub2c8\ub77c \uc0ac\uc6a9\uc790 \uc815\uc758\uc758 \ubcf5\uc7a1\ud55c \uac1d\uccb4\ub3c4 \uc800\uc7a5 \uac00\ub2a5\n", + " - \uae30\ubcf8\uc801\uc73c\ub85c \ud14d\uc2a4\ud2b8 \ubaa8\ub4dc\ub85c \uc800\uc7a5\ud558\uc9c0\ub9cc \uc774\uc9c4 \ubaa8\ub4dc\ub85c\ub3c4 \uc800\uc7a5 \uac00\ub2a5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud53c\ud074\ub9c1(pickling) \ubaa8\ub4c8 \uc0ac\uc6a9\ud558\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import pickle\n", + "\n", + "phone = {'tom':4358382, 'jack':9465215, 'jim':6851325, 'Joseph':6584321}\n", + "List = ['string', 1234, 0.2345]\n", + "Tuple = (phone, List) # \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804\uc758 \ubcf5\ud569 \uac1d\uccb4\n", + "\n", + "f = open('pickle.txt', 'w') # \ud30c\uc77c \uac1d\uccb4\ub97c \uc5bb\ub294\ub2e4.\n", + "\n", + "pickle.dump(Tuple, f) # \ud30c\uc77c\ub85c \ucd9c\ub825(pickling), \ubcf5\ud569 \uac1d\uccb4 \ucd9c\ub825 \n", + "f.close() \n", + "\n", + "f = open('pickle.txt') \n", + " \n", + "x,y = pickle.load(f) # \ud30c\uc77c\uc5d0\uc11c \uc77d\uc5b4\uc624\uae30. \ud29c\ud50c\uc758 \ub0b4\uc6a9\uc744 x, y\uc5d0 \ubc1b\ub294\ub2e4.\n", + "print x # \uc0ac\uc804\n", + "print y # \ub9ac\uc2a4\ud2b8" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "{'jim': 6851325, 'Joseph': 6584321, 'jack': 9465215, 'tom': 4358382}\n", + "['string', 1234, 0.2345]\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import pickle\n", + "\n", + "class Simple: # \uac00\uc7a5 \ub2e8\uc21c\ud55c \ud074\ub798\uc2a4\ub97c \uc815\uc758\n", + " pass\n", + "\n", + "s = Simple() # \uc778\uc2a4\ud134\uc2a4 \uac1d\uccb4 \uc0dd\uc131\n", + "s.count = 10 # \uc778\uc2a4\ud134\uc2a4 \uc774\ub984 \uacf5\uac04\uc5d0 \ubcc0\uc218 \uc0dd\uc131\n", + "\n", + "f = open('pickle2.txt', 'w')\n", + "pickle.dump(s, f) # \uc778\uc2a4\ud134\uc2a4 \uc800\uc7a5\n", + "f.close()\n", + "\n", + "f = open('pickle2.txt')\n", + "t = pickle.load(f) # \uc778\uc2a4\ud134\uc2a4 \uac00\uc838\uc624\uae30\n", + "print t.count" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "10\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python14.ipynb b/python3.6/python14.ipynb new file mode 100644 index 0000000..fb7b84f --- /dev/null +++ b/python3.6/python14.ipynb @@ -0,0 +1,871 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:dd334c6957c3dc2ae7bdb34ebf3a2b75cf1fc20f77f9f62ace43f18da4b929e9" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 14. \ud30c\uc77c\uacfc \ub514\ub809\ud1a0\ub9ac \ub2e4\ub8e8\uae30\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \ud30c\uc77c \ub2e4\ub8e8\uae30\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \ud30c\uc77c \ubaa9\ub85d \uc5bb\uae30\n", + "- os.listdir('\uacbd\ub85c')\n", + " - \ub514\ub809\ud1a0\ub9ac \uc548\uc5d0 \ub4e4\uc5b4 \uc788\ub294 \uac01 \ud30c\uc77c \ubaa9\ub85d \ubc18\ud658" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "\n", + "print os.listdir('.') # \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\uc758 \ud30c\uc77c \ubaa9\ub85d \uc5bb\uae30\n", + "print \n", + "\n", + "print os.listdir('../') # \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\uc758 \ubd80\ubaa8 \ub514\ub809\ud1a0\ub9ac\uc758 \ud30c\uc77c \ubaa9\ub85d \uc5bb\uae30" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['.DS_Store', '.git', '.gitignore', '.ipynb_checkpoints', 'example', 'files', 'images', 'python01.ipynb', 'python02.ipynb', 'python03.ipynb', 'python04.ipynb', 'python05.ipynb', 'python06.ipynb', 'python07.ipynb', 'python08.ipynb', 'python09.ipynb', 'python10.ipynb', 'python11.ipynb', 'python12.ipynb', 'python13.ipynb', 'python14.ipynb', 'python15.ipynb', 'python16.ipynb', 'python17.ipynb', 'python18.ipynb', 'python19.ipynb', 'README.md', 'removeme.txt', 'sample.txt', 't1.txt', 'teststring2.pyc']\n", + "\n", + "['.DS_Store', 'calendar', 'calendar-dev', 'ipython', 'jms', 'jms-scheduler', 'mySpringFrame', 'python-e-learning', 'python-e-learning-movie', 'reviewer-recommend']\n" + ] + } + ], + "prompt_number": 27 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 \ud30c\uc77c \uc885\ub958 \uc54c\uc544\ubcf4\uae30\n", + "- os.path \ubaa8\ub4c8\uc758 \ub2e4\uc74c \ud568\uc218\ub4e4\uc740 \ud30c\uc77c\uc758 \uc885\ub958\ub97c \ud310\ub2e8\ud558\uc5ec True \ub610\ub294 False\ub97c \ubc18\ud658\ud55c\ub2e4.\n", + " - isfile(filepath)\n", + " - \uc21c\uc218 \ud30c\uc77c\uc774\uba74 True\n", + " - isdir(filepath)\n", + " - \ub514\ub809\ud1a0\ub9ac\uc774\uba74 True\n", + " - islink(filepath)\n", + " - \uc2ec\ubcfc\ub9ad\ub9c1\ud06c\uc774\uba74 True" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "def filetype(fpath):\n", + " print fpath, ':',\n", + " if os.path.isfile(fpath):\n", + " print 'Regular file'\n", + " if os.path.isdir(fpath):\n", + " print 'Directory'\n", + " if os.path.islink(fpath):\n", + " print 'Symbolic link'\n", + " \n", + "flist = os.listdir('.')\n", + "for fname in flist:\n", + " filetype(fname)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + ".DS_Store : Regular file\n", + ".git : Directory\n", + ".gitignore : Regular file\n", + ".ipynb_checkpoints : Directory\n", + "example : Directory\n", + "files : Directory\n", + "images : Directory\n", + "module_test.py : Regular file\n", + "module_test.pyc : Regular file\n", + "music : Regular file\n", + "mymath.py : Regular file\n", + "mymath.pyc : Regular file\n", + "pickle.txt : Regular file\n", + "pickle2.txt : Regular file\n", + "python01.ipynb : Regular file\n", + "python02.ipynb : Regular file\n", + "python03.ipynb : Regular file\n", + "python04.ipynb : Regular file\n", + "python05.ipynb : Regular file\n", + "python06.ipynb : Regular file\n", + "python07.ipynb : Regular file\n", + "python08.ipynb : Regular file\n", + "python09.ipynb : Regular file\n", + "python10.ipynb : Regular file\n", + "python11.ipynb : Regular file\n", + "python12.ipynb : Regular file\n", + "python13.ipynb : Regular file\n", + "python14.ipynb : Regular file\n", + "python15.ipynb : Regular file\n", + "python16.ipynb : Regular file\n", + "python17.ipynb : Regular file\n", + "python18.ipynb : Regular file\n", + "python19.ipynb : Regular file\n", + "python20.ipynb : Regular file\n", + "python21.ipynb : Regular file\n", + "README.md : Regular file\n", + "removeme.txt : Regular file\n", + "sample.txt : Regular file\n", + "sample_new.txt : Regular file\n", + "t.txt : Regular file\n", + "t1.txt : Regular file\n", + "t2.txt : Regular file\n" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 \ud30c\uc77c\uc758 \ud5c8\uac00\uad8c\n", + "#### 1) \ud30c\uc77c\uc758 \ud5c8\uac00\uad8c \uc54c\uc544\ubcf4\uae30\n", + "- os.access(filepath, mode)\n", + " - mode\uc5d0 \ub4e4\uc5b4\uac08 \uac12\n", + " - os.F_OK: \ud30c\uc77c \uc790\uccb4\uac00 \uc874\uc7ac\ud558\ub294 \uac83\uc744 \ud14c\uc2a4\ud2b8\n", + " - os.R_OK: \uc77d\uae30 \uad8c\ud55c\uc774 \uc788\ub294 \uac83\uc744 \ud14c\uc2a4\ud2b8\n", + " - os.W_OK: \uc4f0\uae30 \uad8c\ud55c\uc774 \uc788\ub294 \uac83\uc744 \ud14c\uc2a4\ud2b8\n", + " - os.X_OK: \uc2e4\ud589 \uad8c\ud55c\uc774 \uc788\ub294 \uac83(\ub610\ub294 \ub514\ub809\ud1a0\ub9ac\uc778\uc9c0)\uc744 \ud14c\uc2a4\ud2b8" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "def fileaccess(fpath):\n", + " print fpath, ':',\n", + " if os.access(fpath, os.F_OK): \n", + " print 'Exists',\n", + " else: \n", + " return\n", + " if os.access(fpath, os.R_OK): \n", + " print 'R',\n", + " if os.access(fpath, os.W_OK): \n", + " print 'W',\n", + " if os.access(fpath, os.X_OK): \n", + " print 'X',\n", + " print \n", + " \n", + "flist = os.listdir('.')\n", + "for fname in flist:\n", + " fileaccess(fname)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + ".DS_Store : Exists R W\n", + ".git : Exists R W X\n", + ".gitignore : Exists R W\n", + ".ipynb_checkpoints : Exists R W X\n", + "example : Exists R W X\n", + "files : Exists R W X\n", + "images : Exists R W X\n", + "module_test.py : Exists R W\n", + "module_test.pyc : Exists R W\n", + "music : Exists R W\n", + "mymath.py : Exists R W\n", + "mymath.pyc : Exists R W\n", + "pickle.txt : Exists R W\n", + "pickle2.txt : Exists R W\n", + "python01.ipynb : Exists R W\n", + "python02.ipynb : Exists R W\n", + "python03.ipynb : Exists R W\n", + "python04.ipynb : Exists R W\n", + "python05.ipynb : Exists R W\n", + "python06.ipynb : Exists R W\n", + "python07.ipynb : Exists R W\n", + "python08.ipynb : Exists R W\n", + "python09.ipynb : Exists R W\n", + "python10.ipynb : Exists R W\n", + "python11.ipynb : Exists R W\n", + "python12.ipynb : Exists R W\n", + "python13.ipynb : Exists R W\n", + "python14.ipynb : Exists R W\n", + "python15.ipynb : Exists R W\n", + "python16.ipynb : Exists R W\n", + "python17.ipynb : Exists R W\n", + "python18.ipynb : Exists R W\n", + "python19.ipynb : Exists R W\n", + "python20.ipynb : Exists R W\n", + "python21.ipynb : Exists R W\n", + "README.md : Exists R W\n", + "removeme.txt : Exists R W\n", + "sample.txt : Exists R W X\n", + "sample_new.txt : Exists R W\n", + "t.txt : Exists R W\n", + "t1.txt : Exists R W\n", + "t2.txt : Exists R W\n" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) \ud30c\uc77c\uc758 \ud5c8\uac00\uad8c \ubcc0\uacbd\ud558\uae30\n", + "- os.chmod(filepath, mode)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "os.chmod('sample.txt', 0777) # \ub9ac\ub205\uc2a4\uc5d0\uc11c\uc758 \uc2e4\ud589 \uc608" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/chmod.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 \ud30c\uc77c \uc870\uc791\ud558\uae30\n", + "#### 1) \ud30c\uc77c \uc774\ub984 \ubcc0\uacbd\ud558\uae30\n", + "- os.rename(old_filepath, new_filepath)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "os.rename('t.txt', 't1.txt') # t.txt\ub97c t1.txt\ub85c \ubc14\uafbc\ub2e4\n", + "print os.access('t.txt', os.F_OK)\n", + "print os.access('t1.txt', os.F_OK)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "False\n", + "True\n" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) \ud30c\uc77c \uc774\ub3d9\ud558\uae30\n", + "- os.rename(old_filepath, new_filepath)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "os.rename('t1.txt', 'example/t1.txt') # \ud604\uc7ac \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac\uc758 t1.txt\ub97c example\uc5d0 t1.txt\uc774\ub984\uc73c\ub85c \uc62e\uae34\ub2e4.\n", + "print os.access('example/t1.txt', os.F_OK)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) \ud30c\uc77c \ubcf5\uc0ac\ud558\uae30\n", + "- shutil \ubaa8\ub4c8 \ud65c\uc6a9\n", + "- shutil.copyfile(src_filepath, dest_filepath)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import shutil\n", + "shutil.copyfile('sample.txt', 'sample_new.txt')\n", + "print os.access('sample_new.txt', os.F_OK)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n" + ] + } + ], + "prompt_number": 34 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 \ud30c\uc77c \uc774\ub984 \ub2e4\ub8e8\uae30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) \uc0c1\ub300 \uacbd\ub85c\ub97c \uc808\ub300 \uacbd\ub85c\ub85c \ubcc0\ud658\ud558\uae30\n", + "- os.path.abspath(\uc0c1\ub300\uacbd\ub85c)\n", + " - \uc2e4\uc81c \ud30c\uc77c \uc874\uc7ac\uc640\ub294 \ubb34\uad00\ud558\uac8c \uc808\ub300\uacbd\ub85c\ub85c \ubcc0\uacbd\ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "print os.path.abspath('o.txt')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "/Users/yhhan/git/python-e-learning/o.txt\n" + ] + } + ], + "prompt_number": 51 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) \uc8fc\uc5b4\uc9c4 \uacbd\ub85c\uc758 \ud30c\uc77c\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\n", + "- os.path.exists(filepath)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = '/Users/yhhan/git/python-e-learning/sample.txt'\n", + "print os.path.exists(f)\n", + "print os.path.exists('sample.txt')\n", + "print os.path.exists('asdf.txt')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n", + "True\n", + "False\n" + ] + } + ], + "prompt_number": 54 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) \ud604\uc7ac/\ubd80\ubaa8 \ub514\ub809\ud1a0\ub9ac\ub97c \uac00\ub9ac\ud0a4\ub294 \uc774\ub984 \uc5bb\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print os.curdir #\ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\n", + "print os.pardir #\ubd80\ubaa8 \ub514\ub809\ud1a0\ub9ac" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + ".\n", + "..\n" + ] + } + ], + "prompt_number": 25 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4) \ub514\ub809\ud1a0\ub9ac \ubd84\ub9ac \ubb38\uc790 \uc5bb\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print os.sep" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "/\n" + ] + } + ], + "prompt_number": 26 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-6 \uacbd\ub85c\uba85 \ubd84\ub9ac\ud558\uae30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) \uacbd\ub85c\uc640 \ud30c\uc77c\uba85\uc73c\ub85c \ubd84\ub9ac" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = '/Users/yhhan/git/python-e-learning/t.txt'\n", + "\n", + "print os.path.basename(f) # \ud30c\uc77c\uba85\ub9cc \ucd94\ucd9c\n", + "print os.path.dirname(f) # \ub514\ub809\ud1a0\ub9ac \uacbd\ub85c \ucd94\ucd9c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "t.txt\n", + "/Users/yhhan/git/python-e-learning\n" + ] + } + ], + "prompt_number": 57 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) \uacbd\ub85c\uba85\uacfc \ud30c\uc77c\uba85\uc744 \ud55c\ubc88\uc5d0 \ubd84\ub9ac" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print os.path.split(f)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "('/Users/yhhan/git/python-e-learning', 't.txt')\n" + ] + } + ], + "prompt_number": 58 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) MS \uc708\ub3c4\uc6b0\uc988\uc5d0\uc11c \ub4dc\ub77c\uc774\ube0c\uba85\uacfc \ud30c\uc77c \uacbd\ub85c\uba85\uc744 \ubd84\ub9ac" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print os.path.splitdrive(f)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "('', '/Users/yhhan/git/python-e-learning/t.txt')\n" + ] + } + ], + "prompt_number": 59 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4) \ud655\uc7a5\uc790 \ubd84\ub9ac" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print os.path.splitext(f)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "('/Users/yhhan/git/python-e-learning/t', '.txt')\n" + ] + } + ], + "prompt_number": 60 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ub514\ub809\ud1a0\ub9ac \ub2e4\ub8e8\uae30\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 \ub514\ub809\ud1a0\ub9ac\uc5d0 \uad00\ub828\ub41c \uc77c\ubc18 \uc791\uc5c5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) \ud604\uc7ac \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac \uc54c\uc544\ubcf4\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "print os.getcwd()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "/Users/yhhan/git/python-e-learning\n" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac \ubcc0\uacbd\ud558\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "os.chdir('/Users/yhhan/Public/')\n", + "print os.getcwd()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "/Users/yhhan/Public\n" + ] + } + ], + "prompt_number": 20 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) \ub514\ub809\ud1a0\ub9ac \ub9cc\ub4e4\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "\n", + "os.mkdir('temp') # 0755 \uae30\ubcf8 \ubaa8\ub4dc(rwxr-xr-x)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\n", + "os.mkdir('temp2', 0700) # 0700 \ubaa8\ub4dc(rwx------)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\n", + "os.makedirs('temp/level1/level2') #0755 \uae30\ubcf8 \ubaa8\ub4dc, \uc911\uac04\uc5d0 \ud544\uc694\ud55c \ub514\ub809\ud1a0\ub9ac\ub3c4 \ubaa8\ub450\uc0dd\uc131\n", + "\n", + "print os.access('/Users/yhhan/Public/temp', os.F_OK)\n", + "print os.access('/Users/yhhan/Public/temp2', os.F_OK)\n", + "print os.access('/Users/yhhan/Public/temp/level1/level2', os.F_OK)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "OSError", + "evalue": "[Errno 17] File exists: 'temp'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmkdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 0755 \uae30\ubcf8 \ubaa8\ub4dc(rwxr-xr-x)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmkdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp2'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0700\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 0700 \ubaa8\ub4dc(rwx------)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmakedirs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp/level1/level2'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#0755 \uae30\ubcf8 \ubaa8\ub4dc, \uc911\uac04\uc5d0 \ud544\uc694\ud55c \ub514\ub809\ud1a0\ub9ac\ub3c4 \ubaa8\ub450\uc0dd\uc131\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mOSError\u001b[0m: [Errno 17] File exists: 'temp'" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4) \ub514\ub809\ud1a0\ub9ac \uc0ad\uc81c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "os.rmdir('temp2') #\ub514\ub809\ud1a0\ub9ac\uc5d0 \ub0b4\uc6a9\uc774 \uc5c6\uc744 \ub54c \uc0ad\uc81c\uac00\ub2a5" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 42 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "os.rmdir('temp') #\ub514\ub809\ud1a0\ub9ac\uc5d0 \ub2e4\ub978 \ud30c\uc77c\uc774 \uc788\uc73c\uba74 \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc74c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "OSError", + "evalue": "[Errno 66] Directory not empty: 'temp'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrmdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#\ub514\ub809\ud1a0\ub9ac\uc5d0 \ub2e4\ub978 \ud30c\uc77c\uc774 \uc788\uc73c\uba74 \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc74c\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mOSError\u001b[0m: [Errno 66] Directory not empty: 'temp'" + ] + } + ], + "prompt_number": 43 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 5) \ub2e4\ub2e8\uacc4 \ub514\ub809\ud1a0\ub9ac \uc0ad\uc81c\n", + "- os.removedirs(filepath)\n", + " - filepath\uc5d0 \uc9c0\uc815\ub41c \ub514\ub809\ud1a0\ub9ac\ub4e4 \uc911 \ub9e8 \uc624\ub978\ucabd \ub514\ub809\ud1a0\ub9ac \ubd80\ud130 \ucc28\ub840\ucc28\ub840\ub85c \uc0ad\uc81c\ud55c\ub2e4.\n", + " - \ub514\ub809\ud1a0\ub9ac\uc5d0 \ub2e4\ub978 \ud30c\uc77c\uc774 \uc788\uc73c\uba74 \uc0ad\uc81c\ud558\uae30 \uc54a\uace0 \uc911\ub2e8" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "os.removedirs('temp/level1/level2')" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 79 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 6) \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uae4c\uc9c0 \ubaa8\ub450 \ud55c\ubc88\uc5d0 \uc0ad\uc81c\n", + "- shutil.rmtree() \n", + " - \ud30c\uc77c\uc740 \ubb3c\ub860 \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uae4c\uc9c0 \ubaa8\ub450 \ud55c\ubc88\uc5d0 \uc0ad\uc81c \uac00\ub2a5\n", + " - \uc870\uc2ec\ud574\uc11c \uc0ac\uc6a9\ud574\uc57c \ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import shutil\n", + "shutil.rmtree('temp')" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 22 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 7) \ub514\ub809\ud1a0\ub9ac \ubcf5\uc0ac\n", + "- shutil.copytree(src_filepath, dest_filepath)\n", + " - \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uc640 \ud30c\uc77c\ub4f1\uc744 \uc9c0\ub2c8\uace0 \uc788\ub294 \ub514\ub809\ud1a0\ub9ac\ub97c \ubcf5\uc0ac" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "os.mkdir('temp') \n", + "os.mkdir('temp/temp2', 0700)\n", + "shutil.copytree('temp', 'myweb_backup')" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 23 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \ub514\ub809\ud1a0\ub9ac(\ud2b8\ub9ac) \ud0d0\uc0c9\ud558\uae30\n", + "- os.walk(filepath)\n", + " - filepath \ubd80\ud130 \uc2dc\uc791\ud558\uc5ec \uc7ac\uadc0\uc801\uc73c\ub85c \ubaa8\ub4e0 \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uae4c\uc9c0 \ud0d0\uc0c9\uc744 \ud558\ub294 \ud568\uc218\n", + " - \ud0d0\uc0c9\uc2dc \ubc1c\uacac\ud558\ub294 \ubaa8\ub4e0 \ud30c\uc77c\uc5d0 \ub300\ud574\uc11c\ub294 \ub2e4\uc74c \ud29c\ud50c\uc744 \ub9ac\ud134\ud568\n", + " - (dirpath, dirnames, filemnames)\n", + " - dirpath: \ud0d0\uc0c9\ud558\uace0 \uc788\ub294 \ub514\ub809\ud1a0\ub9ac \uacbd\ub85c\n", + " - dirnames: dirpath \uc548\uc5d0 \uc874\uc7ac\ud558\ub294 \uc11c\ube0c \ub514\ub809\ud1a0\ub9ac\uc758 \ub9ac\uc2a4\ud2b8\n", + " - filenames: dirpath \uc548\uc5d0 \uc874\uc7ac\ud558\ub294 \ud30c\uc77c \ub9ac\uc2a4\ud2b8" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc544\ub798 \uc608\ub294 \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\ubd80\ud130 \ubaa8\ub4e0 \ud558\uc704 \ub514\ub809\ud1a0\ub9ac \ub0b4\uc5d0 \uc874\uc7ac\ud558\ub294 \ubaa8\ub4e0 pyc \ud30c\uc77c\uc744 \uc0ad\uc81c\ud558\ub294 \ud504\ub85c\uadf8\ub7a8" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "os.chdir('/Users/yhhan/git/python-e-learning')\n", + "print os.getcwd()\n", + "print\n", + "for path, subdirs, files in os.walk(os.getcwd()):\n", + " for fname in files:\n", + " if fname.endswith('.pyc'):\n", + " fullpath = os.path.join(path, fname)\n", + " print 'removing', fullpath\n", + " os.remove(fullpath)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "/Users/yhhan/git/python-e-learning\n", + "\n", + "removing /Users/yhhan/git/python-e-learning/module_test.pyc\n", + "removing /Users/yhhan/git/python-e-learning/mymath.pyc\n" + ] + } + ], + "prompt_number": 24 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python15.ipynb b/python3.6/python15.ipynb new file mode 100644 index 0000000..26ce69d --- /dev/null +++ b/python3.6/python15.ipynb @@ -0,0 +1,1117 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:656b15dd9bebc0387448c683e6aac1bb080f9d09a975f111de451b9e13225fec" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 15. \ud30c\uc774\uc36c \ud568\uc218\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \ud568\uc218\uc758 \uc815\uc758\uc640 \ud638\ucd9c\n", + "***\n", + "- \ud568\uc218: \uc5ec\ub7ec \uac1c\uc758 Statement\ub4e4\uc744 \ud558\ub098\ub85c \ubb36\uc740 \ub2e8\uc704\n", + "- \ud568\uc218 \uc0ac\uc6a9\uc758 \uc7a5\uc810\n", + " - \ubc18\ubcf5\uc801\uc778 \uc218\ud589\uc774 \uac00\ub2a5\ud558\ub2e4\n", + " - \ucf54\ub4dc\ub97c \ub17c\ub9ac\uc801\uc73c\ub85c \uc774\ud574\ud558\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc900\ub2e4\n", + " - \ucf54\ub4dc\uc758 \uc77c\uc815 \ubd80\ubd84\uc744 \ubcc4\ub3c4\uc758 \ub17c\ub9ac\uc801 \uac1c\ub150\uc73c\ub85c \ub3c5\ub9bd\ud654\ud560 \uc218 \uc788\uc74c\n", + " - \uc218\ud559\uc5d0\uc11c \ubcf5\uc7a1\ud55c \uac1c\ub150\uc744 \ud558\ub098\uc758 \ub2e8\uc21c\ud55c \uae30\ud638\ub85c \ub300\uce58\ud558\ub294 \uac83\uacfc \ube44\uc2b7" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \uac04\ub2e8\ud55c \ud568\uc218\uc758 \uc815\uc758\n", + "- \ud568\uc218 \uc815\uc758\uc2dc \uc0ac\uc6a9\ud558\ub294 \ud0a4\uc6cc\ub4dc: def" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def add(a, b):\n", + " return a+b\n", + "\n", + "print add(1, 2)\n", + "print\n", + "\n", + "def myabs(x):\n", + " if x < 0 : \n", + " x = -x\n", + " return x\n", + "\n", + "print abs(-4)\n", + "print myabs(-4)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "3\n", + "\n", + "4\n", + "4\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 \ud568\uc218 \uac1d\uccb4\uc640 \ud568\uc218 \ud638\ucd9c\n", + "- \ud568\uc218\uc758 \uc774\ub984 \uc790\uccb4\ub294 \ud568\uc218 \uac1d\uccb4\uc758 \ub808\ud37c\ub7f0\uc2a4(Reference)\ub97c \uc9c0\ub2c8\uace0 \uc788\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "print add" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "c = add(10, 30)\n", + "print c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "40\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \uc774\ub984\uc5d0 \uc800\uc7a5\ub41c \ub808\ud37c\ub7f0\uc2a4\ub97c \ub2e4\ub978 \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud558\uc5ec \uadf8 \ubcc0\uc218\ub97c \uc774\uc6a9\ud55c \ud568\uc218 \ud638\ucd9c \uac00\ub2a5 " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = add\n", + "print f(4, 5)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "9\n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print f\n", + "\n", + "print f is add" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "True\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218\uc758 \ubab8\uccb4\uc5d0\ub294 \ucd5c\uc18c\ud55c \ud55c\uac1c \uc774\uc0c1\uc758 statement\uac00 \uc874\uc7ac\ud574\uc57c \ud568\n", + " - \uc544\ubb34\ub7f0 \ub0b4\uc6a9\uc774 \uc5c6\ub294 \ubab8\uccb4\ub97c \uc9c0\ub2cc \ud568\uc218\ub97c \ub9cc\ub4e4 \ub54c\uc5d0\ub294 pass \ub77c\ub294 \ud0a4\uc6cc\ub4dc\ub97c \ubab8\uccb4\uc5d0 \uc801\uc5b4\uc8fc\uc5b4\uc57c \ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def simpleFunction():\n", + " pass\n", + "\n", + "simpleFunction()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \uc0ac\uc6a9 \uc608" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def addmember(members, newmember):\n", + " if newmember not in members: # \uae30\uc874 \uba64\ubc84\uac00 \uc544\ub2c8\uba74\n", + " members.append(newmember) # \ucd94\uac00\n", + "\n", + "members = ['hwang', 'lee', 'park', 'youn'] # \ub9ac\uc2a4\ud2b8\uc5d0 \ucd08\uae30 \uba64\ubc84 \uc124\uc815\n", + "\n", + "addmember(members, 'jo') # \uc0c8\ub85c\uc6b4 \uba64\ubc84 \ucd94\uac00\n", + "\n", + "addmember(members, 'hwang') # (\uc774\ubbf8 \uc874\uc7ac\ud558\ub294) \uc0c8\ub85c\uc6b4 \uba64\ubc84 \ucd94\uac00\n", + "\n", + "print members" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['hwang', 'lee', 'park', 'youn', 'jo']\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 \ud568\uc218 \uc778\uc218\uac12 \uc804\ub2ec\ubc29\ubc95\n", + "- \ud30c\uc774\uc36c\uc5d0\uc11c\uc758 \uc778\uc218\uac12 \uc804\ub2ec \ubc29\ubc95\n", + " - \uae30\ubcf8\uc801\uc73c\ub85c \uac12\uc5d0 \uc758\ud55c \ud638\ucd9c(Call-by-Value)\n", + " - \ud558\uc9c0\ub9cc \ubcc0\uc218\uc5d0 \uc800\uc7a5\ub41c \uac12\uc774 \ucc38\uc870\uac12(Reference)\uc774\ubbc0\ub85c \uc2e4\uc81c\ub85c\ub294 \ucc38\uc870\uc5d0 \uc758\ud55c \ud638\ucd9c(Call-by-Reference)\ub85c \uc2e4\ud589\ub428" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \uc778\uc790\uc5d0 \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) \uac1d\uccb4\uc778 \uc22b\uc790\uac12\uc744 \uc804\ub2ec\n", + " - \ud568\uc218 \ub0b4\uc5d0\uc11c \ub2e4\ub978 \uc22b\uc790\uac12\uc73c\ub85c \uce58\ud658 --> \uc758\ubbf8 \uc5c6\ub294 \uc778\uc790 \uc804\ub2ec" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f1(b):\n", + " b = 100\n", + "\n", + "a = 200\n", + "f1(a)\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "200\n" + ] + } + ], + "prompt_number": 23 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/function_arg_int.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \uc778\uc790\uc5d0 \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) \uac1d\uccb4\uc778 \ubb38\uc790\uc5f4\uc744 \uc804\ub2ec\n", + " - \ud568\uc218 \ub0b4\uc5d0\uc11c \ub2e4\ub978 \ubb38\uc790\uc5f4\ub85c \uce58\ud658 --> \uc758\ubbf8 \uc5c6\ub294 \uc778\uc790 \uc804\ub2ec" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f2(b):\n", + " b = \"abc\"\n", + "\n", + "a = \"def\"\n", + "f2(a)\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "def\n" + ] + } + ], + "prompt_number": 26 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/function_arg_str.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \uc778\uc790\uc5d0 \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) \uac1d\uccb4\uc778 \ud29c\ud50c\uc744 \uc804\ub2ec\n", + " - \ud568\uc218 \ub0b4\uc5d0\uc11c \ub2e4\ub978 \ud29c\ud50c\ub85c \uce58\ud658 --> \uc758\ubbf8 \uc5c6\ub294 \uc778\uc790 \uc804\ub2ec" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f3(b):\n", + " b = (1,2,3)\n", + "\n", + "a = (4,5,6)\n", + "f3(a)\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "(4, 5, 6)\n" + ] + } + ], + "prompt_number": 27 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/function_arg_tuple.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \uc778\uc790\uc5d0 \ubcc0\uacbd\uac00\ub2a5\ud55c(Mutable)\ud55c \uac1d\uccb4\uc778 \ub9ac\uc2a4\ud2b8 \uc804\ub2ec \ubc0f \ub0b4\uc6a9 \uc218\uc815\n", + " - \uc804\ud615\uc801\uc778 \ud568\uc218 \uc778\uc790 \uc804\ub2ec\ubc95 \ubc0f \ud65c\uc6a9\ubc95" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f4(b):\n", + " b[1] = 10\n", + "\n", + "a = [4,5,6]\n", + "f4(a)\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[4, 10, 6]\n" + ] + } + ], + "prompt_number": 30 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/function_arg_list.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \uc778\uc790\uc5d0 \ubcc0\uacbd\uac00\ub2a5\ud55c(Mutable)\ud55c \uac1d\uccb4\uc778 \uc0ac\uc804 \uc804\ub2ec \ubc0f \ub0b4\uc6a9 \uc218\uc815\n", + " - \uc804\ud615\uc801\uc778 \ud568\uc218 \uc778\uc790 \uc804\ub2ec\ubc95 \ubc0f \ud65c\uc6a9\ubc95" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f5(b):\n", + " b['a'] = 10\n", + "\n", + "a = {\"a\":1, \"b\":2}\n", + "f5(a)\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "{'a': 10, 'b': 2}\n" + ] + } + ], + "prompt_number": 33 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/function_arg_dict.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 \ubc18\ud658(return)\ubb38" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc778\uc218 \uc5c6\uc774 return \ubb38\uc744 \uc0ac\uc6a9\ud558\uba74 \uc2e4\uc81c\ub85c\ub294 None \uac1d\uccb4\uac00 \uc804\ub2ec\ub41c\ub2e4.\n", + " - None \uac1d\uccb4: \ud30c\uc774\uc36c \ub0b4\uc7a5 \uac1d\uccb4\ub85c\uc11c \uc544\ubb34 \uac12\ub3c4 \uc5c6\uc74c\uc744 \ub098\ud0c0\ub0b4\uae30 \uc704\ud55c \uac1d\uccb4" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def nothing():\n", + " return\n", + "\n", + "print nothing()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "None\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- return\ubb38 \uc5c6\uc774 \ub9ac\ud134\ud558\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def print_menu():\n", + " print '1. Snack'\n", + " print '2. Snake'\n", + " print '3. Snick'\n", + " \n", + "print_menu()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1. Snack\n", + "2. Snake\n", + "3. Snick\n" + ] + } + ], + "prompt_number": 38 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- return\ubb38 \uc5c6\ub294 \ud568\uc218\ub77c\uace0 \ud560 \uc9c0\ub77c\ub3c4 \uc2e4\uc81c\ub85c\ub294 None \uac1d\uccb4\uac00 \uc804\ub2ec\ub428" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = print_menu()\n", + "\n", + "print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1. Snack\n", + "2. Snake\n", + "3. Snick\n", + "None\n" + ] + } + ], + "prompt_number": 50 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud55c \uac1c\uc758 \uac12\uc744 \ub9ac\ud134\ud560 \ub54c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def abs(x):\n", + " if x < 0 : return -x\n", + " return x\n", + "\n", + "print abs(-10)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "10\n" + ] + } + ], + "prompt_number": 40 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub450 \uac1c \uc774\uc0c1\uc758 \uac12\uc744 \ub9ac\ud134\ud560 \ub54c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def swap(x, y):\n", + " return y, x # \ud29c\ud50c\ub85c \ub9ac\ud134\ub41c\ub2e4.\n", + "\n", + "a = 10\n", + "b = 20\n", + "print a, b\n", + "print \n", + "\n", + "a, b = swap(a, b) # \uacb0\uacfc\uc801\uc73c\ub85c a, b = b, a\uc640 \ub3d9\uc77c\n", + "print a, b\n", + "print\n", + "\n", + "a = 10\n", + "b = 20\n", + "x = swap(a, b)\n", + "print x[0], x[1] # \ud558\ub098\uc758 \uc774\ub984\uc73c\ub85c \ud29c\ud50c\uc744 \ubc1b\uc544\uc11c \ucc98\ub9ac\ud560 \uc218 \ub3c4\uc788\ub2e4." + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "10 20\n", + "\n", + "20 10\n", + "\n", + "20 10\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8\ub97c \ub9ac\ud134\ud558\ub294 \ud568\uc218 \uc608\n", + " - \ubb38\uc790\uc5f4 \ub9ac\uc2a4\ud2b8\ub97c \ubc1b\uc544\uc11c \uac01 \ubb38\uc790\uc5f4\uc758 \uae38\uc774 \uc815\ubcf4\ub97c \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8\ub97c \ub9ac\ud134 " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def length_list(l):\n", + " res = []\n", + " for el in l:\n", + " res.append(len(el))\n", + " return res\n", + "\n", + "l = ['python', 'pyson', 'pythong', 'pydon']\n", + "print length_list(l)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[6, 5, 7, 5]\n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "l = ['python', 'pyson', 'pythong', 'pydon']\n", + "print [len(s) for s in l]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[6, 5, 7, 5]\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 \ud568\uc218 \uc778\uc790\uc5d0 \ub300\ud55c \ub3d9\uc801\uc778 \uc790\ub8cc\ud615 \uacb0\uc815\n", + "- \ud30c\uc774\uc36c\uc5d0\uc11c\ub294 \ubaa8\ub4e0 \uac1d\uccb4\ub294 \ub3d9\uc801\uc73c\ub85c (\uc2e4\ud589\uc2dc\uac04\uc5d0) \uadf8 \ud0c0\uc785\uc774 \uacb0\uc815\ub41c\ub2e4.\n", + "- \uadf8\ub7ec\ubbc0\ub85c, \ud568\uc218 \uc778\uc790\ub294 \ud568\uc218\uac00 \ud638\ucd9c\ub418\ub294 \uc21c\uac04 \ud574\ub2f9 \uc778\uc790\uc5d0 \uc804\ub2ec\ub418\ub294 \uac1d\uccb4\uc5d0 \ub530\ub77c \uadf8 \ud0c0\uc785\uc774 \uacb0\uc815\ub41c\ub2e4.\n", + " - \ud568\uc218 \ubab8\uccb4 \ub0b4\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \uc5ec\ub7ec\uac00\uc9c0 \uc5f0\uc0b0\uc790\ub4e4\uc740 \ud568\uc218 \ud638\ucd9c\uc2dc\uc5d0 \uacb0\uc815\ub41c \uac1d\uccb4 \ud0c0\uc785\uc5d0 \ub9de\uac8c \uc2e4\ud589\ub41c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "c = add(1, 3.4)\n", + "d = add('dynamic', 'typing')\n", + "e = add(['list'], ['and', 'list'])\n", + "print c\n", + "print d\n", + "print e" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "4.4\n", + "dynamictyping\n", + "['list', 'and', 'list']\n" + ] + } + ], + "prompt_number": 49 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ud568\uc218 \uc778\uc218 \ucc98\ub9ac\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 \uae30\ubcf8 \uc778\uc218 \uac12\n", + "- \uae30\ubcf8 \uc778\uc218 \uac12\n", + " - \ud568\uc218\ub97c \ud638\ucd9c\ud560 \ub54c \uc778\uc218\ub97c \ub118\uaca8\uc8fc\uc9c0 \uc54a\uc544\ub3c4 \uc778\uc218\uac00 \uae30\ubcf8\uc801\uc73c\ub85c \uac00\uc9c0\ub294 \uac12" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def incr(a, step=1):\n", + " return a + step\n", + "\n", + "b = 1\n", + "b = incr(b) # 1 \uc99d\uac00\n", + "print b\n", + "\n", + "b = incr(b, 10) # 10 \uc99d\uac00\n", + "print b" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n", + "12\n" + ] + } + ], + "prompt_number": 81 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [\uc8fc\uc758] \ud568\uc218 \uc815\uc758\ub97c \ud560 \ub54c \uae30\ubcf8 \uac12\uc744 \uc9c0\ub2cc \uc778\uc218 \ub4a4\uc5d0 \uc77c\ubc18\uc801\uc778 \uc778\uc218\uac00 \uc62c \uc218 \uc5c6\uc74c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def incr(step=1, a):\n", + " return a + step" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "non-default argument follows default argument (, line 1)", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m def incr(step=1, a):\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-default argument follows default argument\n" + ] + } + ], + "prompt_number": 82 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \uc815\uc758 \uc2dc\uc5d0 \uc5ec\ub7ec \uac1c\uc758 \uae30\ubcf8 \uc778\uc218 \uac12 \uc815\uc758 \uac00\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def incr(a, step=1, step2=10):\n", + " return a + step + step2\n", + "\n", + "print incr(10)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "21\n" + ] + } + ], + "prompt_number": 83 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \ud0a4\uc6cc\ub4dc \uc778\uc218\n", + "- \ud0a4\uc6cc\ub4dc \uc778\uc218\n", + " - \uc778\uc218 \uac12 \uc804\ub2ec \uc2dc\uc5d0 \uc778\uc218 \uc774\ub984\uacfc \ud568\uaed8 \uac12\uc744 \uc804\ub2ec\ud558\ub294 \ubc29\uc2dd\uc744 \uc77c\uceeb\ub294\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def area(height, width):\n", + " return height * width\n", + "\n", + "#\uc21c\uc11c\uac00 \uc544\ub2cc \uc774\ub984\uc73c\ub85c \uac12\uc774 \uc804\ub2ec\n", + "a = area(height='height string ', width=3)\n", + "print a\n", + "\n", + "b = area(width=20, height=10)\n", + "print b" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "height string height string height string \n", + "200\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218\ub97c \ud638\ucd9c \ud560 \ub54c\uc5d0 \ud0a4\uc6cc\ub4dc \uc778\uc218\ub294 \ub9c8\uc9c0\ub9c9\uc5d0 \ub193\uc5ec\uc838\uc57c \ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print area(20, width=5)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "100\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [\uc8fc\uc758] \ud568\uc218 \ud638\ucd9c\uc2dc\uc5d0 \ud0a4\uc6cc\ub4dc \uc778\uc218 \ub4a4\uc5d0 \uc77c\ubc18 \uc778\uc218 \uac12\uc774 \uc62c \uc218 \uc5c6\ub2e4. " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "area(width=5, 20)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "non-keyword arg after keyword arg (, line 1)", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m area(width=5, 20)\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-keyword arg after keyword arg\n" + ] + } + ], + "prompt_number": 80 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uae30\ubcf8 \uc778\uc218\uac12 \ubc0f \ud0a4\uc6cc\ub4dc \uc778\uc218\uc758 \ud63c\uc6a9" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def incr(a, step=1, step2=10, step3=100):\n", + " return a + step + step2 + step3\n", + "\n", + "print incr(10, 2, step2=100)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "212\n" + ] + } + ], + "prompt_number": 88 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \ud638\ucd9c \uc2dc\uc5d0 \ud0a4\uc6cc\ub4dc \uc778\uc218 \ub4a4\uc5d0 \uc77c\ubc18 \uc778\uc218 \uac12\uc774 \uc624\uba74 \uc5d0\ub7ec " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def incr(a, step=1, step2=10, step3=100):\n", + " return a + step + step2 + step3\n", + "\n", + "print incr(10, 2, step2=100, 200)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "non-keyword arg after keyword arg (, line 4)", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m print incr(10, 2, step2=100, 200)\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-keyword arg after keyword arg\n" + ] + } + ], + "prompt_number": 89 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def incr(a, step=1, step2=10, step3=100):\n", + " return a + step + step2 + step3\n", + "\n", + "print incr(10, 2, step2=100, step3=200)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "312\n" + ] + } + ], + "prompt_number": 90 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 \uac00\ubcc0 \uc778\uc218 \ub9ac\uc2a4\ud2b8\n", + "- \ud568\uc218 \uc815\uc758\uc2dc\uc5d0 \uc77c\ubc18\uc801\uc778 \uc778\uc218 \uc120\uc5b8 \ub4a4\uc5d0 *var \ud615\uc2dd\uc758 \uc778\uc218\ub85c \uac00\ubcc0 \uc778\uc218\ub97c \uc120\uc5b8\ud560 \uc218 \uc788\uc74c\n", + " - var\uc5d0\ub294 \ud568\uc218 \ud638\ucd9c\uc2dc \ub123\uc5b4\uc8fc\ub294 \uc778\uc218 \uac12\ub4e4 \uc911 \uc77c\ubc18 \uc778\uc218\uc5d0 \ud560\ub2f9\ub418\ub294 \uac12\uc744 \uc81c\uc678\ud55c \ub098\uba38\uc9c0 \uac12\ub4e4\uc744 \uc9c0\ub2cc \ud29c\ud50c \uac1d\uccb4\uac00 \ud560\ub2f9\ub41c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def varg(a, *arg):\n", + " print a, arg\n", + "\n", + "varg(1)\n", + "varg(2,3)\n", + "varg(2,3,4,5,6)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 ()\n", + "2 (3,)\n", + "2 (3, 4, 5, 6)\n" + ] + } + ], + "prompt_number": 91 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- C\uc5b8\uc5b4\uc758 printf\ubb38\uacfc \uc720\uc0ac\ud55c \ud615\ud0dc\uc758 printf \uc815\uc758 \ubc29\ubc95" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def printf(format, *args):\n", + " print format % args\n", + "\n", + "printf(\"I've spent %d days and %d night to do this\", 6, 5)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I've spent 6 days and 5 night to do this\n" + ] + } + ], + "prompt_number": 84 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-5 \ud29c\ud50c \uc778\uc218\uc640 \uc0ac\uc804 \uc778\uc218\ub85c \ud568\uc218 \ud638\ucd9c\ud558\uae30\n", + "- \ud568\uc218 \ud638\ucd9c\uc5d0 \uc0ac\uc6a9\ub420 \uc778\uc218\uac12\ub4e4\uc774 \ud29c\ud50c\uc5d0 \uc788\ub2e4\uba74 \"*\ud29c\ud50c\ubcc0\uc218\"\ub97c \uc774\uc6a9\ud558\uc5ec \ud568\uc218 \ud638\ucd9c\uc774 \uac00\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def h(a, b, c):\n", + " print a,b,c\n", + " \n", + "args = (1, 2, 3)\n", + "h(*args)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 2 3\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud568\uc218 \ud638\ucd9c\uc5d0 \uc0ac\uc6a9\ub420 \uc778\uc218\uac12\ub4e4\uc774 \uc0ac\uc804\uc5d0 \uc788\ub2e4\uba74 \"*\uc0ac\uc804\ubcc0\uc218\"\ub97c \uc774\uc6a9\ud558\uc5ec \ud568\uc218 \ud638\ucd9c\uc774 \uac00\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "dargs = {'a':1, 'b':2, 'c':3}\n", + "h(**dargs)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 2 3\n" + ] + } + ], + "prompt_number": 88 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python16.ipynb b/python3.6/python16.ipynb new file mode 100644 index 0000000..b84b26f --- /dev/null +++ b/python3.6/python16.ipynb @@ -0,0 +1,732 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 16. 람다 함수\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. 람다(lambda) 함수 정의\n", + "---\n", + "- 람다(lambda) 함수 (or 축약 함수): https://wikidocs.net/64\n", + " - 일반적인 함수를 한 줄의 문(Statement)으로 정의할 수 있는 새로운 함수 정의 리터럴\n", + " - 함수 몸체에는 식(expression)만이 올 수 있다. \n", + " - 대부분의 경우 함수 이름을 정의하지 않으면서 일회성으로 활용할 함수를 정의할 때 활용\n", + " - 구문(syntax)\n", + " - lambda 콤마로 구분된 인수들: 식(expression)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 람다 함수 정의 예" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인수가 한 개 있는 람다 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + } + ], + "source": [ + "f = lambda x: x + 1\n", + "print f(1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인수가 두 개 있는 람다 함수를 지니는 변수 지정 및 함수 호출" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n" + ] + } + ], + "source": [ + "g = lambda x, y: x + y\n", + "print g(1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 기본 인수를 지니는 람다 함수 정의" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11\n", + "15\n" + ] + } + ], + "source": [ + "incr = lambda x, inc = 1: x + inc\n", + "print incr(10) #inc 기본 인수 값으로 1 사용\n", + "print incr(10, 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 가변 인수를 지니는 람다 함수 정의" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(2, 3, 4, 5)\n" + ] + } + ], + "source": [ + "vargs = lambda x, *args: args\n", + "print vargs(1,2,3,4,5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 람다 함수 사용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" + ] + } + ], + "source": [ + "def f1(x):\n", + " return x*x + 3*x - 10\n", + "\n", + "def f2(x):\n", + " return x*x*x\n", + "\n", + "def g(func):\n", + " return [func(x) for x in range(-10, 10)]\n", + "\n", + "print g(f1)\n", + "print g(f2)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" + ] + } + ], + "source": [ + "def g(func):\n", + " return [func(x) for x in range(-10, 10)]\n", + "\n", + "print g(lambda x: x*x + 3*x - 10)\n", + "print g(lambda x: x*x*x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 람다 함수를 사용하는 코드 예제" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0. add\n", + "1. sub\n", + "2. mul\n", + "3. div\n", + "4. quit\n" + ] + } + ], + "source": [ + "# 더하기, 빼기, 곱하기, 나누기에 해당하는 람다 함수 리스트 정의\n", + "func = [lambda x, y: x + y, lambda x, y: x - y, lambda x, y: x * y, lambda x, y: x / y]\n", + "\n", + "def menu():\n", + " print \"0. add\"\n", + " print \"1. sub\"\n", + " print \"2. mul\"\n", + " print \"3. div\"\n", + " print \"4. quit\"\n", + " return input('Select menu:')\n", + "\n", + "while 1:\n", + " sel = menu() \n", + " if sel < 0 or sel > len(func): \n", + " continue\n", + " if sel == len(func): \n", + " break\n", + " x = input('First operand:') \n", + " y = input('Second operand:') \n", + " print 'Result =', func[sel](x,y) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 람다 함수의 활용\n", + "***\n", + "- map, filter, reduce 내장 함수\n", + " - 첫번째 인자: function\n", + " - 첫번째 일반적으로 람다 함수를 인자로 받는다.\n", + " - 두번째 인자: 시퀀스 자료형 (문자열, 리스트, 튜플)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 map 내장 함수\n", + "- map(function, seq)\n", + " - seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 결과를 동일 시퀀스 자료형으로 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 4, 9, 16, 25]\n" + ] + } + ], + "source": [ + "def f(x):\n", + " return x * x\n", + "\n", + "X = [1, 2, 3, 4, 5]\n", + "Y = map(f, X)\n", + "print Y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- map 내장 함수를 사용하지 않을 때 코드" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 4, 9, 16, 25]\n" + ] + } + ], + "source": [ + "def f(x):\n", + " return x * x\n", + "\n", + "X = [1, 2, 3, 4, 5]\n", + "Y = []\n", + "for x in X:\n", + " y = f(x)\n", + " Y.append(y)\n", + "print Y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- map과 람다 함수를 동시에 사용하는 코드 (가장 추천하는 코드)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 4, 9, 16, 25]\n" + ] + } + ], + "source": [ + "X = [1, 2, 3, 4, 5]\n", + "print map(lambda x: x * x, X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- range(10)의 모든 값 x에 대해 f = x \\* x + 4 * x + 5의 계산 결과를 리스트로 구함" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 10, 17, 26, 37, 50, 65, 82, 101, 122]\n" + ] + } + ], + "source": [ + "Y = map(lambda x: x * x + 4 * x + 5, range(10))\n", + "print Y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 각 단어들의 길이 리스트" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 6, 11]\n" + ] + } + ], + "source": [ + "y = map(lambda x: len(x), [\"Hello\", \"Python\", \"Programming\"])\n", + "print y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 filter 내장 함수\n", + "- filter(function, seq)\n", + " - seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 결과가 참인 원소값들만을 동일 시퀀스 자료형으로 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print filter(lambda x: x > 2, [1, 2, 3, 34])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위 코드는 아래와 동일하다." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[3, 34]\n" + ] + } + ], + "source": [ + "y = []\n", + "for x in [1, 2, 3, 34]:\n", + " if x > 2:\n", + " y.append(x)\n", + "print y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 주어진 시퀀스 내에 있는 정수중 홀수만 필터링" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print filter(lambda x: x % 2, [1, 2, 3, 4, 5, 6])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 주어진 시퀀스 내에 있는 정수중 짝수만 필터링" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print filter(lambda x: x % 2 - 1, [1, 2, 3, 4, 5, 6])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 특정 범위에 있는 정수만 필터링" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 3, 4]\n" + ] + } + ], + "source": [ + "def F():\n", + " x = 1\n", + " print filter(lambda a: a > x, range(-5, 5))\n", + " \n", + "F()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- filter의 결과는 주어진 seq 자료형과 동일함" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[3, 34]\n", + "(3, 34)\n", + "ABCDEF\n" + ] + } + ], + "source": [ + "print filter(lambda x: x > 2, [1, 2, 3, 34])\n", + "print filter(lambda x: x > 2, (1, 2, 3, 34))\n", + "print filter(lambda x: x < 'a', 'abcABCdefDEF')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 reduce 내장 함수\n", + "- reduce (function, seq[, initial])\n", + " - seq 시퀀스 자료형이 지닌 원소값들에 대해 function 함수를 적용하면서 하나의 값으로 매핑한다.\n", + " - 첫번째 인자인 function 함수는 반드시 두 개의 인자 (예를 들어, x, y)를 받아야 한다.\n", + " - seq 시퀀스 자료형의 각 원소값들은 각 단계별로 y에 순차적으로 들어간다. \n", + " - 함수가 수행된 값은 각 단계별로 x에 순차적으로 들어간다.\n", + " - 추가적으로 제공가능한 세번째 인자인 initial은 첫번째 단계에 x에 할당할 초기값으로 사용된다. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "15\n" + ] + } + ], + "source": [ + "print reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 단계 | x | y | reduce |\n", + "|-----|---|---|---------|\n", + "| 1 | 0 | 1 | 1 |\n", + "| 2 | 1 | 2 | 3 |\n", + "| 3 | 3 | 3 | 6 |\n", + "| 4 | 6 | 4 | 10 |\n", + "| 5 | 10| 5 | 15 | " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- initial 값 할당" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "115\n" + ] + } + ], + "source": [ + "print reduce(lambda x, y: x + y, [1, 2, 3, 4, 5], 100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 1부터 10까지 각 수에 대한 제곱값을 모두 더한 결과 구함" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "385\n" + ] + } + ], + "source": [ + "print reduce(lambda x, y: x + y * y, range(1, 11), 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "385\n" + ] + } + ], + "source": [ + "x = 0\n", + "for y in range(1, 11):\n", + " x = x + y * y\n", + "print x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열 순서 뒤집기" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "edcba\n" + ] + } + ], + "source": [ + "print reduce(lambda x, y: y + x, 'abcde')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 단계 | x | y | reduce |\n", + "|-----|---|---|---------|\n", + "| 1 | '' | 'a' | 'a' |\n", + "| 2 | 'a' | 'b' | 'ba' |\n", + "| 3 | 'ba' | 'c' | 'cba' |\n", + "| 4 | 'cba' | 'd' | 'dcba' |\n", + "| 5 | 'dcba' | 'e' | 'edcba' | " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python3.6/python17.ipynb b/python3.6/python17.ipynb new file mode 100644 index 0000000..f7551c0 --- /dev/null +++ b/python3.6/python17.ipynb @@ -0,0 +1,653 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 17. 파이썬 모듈\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 이름 공간\n", + "***\n", + "- 이름 공간 또는 스코프 (Naming Space or Scope): 이름이 존재하는 장소. 파이썬은 실행 시간에 각 이름들을 적절한 이름 공간에 넣어 관리한다.\n", + "- 이름 공간(스코프)의 종류\n", + " - 지역(Local): 각 함수 내부\n", + " - 전역(Global): 모듈 (파일) 내부\n", + " - 내장(Built-in): 파이썬 언어 자체에서 정의한 영역\n", + "- 변수가 정의되는 위치에 의해 변수의 스코프가 정해짐\n", + " - 파이썬에서 변수의 정의\n", + " - 변수가 l-value로 사용될 때\n", + "- 변수가 r-value로 사용될 때 해당 변수의 값을 찾는 순서 규칙\n", + " - L --> G --> B" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/scoping_rule.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 지역변수와 전역변수\n", + "- 변수의 스코프는 해당 변수가 l-value로서 정의되는 위치에 따라 달라짐\n", + "- 변수가 함수 내에서 정의되면 해당 함수의 지역 변수가 된다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "30\n", + "5\n" + ] + } + ], + "source": [ + "# g, h는 전역 변수\n", + "g = 10\n", + "h = 5\n", + "\n", + "def f(a): # a는 지역 변수\n", + " h = a + 10 # h는 지역, 새로 l-value로 정의했음\n", + " b = h + a + g # b도 지역, g는 r-value이므로 기존 값을 참조 - 전역 변수\n", + " return b\n", + "\n", + "print f(h) # 함수 호출시에 사용되는 변수는 해당 위치의 스코프에서 값을 찾음 - 전역 변수\n", + "print h # 전역 변수 h는 변함 없음" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 내부에서 전역 변수를 직접 사용하고자 할 때\n", + " - global 키워드 활용" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20\n", + "20\n" + ] + } + ], + "source": [ + "h = 5\n", + "\n", + "def f(a): # a는 지역\n", + " global h # h 변수를 전역이라고 미리 선언함\n", + " h = a + 10 # h는 l-velue로 정의되더라도 미리 선언된 내용 때문에 전역 변수\n", + " return h\n", + "\n", + "print f(10)\n", + "print h # 전역 변수 h 값이 함수 내에서 변경되었음" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [주의] 동일 함수 내에서 동일한 변수가 지역변수와 전역변수로 동시에 활용될 수 없음\n", + " - 함수 내에서 정의되는 변수는 지역 변수로 간주\n", + " - 지역 변수로 선언되기 이전에 해당 변수를 사용할 수 없음" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "UnboundLocalError", + "evalue": "local variable 'g' referenced before assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mUnboundLocalError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mf\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg\u001b[0m \u001b[0;31m# r-value로 사용되는 g는 전역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m20\u001b[0m \u001b[0;31m# l-value로 정의되는 g는 지역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mUnboundLocalError\u001b[0m: local variable 'g' referenced before assignment" + ] + } + ], + "source": [ + "g = 10\n", + "\n", + "def f():\n", + " a = g # r-value로 사용되는 g는 전역 변수\n", + " g = 20 # l-value로 정의되는 g는 지역 변수\n", + " return a\n", + "\n", + "print f()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "20\n" + ] + } + ], + "source": [ + "g = 10\n", + "\n", + "def f():\n", + " global g # g는 전역 변수로 선언됨\n", + " a = g # a는 지역 변수, g는 전역 변수\n", + " g = 20 # g는 전역 변수\n", + " return a\n", + "\n", + "print f()\n", + "print g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 특정 공간의 이름 목록 얻기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 이름(Name)\n", + " - 변수 (객체) 이름\n", + " - 함수 이름\n", + " - 클래스 이름\n", + " - 모듈 이름\n", + "- dir(): 함수가 호출된 스코프에서 정의되어 있는 모든 Name들을 문자열 리스트로 반환한다. \n", + "- dir(object): object이 지니고 있는 모든 Name들을 문자열 리스트로 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" + ] + } + ], + "source": [ + "l = []\n", + "print dir(l)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 함수의 중첩 영역(Nested Scopes) 지원\n", + "- Nested Scope: 함수 안에 정의되어 있는 함수 내부\n", + " - 가장 안쪽의 스코프부터 바깥쪽의 스코프쪽으로 변수를 찾는다." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n" + ] + } + ], + "source": [ + "x = 2\n", + "def F():\n", + " x = 1\n", + " def G():\n", + " print x\n", + " G()\n", + "\n", + "F()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 모듈의 정의\n", + "***\n", + "- 모듈: 파이썬 프로그램 파일로서 파이썬 데이터와 함수등을 정의하고 있는 단위\n", + " - 서로 연관된 작업을 하는 코드들을 묶어서 독립성을 유지하되 재사용 가능하게 만드는 단위\n", + " - 모듈을 사용하는 측에서는 모듈에 정의된 함수나 변수 이름을 사용\n", + "\n", + "- 모듈의 종류\n", + " - 표준 모듈\n", + " - 파이썬 언어 패키지 안에 기본적으로 포함된 모듈\n", + " - 대표적인 표준 모듈 예\n", + " - math, string\n", + " - 사용자 생성 모듈\n", + " - 개발자가 직접 정의한 모듈\n", + " - 써드 파티 모듈\n", + " - 다른 업체나 개인이 만들어서 제공하는 모듈" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 모듈은 어디에 저장되는가\n", + "- 모듈이 정의되고 저장되는 곳은 파일\n", + " - 파일\n", + " - 모듈 코드를 저장하는 물리적인 단위\n", + " - 모듈\n", + " - 논리적으로 하나의 단위로 조직된 코드의 모임\n", + "- 파이썬 모듈이 정의되는 파일의 확장자: .py\n", + "- 다른 곳에서 모듈을 사용하게 되면 해당 모듈의 .py는 바이트 코드로 컴파일 되어 .pyc로 존재한다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 사용자 모듈 만들기와 호출하기" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#File: mymath.py\n", + "mypi = 3.14\n", + "\n", + "def add(a, b):\n", + " return a + b\n", + "\n", + "def area(r):\n", + " return mypi * r * r" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 모듈 이름은 해당 모듈을 정의한 파일 이름에서 .py를 제외한 것\n", + " - 모듈을 불러오는 키워드: import\n", + "- 모듈에서 정의한 이름 사용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "50.24\n", + "['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'add', 'area', 'mypi']\n", + "3.14\n", + "78.5\n" + ] + } + ], + "source": [ + "import mymath\n", + "\n", + "print dir(mymath) # mymath에 정의된 이름들 확인하기\n", + "print mymath.mypi # mymath 안에 정의된 mypi를 사용한다\n", + "print mymath.area(5) # mymath 안에 정의된 area를 사용한다" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 모듈을 왜 사용하는가?\n", + "- 함수와 모듈\n", + " - 함수: 파일 내에서 일부 코드를 묶는 것\n", + " - 모듈: 파일 단위로 코드들을 묶는 것\n", + " - 비슷하거나 관련된 일을 하는 함수나 상수값들을 모아서 하나의 파일에 저장하고 추후에 재사용하는 단위\n", + "- 모듈 사용의 이점\n", + " - 코드의 재사용\n", + " - 프로그램 개발시에 전체 코드들을 여러 모듈 단위로 분리하여 설계함으로써 작업의 효율을 높일 수 있음\n", + " - 별도의 이름 공간(스코프)를 제공함으로써 동일한 이름의 여러 함수나 변수들이 각 모듈마다 독립적으로 정의될 수 있다.\n", + "- 별도 파일 내에 파이썬 코드를 저장할 때 (즉, 모듈을 코딩할 때) 한글 처리\n", + " - 파일의 맨 위에 다음 코드를 넣어 준다.\n", + " - \\# -\\*- coding:utf-8 -*-\n", + "- 모듈은 하나의 독립된 이름 공간을 확보하면서 정의된다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 모듈이 지닌 이름들 알아보기\n", + "- dir(모듈): 모듈이 지니고 있는 모든 이름들을 리스트로 반환 " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Formatter', 'Template', '_TemplateMetaclass', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_float', '_idmap', '_idmapL', '_int', '_long', '_multimap', '_re', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'atof', 'atof_error', 'atoi', 'atoi_error', 'atol', 'atol_error', 'capitalize', 'capwords', 'center', 'count', 'digits', 'expandtabs', 'find', 'hexdigits', 'index', 'index_error', 'join', 'joinfields', 'letters', 'ljust', 'lower', 'lowercase', 'lstrip', 'maketrans', 'octdigits', 'printable', 'punctuation', 'replace', 'rfind', 'rindex', 'rjust', 'rsplit', 'rstrip', 'split', 'splitfields', 'strip', 'swapcase', 'translate', 'upper', 'uppercase', 'whitespace', 'zfill']\n" + ] + } + ], + "source": [ + "import string\n", + "print dir(string)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-5 이름 공간을 제공하는 다른 예들\n", + "- 독립된 이름 공간(스코프)을 제공하는 것들\n", + " - 모듈\n", + " - 클래스\n", + " - 객체\n", + " - 함수" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- string 모듈 이름 공간에 변수 a를 생성한다.\n", + " - 표준 모듈에 사용자가 정의하는 이름을 생성하는 것은 비추천\n", + " - 단지 모듈 자체가 독립적인 이름 공간을 제공한다는 것을 알려줌" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n" + ] + } + ], + "source": [ + "import string\n", + "string.a = 1\n", + "print string.a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 클래스도 독립적인 이름 공간" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "2\n" + ] + } + ], + "source": [ + "class C: # 클래스도 독립적인 이름 공간\n", + " a = 2 # 클래스 이름 공간 내에 변수 선언\n", + " pass # 클래스 정의 완료\n", + "\n", + "c = C() # 클래스 인스턴스 객체 생성\n", + "c.a = 1 # 클래스에서 생성된 인스턴스 객체도 별도의 이름 공간\n", + "print c.a\n", + "print c.__class__.a\n", + "print C.a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수도 독립적인 이름 공간\n", + " - 다만 함수 내에서 선언된 로컬 변수는 함수 외부에서 접근할 수 없다." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "\n" + ] + }, + { + "ename": "AttributeError", + "evalue": "'function' object has no attribute 'a'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mprint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: 'function' object has no attribute 'a'" + ] + } + ], + "source": [ + "x = 10 # 현재 모듈 내부에 정의되는 이름\n", + "def f():\n", + " a = 1\n", + " b = 2 # 현재 모듈에 정의되는 함수 f 내에 이름 a,b를 정의하고있다. 함수도 독립적인 이름 공간\n", + "f.c = 1\n", + "print f.c\n", + "print\n", + "print f.a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 모듈 검색 경로\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 PYTHONPATH 환경 변수 설정하기\n", + "- 파이썬이 모듈을 찾는 순서\n", + " - 1) 이미 메모리에 로딩되어진 것\n", + " - 2) 현재 디렉토리 (ipython에서 pwd 명령으로 확인 가능)\n", + " - 3) PYTHONPATH 환경 변수에 기술된 디렉토리 목록을 차례로 탐색\n", + " - 4) 표준 라이브러리 디렉토리들\n", + " - sys 모듈 임포트 후 sys.path 로 확인 가능\n", + " - sys.path.append(), sys.path.remove()로 추가, 삭제 가능\n", + "- PYTHONPATH 환경 변수 설정 방법\n", + " - 윈도우즈\n", + " - 제어판\\시스템 및 보안\\시스템\\고급 시스템 설정\\환경 변수\n", + " - 새로 만들기: 변수 이름 - PYTHONPATH, 변수 값 - C:\\Users\\yhhan\\mypythonlib\n", + " - python 새로 시작하기 (cmd창 새로 시작한 후)\n", + " - MAC이나 리눅스\n", + " - ~/.bash_profile 혹은 ~/.profile 파일에 다음 라인 추가\n", + " - export PYTHONPATH=/Users/yhhan/mypythonlib\n", + " - 터미널 창에서 다음 명령어 수행 \n", + " - source ~/.bash_profile\n", + " - 이클립스에서 PYTHONPATH 설정\n", + " - [참고] https://goo.gl/crPFi0 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/pythonpath_eclipse.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 코드 내에서 모듈 검색 경로 확인하기" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python27.zip', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-darwin', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-mac', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-mac/lib-scriptpackages', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-tk', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-old', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-dynload', '/Users/yhhan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/site-packages', '/Users/yhhan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/IPython/extensions']\n" + ] + } + ], + "source": [ + "import sys\n", + "print sys.path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 모듈의 검색 경로 동적으로 바꾸기" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python27.zip', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-darwin', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-mac', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-mac/lib-scriptpackages', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-tk', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-old', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-dynload', '/Users/yhhan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/site-packages', '/Users/yhhan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/IPython/extensions', '~/mypythonlib']\n" + ] + } + ], + "source": [ + "import sys\n", + "\n", + "sys.path.append('~/mypythonlib')\n", + "print sys.path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [Root]", + "language": "python", + "name": "Python [Root]" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python3.6/python18.ipynb b/python3.6/python18.ipynb new file mode 100644 index 0000000..f343912 --- /dev/null +++ b/python3.6/python18.ipynb @@ -0,0 +1,751 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 18. 모듈의 활용 및 패키지\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 모듈의 다양한 import 방법\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 모듈 import 하기\n", + "#### 1) import 모듈명\n", + "- 가장 기본적인 형태\n", + " - 이름 공간 mymath가 그대로 유지되므로 mymath.area() 형태로 자격 이름 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "78.5\n" + ] + } + ], + "source": [ + "import mymath\n", + "print mymath.area(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) from 모듈명 import 이름들\n", + "- 해당 모듈에 존재하는 지정 이름들을 현재 이름 공간으로 불러들인다.\n", + "- 불러들인 각 이름들은 모듈 이름 없이 직접 사용 가능하다.\n", + "- import 하는 이름들이 기존에 미리 존재하고 있었다면 그 이름들에 의해 참조되던 기존 객체들은 상실된다." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "78.5\n" + ] + } + ], + "source": [ + "from mymath import area, mypi\n", + "print area(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) from 모듈명 import *\n", + "- 해당 모듈에 존재하는 '\\_\\_'로 시작되는 이름들을 제외한 모든 이름들을 현재 이름 공간으로 불러들인다. " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "78.5\n" + ] + } + ], + "source": [ + "from mymath import *\n", + "print area(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4) import 모듈명 as 새로운 모듈 이름\n", + "- 해당 모듈을 새로운 다른 이름으로 사용하고자 할 때 사용\n", + "- 기존 모듈 이름이 너무 길거나 현재 사용중인 다름 이름들과 충돌이 일어날 때 유용" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n" + ] + } + ], + "source": [ + "import string as chstr\n", + "print chstr\n", + "print\n", + "print chstr.punctuation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 5) from 모듈명 import 이름 as 새로운 이름[, 이름 as 새로운 이름]\n", + "- 해당 모듈 내에 정의된 이름을 다른 새로운 이름으로 사용하고자 할 때 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ham egg spam\n" + ] + } + ], + "source": [ + "from string import replace as substitute\n", + "print substitute\n", + "print substitute('ham chicken spam', 'chicken', 'egg')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ABC\n" + ] + } + ], + "source": [ + "from string import replace as substitute, upper as up\n", + "print up\n", + "print up('abc')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- import 문은 보통의 문(statement)이 작성될 수 있는 곳이면 어디에서나 사용 가능\n", + " - 예를 들면 함수 정의 def 문 안이나 if 문 안에서 사용할 수 있음" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def str_test(s):\n", + " import string\n", + " t = string.split(s)\n", + " return t" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 import에 의한 모듈 코드 수행\n", + "- import는 코드를 가져오기만 하는 것이 아니라 가져온 코드를 수행한다." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "50.24\n" + ] + } + ], + "source": [ + "#FILE : mymath.py\n", + "mypi = 3.14\n", + "\n", + "def add(a, b):\n", + " return a + b\n", + "\n", + "def area(r):\n", + " return mypi * r * r\n", + "\n", + "print area(4.0)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "50.24\n" + ] + } + ], + "source": [ + "import mymath" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 컴파일과 적재시간\n", + "- import mymath를 수행할 때 발생하는 일\n", + " - 1) 우선 mymath.pyc를 찾는다.\n", + " - 2) mymath.pyc가 없다면 mymath.py를 찾아서 mymath.pyc를 생성한다.\n", + " - 3) 생성된 mymath.pyc를 메모리로 읽어들여 수행한다.\n", + "- .pyc 파일\n", + " - 바이트 코드 파일\n", + " - 기계나 플랫폼(OS)에 의존하지 않도록 만들어진 일종의 목적 코드 (Object Code)\n", + " - 파이썬은 컴파일 언어이면서 동시에 인터프리터 언어의 수행 방식을 취하고 있다.\n", + "- 새로운 .pyc 생성에 대한 판단\n", + " - .py 수정 시간이 .pyc 수정 시간보다 더 최근일 때\n", + "- .py가 없이도 .pyc 파일만 있어도 import 가능\n", + " - 코드를 숨기는 간단한 기법으로 활용 가능" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 모듈 이름과 이미 사용하고 있던 이름이 같다면?\n", + "- 이전의 이름이 참조하던 객체는 상실됨" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "string = \"My first string\"\n", + "import string\n", + "print string" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "My first string\n" + ] + } + ], + "source": [ + "import string\n", + "string = \"My first string\" #여기서 string이란 이름은 문자열을 참조하게 된다.\n", + "print string" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 한번 import 되었던 모듈은 메모리에 적재되어지고, 나중에 다시 동일한 모듈을 import하면 메모리에 적재되어 있던 모듈이 즉시 사용된다." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "My first string\n", + "1\n" + ] + } + ], + "source": [ + "import string\n", + "string.a = 1\n", + "string = \"My first string\"\n", + "print string\n", + "\n", + "import string\n", + "print string.a # 여기서 string 모듈이 기존에 이미 등록되었던 것임을 알 수 있다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 모듈의 실행과 테스트 코드\n", + "***\n", + "- \\_\\_name\\_\\_\n", + " - 현재의 모듈이 최상위 모듈로서 수행되는지, 아니면 다른 모듈에 의해 import 되어 수행되는지를 구별하기 위해 주로 활용\n", + " - 최상위 모듈: 파이썬 인터프리터가 기본적으로 가장 먼저 인식하여 처리하는 모듈" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- prname.py를 직접 수행할 때의 출력 내용: \\_\\_main\\_\\_\n", + " - \\>\\>\\> ipython prname.py\n", + " - \\_\\_main\\_\\_\n", + " - prname.py가 최상위 모듈로서 수행됨을 의미" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__main__\n" + ] + } + ], + "source": [ + "#FILE : prname.py\n", + "print __name__" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- prname.py가 모듈로서 다른 이름 공간으로 import 되어질 때의 출력 내용: prname" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "prname\n", + "prname\n" + ] + } + ], + "source": [ + "import prname\n", + "print prname.__name__" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "string\n", + "re\n", + "mimetools\n", + "os\n" + ] + } + ], + "source": [ + "import string\n", + "print string.__name__\n", + "\n", + "import re\n", + "print re.__name__\n", + "\n", + "import mimetools\n", + "print mimetools.__name__\n", + "\n", + "import os\n", + "print os.__name__" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래 코드는 최상위 모듈로서 수행될 때에만 test() 함수 호출이 일어난다. \n", + "- 보통 파이썬 모듈을 개발할 때에는 마지막 부분에 if \\_\\_name\\_\\_ == \"\\_\\_main\\_\\_\": 과 같은 코드를 추가하여 테스트 코드를 삽입한다." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11\n", + "Python is becoming popular.\n" + ] + } + ], + "source": [ + "#file: module_test.py\n", + "def add(a, b):\n", + " return a + b\n", + "\n", + "def f():\n", + " print \"Python is becoming popular.\"\n", + "\n", + "if __name__ == \"__main__\":\n", + " print add(1, 10)\n", + " f()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 정의된 모듈이 다른 모듈로 import되어질 때에는 \\_\\_name\\_\\_은 모듈 이름 자체이므로 위 코드에서 if 문이 수행되지 않는다. \n", + " - 즉, test() 함수 호출이 곧바로 되지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import module_test" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 패키지\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 패키지의 이해" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 패키지 (Package)\n", + " - 여러 모듈들을 한데 묶어서 정리해 놓은 구조\n", + " - 물리적으로 여러 모듈 파일을 모아 놓은 디렉토리에 해당\n", + " - 최상위 디렉토리 이름이 패키지 이름이 된다.\n", + " - 최상위 디렉토리 하위에 여러 서브 디렉토리는 해당 최상위 패키지의 하위 패키지가 된다. \n", + "- 예제: Speech 패키지\n", + " - 각 폴더마다 \\_\\_init\\_\\_.py 파일 존재에 유의" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/package.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import Speech" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Speech 디렉토리의 위치\n", + " - sys.path(또는 PYTHONPATH 환경 변수)에 열거된 폴더 중 하나에 위치해야 한다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Speech/Recognition/HMM.py 코드 내용" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def train():\n", + " print \"Train\"\n", + " pass\n", + "\n", + "def loadModel():\n", + " print \"LoadModel\"\n", + " pass\n", + "\n", + "def saveModel():\n", + " print \"SaveModel\" \n", + " pass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 \\_\\_init\\_\\_.py의 역할\n", + "- \\_\\_init\\_\\_.py 파일이 존재해야지만 파이썬 패키지로서 인식됨" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-3 import 하기" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train\n" + ] + } + ], + "source": [ + "import Speech.Recognition.HMM\n", + "Speech.Recognition.HMM.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train\n" + ] + } + ], + "source": [ + "from Speech.Recognition import HMM\n", + "HMM.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train\n" + ] + } + ], + "source": [ + "from Speech.Recognition.HMM import train\n", + "train()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-4 import * 하기" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train\n", + "LoadModel\n", + "SaveModel\n" + ] + } + ], + "source": [ + "from Speech.Recognition.HMM import *\n", + "train()\n", + "loadModel()\n", + "saveModel()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [Root]", + "language": "python", + "name": "Python [Root]" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python3.6/python19.ipynb b/python3.6/python19.ipynb new file mode 100644 index 0000000..c4133bd --- /dev/null +++ b/python3.6/python19.ipynb @@ -0,0 +1,837 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 19. 클래스와 객체\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 파이썬 클래스와 이름 공간\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파이썬 클래스는 새로운 이름 공간을 지원하는 또 다른 단위\n", + "- 클래스 정의 구문\n", + "> class 클래스 이름: #헤더(Header)
\n", + ">         pass #몸체(Body)\n", + "- 인스턴스: 클래스로 부터 만들어낸 객체\n", + "- 모듈 vs. 클래스 vs. 인스턴스\n", + " - 모듈: 파일 단위로 이름 공간을 구성\n", + " - 클래스: 클래스 영역 내에 이름 공간을 구성\n", + " - 인스턴스: 인스턴스 영역 내에 이름 공간을 구성" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "\n", + "2\n", + "\n", + "['__doc__', '__module__', 'a', 'b']\n", + "['__doc__', '__module__', 'a']\n" + ] + } + ], + "source": [ + "class S1:\n", + " a = 1\n", + " \n", + "print S1.a\n", + "print\n", + "\n", + "S1.b = 2 # 클래스 이름 공간에 새로운 이름의 생성\n", + "print S1.b\n", + "print\n", + "\n", + "print dir(S1) # S1에 포함된 이름들을 리스트로 반환\n", + "del S1.b # 이름 공간 S1에서 b삭제\n", + "print dir(S1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파이썬에서는 동적으로 인스턴스 외부에서 인스턴스 멤버를 추가할 수 있음\n", + " - 파이썬에서는 클래스와 독립적으로 각 인스턴스를 하나의 이름 공간으로 취급함" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "10\n", + "1\n" + ] + } + ], + "source": [ + "x = S1() # x는 S1의 클래스 인스턴스\n", + "print x.a\n", + "\n", + "x.a = 10 # 클래스 인스턴스 x의 이름 공간에 이름 생성\n", + "print x.a\n", + "\n", + "print S1.a # 클래스 이름 공간과 클래스 인스턴스의 이름공간은 다르다" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "300\n", + "10\n", + "1\n" + ] + } + ], + "source": [ + "y = S1() # S1 클래스의 또 다른 인스턴스 생성\n", + "\n", + "y.a = 300 # 클래스 인스턴스 y의 이름 공간에 이름 생성\n", + "\n", + "print y.a \n", + "print x.a # x 인스턴스 공간의 이름 a 확인\n", + "print S1.a # 클래스 이름 공간의 a 확인" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Simple:\n", + " pass\n", + "\n", + "s1 = Simple()\n", + "s2 = Simple()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3]\n", + "3\n", + "2\n", + "\n", + "[1]\n" + ] + }, + { + "ename": "AttributeError", + "evalue": "Simple instance has no attribute 'stack'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mprint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m \u001b[0;31m# 최종 s1.stack값\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m \u001b[0;31m# s2에는 stack을 정의한 적이 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: Simple instance has no attribute 'stack'" + ] + } + ], + "source": [ + "s1.stack = [] # 동적으로 클래스 인스턴스 이름 공간 안에 새로운 변수(이름) stack 생성\n", + "s1.stack.append(1) # 값 추가\n", + "s1.stack.append(2)\n", + "s1.stack.append(3)\n", + "\n", + "print s1.stack \n", + "print s1.stack.pop() \n", + "print s1.stack.pop()\n", + "print\n", + "print s1.stack # 최종 s1.stack값\n", + "print s2.stack # s2에는 stack을 정의한 적이 없다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/instance.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "del s1.stack # s1에서 stack삭제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 메쏘드의 정의와 호출\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 일반 메쏘드의 정의와 호출" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 클래스 내부에 메소드 선언 - def 키워드 사용\n", + " - 일반 함수와 다른 점은 첫번째 인수로 self 사용 (self라는 이름은 관례적)\n", + " - self: 인스턴스 객체 자신의 레퍼런스를 지니고 있음\n", + " - 각 인스턴스들은 self를 이용하여 자신의 이름 공간에 접근 " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class MyClass:\n", + " def set(self, v):\n", + " self.value = v\n", + " def get(self):\n", + " return self.value" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인스턴스 객체를 통하여 메소드를 호출할 때 self 인자는 없다고 생각" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "egg\n", + "egg\n" + ] + } + ], + "source": [ + "c = MyClass() # 인스턴스 생성 \n", + "c.set('egg') # 메소드 set 호출\n", + "print c.get() # 메소드 get 호출\n", + "print c.value # 인스턴스 변수에 직접 접근" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위 코드는 실제로 아래 코드와 동일함" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "egg\n", + "egg\n" + ] + } + ], + "source": [ + "c = MyClass() # 인스턴스 생성 \n", + "MyClass.set(c, 'egg')\n", + "print MyClass.get(c)\n", + "print c.value" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unbound method set() must be called with MyClass instance as first argument (got Simple instance instead)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMyClass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0ms1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mSimple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mMyClass\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'egg'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 다른 클래스의 인스턴스를 넣어주면 에러 발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unbound method set() must be called with MyClass instance as first argument (got Simple instance instead)" + ] + } + ], + "source": [ + "class Simple:\n", + " pass\n", + "\n", + "c = MyClass()\n", + "s1 = Simple()\n", + "MyClass.set(s1, 'egg') # 다른 클래스의 인스턴스를 넣어주면 에러 발생" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 메소드 호출 종류\n", + " - Unbound method call: 클래스 객체를 이용한 메소드 호출\n", + " - 예: MyClass.set(c, 'egg')\n", + " - Bound method call: 인스턴스 객체를 통한 메소드 호출 (self 인자는 호출받은 객체가 자동으로 할당)\n", + " - 예: c.set('egg')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 클래스 내부에서의 메쏘드 호출" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "\n", + "2\n" + ] + } + ], + "source": [ + "class MyClass:\n", + " def set(self, v):\n", + " self.value = v\n", + " def incr(self):\n", + " self.set(self.value + 1) # 내부 메소드 호출\n", + " def get(self):\n", + " return self.value\n", + " \n", + "c = MyClass()\n", + "c.set(1)\n", + "print c.get()\n", + "\n", + "print\n", + "\n", + "c.incr()\n", + "print c.get()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 만약 위 코드에서 self.set(self.value + 1)를 set(self.value + 1)으로 바꾸면 set 함수를 클래스 외부에서 찾는다. " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "\n", + "set function outside function - 2\n", + "1\n" + ] + } + ], + "source": [ + "def set(i):\n", + " print \"set function outside function - \", i\n", + " \n", + "class MyClass:\n", + " def set(self, v):\n", + " self.value = v\n", + " def incr(self):\n", + " set(self.value + 1) # 클래스 외부에 존재하는 set 메소드 호출\n", + " def get(self):\n", + " return self.value\n", + " \n", + "c = MyClass()\n", + "c.set(1)\n", + "print c.get()\n", + "\n", + "print\n", + "\n", + "c.incr()\n", + "print c.get()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 정적 메소드(static method)\n", + "- 정적 메소드: 인스턴스 객체와 무관하게 클래스 이름 공간에 존재하는 메소드로서 클래스 이름을 이용하여 직접 호출할 수 있는 메소드\n", + " - [주의] 해당 클래스의 인스턴스를 통해서도 호출 가능\n", + "- 장식자(Decorator) @staticmethod 활용 " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "static method 1 2\n", + "\n", + "static method 1 2\n" + ] + } + ], + "source": [ + "class D:\n", + " @staticmethod\n", + " def spam(x, y): # self가 없다.\n", + " print 'static method', x, y\n", + " \n", + "D.spam(1,2) # 인스턴스 객체 없이 클래스에서 직접 호출\n", + "\n", + "print\n", + "d = D()\n", + "d.spam(1,2) # 인스턴스 객체를 통해서도 호출 가능" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 클래스 메소드(class method)\n", + "- 클래스 메소드: 인스턴스 객체와 무관하게 클래스 이름 공간에 존재하는 메소드로서 클래스 이름을 이용하여 호출하며 첫 인수로 클래스 객체를 자동으로 받는 메소드\n", + " - [주의] 해당 클래스의 인스턴스를 통해서도 호출 가능\n", + "- 장식자(Decorator) @classmethod 활용 " + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__main__.C\n", + "__main__.C -> 5\n", + "__main__.C -> 5\n" + ] + } + ], + "source": [ + "class C:\n", + " @classmethod\n", + " def spam(cls, y):\n", + " print cls, '->', y\n", + " \n", + "print C\n", + "\n", + "C.spam(5) # 첫번째 인수로 C가 잠재적으로 전달된다.\n", + "\n", + "c = C()\n", + "c.spam(5) # 인스턴스 객체를 통해서도 호출 가능." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 상속받은 서브 클래스를 통해 호출하면, 첫 인수에는 서브 클래스 객체가 자동으로 할당됨 " + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__main__.D -> 3\n", + "None\n", + "\n", + "__main__.D -> 3\n", + "None\n", + "\n", + "__main__.C -> 3\n", + "None\n" + ] + } + ], + "source": [ + "class D(C):\n", + " pass\n", + "\n", + "print D.spam(3)\n", + "print\n", + "\n", + "d = D()\n", + "print d.spam(3)\n", + "print\n", + "\n", + "print C.spam(3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 클래스 멤버와 인스턴스 멤버\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 클래스 멤버 vs. 인스턴스 멤버\n", + " - 클래스 멤버\n", + " - 클래스 이름 공간에 생성됨\n", + " - 모든 인스턴스들에 의해 공유됨\n", + " - 인스턴스 멤버\n", + " - 인스턴스 이름 공간에 생성됨\n", + " - 각각의 인스턴스 마다 독립성이 보장됨" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Var:\n", + " c_mem = 100 # 클래스 멤버 정의\n", + " def f(self): \n", + " self.i_mem = 200 # 인스턴스 멤버 정의\n", + " def g(self):\n", + " print self.i_mem\n", + " print self.c_mem " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100\n", + "100\n", + "200\n", + "\n" + ] + }, + { + "ename": "AttributeError", + "evalue": "Var instance has no attribute 'i_mem'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mprint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mv2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2 생성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mv2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mi_mem\u001b[0m \u001b[0;31m# 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: Var instance has no attribute 'i_mem'" + ] + } + ], + "source": [ + "print Var.c_mem # 클래스 객체를 통하여 클래스 멤버 접근\n", + "\n", + "v1 = Var() # 인스턴스 v1 생성\n", + "print v1.c_mem # 인스턴스를 통하여 클래스 멤버 접근\n", + "v1.f() # 인스턴스 멤버 i_mem이 생성됨\n", + "print v1.i_mem # 인스턴스 v1을 통하여 인스턴스 멤버 접근\n", + "\n", + "print\n", + "v2 = Var() # 인스턴스 v2 생성\n", + "print v2.i_mem # 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/instance2.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \"인스턴스 이름.멤버 이름\"으로 멤버를 참조할 때 멤버의 검색 순서\n", + " - 1) 인스턴스 멤버\n", + " - 2) 인스턴스 멤버가 없다면 클래스 멤버" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100\n", + "100\n", + "\n", + "50\n", + "100\n", + "100\n" + ] + } + ], + "source": [ + "print v1.c_mem # 인스턴스 v1을 통해 클래스 멤버 참조\n", + "print v2.c_mem # 인스턴스 v2를 통해 클래스 멤버 참조\n", + "\n", + "print\n", + "v1.c_mem = 50 # 인스턴스 이름 공간에 c_mem생성\n", + "print v1.c_mem # 인스턴스 v1을 통해 인스턴스 멤버 참조\n", + "print v2.c_mem # 인스턴스 v2을 통해 클래스 멤버참조 (인스턴스 멤버가 없으므로, 클래스 멤버 참조)\n", + "print Var.c_mem # 클래스 멤버참조" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/instance3.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 4 생성자와 소멸자\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \\_\\_init__: 생성자 메소드\n", + " - 객체가 생성될 때 자동으로 불리어지는 메소드\n", + " - self 인자가 정의되어야 함\n", + "- \\_\\_del__: 소멸자 메소드\n", + " - 객체가 소멸 (메모리에서 해제)될 때 자동으로 불리어지는 메소드\n", + " - self 인자가 정의되어야 함\n", + " - 개발자가 특별히 작성하지 않아도 될 메소드\n", + " - 이유: 파이썬에서는 메모리나 기타 자원들의 해제가 자동으로 되기 때문에\n", + "- [참고] \\_\\_ (연속된 두 개의 언더라인)의 의미: 예약된 이름" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음 코드에 대한 설명\n", + " - mylife = Life() 로서 인스턴스 mylife가 생성되는 순간 \\_\\_init__ 생성자 메소드 호출\n", + " - sleep(3)에 의해 3초간 sleep 상태\n", + " - 3초 이후 함수가 리턴됨 --> 로컬 변수가 메모리에서 해제됨 --> \\_\\_del__ 소멸자 메소드 호출" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Birthday Wed Nov 18 22:51:54 2015\n", + "Sleeping for 3 sec\n", + "Deathday Wed Nov 18 22:51:57 2015\n" + ] + } + ], + "source": [ + "# _*_ coding:utf-8 _*_\n", + "from time import ctime, sleep\n", + "\n", + "class Life:\n", + " def __init__(self): # 생성자\n", + " self.birth = ctime() # 현재시간에 대한 문자열을 얻는다.\n", + " print 'Birthday', self.birth # 현재 시간 출력\n", + " def __del__(self): # 소멸자\n", + " print 'Deathday', ctime() # 소멸 시간 출력 \n", + "\n", + "def test():\n", + " mylife = Life()\n", + " print 'Sleeping for 3 sec'\n", + " sleep(3) #3초간 sleep(block)상태에 있음 (CPU 점유 못함)\n", + "\n", + "test()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인자를 받는 생성자 호출 가능\n", + "- [참고] \\_\\_str\\_\\_: print 예약어나 str() 내장함수 호출에 대응되는 메소드" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "10\n" + ] + } + ], + "source": [ + "class Integer:\n", + " def __init__(self, i):\n", + " self.i = i\n", + " def __str__(self):\n", + " return str(self.i)\n", + "\n", + "i = Integer(10)\n", + "print i\n", + "print str(i)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python3.6/python20.ipynb b/python3.6/python20.ipynb new file mode 100644 index 0000000..99ed360 --- /dev/null +++ b/python3.6/python20.ipynb @@ -0,0 +1,908 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 20. 클래스와 연산자 중복 정의\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 연산자 중복 (Operator Overloading)\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 수치 연산자 중복\n", + "- 직접 정의하는 클래스 인스턴스에 연산자를 적용하기 위하여 미리 약속되어 있는 메소드들을 정의" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "

메소드(Method)

연산자(Operator)

인스턴스 o에 대한 사용 예

\\_\\_add\\_\\_(self, B)

+ (이항)

o + B, o += B

\\_\\_sub\\_\\_(self, B)

- (이항)

o - B, o -= B

\\_\\_mul\\_\\_(self, B)

\\*

o \\* B, o \\*= B

\\_\\_div\\_\\_(self, B)

/

o / B, o /= B

\\_\\_floordiv\\_\\_(self, B)

//

o // B, o //= B

\\_\\_mod\\_\\_(self, B)

%

o % B, o %= B

\\_\\_divmod\\_\\_(self, B)

divmod()

divmod(o, B)

\\_\\_pow\\_\\_(self, B)

pow(), \\*\\*

pow(o, B), o \\*\\* B

\\_\\_lshift\\_\\_(self, B)

<<

o << B, o <<= B

\\_\\_rshift\\_\\_(self, B)

>>

o >> B, o >>= B

\\_\\_and\\_\\_(self, B)

&

o & B, o &= B

\\_\\_xor\\_\\_(self, B)

^

o ^ B, o ^= B

\\_\\_or\\_\\_(self, B) 

|

o | B, o |= B

\\_\\_neg\\_\\_(self)

- (단항)

-A

\\_\\_abs\\_\\_(self)

abs()

abs(o)

\\_\\_pos\\_\\_(self)

+ (단항)

+o

\\_\\_invert\\_\\_(self)

~

~o

" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "10\n", + "\n", + "20\n", + "\n", + "30\n" + ] + } + ], + "source": [ + "class Integer:\n", + " def __init__(self, i):\n", + " self.i = i\n", + " def __str__(self):\n", + " return str(self.i)\n", + " def __add__(self, other):\n", + " return self.i + other\n", + "\n", + "i = Integer(10)\n", + "print i\n", + "print str(i)\n", + "\n", + "print\n", + "i = i + 10\n", + "print i\n", + "\n", + "print\n", + "i += 10\n", + "print i" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['abcd', 'abcd', 'abcd']\n", + "['abcd', 'bcd', 'bcd']\n", + "\n", + "['abcd', 'abcd', 'abcd']\n" + ] + } + ], + "source": [ + "class MyString:\n", + " def __init__(self, str):\n", + " self.str = str\n", + " def __div__(self, sep): # 나누기 연산자 /가 사용되었을 때 호출되는 함수 \n", + " return self.str.split(sep) # 문자열 self.str을 sep를 기준으로 분리\n", + "\n", + "m = MyString(\"abcd_abcd_abcd\")\n", + "print m / \"_\"\n", + "print m / \"_a\"\n", + "\n", + "print\n", + "print m.__div__(\"_\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 연산자 왼쪽에 피연산자, 연산자 오른쪽에 객체가 오는 경우\n", + " - 메소드 이름 앞에 r이 추가된 메소드 정의" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['abcd', 'abcd', 'abcd']\n", + "['abcd', 'bcd', 'bcd']\n", + "\n", + "['abcd', 'abcd', 'abcd']\n", + "['abcd', 'bcd', 'bcd']\n" + ] + } + ], + "source": [ + "class MyString:\n", + " def __init__(self, str):\n", + " self.str = str\n", + " def __div__(self, sep):\n", + " return str.split(self.str, sep)\n", + " __rdiv__ = __div__\n", + "\n", + "m = MyString(\"abcd_abcd_abcd\")\n", + "print m / \"_\"\n", + "print m / \"_a\"\n", + "print\n", + "print \"_\" / m\n", + "print \"_a\" / m" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "fedcba\n", + "fedcba\n" + ] + } + ], + "source": [ + "class MyString:\n", + " def __init__(self, str):\n", + " self.str = str\n", + " def __div__(self, sep):\n", + " return str.split(self.str, sep)\n", + " __rdiv__ = __div__\n", + " def __neg__(self):\n", + " t = list(self.str)\n", + " t.reverse()\n", + " return ''.join(t)\n", + " __invert__ = __neg__\n", + " \n", + "m = MyString(\"abcdef\")\n", + "print -m\n", + "print ~m" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 비교 연산자 중복" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 각각의 비교 연산에 대응되는 메소드 이름이 정해져 있지만 그러한 메소드가 별도로 정의되어 있지 않으면 cmp가 호출됨\n", + "\n", + "|메소드 |연산자 | 비고 |\n", + "|--------|----|----|\n", + "|\\_\\_cmp\\_\\_(self, other) | 아래 메소드가 부재한 상황에 호출되는 메소드| |\n", + "|\\_\\_lt\\_\\_(self, other) | self < other | |\n", + "|\\_\\_le\\_\\_(self, other) | self <= other | |\n", + "|\\_\\_eq\\_\\_(self, other) | self == other | |\n", + "|\\_\\_ne\\_\\_(self, other) | self != other | |\n", + "|\\_\\_gt\\_\\_(self, other) | self > other | |\n", + "|\\_\\_ge\\_\\_(self, other) | self >= other | |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 객체 c에 대한 c > 1연산의 행동 방식\n", + " - c.\\_\\_gt\\_\\_()가 있다면 호출 결과을 그대로 반환\n", + " - 정의된 c.\\_\\_gt\\_\\_()가 없고, \\_\\_cmp\\_\\_() 함수가 있을 경우\n", + " - c.\\_\\_cmp\\_\\_() 호출 결과가 양수이면 True 반환, 아니면 False 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "class MyCmp:\n", + " def __cmp__(self, y):\n", + " return 1 - y\n", + " \n", + "c = MyCmp() \n", + "print c > 1 # c.__cmp__(1)을 호출, 반환값이 양수이어야 True\n", + "print c < 1 # c.__cmp__(1)을 호출, 반환값이 음수이어야 True\n", + "print c == 1 # c.__cmp__(1)을 호출, 반환값이 0이어야 True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 객체 m에 대한 m < 10연산의 행동 방식\n", + " - m.\\_\\_lt\\_\\_()가 있다면 호출 결과을 그대로 반환\n", + " - 정의된 m.\\_\\_lt\\_\\_()가 없고, \\_\\_cmp\\_\\_() 함수가 있을 경우\n", + " - m.\\_\\_cmp\\_\\_() 호출 결과가 음수이면 True 반환, 아니면 False 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "False\n" + ] + } + ], + "source": [ + "class MyCmp2:\n", + " def __lt__(self, y):\n", + " return 1 < y\n", + "\n", + "m = MyCmp2()\n", + "print m < 10 # m.__lt__(10)을 호출\n", + "print m < 2\n", + "print m < 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 객체 m에 대한 m == 10연산의 행동 방식\n", + " - m.\\_\\_eq\\_\\_()가 있다면 호출 결과을 그대로 반환\n", + " - 정의된 m.\\_\\_eq\\_\\_()가 없고, \\_\\_cmp\\_\\_() 함수가 있을 경우\n", + " - m.\\_\\_cmp\\_\\_() 호출 결과가 0이면 True 반환, 아니면 False 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "class MyCmp3:\n", + " def __eq__(self, y):\n", + " return 1 == y\n", + "\n", + "m = MyCmp3()\n", + "print m == 10 # m.__eq__(10)을 호출\n", + "m1 = MyCmp3()\n", + "print m == 1\n", + "\n", + "class MyCmp4:\n", + " def __init__(self, value):\n", + " self.value = value\n", + " def __cmp__(self, other):\n", + " if self.value == other:\n", + " return 0\n", + "m2 = MyCmp4(10)\n", + "print m2 == 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 시퀀스/매핑 자료형의 연산자 중복\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 클래스를 개발할 때 다음 메소드들을 적절하게 구현하면 자신만의 시퀀스 자료형을 만들 수 있음\n", + "- 변경불가능한 (Immutable) 시퀀스 자료형 및 매핑 자료형을 위해 구현이 필요한 메소드" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "|메소드 |연산자 |\n", + "|---|---|\n", + "|\\_\\_len\\_\\_(self) | len() |\n", + "|\\_\\_contains\\_\\_(self, item) | item in self |\n", + "|\\_\\_getItem\\_\\_(self, key) | self[key] |\n", + "|\\_\\_setItem\\_\\_(self, key, value) | self[key] = value |\n", + "|\\_\\_delItem\\_\\_(self, key) | del self(key) |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 인덱싱 (Indexing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- len(s1) --> s1.\\_\\_len\\_\\_() 메소드 호출\n", + "- sl[4] --> s1.\\_\\_getitem\\_\\_(4) 호출\n", + "- IndexError\n", + " - 시퀀스 자료형이 범위를 벗어난 인덱스 참조 요구시에 발생됨\n", + " - 리스트, 튜플, 문자열등에서도 동일한 조건에서 발생됨 " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "1\n", + "16\n" + ] + }, + { + "ename": "IndexError", + "evalue": "20", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m#s1.__getitem__(1)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mIndexError\u001b[0m: 20" + ] + } + ], + "source": [ + "class Square:\n", + " def __init__(self, end):\n", + " self.end = end\n", + " def __len__(self):\n", + " return self.end\n", + " def __getitem__(self, k):\n", + " if k < 0 or self.end <= k: \n", + " raise IndexError, k\n", + " return k * k\n", + " \n", + "s1 = Square(10)\n", + "print len(s1) # s1.__len__()\n", + "print s1[1] #s1.__getitem__(1)\n", + "print s1[4]\n", + "print s1[20]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음 for 문은 s1에 대해 \\_\\_getitem()\\_\\_ 메소드를 0부터 호출하여 IndexError가 발생하면 루프를 중단한다. " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 4 9 16 25 36 49 64 81\n" + ] + } + ], + "source": [ + "for x in s1:\n", + " print x," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \\_\\_getitem\\_\\_() 메소드가 정의되어 있다면 다른 시퀀스 자료형으로 변환이 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n", + "(0, 1, 4, 9, 16, 25, 36, 49, 64, 81)\n" + ] + } + ], + "source": [ + "print list(s1)\n", + "print tuple(s1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위에서 알 수 있듯이 파이썬은 내장 자료형과 개발자가 정의한 자료형에 대해 일관된 연산 적용이 가능\n", + " - 파이썬 언어의 장점: 일관된 코딩 스타일 유지" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 매핑 자료형의 연산자 중복" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<__main__.MyDict instance at 0x10bb37638>\n", + "light\n", + "darkness\n", + "2\n" + ] + } + ], + "source": [ + "class MyDict:\n", + " def __init__(self, d = None):\n", + " if d == None: d = {}\n", + " self.d = d\n", + " def __getitem__(self, k): #key\n", + " return self.d[k]\n", + " def __setitem__(self, k, v):\n", + " self.d[k] = v\n", + " def __len__(self):\n", + " return len(self.d)\n", + " \n", + "m = MyDict() #__init__호출\n", + "m['day'] = 'light' #__setitem__호출\n", + "m['night'] = 'darkness' #__setitem__호출 \n", + "print m\n", + "print m['day'] #__getitem__호출\n", + "print m['night'] #__getitem__호출\n", + "print len(m) #__len__호출" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['three', 'two', 'one']\n", + "[3, 2, 1]\n", + "[('three', 3), ('two', 2), ('one', 1)]\n" + ] + } + ], + "source": [ + "class MyDict:\n", + " def __init__(self, d=None):\n", + " if d == None: d = {}\n", + " self.d = d\n", + " def __getitem__(self, k):\n", + " return self.d[k]\n", + " def __setitem__(self, k, v):\n", + " self.d[k] = v\n", + " def __len__(self):\n", + " return len(self.d)\n", + " def keys(self):\n", + " return self.d.keys()\n", + " def values(self):\n", + " return self.d.values()\n", + " def items(self):\n", + " return self.d.items()\n", + " \n", + "m = MyDict({'one':1, 'two':2, 'three':3})\n", + "print m.keys()\n", + "print m.values()\n", + "print m.items()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 문자열 변환과 호출 가능 객체\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 문자열로 변환하기\n", + "1) \\_\\_repr\\_\\_\n", + "- 객체를 대표하여 유일하게 표현할 수 있는 공식적인 문자열\n", + "- eval() 함수에 의하여 같은 객체로 재생성 될 수 있는 문자열 표현\n", + "\n", + "2) \\_\\_str\\_\\_\n", + "- 객체의 비공식적인 문자열 표현\n", + "- 사용자가 보기 편한 형태로 자유롭게 표현될 수 있음" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "str called\n", + "str called\n", + "repr called\n", + "repr called\n" + ] + } + ], + "source": [ + "class StringRepr:\n", + " def __repr__(self):\n", + " return 'repr called'\n", + " def __str__(self):\n", + " return 'str called'\n", + " \n", + "s = StringRepr()\n", + "print s\n", + "print str(s)\n", + "print repr(s)\n", + "print `s`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \\_\\_str\\_\\_() 호출시\n", + " - \\_\\_str\\_\\_()가 정의되어 있지 않으면 \\_\\_repr\\_\\_()이 대신 호출됨" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "repr called\n", + "repr called\n", + "repr called\n", + "repr called\n" + ] + } + ], + "source": [ + "class StringRepr:\n", + " def __repr__(self):\n", + " return 'repr called'\n", + " \n", + "s = StringRepr()\n", + "print s\n", + "print repr(s)\n", + "print str(s)\n", + "print `s`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \\_\\_repr\\_\\_() 호출시\n", + " - \\_\\_repr\\_\\_()이 정의되어 있지 않으면 객체 식별자가 출력됨\n", + " - 대신하여 \\_\\_str\\_\\_()이 호출되지 않음" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "str called\n", + "<__main__.StringRepr instance at 0x101d3f908>\n", + "str called\n", + "<__main__.StringRepr instance at 0x101d3f908>\n" + ] + } + ], + "source": [ + "class StringRepr:\n", + " def __str__(self):\n", + " return 'str called'\n", + "\n", + "s = StringRepr()\n", + "print s\n", + "print repr(s)\n", + "print str(s)\n", + "print `s`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 호출 가능한 클래스 인스턴스 만들기\n", + "- 클래스 인스턴스에 \\_\\_call\\_\\_ 메소드가 구현되어 있다면 해당 인스턴스는 함수와 같이 호출될 수 있다.\n", + " - 인슽너스 x에 대해 x(a1, a2, a3)와 같이 호출된다면 x.\\_\\_call\\_\\_(a1, a2, a3)가 호출된다." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "15\n", + "21\n", + "45\n", + "45\n" + ] + } + ], + "source": [ + "class Accumulator:\n", + " def __init__(self):\n", + " self.sum = 0\n", + " def __call__(self, *args):\n", + " self.sum += sum(args)\n", + " return self.sum\n", + " \n", + "acc = Accumulator()\n", + "print acc(1,2,3,4,5)\n", + "print acc(6)\n", + "print acc(7,8,9)\n", + "print acc.sum" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 호출 가능 객체인지 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "callable\n", + "not callable\n", + "\n", + "True\n", + "False\n" + ] + } + ], + "source": [ + "def check(func):\n", + " if callable(func):\n", + " print 'callable'\n", + " else:\n", + " print 'not callable'\n", + "\n", + "class B:\n", + " def func(self, v):\n", + " return v\n", + "class A:\n", + " def __call__(self, v):\n", + " return v\n", + " \n", + "a = A()\n", + "b = B()\n", + "check(a)\n", + "check(b)\n", + "print\n", + "print callable(a)\n", + "print callable(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python3.6/python21.ipynb b/python3.6/python21.ipynb new file mode 100644 index 0000000..fb14b29 --- /dev/null +++ b/python3.6/python21.ipynb @@ -0,0 +1,808 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:8f9b177eb7705dd02d3af4493e8b1149b369cd12a697af1db111d8dfe3b6e92e" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 21. \uc0c1\uc18d\uacfc \ub2e4\ud615\uc131\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \ud074\ub798\uc2a4 \uc0c1\uc18d\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \ud074\ub798\uc2a4 \uc0c1\uc18d\uacfc \uc774\ub984 \uacf5\uac04\uc758 \uad00\uacc4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc0c1\uc18d\uc758 \uc774\uc720\n", + " - \ucf54\ub4dc\uc758 \uc7ac\uc0ac\uc6a9\n", + " - \uc0c1\uc18d\ubc1b\uc740 \uc790\uc2dd \ud074\ub798\uc2a4\ub294 \uc0c1\uc18d\uc744 \ud574\uc900 \ubd80\ubaa8 \ud074\ub798\uc2a4\uc758 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uadf8\ub300\ub85c \uc0ac\uc6a9\n", + " - \uc790\uc2dd \ud074\ub798\uc2a4\ub294 \ud544\uc694\ud55c \uae30\ub2a5\ub9cc\uc744 \uc815\uc758\ud558\uac70\ub098 \uae30\uc874\uc758 \uae30\ub2a5\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\uc74c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Person:\n", + " def __init__(self, name, phone=None):\n", + " self.name = name\n", + " self.phone = phone\n", + " def __str__(self):\n", + " return '' % (self.name, self.phone)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Employee(Person): # \uad04\ud638 \uc548\uc5d0 \uc4f0\uc5ec\uc9c4 \ud074\ub798\uc2a4\ub294 \uc288\ud37c\ud074\ub798\uc2a4\ub97c \uc758\ubbf8\ud55c\ub2e4.\n", + " def __init__(self, name, phone, position, salary):\n", + " Person.__init__(self, name, phone) # Person\ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790 \ud638\ucd9c\n", + " self.position = position\n", + " self.salary = salary" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc774\ub984 \uacf5\uac04\uc758 \ud3ec\ud568\uad00\uacc4\n", + " - \uc790\uc2dd \ud074\ub798\uc2a4 > \ubd80\ubaa8 \ud074\ub798\uc2a4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/inheritance2.png)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "p1 = Person('\ud64d\uae38\ub3d9', 1498)\n", + "print p1.name\n", + "print p1\n", + "\n", + "print\n", + "\n", + "m1 = Employee('\uc190\ucc3d\ud76c', 5564, '\ub300\ub9ac', 200)\n", + "m2 = Employee('\uae40\uae30\ub3d9', 8546, '\uacfc\uc7a5', 300)\n", + "print m1.name, m1.position # \uc288\ud37c\ud074\ub798\uc2a4\uc640 \uc11c\ube0c\ud074\ub798\uc2a4\uc758 \uba64\ubc84\ub97c \ud558\ub098\uc529 \ucd9c\ub825\ud55c\ub2e4.\n", + "print m1\n", + "print m2.name, m2.position\n", + "print m2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\ud64d\uae38\ub3d9\n", + "\n", + "\n", + "\uc190\ucc3d\ud76c \ub300\ub9ac\n", + "\n", + "\uae40\uae30\ub3d9 \uacfc\uc7a5\n", + "\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/inheritance3.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 \uc0dd\uc131\uc790 \ud638\ucd9c\n", + "- \uc11c\ube0c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub294 \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub97c \uc790\ub3d9\uc73c\ub85c \ud638\ucd9c\ud558\uc9c0 \uc54a\ub294\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Super:\n", + " def __init__(self):\n", + " print 'Super init called'\n", + "\n", + "class Sub(Super):\n", + " def __init__(self):\n", + " print 'Sub init called'\n", + " \n", + "s = Sub()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Sub init called\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc11c\ube0c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub97c \uba85\uc2dc\uc801\uc73c\ub85c \ud638\ucd9c\ud574\uc57c \ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Super:\n", + " def __init__(self):\n", + " print 'Super init called'\n", + " \n", + "class Sub(Super):\n", + " def __init__(self):\n", + " Super.__init__(self) # \uba85\uc2dc\uc801\uc73c\ub85c \uc288\ud37c\ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub97c \ud638\ucd9c\ud55c\ub2e4.\n", + " print 'Sub init called'\n", + " \n", + "s = Sub()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Super init called\n", + "Sub init called\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc11c\ube0c \ud074\ub798\uc2a4\uc5d0 \uc0dd\uc131\uc790\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uc5d0\ub294 \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\uac00 \ud638\ucd9c\ub41c\ub2e4. " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Super:\n", + " def __init__(self):\n", + " print 'Super init called'\n", + " \n", + "class Sub(Super):\n", + " pass\n", + "\n", + "s = Sub()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Super init called\n" + ] + } + ], + "prompt_number": 66 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 \uba54\uc3d8\ub4dc\uc758 \ub300\uce58 (\uba54\uc18c\ub4dc \uc624\ubc84\ub77c\uc774\ub4dc - Override)\n", + "- \uc11c\ube0c \ud074\ub798\uc2a4\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc5d0 \uc815\uc758\ub41c \uba54\uc18c\ub4dc\ub97c \uc7ac\uc815\uc758\ud558\uc5ec \ub300\uce58\ud558\ub294 \uae30\ub2a5" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Person:\n", + " def __init__(self, name, phone=None):\n", + " self.name = name\n", + " self.phone = phone\n", + " def __str__(self):\n", + " return '' % (self.name, self.phone)\n", + " \n", + "class Employee(Person):\n", + " def __init__(self, name, phone, position, salary):\n", + " Person.__init__(self, name, phone)\n", + " self.position = position\n", + " self.salary = salary\n", + " \n", + "p1 = Person('gslee', 5284)\n", + "m1 = Employee('kslee', 5224, 'President', 500)\n", + "\n", + "print p1\n", + "print m1" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Employee(Person):\n", + " def __init__(self, name, phone, position, salary):\n", + " Person.__init__(self, name, phone)\n", + " self.position = position\n", + " self.salary = salary\n", + " def __str__(self):\n", + " return '' % (self.name, self.phone, self.position, self.salary)\n", + " \n", + "p1 = Person('gslee', 5284)\n", + "m1 = Employee('kslee', 5224, 'President', 500)\n", + "\n", + "print p1\n", + "print m1" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 \ub2e4\ud615\uc131(Polymorphism)\n", + "- \uc0c1\uc18d \uad00\uacc4 \ub0b4\uc758 \ub2e4\ub978 \ud074\ub798\uc2a4\ub4e4\uc758 \uc778\uc2a4\ud134\uc2a4\ub4e4\uc774 \uac19\uc740 \uba64\ubc84 \ud568\uc218 \ud638\ucd9c\uc5d0 \ub300\ud574 \uac01\uac01 \ub2e4\ub974\uac8c \ubc18\uc751\ud558\ub3c4\ub85d \ud558\ub294 \uae30\ub2a5\n", + " - \uc5f0\uc0b0\uc790 \uc624\ubc84\ub85c\ub529\ub3c4 \ub2e4\ud615\uc131\uc744 \uc9c0\uc6d0\ud558\ub294 \uc911\uc694\ud55c \uae30\uc220 \n", + " - \uc608\ub97c \ub4e4\uc5b4, a\uc640 b\uc758 \uac1d\uccb4 \ud615\uc5d0 \ub530\ub77c a + b\uc758 + \uc5f0\uc0b0\uc790 \ud589\ub3d9 \ubc29\uc2dd\uc774 \ubcc0\uacbd\ub418\ub294 \uac83\n", + "\n", + "- \ub2e4\ud615\uc131\uc758 \uc7a5\uc810\n", + " - \uc801\uc740 \ucf54\ub529\uc73c\ub85c \ub2e4\uc591\ud55c \uac1d\uccb4\ub4e4\uc5d0\uac8c \uc720\uc0ac\ud55c \uc791\uc5c5\uc744 \uc218\ud589\uc2dc\ud0ac \uc218 \uc788\uc74c\n", + " - \ud504\ub85c\uadf8\ub7a8 \uc791\uc131 \ucf54\ub4dc \ub7c9\uc774 \uc904\uc5b4\ub4e0\ub2e4.\n", + " - \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ub192\ud600\uc900\ub2e4.\n", + " \n", + "- \ud30c\uc774\uc36c\uc5d0\uc11c \ub2e4\ud615\uc131\uc758 \uc7a5\uc810\n", + " - \ud615 \uc120\uc5b8\uc774 \uc5c6\ub2e4\ub294 \uc810\uc5d0\uc11c \ud30c\uc774\uc36c\uc5d0\uc11c\ub294 \ub2e4\ud615\uc131\uc744 \uc801\uc6a9\ud558\uae30\uac00 \ub354\uc6b1 \uc6a9\uc774\ud558\ub2e4.\n", + " - \uc2e4\uc2dc\uac04\uc73c\ub85c \uac1d\uccb4\uc758 \ud615\uc774 \uacb0\uc815\ub418\ubbc0\ub85c \ub2e8 \ud558\ub098\uc758 \uba54\uc18c\ub4dc\uc5d0 \uc758\ud574 \ucc98\ub9ac\ub420 \uc218 \uc788\ub294 \uac1d\uccb4\uc758 \uc885\ub958\uc5d0 \uc81c\ud55c\uc774 \uc5c6\ub2e4.\n", + " - \uc989, \ub2e4\ub978 \uc5b8\uc5b4\ubcf4\ub2e4 \ucf54\ub4dc\uc758 \uc591\uc774 \ub354\uc6b1 \uc904\uc5b4\ub4e0\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Animal:\n", + " def cry(self):\n", + " print '...'\n", + " \n", + "class Dog(Animal):\n", + " def cry(self):\n", + " print '\uba4d\uba4d'\n", + " \n", + "class Duck(Animal):\n", + " def cry(self):\n", + " print '\uaf65\uaf65'\n", + " \n", + "class Fish(Animal):\n", + " pass\n", + "\n", + "for each in (Dog(), Duck(), Fish()):\n", + " each.cry()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\uba4d\uba4d\n", + "\uaf65\uaf65\n", + "...\n" + ] + } + ], + "prompt_number": 57 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uacfc \ud074\ub798\uc2a4\uc758 \ud1b5\uc77c\n", + "***\n", + "- \ub0b4\uc7a5 \uc790\ub8cc\ud615(list, dict, tuple, string)\uc744 \uc0c1\uc18d\ud558\uc5ec \uc0ac\uc6a9\uc790 \ud074\ub798\uc2a4\ub97c \uc815\uc758\ud558\ub294 \uac83\n", + " - \ub0b4\uc7a5 \uc790\ub8cc\ud615\uacfc \uc0ac\uc6a9\uc790 \uc790\ub8cc\ud615\uc758 \ucc28\uc774\ub97c \uc5c6\uc5d0\uace0 \ud1b5\uc77c\ub41c \uad00\uc810\uc73c\ub85c \ubaa8\ub4e0 \uac1d\uccb4\ub97c \ub2e4\ub8f0 \uc218 \uc788\ub294 \ubc29\uc548\n", + "- \ud074\ub798\uc2a4 \uc815\uc758\ub294 \uc0c8\ub85c\uc6b4 \uc790\ub8cc\ud615\uc758 \uc815\uc758\uc784" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 \ub9ac\uc2a4\ud2b8 \uc11c\ube0c \ud074\ub798\uc2a4 \ub9cc\ub4e4\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = list()\n", + "print a\n", + "print dir(a)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[]\n", + "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc544\ub798 \uc608\uc81c\ub294 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc778 list\ub97c \uc0c1\uc18d\ud558\uc5ec \ube84\uc148 \uc5f0\uc0b0(-)\uc744 \ucd94\uac00\ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class MyList(list):\n", + " def __sub__(self, other): # '-' \uc5f0\uc0b0\uc790 \uc911\ubcf5 \ud568\uc218 \uc815\uc758\n", + " for x in other:\n", + " if x in self:\n", + " self.remove(x) # \uac01 \ud56d\ubaa9\uc744 \ud558\ub098\uc529 \uc0ad\uc81c\ud55c\ub2e4.\n", + " return self\n", + "\n", + "L = MyList([1, 2, 3, 'spam', 4, 5])\n", + "print L\n", + "print\n", + "\n", + "L = L - ['spam', 4]\n", + "print L" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 2, 3, 'spam', 4, 5]\n", + "\n", + "[1, 2, 3, 5]\n" + ] + } + ], + "prompt_number": 51 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) Stack \ud074\ub798\uc2a4 \uc815\uc758 \uc608\n", + "- \uc288\ud37c \ud074\ub798\uc2a4\ub85c list \ud074\ub798\uc2a4\ub97c \uc9c0\ub2cc\ub2e4.\n", + "- \uc989, list \ud074\ub798\uc2a4\ub97c \ud655\uc7a5\ud558\uc5ec Stack \ud074\ub798\uc2a4\ub97c \uc815\uc758\ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Stack(list): # \ud074\ub798\uc2a4 \uc815\uc758\n", + " push = list.append\n", + " \n", + "s = Stack() # \uc778\uc2a4\ud134\uc2a4 \uc0dd\uc131\n", + "\n", + "s.push(4)\n", + "s.push(5)\n", + "print s\n", + "print\n", + "\n", + "s = Stack([1,2,3])\n", + "s.push(4)\n", + "s.push(5)\n", + "print s\n", + "print\n", + "\n", + "print s.pop() # \uc288\ud37c \ud074\ub798\uc2a4\uc778 \ub9ac\uc2a4\ud2b8 \ud074\ub798\uc2a4\uc758 pop() \uba54\uc18c\ub4dc \ud638\ucd9c\n", + "print s.pop()\n", + "print s" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[4, 5]\n", + "\n", + "[1, 2, 3, 4, 5]\n", + "\n", + "5\n", + "4\n", + "[1, 2, 3]\n" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) Queue \ud074\ub798\uc2a4 \uc815\uc758 \uc608\n", + "- \uc288\ud37c \ud074\ub798\uc2a4\ub85c \uc5ed\uc2dc list\ub97c \uc9c0\ub2cc\ub2e4.\n", + "- \uc989, list \ud074\ub798\uc2a4\ub97c \ud655\uc7a5\ud558\uc5ec Queue \ud074\ub798\uc2a4\ub97c \uc815\uc758\ud568 " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Queue(list):\n", + " enqueue = list.append\n", + " def dequeue(self):\n", + " return self.pop(0)\n", + " \n", + "q = Queue()\n", + "q.enqueue(1) # \ub370\uc774\ud130 \ucd94\uac00\n", + "q.enqueue(2)\n", + "print q\n", + "\n", + "print q.dequeue() # \ub370\uc774\ud130 \uaebc\ub0b4\uae30\n", + "print q.dequeue()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 2]\n", + "1\n", + "2\n" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \uc0ac\uc804 \uc11c\ube0c \ud074\ub798\uc2a4 \ub9cc\ub4e4\uae30" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = dict()\n", + "print a\n", + "print dir(a)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "{}\n", + "['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc544\ub798 \uc608\uc81c\ub294 keys() \uba54\uc18c\ub4dc\ub97c \uc815\ub82c\ub41c \ud0a4\uac12 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud558\ub3c4\ub85d \uc7ac\uc815\uc758\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class MyDict(dict):\n", + " def keys(self):\n", + " K = dict.keys(self) # \uc5b8\ubc14\uc6b4\ub4dc \uba54\uc18c\ub4dc \ud638\ucd9c --> K = self.keys() \ub77c\uace0 \ud638\ucd9c\ud558\uba74 \ubb34\ud55c \uc7ac\uadc0 \ud638\ucd9c\n", + " K.sort()\n", + " return K\n", + "\n", + "d = MyDict({'one':1, 'two':2, 'three':3})\n", + "print d.keys()\n", + "print\n", + "\n", + "d2 = {'one':1, 'two':2, 'three':3}\n", + "print d2.keys()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['one', 'three', 'two']\n", + "\n", + "['three', 'two', 'one']\n" + ] + } + ], + "prompt_number": 56 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 \uc0c1\uc18d \uad00\uacc4\uc5d0 \uc788\ub294 \ud074\ub798\uc2a4\ub4e4\uc758 \uc815\ubcf4 \ud68d\ub4dd\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 \uac1d\uccb4\uac00 \uc5b4\ub5a4 \ud074\ub798\uc2a4\uc5d0 \uc18d\ud574 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uae30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uac1d\uccb4\uc758 \uc790\ub8cc\ud615 \ube44\uad50 \ubc29\ubc95 I (\uc804\ud1b5\uc801 \ubc29\ubc95)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import types\n", + "\n", + "print type(123) == types.IntType\n", + "print type(123) == type(0)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True\n", + "True\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uac1d\uccb4\uc758 \uc790\ub8cc\ud615 \ube44\uad50 \ubc29\ubc95 II (\uc0c8\ub85c\uc6b4 \ubc29\ubc95)\n", + " - isinstance() \ub0b4\uc7a5 \ud568\uc218\uc640 \uae30\ubcf8 \uac1d\uccb4 \ud074\ub798\uc2a4 \uc0ac\uc6a9" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print isinstance(123, int)\n", + "print int" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " True\n", + "\n" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc11c\ube0c \ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4\ub294 \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4\uc774\uae30\ub3c4 \ud558\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class A:\n", + " pass\n", + "\n", + "class B:\n", + " def f(self):\n", + " pass\n", + " \n", + "class C(B):\n", + " pass\n", + "\n", + "def check(obj):\n", + " print obj, '=>',\n", + " if isinstance(obj, A):\n", + " print 'A',\n", + " if isinstance(obj, B):\n", + " print 'B',\n", + " if isinstance(obj, C):\n", + " print 'C',\n", + " print\n", + " \n", + "a = A()\n", + "b = B()\n", + "c = C()\n", + "\n", + "check(a)\n", + "check(b)\n", + "check(c)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "<__main__.A instance at 0x10de34e60> => A\n", + "<__main__.B instance at 0x10de34e18> => B\n", + "<__main__.C instance at 0x10de34cf8> => B C\n" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 \ud074\ub798\uc2a4 \uac04\uc758 \uc0c1\uc18d \uad00\uacc4 \uc54c\uc544\ub0b4\uae30\n", + "- issubclass() \ub0b4\uc7a5 \ud568\uc218 \ud65c\uc6a9" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class A:\n", + " pass\n", + "\n", + "class B:\n", + " def f(self):\n", + " pass\n", + " \n", + "class C(B):\n", + " pass\n", + "\n", + "def check(obj):\n", + " print obj, '=>',\n", + " if issubclass(obj, A):\n", + " print 'A',\n", + " if issubclass(obj, B):\n", + " print 'B',\n", + " if issubclass(obj, C):\n", + " print 'C',\n", + " print\n", + " \n", + "check(A)\n", + "check(B)\n", + "check(C)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "__main__.A => A\n", + "__main__.B => B\n", + "__main__.C => B C\n" + ] + } + ], + "prompt_number": 20 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python22.ipynb b/python3.6/python22.ipynb new file mode 100644 index 0000000..6d187a0 --- /dev/null +++ b/python3.6/python22.ipynb @@ -0,0 +1,1230 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:deab20a429b0ce5b40ffe86207fc2fe2d87b2ddd5861904afbf2609154ffefc7" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 22. \uc57d\ud55c\ucc38\uc870, \ubc18\ubcf5\uc790, \ubc1c\uc0dd\uc790\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \uc57d\ud55c \ucc38\uc870\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \uc57d\ud55c \ucc38\uc870\uc758 \uc815\uc758\n", + "- \uc57d\ud55c \ucc38\uc870 (Weak Reference)\n", + " - \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8\ub85c \uace0\ub824\ub418\uc9c0 \uc54a\ub294 \ucc38\uc870" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 \uc57d\ud55c \ucc38\uc870\uc758 \ud544\uc694\uc131" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/cyclingref.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 1) \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8\uac00 \uc99d\uac00\ub418\uc9c0 \uc54a\uc73c\ubbc0\ub85c \uc21c\ud658 \ucc38\uc870\uac00 \ubc29\uc9c0\ub41c\ub2e4.\n", + " - \uc21c\ud658 \ucc38\uc870 (Cyclic Reference)\n", + " - \uc11c\ub85c \ub2e4\ub978 \uac1d\uccb4\ub4e4 \uc0ac\uc774\uc5d0 \ucc38\uc870 \ubc29\uc2dd\uc774 \uc21c\ud658 \ud615\ud0dc\ub85c \uc5f0\uacb0\ub418\ub294 \ubc29\uc2dd\n", + " - \ub3c5\ub9bd\uc801\uc73c\ub85c \uc874\uc7ac\ud558\uc9c0\ub9cc \uc21c\ud658 \ucc38\uc870\ub418\ub294 \uc11c\ub85c \ub2e4\ub978 \uac1d\uccb4 \uadf8\ub8f9\uc740 \uc4f0\ub808\uae30 \uc218\uc9d1\uc774 \uc548\ub41c\ub2e4.\n", + " - \uc8fc\uae30\uc801\uc73c\ub85c \uc21c\ud658 \ucc38\uc870\ub97c \uc870\uc0ac\ud558\uc5ec \uc4f0\ub808\uae30 \uc218\uc9d1\ud558\ub294 \uae30\ub2a5\uc774 \uc788\uc9c0\ub9cc, CPU \uc790\uc6d0 \ub0ad\ube44\uac00 \uc2ec\ud558\ub2e4.\n", + " - \uc774\ub7ec\ud55c \uc4f0\ub808\uae30 \uc218\uc9d1 \ube48\ub3c4\uac00 \ub0ae\uc73c\uba74 \uc21c\ud658 \ucc38\uc870\ub418\ub294 \ub9ce\uc740 \uac1d\uccb4\ub4e4\uc774 \uba54\ubaa8\ub9ac\ub97c \uc4f8\ub370\uc5c6\uc774 \uc810\uc720\ud558\uac8c \ub428\n", + "- 2) \ub2e4\uc591\ud55c \uc778\uc2a4\ud134\uc2a4\ub4e4 \uc0ac\uc774\uc5d0\uc11c \uacf5\uc720\ub418\ub294 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc77c\uc885\uc758 \ucf00\uc2dc(Cache)\ub97c \ub9cc\ub4dc\ub294 \ub370 \ud65c\uc6a9\ub41c\ub2e4." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 \uc57d\ud55c \ucc38\uc870 \ubaa8\ub4c8\n", + "#### 1) weakref.ref(o)\n", + "- weakref \ubaa8\ub4c8\uc758 ref(o) \ud568\uc218\n", + " - \uac1d\uccb4 o\uc5d0 \ub300\ud55c \uc57d\ud55c \ucc38\uc870\ub97c \uc0dd\uc131\ud55c\ub2e4.\n", + " - \ud574\ub2f9 \uac1d\uccb4\uac00 \uba54\ubaa8\ub9ac\uc5d0 \uc815\uc0c1\uc801\uc73c\ub85c \ub0a8\uc544 \uc788\ub294\uc9c0 \uc870\uc0ac\ud55c\ub2e4.\n", + " - \uac1d\uccb4\uac00 \uba54\ubaa8\ub9ac\uc5d0 \ub0a8\uc544 \uc788\uc9c0 \uc54a\uc73c\uba74 None\uc744 \ubc18\ud658\ud55c\ub2e4.\n", + "\n", + "- \uc57d\ud55c \ucc38\uc870\ub85c \ubd80\ud130 \uc2e4\uc81c \uac1d\uccb4\ub97c \ucc38\uc870\ud558\ub294 \ubc29\ubc95\n", + " - \uc57d\ud55c \ucc38\uc870 \uac1d\uccb4\uc5d0 \ud568\uc218\ud615\ud0dc \ud638\ucd9c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import sys\n", + "import weakref # weakref \ubaa8\ub4c8 \uc784\ud3ec\ud2b8\n", + "class C:\n", + " pass\n", + "c = C() # \ud074\ub798\uc2a4 C\uc758 \uc778\uc2a4\ud134\uc2a4 \uc0dd\uc131 \n", + "c.a = 1 # \uc778\uc2a4\ud134\uc2a4 c\uc5d0 \ud14c\uc2a4\ud2b8\uc6a9 \uac12 \uc124\uc815 \n", + "print \"refcount -\", sys.getrefcount(c) # \uac1d\uccb4 c\uc758 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc870\ud68c\n", + "print\n", + "\n", + "d = c # \uc77c\ubc18\uc801\uc778 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc99d\uac00 \ubc29\ubc95\n", + "print \"refcount -\", sys.getrefcount(c) # \uac1d\uccb4 c\uc758 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc870\ud68c\n", + "print \n", + "\n", + "r = weakref.ref(c) # \uc57d\ud55c \ucc38\uc870 \uac1d\uccb4 r \uc0dd\uc131\n", + "print \"refcount -\", sys.getrefcount(c) # \uac1d\uccb4 c\uc758 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc870\ud68c --> \uce74\uc6b4\ud2b8 \ubd88\ubcc0\n", + "print" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "refcount - 2\n", + "\n", + "refcount - 3\n", + "\n", + "refcount - 3\n", + "\n" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print r # \uc57d\ud55c \ucc38\uc870(weakref) \uac1d\uccb4\n", + "print r() # \uc57d\ud55c \ucc38\uc870\ub85c \ubd80\ud130 \uc2e4\uc81c \uac1d\uccb4\ub97c \ucc38\uc870\ud558\ub294 \ubc29\ubc95: \uc57d\ud55c \ucc38\uc870 \uac1d\uccb4\uc5d0 \ud568\uc218\ud615\ud0dc\ub85c \ud638\ucd9c\n", + "print c \n", + "print r().a # \uc57d\ud55c \ucc38\uc870\ub97c \uc774\uc6a9\ud55c \uc2e4\uc81c \uac1d\uccb4 \uba64\ubc84 \ucc38\uc870\n", + "print \n", + "\n", + "del c # \uac1d\uccb4 \uc81c\uac70\n", + "del d\n", + "print r() # None\uc744 \ub9ac\ud134\ud55c\ub2e4\n", + "print r().a # \uc18d\uc131\ub3c4 \ucc38\uc870\ud560 \uc218 \uc5c6\ub2e4" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "<__main__.C instance at 0x10d893830>\n", + "<__main__.C instance at 0x10d893830>\n", + "1\n", + "\n", + "None\n" + ] + }, + { + "ename": "AttributeError", + "evalue": "'NoneType' object has no attribute 'a'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# None\uc744 \ub9ac\ud134\ud55c\ub2e4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m \u001b[0;31m# \uc18d\uc131\ub3c4 \ucc38\uc870\ud560 \uc218 \uc5c6\ub2e4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'a'" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub0b4\uc7a5 \uc790\ub8cc\ud615 \uac1d\uccb4 (\ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804 \ub4f1)\uc5d0 \ub300\ud574\uc11c\ub294 \uc57d\ud55c \ucc38\uc870\ub97c \ub9cc\ub4e4 \uc218 \uc5c6\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d = {'one': 1, 'two': 2}\n", + "wd = weakref.ref(d)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "cannot create weak reference to 'dict' object", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'one'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'two'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mwd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mweakref\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mref\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: cannot create weak reference to 'dict' object" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) weakref.proxy(o)\n", + "- weakref\uc758 proxy(o)\ub294 \uac1d\uccb4 o\uc5d0 \ub300\ud55c \uc57d\ud55c \ucc38\uc870 \ud504\ub85d\uc2dc\ub97c \uc0dd\uc131\ud55c\ub2e4.\n", + " - \ud504\ub85d\uc2dc\ub97c \uc774\uc6a9\ud558\uba74 \ud568\uc218 \ud615\uc2dd\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc2e4\uc81c \uac1d\uccb4\ub97c \ubc14\ub85c \ucc38\uc870\ud560 \uc218 \uc788\ub2e4.\n", + " - ref(o) \ud568\uc218\ubcf4\ub2e4 \ub354 \uc120\ud638\ub418\ub294 \ud568\uc218" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import sys\n", + "import weakref\n", + "class C:\n", + " pass\n", + "\n", + "c = C()\n", + "c.a = 2\n", + "print \"refcount -\", sys.getrefcount(c) # \uac1d\uccb4 c\uc758 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc870\ud68c\n", + "p = weakref.proxy(c) # \ud504\ub85d\uc2dc \uac1d\uccb4\ub97c \ub9cc\ub4e0\ub2e4\n", + "print \"refcount -\", sys.getrefcount(c) # \uac1d\uccb4 c\uc758 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc870\ud68c --> \uce74\uc6b4\ud2b8 \ubd88\ubcc0\n", + "print \n", + "print p\n", + "print c\n", + "print p.a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "refcount - 2\n", + "refcount - 2\n", + "\n", + "<__main__.C instance at 0x10d8a9998>\n", + "<__main__.C instance at 0x10d8a9998>\n", + "2\n" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import weakref\n", + "class C:\n", + " pass\n", + "\n", + "c = C() # \ucc38\uc870\ud560 \uac1d\uccb4 \uc0dd\uc131\n", + "r = weakref.ref(c) # weakref \uc0dd\uc131\n", + "p = weakref.proxy(c) # weakref \ud504\ub85d\uc2dc \uc0dd\uc131\n", + "print weakref.getweakrefcount(c) # weakref \uac1c\uc218 \uc870\ud68c\n", + "print weakref.getweakrefs(c) # weakref \ubaa9\ub85d \uc870\ud68c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n", + "[, ]\n" + ] + } + ], + "prompt_number": 30 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 \uc57d\ud55c \uc0ac\uc804\n", + "- \uc57d\ud55c \uc0ac\uc804 (Weak Dictionary)\n", + " - \uc0ac\uc804\uc758 \ud0a4(key)\ub098 \uac12(value)\uc73c\ub85c \ub2e4\ub978 \uac1d\uccb4\ub4e4\uc5d0 \ub300\ud55c \uc57d\ud55c \ucc38\uc870\ub97c \uc9c0\ub2c8\ub294 \uc0ac\uc804\n", + " - \uc8fc\ub85c \ub2e4\ub978 \uac1d\uccb4\ub4e4\uc5d0 \ub300\ud55c \uce90\uc2dc(Cache)\ub85c \ud65c\uc6a9\n", + " - \uc77c\ubc18\uc801\uc778 \uc0ac\uc804\uacfc\uc758 \ucc28\uc774\uc810\n", + " - \ud0a4(key)\ub098 \uac12(value)\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uac1d\uccb4\ub294 \uc57d\ud55c \ucc38\uc870\ub97c \uc9c0\ub2cc\ub2e4.\n", + " - \uc2e4\uc81c \uac1d\uccb4\uac00 \uc0ad\uc81c\ub418\uba74 \uc790\ub3d9\uc801\uc73c\ub85c \uc57d\ud55c \uc0ac\uc804\uc5d0 \uc788\ub294 (\ud0a4, \uac12)\uc758 \uc30d\ub3c4 \uc0ad\uc81c\ub41c\ub2e4.\n", + " - \uc989, \uc2e4\uc81c \uac1d\uccb4\uac00 \uc0ac\ub77c\uc9c0\uba74 \uce90\uc2dc\uc5ed\ud560\uc744 \ud558\ub294 \uc57d\ud55c \uc0ac\uc804\uc5d0\uc11c\ub3c4 \ud574\ub2f9 \uc544\uc774\ud15c\uc774 \uc81c\uac70\ub418\ubbc0\ub85c \ud6a8\uc728\uc801\uc778 \uac1d\uccb4 \uc18c\uba78 \uad00\ub9ac\uac00 \uac00\ub2a5\ud558\ub2e4. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- weakref \ubaa8\ub4c8\uc758 WeakValueDictionary \ud074\ub798\uc2a4\n", + " - weakref \ubaa8\ub4c8\uc758 WeakValueDictionary \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub294 \uc57d\ud55c \uc0ac\uc804\uc744 \uc0dd\uc131\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import weakref\n", + "class C:\n", + " pass\n", + "\n", + "c = C()\n", + "c.a = 4\n", + "d = weakref.WeakValueDictionary() # WeakValueDictionary \uac1d\uccb4 \uc0dd\uc131\n", + "print d\n", + "\n", + "d[1] = c # \uc2e4\uc81c \uac1d\uccb4\uc5d0 \ub300\ud55c \uc57d\ud55c \ucc38\uc870 \uc544\uc774\ud15c \uc0dd\uc131\n", + "print d.items() # \uc0ac\uc804 \ub0b4\uc6a9 \ud655\uc778\n", + "print d[1].a # \uc2e4\uc81c \uac1d\uccb4\uc758 \uc18d\uc131 \ucc38\uc870\n", + "\n", + "del c # \uc2e4\uc81c \uac1d\uccb4 \uc0ad\uc81c\n", + "print d.items() # \uc57d\ud55c \uc0ac\uc804\uc5d0 \ud574\ub2f9 \uac1d\uccb4 \uc544\uc774\ud15c\ub3c4 \uc81c\uac70\ub418\uc5b4 \uc788\uc74c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "[(1, <__main__.C instance at 0x10dccad40>)]\n", + "4\n", + "[]\n" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc77c\ubc18 \uc0ac\uc804\uc744 \ud1b5\ud558\uc5ec \ub3d9\uc77c\ud55c \uc608\uc81c\ub97c \uc218\ud589\ud558\uba74 \ub9c8\uc9c0\ub9c9\uc5d0 \ud574\ub2f9 \uac1d\uccb4\ub97c \uc0ad\uc81c\ud574\ub3c4 \uc77c\ubc18 \uc0ac\uc804 \ub0b4\uc5d0\uc11c\ub294 \uc5ec\uc804\ud788 \uc874\uc7ac\ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class C:\n", + " pass\n", + "\n", + "c = C()\n", + "c.a = 4\n", + "d = {} # \uc77c\ubc18 \uc0ac\uc804 \uac1d\uccb4 \uc0dd\uc131\n", + "print d\n", + "\n", + "d[1] = c # \uc2e4\uc81c \uac1d\uccb4\uc5d0 \ub300\ud55c \uc77c\ubc18 \ucc38\uc870 \uc544\uc774\ud15c \uc0dd\uc131\n", + "print d.items() # \uc0ac\uc804 \ub0b4\uc6a9 \ud655\uc778\n", + "print d[1].a # \uc2e4\uc81c \uac1d\uccb4\uc758 \uc18d\uc131 \ucc38\uc870\n", + "\n", + "del c # \uac1d\uccb4 \uc0ad\uc81c (\uc0ac\uc804\uc5d0 \ud574\ub2f9 \uac1d\uccb4\uc758 \ub808\ud37c\ub7f0\uc2a4\uac00 \uc788\uc73c\ubbc0\ub85c \uac1d\uccb4\ub294 \uc2e4\uc81c\ub85c \uba54\ubaa8\ub9ac \ud574\uc81c\ub418\uc9c0 \uc54a\uc74c)\n", + "print d.items() # \uc77c\ubc18 \uc0ac\uc804\uc5d0 \ud574\ub2f9 \uac1d\uccb4 \uc544\uc774\ud15c\uc774 \uc5ec\uc804\ud788 \ub0a8\uc544 \uc788\uc74c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "{}\n", + "[(1, <__main__.C instance at 0x10d893878>)]\n", + "4\n", + "[(1, <__main__.C instance at 0x10d893878>)]\n" + ] + } + ], + "prompt_number": 21 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \ubc18\ubcf5\uc790\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 \ubc18\ubcf5\uc790 \uac1d\uccb4\n", + "- \ubc18\ubcf5\uc790 \uac1d\uccb4\n", + " - next() \uba54\uc18c\ub4dc\ub97c \uc9c0\ub2c8\uace0 \uc788\ub294 \uac1d\uccb4\n", + " - next() \uba54\uc18c\ub4dc\ub85c \ub354 \uc774\uc0c1 \uc790\ub8cc\ub97c \ub150\uaca8\uc904 \uc218 \uc5c6\uc744 \ub54c StopIteration \uc608\uc678\uac00 \ubc1c\uc0dd\ud55c\ub2e4.\n", + "- \ubc18\ubcf5\uc790 \uac1d\uccb4 \uc0dd\uc131 \ubc29\ubc95\n", + " - iter(o) \ub0b4\uc7a5 \ud568\uc218\n", + " - \uac1d\uccb4 o\uc758 \ubc18\ubcf5\uc790 \uac1d\uccb4\ub97c \ubc18\ud658\ud55c\ub2e4.\n", + "- \ubc18\ubcf5\uc790 \uac1d\uccb4\uc758 \ud6a8\uc728\uc131\n", + " - \ubc18\ubcf5\uc790\uac00 \uc6d0 \uac1d\uccb4\uc758 \uc6d0\uc18c\ub4e4\uc744 \ubcf5\uc0ac\ud558\uc5ec \uc9c0\ub2c8\uace0 \uc788\uc9c0 \uc54a\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "I = iter([1,2,3])\n", + "print I\n", + "\n", + "print I.next()\n", + "print I.next()\n", + "print I.next()\n", + "print I.next()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "1\n", + "2\n", + "3\n" + ] + }, + { + "ename": "StopIteration", + "evalue": "", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m: " + ] + } + ], + "prompt_number": 20 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8 \uac1d\uccb4\uc5d0 \ub300\ud574 \uc77c\ubc18\uc801\uc778 for ~ in \ubc18\ubcf5 \ubb38 \uc0ac\uc6a9\uc608" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f(x):\n", + " print x + 1\n", + "\n", + "for x in [1,2,3]:\n", + " f(x)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n", + "3\n", + "4\n" + ] + } + ], + "prompt_number": 53 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8 \uac1d\uccb4\uc5d0 \ubc18\ubcf5\uc790\ub97c \ud65c\uc6a9\ud55c \uc608" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f(x):\n", + " print x + 1\n", + "\n", + "t = iter([1,2,3])\n", + "while 1:\n", + " try:\n", + " x = t.next()\n", + " except StopIteration:\n", + " break\n", + " f(x)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n", + "3\n", + "4\n" + ] + } + ], + "prompt_number": 23 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- for ~ in \uad6c\ubb38\uc5d0 \ubc18\ubcf5\uc790\ub97c \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4.\n", + " - for \ubb38\uc774 \ub3cc\ub54c \ub9c8\ub2e4 \ubc18\ubcf5\uc790 \uac1d\uccb4\uc758 next() \ud568\uc218\uac00 \uc790\ub3d9\uc73c\ub85c \ud638\ucd9c\ub418\uc5b4 \uc21c\ucc28\uc801\uc73c\ub85c \uac01 \uac1d\uccb4\uc5d0 \uc811\uadfc \uac00\ub2a5\ud558\ub2e4.\n", + " - StopIteration\uc774 \ubc1c\uc0dd\ud558\uba74 for ~ in \uad6c\ubb38\uc774 \uba48\ucd98\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f(x):\n", + " print x + 1\n", + "\n", + "t = iter([1,2,3])\n", + "for x in t:\n", + " f(x)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n", + "3\n", + "4\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f(x):\n", + " print x + 1\n", + "\n", + "for x in iter([1,2,3]):\n", + " f(x)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n", + "3\n", + "4\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f(x):\n", + " print x + 1\n", + "\n", + "for x in iter((1,2,3)):\n", + " f(x)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "2\n", + "3\n", + "4\n" + ] + } + ], + "prompt_number": 24 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \ud074\ub798\uc2a4\uc5d0 \ubc18\ubcf5\uc790 \uad6c\ud604\ud558\uae30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub0b4\uc7a5 \ud568\uc218 iter(o)\uc5d0 \ub300\uc751\ub418\ub294 \\_\\_iter\\_\\_(self)\uc758 \uad6c\ud604 \n", + " - \uac1d\uccb4 o\uc5d0 iter(o)\ub97c \ud638\ucd9c\ud558\uba74 \uc790\ub3d9\uc73c\ub85c \\_\\_iter\\_\\_(self) \ud568\uc218 \ud638\ucd9c\n", + " - \\_\\_iter\\_\\_(self) \ud568\uc218\ub294 next() \ud568\uc218\ub97c \uc9c0\ub2cc \ubc18\ubcf5\uc790 \uac1d\uccb4\ub97c \ubc18\ud658\ud574\uc57c \ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Seq:\n", + " def __init__(self, fname):\n", + " self.file = open(fname)\n", + " #def __getitem__(self, n):\n", + " # if n == 10:\n", + " # raise StopIteration\n", + " # return n\n", + " def __iter__(self):\n", + " return self\n", + " def next(self):\n", + " line = self.file.readline() # \ud55c \ub77c\uc778\uc744 \uc77d\ub294\ub2e4.\n", + " if not line: \n", + " raise StopIteration # \uc77d\uc744 \uc218 \uc5c6\uc73c\uba74 \uc608\uc678 \ubc1c\uc0dd\n", + " return line # \uc77d\uc740 \ub77c\uc778\uc744 \ub9ac\ud134\ud55c\ub2e4.\n", + " \n", + "s = Seq('readme.txt') # s \uc778\uc2a4\ud134\uc2a4\uac00 next() \uba54\uc18c\ub4dc\ub97c \uc9c0\ub2c8\uace0 \uc788\uc73c\ubbc0\ub85c s \uc778\uc2a4\ud134\uc2a4 \uc790\uccb4\uac00 \ubc18\ubcf5\uc790\uc784 \n", + "for line in s: # \uc6b0\uc120 __iter__() \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uc5ec \ubc18\ubcf5\uc790\ub97c \uc5bb\uace0, \ubc18\ubcf5\uc790\uc5d0 \ub300\ud574\uc11c for ~ in \uad6c\ubb38\uc5d0 \uc758\ud558\uc5ec next() \uba54\uc18c\ub4dc\uac00 \ud638\ucd9c\ub428\n", + " print line,\n", + "\n", + "print \n", + "\n", + "print Seq('readme.txt')\n", + "\n", + "print list(Seq('readme.txt')) # list() \ub0b4\uc7a5 \ud568\uc218\uac00 \uac1d\uccb4\ub97c \uc778\uc218\ub85c \ubc1b\uc73c\uba74 \ud574\ub2f9 \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790\ub97c \uc5bb\uc5b4\uc640 next()\ub97c \ub9e4\ubc88 \ud638\ucd9c\ud558\uc5ec \uac01 \uc6d0\uc18c\ub97c \uc5bb\uc5b4\uc628\ub2e4. \n", + "print tuple(Seq('readme.txt')) # tuple() \ub0b4\uc7a5 \ud568\uc218\uac00 \uac1d\uccb4\ub97c \uc778\uc218\ub85c \ubc1b\uc73c\uba74 \ud574\ub2f9 \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790\ub97c \uc5bb\uc5b4\uc640 next()\ub97c \ub9e4\ubc88 \ud638\ucd9c\ud558\uc5ec \uac01 \uc6d0\uc18c\ub97c \uc5bb\uc5b4\uc628\ub2e4. " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "abc\n", + "def\n", + "ghi\n", + "\n", + "<__main__.Seq instance at 0x10ddc5680>\n", + "['abc\\n', 'def\\n', 'ghi\\n']\n", + "('abc\\n', 'def\\n', 'ghi\\n')\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 \uc0ac\uc804\uc758 \ubc18\ubcf5\uc790" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc0ac\uc804\uc5d0 \ub300\ud574 for ~ in \uad6c\ubb38\uc740 \ud0a4\uc5d0 \ub300\ud574 \ubc18\ubcf5\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}\n", + "for key in d:\n", + " print key, d[key]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "four 4\n", + "three 3\n", + "five 5\n", + "two 2\n", + "one 1\n" + ] + } + ], + "prompt_number": 53 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}\n", + "for key in iter(d):\n", + " print key, d[key]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "four 4\n", + "three 3\n", + "five 5\n", + "two 2\n", + "one 1\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- d.iterkeys() \ud568\uc218\n", + " - \uc0ac\uc804 d\uac00 \uc9c0\ub2cc \ud0a4\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790 \uac1d\uccb4\ub97c \ubc18\ud658\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for key in d.iterkeys(): # \ud0a4\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790, d.iterkeys() \uac00 \ubc18\ud658\ud55c \ubc18\ubcf5\uc790\uc5d0 \ub300\ud574 next() \ud568\uc218\uac00 \uc21c\ucc28\uc801\uc73c\ub85c \ubd88\ub9ac\uc6cc\uc9d0\n", + " print key," + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "four three five two one\n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "keyset = d.iterkeys()\n", + "print keyset.next() # \ubc18\ubcf5\uc790 \uac1d\uccb4\ub294 \ud56d\uc0c1 next() \uba54\uc18c\ub4dc\ub97c \uc9c0\ub2c8\uace0 \uc788\uc74c\n", + "for key in keyset: # keyset \ubc18\ubcf5\uc790\uc5d0 \ub300\ud574 next() \uba54\uc18c\ub4dc\uac00 \uc21c\ucc28\uc801\uc73c\ub85c \ud638\ucd9c\ub428\n", + " print key," + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "four\n", + "three five two one\n" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- d.itervalues() \ud568\uc218\n", + " - \uc0ac\uc804 d\uac00 \uc9c0\ub2cc \uac12\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790 \uac1d\uccb4\ub97c \ubc18\ud658\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for value in d.itervalues(): # \uac12\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790\n", + " print value, " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "4 3 5 2 1\n" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- d.iteritems() \ud568\uc218\n", + " - \uc0ac\uc804 d\uc758 \uac01 \uc544\uc774\ud15c\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790 \uac1d\uccb4\ub97c \ubc18\ud658\ud55c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for key, value in d.iteritems(): #(\ud0a4,\uac12)\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790\n", + " print key, value" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "four 4\n", + "three 3\n", + "five 5\n", + "two 2\n", + "one 1\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 \ud30c\uc77c \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud30c\uc77c \uac1d\uccb4\ub294 \uadf8 \uc790\uccb4\uac00 \ubc18\ubcf5\uc790\uc784\n", + " - next() \ud568\uc218\uc5d0 \uc758\ud574 \uac01 \ub77c\uc778\uc774 \uc21c\ucc28\uc801\uc73c\ub85c \uc77d\ud600\uc9d0" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "f = open('readme.txt')\n", + "print \"f.next()\", f.next()\n", + "for line in f: # f.next() \uac00 \uc21c\ucc28\uc801\uc73c\ub85c \ud638\ucd9c\ub428\n", + " print line, " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "f.next() 1: Hello World\n", + "\n", + "2: Hello World\n", + "3: Hello World\n", + "4: Hello World\n", + "5: Hello World\n" + ] + } + ], + "prompt_number": 21 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 \ubc1c\uc0dd\uc790\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 \ubc1c\uc0dd\uc790\ub780?\n", + "- \ubc1c\uc0dd\uc790(Generator)\n", + " - (\uc911\ub2e8\ub428 \uc2dc\uc810\ubd80\ud130) \uc7ac\uc2e4\ud589 \uac00\ub2a5\ud55c \ud568\uc218\n", + " \n", + "- \uc544\ub798 \ud568\uc218 f()\ub294 \uc790\uc2e0\uc758 \uc778\uc218 \ubc0f \ub0b4\ubd80 \ubcc0\uc218\ub85c\uc11c a, b, c, d\ub97c \uc9c0\ub2c8\uace0 \uc788\ub2e4.\n", + " - \uc774\ub7ec\ud55c a, b, c, d \ubcc0\uc218\ub4e4\uc740 \ud568\uc218\uac00 \uc885\ub8cc\ub418\uace0 \ubc18\ud658\ub420 \ub54c \ubaa8\ub450 \uc0ac\ub77c\uc9c4\ub2e4.\n", + "- \ubc1c\uc0dd\uc790\ub294 f()\uc640 \uac19\uc774 \ud568\uc218\uac00 \uc885\ub8cc\ub420 \ub54c \uba54\ubaa8\ub9ac\uc5d0\uc11c \ud574\uc81c\ub418\ub294 \uac83\uc744 \ub9c9\uace0 \ub2e4\uc2dc \ud568\uc218\uac00 \ud638\ucd9c \ub420 \ub54c \uc774\uc804\uc5d0 \uc218\ud589\uc774 \uc885\ub8cc\ub418\uc5c8\ub358 \uc9c0\uc810 \ubd80\ud130 \uacc4\uc18d \uc218\ud589\uc774 \uac00\ub2a5\ud558\ub3c4\ub85d \uad6c\ud604\ub41c \ud568\uc218\uc774\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f(a,b):\n", + " c = a * b\n", + " d = a + b\n", + " return c, d" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- yield \ud0a4\uc6cc\ub4dc\n", + " - return \ub300\uc2e0\uc5d0 yield\uc5d0 \uc758\ud574 \uac12\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218\ub294 \ubc1c\uc0dd\uc790\uc774\ub2e4.\n", + " - yield\ub294 return\uacfc \uc720\uc0ac\ud558\uac8c \uc784\uc758\uc758 \uac12\uc744 \ubc18\ud658\ud558\uc9c0\ub9cc \ud568\uc218\uc758 \uc2e4\ud589 \uc0c1\ud0dc\ub97c \ubcf4\uc874\ud558\uba74\uc11c \ud568\uc218\ub97c \ud638\ucd9c\ud55c \ucabd\uc73c\ub85c \ubcf5\uadc0\uc2dc\ucf1c\uc900\ub2e4.\n", + "- \ubc1c\uc0dd\uc790\ub294 \uace7 \ubc18\ubcf5\uc790\uc774\ub2e4.\n", + " - \uc989, \ubc1c\uc0dd\uc790\uc5d0\uac8c next() \ud638\ucd9c\uc774 \uac00\ub2a5\ud558\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def generate_ints(N):\n", + " for i in range(N):\n", + " yield i" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "gen = generate_ints(3) # \ubc1c\uc0dd\uc790 \uac1d\uccb4\ub97c \uc5bb\ub294\ub2e4. generate_ints() \ud568\uc218\uc5d0 \ub300\ud55c \ucd08\uae30 \uc2a4\ud0dd \ud504\ub808\uc784\uc774 \ub9cc\ub4e4\uc5b4\uc9c0\ub098 \uc2e4\ud589\uc740 \uc911\ub2e8\ub418\uc5b4 \uc788\ub294 \uc0c1\ud0dc\uc784\n", + "print gen\n", + "print gen.next() # \ubc1c\uc0dd\uc790 \uac1d\uccb4\ub294 \ubc18\ubcf5\uc790 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uac00\uc9c4\ub2e4. \ubc1c\uc0dd\uc790\uc758 \uc2e4\ud589\uc774 \uc7ac\uac1c\ub428. yield\uc5d0 \uc758\ud574 \uac12 \ubc18\ud658 \ud6c4 \ub2e4\uc2dc \uc2e4\ud589\uc774 \uc911\ub2e8\ub428\n", + "print gen.next() # \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \uac12 \ubc18\ud658 \ud6c4 \ub2e4\uc2dc \uc911\ub2e8\n", + "print gen.next() # \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \uac12 \ubc18\ud658 \ud6c4 \ub2e4\uc2dc \uc911\ub2e8\n", + "print gen.next() # \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \ub354 \uc774\uc0c1 \ubc18\ud658\ud560 \uac12\uc774 \uc5c6\ub2e4\uba74 StopIteration \uc608\uc678\ub97c \ub358\uc9d0" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "0\n", + "1\n", + "2\n" + ] + }, + { + "ename": "StopIteration", + "evalue": "", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \uac12 \ubc18\ud658 \ud6c4 \ub2e4\uc2dc \uc911\ub2e8\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \uac12 \ubc18\ud658 \ud6c4 \ub2e4\uc2dc \uc911\ub2e8\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \ub354 \uc774\uc0c1 \ubc18\ud658\ud560 \uac12\uc774 \uc5c6\ub2e4\uba74 StopIteration \uc608\uc678\ub97c \ub358\uc9d0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m: " + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc704\uc640 \uac19\uc740 \uc138\ubd80 \ub3d9\uc791 \ubc29\uc2dd\uc744 \uc774\uc6a9\ud558\uc5ec, \ub2e4\uc74c\uacfc \uac19\uc774 for ~ in \uad6c\ubb38\uc5d0 \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for i in generate_ints(5):\n", + " print i," + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0 1 2 3 4\n" + ] + } + ], + "prompt_number": 22 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ubc1c\uc0dd\uc790 \ud568\uc218\uc640 \uc77c\ubc18 \ud568\uc218\uc758 \ucc28\uc774\uc810\n", + " - \uc77c\ubc18 \ud568\uc218\ub294 \ud568\uc218\uac00 \ud638\ucd9c\ub418\uba74 \uadf8 \ud568\uc218 \ub0b4\ubd80\uc5d0 \uc815\uc758\ub41c \ubaa8\ub4e0 \uc77c\uc744 \ub9c8\uce58\uace0 \uacb0\uacfc\ub97c \ubc18\ud658\ud568\n", + " - \ubc1c\uc0dd\uc790 \ud568\uc218\ub294 \ud568\uc218 \ub0b4\uc5d0\uc11c \uc218\ud589 \uc911\uc5d0 \uc911\uac04 \uacb0\uacfc \uac12\uc744 \ubc18\ud658\ud560 \uc218 \uc788\uc74c\n", + "- \ubc1c\uc0dd\uc790\uac00 \uc720\uc6a9\ud558\uac8c \uc0ac\uc6a9\ub418\ub294 \uacbd\uc6b0\n", + " - \ud568\uc218 \ucc98\ub9ac\uc758 \uc911\uac04 \uacb0\uacfc\ub97c \ub2e4\ub978 \ucf54\ub4dc\uc5d0\uc11c \ucc38\uc870\ud560 \uacbd\uc6b0\n", + " - \ubaa8\ub4e0 \uacb0\uacfc\ub97c \ud55c\uaebc\ubc88\uc5d0 \ucc98\ub9ac\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \ud568\uc218 \ucc98\ub9ac \uc911\uc5d0 \ub098\uc628 \uc911\uac04 \uacb0\uacfc\ub97c \uc0ac\uc6a9\ud574\uc57c \ud560 \uacbd\uc6b0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 \ubc1c\uc0dd\uc790 \uad6c\ubb38\n", + "- \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec(List Comprehension)\n", + " - \ub9ac\uc2a4\ud2b8 \uac1d\uccb4\uc758 \uc0c8\ub85c\uc6b4 \uc0dd\uc131\n", + " - \uba54\ubaa8\ub9ac\ub97c \uc2e4\uc81c\ub85c \uc810\uc720\ud558\uba74\uc11c \uc0dd\uc131\ub428" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print [k for k in range(100) if k % 5 == 0]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]\n" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec \uad6c\ubb38\uc5d0 []\uac00 \uc544\ub2c8\ub77c () \uc0ac\uc6a9\n", + " - \ub9ac\uc2a4\ud2b8 \ub300\uc2e0\uc5d0 \ubc1c\uc0dd\uc790 \uc0dd\uc131\n", + " - \ucc98\uc74c\ubd80\ud130 \ubaa8\ub4e0 \uc6d0\uc18c\uac00 \uc0dd\uc131\ub418\uc9c0 \uc54a\uace0 \ud544\uc694\ud55c \uc2dc\uc810\uc5d0 \uac01 \uc6d0\uc18c\uac00 \ub9cc\ub4e4\uc5b4\uc9d0\n", + " - \uba54\ubaa8\ub9ac\ub97c \ubcf4\ub2e4 \ud6a8\uc728\uc801\uc73c\ub85c \uc0ac\uc6a9\ud568" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = (k for k in range(100) if k % 5 == 0)\n", + "print a\n", + "print a.next()\n", + "print a.next()\n", + "print a.next()\n", + "for i in a:\n", + " print i," + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " at 0x10d84df50>\n", + "0\n", + "5\n", + "10\n", + "15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95\n" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc544\ub798 \uc608\ub294 sum \ub0b4\uc7a5 \ud568\uc218\uc5d0 \ubc1c\uc0dd\uc790\ub97c \ub123\uc5b4\uc90c\n", + " - sum\uc744 \ud638\ucd9c\ud558\ub294 \uc2dc\uc810\uc5d0\ub294 \ubc1c\uc0dd\uc790\uac00 \uc544\uc9c1 \ud638\ucd9c\ub418\uae30 \uc9c1\uc804\uc774\ubbc0\ub85c \uac01 \uc6d0\uc18c\ub4e4\uc740 \uc544\uc9c1 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4.\n", + " - sum \ub0b4\ubd80\uc5d0\uc11c \ubc1c\uc0dd\uc790\uac00 \uc9c0\ub2c8\uace0 \uc788\ub294 next() \ud568\uc218\ub97c \ud638\ucd9c\ud558\uc5ec \uac01 \uc6d0\uc18c\ub4e4\uc744 \uc9c1\uc811 \ub9cc\ub4e4\uc5b4 \ud65c\uc6a9\ud55c\ub2e4.\n", + " - \uba54\ubaa8\uc2dc \uc0ac\uc6a9 \ud6a8\uc728\uc774 \ub192\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print sum((k for k in range(100) if k % 5 == 0))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "950\n" + ] + } + ], + "prompt_number": 35 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-3 \ubc1c\uc0dd\uc790\uc758 \ud65c\uc6a9 \uc608 1 - \ud53c\ubcf4\ub098\uce58 \uc218\uc5f4" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def fibonacci(a = 1, b = 1):\n", + " while 1:\n", + " yield a \n", + " a, b = b, a + b\n", + " \n", + "for k in fibonacci(): # \ubc1c\uc0dd\uc790\ub97c \uc9c1\uc811 for ~ in \uad6c\ubb38\uc5d0 \ud65c\uc6a9\n", + " if k > 100: \n", + " break\n", + " print k," + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 1 2 3 5 8 13 21 34 55 89\n" + ] + } + ], + "prompt_number": 42 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-4 \ubc1c\uc0dd\uc790\uc758 \ud65c\uc6a9 \uc608 2 - \ud640\uc218 \uc9d1\ud569 \ub9cc\ub4e4\uae30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ubc18\ubcf5\uc790\ub97c \ud65c\uc6a9\ud55c \uc608" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Odds:\n", + " def __init__(self, limit = None): # \uc0dd\uc131\uc790 \uc815\uc758\n", + " self.data = -1 # \ucd08\uae30 \uac12\n", + " self.limit = limit # \ud55c\uacc4 \uac12\n", + " def __iter__(self): # Odds \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790\ub97c \ubc18\ud658\ud558\ub294 \ud2b9\uc218 \ud568\uc218\n", + " return self\n", + " def next(self): # \ubc18\ubcf5\uc790\uc758 \ud544\uc218 \ud568\uc218\n", + " self.data += 2\n", + " if self.limit and self.limit <= self.data:\n", + " raise StopIteration\n", + " return self.data\n", + "\n", + "for k in Odds(20):\n", + " print k,\n", + "print\n", + "print list(Odds(20)) # list() \ub0b4\uc7a5 \ud568\uc218\uac00 \uac1d\uccb4\ub97c \uc778\uc218\ub85c \ubc1b\uc73c\uba74 \ud574\ub2f9 \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790\ub97c \uc5bb\uc5b4\uc640 next()\ub97c \ub9e4\ubc88 \ud638\ucd9c\ud558\uc5ec \uac01 \uc6d0\uc18c\ub97c \uc5bb\uc5b4\uc628\ub2e4. " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 3 5 7 9 11 13 15 17 19\n", + "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n" + ] + } + ], + "prompt_number": 43 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ubc1c\uc0dd\uc790\ub97c \ud65c\uc6a9\ud55c \uc608" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def odds(limit=None):\n", + " k = 1\n", + " while not limit or limit >= k:\n", + " yield k\n", + " k += 2\n", + " \n", + "for k in odds(20):\n", + " print k,\n", + "print\n", + "print list(odds(20)) # list() \ub0b4\uc7a5 \ud568\uc218\uac00 \ubc1c\uc0dd\uc790\ub97c \uc778\uc218\ub85c \ubc1b\uc73c\uba74 \ud574\ub2f9 \ubc1c\uc0dd\uc790\uc758 next()\ub97c \ub9e4\ubc88 \ud638\ucd9c\ud558\uc5ec \uac01 \uc6d0\uc18c\ub97c \uc5bb\uc5b4\uc628\ub2e4. " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 3 5 7 9 11 13 15 17 19\n", + "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n" + ] + } + ], + "prompt_number": 71 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python3.6/python23.ipynb b/python3.6/python23.ipynb new file mode 100644 index 0000000..6d13d1b --- /dev/null +++ b/python3.6/python23.ipynb @@ -0,0 +1,957 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:1129ada8bea533775e5222c2157b572fbfef33239fe0b2b06d5d1b1085944d84" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 23. \uc608\uc678\ucc98\ub9ac\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 \ud30c\uc774\uc36c \uc608\uc678\uc758 \uc885\ub958\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uad6c\ubb38 \uc5d0\ub7ec (Syntax Error)\n", + " - \ubb38\ubc95\uc801 \uc5d0\ub7ec\n", + " - \uc774\ud074\ub9bd\uc2a4 \ub4f1\uc758 \ud1b5\ud569\uac1c\ubc1c\ud658\uacbd \ub3c4\uad6c\uc5d0\uc11c\ub294 \uc790\ub3d9\uc73c\ub85c \uc2e4\ud589 \uc804\uc5d0 \uad6c\ubb38 \uc5d0\ub7ec\ub97c \uccb4\ud06c \ud574 \uc90c\n", + " - \ud30c\uc774\uc36c\uc740 \uc0c1\ub300\uc801\uc73c\ub85c \uc5b8\uc5b4\uc801 \ubb38\ubc95\uc774 \uac04\ub2e8\ud558\uae30 \ub54c\ubb38\uc5d0 \uad6c\ubb38 \uc790\uccb4\uc758 \uc5d0\ub7ec \ubc1c\uc0dd \ube44\uc728\uc774 \ub0ae\uac70\ub098 \ub2e4\ub978 \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc644\ubcbd\ud558\uac8c \uc81c\uac70\ud560 \uc218 \uc788\uc74c\n", + "\n", + "- \uc608\uc678 (Exception)\n", + " - \uad6c\ubb38 \uc5d0\ub7ec\ub294 \uc5c6\uc73c\ub098 \ud504\ub85c\uadf8\ub7a8 \uc2e4\ud589 \uc911 \ub354 \uc774\uc0c1 \uc9c4\ud589 \ud560 \uc218 \uc5c6\ub294 \uc0c1\ud669" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c \ubcf4\uae30\n", + "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 1: \uc815\uc758\ub418\uc9c0 \uc54a\uc740 \ubcc0\uc218 \uc0ac\uc6a9\ud558\uae30\n", + " - NameError" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "4 + spam*3" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'spam' is not defined", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m4\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mspam\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'spam' is not defined" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 2: 0\uc73c\ub85c \uc22b\uc790 \ub098\ub204\uae30\n", + " - ZeroDivisionError" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 10\n", + "b = 0 \n", + "c = a / b" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "integer division or modulo by zero", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m: integer division or modulo by zero" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [note] \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uba74 \ud504\ub85c\uadf8\ub7a8\uc740 \ubc14\ub85c \uc885\ub8cc\ub41c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def division():\n", + " for n in range(0, 5):\n", + " print 10.0 / n\n", + "\n", + "division() " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "float division by zero", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mdivision\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" + ] + } + ], + "prompt_number": 48 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 3: \ubb38\uc790\uc5f4\uacfc \uc22b\uc790 \ub354\ud558\uae30\n", + " - TypeError" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'2' + 2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "cannot concatenate 'str' and 'int' objects", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m'2'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: cannot concatenate 'str' and 'int' objects" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 4: \ucc38\uc870 \ubc94\uc704\ub97c \ub118\uc5b4\uc11c \uc778\ub371\uc2a4 \uc0ac\uc6a9\n", + " - IndexError" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "l = [1, 2]\n", + "print l[2]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "list index out of range", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m: list index out of range" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 5: \ub4f1\ub85d\ub418\uc9c0 \uc54a\uc740 \ud0a4\ub85c \uc0ac\uc804 \uac80\uc0c9\n", + " - KeyError" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "d = {\"a\": 1, \"b\": 2}\n", + "print d['c']" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'c'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"a\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 'c'" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 6: \uc788\uc9c0\ub3c4 \uc54a\uc740 \ud30c\uc77c\uc744 \uc5f4\ub824\uace0 \ud560 \ub54c\n", + " - IOError" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = open('aaa.txt')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "IOError", + "evalue": "[Errno 2] No such file or directory: 'aaa.txt'", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIOError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'aaa.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIOError\u001b[0m: [Errno 2] No such file or directory: 'aaa.txt'" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 \ub0b4\uc7a5 \uc608\uc678\uc758 \uc885\ub958\n", + "- \uc608\uc678 \ud074\ub798\uc2a4\uc758 \uacc4\uce35 \uad6c\uc870 ([\ucc38\uace0] https://docs.python.org/2/library/exceptions.html)\n", + "
BaseException\n",
+      " +-- SystemExit\n",
+      " +-- KeyboardInterrupt\n",
+      " +-- GeneratorExit\n",
+      " +-- Exception\n",
+      "      +-- StopIteration\n",
+      "      +-- StandardError\n",
+      "      |    +-- BufferError\n",
+      "      |    +-- ArithmeticError\n",
+      "      |    |    +-- FloatingPointError\n",
+      "      |    |    +-- OverflowError\n",
+      "      |    |    +-- ZeroDivisionError\n",
+      "      |    +-- AssertionError\n",
+      "      |    +-- AttributeError\n",
+      "      |    +-- EnvironmentError\n",
+      "      |    |    +-- IOError\n",
+      "      |    |    +-- OSError\n",
+      "      |    |         +-- WindowsError (Windows)\n",
+      "      |    |         +-- VMSError (VMS)\n",
+      "      |    +-- EOFError\n",
+      "      |    +-- ImportError\n",
+      "      |    +-- LookupError\n",
+      "      |    |    +-- IndexError\n",
+      "      |    |    +-- KeyError\n",
+      "      |    +-- MemoryError\n",
+      "      |    +-- NameError\n",
+      "      |    |    +-- UnboundLocalError\n",
+      "      |    +-- ReferenceError\n",
+      "      |    +-- RuntimeError\n",
+      "      |    |    +-- NotImplementedError\n",
+      "      |    +-- SyntaxError\n",
+      "      |    |    +-- IndentationError\n",
+      "      |    |         +-- TabError\n",
+      "      |    +-- SystemError\n",
+      "      |    +-- TypeError\n",
+      "      |    +-- ValueError\n",
+      "      |         +-- UnicodeError\n",
+      "      |              +-- UnicodeDecodeError\n",
+      "      |              +-- UnicodeEncodeError\n",
+      "      |              +-- UnicodeTranslateError\n",
+      "      +-- Warning\n",
+      "           +-- DeprecationWarning\n",
+      "           +-- PendingDeprecationWarning\n",
+      "           +-- RuntimeWarning\n",
+      "           +-- SyntaxWarning\n",
+      "           +-- UserWarning\n",
+      "           +-- FutureWarning\n",
+      "\t   +-- ImportWarning\n",
+      "\t   +-- UnicodeWarning\n",
+      "\t   +-- BytesWarning\n",
+      "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 \uc608\uc678 \ucc98\ub9ac \ubc29\ubc95\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 try/except/else/finally \uc808 \uc0ac\uc6a9\ud558\uae30\n", + "- \uc608\uc678\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \uc0c1\ud669\uc744 \uc608\uc0c1\ud558\uc5ec \uc608\uc678 \ubc1c\uc0dd \uc0c1\ud669\uc744 \uc804\uccb4 \ucf54\ub4dc \ud750\ub984\uc744 \ud568\uaed8 \uc81c\uc5b4\ud560 \uc218 \uc788\ub2e4.\n", + "- try/except/else/finally \uc808\n", + " - \uad6c\ubb38\n", + "> try:
\n", + ">     (\uc608\uc678 \ubc1c\uc0dd \uac00\ub2a5\ud55c) \uc77c\ubc18\uc801\uc778 \uc218\ud589\ubb38\ub4e4
\n", + "> except Exception:
\n", + ">     \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc600\uc744 \ub54c \uc218\ud589\ub418\ub294 \ubb38\ub4e4
\n", + "> else:
\n", + ">     \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc558\uc744 \ub54c \uc218\ud589\ub418\ub294 \ubb38\ub4e4
\n", + "> finally:
\n", + ">     \uc608\uc678 \ubc1c\uc0dd \uc720\ubb34\uc640 \uad00\uacc4\uc5c6\uc774 \ubb34\uc870\uac74 \uc218\ud589\ub418\ub294 \ubb38\ub4e4
" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "try:\n", + " print 1.0 / 0.0\n", + "except ZeroDivisionError:\n", + " print 'zero division error!!!'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "zero division error!!!\n" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc608\uc678 \ucc98\ub9ac\ub97c \ud558\uba74 \uc608\uc678 \ubc1c\uc0dd\uc2dc \ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def division():\n", + " for n in range(0, 5):\n", + " try:\n", + " print 10.0 / n\n", + " except ZeroDivisionError, msg:\n", + " print msg\n", + "\n", + "division()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "float division by zero\n", + "10.0\n", + "5.0\n", + "3.33333333333\n", + "2.5\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- else: \uad6c\ubb38\uc740 except: \uad6c\ubb38\uc5c6\uc774 \uc0ac\uc6a9 \ubabb\ud55c\ub2e4. " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def division():\n", + " for n in range(0, 5):\n", + " try:\n", + " print 10.0 / n\n", + " else:\n", + " print \"Success\"\n", + "\n", + "division() " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 5)", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m else:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "prompt_number": 49 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc0c1\ud669\uc5d0 \ub530\ub77c\uc11c\ub294 \uc5d0\ub7ec\uc640 \ud568\uaed8 \ub530\ub77c\uc624\ub294 \uc815\ubcf4\ub97c \ud568\uaed8 \ubc1b\uc744 \uc218\ub3c4 \uc788\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "try:\n", + " spam()\n", + "except NameError, msg:\n", + " print 'Error -', msg" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Error - name 'spam' is not defined\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "try:\n", + " spam()\n", + "except NameError as msg:\n", + " print 'Error -', msg" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Error - name 'spam' is not defined\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- try \uc808 \uc548\uc5d0\uc11c \uac04\uc811\uc801\uc73c\ub85c \ud638\ucd9c\ud55c \ud568\uc218\uc758 \ub0b4\ubd80 \uc608\uc678\ub3c4 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def zero_division():\n", + " x = 1 / 0\n", + "\n", + "try:\n", + " zero_division()\n", + "except ZeroDivisionError, msg:\n", + " print 'zero division error!!! -', msg" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "zero division error!!! - integer division or modulo by zero\n" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def zero_division():\n", + " x = 1 / 0\n", + "\n", + "try:\n", + " zero_division()\n", + "except ZeroDivisionError as msg:\n", + " print 'zero division error!!! -', msg" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "zero division error!!! - integer division or modulo by zero\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- except \ub4a4\uc5d0 \uc544\ubb34\ub7f0 \uc608\uc678\ub3c4 \uae30\uc220\ud558\uc9c0 \uc54a\uc73c\uba74 \ubaa8\ub4e0 \uc608\uc678\uc5d0 \ub300\ud574 \ucc98\ub9ac\ub41c\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "try:\n", + " spam()\n", + " print 1.0 / 0.0\n", + "except:\n", + " print 'Error'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Error\n" + ] + } + ], + "prompt_number": 31 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc5ec\ub7ec \uc608\uc678\ub4e4 \uac01\uac01\uc5d0 \ub300\ud574 except \uc808\uc744 \ub2e4\uc911\uc73c\ub85c \uc0bd\uc785\ud560 \uc218 \uc788\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "b = 0.0\n", + "name = 'aaa.txt'\n", + "try:\n", + " print 1.0 / b\n", + " spam()\n", + " f = open(name, 'r')\n", + " '2' + 2\n", + "except NameError:\n", + " print 'NameError !!!'\n", + "except ZeroDivisionError:\n", + " print 'ZeroDivisionError !!!'\n", + "except (TypeError, IOError):\n", + " print 'TypeError or IOError !!!'\n", + "else:\n", + " print 'No Exception !!!'\n", + "finally:\n", + " print 'Exit !!!'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "ZeroDivisionError !!!\n", + "Exit !!!\n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \ud30c\uc77c\uc5d0\uc11c \uc22b\uc790\ub97c \uc77d\uc5b4\uc640\uc11c \uc77d\uc740 \uc22b\uc790\ub85c \ub098\ub204\uae30\ub97c \ud558\ub294 \uc608\uc81c\n", + " - \uaf3c\uaf3c\ud55c \uc608\uc678 \ucc98\ub9ac \uc608\uc81c" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "print os.getcwd()\n", + "filename = 't.txt'\n", + "\n", + "try:\n", + " f = open(filename, 'r')\n", + "except IOError, msg:\n", + " print msg\n", + "else:\n", + " a = float(f.readline())\n", + " try:\n", + " answer = 1.0 / a\n", + " except ZeroDivisionError, msg:\n", + " print msg\n", + " else:\n", + " print answer\n", + " finally:\n", + " print \"Finally!!!\"\n", + " f.close()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "/Users/yhhan/git/python-e-learning\n", + "1.0\n", + "Finally!!!\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 \uac19\uc740 \ubd80\ub958\uc758 \uc608\uc678 \ub2e4 \uc7a1\uc544\ub0b4\uae30\n", + "- \uc608\uc678 \ud074\ub798\uc2a4\ub4e4\uc740 \uc0c1\uc18d\uc5d0 \uc758\ud55c \uacc4\uce35 \uad00\uacc4\ub97c \uc9c0\ub2c8\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc774\ub97c \uc774\uc6a9\ud558\uba74 \uc5ec\ub7ec \uc608\uc678\ub4e4\uc744 \ud55c\uaebc\ubc88\uc5d0 \uc7a1\uc744 \uc218 \uc788\ub2e4.\n", + "- \uc608\ub97c \ub4e4\uc5b4, ArithmeticError\uc758 \ud558\uc704 \ud074\ub798\uc2a4\ub85c\uc11c FloatingPointError, OverflowError, ZeroDivisionError\uac00 \uc874\uc7ac\ud558\uae30 \ub54c\ubb38\uc5d0 \uc774\ub4e4 \ud558\uc704 \ud074\ub798\uc2a4 \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc600\uc744 \uacbd\uc6b0 ArithmeticError\ub85c\uc11c \uc7a1\uc544\ub0bc \uc218 \uc788\ub2e4. " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def dosomething():\n", + " a = 1/0\n", + "\n", + "try:\n", + " dosomething()\n", + "except ArithmeticError:\n", + " print \"ArithmeticException occured\"" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "ArithmeticException occured\n" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc608\uc678\uac00 \uc784\uc758\uc758 except\uc5d0 \uc758\ud574 \uc7a1\ud788\uba74 \ub2e4\ub978 except\uc5d0 \uc758\ud574\uc11c\ub294 \uc7a1\ud788\uc9c0 \uc54a\ub294\ub2e4. " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def dosomething():\n", + " a = 1/0\n", + "\n", + "try:\n", + " dosomething()\n", + "except ZeroDivisionError: # ZeroDivisionError\ub294 \uc774\uacf3\uc5d0\uc11c \uc7a1\ud78c\ub2e4.\n", + " print \"ZeroDivisionError occured\"\n", + "except ArithmeticError: # FloatingPointError, OverflowError\ub294 \uc774\uacf3\uc5d0\uc11c \uc7a1\ud78c\ub2e4.\n", + " print \"ArithmeticException occured\"" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "ZeroDivisionError occured\n" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def dosomething():\n", + " a = 1/0\n", + "\n", + "try:\n", + " dosomething()\n", + "except ArithmeticError:\n", + " print \"ArithmeticException occured\"\n", + "except ZeroDivisionError: # \uc774\uacf3\uc5d0\uc11c ZeroDivisionError\ub294 \uc7a1\ud788\uc9c0 \uc54a\ub294\ub2e4. ==> \uc798\ubabb\ub41c \ucf54\ub4dc\n", + " print \"ZeroDivisionError occured\" " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "ArithmeticException occured\n" + ] + } + ], + "prompt_number": 20 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 \uc608\uc678 \ubc1c\uc0dd\n", + "***\n", + "### 3-1 raise\ub85c \uc608\uc678 \ubc1c\uc0dd\ud558\uae30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc608\uc678\ub97c \ud2b9\uc815 \uc0c1\ud669 \uc870\uac74\uc5d0\uc11c raise \ud0a4\uc6cc\ub4dc\ub97c \ud1b5\ud574 \ubc1c\uc0dd\uc2dc\ud0ac \uc218 \uc788\ub2e4.\n", + "- \uc544\ub798 \uc608\ub294 \uc2dc\ud000\uc2a4 \ud615 \ud074\ub798\uc2a4\ub97c \uc124\uacc4\ud560 \ub54c \uc778\ub371\uc2f1\uc744 \uad6c\ud604\ud558\ub294 \\_\\_getitem\\_\\_ \uba54\uc18c\ub4dc\uc5d0\uc11c \uc778\ub371\uc2a4\uac00 \ubc94\uc704\ub97c \ub118\uc744 \ub54c IndexError\ub97c \ubc1c\uc0dd\uc2dc\ud0a8\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class SquareSeq:\n", + " def __init__(self, n):\n", + " self.n = n\n", + " def __getitem__(self, k):\n", + " if k >= self.n or k < 0 :\n", + " raise IndexError # \ucca8\uc790 \ubc94\uc704\ub97c \ubc97\uc5b4\ub098\uba74 IndexError \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0b4\n", + " return k * k\n", + " def __len__(self):\n", + " return self.n\n", + " \n", + "s = SquareSeq(10)\n", + "print s[2], s[4]\n", + "for x in s: # IndexError\uac00 \ubc1c\uc0dd\ud558\ub294 \uc2dc\uc810\uae4c\uc9c0 \ubc18\ubcf5\ud55c\ub2e4\n", + " print x,\n", + "print s[20] # \ucca8\uc790 \ubc94\uc704\uac00 \ub118\uc5c8\ub2e4" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "4 16\n", + "0 1 4 9 16 25 36 49 64 81" + ] + }, + { + "ename": "IndexError", + "evalue": "", + "output_type": "pyerr", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# IndexError\uac00 \ubc1c\uc0dd\ud558\ub294 \uc2dc\uc810\uae4c\uc9c0 \ubc18\ubcf5\ud55c\ub2e4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# \ucca8\uc790 \ubc94\uc704\uac00 \ub118\uc5c8\ub2e4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m \u001b[0;31m# \ucca8\uc790 \ubc94\uc704\ub97c \ubc97\uc5b4\ub098\uba74 IndexError \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0b4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mIndexError\u001b[0m: " + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 \uc0ac\uc6a9\uc790 \ud074\ub798\uc2a4 \uc608\uc678 \uc815\uc758 \ubc0f \ubc1c\uc0dd\uc2dc\ud0a4\uae30\n", + "- \uc0ac\uc6a9\uc790 \uc815\uc758 \uc608\uc678 \ud074\ub798\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \uc77c\ubc18\uc801\uc778 \ubc29\ubc95\uc740 Exception \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d \ubc1b\uc544 \uad6c\ud604\ud55c\ub2e4.\n", + " - Exception \ud074\ub798\uc2a4\uc758 \uc11c\ube0c \ud074\ub798\uc2a4 \uc911 \ud558\ub098\ub97c \uc0c1\uc18d \ubc1b\uc544\ub3c4 \ub41c\ub2e4.\n", + "- \uc0ac\uc6a9\uc790 \uc815\uc758 \uc608\uc678 \ubc1c\uc0dd \ubc29\ubc95\n", + " - \ub0b4\uc7a5 \uc608\uc678 \ubc1c\uc0dd \ubc29\ubc95\uacfc \ub3d9\uc77c\ud558\uac8c raise [\ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4] \uc640 \uac19\uc774 \ud574\ub2f9 \uc608\uc678 \ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4\ub97c \ub358\uc9c4\ub2e4.\n", + "- \uc0ac\uc6a9\uc790 \uc815\uc758 \uc608\uc678\ub97c \uc7a1\ub294 \ubc29\ubc95\n", + " - except [\ud074\ub798\uc2a4 \uc774\ub984] \uacfc \uac19\uc774 \ud574\ub2f9 \uc608\uc678 \ud074\ub798\uc2a4 \uc774\ub984\uc744 \uc0ac\uc6a9\ud55c\ub2e4.\n", + "- \uc544\ub798 \uc608\uc5d0\uc11c except Big\uc774 \uc7a1\ub294 \uc608\uc678\ub294 Big\uacfc Small \uc774\ub2e4.\n", + " - \uc774\uc720: Small\uc740 Big\uc758 \ud558\uc704 \ud074\ub798\uc2a4\uc774\uae30 \ub54c\ubb38" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class Big(Exception):\n", + " pass\n", + "\n", + "class Small(Big):\n", + " pass\n", + "\n", + "def dosomething1():\n", + " x = Big()\n", + " raise x\n", + " \n", + "def dosomething2():\n", + " raise Small()\n", + " \n", + "for f in (dosomething1, dosomething2):\n", + " try:\n", + " f()\n", + " except Big:\n", + " print \"Exception occurs!\"" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Exception occurs!\n", + "Exception occurs!\n" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-3 \uc608\uc678\uac12 \uc804\ub2ec\ud558\uae30 \n", + "- raise \ud0a4\uc6cc\ub4dc \ub4a4\uc5d0 \uc608\uc678\uc640 \ud568\uaed8, \ucd94\uac00 \uba54\uc2dc\uc9c0\ub97c \ud568\uaed8 \ub358\uc9c8 \uc218 \uc788\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def f():\n", + " raise Exception, 'message!!!'\n", + " \n", + "try:\n", + " f()\n", + "except Exception, a:\n", + " print a" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "message!!!\n" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- \uc0dd\uc131\uc790 \uc548\uc5d0 \ub123\uc5b4\uc900 \uc5d0\ub7ec \uba54\uc2dc\uc9c0\ub294 except \ud0a4\uc6cc\ub4dc \uc0ac\uc6a9\uc2dc\uc5d0 \ub450 \ubc88\uc9f8 \uc778\uc790\ub85c \ud574\ub2f9 \uba54\uc2dc\uc9c0\ub97c \ubc1b\uc744 \uc218 \uc788\ub2e4." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a = 10\n", + "b = 0\n", + "try:\n", + " if b == 0:\n", + " raise ArithmeticError('0\uc73c\ub85c \ub098\ub204\uace0 \uc788\uc2b5\ub2c8\ub2e4.')\n", + " a / b\n", + "except ArithmeticError, v:\n", + " print v" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0\uc73c\ub85c \ub098\ub204\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n" + ] + } + ], + "prompt_number": 28 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file From a7331873881b9efcd5ede9c96d9fb126f000c0ca Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 14 Aug 2017 12:27:35 +0900 Subject: [PATCH 025/124] ... --- python3.6/python01.ipynb | 1089 +++++++++++++++++++------------------- 1 file changed, 549 insertions(+), 540 deletions(-) diff --git a/python3.6/python01.ipynb b/python3.6/python01.ipynb index 5c9c77f..bf8a0dc 100644 --- a/python3.6/python01.ipynb +++ b/python3.6/python01.ipynb @@ -1,554 +1,563 @@ { - "metadata": { - "name": "", - "signature": "sha256:4d452e8a9501dfb7f3440f3f4366393799f168ed4672fcf6d2d42fa765b2406d" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 1\ud68c. Python \uc2dc\uc791\ud558\uae30\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1. \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\uc758 \uc774\ud574\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \uc2a4\ud06c\ub9bd\ud2b8(Script) \uc5b8\uc5b4\ub780 \ubb34\uc5c7\uc778\uac00?\n", - "- \uc2a4\ud06c\ub9bd\ud2b8(scripts)\uc758 \uc0ac\uc804\uc801 \uc758\ubbf8 - \uc5f0\uadf9\uc758 \ub300\uc0ac\ub4f1\uc774 \uc801\ud600 \uc788\ub294 \uc2a4\ud06c\ub9bd\ud2b8\uc5d0\uc11c \uc720\ub798\n", - "- Script Language\uc758 wikipedia \uc815\uc758 (http://en.wikipedia.org/wiki/Scripting_language)\n", - " - a programming language that supports scripts, programs written for a special run-time environment that can interpret (rather than compile) and automate the execution of tasks that could alternatively be executed one-by-one by a human operator" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \ucef4\ud30c\uc77c \uc5b8\uc5b4\uc640 \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\uc640\uc758 \ube44\uad50 \n", - "- \ucef4\ud30c\uc77c(Compile) \ubc29\uc2dd\uc758 \uc5b8\uc5b4\uc5d0 \uc758\ud574 \uc791\uc131\ub418\ub294 \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uc740 \ucef4\ud30c\uc77c\ub7ec\uc5d0 \uc758\ud574 \uae30\uacc4\uc5b4\ub85c \ubc88\uc5ed\ub41c \ucc44\ub85c \uc2e4\ud589\ub418\uae30 \ub54c\ubb38\uc5d0, \uc218\uc815\uc774 \ube48\ubc88\ud558\uac8c \ubc1c\uc0dd\ud560 \uacbd\uc6b0\uc5d0\ub294 \uc218\uc815 \ud6c4 \ub2e4\uc2dc \ucef4\ud30c\uc77c\uc744 \ud574\uc57c\ud568.\n", - " - \ub369\uce58\uac00 \ud070 \ud504\ub85c\uadf8\ub7a8\uc740 \ucef4\ud30c\uc77c \uc2dc\uac04\uc774 \uaf64 \uae38\ub2e4. \uc989, \uac04\ub2e8\ud55c \uc218\uc815\uc5d0\ub3c4 \uc624\ub79c\uae30\uac04\uc758 \ucef4\ud30c\uc77c \uc2dc\uac04\uc774 \uc694\uad6c\ub41c\ub2e4. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![](./images/compiler_interpreter2.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubc18\uba74\uc5d0 \uc218\uc815\uc774 \ube48\ubc88\ud558\uac8c \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 \uc18c\uc2a4 \ucf54\ub4dc\ub97c \ud55c\uc904 \ud55c\uc904 \uc77d\uc5b4 \ubc14\ub85c\ubc14\ub85c \uc2e4\ud589\ud558\ub294 \uc778\ud130\ud504\ub9ac\ud130 \ubc29\uc2dd\uc774 \uc0c1\ub2f9\ud788 \uc720\ub9ac\ud558\ub2e4. \n", - "- \uc2a4\ud06c\ub9bd\ud2b8 \uc18c\uc2a4\ucf54\ub4dc\ub97c \ucef4\ud30c\uc77c \ubc29\uc2dd\uc5d0 \uc758\ud574 \uc911\uac04 \ucf54\ub4dc(Bytecode)\ub85c \uc6b0\uc120 \ub9cc\ub4e4\uace0, \uc774\ub97c \ub2e4\uc2dc \uc778\ud130\ud504\ub9ac\ud130 \ubc29\uc2dd\uc73c\ub85c \ud574\uc11d\ud558\uc5ec \uc218\ud589\ud558\ub294 \ubc29\ubc95\ub3c4 \uc885\uc885 \ud65c\uc6a9\ub41c\ub2e4." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![](./images/bytecode.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\uc758 \uc7a5\uc810\n", - " - \uac1c\ubc1c \uc2dc\uac04\uc774 \ub2e8\ucd95\ub41c\ub2e4.\n", - " - \uc18c\uc2a4 \ucf54\ub4dc \uc218\uc815\uc774 \ube60\ub974\uace0 \uac04\ub2e8\ud558\uac8c \uc774\ub8e8\uc5b4\uc9c4\ub2e4.\n", - "- \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\uc758 \ub2e8\uc810\n", - " - \uc911\uac04 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uac83\uc740 \uac04\ub2e8\ud558\uc9c0\ub9cc \uadf8\uac83\uc744 \uc2e4\uc81c\ub85c \uc2e4\ud589\uc2dc\ud0a4\ub294 \uac83\uc740 \ub9ce\uc740 \uc791\uc5c5\uc744 \ud544\uc694\ub85c \ud55c\ub2e4.\n", - " - \uc2e4\ud589 \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub9b0\ub2e4." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ub300\ud45c\uc801\uc778 \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4 \n", - "- JavaScript\n", - "- ActionScript\n", - "- Perl\n", - "- PHP\n", - "- Python\n", - "- Lua\n", - "- Ruby" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ud30c\uc774\uc36c \uc5b8\uc5b4\uc758 \uc720\ub798 \ubc0f \ud30c\uc774\uc36c \uc5b8\uc5b4\uc758 \ud2b9\uc9d5\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ud30c\uc774\uc36c(Python)\uc758 \uc0ac\uc804\uc801 \uc758\ubbf8" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- Python\uc758 \uc0ac\uc804\uc801 \uc758\ubbf8\ub294 \ub3c5\uc774 \uc5c6\ub294 \ubc40\uc73c\ub85c \uba39\uc774\ub97c \ubab8\uc73c\ub85c \uac10\uc544\uc11c \uc555\uc0ac\uc2dc\ud0a4\ub294 \ud070\ubc40, \ub610\ub294 \uadf8\ub9ac\uc2a4 \uc2e0\ud654\uc5d0 \ub098\uc624\ub294 \uc545\ub9c8" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \uc65c \ud30c\uc774\uc36c\uc774\ub780 \uc774\ub984\uc774 \ubd99\uc5c8\ub098?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\ub85c\uc11c Python \uc774\ub984\uc758 \uc720\ub798\ub294 1970\ub144\ub300\uc5d0 \uc601\uad6d BBC\uc5d0\uc11c \ubc29\uc601\ud55c \"Monty Python's Flying Circus\" \ubc29\uc601 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc720\ub798\ub418\uc5c8\ub2e4. \uc774 \ud504\ub85c\uadf8\ub7a8\uc740 \ub9e4\uc6b0 \uc5b4\uc0c9\ud558\uace0 \uc774\uc0c1\ud55c \ud589\ub3d9\uc744 \ubcf4\uc774\ub294 \uc0ac\ub78c\ub4e4\uc744 \uc1fc\ud615\ud0dc\ub85c \ubc29\uc601\ud558\uc5ec \ub9ce\uc740 \uc778\uae30\ub97c \ub204\ub838\ub2e4. \n", - "- \uc774 \uc5b8\uc5b4\ub97c \ub9cc\ub4e0 Guido van Rossum\uc774 \uc774 \ud504\ub85c\uadf8\ub7a8\uc758 \ub300\ub2e8\ud55c \ud32c\uc774\uc5c8\uae30 \ub54c\ubb38\uc774\uc5c8\ub2e4. \n", - "- 1989\ub144 12\uc6d4 \ud06c\ub9ac\uc2a4\ub9c8\uc2a4 \ud734\uac00\ub97c \ubcf4\ub0b4\uace0 \uc788\ub358 Guido\ub294 \ud734\uac00 \uae30\uac04\ub3d9\uc548 \ubb34\uc5c7\uc778\uac00 \uc7ac\ubbf8\uc788\uac8c \ud560 \uc218 \uc788\ub294 \ubb34\uc5b8\uac00\ub97c \ucc3e\uace0 \uc788\uc5c8\ub2e4. \n", - "- \uc5f0\ud734\ub77c\uc11c \uc5f0\uad6c\uc2e4\uc774 \ub2eb\ud78c \uc0c1\ud669\uc5d0\uc11c \uc9d1\uc5d0\uc11c \ucef4\ud4e8\ud130\ub97c \uac00\uc9c0\uace0 \uc608\uc804\ubd80\ud130 \uc0dd\uac01\ud558\uace0 \uc788\uc5c8\ub358 \uc778\ud130\ud504\ub9ac\ud130(interpreter)\ub97c \ub9cc\ub4e4\uc5b4 \ubcf4\uae30\ub85c \uacb0\uc2ec\ud558\uc600\ub2e4. \n", - "- \uc989, Guido\uac00 \ubb34\ub8cc\ud55c \ud55c\ub54c\ub97c \ubcf4\ub0b4\uae30 \uc704\ud558\uc5ec \ub9cc\ub4e4\uae30 \uc2dc\uc791\ud588\ub358 \uc5b8\uc5b4\uac00 \uc9c0\uae08 \ub9ce\uc740 \uc0ac\ub78c\ub4e4\uc774 \uc0ac\uc6a9\ud558\ub294 Python \uc5b8\uc5b4\uac00 \ub418\uc5c8\ub2e4." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \ud30c\uc774\uc36c\uc758 \ucd9c\ubc1c" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc774\uc36c\uc758 \uae30\ubc18\uc740 80\ub144\ub300 \ucd08\ubc18\uc5d0 Guido\uac00 \ub3d9\ub8cc\ub4e4\uacfc \ud568\uaed8 \uac1c\ubc1c\uc744 \ud558\uc600\ub358 ABC\ub77c\ub294 \uc5b8\uc5b4\uc774\ub2e4. \n", - "- 80\ub144\ub300\uc5d0 ABC\ub77c\ub294 \uc5b8\uc5b4\ub294 \ucd5c\uace0\uc758 \uad50\uc721\uc6a9 \uc5b8\uc5b4\ub85c \uc54c\ub824\uc84c\uc5c8\uace0 \uc804\ubb38 \ud504\ub85c\uadf8\ub798\uba38\uac00 \uc544\ub2cc \uc0ac\ub78c\uc774 \ubc30\uc6b0\uae30 \ud3b8\ud558\uac8c \ub9cc\ub4e4\uc5b4\uc9c4 \uc544\uc8fc \ud6cc\ub96d\ud55c \uc5b8\uc5b4\uc600\ub2e4. \n", - "- \uadf8\ub7fc\uc5d0\ub3c4 \ubd88\uad6c\ud558\uace0 \uc804\ubb38 \ud504\ub85c\uadf8\ub798\uba38\ub4e4\uc5d0\uac8c\ub294 \uac70\uc758 \ubc1b\uc544 \ub4e4\uc5ec\uc9c0\uc9c0\ub3c4 \uc54a\uc558\uace0 \uc798 \uc0ac\uc6a9\ub418\uc9c0\ub3c4 \uc54a\uc558\ub2e4.\n", - "- \uc774\ub294 \ud504\ub85c\uadf8\ub798\ubc0d\uc774 \ub300\uc911\ud654\uac00 \ub9ce\uc774 \ub418\uc9c0 \uc54a\uc740 \uc0c1\ud669\uc5d0\uc11c \uc804\ubb38 \ud504\ub85c\uadf8\ub798\uba38\ub4e4\uc5d0\uac8c \uc678\uba74\ubc1b\uc558\uc744 \ub54c\uc5d0 \ub098\uc62c \uc218 \uc788\ub294 \uacb0\uacfc\ub77c\uace0 \ubcfc \uc218 \uc788\ub2e4. \n", - "- Guido\ub294 \ud30c\uc774\uc36c\uc73c\ub85c \uc2e4\uc81c \ubb38\uc81c\ub97c \ub354\uc6b1\ub354 \uc27d\uac8c \ud574\uacb0\ud560 \uc218 \uc788\ub3c4\ub85d \uc124\uacc4\ud558\uc600\uc73c\uba70 C\uc5b8\uc5b4\ub098 \uc720\ub2c9\uc2a4 \uc258\uc744 \ub300\uc2e0\ud574\uc11c \uc880 \ub354 \ud3b8\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc5b8\uc5b4\ub97c \uac1c\ubc1c\ud558\ub294 \ub370 \ucd08\uc810\uc744 \ub9de\ucd94\uc5c8\ub2e4. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-4 \uc65c \ud30c\uc774\uc36c\uc744 \ubc30\uc6cc\uc57c \ud558\ub294\uac00?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uac00\uc7a5 \uc911\uc694\ud55c \ub300\ub2f5: \"\uc0dd\uc0b0\uc131\uc774 \ub192\uae30 \ub54c\ubb38\"\n", - "- \uba3c\uc800 \uac1c\ubc1c\ud558\ub77c! \uadf8\ub9ac\uace0 \ub098\uc11c \uc131\ub2a5\uc744 \uac1c\uc120\ud558\ub77c." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-5 \ud30c\uc774\uc36c\uc740 \uc5b4\ub5a4 \uc5b8\uc5b4\uc778\uac00?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub300\ud654 \uae30\ub2a5\uc758 \uc778\ud130\ud504\ub9ac\ud130 \uc5b8\uc5b4\n", - "- \ub3d9\uc801\uc778 \ub370\uc774\ud130 \ud0c0\uc785 \uacb0\uc815 \uc9c0\uc6d0" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a,b):\n", - " return a+b\n", - "\n", - "print add(1,2)\n", - "print add('abc', 'def')\n", - "print add([1, 2, 3], [4, 5, 6])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3\n", - "abcdef\n", - "[1, 2, 3, 4, 5, 6]\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud50c\ub7ab\ud3fc \ub3c5\ub9bd\uc801 \uc5b8\uc5b4\n", - "- \uac1c\ubc1c \uae30\uac04 \ub2e8\ucd95\uc5d0 \ucd1b\uc810\uc744 \ub454 \uc5b8\uc5b4\n", - "- \uac04\ub2e8\ud558\uace0 \uc26c\uc6b4 \ubb38\ubc95\n", - "- \uace0\uc218\uc900\uc758 \ub0b4\uc7a5 \uac1d\uccb4 \uc790\ub8cc\ud615 \uc81c\uacf5" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a=[12, 'abcde', 4+2j, [3,4,5]]\n", - "a.append('add')\n", - "print a;" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[12, 'abcde', (4+2j), [3, 4, 5], 'add']\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uba54\ubaa8\ub9ac \uc790\ub3d9 \uad00\ub9ac\n", - "- \uc26c\uc6b4 \uc720\uc9c0 \ubcf4\uc218\n", - "- \ub9ce\uc740 \uc218\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc81c\uacf5\n", - "- \uc9e7\uc544\uc9c0\ub294 \ucf54\ub4dc\n", - "- \ub192\uc740 \ud655\uc7a5\uc131" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-6 \ud30c\uc774\uc36c\uc744 \uc5b4\ub514\uc5d0 \uc0ac\uc6a9\ud558\uba74 \uc801\ub2f9\ud55c\uac00?" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 1회. Python 시작하기\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1. 스크립트 언어의 이해\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 스크립트(Script) 언어란 무엇인가?\n", + "- 스크립트(scripts)의 사전적 의미 - 연극의 대사등이 적혀 있는 스크립트에서 유래\n", + "- Script Language의 wikipedia 정의 (http://en.wikipedia.org/wiki/Scripting_language)\n", + " - a programming language that supports scripts, programs written for a special run-time environment that can interpret (rather than compile) and automate the execution of tasks that could alternatively be executed one-by-one by a human operator" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 컴파일 언어와 스크립트 언어와의 비교 \n", + "- 컴파일(Compile) 방식의 언어에 의해 작성되는 응용 프로그램은 컴파일러에 의해 기계어로 번역된 채로 실행되기 때문에, 수정이 빈번하게 발생할 경우에는 수정 후 다시 컴파일을 해야함.\n", + " - 덩치가 큰 프로그램은 컴파일 시간이 꽤 길다. 즉, 간단한 수정에도 오랜기간의 컴파일 시간이 요구된다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](../images/compiler_interpreter2.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 반면에 수정이 빈번하게 발생하는 경우에는 소스 코드를 한줄 한줄 읽어 바로바로 실행하는 인터프리터 방식이 상당히 유리하다. \n", + "- 스크립트 소스코드를 컴파일 방식에 의해 중간 코드(Bytecode)로 우선 만들고, 이를 다시 인터프리터 방식으로 해석하여 수행하는 방법도 종종 활용된다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](../images/bytecode.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 스크립트 언어의 장점\n", + " - 개발 시간이 단축된다.\n", + " - 소스 코드 수정이 빠르고 간단하게 이루어진다.\n", + "- 스크립트 언어의 단점\n", + " - 중간 코드를 만드는 것은 간단하지만 그것을 실제로 실행시키는 것은 많은 작업을 필요로 한다.\n", + " - 실행 시간이 오래 걸린다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 대표적인 스크립트 언어 \n", + "- JavaScript\n", + "- ActionScript\n", + "- Perl\n", + "- PHP\n", + "- Python\n", + "- Lua\n", + "- Ruby" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 파이썬 언어의 유래 및 파이썬 언어의 특징\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 파이썬(Python)의 사전적 의미" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Python의 사전적 의미는 독이 없는 뱀으로 먹이를 몸으로 감아서 압사시키는 큰뱀, 또는 그리스 신화에 나오는 악마" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 왜 파이썬이란 이름이 붙었나?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 프로그래밍 언어로서 Python 이름의 유래는 1970년대에 영국 BBC에서 방영한 \"Monty Python's Flying Circus\" 방영 프로그램에서 유래되었다. 이 프로그램은 매우 어색하고 이상한 행동을 보이는 사람들을 쇼형태로 방영하여 많은 인기를 누렸다. \n", + "- 이 언어를 만든 Guido van Rossum이 이 프로그램의 대단한 팬이었기 때문이었다. \n", + "- 1989년 12월 크리스마스 휴가를 보내고 있던 Guido는 휴가 기간동안 무엇인가 재미있게 할 수 있는 무언가를 찾고 있었다. \n", + "- 연휴라서 연구실이 닫힌 상황에서 집에서 컴퓨터를 가지고 예전부터 생각하고 있었던 인터프리터(interpreter)를 만들어 보기로 결심하였다. \n", + "- 즉, Guido가 무료한 한때를 보내기 위하여 만들기 시작했던 언어가 지금 많은 사람들이 사용하는 Python 언어가 되었다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 파이썬의 출발" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파이썬의 기반은 80년대 초반에 Guido가 동료들과 함께 개발을 하였던 ABC라는 언어이다. \n", + "- 80년대에 ABC라는 언어는 최고의 교육용 언어로 알려졌었고 전문 프로그래머가 아닌 사람이 배우기 편하게 만들어진 아주 훌륭한 언어였다. \n", + "- 그럼에도 불구하고 전문 프로그래머들에게는 거의 받아 들여지지도 않았고 잘 사용되지도 않았다.\n", + "- 이는 프로그래밍이 대중화가 많이 되지 않은 상황에서 전문 프로그래머들에게 외면받았을 때에 나올 수 있는 결과라고 볼 수 있다. \n", + "- Guido는 파이썬으로 실제 문제를 더욱더 쉽게 해결할 수 있도록 설계하였으며 C언어나 유닉스 쉘을 대신해서 좀 더 편하게 사용할 수 있는 언어를 개발하는 데 초점을 맞추었다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 왜 파이썬을 배워야 하는가?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 가장 중요한 대답: \"생산성이 높기 때문\"\n", + "- 먼저 개발하라! 그리고 나서 성능을 개선하라." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-5 파이썬은 어떤 언어인가?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 대화 기능의 인터프리터 언어\n", + "- 동적인 데이터 타입 결정 지원" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "abcdef\n", + "[1, 2, 3, 4, 5, 6]\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc2dc\uc2a4\ud15c \uc720\ud2f8\ub9ac\ud2f0\n", - "- GUI\n", - " - wxpython, tkinter\n", - "- \uac8c\uc784 \ud504\ub85c\uadf8\ub798\ubc0d\n", - " - \ud30c\uc774\uc36c \uac8c\uc784\uc5d4\uc9c4: PyOpenGL PySDL PyGame Kivy PyOgre Panda3D Cocos2D PySoy\n", - "- \uc6f9 \ud504\ub85c\uadf8\ub798\ubc0d\n", - " - django \ud504\ub808\uc784\uc6cc\ud06c\n", - "- \uc218\uce58 \ud504\ub85c\uadf8\ub798\ubc0d\n", - " - nextworkx \ubaa8\ub4c8\n", - "- \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud504\ub85c\uadf8\ub798\ubc0d\n", - "- \uae30\ud0c0\n", - "- \ucc38\uace0: http://mulgu.kr/73" + } + ], + "source": [ + "def add(a,b):\n", + " return a+b\n", + "\n", + "print add(1,2)\n", + "print add('abc', 'def')\n", + "print add([1, 2, 3], [4, 5, 6])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 플랫폼 독립적 언어\n", + "- 개발 기간 단축에 촛점을 둔 언어\n", + "- 간단하고 쉬운 문법\n", + "- 고수준의 내장 객체 자료형 제공" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[12, 'abcde', (4+2j), [3, 4, 5], 'add']\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-7 \ud30c\uc774\uc36c\uc758 \uc7a5\uc810" + } + ], + "source": [ + "a=[12, 'abcde', 4+2j, [3,4,5]]\n", + "a.append('add')\n", + "print a;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 메모리 자동 관리\n", + "- 쉬운 유지 보수\n", + "- 많은 수의 라이브러리 제공\n", + "- 짧아지는 코드\n", + "- 높은 확장성" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-6 파이썬을 어디에 사용하면 적당한가?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 시스템 유틸리티\n", + "- GUI\n", + " - wxpython, tkinter\n", + "- 게임 프로그래밍\n", + " - 파이썬 게임엔진: PyOpenGL PySDL PyGame Kivy PyOgre Panda3D Cocos2D PySoy\n", + "- 웹 프로그래밍\n", + " - django 프레임워크\n", + "- 수치 프로그래밍\n", + " - nextworkx 모듈\n", + "- 데이터베이스 프로그래밍\n", + "- 기타\n", + "- 참고: http://mulgu.kr/73" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-7 파이썬의 장점" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Guido가 생각했던 Python 문법적 특징은 들여쓰기를 철저하게 지킨도록 언어를 설계했다는 점이다. \n", + "- 이는 코드의 가독성을 현격히 높혀준다.\n", + "- C 언어에서처럼 {} 등의 괄호를 넣지 않기 때문에 프로그램을 좀더 깔끔하게 만들어준다. \n", + "- 파이썬 코드는 재사용하기가 쉽다. \n", + "- 코드의 분석이 쉽기 때문에 다른 사람이 작성한 코드를 받아서 작업하는 사람들이 훨씬 더 작업을 편하게 해준다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 03 파이썬 코딩 환경 구성\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 파이썬 코딩 환경 구축 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3-1-1 Python 전용 통합개발환경(IDE) 사용 \n", + "- Enthought Canopy\n", + " - 별도의 파이썬 설치 없이 아래 통합개발환경을 사용하면 자동으로 파이썬이 설치됨\n", + " - CANOPY EXPRESS (Free) 다운로드 사이트: https://www.enthought.com/products/canopy/ \n", + "- Python 실행\n", + " - Enthought Canopy 직접 활용\n", + " - 커맨드 창 (터미널)\n", + " - ipython 명령어 이용\n", + "\n", + "#### 3-1-2 이클립스 사용\n", + "- 파이썬 설치\n", + " - 파이썬 다운로드 사이트: https://www.python.org/downloads/\n", + " - 본 강좌에서는 파이썬 2.7.x 버전 사용\n", + "- 이클립스에서 파이썬 설치 방법\n", + " - PyDev 플러그인 설치\n", + " - 참고 사이트: http://arisu1000.tistory.com/27707\n", + "\n", + "#### 3-1-3 추천하는 코딩 환경 구성 방법\n", + "- 1) Enthought Canopy 설치\n", + "- 2) 이클립스 설치 (설치가 안되어 있는 경우)\n", + "- 3) PyDev 플러그인 설치" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 대화식 모드로 간단한 파이썬 예제 실행하기" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n", + "Hello World!\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- Guido\uac00 \uc0dd\uac01\ud588\ub358 Python \ubb38\ubc95\uc801 \ud2b9\uc9d5\uc740 \ub4e4\uc5ec\uc4f0\uae30\ub97c \ucca0\uc800\ud558\uac8c \uc9c0\ud0a8\ub3c4\ub85d \uc5b8\uc5b4\ub97c \uc124\uacc4\ud588\ub2e4\ub294 \uc810\uc774\ub2e4. \n", - "- \uc774\ub294 \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ud604\uaca9\ud788 \ub192\ud600\uc900\ub2e4.\n", - "- C \uc5b8\uc5b4\uc5d0\uc11c\ucc98\ub7fc {} \ub4f1\uc758 \uad04\ud638\ub97c \ub123\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \ud504\ub85c\uadf8\ub7a8\uc744 \uc880\ub354 \uae54\ub054\ud558\uac8c \ub9cc\ub4e4\uc5b4\uc900\ub2e4. \n", - "- \ud30c\uc774\uc36c \ucf54\ub4dc\ub294 \uc7ac\uc0ac\uc6a9\ud558\uae30\uac00 \uc27d\ub2e4. \n", - "- \ucf54\ub4dc\uc758 \ubd84\uc11d\uc774 \uc27d\uae30 \ub54c\ubb38\uc5d0 \ub2e4\ub978 \uc0ac\ub78c\uc774 \uc791\uc131\ud55c \ucf54\ub4dc\ub97c \ubc1b\uc544\uc11c \uc791\uc5c5\ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \ud6e8\uc52c \ub354 \uc791\uc5c5\uc744 \ud3b8\ud558\uac8c \ud574\uc900\ub2e4. " + } + ], + "source": [ + "print 4+5\n", + "print \"Hello World!\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-3 산술 연산하기" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n", + "-20\n", + "54\n", + "34\n", + "1\n", + "1.8\n", + "1.8\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 03 \ud30c\uc774\uc36c \ucf54\ub529 \ud658\uacbd \uad6c\uc131\n", - "***" + } + ], + "source": [ + "# -*- coding: utf-8 -*-\n", + "print 4 + 5\n", + "print 12 - 32\n", + "print (4 + 5) * 6\n", + "print 4 + 5 * 6\n", + "print 9 / 5 # 정수/정수 연산 결과는 정수\n", + "print 9.0 / 5.0\n", + "print 9 / 5.0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###3-4 간단한 문자열 연산하기" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello\n", + "Hi there!\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-1 \ud30c\uc774\uc36c \ucf54\ub529 \ud658\uacbd \uad6c\ucd95 " + } + ], + "source": [ + "print 'Hello'\n", + "print \"Hi there!\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "My name is Amenda\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 3-1-1 Python \uc804\uc6a9 \ud1b5\ud569\uac1c\ubc1c\ud658\uacbd(IDE) \uc0ac\uc6a9 \n", - "- Enthought Canopy\n", - " - \ubcc4\ub3c4\uc758 \ud30c\uc774\uc36c \uc124\uce58 \uc5c6\uc774 \uc544\ub798 \ud1b5\ud569\uac1c\ubc1c\ud658\uacbd\uc744 \uc0ac\uc6a9\ud558\uba74 \uc790\ub3d9\uc73c\ub85c \ud30c\uc774\uc36c\uc774 \uc124\uce58\ub428\n", - " - CANOPY EXPRESS (Free) \ub2e4\uc6b4\ub85c\ub4dc \uc0ac\uc774\ud2b8: https://www.enthought.com/products/canopy/ \n", - "- Python \uc2e4\ud589\n", - " - Enthought Canopy \uc9c1\uc811 \ud65c\uc6a9\n", - " - \ucee4\ub9e8\ub4dc \ucc3d (\ud130\ubbf8\ub110)\n", - " - ipython \uba85\ub839\uc5b4 \uc774\uc6a9\n", - "\n", - "#### 3-1-2 \uc774\ud074\ub9bd\uc2a4 \uc0ac\uc6a9\n", - "- \ud30c\uc774\uc36c \uc124\uce58\n", - " - \ud30c\uc774\uc36c \ub2e4\uc6b4\ub85c\ub4dc \uc0ac\uc774\ud2b8: https://www.python.org/downloads/\n", - " - \ubcf8 \uac15\uc88c\uc5d0\uc11c\ub294 \ud30c\uc774\uc36c 2.7.x \ubc84\uc804 \uc0ac\uc6a9\n", - "- \uc774\ud074\ub9bd\uc2a4\uc5d0\uc11c \ud30c\uc774\uc36c \uc124\uce58 \ubc29\ubc95\n", - " - PyDev \ud50c\ub7ec\uadf8\uc778 \uc124\uce58\n", - " - \ucc38\uace0 \uc0ac\uc774\ud2b8: http://arisu1000.tistory.com/27707\n", + } + ], + "source": [ + "a = 'My name is '\n", + "b = 'Amenda'\n", + "print a + b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-5 파이썬 버전 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.7.6 | 64-bit | (default, Jun 4 2014, 16:42:26) \n", + "[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]\n", "\n", - "#### 3-1-3 \ucd94\ucc9c\ud558\ub294 \ucf54\ub529 \ud658\uacbd \uad6c\uc131 \ubc29\ubc95\n", - "- 1) Enthought Canopy \uc124\uce58\n", - "- 2) \uc774\ud074\ub9bd\uc2a4 \uc124\uce58 (\uc124\uce58\uac00 \uc548\ub418\uc5b4 \uc788\ub294 \uacbd\uc6b0)\n", - "- 3) PyDev \ud50c\ub7ec\uadf8\uc778 \uc124\uce58" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-2 \ub300\ud654\uc2dd \ubaa8\ub4dc\ub85c \uac04\ub2e8\ud55c \ud30c\uc774\uc36c \uc608\uc81c \uc2e4\ud589\ud558\uae30" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 4+5\n", - "print \"Hello World!\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9\n", - "Hello World!\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "heading", - "level": 3, - "metadata": {}, - "source": [ - "3-3 \uc0b0\uc220 \uc5f0\uc0b0\ud558\uae30" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# -*- coding: utf-8 -*-\n", - "print 4 + 5\n", - "print 12 - 32\n", - "print (4 + 5) * 6\n", - "print 4 + 5 * 6\n", - "print 9 / 5 # \uc815\uc218/\uc815\uc218 \uc5f0\uc0b0 \uacb0\uacfc\ub294 \uc815\uc218\n", - "print 9.0 / 5.0\n", - "print 9 / 5.0" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9\n", - "-20\n", - "54\n", - "34\n", - "1\n", - "1.8\n", - "1.8\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###3-4 \uac04\ub2e8\ud55c \ubb38\uc790\uc5f4 \uc5f0\uc0b0\ud558\uae30" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 'Hello'\n", - "print \"Hi there!\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Hello\n", - "Hi there!\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 'My name is '\n", - "b = 'Amenda'\n", - "print a + b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "My name is Amenda\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-5 \ud30c\uc774\uc36c \ubc84\uc804 \uc54c\uc544\ubcf4\uae30" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import sys\n", - "print sys.version\n", - "print\n", - "print sys.version_info" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2.7.6 | 64-bit | (default, Jun 4 2014, 16:42:26) \n", - "[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]\n", - "\n", - "sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-6 \ud30c\uc77c\ub85c \uc800\uc7a5\ud558\uc5ec \uc2e4\ud589\ud558\uae30" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub2e4\uc74c \ub0b4\uc6a9\uc758 cal.py \ub9cc\ub4e4\uae30\n", - "```\n", - "# file: cal.py\n", - "import calendar\n", - "calendar.prmonth(2014, 11)\n", - "```\n", - "- \ucee4\ub9e8\ud2b8 \ucc3d (\ud130\ubbf8\ub110 \ucc3d)\uc5d0\uc11c \ud574\ub2f9 \ud3f4\ub354\ub85c \uc774\ub3d9 \ud6c4 \ub2e4\uc74c \uba85\ub839\uc5b4 \uc218\ud589 python.py\n", - " - python cal.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-7 \ub300\ud654\uc2dd \ubaa8\ub4dc\uc5d0\uc11c \ud639\uc740 \ub2e4\ub978 \ubaa8\ub4c8\uc5d0\uc11c \ubaa8\ub4c8 \ud30c\uc77c \uc2e4\ud589\ud558\uae30" + "sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "execfile('/Users/yhhan/Documents/workspace/python/01/cal.py')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " November 2014\n", - "Mo Tu We Th Fr Sa Su\n", - " 1 2\n", - " 3 4 5 6 7 8 9\n", - "10 11 12 13 14 15 16\n", - "17 18 19 20 21 22 23\n", - "24 25 26 27 28 29 30\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "import sys\n", + "print sys.version\n", + "print\n", + "print sys.version_info" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-6 파일로 저장하여 실행하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음 내용의 cal.py 만들기\n", + "```\n", + "# file: cal.py\n", + "import calendar\n", + "calendar.prmonth(2014, 11)\n", + "```\n", + "- 커맨트 창 (터미널 창)에서 해당 폴더로 이동 후 다음 명령어 수행 python.py\n", + " - python cal.py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-7 대화식 모드에서 혹은 다른 모듈에서 모듈 파일 실행하기" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " November 2014\n", + "Mo Tu We Th Fr Sa Su\n", + " 1 2\n", + " 3 4 5 6 7 8 9\n", + "10 11 12 13 14 15 16\n", + "17 18 19 20 21 22 23\n", + "24 25 26 27 28 29 30\n" ] } ], - "metadata": {} + "source": [ + "execfile('/Users/yhhan/Documents/workspace/python/01/cal.py')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.0" } - ] -} \ No newline at end of file + }, + "nbformat": 4, + "nbformat_minor": 0 +} From a983cdfeb38c5a35621a029f938957e85d1bc3b7 Mon Sep 17 00:00:00 2001 From: dohyung Date: Thu, 31 Aug 2017 00:00:51 +0900 Subject: [PATCH 026/124] =?UTF-8?q?python01(python3=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python01.ipynb | 101 +++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 58 deletions(-) diff --git a/python3.6/python01.ipynb b/python3.6/python01.ipynb index bf8a0dc..48d1bb9 100644 --- a/python3.6/python01.ipynb +++ b/python3.6/python01.ipynb @@ -178,10 +178,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -197,9 +195,9 @@ "def add(a,b):\n", " return a+b\n", "\n", - "print add(1,2)\n", - "print add('abc', 'def')\n", - "print add([1, 2, 3], [4, 5, 6])" + "print(add(1,2))\n", + "print(add('abc', 'def'))\n", + "print(add([1, 2, 3], [4, 5, 6]))" ] }, { @@ -214,10 +212,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -230,7 +226,7 @@ "source": [ "a=[12, 'abcde', 4+2j, [3,4,5]]\n", "a.append('add')\n", - "print a;" + "print(a);" ] }, { @@ -339,10 +335,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -354,8 +348,8 @@ } ], "source": [ - "print 4+5\n", - "print \"Hello World!\"" + "print(4+5)\n", + "print(\"Hello World!\")" ] }, { @@ -367,10 +361,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -380,7 +372,7 @@ "-20\n", "54\n", "34\n", - "1\n", + "1.8\n", "1.8\n", "1.8\n" ] @@ -388,13 +380,13 @@ ], "source": [ "# -*- coding: utf-8 -*-\n", - "print 4 + 5\n", - "print 12 - 32\n", - "print (4 + 5) * 6\n", - "print 4 + 5 * 6\n", - "print 9 / 5 # 정수/정수 연산 결과는 정수\n", - "print 9.0 / 5.0\n", - "print 9 / 5.0" + "print(4 + 5)\n", + "print(12 - 32)\n", + "print((4 + 5) * 6)\n", + "print(4 + 5 * 6)\n", + "print(9 / 5) # 정수/정수 연산 결과는 정수\n", + "print(9.0 / 5.0)\n", + "print(9 / 5.0)" ] }, { @@ -406,10 +398,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 9, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -421,16 +411,14 @@ } ], "source": [ - "print 'Hello'\n", - "print \"Hi there!\"" + "print('Hello')\n", + "print(\"Hi there!\")" ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -443,7 +431,7 @@ "source": [ "a = 'My name is '\n", "b = 'Amenda'\n", - "print a + b" + "print(a + b)" ] }, { @@ -455,27 +443,25 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2.7.6 | 64-bit | (default, Jun 4 2014, 16:42:26) \n", - "[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]\n", + "3.6.1 |Anaconda custom (x86_64)| (default, May 11 2017, 13:04:09) \n", + "[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]\n", "\n", - "sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)\n" + "sys.version_info(major=3, minor=6, micro=1, releaselevel='final', serial=0)\n" ] } ], "source": [ "import sys\n", - "print sys.version\n", - "print\n", - "print sys.version_info" + "print(sys.version)\n", + "print()\n", + "print(sys.version_info)" ] }, { @@ -508,10 +494,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 17, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -528,7 +512,8 @@ } ], "source": [ - "execfile('/Users/yhhan/Documents/workspace/python/01/cal.py')" + "# execfile('/Users/yhhan/Documents/workspace/python/01/cal.py')\n", + "exec(open(\"./files/cal.py\").read())" ] }, { @@ -555,9 +540,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.1" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } From 70d2f0c2dcc62ffea72e99249f51dee4dddce8a3 Mon Sep 17 00:00:00 2001 From: dohyung Date: Thu, 31 Aug 2017 12:28:49 +0900 Subject: [PATCH 027/124] =?UTF-8?q?python02(python3=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python02.ipynb | 2278 +++++++++++++++++++------------------- 1 file changed, 1133 insertions(+), 1145 deletions(-) diff --git a/python3.6/python02.ipynb b/python3.6/python02.ipynb index 7d3a575..a6c1b87 100644 --- a/python3.6/python02.ipynb +++ b/python3.6/python02.ipynb @@ -1,1193 +1,1181 @@ { - "metadata": { - "name": "", - "signature": "sha256:ab93534d35b1345ad96d879e8a7dc685b8037f9ba9a30fa7da8dd5ab6183eed8" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 2. \ud30c\uc774\uc36c \uc5b8\uc5b4\uc758 \uae30\ubcf8\ubb38\ud615\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud30c\uc774\uc36c \uc608\uc57d\uc5b4 \ubc0f \ub0b4\uc7a5 \ud568\uc218\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \uc608\uc57d\uc5b4 (Reserved Words)\n", - "- \uc608\uc57d\uc5b4 (\ub610\ub294 \ud0a4\uc6cc\ub4dc)\n", - " - \ud30c\uc774\uc36c\uc5d0\uc11c \uc774\ubbf8 \ubb38\ubc95\uc801\uc778 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub418\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \ubcc0\uc218\uba85\ub4f1\uc758 \uc2dd\ubcc4\uc790\ub85c \uc0ac\uc6a9\ud558\uba74 \uc548\ub418\ub294 \ub2e8\uc5b4\ub4e4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \uc608\uc57d\uc5b4\uc758 \uc885\ub958 \uc54c\uc544\ubcf4\uae30" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import keyword\n", + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 2. 파이썬 언어의 기본문형\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 파이썬 예약어 및 내장 함수\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 예약어 (Reserved Words)\n", + "- 예약어 (또는 키워드)\n", + " - 파이썬에서 이미 문법적인 용도로 사용되고 있기 때문에 변수명등의 식별자로 사용하면 안되는 단어들" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 예약어의 종류 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']\n", "\n", - "print keyword.kwlist\n", - "print\n", - "print len(keyword.kwlist)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']\n", - "\n", - "31\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ub0b4\uc7a5 \ud568\uc218 (Built-in Function)\n", - "- \ubcc4\ub3c4\uc758 \ubaa8\ub4c8(Module)\uc758 \ucd94\uac00 \uc5c6\uc774 \uae30\ubcf8\uc801\uc73c\ub85c \uc81c\uacf5\ub418\ub294 \ud568\uc218\ub4e4\n", - "- \ucc38\uace0 \uc0ac\uc774\ud2b8\n", - " 1. \ub0b4\uc7a5(Built-in) \ud568\uc218: https://docs.python.org/2/library/functions.html\n", - "- \ub300\ud45c\uc801\uc778 \ub0b4\uc7a5 \ud568\uc218\n", - " - abs, max, min, pow, chr, str, range, type, ..." + "33\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- abs(x)\n", - " - \uc218\uce58\ud615 \uc790\ub8cc x\uc5d0 \ub300\ud574 x\uc758 \uc808\ub300\uac12\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + } + ], + "source": [ + "import keyword\n", + "\n", + "print(keyword.kwlist)\n", + "print()\n", + "print(len(keyword.kwlist))\n", + "\n", + "# python3에 추가됨 : 'False', 'None', 'True', 'nonlocal' \n", + "# python3에서는 제거됨 : 'exec', 'print'\n", + "#\n", + "# Python2 : \n", + "# ['and', 'as', 'assert', 'break', 'class', \n", + "# 'continue', 'def', 'del', 'elif', 'else', \n", + "# 'except', 'exec', 'finally', 'for', 'from', \n", + "# 'global', 'if', 'import', 'in', 'is', 'lambda', \n", + "# 'not', 'or', 'pass', 'print', 'raise', 'return', \n", + "# 'try', 'while', 'with', 'yield']\n", + "#\n", + "# 31" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 내장 함수 (Built-in Function)\n", + "- 별도의 모듈(Module)의 추가 없이 기본적으로 제공되는 함수들\n", + "- 참고 사이트\n", + " 1. 내장(Built-in) 함수: https://docs.python.org/3.6/library/functions.html\n", + "- 대표적인 내장 함수\n", + " - abs, max, min, pow, chr, str, range, type, ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- abs(x)\n", + " - 수치형 자료 x에 대해 x의 절대값을 반환하는 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print abs(3)\n", - "print abs(-3)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3\n", - "3\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- max(s)\n", - " - \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615(\ubb38\uc790\uc5f4, \ub9ac\uc2a4\ud2b8, \ud29c\ud50c)\uc744 \uc785\ub825\ubc1b\uc544 \uadf8 \uc790\ub8cc\uac00 \uc9c0\ub2cc \uc6d0\uc18c \uc911 \ucd5c\ub300\uac12\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + } + ], + "source": [ + "print(abs(3))\n", + "print(abs(-3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- max(s)\n", + " - 시퀀스 자료형(문자열, 리스트, 튜플)을 입력받아 그 자료가 지닌 원소 중 최대값을 반환하는 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "3\n", + "y\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print max(1, 2)\n", - "print max([1, 2, 3])\n", - "print max(\"python\")" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "3\n", - "y\n" - ] - } - ], - "prompt_number": 20 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- min(s)\n", - " - \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615(\ubb38\uc790\uc5f4, \ub9ac\uc2a4\ud2b8, \ud29c\ud50c)\uc744 \uc785\ub825\ubc1b\uc544 \uadf8 \uc790\ub8cc\uac00 \uc9c0\ub2cc \uc6d0\uc18c \uc911 \ucd5c\uc18c\uac12\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + } + ], + "source": [ + "print(max(1, 2))\n", + "print(max([1, 2, 3]))\n", + "print(max(\"python\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- min(s)\n", + " - 시퀀스 자료형(문자열, 리스트, 튜플)을 입력받아 그 자료가 지닌 원소 중 최소값을 반환하는 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "1\n", + "h\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print min(1, 2)\n", - "print min([1, 2, 3])\n", - "print min(\"python\")" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1\n", - "1\n", - "h\n" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- pow(x,y)\n", - " - \uc218\uce58\ud615 \uc790\ub8cc\ud615 x, y\uc5d0 \ub300\ud574 x\uc758 y\uc2b9\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + } + ], + "source": [ + "print(min(1, 2))\n", + "print(min([1, 2, 3]))\n", + "print(min(\"python\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- pow(x,y)\n", + " - 수치형 자료형 x, y에 대해 x의 y승을 반환하는 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "16\n", + "27\n", + "0.5\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print pow(2, 4)\n", - "print pow(3, 3)\n", - "print pow(2, -1)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "16\n", - "27\n", - "0.5\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- chr(i)\n", - " - \uc815\uc218 \ud615\ud0dc\uc758 ASCII\ucf54\ub4dc \uac12\uc744 \uc785\ub825\uc73c\ub85c \ubc1b\uc544 \uadf8\uc5d0 \ud574\ub2f9\ud558\ub294 \ubb38\uc790\ub97c \ubc18\ud658\ud558\ub294 \ud568\uc218\n", - " - \uc778\uc218 i\uc758 \ubc94\uc704: 0\ubd80\ud130 255\uae4c\uc9c0" + } + ], + "source": [ + "print(pow(2, 4))\n", + "print(pow(3, 3))\n", + "print(pow(2, -1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- chr(i)\n", + " - 정수 형태의 ASCII코드 값을 입력으로 받아 그에 해당하는 문자를 반환하는 함수\n", + " - 인수 i의 범위: 0부터 255까지" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a\n", + "A\n", + "0\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print chr(97)\n", - "print chr(65)\n", - "print chr(48)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "a\n", - "A\n", - "0\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- str(object)\n", - " - \uc784\uc758\uc758 \uac1d\uccb4 object\uc5d0 \ub300\ud574 \ud574\ub2f9 \uac1d\uccb4\ub97c \ud45c\ud604\ud558\ub294 \ubb38\uc790\uc5f4\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + } + ], + "source": [ + "print(chr(97))\n", + "print(chr(65))\n", + "print(chr(48))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- str(object)\n", + " - 임의의 객체 object에 대해 해당 객체를 표현하는 문자열을 반환하는 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "[1, 2]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print str(3)\n", - "print str([1, 2])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3\n", - "[1, 2]\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- range([start,]stop[,step])\n", - " - \uc218\uce58\ud615 \uc790\ub8cc\ud615\uc73c\ub85c start, stop, step \ub4f1\uc744 \uc785\ub825\ubc1b\uc544 \ud574\ub2f9 \ubc94\uc704\uc5d0 \ud574\ub2f9\ud558\ub294 \uc815\uc218\ub97c \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\ud558\ub294 \ud568\uc218\n", - " - \uc778\uc218\uac00 \ud558\ub098(stop)\uc778 \uacbd\uc6b0\n", - " - 0\ubd80\ud130 stop-1\uae4c\uc9c0\uc758 \uc815\uc218 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud55c\ub2e4.\n", - " - \uc778\uc218\uac00 \ub450 \uac1c(start, stop)\uc778 \uacbd\uc6b0\n", - " - start\ubd80\ud130 stop-1\uae4c\uc9c0\uc758 \uc815\uc218 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud55c\ub2e4.\n", - " - \uc778\uc218\uac00 \uc138 \uac1c(start, stop, step)\uc778 \uacbd\uc6b0\n", - " - start\ubd80\ud130 stop-1\uae4c\uc9c0\uc758 \uc815\uc218\ub97c \ubc18\ud658\ud558\ub418 \uac01 \uc815\uc218 \uc0ac\uc774\uc758 \uac70\ub9ac\uac00 step\uc778 \uac83\ub4e4\ub9cc \ubc18\ud658\ud55c\ub2e4.\n", - " " + } + ], + "source": [ + "print(str(3))\n", + "print(str([1, 2]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- range([start,]stop[,step])\n", + " - 수치형 자료형으로 start, stop, step 등을 입력받아 해당 범위에 해당하는 정수를 리스트로 반환하는 함수\n", + " - 인수가 하나(stop)인 경우\n", + " - 0부터 stop-1까지의 정수 리스트를 반환한다.\n", + " - 인수가 두 개(start, stop)인 경우\n", + " - start부터 stop-1까지의 정수 리스트를 반환한다.\n", + " - 인수가 세 개(start, stop, step)인 경우\n", + " - start부터 stop-1까지의 정수를 반환하되 각 정수 사이의 거리가 step인 것들만 반환한다.\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "range(0, 10)\n", + "range(3, 10)\n", + "range(3, 10, 2)\n", + "\n", + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "[3, 4, 5, 6, 7, 8, 9]\n", + "[3, 5, 7, 9]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print range(10)\n", - "print range(3, 10)\n", - "print range(3, 10, 2)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", - "[3, 4, 5, 6, 7, 8, 9]\n", - "[3, 5, 7, 9]\n" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- type(object)\n", - " - \uc784\uc758\uc758 \uac1d\uccb4 object\uc758 \uc790\ub8cc\ud615\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218" + } + ], + "source": [ + "print(range(10))\n", + "print(range(3, 10))\n", + "print(range(3, 10, 2))\n", + "# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "# [3, 4, 5, 6, 7, 8, 9]\n", + "# [3, 5, 7, 9]\n", + "print()\n", + "# print(list(range(10)))\n", + "# list(range(3, 10)); print(list)\n", + "# list(range(3, 10, 2)); print(list)\n", + "# print()\n", + "list = []\n", + "for item in range(10):\n", + " list.append(item)\n", + "print(list)\n", + "\n", + "list = []\n", + "for item in range(3, 10):\n", + " list.append(item)\n", + "print(list)\n", + "\n", + "list = []\n", + "for item in range(3, 10, 2):\n", + " list.append(item)\n", + "print(list)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- type(object)\n", + " - 임의의 객체 object의 자료형을 반환하는 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print type(-1)\n", - "print type('abc')\n", - "print type([1, 2, 3])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "\n" - ] - } - ], - "prompt_number": 16 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ud30c\uc774\uc36c \uc2dd\ubcc4\uc790\uc640 \ubcc0\uc218 \uc0ac\uc6a9\n", - "***" + } + ], + "source": [ + "print(type(-1))\n", + "print(type('abc'))\n", + "print(type([1, 2, 3]))\n", + "# \n", + "# \n", + "# \n", + "# type 에서 class로 바뀜" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 파이썬 식별자와 변수 사용\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 식별자 만드는 법" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파이썬 식별자는 변수, 함수, 모듈, 클래스 또는 객체를 식별하는데 사용되는 이름이다.\n", + "- 식별자의 조건\n", + " - 대소문자 구별함\n", + " - 식별자는 문자 A~Z 또는 a~z과 언더바(\\_)로 시작할 수 있다. \n", + " - 식별자 첫 시작을 제외하고 식별자 내에 숫자(0~9)를 사용할 수 있다.\n", + " - 특수문자 @, $, %등은 식별자에 올 수 없다.\n", + " - 예를 들어 다음과 같은 것은 식별자가 될 수 없음\n", + " - 1abc, @file, %x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 변수명 만들 때 조심할 점" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예약어, 내장함수, 모듈 이름을 변수명으로 만드는 일이 없도록 할것" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12345\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \uc2dd\ubcc4\uc790 \ub9cc\ub4dc\ub294 \ubc95" + } + ], + "source": [ + "print(str(12345))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'str' object is not callable", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m12345\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'str' object is not callable" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc774\uc36c \uc2dd\ubcc4\uc790\ub294 \ubcc0\uc218, \ud568\uc218, \ubaa8\ub4c8, \ud074\ub798\uc2a4 \ub610\ub294 \uac1d\uccb4\ub97c \uc2dd\ubcc4\ud558\ub294\ub370 \uc0ac\uc6a9\ub418\ub294 \uc774\ub984\uc774\ub2e4.\n", - "- \uc2dd\ubcc4\uc790\uc758 \uc870\uac74\n", - " - \ub300\uc18c\ubb38\uc790 \uad6c\ubcc4\ud568\n", - " - \uc2dd\ubcc4\uc790\ub294 \ubb38\uc790 A~Z \ub610\ub294 a~z\uacfc \uc5b8\ub354\ubc14(\\_)\ub85c \uc2dc\uc791\ud560 \uc218 \uc788\ub2e4. \n", - " - \uc2dd\ubcc4\uc790 \uccab \uc2dc\uc791\uc744 \uc81c\uc678\ud558\uace0 \uc2dd\ubcc4\uc790 \ub0b4\uc5d0 \uc22b\uc790(0~9)\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\n", - " - \ud2b9\uc218\ubb38\uc790 @, $, %\ub4f1\uc740 \uc2dd\ubcc4\uc790\uc5d0 \uc62c \uc218 \uc5c6\ub2e4.\n", - " - \uc608\ub97c \ub4e4\uc5b4 \ub2e4\uc74c\uacfc \uac19\uc740 \uac83\uc740 \uc2dd\ubcc4\uc790\uac00 \ub420 \uc218 \uc5c6\uc74c\n", - " - 1abc, @file, %x" + } + ], + "source": [ + "str = 'abc'\n", + "\n", + "print(str(12345))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 변수의 생성 및 사용\n", + "- 파이썬에서 변수가 생성되는 시점은 해당 변수에 임의의 값이 할당될 때이다." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ubcc0\uc218\uba85 \ub9cc\ub4e4 \ub54c \uc870\uc2ec\ud560 \uc810" + } + ], + "source": [ + "a = 1\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 변수의 생성 없이 곧바로 사용할 수 없다." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'b' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'b' is not defined" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc57d\uc5b4, \ub0b4\uc7a5\ud568\uc218, \ubaa8\ub4c8 \uc774\ub984\uc744 \ubcc0\uc218\uba85\uc73c\ub85c \ub9cc\ub4dc\ub294 \uc77c\uc774 \uc5c6\ub3c4\ub85d \ud560\uac83" + } + ], + "source": [ + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 변수의 삭제\n", + "- del 이라는 예약어 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" ] }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "print str(12345)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "12345\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "str = 'abc'\n", - "\n", - "print str(12345)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'str' object is not callable", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m12345\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'str' object is not callable" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \ubcc0\uc218\uc758 \uc0dd\uc131 \ubc0f \uc0ac\uc6a9\n", - "- \ud30c\uc774\uc36c\uc5d0\uc11c \ubcc0\uc218\uac00 \uc0dd\uc131\ub418\ub294 \uc2dc\uc810\uc740 \ud574\ub2f9 \ubcc0\uc218\uc5d0 \uc784\uc758\uc758 \uac12\uc774 \ud560\ub2f9\ub420 \ub54c\uc774\ub2e4." + "ename": "NameError", + "evalue": "name 'b' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'b' is not defined" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 1\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1\n" - ] - } - ], - "prompt_number": 21 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubcc0\uc218\uc758 \uc0dd\uc131 \uc5c6\uc774 \uace7\ubc14\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4." + } + ], + "source": [ + "b = 2\n", + "print(b)\n", + "\n", + "del b\n", + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 파이썬 기초 문형\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 주석문" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "#이것은 주석입니다.\n", + "import sys #이것도 주석입니다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 연속라인" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "connected lines\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'b' is not defined", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'b' is not defined" - ] - } - ], - "prompt_number": 22 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-4 \ubcc0\uc218\uc758 \uc0ad\uc81c\n", - "- del \uc774\ub77c\ub294 \uc608\uc57d\uc5b4 \uc0ac\uc6a9" + } + ], + "source": [ + "a = 1\n", + "b = 3\n", + "if (a == 1) and \\\n", + "(b == 3):\n", + " print('connected lines')" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "connected lines\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "b = 2\n", - "print b\n", - "\n", - "del b\n", - "print b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n" - ] - }, - { - "ename": "NameError", - "evalue": "name 'b' is not defined", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'b' is not defined" - ] - } - ], - "prompt_number": 24 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \ud30c\uc774\uc36c \uae30\ucd08 \ubb38\ud615\n", - "***" + } + ], + "source": [ + "a = 1\n", + "b = 3\n", + "if (a == 1) and (b == 3):\n", + " print('connected lines')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-3 할당문 (Assignment)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "a = 1\n", + "b = a" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "can't assign to operator (, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 1 + 3 = a\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m can't assign to operator\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-1 \uc8fc\uc11d\ubb38" + } + ], + "source": [ + "1 + 3 = a" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "#\uc774\uac83\uc740 \uc8fc\uc11d\uc785\ub2c8\ub2e4.\n", - "import sys #\uc774\uac83\ub3c4 \uc8fc\uc11d\uc785\ub2c8\ub2e4." - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-2 \uc5f0\uc18d\ub77c\uc778" + } + ], + "source": [ + "a = 1\n", + "a = a + 1\n", + "print(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3 4\n", + "0 0 0\n", + "3.5 5.6\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 1\n", - "b = 3\n", - "if (a == 1) and \\\n", - "(b == 3):\n", - " print 'connected lines'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "connected lines\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 1\n", - "b = 3\n", - "if (a == 1) and (b == 3):\n", - " print 'connected lines'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "connected lines\n" - ] - } - ], - "prompt_number": 25 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-3 \ud560\ub2f9\ubb38 (Assignment)" + } + ], + "source": [ + "c, d = 3, 4\n", + "print(c, d)\n", + "\n", + "x = y = z = 0\n", + "print(x, y, z)\n", + "\n", + "e = 3.5; f = 5.6\n", + "print(e, f)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 두 변수의 값을 swap하는 방법" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5.6 3.5\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 1\n", - "b = a" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 14 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "1 + 3 = a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "can't assign to operator (, line 1)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 1 + 3 = a\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m can't assign to operator\n" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 1\n", - "a = a + 1\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n" - ] - } - ], - "prompt_number": 26 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c, d = 3, 4\n", - "print c, d\n", - "\n", - "x = y = z = 0\n", - "print x, y, z\n", - "\n", - "e = 3.5; f = 5.6\n", - "print e, f\n" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3 4\n", - "0 0 0\n", - "3.5 5.6\n" - ] - } - ], - "prompt_number": 27 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub450 \ubcc0\uc218\uc758 \uac12\uc744 swap\ud558\ub294 \ubc29\ubc95" + } + ], + "source": [ + "e = 3.5; f = 5.6\n", + "e, f = f, e\n", + "print(e, f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래에서 b = c + d는 식(Expression)이 아니라 문(Statement)이기 때문에 a에 할당될 수 없다." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m a = (b = c + d)\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "e = 3.5; f = 5.6\n", - "e, f = f, e\n", - "print e, f" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "5.6 3.5\n" - ] - } - ], - "prompt_number": 28 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc544\ub798\uc5d0\uc11c b = c + d\ub294 \uc2dd(Expression)\uc774 \uc544\ub2c8\ub77c \ubb38(Statement)\uc774\uae30 \ub54c\ubb38\uc5d0 a\uc5d0 \ud560\ub2f9\ub420 \uc218 \uc5c6\ub2e4." + } + ], + "source": [ + "a = (b = c + d)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-4 확장 할당문" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = (b = c + d)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 1)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m a = (b = c + d)\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" - ] - } - ], - "prompt_number": 29 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-4 \ud655\uc7a5 \ud560\ub2f9\ubb38" + } + ], + "source": [ + "a = 1\n", + "a += 4\n", + "print(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 1\n", - "a += 4\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "5\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10\n", - "a -= 3\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "7\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10\n", - "a *= 2+3\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "50\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-5 \uac1d\uccb4\uc640 \ud560\ub2f9\n", - "- \uac1d\uccb4\uc758 \ubcc0\uc218\ub294 \ud574\ub2f9 \uac1d\uccb4\uc758 \ub808\ud37c\ub7f0\uc2a4\ub97c \uc9c0\ub2c8\uace0 \uc788\uc74c\n", - "- a = 1\uc774\ub77c\ub294 Statement\uc5d0\uc11c a\ub294 \uc774\ub984, 1\uc740 \uac1d\uccb4\uc774\uba70 a \ubcc0\uc218\ub294 1\uc774\ub77c\ub294 \uac1d\uccb4\ub97c \uac00\ub9ac\ud0a8\ub2e4.\n", - " - \uc989, a \ubcc0\uc218\ub294 1 \uac1d\uccb4\uc758 \ub808\ud37c\ub7f0\uc2a4\ub97c \uc9c0\ub2c8\uace0 \uc788\uc74c" + } + ], + "source": [ + "a = 10\n", + "a -= 3\n", + "print(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "50\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = [1,2,3]\n", - "b = [10, a, 20]\n", - "c = ['x', a, 'y']\n", - "\n", - "print a\n", - "print b\n", - "print c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2, 3]\n", - "[10, [1, 2, 3], 20]\n", - "['a', [1, 2, 3], 'b']\n" - ] - } - ], - "prompt_number": 42 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/assignment.png)" + } + ], + "source": [ + "a = 10\n", + "a *= 2+3\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-5 객체와 할당\n", + "- 객체의 변수는 해당 객체의 레퍼런스를 지니고 있음\n", + "- a = 1이라는 Statement에서 a는 이름, 1은 객체이며 a 변수는 1이라는 객체를 가리킨다.\n", + " - 즉, a 변수는 1 객체의 레퍼런스를 지니고 있음" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3]\n", + "[10, [1, 2, 3], 20]\n", + "['x', [1, 2, 3], 'y']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a[1] = 1000\n", - "\n", - "print a\n", - "print b\n", - "print c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 1000, 3]\n", - "[10, [1, 1000, 3], 20]\n", - "['a', [1, 1000, 3], 'b']\n" - ] - } - ], - "prompt_number": 43 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 4 \ucf58\uc194 \uc785\ucd9c\ub825\n", - "***" + } + ], + "source": [ + "a = [1,2,3]\n", + "b = [10, a, 20]\n", + "c = ['x', a, 'y']\n", + "\n", + "print(a)\n", + "print(b)\n", + "print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/assignment.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 1000, 3]\n", + "[10, [1, 1000, 3], 20]\n", + "['x', [1, 1000, 3], 'y']\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 4-1 \ucf58\uc194 \uc785\ub825" + } + ], + "source": [ + "a[1] = 1000\n", + "\n", + "print(a)\n", + "print(b)\n", + "print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 4 콘솔 입출력\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4-1 콘솔 입력" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 콘솔 (Console)\n", + " - 윈도우즈에서는 Command창, 리눅스/맥에서는 Terminal창\n", + " - 각 IDE (예, 이클립스)에서는 별도의 콘솔 창이 제공됨\n", + "- raw_input(): 문자열 입력 내장함수" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name?홍길동\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ucf58\uc194 (Console)\n", - " - \uc708\ub3c4\uc6b0\uc988\uc5d0\uc11c\ub294 Command\ucc3d, \ub9ac\ub205\uc2a4/\ub9e5\uc5d0\uc11c\ub294 Terminal\ucc3d\n", - " - \uac01 IDE (\uc608, \uc774\ud074\ub9bd\uc2a4)\uc5d0\uc11c\ub294 \ubcc4\ub3c4\uc758 \ucf58\uc194 \ucc3d\uc774 \uc81c\uacf5\ub428\n", - "- raw_input(): \ubb38\uc790\uc5f4 \uc785\ub825 \ub0b4\uc7a5\ud568\uc218" + } + ], + "source": [ + "# raw_input 에서 input 으로 변경\n", + "# name = raw_input('name?')\n", + "name = input('name?')" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "홍길동\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "name = raw_input('name?')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "stream": "stdout", - "text": [ - "name?\ud64d\uae38\ub3d9\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print name" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\ud64d\uae38\ub3d9\n" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- int(): \ubb38\uc790\uc5f4\uc744 \uc815\uc218\ub85c \ubcc0\ud658\ud558\ub294 \ub0b4\uc7a5\ud568\uc218" + } + ], + "source": [ + "print(name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- int(): 문자열을 정수로 변환하는 내장함수" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "int : 12\n", + "12\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "k = int(raw_input('int : '))\n", - "print k" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "stream": "stdout", - "text": [ - "int : 12\n" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "12\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- input(): \uc815\uc218, \uc2e4\uc218, Expression \uc785\ub825 \ub0b4\uc7a5\ud568\uc218" + } + ], + "source": [ + "# k = int(raw_input('int : '))\n", + "k = int(input('int : '))\n", + "print(k)\n", + "print(type(k))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- input(): 정수, 실수, Expression 입력 내장함수" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "int :45\n", + "45\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "i = input('int :')\n", - "print i" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "stream": "stdout", - "text": [ - "int :45\n" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "45\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "k = input('expr:')\n", - "print k" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "stream": "stdout", - "text": [ - "expr:30 + 50\n" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "80\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 4-2 \ucf58\uc194 \ucd9c\ub825" + } + ], + "source": [ + "i = input('int :')\n", + "print(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "expr:30+50\n", + "30+50\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- print: \ud654\uba74\uc5d0 \uc790\ub8cc\ub97c \ucd9c\ub825\ud558\ub294 \ubcf4\ud3b8\uc801\uc778 statement\n", - "- \uc5ec\ub7ec \uc790\ub8cc\ub97c \ud55c\uaebc\ubc88\uc5d0 \ucd9c\ub825\ud560 \ub54c\uc5d0\ub294 \ucf64\ub9c8(,)\ub97c \uc0ac\uc6a9" + } + ], + "source": [ + "k = input('expr:')\n", + "print(k)\n", + "# expr:30 + 50\n", + "# 80" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4-2 콘솔 출력" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- print: 화면에 자료를 출력하는 보편적인 statement\n", + "- 여러 자료를 한꺼번에 출력할 때에는 콤마(,)를 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9 2\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 4 + 5, 4 - 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9 2\n" - ] - } - ], - "prompt_number": 68 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc138\ubbf8\ucf5c\ub860(;)\uc740 \uc21c\ucc28\uc801\uc73c\ub85c \uc785\ub825\ub41c \uac01 statement\ub97c \ubd84\ub9ac\ud568 " + } + ], + "source": [ + "print(4 + 5, 4 - 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 세미콜론(;)은 순차적으로 입력된 각 statement를 분리함 " + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 1; print 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1\n", - "2\n" - ] - } - ], - "prompt_number": 69 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uae30\ubcf8\uc801\uc73c\ub85c print\ub294 \ub9c8\uc9c0\ub9c9\uc5d0 \uc904\ubc14\uafc8\uc744 \ud558\uc9c0\ub9cc \ucf64\ub9c8(,)\uac00 \ub9c8\uc9c0\ub9c9\uc5d0 \uc788\uc73c\uba74 \uc904\ubc14\uafc8\uc744 \ud558\uc9c0 \uc54a\ub294\ub2e4." + } + ], + "source": [ + "print(1); print(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Python2에서는 기본적으로 print는 마지막에 줄바꿈을 하지만 콤마(,)가 마지막에 있으면 줄바꿈을 하지 않았으나, Python3에서는 콤마를 붙이나 안붙이나 상관없다." + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "\n", + "1\n", + "2\n", + "\n", + "1,2\n" ] }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 1,\n", - "print 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 2\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", + "data": { + "text/plain": [ + "(None, None)" + ] + }, + "execution_count": 59, "metadata": {}, - "source": [ - "- +\uc5f0\uc0b0\uc790\ub294 \uc22b\uc790\uc640 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc5f0\uc0b0\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294\ub2e4." + "output_type": "execute_result" + } + ], + "source": [ + "print(1),\n", + "print(2)\n", + "#1 2\n", + "print()\n", + "print(1)\n", + "print(2)\n", + "print()\n", + "print(1, end=\",\"),print(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- +연산자는 숫자와 문자열에 대한 연산을 지원하지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unsupported operand type(s) for +: 'int' and 'str'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m12\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m'spam'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'int' and 'str'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 12 + 'spam'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "unsupported operand type(s) for +: 'int' and 'str'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0;36m12\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m'spam'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'int' and 'str'" - ] - } - ], - "prompt_number": 71 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print '12' + 'spam'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "12spam\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "print(12 + 'spam')" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12spam\n" ] } ], - "metadata": {} + "source": [ + "print('12' + 'spam')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 06310d574a6001216a77f4a99c0e325cdb619b37 Mon Sep 17 00:00:00 2001 From: dohyung Date: Tue, 5 Sep 2017 21:00:59 +0900 Subject: [PATCH 028/124] =?UTF-8?q?python3=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Untitled3.ipynb | 3517 +++++++++++++++++ python03.ipynb | 1372 ++++--- python3.6/python03.ipynb | 1396 ++++--- ...54\212\265\353\254\270\354\240\234.webloc" | 8 + 4 files changed, 4893 insertions(+), 1400 deletions(-) create mode 100644 Untitled3.ipynb create mode 100644 "\353\262\224\354\235\264\354\235\230 \353\215\260\354\235\264\355\204\260 \354\225\204\355\202\244\355\205\215\354\262\230 -- [Python] [\352\260\234\353\205\220\354\235\204 \354\236\241\354\225\204\354\243\274\353\212\224 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215 \354\240\225\354\204\235] 4.8 \354\227\260\354\212\265\353\254\270\354\240\234.webloc" diff --git a/Untitled3.ipynb b/Untitled3.ipynb new file mode 100644 index 0000000..cc1fb4d --- /dev/null +++ b/Untitled3.ipynb @@ -0,0 +1,3517 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive\n" + ] + } + ], + "source": [ + "% cd .." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive\n" + ] + } + ], + "source": [ + "% cd ." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "README.md\r\n", + "\u001b[34mSpeech\u001b[m\u001b[m\r\n", + "The Python Challenge.webloc\r\n", + "Untitled.ipynb\r\n", + "Untitled1.ipynb\r\n", + "Untitled2.ipynb\r\n", + "Untitled3.ipynb\r\n", + "\u001b[34maaa\u001b[m\u001b[m\r\n", + "assignment-1.ipynb\r\n", + "assignment-2.ipynb\r\n", + "assignment-3.ipynb\r\n", + "assignment-4.ipynb\r\n", + "assignment-5.ipynb\r\n", + "\u001b[34mexample\u001b[m\u001b[m\r\n", + "\u001b[34mfiles\u001b[m\u001b[m\r\n", + "\u001b[34mimages\u001b[m\u001b[m\r\n", + "module_test.py\r\n", + "music\r\n", + "mymath.py\r\n", + "mymath.pyc\r\n", + "pickle.txt\r\n", + "pickle2.txt\r\n", + "python01.ipynb\r\n", + "python02.ipynb\r\n", + "python03.ipynb\r\n", + "python04.ipynb\r\n", + "python05.ipynb\r\n", + "python06.ipynb\r\n", + "python07.ipynb\r\n", + "python08.ipynb\r\n", + "python09.ipynb\r\n", + "python10.ipynb\r\n", + "python11.ipynb\r\n", + "python12.ipynb\r\n", + "python13.ipynb\r\n", + "python14.ipynb\r\n", + "python15.ipynb\r\n", + "python16.ipynb\r\n", + "python17.ipynb\r\n", + "python18.ipynb\r\n", + "python19.ipynb\r\n", + "python20.ipynb\r\n", + "python21.ipynb\r\n", + "python22.ipynb\r\n", + "python23.ipynb\r\n", + "\u001b[34mpython3.6\u001b[m\u001b[m\r\n", + "readme.txt\r\n", + "removeme.txt\r\n", + "\u001b[31msample.txt\u001b[m\u001b[m\r\n", + "sample_new.txt\r\n", + "supplement-2016-09.ipynb\r\n", + "supplement.ipynb\r\n", + "t.txt\r\n", + "t1.txt\r\n", + "t2.txt\r\n", + "turtle_example.png\r\n", + "turtle_method-1.png\r\n", + "turtle_method-2.png\r\n", + "turtle_method-3.png\r\n", + "범이의 데이터 아키텍처 -- [Python] [개념을 잡아주는 프로그래밍 정석] 4.8 연습문제.webloc\r\n" + ] + } + ], + "source": [ + "!ls ./script_programming/" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "README.md\r\n", + "\u001b[34mSpeech\u001b[m\u001b[m/\r\n", + "The Python Challenge.webloc\r\n", + "Untitled.ipynb\r\n", + "Untitled1.ipynb\r\n", + "Untitled2.ipynb\r\n", + "Untitled3.ipynb\r\n", + "\u001b[34maaa\u001b[m\u001b[m/\r\n", + "assignment-1.ipynb\r\n", + "assignment-2.ipynb\r\n", + "assignment-3.ipynb\r\n", + "assignment-4.ipynb\r\n", + "assignment-5.ipynb\r\n", + "\u001b[34mexample\u001b[m\u001b[m/\r\n", + "\u001b[34mfiles\u001b[m\u001b[m/\r\n", + "\u001b[34mimages\u001b[m\u001b[m/\r\n", + "module_test.py\r\n", + "music\r\n", + "mymath.py\r\n", + "mymath.pyc\r\n", + "pickle.txt\r\n", + "pickle2.txt\r\n", + "python01.ipynb\r\n", + "python02.ipynb\r\n", + "python03.ipynb\r\n", + "python04.ipynb\r\n", + "python05.ipynb\r\n", + "python06.ipynb\r\n", + "python07.ipynb\r\n", + "python08.ipynb\r\n", + "python09.ipynb\r\n", + "python10.ipynb\r\n", + "python11.ipynb\r\n", + "python12.ipynb\r\n", + "python13.ipynb\r\n", + "python14.ipynb\r\n", + "python15.ipynb\r\n", + "python16.ipynb\r\n", + "python17.ipynb\r\n", + "python18.ipynb\r\n", + "python19.ipynb\r\n", + "python20.ipynb\r\n", + "python21.ipynb\r\n", + "python22.ipynb\r\n", + "python23.ipynb\r\n", + "\u001b[34mpython3.6\u001b[m\u001b[m/\r\n", + "readme.txt\r\n", + "removeme.txt\r\n", + "\u001b[31msample.txt\u001b[m\u001b[m*\r\n", + "sample_new.txt\r\n", + "supplement-2016-09.ipynb\r\n", + "supplement.ipynb\r\n", + "t.txt\r\n", + "t1.txt\r\n", + "t2.txt\r\n", + "turtle_example.png\r\n", + "turtle_method-1.png\r\n", + "turtle_method-2.png\r\n", + "turtle_method-3.png\r\n", + "범이의 데이터 아키텍처 -- [Python] [개념을 잡아주는 프로그래밍 정석] 4.8 연습문제.webloc\r\n" + ] + } + ], + "source": [ + "%ls ./script_programming/" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "list?" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1 + 1" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "12" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "_+ 10" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def square(x):\n", + " return x+x\n", + "def cube(x):\n", + " return x*x*x" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "funcs = {\n", + " 'square' : square,\n", + " 'cube' : cube,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "8\n", + "cube 8\n", + "square 4\n" + ] + } + ], + "source": [ + "x = 2\n", + "print(square(x))\n", + "print(cube(x))\n", + "\n", + "for func in sorted(funcs):\n", + " print(func, funcs[func](x))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['cube', 'square']" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted(funcs)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Errno 2] No such file or directory: 'TEST'\n", + "/Users/do-hyungkwon/GoogleDrive\n" + ] + } + ], + "source": [ + "%cd TEST" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive/jupyter_notebook\n" + ] + } + ], + "source": [ + "%cd /Users/do-hyungkwon/GoogleDrive/jupyter_notebook/" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CNN 랩세미나.ipynb\r\n", + "Data_preprocessing_작업_1.ipynb\r\n", + "Data_preprocessing_작업_2.ipynb\r\n", + "\u001b[34mMNIST_data\u001b[m\u001b[m\r\n", + "MNIST_load_관련.ipynb\r\n", + "MODEL_작업.ipynb\r\n", + "One Hidden Layer with Backpropagation.ipynb\r\n", + "\u001b[34mRP_data\u001b[m\u001b[m\r\n", + "\u001b[34mRP_data_2\u001b[m\u001b[m\r\n", + "\u001b[34mRP_data_3\u001b[m\u001b[m\r\n", + "\u001b[34mRP_data_4\u001b[m\u001b[m\r\n", + "Two Hidden Layers with Backward Propagation.ipynb\r\n", + "Two_hidden_layers_tf_all_in_one (1).ipynb\r\n", + "Two_hidden_layers_tf_all_in_one.ipynb\r\n", + "cvt_img.jpg\r\n", + "data_preprocessing.ipynb\r\n", + "data_preprocessing_only_code.ipynb\r\n", + "\u001b[34mdataset\u001b[m\u001b[m\r\n", + "\u001b[34mdataset 복사본\u001b[m\u001b[m\r\n", + "dataset.zip\r\n", + "\u001b[34mdataset2_gray\u001b[m\u001b[m\r\n", + "\u001b[34mdataset_jpg\u001b[m\u001b[m\r\n", + "\u001b[34mdataset_jpg_gray\u001b[m\u001b[m\r\n", + "\u001b[34mdataset_old\u001b[m\u001b[m\r\n", + "\u001b[34mgithub_reference\u001b[m\u001b[m\r\n", + "image.jpg\r\n", + "image.png\r\n", + "image2.jpg\r\n", + "image2.png\r\n", + "\u001b[34mimage_dataset_origin\u001b[m\u001b[m\r\n", + "image_grayscale.jpg\r\n", + "image_grayscale.png\r\n", + "image_jpg.jpg\r\n", + "image_resolution.ipynb\r\n", + "image_resolution.jpg\r\n", + "image_resolution.png\r\n", + "image_resolution_gray.jpg\r\n", + "\u001b[34mimdata\u001b[m\u001b[m\r\n", + "jpg_image.jpg\r\n", + "mnist.pkl\r\n", + "out.txt\r\n", + "\u001b[34moutput\u001b[m\u001b[m\r\n", + "resized_image.jpg\r\n", + "t10k-images-idx3-ubyte.gz\r\n", + "t10k-images.idx3-ubyte\r\n", + "t10k-images.idx3-ubyte.textClipping\r\n", + "t10k-labels-idx1-ubyte.gz\r\n", + "test-input-image-large.jpg\r\n", + "test_img_dataset.txt\r\n", + "test_label.txt\r\n", + "train-images-idx3-ubyte.gz\r\n", + "train-labels-idx1-ubyte.gz\r\n", + "train_image_1\r\n", + "train_img_dataset (1).txt\r\n", + "train_img_dataset.txt\r\n", + "train_label.txt\r\n", + "transpose 시키기.ipynb\r\n", + "validation_img_dataset.txt\r\n", + "validation_label.txt\r\n", + "\u001b[34m무제 폴더\u001b[m\u001b[m\r\n", + "\u001b[34m압축된 파일\u001b[m\u001b[m\r\n", + "\u001b[34m압축된 파일 2\u001b[m\u001b[m\r\n", + "압축된 파일 2.zip\r\n", + "압축된 파일.zip\r\n" + ] + } + ], + "source": [ + "!ls" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Writing test.txt\n" + ] + } + ], + "source": [ + "%%writefile test.txt\n", + "Hello World!" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello World!\n" + ] + } + ], + "source": [ + "with open('test.txt', 'r') as f:\n", + " print(f.read())" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/bin/sh: ㅣㄴ: command not found\r\n" + ] + } + ], + "source": [ + "!ㅣㄴ" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "!cd ../deeplink\\ 복사본\\(170830\\)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive/jupyter_notebook\r\n" + ] + } + ], + "source": [ + "!pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive/deeplink/5.DoHyung/raspberrypi4\n" + ] + } + ], + "source": [ + "%cd /Users/do-hyungkwon/GoogleDrive/deeplink/5.DoHyung/raspberrypi4" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive/deeplink/5.DoHyung/raspberrypi4\r\n" + ] + } + ], + "source": [ + "!pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[31mdeep_convnet.py\u001b[m\u001b[m \u001b[34mdeeplink\u001b[m\u001b[m \u001b[31mtrain_deepnet.py\u001b[m\u001b[m\r\n", + "\u001b[31mdeep_convnet_large.py\u001b[m\u001b[m \u001b[31mrealtime_deepnet.py\u001b[m\u001b[m\r\n" + ] + } + ], + "source": [ + "!ls" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%run deep_convnet.py" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive/script_programming\n" + ] + } + ], + "source": [ + "%cd /Users/do-hyungkwon/GoogleDrive/script_programming/" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive/script_programming\r\n" + ] + } + ], + "source": [ + "!pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "README.md\r\n", + "\u001b[34mSpeech\u001b[m\u001b[m\r\n", + "The Python Challenge.webloc\r\n", + "Untitled.ipynb\r\n", + "Untitled1.ipynb\r\n", + "Untitled2.ipynb\r\n", + "Untitled3.ipynb\r\n", + "\u001b[34maaa\u001b[m\u001b[m\r\n", + "assignment-1.ipynb\r\n", + "assignment-2.ipynb\r\n", + "assignment-3.ipynb\r\n", + "assignment-4.ipynb\r\n", + "assignment-5.ipynb\r\n", + "\u001b[34mexample\u001b[m\u001b[m\r\n", + "\u001b[34mfiles\u001b[m\u001b[m\r\n", + "\u001b[34mimages\u001b[m\u001b[m\r\n", + "module_test.py\r\n", + "music\r\n", + "mymath.py\r\n", + "mymath.pyc\r\n", + "pickle.txt\r\n", + "pickle2.txt\r\n", + "python01.ipynb\r\n", + "python02.ipynb\r\n", + "python03.ipynb\r\n", + "python04.ipynb\r\n", + "python05.ipynb\r\n", + "python06.ipynb\r\n", + "python07.ipynb\r\n", + "python08.ipynb\r\n", + "python09.ipynb\r\n", + "python10.ipynb\r\n", + "python11.ipynb\r\n", + "python12.ipynb\r\n", + "python13.ipynb\r\n", + "python14.ipynb\r\n", + "python15.ipynb\r\n", + "python16.ipynb\r\n", + "python17.ipynb\r\n", + "python18.ipynb\r\n", + "python19.ipynb\r\n", + "python20.ipynb\r\n", + "python21.ipynb\r\n", + "python22.ipynb\r\n", + "python23.ipynb\r\n", + "\u001b[34mpython3.6\u001b[m\u001b[m\r\n", + "readme.txt\r\n", + "removeme.txt\r\n", + "\u001b[31msample.txt\u001b[m\u001b[m\r\n", + "sample_new.txt\r\n", + "supplement-2016-09.ipynb\r\n", + "supplement.ipynb\r\n", + "t.txt\r\n", + "t1.txt\r\n", + "t2.txt\r\n", + "turtle_example.png\r\n", + "turtle_method-1.png\r\n", + "turtle_method-2.png\r\n", + "turtle_method-3.png\r\n", + "범이의 데이터 아키텍처 -- [Python] [개념을 잡아주는 프로그래밍 정석] 4.8 연습문제.webloc\r\n" + ] + } + ], + "source": [ + "!ls" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive/script_programming/files\n" + ] + } + ], + "source": [ + "%cd files/" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/Users/do-hyungkwon/GoogleDrive/script_programming/files'" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cal.py\r\n" + ] + } + ], + "source": [ + "ls" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " November 2014\n", + "Mo Tu We Th Fr Sa Su\n", + " 1 2\n", + " 3 4 5 6 7 8 9\n", + "10 11 12 13 14 15 16\n", + "17 18 19 20 21 22 23\n", + "24 25 26 27 28 29 30\n" + ] + } + ], + "source": [ + "run cal.py" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from random import random\n", + "list1 = [random() for _ in range(1000)]\n", + "list2 = [random() for _ in range(1000)]" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.8906521355143266,\n", + " 0.9411147714820817,\n", + " 0.7804547949560583,\n", + " 0.5565488890114239,\n", + " 0.1675965834732981,\n", + " 0.9961753695390924,\n", + " 0.7040020712147955,\n", + " 0.38253504778387004,\n", + " 0.45368358290881217,\n", + " 0.25355061337382956,\n", + " 0.2672552956575043,\n", + " 0.6050477289701843,\n", + " 0.8424952461572698,\n", + " 0.1275147906498707,\n", + " 0.22303978598373808,\n", + " 0.1664971540760215,\n", + " 0.06652914529610676,\n", + " 0.6180379127849815,\n", + " 0.3213185909028219,\n", + " 0.10689945381224497,\n", + " 0.5527757923246033,\n", + " 0.8847197619262366,\n", + " 0.7380255999216774,\n", + " 0.40797049410154407,\n", + " 0.7867984802091843,\n", + " 0.09392793581948133,\n", + " 0.5026767895051878,\n", + " 0.6894596355865844,\n", + " 0.47518875491953405,\n", + " 0.2563860798769977,\n", + " 0.09829298802605824,\n", + " 0.2800054957246366,\n", + " 0.5245561917828271,\n", + " 0.4625956844604717,\n", + " 0.9647353223605971,\n", + " 0.25363847206753853,\n", + " 0.27062943398980455,\n", + " 0.4292767631485831,\n", + " 0.6016309951807896,\n", + " 0.2425311475949059,\n", + " 0.2708718452427975,\n", + " 0.8410942742994247,\n", + " 0.7076626731131904,\n", + " 0.4349780553735505,\n", + " 0.6101468678238938,\n", + " 0.9628358660351191,\n", + " 0.50787232639313,\n", + " 0.19929031404822917,\n", + " 0.7776392651746117,\n", + " 0.596315990946178,\n", + " 0.41861357287419976,\n", + " 0.6651679412959837,\n", + " 0.750474763624549,\n", + " 0.9661368657913829,\n", + " 0.5089024406666991,\n", + " 0.7354463748478013,\n", + " 0.09497766464880975,\n", + " 0.09424419367453896,\n", + " 0.12293681423501968,\n", + " 0.42652202528137717,\n", + " 0.1881995522190052,\n", + " 0.2675351797857326,\n", + " 0.22909427302775687,\n", + " 0.06450427542447912,\n", + " 0.7255620675202342,\n", + " 0.9440762510639312,\n", + " 0.20935421173816637,\n", + " 0.6987366468203453,\n", + " 0.17017138130986453,\n", + " 0.98845107146034,\n", + " 0.8272270722358799,\n", + " 0.32363794649361877,\n", + " 0.7052698077142502,\n", + " 0.7535129090580979,\n", + " 0.017389818909191557,\n", + " 0.9545472488264697,\n", + " 0.15593007077152843,\n", + " 0.09876849294472356,\n", + " 0.9760493048344576,\n", + " 0.464679148953284,\n", + " 0.4939750505488254,\n", + " 0.7448501914587642,\n", + " 0.9419530972597471,\n", + " 0.08299087004401484,\n", + " 0.9082253042564365,\n", + " 0.9101201246636987,\n", + " 0.6487826725954161,\n", + " 0.7719910654388294,\n", + " 0.1657343392142715,\n", + " 0.6846319090729774,\n", + " 0.135941626121867,\n", + " 0.9548203928842505,\n", + " 0.24354716174037971,\n", + " 0.7014651713645369,\n", + " 0.377756299672678,\n", + " 0.4039251252025665,\n", + " 0.8805644754793612,\n", + " 0.9848070038230552,\n", + " 0.101364009524058,\n", + " 0.814610689414146,\n", + " 0.2764296774105439,\n", + " 0.7582161311010016,\n", + " 0.8433085374230027,\n", + " 0.9791718729058797,\n", + " 0.28193121542622523,\n", + " 0.4444235117391039,\n", + " 0.7261370802549258,\n", + " 0.47104717339382496,\n", + " 0.30321429759015206,\n", + " 0.15194046643645098,\n", + " 0.151750842099991,\n", + " 0.03328295214749888,\n", + " 0.5470309619084058,\n", + " 0.5704311126067306,\n", + " 0.014696562472400698,\n", + " 0.8626990442880106,\n", + " 0.14704106695397745,\n", + " 0.1502025366515839,\n", + " 0.2346334161996304,\n", + " 0.7180969750156572,\n", + " 0.7113043390575634,\n", + " 0.21323803834200483,\n", + " 0.2420734045982218,\n", + " 0.5325439949178782,\n", + " 0.4401685498282234,\n", + " 0.7574494063824962,\n", + " 0.4891949660620566,\n", + " 0.7813829739525571,\n", + " 0.09302073769691499,\n", + " 0.5008371025932495,\n", + " 0.5802509062451713,\n", + " 0.06499969853948073,\n", + " 0.653011578089733,\n", + " 0.5760757445482727,\n", + " 0.4503446082074335,\n", + " 0.5350597767788111,\n", + " 0.0685894312031502,\n", + " 0.6114678905354857,\n", + " 0.05229565997711183,\n", + " 0.9920424573606702,\n", + " 0.6527249448974296,\n", + " 0.24686836096277764,\n", + " 0.05974522984882902,\n", + " 0.058920299103052964,\n", + " 0.7385559651948027,\n", + " 0.626832702645902,\n", + " 0.08999661397581227,\n", + " 0.1537240027410779,\n", + " 0.49437937456545167,\n", + " 0.6123646190813579,\n", + " 0.67914765023922,\n", + " 0.9721137596715812,\n", + " 0.2811524341943532,\n", + " 0.19595749217983016,\n", + " 0.3731070514293616,\n", + " 0.5645393029678304,\n", + " 0.11421690135794227,\n", + " 0.4523933947313755,\n", + " 0.3644150802082047,\n", + " 0.5869138752629045,\n", + " 0.9979969758573962,\n", + " 0.7257180090213093,\n", + " 0.6222226974395423,\n", + " 0.23493988506782226,\n", + " 0.5859297177865612,\n", + " 0.4685636087087166,\n", + " 0.553991410954111,\n", + " 0.5298048309143187,\n", + " 0.898303326912493,\n", + " 0.5766332413326658,\n", + " 0.5829612989484693,\n", + " 0.7930452282304372,\n", + " 0.0014406609008057458,\n", + " 0.7174950331937783,\n", + " 0.2248256742085708,\n", + " 0.41211601725966573,\n", + " 0.9042503758303949,\n", + " 0.5675410127998509,\n", + " 0.7073289024172765,\n", + " 0.10187498245451698,\n", + " 0.3983328402679971,\n", + " 0.9219942305467737,\n", + " 0.8062580871824581,\n", + " 0.7730404782160887,\n", + " 0.09335502094929438,\n", + " 0.09665616623599338,\n", + " 0.2674026880200606,\n", + " 0.22025540561138868,\n", + " 0.833988996372183,\n", + " 0.7607437183326718,\n", + " 0.16013465439217445,\n", + " 0.9919815084321758,\n", + " 0.5135932560489845,\n", + " 0.45154732223369065,\n", + " 0.03679631885997914,\n", + " 0.4617277816117905,\n", + " 0.2902626233695871,\n", + " 0.7740033896845459,\n", + " 0.6060730687145843,\n", + " 0.47945706732002846,\n", + " 0.8066507902037541,\n", + " 0.7885727615589638,\n", + " 0.7090895814881933,\n", + " 0.08494926140500514,\n", + " 0.9734161306683388,\n", + " 0.8530510645228727,\n", + " 0.11023292095453563,\n", + " 0.906099614589677,\n", + " 0.6851502539436924,\n", + " 0.5302782896844955,\n", + " 0.36960343826870623,\n", + " 0.1712597659688343,\n", + " 0.30801742004149113,\n", + " 0.670214238077765,\n", + " 0.745412124699968,\n", + " 0.6147276857679034,\n", + " 0.36827188515159837,\n", + " 0.6257808886820829,\n", + " 0.5179538382295488,\n", + " 0.2745125605300518,\n", + " 0.2294287968455273,\n", + " 0.6452699442872718,\n", + " 0.942885783476578,\n", + " 0.1336854133749652,\n", + " 0.7318135980673219,\n", + " 0.548303313763799,\n", + " 0.047342343946420895,\n", + " 0.9647007390667192,\n", + " 0.08968109139666058,\n", + " 0.6461792481567697,\n", + " 0.7637170228083586,\n", + " 0.2745802587065431,\n", + " 0.19867868545650957,\n", + " 0.554855405988693,\n", + " 0.7771812843379996,\n", + " 0.8812611346620008,\n", + " 0.4381753037620848,\n", + " 0.8248679493363693,\n", + " 0.9762907045587493,\n", + " 0.631333843715891,\n", + " 0.27728320738580914,\n", + " 0.27629744564800696,\n", + " 0.23997146380537926,\n", + " 0.21157811371327462,\n", + " 0.18947164981373033,\n", + " 0.23825920994904248,\n", + " 0.43282186244843135,\n", + " 0.29235496943275563,\n", + " 0.33073375735230204,\n", + " 0.09847024163465912,\n", + " 0.6731028034763012,\n", + " 0.8240274523226628,\n", + " 0.7648508624546608,\n", + " 0.7263644918010195,\n", + " 0.3662872278599123,\n", + " 0.7396970112693434,\n", + " 0.6179539230584127,\n", + " 0.12192609204209959,\n", + " 0.40030789626300034,\n", + " 0.5484269834234121,\n", + " 0.11978807951014148,\n", + " 0.7303035284841418,\n", + " 0.7732293407589955,\n", + " 0.6201156909731009,\n", + " 0.8856387721204052,\n", + " 0.30627236077339526,\n", + " 0.9965020830278548,\n", + " 0.32492561378848217,\n", + " 0.11475594841845393,\n", + " 0.7680313165865831,\n", + " 0.12617776921642732,\n", + " 0.607336239437735,\n", + " 0.5482648563019241,\n", + " 0.6157060818808558,\n", + " 0.6788141786205582,\n", + " 0.816328129016195,\n", + " 0.369751613413584,\n", + " 0.6384806372201333,\n", + " 0.19103550881117093,\n", + " 0.5579655618034486,\n", + " 0.3022109576867196,\n", + " 0.3570067208505183,\n", + " 0.23188845866578378,\n", + " 0.36216499331899665,\n", + " 0.438439827629603,\n", + " 0.7509973610502606,\n", + " 0.6445800683335232,\n", + " 0.5549423932934785,\n", + " 0.8424219895560678,\n", + " 0.546495053329773,\n", + " 0.17669322896229023,\n", + " 0.23616002435559869,\n", + " 0.03720015630803475,\n", + " 0.31474451397236314,\n", + " 0.39745421229080946,\n", + " 0.28278009602903975,\n", + " 0.24523137891090618,\n", + " 0.7079073840942186,\n", + " 0.2237571565510046,\n", + " 0.07370587288101371,\n", + " 0.6255332275846475,\n", + " 0.7093160557286216,\n", + " 0.9826110971591816,\n", + " 0.187871889015229,\n", + " 0.715078145180598,\n", + " 0.9040501508688799,\n", + " 0.7119890451289799,\n", + " 0.04829529933834342,\n", + " 0.9037625570956181,\n", + " 0.9287995634178282,\n", + " 0.5517783369748923,\n", + " 0.7825007625072714,\n", + " 0.1412658617882041,\n", + " 0.5950643456616183,\n", + " 0.9903742884075254,\n", + " 0.7152248837337644,\n", + " 0.550377835556066,\n", + " 0.3985419809055136,\n", + " 0.6827999988128265,\n", + " 0.09547327220278579,\n", + " 0.16735902585005458,\n", + " 0.17860752214929798,\n", + " 0.6020777014286678,\n", + " 0.766751265370302,\n", + " 0.7390091601844704,\n", + " 0.1490909511538061,\n", + " 0.7898790759634261,\n", + " 0.868828995121904,\n", + " 0.19086039762451013,\n", + " 0.7511228771309847,\n", + " 0.33096416159579234,\n", + " 0.033745210998792796,\n", + " 0.2539615262597672,\n", + " 0.5210736435105959,\n", + " 0.6338303204011876,\n", + " 0.837761227452584,\n", + " 0.8654311259461396,\n", + " 0.2945551502271849,\n", + " 0.49732460008930224,\n", + " 0.649152384597229,\n", + " 0.5873056299654781,\n", + " 0.4352887202474788,\n", + " 0.6020397658468944,\n", + " 0.026848436672716636,\n", + " 0.4860033551891041,\n", + " 0.5155574485797518,\n", + " 0.241314848550217,\n", + " 0.8810994415655596,\n", + " 0.6710515455198917,\n", + " 0.8824955083051832,\n", + " 0.6907379417152949,\n", + " 0.29095871104631477,\n", + " 0.3126618565858359,\n", + " 0.10688912543340456,\n", + " 0.7535018944079602,\n", + " 0.5445590158698508,\n", + " 0.5082531044531775,\n", + " 0.36148733459953153,\n", + " 0.323518420533221,\n", + " 0.6844246952040048,\n", + " 0.3586933893054465,\n", + " 0.9883524970316806,\n", + " 0.8007100551522597,\n", + " 0.4601261254511747,\n", + " 0.21417409842008894,\n", + " 0.2754481571062041,\n", + " 0.5578269550600579,\n", + " 0.012415124154566692,\n", + " 0.557511426059515,\n", + " 0.6860607078233003,\n", + " 0.37780010701767397,\n", + " 0.9217481577860227,\n", + " 0.5198250523268422,\n", + " 0.28313960837503616,\n", + " 0.10386031758302028,\n", + " 0.7516053018580537,\n", + " 0.6139267393107208,\n", + " 0.2933273186822877,\n", + " 0.3924277820567895,\n", + " 0.06056076920197673,\n", + " 0.5136222587527923,\n", + " 0.9117666488736245,\n", + " 0.7729539089639393,\n", + " 0.26778531944812667,\n", + " 0.808577719636022,\n", + " 0.7854120106543958,\n", + " 0.14807001129480857,\n", + " 0.36987050547188094,\n", + " 0.11365568132163917,\n", + " 0.9941346784478152,\n", + " 0.8694181462894334,\n", + " 0.33624671101162074,\n", + " 0.38279091197092585,\n", + " 0.337091135320578,\n", + " 0.599228759380874,\n", + " 0.5168904504845704,\n", + " 0.5514760558669733,\n", + " 0.2123057841298459,\n", + " 0.563924688160489,\n", + " 0.14935238968108144,\n", + " 0.36422415512965445,\n", + " 0.33948943969520784,\n", + " 0.15094294246754736,\n", + " 0.5083344764183755,\n", + " 0.9817004154231833,\n", + " 0.1936829343948352,\n", + " 0.937181222111137,\n", + " 0.20774959421963024,\n", + " 0.15217388839229007,\n", + " 0.8666237495538743,\n", + " 0.3085830141903706,\n", + " 0.6788818833374827,\n", + " 0.3964771160250171,\n", + " 0.7170790918296804,\n", + " 0.8404633724483365,\n", + " 0.7711190951328972,\n", + " 0.06081211785931784,\n", + " 0.6699733869554183,\n", + " 0.1567239731527379,\n", + " 0.19816655373124048,\n", + " 0.39498339974389385,\n", + " 0.5490434322922609,\n", + " 0.758215153214554,\n", + " 0.24639673354225144,\n", + " 0.2513637296476976,\n", + " 0.9072807918487498,\n", + " 0.909864307483793,\n", + " 0.8219713071858732,\n", + " 0.06343305096955842,\n", + " 0.2413750895862966,\n", + " 0.8373697896318855,\n", + " 0.10088725276769905,\n", + " 0.8234652768694825,\n", + " 0.9898451098464872,\n", + " 0.2741774196488348,\n", + " 0.3204575061892846,\n", + " 0.913812299751609,\n", + " 0.01627777524042051,\n", + " 0.019214197110193232,\n", + " 0.8918554785161156,\n", + " 0.5605429389711616,\n", + " 0.3510981396649355,\n", + " 0.30647677106073035,\n", + " 0.24165196784933696,\n", + " 0.7528358182682695,\n", + " 0.6430440975237283,\n", + " 0.996554082404646,\n", + " 0.31199887832706086,\n", + " 0.5226073350365015,\n", + " 0.013117183869266857,\n", + " 0.929073724567767,\n", + " 0.9056644184831865,\n", + " 0.27666798168008355,\n", + " 0.013424340183557426,\n", + " 0.40268143731200456,\n", + " 0.6636386755018382,\n", + " 0.7082887812174197,\n", + " 0.38388198171527366,\n", + " 0.6097272859781498,\n", + " 0.7528756593444385,\n", + " 0.8798375027273956,\n", + " 0.6068872218156756,\n", + " 0.3503471833088141,\n", + " 0.8259047800943611,\n", + " 0.8128957298697691,\n", + " 0.8939785672476354,\n", + " 0.5422478460844449,\n", + " 0.31553270280095336,\n", + " 0.6405279583068977,\n", + " 0.3597656214633017,\n", + " 0.2889108849322164,\n", + " 0.4922047268067693,\n", + " 0.8327915693104457,\n", + " 0.3277076019379853,\n", + " 0.8713873896344992,\n", + " 0.22875060118724422,\n", + " 0.9335890629035303,\n", + " 0.255549412689544,\n", + " 0.15066464164432813,\n", + " 0.26887126359558167,\n", + " 0.6870525877771586,\n", + " 0.40321644990700256,\n", + " 0.21013692040443488,\n", + " 0.927714246450664,\n", + " 0.155627162724428,\n", + " 0.22089571137545683,\n", + " 0.1856468152454388,\n", + " 0.6362632878989183,\n", + " 0.3905133553223773,\n", + " 0.855933713950714,\n", + " 0.8920788605276186,\n", + " 0.6570342194697744,\n", + " 0.03552951249395264,\n", + " 0.0854598557437426,\n", + " 0.45040756859605224,\n", + " 0.35518855369442004,\n", + " 0.40637374298242257,\n", + " 0.04125872025522703,\n", + " 0.23945713126801393,\n", + " 0.5670871197377014,\n", + " 0.572252538193618,\n", + " 0.9398853635693121,\n", + " 0.5010616410267318,\n", + " 0.06310206526146356,\n", + " 0.7456365270336127,\n", + " 0.41012989070992123,\n", + " 0.4612365298643435,\n", + " 0.480783962817934,\n", + " 0.01823284932245839,\n", + " 0.6045690257242677,\n", + " 0.7323229929954058,\n", + " 0.2552058013791828,\n", + " 0.8326417394732437,\n", + " 0.1455396944829176,\n", + " 0.13525678385215545,\n", + " 0.7656868316315776,\n", + " 0.8432022082764987,\n", + " 0.781981694278368,\n", + " 0.025076340553529697,\n", + " 0.3083068698280029,\n", + " 0.2813683537144741,\n", + " 0.3678254114903755,\n", + " 0.8902277149873913,\n", + " 0.49945943353884426,\n", + " 0.7436971589099858,\n", + " 0.6479599381095483,\n", + " 0.3712311720244241,\n", + " 0.38729730643836546,\n", + " 0.8429567139162144,\n", + " 0.3160290435240478,\n", + " 0.8439813135528312,\n", + " 0.022657537834802732,\n", + " 0.8279050102713803,\n", + " 0.589057387008456,\n", + " 0.1744405132320862,\n", + " 0.9304713071233417,\n", + " 0.1118724148784489,\n", + " 0.5585915409633939,\n", + " 0.36710263708886315,\n", + " 0.7880875938422518,\n", + " 0.4500890590921822,\n", + " 0.15588745163815365,\n", + " 0.6832525065297202,\n", + " 0.351333399664318,\n", + " 0.4422251953532498,\n", + " 0.6020749530160101,\n", + " 0.05800902406630637,\n", + " 0.8871833708923571,\n", + " 0.17293030154193412,\n", + " 0.8881813676377167,\n", + " 0.8152385921900354,\n", + " 0.8883621118137052,\n", + " 0.24994248091443794,\n", + " 0.6346087407504215,\n", + " 0.007409547331956534,\n", + " 0.6466245985290132,\n", + " 0.9906712590709404,\n", + " 0.9258152596555992,\n", + " 0.8235714594188183,\n", + " 0.00820886418289346,\n", + " 0.1564023795766205,\n", + " 0.7075112325030009,\n", + " 0.45046812414263393,\n", + " 0.5911727835292879,\n", + " 0.13165687832297945,\n", + " 0.6463898107731514,\n", + " 0.3791229887152431,\n", + " 0.7429290997603721,\n", + " 0.5393949815897895,\n", + " 0.06756654684174623,\n", + " 0.8348262297484119,\n", + " 0.20121327568999114,\n", + " 0.7413328877074865,\n", + " 0.7551177230762839,\n", + " 0.7146575874270747,\n", + " 0.8844823659212648,\n", + " 0.23735993955420076,\n", + " 0.6914975259351099,\n", + " 0.8764515360375389,\n", + " 0.696770830780297,\n", + " 0.04869723304377638,\n", + " 0.9248141004688473,\n", + " 0.6346465788457116,\n", + " 0.9203249646855708,\n", + " 0.20858040486274865,\n", + " 0.8998031941486211,\n", + " 0.6389461557039012,\n", + " 0.2543104018287141,\n", + " 0.3980304507905016,\n", + " 0.6250016608324598,\n", + " 0.5181827683448409,\n", + " 0.7979136584953345,\n", + " 0.4394905469196051,\n", + " 0.889946556616781,\n", + " 0.19608331260691392,\n", + " 0.06995220836770522,\n", + " 0.22558059472520997,\n", + " 0.2726678737169881,\n", + " 0.9631775414614565,\n", + " 0.5053163702433562,\n", + " 0.8681496115491595,\n", + " 0.7010289838956199,\n", + " 0.32551351669642015,\n", + " 0.20020898122743158,\n", + " 0.21304052815710284,\n", + " 0.8672297406123692,\n", + " 0.06706518432321562,\n", + " 0.3366187574402736,\n", + " 0.015403806346035442,\n", + " 0.5571312934528229,\n", + " 0.0030607510856648368,\n", + " 0.8973373586546259,\n", + " 0.8366158396437623,\n", + " 0.9300799597474323,\n", + " 0.8274993649109533,\n", + " 0.6636425272589911,\n", + " 0.4032192694695742,\n", + " 0.8014704051714401,\n", + " 0.7893422846588837,\n", + " 0.01949472326966839,\n", + " 0.5928310456872478,\n", + " 0.9595547442169445,\n", + " 0.48982769392964953,\n", + " 0.02302644522493158,\n", + " 0.8979821128495366,\n", + " 0.4047791280579025,\n", + " 0.9417645793679189,\n", + " 0.03182106568715404,\n", + " 0.7451316958965996,\n", + " 0.03908742839824575,\n", + " 0.40363289606490227,\n", + " 0.42686687022303793,\n", + " 0.7256468545258421,\n", + " 0.07901011772303812,\n", + " 0.6170220347520461,\n", + " 0.34395477650193074,\n", + " 0.14732145454843237,\n", + " 0.5634419861994799,\n", + " 0.6224180510879168,\n", + " 0.9694057023937046,\n", + " 0.5996378010117973,\n", + " 0.34558974935055664,\n", + " 0.8795236890285335,\n", + " 0.5690266553779714,\n", + " 0.07677763951180039,\n", + " 0.8668386787059219,\n", + " 0.7216617368735014,\n", + " 0.5427092026568575,\n", + " 0.8102873287805434,\n", + " 0.889426909455728,\n", + " 0.57252329747637,\n", + " 0.6067287203796544,\n", + " 0.8193191118332643,\n", + " 0.4287647106842756,\n", + " 0.241662505833954,\n", + " 0.17252287442490788,\n", + " 0.9701174965872575,\n", + " 0.06454611808261512,\n", + " 0.9824078033973592,\n", + " 0.31611321096389455,\n", + " 0.38628779936293434,\n", + " 0.21981750292631708,\n", + " 0.40324354013994135,\n", + " 0.6386471169936873,\n", + " 0.4232656481934438,\n", + " 0.6253548675076551,\n", + " 0.16982522474203232,\n", + " 0.660428490721169,\n", + " 0.25781412469382703,\n", + " 0.6718146435850441,\n", + " 0.47914643361134557,\n", + " 0.7852909645980428,\n", + " 0.6999900566643491,\n", + " 0.3416879021410333,\n", + " 0.9811152308479636,\n", + " 0.13592103432969904,\n", + " 0.6674596571765482,\n", + " 0.9275143842122004,\n", + " 0.8863380471417094,\n", + " 0.4727317386162361,\n", + " 0.5788479074038737,\n", + " 0.15673909538451292,\n", + " 0.05808074647979822,\n", + " 0.7336513960885409,\n", + " 0.7749770965767294,\n", + " 0.1414115671545274,\n", + " 0.319604737521191,\n", + " 0.5036514328469441,\n", + " 0.5862087311368712,\n", + " 0.5008767376663589,\n", + " 0.8265947013947362,\n", + " 0.37152996367594227,\n", + " 0.6466387449500726,\n", + " 0.6323371148386964,\n", + " 0.4969668067027486,\n", + " 0.7239243102677253,\n", + " 0.2593655809119946,\n", + " 0.9310347562005588,\n", + " 0.17235066013736888,\n", + " 0.5298394746573245,\n", + " 0.4663354089127364,\n", + " 0.12113663573881617,\n", + " 0.8927613281738414,\n", + " 0.09868332626032783,\n", + " 0.8764057468885407,\n", + " 0.8490790680224228,\n", + " 0.5067936186721479,\n", + " 0.61859494298449,\n", + " 0.6875298105574691,\n", + " 0.23650658837303062,\n", + " 0.5398938258759405,\n", + " 0.05839282690829983,\n", + " 0.531676159684144,\n", + " 0.08603705659626637,\n", + " 0.2508254680230062,\n", + " 0.9580702923221974,\n", + " 0.4956185307487825,\n", + " 0.41582221073333114,\n", + " 0.5007721935451569,\n", + " 0.07564554948054236,\n", + " 0.4943233278226117,\n", + " 0.7750302138256457,\n", + " 0.20846841965662566,\n", + " 0.6527705642976147,\n", + " 0.6995448652052507,\n", + " 0.6547533197388147,\n", + " 0.4489962331294467,\n", + " 0.8633843607945841,\n", + " 0.07919849981498239,\n", + " 0.26796167380446634,\n", + " 0.6738509152013517,\n", + " 0.1569654894485074,\n", + " 0.31820993029205613,\n", + " 0.6928884673833002,\n", + " 0.7587971602392171,\n", + " 0.7490173342722976,\n", + " 0.4824491825877838,\n", + " 0.6281411806192793,\n", + " 0.09110325736333902,\n", + " 0.2272515609773178,\n", + " 0.8300714081995345,\n", + " 0.41178988713639,\n", + " 0.4189639151605795,\n", + " 0.4683789638902187,\n", + " 0.6972926175720812,\n", + " 0.5558608586604736,\n", + " 0.17006793466420045,\n", + " 0.4736318741474931,\n", + " 0.6739944623635545,\n", + " 0.3852029662425318,\n", + " 0.06596301813141048,\n", + " 0.711352749234049,\n", + " 0.1722965267377452,\n", + " 0.9243873307922549,\n", + " 0.7512188761222433,\n", + " 0.17826138260944635,\n", + " 0.5356118428720802,\n", + " 0.472975693943153,\n", + " 0.2191212200134237,\n", + " 0.7471472493258948,\n", + " 0.8630583562465127,\n", + " 0.7930120103154057,\n", + " 0.5891615468984037,\n", + " 0.4385573627192042,\n", + " 0.16083267047758454,\n", + " 0.0993715635130431,\n", + " 0.6143735482802161,\n", + " 0.153321608460109,\n", + " 0.10958459590034897,\n", + " 0.2556698781646224,\n", + " 0.7946031323787635,\n", + " 0.43494179805872324,\n", + " 0.4384593737995929,\n", + " 0.15630140641576862,\n", + " 0.06003968650938507,\n", + " 0.3521621709247097,\n", + " 0.8433002173635781,\n", + " 0.3512415544815639,\n", + " 0.017669556585916846,\n", + " 0.33852272994203925,\n", + " 0.31511778436869287,\n", + " 0.09896568801626626,\n", + " 0.13925919896559402,\n", + " 0.21611392419445308,\n", + " 0.6954010147128646,\n", + " 0.2743535128911705,\n", + " 0.45166316617071267,\n", + " 0.8241967539458284,\n", + " 0.45174706467345316,\n", + " 0.22387199077143327,\n", + " 0.733063380255207,\n", + " 0.13190596789725695,\n", + " 0.14394744981479335,\n", + " 0.8789896714473392,\n", + " 0.3098511346808893,\n", + " 0.2485071835148288,\n", + " 0.4152447097283827,\n", + " 0.7219990770694189,\n", + " 0.3216155163173309,\n", + " 0.5215505490215091,\n", + " 0.07523128039357874,\n", + " 0.6219693122475783,\n", + " 0.27784126178160984,\n", + " 0.8140562627536082,\n", + " 0.2917008151080812,\n", + " 0.4093929709390103,\n", + " 0.5648879882730428,\n", + " 0.7361542728017286,\n", + " 0.8212090786218893,\n", + " 0.07013528872709607,\n", + " 0.31676367673132344,\n", + " 0.01079559565897581,\n", + " 0.8586201511211767,\n", + " 0.8804093764835589,\n", + " 0.3823853538891071,\n", + " 0.2730895041466681,\n", + " 0.10761734347058638,\n", + " 0.6599789388411261,\n", + " 0.5482427700075484,\n", + " 0.481931570546979,\n", + " 0.19475385554315372,\n", + " 0.6448258090530742,\n", + " 0.4254620173386673,\n", + " 0.7554116431903065,\n", + " 0.127028955248344,\n", + " 0.2494022885867686,\n", + " 0.7801736074499507,\n", + " 0.7507550177431044,\n", + " 0.9122774025383312,\n", + " 0.7476190302247077,\n", + " 0.62735789450706,\n", + " 0.29369417032751766,\n", + " 0.0634458282295165,\n", + " 0.8937470613392255,\n", + " 0.12776978731932043,\n", + " 0.393060683324883,\n", + " 0.04389682009429341,\n", + " 0.5735226948919407,\n", + " 0.22043870967014678,\n", + " 0.5280297014552133,\n", + " 0.5617479102547562,\n", + " 0.578401149119267,\n", + " 0.2286083039974951,\n", + " 0.26375232167437024,\n", + " 0.8999510292903707,\n", + " 0.9607032487036469,\n", + " 0.09006187012109423,\n", + " 0.5726284845446513,\n", + " 0.7858940875001008,\n", + " 0.4540544969410881,\n", + " 0.8609854460231324,\n", + " 0.4094331644267043,\n", + " 0.9841874603642817,\n", + " 0.2776519210797088,\n", + " 0.7407439459693145,\n", + " 0.13000032201141865,\n", + " 0.02380745061531042,\n", + " 0.4156141586500848,\n", + " 0.4710992207743143,\n", + " 0.6003590494643708,\n", + " 0.880802731575251,\n", + " 0.7272104838481421,\n", + " 0.023661617369377885,\n", + " 0.034847472110794975,\n", + " 0.4516109161866728,\n", + " 0.2123226280745899,\n", + " 0.0010867342230801436,\n", + " 0.842320221552167,\n", + " 0.2138517696453145,\n", + " 0.7614995678783137,\n", + " 0.9778573087964333,\n", + " 0.061879074922035704,\n", + " 0.8076652624997437,\n", + " 0.011999586117784622,\n", + " 0.12585876095553628,\n", + " 0.4441735305777964,\n", + " 0.4300509567286114,\n", + " 0.3556466089340079,\n", + " 0.5936610141953973,\n", + " 0.7142437913222099,\n", + " 0.8684047267235078,\n", + " 0.7252166875299394,\n", + " 0.8816060879704407,\n", + " 0.7012037187893029,\n", + " 0.03667481151190477,\n", + " 0.23999996113462452,\n", + " 0.2560156902763383,\n", + " 0.716205308276198,\n", + " 0.9622029957783733,\n", + " 0.3936059595626942,\n", + " 0.0810520100546831,\n", + " 0.03742264086081337,\n", + " 0.21819340355672823,\n", + " 0.716199716040054,\n", + " 0.48720463898073074,\n", + " 0.4891441701279411,\n", + " 0.4020778090582948,\n", + " 0.8428007505497782,\n", + " 0.2630960822097007,\n", + " 0.007650714029847627,\n", + " 0.25159136548244687,\n", + " 0.49199466838377315,\n", + " 0.1295895642495326,\n", + " 0.38102985464507233,\n", + " 0.3651215701855689,\n", + " 0.49093465381441526,\n", + " 0.8596025034265571,\n", + " 0.27440584930369993,\n", + " 0.1365371114498165,\n", + " 0.9037554994194104,\n", + " 0.03311243679510012,\n", + " 0.9295779359271258,\n", + " 0.695181384736449,\n", + " 0.9920405506961665,\n", + " 0.11346140124162629,\n", + " 0.605215827841329,\n", + " 0.04201963160029132,\n", + " 0.5374148346137307,\n", + " 0.9669263488973885,\n", + " 0.8022969643597431,\n", + " 0.20393944576277012,\n", + " 0.7771265702760175,\n", + " 0.2730208545372995,\n", + " 0.0022832654599138635,\n", + " 0.36480353625747364,\n", + " 0.1400662854393504,\n", + " 0.9011733699693759,\n", + " 0.4889989135626587,\n", + " 0.6659470409250522,\n", + " 0.08281452357789043,\n", + " 0.9102585686969998,\n", + " 0.6364724235562397,\n", + " 0.40741171412099775,\n", + " 0.6040479018601236,\n", + " 0.342513984629501,\n", + " 0.5165676315652069,\n", + " 0.7683533106987636,\n", + " 0.8717383964028812,\n", + " 0.34260904790103797,\n", + " 0.06750039778151273,\n", + " 0.9205594908341374,\n", + " 0.4566072441813641,\n", + " 0.1799828518598694,\n", + " 0.1804251041936208,\n", + " 0.566798529458963,\n", + " 0.9889093667295235,\n", + " 0.8220910104175041,\n", + " 0.8139790740673143,\n", + " 0.15969432013150953,\n", + " 0.6262572783105068,\n", + " 0.5469744159884337,\n", + " 0.7269687186823531,\n", + " 0.34722768884308286,\n", + " 0.9416929596554047,\n", + " 0.08924967764979752,\n", + " 0.6261876038136575,\n", + " 0.7995080845514368,\n", + " 0.08058831639145825,\n", + " 0.1808784795058065,\n", + " 0.2310996616372345,\n", + " 0.6357501240474868,\n", + " 0.8559826583558066,\n", + " 0.279747090459033,\n", + " 0.16283790504318896,\n", + " 0.9888156289774844,\n", + " 0.3047527083951137,\n", + " 0.8260228996116487,\n", + " 0.09187778648829614,\n", + " 0.7399331996820916,\n", + " 0.19735448077436757,\n", + " 0.44863966806698174,\n", + " 0.24724391775446164,\n", + " 0.9493809492862807,\n", + " 0.6407616904479276,\n", + " 0.6141627065590668,\n", + " 0.3347774197069435,\n", + " 0.6433229889446616,\n", + " 0.07099211520076609,\n", + " 0.1704726695092751,\n", + " 0.4472737096421391,\n", + " 0.6865717838346901,\n", + " 0.23513463630025844,\n", + " 0.18145865993017674,\n", + " 0.09134103190575293,\n", + " 0.3231558991782195,\n", + " 0.8446415920601732,\n", + " 0.4321187683248696,\n", + " 0.40087210145386787,\n", + " 0.7834198704566174,\n", + " 0.29055149263098945,\n", + " 0.6518876180976012,\n", + " 0.6099160154393811,\n", + " 0.9870452328370816,\n", + " 0.008320756235908888,\n", + " 0.2773119610829933,\n", + " 0.870675552187072,\n", + " 0.961880190034377,\n", + " 0.9568629317594524,\n", + " 0.04779194428477007,\n", + " 0.12545196673393544]" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list1" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "arr1 = np.array(list1)\n", + "arr2 = np.array(list2)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1000,)" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "arr1.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dtype('float64')" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "arr1.dtype" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(8,)" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "arr1.strides" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "arr1.ndim" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from IPython.display import Image" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/Users/do-hyungkwon/GoogleDrive/script_programming/files'" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/Downloads\n" + ] + } + ], + "source": [ + "cd /Users/do-hyungkwon/Downloads/" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2017011014840263686501382.jpg\r\n", + "2017011014840269617281400.jpg\r\n", + "2017011014840273545251412.jpg\r\n", + "2017012014849019897551623.jpg\r\n", + "2017012014849025086141638.jpg\r\n", + "2017012314851700225172162.jpg\r\n", + "2017012314851719908292210.jpg\r\n", + "2017년도 이공분야 대학중점연구소지원사업 연구개발과제계획서(신청용).pdf\r\n", + "< 2016 첨단기술연구소 정기 학술 워크샵 개최 >.jpg\r\n", + "< 연구소 발행 학술지 표지 >3.jpg\r\n", + "< 산학협력관 202호 세미나실 >1.jpg\r\n", + "< 산학협력관 202호 세미나실 >2..jpg\r\n", + "School_Bus_Picture4.hwp\r\n", + "java-json.jar.zip\r\n", + "★ ATRC Image Works IV.pdf\r\n", + "\u001b[34m무제 폴더\u001b[m\u001b[m/\r\n", + "붙임3_안전교육신청 방법.pdf\r\n", + "붙임4_연구활동종사자 교육ㆍ훈련의 시간 및 내용(제9조제1항 관련).hwp\r\n" + ] + } + ], + "source": [ + "ls" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAPABQADASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDiRgGn\ncgdaQDinD6V6RgFKBzQOtOFAB3oHFLz3pR1oAM8UvXHFA6UvUcUwADilxQOafQIQDil96XpQOaQw\nFLRj0paYBilo9qUDFABS9qKX8aAAUtAFLQAtAAzRS0ALSjrSU4ZxQACnYHpScU7HFACU7HFJinCg\nApQKKWkAmOadQKMUAApQKMU6gBAKcKBSgUAGKUdaKcBQAUoFApQKQBinAUYpQKAF3sU2Fjs9M8VJ\ncTS3TlnkIPT5eOPSo8U4CpcU9xpsz9QiRbUhY4lDHDO/b6VjLcJGyiZFaPBUEgkn0x6V0V5D59s0\ne8LnnoMn6VgMHcrgxERnau08j6Z6/WvOxcbO5tTYtrHuVGcM4yconGPc1fvrw/uYhCqNGxKtCAAS\n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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(filename=\"2017011014840273545251412.jpg\")" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "type" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(Image)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "IPython.core.display.Image" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "img = np.asarray(Image)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(img)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "too many indices for array", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mimg\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m: too many indices for array" + ] + } + ], + "source": [ + "img[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from IPython.display import YouTubeVideo" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/2Q==\n", + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "YouTubeVideo(\"y1f-YHw1uNs\")" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/2Q==\n", + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "YouTubeVideo(\"y1f-YHw1uNs\")" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "files = !ls -l | grep ." + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['total 23088',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 105121 8 31 21:08 2017011014840263686501382.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 313258 8 31 21:09 2017011014840269617281400.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 251477 8 31 21:09 2017011014840273545251412.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 135565 8 31 21:10 2017012014849019897551623.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 235959 8 31 21:10 2017012014849025086141638.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 128405 8 31 21:11 2017012314851700225172162.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 209520 8 31 21:12 2017012314851719908292210.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 2599836 8 19 15:47 2017년도 이공분야 대학중점연구소지원사업 연구개발과제계획서(신청용).pdf',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 1116459 8 31 12:32 < 2016 첨단기술연구소 정기 학술 워크샵 개최 >.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 438798 8 31 12:33 < 연구소 발행 학술지 표지 >3.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 220185 8 31 12:33 < 산학협력관 202호 세미나실 >1.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 203689 8 31 12:33 < 산학협력관 202호 세미나실 >2..jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 2450432 8 31 11:47 School_Bus_Picture4.hwp',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 81955 8 31 16:19 java-json.jar.zip',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 2823105 8 19 15:47 ★ ATRC Image Works IV.pdf',\n", + " 'drwxr-xr-x 5 do-hyungkwon staff 170 8 31 21:16 무제 폴더',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 447686 8 31 11:33 붙임3_안전교육신청 방법.pdf',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 16896 8 31 11:33 붙임4_연구활동종사자 교육ㆍ훈련의 시간 및 내용(제9조제1항 관련).hwp']" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "files" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['total 23088',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 2823105 8 19 15:47 ★ ATRC Image Works IV.pdf',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 2599836 8 19 15:47 2017년도 이공분야 대학중점연구소지원사업 연구개발과제계획서(신청용).pdf',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 2450432 8 31 11:47 School_Bus_Picture4.hwp',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 1116459 8 31 12:32 < 2016 첨단기술연구소 정기 학술 워크샵 개최 >.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 447686 8 31 11:33 붙임3_안전교육신청 방법.pdf',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 438798 8 31 12:33 < 연구소 발행 학술지 표지 >3.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 313258 8 31 21:09 2017011014840269617281400.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 251477 8 31 21:09 2017011014840273545251412.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 235959 8 31 21:10 2017012014849025086141638.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 220185 8 31 12:33 < 산학협력관 202호 세미나실 >1.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 209520 8 31 21:12 2017012314851719908292210.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 203689 8 31 12:33 < 산학협력관 202호 세미나실 >2..jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 135565 8 31 21:10 2017012014849019897551623.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 128405 8 31 21:11 2017012314851700225172162.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 105121 8 31 21:08 2017011014840263686501382.jpg',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 81955 8 31 16:19 java-json.jar.zip',\n", + " '-rw-r--r--@ 1 do-hyungkwon staff 16896 8 31 11:33 붙임4_연구활동종사자 교육ㆍ훈련의 시간 및 내용(제9조제1항 관련).hwp',\n", + " 'drwxr-xr-x 5 do-hyungkwon staff 170 8 31 21:16 무제 폴더']" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "files = !ls -l -S | grep .\n", + "files" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "data": { + "application/json": { + "cell": { + "!": "OSMagics", + "HTML": "Other", + "SVG": "Other", + "bash": "Other", + "capture": "ExecutionMagics", + "debug": "ExecutionMagics", + "file": "Other", + "html": "DisplayMagics", + "javascript": "DisplayMagics", + "js": "DisplayMagics", + "latex": "DisplayMagics", + "perl": "Other", + "prun": "ExecutionMagics", + "pypy": "Other", + "python": "Other", + "python2": "Other", + "python3": "Other", + "ruby": "Other", + "script": "ScriptMagics", + "sh": "Other", + "svg": "DisplayMagics", + "sx": "OSMagics", + "system": "OSMagics", + "time": "ExecutionMagics", + "timeit": "ExecutionMagics", + "writefile": "OSMagics" + }, + "line": { + "alias": "OSMagics", + "alias_magic": "BasicMagics", + "autocall": "AutoMagics", + "automagic": "AutoMagics", + "autosave": "KernelMagics", + "bookmark": "OSMagics", + "cat": "Other", + "cd": "OSMagics", + "clear": "KernelMagics", + "colors": "BasicMagics", + "config": "ConfigMagics", + "connect_info": "KernelMagics", + "cp": "Other", + "debug": "ExecutionMagics", + "dhist": "OSMagics", + "dirs": "OSMagics", + "doctest_mode": "BasicMagics", + "ed": "Other", + "edit": "KernelMagics", + "env": "OSMagics", + "gui": "BasicMagics", + "hist": "Other", + "history": "HistoryMagics", + "killbgscripts": "ScriptMagics", + "ldir": "Other", + "less": "KernelMagics", + "lf": "Other", + "lk": "Other", + "ll": "Other", + "load": "CodeMagics", + "load_ext": "ExtensionMagics", + "loadpy": "CodeMagics", + "logoff": "LoggingMagics", + "logon": "LoggingMagics", + "logstart": "LoggingMagics", + "logstate": "LoggingMagics", + "logstop": "LoggingMagics", + "ls": "Other", + "lsmagic": "BasicMagics", + "lx": "Other", + "macro": "ExecutionMagics", + "magic": "BasicMagics", + "man": "KernelMagics", + "matplotlib": "PylabMagics", + "mkdir": "Other", + "more": "KernelMagics", + "mv": "Other", + "notebook": "BasicMagics", + "page": "BasicMagics", + "pastebin": "CodeMagics", + "pdb": "ExecutionMagics", + "pdef": "NamespaceMagics", + "pdoc": "NamespaceMagics", + "pfile": "NamespaceMagics", + "pinfo": "NamespaceMagics", + "pinfo2": "NamespaceMagics", + "popd": "OSMagics", + "pprint": "BasicMagics", + "precision": "BasicMagics", + "profile": "BasicMagics", + "prun": "ExecutionMagics", + "psearch": "NamespaceMagics", + "psource": "NamespaceMagics", + "pushd": "OSMagics", + "pwd": "OSMagics", + "pycat": "OSMagics", + "pylab": "PylabMagics", + "qtconsole": "KernelMagics", + "quickref": "BasicMagics", + "recall": "HistoryMagics", + "rehashx": "OSMagics", + "reload_ext": "ExtensionMagics", + "rep": "Other", + "rerun": "HistoryMagics", + "reset": "NamespaceMagics", + "reset_selective": "NamespaceMagics", + "rm": "Other", + "rmdir": "Other", + "run": "ExecutionMagics", + "save": "CodeMagics", + "sc": "OSMagics", + "set_env": "OSMagics", + "store": "StoreMagics", + "sx": "OSMagics", + "system": "OSMagics", + "tb": "ExecutionMagics", + "time": "ExecutionMagics", + "timeit": "ExecutionMagics", + "unalias": "OSMagics", + "unload_ext": "ExtensionMagics", + "who": "NamespaceMagics", + "who_ls": "NamespaceMagics", + "whos": "NamespaceMagics", + "xdel": "NamespaceMagics", + "xmode": "BasicMagics" + } + }, + "text/plain": [ + "Available line magics:\n", + "%alias %alias_magic %autocall %automagic %autosave %bookmark %cat %cd %clear %colors %config %connect_info %cp %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n", + "\n", + "Available cell magics:\n", + "%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%js %%latex %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile\n", + "\n", + "Automagic is ON, % prefix IS NOT needed for line magics." + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lsmagic" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "% cd ..\n", + "% .\n", + "% ..\n", + "% cd .\n", + "!ls *.ipynb\n", + "!ls *.ipynb\n", + "%ls *.ipynb\n", + "!ls\n", + "!ls ./deeplink/5.DoHyung/\n", + "!ls ./\n", + "!ls ./script_programming/\n", + "%ls ./script_programming/\n", + "list?\n", + "1 + 1\n", + "_+ 10\n", + "def square(x):\n", + " return x+x\n", + "def cube(x):\n", + " return x*x*x\n", + "funcs = {\n", + " 'square' : square,\n", + " 'cube' : cube,\n", + "}\n", + "x = 2\n", + "print(square(x))\n", + "print(cube(x))\n", + "\n", + "for func in sorted(funcs):\n", + " print(func, funcs[func](x))\n", + "sorted(funcs)\n", + "x = 2\n", + "print(square(x))\n", + "print(cube(x))\n", + "\n", + "for func, val in sorted(funcs):\n", + " print(func)\n", + " print(val)\n", + "# print(func, funcs[func](x))\n", + "x = 2\n", + "print(square(x))\n", + "print(cube(x))\n", + "\n", + "for func, val in sorted(funcs):\n", + " print(func, funcs[func](x))\n", + "x = 2\n", + "print(square(x))\n", + "print(cube(x))\n", + "\n", + "for func, val in sorted(funcs):\n", + " print(func, funcs[func](x))\n", + "x = 2\n", + "print(square(x))\n", + "print(cube(x))\n", + "\n", + "for funcin sorted(funcs):\n", + " print(func, funcs[func](x))\n", + "x = 2\n", + "print(square(x))\n", + "print(cube(x))\n", + "\n", + "for func in sorted(funcs):\n", + " print(func, funcs[func](x))\n", + "%cd TEST\n", + "%cd /Users/do-hyungkwon/GoogleDrive/jupyter_notebook/\n", + "!ls\n", + "%%writefile test.txt\n", + "%%writefile test.txt\n", + "Hello World!\n", + "with open('test.txt', 'r') as f:\n", + " print(f.read())\n", + "!ㅣㄴ\n", + "!ls\n", + "!ls *.py\n", + "!pwd\n", + "!cd ../deeplink\\ 복사본\\(170830\\)\n", + "!pwd\n", + "! cd ../deeplink/5.DoHyung/raspberrypi4/\n", + "!pwd\n", + "!cd /Users/do-hyungkwon/GoogleDrive/deeplink\\ 복사본\\(170830\\)/5.DoHyung/raspberrypi5/\n", + "!pwd\n", + "!pwd\n", + "!cd /Users/do-hyungkwon/GoogleDrive/deeplink/5.DoHyung/raspberrypi4\n", + "!pwd\n", + "%cd /Users/do-hyungkwon/GoogleDrive/deeplink/5.DoHyung/raspberrypi4\n", + "!pwd\n", + "!ls\n", + "%run deep_convnet.py\n", + "%cd /Users/do-hyungkwon/GoogleDrive/script_programming/\n", + "!pwd\n", + "!ls\n", + "%cd files/\n", + "pwd\n", + "ls\n", + "run cal.py\n", + "from random import random\n", + "list1 = [random() for _ in range(1000)]\n", + "list2 = [random() for _ in range(1000)]\n", + "list1\n", + "import numpy as np\n", + "arr1 = np.array(list1)\n", + "arr2 = np.array(list2)\n", + "arr1.shape\n", + "arr1.dtype\n", + "arr1.strides\n", + "arr1.ndim\n", + "from IPython.display import Image\n", + "pwd\n", + "cd /Users/do-hyungkwon/Downloads/\n", + "ls\n", + "Image(filename=2017011014840273545251412.jpg)\n", + "Image(filename=\"2017011014840273545251412.jpg\")\n", + "type(Image)\n", + "Image\n", + "img = np.asarray(Image)\n", + "type(img)\n", + "img.shape\n", + "img\n", + "img[0]\n", + "from IPython.display import YouTubeVideo\n", + "YouTubeVideo(\"lmoNmY-cmSI\")\n", + "YouTubeVideo(\"y1f-YHw1uNs\")\n", + "YouTubeVideo(\"y1f-YHw1uNs\")\n", + "YouTubeVideo(\"y1f-YHw1uNs\")\n", + "YouTubeVideo(\"y1f-YHw1uNs\")\n", + "YouTubeVideo(\"y1f-YHw1uNs\")\n", + "files = !ls -l -S | grep .\n", + "files\n", + "files\n", + "files = !ls -l | grep .\n", + "files\n", + "files = !ls -l -S | grep .\n", + "files\n", + "lsmagic\n", + "history\n" + ] + } + ], + "source": [ + "history" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "UsageError: %%capture is a cell magic, but the cell body is empty.\n" + ] + } + ], + "source": [ + "%%capture" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Variable Type Data/Info\n", + "---------------------------------------------------------------------\n", + "AdaGrad type \n", + "Adam type \n", + "Affine type \n", + "BatchNormalization type \n", + "Convolution type \n", + "DeepConvNet type \n", + "Dropout type \n", + "Image type \n", + "Momentum type \n", + "Nesterov type \n", + "Pooling type \n", + "RMSprop type \n", + "ReLU type \n", + "SGD type \n", + "Sigmoid type \n", + "SoftmaxWithCrossEntropyLoss type maxWithCrossEntropyLoss'>\n", + "YouTubeVideo type \n", + "arr1 ndarray 1000: 1000 elems, type `float64`, 8000 bytes\n", + "arr2 ndarray 1000: 1000 elems, type `float64`, 8000 bytes\n", + "calendar module b/python3.6/calendar.py'>\n", + "col2im function \n", + "cross_entropy_error function \n", + "cube function \n", + "f TextIOWrapper <_io.TextIOWrapper name='<...>ode='r' encoding='UTF-8'>\n", + "files SList ['total 23088', '-rw-r--r<...> 8 31 21:16 무제 폴더']\n", + "func str square\n", + "funcs dict n=2\n", + "identity_function function \n", + "im2col function \n", + "img ndarray : 1 elems, type `object`, 8 bytes\n", + "list1 list n=1000\n", + "list2 list n=1000\n", + "mean_squared_error function \n", + "np module kages/numpy/__init__.py'>\n", + "optimizers dict n=6\n", + "os module nda/lib/python3.6/os.py'>\n", + "pickle module lib/python3.6/pickle.py'>\n", + "random builtin_function_or_method object at 0x7fadcf042618>\n", + "relu function \n", + "relu_grad function \n", + "sigmoid function \n", + "sigmoid_grad function \n", + "softmax function \n", + "softmax_loss function \n", + "square function \n", + "step_function function \n", + "sys module \n", + "x int 2\n" + ] + } + ], + "source": [ + "%whos" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%timeit" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%pdb" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%magic ?" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'ᅦᄌᄋ' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mㅔㅈㅇ\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'ᅦᄌᄋ' is not defined" + ] + } + ], + "source": [ + "ㅔㅈㅇ" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/Users/do-hyungkwon/GoogleDrive/script_programming'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive/deeplink/5.DoHyung/raspberrypi4\n" + ] + } + ], + "source": [ + "cd /Users/do-hyungkwon/GoogleDrive/deeplink/5.DoHyung/raspberrypi4/" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/Users/do-hyungkwon/GoogleDrive/deeplink/5.DoHyung/raspberrypi4'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "total 64\r\n", + "-rwxr-xr-x 1 do-hyungkwon staff 9605 8 31 10:24 \u001b[31mdeep_convnet.py\u001b[m\u001b[m*\r\n", + "-rwxr-xr-x 1 do-hyungkwon staff 11667 8 31 10:24 \u001b[31mdeep_convnet_large.py\u001b[m\u001b[m*\r\n", + "drwxr-xr-x 12 do-hyungkwon staff 408 9 1 10:36 \u001b[34mdeeplink\u001b[m\u001b[m/\r\n", + "-rwxr-xr-x 1 do-hyungkwon staff 430 8 31 10:24 \u001b[31mrealtime_deepnet.py\u001b[m\u001b[m*\r\n", + "-rwxr-xr-x 1 do-hyungkwon staff 3830 8 31 10:24 \u001b[31mtrain_deepnet.py\u001b[m\u001b[m*\r\n" + ] + } + ], + "source": [ + "ls -l" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# %load deep_convnet.py\n", + "import sys, os\n", + "import pickle\n", + "import numpy as np\n", + "from deeplink.layers import *\n", + "from deeplink.optimizers import *\n", + "\n", + "optimizers = {\n", + " \"SGD\": SGD,\n", + " \"Momentum\": Momentum,\n", + " \"Nesterov\": Nesterov,\n", + " \"AdaGrad\": AdaGrad,\n", + " \"RMSprop\": RMSprop,\n", + " \"Adam\": Adam\n", + "}\n", + "\n", + "class DeepConvNet:\n", + " \"\"\"\n", + " conv - relu - poll - conv- relu - pool -\n", + " affine - relu - dropout - affine - dropout - softmax\n", + " \"\"\"\n", + " def __init__(self, input_dim=(1, 320, 240),\n", + " conv_param_1 = {'filter_num':16, 'filter_size':3, 'pad':1, 'stride':1},\n", + " pool_param_1 = {'size': 2, 'stride': 2},\n", + " conv_param_2 = {'filter_num':16, 'filter_size':3, 'pad':1, 'stride':1},\n", + " pool_param_2 = {'size': 2, 'stride': 2},\n", + " hidden_size=128, output_size=3, optimizer='AdaGrad', learning_rate=0.01, train_flg=False):\n", + "\n", + " channel_num = input_dim[0]\n", + " layer_input_width = input_dim[1]\n", + " layer_input_height = input_dim[2]\n", + "\n", + " self.last_conv_pool_input_width, self.last_conv_pool_input_height = self.get_conv_pool_last_output_size(input_dim[1], input_dim[2], conv_param_1, pool_param_1, conv_param_2, pool_param_2, train_flg)\n", + "\n", + " pre_node_nums = np.array([\n", + " channel_num * conv_param_1['filter_size'] * conv_param_1['filter_size'],\n", + " conv_param_1['filter_num'] * conv_param_2['filter_size'] * conv_param_2['filter_size'],\n", + " conv_param_2['filter_num'] * self.last_conv_pool_input_width * self.last_conv_pool_input_height,\n", + " hidden_size])\n", + "\n", + " weight_init_scales = np.sqrt(2.0 / pre_node_nums)\n", + "\n", + " self.params = {}\n", + "\n", + " for idx, conv_param in enumerate([conv_param_1, conv_param_2]):\n", + " self.params['W' + str(idx+1)] = weight_init_scales[idx] * np.random.randn(conv_param['filter_num'], channel_num, conv_param['filter_size'], conv_param['filter_size'])\n", + " self.params['b' + str(idx+1)] = np.zeros(conv_param['filter_num'])\n", + " channel_num = conv_param['filter_num']\n", + "\n", + " self.params['W3'] = weight_init_scales[2] * np.random.randn(16 * self.last_conv_pool_input_width * self.last_conv_pool_input_height, hidden_size)\n", + " self.params['b3'] = np.zeros(hidden_size)\n", + " self.params['W4'] = weight_init_scales[3] * np.random.randn(hidden_size, output_size)\n", + " self.params['b4'] = np.zeros(output_size)\n", + "\n", + " self.layers = []\n", + " self.layers.append(Convolution(self.params['W1'], self.params['b1'],\n", + " conv_param_1['stride'], conv_param_1['pad']))\n", + " self.layers.append(ReLU())\n", + " self.layers.append(Pooling(pool_h=pool_param_1['size'], pool_w=pool_param_1['size'], stride=pool_param_1['stride']))\n", + " self.layers.append(Convolution(self.params['W2'], self.params['b2'],\n", + " conv_param_2['stride'], conv_param_2['pad']))\n", + " self.layers.append(ReLU())\n", + " self.layers.append(Pooling(pool_h=pool_param_2['size'], pool_w=pool_param_2['size'], stride=pool_param_2['stride']))\n", + " self.layers.append(Affine(self.params['W3'], self.params['b3']))\n", + " self.layers.append(ReLU())\n", + " self.layers.append(Dropout(0.5))\n", + " self.layers.append(Affine(self.params['W4'], self.params['b4']))\n", + " self.layers.append(Dropout(0.5))\n", + "\n", + " self.last_layer = SoftmaxWithCrossEntropyLoss()\n", + "\n", + " # Optimizer Initialization\n", + " self.optimizer = optimizers[optimizer](lr=learning_rate)\n", + "\n", + " def get_conv_pool_last_output_size(self, layer_input_width, layer_input_height, conv_param_1, pool_param_1, conv_param_2, pool_param_2, train_flg):\n", + " layer_input_width, layer_input_height = self.conv_layer_output_size(layer_input_width,\n", + " layer_input_height,\n", + " conv_param_1['filter_size'],\n", + " conv_param_1['pad'], conv_param_1['stride'])\n", + "\n", + " if train_flg: print(\"Shape of Conv-1 Output: ({:d}, {:d}, {:d})\".format(conv_param_1['filter_num'], layer_input_width, layer_input_height))\n", + "\n", + " layer_input_width, layer_input_height = self.pool_layer_output_size(layer_input_width,\n", + " layer_input_height,\n", + " pool_param_1['size'],\n", + " pool_param_1['size'],\n", + " pool_param_1['stride'])\n", + " if train_flg: print(\"Shape of Pool-1 Output: ({:d}, {:d}, {:d})\".format(conv_param_1['filter_num'], layer_input_width, layer_input_height))\n", + "\n", + " layer_input_width, layer_input_height = self.conv_layer_output_size(layer_input_width,\n", + " layer_input_height,\n", + " conv_param_2['filter_size'],\n", + " conv_param_2['pad'], conv_param_2['stride'])\n", + " if train_flg: print(\"Shape of Conv-2 Output: ({:d}, {:d}, {:d})\".format(conv_param_2['filter_num'], layer_input_width, layer_input_height))\n", + "\n", + " layer_input_width, layer_input_height = self.pool_layer_output_size(layer_input_width,\n", + " layer_input_height,\n", + " pool_param_2['size'],\n", + " pool_param_2['size'],\n", + " pool_param_2['stride'])\n", + " if train_flg: print(\"Shape of Pool-2 Output: ({:d}, {:d}, {:d})\".format(conv_param_2['filter_num'], layer_input_width, layer_input_height))\n", + " return int(layer_input_width), int(layer_input_height)\n", + "\n", + " def conv_layer_output_size(self, layer_input_width, layer_input_height, filter_size, pad, stride):\n", + " size_w, size_h = (layer_input_width - filter_size + 2 * pad) / stride + 1, (layer_input_height - filter_size + 2 * pad) / stride + 1\n", + " if size_w != int(size_w):\n", + " raise ValueError(\"Conv_Layer output size (size_w) is not integer\")\n", + " if size_h != int(size_h):\n", + " raise ValueError(\"Conv_Layer output size (size_h) is not integer\")\n", + " return int(size_w), int(size_h)\n", + "\n", + " def pool_layer_output_size(self, layer_input_width, layer_input_height, filter_width, filter_height, stride):\n", + " size_w, size_h = (layer_input_width - filter_width) / stride + 1, (layer_input_height - filter_height) / stride + 1\n", + " if size_w != int(size_w):\n", + " raise ValueError(\"Pool_Layer output size (size_w) is not integer\")\n", + " if size_h != int(size_h):\n", + " raise ValueError(\"Pool_Layer output size (size_h) is not integer\")\n", + " return int(size_w), int(size_h)\n", + "\n", + " def predict(self, x, train_flg=False):\n", + " isFirstAffine = False\n", + " for layer in self.layers:\n", + " if isinstance(layer, Affine) and not isFirstAffine:\n", + " isFirstAffine = True\n", + " x = x.reshape(-1, 16 * self.last_conv_pool_input_width * self.last_conv_pool_input_height)\n", + "\n", + " if isinstance(layer, Dropout):\n", + " x = layer.forward(x, train_flg)\n", + " else:\n", + " x = layer.forward(x)\n", + " return x\n", + "\n", + " def loss(self, x, t):\n", + " y = self.predict(x, train_flg=True)\n", + " return self.last_layer.forward(y, t)\n", + "\n", + " def accuracy(self, x, t, batch_size=10):\n", + " if t.ndim != 1 : t = np.argmax(t, axis=1)\n", + "\n", + " acc = 0.0\n", + "\n", + " for i in range(int(x.shape[0] / batch_size)):\n", + " tx = x[i*batch_size:(i+1)*batch_size]\n", + " tt = t[i*batch_size:(i+1)*batch_size]\n", + " y = self.predict(tx, train_flg=False)\n", + " y = np.argmax(y, axis=1)\n", + " acc += np.sum(y == tt)\n", + "\n", + " return acc / x.shape[0]\n", + "\n", + " def backpropagation_gradient(self, x, t):\n", + " # forward\n", + " self.loss(x, t)\n", + "\n", + " # backward\n", + " dout = 1\n", + " dout = self.last_layer.backward(dout)\n", + "\n", + " tmp_layers = self.layers.copy()\n", + " tmp_layers.reverse()\n", + "\n", + " isFirstPooling = False\n", + " for layer in tmp_layers:\n", + " if isinstance(layer, Pooling) and not isFirstPooling:\n", + " isFirstPooling = True\n", + " dout = dout.reshape(-1, 16, self.last_conv_pool_input_width, self.last_conv_pool_input_height)\n", + " dout = layer.backward(dout)\n", + "\n", + " # 設定\n", + " grads = {}\n", + " for i, layer_idx in enumerate((0, 3, 6, 9)):\n", + " grads['W' + str(i+1)] = self.layers[layer_idx].dW\n", + " grads['b' + str(i+1)] = self.layers[layer_idx].db\n", + "\n", + " return grads\n", + "\n", + " def learning(self, x_batch, t_batch):\n", + " grads = self.backpropagation_gradient(x_batch, t_batch)\n", + " self.optimizer.update(self.params, grads)\n", + "\n", + " def save_params(self, file_name=\"params.pkl\"):\n", + " with open(file_name, 'wb') as f:\n", + " pickle.dump(self.params, f)\n", + "\n", + " def load_params(self, file_name=\"params.pkl\"):\n", + " with open(file_name, 'rb') as f:\n", + " params = pickle.load(f)\n", + "\n", + " for key, val in params.items():\n", + " self.params[key] = val\n", + "\n", + " for i, layer_idx in enumerate((0, 3, 6, 9)):\n", + " self.layers[layer_idx].W = self.params['W' + str(i+1)]\n", + " self.layers[layer_idx].b = self.params['b' + str(i+1)]\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "x = np.random.random(500)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The slowest run took 312.49 times longer than the fastest. This could mean that an intermediate result is being cached.\n", + "100000 loops, best of 3: 4.5 µs per loop\n" + ] + } + ], + "source": [ + "%timeit np.sum(x*x)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x = np.random.random(500)\n", + "import numpy as np\n", + "x = np.random.random(500)\n", + "%timeit np.sum(x)\n", + "%timeit np.sum(x*x)\n" + ] + } + ], + "source": [ + "history -l 5" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Directory history (kept in _dh)\n", + "0: /Users/do-hyungkwon/GoogleDrive/script_programming\n", + "1: /Users/do-hyungkwon/GoogleDrive/deeplink/5.DoHyung/raspberrypi4\n" + ] + } + ], + "source": [ + "dhist" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "contents = !ls" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['deep_convnet.py', 'deep_convnet_large.py']\n" + ] + } + ], + "source": [ + "print(contents[:2])" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['deep_convnet.py', 'deep_convnet_large.py', 'deeplink', 'realtime_deepnet.py', 'train_deepnet.py']\n" + ] + } + ], + "source": [ + "print(contents)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "print(type(contents))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "path = !cd" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + } + ], + "source": [ + "print(path)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/Users/do-hyungkwon/GoogleDrive/deeplink/5.DoHyung/raspberrypi4'" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "message = \"hello from Python\"" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello from Python\r\n" + ] + } + ], + "source": [ + "!echo {message}" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TERM_PROGRAM=Apple_Terminal\r\n", + "VIRTUALENVWRAPPER_PROJECT_FILENAME=.project\r\n", + "VIRTUALENVWRAPPER_SCRIPT=/usr/local/bin/virtualenvwrapper.sh\r\n", + "rvm_bin_path=/Users/do-hyungkwon/.rvm/bin\r\n", + "GEM_HOME=/Users/do-hyungkwon/.rvm/gems/ruby-2.2.0\r\n", + "SHELL=/bin/bash\r\n", + "TERM=xterm-color\r\n", + "CLICOLOR=1\r\n", + "TMPDIR=/var/folders/v5/h58bg81s0jx2y4hqbgk_dgw40000gn/T/\r\n", + "IRBRC=/Users/do-hyungkwon/.rvm/rubies/ruby-2.2.0/.irbrc\r\n", + "Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.mBPj2NVg19/Render\r\n", + "TERM_PROGRAM_VERSION=388.1.1\r\n", + "TERM_SESSION_ID=7B5A326D-51E5-452E-A071-495CE7E7FF42\r\n", + "MY_RUBY_HOME=/Users/do-hyungkwon/.rvm/rubies/ruby-2.2.0\r\n", + "USER=do-hyungkwon\r\n", + "_system_type=Darwin\r\n", + "rvm_path=/Users/do-hyungkwon/.rvm\r\n", + "SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.JHJriDNVjz/Listeners\r\n", + "__CF_USER_TEXT_ENCODING=0x1F5:0x3:0x33\r\n", + "JPY_PARENT_PID=96449\r\n", + "PAGER=cat\r\n", + "WORKON_HOME=/Users/do-hyungkwon/.virtualenvs\r\n", + "rvm_prefix=/Users/do-hyungkwon\r\n", + "PATH=/Users/do-hyungkwon/anaconda/bin:/Users/do-hyungkwon/.rvm/gems/ruby-2.2.0/bin:/Users/do-hyungkwon/.rvm/gems/ruby-2.2.0@global/bin:/Users/do-hyungkwon/.rvm/rubies/ruby-2.2.0/bin:/Users/do-hyungkwon/anaconda/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/do-hyungkwon/.rvm/bin\r\n", + "_=/usr/bin/env\r\n", + "VIRTUALENVWRAPPER_HOOK_DIR=/Users/do-hyungkwon/.virtualenvs\r\n", + "PWD=/Users/do-hyungkwon/GoogleDrive/deeplink/5.DoHyung/raspberrypi4\r\n", + "MPLBACKEND=module://ipykernel.pylab.backend_inline\r\n", + "LANG=ko_KR.UTF-8\r\n", + "XPC_FLAGS=0x0\r\n", + "_system_arch=x86_64\r\n", + "_system_version=10.12\r\n", + "XPC_SERVICE_NAME=0\r\n", + "rvm_version=1.29.2 (latest)\r\n", + "SHLVL=2\r\n", + "HOME=/Users/do-hyungkwon\r\n", + "LOGNAME=do-hyungkwon\r\n", + "GEM_PATH=/Users/do-hyungkwon/.rvm/gems/ruby-2.2.0:/Users/do-hyungkwon/.rvm/gems/ruby-2.2.0@global\r\n", + "VIRTUALENVWRAPPER_WORKON_CD=1\r\n", + "GIT_PAGER=cat\r\n", + "SECURITYSESSIONID=186a7\r\n", + "RUBY_VERSION=ruby-2.2.0\r\n", + "_system_name=OSX\r\n" + ] + } + ], + "source": [ + "!env" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2017-09-01 11:24:20-- https://raw.githubusercontent.com/ipython-books/minbook-2nd-data/master/nyc_taxi.zip\n", + "Resolving raw.githubusercontent.com... 151.101.72.133\n", + "Connecting to raw.githubusercontent.com|151.101.72.133|:443... connected.\n", + "HTTP request sent, awaiting response... 404 Not Found\n", + "2017-09-01 11:24:20 ERROR 404: Not Found.\n", + "\n" + ] + } + ], + "source": [ + "!wget https://raw.githubusercontent.com/ipython-books/minbook-2nd-data/master/nyc_taxi.zip" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Password:\n" + ] + } + ], + "source": [ + "!sudo apt-get install wget" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "\n", + "True\n" + ] + } + ], + "source": [ + "a = int(1)\n", + "\n", + "print(a)\n", + "print(type(a))\n", + "print(isinstance(a, int))" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lt = [1, 's', ['b', 'c']]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4437881032 \n" + ] + } + ], + "source": [ + "print(id(lt), type(lt))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4395628544 \n" + ] + } + ], + "source": [ + "print(id(lt[0]), type(lt[0]))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4398017312 \n" + ] + } + ], + "source": [ + "print(id(lt[1]), type(lt[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import array" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "L = list(range(10))\n", + "A = array.array('i', L)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])\n" + ] + } + ], + "source": [ + "print(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "print(type(A))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i\n" + ] + } + ], + "source": [ + "print(A.typecode)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n" + ] + } + ], + "source": [ + "print(A.tolist())" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "list" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(A.tolist())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python03.ipynb b/python03.ipynb index 57fc7e4..6789461 100644 --- a/python03.ipynb +++ b/python03.ipynb @@ -1,732 +1,704 @@ { - "metadata": { - "name": "", - "signature": "sha256:d2b18d2f5552e66fe8f48d6e54a9f87d03ee81aa1915bdaf92fe23d868aca4fc" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 3. \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc758 \uae30\ucd08\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \uc218\uce58 \uc790\ub8cc\ud615\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \uc815\uc218\ud615 \uc0c1\uc218" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 3. 내장 자료형의 기초\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 수치 자료형\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 정수형 상수" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \n", + "23 19 35\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 23 # 10\uc9c4 \uc815\uc218\n", - "b = 023 # 8\uc9c4 \uc815\uc218\n", - "c = 0x23 # 16\uc9c4 \uc815\uc218\n", - "print type(a), type(b), type(c)\n", - "print a, b, c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " \n", - "23 19 35\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import sys\n", - "print sys.maxint # \ucd5c\ub300 \uc815\uc218 \uac12 \ud655\uc778" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9223372036854775807\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \uc2e4\uc218\ud615 \uc0c1\uc218" + } + ], + "source": [ + "a = 23 # 10진 정수\n", + "b = 023 # 8진 정수\n", + "c = 0x23 # 16진 정수\n", + "print type(a), type(b), type(c)\n", + "print a, b, c" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9223372036854775807\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 1.2\n", - "b = 3.5e3\n", - "c = -0.2e-4\n", - "print type(a), type(b), type(c)\n", - "print a, b, c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " \n", - "1.2 3500.0 -2e-05\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ub871\ud615 \uc0c1\uc218\n", - "- \uba54\ubaa8\ub9ac\uac00 \ud5c8\uc6a9\ud558\ub294 \ud55c \uc720\ud6a8\uc790\ub9ac\uc218\ub294 \ubb34\ud55c\ub300" + } + ], + "source": [ + "import sys\n", + "print sys.maxint # 최대 정수 값 확인" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 실수형 상수" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \n", + "1.2 3500.0 -2e-05\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "h1 = 123456789012345678901234567890L # \ub9c8\uc9c0\ub9c9\uc5d0 L\uc744 \ubd99\uc5ec\uc11c \uba85\uc2dc\uc801\uc73c\ub85c long \ud615\uc774\ub77c\uace0 \uc54c\ub824\ub3c4 \ub418\uace0\n", - "print type(h1)\n", - "print h1 * h1\n", - "print\n", - "\n", - "h2 = 123456789012345678901234567890 # L\uc744 \ubd99\uc774\uc9c0 \uc54a\uc544\ub3c4 int\ud615\uc774 \ub2f4\uc744 \uc218 \uc788\ub294 \uc218\uce58\ub97c \ucd08\uacfc\ud558\uba74 \uc790\ub3d9\uc73c\ub85c long\ud615\uc774 \ub41c\ub2e4. \n", - "print type(h2)\n", - "print h2 * h2\n", - "print\n", + } + ], + "source": [ + "a = 1.2\n", + "b = 3.5e3\n", + "c = -0.2e-4\n", + "print type(a), type(b), type(c)\n", + "print a, b, c" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 롱형 상수\n", + "- 메모리가 허용하는 한 유효자리수는 무한대" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "15241578753238836750495351562536198787501905199875019052100\n", "\n", - "h3 = 123L\n", - "print type(h3)\n", - "print\n", + "\n", + "15241578753238836750495351562536198787501905199875019052100\n", "\n", - "h4 = 123\n", - "print type(h4)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "15241578753238836750495351562536198787501905199875019052100\n", - "\n", - "\n", - "15241578753238836750495351562536198787501905199875019052100\n", - "\n", - "\n", - "\n", - "\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "123456789012345678890 # \uc790\ub3d9 long\ud615 \ubcc0\ud658" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 15, - "text": [ - "123456789012345678890L" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ubcf5\uc18c\uc218\ud615 \uc0c1\uc218" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10 + 20j\n", - "print a\n", + "\n", "\n", - "b = 10 + 5j\n", - "print a + b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "(10+20j)\n", - "(20+25j)\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-5 \uc218\uce58 \uc790\ub8cc\ud615\uc758 \uce58\ud658\n", - "- \uc544\ub798 \uc608\uc5d0\uc11c\ub294 x\uac00 \uc9c0\ub2c8\uace0 \uc788\ub294 1\uc758 \uac12\uc774 \ubcc0\uacbd\ub418\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uc0c8\ub85c\uc6b4 \uac1d\uccb4 2\ub85c \ub808\ud37c\ub7f0\uc2a4\ub97c \ubcc0\uacbd\ud558\ub294 \uac83\uc784" + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = 1\n", - "x = 2" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 18 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image1](images/referenceChangeNumerical.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-6 \uc218\uce58 \uc5f0\uc0b0\uacfc \uad00\ub828\ub41c \ub0b4\uc7a5 \ud568\uc218" + } + ], + "source": [ + "h1 = 123456789012345678901234567890L # 마지막에 L을 붙여서 명시적으로 long 형이라고 알려도 되고\n", + "print type(h1)\n", + "print h1 * h1\n", + "print\n", + "\n", + "h2 = 123456789012345678901234567890 # L을 붙이지 않아도 int형이 담을 수 있는 수치를 초과하면 자동으로 long형이 된다. \n", + "print type(h2)\n", + "print h2 * h2\n", + "print\n", + "\n", + "h3 = 123L\n", + "print type(h3)\n", + "print\n", + "\n", + "h4 = 123\n", + "print type(h4)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "123456789012345678890L" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "123456789012345678890 # 자동 long형 변환" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 복소수형 상수" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(10+20j)\n", + "(20+25j)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print abs(-3)\n", - "print int(3.141592)\n", - "print int(-3.1415)\n", - "print long(3)\n", - "print float(5)\n", - "print complex(3.4, 5)\n", - "print complex(6)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3\n", - "3\n", - "-3\n", - "3\n", - "5.0\n", - "(3.4+5j)\n", - "(6+0j)\n" - ] - } - ], - "prompt_number": 105 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print divmod(5, 2)\n", - "print\n", - "print pow(2, 3)\n", - "print pow(2.3, 3.5)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "(2, 1)\n", - "\n", - "8\n", - "18.4521691056\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-7 math \ubaa8\ub4c8\uc758 \uc218\uce58 \uc5f0\uc0b0 \ud568\uc218" + } + ], + "source": [ + "a = 10 + 20j\n", + "print a\n", + "\n", + "b = 10 + 5j\n", + "print a + b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 수치 자료형의 치환\n", + "- 아래 예에서는 x가 지니고 있는 1의 값이 변경되는 것이 아니라 새로운 객체 2로 레퍼런스를 변경하는 것임" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "x = 1\n", + "x = 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image1](images/referenceChangeNumerical.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-6 수치 연산과 관련된 내장 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "3\n", + "-3\n", + "3\n", + "5.0\n", + "(3.4+5j)\n", + "(6+0j)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import math\n", - "\n", - "print math.pi\n", - "print math.e\n", - "print math.sin(1.0) # 1.0 \ub77c\ub514\uc548\uc5d0 \ub300\ud55c \uc0ac\uc778 \uac12\n", - "print math.sqrt(2) # \uc81c\uacf1\uadfc" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3.14159265359\n", - "2.71828182846\n", - "0.841470984808\n", - "1.41421356237\n" - ] - } - ], - "prompt_number": 109 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "r = 5.0 # \ubc18\uc9c0\ub984\n", - "a = math.pi * r * r # \uba74\uc801\n", + } + ], + "source": [ + "print abs(-3)\n", + "print int(3.141592)\n", + "print int(-3.1415)\n", + "print long(3)\n", + "print float(5)\n", + "print complex(3.4, 5)\n", + "print complex(6)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(2, 1)\n", "\n", - "degree = 60.0\n", - "rad = math.pi * degree / 180.0 # \uac01\ub3c4\ub97c \ub77c\ub514\uc548\uc73c\ub85c \ubcc0\ud658\n", - "print math.sin(rad), math.cos(rad), math.tan(rad) #sin, cos, tan" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0.866025403784 0.5 1.73205080757\n" - ] - } - ], - "prompt_number": 111 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ubb38\uc790\uc5f4\n", - "***" + "8\n", + "18.4521691056\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ubb38\uc790\uc5f4 \ud615\uc2dd" + } + ], + "source": [ + "print divmod(5, 2)\n", + "print\n", + "print pow(2, 3)\n", + "print pow(2.3, 3.5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-7 math 모듈의 수치 연산 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.14159265359\n", + "2.71828182846\n", + "0.841470984808\n", + "1.41421356237\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud55c \uc904 \ubb38\uc790\uc5f4 \ud615\uc2dd\n", - " - \ub2e8\uc77c \ub530\uc634\ud45c\n", - " - \uc774\uc911 \ub530\uc634\ud45c" + } + ], + "source": [ + "import math\n", + "\n", + "print math.pi\n", + "print math.e\n", + "print math.sin(1.0) # 1.0 라디안에 대한 사인 값\n", + "print math.sqrt(2) # 제곱근" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.866025403784 0.5 1.73205080757\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 'Hello World!'\n", - "\n", - "print \"Hello World!\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Hello World!\n", - "Hello World!\n" - ] - } - ], - "prompt_number": 81 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc5ec\ub7ec \uc904 \ubb38\uc790\uc5f4 \ud615\uc2dd\n", - " - \uc5f0\uc18d\ub41c \ub2e8\uc77c \ub530\uc634\ud45c \uc138 \uac1c\n", - " - \uc5f0\uc18d\ub41c \uc774\uc911 \ub530\uc634\ud45c \uc138 \uac1c" + } + ], + "source": [ + "r = 5.0 # 반지름\n", + "a = math.pi * r * r # 면적\n", + "\n", + "degree = 60.0\n", + "rad = math.pi * degree / 180.0 # 각도를 라디안으로 변환\n", + "print math.sin(rad), math.cos(rad), math.tan(rad) #sin, cos, tan" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 문자열\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 문자열 형식" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 한 줄 문자열 형식\n", + " - 단일 따옴표\n", + " - 이중 따옴표" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello World!\n", + "Hello World!\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "multiline = '''\n", + } + ], + "source": [ + "print 'Hello World!'\n", + "\n", + "print \"Hello World!\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 여러 줄 문자열 형식\n", + " - 연속된 단일 따옴표 세 개\n", + " - 연속된 이중 따옴표 세 개" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", "To be, or not to be\n", "that is the question\n", - "'''\n", - "print multiline\n", "\n", - "multiline2 = \"\"\"\n", + "\n", "To be, or not to be\n", "that is the question\n", - "\"\"\"\n", - "print multiline2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "To be, or not to be\n", - "that is the question\n", - "\n", - "\n", - "To be, or not to be\n", - "that is the question\n", - "\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \uc778\ub371\uc2f1(Indexing)\uacfc \uc2ac\ub77c\uc774\uc2f1(Slicing)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- Indexing" + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = \"Hello world!\"\n", - "print s[0]\n", - "print s[1]\n", - "print s[-1]\n", - "print s[-2]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "H\n", - "e\n", - "!\n", - "d\n" - ] - } - ], - "prompt_number": 82 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- Slicing\n", - " - \ud615\uc2dd: [start(included) : stop(excluded) : step]\n", - " - \uae30\ubcf8\uac12: start - 0, stop - \uc790\ub8cc\ud615\uc758 \ud06c\uae30, step - 1" + } + ], + "source": [ + "multiline = '''\n", + "To be, or not to be\n", + "that is the question\n", + "'''\n", + "print multiline\n", + "\n", + "multiline2 = \"\"\"\n", + "To be, or not to be\n", + "that is the question\n", + "\"\"\"\n", + "print multiline2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 인덱싱(Indexing)과 슬라이싱(Slicing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Indexing" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "H\n", + "e\n", + "!\n", + "d\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = \"Hello world!\"\n", - "print s[1:3]\n", - "print s[0:5]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "el\n", - "Hello\n" - ] - } - ], - "prompt_number": 83 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'Hello'\n", - "print s[1:]\n", - "print s[:3]\n", - "print s[:]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ello\n", - "Hel\n", - "Hello\n" - ] - } - ], - "prompt_number": 85 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'abcd'\n", - "print s[::2]\n", - "print s[::-1]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ac\n", - "dcba\n" - ] - } - ], - "prompt_number": 86 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubb38\uc790\uc5f4 \uc790\ub8cc\ud615\uc740 \ubcc0\uacbd\ub418\uc9c0 \uc54a\ub294\ub2e4." + } + ], + "source": [ + "s = \"Hello world!\"\n", + "print s[0]\n", + "print s[1]\n", + "print s[-1]\n", + "print s[-2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Slicing\n", + " - 형식: [start(included) : stop(excluded) : step]\n", + " - 기본값: start - 0, stop - 자료형의 크기, step - 1" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "el\n", + "Hello\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'Hello World'\n", - "s[0] = 'h'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'str' object does not support item assignment", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'Hello World'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'h'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" - ] - } - ], - "prompt_number": 88 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubb38\uc790\uc5f4\uc744 \ubcc0\uacbd\ud558\ub824\uba74 Slicing \ubc0f \uc5f0\uacb0 \uc5f0\uc0b0 (+)\uc744 \uc8fc\ub85c \uc774\uc6a9\ud55c\ub2e4." + } + ], + "source": [ + "s = \"Hello world!\"\n", + "print s[1:3]\n", + "print s[0:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ello\n", + "Hel\n", + "Hello\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'Hello World'\n", - "s = 'h' + s[1:]\n", - "s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 9, - "text": [ - "'hello World'" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \ubb38\uc790\uc5f4 \uc5f0\uc0b0\n", - "- +: \uc5f0\uacb0\n", - "- *: \ubc18\ubcf5" + } + ], + "source": [ + "s = 'Hello'\n", + "print s[1:]\n", + "print s[:3]\n", + "print s[:]" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ac\n", + "dcba\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 'Hello' + '' + 'World'\n", - "print 'Hello' * 3\n", - "print '-' * 60" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "HelloWorld\n", - "HelloHelloHello\n", - "------------------------------------------------------------\n" - ] - } - ], - "prompt_number": 87 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-4 \ubb38\uc790\uc5f4\uc758 \uae38\uc774\n", - "- len(): \ubb38\uc790\uc5f4\uc758 \uae38\uc774\ub97c \ubc18\ud658\ud558\ub294 \ub0b4\uc7a5\ud568\uc218" + } + ], + "source": [ + "s = 'abcd'\n", + "print s[::2]\n", + "print s[::-1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열 자료형은 변경되지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'str' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'Hello World'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'h'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'Hello World'\n", - "len(s)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 90, - "text": [ - "11" - ] - } - ], - "prompt_number": 90 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-5 \ubb38\uc790\uc5f4\ub0b4 \ud3ec\ud568 \uad00\uacc4 \uc5ec\ubd80\n", - "- in, not in: \ubb38\uc790\uc5f4\ub0b4\uc5d0 \uc77c\ubd80 \ubb38\uc790\uc5f4\uc774 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uc9c0\ub97c \ud30c\uc545\ud558\ub294 \ud0a4\uc6cc\ub4dc" + } + ], + "source": [ + "s = 'Hello World'\n", + "s[0] = 'h'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열을 변경하려면 Slicing 및 연결 연산 (+)을 주로 이용한다." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'hello World'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = 'Hello World'\n", + "s = 'h' + s[1:]\n", + "s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 문자열 연산\n", + "- +: 연결\n", + "- *: 반복" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HelloWorld\n", + "HelloHelloHello\n", + "------------------------------------------------------------\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'Hello World'\n", - "print 'World' in s\n", - "print 'World' not in s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "False\n" - ] - } - ], - "prompt_number": 92 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "print 'Hello' + '' + 'World'\n", + "print 'Hello' * 3\n", + "print '-' * 60" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 문자열의 길이\n", + "- len(): 문자열의 길이를 반환하는 내장함수" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = 'Hello World'\n", + "len(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-5 문자열내 포함 관계 여부\n", + "- in, not in: 문자열내에 일부 문자열이 포함되어 있는지를 파악하는 키워드" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n" ] } ], - "metadata": {} + "source": [ + "s = 'Hello World'\n", + "print 'World' in s\n", + "print 'World' not in s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python03.ipynb b/python3.6/python03.ipynb index 57fc7e4..6c71de2 100644 --- a/python3.6/python03.ipynb +++ b/python3.6/python03.ipynb @@ -1,732 +1,728 @@ { - "metadata": { - "name": "", - "signature": "sha256:d2b18d2f5552e66fe8f48d6e54a9f87d03ee81aa1915bdaf92fe23d868aca4fc" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 3. \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc758 \uae30\ucd08\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \uc218\uce58 \uc790\ub8cc\ud615\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \uc815\uc218\ud615 \uc0c1\uc218" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 3. 내장 자료형의 기초\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 수치 자료형\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 정수형 상수" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \n", + "23 19 35\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 23 # 10\uc9c4 \uc815\uc218\n", - "b = 023 # 8\uc9c4 \uc815\uc218\n", - "c = 0x23 # 16\uc9c4 \uc815\uc218\n", - "print type(a), type(b), type(c)\n", - "print a, b, c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " \n", - "23 19 35\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import sys\n", - "print sys.maxint # \ucd5c\ub300 \uc815\uc218 \uac12 \ud655\uc778" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9223372036854775807\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \uc2e4\uc218\ud615 \uc0c1\uc218" + } + ], + "source": [ + "a = 23 # 10진 정수\n", + "# b = 023 \n", + "b = 0o23 # 8진 정수\n", + "c = 0x23 # 16진 정수\n", + "print(type(a), type(b), type(c))\n", + "print(a, b, c)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9223372036854775807\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 1.2\n", - "b = 3.5e3\n", - "c = -0.2e-4\n", - "print type(a), type(b), type(c)\n", - "print a, b, c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " \n", - "1.2 3500.0 -2e-05\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ub871\ud615 \uc0c1\uc218\n", - "- \uba54\ubaa8\ub9ac\uac00 \ud5c8\uc6a9\ud558\ub294 \ud55c \uc720\ud6a8\uc790\ub9ac\uc218\ub294 \ubb34\ud55c\ub300" + } + ], + "source": [ + "import sys\n", + "# print sys.maxint \n", + "print(sys.maxsize) # 최대 정수 값 확인" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 실수형 상수" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \n", + "1.2 3500.0 -2e-05\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "h1 = 123456789012345678901234567890L # \ub9c8\uc9c0\ub9c9\uc5d0 L\uc744 \ubd99\uc5ec\uc11c \uba85\uc2dc\uc801\uc73c\ub85c long \ud615\uc774\ub77c\uace0 \uc54c\ub824\ub3c4 \ub418\uace0\n", - "print type(h1)\n", - "print h1 * h1\n", - "print\n", - "\n", - "h2 = 123456789012345678901234567890 # L\uc744 \ubd99\uc774\uc9c0 \uc54a\uc544\ub3c4 int\ud615\uc774 \ub2f4\uc744 \uc218 \uc788\ub294 \uc218\uce58\ub97c \ucd08\uacfc\ud558\uba74 \uc790\ub3d9\uc73c\ub85c long\ud615\uc774 \ub41c\ub2e4. \n", - "print type(h2)\n", - "print h2 * h2\n", - "print\n", + } + ], + "source": [ + "a = 1.2\n", + "b = 3.5e3\n", + "c = -0.2e-4\n", + "print(type(a), type(b), type(c))\n", + "print(a, b, c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 롱형 상수\n", + "- 메모리가 허용하는 한 유효자리수는 무한대" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "참고: http://www.diveintopython3.net/porting-code-to-python-3-with-2to3.html" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "15241578753238836750495351562536198787501905199875019052100\n", "\n", - "h3 = 123L\n", - "print type(h3)\n", - "print\n", + "\n", + "15241578753238836750495351562536198787501905199875019052100\n", "\n", - "h4 = 123\n", - "print type(h4)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "15241578753238836750495351562536198787501905199875019052100\n", - "\n", - "\n", - "15241578753238836750495351562536198787501905199875019052100\n", - "\n", - "\n", - "\n", - "\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "123456789012345678890 # \uc790\ub3d9 long\ud615 \ubcc0\ud658" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 15, - "text": [ - "123456789012345678890L" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ubcf5\uc18c\uc218\ud615 \uc0c1\uc218" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10 + 20j\n", - "print a\n", + "\n", "\n", - "b = 10 + 5j\n", - "print a + b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "(10+20j)\n", - "(20+25j)\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-5 \uc218\uce58 \uc790\ub8cc\ud615\uc758 \uce58\ud658\n", - "- \uc544\ub798 \uc608\uc5d0\uc11c\ub294 x\uac00 \uc9c0\ub2c8\uace0 \uc788\ub294 1\uc758 \uac12\uc774 \ubcc0\uacbd\ub418\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uc0c8\ub85c\uc6b4 \uac1d\uccb4 2\ub85c \ub808\ud37c\ub7f0\uc2a4\ub97c \ubcc0\uacbd\ud558\ub294 \uac83\uc784" + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = 1\n", - "x = 2" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 18 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image1](images/referenceChangeNumerical.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-6 \uc218\uce58 \uc5f0\uc0b0\uacfc \uad00\ub828\ub41c \ub0b4\uc7a5 \ud568\uc218" + } + ], + "source": [ + "h1 = 123456789012345678901234567890 # 마지막에 L을 붙여서 명시적으로 long 형이라고 알려도 되고\n", + "print(type(h1))\n", + "print(h1 * h1)\n", + "print()\n", + "\n", + "h2 = 123456789012345678901234567890 # L을 붙이지 않아도 int형이 담을 수 있는 수치를 초과하면 자동으로 long형이 된다. \n", + "print(type(h2))\n", + "print(h2 * h2)\n", + "print()\n", + "\n", + "h3 = 123\n", + "print(type(h3))\n", + "print()\n", + "\n", + "h4 = 123\n", + "print(type(h4))\n", + "#In Python 3, the old long() function no longer exists" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "123456789012345678890" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "123456789012345678890 # 자동 long형 변환" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 복소수형 상수" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(10+20j)\n", + "(20+25j)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print abs(-3)\n", - "print int(3.141592)\n", - "print int(-3.1415)\n", - "print long(3)\n", - "print float(5)\n", - "print complex(3.4, 5)\n", - "print complex(6)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3\n", - "3\n", - "-3\n", - "3\n", - "5.0\n", - "(3.4+5j)\n", - "(6+0j)\n" - ] - } - ], - "prompt_number": 105 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print divmod(5, 2)\n", - "print\n", - "print pow(2, 3)\n", - "print pow(2.3, 3.5)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "(2, 1)\n", - "\n", - "8\n", - "18.4521691056\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-7 math \ubaa8\ub4c8\uc758 \uc218\uce58 \uc5f0\uc0b0 \ud568\uc218" + } + ], + "source": [ + "a = 10 + 20j\n", + "print(a)\n", + "\n", + "b = 10 + 5j\n", + "print(a + b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 수치 자료형의 치환\n", + "- 아래 예에서는 x가 지니고 있는 1의 값이 변경되는 것이 아니라 새로운 객체 2로 레퍼런스를 변경하는 것임" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x = 1\n", + "x = 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image1](../images/referenceChangeNumerical.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-6 수치 연산과 관련된 내장 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "3\n", + "-3\n", + "3\n", + "5.0\n", + "(3.4+5j)\n", + "(6+0j)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import math\n", - "\n", - "print math.pi\n", - "print math.e\n", - "print math.sin(1.0) # 1.0 \ub77c\ub514\uc548\uc5d0 \ub300\ud55c \uc0ac\uc778 \uac12\n", - "print math.sqrt(2) # \uc81c\uacf1\uadfc" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3.14159265359\n", - "2.71828182846\n", - "0.841470984808\n", - "1.41421356237\n" - ] - } - ], - "prompt_number": 109 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "r = 5.0 # \ubc18\uc9c0\ub984\n", - "a = math.pi * r * r # \uba74\uc801\n", + } + ], + "source": [ + "print(abs(-3))\n", + "print(int(3.141592))\n", + "print(int(-3.1415))\n", + "# print long(3)\n", + "print(int(3)) \n", + "# Essentially, long renamed to int.\n", + "# https://goo.gl/ZdvyuL\n", + "print(float(5))\n", + "print(complex(3.4, 5))\n", + "print(complex(6))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(2, 1)\n", "\n", - "degree = 60.0\n", - "rad = math.pi * degree / 180.0 # \uac01\ub3c4\ub97c \ub77c\ub514\uc548\uc73c\ub85c \ubcc0\ud658\n", - "print math.sin(rad), math.cos(rad), math.tan(rad) #sin, cos, tan" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0.866025403784 0.5 1.73205080757\n" - ] - } - ], - "prompt_number": 111 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ubb38\uc790\uc5f4\n", - "***" + "8\n", + "18.45216910555504\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ubb38\uc790\uc5f4 \ud615\uc2dd" + } + ], + "source": [ + "print(divmod(5, 2))\n", + "print()\n", + "print(pow(2, 3))\n", + "print(pow(2.3, 3.5))\n", + "# 18.4521691056\n", + "# 10자리 표현 -> 14자리 표현 가능" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-7 math 모듈의 수치 연산 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.141592653589793\n", + "2.718281828459045\n", + "0.8414709848078965\n", + "1.4142135623730951\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud55c \uc904 \ubb38\uc790\uc5f4 \ud615\uc2dd\n", - " - \ub2e8\uc77c \ub530\uc634\ud45c\n", - " - \uc774\uc911 \ub530\uc634\ud45c" + } + ], + "source": [ + "import math\n", + "\n", + "print(math.pi)\n", + "print(math.e)\n", + "print(math.sin(1.0)) # 1.0 라디안에 대한 사인 값\n", + "print(math.sqrt(2)) # 제곱근\n", + "\n", + "# 3.14159265359\n", + "# 2.71828182846\n", + "# 0.841470984808\n", + "# 1.41421356237" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.8660254037844386 0.5000000000000001 1.7320508075688767\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 'Hello World!'\n", - "\n", - "print \"Hello World!\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Hello World!\n", - "Hello World!\n" - ] - } - ], - "prompt_number": 81 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc5ec\ub7ec \uc904 \ubb38\uc790\uc5f4 \ud615\uc2dd\n", - " - \uc5f0\uc18d\ub41c \ub2e8\uc77c \ub530\uc634\ud45c \uc138 \uac1c\n", - " - \uc5f0\uc18d\ub41c \uc774\uc911 \ub530\uc634\ud45c \uc138 \uac1c" + } + ], + "source": [ + "r = 5.0 # 반지름\n", + "a = math.pi * r * r # 면적\n", + "\n", + "degree = 60.0\n", + "rad = math.pi * degree / 180.0 # 각도를 라디안으로 변환\n", + "print(math.sin(rad), math.cos(rad), math.tan(rad)) #sin, cos, tan)\n", + "# 0.866025403784 0.5 1.73205080757" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 문자열\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 문자열 형식" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 한 줄 문자열 형식\n", + " - 단일 따옴표\n", + " - 이중 따옴표" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello World!\n", + "Hello World!\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "multiline = '''\n", + } + ], + "source": [ + "print('Hello World!')\n", + "\n", + "print(\"Hello World!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 여러 줄 문자열 형식\n", + " - 연속된 단일 따옴표 세 개\n", + " - 연속된 이중 따옴표 세 개" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", "To be, or not to be\n", "that is the question\n", - "'''\n", - "print multiline\n", "\n", - "multiline2 = \"\"\"\n", + "\n", "To be, or not to be\n", "that is the question\n", - "\"\"\"\n", - "print multiline2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "To be, or not to be\n", - "that is the question\n", - "\n", - "\n", - "To be, or not to be\n", - "that is the question\n", - "\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \uc778\ub371\uc2f1(Indexing)\uacfc \uc2ac\ub77c\uc774\uc2f1(Slicing)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- Indexing" + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = \"Hello world!\"\n", - "print s[0]\n", - "print s[1]\n", - "print s[-1]\n", - "print s[-2]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "H\n", - "e\n", - "!\n", - "d\n" - ] - } - ], - "prompt_number": 82 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- Slicing\n", - " - \ud615\uc2dd: [start(included) : stop(excluded) : step]\n", - " - \uae30\ubcf8\uac12: start - 0, stop - \uc790\ub8cc\ud615\uc758 \ud06c\uae30, step - 1" + } + ], + "source": [ + "multiline = '''\n", + "To be, or not to be\n", + "that is the question\n", + "'''\n", + "print(multiline)\n", + "\n", + "multiline2 = \"\"\"\n", + "To be, or not to be\n", + "that is the question\n", + "\"\"\"\n", + "print(multiline2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 인덱싱(Indexing)과 슬라이싱(Slicing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Indexing" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "H\n", + "e\n", + "!\n", + "d\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = \"Hello world!\"\n", - "print s[1:3]\n", - "print s[0:5]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "el\n", - "Hello\n" - ] - } - ], - "prompt_number": 83 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'Hello'\n", - "print s[1:]\n", - "print s[:3]\n", - "print s[:]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ello\n", - "Hel\n", - "Hello\n" - ] - } - ], - "prompt_number": 85 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'abcd'\n", - "print s[::2]\n", - "print s[::-1]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ac\n", - "dcba\n" - ] - } - ], - "prompt_number": 86 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubb38\uc790\uc5f4 \uc790\ub8cc\ud615\uc740 \ubcc0\uacbd\ub418\uc9c0 \uc54a\ub294\ub2e4." + } + ], + "source": [ + "s = \"Hello world!\"\n", + "print(s[0])\n", + "print(s[1])\n", + "print(s[-1])\n", + "print(s[-2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Slicing\n", + " - 형식: [start(included) : stop(excluded) : step]\n", + " - 기본값: start - 0, stop - 자료형의 크기, step - 1" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "el\n", + "Hello\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'Hello World'\n", - "s[0] = 'h'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'str' object does not support item assignment", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'Hello World'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'h'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" - ] - } - ], - "prompt_number": 88 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubb38\uc790\uc5f4\uc744 \ubcc0\uacbd\ud558\ub824\uba74 Slicing \ubc0f \uc5f0\uacb0 \uc5f0\uc0b0 (+)\uc744 \uc8fc\ub85c \uc774\uc6a9\ud55c\ub2e4." + } + ], + "source": [ + "s = \"Hello world!\"\n", + "print(s[1:3])\n", + "print(s[0:5])" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ello\n", + "Hel\n", + "Hello\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'Hello World'\n", - "s = 'h' + s[1:]\n", - "s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 9, - "text": [ - "'hello World'" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \ubb38\uc790\uc5f4 \uc5f0\uc0b0\n", - "- +: \uc5f0\uacb0\n", - "- *: \ubc18\ubcf5" + } + ], + "source": [ + "s = 'Hello'\n", + "print(s[1:])\n", + "print(s[:3])\n", + "print(s[:])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ac\n", + "dcba\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 'Hello' + '' + 'World'\n", - "print 'Hello' * 3\n", - "print '-' * 60" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "HelloWorld\n", - "HelloHelloHello\n", - "------------------------------------------------------------\n" - ] - } - ], - "prompt_number": 87 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-4 \ubb38\uc790\uc5f4\uc758 \uae38\uc774\n", - "- len(): \ubb38\uc790\uc5f4\uc758 \uae38\uc774\ub97c \ubc18\ud658\ud558\ub294 \ub0b4\uc7a5\ud568\uc218" + } + ], + "source": [ + "s = 'abcd'\n", + "print(s[::2])\n", + "print(s[::-1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열 자료형은 변경되지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'str' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'Hello World'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'h'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'Hello World'\n", - "len(s)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 90, - "text": [ - "11" - ] - } - ], - "prompt_number": 90 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-5 \ubb38\uc790\uc5f4\ub0b4 \ud3ec\ud568 \uad00\uacc4 \uc5ec\ubd80\n", - "- in, not in: \ubb38\uc790\uc5f4\ub0b4\uc5d0 \uc77c\ubd80 \ubb38\uc790\uc5f4\uc774 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uc9c0\ub97c \ud30c\uc545\ud558\ub294 \ud0a4\uc6cc\ub4dc" + } + ], + "source": [ + "s = 'Hello World'\n", + "s[0] = 'h'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열을 변경하려면 Slicing 및 연결 연산 (+)을 주로 이용한다." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'hello World'" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = 'Hello World'\n", + "s = 'h' + s[1:]\n", + "s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 문자열 연산\n", + "- +: 연결\n", + "- *: 반복" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HelloWorld\n", + "HelloHelloHello\n", + "------------------------------------------------------------\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = 'Hello World'\n", - "print 'World' in s\n", - "print 'World' not in s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "False\n" - ] - } - ], - "prompt_number": 92 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "print('Hello' + '' + 'World')\n", + "print('Hello' * 3)\n", + "print('-' * 60)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 문자열의 길이\n", + "- len(): 문자열의 길이를 반환하는 내장함수" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = 'Hello World'\n", + "len(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-5 문자열내 포함 관계 여부\n", + "- in, not in: 문자열내에 일부 문자열이 포함되어 있는지를 파악하는 키워드" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n" ] } ], - "metadata": {} + "source": [ + "s = 'Hello World'\n", + "print('World' in s)\n", + "print('World' not in s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git "a/\353\262\224\354\235\264\354\235\230 \353\215\260\354\235\264\355\204\260 \354\225\204\355\202\244\355\205\215\354\262\230 -- [Python] [\352\260\234\353\205\220\354\235\204 \354\236\241\354\225\204\354\243\274\353\212\224 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215 \354\240\225\354\204\235] 4.8 \354\227\260\354\212\265\353\254\270\354\240\234.webloc" "b/\353\262\224\354\235\264\354\235\230 \353\215\260\354\235\264\355\204\260 \354\225\204\355\202\244\355\205\215\354\262\230 -- [Python] [\352\260\234\353\205\220\354\235\204 \354\236\241\354\225\204\354\243\274\353\212\224 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215 \354\240\225\354\204\235] 4.8 \354\227\260\354\212\265\353\254\270\354\240\234.webloc" new file mode 100644 index 0000000..b02910d --- /dev/null +++ "b/\353\262\224\354\235\264\354\235\230 \353\215\260\354\235\264\355\204\260 \354\225\204\355\202\244\355\205\215\354\262\230 -- [Python] [\352\260\234\353\205\220\354\235\204 \354\236\241\354\225\204\354\243\274\353\212\224 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215 \354\240\225\354\204\235] 4.8 \354\227\260\354\212\265\353\254\270\354\240\234.webloc" @@ -0,0 +1,8 @@ + + + + + URL + http://dataarchitecture.tistory.com/40 + + From 5576b44e5eaadf59f36508d60bde96d758739a5d Mon Sep 17 00:00:00 2001 From: dohyung Date: Tue, 5 Sep 2017 22:50:15 +0900 Subject: [PATCH 029/124] =?UTF-8?q?supplement-2016-09=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mymath.ipynb | 6 + python3.6/__pycache__/mymath.cpython-36.pyc | Bin 0 -> 405 bytes python3.6/mymath.py | 10 + python3.6/supplement-2016-09.ipynb | 3576 +++++++++++++++++++ python3.6/t.txt | 4 + supplement-2016-09.ipynb | 352 +- 6 files changed, 3689 insertions(+), 259 deletions(-) create mode 100644 mymath.ipynb create mode 100644 python3.6/__pycache__/mymath.cpython-36.pyc create mode 100644 python3.6/mymath.py create mode 100644 python3.6/supplement-2016-09.ipynb create mode 100644 python3.6/t.txt diff --git a/mymath.ipynb b/mymath.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/mymath.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python3.6/__pycache__/mymath.cpython-36.pyc b/python3.6/__pycache__/mymath.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b13453958a9d6c35dece521c030000aa8e3d198 GIT binary patch literal 405 zcmYjMy-LJD5Z=jd&L|#O2zJ`or0}*luo4L<+8u~kc#XvDnglP|Fq=~X*PT9qt#4ps z?X#q{^bM?>UGQ|^n{RgK@0;;(xbgD(etpLn`y{N4Q18byeCHqo(V5 zs+7CHdL@7%#hF{<%<)RqCOulxwe8`R#n6kYYf56kKXE9iv==GrbU@MXXm?glAlphN mu|Svf3(=+eu)(r!|Bdn2`dQIYWz>A8kKLDbeIkf>#D4&JB~By& literal 0 HcmV?d00001 diff --git a/python3.6/mymath.py b/python3.6/mymath.py new file mode 100644 index 0000000..8709539 --- /dev/null +++ b/python3.6/mymath.py @@ -0,0 +1,10 @@ +mypi = 3.14 + +def add(a, b): + return a + b + +def area(r): + return mypi * r * r + +print(area(4.0)) + diff --git a/python3.6/supplement-2016-09.ipynb b/python3.6/supplement-2016-09.ipynb new file mode 100644 index 0000000..7729677 --- /dev/null +++ b/python3.6/supplement-2016-09.ipynb @@ -0,0 +1,3576 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 수업 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 12. E-learning 22, 23 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 보충 내용 없음" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 11. E-learning 21 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1) Python 에서 Java에서 문법적으로 제공되는 것과 비슷하게 abstract class를 생성할 수 있나?\n", + "- Python 문법 자체적으로 abstract class 지원하지 않음\n", + "- abc 모듈을 활용하여 abstract class 생성할 수 있음 (참고적으로만 알아둘 것)\n", + " - http://zaiste.net/2013/01/abstract_classes_in_python/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2) Python 에서 Java에서 문법적으로 제공되는 것과 비슷하게 interface를 생성할 수 있나?\n", + "- Python 문법 자체적으로 interface 지원하지 않음\n", + "- interface를 지원하는 모듈도 존재하지 않음" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 10. E-learning 19, 20 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 보충 내용 없음" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 9. E-learning 17, 18 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 특정 객체 내부에 지니고 있는 이름 알아보기 \n", + "- dir(객체)\n", + " : 이름 리스트 리스트 반환\n", + "- 객체.\\_\\_dict\\_\\_\n", + " : 이름 및 해당 이름에 할당된 객체의 repr (또는 str) 형태를 사전으로 지님" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']\n", + "dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__file__', '__cached__', '__builtins__', '__all__', '_string', 'whitespace', 'ascii_lowercase', 'ascii_uppercase', 'ascii_letters', 'digits', 'hexdigits', 'octdigits', 'punctuation', 'printable', 'capwords', '_re', '_ChainMap', '_TemplateMetaclass', 'Template', 'Formatter'])\n" + ] + } + ], + "source": [ + "import string\n", + "print(dir(string))\n", + "print(string.__dict__.keys())\n", + "\n", + "# ['Formatter', 'Template', '_TemplateMetaclass', \n", + "# '__builtins__', '__doc__', '__file__', \n", + "# '__name__', '__package__', '_float', \n", + "# '_idmap', '_idmapL', '_int', '_long', \n", + "# '_multimap', '_re', 'ascii_letters', \n", + "# 'ascii_lowercase', 'ascii_uppercase', \n", + "# 'atof', 'atof_error', 'atoi', 'atoi_error', \n", + "# 'atol', 'atol_error', 'capitalize', 'capwords', \n", + "# 'center', 'count', 'digits', 'expandtabs', 'find', \n", + "# 'hexdigits', 'index', 'index_error', 'join', \n", + "# 'joinfields', 'letters', 'ljust', 'lower', \n", + "# 'lowercase', 'lstrip', 'maketrans', 'octdigits', \n", + "# 'printable', 'punctuation', 'replace', 'rfind', \n", + "# 'rindex', 'rjust', 'rsplit', 'rstrip', 'split', \n", + "# 'splitfields', 'strip', 'swapcase', 'translate', \n", + "# 'upper', 'uppercase', 'whitespace', 'zfill']\n", + "\n", + "# ['ascii_lowercase', 'upper', '_re', 'letters', \n", + "# 'atol_error', 'lstrip', 'uppercase', \n", + "# 'ascii_letters', 'find', 'atof', 'replace', \n", + "# 'capwords', 'index_error', 'expandtabs', \n", + "# 'Template', 'strip', 'ascii_uppercase', \n", + "# 'octdigits', 'index', 'ljust', 'whitespace', \n", + "# '_int', 'rindex', '_float', 'punctuation', \n", + "# '__package__', 'printable', 'splitfields', \n", + "# 'split', 'rstrip', 'translate', '__doc__', \n", + "# '_multimap', 'count', 'joinfields', 'rjust', \n", + "# '__builtins__', '__file__', 'lower', 'swapcase', \n", + "# 'atof_error', 'atoi', 'hexdigits', 'Formatter', \n", + "# 'atol', '__name__', 'rsplit', '_idmapL', 'digits', \n", + "# 'lowercase', 'join', 'center', '_long', 'rfind', \n", + "# 'atoi_error', 'maketrans', 'capitalize', \n", + "# '_TemplateMetaclass', 'zfill', '_idmap']" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name = __name__ , type = \n", + "name = __doc__ , type = \n", + "name = __package__ , type = \n", + "name = __loader__ , type = \n", + "name = __spec__ , type = \n", + "name = __file__ , type = \n", + "name = __cached__ , type = \n", + "name = __builtins__ , type = \n", + "name = __all__ , type = \n", + "name = _string , type = \n", + "name = whitespace , type = \n", + "name = ascii_lowercase , type = \n", + "name = ascii_uppercase , type = \n", + "name = ascii_letters , type = \n", + "name = digits , type = \n", + "name = hexdigits , type = \n", + "name = octdigits , type = \n", + "name = punctuation , type = \n", + "name = printable , type = \n", + "name = capwords , type = \n", + "name = _re , type = \n", + "name = _ChainMap , type = \n", + "name = _TemplateMetaclass , type = \n", + "name = Template , type = \n", + "name = Formatter , type = \n" + ] + } + ], + "source": [ + "for name, val in string.__dict__.items():\n", + " print('name = %-20s, type = %s' % (name, type(val)))\n", + " \n", + "# name = ascii_lowercase , type = \n", + "# name = upper , type = \n", + "# name = _re , type = \n", + "# name = letters , type = \n", + "# name = atol_error , type = \n", + "# name = lstrip , type = \n", + "# name = uppercase , type = \n", + "# name = ascii_letters , type = \n", + "# name = find , type = \n", + "# name = atof , type = \n", + "# name = replace , type = \n", + "# name = capwords , type = \n", + "# name = index_error , type = \n", + "# name = expandtabs , type = \n", + "# name = Template , type = \n", + "# name = strip , type = \n", + "# name = ascii_uppercase , type = \n", + "# name = octdigits , type = \n", + "# name = index , type = \n", + "# name = ljust , type = \n", + "# name = whitespace , type = \n", + "# name = _int , type = \n", + "# name = rindex , type = \n", + "# name = _float , type = \n", + "# name = punctuation , type = \n", + "# name = __package__ , type = \n", + "# name = printable , type = \n", + "# name = splitfields , type = \n", + "# name = split , type = \n", + "# name = rstrip , type = \n", + "# name = translate , type = \n", + "# name = __doc__ , type = \n", + "# name = _multimap , type = \n", + "# name = count , type = \n", + "# name = joinfields , type = \n", + "# name = rjust , type = \n", + "# name = __builtins__ , type = \n", + "# name = __file__ , type = \n", + "# name = lower , type = \n", + "# name = swapcase , type = \n", + "# name = atof_error , type = \n", + "# name = atoi , type = \n", + "# name = hexdigits , type = \n", + "# name = Formatter , type = \n", + "# name = atol , type = \n", + "# name = __name__ , type = \n", + "# name = rsplit , type = \n", + "# name = _idmapL , type = \n", + "# name = digits , type = \n", + "# name = lowercase , type = \n", + "# name = join , type = \n", + "# name = center , type = \n", + "# name = _long , type = \n", + "# name = rfind , type = \n", + "# name = atoi_error , type = \n", + "# name = maketrans , type = \n", + "# name = capitalize , type = \n", + "# name = _TemplateMetaclass , type = \n", + "# name = zfill , type = \n", + "# name = _idmap , type = " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 모듈의 재적재\n", + "- 이미 메모리에 적재되어 있는 모듈은 다시 import 하더라도 기존에 적재되어 있는 모듈이 그대로 다시 이용된다." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6.2\n" + ] + } + ], + "source": [ + "import mymath\n", + "mymath.mypi = 6.2 # 값 수정(원래 모듈 파일에 정의된 값은 3.14)\n", + "\n", + "import mymath # 다시 import\n", + "print(mymath.mypi) # 3.14가 아니라 6.2 -> 즉 이미 적재되어 있는 모듈 그냥 이용" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- reload(모듈)\n", + " - 메모리에 등록된 것과 관계없이 해당 모듈의 파일에서 새롭게 다시 메모리에 재적재 시키는 내장 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6.2\n", + "50.24\n", + "3.14\n" + ] + } + ], + "source": [ + "import imp # Python3에서는 reload를 쓰기 위해 imp모듈을 import해주어야 합니다.\n", + "\n", + "print(mymath.mypi)\n", + "imp.reload(mymath)\n", + "print(mymath.mypi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. E-learning 15, 16 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 함수 정의시에 예상할 수 없는 키워드 인수 처리하기\n", + "- 함수를 정의할 때 예측할 수 없는 인수를 선언하여 사전 타입으로 그러한 인수를 받을 수 있다.\n", + " - 함수 정의시에 **var 형태의 인수 정의" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10 5\n", + "{'depth': 10, 'diamension': 3}\n", + "13\n" + ] + } + ], + "source": [ + "def f(width, height, **kw):\n", + " print(width, height)\n", + " print(kw)\n", + " value = 0\n", + " for key in kw:\n", + " value += kw[key]\n", + " return value\n", + "\n", + "print(f(width=10, height=5, depth=10, diamension=3))" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10 5\n", + "{'depth': 10, 'diamension': 3}\n", + "13\n" + ] + } + ], + "source": [ + "print(f(10, 5, depth=10, diamension=3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 첫 두 개의 인수 다음에는 반드시 키워드 인수로만 함수 호출 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "positional argument follows keyword argument (, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m print(f(width=10, height=5, 10, 3))\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m positional argument follows keyword argument\n" + ] + } + ], + "source": [ + "print(f(width=10, height=5, 10, 3))\n", + "\n", + "# non-keyword arg after keyword arg" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "f() takes 2 positional arguments but 4 were given", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# f() takes exactly 2 arguments (4 given)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: f() takes 2 positional arguments but 4 were given" + ] + } + ], + "source": [ + "print(f(10, 5, 10, 3))\n", + "\n", + "# f() takes exactly 2 arguments (4 given)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 선언시에 예상할 수 없는 키워드 인수는 맨 마지막에 선언해야 한다.\n", + " - 함수 선언시 인수 선언 나열 방법\n", + " - 일반 인수 -> 키워드 인수 -> 가변 인수 -> 예상치 못하는 키워드 인수" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2\n", + "(4, 5)\n", + "{'c': 6, 'd': 7}\n" + ] + } + ], + "source": [ + "def g(a, b, k = 1, *args, **kw):\n", + " print(a, b)\n", + " print(args)\n", + " print(kw)\n", + "\n", + "g(1, 2, 3, 4, 5, c=6, d=7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 함수 호출시에 사용 가능한 튜플 인수 및 사전 인수\n", + "- 함수 호출에 사용될 인수값들이 튜플에 있다면 \"*튜플변수\"를 이용하여 함수 호출이 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3\n" + ] + } + ], + "source": [ + "def h(a, b, c):\n", + " print(a, b, c)\n", + " \n", + "args = (1, 2, 3)\n", + "h(*args)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 호출에 사용될 인수값들이 사전에 있다면 \"**사전변수\"를 이용하여 함수 호출이 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3\n" + ] + } + ], + "source": [ + "dargs = {'a':1, 'b':2, 'c':3}\n", + "h(**dargs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 튜플 인수와 사전 인수를 동시에 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3\n" + ] + } + ], + "source": [ + "args = (1,2)\n", + "dargs = {'c':3}\n", + "h(*args, **dargs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 람다 함수 보충\n", + "- 다음 4가지 프로그램은 동일함" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" + ] + } + ], + "source": [ + "def f1(x):\n", + " return x*x + 3*x - 10\n", + "\n", + "def f2(x):\n", + " return x*x*x\n", + "\n", + "def g(func):\n", + " return [func(x) for x in range(-10, 10)]\n", + "\n", + "print(g(f1))\n", + "print(g(f2))" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" + ] + } + ], + "source": [ + "def g(func):\n", + " return [func(x) for x in range(-10, 10)]\n", + "\n", + "print(g(lambda x: x*x + 3*x - 10))\n", + "print(g(lambda x: x*x*x))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "[-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]\n" + ] + } + ], + "source": [ + "print([(lambda x: x*x + 3*x - 10)(x) for x in range(-10, 10)])\n", + "print([(lambda x: x*x*x)(x) for x in range(-10, 10)])" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" + ] + } + ], + "source": [ + "print(map(lambda x: x*x + 3*x - 10, range(-10, 10)))\n", + "print(map(lambda x: x*x*x, range(-10, 10)))\n", + "# [60, 44, 30, 18, 8, 0, -6, -10, -12, -12, -10, -6, 0, 8, 18, 30, 44, 60, 78, 98]\n", + "# [-1000, -729, -512, -343, -216, -125, -64, -27, -8, -1, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4) map 및 filter 함수 보충" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- map함수에 시퀀스 자료형을 두 개 이상 할당할 수 있다.\n", + " - 시퀀스 자료형이 n개 이면 function의 인자도 n개 이어야 함" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" + ] + } + ], + "source": [ + "Y1 = map(lambda x, y: x + y, [1, 2, 3, 4, 5], [6, 7, 8, 9, 10])\n", + "Y2 = map(lambda x, y, z: x + y + z, [1, 2, 3], [4, 5, 6], [7, 8, 9])\n", + "print(Y1)\n", + "print(Y2)\n", + "# [7, 9, 11, 13, 15]\n", + "# [12, 15, 18]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 두 개 이상의 시퀀스 자료형들에 대해 map 함수를 사용하여 순서쌍 만들기\n", + " - function 인자를 None으로 할당" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "a = ['a', 'b', 'c', 'd']\n", + "print(map(None, a))\n", + "# ['a', 'b', 'c', 'd']" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "a = ['a', 'b', 'c', 'd']\n", + "b = [1, 2, 3, 4]\n", + "print(map(None, a, b))\n", + "# [('a', 1), ('b', 2), ('c', 3), ('d', 4)]" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "a = ['a', 'b', 'c', 'd']\n", + "b = [1, 2, 3, 4]\n", + "c = [5, 6, 7, 8]\n", + "print(map(None, a, b, c))\n", + "# [('a', 1, 5), ('b', 2, 6), ('c', 3, 7), ('d', 4, 8)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 두 개의 시퀀스 자료형의 원소의 개수가 다르면 부족한 원소에는 None을 할당" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "a = ['a', 'b']\n", + "b = [1, 2, 3, 4]\n", + "print(map(None, a, b))\n", + "# [('a', 1), ('b', 2), (None, 3), (None, 4)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 순서쌍을 만드는 전용 내장 함수 zip은 None을 추가하지 않고 짧은 인자를 기준으로 나머지는 버린다." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "a = ['a', 'b']\n", + "b = [1, 2, 3, 4]\n", + "print(zip(a, b))\n", + "# [('a', 1), ('b', 2)]" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "print(zip([1, 2, 3], [4, 5, 6, 7, 8]))\n", + "# [(1, 4), (2, 5), (3, 6)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- filter의 첫 인자의 함수로서 None을 할당하면 seq 자료형에 있는 각 원소값 자체들을 평가하여 참인 것들만 필터링한다." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "L = ['high', False, 'level', '', 'built-in', '', 'function', 0, 10]\n", + "L = filter(None, L)\n", + "print(L)\n", + "# ['high', 'level', 'built-in', 'function', 10]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6) 함수 객체의 속성\n", + "- 함수도 객체이며 속성을 지닌다.\n", + " - \\_\\_doc\\_\\_, func_doc: 문서 문자열\n", + " - \\_\\_name\\_\\_, func_name: 함수 이름\n", + " - func_defaults: 기본 인수 값들" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def f(a, b, c=1):\n", + " 'func attribute testing'\n", + " localx = 1\n", + " localy = 2\n", + " return 1 " + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "func attribute testing\n", + "\n", + "f\n", + "\n" + ] + } + ], + "source": [ + "print(f.__doc__) # 문서 문자열\n", + "# print(f.func_doc)\n", + "print()\n", + "\n", + "print(f.__name__) # 함수의 이름\n", + "# print(f.func_name)\n", + "print()\n", + "\n", + "# print(f.func_defaults) # 기본 인수값들" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. E-learning 13, 14 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) text file vs. binary file\n", + "- 참고: http://stackoverflow.com/questions/2665866/what-is-the-wb-mean-in-this-code-using-python\n", + "\n", + " - On Unix systems (Linux, Mac OS X, etc.), binary mode does nothing - they treat text files the same way that any other files are treated. On Windows, however, text files are written with slightly modified line endings. This causes a serious problem when dealing with actual binary files, like exe or jpg files. Therefore, when opening files which are not supposed to be text, even in Unix, you should use wb or rb. Use plain w or r only for text files.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) with ~ as ~\n", + "- 자동으로 자원 해제" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = \"\"\"Its power: Python developers typically report \n", + "they are able to develop applications in a half\n", + "to a tenth the amount of time it takes them to do\n", + "the same work in such languages as C.\"\"\"\n", + "with open('t.txt', 'w') as f: # f = open('t.txt', 'w')과 동일\n", + " f.write(s) \n", + " # f.close() 작성할 필요 없음. 자동으로 닫힘" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) os.work" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive/script_programming/python3.6\n", + "\n", + "/Users/do-hyungkwon/GoogleDrive/script_programming/python3.6 *** ['.ipynb_checkpoints', '__pycache__'] *** ['.DS_Store', 'mymath.py', 'python01.ipynb', 'python02.ipynb', 'python03.ipynb', 'python04.ipynb', 'python05.ipynb', 'python06.ipynb', 'python07.ipynb', 'python08.ipynb', 'python09.ipynb', 'python10.ipynb', 'python11.ipynb', 'python12.ipynb', 'python13.ipynb', 'python14.ipynb', 'python15.ipynb', 'python16.ipynb', 'python17.ipynb', 'python18.ipynb', 'python19.ipynb', 'python20.ipynb', 'python21.ipynb', 'python22.ipynb', 'python23.ipynb', 'supplement-2016-09.ipynb', 't.txt']\n", + "/Users/do-hyungkwon/GoogleDrive/script_programming/python3.6/.ipynb_checkpoints *** [] *** ['python01-checkpoint.ipynb', 'python02-checkpoint.ipynb', 'python03-checkpoint.ipynb', 'supplement-2016-09-checkpoint.ipynb']\n", + "/Users/do-hyungkwon/GoogleDrive/script_programming/python3.6/__pycache__ *** [] *** ['mymath.cpython-36.pyc']\n" + ] + } + ], + "source": [ + "import os\n", + "os.chdir('.')\n", + "print(os.getcwd())\n", + "print()\n", + "for path, subdirs, files in os.walk(os.getcwd()):\n", + " print(path, \" *** \", subdirs, \" *** \", files)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4) 프로그램 예제-1\n", + "#### 임의의 텍스트 파일 내 문자 수를 출력하는 프로그램을 작성하라." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 1" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "85185\n" + ] + } + ], + "source": [ + "f = open('supplement-2016-09.ipynb')\n", + "print(len(f.read()))\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 2" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "95619" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os\n", + "os.path.getsize('supplement-2016-09.ipynb')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 윈도우즈에서 만든 파일에 위 예제들을 수행하면 os.path.getsize('t.txt')가 라인수만큼 더 큼\n", + " - 이유\n", + " - 리눅스와 Mac에서는 라인 구분 제어 문자로 '\\012' 한 문자를 사용\n", + " - 윈도우즈에서는 라인을 구분하는 제어 문자로 '\\015\\012' 두 개의 문자를 사용함" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\n'" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os\n", + "os.linesep" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- ![linesep](../images/win_os_linesep.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5) 프로그램 예제-2\n", + "#### 임의의 텍스트 파일 내 단어 수를 출력하는 프로그램을 작성하라. 여기서 단어란, 공백으로 분리된 문자의 모임을 뜻한다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 1" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10927\n" + ] + } + ], + "source": [ + "f = open('supplement-2016-09.ipynb')\n", + "s = f.read()\n", + "n = len(s.split())\n", + "print(n)\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 2" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10927\n" + ] + } + ], + "source": [ + "n = len(open('supplement-2016-09.ipynb').read().split())\n", + "print(n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6) 프로그램 예제-3\n", + "#### 임의의 텍스트 파일 내 라인 수를 출력하는 프로그램을 작성하라." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 1" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3329\n" + ] + } + ], + "source": [ + "f = open('supplement-2016-09.ipynb')\n", + "s = f.read()\n", + "print(s.count('\\n'))\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 2" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3329\n" + ] + } + ], + "source": [ + "f = open('supplement-2016-09.ipynb')\n", + "print(len(f.readlines()))\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 3" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3329\n" + ] + } + ], + "source": [ + "print(open('supplement-2016-09.ipynb').read().count('\\n'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 해법 4" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2570\n" + ] + } + ], + "source": [ + "print(len(open('supplement-2016-09.ipynb').readlines()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 7) 다양한 파일 처리 모드" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- open 내장 함수의 두번째 인자 mode 설명\n", + " - 두번째 인자 mode 생략시에는 읽기 전용(r) 모드로 설정\n", + " \n", + "| Mode | 간단 설명 | 자세한 설명\n", + "|--------|-----------------------------|------------|\n", + "| 'r' | 읽기 전용(기본 모드) | 파일 객체를 읽기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다.|\n", + "| 'w' | 쓰기 전용(기존 파일 내용 삭제) | 파일이 존재하지 않으면 새로운 파일을 쓰기 모드로 생성하고, 해당 파일이 이미 존재하면 내용을 모두 없에면서 쓰기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다. |\n", + "| 'a' | 파일 끝에 추가(쓰기 전용) | 파일이 존재하지 않으면 새롭게 파일을 생성하면서 쓰기 모드로 생성하고, 해당 파일이 이미 존재하면 파일 객체을 쓰기 모드로 생성하면서 파일 포인터를 파일의 마지막 위치에 놓는다 (그래서, 이후 작성되는 내용은 파일의 뒷 부분에 추가).|\n", + "| 'r+' | 읽고 쓰기 | 파일 객체를 읽고 쓸 수 있도록 생성한다. 파일 포인터를 파일 처음 위치에 놓는다. |\n", + "| 'w+' | 읽고 쓰기(기존 파일 내용 삭제) | 파일 객체를 읽고 쓸 수 있도록 생성한다. 파일이 존재하지 않으면 새로운 파일을 생성하고, 해당 파일이 이미 존재하면 내용을 모두 없에면서 생성하고, 파일 포인터를 파일 처음 위치에 놓는다.|\n", + "| 'a+' | 읽고 쓰기(파일 끝에 추가) | 파일 객체를 읽고 쓸 수 있도록 생성한다. 파일이 존재하지 않으면 새롭게 파일을 생성하고, 해당 파일이 이미 존재하면 파일 객체을 생성하면서 파일 포인터를 파일의 마지막 위치에 놓는다 (그래서, 이후 작성되는 내용은 파일의 뒷 부분에 추가). |\n", + "\n", + "\n", + " - 이진 파일로 저장을 위해서는 아래 모드 사용\n", + "\n", + "| Mode | 간단 설명 |\n", + "|--------|-----------------------------|\n", + "| 'rb' | 이진 파일 읽기 전용 |\n", + "| 'wb' | 이진 파일 쓰기 전용(기존 파일 내용 삭제) |\n", + "| 'ab' | 이진 파일 끝에 추가(쓰기 전용) |\n", + "| 'rb+' | 이진 파일 읽고 쓰기 |\n", + "| 'wb+' | 이진 파일 읽고 쓰기(기존 파일 내용 삭제) |\n", + "| 'ab+' | 이진 파일 끝에 추가(읽기도 가능) |\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. E-learning 11, 12 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 프로그램 예제\n", + "- 100개의 소문자를 랜덤하게 생성하여 출력한다.\n", + "- 생성된 각 소문자의 개수를 카운트하여 출력한다." + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "n t j c k a v o p z d u b e p r s p o n\n", + "h u b n g y w r y x t w b e u d b p b q\n", + "x r z e s m t c q m l k p m x g q e x t\n", + "o a c d s v v g n p f w t n r y y o a k\n", + "s k j k m f d z q g j r h c c r j t v v\n", + "\n", + "a 3 b 5 c 5 d 4 e 4 f 2 g 4 h 2 i 0 j 4\n", + "k 5 l 1 m 4 n 5 o 4 p 6 q 4 r 6 s 4 t 6\n", + "u 3 v 5 w 3 x 4 y 4 z 3 " + ] + } + ], + "source": [ + "import random\n", + "\n", + "def getRandomLowerCaseLetter():\n", + " return chr(random.randint(ord('a'), ord('z')))\n", + "\n", + "def createList():\n", + " '''\n", + " 소문자를 랜덤하게 생성하여 담은 리스트를 반환한다.\n", + " '''\n", + " chars = []\n", + " \n", + " for i in range(100):\n", + " chars.append(getRandomLowerCaseLetter())\n", + " \n", + " #위 코드는 아래 코드와 동일\n", + " #chars = [getRandomLowerCaseLetter() for i in range(100)]\n", + " \n", + " return chars\n", + "\n", + "def displayList(chars):\n", + " '''\n", + " 리스트에 포함된 문자를 한 행에 20개씩 출력한다.\n", + " '''\n", + " for i in range(len(chars)):\n", + " if (i + 1) % 20 == 0:\n", + " print(chars[i])\n", + " else:\n", + " print(chars[i], end=\" \")\n", + "\n", + "def countLetters(chars):\n", + " '''\n", + " 0으로 초기화된 26개의 정수리스트를 생성한 후 인자로 주어진 chars에 있는 각 문자들의 개수를 저장한다.\n", + " '''\n", + " counts = [0] * 26\n", + " \n", + " for i in range(len(chars)):\n", + " counts[ord(chars[i]) - ord('a')] += 1 \n", + " \n", + " return counts\n", + "\n", + "def displayCounts(counts):\n", + " '''\n", + " 각 문자별로 카운트를 한 행에 10개씩 출력한다.\n", + " '''\n", + " for i in range(len(counts)):\n", + " if (i + 1) % 10 == 0:\n", + " print(chr(i + ord('a')), counts[i])\n", + " else:\n", + " print(chr(i + ord('a')), counts[i], end=\" \" )\n", + "\n", + "if __name__ == '__main__':\n", + " chars = createList()\n", + " displayList(chars)\n", + " print()\n", + " counts = countLetters(chars)\n", + " displayCounts(counts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 집합의 성능" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[8606, 2370, 2300, 4168, 7465, 568, 6509, 285, 3921, 3719]\n", + "The elapsed time to check into a set is 1 ms\n", + "The elapsed time to check into a list is 893 ms\n", + "The elapsed time to remove each element from a set is 1 ms\n", + "The elapsed time to remove each element from a list is 383 ms\n" + ] + } + ], + "source": [ + "import random\n", + "import time\n", + "\n", + "NUMBER_OF_ELEMENTS = 10000\n", + "\n", + "lst = list(range(NUMBER_OF_ELEMENTS))\n", + "random.shuffle(lst)\n", + "print(lst[0:10])\n", + "\n", + "s = set(lst)\n", + "\n", + "# 해당 원소가 집합/리스트에 포함되어 있는지 검사\n", + "startTime = time.time()\n", + "for i in range(NUMBER_OF_ELEMENTS):\n", + " i in s\n", + "endTime = time.time()\n", + "runTime = int((endTime - startTime) * 1000)\n", + "print('The elapsed time to check into a set is %s ms' % runTime)\n", + "\n", + "startTime = time.time()\n", + "for i in range(NUMBER_OF_ELEMENTS):\n", + " i in lst\n", + "endTime = time.time()\n", + "runTime = int((endTime - startTime) * 1000)\n", + "print('The elapsed time to check into a list is %s ms' % runTime)\n", + "\n", + "# 해당 원소를 집합/리스트로 부터 제거\n", + "startTime = time.time()\n", + "for i in range(NUMBER_OF_ELEMENTS):\n", + " s.remove(i)\n", + "endTime = time.time()\n", + "runTime = int((endTime - startTime) * 1000)\n", + "print('The elapsed time to remove each element from a set is %s ms' % runTime)\n", + "\n", + "startTime = time.time()\n", + "for i in range(NUMBER_OF_ELEMENTS):\n", + " lst.remove(i)\n", + "endTime = time.time()\n", + "runTime = int((endTime - startTime) * 1000)\n", + "print('The elapsed time to remove each element from a list is %s ms' % runTime)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 단어 세기\n", + "- 다음 주어진 문자열 s에서 ,와 .을 제거하고\n", + "- 모든 문자를 소문자로 변경하고\n", + "- 각각의 단어의 출현 빈도를 출력하시오." + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "we : 1\n", + "propose : 1\n", + "to : 3\n", + "start : 1\n", + "by : 1\n", + "making : 1\n", + "it : 2\n", + "possible : 1\n", + "teach : 1\n", + "programming : 1\n", + "in : 1\n", + "python : 1\n", + "an : 1\n", + "existing : 1\n", + "scripting : 1\n", + "language : 1\n", + "and : 2\n", + "focus : 1\n", + "on : 1\n", + "creating : 1\n", + "a : 1\n", + "new : 1\n", + "development : 1\n", + "enviroment : 1\n", + "teaching : 1\n", + "materials : 1\n", + "for : 1\n" + ] + } + ], + "source": [ + "# -*-coding:utf-8 -*-\n", + "s = \"We propose to start by making it possible to teach progra\\\n", + "mming in python, an existing scripting language, and to focus \\\n", + "on creating a new development enviroment and teaching \\\n", + "materials for it.\"\n", + " \n", + "# 대치 과정\n", + "s=s.replace(',','')\n", + "s=s.replace('.','')\n", + "s=s.lower()\n", + " \n", + "#공백 단위로 단어 쪼개고 단어 넣을 딕셔너리 선언\n", + "listSplited = s.split()\n", + "words = {}\n", + " \n", + "#단어 쪼개놓은 리스트에서 각각 단어의 개수 세기\n", + "for i in listSplited:\n", + " if not i in words.keys():\n", + " words[i]=1\n", + " else:\n", + " words[i]=words[i]+1\n", + " \n", + "#포맷을 이용한 출력\n", + "format = \"%s : %d\"\n", + " \n", + "for i in words:\n", + " print(format % (i, words[i]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. E-learning 9, 10 보충 자료\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 리스트를 배열처럼 활용하기\n", + "- 1차원 배열처럼 활용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 4, 5]\n", + "1\n", + "range(0, 10)\n", + "2\n" + ] + } + ], + "source": [ + "a = [1, 2, 3, 4, 5]\n", + "b = range(10)\n", + "print(a)\n", + "print(a[0])\n", + "print(b)\n", + "print(b[2])\n", + "# [1, 2, 3, 4, 5]\n", + "# 1\n", + "# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "# 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 0으로 초기화된 사이즈 10인 1차원 배열 생성" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = [0] * 10\n", + "a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 2차원 배열처럼 활용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n", + "6\n" + ] + } + ], + "source": [ + "mat = [[1, 2, 3],\n", + " [4, 5, 6],\n", + " [7, 8, 9]]\n", + "print(mat)\n", + "print(mat[1][2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 리스트 내포\n", + "- 다음은 고등학교 수학에서 배운 집합의 표기 방법이다.\n", + " - A = {x^2 | x in {0, ..., 9}}\n", + " - B = {1, 2, 4, 8, 16, ..., 2^16}\n", + " - C = {x | x in S and x is odd}\n", + "\n", + "- 파이썬의 리스트 내포(list comprehension)는 바로 위 집합 표기법과 유사한 방식의 리터럴이다. \n", + "- 위 집합들을 리스트 내포 방식으로 표현하면 다음과 같다. \n", + " - A = [x**2 for x in range(10)]\n", + " - B = [2**i for i in range(17)]\n", + " - C = [x for x in S if x % 2 == 1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예 1. 피타고라스 삼각형의 각 3변의 길이 리스트 (조건: 각 변 x, y, z의 길이는 30 보다 작아야 하며, x <= y <= z 이어야 함)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(3, 4, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 15, 17), (9, 12, 15), (10, 24, 26), (12, 16, 20), (15, 20, 25), (20, 21, 29)]\n" + ] + } + ], + "source": [ + "k = [(x,y,z) for x in range(1,30) for y in range(x,30) for z in range(y,30) if x**2 + y**2 == z**2]\n", + "print(k)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 바로 위 코드는 아래와 동일하다." + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(3, 4, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 15, 17), (9, 12, 15), (10, 24, 26), (12, 16, 20), (15, 20, 25), (20, 21, 29)]\n" + ] + } + ], + "source": [ + "l = []\n", + "for x in range(1,30):\n", + " for y in range(x,30):\n", + " for z in range (y, 30):\n", + " if x**2 + y**2 == z**2:\n", + " l.append((x, y, z))\n", + "print(l)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예 2. 중첩 리스트 내포" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['AC', 'AD', 'BC', 'BD']\n", + "\n", + "[['AC', 'BC'], ['AD', 'BD']]\n" + ] + } + ], + "source": [ + "list_a = ['A', 'B']\n", + "list_b = ['C', 'D']\n", + "print([x + y for x in list_a for y in list_b])\n", + "print()\n", + "print([[x + y for x in list_a] for y in list_b])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 바로 위 코드는 아래와 동일하다." + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[['AC', 'BC'], ['AD', 'BD']]\n" + ] + } + ], + "source": [ + "l = []\n", + "for y in list_b:\n", + " l2 = []\n", + " for x in list_a:\n", + " l2.append(x+y)\n", + " l.append(l2)\n", + "print(l)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예 3. 리스트 내포를 활용한 2차원 배열 생성" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]\n", + "[[100, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]\n" + ] + } + ], + "source": [ + "mat = [ [0]*4 for x in range(3)]\n", + "print(mat)\n", + "\n", + "mat[0][0] = 100\n", + "print(mat)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 특별 속성\n", + "- 특별 속성: 파이썬 내에 존재하는 모든 객체 마다 부여되는 특별한 Read-only 속성\n", + " - [참고]: https://docs.python.org/3.7/library/stdtypes.html#object.__dict__" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__main__\n", + "\n", + "Automatically created module for IPython interactive environment\n", + "\n" + ] + } + ], + "source": [ + "print(__name__) # 로컬 이름 \n", + "print()\n", + "\n", + "print(__doc__) # 로컬에 지정된 문서문자열\n", + "print()" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "math.__name__: math\n", + "\n", + "math.__doc__: This module is always available. It provides access to the\n", + "mathematical functions defined by the C standard.\n", + "\n", + "math.log10.__name__: log10\n", + "\n", + "math.log10.__doc__: log10(x)\n", + "\n", + "Return the base 10 logarithm of x.\n", + "\n", + "\n" + ] + } + ], + "source": [ + "import math\n", + "\n", + "print(\"math.__name__: \", math.__name__)\n", + "print()\n", + "print(\"math.__doc__:\", math.__doc__)\n", + "print()\n", + "print(\"math.log10.__name__: \", math.log10.__name__)\n", + "print()\n", + "print(\"math.log10.__doc__: \", math.log10.__doc__)\n", + "print()\n", + "print(type(math.log10))" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [], + "source": [ + "? math.log10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. E-learning 7, 8 보충 자료\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) unicode 추가 설명" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Literal strings are unicode by default in Python3

\n", + "참고: https://stackoverflow.com/questions/6812031/how-to-make-unicode-string-with-python3" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [], + "source": [ + "a = (\"한글과 세종대왕\", 'utf-8')\n", + "b = u\"한글과 세종대왕\"" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "False\n" + ] + } + ], + "source": [ + "print(a == b)\n", + "print(a is b)\n", + "# True\n", + "# False" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "65\n", + "A\n" + ] + } + ], + "source": [ + "print(ord('A')) # ord(): 문자의 ASCII 코드값 반환\n", + "print(chr(65)) # char(): ASCII 코드 65를 지니는 문자를 반환" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://www.fileformat.info/info/unicode/char/ac00/index.htm" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "가\n", + "가\n" + ] + } + ], + "source": [ + "# print unichr(0xac00) # unichr(): UNICODE 코드 0xac00를 지니는 문자를 반환\n", + "# print unichr(44032) \n", + "print(chr(0xac00)) # unichr(): UNICODE 코드 0xac00를 지니는 문자를 반환\n", + "print(chr(44032)) " + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 검 겁 겂 것 겄 겅 겆 겇 겈 겉 겊 겋 게 겍 겎 겏 겐 겑 겒 겓 겔 겕 겖 겗 겘 겙 겚 겛 겜 겝 겞 겟 겠 겡 겢 겣 겤 겥 겦 겧 겨 격 겪 겫 견 겭 겮 겯 결 겱 겲 겳 겴 겵 겶 겷 겸 겹 겺 겻 겼 경 겾 겿 곀 곁 곂 곃 계 곅 곆 곇 곈 곉 곊 곋 곌 곍 곎 곏 곐 곑 곒 곓 곔 곕 곖 곗 곘 곙 곚 곛 곜 곝 곞 곟 고 곡 곢 곣 곤 곥 곦 곧 골 곩 곪 곫 곬 곭 곮 곯 곰 곱 곲 곳 곴 공 곶 곷 곸 곹 곺 곻 과 곽 곾 곿 관 괁 괂 괃 괄 괅 괆 괇 괈 괉 괊 괋 괌 괍 괎 괏 괐 광 괒 괓 괔 괕 괖 괗 괘 괙 괚 괛 괜 괝 괞 괟 괠 괡 괢 괣 괤 괥 괦 괧 괨 괩 괪 괫 괬 괭 괮 괯 괰 괱 괲 괳 괴 괵 괶 괷 괸 괹 괺 괻 괼 괽 괾 괿 굀 굁 굂 굃 굄 굅 굆 굇 굈 굉 굊 굋 굌 굍 굎 굏 교 굑 굒 굓 굔 굕 굖 굗 굘 굙 굚 굛 굜 굝 굞 굟 굠 굡 굢 굣 굤 굥 굦 굧 굨 굩 굪 굫 구 국 굮 굯 군 굱 굲 굳 굴 굵 굶 굷 굸 굹 굺 굻 굼 굽 굾 굿 궀 궁 궂 궃 궄 궅 궆 궇 궈 궉 궊 궋 권 궍 궎 궏 궐 궑 궒 궓 궔 궕 궖 궗 궘 궙 궚 궛 궜 궝 궞 궟 궠 궡 궢 궣 궤 궥 궦 궧 궨 궩 궪 궫 궬 궭 궮 궯 궰 궱 궲 궳 궴 궵 궶 궷 궸 궹 궺 궻 궼 궽 궾 궿 귀 귁 귂 귃 귄 귅 귆 귇 귈 귉 귊 귋 귌 귍 귎 귏 귐 귑 귒 귓 귔 귕 귖 귗 귘 귙 귚 귛 규 귝 귞 귟 균 귡 귢 귣 귤 귥 귦 귧 귨 귩 귪 귫 귬 귭 귮 귯 귰 귱 귲 귳 귴 귵 귶 귷 그 극 귺 귻 근 귽 귾 귿 글 긁 긂 긃 긄 긅 긆 긇 금 급 긊 긋 긌 긍 긎 긏 긐 긑 긒 긓 긔 긕 긖 긗 긘 긙 긚 긛 긜 긝 긞 긟 긠 긡 긢 긣 긤 긥 긦 긧 긨 긩 긪 긫 긬 긭 긮 긯 기 긱 긲 긳 긴 긵 긶 긷 길 긹 긺 긻 긼 긽 긾 긿 김 깁 깂 깃 깄 깅 깆 깇 깈 깉 깊 깋 까 깍 깎 깏 깐 깑 깒 깓 깔 깕 깖 깗 깘 깙 깚 깛 깜 깝 깞 깟 깠 깡 깢 깣 깤 깥 깦 깧 깨 깩 깪 깫 깬 깭 깮 깯 깰 깱 깲 깳 깴 깵 깶 깷 깸 깹 깺 깻 깼 깽 깾 깿 꺀 꺁 꺂 꺃 꺄 꺅 꺆 꺇 꺈 꺉 꺊 꺋 꺌 꺍 꺎 꺏 꺐 꺑 꺒 꺓 꺔 꺕 꺖 꺗 꺘 꺙 꺚 꺛 꺜 꺝 꺞 꺟 꺠 꺡 꺢 꺣 꺤 꺥 꺦 꺧 꺨 꺩 꺪 꺫 꺬 꺭 꺮 꺯 꺰 꺱 꺲 꺳 꺴 꺵 꺶 꺷 꺸 꺹 꺺 꺻 꺼 꺽 꺾 꺿 껀 껁 껂 껃 껄 껅 껆 껇 껈 껉 껊 껋 껌 껍 껎 껏 껐 껑 껒 껓 껔 껕 껖 껗 께 껙 껚 껛 껜 껝 껞 껟 껠 껡 껢 껣 껤 껥 껦 껧 껨 껩 껪 껫 껬 껭 껮 껯 껰 껱 껲 껳 껴 껵 껶 껷 껸 껹 껺 껻 껼 껽 껾 껿 꼀 꼁 꼂 꼃 꼄 꼅 꼆 꼇 꼈 꼉 꼊 꼋 꼌 꼍 꼎 꼏 꼐 꼑 꼒 꼓 꼔 꼕 꼖 꼗 꼘 꼙 꼚 꼛 꼜 꼝 꼞 꼟 꼠 꼡 꼢 꼣 꼤 꼥 꼦 꼧 꼨 꼩 꼪 꼫 꼬 꼭 꼮 꼯 꼰 꼱 꼲 꼳 꼴 꼵 꼶 꼷 꼸 꼹 꼺 꼻 꼼 꼽 꼾 꼿 꽀 꽁 꽂 꽃 꽄 꽅 꽆 꽇 꽈 꽉 꽊 꽋 꽌 꽍 꽎 꽏 꽐 꽑 꽒 꽓 꽔 꽕 꽖 꽗 꽘 꽙 꽚 꽛 꽜 꽝 꽞 꽟 꽠 꽡 꽢 꽣 꽤 꽥 꽦 꽧 꽨 꽩 꽪 꽫 꽬 꽭 꽮 꽯 꽰 꽱 꽲 꽳 꽴 꽵 꽶 꽷 꽸 꽹 꽺 꽻 꽼 꽽 꽾 꽿 꾀 꾁 꾂 꾃 꾄 꾅 꾆 꾇 꾈 꾉 꾊 꾋 꾌 꾍 꾎 꾏 꾐 꾑 꾒 꾓 꾔 꾕 꾖 꾗 꾘 꾙 꾚 꾛 꾜 꾝 꾞 꾟 꾠 꾡 꾢 꾣 꾤 꾥 꾦 꾧 꾨 꾩 꾪 꾫 꾬 꾭 꾮 꾯 꾰 꾱 꾲 꾳 꾴 꾵 꾶 꾷 꾸 꾹 꾺 꾻 꾼 꾽 꾾 꾿 꿀 꿁 꿂 꿃 꿄 꿅 꿆 꿇 꿈 꿉 꿊 꿋 꿌 꿍 꿎 꿏 꿐 꿑 꿒 꿓 꿔 꿕 꿖 꿗 꿘 꿙 꿚 꿛 꿜 꿝 꿞 꿟 꿠 꿡 꿢 꿣 꿤 꿥 꿦 꿧 " + ] + } + ], + "source": [ + "i = 0\n", + "while i < 1000:\n", + " print(chr(0xac00 + i),end=\" \")\n", + " i = i + 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) str()과 repr()의 차이\n", + "- str(): 객체의 비공식적인 (informal) 문자열 표현 - 가능하면 읽기 편하게...\n", + "- repr(): 객체의 공식적인 (official) 문자열 표현 - 가능하면 실제 객체를 완벽하게 표현할 수 있도록...\n", + "- [참고] http://pinocc.tistory.com/168" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.234567891234568\n", + "1.234567891234568\n", + "1.234567891234568\n" + ] + } + ], + "source": [ + "f = 1.23456789123456789\n", + "print(f)\n", + "print(str(f))\n", + "print(repr(f)) # repr()은 유효 숫자를 길게 출력\n", + "# 1.23456789123\n", + "# 1.23456789123\n", + "# 1.234567891234568" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.234567891234568, 1.234567891234568\n" + ] + } + ], + "source": [ + "print(\"%s, %r\" % (f, f)) # str()과 repr() 호출\n", + "# 1.23456789123, 1.234567891234568" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 2) -- [3, 4, 5]\n" + ] + } + ], + "source": [ + "print(\"%s -- %s\" % ((1, 2), [3, 4, 5])) # str() 호출" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 2) -- [3, 4, 5]\n" + ] + } + ], + "source": [ + "print(\"%r -- %r\" % ((1, 2), [3, 4, 5])) # str() 대신에 repr() 내장 함수 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.3\n", + "0.3\n" + ] + } + ], + "source": [ + "g = 0.3\n", + "print(str(g))\n", + "print(repr(g))" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello\n", + "'Hello'\n" + ] + } + ], + "source": [ + "h = 'Hello'\n", + "print(str(h))\n", + "print(repr(h))" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'Hello' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0meval\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mh\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'Hello' is not defined" + ] + } + ], + "source": [ + "x = eval(str(h))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- repr() 내장함수에 의하여 반환된 문자열은 eval() 내장함수에 의하여 Evaluation이 가능함 " + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x = eval(repr(h))" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n" + ] + } + ], + "source": [ + "a = '1 + 2 + 3'\n", + "b = eval(a)\n", + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) [중요] 문서 문자열 (Documentation String, docstring)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def add(a, b):\n", + " \"add(a, b) returns a+b\"\n", + " return a + b" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "add(a, b) returns a+b\n" + ] + } + ], + "source": [ + "print(add.__doc__)" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function add in module __main__:\n", + "\n", + "add(a, b)\n", + " add(a, b) returns a+b\n", + "\n" + ] + } + ], + "source": [ + "help(add)" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "? add" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4) string 모듈 상수" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "참고: https://stackoverflow.com/questions/9561432/what-is-the-equivalence-in-python-3-of-letters-in-python-2" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0123456789\n", + "01234567\n", + "0123456789abcdefABCDEF\n", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n", + "abcdefghijklmnopqrstuvwxyz\n", + "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n", + "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n", + "\n", + "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n", + "\r", + "\u000b", + "\f", + "\n", + " \t\n", + "\r", + "\u000b", + "\f", + "\n" + ] + } + ], + "source": [ + "import string\n", + "\n", + "print(string.digits)\n", + "print(string.octdigits)\n", + "print(string.hexdigits)\n", + "# print(string.letters)\n", + "print(string.ascii_letters)\n", + "# print(string.lowercase)\n", + "print(string.ascii_lowercase)\n", + "# print(string.uppercase)\n", + "print(string.ascii_uppercase)\n", + "print(string.punctuation) # 각종 기호들\n", + "print()\n", + "print(string.printable) # 인쇄 가능한 모든 문자들\n", + "print(string.whitespace) # 공백 문자들 '\\011\\012\\013\\014\\015'" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n" + ] + } + ], + "source": [ + "x = 'a'\n", + "# print(x in string.uppercase)\n", + "# print(x in string.lowercase)\n", + "print(x in string.ascii_uppercase)\n", + "print(x in string.ascii_lowercase)" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n" + ] + } + ], + "source": [ + "# d = string.letters + string.digits\n", + "d = string.ascii_letters + string.digits\n", + "print(d)" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "your id:3##\n" + ] + } + ], + "source": [ + "# userid = raw_input('your id:')\n", + "userid = input('your id:')" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "invalid user id\n" + ] + } + ], + "source": [ + "# d = string.letters + string.digits\n", + "d = string.ascii_letters + string.digits\n", + "for ch in userid:\n", + " if ch not in d:\n", + " print('invalid user id')\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5) [중요] 문자열 붙이기 코딩 방법 비교" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.25711894035339355\n" + ] + } + ], + "source": [ + "import time\n", + "start_time = time.time()\n", + "s = ''\n", + "for k in range(1000000):\n", + " s += 'python'\n", + "end_time = time.time()\n", + "print(end_time - start_time)" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.15794992446899414\n" + ] + } + ], + "source": [ + "start_time = time.time()\n", + "t = []\n", + "for k in range(1000000):\n", + " t.append('python')\n", + "s = ''.join(t)\n", + "end_time = time.time()\n", + "print(end_time - start_time)" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.002058744430541992\n" + ] + } + ], + "source": [ + "start_time = time.time()\n", + "s = 'python' * 1000000\n", + "end_time = time.time()\n", + "print(end_time - start_time)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. E-learning 5, 6 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 조심해야 할 나누기 연산 " + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.25\n", + "1.25\n", + "\n", + "-1.25\n", + "-1.25\n" + ] + } + ], + "source": [ + "print(5 / 4) # 자동으로 floor 처리 됨\n", + "print(5.0 / 4)\n", + "print()\n", + "print(-5 / 4) # 자동으로 floor 처리 됨\n", + "print(-5.0 / 4)\n", + "\n", + "# 1\n", + "# 1.25\n", + "\n", + "# -2\n", + "# -1.25" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- //: floor division\n", + " - 그러므로 '정수 // 정수' 결과는 '정수 / 정수'와 항상 동일 \n", + " - 하지만 실수에 대한 // 연산 결과는 floor division 이므로 정수형 실수로 결과나 나옴" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.5\n", + "0.0\n", + "\n", + "1.25\n", + "1.0\n", + "1.25\n", + "1\n", + "\n", + "-1.25\n", + "-2.0\n", + "-1.25\n", + "-2\n" + ] + } + ], + "source": [ + "print(1.0 / 2)\n", + "print(1.0 // 2) # floor division\n", + "print()\n", + "print(5.0 / 4)\n", + "print(5.0 // 4) # floor division\n", + "print(5 / 4)\n", + "print(5 // 4) # floor division\n", + "print()\n", + "print(-5.0 / 4)\n", + "print(-5.0 // 4) # floor division\n", + "print(-5 / 4)\n", + "print(-5 // 4) # floor division\n", + "\n", + "# 0.5\n", + "# 0.0\n", + "\n", + "# 1.25\n", + "# 1.0\n", + "# 1\n", + "# 1\n", + "\n", + "# -1.25\n", + "# -2.0\n", + "# -2\n", + "# -2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 함수 내 디폴트 인자 선언시 조심할 점" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "non-default argument follows default argument (, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m def incr(x=1, y): # 디폴트 인자 뒤에 정상적인 인자 선언 안됨\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-default argument follows default argument\n" + ] + } + ], + "source": [ + "def incr(x=1, y): # 디폴트 인자 뒤에 정상적인 인자 선언 안됨\n", + " return x + y\n", + "\n", + "print(incr(5))\n", + "\n", + "print(incr(5, 10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 유용한 모듈 학습: 시각 다루기" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1504618340.500086\n", + "\n", + "\n", + "totalSeconds - 1504618340\n", + "totalMinutes - 25076972\n", + "totalHours - 417949\n", + "현재 시각은 13 : 32 : 20 GMT 입니다.\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "currentTime = time.time() # Unix Epoch 부터 현재까지 경과된 시각 (GMT/UST 기준)을 실수형 초 단위로 최대한 정확하게 얻어온다.\n", + "print(currentTime)\n", + "print(type(currentTime))\n", + "print()\n", + "\n", + "totalSeconds = int(currentTime) # 1970년 1월 1일 0시 이후부터 현재시각까지의 정수형 초 값을 얻어온다.\n", + "print(\"totalSeconds -\", totalSeconds)\n", + "currentSecond = totalSeconds % 60 # 현재 시각의 초 값을 얻어온다.\n", + "\n", + "totalMinutes = totalSeconds // 60 # 전체 분 값을 계산한다. \n", + "print(\"totalMinutes -\", totalMinutes)\n", + "currentMinute = totalMinutes % 60 # 현재 시각의 분 값을 얻어온다.\n", + "\n", + "totalHours = totalMinutes // 60 # 전체 시 값을 계산한다.\n", + "print(\"totalHours -\", totalHours)\n", + "currentHours = totalHours % 24 # 현재 시각의 시 값을 얻어온다.\n", + "\n", + "print(\"현재 시각은\", currentHours, \":\", currentMinute, \":\", currentSecond, \"GMT 입니다.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 대한민국의 Time Zone 및 로컬타임 얻기" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('KST', 'KST')\n", + "\n", + "time.struct_time(tm_year=2017, tm_mon=9, tm_mday=5, tm_hour=22, tm_min=32, tm_sec=27, tm_wday=1, tm_yday=248, tm_isdst=0)\n" + ] + } + ], + "source": [ + "print(time.tzname)\n", + "print()\n", + "localtime = time.localtime()\n", + "print(localtime)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 코드 학습: 숫자 맞추기 게임 소스" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello! What is your name?\n", + "YHHAN\n", + "Well, YHHAN, I am thinking of a number between 1 and 20.\n", + "Take a guess.\n", + "10\n", + "Your guess is too low.\n", + "Take a guess.\n", + "15\n", + "Your guess is too low.\n", + "Take a guess.\n", + "17\n", + "Your guess is too low.\n", + "Take a guess.\n", + "19\n", + "Good job, YHHAN! You guessed my number in 4 guesses!\n" + ] + } + ], + "source": [ + "# This is a guess the number game.\n", + "import random\n", + "\n", + "guessesTaken = 0\n", + "\n", + "print('Hello! What is your name?')\n", + "# myName = raw_input()\n", + "myName = input()\n", + "\n", + "number = random.randint(1, 20) # return random integer in range [a, b], including both end points.\n", + "print('Well, ' + myName + ', I am thinking of a number between 1 and 20.')\n", + "\n", + "while guessesTaken < 6:\n", + " print('Take a guess.') \n", + " guess = int(input())\n", + "\n", + " guessesTaken = guessesTaken + 1\n", + "\n", + " if guess < number:\n", + " print('Your guess is too low.')\n", + "\n", + " if guess > number:\n", + " print('Your guess is too high.')\n", + "\n", + " if guess == number:\n", + " break\n", + "\n", + "if guess == number:\n", + " guessesTaken = str(guessesTaken)\n", + " print('Good job, ' + myName + '! You guessed my number in ' + guessesTaken + ' guesses!')\n", + "\n", + "if guess != number:\n", + " number = str(number)\n", + " print('Nope. The number I was thinking of was ' + number)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. E-learning 3, 4 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 파이썬에서 지원하는 각종 타입들 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['AsyncGeneratorType', 'BuiltinFunctionType', 'BuiltinMethodType', 'CodeType', 'CoroutineType', 'DynamicClassAttribute', 'FrameType', 'FunctionType', 'GeneratorType', 'GetSetDescriptorType', 'LambdaType', 'MappingProxyType', 'MemberDescriptorType', 'MethodType', 'ModuleType', 'SimpleNamespace', 'TracebackType', '_GeneratorWrapper', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_ag', '_calculate_meta', '_collections_abc', '_functools', 'coroutine', 'new_class', 'prepare_class']\n", + "34\n" + ] + } + ], + "source": [ + "import types\n", + "\n", + "print(dir(types))\n", + "print(len(dir(types)))" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": {}, + "outputs": [], + "source": [ + "# print(type(123) is types.IntType)\n", + "# print(type(123.0) is types.FloatType)\n", + "# print(type('abc') is types.StringType)\n", + "# print(type([]) is types.ListType)\n", + "# print(type(()) is types.TupleType)\n", + "# print(type({}) is types.DictionaryType)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 레퍼런스 카운트 (Reference Count)와 쓰레기 수집 (Garbage Collection) " + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x = y = z = 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/referenceCount1.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "del x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/referenceCount2.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "y = 200\n", + "z = 300" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/referenceCount3.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 레퍼런스 카운트를 얻는 법\n", + " - sys 모듈의 getrefcount() 함수: 함수 수행 결과의 레퍼런스 카운트가 생각보다 큰 이유 --> 본 함수가 작업 처리를 하기 위해서 순간적으로 레퍼런스가 증가할 수도 있고, 파이썬 가상머신 자체가 관리의 용도로 레퍼런스를 지니고 있을 수 있음" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "\n", + "4\n", + "4\n", + "\n", + "5\n", + "5\n", + "5\n" + ] + } + ], + "source": [ + "import sys\n", + "\n", + "a1 = 191919\n", + "print(sys.getrefcount(a1)) # 새로운 191919 객체를 만들고 이 객체에 대한 reference count 반환\n", + "\n", + "print()\n", + "\n", + "a2 = a1\n", + "print(sys.getrefcount(a1)) # a1과 a3가 참조하는 객체는 동일하며, reference count는 기존보다 1이 증가되어 있음 \n", + "print(sys.getrefcount(a2)) # a2는 여전히 reference count가 이전 값과 동일함\n", + "print()\n", + "\n", + "aa1 = aa2 = aa3 = 202020\n", + "print(sys.getrefcount(aa1))\n", + "print(sys.getrefcount(aa2))\n", + "print(sys.getrefcount(aa3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "4) [참고] turtle 모듈 활용하기\n", + "- https://opentechschool.github.io/python-beginners/ko/simple_drawing.html\n", + "- http://openbookproject.net/thinkcs/python/english3e/hello_little_turtles.html\n", + "- https://www.youtube.com/watch?v=vEkiaHtdwIk\n", + "- https://python-turtle-demo.googlecode.com/files/SevenWaysToUseTurtle-PyCon2009.pdf (죽은 링크)" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import turtle\n", + "\n", + "t = turtle.Turtle()\n", + "t.shape(\"turtle\")\n", + "t.color(\"blue\")\n", + "\n", + "t.pensize(3) # 펜 사이즈를 3으로 설정한다.\n", + "t.penup() # 펜을 종이로 부터 들어올린다.\n", + "t.goto(-200, -50) # 해당 좌표로 이동한다.\n", + "t.pendown() # 펜을 종이에 놓는다.\n", + "t.circle(40, steps=3) # 반지름이 40인 원을 3 step으로만 그린다. ==> 삼각형이 그려짐\n", + "\n", + "t.penup()\n", + "t.goto(-100, -50)\n", + "t.pendown()\n", + "t.circle(40, steps=4)\n", + "\n", + "t.penup()\n", + "t.goto(0, -50)\n", + "t.pendown()\n", + "t.circle(40, steps=5)\n", + "\n", + "t.penup()\n", + "t.goto(100, -50)\n", + "t.pendown()\n", + "t.circle(40, steps=6)\n", + "\n", + "t.penup()\n", + "t.goto(200, -50)\n", + "t.pendown()\n", + "t.circle(40, steps=40)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Turtle의 펜 그리기 상태 메소드

\n", + " \n", + "| 메소드 명 | 설명 | \n", + "| ---------- | :--------- |\n", + "|turtle.pendown()|펜을 내려놓는다 - 움직일 때 그려진다.|\n", + "|turtle.penup()|펜을 들어올린다 - 움직일 때 그려지지 않는다.|\n", + "|turtle.pensize()|선의 두께를 특정 폭으로 설정한다.|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Turtle의 이동 메소드

\n", + "\n", + "|
메소드 명
|
설명
| \n", + "| ---------- | :--------- |\n", + "|turtle.forward(d)|turtle이 향하고 있는 방향으로 특정 거리 d만큼 앞으로 이동시킨다.|\n", + "|turtle.backward(d)|turtle이 향하고 있는 반대 방향으로 특정 거리 d만큼 뒤로 이동시킨다. turtle의 방향은 바뀌지 않는다.|\n", + "|turtle.right(angle)|turtle을 특정 각만큼 오른쪽으로 회전시킨다.|\n", + "|turtle.left(angle)|turtle을 특정 각만큼 왼쪽으로 회전시킨다.|\n", + "|turtle.goto(x,y)|turtle을 절대 위치 (x,y)로 옮긴다.|\n", + "|turtle.setx(x)|turtle의 x 좌표를 특정 위치로 옮긴다.|\n", + "|turtle.setx(y)|turtle의 y 좌표를 특정 위치로 옮긴다.|\n", + "|turtle.setheading(angle)|특정 각도로 turtle의 방향을 설정한다. 0-동쪽, 90-북쪽, 180-서쪽, 270-남쪽.|\n", + "|turtle.home()|turtle을 원점 (0,0)으로 옮기고 동쪽 방향으로 설정한다.|\n", + "|turtle.circle(r, ext, steps)|특정 반지름 r, 경계 ext와 단계 step인 원을 그린다.|\n", + "|turtle.dot(diameter, color)|특정 지름 diameter와 색상 color인 원을 그린다.|\n", + "|turtle.undo()|turtle의 마지막 명령을 (반복적으로)되돌린다.|\n", + "|turtle.speed(s)|1부터 10사이의 정수(10이 최대) s로 turtle의 속도를 설정한다.|\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Turtle 펜 색상, 채우기와 그리기 메소드

\n", + "\n", + "|
메소드 명
|
설명
|\n", + "| ---------- | :--------- |\n", + "|turtle.color(c)|펜 색상을 c로 설정한다.|\n", + "|turtle.fillcolor(c)|펜 채우기 색상을 c로 설정한다.|\n", + "|turtle.begin_fill()|도형을 채우기 전에 이 메소드를 호출한다.|\n", + "|turtle.end_fill()|begin_fill에 대한 마지막 호출전까지 그려진 도형을 채운다.|\n", + "|turtle.filling()|채우기 상태를 반환한다. 채우기 상태이면 True, 그렇지 않으면 False|\n", + "|turtle.clear()|창을 깨끗하게 지운다. turtle의 상태와 위치는 영향을 받지 않는다.|\n", + "|turtle.reset()|창을 깨끗하게 지우고 turtle의 상태와 위치를 원래 기본값으로 재설정한다.|\n", + "|turtle.screensize(w,h)|캔버스의 폭과 높이를 w와 h로 설정한다.|\n", + "|turtle.hideturtle()|turtle을 보이지 않게 만든다.|\n", + "|turtle.showturtle()|turtle을 보이게 만든다.|\n", + "|turtle.isvisible()|turtle이 보이면 True를 반환한다.|\n", + "|turtle.write(s,font=(\"Arial\",8,\"normal\"))|현재 turtle의 위치에 문자열 s를 쓴다. 폰트는 폰트명, 폰트크기, 폰트유형의 세 값으로 구성된다.|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 연습문제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- (1) 다음 사항을 읽고 요구하는 프로그램을 작성하시오.\n", + " * 정다각형은 모든 변의 길이와 내각의 크기가 같은 $n$개의 변으로 이루어진 다각형이다 (즉, 다각형이 등변이고 등각이다). \n", + " * 한변의 길이가 $s$일 때 정다각형의 넓이를 계산하는 공식은 다음과 같다.\n", + " * $정다각형의 넓이 = (n \\times s^2) / (4 \\times tan(\\pi / n))$\n", + " * 사용자로 부터 정다각형의 변의 개수와 변의 길이를 입력받고 정다각형의 넓이를 출력하는 프로그램을 작성하시오.\n", + " * 출력예는 다음과 같다.\n", + " \n", + " [출력예]\n", + " ```\n", + " 변의 개수를 입력하세요: 5 \n", + " 변의 길이를 입력하세요: 6.5\n", + " 다각형의 넓이는 73.69017017488385 입니다.\n", + " ```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- (2) 다음 사항을 읽고 요구하는 프로그램을 작성하시오.\n", + " * 사용자로 부터 ASCII 코드 (0부터 127 사이의 정수)를 입력받는다. \n", + " * 입력받은 코드에 대한 문자를 출력하는 프로그램을 작성하시오.\n", + " * 출력예는 다음과 같다.\n", + " \n", + " [출력예]\n", + " ```\n", + " ASCII코드를 입력하세요: 69 \n", + " 문자는 E 입니다.\n", + " ```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- (3) 다음 프로그램을 분석해보고, 어떤 목적의 프로그램인지 파악해보시오. 또한, assert 예약어가 무엇인지 Googling 하여 알아보시오." + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "\n", + "def distance( x0, y0, x1, y1 ):\n", + " \"\"\"( x0, y0 )와 ( x1, y1 ) 사이의 거리를 계산한다.\"\"\"\n", + " return math.sqrt( (x1-x0) ** 2 + (y1-y0) ** 2 )\n", + "\n", + "def close( left, right ):\n", + " \"\"\"두 부동소수점 값이 근사한지 테스트 한다.\"\"\"\n", + " return abs( left - right ) < 1.0e-6\n", + "\n", + "def test_distance():\n", + " \"\"\"distance 함수가 올바르게 동작하는지 테스트 한다.\"\"\"\n", + " assert close( distance( 1.0, 0.0, 1.0, 0.0 ), 0.0 ), '동일 지점 실패'\n", + " assert close( distance( 0.0, 0.0, 1.0, 0.0 ), 1.0 ), '단위 거리 실패'\n", + "\n", + "test_distance() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- (4) Python 터틀로 다음 그림을 그려보시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](http://openbookproject.net/thinkcs/python/english3e/_images/tess07.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. E-learning 1, 2 보충 자료" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) 현재 이름 공간에 있는 이름 리스트 출력" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- dir() 내장 함수 사용\n", + " - 리턴형: 리스트 \n", + " \n", + "- 아래 리스트 중 python 기본 이름\n", + " - \\_\\_builtins\\_\\_\n", + " - \\_\\_doc\\_\\_\n", + " - \\_\\_name\\_\\_\n", + " \n", + "- 나머지는 ipython이 자체적으로 생성한 이름들" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 단순 이름만 출력: dir()\n", + " - 리턴형: 리스트" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['In',\n", + " 'L',\n", + " 'NUMBER_OF_ELEMENTS',\n", + " 'Out',\n", + " 'Y1',\n", + " 'Y2',\n", + " '_',\n", + " '_146',\n", + " '_67',\n", + " '_68',\n", + " '_84',\n", + " '__',\n", + " '___',\n", + " '__builtin__',\n", + " '__builtins__',\n", + " '__doc__',\n", + " '__loader__',\n", + " '__name__',\n", + " '__package__',\n", + " '__spec__',\n", + " '_dh',\n", + " '_i',\n", + " '_i1',\n", + " '_i10',\n", + " '_i100',\n", + " '_i101',\n", + " '_i102',\n", + " '_i103',\n", + " '_i104',\n", + " '_i105',\n", + " '_i106',\n", + " '_i107',\n", + " '_i108',\n", + " '_i109',\n", + " '_i11',\n", + " '_i110',\n", + " '_i111',\n", + " '_i112',\n", + " '_i113',\n", + " '_i114',\n", + " '_i115',\n", + " '_i116',\n", + " '_i117',\n", + " '_i118',\n", + " '_i119',\n", + " '_i12',\n", + " '_i120',\n", + " '_i121',\n", + " '_i122',\n", + " '_i123',\n", + " '_i124',\n", + " '_i125',\n", + " '_i126',\n", + " '_i127',\n", + " '_i128',\n", + " '_i129',\n", + " '_i13',\n", + " '_i130',\n", + " '_i131',\n", + " '_i132',\n", + " '_i133',\n", + " '_i134',\n", + " '_i135',\n", + " '_i136',\n", + " '_i137',\n", + " '_i138',\n", + " '_i139',\n", + " '_i14',\n", + " '_i140',\n", + " '_i141',\n", + " '_i142',\n", + " '_i143',\n", + " '_i144',\n", + " '_i145',\n", + " '_i146',\n", + " '_i147',\n", + " '_i148',\n", + " '_i149',\n", + " '_i15',\n", + " '_i150',\n", + " '_i151',\n", + " '_i152',\n", + " '_i153',\n", + " '_i154',\n", + " '_i155',\n", + " '_i156',\n", + " '_i157',\n", + " '_i16',\n", + " '_i17',\n", + " '_i18',\n", + " '_i19',\n", + " '_i2',\n", + " '_i20',\n", + " '_i21',\n", + " '_i22',\n", + " '_i23',\n", + " '_i24',\n", + " '_i25',\n", + " '_i26',\n", + " '_i27',\n", + " '_i28',\n", + " '_i29',\n", + " '_i3',\n", + " '_i30',\n", + " '_i31',\n", + " '_i32',\n", + " '_i33',\n", + " '_i34',\n", + " '_i35',\n", + " '_i36',\n", + " '_i37',\n", + " '_i38',\n", + " '_i39',\n", + " '_i4',\n", + " '_i40',\n", + " '_i41',\n", + " '_i42',\n", + " '_i43',\n", + " '_i44',\n", + " '_i45',\n", + " '_i46',\n", + " '_i47',\n", + " '_i48',\n", + " '_i49',\n", + " '_i5',\n", + " '_i50',\n", + " '_i51',\n", + " '_i52',\n", + " '_i53',\n", + " '_i54',\n", + " '_i55',\n", + " '_i56',\n", + " '_i57',\n", + " '_i58',\n", + " '_i59',\n", + " '_i6',\n", + " '_i60',\n", + " '_i61',\n", + " '_i62',\n", + " '_i63',\n", + " '_i64',\n", + " '_i65',\n", + " '_i66',\n", + " '_i67',\n", + " '_i68',\n", + " '_i69',\n", + " '_i7',\n", + " '_i70',\n", + " '_i71',\n", + " '_i72',\n", + " '_i73',\n", + " '_i74',\n", + " '_i75',\n", + " '_i76',\n", + " '_i77',\n", + " '_i78',\n", + " '_i79',\n", + " '_i8',\n", + " '_i80',\n", + " '_i81',\n", + " '_i82',\n", + " '_i83',\n", + " '_i84',\n", + " '_i85',\n", + " '_i86',\n", + " '_i87',\n", + " '_i88',\n", + " '_i89',\n", + " '_i9',\n", + " '_i90',\n", + " '_i91',\n", + " '_i92',\n", + " '_i93',\n", + " '_i94',\n", + " '_i95',\n", + " '_i96',\n", + " '_i97',\n", + " '_i98',\n", + " '_i99',\n", + " '_ih',\n", + " '_ii',\n", + " '_iii',\n", + " '_oh',\n", + " '_sh',\n", + " 'a',\n", + " 'a1',\n", + " 'a2',\n", + " 'aa1',\n", + " 'aa2',\n", + " 'aa3',\n", + " 'add',\n", + " 'args',\n", + " 'b',\n", + " 'c',\n", + " 'ch',\n", + " 'chars',\n", + " 'close',\n", + " 'countLetters',\n", + " 'counts',\n", + " 'createList',\n", + " 'currentHours',\n", + " 'currentMinute',\n", + " 'currentSecond',\n", + " 'currentTime',\n", + " 'd',\n", + " 'dargs',\n", + " 'displayCounts',\n", + " 'displayList',\n", + " 'distance',\n", + " 'endTime',\n", + " 'end_time',\n", + " 'exit',\n", + " 'f',\n", + " 'f1',\n", + " 'f2',\n", + " 'files',\n", + " 'format',\n", + " 'g',\n", + " 'getRandomLowerCaseLetter',\n", + " 'get_ipython',\n", + " 'guess',\n", + " 'guessesTaken',\n", + " 'h',\n", + " 'i',\n", + " 'imp',\n", + " 'k',\n", + " 'l',\n", + " 'l2',\n", + " 'listSplited',\n", + " 'list_a',\n", + " 'list_b',\n", + " 'localtime',\n", + " 'lst',\n", + " 'mat',\n", + " 'math',\n", + " 'myName',\n", + " 'mymath',\n", + " 'n',\n", + " 'name',\n", + " 'number',\n", + " 'os',\n", + " 'path',\n", + " 'quit',\n", + " 'random',\n", + " 'runTime',\n", + " 's',\n", + " 'startTime',\n", + " 'start_time',\n", + " 'string',\n", + " 'subdirs',\n", + " 'sys',\n", + " 't',\n", + " 'test_distance',\n", + " 'time',\n", + " 'totalHours',\n", + " 'totalMinutes',\n", + " 'totalSeconds',\n", + " 'turtle',\n", + " 'types',\n", + " 'userid',\n", + " 'val',\n", + " 'words',\n", + " 'y',\n", + " 'z']" + ] + }, + "execution_count": 157, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) 특정 객체가 지니고 있는 이름 리스트 출력" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']\n" + ] + } + ], + "source": [ + "a = 10\n", + "print(dir(a))" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '__IPYTHON__', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'dreload', 'enumerate', 'eval', 'exec', 'filter', 'float', 'format', 'frozenset', 'get_ipython', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']\n" + ] + } + ], + "source": [ + "print(dir(__builtin__))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) 파이썬 버전 및 모듈들이 존재할 수 있는 패스 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.6.1 |Anaconda custom (x86_64)| (default, May 11 2017, 13:04:09) \n", + "[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]\n", + "\n", + "['', '/Users/do-hyungkwon/anaconda/lib/python36.zip', '/Users/do-hyungkwon/anaconda/lib/python3.6', '/Users/do-hyungkwon/anaconda/lib/python3.6/lib-dynload', '/Users/do-hyungkwon/anaconda/lib/python3.6/site-packages', '/Users/do-hyungkwon/anaconda/lib/python3.6/site-packages/Sphinx-1.5.6-py3.6.egg', '/Users/do-hyungkwon/anaconda/lib/python3.6/site-packages/aeosa', '/Users/do-hyungkwon/anaconda/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg', '/Users/do-hyungkwon/anaconda/lib/python3.6/site-packages/IPython/extensions', '/Users/do-hyungkwon/.ipython']\n" + ] + } + ], + "source": [ + "import sys\n", + "print(sys.version)\n", + "print()\n", + "print(sys.path)" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', '_git', '_home', '_xoptions', 'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_wrapper', 'getallocatedblocks', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'ps3', 'set_asyncgen_hooks', 'set_coroutine_wrapper', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions']\n" + ] + } + ], + "source": [ + "print(dir(sys))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4) 연습문제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음은 math 모듈을 가져오는 코딩이다. math 모듈을 가져온 후 math 모듈에 정의된 함수를 이용하여 -4.3 값을 반올림한 후 절대값을 계산하여 출력하는 코딩을 한 줄로 완성하라." + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import math" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음은 두 점의 좌표 (x1, y1), (x2, y2)를 나타내는 변수 값들이다. math 모듈에 정의된 함수를 이용하여 이 두 점 사이의 거리를 계산하여 출력하는 코딩을 한 줄로 완성하라. " + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x1 = 10\n", + "y1 = 20\n", + "x2 = 30\n", + "y2 = 40" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/t.txt b/python3.6/t.txt new file mode 100644 index 0000000..de02ddc --- /dev/null +++ b/python3.6/t.txt @@ -0,0 +1,4 @@ +Its power: Python developers typically report +they are able to develop applications in a half +to a tenth the amount of time it takes them to do +the same work in such languages as C. \ No newline at end of file diff --git a/supplement-2016-09.ipynb b/supplement-2016-09.ipynb index a2fcf20..4a02ae6 100644 --- a/supplement-2016-09.ipynb +++ b/supplement-2016-09.ipynb @@ -7,7 +7,7 @@ "# 수업 보충 자료" ] }, - { + { "cell_type": "markdown", "metadata": {}, "source": [ @@ -82,9 +82,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -104,9 +102,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -191,9 +187,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -223,9 +217,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -262,9 +254,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -291,9 +281,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -319,9 +307,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "SyntaxError", @@ -339,9 +325,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -371,9 +355,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -405,9 +387,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -435,9 +415,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -462,9 +440,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -491,9 +467,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -521,9 +495,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -545,9 +517,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -566,9 +536,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -602,9 +570,7 @@ { "cell_type": "code", "execution_count": 28, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -633,9 +599,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -653,9 +617,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -674,9 +636,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -703,9 +663,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -731,9 +689,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -752,9 +708,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -778,9 +732,7 @@ { "cell_type": "code", "execution_count": 34, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -825,9 +777,7 @@ { "cell_type": "code", "execution_count": 42, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -939,9 +889,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -967,9 +915,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -1000,9 +946,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -1045,9 +989,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1075,9 +1017,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1110,9 +1050,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1139,9 +1077,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1167,9 +1103,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1193,9 +1127,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1266,9 +1198,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1355,9 +1285,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1427,9 +1355,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1514,9 +1440,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1548,9 +1472,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -1578,9 +1500,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1626,9 +1546,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1653,9 +1571,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1685,9 +1601,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1717,9 +1631,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1749,9 +1661,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1782,9 +1692,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1808,9 +1716,7 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1849,7 +1755,7 @@ "cell_type": "code", "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -1885,9 +1791,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1906,9 +1810,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1934,9 +1836,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1955,9 +1855,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1987,9 +1885,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2011,9 +1907,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2030,9 +1924,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2049,9 +1941,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2068,9 +1958,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2090,9 +1978,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2112,9 +1998,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "NameError", @@ -2154,9 +2038,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2195,9 +2077,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2214,9 +2094,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2255,9 +2133,7 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2302,9 +2178,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2324,9 +2198,7 @@ { "cell_type": "code", "execution_count": 25, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2344,9 +2216,7 @@ { "cell_type": "code", "execution_count": 28, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2363,9 +2233,7 @@ { "cell_type": "code", "execution_count": 29, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2393,9 +2261,7 @@ { "cell_type": "code", "execution_count": 30, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2418,9 +2284,7 @@ { "cell_type": "code", "execution_count": 31, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2443,9 +2307,7 @@ { "cell_type": "code", "execution_count": 32, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2479,9 +2341,7 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2515,9 +2375,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2563,9 +2421,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "SyntaxError", @@ -2595,9 +2451,7 @@ { "cell_type": "code", "execution_count": 40, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2646,9 +2500,7 @@ { "cell_type": "code", "execution_count": 39, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2677,9 +2529,7 @@ { "cell_type": "code", "execution_count": 41, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2750,9 +2600,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -2816,9 +2664,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -2915,9 +2761,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -3117,7 +2961,7 @@ "cell_type": "code", "execution_count": 27, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -3193,9 +3037,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -3241,9 +3083,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -3261,9 +3101,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -3287,9 +3125,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -3312,9 +3148,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -3357,7 +3191,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [] @@ -3396,23 +3230,23 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [Root]", + "display_name": "Python 3", "language": "python", - "name": "Python [Root]" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.6.1" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } From ac22e9edaac669d5fe235115c4a35ada835097bf Mon Sep 17 00:00:00 2001 From: dohyung Date: Tue, 5 Sep 2017 23:00:14 +0900 Subject: [PATCH 030/124] =?UTF-8?q?python4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python04.ipynb | 1216 ++++++++++++++++++------------------- python3.6/python04.ipynb | 1238 +++++++++++++++++++------------------- 2 files changed, 1216 insertions(+), 1238 deletions(-) diff --git a/python04.ipynb b/python04.ipynb index 0431058..a7d6936 100644 --- a/python04.ipynb +++ b/python04.ipynb @@ -1,644 +1,622 @@ { - "metadata": { - "name": "", - "signature": "sha256:d741b33c2e388a74e523537b59691d549be7e1f2e8d247cdb03a101bac3eea2b" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 4. \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804 \ubc0f \ub0b4\uc7a5 \uc790\ub8cc\ud615 \ud2b9\uc131\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ub9ac\uc2a4\ud2b8\uc758 \uc815\uc758\uc640 \ub9ac\uc2a4\ud2b8 \uae30\ubcf8 \uc5f0\uc0b0\n", - "- \ub9ac\uc2a4\ud2b8: \uc784\uc758\uc758 \uac1d\uccb4\ub97c \uc21c\ucc28\uc801\uc73c\ub85c \uc800\uc7a5\ud558\ub294 \uc9d1\ud569\uc801 \uc790\ub8cc\ud615\n", - "- \ubb38\uc790\uc5f4\uc774 \uc9c0\ub2cc \ub300\ubd80\ubd84\uc758 \uc5f0\uc0b0\ub4e4\uc740 \ub9ac\uc2a4\ud2b8\ub3c4 \uc9c0\uc6d0" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1,2,3]\n", - "print type(L)\n", - "print\n", - "print len(L)\n", - "print\n", - "print L[1]\n", - "print L[-1]\n", - "print L[1:3]\n", - "print\n", - "print L + L\n", - "print L * 3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "3\n", - "\n", - "2\n", - "3\n", - "[2, 3]\n", - "\n", - "[1, 2, 3, 1, 2, 3]\n", - "[1, 2, 3, 1, 2, 3, 1, 2, 3]\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8\ub294 \ubcc0\uacbd \uac00\ub2a5" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l1 = [4,5,6]\n", - "l1[0] = 10\n", - "print l1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[10, 5, 6]\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/changeListElement.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub3d9\uc77c\ud55c \ubcc0\uc218\uc5d0 \ub2e4\ub978 \ub9ac\uc2a4\ud2b8\ub97c \ud560\ub2f9\ud558\ub294 \uac83\uc740 \ud574\ub2f9 \ubcc0\uc218\uc758 \ub808\ud37c\ub7f0\uc2a4\ub97c \ubcc0\uacbd\ud568" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 4. 리스트, 튜플, 사전 및 내장 자료형 특성\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 리스트, 튜플, 사전\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 리스트의 정의와 리스트 기본 연산\n", + "- 리스트: 임의의 객체를 순차적으로 저장하는 집합적 자료형\n", + "- 문자열이 지닌 대부분의 연산들은 리스트도 지원" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "3\n", + "\n", + "2\n", + "3\n", + "[2, 3]\n", + "\n", + "[1, 2, 3, 1, 2, 3]\n", + "[1, 2, 3, 1, 2, 3, 1, 2, 3]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l1 = [1,2,3]\n", - "l1 = [4,5,6]\n", - "print l1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[4, 5, 6]\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/referenceChangeList.png)" + } + ], + "source": [ + "L = [1,2,3]\n", + "print type(L)\n", + "print\n", + "print len(L)\n", + "print\n", + "print L[1]\n", + "print L[-1]\n", + "print L[1:3]\n", + "print\n", + "print L + L\n", + "print L * 3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트는 변경 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[10, 5, 6]\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 range() \ud568\uc218\ub97c \ud1b5\ud55c \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8 \uc0dd\uc131\n", - "- range(k): 0\ubd80\ud130 k-1\uae4c\uc9c0\uc758 \uc22b\uc790\uc758 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud568 " + } + ], + "source": [ + "l1 = [4,5,6]\n", + "l1[0] = 10\n", + "print l1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/changeListElement.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 동일한 변수에 다른 리스트를 할당하는 것은 해당 변수의 레퍼런스를 변경함" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4, 5, 6]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = range(10)\n", - "print L\n", - "print L[::2]\n", - "print L[::-1]\n", - "print 4 in L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", - "[0, 2, 4, 6, 8]\n", - "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n", - "True\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ud29c\ud50c\uc758 \uc815\uc758\uc640 \uae30\ubcf8 \uc5f0\uc0b0\n", - "- \ud29c\ud50c: \ub9ac\uc2a4\ud2b8\uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc \ud29c\ud50c \ub0b4\uc758 \uac12\uc744 \ubcc0\uacbd\ud560 \uc218 \uc5c6\uc74c\n", - " - \uc801\ud569\ud55c \uc0ac\uc6a9 \uc608\n", - " - months = ('January','February','March','April','May','June','July','August','September','October','November',' December')\n", - " - \uac01 \uac12\uc5d0 \ub300\ud574 \uc778\ub371\uc2a4\uac00 \ubd80\uc5ec\ub428\n", - "- \ubb38\uc790\uc5f4\uc774 \uc9c0\ub2cc \ub300\ubd80\ubd84\uc758 \uc5f0\uc0b0\ub4e4\uc740 \ud29c\ud50c\ub3c4 \uc9c0\uc6d0" + } + ], + "source": [ + "l1 = [1,2,3]\n", + "l1 = [4,5,6]\n", + "print l1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/referenceChangeList.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 range() 함수를 통한 인덱스 리스트 생성\n", + "- range(k): 0부터 k-1까지의 숫자의 리스트를 반환함 " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "[0, 2, 4, 6, 8]\n", + "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = (1,2,3)\n", + } + ], + "source": [ + "L = range(10)\n", + "print L\n", + "print L[::2]\n", + "print L[::-1]\n", + "print 4 in L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 튜플의 정의와 기본 연산\n", + "- 튜플: 리스트와 유사하지만 튜플 내의 값을 변경할 수 없음\n", + " - 적합한 사용 예\n", + " - months = ('January','February','March','April','May','June','July','August','September','October','November',' December')\n", + " - 각 값에 대해 인덱스가 부여됨\n", + "- 문자열이 지닌 대부분의 연산들은 튜플도 지원" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", "\n", - "print len(t)\n", - "print\n", - "print t[0]\n", - "print t[-1]\n", - "print t[0:2]\n", - "print t[::2]\n", - "print\n", - "print t + t + t\n", - "print t * 3\n", - "print\n", - "print 3 in t" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3\n", - "\n", - "1\n", - "3\n", - "(1, 2)\n", - "(1, 3)\n", - "\n", - "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", - "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", - "\n", - "True\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ud29c\ud50c\uc758 \uc0c1\uc218\uc801 \uc131\uaca9\n", - "- \ud29c\ud50c\uc740 \ub0b4\uc6a9 \ubcc0\uacbd \ubd88\uac00" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = (1,2,3)\n", + "1\n", + "3\n", + "(1, 2)\n", + "(1, 3)\n", "\n", - "t[0] = 100" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'tuple' object does not support item assignment", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" - ] - } - ], - "prompt_number": 105 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubc18\uba74\uc5d0 \ub9ac\uc2a4\ud2b8\ub294 \ub0b4\uc6a9 \ubcc0\uacbd \uac00\ub2a5" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1,2,3]\n", - "L[0] = 100\n", + "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", + "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", "\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[100, 2, 3]\n" - ] - } - ], - "prompt_number": 107 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-5 \uc0ac\uc804\uc758 \uc815\uc758\uc640 \uae30\ubcf8 \uc0ac\uc6a9\ubc95\n", - "- \uc815\uc218\ud615 \uc778\ub371\uc2a4\uac00 \uc544\ub2cc \ud0a4\ub97c \uc774\uc6a9\ud558\uc5ec \uac12\uc744 \uc800\uc7a5\ud558\ub294 \uc790\ub8cc \uad6c\uc870\n", - " - \uc800\uc7a5\ub41c \uac01 \uc790\ub8cc\uc5d0 \ub300\ud55c \uc21c\uc11c\ub294 \uc758\ubbf8 \uc5c6\uc74c\n", - "- \ub9e4\ud551(Mapping) \ud568\uc218\uc640 \ube44\uc2b7\ud55c \uc5ed\ud560\uc744 \ud568\n", - " - x\ub77c\ub294 \ud0a4\uac12\uc744 \ub123\uc73c\uba74 \uac12 y\ub97c \ubc18\ud658\ud568" + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", - "print d['one']\n" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "hana\n" - ] - } - ], - "prompt_number": 109 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", - "d['four'] = 'net' # \uc0c8 \ud56d\ubaa9\uc758 \uc0bd\uc785\n", - "print d\n", - "d['one'] = 1 # \uae30\uc874 \ud56d\ubaa9\uc758 \uac12 \ubcc0\uacbd\n", - "print d\n", - "print 'one' in d # \ud0a4\uc5d0 \ub300\ud55c \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 'hana'}\n", - "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 1}\n", - "True\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", - "print d.keys() # \ud0a4\ub9cc \ub9ac\uc2a4\ud2b8\ub85c \ucd94\ucd9c\ud568\n", - "print d.values() # \uac12\ub9cc \ub9ac\uc2a4\ud2b8\ub85c \ucd94\ucd9c\ud568\n", - "print d.items() # \ud0a4\uc640 \uac12\uc758 \ud29c\ud50c\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\ud568" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['four', 'three', 'two', 'one']\n", - "['net', 'set', 'dul', 1]\n", - "[('four', 'net'), ('three', 'set'), ('two', 'dul'), ('one', 1)]\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc758 \uc815\ub9ac\uc640 \uac1d\uccb4 \uc2e0\uc6d0 \ud30c\uc545\n", - "***" + } + ], + "source": [ + "t = (1,2,3)\n", + "\n", + "print len(t)\n", + "print\n", + "print t[0]\n", + "print t[-1]\n", + "print t[0:2]\n", + "print t[::2]\n", + "print\n", + "print t + t + t\n", + "print t * 3\n", + "print\n", + "print 3 in t" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 튜플의 상수적 성격\n", + "- 튜플은 내용 변경 불가" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'tuple' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc758 \ud2b9\uc131 \uc815\ub9ac" + } + ], + "source": [ + "t = (1,2,3)\n", + "\n", + "t[0] = 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 반면에 리스트는 내용 변경 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[100, 2, 3]\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "| \uc790\ub8cc\ud615 | \uc800\uc7a5/\uc811\uadfc \ubc29\ubc95 | \ubcc0\uacbd \uac00\ub2a5\uc131 | \uc800\uc7a5 \ubaa8\ub378 |\n", - "|:------:|:-----------------:|:-----------:|:--------------------:|\n", - "| \uc218\uce58\ud615 | \uc9c1\uc811(Direct) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ub9ac\ud130\ub7f4 (Literal) |\n", - "| \ubb38\uc790\uc5f4 | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ub9ac\ud130\ub7f4 (Literal) |\n", - "| \ub9ac\uc2a4\ud2b8 | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\uac00\ub2a5(Mutable) | \ucee8\ud14c\uc774\ub108 (Container) |\n", - "| \ud29c\ud50c | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ucee8\ud14c\uc774\ub108 (Container) |\n", - "| \uc0ac\uc804 | \ub9e4\ud551 (Mapping) | \ubcc0\uacbd\uac00\ub2a5(Mutable) | \ucee8\ud14c\uc774\ub108 (Container) |" + } + ], + "source": [ + "L = [1,2,3]\n", + "L[0] = 100\n", + "\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 사전의 정의와 기본 사용법\n", + "- 정수형 인덱스가 아닌 키를 이용하여 값을 저장하는 자료 구조\n", + " - 저장된 각 자료에 대한 순서는 의미 없음\n", + "- 매핑(Mapping) 함수와 비슷한 역할을 함\n", + " - x라는 키값을 넣으면 값 y를 반환함" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hana\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ub0b4\uc7a5 \uc790\ub8cc\ud615 \uc54c\uc544\ubcf4\uae30" + } + ], + "source": [ + "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", + "print d['one']\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 'hana'}\n", + "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 1}\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print type(3) #\uc815\uc218\n", - "print type(3.3) #\uc2e4\uc218\n", - "print type('abc') #\ubb38\uc790\uc5f4" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print type([]) #\ub9ac\uc2a4\ud2b8\n", - "print type(()) #\ud29c\ud50c\n", - "print type({}) #\uc0ac\uc804(dict)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc790\ub8cc\ud615\uc758 \ube44\uad50" + } + ], + "source": [ + "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", + "d['four'] = 'net' # 새 항목의 삽입\n", + "print d\n", + "d['one'] = 1 # 기존 항목의 값 변경\n", + "print d\n", + "print 'one' in d # 키에 대한 멤버쉽 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['four', 'three', 'two', 'one']\n", + "['net', 'set', 'dul', 1]\n", + "[('four', 'net'), ('three', 'set'), ('two', 'dul'), ('one', 1)]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 0\n", - "L = [1,2,3]\n", - "print type(a) == type(0)\n", - "print type(L) == type([])\n", - "print type(L[0]) == type(0)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n", - "True\n" - ] - } - ], - "prompt_number": 41 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print type(None) #None \uac1d\uccb4, \uc544\ubb34 \uac12\ub3c4 \uc5c6\ub2e4(\ud639\uc740 \uc544\ub2c8\ub2e4)\ub97c \ub098\ud0c0\ub0b4\ub294 \uac1d\uccb4\n", - "print\n", - "a = None\n", - "print a\n", - "print type(a)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "None\n", - "\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \uac1d\uccb4\uc758 \uc2e0\uc6d0 \uc2dd\ubcc4\ud558\uae30" + } + ], + "source": [ + "d = {'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", + "print d.keys() # 키만 리스트로 추출함\n", + "print d.values() # 값만 리스트로 추출함\n", + "print d.items() # 키와 값의 튜플을 리스트로 반환함" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 내장 자료형의 정리와 객체 신원 파악\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 내장 자료형의 특성 정리" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 자료형 | 저장/접근 방법 | 변경 가능성 | 저장 모델 |\n", + "|:------:|:-----------------:|:-----------:|:--------------------:|\n", + "| 수치형 | 직접(Direct) | 변경불가능(Immutable) | 리터럴 (Literal) |\n", + "| 문자열 | 시퀀스 (Sequence) | 변경불가능(Immutable) | 리터럴 (Literal) |\n", + "| 리스트 | 시퀀스 (Sequence) | 변경가능(Mutable) | 컨테이너 (Container) |\n", + "| 튜플 | 시퀀스 (Sequence) | 변경불가능(Immutable) | 컨테이너 (Container) |\n", + "| 사전 | 매핑 (Mapping) | 변경가능(Mutable) | 컨테이너 (Container) |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 내장 자료형 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- id(): \uac1d\uccb4\uc758 \uc2dd\ubcc4\uc790\ub97c \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "print type(3) #정수\n", + "print type(3.3) #실수\n", + "print type('abc') #문자열" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 500\n", - "b = a\n", - "print id(a)\n", - "print id(b)\n", - "print\n", - "x = 1\n", - "y = 1\n", - "print id(x)\n", - "print id(y)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "4478569376\n", - "4478569376\n", - "\n", - "4298182776\n", - "4298182776\n" - ] - } - ], - "prompt_number": 58 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- is \ud0a4\uc6cc\ub4dc: \ub450 \uac1d\uccb4\uc758 \uc2dd\ubcc4\uc790\uac00 \ub3d9\uc77c\ud55c\uc9c0 \ud14c\uc2a4\ud2b8\ud55c\ub2e4." + } + ], + "source": [ + "print type([]) #리스트\n", + "print type(()) #튜플\n", + "print type({}) #사전(dict)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 자료형의 비교" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c = [1,2,3]\n", - "d = [1,2,3]\n", - "print c is d\n", - "\n", - "a = 500\n", - "b = a\n", - "print a is b\n", + } + ], + "source": [ + "a = 0\n", + "L = [1,2,3]\n", + "print type(a) == type(0)\n", + "print type(L) == type([])\n", + "print type(L[0]) == type(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", "\n", - "x = 1\n", - "y = 1\n", - "print x is y\n", + "None\n", + "\n" + ] + } + ], + "source": [ + "print type(None) #None 객체, 아무 값도 없다(혹은 아니다)를 나타내는 객체\n", + "print\n", + "a = None\n", + "print a\n", + "print type(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 객체의 신원 식별하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- id(): 객체의 식별자를 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4478569376\n", + "4478569376\n", "\n", - "e = f = [4,5,6]\n", - "print e is f" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "True\n", - "True\n", - "True\n" - ] - } - ], - "prompt_number": 60 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- == \uc5f0\uc0b0\uc790: \ub450 \uac1d\uccb4\uc758 \uac12\uc774 \ub3d9\uc77c\ud55c\uc9c0\ub97c \ud14c\uc2a4\ud2b8\ud55c\ub2e4." + "4298182776\n", + "4298182776\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c = [1,2,3]\n", - "d = [1,2,3]\n", - "c == d" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 150, - "text": [ - "True" - ] - } - ], - "prompt_number": 150 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "a = 500\n", + "b = a\n", + "print id(a)\n", + "print id(b)\n", + "print\n", + "x = 1\n", + "y = 1\n", + "print id(x)\n", + "print id(y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- is 키워드: 두 객체의 식별자가 동일한지 테스트한다." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "True\n", + "True\n" ] } ], - "metadata": {} + "source": [ + "c = [1,2,3]\n", + "d = [1,2,3]\n", + "print c is d\n", + "\n", + "a = 500\n", + "b = a\n", + "print a is b\n", + "\n", + "x = 1\n", + "y = 1\n", + "print x is y\n", + "\n", + "e = f = [4,5,6]\n", + "print e is f" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- == 연산자: 두 객체의 값이 동일한지를 테스트한다." + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 150, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "c = [1,2,3]\n", + "d = [1,2,3]\n", + "c == d" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python04.ipynb b/python3.6/python04.ipynb index 0431058..ca08288 100644 --- a/python3.6/python04.ipynb +++ b/python3.6/python04.ipynb @@ -1,644 +1,644 @@ { - "metadata": { - "name": "", - "signature": "sha256:d741b33c2e388a74e523537b59691d549be7e1f2e8d247cdb03a101bac3eea2b" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 4. \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804 \ubc0f \ub0b4\uc7a5 \uc790\ub8cc\ud615 \ud2b9\uc131\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ub9ac\uc2a4\ud2b8\uc758 \uc815\uc758\uc640 \ub9ac\uc2a4\ud2b8 \uae30\ubcf8 \uc5f0\uc0b0\n", - "- \ub9ac\uc2a4\ud2b8: \uc784\uc758\uc758 \uac1d\uccb4\ub97c \uc21c\ucc28\uc801\uc73c\ub85c \uc800\uc7a5\ud558\ub294 \uc9d1\ud569\uc801 \uc790\ub8cc\ud615\n", - "- \ubb38\uc790\uc5f4\uc774 \uc9c0\ub2cc \ub300\ubd80\ubd84\uc758 \uc5f0\uc0b0\ub4e4\uc740 \ub9ac\uc2a4\ud2b8\ub3c4 \uc9c0\uc6d0" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1,2,3]\n", - "print type(L)\n", - "print\n", - "print len(L)\n", - "print\n", - "print L[1]\n", - "print L[-1]\n", - "print L[1:3]\n", - "print\n", - "print L + L\n", - "print L * 3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "3\n", - "\n", - "2\n", - "3\n", - "[2, 3]\n", - "\n", - "[1, 2, 3, 1, 2, 3]\n", - "[1, 2, 3, 1, 2, 3, 1, 2, 3]\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8\ub294 \ubcc0\uacbd \uac00\ub2a5" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l1 = [4,5,6]\n", - "l1[0] = 10\n", - "print l1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[10, 5, 6]\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/changeListElement.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub3d9\uc77c\ud55c \ubcc0\uc218\uc5d0 \ub2e4\ub978 \ub9ac\uc2a4\ud2b8\ub97c \ud560\ub2f9\ud558\ub294 \uac83\uc740 \ud574\ub2f9 \ubcc0\uc218\uc758 \ub808\ud37c\ub7f0\uc2a4\ub97c \ubcc0\uacbd\ud568" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 4. 리스트, 튜플, 사전 및 내장 자료형 특성\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 리스트, 튜플, 사전\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 리스트의 정의와 리스트 기본 연산\n", + "- 리스트: 임의의 객체를 순차적으로 저장하는 집합적 자료형\n", + "- 문자열이 지닌 대부분의 연산들은 리스트도 지원" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "3\n", + "\n", + "2\n", + "3\n", + "[2, 3]\n", + "\n", + "[1, 2, 3, 1, 2, 3]\n", + "[1, 2, 3, 1, 2, 3, 1, 2, 3]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l1 = [1,2,3]\n", - "l1 = [4,5,6]\n", - "print l1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[4, 5, 6]\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/referenceChangeList.png)" + } + ], + "source": [ + "L = [1,2,3]\n", + "print(type(L))\n", + "print()\n", + "print(len(L))\n", + "print()\n", + "print(L[1])\n", + "print(L[-1])\n", + "print(L[1:3])\n", + "print()\n", + "print(L + L)\n", + "print(L * 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트는 변경 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[10, 5, 6]\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 range() \ud568\uc218\ub97c \ud1b5\ud55c \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8 \uc0dd\uc131\n", - "- range(k): 0\ubd80\ud130 k-1\uae4c\uc9c0\uc758 \uc22b\uc790\uc758 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud568 " + } + ], + "source": [ + "l1 = [4,5,6]\n", + "l1[0] = 10\n", + "print(l1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/changeListElement.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 동일한 변수에 다른 리스트를 할당하는 것은 해당 변수의 레퍼런스를 변경함" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4, 5, 6]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = range(10)\n", - "print L\n", - "print L[::2]\n", - "print L[::-1]\n", - "print 4 in L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", - "[0, 2, 4, 6, 8]\n", - "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n", - "True\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ud29c\ud50c\uc758 \uc815\uc758\uc640 \uae30\ubcf8 \uc5f0\uc0b0\n", - "- \ud29c\ud50c: \ub9ac\uc2a4\ud2b8\uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc \ud29c\ud50c \ub0b4\uc758 \uac12\uc744 \ubcc0\uacbd\ud560 \uc218 \uc5c6\uc74c\n", - " - \uc801\ud569\ud55c \uc0ac\uc6a9 \uc608\n", - " - months = ('January','February','March','April','May','June','July','August','September','October','November',' December')\n", - " - \uac01 \uac12\uc5d0 \ub300\ud574 \uc778\ub371\uc2a4\uac00 \ubd80\uc5ec\ub428\n", - "- \ubb38\uc790\uc5f4\uc774 \uc9c0\ub2cc \ub300\ubd80\ubd84\uc758 \uc5f0\uc0b0\ub4e4\uc740 \ud29c\ud50c\ub3c4 \uc9c0\uc6d0" + } + ], + "source": [ + "l1 = [1,2,3]\n", + "l1 = [4,5,6]\n", + "print(l1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/referenceChangeList.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 range() 함수를 통한 인덱스 리스트 생성\n", + "- range(k): 0부터 k-1까지의 숫자의 리스트를 반환함 " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "range(0, 10)\n", + "range(0, 10, 2)\n", + "range(9, -1, -1)\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = (1,2,3)\n", + } + ], + "source": [ + "L = range(10)\n", + "print(L)\n", + "print(L[::2])\n", + "print(L[::-1])\n", + "print(4 in L)\n", + "\n", + "# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "# [0, 2, 4, 6, 8]\n", + "# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 튜플의 정의와 기본 연산\n", + "- 튜플: 리스트와 유사하지만 튜플 내의 값을 변경할 수 없음\n", + " - 적합한 사용 예\n", + " - months = ('January','February','March','April','May','June','July','August','September','October','November',' December')\n", + " - 각 값에 대해 인덱스가 부여됨\n", + "- 문자열이 지닌 대부분의 연산들은 튜플도 지원" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", "\n", - "print len(t)\n", - "print\n", - "print t[0]\n", - "print t[-1]\n", - "print t[0:2]\n", - "print t[::2]\n", - "print\n", - "print t + t + t\n", - "print t * 3\n", - "print\n", - "print 3 in t" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3\n", - "\n", - "1\n", - "3\n", - "(1, 2)\n", - "(1, 3)\n", - "\n", - "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", - "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", - "\n", - "True\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ud29c\ud50c\uc758 \uc0c1\uc218\uc801 \uc131\uaca9\n", - "- \ud29c\ud50c\uc740 \ub0b4\uc6a9 \ubcc0\uacbd \ubd88\uac00" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = (1,2,3)\n", + "1\n", + "3\n", + "(1, 2)\n", + "(1, 3)\n", "\n", - "t[0] = 100" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'tuple' object does not support item assignment", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" - ] - } - ], - "prompt_number": 105 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubc18\uba74\uc5d0 \ub9ac\uc2a4\ud2b8\ub294 \ub0b4\uc6a9 \ubcc0\uacbd \uac00\ub2a5" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1,2,3]\n", - "L[0] = 100\n", + "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", + "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", "\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[100, 2, 3]\n" - ] - } - ], - "prompt_number": 107 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-5 \uc0ac\uc804\uc758 \uc815\uc758\uc640 \uae30\ubcf8 \uc0ac\uc6a9\ubc95\n", - "- \uc815\uc218\ud615 \uc778\ub371\uc2a4\uac00 \uc544\ub2cc \ud0a4\ub97c \uc774\uc6a9\ud558\uc5ec \uac12\uc744 \uc800\uc7a5\ud558\ub294 \uc790\ub8cc \uad6c\uc870\n", - " - \uc800\uc7a5\ub41c \uac01 \uc790\ub8cc\uc5d0 \ub300\ud55c \uc21c\uc11c\ub294 \uc758\ubbf8 \uc5c6\uc74c\n", - "- \ub9e4\ud551(Mapping) \ud568\uc218\uc640 \ube44\uc2b7\ud55c \uc5ed\ud560\uc744 \ud568\n", - " - x\ub77c\ub294 \ud0a4\uac12\uc744 \ub123\uc73c\uba74 \uac12 y\ub97c \ubc18\ud658\ud568" + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", - "print d['one']\n" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "hana\n" - ] - } - ], - "prompt_number": 109 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", - "d['four'] = 'net' # \uc0c8 \ud56d\ubaa9\uc758 \uc0bd\uc785\n", - "print d\n", - "d['one'] = 1 # \uae30\uc874 \ud56d\ubaa9\uc758 \uac12 \ubcc0\uacbd\n", - "print d\n", - "print 'one' in d # \ud0a4\uc5d0 \ub300\ud55c \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 'hana'}\n", - "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 1}\n", - "True\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", - "print d.keys() # \ud0a4\ub9cc \ub9ac\uc2a4\ud2b8\ub85c \ucd94\ucd9c\ud568\n", - "print d.values() # \uac12\ub9cc \ub9ac\uc2a4\ud2b8\ub85c \ucd94\ucd9c\ud568\n", - "print d.items() # \ud0a4\uc640 \uac12\uc758 \ud29c\ud50c\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\ud568" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['four', 'three', 'two', 'one']\n", - "['net', 'set', 'dul', 1]\n", - "[('four', 'net'), ('three', 'set'), ('two', 'dul'), ('one', 1)]\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc758 \uc815\ub9ac\uc640 \uac1d\uccb4 \uc2e0\uc6d0 \ud30c\uc545\n", - "***" + } + ], + "source": [ + "t = (1,2,3)\n", + "\n", + "print(len(t))\n", + "print()\n", + "print(t[0])\n", + "print(t[-1])\n", + "print(t[0:2])\n", + "print(t[::2])\n", + "print()\n", + "print(t + t + t)\n", + "print(t * 3)\n", + "print()\n", + "print(3 in t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 튜플의 상수적 성격\n", + "- 튜플은 내용 변경 불가" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'tuple' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc758 \ud2b9\uc131 \uc815\ub9ac" + } + ], + "source": [ + "t = (1,2,3)\n", + "\n", + "t[0] = 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 반면에 리스트는 내용 변경 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[100, 2, 3]\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "| \uc790\ub8cc\ud615 | \uc800\uc7a5/\uc811\uadfc \ubc29\ubc95 | \ubcc0\uacbd \uac00\ub2a5\uc131 | \uc800\uc7a5 \ubaa8\ub378 |\n", - "|:------:|:-----------------:|:-----------:|:--------------------:|\n", - "| \uc218\uce58\ud615 | \uc9c1\uc811(Direct) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ub9ac\ud130\ub7f4 (Literal) |\n", - "| \ubb38\uc790\uc5f4 | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ub9ac\ud130\ub7f4 (Literal) |\n", - "| \ub9ac\uc2a4\ud2b8 | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\uac00\ub2a5(Mutable) | \ucee8\ud14c\uc774\ub108 (Container) |\n", - "| \ud29c\ud50c | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ucee8\ud14c\uc774\ub108 (Container) |\n", - "| \uc0ac\uc804 | \ub9e4\ud551 (Mapping) | \ubcc0\uacbd\uac00\ub2a5(Mutable) | \ucee8\ud14c\uc774\ub108 (Container) |" + } + ], + "source": [ + "L = [1,2,3]\n", + "L[0] = 100\n", + "\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 사전의 정의와 기본 사용법\n", + "- 정수형 인덱스가 아닌 키를 이용하여 값을 저장하는 자료 구조\n", + " - 저장된 각 자료에 대한 순서는 의미 없음\n", + "- 매핑(Mapping) 함수와 비슷한 역할을 함\n", + " - x라는 키값을 넣으면 값 y를 반환함" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hana\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ub0b4\uc7a5 \uc790\ub8cc\ud615 \uc54c\uc544\ubcf4\uae30" + } + ], + "source": [ + "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", + "print(d['one'])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'one': 'hana', 'two': 'dul', 'three': 'set', 'four': 'net'}\n", + "{'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print type(3) #\uc815\uc218\n", - "print type(3.3) #\uc2e4\uc218\n", - "print type('abc') #\ubb38\uc790\uc5f4" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print type([]) #\ub9ac\uc2a4\ud2b8\n", - "print type(()) #\ud29c\ud50c\n", - "print type({}) #\uc0ac\uc804(dict)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc790\ub8cc\ud615\uc758 \ube44\uad50" + } + ], + "source": [ + "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", + "d['four'] = 'net' # 새 항목의 삽입\n", + "print(d)\n", + "d['one'] = 1 # 기존 항목의 값 변경\n", + "print(d)\n", + "print('one' in d) # 키에 대한 멤버쉽 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_keys(['one', 'two', 'three', 'four'])\n", + "dict_values([1, 'dul', 'set', 'net'])\n", + "dict_items([('one', 1), ('two', 'dul'), ('three', 'set'), ('four', 'net')])\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 0\n", - "L = [1,2,3]\n", - "print type(a) == type(0)\n", - "print type(L) == type([])\n", - "print type(L[0]) == type(0)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n", - "True\n" - ] - } - ], - "prompt_number": 41 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print type(None) #None \uac1d\uccb4, \uc544\ubb34 \uac12\ub3c4 \uc5c6\ub2e4(\ud639\uc740 \uc544\ub2c8\ub2e4)\ub97c \ub098\ud0c0\ub0b4\ub294 \uac1d\uccb4\n", - "print\n", - "a = None\n", - "print a\n", - "print type(a)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "None\n", - "\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \uac1d\uccb4\uc758 \uc2e0\uc6d0 \uc2dd\ubcc4\ud558\uae30" + } + ], + "source": [ + "d = {'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", + "print(d.keys()) # 키만 리스트로 추출함\n", + "print(d.values()) # 값만 리스트로 추출함\n", + "print(d.items()) # 키와 값의 튜플을 리스트로 반환함\n", + "\n", + "# ['four', 'three', 'two', 'one']\n", + "# ['net', 'set', 'dul', 1]\n", + "# [('four', 'net'), ('three', 'set'), ('two', 'dul'), ('one', 1)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 내장 자료형의 정리와 객체 신원 파악\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 내장 자료형의 특성 정리" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 자료형 | 저장/접근 방법 | 변경 가능성 | 저장 모델 |\n", + "|:------:|:-----------------:|:-----------:|:--------------------:|\n", + "| 수치형 | 직접(Direct) | 변경불가능(Immutable) | 리터럴 (Literal) |\n", + "| 문자열 | 시퀀스 (Sequence) | 변경불가능(Immutable) | 리터럴 (Literal) |\n", + "| 리스트 | 시퀀스 (Sequence) | 변경가능(Mutable) | 컨테이너 (Container) |\n", + "| 튜플 | 시퀀스 (Sequence) | 변경불가능(Immutable) | 컨테이너 (Container) |\n", + "| 사전 | 매핑 (Mapping) | 변경가능(Mutable) | 컨테이너 (Container) |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 내장 자료형 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- id(): \uac1d\uccb4\uc758 \uc2dd\ubcc4\uc790\ub97c \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "print(type(3)) #정수\n", + "print(type(3.3)) #실수\n", + "print(type('abc')) #문자열\n", + "\n", + "# \n", + "# \n", + "# " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 500\n", - "b = a\n", - "print id(a)\n", - "print id(b)\n", - "print\n", - "x = 1\n", - "y = 1\n", - "print id(x)\n", - "print id(y)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "4478569376\n", - "4478569376\n", - "\n", - "4298182776\n", - "4298182776\n" - ] - } - ], - "prompt_number": 58 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- is \ud0a4\uc6cc\ub4dc: \ub450 \uac1d\uccb4\uc758 \uc2dd\ubcc4\uc790\uac00 \ub3d9\uc77c\ud55c\uc9c0 \ud14c\uc2a4\ud2b8\ud55c\ub2e4." + } + ], + "source": [ + "print(type([])) #리스트\n", + "print(type(())) #튜플\n", + "print(type({})) #사전(dict)\n", + "\n", + "# \n", + "# \n", + "# " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 자료형의 비교" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c = [1,2,3]\n", - "d = [1,2,3]\n", - "print c is d\n", - "\n", - "a = 500\n", - "b = a\n", - "print a is b\n", + } + ], + "source": [ + "a = 0\n", + "L = [1,2,3]\n", + "print(type(a) == type(0))\n", + "print(type(L) == type([]))\n", + "print(type(L[0]) == type(0))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", "\n", - "x = 1\n", - "y = 1\n", - "print x is y\n", + "None\n", + "\n" + ] + } + ], + "source": [ + "print(type(None)) #None 객체, 아무 값도 없다(혹은 아니다)를 나타내는 객체\n", + "print()\n", + "a = None\n", + "print(a)\n", + "print(type(a))\n", + "\n", + "# \n", + "\n", + "# None\n", + "# " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 객체의 신원 식별하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- id(): 객체의 식별자를 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4405819792\n", + "4405819792\n", "\n", - "e = f = [4,5,6]\n", - "print e is f" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "True\n", - "True\n", - "True\n" - ] - } - ], - "prompt_number": 60 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- == \uc5f0\uc0b0\uc790: \ub450 \uac1d\uccb4\uc758 \uac12\uc774 \ub3d9\uc77c\ud55c\uc9c0\ub97c \ud14c\uc2a4\ud2b8\ud55c\ub2e4." + "4372428800\n", + "4372428800\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c = [1,2,3]\n", - "d = [1,2,3]\n", - "c == d" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 150, - "text": [ - "True" - ] - } - ], - "prompt_number": 150 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "a = 500\n", + "b = a\n", + "print(id(a))\n", + "print(id(b))\n", + "print()\n", + "x = 1\n", + "y = 1\n", + "print(id(x))\n", + "print(id(y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- is 키워드: 두 객체의 식별자가 동일한지 테스트한다." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "True\n", + "True\n" ] } ], - "metadata": {} + "source": [ + "c = [1,2,3]\n", + "d = [1,2,3]\n", + "print(c is d)\n", + "\n", + "a = 500\n", + "b = a\n", + "print(a is b)\n", + "\n", + "x = 1\n", + "y = 1\n", + "print(x is y)\n", + "\n", + "e = f = [4,5,6]\n", + "print(e is f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- == 연산자: 두 객체의 값이 동일한지를 테스트한다." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "c = [1,2,3]\n", + "d = [1,2,3]\n", + "c == d" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 181d8e180f63183631167cd0d9d5de8dcbbcfb58 Mon Sep 17 00:00:00 2001 From: dohyung Date: Thu, 7 Sep 2017 10:20:04 +0900 Subject: [PATCH 031/124] =?UTF-8?q?python2=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python01.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python3.6/python01.ipynb b/python3.6/python01.ipynb index 48d1bb9..2a179a3 100644 --- a/python3.6/python01.ipynb +++ b/python3.6/python01.ipynb @@ -315,7 +315,7 @@ "#### 3-1-2 이클립스 사용\n", "- 파이썬 설치\n", " - 파이썬 다운로드 사이트: https://www.python.org/downloads/\n", - " - 본 강좌에서는 파이썬 2.7.x 버전 사용\n", + " - 본 강좌에서는 파이썬 3.6.x 버전 사용\n", "- 이클립스에서 파이썬 설치 방법\n", " - PyDev 플러그인 설치\n", " - 참고 사이트: http://arisu1000.tistory.com/27707\n", @@ -384,7 +384,7 @@ "print(12 - 32)\n", "print((4 + 5) * 6)\n", "print(4 + 5 * 6)\n", - "print(9 / 5) # 정수/정수 연산 결과는 정수\n", + "print(9 / 5) # 파이썬2.x 버전에서는 정수/정수 연산 결과는 정수\n", "print(9.0 / 5.0)\n", "print(9 / 5.0)" ] From 3922653c372aa1916beee40c9e4767924c98dfad Mon Sep 17 00:00:00 2001 From: dohyung Date: Thu, 7 Sep 2017 16:26:03 +0900 Subject: [PATCH 032/124] =?UTF-8?q?python2=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python02.ipynb | 85 +++++++++++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 22 deletions(-) diff --git a/python3.6/python02.ipynb b/python3.6/python02.ipynb index a6c1b87..d00719a 100644 --- a/python3.6/python02.ipynb +++ b/python3.6/python02.ipynb @@ -203,8 +203,8 @@ "metadata": {}, "source": [ "- chr(i)\n", - " - 정수 형태의 ASCII코드 값을 입력으로 받아 그에 해당하는 문자를 반환하는 함수\n", - " - 인수 i의 범위: 0부터 255까지" + " - 정수 형태의 Unicode값을 입력으로 받아 그에 해당하는 문자를 반환하는 함수\n", + " - 인수 i의 범위: 0부터 0x10ffff (Decimal표현으로 1114111) 까지" ] }, { @@ -233,7 +233,9 @@ "metadata": {}, "source": [ "- str(object)\n", - " - 임의의 객체 object에 대해 해당 객체를 표현하는 문자열을 반환하는 함수" + "
str(object='') -> str
\n", + " - 임의의 객체 object에 대해 해당 객체를 표현하는 문자열을 반환하는 함수\n", + " - Create a new string object from the given object." ] }, { @@ -259,10 +261,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- range([start,]stop[,step])\n", - " - 수치형 자료형으로 start, stop, step 등을 입력받아 해당 범위에 해당하는 정수를 리스트로 반환하는 함수\n", + "- range\n", + "
 \n",
+    "  range(stop) -> range object\n",
+    "range(start, stop[, step]) -> range object 
\n", + " - 수치형 자료형으로 start, stop, step 등을 입력받아 start부터 stop까지의 정수값들이 순차적으로 들어 있는 range object를 리스트로 반환하는 함수\n", + " - Python2에서는 range()의 결과로 곧바로 정수가 리스트가 반환됨\n", " - 인수가 하나(stop)인 경우\n", - " - 0부터 stop-1까지의 정수 리스트를 반환한다.\n", + " - 0(디폴트 값)부터 stop-1까지의 정수 리스트를 반환한다.\n", " - 인수가 두 개(start, stop)인 경우\n", " - start부터 stop-1까지의 정수 리스트를 반환한다.\n", " - 인수가 세 개(start, stop, step)인 경우\n", @@ -547,7 +553,9 @@ { "cell_type": "code", "execution_count": 31, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "#이것은 주석입니다.\n", @@ -612,7 +620,9 @@ { "cell_type": "code", "execution_count": 34, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "a = 1\n", @@ -885,7 +895,8 @@ "- 콘솔 (Console)\n", " - 윈도우즈에서는 Command창, 리눅스/맥에서는 Terminal창\n", " - 각 IDE (예, 이클립스)에서는 별도의 콘솔 창이 제공됨\n", - "- raw_input(): 문자열 입력 내장함수" + "- Python2에서, raw_input(): 문자열 입력 내장함수\n", + "- Python3부터는 input()을 사용" ] }, { @@ -928,7 +939,28 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- int(): 문자열을 정수로 변환하는 내장함수" + "- int(): 문자열을 정수로 변환하는 내장함수\n", + "
int(x=0) -> integer\n",
+    "int(x, base=10) -> integer
" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "0\n" + ] + } + ], + "source": [ + "print(int(3.14)) # For floating point numbers, this truncates towards zero. 0이 되는 방향으로 소숫점 이하를 버림\n", + "print(int()) # return 0 if no arguments are given. 그냥 int()는 0을 리턴" ] }, { @@ -954,15 +986,19 @@ ] }, { - "cell_type": "markdown", - "metadata": {}, + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], "source": [ - "- input(): 정수, 실수, Expression 입력 내장함수" + "# - input(): 정수, 실수, Expression 입력 내장함수" ] }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -970,13 +1006,15 @@ "output_type": "stream", "text": [ "int :45\n", - "45\n" + "45\n", + "\n" ] } ], "source": [ "i = input('int :')\n", - "print(i)" + "print(i)\n", + "print(type(i))" ] }, { @@ -1012,7 +1050,7 @@ "metadata": {}, "source": [ "- print: 화면에 자료를 출력하는 보편적인 statement\n", - "- 여러 자료를 한꺼번에 출력할 때에는 콤마(,)를 사용" + "- 여러 자료를 한꺼번에 출력할 때에는 end=' '를 사용 (디폴트는 end='\\n')" ] }, { @@ -1061,12 +1099,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Python2에서는 기본적으로 print는 마지막에 줄바꿈을 하지만 콤마(,)가 마지막에 있으면 줄바꿈을 하지 않았으나, Python3에서는 콤마를 붙이나 안붙이나 상관없다." + "- Python2에서는 기본적으로 print는 마지막에 줄바꿈을 수행한다. 그러나 콤마(,)가 마지막에 있으면 줄바꿈을 하지 않음\n", + "- Python3에서는 콤마를 붙이나 안붙이나 상관없이 줄바꿈을 수행" ] }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -1079,7 +1118,8 @@ "1\n", "2\n", "\n", - "1,2\n" + "1, 2\n", + "1 2\n" ] }, { @@ -1088,7 +1128,7 @@ "(None, None)" ] }, - "execution_count": 59, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1101,7 +1141,8 @@ "print(1)\n", "print(2)\n", "print()\n", - "print(1, end=\",\"),print(2)" + "print(1, end=\", \"),print(2)\n", + "print(1, end=\" \"),print(2)" ] }, { From 9957ff84ed266bd3bba9d0d17a08a98b63cc164c Mon Sep 17 00:00:00 2001 From: dohyung Date: Thu, 7 Sep 2017 16:51:25 +0900 Subject: [PATCH 033/124] =?UTF-8?q?python2=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python02.ipynb | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/python3.6/python02.ipynb b/python3.6/python02.ipynb index d00719a..976f26f 100644 --- a/python3.6/python02.ipynb +++ b/python3.6/python02.ipynb @@ -987,13 +987,25 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Python2에서 \n", + "# input(): 정수, 실수, Expression 입력 내장함수" + ] + }, + { + "cell_type": "code", + "execution_count": 29, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "# - input(): 정수, 실수, Expression 입력 내장함수" + "? input" ] }, { From f0259250a28f2f981fc10630dfafe9c68c60cebc Mon Sep 17 00:00:00 2001 From: dohyung Date: Thu, 7 Sep 2017 16:51:40 +0900 Subject: [PATCH 034/124] =?UTF-8?q?python3=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python03.ipynb | 45 ++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/python3.6/python03.ipynb b/python3.6/python03.ipynb index 6c71de2..76453cb 100644 --- a/python3.6/python03.ipynb +++ b/python3.6/python03.ipynb @@ -103,19 +103,16 @@ "metadata": {}, "source": [ "### 1-3 롱형 상수\n", - "- 메모리가 허용하는 한 유효자리수는 무한대" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "- Python3부터는 더 이상 존재하지 않음
\n", + "\n", + "Python 2 had separate int and long types for non-floating-point numbers. An int could not be any larger than sys.maxint, which varied by platform. Longs were defined by appending an L to the end of the number, and they could be, well, longer than ints. In Python 3, there is only one integer type, called int, which mostly behaves like the long type in Python 2. Since there are no longer two types, there is no need for special syntax to distinguish them.
\n", + "
\n", "참고: http://www.diveintopython3.net/porting-code-to-python-3-with-2to3.html" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -135,12 +132,12 @@ } ], "source": [ - "h1 = 123456789012345678901234567890 # 마지막에 L을 붙여서 명시적으로 long 형이라고 알려도 되고\n", + "h1 = 123456789012345678901234567890 # Python2에서는 마지막에 L을 붙여서 명시적으로 long 형이라고 알려줬다.\n", "print(type(h1))\n", "print(h1 * h1)\n", "print()\n", "\n", - "h2 = 123456789012345678901234567890 # L을 붙이지 않아도 int형이 담을 수 있는 수치를 초과하면 자동으로 long형이 된다. \n", + "h2 = 123456789012345678901234567890 # Python2에서는 L을 붙이지 않아도 int형이 담을 수 있는 수치(sys.maxint)를 초과하면 자동으로 long형이 됐다. \n", "print(type(h2))\n", "print(h2 * h2)\n", "print()\n", @@ -150,13 +147,12 @@ "print()\n", "\n", "h4 = 123\n", - "print(type(h4))\n", - "#In Python 3, the old long() function no longer exists" + "print(type(h4))" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -165,13 +161,13 @@ "123456789012345678890" ] }, - "execution_count": 14, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "123456789012345678890 # 자동 long형 변환" + "123456789012345678890 " ] }, { @@ -239,7 +235,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -260,10 +256,8 @@ "print(abs(-3))\n", "print(int(3.141592))\n", "print(int(-3.1415))\n", - "# print long(3)\n", + "# print long(3) # In Python 3, the old long() function no longer exists\n", "print(int(3)) \n", - "# Essentially, long renamed to int.\n", - "# https://goo.gl/ZdvyuL\n", "print(float(5))\n", "print(complex(3.4, 5))\n", "print(complex(6))" @@ -298,7 +292,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-7 math 모듈의 수치 연산 함수" + "### 1-7 math 모듈의 수치 연산 함수" ] }, { @@ -485,7 +479,7 @@ "metadata": {}, "source": [ "- Slicing\n", - " - 형식: [start(included) : stop(excluded) : step]\n", + " - 형식: [start(included) : stop(excluded) : step]\n", " - 기본값: start - 0, stop - 자료형의 크기, step - 1" ] }, @@ -614,8 +608,8 @@ "metadata": {}, "source": [ "### 2-3 문자열 연산\n", - "- +: 연결\n", - "- *: 반복" + "- +: 연결\n", + "- *: 반복" ] }, { @@ -644,7 +638,8 @@ "metadata": {}, "source": [ "### 2-4 문자열의 길이\n", - "- len(): 문자열의 길이를 반환하는 내장함수" + "- len(): 문자열의 길이를 반환하는 내장함수\n", + "- Return the number of items in a container." ] }, { @@ -673,7 +668,7 @@ "metadata": {}, "source": [ "### 2-5 문자열내 포함 관계 여부\n", - "- in, not in: 문자열내에 일부 문자열이 포함되어 있는지를 파악하는 키워드" + "- in, not in: 문자열내에 일부 문자열이 포함되어 있는지를 파악하는 키워드" ] }, { From 5b325e97bf885456bd26ee3370de48234630f6e6 Mon Sep 17 00:00:00 2001 From: dohyung Date: Thu, 7 Sep 2017 16:51:59 +0900 Subject: [PATCH 035/124] =?UTF-8?q?python4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python04.ipynb | 59 ++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/python3.6/python04.ipynb b/python3.6/python04.ipynb index ca08288..290bd40 100644 --- a/python3.6/python04.ipynb +++ b/python3.6/python04.ipynb @@ -24,7 +24,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-1 리스트의 정의와 리스트 기본 연산\n", + "### 1-1 리스트(list)의 정의와 리스트 기본 연산\n", "- 리스트: 임의의 객체를 순차적으로 저장하는 집합적 자료형\n", "- 문자열이 지닌 대부분의 연산들은 리스트도 지원" ] @@ -135,13 +135,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-2 range() 함수를 통한 인덱스 리스트 생성\n", - "- range(k): 0부터 k-1까지의 숫자의 리스트를 반환함 " + "### 1-2 range() 함수를 통한 인덱스 리스트 생성\n", + "- range(k): 0부터 k-1까지의 range object를 반환함 " ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -151,7 +151,11 @@ "range(0, 10)\n", "range(0, 10, 2)\n", "range(9, -1, -1)\n", - "True\n" + "True\n", + "\n", + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "[0, 2, 4, 6, 8]\n", + "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n" ] } ], @@ -161,20 +165,35 @@ "print(L[::2])\n", "print(L[::-1])\n", "print(4 in L)\n", - "\n", + "print()\n", "# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", "# [0, 2, 4, 6, 8]\n", - "# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]" + "# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n", + "\n", + "list = []\n", + "for item in L:\n", + " list.append(item)\n", + "print(list)\n", + "\n", + "list = []\n", + "for item in L[::2]:\n", + " list.append(item)\n", + "print(list)\n", + "\n", + "list = []\n", + "for item in L[::-1]:\n", + " list.append(item)\n", + "print(list)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-3 튜플의 정의와 기본 연산\n", - "- 튜플: 리스트와 유사하지만 튜플 내의 값을 변경할 수 없음\n", + "### 1-3 튜플(tuple)의 정의와 기본 연산\n", + "- 튜플: 리스트와 유사하지만 튜플 내의 값을 변경할 수 없음(immutable하다.)\n", " - 적합한 사용 예\n", - " - months = ('January','February','March','April','May','June','July','August','September','October','November',' December')\n", + " - months = ('January','February','March','April','May','June','July','August','September','October','November',' December')\n", " - 각 값에 대해 인덱스가 부여됨\n", "- 문자열이 지닌 대부분의 연산들은 튜플도 지원" ] @@ -223,7 +242,7 @@ "metadata": {}, "source": [ "### 1-4 튜플의 상수적 성격\n", - "- 튜플은 내용 변경 불가" + "- 튜플은 내용 변경 불가(immutable)" ] }, { @@ -253,7 +272,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 반면에 리스트는 내용 변경 가능" + "- 반면에 리스트는 내용 변경 가능(mutable)" ] }, { @@ -280,8 +299,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-5 사전의 정의와 기본 사용법\n", - "- 정수형 인덱스가 아닌 키를 이용하여 값을 저장하는 자료 구조\n", + "### 1-5 사전(dictionary; dict)의 정의와 기본 사용법\n", + "- 정수형 인덱스가 아닌 키(key)를 이용하여 값(value)을 저장하는 자료 구조\n", " - 저장된 각 자료에 대한 순서는 의미 없음\n", "- 매핑(Mapping) 함수와 비슷한 역할을 함\n", " - x라는 키값을 넣으면 값 y를 반환함" @@ -289,7 +308,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -302,7 +321,7 @@ ], "source": [ "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", - "print(d['one'])\n" + "print(d['one'])" ] }, { @@ -473,7 +492,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -488,7 +507,7 @@ } ], "source": [ - "print(type(None)) #None 객체, 아무 값도 없다(혹은 아니다)를 나타내는 객체\n", + "print(type(None)) # NoneType 객체, 아무 값도 없다(혹은 아니다)를 나타내는 객체\n", "print()\n", "a = None\n", "print(a)\n", @@ -511,7 +530,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- id(): 객체의 식별자를 반환한다." + "- id(): 객체의 식별자를 반환한다." ] }, { @@ -547,7 +566,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- is 키워드: 두 객체의 식별자가 동일한지 테스트한다." + "- is 키워드: 두 객체의 식별자가 동일한지 테스트한다." ] }, { From 2ef110960194a8a6b73e96a8959b5b0206d1ec2b Mon Sep 17 00:00:00 2001 From: dohyung Date: Thu, 7 Sep 2017 21:23:33 +0900 Subject: [PATCH 036/124] =?UTF-8?q?assignment=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-1.ipynb | 136 ++++++++++++++ python3.6/assignment-2.ipynb | 156 +++++++++++++++++ python3.6/assignment-3.ipynb | 209 ++++++++++++++++++++++ python3.6/assignment-4.ipynb | 274 +++++++++++++++++++++++++++++ python3.6/assignment-5.ipynb | 331 +++++++++++++++++++++++++++++++++++ 5 files changed, 1106 insertions(+) create mode 100644 python3.6/assignment-1.ipynb create mode 100644 python3.6/assignment-2.ipynb create mode 100644 python3.6/assignment-3.ipynb create mode 100644 python3.6/assignment-4.ipynb create mode 100644 python3.6/assignment-5.ipynb diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb new file mode 100644 index 0000000..7ec754a --- /dev/null +++ b/python3.6/assignment-1.ipynb @@ -0,0 +1,136 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 1\n", + "### [정보]\n", + "#### 1) Due Date: 2017년 9월 25일 (월), 23시 59분\n", + "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.jupyter.org에 넣어서 산출된 URL을 EL사이트에 제출\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", + "#### 4) 숙제이후 소감: 11개의 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "#### 5) 문제 (ACM-ICPC 3문제 포함하여 총 11개)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- a=\"Hello Python\" 문자열을 Slicing과 연결 연산자 (+)를 사용하여 \"Python Hello\"로 변경하시오.\n", + " - [주의] a 변수 자체에 \"Python Hello\" 문자열이 저장되어야 함" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- b=\"Hello Python World\" 문자열을 Slicing과 연결 연산자 (+)를 사용하여 \"World Python Hello\"로 변경하시오.\n", + " - [주의] b 변수 자체에 \"Python Hello\" 문자열이 저장되어야 함 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- c=\"Hello\"를 \"olleH\"로 변경하시오\n", + " - [주의] c 변수 자체에 \"olleH\" 문자열이 저장되어야 함" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- s=\"python\"에 대해 다음 문제를 풀어보시오.\n", + " 1. s[0], s[0][0], s[0][0][0]은 각각 어떤 값이 나오는지 확인하고 그 이유를 나름대로 설명해 보시오.\n", + " 2. s[-100], s[100]은 값이 나오는지 에러가 나오는지 확인하고 그 결과에 대한 이유를 나름대로 설명해 보시오.\n", + " 3. s[-100, 100]은 값이 나오는지 에러가 나오는지 확인하고 그 결과에 대한 이유를 나름대로 설명해 보시오.\n", + " 4. s[1:-1]의 결과를 확인하고 그 결과에 대한 이유를 정확하게 설명하시오.\n", + " 5. s[3:-3]의 결과를 확인하고 그 결과에 대한 이유를 정확하게 설명하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- for문을 활용하여 1부터 100사이의 홀수를 출력하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- while문을 활용하여 1부터 100사이의 짝수의 합을 계산하여 출력하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사용자로 부터 임의의 정수를 입력받고, 해당 숫자를 역순으로 출력하는 프로그램을 작성하시오. \n", + "\n", + " [실행 예]\n", + " ```\n", + " 정수를 입력하세요: 3125\n", + " 숫자 역순은 5213 입니다.\n", + " ```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사용자로 부터 정수를 입력받아서 1부터 그 사이에 존재하는 소수 (Prime number)를 출력하는 파이썬 프로그램을 작성하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [ACM-ICPC 문제 1074번] \n", + " - Z
\n", + " https://www.acmicpc.net/problem/1074" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [프로젝트 오일러 문제 1135] \n", + " - 뉴스 전하기
\n", + "https://www.acmicpc.net/problem/1135" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [프로젝트 오일러 문제 1646번]\n", + " - 피이보나치 트리
\n", + " https://www.acmicpc.net/problem/1646" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/assignment-2.ipynb b/python3.6/assignment-2.ipynb new file mode 100644 index 0000000..a868650 --- /dev/null +++ b/python3.6/assignment-2.ipynb @@ -0,0 +1,156 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 2\n", + "### [정보]\n", + "#### 1) Due Date: 2017년 10월 16일 (월), 23시 59분\n", + "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", + "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "#### 5) 문제 (ACM-ICPC 3문제 포함하여 총 7개)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음 6 개의 Expression에 대해 Evaluation 결과 값을 출력하고, 해당 결과가 나온 이유에 대해 설명하시오\n", + " - 1 and 2 and 3 and 4\n", + " - 1 or 2 or 3 or 4\n", + " - 1 and 2 or 3 and 4\n", + " - (1 and 2) or (3 and 4)\n", + " - 1 or 2 and 3 or 4\n", + " - (1 or 2) and (3 or 4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 경로에 해당하는 문자열 1개를 입력 받아 그 안에 디렉토리 경로명과 파일명을 분리하여 리스트로 반환하는 함수 div_path(s)를 작성하시오.\n", + " - 인자로 전달하는 문자열은 경로만 들어간다고 가정한다.\n", + " - 각 디렉토리와 파일을 구분하는 문자는 '/'로 가정한다.\n", + " - 반환하는 리스트의 첫번째 원소는 디렉토리이고 두번째 원소는 파일명이다.\n", + " - 다음과 같은 실행 및 출력 결과가 도출되어야 한다.\n", + " - div_path('/usr/local/bin/python')\n", + " - ['/usr/local/bin', 'python']\n", + " - div_path('/home/chulsoo/test.txt')\n", + " - ['/home/chulsoo', 'test.txt']\n", + " - [참고] 리스트(l) 내에 새로운 정수값 (예를 들어 10)을 넣는 방법은 l.append(10) 이다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 두 개의 리스트를 인자로 받아서 그 두 개의 리스트에 대한 '합집합'을 반환하는 함수 list_union(lista, listb)를 작성하시오.\n", + " - 인자로 전달하는 리스트 2 개에는 정수값만 들어간다고 가정하자.\n", + " - 함수 내에서 새로운 리스트를 만들어 그 리스트 내에 인자로 받은 두 리스트의 모든 원소를 넣어 반환한다.\n", + " - 반환하는 리스트에는 절대로 중복된 원소가 들어 있으면 안된다 (집합의 조건).\n", + " - 반환하는 리스트는 정렬이 되어 있어야 한다.\n", + " - 다음과 같은 실행 및 출력 결과가 도출되어야 한다.\n", + " - list_union([1, 2, 3], [1, 2, 4])\n", + " - [1, 2, 3, 4]\n", + " - list_union([-10, -5, 0, -1], [100, 9, 0, 9])\n", + " - [-10, -5, -1, 0, 9, 100]\n", + " - list_union([0, 1, 2], [0, 1, 2])\n", + " - [0, 1, 2]\n", + " - [참고] 리스트(l) 내에 새로운 정수값 (예를 들어 10)을 넣는 방법은 l.append(10) 이다.\n", + " - [참고] 임의의 정수값 (x)이 리스트 (l) 내에 존재하는지 판단하는 방법은 x in l 이다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [프로젝트 오일러 문제 4]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [프로젝트 오일러 문제 5]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [프로젝트 오일러 문제 6]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [Incremental Project] 웹 URL로 지정된 웹페이지를 문자열로 가져와 1) 모든 HTML 태그를 제외한 순수 텍스트 문자열만을 걸러내고, 2) 그 순수 텍스트 문자열 안에 존재하는 단어가 총 몇개인지 출력하는 프로그램을 작성하시오.\n", + " - HTML 태그는 다음 조건을 가지는 것이다.\n", + " - < 로 시작하여 >로 끝난다.\n", + " - 예를 들어, 아래와 같은 HTML 내용 내에 한 줄이 있다고 가정하자.\n", + " \n", + " ```\n", + " \n", + " ```\n", + " - 위 소스에서 HTML 태그를 제외한 순수 텍스트 문자열은 아래와 같다.\n", + " \n", + " ```\n", + " 로그인 유지 \n", + " ```\n", + " \n", + " - 한편, 아래와 같은 HTML 한 줄이 있다고 가정하자.\n", + " \n", + " ```\n", + " \n", + " ```\n", + " \n", + " - 위 소스는 HTML 태그로만 구성된 것이며 걸러낼 수 있는 순수 텍스 문자열은 존재하지 않는다.\n", + " \n", + " - 단어를 나누는 기준은 오로지 공백문자 (whitespace)이다.\n", + " - 즉, 위 순수 텍스트 문자열인 \"로그인 유지\"에서 분리한 단어는 \"로그인\"과 \"유지\"이다.\n", + " - 다음은 URL로 지정된 웹페이지를 특정 문자열로 가져오는 코드이다. \n", + " - 즉, 숙제 코드는 아래 코드로 부터 시작해야 한다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from urllib.request import urlopen\n", + "\n", + "source = urlopen(\"http://cse.koreatech.ac.kr/\").read()\n", + "\n", + "print(source) # 추후 숙제 답안 제출 때엔 왼쪽 라인은 주석처리할 것" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/assignment-3.ipynb b/python3.6/assignment-3.ipynb new file mode 100644 index 0000000..60bc53d --- /dev/null +++ b/python3.6/assignment-3.ipynb @@ -0,0 +1,209 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 3\n", + "### [정보]\n", + "#### 1) Due Date: 2017년 10월 30일 (월), 23시 59분\n", + "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", + "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "#### 5) 문제 (ACM-ICPC 3문제 포함하여 총 11개)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- L=[1, 2, 3, 4, 5]일 때 다음 각 문장을 수행한 후의 결과를 보고 납득할 만한 이유를 설명하시오. \n", + " - 1)
L[1:3] = [100]\n",
+    "   print(L)
\n", + " - 2)
L[1:3] = [(100)]\n",
+    "   print(L)
\n", + " - 3)
L[1:3] = 100\n",
+    "   print(L)
\n", + " - 4)
L[1:3] = (100)\n",
+    "   print(L)
\n", + " - 5)
L[1:3] = (100, 101, 102)\n",
+    "   print(L)
\n", + " - 6)
L[1:3] = [100, 101, 102]\n",
+    "   print(L)
\n", + " - 7)
L[1:3] = [(100, 101, 102)]\n",
+    "   print(L)
\n", + " - 8)
L[1:3] = [[100, 101, 102]]\n",
+    "   print(L)
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열 S = 'Hello World and Python'에 대해 다음 요구사항에 대한 Python 코드를 제시하시오. \n", + " - 1) 단어의 순서가 역순으로 되어진 문자열 ('Python and World Hello')을 만들고 \n", + " - 2) 1)의 결과 문자열에 대해 메소드 split과 join을 이용하여 공백을 모두 없엔 문자열 'PythonandWorldHello'을 만드시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음 코드를 보고 물음에 답하시오.\n", + "
a = [1, 2, 3]\n",
+    "  b = a * 3\n",
+    "  c = [a] * 3\n",
+    "  print(b)\n",
+    "  print(c)
\n", + "\n", + " - 1) 위 코드를 수행한 이후 다음 코드를 수행한 후 b와 c의 내용을 확인하시오.\n", + "
a[0]=0
\n", + " - 2) b와 c 객체의 차이는 무엇인가?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음 문자열을 ':'을 기준으로 분리하여 리스트로 만들고 각 문자열의 좌우 공백을 제거하시오 (즉, 문자열 S에서 l을 만들어라)\n", + "
\n",
+    "s = '  first star   :   second star   :    third star  '\n",
+    "l = ['first star', 'second star', 'third star']\n",
+    "
\n", + " - 1) for ~ in 문을 이용한 코드를 작성하시오. \n", + " - 2) 리스트 내포(list comprehension)를 이용한 코드를 작성하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음과 같이 0보다 큰 정수 리스트 변수 list를 인자로 받는 함수 addall(list)와 addallodd(list)를 for ~ in 리터널과 리스트 내포 방식으로 각각 제시하시오.\n", + " - 1) addall(list) 함수 (리스트 내의 모든 정수를 더하는 함수로서 해답으로는 for ~ in 리터럴과 리스트 내포 방식으로 각각 제시하시오.)\n", + " -
>>> addall([1])\n",
+    "    1
\n", + " -
>>> addall([1, 2, 3, 4, 5, 6, 7, 8, 9])\n",
+    "    45
\n", + " - 2) addallodd(list) 함수 (리스트내의 모든 홀수를 더하는 함수로서 해답으로는 for ~ in 리터럴과 리스트 내포 방식으로 각각 제시하시오.)\n", + " -
>>> addallodd([1])\n",
+    "    1
\n", + " -
>>> addallodd([1, 2, 3, 4, 5, 6, 7, 8, 9])\n",
+    "    25
\n", + " - [참고 1]: 리스트 내포 방식으로 addall() 및 addallodd()함수를 만들 때엔 리스트 내포에 의해 생성된 리스트 결과에 대해 내장 함수를 사용하는 방식을 고려해보시오 (주의: 리스트 내포 방식의 addall() 및 addallodd() 함수의 몸체는 단 1줄로 작성되어야 한다.)\n", + " - [참고 2]: sum() 등의 내장함수 사용 가능함" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음 코드를 보고 물음에 답하시오.\n", + "
L1 = [1, 2, 3]\n",
+    "L2 = [4, 5, 6]\n",
+    "d = {'low':L1, 'high':L2}\n",
+    "e = d\n",
+    "f = d.copy()\n",
+    "print(d)\n",
+    "print(e)\n",
+    "print(f)\n",
+    "print()\n",
+    "d['low'] = [10, 20, 30]\n",
+    "d['high'][1] = 500\n",
+    "print(d)\n",
+    "print(e)\n",
+    "print(f)
\n", + "\n", + " - 1) 위 코드의 수행 결과 d와 e는 항상 같은 결과를 출력한다. 그 이유는 무엇인가?\n", + " - 2) 위 코드의 수행 결과 마지막 f의 내용은 다음과 같다. 이 때 'high' 키의 값 내용 중 500이 출력된 이유와 'low' 키의 값 내용 중 [1, 2, 3]이 출력된 이유를 설명하시오 ([hint]: shallow copy 관점에서 설명하시오.)\n", + "
{'high': [4, 500, 6], 'low': [1, 2, 3]}
\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전 d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}가 주어졌을 때 다음 요구사항에 맞는 코드를 제시하시오 \n", + " - [참고]: d.keys(), d.values()를 통해 리스트를 얻어낸 후 리스트가 지니고 있는 sort(cmp=None, key=None, reverse=False)함수를 활용하시오.\n", + " - 1) 키의 알파벳 오름차순 순서대로 튜플 (키, 값)을 차례대로 출력하시오.\n", + " - 2) 키의 알파벳 내림차순 순서대로 튜플 (키, 값)을 차례대로 출력하시오.\n", + " - 3) 값의 오름차순 순서대로 튜플 (키, 값)을 차례대로 출력하시오. \n", + " - 4) 값의 내림차순 순서대로 튜플 (키, 값)을 차례대로 출력하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [프로젝트 오일러 문제 7]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [프로젝트 오일러 문제 8]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [프로젝트 오일러 문제 9]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [Incremental Project] 이전 Assignment 2의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하고 단어들의 총 개수를 출력하는 프로그램을 작성하는 것이었다. 이번에는 그 마지막 숙제를 그대로 확장하여 웹 URL로 지정된 웹페이지 내 순수 텍스트 안에 존재하는 각 단어들에 대해 다음 요구사항 대로 출력하는 프로그램을 작성하시오. \n", + " - 요구사항 1. 순수 텍스트 안에 존재하는 단어들에 대해 string 모듈을 활용하여 모든 punctuation (구두문자)를 완벽히 제거하시오.\n", + " - 예: ['world!', ':', '+hello+', '~python$$$', '=', 'world'] ---> ['world', 'hello', 'python', 'world']\n", + " - 모든 punctuation을 확인하는 방법은 아래와 같다.\n", + "
\n",
+    "    import string\n",
+    "    print(string.punctuation)\n",
+    "    
\n", + " - 요구사항 2. 만약 punctuation (구두문자)를 제거한 이후 공백으로 판명되는 단어들은 해당 단어 리스트에서 제거하시오.\n", + " - 예: ['컴퓨터공학부!', '---?', '%지향~', '...'] ---> ['컴퓨터공학부', '지향']\n", + " - 요구사항 3. 각 단어들의 출현빈도를 사전형태로 저장하여 출력하시오.\n", + " - 예: ['world', 'hello', 'python', 'world', '컴퓨터공학부', '지향'] ---> {'world': 2, 'hello': 1, 'python': 1, '컴퓨터공학부': 1, '지향': 1}\n", + " - 요구사항 4. 다음 3개의 사이트에 대한 결과를 출력하시오.\n", + " - http://www.naver.com\n", + " - http://www.daum.net\n", + " - http://www.nytimes.com" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/assignment-4.ipynb b/python3.6/assignment-4.ipynb new file mode 100644 index 0000000..e6f52c8 --- /dev/null +++ b/python3.6/assignment-4.ipynb @@ -0,0 +1,274 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 4\n", + "### [정보]\n", + "#### 1) Due Date: 2017년 11월 20일 (월), 23시 59분\n", + "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", + "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "#### 5) 문제 (ACM-ICPC 6문제 포함하여 총 14개)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [1번 문제] \n", + "파일 s.txt 내의 다음 내용과 함께 아래 문제의 코드를 제시하시오. \n", + ">pig ham
\n", + ">cat dog
\n", + ">ham bird
\n", + ">dog pig
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "           - 1) 파일 s.txt을 읽어서 각 라인에 있는 첫 번째 단어(문자열) 자체들을 기준으로 라인별 정렬후 파일 s1.txt에 그 결과를 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s1.txt에 있는 파일 내용은 다음과 같다.\n", + ">cat dog
\n", + ">dog pig
\n", + ">ham bird
\n", + ">pig ham
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "           - 2) 파일 s.txt을 읽어서 각 라인에 있는 두 번째 단어(문자열) 자체들을 기준으로 라인별 정렬후 파일 s2.txt에 그 결과를 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s2.txt에 있는 파일 내용은 다음과 같다.\n", + ">ham bird
\n", + ">cat dog
\n", + ">pig ham
\n", + ">dog pig
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "           - 3) 파일 s.txt을 읽어서 각 라인들에 있는 모든 단어들을 순차적으로 다시 나열하되 각 라인에 세 개의 단어들이 오도록 하여 s3.txt에 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s3.txt에 있는 파일 내용은 다음과 같다.\n", + ">pig ham cat
\n", + ">dog ham bird
\n", + ">dog pig
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [2번 문제] \n", + "다음과 같은 조건들을 참고하여 회원 가입 및 로그인 프로그램을 작성하시오. \n", + " - 1) 프로그램 시작 후 다음과 같은 메시지가 출력되어 1, 2, 3 중 하나의 값을 입력 받도록 한다.\n", + ">Welcome to Our Service
\n", + ">1. Sign Up
\n", + ">2. Sign In
\n", + ">3. Quit
\n", + " - 2) 1을 선택하면 ID, Password, Name, School의 4가지 정보를 입력받아 파일에 저장하는 프로그램을 작성한다.\n", + " - 2-1) 입력된 내용은 access.txt 라는 이름의 텍스트 파일 내에 저장된다. \n", + " - 2-2) access.txt 파일의 각 라인에는 가입된 회원 각각의 정보가 \"[id]: [password], [name], [school]\" 형태로 저장된다.\n", + " - 2-3) 즉, 가입 회원이 10명이면 access.txt 파일 내에 라인 수도 정확히 10개이다.\n", + " - 2-4) 암호화 방식은 sha 모듈을 활용한다. sha 모듈 활용 방법은 본 문제의 마지막에 제시된 sha 활용 예를 참고한다.\n", + " - 즉, access.txt 파일 내에 password 정보는 암호화 되어 저장되어야 한다.\n", + " - 2-5) 회원 정보를 입력 받을 때 id를 입력 받은 직후 access.txt를 확인하여 이미 존재하는 id가 입력되었다면 다음 메시지를 출력하고 id 정보를 다시 입력받는다.\n", + " - Sorry, the entered ID is already used.\n", + " - 3) 2를 선택하면 ID, Password의 2가지 정보를 입력받는 프로그램을 작성한다.\n", + " - 3-1) 입력된 ID 정보가 access.txt에 존재하지 않으면 다음과 같은 메시지를 출력하고 다시 입력받는다.\n", + " - Sorry, you are not a registered member.\n", + " - 3-2) 입력된 ID가 올바르게 존재하지만 Password 정보가 access.txt 파일에 있는 정보와 불일치하면 다음과 같은 메시지를 출력하고 Password를 다시 입력받는다.\n", + " - Sorry, the entered password is not correct.\n", + " - 이 때에도 사용자가 입력한 Password 정보와 함께 sha 모듈이 활용되어야 한다.\n", + " - 3-3) 입력된 ID와 Password가 모두 올바르면 다음과 같은 메시지를 출력한다.\n", + " - Hello [name]!\n", + " - 위 [name]에는 access.txt에 기록되어 있는 name 정보를 출력한다.\n", + " - 4) 3을 선택하면 프로그램이 끝난다.\n", + " - [참고] sha 모듈 활용 예" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "import sha\n", + "password_plain = \"12345678\"\n", + "password_encrypted = sha.new(password_plain).hexdigest()\n", + "print password_encrypted\n", + "\n", + "# import hashlib\n", + "# hasher = hashlib.sha1()\n", + "# password_plain = 'ripemd160'\n", + "# password_encrypted = hashlib.new(password_plain)\n", + "# password_encrypted.hexdigest()\n", + "# print(password_encrypted)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [3번 문제]\n", + "range() 함수와 유사한 frange() 함수를 다음 조건을 참고하여 만드시오.\n", + " - 1) frange()의 인자 구성은 다음과 같이 range와 동일하지만 각 인수들은 음수를 받지 않는다고 가정한다.\n", + " > range(stop)
\n", + " > range(start, stop[, step])
\n", + " - 2) frange() 함수의 인자에 대한 기본 시작(start) 값은 0.0이고, 기본 단계(step) 값은 0.1이다. \n", + " - 3) frange 사용 예\n", + " - 3-1) frange(0.5)\n", + " - [0.0, 0.1, 0.2, 0.3, 0.4]\n", + " - 3-2) frange(1.0, 2.0)\n", + " - [1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9]\n", + " - 3-3) frange(2.2, 4.0, 0.5)\n", + " - [2.2, 2.7, 3.2, 3.7]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [4번 문제] \n", + "가변인수를 받는 함수 sum()을 다음과 같은 조건을 참고하여 구현하시오\n", + "- sum() 사용 예 \n", + " - sum()\n", + " - 0\n", + " - sum(1, 2)\n", + " - 3\n", + " - sum(1, 2, 3, 4, 5)\n", + " - 15\n", + " - sum(1, 5, 7, 2, -10)\n", + " - 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [5번 문제] \n", + "여러 단어로 이루어진 문자열을 입력받아 각 단어의 첫글자로 이루어진 단어를 대문자로 출력하는 myinitial() 함수를 다음 조건을 참고하여 작성하시오.\n", + "- 1) 다음에 제시되는 함수들을 모두 이용해야 한다. \n", + " - split\n", + " - map\n", + " - join\n", + "- 2) myinitial() 함수 사용 예\n", + " - myinitial(\"as soon as possible\")\n", + " - ASAP" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [6번 문제]\n", + "음이 아닌 정수 n를 입력받으면 n! (factorial)을 계산하는 myfact() 함수를 재귀적 함수로 구현하시오.\n", + "- [옵션] 참을 수 있는 정도 만큼의 수행시간을 직접 기다려보면서 n을 늘려보도록 합시다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [7번 문제] \n", + "(서술형) import string 과 from string import * 의 차이점을 설명하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [8번 문제]\n", + "프로젝트 오일러 문제 10\n", + "\n", + "##### [9번 문제]\n", + "프로젝트 오일러 문제 11\n", + "\n", + "##### [10번 문제]\n", + "프로젝트 오일러 문제 12\n", + "\n", + "##### [11번 문제]\n", + "프로젝트 오일러 문제 13\n", + "\n", + "##### [12번 문제]\n", + "프로젝트 오일러 문제 14\n", + "\n", + "##### [13번 문제]\n", + "프로젝트 오일러 문제 15" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [14번 문제] \n", + "이전 Assignment 3의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3를 확장하여 다음과 같은 조건을 만족하도록 구현하시오.\n", + " - 1) 다음 사이트에서 제시되는 영어 불용어 (Stop words)를 참고하여 이전 숙제에서 구성했던 단어 사전에서 영어 불용어들을 모두 제거하는 코드를 추가하시오.\n", + " - http://www.lextek.com/manuals/onix/stopwords1.html\n", + "\n", + " - 2) 각 URL로 지정된 웹페이지의 HTML 소스를 파일로 저장하시오. \n", + " - URL이 http://URL 이라면 파일명은 URL.html 이다. \n", + " - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.html 이다. \n", + " - 3) 단어의 출현빈도가 담긴 사전 객체를 위 HTML 소스 파일과 동일한 폴더에 파일로 저장하시오.\n", + " - 파일입출력 (E-learning 13주차) 마지막에 학습한 pickle 모듈을 활용하시오. \n", + " - URL이 http://URL 이라면 사전 객체를 담고 있는 파일명은 URL.words.frequency 이다.\n", + " - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.words.frequency 이다.\n", + " - 4) 최소 5개 이상의 영어 웹 사이트 각각에 대한 HTML 소스 파일과 단어 출현빈도 파일을 저장하시오. \n", + " - 즉, 총 10개의 파일을 동일한 폴더에 생성하시오.\n", + " - [주의] 영어 웹사이트 URL로만 5개 이상\n", + " - 가능하면 주제가 서로 다른 웹 사이트들로 선정\n", + " - 5) 위 문제에서 저장한 모든 words.frequency 파일들을 객체로 다시 로드하여 본인이 저장하여 분석한 사이트들 각각에 대해서 가장 많이 출현한 단어 3개씩를 뽑아 제시하시오. \n", + " - 반드시 pickle 모듈로 저장한 5개 이상의 words.frequency를 다시 5개 이상의 사전 객체로 로드 하는 코드가 추가되어야 함\n", + " - 6) 간단한 검색엔진 코딩 (Like Google!!!)\n", + " - 사용자에게 임의의 단어 1개를 입력받으시오.\n", + " - 입력 받은 단어와 유사도(Similarity)가 높은 웹 사이트 기준으로 위 4)에서 미리 지정해 놓은 5개 이상의 웹 사이트 URL들을 일렬로 나열하여 출력하시오.\n", + " - 단어와 웹 사이트 간의 유사도는 본인이 스스로 정하시오.\n", + " - 유사도를 정하는 최소한의 기준은 단어 출현 빈도를 기반으로 해야 하며, 이외의 본인이 생각하는 방안이 있으면 함께 사용해도 됨.\n", + " - 반드시 코딩 내에 similarity 라는 사전 자료 구조가 있어야 함 (즉, 다음과 유사한 코드가 있어야 함).\n", + " - similarity = {}\n", + " - ...\n", + " - similarity[url1] = x1\n", + " - ...\n", + " - similarity[url2] = x2\n", + " - ...\n", + " \n", + " - 유사도가 높은 웹 사이트가 상위에 출력되어야 함 (즉, 유사도 기준 내림 차순)\n", + " - 유사도가 동일한 웹 사이트들에 대해서는 임의 배치함.\n", + " - 7) [주의] 필수사항\n", + " - 위에서 만든 검색엔진 코딩은 매우 간단한 것이라 부족한 점이 많이 존재한다.\n", + " - 본인이 생각하기에 상업적인 완성도 높은 검색 로봇/엔진이 되려면 어떤 기능들이 추가적으로 구현되어야 할지 최소 3가지 이상 제시하시오. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/assignment-5.ipynb b/python3.6/assignment-5.ipynb new file mode 100644 index 0000000..457a7a7 --- /dev/null +++ b/python3.6/assignment-5.ipynb @@ -0,0 +1,331 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 5\n", + "### [정보]\n", + "#### 1) Due Date: 2017년 12월 5일 (화), 23시 59분\n", + "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.jupyter.org에 넣어서 산출된 URL을 EL사이트에 제출\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", + "#### 4) 숙제이후 소감: 모든 문제의 답을 적은 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "#### 5) 문제 (총 12개)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [1번 문제] \n", + "클래스와 모듈의 공통점과 차이점에 대해 설명하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [2번 문제] \n", + "다형성에 대해 설명하고 다형성을 보여주는 자신만의 파이썬 코드 예제를 제시하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [3번 문제] \n", + "\n", + "다음 각 요구사항 모두를 만족시키는 Counter 클래스를 코딩하시오 (정답을 각 요구사항별로 입력할 필요 없이 3번 문제에 대해 1개의 클래스 정의 코드를 제시하면 된다.)\n", + " - 요구사항 1. 생성자에 count 값과 step 값을 인자로 받을 수 있다.\n", + " - count: Counter 인스턴스가 지니는 초기 정수 값\n", + " - step: Counter 인스턴스의 count가 증가되는 증분 (defalt 값: 1)\n", + "\n", + " > \\>\\>\\> c = Counter(10)
\n", + " > \\>\\>\\> d = Counter(10, 2)
\n", + " \n", + " - 요구사항 2. 다음과 같이 Counter의 인스턴스를 출력을 해주는 \\_\\_str\\_\\_() 메소드를 Counter 클래스 내에 구현하시오.\n", + " > \\>\\>\\> print(c)
\n", + " > [Count (step: 1)] 10
\n", + " > \\>\\>\\> print(d)
\n", + " > [Count (step: 2)] 10
\n", + " \n", + " - 요구사항 3. 다음과 같이 step에 주어진 증분만큼 count를 증가시키는 incr() 메소드를 Counter 클래스 내에 구현하시오.\n", + " > \\>\\>\\> c.incr()
\n", + " > \\>\\>\\> d.incr()
\n", + " > \\>\\>\\> print(c)
\n", + " > [Count (step: 1)] 11
\n", + " > \\>\\>\\> print(d)
\n", + " > [Count (step: 2)] 12
\n", + " \n", + " - 요구사항 4. Counter 클래스 내에 관련 메소드를 추가하여 인스턴스 객체를 직접 호출(call)할 수 있도록 하시오. 인스턴스 객체를 직접 호출했을 때에 내부적으로 incr() 메소드를 호출하는 방법으로 구현하시오. \n", + " > \\>\\>\\> c()
\n", + " > \\>\\>\\> d()
\n", + " > \\>\\>\\> print(c)
\n", + " > [Count (step: 1)] 12
\n", + " > \\>\\>\\> print(d)
\n", + " > [Count (step: 2)] 14
\n", + " \n", + " - 요구사항 5. 다음과 같은 두 개의 산술 연산 (+, -)이 수행될 수 있도록 Counter 클래스 내에 관련 메소드를 추가하시오.\n", + " > \\>\\>\\> c = c + 5
\n", + " > \\>\\>\\> d = d - 5
\n", + " > \\>\\>\\> print(c)
\n", + " > [Count (step: 1)] 17
\n", + " > \\>\\>\\> print(d)
\n", + " > [Count (step: 2)] 9
\n", + " \n", + " - 요구사항 6. 다음과 같은 관계연산 (>, <, ==)이 수행될 수 있도록 Counter 클래스 내에 관련 메소드를 추가하시오.\n", + " > \\>\\>\\> print(c) > 10
\n", + " > True
\n", + " > \\>\\>\\> print(d) > 10
\n", + " > False
\n", + " > \\>\\>\\> print(c) < 10
\n", + " > False
\n", + " > \\>\\>\\> print(d) < 10
\n", + " > True
\n", + " > \\>\\>\\> print(c) == 17
\n", + " > True
\n", + " > \\>\\>\\> print(d) != 9
\n", + " > False
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [4번 문제] \n", + "\n", + "다음은 내장 자료형 list를 서브클래싱하여 만든 MySet 클래스 정의 내용이다. 다음 클래스 정의에서 \\_\\_init\\_\\_(), \\_\\_str()\\_\\_(), elimicate_duplicate()의 세 개의 메소드 코드 내용을 자신이 다른 사람에게 가르친다고 생각하며 설명해보시오.\n", + " - MySet은 집합(Set) 자료형을 정의하려는 의도하에 만들어진 클래스이다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MySet: {1 ,2 ,3}\n", + "MySet: {2 ,3 ,4 ,5 ,6 ,7 ,8 ,9}\n" + ] + } + ], + "source": [ + "class MySet(list):\n", + " def __init__(self, l):\n", + " for e in l:\n", + " self.append(e)\n", + " MySet.eliminate_duplicate(self)\n", + " \n", + " def __str__(self):\n", + " result = \"MySet: {\"\n", + " for e in self:\n", + " result = result + str(e) + \" ,\"\n", + " result = result[0:len(result)-2] + \"}\"\n", + " return result\n", + "\n", + " @staticmethod \n", + " def eliminate_duplicate(l):\n", + " s = []\n", + " for e in l:\n", + " if e not in s:\n", + " s.append(e)\n", + " l[:] = []\n", + " for e in s:\n", + " l.append(e)\n", + "\n", + " \n", + "if __name__ == \"__main__\":\n", + " s = MySet([1, 2, 2, 3])\n", + " print(s)\n", + " t = MySet([2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9])\n", + " print(t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [5번 문제] \n", + "\n", + "4번 문제에 정의된 MySet 클래스에 메소드를 추가하여 다음 각 요구사항 모두를 만족시키는 코딩을 제시하시오 \n", + " - 정답을 각 요구사항별로 입력할 필요 없이 요구사항 3개 전체에 대해 1개의 MySet 클래스 정의 코드를 제시하고 주석등으로 해당 코드를 설명한다.\n", + " - 요구사항 1. | 연산으로 두 집합의 합집합을 반환한다.\n", + " > \\>\\>\\> u = s | t
\n", + " > \\>\\>\\> print(u)
\n", + " > MySet: {1, 2, 3, 4, 5, 6, 7, 8, 9}
\n", + " \n", + " - 요구사항 2. & 연산으로 두 집합의 교집합을 반환한다.\n", + " > \\>\\>\\> u = s & t
\n", + " > \\>\\>\\> print(u)
\n", + " > MySet: {2, 3}
\n", + "\n", + " - 요구사항 3. - 연산으로 두 집합의 차집합을 반환한다.\n", + " > \\>\\>\\> s = MySet([1, 2, 3])
\n", + " > \\>\\>\\> t = MySet([3, 4, 5])
\n", + " > \\>\\>\\> u = s - t
\n", + " > \\>\\>\\> print(u)
\n", + " > MySet: {1, 2}
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [6번 문제] \n", + "\n", + "5번 문제에서 정의한 MySet 클래스에 대해 다음 예제를 수행하면 오류없이 올바르게 동작하는 것을 확인할 수 있다. 다음 예제 내에 있는 len(), bool() 내장함수와 in 키워드 사용 예제가 별다른 메소드 정의를 하지 않았는 데도 올바르게 수행되는 이유를 설명하시오.\n", + " \n", + " >>> s = MySet([1, 2, 3, 4, 5, 6])\n", + " >>> print(len(s))\n", + " > 6\n", + " >>> print(bool(s))\n", + " > True\n", + " >>> print(2 in s)\n", + " > True\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [7번 문제]\n", + "프로젝트 오일러 문제 16\n", + "\n", + "##### [8번 문제]\n", + "프로젝트 오일러 문제 17\n", + "\n", + "##### [9번 문제]\n", + "프로젝트 오일러 문제 18" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [10번 문제] \n", + "\n", + "이전 Assignment 3 (Assignment 4가 아님)의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3을 다시 확장/변형하여 다음과 같은 조건을 만족하도록 구현하시오.\n", + " - 1) 새로운 클래스 WebWordsFrequency를 정의하시오.\n", + " - 이전 Assignment 4에서 고려했던 pickle 모듈등은 전혀 고려하지 마시오.\n", + " - 즉, 하드디스크에 저장하고 다시 로드하는 기능은 본 숙제에는 배제하시오.\n", + " - Assignment 4에서 고려했던 영어 불용어 처리는 적용하시오.\n", + " - Assignment 4에서 처럼 국문 사이트가 아닌 영어 사이트만을 고려하여 아래 사항을 코딩하시오.\n", + " - 2) 생성자에 URL을 0개에서 임의의 개수를 넣을 수 있도록 생성자 인수를 가변인수로 정의하여 각각의 URL을 리스트 자료형에 유지하시오.\n", + " > \\>\\>\\> w1 = WebWordsFrequency('http://www.cnn.com', 'http://www.times.com', 'https://www.amazon.com')
\n", + " > \\>\\>\\> w2 = WebWordsFrequency('http://www.cnn.com', 'http://www.times.com')
\n", + " > \\>\\>\\> w3 = WebWordsFrequency()
\n", + " - 3) addUrl() 메소드를 구현하여 인스턴스를 생성한 이후에도 URL을 추가할 수 있도록 한다.\n", + " - 반드시 1개의 URL을 추가하도록 구현 (즉, 동시에 여러 개의 URL을 추가하는 것은 배제)\n", + " \n", + " > \\>\\>\\> w1.addUrl('https://github.com')
\n", + " > \\>\\>\\> w3.addUrl('http://stackoverflow.com')
\n", + " - 4) removeUrl() 메소드를 구현하여 URL을 삭제할 수 있도록 한다.\n", + " - 반드시 1개의 URL을 삭제하도록 구현 (즉, 동시에 여러 개의 URL을 삭제하는 것은 배제) \n", + " \n", + " > \\>\\>\\> w1.removeUrl('http://www.cnn.com')
\n", + " > \\>\\>\\> w2.removeUrl('http://stackoverflow.com')
\n", + " - 5) listUrls() 메소드를 구현하여 현재 등록된 모든 URL을 출력하는 기능을 추가\n", + " > \\>\\>\\> w1.listUrls()
\n", + " > http://www.times.com
\n", + " > https://www.amazon.com
\n", + " > https://github.com
\n", + " - 6) getWordsFrequency() 메소드를 구현하여 각 URL의 웹페이지들을 종합적으로 분석한 단어 출현 빈도 사전을 반환하시오.\n", + " - 만약 등록된 URL이 없다면 공백 사전을 반환 \n", + " \n", + " > \\>\\>\\> w1.getWordsFrequency()
\n", + " > {'hello': 8, 'site': 12, 'world': 2, 'science': 11, 'program': 1, 'python': 1}\n", + " - 7) getMaxFreqencyWords() 메소드를 구현하여 각 URL의 웹페이지들을 종합적으로 분석한 단어 출현 빈도 사전에서 가장 많이 출현한 단어 리스트를 반환하시오.\n", + " \n", + " > \\>\\>\\> w1.getMaxFreqencyWords()
\n", + " > site
\n", + " \n", + " - 최다 출현 단어의 빈도수가 동일한 경우 모두 출력해주어야 함 \n", + " \n", + " > \\>\\>\\> w2.getMaxFreqencyWords()
\n", + " > site
\n", + " > science\n", + " \n", + " - 만약 등록된 URL이 없다면 None을 반환\n", + " - 8) 임의의 단어 1개를 파라미터로 받는 searchUrlByWord() 메소드를 구현하여 유사도가 높은 웹 사이트를 출력하시오.\n", + " > \\>\\>\\> w1.searchUrlByWord(\"news\")
\n", + " > http://www.cnn.com
\n", + " \n", + " - 파라미터로 받은 단어와 유사도가 동일한 URL이 여러 개이면 해당 URL을 모두 출력하시오. \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [11번 문제] \n", + "\n", + "위 10번 문제에서 정의한 WebWordsFrequency 클래스를 상속하여 OrderedWebWordsFrequency 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 오버라이드 하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.\n", + " - 리스트 내의 각 원소는 단어와 빈도를 쌍으로 지니는 튜플이다.\n", + " - getWordFrequence() 메소드에 reverse 라는 인자를 만들고 true 또는 false를 인자로 받을 수 있도록 한다.\n", + " - reverse 인자의 디폴트 값은 false 이며, 기본적으로 내림차순으로 정렬한다.\n", + " - reverse 인자에 true를 넣으면 오름차순으로 정렬한다.\n", + " \n", + " > \\>\\>\\> w4 = OrderedWebWordsFrequency('http://www.times.com', 'https://www.amazon.com', 'https://github.com')\n", + " \n", + " > \\>\\>\\> w4.getWordsFrequency()
\n", + " > [('site', 12), ('science', 11), ('hello', 8), ('world', 2), ('program', 1), ('python', 1)]\n", + " \n", + " > \\>\\>\\> w4.getWordsFrequency(reverse=true)
\n", + " > [('program', 1), ('python', 1), ('world', 2), ('hello', 8), ('science', 11), ('site', 12)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [12번 문제]\n", + "\n", + "다음과 같은 코딩이 가능하도록 OrderedWebWordsFrequency 안에 반복자와 관련된 메소드를 추가하시오.\n", + "\n", + "> \\>\\>\\> for i in w4:
\n", + "> \\>\\>\\>       print(i)
\n", + "> ('site, 12)
\n", + "> ('science', 11)
\n", + "> ('hello', 8)
\n", + "> ('world', 2)
\n", + "> ('program', 1)
\n", + "> ('python', 1)
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 84dc19300a2dbe7dea0d8f4563d1f45f9a9fc1df Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 11 Sep 2017 23:06:19 +0900 Subject: [PATCH 037/124] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python02.ipynb | 255 ++++++++++++++------- python3.6/supplement-2016-09.ipynb | 356 +++++++++++++++++++++-------- 2 files changed, 434 insertions(+), 177 deletions(-) diff --git a/python3.6/python02.ipynb b/python3.6/python02.ipynb index 976f26f..4154510 100644 --- a/python3.6/python02.ipynb +++ b/python3.6/python02.ipynb @@ -39,7 +39,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -95,7 +97,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -122,7 +126,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -151,7 +157,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -180,7 +188,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -210,7 +220,9 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -241,7 +253,9 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -266,7 +280,7 @@ " range(stop) -> range object\n", "range(start, stop[, step]) -> range object \n", " - 수치형 자료형으로 start, stop, step 등을 입력받아 start부터 stop까지의 정수값들이 순차적으로 들어 있는 range object를 리스트로 반환하는 함수\n", - " - Python2에서는 range()의 결과로 곧바로 정수가 리스트가 반환됨\n", + " - Python2에서는 range()의 결과로 곧바로 리스트가 반환됨\n", " - 인수가 하나(stop)인 경우\n", " - 0(디폴트 값)부터 stop-1까지의 정수 리스트를 반환한다.\n", " - 인수가 두 개(start, stop)인 경우\n", @@ -279,7 +293,9 @@ { "cell_type": "code", "execution_count": 24, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -334,7 +350,9 @@ { "cell_type": "code", "execution_count": 25, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -381,9 +399,10 @@ " - 대소문자 구별함\n", " - 식별자는 문자 A~Z 또는 a~z과 언더바(\\_)로 시작할 수 있다. \n", " - 식별자 첫 시작을 제외하고 식별자 내에 숫자(0~9)를 사용할 수 있다.\n", - " - 특수문자 @, $, %등은 식별자에 올 수 없다.\n", + " - 특수문자 @, $, % 등은 식별자의 어느 자리에도 올 수 없다.\n", + " \n", " - 예를 들어 다음과 같은 것은 식별자가 될 수 없음\n", - " - 1abc, @file, %x" + " - 1abc, @file, %x, a%a, a$a, a@a" ] }, { @@ -403,7 +422,9 @@ { "cell_type": "code", "execution_count": 26, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -420,7 +441,9 @@ { "cell_type": "code", "execution_count": 27, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -451,7 +474,9 @@ { "cell_type": "code", "execution_count": 28, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -476,7 +501,9 @@ { "cell_type": "code", "execution_count": 29, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "NameError", @@ -505,7 +532,9 @@ { "cell_type": "code", "execution_count": 30, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -572,7 +601,9 @@ { "cell_type": "code", "execution_count": 32, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -593,7 +624,9 @@ { "cell_type": "code", "execution_count": 33, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -632,7 +665,9 @@ { "cell_type": "code", "execution_count": 35, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "SyntaxError", @@ -650,7 +685,9 @@ { "cell_type": "code", "execution_count": 36, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -669,7 +706,9 @@ { "cell_type": "code", "execution_count": 37, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -702,7 +741,9 @@ { "cell_type": "code", "execution_count": 38, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -728,7 +769,9 @@ { "cell_type": "code", "execution_count": 39, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "SyntaxError", @@ -753,7 +796,9 @@ { "cell_type": "code", "execution_count": 40, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -772,7 +817,9 @@ { "cell_type": "code", "execution_count": 41, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -791,7 +838,9 @@ { "cell_type": "code", "execution_count": 42, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -820,7 +869,9 @@ { "cell_type": "code", "execution_count": 43, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -852,7 +903,9 @@ { "cell_type": "code", "execution_count": 44, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -896,13 +949,16 @@ " - 윈도우즈에서는 Command창, 리눅스/맥에서는 Terminal창\n", " - 각 IDE (예, 이클립스)에서는 별도의 콘솔 창이 제공됨\n", "- Python2에서, raw_input(): 문자열 입력 내장함수\n", - "- Python3부터는 input()을 사용" + "- Python3부터는 input()만을 사용\n", + " - raw_input() 내장함수는 지원하지 않음" ] }, { "cell_type": "code", "execution_count": 46, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -921,7 +977,9 @@ { "cell_type": "code", "execution_count": 47, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -947,7 +1005,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -965,21 +1025,33 @@ }, { "cell_type": "code", - "execution_count": 50, - "metadata": {}, + "execution_count": 1, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "int : 12\n", - "12\n", + "int : 10\n", + "10\n", + "\n", + "\n", + "int : 10\n", + "10\n", "\n" ] } ], "source": [ "# k = int(raw_input('int : '))\n", + "k = input('int : ')\n", + "print(k)\n", + "print(type(k))\n", + "\n", + "print()\n", + "\n", "k = int(input('int : '))\n", "print(k)\n", "print(type(k))" @@ -987,14 +1059,14 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "# Python2에서 \n", - "# input(): 정수, 실수, Expression 입력 내장함수" + "# Python3에서 input()의 기능\n", + "# Read a string from standard input. The trailing newline is stripped." ] }, { @@ -1008,31 +1080,12 @@ "? input" ] }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "int :45\n", - "45\n", - "\n" - ] - } - ], - "source": [ - "i = input('int :')\n", - "print(i)\n", - "print(type(i))" - ] - }, { "cell_type": "code", "execution_count": 52, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1062,13 +1115,15 @@ "metadata": {}, "source": [ "- print: 화면에 자료를 출력하는 보편적인 statement\n", - "- 여러 자료를 한꺼번에 출력할 때에는 end=' '를 사용 (디폴트는 end='\\n')" + "- 하나의 print로 두 개 이상의 자료를 출력할 때에는 , 사용" ] }, { "cell_type": "code", "execution_count": 53, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1092,7 +1147,9 @@ { "cell_type": "code", "execution_count": 54, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1111,14 +1168,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Python2에서는 기본적으로 print는 마지막에 줄바꿈을 수행한다. 그러나 콤마(,)가 마지막에 있으면 줄바꿈을 하지 않음\n", + "- Python2에서 기본적으로 print는 마지막에 줄바꿈을 수행한다. 그러나 콤마(,)가 마지막에 있으면 줄바꿈을 하지 않음\n", "- Python3에서는 콤마를 붙이나 안붙이나 상관없이 줄바꿈을 수행" ] }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, + "execution_count": 3, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1128,21 +1187,8 @@ "2\n", "\n", "1\n", - "2\n", - "\n", - "1, 2\n", - "1 2\n" + "2\n" ] - }, - { - "data": { - "text/plain": [ - "(None, None)" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -1151,10 +1197,41 @@ "#1 2\n", "print()\n", "print(1)\n", + "print(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- print를 여러번 사용하여 두 개 이상의 자료를 newline 없이 출력할 때에는 end=' '를 사용 (디폴트는 end='\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1, 2\n", + "\n", + "1 2\n" + ] + } + ], + "source": [ + "print(1, end=\", \")\n", "print(2)\n", + "\n", "print()\n", - "print(1, end=\", \"),print(2)\n", - "print(1, end=\" \"),print(2)" + "\n", + "print(1, end=\" \")\n", + "print(2)" ] }, { @@ -1167,7 +1244,9 @@ { "cell_type": "code", "execution_count": 60, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -1188,7 +1267,9 @@ { "cell_type": "code", "execution_count": 61, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1226,7 +1307,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/supplement-2016-09.ipynb b/python3.6/supplement-2016-09.ipynb index 7729677..08fd271 100644 --- a/python3.6/supplement-2016-09.ipynb +++ b/python3.6/supplement-2016-09.ipynb @@ -82,7 +82,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -136,7 +138,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -247,7 +251,9 @@ { "cell_type": "code", "execution_count": 31, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -276,7 +282,9 @@ { "cell_type": "code", "execution_count": 32, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -315,7 +323,9 @@ { "cell_type": "code", "execution_count": 33, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -342,7 +352,9 @@ { "cell_type": "code", "execution_count": 34, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -368,7 +380,9 @@ { "cell_type": "code", "execution_count": 36, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "SyntaxError", @@ -388,7 +402,9 @@ { "cell_type": "code", "execution_count": 38, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -420,7 +436,9 @@ { "cell_type": "code", "execution_count": 39, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -452,7 +470,9 @@ { "cell_type": "code", "execution_count": 40, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -480,7 +500,9 @@ { "cell_type": "code", "execution_count": 41, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -505,7 +527,9 @@ { "cell_type": "code", "execution_count": 42, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -532,7 +556,9 @@ { "cell_type": "code", "execution_count": 46, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -560,7 +586,9 @@ { "cell_type": "code", "execution_count": 47, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -582,7 +610,9 @@ { "cell_type": "code", "execution_count": 48, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -601,7 +631,9 @@ { "cell_type": "code", "execution_count": 49, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -637,7 +669,9 @@ { "cell_type": "code", "execution_count": 50, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -668,7 +702,9 @@ { "cell_type": "code", "execution_count": 51, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -687,7 +723,9 @@ { "cell_type": "code", "execution_count": 52, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -707,7 +745,9 @@ { "cell_type": "code", "execution_count": 53, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -735,7 +775,9 @@ { "cell_type": "code", "execution_count": 54, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -762,7 +804,9 @@ { "cell_type": "code", "execution_count": 55, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -782,7 +826,9 @@ { "cell_type": "code", "execution_count": 56, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -807,7 +853,9 @@ { "cell_type": "code", "execution_count": 57, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -853,7 +901,9 @@ { "cell_type": "code", "execution_count": 62, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -931,7 +981,9 @@ { "cell_type": "code", "execution_count": 65, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -972,7 +1024,9 @@ { "cell_type": "code", "execution_count": 66, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -998,7 +1052,9 @@ { "cell_type": "code", "execution_count": 67, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "data": { @@ -1029,7 +1085,9 @@ { "cell_type": "code", "execution_count": 68, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "data": { @@ -1072,7 +1130,9 @@ { "cell_type": "code", "execution_count": 69, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1100,7 +1160,9 @@ { "cell_type": "code", "execution_count": 70, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1133,7 +1195,9 @@ { "cell_type": "code", "execution_count": 71, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1160,7 +1224,9 @@ { "cell_type": "code", "execution_count": 72, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1186,7 +1252,9 @@ { "cell_type": "code", "execution_count": 73, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1210,7 +1278,9 @@ { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1281,7 +1351,9 @@ { "cell_type": "code", "execution_count": 80, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1368,7 +1440,9 @@ { "cell_type": "code", "execution_count": 81, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1438,7 +1512,9 @@ { "cell_type": "code", "execution_count": 82, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1523,7 +1599,9 @@ { "cell_type": "code", "execution_count": 83, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1559,7 +1637,9 @@ { "cell_type": "code", "execution_count": 84, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "data": { @@ -1587,7 +1667,9 @@ { "cell_type": "code", "execution_count": 85, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1633,7 +1715,9 @@ { "cell_type": "code", "execution_count": 86, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1658,7 +1742,9 @@ { "cell_type": "code", "execution_count": 87, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1688,7 +1774,9 @@ { "cell_type": "code", "execution_count": 88, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1718,7 +1806,9 @@ { "cell_type": "code", "execution_count": 89, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1748,7 +1838,9 @@ { "cell_type": "code", "execution_count": 90, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1779,7 +1871,9 @@ { "cell_type": "code", "execution_count": 91, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1803,7 +1897,9 @@ { "cell_type": "code", "execution_count": 92, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1841,7 +1937,9 @@ { "cell_type": "code", "execution_count": 93, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "? math.log10" @@ -1872,7 +1970,9 @@ { "cell_type": "code", "execution_count": 95, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "a = (\"한글과 세종대왕\", 'utf-8')\n", @@ -1882,7 +1982,9 @@ { "cell_type": "code", "execution_count": 96, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1903,7 +2005,9 @@ { "cell_type": "code", "execution_count": 97, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1929,7 +2033,9 @@ { "cell_type": "code", "execution_count": 99, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1950,7 +2056,9 @@ { "cell_type": "code", "execution_count": 101, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1980,7 +2088,9 @@ { "cell_type": "code", "execution_count": 102, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2005,7 +2115,9 @@ { "cell_type": "code", "execution_count": 103, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2023,7 +2135,9 @@ { "cell_type": "code", "execution_count": 104, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2040,7 +2154,9 @@ { "cell_type": "code", "execution_count": 105, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2057,7 +2173,9 @@ { "cell_type": "code", "execution_count": 106, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2077,7 +2195,9 @@ { "cell_type": "code", "execution_count": 107, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2097,7 +2217,9 @@ { "cell_type": "code", "execution_count": 108, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "NameError", @@ -2137,7 +2259,9 @@ { "cell_type": "code", "execution_count": 110, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2176,7 +2300,9 @@ { "cell_type": "code", "execution_count": 112, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2193,7 +2319,9 @@ { "cell_type": "code", "execution_count": 113, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2239,7 +2367,9 @@ { "cell_type": "code", "execution_count": 129, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2287,7 +2417,9 @@ { "cell_type": "code", "execution_count": 130, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2309,7 +2441,9 @@ { "cell_type": "code", "execution_count": 133, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2328,7 +2462,9 @@ { "cell_type": "code", "execution_count": 134, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2346,7 +2482,9 @@ { "cell_type": "code", "execution_count": 135, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2375,7 +2513,9 @@ { "cell_type": "code", "execution_count": 136, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2398,7 +2538,9 @@ { "cell_type": "code", "execution_count": 137, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2421,7 +2563,9 @@ { "cell_type": "code", "execution_count": 138, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2455,7 +2599,9 @@ { "cell_type": "code", "execution_count": 139, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2495,7 +2641,9 @@ { "cell_type": "code", "execution_count": 140, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2554,7 +2702,9 @@ { "cell_type": "code", "execution_count": 141, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "SyntaxError", @@ -2584,7 +2734,9 @@ { "cell_type": "code", "execution_count": 142, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2633,7 +2785,9 @@ { "cell_type": "code", "execution_count": 143, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2662,7 +2816,9 @@ { "cell_type": "code", "execution_count": 145, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2740,7 +2896,9 @@ { "cell_type": "code", "execution_count": 148, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -2761,7 +2919,9 @@ { "cell_type": "code", "execution_count": 150, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# print(type(123) is types.IntType)\n", @@ -2845,7 +3005,9 @@ { "cell_type": "code", "execution_count": 154, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -3044,7 +3206,9 @@ { "cell_type": "code", "execution_count": 156, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import math\n", @@ -3119,7 +3283,9 @@ { "cell_type": "code", "execution_count": 157, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "data": { @@ -3409,7 +3575,9 @@ { "cell_type": "code", "execution_count": 158, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -3427,7 +3595,9 @@ { "cell_type": "code", "execution_count": 159, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -3451,7 +3621,9 @@ { "cell_type": "code", "execution_count": 160, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -3474,7 +3646,9 @@ { "cell_type": "code", "execution_count": 161, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -3499,7 +3673,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 다음은 math 모듈을 가져오는 코딩이다. math 모듈을 가져온 후 math 모듈에 정의된 함수를 이용하여 -4.3 값을 반올림한 후 절대값을 계산하여 출력하는 코딩을 한 줄로 완성하라." + "- 다음은 math 모듈을 가져오는 코딩이다. math 모듈을 가져온 후 math 모듈에 정의된 함수 및 변수를 이용하여 원주율 파이($\\pi$)의 10승을 출력하는 코딩을 한 줄로 완성하라." ] }, { @@ -3516,7 +3690,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [] }, @@ -3568,7 +3744,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, From abfd82e37d85bd428dd9e8833ead462070269836 Mon Sep 17 00:00:00 2001 From: dohyung Date: Mon, 11 Sep 2017 23:18:50 +0900 Subject: [PATCH 038/124] =?UTF-8?q?python02=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python02.ipynb | 172 ++++++++++----------------------------- 1 file changed, 42 insertions(+), 130 deletions(-) diff --git a/python3.6/python02.ipynb b/python3.6/python02.ipynb index 4154510..c21eb94 100644 --- a/python3.6/python02.ipynb +++ b/python3.6/python02.ipynb @@ -39,9 +39,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -97,9 +95,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -126,9 +122,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -157,9 +151,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -188,9 +180,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -220,9 +210,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -253,9 +241,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -292,10 +278,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -319,24 +303,10 @@ "# [3, 4, 5, 6, 7, 8, 9]\n", "# [3, 5, 7, 9]\n", "print()\n", - "# print(list(range(10)))\n", - "# list(range(3, 10)); print(list)\n", - "# list(range(3, 10, 2)); print(list)\n", - "# print()\n", - "list = []\n", - "for item in range(10):\n", - " list.append(item)\n", - "print(list)\n", - "\n", - "list = []\n", - "for item in range(3, 10):\n", - " list.append(item)\n", - "print(list)\n", "\n", - "list = []\n", - "for item in range(3, 10, 2):\n", - " list.append(item)\n", - "print(list)" + "print(list(range(10)))\n", + "print(list(range(3, 10)))\n", + "print(list(range(3, 10, 2)))" ] }, { @@ -350,9 +320,7 @@ { "cell_type": "code", "execution_count": 25, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -422,9 +390,7 @@ { "cell_type": "code", "execution_count": 26, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -441,9 +407,7 @@ { "cell_type": "code", "execution_count": 27, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -474,9 +438,7 @@ { "cell_type": "code", "execution_count": 28, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -501,9 +463,7 @@ { "cell_type": "code", "execution_count": 29, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "NameError", @@ -532,9 +492,7 @@ { "cell_type": "code", "execution_count": 30, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -601,9 +559,7 @@ { "cell_type": "code", "execution_count": 32, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -624,9 +580,7 @@ { "cell_type": "code", "execution_count": 33, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -665,9 +619,7 @@ { "cell_type": "code", "execution_count": 35, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "SyntaxError", @@ -685,9 +637,7 @@ { "cell_type": "code", "execution_count": 36, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -706,9 +656,7 @@ { "cell_type": "code", "execution_count": 37, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -741,9 +689,7 @@ { "cell_type": "code", "execution_count": 38, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -769,9 +715,7 @@ { "cell_type": "code", "execution_count": 39, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "SyntaxError", @@ -796,9 +740,7 @@ { "cell_type": "code", "execution_count": 40, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -817,9 +759,7 @@ { "cell_type": "code", "execution_count": 41, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -838,9 +778,7 @@ { "cell_type": "code", "execution_count": 42, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -869,9 +807,7 @@ { "cell_type": "code", "execution_count": 43, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -903,9 +839,7 @@ { "cell_type": "code", "execution_count": 44, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -956,9 +890,7 @@ { "cell_type": "code", "execution_count": 46, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -977,9 +909,7 @@ { "cell_type": "code", "execution_count": 47, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1005,9 +935,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1026,9 +954,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1083,9 +1009,7 @@ { "cell_type": "code", "execution_count": 52, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1121,9 +1045,7 @@ { "cell_type": "code", "execution_count": 53, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1147,9 +1069,7 @@ { "cell_type": "code", "execution_count": 54, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1175,9 +1095,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1210,9 +1128,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1244,9 +1160,7 @@ { "cell_type": "code", "execution_count": 60, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -1267,9 +1181,7 @@ { "cell_type": "code", "execution_count": 61, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1307,7 +1219,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.1" } }, "nbformat": 4, From 99ae95fb31de602d08928342338db1728954d6fe Mon Sep 17 00:00:00 2001 From: dohyung Date: Tue, 12 Sep 2017 08:59:20 +0900 Subject: [PATCH 039/124] =?UTF-8?q?python=2002=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python02.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python3.6/python02.ipynb b/python3.6/python02.ipynb index c21eb94..bf7d7a9 100644 --- a/python3.6/python02.ipynb +++ b/python3.6/python02.ipynb @@ -972,7 +972,7 @@ ], "source": [ "# k = int(raw_input('int : '))\n", - "k = input('int : ')\n", + "k = input('str : ')\n", "print(k)\n", "print(type(k))\n", "\n", From 6f83725a657113da72aa39a9381671d81c019ec1 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 18 Sep 2017 11:11:50 +0900 Subject: [PATCH 040/124] ... --- ...41\205\256\341\206\253\341\204\214\341\205\246.webloc" | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 "\341\204\207\341\205\245\341\206\267\341\204\213\341\205\265\341\204\213\341\205\264 \341\204\203\341\205\246\341\204\213\341\205\265\341\204\220\341\205\245 \341\204\213\341\205\241\341\204\217\341\205\265\341\204\220\341\205\246\341\206\250\341\204\216\341\205\245 -- [Python] [\341\204\200\341\205\242\341\204\202\341\205\247\341\206\267\341\204\213\341\205\263\341\206\257 \341\204\214\341\205\241\341\206\270\341\204\213\341\205\241\341\204\214\341\205\256\341\204\202\341\205\263\341\206\253 \341\204\221\341\205\263\341\204\205\341\205\251\341\204\200\341\205\263\341\204\205\341\205\242\341\204\206\341\205\265\341\206\274 \341\204\214\341\205\245\341\206\274\341\204\211\341\205\245\341\206\250] 4.8 \341\204\213\341\205\247\341\206\253\341\204\211\341\205\263\341\206\270\341\204\206\341\205\256\341\206\253\341\204\214\341\205\246.webloc" diff --git "a/\341\204\207\341\205\245\341\206\267\341\204\213\341\205\265\341\204\213\341\205\264 \341\204\203\341\205\246\341\204\213\341\205\265\341\204\220\341\205\245 \341\204\213\341\205\241\341\204\217\341\205\265\341\204\220\341\205\246\341\206\250\341\204\216\341\205\245 -- [Python] [\341\204\200\341\205\242\341\204\202\341\205\247\341\206\267\341\204\213\341\205\263\341\206\257 \341\204\214\341\205\241\341\206\270\341\204\213\341\205\241\341\204\214\341\205\256\341\204\202\341\205\263\341\206\253 \341\204\221\341\205\263\341\204\205\341\205\251\341\204\200\341\205\263\341\204\205\341\205\242\341\204\206\341\205\265\341\206\274 \341\204\214\341\205\245\341\206\274\341\204\211\341\205\245\341\206\250] 4.8 \341\204\213\341\205\247\341\206\253\341\204\211\341\205\263\341\206\270\341\204\206\341\205\256\341\206\253\341\204\214\341\205\246.webloc" "b/\341\204\207\341\205\245\341\206\267\341\204\213\341\205\265\341\204\213\341\205\264 \341\204\203\341\205\246\341\204\213\341\205\265\341\204\220\341\205\245 \341\204\213\341\205\241\341\204\217\341\205\265\341\204\220\341\205\246\341\206\250\341\204\216\341\205\245 -- [Python] [\341\204\200\341\205\242\341\204\202\341\205\247\341\206\267\341\204\213\341\205\263\341\206\257 \341\204\214\341\205\241\341\206\270\341\204\213\341\205\241\341\204\214\341\205\256\341\204\202\341\205\263\341\206\253 \341\204\221\341\205\263\341\204\205\341\205\251\341\204\200\341\205\263\341\204\205\341\205\242\341\204\206\341\205\265\341\206\274 \341\204\214\341\205\245\341\206\274\341\204\211\341\205\245\341\206\250] 4.8 \341\204\213\341\205\247\341\206\253\341\204\211\341\205\263\341\206\270\341\204\206\341\205\256\341\206\253\341\204\214\341\205\246.webloc" deleted file mode 100644 index b02910d..0000000 --- "a/\341\204\207\341\205\245\341\206\267\341\204\213\341\205\265\341\204\213\341\205\264 \341\204\203\341\205\246\341\204\213\341\205\265\341\204\220\341\205\245 \341\204\213\341\205\241\341\204\217\341\205\265\341\204\220\341\205\246\341\206\250\341\204\216\341\205\245 -- [Python] [\341\204\200\341\205\242\341\204\202\341\205\247\341\206\267\341\204\213\341\205\263\341\206\257 \341\204\214\341\205\241\341\206\270\341\204\213\341\205\241\341\204\214\341\205\256\341\204\202\341\205\263\341\206\253 \341\204\221\341\205\263\341\204\205\341\205\251\341\204\200\341\205\263\341\204\205\341\205\242\341\204\206\341\205\265\341\206\274 \341\204\214\341\205\245\341\206\274\341\204\211\341\205\245\341\206\250] 4.8 \341\204\213\341\205\247\341\206\253\341\204\211\341\205\263\341\206\270\341\204\206\341\205\256\341\206\253\341\204\214\341\205\246.webloc" +++ /dev/null @@ -1,8 +0,0 @@ - - - - - URL - http://dataarchitecture.tistory.com/40 - - From 47dea7832683795ed5921fcb882c11fbb6d34126 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 18 Sep 2017 11:12:16 +0900 Subject: [PATCH 041/124] ... --- ...41\205\256\341\206\253\341\204\214\341\205\246.webloc" | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 "\341\204\207\341\205\245\341\206\267\341\204\213\341\205\265\341\204\213\341\205\264 \341\204\203\341\205\246\341\204\213\341\205\265\341\204\220\341\205\245 \341\204\213\341\205\241\341\204\217\341\205\265\341\204\220\341\205\246\341\206\250\341\204\216\341\205\245 -- [Python] [\341\204\200\341\205\242\341\204\202\341\205\247\341\206\267\341\204\213\341\205\263\341\206\257 \341\204\214\341\205\241\341\206\270\341\204\213\341\205\241\341\204\214\341\205\256\341\204\202\341\205\263\341\206\253 \341\204\221\341\205\263\341\204\205\341\205\251\341\204\200\341\205\263\341\204\205\341\205\242\341\204\206\341\205\265\341\206\274 \341\204\214\341\205\245\341\206\274\341\204\211\341\205\245\341\206\250] 4.8 \341\204\213\341\205\247\341\206\253\341\204\211\341\205\263\341\206\270\341\204\206\341\205\256\341\206\253\341\204\214\341\205\246.webloc" diff --git "a/\341\204\207\341\205\245\341\206\267\341\204\213\341\205\265\341\204\213\341\205\264 \341\204\203\341\205\246\341\204\213\341\205\265\341\204\220\341\205\245 \341\204\213\341\205\241\341\204\217\341\205\265\341\204\220\341\205\246\341\206\250\341\204\216\341\205\245 -- [Python] [\341\204\200\341\205\242\341\204\202\341\205\247\341\206\267\341\204\213\341\205\263\341\206\257 \341\204\214\341\205\241\341\206\270\341\204\213\341\205\241\341\204\214\341\205\256\341\204\202\341\205\263\341\206\253 \341\204\221\341\205\263\341\204\205\341\205\251\341\204\200\341\205\263\341\204\205\341\205\242\341\204\206\341\205\265\341\206\274 \341\204\214\341\205\245\341\206\274\341\204\211\341\205\245\341\206\250] 4.8 \341\204\213\341\205\247\341\206\253\341\204\211\341\205\263\341\206\270\341\204\206\341\205\256\341\206\253\341\204\214\341\205\246.webloc" "b/\341\204\207\341\205\245\341\206\267\341\204\213\341\205\265\341\204\213\341\205\264 \341\204\203\341\205\246\341\204\213\341\205\265\341\204\220\341\205\245 \341\204\213\341\205\241\341\204\217\341\205\265\341\204\220\341\205\246\341\206\250\341\204\216\341\205\245 -- [Python] [\341\204\200\341\205\242\341\204\202\341\205\247\341\206\267\341\204\213\341\205\263\341\206\257 \341\204\214\341\205\241\341\206\270\341\204\213\341\205\241\341\204\214\341\205\256\341\204\202\341\205\263\341\206\253 \341\204\221\341\205\263\341\204\205\341\205\251\341\204\200\341\205\263\341\204\205\341\205\242\341\204\206\341\205\265\341\206\274 \341\204\214\341\205\245\341\206\274\341\204\211\341\205\245\341\206\250] 4.8 \341\204\213\341\205\247\341\206\253\341\204\211\341\205\263\341\206\270\341\204\206\341\205\256\341\206\253\341\204\214\341\205\246.webloc" new file mode 100644 index 0000000..b02910d --- /dev/null +++ "b/\341\204\207\341\205\245\341\206\267\341\204\213\341\205\265\341\204\213\341\205\264 \341\204\203\341\205\246\341\204\213\341\205\265\341\204\220\341\205\245 \341\204\213\341\205\241\341\204\217\341\205\265\341\204\220\341\205\246\341\206\250\341\204\216\341\205\245 -- [Python] [\341\204\200\341\205\242\341\204\202\341\205\247\341\206\267\341\204\213\341\205\263\341\206\257 \341\204\214\341\205\241\341\206\270\341\204\213\341\205\241\341\204\214\341\205\256\341\204\202\341\205\263\341\206\253 \341\204\221\341\205\263\341\204\205\341\205\251\341\204\200\341\205\263\341\204\205\341\205\242\341\204\206\341\205\265\341\206\274 \341\204\214\341\205\245\341\206\274\341\204\211\341\205\245\341\206\250] 4.8 \341\204\213\341\205\247\341\206\253\341\204\211\341\205\263\341\206\270\341\204\206\341\205\256\341\206\253\341\204\214\341\205\246.webloc" @@ -0,0 +1,8 @@ + + + + + URL + http://dataarchitecture.tistory.com/40 + + From a6e2d064bd513f9fc1d88abb9672e5c689e7a7ce Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 18 Sep 2017 11:23:29 +0900 Subject: [PATCH 042/124] =?UTF-8?q?assignment=201=20=EB=82=B4=EC=9A=A9=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-1.ipynb | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb index 7ec754a..2cf7268 100644 --- a/python3.6/assignment-1.ipynb +++ b/python3.6/assignment-1.ipynb @@ -10,7 +10,19 @@ "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.jupyter.org에 넣어서 산출된 URL을 EL사이트에 제출\n", "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 11개의 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", - "#### 5) 문제 (ACM-ICPC 3문제 포함하여 총 11개)" + "#### 5) 참고: ACM-ICPC 3문제 정답\n", + " - ACM-ICPC 문제의 정답 코드는 숙제 제출 리포트 내에 포함시키고\n", + " - 해당 코드를 직접 https://www.acmicpc.net 사이트에 회원 가입을 하고 정답을 제출하여 올바른 정답임을 확인해주는 스크린 이미지를 숙제 제출 리포트 (.ipynb)내에 내장시켜 제출하시오. \n", + " - 참고 사이트\n", + " - https://stackoverflow.com/questions/10628262/inserting-image-into-ipython-notebook-markdown\n", + " - https://www.slideshare.net/dahlmoon/jupyter-notebok-20160815" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### [문제]" ] }, { @@ -96,7 +108,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [프로젝트 오일러 문제 1135] \n", + "- [ACM-ICPC 문제 1135] \n", " - 뉴스 전하기
\n", "https://www.acmicpc.net/problem/1135" ] @@ -105,7 +117,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [프로젝트 오일러 문제 1646번]\n", + "- [ACM-ICPC 문제 1646번]\n", " - 피이보나치 트리
\n", " https://www.acmicpc.net/problem/1646" ] @@ -128,7 +140,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, From 6098015786fbab929d9d73065cd569d942554560 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 18 Sep 2017 11:27:06 +0900 Subject: [PATCH 043/124] ... --- python3.6/assignment-1.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb index 2cf7268..93635cd 100644 --- a/python3.6/assignment-1.ipynb +++ b/python3.6/assignment-1.ipynb @@ -10,7 +10,7 @@ "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.jupyter.org에 넣어서 산출된 URL을 EL사이트에 제출\n", "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 11개의 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", - "#### 5) 참고: ACM-ICPC 3문제 정답\n", + "#### 5) 참고: ACM-ICPC 3문제 정답 기재 방법\n", " - ACM-ICPC 문제의 정답 코드는 숙제 제출 리포트 내에 포함시키고\n", " - 해당 코드를 직접 https://www.acmicpc.net 사이트에 회원 가입을 하고 정답을 제출하여 올바른 정답임을 확인해주는 스크린 이미지를 숙제 제출 리포트 (.ipynb)내에 내장시켜 제출하시오. \n", " - 참고 사이트\n", From 74ee5e954f8ff5c6ba1a7079f159852f75326cc0 Mon Sep 17 00:00:00 2001 From: dohyung Date: Mon, 18 Sep 2017 15:12:19 +0900 Subject: [PATCH 044/124] =?UTF-8?q?assignment=202=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AF91CA27-0B5B-44CE-9018-3D0E8D2DE51F.png | Bin 0 -> 103123 bytes python3.6/assignment-1.ipynb | 40 ++++++++++++------ 2 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 images/AF91CA27-0B5B-44CE-9018-3D0E8D2DE51F.png diff --git a/images/AF91CA27-0B5B-44CE-9018-3D0E8D2DE51F.png b/images/AF91CA27-0B5B-44CE-9018-3D0E8D2DE51F.png new file mode 100644 index 0000000000000000000000000000000000000000..94fa3a8638cfa85bc72cedd4b942968157b54aa1 GIT binary patch literal 103123 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%0Asx{7IFWA(7CRkMcX%t*BbV_bsk9sGhvP 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코드를 숙제 제출 리포트 내에 포함시키고\n", + " - https://www.acmicpc.net 사이트에 본인이 작성한 코드를 직접 제출하여 올바른 정답임을 확인해주는 모습을 캡쳐하여 해당 캡쳐 파일도 숙제 제출 리포트(.ipynb파일)내에 내장시켜 제출하시오. 내장시키는 방법은 아래의 참고사이트를 참고하시오.\n", " - 참고 사이트\n", - " - https://stackoverflow.com/questions/10628262/inserting-image-into-ipython-notebook-markdown\n", - " - https://www.slideshare.net/dahlmoon/jupyter-notebok-20160815" + " - jupyter notebook에 image를 내장시키는 방법> https://stackoverflow.com/questions/10628262/inserting-image-into-ipython-notebook-markdown\n", + " - jupyter notebook 사용법> https://www.slideshare.net/dahlmoon/jupyter-notebok-20160815\n", + " \n", + " - 캡쳐 파일의 모습은 다음과 같아야 합니다.\n", + " ![image](../images/AF91CA27-0B5B-44CE-9018-3D0E8D2DE51F.png)" ] }, { @@ -99,28 +102,37 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [ACM-ICPC 문제 1074번] \n", - " - Z
\n", - " https://www.acmicpc.net/problem/1074" + "- [ACM-ICPC 문제 2439번] \n", + " - 별찍기-2
\n", + " https://www.acmicpc.net/problem/2439" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- [ACM-ICPC 문제 1135] \n", - " - 뉴스 전하기
\n", - "https://www.acmicpc.net/problem/1135" + "- [ACM-ICPC 문제 1924번] \n", + " - 2007년
\n", + "https://www.acmicpc.net/problem/1924" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- [ACM-ICPC 문제 1646번]\n", - " - 피이보나치 트리
\n", - " https://www.acmicpc.net/problem/1646" + "- [ACM-ICPC 문제 11720번]\n", + " - 숫자의 합
\n", + " https://www.acmicpc.net/problem/11720" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { @@ -140,7 +152,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.1" } }, "nbformat": 4, From 1b39e6efe50677b44ff00f926e0b5dca4a22f62d Mon Sep 17 00:00:00 2001 From: dohyung Date: Mon, 18 Sep 2017 15:20:48 +0900 Subject: [PATCH 045/124] =?UTF-8?q?assignment=201=20=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-1.ipynb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb index e0ed53a..f1ccbcb 100644 --- a/python3.6/assignment-1.ipynb +++ b/python3.6/assignment-1.ipynb @@ -11,12 +11,23 @@ "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 11개의 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", "#### 5) 참고: ACM-ICPC 3문제 정답 기재 방법\n", + " - https://www.acmicpc.net 사이트 회원가입\n", + " - 반드시 본인 학번으로 회원가입(기가입자도 재가입)\n", + " - 이메일은 학교 이메일을 기입\n", + " - 회원가입 완료 후, [설정]->[학교/회사 정보]에 들어간 후 [학교/회사 정보 추가]란에 학교 정보 추가 후, 학교 이메일 인증을 거친 다음, 다시 백준 사이트로 돌아와서 새로고침 한 후, [학교/회사 정보]에 뜬 자신의 이메일 정보를 확인\n", + " - 정보 수정 -> 상태 메시지 란에 “스크립트 프로그래밍 1분반”을 입력.(조교가 과제 채점 시 해당 사이트에서 직접 확인합니다.)\n", + "
\n", + "\n", " - ACM-ICPC 문제의 정답 코드를 숙제 제출 리포트 내에 포함시키고\n", " - https://www.acmicpc.net 사이트에 본인이 작성한 코드를 직접 제출하여 올바른 정답임을 확인해주는 모습을 캡쳐하여 해당 캡쳐 파일도 숙제 제출 리포트(.ipynb파일)내에 내장시켜 제출하시오. 내장시키는 방법은 아래의 참고사이트를 참고하시오.\n", - " - 참고 사이트\n", + "
\n", + "\n", + "- 참고 사이트\n", " - jupyter notebook에 image를 내장시키는 방법> https://stackoverflow.com/questions/10628262/inserting-image-into-ipython-notebook-markdown\n", " - jupyter notebook 사용법> https://www.slideshare.net/dahlmoon/jupyter-notebok-20160815\n", " \n", + "
\n", + "\n", " - 캡쳐 파일의 모습은 다음과 같아야 합니다.\n", " ![image](../images/AF91CA27-0B5B-44CE-9018-3D0E8D2DE51F.png)" ] From cab4bdc17d1b6c400115f764bbb9899087a49114 Mon Sep 17 00:00:00 2001 From: dohyung Date: Mon, 18 Sep 2017 15:21:31 +0900 Subject: [PATCH 046/124] =?UTF-8?q?assignment=201=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-1.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb index f1ccbcb..71f2a42 100644 --- a/python3.6/assignment-1.ipynb +++ b/python3.6/assignment-1.ipynb @@ -28,7 +28,7 @@ " \n", "
\n", "\n", - " - 캡쳐 파일의 모습은 다음과 같아야 합니다.\n", + " - 캡쳐 파일의 모습은 다음과 같아야 합니다. \n", " ![image](../images/AF91CA27-0B5B-44CE-9018-3D0E8D2DE51F.png)" ] }, From 28a014487e6e10d71b8ed960a487593283514795 Mon Sep 17 00:00:00 2001 From: dohyung Date: Mon, 18 Sep 2017 17:59:29 +0900 Subject: [PATCH 047/124] =?UTF-8?q?python04=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python04.ipynb | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/python3.6/python04.ipynb b/python3.6/python04.ipynb index 290bd40..5625e00 100644 --- a/python3.6/python04.ipynb +++ b/python3.6/python04.ipynb @@ -141,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -170,20 +170,20 @@ "# [0, 2, 4, 6, 8]\n", "# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n", "\n", - "list = []\n", + "val_list = []\n", "for item in L:\n", - " list.append(item)\n", - "print(list)\n", + " val_list.append(item)\n", + "print(val_list)\n", "\n", - "list = []\n", + "val_list = []\n", "for item in L[::2]:\n", - " list.append(item)\n", - "print(list)\n", + " val_list.append(item)\n", + "print(val_list)\n", "\n", - "list = []\n", + "val_list = []\n", "for item in L[::-1]:\n", - " list.append(item)\n", - "print(list)" + " val_list.append(item)\n", + "print(val_list)" ] }, { From 62b872538bf73fa2ce96562f9807dd8cd5561da0 Mon Sep 17 00:00:00 2001 From: dohyung Date: Mon, 18 Sep 2017 20:12:09 +0900 Subject: [PATCH 048/124] =?UTF-8?q?python=2004=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python04.ipynb | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/python3.6/python04.ipynb b/python3.6/python04.ipynb index 5625e00..0de2733 100644 --- a/python3.6/python04.ipynb +++ b/python3.6/python04.ipynb @@ -141,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -169,21 +169,9 @@ "# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", "# [0, 2, 4, 6, 8]\n", "# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n", - "\n", - "val_list = []\n", - "for item in L:\n", - " val_list.append(item)\n", - "print(val_list)\n", - "\n", - "val_list = []\n", - "for item in L[::2]:\n", - " val_list.append(item)\n", - "print(val_list)\n", - "\n", - "val_list = []\n", - "for item in L[::-1]:\n", - " val_list.append(item)\n", - "print(val_list)" + "print(list(L))\n", + "print(list(L)[::2])\n", + "print(list(L)[::-1])" ] }, { From a07ada408176c282e8e0aa70622d71d14bcf2877 Mon Sep 17 00:00:00 2001 From: dohyung Date: Fri, 22 Sep 2017 00:51:10 +0900 Subject: [PATCH 049/124] =?UTF-8?q?python3=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python05.ipynb | 1386 +++++++++++++------------- python06.ipynb | 2014 ++++++++++++++++++------------------- python07.ipynb | 122 +-- python08.ipynb | 102 +- python09.ipynb | 1566 ++++++++++++++--------------- python10.ipynb | 1270 ++++++++++++------------ python11.ipynb | 1858 +++++++++++++++++------------------ python12.ipynb | 1294 ++++++++++++------------ python13.ipynb | 1596 +++++++++++++++--------------- python3.6/python05.ipynb | 1408 +++++++++++++------------- python3.6/python06.ipynb | 2018 +++++++++++++++++++------------------- python3.6/python07.ipynb | 434 ++++---- python3.6/python08.ipynb | 316 +++--- python3.6/python09.ipynb | 1593 +++++++++++++++--------------- python3.6/python10.ipynb | 1329 +++++++++++++------------ python3.6/python11.ipynb | 1895 ++++++++++++++++++----------------- python3.6/python12.ipynb | 1329 ++++++++++++------------- python3.6/python13.ipynb | 1646 ++++++++++++++++--------------- 18 files changed, 11442 insertions(+), 11734 deletions(-) diff --git a/python05.ipynb b/python05.ipynb index 2d41fdc..b73afa7 100644 --- a/python05.ipynb +++ b/python05.ipynb @@ -1,734 +1,698 @@ { - "metadata": { - "name": "", - "signature": "sha256:7cd7f3f2924b132a4999a6a44ccc57b6b4603c593c705bafa1e22da085a44552" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 5. \ud30c\uc774\uc36c\uc758 \uac01\uc885 \uc5f0\uc0b0\uc790\n", - "***\n", - "***" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 5. 파이썬의 각종 연산자\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 산술 연산자\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 연산자 | 우선순위 | 설명 | 결합순서 |\n", + "|:------:|:------:|:-----------------:|:-----------:|\n", + "| +, - | 1 | 단항 연산자 | - | \n", + "| ** | 2 |지수 연산자 | 왼쪽 <- 오른쪽 | \n", + "| *,/,%,// | 3 |곱하기,나누기,나머지,몫 | 왼쪽 -> 오른쪽 | \n", + "| +, - | 4 |더하기,빼기 | 왼쪽 -> 오른쪽 |" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n", + "1\n", + "1\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \uc0b0\uc220 \uc5f0\uc0b0\uc790\n", - "***" + } + ], + "source": [ + "print 2 ** 3\n", + "print 5 % 2\n", + "print -5 % 2" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n", + "8.0\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "| \uc5f0\uc0b0\uc790 | \uc6b0\uc120\uc21c\uc704 | \uc124\uba85 | \uacb0\ud569\uc21c\uc11c |\n", - "|:------:|:------:|:-----------------:|:-----------:|\n", - "| +, - | 1 | \ub2e8\ud56d \uc5f0\uc0b0\uc790 | - | \n", - "| ** | 2 |\uc9c0\uc218 \uc5f0\uc0b0\uc790 | \uc67c\ucabd <- \uc624\ub978\ucabd | \n", - "| *,/,%,// | 3 |\uacf1\ud558\uae30,\ub098\ub204\uae30,\ub098\uba38\uc9c0,\ubaab | \uc67c\ucabd -> \uc624\ub978\ucabd | \n", - "| +, - | 4 |\ub354\ud558\uae30,\ube7c\uae30 | \uc67c\ucabd -> \uc624\ub978\ucabd |" + } + ], + "source": [ + "print 3 + 5\n", + "print 3 + 5.0 # 정수 + 실수의 결과는 실수" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.5\n", + "2\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 2 ** 3\n", - "print 5 % 2\n", - "print -5 % 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "8\n", - "1\n", - "1\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 3 + 5\n", - "print 3 + 5.0 # \uc815\uc218 + \uc2e4\uc218\uc758 \uacb0\uacfc\ub294 \uc2e4\uc218" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "8\n", - "8.0\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 5 / 2.0 # \uc815\uc218 / \uc2e4\uc218\uc758 \uacb0\uacfc\ub294 \uc2e4\uc218\n", - "print 5 / 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2.5\n", - "2\n" - ] - } - ], - "prompt_number": 64 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 5 / 3\n", - "b = 5 % 3\n", - "\n", - "print a, b\n", - "\n", - "print divmod(5,3)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 2\n", - "(1, 2)\n" - ] - } - ], - "prompt_number": 44 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 5 / 3\n", - "print 5 // 3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1\n", - "1\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub2e8\ud56d \uc5f0\uc0b0\uc790(-)\uc758 \uc6b0\uc120\uc21c\uc704\uac00 \uc774\ud56d \uc5f0\uc0b0\uc790(/)\uc758 \uc6b0\uc120\uc21c\uc704\ubcf4\ub2e4 \ub192\ub2e4" + } + ], + "source": [ + "print 5 / 2.0 # 정수 / 실수의 결과는 실수\n", + "print 5 / 2" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2\n", + "(1, 2)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print -7/4 # -7\uc744 4\ub85c \ub098\ub208\ub2e4\n", - "print -(7/4) " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "-2\n", - "-1\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 2 + 3 * 4\n", - "print (2 + 3) * 4" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "14\n", - "20\n" - ] - } - ], - "prompt_number": 51 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 4 / 2 * 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "4\n" - ] - } - ], - "prompt_number": 53 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- ** \uc5f0\uc0b0\uc790\uc758 \uacb0\ud569\uc21c\uc11c\ub294 \uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd" + } + ], + "source": [ + "a = 5 / 3\n", + "b = 5 % 3\n", + "\n", + "print a, b\n", + "\n", + "print divmod(5,3)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "1\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 2 ** 3 ** 2\n", - "print (2 ** 3) ** 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "512\n", - "64\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \uad00\uacc4 \uc5f0\uc0b0\uc790\n", - "***" + } + ], + "source": [ + "print 5 / 3\n", + "print 5 // 3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 단항 연산자(-)의 우선순위가 이항 연산자(/)의 우선순위보다 높다" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2\n", + "-1\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uad00\uacc4 \uc5f0\uc0b0\uc790: \uac1d\uccb4\uac00 \uc9c0\ub2cc \uac12\uc758 \ud06c\uae30(\ub300\uc18c)\ub97c \ube44\uad50\ud558\uc5ec True \ub610\ub294 False\ub97c \ubc18\ud658\ud568" + } + ], + "source": [ + "print -7/4 # -7을 4로 나눈다\n", + "print -(7/4) " + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14\n", + "20\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 6 == 9\n", - "print 6 != 9\n", - "print 1 > 3\n", - "print 4 <= 5\n", - "\n", - "a = 5\n", - "b = 10\n", - "print a < b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "True\n", - "False\n", - "True\n", - "True\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 5\n", - "b = 10\n", - "print 0 < a < b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 5\n", - "b = 10\n", - "print 0 < a and a < b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubb38\uc790\uc5f4, \ud29c\ud50c, \ub9ac\uc2a4\ud2b8\uc758 \uad00\uacc4 \uc5f0\uc0b0 \ube44\uad50\ub294 \uc77c\ubc18 \uc0ac\uc804 \uc21c\uc11c \n", - "- \uc0ac\uc804\uc5d0\uc11c \uc55e\uc5d0 \ub098\uc624\ub294 \uac12\uc774 \uc791\uc740 \uac12\uc73c\ub85c \ud3c9\uac00\ub428" + } + ], + "source": [ + "print 2 + 3 * 4\n", + "print (2 + 3) * 4" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 'abcd' > 'abd' \n", - "print (1, 2, 4) < (2, 1, 0) \n", - "print [1, 3, 2] == [1, 2, 3]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "True\n", - "False\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc11c\ub85c \ub2e4\ub978 \uc790\ub8cc\ud615\uac04\uc758 \ud06c\uae30 \uad00\uacc4\n", - " - \uc22b\uc790 < \uc0ac\uc804 < \ub9ac\uc2a4\ud2b8 < \ubb38\uc790\uc5f4 < \ud29c\ud50c" + } + ], + "source": [ + "print 4 / 2 * 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- ** 연산자의 결합순서는 오른쪽에서 왼쪽" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "512\n", + "64\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 9999999999999999999999L < 'abc'\n", - "print {3:2} < [1,2,3] < (1,2,3)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n" - ] - } - ], - "prompt_number": 64 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1,2,3, 'abc', 'a', 'z', (1,2,3), [1,2,3], {1:2}, ['abc']]\n", - "L.sort()\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2, 3, {1: 2}, [1, 2, 3], ['abc'], 'a', 'abc', 'z', (1, 2, 3)]\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = [1,2,3]\n", - "y = [1,2,3]\n", - "z = y\n", - "\n", - "print x == y\n", - "print x == z\n", - "print x is y\n", - "print x is z\n", - "print y is z" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n", - "False\n", - "False\n", - "True\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/objectIdentity.png)" + } + ], + "source": [ + "print 2 ** 3 ** 2\n", + "print (2 ** 3) ** 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 관계 연산자\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 관계 연산자: 객체가 지닌 값의 크기(대소)를 비교하여 True 또는 False를 반환함" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "False\n", + "True\n", + "True\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \ub17c\ub9ac \uc5f0\uc0b0\uc790 (or \ubd80\uc6b8 \uc5f0\uc0b0\uc790)\n", - "***" + } + ], + "source": [ + "print 6 == 9\n", + "print 6 != 9\n", + "print 1 > 3\n", + "print 4 <= 5\n", + "\n", + "a = 5\n", + "b = 10\n", + "print a < b" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud53c\uc5f0\uc0b0\uc790\uc758 \uac12\uc73c\ub85c \uc9c4\ub9ac\uac12\uc778 True \ub610\ub294 False\uc744 \ucde8\ud558\uc5ec \ub17c\ub9ac \uc801\uc778 \uacc4\uc0b0\uc744 \uc218\ud589\ud558\ub294 \uc5f0\uc0b0\uc790\n", - " - and\n", - " - or\n", - " - not\n", - "- [\uc8fc\uc758] \ub17c\ub9ac \uc5f0\uc0b0\uc790 \uc790\uccb4\uac00 \uac12\uc744 \ubc18\ud658\ud558\uc9c0\ub294 \uc54a\ub294\ub2e4. \n", - " - \ub17c\ub9ac \uc5f0\uc0b0\uc744 \ub530\ub77c \ucd5c\uc885\uc801\uc73c\ub85c \ud3c9\uac00(Evaluation)\ub418\uc5b4\uc9c4 \uac12\uc774 \ubc18\ud658\ub41c\ub2e4." + } + ], + "source": [ + "a = 5\n", + "b = 10\n", + "print 0 < a < b" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 20\n", - "b = 30\n", - "print a > 10 and b < 50" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc9c4\ub9ac\uac12\uc5d0 \ud574\ub2f9\ud558\ub294 True\uc640 False\ub294 \ub2e4\ub978 \uc0ac\uce59\uc5f0\uc0b0\uc790\ub97c \ub9cc\ub098\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ud3c9\uac00\ub428\n", - " - True: 1\n", - " - False: 0" + } + ], + "source": [ + "a = 5\n", + "b = 10\n", + "print 0 < a and a < b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열, 튜플, 리스트의 관계 연산 비교는 일반 사전 순서 \n", + "- 사전에서 앞에 나오는 값이 작은 값으로 평가됨" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "False\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print True + 1\n", - "print False + 1\n", - "print False * 75\n", - "print True * 75" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "1\n", - "0\n", - "75\n" - ] - } - ], - "prompt_number": 77 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- bool() \ub0b4\uc7a5 \ud568\uc218\ub97c \uc774\uc6a9\ud574\uc11c \uc218\uce58 \uac12\uc744 \uc9c4\ub9ac \uac12\uc73c\ub85c \uad50\ud658 \uac00\ub2a5" + } + ], + "source": [ + "print 'abcd' > 'abd' \n", + "print (1, 2, 4) < (2, 1, 0) \n", + "print [1, 3, 2] == [1, 2, 3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 서로 다른 자료형간의 크기 관계\n", + " - 숫자 < 사전 < 리스트 < 문자열 < 튜플" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print bool(0) # \uc815\uc218 0\uc740 \uac70\uc9d3\n", - "print bool(1)\n", - "print bool(100)\n", - "print bool(-100)\n", - "print\n", - "print bool(0.0) # \uc2e4\uc218 0.0\uc740 \uac70\uc9d3\n", - "print bool(0.1)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "True\n", - "True\n", - "True\n", - "\n", - "False\n", - "True\n" - ] - } - ], - "prompt_number": 82 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uac12\uc774 \uc5c6\ub294 \ube48 \uac1d\uccb4\ub098 None \uac1d\uccb4\ub294 False\ub85c \ud3c9\uac00\ub428" + } + ], + "source": [ + "print 9999999999999999999999L < 'abc'\n", + "print {3:2} < [1,2,3] < (1,2,3)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, {1: 2}, [1, 2, 3], ['abc'], 'a', 'abc', 'z', (1, 2, 3)]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print bool('abc')\n", - "print bool('')\n", - "print\n", - "print bool([]) # \uacf5 \ub9ac\uc2a4\ud2b8\ub294 \uac70\uc9d3\n", - "print bool([1,2,3])\n", - "print \n", - "print bool(()) # \uacf5 \ud29c\ud50c\uc740 \uac70\uc9d3\n", - "print bool((1,2,3))\n", - "print \n", - "print bool({}) # \uacf5 \uc0ac\uc804\uc740 \uac70\uc9d3\n", - "print bool({1:2})\n", - "print\n", - "print bool(None) # None \uac1d\uccb4\ub294 \uac70\uc9d3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "False\n", - "\n", - "False\n", - "True\n", - "\n", - "False\n", - "True\n", - "\n", - "False\n", - "True\n", - "\n", - "False\n" - ] - } - ], - "prompt_number": 81 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 1 and 1\n", - "print 1 and 0\n", - "print 0 or 0 \n", - "print 1 or 0\n", - "print \n", - "print [] or 1 # [] \uac70\uc9d3\n", - "print [] or () # [], () \uac70\uc9d3\n", - "print [] and 1 # [] \uac70\uc9d3\uc774\ubbc0\ub85c 1\uc740 \ucc38\uc870\ud560 \ud544\uc694 \uc5c6\uc74c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1\n", - "0\n", - "0\n", - "1\n", - "\n", - "1\n", - "()\n", - "[]\n" - ] - } - ], - "prompt_number": 85 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 1 and 2 \n", - "print 1 or 2\n", - "print \n", - "print [[]] or 1 # [[]] \ucc38\uc73c\ub85c \uac04\uc8fc\n", - "print [{}] or 1 # [{}] \ucc38\uc73c\ub85c \uac04\uc8fc\n", - "print '' or 1 # \ube48 \ubb38\uc790\uc5f4('')\uc740 \uac70\uc9d3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "1\n", - "\n", - "[[]]\n", - "[{}]\n", - "1\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print not(True)\n", - "print not(1 and 2)\n", - "print not('' or 1)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "False\n", - "False\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## [\ucc38\uace0] \uc5f0\uc0b0\uc790 \uc6b0\uc120 \uc21c\uc704 \ud45c\n", - "***" + } + ], + "source": [ + "L = [1,2,3, 'abc', 'a', 'z', (1,2,3), [1,2,3], {1:2}, ['abc']]\n", + "L.sort()\n", + "print L" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "False\n", + "False\n", + "True\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc5f0\uc0b0\uc790 \uc6b0\uc120 \uc21c\uc704 \ud45c: https://wikidocs.net/1165\n", - "- \uc2e4\uc81c \ucf54\ub4dc \uac1c\ubc1c\uc744 \ud560 \ub54c\uc5d0\ub294 \uc5f0\uc0b0\uc790 \uc6b0\uc120 \uc21c\uc704\uc5d0 \ub9ce\uc740 \uc758\uc874 \uc5c6\uc774 \uad04\ud638(())\ub97c \uc801\uc808\ud558\uac8c \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ub192\uc774\ub294 \uac83\uc774 \uc88b\ub2e4." + } + ], + "source": [ + "x = [1,2,3]\n", + "y = [1,2,3]\n", + "z = y\n", + "\n", + "print x == y\n", + "print x == z\n", + "print x is y\n", + "print x is z\n", + "print y is z" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/objectIdentity.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 논리 연산자 (or 부울 연산자)\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 피연산자의 값으로 진리값인 True 또는 False을 취하여 논리 적인 계산을 수행하는 연산자\n", + " - and\n", + " - or\n", + " - not\n", + "- [주의] 논리 연산자 자체가 값을 반환하지는 않는다. \n", + " - 논리 연산을 따라 최종적으로 평가(Evaluation)되어진 값이 반환된다." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "a = 20\n", + "b = 30\n", + "print a > 10 and b < 50" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 진리값에 해당하는 True와 False는 다른 사칙연산자를 만나면 다음과 같이 평가됨\n", + " - True: 1\n", + " - False: 0" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "1\n", + "0\n", + "75\n" + ] + } + ], + "source": [ + "print True + 1\n", + "print False + 1\n", + "print False * 75\n", + "print True * 75" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- bool() 내장 함수를 이용해서 수치 값을 진리 값으로 교환 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "True\n", + "True\n", + "\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "print bool(0) # 정수 0은 거짓\n", + "print bool(1)\n", + "print bool(100)\n", + "print bool(-100)\n", + "print\n", + "print bool(0.0) # 실수 0.0은 거짓\n", + "print bool(0.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 값이 없는 빈 객체나 None 객체는 False로 평가됨" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "\n", + "False\n", + "True\n", + "\n", + "False\n", + "True\n", + "\n", + "False\n", + "True\n", + "\n", + "False\n" + ] + } + ], + "source": [ + "print bool('abc')\n", + "print bool('')\n", + "print\n", + "print bool([]) # 공 리스트는 거짓\n", + "print bool([1,2,3])\n", + "print \n", + "print bool(()) # 공 튜플은 거짓\n", + "print bool((1,2,3))\n", + "print \n", + "print bool({}) # 공 사전은 거짓\n", + "print bool({1:2})\n", + "print\n", + "print bool(None) # None 객체는 거짓" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "0\n", + "0\n", + "1\n", + "\n", + "1\n", + "()\n", + "[]\n" + ] + } + ], + "source": [ + "print 1 and 1\n", + "print 1 and 0\n", + "print 0 or 0 \n", + "print 1 or 0\n", + "print \n", + "print [] or 1 # [] 거짓\n", + "print [] or () # [], () 거짓\n", + "print [] and 1 # [] 거짓이므로 1은 참조할 필요 없음" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "1\n", + "\n", + "[[]]\n", + "[{}]\n", + "1\n" + ] + } + ], + "source": [ + "print 1 and 2 \n", + "print 1 or 2\n", + "print \n", + "print [[]] or 1 # [[]] 참으로 간주\n", + "print [{}] or 1 # [{}] 참으로 간주\n", + "print '' or 1 # 빈 문자열('')은 거짓" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "False\n", + "False\n" ] } ], - "metadata": {} + "source": [ + "print not(True)\n", + "print not(1 and 2)\n", + "print not('' or 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## [참고] 연산자 우선 순위 표\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 연산자 우선 순위 표: https://wikidocs.net/1165\n", + "- 실제 코드 개발을 할 때에는 연산자 우선 순위에 많은 의존 없이 괄호(())를 적절하게 사용하여 코드의 가독성을 높이는 것이 좋다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" } - ] -} \ No newline at end of file + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python06.ipynb b/python06.ipynb index 5b723b0..aa04cfa 100644 --- a/python06.ipynb +++ b/python06.ipynb @@ -1,1104 +1,1046 @@ { - "metadata": { - "name": "", - "signature": "sha256:6f27a552542890768672efb0fe113387ea0d8e173bd95364d1cec38a4bfa7a1c" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 6. 제어문과 함수 기초\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 파이썬 제어문\n", + "***" + ] + }, { - "cells": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 들여쓰기와 제어문" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파이썬은 들여쓰기를 강제하여 코드의 가독성을 높인다.\n", + "- 가장 바깥쪽의 코드는 반드시 1열에 시작한다.\n", + "- 블록 내부에 있는 statement들은 동일한 열에 위치해야 한다.\n", + "- 블록의 끝은 들여쓰기가 끝나는 부분으로 간주된다.\n", + " - python에는 {, }, begin, end 등의 키워드가 존재하지 않는다.\n", + "- 들여쓰기를 할 때에는 탭과 공백을 섞어 쓰지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 6. \uc81c\uc5b4\ubb38\uacfc \ud568\uc218 \uae30\ucd08\n", - "***\n", - "***" + "ename": "IndentationError", + "evalue": "unexpected indent (, line 2)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m a = 1 # 실패\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" ] - }, + } + ], + "source": [ + "a = 1 # 성공\n", + " a = 1 # 실패" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud30c\uc774\uc36c \uc81c\uc5b4\ubb38\n", - "***" + "ename": "IndentationError", + "evalue": "unexpected indent (, line 3)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m3\u001b[0m\n\u001b[0;31m print 'really?'\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" ] - }, + } + ], + "source": [ + "if a > 1:\n", + " print 'big'\n", + " print 'really?'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 if문\n", + "- if문의 형식\n", + "\n", + "> if 조건식1:\n", + "\n", + ">   statements\n", + "\n", + "> elif 조건식2:\n", + "\n", + ">   statements\n", + "\n", + "> elif 조건식3:\n", + "\n", + ">   statements\n", + "\n", + "> else:\n", + "\n", + ">   statements\n", + "\n", + "- 조건식이나 else 다음에 콜론(:) 표기 필요\n", + "- 들여쓰기(indentation)를 잘 지켜야 함" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ub4e4\uc5ec\uc4f0\uae30\uc640 \uc81c\uc5b4\ubb38" + "name": "stdout", + "output_type": "stream", + "text": [ + "Congratulations!!! \n" ] - }, + } + ], + "source": [ + "score = 90\n", + "if score >= 90:\n", + " print 'Congratulations!!! '" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc774\uc36c\uc740 \ub4e4\uc5ec\uc4f0\uae30\ub97c \uac15\uc81c\ud558\uc5ec \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ub192\uc778\ub2e4.\n", - "- \uac00\uc7a5 \ubc14\uae65\ucabd\uc758 \ucf54\ub4dc\ub294 \ubc18\ub4dc\uc2dc 1\uc5f4\uc5d0 \uc2dc\uc791\ud55c\ub2e4.\n", - "- \ube14\ub85d \ub0b4\ubd80\uc5d0 \uc788\ub294 statement\ub4e4\uc740 \ub3d9\uc77c\ud55c \uc5f4\uc5d0 \uc704\uce58\ud574\uc57c \ud55c\ub2e4.\n", - "- \ube14\ub85d\uc758 \ub05d\uc740 \ub4e4\uc5ec\uc4f0\uae30\uac00 \ub05d\ub098\ub294 \ubd80\ubd84\uc73c\ub85c \uac04\uc8fc\ub41c\ub2e4.\n", - " - python\uc5d0\ub294 {, }, begin, end \ub4f1\uc758 \ud0a4\uc6cc\ub4dc\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4.\n", - "- \ub4e4\uc5ec\uc4f0\uae30\ub97c \ud560 \ub54c\uc5d0\ub294 \ud0ed\uacfc \uacf5\ubc31\uc744 \uc11e\uc5b4 \uc4f0\uc9c0 \uc54a\ub294\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "Big\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 1 # \uc131\uacf5\n", - " a = 1 # \uc2e4\ud328" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "IndentationError", - "evalue": "unexpected indent (, line 2)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m a = 1 # \uc2e4\ud328\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" - ] - } - ], - "prompt_number": 160 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "if a > 1:\n", - " print 'big'\n", - " print 'really?'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "IndentationError", - "evalue": "unexpected indent (, line 3)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m3\u001b[0m\n\u001b[0;31m print 'really?'\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" - ] - } - ], - "prompt_number": 161 - }, + } + ], + "source": [ + "a = 10\n", + "if a > 5:\n", + " print 'Big'\n", + "else:\n", + " print 'Small'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- statement가 1개인 경우 조건식과 한 줄에 위치 가능 (추천하지는 않음)" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 if\ubb38\n", - "- if\ubb38\uc758 \ud615\uc2dd\n", - "\n", - "> if \uc870\uac74\uc2dd1:\n", - "\n", - ">   statements\n", - "\n", - "> elif \uc870\uac74\uc2dd2:\n", - "\n", - ">   statements\n", - "\n", - "> elif \uc870\uac74\uc2dd3:\n", - "\n", - ">   statements\n", - "\n", - "> else:\n", - "\n", - ">   statements\n", - "\n", - "- \uc870\uac74\uc2dd\uc774\ub098 else \ub2e4\uc74c\uc5d0 \ucf5c\ub860(:) \ud45c\uae30 \ud544\uc694\n", - "- \ub4e4\uc5ec\uc4f0\uae30(indentation)\ub97c \uc798 \uc9c0\ucf1c\uc57c \ud568" + "name": "stdout", + "output_type": "stream", + "text": [ + "Big\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "score = 90\n", - "if score >= 90:\n", - " print 'Congratulations!!! '" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Congratulations!!! \n" - ] - } - ], - "prompt_number": 153 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10\n", - "if a > 5:\n", - " print 'Big'\n", - "else:\n", - " print 'Small'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Big\n" - ] - } - ], - "prompt_number": 61 - }, + } + ], + "source": [ + "a = 10\n", + "if a > 5: print 'Big'\n", + "else: print 'Small'" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- statement\uac00 1\uac1c\uc778 \uacbd\uc6b0 \uc870\uac74\uc2dd\uacfc \ud55c \uc904\uc5d0 \uc704\uce58 \uac00\ub2a5 (\ucd94\ucc9c\ud558\uc9c0\ub294 \uc54a\uc74c)" + "name": "stdout", + "output_type": "stream", + "text": [ + "Negative\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10\n", - "if a > 5: print 'Big'\n", - "else: print 'Small'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Big\n" - ] - } - ], - "prompt_number": 155 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "n = -2\n", - "if n > 0:\n", - " print 'Positive'\n", - "elif n < 0:\n", - " print 'Negative'\n", - "else:\n", - " print 'Zero'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Negative\n" - ] - } - ], - "prompt_number": 156 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "order = 'spagetti'\n", - "\n", - "if order == 'spam':\n", - " price = 500\n", - "elif order == 'ham':\n", - " price = 700\n", - "elif order == 'egg':\n", - " price = 300\n", - "elif order == 'spagetti':\n", - " price = 900\n", - " \n", - "print price" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "900\n" - ] - } - ], - "prompt_number": 65 - }, + } + ], + "source": [ + "n = -2\n", + "if n > 0:\n", + " print 'Positive'\n", + "elif n < 0:\n", + " print 'Negative'\n", + "else:\n", + " print 'Zero'" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc704 \ucf54\ub4dc\uc640 \ub3d9\uc77c\ud55c dictionary \uc790\ub8cc\uad6c\uc870\ub97c \uc0ac\uc6a9\ud55c \ucf54\ub4dc" + "name": "stdout", + "output_type": "stream", + "text": [ + "900\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "order = 'spagetti'\n", - "menu = {'spam':500, 'ham':700, 'egg':300, 'spagetti':900}\n", - "price = menu[order]\n", - "print price" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "900\n" - ] - } - ], - "prompt_number": 66 - }, + } + ], + "source": [ + "order = 'spagetti'\n", + "\n", + "if order == 'spam':\n", + " price = 500\n", + "elif order == 'ham':\n", + " price = 700\n", + "elif order == 'egg':\n", + " price = 300\n", + "elif order == 'spagetti':\n", + " price = 900\n", + " \n", + "print price" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위 코드와 동일한 dictionary 자료구조를 사용한 코드" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 for\ubb38\n", - "\n", - "> for <\ud0c0\uac9f> in <\ucee8\ud14c\uc774\ub108 \uac1d\uccb4>:\n", - "\n", - ">   statements\n", - "\n", - "> else:\n", - "\n", - ">   statements" + "name": "stdout", + "output_type": "stream", + "text": [ + "900\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = ['cat', 'cow', 'tiger']\n", - "for x in a:\n", - " print len(x), x" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3 cat\n", - "3 cow\n", - "5 tiger\n" - ] - } - ], - "prompt_number": 168 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in [1,2,3]:\n", - " print x," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 2 3\n" - ] - } - ], - "prompt_number": 169 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print range(10)\n", - "\n", - "for x in range(10):\n", - " print x," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", - "0 1 2 3 4 5 6 7 8 9\n" - ] - } - ], - "prompt_number": 172 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "sum = 0\n", - "for x in range(1, 11):\n", - " sum = sum + x\n", - " \n", - "print sum" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "55\n" - ] - } - ], - "prompt_number": 174 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "prod = 1\n", - "for x in range(1, 11):\n", - " prod = prod * x\n", - " \n", - "print prod" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3628800\n" - ] - } - ], - "prompt_number": 1 - }, + } + ], + "source": [ + "order = 'spagetti'\n", + "menu = {'spam':500, 'ham':700, 'egg':300, 'spagetti':900}\n", + "price = menu[order]\n", + "print price" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 for문\n", + "\n", + "> for <타겟> in <컨테이너 객체>:\n", + "\n", + ">   statements\n", + "\n", + "> else:\n", + "\n", + ">   statements" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- enumerate() \ub0b4\uc7a5 \ud568\uc218: \ucee8\ud14c\uc774\ub108 \uac1d\uccb4\uac00 \uc9c0\ub2cc \uac01 \uc694\uc18c\uac12\ubfd0\ub9cc \uc544\ub2c8\ub77c \uc778\ub371\uc2a4 \uac12\ub3c4 \ud568\uaed8 \ubc18\ud658\ud55c\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "3 cat\n", + "3 cow\n", + "5 tiger\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l = ['cat', 'dog', 'bird', 'pig']\n", - "for k, animal in enumerate(l):\n", - " print k, animal" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 cat\n", - "1 dog\n", - "2 bird\n", - "3 pig\n" - ] - } - ], - "prompt_number": 67 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = ('cat', 'dog', 'bird', 'pig')\n", - "for k, animal in enumerate(t):\n", - " print k, animal" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 cat\n", - "1 dog\n", - "2 bird\n", - "3 pig\n" - ] - } - ], - "prompt_number": 68 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'c':'cat', 'd':'dog', 'b':'bird', 'p':'pig'}\n", - "for k, key in enumerate(d):\n", - " print k, key, d[key]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 p pig\n", - "1 c cat\n", - "2 b bird\n", - "3 d dog\n" - ] - } - ], - "prompt_number": 71 - }, + } + ], + "source": [ + "a = ['cat', 'cow', 'tiger']\n", + "for x in a:\n", + " print len(x), x" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- break: \ub8e8\ud504\ub97c \ube60\uc838\ub098\uac04\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in range(10):\n", - " if x > 3: \n", - " break\n", - " print x\n", - " \n", - "print 'done'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "done\n" - ] - } - ], - "prompt_number": 176 - }, + } + ], + "source": [ + "for x in [1,2,3]:\n", + " print x," + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- continue: \ub8e8\ud504 \ube14\ub85d \ub0b4\uc758 continue \uc774\ud6c4 \ubd80\ubd84\uc740 \uc218\ud589\ud558\uc9c0 \uc54a\uace0 \ub8e8\ud504\uc758 \uc2dc\uc791\ubd80\ubd84\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "0 1 2 3 4 5 6 7 8 9\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in range(10):\n", - " if x < 8:\n", - " continue\n", - " print x\n", - " \n", - "print 'done'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "8\n", - "9\n", - "done\n" - ] - } - ], - "prompt_number": 2 - }, + } + ], + "source": [ + "print range(10)\n", + "\n", + "for x in range(10):\n", + " print x," + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- else: \ub8e8\ud504\uac00 break\uc5d0 \uc758\ud55c \uc911\ub2e8 \uc5c6\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ubaa8\ub450 \uc218\ud589\ub418\uba74 else \ube14\ub85d\uc774 \uc218\ud589\ub41c\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "55\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in range(10):\n", - " print x, # \ucf64\ub9c8(,) \ub54c\ubb38\uc5d0 \uc904\uc774 \ubc14\ub00c\uc9c0 \uc54a\ub294\ub2e4.\n", - "else:\n", - " print 'else block'\n", - "\n", - "print 'done'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 1 2 3 4 5 6 7 8 9 else block\n", - "done\n" - ] - } - ], - "prompt_number": 73 - }, + } + ], + "source": [ + "sum = 0\n", + "for x in range(1, 11):\n", + " sum = sum + x\n", + " \n", + "print sum" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- break\uc5d0 \uc758\ud558\uc5ec \ub8e8\ud504\ub97c \ube60\uc838\ub098\uac00\uba74 else \ube14\ub85d\ub3c4 \uc218\ud589\ub418\uc9c0 \uc54a\ub294\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "3628800\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in range(10):\n", - " break\n", - " print x,\n", - "else:\n", - " print 'else block'\n", - " \n", - "print 'done'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "done\n" - ] - } - ], - "prompt_number": 179 - }, + } + ], + "source": [ + "prod = 1\n", + "for x in range(1, 11):\n", + " prod = prod * x\n", + " \n", + "print prod" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- enumerate() 내장 함수: 컨테이너 객체가 지닌 각 요소값뿐만 아니라 인덱스 값도 함께 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- for \ub8e8\ud504\uc758 \uc911\ucca9" + "name": "stdout", + "output_type": "stream", + "text": [ + "0 cat\n", + "1 dog\n", + "2 bird\n", + "3 pig\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in range(2, 4):\n", - " for y in range(2, 10):\n", - " print x, '*', y, '=', x*y\n", - " print" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2 * 2 = 4\n", - "2 * 3 = 6\n", - "2 * 4 = 8\n", - "2 * 5 = 10\n", - "2 * 6 = 12\n", - "2 * 7 = 14\n", - "2 * 8 = 16\n", - "2 * 9 = 18\n", - "\n", - "3 * 2 = 6\n", - "3 * 3 = 9\n", - "3 * 4 = 12\n", - "3 * 5 = 15\n", - "3 * 6 = 18\n", - "3 * 7 = 21\n", - "3 * 8 = 24\n", - "3 * 9 = 27\n", - "\n" - ] - } - ], - "prompt_number": 182 - }, + } + ], + "source": [ + "l = ['cat', 'dog', 'bird', 'pig']\n", + "for k, animal in enumerate(l):\n", + " print k, animal" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 while\ubb38" + "name": "stdout", + "output_type": "stream", + "text": [ + "0 cat\n", + "1 dog\n", + "2 bird\n", + "3 pig\n" ] - }, + } + ], + "source": [ + "t = ('cat', 'dog', 'bird', 'pig')\n", + "for k, animal in enumerate(t):\n", + " print k, animal" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- while \uc870\uac74\uc2dd\uc774 \ub9cc\uc871\ud558\ub294 \ub3d9\uc548 while \ube14\ub85d\ub0b4\uc758 statements \ub4e4\uc744 \ubc18\ubcf5 \uc218\ud589\ud55c\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "0 p pig\n", + "1 c cat\n", + "2 b bird\n", + "3 d dog\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "count = 1\n", - "while count < 11:\n", - " print count\n", - " count = count + 1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1\n", - "2\n", - "3\n", - "4\n", - "5\n", - "6\n", - "7\n", - "8\n", - "9\n", - "10\n" - ] - } - ], - "prompt_number": 183 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "sum = 0\n", - "a = 0\n", - "while a < 10:\n", - " a = a + 1\n", - " sum = sum + a\n", - "print sum" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "55\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = 0\n", - "while x < 10:\n", - " print x, # \ucf64\ub9c8(,) \ub54c\ubb38\uc5d0 \uc904\uc774 \ubc14\ub00c\uc9c0 \uc54a\ub294\ub2e4.\n", - " x = x + 1\n", - "else:\n", - " print 'else block'\n", - "\n", - "print 'done'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 1 2 3 4 5 6 7 8 9 else block\n", - "done\n" - ] - } - ], - "prompt_number": 6 - }, + } + ], + "source": [ + "d = {'c':'cat', 'd':'dog', 'b':'bird', 'p':'pig'}\n", + "for k, key in enumerate(d):\n", + " print k, key, d[key]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- break: 루프를 빠져나간다." + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ud30c\uc774\uc36c \ud568\uc218 \uae30\ucd08\n", - "***" + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "done\n" ] - }, + } + ], + "source": [ + "for x in range(10):\n", + " if x > 3: \n", + " break\n", + " print x\n", + " \n", + "print 'done'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- continue: 루프 블록 내의 continue 이후 부분은 수행하지 않고 루프의 시작부분으로 이동한다." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1. \ud568\uc218\uc758 \uc7a5\uc810 \ubc0f \ud568\uc218 \uc0ac\uc6a9\ubc95\n", - "- \ud568\uc218\uc758 \uc7a5\uc810\n", - " - \ud568\uc218\ub294 \ubc18\ubcf5\uc801\uc778 \ucf54\ub4dc\ub97c \uc5c6\uc5d0 \uc8fc\uc5b4 \ucf54\ub4dc\uc758 \uae38\uc774\ub97c \uc9e7\uac8c \ub9cc\ub4e4\uc5b4 \uc900\ub2e4.\n", - " - \ucf54\ub4dc\uc758 \uc720\uc9c0\ubcf4\uc218\ub97c \uc27d\uac8c \ub9cc\ub4e4\uc5b4 \uc900\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n", + "9\n", + "done\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a, b):\n", - " return a + b\n", - "\n", - "print add(3, 4)\n", - "\n", - "print add([1,2,3], [4,5,6])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "7\n", - "[1, 2, 3, 4, 5, 6]\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c = add(10, 30)\n", - "print c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "40\n" - ] - } - ], - "prompt_number": 5 - }, + } + ], + "source": [ + "for x in range(10):\n", + " if x < 8:\n", + " continue\n", + " print x\n", + " \n", + "print 'done'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- else: 루프가 break에 의한 중단 없이 정상적으로 모두 수행되면 else 블록이 수행된다." + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc774\ub984\uc5d0 \uc800\uc7a5\ub41c \ub808\ud37c\ub7f0\uc2a4\ub97c \ub2e4\ub978 \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud558\uc5ec \uadf8 \ubcc0\uc218\ub97c \uc774\uc6a9\ud55c \ud568\uc218 \ud638\ucd9c \uac00\ub2a5" + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 else block\n", + "done\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = add\n", - "print f(4, 5)\n", - "\n", - "print f\n", - "\n", - "print f is add" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9\n", - "\n", - "True\n" - ] - } - ], - "prompt_number": 6 - }, + } + ], + "source": [ + "for x in range(10):\n", + " print x, # 콤마(,) 때문에 줄이 바뀌지 않는다.\n", + "else:\n", + " print 'else block'\n", + "\n", + "print 'done'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- break에 의하여 루프를 빠져나가면 else 블록도 수행되지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 179, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218\uc758 \ubab8\uccb4\uc5d0\ub294 \ucd5c\uc18c\ud55c \ud55c\uac1c \uc774\uc0c1\uc758 statement\uac00 \uc874\uc7ac\ud574\uc57c \ud568\n", - " - \uadf8\ub7ec\ubbc0\ub85c, \uc544\ubb34\ub7f0 \ub0b4\uc6a9\uc774 \uc5c6\ub294 \ubab8\uccb4\ub97c \uc9c0\ub2cc \ud568\uc218\ub97c \ub9cc\ub4e4 \ub54c\uc5d0\ub294 pass \ub77c\ub294 \ud0a4\uc6cc\ub4dc\ub97c \ubab8\uccb4\uc5d0 \uc801\uc5b4\uc8fc\uc5b4\uc57c \ud568" + "name": "stdout", + "output_type": "stream", + "text": [ + "done\n" ] - }, + } + ], + "source": [ + "for x in range(10):\n", + " break\n", + " print x,\n", + "else:\n", + " print 'else block'\n", + " \n", + "print 'done'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- for 루프의 중첩" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def simple():\n", - " pass\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "2 * 2 = 4\n", + "2 * 3 = 6\n", + "2 * 4 = 8\n", + "2 * 5 = 10\n", + "2 * 6 = 12\n", + "2 * 7 = 14\n", + "2 * 8 = 16\n", + "2 * 9 = 18\n", "\n", - "print simple()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "None\n" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218\uc5d0\uc11c \ub2e4\ub978 \ud568\uc218 \ud638\ucd9c \uac00\ub2a5" + "3 * 2 = 6\n", + "3 * 3 = 9\n", + "3 * 4 = 12\n", + "3 * 5 = 15\n", + "3 * 6 = 18\n", + "3 * 7 = 21\n", + "3 * 8 = 24\n", + "3 * 9 = 27\n", + "\n" ] - }, + } + ], + "source": [ + "for x in range(2, 4):\n", + " for y in range(2, 10):\n", + " print x, '*', y, '=', x*y\n", + " print" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 while문" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- while 조건식이 만족하는 동안 while 블록내의 statements 들을 반복 수행한다." + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a, b):\n", - " return a + b\n", - "\n", - "def myabs(x):\n", - " if x < 0: \n", - " x = -x\n", - " return x\n", - "\n", - "def addabs(a, b):\n", - " c = add(a, b)\n", - " return myabs(c)\n", - "\n", - "print addabs(-5, -7)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "12\n" - ] - } - ], - "prompt_number": 2 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "10\n" + ] + } + ], + "source": [ + "count = 1\n", + "while count < 11:\n", + " print count\n", + " count = count + 1" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc778\uc790\uc758 \uc774\ub984\uacfc \ud568\uaed8 \uc778\uc790 \uac12\uc744 \ub118\uaca8\uc904 \uc218 \uc788\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "55\n" ] - }, + } + ], + "source": [ + "sum = 0\n", + "a = 0\n", + "while a < 10:\n", + " a = a + 1\n", + " sum = sum + a\n", + "print sum" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def minus(a, b):\n", - " return a - b\n", - "print minus(a=12, b=20)\n", - "print minus(b=20, a=12)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "-8\n", - "-8\n" - ] - } - ], - "prompt_number": 7 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 else block\n", + "done\n" + ] + } + ], + "source": [ + "x = 0\n", + "while x < 10:\n", + " print x, # 콤마(,) 때문에 줄이 바뀌지 않는다.\n", + " x = x + 1\n", + "else:\n", + " print 'else block'\n", + "\n", + "print 'done'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 파이썬 함수 기초\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1. 함수의 장점 및 함수 사용법\n", + "- 함수의 장점\n", + " - 함수는 반복적인 코드를 없에 주어 코드의 길이를 짧게 만들어 준다.\n", + " - 코드의 유지보수를 쉽게 만들어 준다." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc778\uc790\uc758 \ub514\ud3f4\ud2b8 \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "7\n", + "[1, 2, 3, 4, 5, 6]\n" ] - }, + } + ], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "print add(3, 4)\n", + "\n", + "print add([1,2,3], [4,5,6])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def incr(x, y=1):\n", - " return x + y\n", - "\n", - "print incr(5)\n", - "\n", - "print incr(5, 10)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "6\n", - "15\n" - ] - } - ], - "prompt_number": 9 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "40\n" + ] + } + ], + "source": [ + "c = add(10, 30)\n", + "print c" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 이름에 저장된 레퍼런스를 다른 변수에 할당하여 그 변수를 이용한 함수 호출 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub450 \uac1c \uc774\uc0c1\uc758 \uac12\uc744 \ub3d9\uc2dc\uc5d0 \ubc18\ud658\ud560 \uc218 \uc788\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n", + "\n", + "True\n" ] - }, + } + ], + "source": [ + "f = add\n", + "print f(4, 5)\n", + "\n", + "print f\n", + "\n", + "print f is add" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수의 몸체에는 최소한 한개 이상의 statement가 존재해야 함\n", + " - 그러므로, 아무런 내용이 없는 몸체를 지닌 함수를 만들 때에는 pass 라는 키워드를 몸체에 적어주어야 함" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def calc(x, y):\n", - " return x + y, x - y, x * y, x / y\n", - "\n", - "print calc(10, 2)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "(12, 8, 20, 5)\n" - ] - } - ], - "prompt_number": 1 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] + } + ], + "source": [ + "def simple():\n", + " pass\n", + "\n", + "print simple()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수에서 다른 함수 호출 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ud568\uc218 \ud638\ucd9c\uc2dc \ub3d9\uc801\uc778 \uc790\ub8cc\ud615 \uacb0\uc815" + "name": "stdout", + "output_type": "stream", + "text": [ + "12\n" ] - }, + } + ], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "def myabs(x):\n", + " if x < 0: \n", + " x = -x\n", + " return x\n", + "\n", + "def addabs(a, b):\n", + " c = add(a, b)\n", + " return myabs(c)\n", + "\n", + "print addabs(-5, -7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인자의 이름과 함께 인자 값을 넘겨줄 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc774\uc36c\uc5d0\uc11c\ub294 \ubaa8\ub4e0 \uac1d\uccb4\ub294 \ub3d9\uc801\uc73c\ub85c (\uc2e4\ud589\uc2dc\uac04\uc5d0) \uadf8 \ud0c0\uc785\uc774 \uacb0\uc815\ub41c\ub2e4.\n", - " - \ud568\uc218 \uc778\uc790\ub294 \ud568\uc218\uac00 \ud638\ucd9c\ub418\ub294 \uc21c\uac04 \ud574\ub2f9 \uc778\uc790\uc5d0 \uc804\ub2ec\ub418\ub294 \uac1d\uccb4\uc5d0 \ub530\ub77c \uadf8 \ud0c0\uc785\uc774 \uacb0\uc815\ub41c\ub2e4.\n", - " - \ud568\uc218 \ubab8\uccb4 \ub0b4\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \uc5ec\ub7ec \uac00\uc9c0 \uc5f0\uc0b0\uc790\ub4e4\uc740 \ud568\uc218 \ud638\ucd9c\uc2dc\uc5d0 \uacb0\uc815\ub41c \uac1d\uccb4 \ud0c0\uc785\uc5d0 \ub9de\uac8c \uc2e4\ud589\ub41c\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "-8\n", + "-8\n" ] - }, + } + ], + "source": [ + "def minus(a, b):\n", + " return a - b\n", + "print minus(a=12, b=20)\n", + "print minus(b=20, a=12)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인자의 디폴트 값을 지정할 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a, b):\n", - " return a + b\n", - "\n", - "c = add(1, 3.4)\n", - "d = add('dynamic', 'typing')\n", - "e = add(['list'], ['and', 'list'])\n", - "print c\n", - "print d\n", - "print e" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "4.4\n", - "dynamictyping\n", - "['list', 'and', 'list']\n" - ] - } - ], - "prompt_number": 3 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n", + "15\n" + ] + } + ], + "source": [ + "def incr(x, y=1):\n", + " return x + y\n", + "\n", + "print incr(5)\n", + "\n", + "print incr(5, 10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 두 개 이상의 값을 동시에 반환할 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \uc7ac\uadc0\uc801 \ud568\uc218 \ud638\ucd9c\n", - "- \uc7ac\uadc0(Recursive) \ud568\uc218: \ud568\uc218 \ubab8\uccb4\uc5d0\uc11c \uc790\uae30 \uc790\uc2e0\uc744 \ud638\ucd9c\ud558\ub294 \ud568\uc218\n", - " - \uc218\ud559\uc5d0\uc11c \uc810\ud654\uc2dd\uacfc \uc720\uc0ac\ud55c \ucf54\ub4dc\n", - " - \ubc18\ub4dc\uc2dc \uc885\uacb0 \uc870\uac74 \ubc0f \uc885\uacb0 \uc870\uac74\uc774 \ub9cc\uc871\ud560 \ub54c\uc758 \ubc18\ud658 \uac12\uc774 \uc788\uc5b4\uc57c \ud55c\ub2e4.\n", - "\n", - "- 1\ubd80\ud130 N\uae4c\uc9c0 \ub354\ud558\ub294 \uc7ac\uadc0 \ud568\uc218" + "name": "stdout", + "output_type": "stream", + "text": [ + "(12, 8, 20, 5)\n" ] - }, + } + ], + "source": [ + "def calc(x, y):\n", + " return x + y, x - y, x * y, x / y\n", + "\n", + "print calc(10, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 함수 호출시 동적인 자료형 결정" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파이썬에서는 모든 객체는 동적으로 (실행시간에) 그 타입이 결정된다.\n", + " - 함수 인자는 함수가 호출되는 순간 해당 인자에 전달되는 객체에 따라 그 타입이 결정된다.\n", + " - 함수 몸체 내에서 사용되는 여러 가지 연산자들은 함수 호출시에 결정된 객체 타입에 맞게 실행된다." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def sum(N):\n", - " if N == 1: # \uc885\uacb0 \uc870\uac74\n", - " return 1 # \uc885\uacb0 \uc870\uac74\uc774 \ub9cc\uc871\ud560 \ub54c\uc758 \ubc18\ud658 \uac12\n", - " return N + sum(N-1) # \uc7ac\uadc0 \ud638\ucd9c\n", - "\n", - "print sum(10)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "55\n" - ] - } - ], - "prompt_number": 4 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "4.4\n", + "dynamictyping\n", + "['list', 'and', 'list']\n" + ] + } + ], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "c = add(1, 3.4)\n", + "d = add('dynamic', 'typing')\n", + "e = add(['list'], ['and', 'list'])\n", + "print c\n", + "print d\n", + "print e" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 재귀적 함수 호출\n", + "- 재귀(Recursive) 함수: 함수 몸체에서 자기 자신을 호출하는 함수\n", + " - 수학에서 점화식과 유사한 코드\n", + " - 반드시 종결 조건 및 종결 조건이 만족할 때의 반환 값이 있어야 한다.\n", + "\n", + "- 1부터 N까지 더하는 재귀 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + "name": "stdout", + "output_type": "stream", + "text": [ + "55\n" ] } ], - "metadata": {} + "source": [ + "def sum(N):\n", + " if N == 1: # 종결 조건\n", + " return 1 # 종결 조건이 만족할 때의 반환 값\n", + " return N + sum(N-1) # 재귀 호출\n", + "\n", + "print sum(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python07.ipynb b/python07.ipynb index 91eb40f..6837269 100644 --- a/python07.ipynb +++ b/python07.ipynb @@ -32,9 +32,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "s = 'abcdef'\n", @@ -67,9 +65,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -99,9 +95,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "IndexError", @@ -129,9 +123,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -171,9 +163,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -200,9 +190,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -231,9 +219,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -262,9 +248,7 @@ { "cell_type": "code", "execution_count": 25, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -290,9 +274,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -322,9 +304,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -355,9 +335,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -391,9 +369,7 @@ { "cell_type": "code", "execution_count": 30, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "s = ''\n", @@ -405,9 +381,7 @@ { "cell_type": "code", "execution_count": 32, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -432,9 +406,7 @@ { "cell_type": "code", "execution_count": 33, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -461,9 +433,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -517,9 +487,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -553,9 +521,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -596,9 +562,7 @@ { "cell_type": "code", "execution_count": 47, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -618,9 +582,7 @@ { "cell_type": "code", "execution_count": 48, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -648,9 +610,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -684,9 +644,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -722,9 +680,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -741,9 +697,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -763,9 +717,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -786,9 +738,7 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -847,7 +797,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/python08.ipynb b/python08.ipynb index d5aa40c..4892887 100644 --- a/python08.ipynb +++ b/python08.ipynb @@ -23,9 +23,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -51,9 +49,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -87,9 +83,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -118,9 +112,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -154,9 +146,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -176,9 +166,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -198,9 +186,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -226,9 +212,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -269,9 +253,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -292,9 +274,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -319,9 +299,7 @@ { "cell_type": "code", "execution_count": 34, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -346,9 +324,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -370,9 +346,7 @@ { "cell_type": "code", "execution_count": 42, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -401,9 +375,7 @@ { "cell_type": "code", "execution_count": 45, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -456,9 +428,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -475,9 +445,7 @@ { "cell_type": "code", "execution_count": 27, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -576,9 +544,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -595,9 +561,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -614,9 +578,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -641,9 +603,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -669,7 +629,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/python09.ipynb b/python09.ipynb index 9a36ecc..40428f5 100644 --- a/python09.ipynb +++ b/python09.ipynb @@ -1,830 +1,790 @@ { - "metadata": { - "name": "", - "signature": "sha256:c1c3f4f13845f8b92c98b7fdc07017380320b4dfeb43cc5c398d9851cd7751ea" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 9. \ub9ac\uc2a4\ud2b8\uc758 \uae30\ucd08\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ub9ac\uc2a4\ud2b8 \uc0dd\uc131 \ubc0f \uae30\ubcf8 \uc5f0\uc0b0\n", - "***\n", - "- \ub9ac\uc2a4\ud2b8: \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774\uba74\uc11c \ubcc0\uacbd \uac00\ub2a5(Mutable)\n", - "- \ub9ac\uc2a4\ud2b8\uc5d0\uc11c \uc9c0\uc6d0\ud558\ub294 \uc77c\ubc18\uc801\uc778 \uc5f0\uc0b0\n", - " - \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc5f0\uacb0, \ubc18\ubcf5, \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l = []\n", - "l = [1, 2, \"Great\"]\n", - "print l[0], l[-1]\n", - "print l[1:3], l[:]\n", - "print\n", + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 9. 리스트의 기초\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 리스트 생성 및 기본 연산\n", + "***\n", + "- 리스트: 시퀀스 자료형이면서 변경 가능(Mutable)\n", + "- 리스트에서 지원하는 일반적인 연산\n", + " - 인덱싱, 슬라이싱, 연결, 반복, 멤버쉽 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 Great\n", + "[2, 'Great'] [1, 2, 'Great']\n", "\n", - "L = range(10)\n", - "print L[::2]\n", - "print\n", + "[0, 2, 4, 6, 8]\n", "\n", - "print l * 2\n", - "print l + [3, 4, 5]\n", - "print len(l)\n", - "print\n", - "print 4 in L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 Great\n", - "[2, 'Great'] [1, 2, 'Great']\n", - "\n", - "[0, 2, 4, 6, 8]\n", - "\n", - "[1, 2, 'Great', 1, 2, 'Great']\n", - "[1, 2, 'Great', 3, 4, 5]\n", - "3\n", - "\n", - "True\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- Mutable \ud2b9\uc131\uc744 \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8\uc758 \uac12 \ubcc0\uacbd" + "[1, 2, 'Great', 1, 2, 'Great']\n", + "[1, 2, 'Great', 3, 4, 5]\n", + "3\n", + "\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = ['spam', 'eggs', 100, 1234]\n", - "a[2] = a[2] + 23\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['spam', 'eggs', 123, 1234]\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658" + } + ], + "source": [ + "l = []\n", + "l = [1, 2, \"Great\"]\n", + "print l[0], l[-1]\n", + "print l[1:3], l[:]\n", + "print\n", + "\n", + "L = range(10)\n", + "print L[::2]\n", + "print\n", + "\n", + "print l * 2\n", + "print l + [3, 4, 5]\n", + "print len(l)\n", + "print\n", + "print 4 in L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Mutable 특성을 지닌 리스트의 값 변경" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['spam', 'eggs', 123, 1234]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = ['spam', 'eggs', 123, 1234]\n", - "a[0:2] = [1,12] # \ub3d9\uc77c\ud55c \ud06c\uae30\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658\n", - "print a\n", - "\n", - "a[0:2] = [1] # \uc11c\ub85c \ub2e4\ub978 \ud06c\uae30\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658\n", - "print a\n", - "\n", - "a[0:1] = [1, 2, 3] # \uc11c\ub85c \ub2e4\ub978 \ud06c\uae30\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 12, 123, 1234]\n", - "[1, 123, 1234]\n", - "[1, 2, 3, 123, 1234]\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uc0ad\uc81c" + } + ], + "source": [ + "a = ['spam', 'eggs', 100, 1234]\n", + "a[2] = a[2] + 23\n", + "print a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 원소에 대한 슬라이스 치환" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 12, 123, 1234]\n", + "[1, 123, 1234]\n", + "[1, 2, 3, 123, 1234]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = [1, 12, 123, 1234]\n", - "a[0:2] = []\n", - "\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[123, 1234]\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c \uc0ac\uc774\uc5d0 \uc2ac\ub77c\uc774\uc2a4 \uc0bd\uc785" + } + ], + "source": [ + "a = ['spam', 'eggs', 123, 1234]\n", + "a[0:2] = [1,12] # 동일한 크기에 대한 슬라이스 치환\n", + "print a\n", + "\n", + "a[0:2] = [1] # 서로 다른 크기에 대한 슬라이스 치환\n", + "print a\n", + "\n", + "a[0:1] = [1, 2, 3] # 서로 다른 크기에 대한 슬라이스 치환\n", + "print a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 원소에 대한 슬라이스 삭제" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[123, 1234]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = [123, 1234]\n", - "a[1:1] = ['spam', 'ham'] # 1\ubc88\uc9f8 \uc778\ub371\uc2a4\uc5d0 \uc0bd\uc785\n", - "print a\n", - "\n", - "b = [123, 1234] \n", - "b[1:2] = ['spam', 'ham'] # 1\ubc88\uc9f8 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uce58\ud658\n", - "print b\n", - "\n", - "a[:0] = a # \ub9ac\uc2a4\ud2b8 \ub9e8 \uc55e\uc5d0 \uc790\uae30 \uc790\uc2e0\uc744 \uc0bd\uc785\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[123, 'spam', 'ham', 1234]\n", - "[123, 'spam', 'ham']\n", - "[123, 'spam', 'ham', 1234, 123, 'spam', 'ham', 1234]\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- del\uc744 \uc774\uc6a9\ud55c \ub9ac\uc2a4\ud2b8 \uc694\uc18c \uc0ad\uc81c" + } + ], + "source": [ + "a = [1, 12, 123, 1234]\n", + "a[0:2] = []\n", + "\n", + "print a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 원소 사이에 슬라이스 삽입" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[123, 'spam', 'ham', 1234]\n", + "[123, 'spam', 'ham']\n", + "[123, 'spam', 'ham', 1234, 123, 'spam', 'ham', 1234]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = [1, 2, 3, 4]\n", - "del a[0]\n", - "print a\n", - "\n", - "del a[1:]\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[2, 3, 4]\n", - "[2]\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = range(4)\n", - "print a\n", - "print a[::2]\n", - "\n", - "del a[::2]\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 2, 3]\n", - "[0, 2]\n", - "[1, 3]\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc790\uccb4\uc5d0 \ub300\ud55c \uc0ad\uc81c\n", - " - \uc815\ud655\ud788\ub294 \ub9ac\uc2a4\ud2b8\ub97c \uac00\ub9ac\ud0a4\ub294 \ub808\ud37c\ub7f0\uc2a4\ub97c \uc9c0\ub2cc \ubcc0\uc218 a \uc0ad\uc81c" + } + ], + "source": [ + "a = [123, 1234]\n", + "a[1:1] = ['spam', 'ham'] # 1번째 인덱스에 삽입\n", + "print a\n", + "\n", + "b = [123, 1234] \n", + "b[1:2] = ['spam', 'ham'] # 1번째 원소에 대한 치환\n", + "print b\n", + "\n", + "a[:0] = a # 리스트 맨 앞에 자기 자신을 삽입\n", + "print a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- del을 이용한 리스트 요소 삭제" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 3, 4]\n", + "[2]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = range(5)\n", - "del a\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'a' is not defined", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'a' is not defined" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc911\ucca9 \ub9ac\uc2a4\ud2b8: \ub9ac\uc2a4\ud2b8 \uc548\uc5d0 \uc694\uc18c\ub85c\uc11c \ub9ac\uc2a4\ud2b8\ub97c \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8" + } + ], + "source": [ + "a = [1, 2, 3, 4]\n", + "del a[0]\n", + "print a\n", + "\n", + "del a[1:]\n", + "print a" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 2, 3]\n", + "[0, 2]\n", + "[1, 3]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [1, 2, 3]\n", - "t = ['begin', s, 'end']\n", - "print t\n", - "\n", - "print t[1][1]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['begin', [1, 2, 3], 'end']\n", - "2\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s[1] = 100\n", - "print t" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['begin', [1, 100, 3], 'end']\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, ['a', ['x', 'y'], 'b'], 3]\n", - "print L[0]\n", - "print L[1]\n", - "print L[1][1]\n", - "print L[1][1][1]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1\n", - "['a', ['x', 'y'], 'b']\n", - "['x', 'y']\n", - "y\n" - ] - } - ], - "prompt_number": 22 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- range: \uc21c\ucc28\uc801\uc778 \uc815\uc218 \ub9ac\uc2a4\ud2b8 \ub9cc\ub4e4\uae30" + } + ], + "source": [ + "a = range(4)\n", + "print a\n", + "print a[::2]\n", + "\n", + "del a[::2]\n", + "print a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 자체에 대한 삭제\n", + " - 정확히는 리스트를 가리키는 레퍼런스를 지닌 변수 a 삭제" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'a' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'a' is not defined" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print range(10) # 0(Included)\ubd80\ud130 10(Excluded)\uae4c\uc9c0\n", - "\n", - "print range(5, 15) # 5(Included)\ubd80\ud130 15(Excluded)\uae4c\uc9c0\n", - "\n", - "print range(5, 15, 2) # 0(Included)\ubd80\ud130 10(Excluded)\uae4c\uc9c0, Step: 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", - "[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]\n", - "[5, 7, 9, 11, 13]\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for el in range(10):\n", - " print el, 'inch=', el * 2.54, 'centi'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 inch= 0.0 centi\n", - "1 inch= 2.54 centi\n", - "2 inch= 5.08 centi\n", - "3 inch= 7.62 centi\n", - "4 inch= 10.16 centi\n", - "5 inch= 12.7 centi\n", - "6 inch= 15.24 centi\n", - "7 inch= 17.78 centi\n", - "8 inch= 20.32 centi\n", - "9 inch= 22.86 centi\n" - ] - } - ], - "prompt_number": 80 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "sun, mon, tue, wed, thu, fri, sat = range(7)\n", - "print sun, mon, tue, wed, thu, fri, sat" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 1 2 3 4 5 6\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc548\uc758 \uac01 \uc790\ub8cc\uac00 \ud29c\ud50c\uc77c \ub54c for \ubb38\uc744 \uc0ac\uc6a9\ud558\uc5ec \uac12 \ucd94\ucd9c \ubc29\ubc95" + } + ], + "source": [ + "a = range(5)\n", + "del a\n", + "print a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 중첩 리스트: 리스트 안에 요소로서 리스트를 지닌 리스트" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['begin', [1, 2, 3], 'end']\n", + "2\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "lt = [('one', 1), ('two', 2), ('three', 3)]\n", - "for t in lt:\n", - " print 'name =', t[0] ,', num =', t[1]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "name = one , num = 1\n", - "name = two , num = 2\n", - "name = three , num = 3\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc544\ub798 \ucf54\ub4dc\uac00 \ub354 \ud6a8\uc728\uc801" + } + ], + "source": [ + "s = [1, 2, 3]\n", + "t = ['begin', s, 'end']\n", + "print t\n", + "\n", + "print t[1][1]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['begin', [1, 100, 3], 'end']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "lt = [('one', 1), ('two', 2), ('three', 3)]\n", - "for t in lt:\n", - " print 'name = %s, num = %s' % t" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "name = one, num = 1\n", - "name = two, num = 2\n", - "name = three, num = 3\n" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- for \ubb38\uc758 \ud5e4\ub354\uc5d0\uc11c \uac01 \ud29c\ud50c\uc758 \uac12 \ucd94\ucd9c" + } + ], + "source": [ + "s[1] = 100\n", + "print t" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "['a', ['x', 'y'], 'b']\n", + "['x', 'y']\n", + "y\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "lt = [('one', 1), ('two', 2), ('three', 3)]\n", - "for name, num in lt:\n", - " print name, num" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "one 1\n", - "two 2\n", - "three 3\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc548\uc758 \uac01 \uc790\ub8cc\uac00 \ub9ac\uc2a4\ud2b8\uc5ec\ub3c4 for \ubb38\uc758 \ud5e4\ub354\uc5d0\uc11c \ub3d9\uc77c\ud558\uac8c \uac12 \ucd94\ucd9c \uac00\ub2a5" + } + ], + "source": [ + "L = [1, ['a', ['x', 'y'], 'b'], 3]\n", + "print L[0]\n", + "print L[1]\n", + "print L[1][1]\n", + "print L[1][1][1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- range: 순차적인 정수 리스트 만들기" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]\n", + "[5, 7, 9, 11, 13]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "LL = [['one', 1], ['two', 2], ['three', 3]]\n", - "for name, num in LL:\n", - " print name, num" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "one 1\n", - "two 2\n", - "three 3\n" - ] - } - ], - "prompt_number": 38 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub9ac\uc2a4\ud2b8 \uba54\uc18c\ub4dc\n", - "***" + } + ], + "source": [ + "print range(10) # 0(Included)부터 10(Excluded)까지\n", + "\n", + "print range(5, 15) # 5(Included)부터 15(Excluded)까지\n", + "\n", + "print range(5, 15, 2) # 0(Included)부터 10(Excluded)까지, Step: 2" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 inch= 0.0 centi\n", + "1 inch= 2.54 centi\n", + "2 inch= 5.08 centi\n", + "3 inch= 7.62 centi\n", + "4 inch= 10.16 centi\n", + "5 inch= 12.7 centi\n", + "6 inch= 15.24 centi\n", + "7 inch= 17.78 centi\n", + "8 inch= 20.32 centi\n", + "9 inch= 22.86 centi\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ub9ac\uc2a4\ud2b8\uac00 \uc9c0\uc6d0\ud558\ub294 \uba54\uc18c\ub4dc" + } + ], + "source": [ + "for el in range(10):\n", + " print el, 'inch=', el * 2.54, 'centi'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [1, 2, 3]\n", - "\n", - "s.append(5) # \ub9ac\uc2a4\ud2b8 \ub9e8 \ub9c8\uc9c0\ub9c9\uc5d0 \uc815\uc218 \uac12 5 \ucd94\uac00\n", - "print s\n", - "\n", - "s.insert(3, 4) # 3 \uc778\ub371\uc2a4 \uc704\uce58\uc5d0 \uc815\uc218 \uac12 4 \ucd94\uac00\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2, 3, 5]\n", - "[1, 2, 3, 4, 5]\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [1, 2, 3, 4, 5]\n", - "\n", - "print s.index(3) # \uac12 3\uc758 \uc778\ub371\uc2a4 \ubc18\ud658\n", - "\n", - "print s.count(2) # \uac12 2\uc758 \uac1c\uc218 \ubc18\ud658\n", - "\n", - "s = [1, 2, 2, 2, 2, 2, 3, 4, 5]\n", - "print s.count(2)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "1\n", - "5\n" - ] - } - ], - "prompt_number": 24 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- python\uc758 \uc18c\ud305 \uc54c\uace0\ub9ac\uc998: Timsort (\ubcc0\ud615\ub41c merge sort)\n", - " - \ucc38\uace0: http://orchistro.tistory.com/175" + } + ], + "source": [ + "sun, mon, tue, wed, thu, fri, sat = range(7)\n", + "print sun, mon, tue, wed, thu, fri, sat" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 안의 각 자료가 튜플일 때 for 문을 사용하여 값 추출 방법" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name = one , num = 1\n", + "name = two , num = 2\n", + "name = three , num = 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [1, 2, -10, -7, 100]\n", - "s.reverse() # \uc790\ub8cc\uc758 \uc21c\uc11c\ub97c \ub4a4\uc9d1\uae30 (\ubc18\ud658\uac12 \uc5c6\uc74c) \n", - "print s\n", - "\n", - "s.sort() # \uc815\ub82c (\ubc18\ud658\uac12 \uc5c6\uc74c)\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[100, -7, -10, 2, 1]\n", - "[-10, -7, 1, 2, 100]\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [10, 20, 30, 40, 50]\n", - "s.remove(10) # \uc790\ub8cc \uac12 10 \uc0ad\uc81c\n", - "print s\n", - "\n", - "s = [10, 20, 30, 20, 40, 50] # \uc790\ub8cc \uac12\uc774 \uc5ec\ub7ec\uac1c \uc874\uc7ac\ud558\uba74 \uccab\ubc88\uc9f8 \uac83\ub9cc \uc0ad\uc81c\n", - "s.remove(20)\n", - "print s\n", - "\n", - "s.extend([60, 70]) # \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8([60, 70]\ub97c \uae30\uc874 \ub9ac\uc2a4\ud2b8 s \ub4a4\uc5d0 \ubcd1\ud569\n", - "print s\n", - "\n", - "s.append([60, 70]) # \uc8fc\uc758: append\ub85c \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8\ub97c \ucd94\uac00\ud558\uba74 \ud558\ub098\uc758 \uc790\ub8cc \uc694\uc18c\ub85c\uc11c \ucd94\uac00\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[20, 30, 40, 50]\n", - "[10, 30, 20, 40, 50]\n", - "[10, 30, 20, 40, 50, 60, 70]\n", - "[10, 30, 20, 40, 50, 60, 70, [60, 70]]\n" - ] - } - ], - "prompt_number": 36 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ub9ac\uc2a4\ud2b8\ub97c \uc2a4\ud0dd(Stack)\uc73c\ub85c \uc0ac\uc6a9\ud558\uae30" + } + ], + "source": [ + "lt = [('one', 1), ('two', 2), ('three', 3)]\n", + "for t in lt:\n", + " print 'name =', t[0] ,', num =', t[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래 코드가 더 효율적" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name = one, num = 1\n", + "name = two, num = 2\n", + "name = three, num = 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [10, 20, 30, 40, 50]\n", - "s.append(60)\n", - "print s\n", - "\n", - "print s.pop()\n", - "\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[10, 20, 30, 40, 50, 60]\n", - "60\n", - "[10, 20, 30, 40, 50]\n" - ] - } - ], - "prompt_number": 37 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/stack.png)" + } + ], + "source": [ + "lt = [('one', 1), ('two', 2), ('three', 3)]\n", + "for t in lt:\n", + " print 'name = %s, num = %s' % t" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- for 문의 헤더에서 각 튜플의 값 추출" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "one 1\n", + "two 2\n", + "three 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [10, 20, 30, 40, 50]\n", - "print s.pop(0) #0 \ubc88\uc9f8 \uc778\ub371\uc2a4 \uac12\uc744 \uaebc\ub0b8\ub2e4.\n", - "\n", - "print s\n", - "\n", - "print s.pop(1) #1 \ubc88\uc9f8 \uc778\ub371\uc2a4 \uac12\uc744 \uaebc\ub0b8\ub2e4.\n", - "\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "10\n", - "[20, 30, 40, 50]\n", - "30\n", - "[20, 40, 50]\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \ub9ac\uc2a4\ud2b8\ub97c \ud050(Queue)\ub85c \uc0ac\uc6a9\ud558\uae30" + } + ], + "source": [ + "lt = [('one', 1), ('two', 2), ('three', 3)]\n", + "for name, num in lt:\n", + " print name, num" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 안의 각 자료가 리스트여도 for 문의 헤더에서 동일하게 값 추출 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "one 1\n", + "two 2\n", + "three 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "q = [10, 20, 30, 40, 50]\n", - "q.append(60)\n", - "print q.pop(0)\n", - "\n", - "print q" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "10\n", - "[20, 30, 40, 50, 60]\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/queue.png)" + } + ], + "source": [ + "LL = [['one', 1], ['two', 2], ['three', 3]]\n", + "for name, num in LL:\n", + " print name, num" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 리스트 메소드\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 리스트가 지원하는 메소드" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 5]\n", + "[1, 2, 3, 4, 5]\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "s = [1, 2, 3]\n", + "\n", + "s.append(5) # 리스트 맨 마지막에 정수 값 5 추가\n", + "print s\n", + "\n", + "s.insert(3, 4) # 3 인덱스 위치에 정수 값 4 추가\n", + "print s" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "1\n", + "5\n" + ] + } + ], + "source": [ + "s = [1, 2, 3, 4, 5]\n", + "\n", + "print s.index(3) # 값 3의 인덱스 반환\n", + "\n", + "print s.count(2) # 값 2의 개수 반환\n", + "\n", + "s = [1, 2, 2, 2, 2, 2, 3, 4, 5]\n", + "print s.count(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- python의 소팅 알고리즘: Timsort (변형된 merge sort)\n", + " - 참고: http://orchistro.tistory.com/175" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[100, -7, -10, 2, 1]\n", + "[-10, -7, 1, 2, 100]\n" + ] + } + ], + "source": [ + "s = [1, 2, -10, -7, 100]\n", + "s.reverse() # 자료의 순서를 뒤집기 (반환값 없음) \n", + "print s\n", + "\n", + "s.sort() # 정렬 (반환값 없음)\n", + "print s" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[20, 30, 40, 50]\n", + "[10, 30, 20, 40, 50]\n", + "[10, 30, 20, 40, 50, 60, 70]\n", + "[10, 30, 20, 40, 50, 60, 70, [60, 70]]\n" + ] + } + ], + "source": [ + "s = [10, 20, 30, 40, 50]\n", + "s.remove(10) # 자료 값 10 삭제\n", + "print s\n", + "\n", + "s = [10, 20, 30, 20, 40, 50] # 자료 값이 여러개 존재하면 첫번째 것만 삭제\n", + "s.remove(20)\n", + "print s\n", + "\n", + "s.extend([60, 70]) # 새로운 리스트([60, 70]를 기존 리스트 s 뒤에 병합\n", + "print s\n", + "\n", + "s.append([60, 70]) # 주의: append로 새로운 리스트를 추가하면 하나의 자료 요소로서 추가\n", + "print s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 리스트를 스택(Stack)으로 사용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[10, 20, 30, 40, 50, 60]\n", + "60\n", + "[10, 20, 30, 40, 50]\n" + ] + } + ], + "source": [ + "s = [10, 20, 30, 40, 50]\n", + "s.append(60)\n", + "print s\n", + "\n", + "print s.pop()\n", + "\n", + "print s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/stack.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "[20, 30, 40, 50]\n", + "30\n", + "[20, 40, 50]\n" + ] + } + ], + "source": [ + "s = [10, 20, 30, 40, 50]\n", + "print s.pop(0) #0 번째 인덱스 값을 꺼낸다.\n", + "\n", + "print s\n", + "\n", + "print s.pop(1) #1 번째 인덱스 값을 꺼낸다.\n", + "\n", + "print s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 리스트를 큐(Queue)로 사용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "[20, 30, 40, 50, 60]\n" ] } ], - "metadata": {} + "source": [ + "q = [10, 20, 30, 40, 50]\n", + "q.append(60)\n", + "print q.pop(0)\n", + "\n", + "print q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/queue.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python10.ipynb b/python10.ipynb index e1bf96f..38ffca2 100644 --- a/python10.ipynb +++ b/python10.ipynb @@ -1,675 +1,645 @@ { - "metadata": { - "name": "", - "signature": "sha256:751463e29cb1f77a958f648aa418de343a35c9ebe451d93376ba1eec3e5dda1c" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 10. \ub9ac\uc2a4\ud2b8\uc758 \ud65c\uc6a9\n", - "***\n", - "***" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 10. 리스트의 활용\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 리스트 정렬하기\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 리스트의 sort 메소드\n", + "- L.sort() 함수는 리스트 L 자체를 변경하며 리턴값을 반환하지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n", + "[1, 2, 3, 4, 5, 8, 9]\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ub9ac\uc2a4\ud2b8 \uc815\ub82c\ud558\uae30\n", - "***" + } + ], + "source": [ + "L = [1, 5, 3, 9, 8, 4, 2]\n", + "print L.sort()\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파이썬은 디폴트로 cmp(a, b) 내장 함수를 이용하여 정렬 방식을 결정한다.\n", + "- cmp(a, b)\n", + " - if a < b: return -1\n", + " - if a > b: return 1\n", + " - if a == b: return 0" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-1\n", + "1\n", + "0\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ub9ac\uc2a4\ud2b8\uc758 sort \uba54\uc18c\ub4dc\n", - "- L.sort() \ud568\uc218\ub294 \ub9ac\uc2a4\ud2b8 L \uc790\uccb4\ub97c \ubcc0\uacbd\ud558\uba70 \ub9ac\ud134\uac12\uc744 \ubc18\ud658\ud558\uc9c0 \uc54a\ub294\ub2e4." + } + ], + "source": [ + "print cmp(1,2)\n", + "\n", + "print cmp(5,2)\n", + "\n", + "print cmp('abc', 'abc')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 기본 정렬 방식을 변경하려면 cmp(a, b)와 같은 비교 함수를 직접 만들어서 sort() 함수의 인자로 넣는다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[6, 5, 4, 3, 2, 1]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 5, 3, 9, 8, 4, 2]\n", - "print L.sort()\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "None\n", - "[1, 2, 3, 4, 5, 8, 9]\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc774\uc36c\uc740 \ub514\ud3f4\ud2b8\ub85c cmp(a, b) \ub0b4\uc7a5 \ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \uc815\ub82c \ubc29\uc2dd\uc744 \uacb0\uc815\ud55c\ub2e4.\n", - "- cmp(a, b)\n", - " - if a < b: return -1\n", - " - if a > b: return 1\n", - " - if a == b: return 0" + } + ], + "source": [ + "def mycmp(a1, a2): # 대소관계에 따른 순서를 반대로 바꾸었음\n", + " return cmp(a2, a1)\n", + "\n", + "L = [1, 5, 3, 2, 4, 6]\n", + "L.sort(mycmp) # 역순으로 정렬\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 여러 튜플을 요소로 지닌 리스트인 경우, 튜플의 첫번째 값이 아닌 다른 위치에 있는 값을 기준으로 정렬 " + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sorted by name: [('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n", + "sorted by experience: [('kim', 3, 28), ('lee', 5, 38), ('jung', 10, 36)]\n", + "sorted by age: [('kim', 3, 28), ('jung', 10, 36), ('lee', 5, 38)]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print cmp(1,2)\n", - "\n", - "print cmp(5,2)\n", - "\n", - "print cmp('abc', 'abc')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "-1\n", - "1\n", - "0\n" - ] - } - ], - "prompt_number": 45 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uae30\ubcf8 \uc815\ub82c \ubc29\uc2dd\uc744 \ubcc0\uacbd\ud558\ub824\uba74 cmp(a, b)\uc640 \uac19\uc740 \ube44\uad50 \ud568\uc218\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\uc11c sort() \ud568\uc218\uc758 \uc778\uc790\ub85c \ub123\ub294\ub2e4." + } + ], + "source": [ + "def cmp_1(a1, a2):\n", + " return cmp(a1[1], a2[1])\n", + "\n", + "def cmp_2(a1, a2):\n", + " return cmp(a1[2], a2[2])\n", + "\n", + "L = [ ('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", + "L.sort()\n", + "print 'sorted by name:', L\n", + "\n", + "L.sort(cmp_1)\n", + "print 'sorted by experience:', L\n", + "\n", + "L.sort(cmp_2)\n", + "print 'sorted by age:', L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- sort() 함수 인자로 reverse 값을 받을 수 있다.\n", + " - 디폴트 reverse 인자값은 False\n", + " - reverse 인자값을 True로 주면 역순으로 정렬됨" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[9, 8, 6, 6, 3, 2, 1]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def mycmp(a1, a2): # \ub300\uc18c\uad00\uacc4\uc5d0 \ub530\ub978 \uc21c\uc11c\ub97c \ubc18\ub300\ub85c \ubc14\uafb8\uc5c8\uc74c\n", - " return cmp(a2, a1)\n", - "\n", - "L = [1, 5, 3, 2, 4, 6]\n", - "L.sort(mycmp) # \uc5ed\uc21c\uc73c\ub85c \uc815\ub82c\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[6, 5, 4, 3, 2, 1]\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc5ec\ub7ec \ud29c\ud50c\uc744 \uc694\uc18c\ub85c \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8\uc778 \uacbd\uc6b0, \ud29c\ud50c\uc758 \uccab\ubc88\uc9f8 \uac12\uc774 \uc544\ub2cc \ub2e4\ub978 \uc704\uce58\uc5d0 \uc788\ub294 \uac12\uc744 \uae30\uc900\uc73c\ub85c \uc815\ub82c " + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "L.sort(reverse = True)\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- sort() 함수 인자로 key에 함수를 넣어줄 수 있다.\n", + " - key 인자에 함수가 할당되어 있으면 각 리스트 원소에 대해 비교함수 호출 직전에 key 함수를 먼저 호출한다. " + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['123', '2345', '34', '56']\n", + "['34', '56', '123', '2345']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def cmp_1(a1, a2):\n", - " return cmp(a1[1], a2[1])\n", - "\n", - "def cmp_2(a1, a2):\n", - " return cmp(a1[2], a2[2])\n", - "\n", - "L = [ ('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", - "L.sort()\n", - "print 'sorted by name:', L\n", - "\n", - "L.sort(cmp_1)\n", - "print 'sorted by experience:', L\n", - "\n", - "L.sort(cmp_2)\n", - "print 'sorted by age:', L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "sorted by name: [('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n", - "sorted by experience: [('kim', 3, 28), ('lee', 5, 38), ('jung', 10, 36)]\n", - "sorted by age: [('kim', 3, 28), ('jung', 10, 36), ('lee', 5, 38)]\n" - ] - } - ], - "prompt_number": 49 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- sort() \ud568\uc218 \uc778\uc790\ub85c reverse \uac12\uc744 \ubc1b\uc744 \uc218 \uc788\ub2e4.\n", - " - \ub514\ud3f4\ud2b8 reverse \uc778\uc790\uac12\uc740 False\n", - " - reverse \uc778\uc790\uac12\uc744 True\ub85c \uc8fc\uba74 \uc5ed\uc21c\uc73c\ub85c \uc815\ub82c\ub428" + } + ], + "source": [ + "L = ['123', '34', '56', '2345']\n", + "L.sort()\n", + "print L\n", + "\n", + "L.sort(key=int)\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 sorted 내장 함수\n", + "- sorted() 내장함수는 L 자체에는 내용 변경 없이 정렬이 되어진 새로운 리스트를 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 6, 6, 8, 9]\n", + "[1, 6, 3, 8, 6, 2, 9]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "L.sort(reverse = True)\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[9, 8, 6, 6, 3, 2, 1]\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- sort() \ud568\uc218 \uc778\uc790\ub85c key\uc5d0 \ud568\uc218\ub97c \ub123\uc5b4\uc904 \uc218 \uc788\ub2e4.\n", - " - key \uc778\uc790\uc5d0 \ud568\uc218\uac00 \ud560\ub2f9\ub418\uc5b4 \uc788\uc73c\uba74 \uac01 \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c\uc5d0 \ub300\ud574 \ube44\uad50\ud568\uc218 \ud638\ucd9c \uc9c1\uc804\uc5d0 key \ud568\uc218\ub97c \uba3c\uc800 \ud638\ucd9c\ud55c\ub2e4. " + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "newList = sorted(L)\n", + "print newList\n", + "print L" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3 6 6 8 9\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = ['123', '34', '56', '2345']\n", - "L.sort()\n", - "print L\n", - "\n", - "L.sort(key=int)\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['123', '2345', '34', '56']\n", - "['34', '56', '123', '2345']\n" - ] - } - ], - "prompt_number": 51 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 sorted \ub0b4\uc7a5 \ud568\uc218\n", - "- sorted() \ub0b4\uc7a5\ud568\uc218\ub294 L \uc790\uccb4\uc5d0\ub294 \ub0b4\uc6a9 \ubcc0\uacbd \uc5c6\uc774 \uc815\ub82c\uc774 \ub418\uc5b4\uc9c4 \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "for ele in sorted(L):\n", + " print ele," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- sorted() 함수의 두번째 인자로 cmp 함수 지정 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[6, 5, 4, 3, 2, 1]\n", + "[1, 5, 3, 2, 4, 6]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "newList = sorted(L)\n", - "print newList\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2, 3, 6, 6, 8, 9]\n", - "[1, 6, 3, 8, 6, 2, 9]\n" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for ele in sorted(L):\n", - " print ele," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 2 3 6 6 8 9\n" - ] - } - ], - "prompt_number": 55 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- sorted() \ud568\uc218\uc758 \ub450\ubc88\uc9f8 \uc778\uc790\ub85c cmp \ud568\uc218 \uc9c0\uc815 \uac00\ub2a5" + } + ], + "source": [ + "def mycmp(a1, a2): # 대소관계에 따른 순서를 반대로 바꾸었음\n", + " return cmp(a2, a1)\n", + "\n", + "L = [1, 5, 3, 2, 4, 6]\n", + "print sorted(L, mycmp) # 역순으로 정렬\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인자로 reverse와 key 지정 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[9, 8, 6, 6, 3, 2, 1]\n", + "['34', '56', '123', '2345']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def mycmp(a1, a2): # \ub300\uc18c\uad00\uacc4\uc5d0 \ub530\ub978 \uc21c\uc11c\ub97c \ubc18\ub300\ub85c \ubc14\uafb8\uc5c8\uc74c\n", - " return cmp(a2, a1)\n", - "\n", - "L = [1, 5, 3, 2, 4, 6]\n", - "print sorted(L, mycmp) # \uc5ed\uc21c\uc73c\ub85c \uc815\ub82c\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[6, 5, 4, 3, 2, 1]\n", - "[1, 5, 3, 2, 4, 6]\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc778\uc790\ub85c reverse\uc640 key \uc9c0\uc815 \uac00\ub2a5" + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "print sorted(L, reverse=True)\n", + "\n", + "L = ['123', '34', '56', '2345']\n", + "print sorted(L, key=int)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 L.reverse() 와 reversed() 내장 함수\n", + "- L.reverse()도 반환값이 없다.\n", + " - 즉, L 자체를 역순으로 뒤집는다.\n", + " - [주의] 역순 정렬이 아니다." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n", + "[9, 2, 6, 8, 3, 6, 1]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "print sorted(L, reverse=True)\n", - "\n", - "L = ['123', '34', '56', '2345']\n", - "print sorted(L, key=int)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[9, 8, 6, 6, 3, 2, 1]\n", - "['34', '56', '123', '2345']\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 L.reverse() \uc640 reversed() \ub0b4\uc7a5 \ud568\uc218\n", - "- L.reverse()\ub3c4 \ubc18\ud658\uac12\uc774 \uc5c6\ub2e4.\n", - " - \uc989, L \uc790\uccb4\ub97c \uc5ed\uc21c\uc73c\ub85c \ub4a4\uc9d1\ub294\ub2e4.\n", - " - [\uc8fc\uc758] \uc5ed\uc21c \uc815\ub82c\uc774 \uc544\ub2c8\ub2e4." + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "print L.reverse()\n", + "print L" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11 4 8 10 5 8 3\n", + "[1, 6, 3, 8, 6, 2, 9]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "print L.reverse()\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "None\n", - "[9, 2, 6, 8, 3, 6, 1]\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "L.reverse() # \uc5ed\uc21c\uc73c\ub85c \ub4a4\uc9d1\ub294\ub2e4.\n", - "for ele in L:\n", - " print ele + 2,\n", - "\n", - "print\n", - "L.reverse() # \ub2e4\uc2dc \uc6d0\uc0c1\ud0dc\ub85c \ubcf5\uadc0\uc2dc\ud0a8\ub2e4.\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "11 4 8 10 5 8 3\n", - "[1, 6, 3, 8, 6, 2, 9]\n" - ] - } - ], - "prompt_number": 27 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- reversed() \ub0b4\uc7a5\ud568\uc218\ub294 sorted() \ucc98\ub7fc \ub0b4\uc6a9\uc774 \ub4a4\uc9d1\ud78c \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud55c\ub2e4.\n", - " - sorted() \ucc98\ub7fc \uc6d0\ub798 \ub9ac\uc2a4\ud2b8 \ub0b4\uc6a9\uc5d0\ub294 \ubcc0\ud568\uc5c6\ub2e4." + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "L.reverse() # 역순으로 뒤집는다.\n", + "for ele in L:\n", + " print ele + 2,\n", + "\n", + "print\n", + "L.reverse() # 다시 원상태로 복귀시킨다.\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- reversed() 내장함수는 sorted() 처럼 내용이 뒤집힌 리스트를 반환한다.\n", + " - sorted() 처럼 원래 리스트 내용에는 변함없다." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 6, 3, 8, 6, 2, 9]\n", + "11 4 8 10 5 8 3\n", + "[1, 6, 3, 8, 6, 2, 9]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "print L\n", - "for ele in reversed(L):\n", - " print ele + 2, \n", - "print\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 6, 3, 8, 6, 2, 9]\n", - "11 4 8 10 5 8 3\n", - "[1, 6, 3, 8, 6, 2, 9]\n" - ] - } - ], - "prompt_number": 31 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec(List Comprehension)\n", - "***\n", - "- \uc77c\ubc18\uc801\uc778 \ub9ac\uc2a4\ud2b8 \uc0dd\uc131\ubc95" + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "print L\n", + "for ele in reversed(L):\n", + " print ele + 2, \n", + "print\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 리스트 내포(List Comprehension)\n", + "***\n", + "- 일반적인 리스트 생성법" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = []\n", - "for k in range(10):\n", - " L.append(k*k)\n", - " \n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" - ] - } - ], - "prompt_number": 74 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc704 \ucf54\ub529\uc740 \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec \ub9ac\ud130\ub7f4 \ubc29\uc2dd\uc744 \ud65c\uc6a9\ud574\uc11c \uc544\ub798\uc640 \uac19\uc774 \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4." + } + ], + "source": [ + "L = []\n", + "for k in range(10):\n", + " L.append(k*k)\n", + " \n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위 코딩은 리스트 내포 리터럴 방식을 활용해서 아래와 같이 변경할 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [k * k for k in range(10)]\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" - ] - } - ], - "prompt_number": 32 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec \ub9ac\ud130\ub7f4\n", - "
\n",
-      "[expression for expr1 in sequence1\n",
-      "              for expr2 in sequence2 \n",
-      "              ...\n",
-      "              for exprN in sequenceN\n",
-      "              if condition]\n",
-      "
\n", - "- expression\uc758 \ud3c9\uac00 \uacb0\uacfc \ubc18\ub4dc\uc2dc \ud55c \uac1c\uc758 \uc6d0\uc18c\uac00 \ub098\uc640\uc57c \ud55c\ub2e4.\n", - " - \ud2c0\ub9b0 \uc608: [ x, y for x in seq1 for u in seq2 ]\n", - "- \ub9cc\uc57d \ub450 \uac1c\uc758 \uc774\uc0c1\uc758 \ud3c9\uac00 \uacb0\uacfc\uac00 \ub098\uc624\uba74 \ud29c\ud50c \ub4f1\uc73c\ub85c \uac10\uc2f8 \uc8fc\uc5b4\uc57c \ud55c\ub2e4.\n", - " - \uc62c\ubc14\ub978 \uc608: [ (x, y) for x in seq1 for u in seq2 ]\n", - "- \uc704 \ub9ac\ud130\ub7f4\uc740 \ub2e4\uc74c\uc758 \uc77c\ubc18\uc801\uc778 for \ubb38\uc758 \ub9ac\ud138\ub7ec\uacfc \ub3d9\uc77c\n", - "
\n",
-      "l = []\n",
-      "for expr1 in sequence1:\n",
-      "  for expr2 in sequence2:\n",
-      "      ...\n",
-      "         for exprtN in sequenceN:\n",
-      "            if condition:\n",
-      "               l.append(expression)\n",
-      "
\n", - " " + } + ], + "source": [ + "L = [k * k for k in range(10)]\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 내포 리터럴\n", + "
\n",
+    "[expression for expr1 in sequence1\n",
+    "              for expr2 in sequence2 \n",
+    "              ...\n",
+    "              for exprN in sequenceN\n",
+    "              if condition]\n",
+    "
\n", + "- expression의 평가 결과 반드시 한 개의 원소가 나와야 한다.\n", + " - 틀린 예: [ x, y for x in seq1 for u in seq2 ]\n", + "- 만약 두 개의 이상의 평가 결과가 나오면 튜플 등으로 감싸 주어야 한다.\n", + " - 올바른 예: [ (x, y) for x in seq1 for u in seq2 ]\n", + "- 위 리터럴은 다음의 일반적인 for 문의 리털러과 동일\n", + "
\n",
+    "l = []\n",
+    "for expr1 in sequence1:\n",
+    "  for expr2 in sequence2:\n",
+    "      ...\n",
+    "         for exprtN in sequenceN:\n",
+    "            if condition:\n",
+    "               l.append(expression)\n",
+    "
\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 9, 25, 49, 81]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [k * k for k in range(10) if k % 2] # \ud640\uc218\uc758 \uc81c\uacf1\ub9cc \ub9ac\uc2a4\ud2b8\ub85c \ud615\uc131\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 9, 25, 49, 81]\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc704\uc758 \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec \ucf54\ub4dc\ub294 \uc544\ub798\uc640 \ub3d9\uc77c" + } + ], + "source": [ + "L = [k * k for k in range(10) if k % 2] # 홀수의 제곱만 리스트로 형성\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위의 리스트 내포 코드는 아래와 동일" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 9, 25, 49, 81]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = []\n", - "for k in range(10):\n", - " if k%2:\n", - " L.append(k*k)\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 9, 25, 49, 81]\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 20\ubcf4\ub2e4 \uc791\uc740 2\uc758 \ubc30\uc218\uc640 3\uc758 \ubc30\uc218\uc5d0 \ub300\ud574 \uadf8 \ub450 \uc218\uc758 \ud569\uc774 7\uc758 \ubc30\uc218\uc778 \uac83\ub4e4\uc5d0 \ub300\ud574 \uadf8 \ub450 \uc218\uc758 \uacf1\uc744 \ucd9c\ub825\ud558\ub294 \ucf54\ub4dc" + } + ], + "source": [ + "L = []\n", + "for k in range(10):\n", + " if k%2:\n", + " L.append(k*k)\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 20보다 작은 2의 배수와 3의 배수에 대해 그 두 수의 합이 7의 배수인 것들에 대해 그 두 수의 곱을 출력하는 코드" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(2, 12, 24), (4, 3, 12), (6, 15, 90), (8, 6, 48), (10, 18, 180), (12, 9, 108), (16, 12, 192), (18, 3, 54)]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [(i, j, i*j) for i in range(2, 20, 2) for j in range(3, 20, 3) if (i + j) % 7 == 0]\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[(2, 12, 24), (4, 3, 12), (6, 15, 90), (8, 6, 48), (10, 18, 180), (12, 9, 108), (16, 12, 192), (18, 3, 54)]\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub450 \uac1c\uc758 \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc5d0 \ub300\ud574 \uac01\uac01\uc758 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uc30d\uc744 \ud29c\ud50c \ud615\ud0dc\ub85c \ub9cc\ub4e4\uba74\uc11c \ub9ac\uc2a4\ud2b8\uc5d0 \uc800\uc7a5\ud558\ub294 \ucf54\ub4dc" + } + ], + "source": [ + "L = [(i, j, i*j) for i in range(2, 20, 2) for j in range(3, 20, 3) if (i + j) % 7 == 0]\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 두 개의 시퀀스 자료형에 대해 각각의 원소에 대한 쌍을 튜플 형태로 만들면서 리스트에 저장하는 코드" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "seq1 = 'abc'\n", - "seq2 = (1, 2, 3)\n", - "print [(x, y) for x in seq1 for y in seq2]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "words = 'The quick brown fox jumps over the lazy dog'.split()\n", - "stuff = [[w.upper(), w.lower(), len(w)] for w in words]\n", - "for i in stuff:\n", - " print i" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['THE', 'the', 3]\n", - "['QUICK', 'quick', 5]\n", - "['BROWN', 'brown', 5]\n", - "['FOX', 'fox', 3]\n", - "['JUMPS', 'jumps', 5]\n", - "['OVER', 'over', 4]\n", - "['THE', 'the', 3]\n", - "['LAZY', 'lazy', 4]\n", - "['DOG', 'dog', 3]\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "seq1 = 'abc'\n", + "seq2 = (1, 2, 3)\n", + "print [(x, y) for x in seq1 for y in seq2]" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['THE', 'the', 3]\n", + "['QUICK', 'quick', 5]\n", + "['BROWN', 'brown', 5]\n", + "['FOX', 'fox', 3]\n", + "['JUMPS', 'jumps', 5]\n", + "['OVER', 'over', 4]\n", + "['THE', 'the', 3]\n", + "['LAZY', 'lazy', 4]\n", + "['DOG', 'dog', 3]\n" ] } ], - "metadata": {} + "source": [ + "words = 'The quick brown fox jumps over the lazy dog'.split()\n", + "stuff = [[w.upper(), w.lower(), len(w)] for w in words]\n", + "for i in stuff:\n", + " print i" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python11.ipynb b/python11.ipynb index 4ca3fba..a186639 100644 --- a/python11.ipynb +++ b/python11.ipynb @@ -1,989 +1,941 @@ { - "metadata": { - "name": "", - "signature": "sha256:f605b6651a091856e85ef998f6e29cc76ddb9f4c91c5080420c4886641d801ea" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 11. \ud29c\ud50c\uacfc \uc9d1\ud569\n", - "***\n", - "***" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 11. 튜플과 집합\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 튜플 활용법\n", + "***\n", + "- 튜플(Tuples): 순서있는 임의의 객체 모음 (시퀀스형)\n", + "- 튜플은 변경 불가능(Immutable)\n", + "- 시퀀스형이 가지는 다음 연산 모두 지원\n", + " - 인덱싱, 슬라이싱, 연결, 반복, 멤버쉽 테스트" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 튜플 연산" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud29c\ud50c \ud65c\uc6a9\ubc95\n", - "***\n", - "- \ud29c\ud50c(Tuples): \uc21c\uc11c\uc788\ub294 \uc784\uc758\uc758 \uac1d\uccb4 \ubaa8\uc74c (\uc2dc\ud000\uc2a4\ud615)\n", - "- \ud29c\ud50c\uc740 \ubcc0\uacbd \ubd88\uac00\ub2a5(Immutable)\n", - "- \uc2dc\ud000\uc2a4\ud615\uc774 \uac00\uc9c0\ub294 \ub2e4\uc74c \uc5f0\uc0b0 \ubaa8\ub450 \uc9c0\uc6d0\n", - " - \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc5f0\uacb0, \ubc18\ubcf5, \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8" + } + ], + "source": [ + "t1 = () # 비어있는 튜플\n", + "t2 = (1,2,3) # 괄호 사용\n", + "\n", + "t3 = 1,2,3 # 괄호가 없어도 튜플이 됨\n", + "print type(t1), type(t2), type(t3)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ud29c\ud50c \uc5f0\uc0b0" + } + ], + "source": [ + "r1 = (1,) # 자료가 한 개일 때는 반드시 콤마가 있어야 한다.\n", + "r2 = 1, # 괄호는 없어도 콤마는 있어야 한다.\n", + "print type(r1)\n", + "print type(r2)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 2, 3, 1, 2, 3)\n", + "(1, 2, 3, 'PyKUG', 'users')\n", + "(1, 2, 3)\n", + "\n", + "1 (2, 3)\n", + "3\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t1 = () # \ube44\uc5b4\uc788\ub294 \ud29c\ud50c\n", - "t2 = (1,2,3) # \uad04\ud638 \uc0ac\uc6a9\n", - "\n", - "t3 = 1,2,3 # \uad04\ud638\uac00 \uc5c6\uc5b4\ub3c4 \ud29c\ud50c\uc774 \ub428\n", - "print type(t1), type(t2), type(t3)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " \n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "r1 = (1,) # \uc790\ub8cc\uac00 \ud55c \uac1c\uc77c \ub54c\ub294 \ubc18\ub4dc\uc2dc \ucf64\ub9c8\uac00 \uc788\uc5b4\uc57c \ud55c\ub2e4.\n", - "r2 = 1, # \uad04\ud638\ub294 \uc5c6\uc5b4\ub3c4 \ucf64\ub9c8\ub294 \uc788\uc5b4\uc57c \ud55c\ub2e4.\n", - "print type(r1)\n", - "print type(r2)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = (1, 2, 3)\n", - "print t * 2 # \ubc18\ubcf5\n", - "print t + ('PyKUG', 'users') # \uc5f0\uacb0\n", - "print t\n", - "print\n", - "\n", - "print t[0], t[1:3] # \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1\n", - "print len(t) # \uae38\uc774\n", - "print 1 in t # \uba64\ubc84\uc2ed \ud14c\uc2a4\ud2b8" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "(1, 2, 3, 1, 2, 3)\n", - "(1, 2, 3, 'PyKUG', 'users')\n", - "(1, 2, 3)\n", - "\n", - "1 (2, 3)\n", - "3\n", - "True\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t[0] = 100 # \ud29c\ud50c\uc740 \ubcc0\uacbd \ubd88\uac00\ub2a5, \uc5d0\ub7ec\ubc1c\uc0dd" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'tuple' object does not support item assignment", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m \u001b[0;31m# \ud29c\ud50c\uc740 \ubcc0\uacbd \ubd88\uac00\ub2a5, \uc5d0\ub7ec\ubc1c\uc0dd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = (12345, 54321, 'hello!') \n", - "u = t, (1, 2, 3, 4, 5) # \ud29c\ud50c \ub0b4\ubd80 \uc6d0\uc18c\ub85c \ub2e4\ub978 \ud29c\ud50c\uc744 \uac00\uc9c8 \uc218 \uc788\uc74c\n", - "print u\n", - "\n", - "t2 = [1, 2, 3] # \ud29c\ud50c \ub0b4\ubd80 \uc6d0\uc18c\ub85c \ub9ac\uc2a4\ud2b8 \uac00\uc9c8 \uc218 \uc788\uc74c \n", - "u2 = t2, (1, 2, 4)\n", - "print u2\n", - "\n", - "t3 = {1:\"abc\", 2:\"def\"} # \ud29c\ud50c \ub0b4\ubd80 \uc6d0\uc18c\ub85c \uc0ac\uc804 \uac00\uc9c8 \uc218 \uc788\uc74c \n", - "u3 = t3, (1, 2, 3)\n", - "print u3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))\n", - "([1, 2, 3], (1, 2, 4))\n", - "({1: 'abc', 2: 'def'}, (1, 2, 3))\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x, y, z = 1, 2, 3 # \ud29c\ud50c\uc744 \uc774\uc6a9\ud55c \ubcf5\uc218 \uac1c\uc758 \uc790\ub8cc \ud560\ub2f9\n", - "print type(x), type(y), type(z)\n", - "print x\n", - "print y\n", - "print z" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " \n", - "1\n", - "2\n", - "3\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = 1\n", - "y = 2\n", - "x, y = y, x # \ud29c\ud50c\uc744 \uc774\uc6a9\ud55c \ub450 \uc790\ub8cc\uc758 \uac12 \ubcc0\uacbd\n", - "print x, y" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2 1\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \ud328\ud0b9\uacfc \uc5b8\ud328\ud0b9" + } + ], + "source": [ + "t = (1, 2, 3)\n", + "print t * 2 # 반복\n", + "print t + ('PyKUG', 'users') # 연결\n", + "print t\n", + "print\n", + "\n", + "print t[0], t[1:3] # 인덱싱, 슬라이싱\n", + "print len(t) # 길이\n", + "print 1 in t # 멤버십 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'tuple' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m \u001b[0;31m# 튜플은 변경 불가능, 에러발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud328\ud0b9 (Packing): \ud558\ub098\uc758 \ud29c\ud50c \uc548\uc5d0 \uc5ec\ub7ec \uac1c\uc758 \ub370\uc774\ud130\ub97c \ub123\ub294 \uc791\uc5c5" + } + ], + "source": [ + "t[0] = 100 # 튜플은 변경 불가능, 에러발생" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))\n", + "([1, 2, 3], (1, 2, 4))\n", + "({1: 'abc', 2: 'def'}, (1, 2, 3))\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = 1, 2, 'hello'" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 7 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc5b8\ud328\ud0b9 (Unpacking): \ud558\ub098\uc758 \ud29c\ud50c\uc5d0\uc11c \uc5ec\ub7ec \uac1c\uc758 \ub370\uc774\ud130\ub97c \ud55c\uaebc\ubc88\uc5d0 \uaebc\ub0b4\uc640 \uac01\uac01 \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud558\ub294 \uc791\uc5c5" + } + ], + "source": [ + "t = (12345, 54321, 'hello!') \n", + "u = t, (1, 2, 3, 4, 5) # 튜플 내부 원소로 다른 튜플을 가질 수 있음\n", + "print u\n", + "\n", + "t2 = [1, 2, 3] # 튜플 내부 원소로 리스트 가질 수 있음 \n", + "u2 = t2, (1, 2, 4)\n", + "print u2\n", + "\n", + "t3 = {1:\"abc\", 2:\"def\"} # 튜플 내부 원소로 사전 가질 수 있음 \n", + "u3 = t3, (1, 2, 3)\n", + "print u3" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \n", + "1\n", + "2\n", + "3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x, y, z = t" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 19 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8\ub85c\ub3c4 \ube44\uc2b7\ud55c \uc791\uc5c5\uc774 \uac00\ub2a5\ud558\uc9c0\ub9cc, \ub2e8\uc21c \ud328\ud0b9/\uc5b8\ud328\ud0b9 \uc791\uc5c5\ub9cc\uc744 \ubaa9\uc801\uc73c\ub85c \ud55c\ub2e4\uba74 \ud29c\ud50c \uc0ac\uc6a9 \ucd94\ucc9c" + } + ], + "source": [ + "x, y, z = 1, 2, 3 # 튜플을 이용한 복수 개의 자료 할당\n", + "print type(x), type(y), type(z)\n", + "print x\n", + "print y\n", + "print z" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 1\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = ['foo', 'bar', 4, 5]\n", - "[x, y, z, w] = a" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 22 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud29c\ud50c\uacfc \ub9ac\uc2a4\ud2b8\uc640\uc758 \uacf5\ud1b5\uc810\n", - " - \uc6d0\uc18c\ub85c\uc11c \uc784\uc758\uc758 \uac1d\uccb4\ub97c \uc800\uc7a5\n", - " - \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\n", - " - \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc5f0\uacb0, \ubc18\ubcf5, \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8 \uc5f0\uc0b0 \uc9c0\uc6d0\n", - " \n", - "- \ub9ac\uc2a4\ud2b8\uc640 \ub2e4\ub978 \ud29c\ud50c\ub9cc\uc758 \ud2b9\uc9d5\n", - " - \ubcc0\uacbd \ubd88\uac00\ub2a5 (Immutable)\n", - " - \uba54\uc18c\ub4dc\ub97c \uac00\uc9c0\uc9c0 \uc54a\ub294\ub2e4.\n", - "\n", - "- list() \uc640 tuple() \ub0b4\uc7a5 \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub9ac\uc2a4\ud2b8\uc640 \ud29c\ud50c\uc744 \uc0c1\ud638 \ubcc0\ud658\ud560 \uc218 \uc788\uc74c" + } + ], + "source": [ + "x = 1\n", + "y = 2\n", + "x, y = y, x # 튜플을 이용한 두 자료의 값 변경\n", + "print x, y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 패킹과 언패킹" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 패킹 (Packing): 하나의 튜플 안에 여러 개의 데이터를 넣는 작업" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "t = 1, 2, 'hello'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 언패킹 (Unpacking): 하나의 튜플에서 여러 개의 데이터를 한꺼번에 꺼내와 각각 변수에 할당하는 작업" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "x, y, z = t" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트로도 비슷한 작업이 가능하지만, 단순 패킹/언패킹 작업만을 목적으로 한다면 튜플 사용 추천" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "a = ['foo', 'bar', 4, 5]\n", + "[x, y, z, w] = a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 튜플과 리스트와의 공통점\n", + " - 원소로서 임의의 객체를 저장\n", + " - 시퀀스 자료형\n", + " - 인덱싱, 슬라이싱, 연결, 반복, 멤버쉽 테스트 연산 지원\n", + " \n", + "- 리스트와 다른 튜플만의 특징\n", + " - 변경 불가능 (Immutable)\n", + " - 메소드를 가지지 않는다.\n", + "\n", + "- list() 와 tuple() 내장 함수를 사용하여 리스트와 튜플을 상호 변환할 수 있음" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[100, 2, 3, 4, 5]\n", + "(100, 2, 3, 4, 5)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "T = (1,2,3,4,5)\n", - "L = list(T)\n", - "L[0] = 100\n", - "print L\n", - "\n", - "T = tuple(L)\n", - "print T" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[100, 2, 3, 4, 5]\n", - "(100, 2, 3, 4, 5)\n" - ] - } - ], - "prompt_number": 25 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ud29c\ud50c\uc758 \uc0ac\uc6a9 \uc6a9\ub3c4" + } + ], + "source": [ + "T = (1,2,3,4,5)\n", + "L = list(T)\n", + "L[0] = 100\n", + "print L\n", + "\n", + "T = tuple(L)\n", + "print T" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 튜플의 사용 용도" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 튜플을 사용하는 경우 1: 함수가 하나 이상의 값을 리턴하는 경우" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "def calc(a, b):\n", + " return a+b, a*b\n", + "\n", + "x, y = calc(5, 4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 튜플을 사용하는 경우 2: 문자열 포멧팅" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id : gslee, name : GangSeong\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud29c\ud50c\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 1: \ud568\uc218\uac00 \ud558\ub098 \uc774\uc0c1\uc758 \uac12\uc744 \ub9ac\ud134\ud558\ub294 \uacbd\uc6b0" + } + ], + "source": [ + "print 'id : %s, name : %s' % ('gslee', 'GangSeong')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 튜플을 사용하는 경우 3: 고정된 값을 쌍으로 표현하는 경우" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('two', 2), ('one', 1)]\n" ] - }, + } + ], + "source": [ + "d = {'one':1, 'two':2}\n", + "print d.items()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 집합 자료형\n", + "***\n", + "- set 내장 함수를 사용한 집합 자료 생성 \n", + " - 변경 가능(Mutable)한 객체이다.\n", + " - 각 원소간에 순서는 없다.\n", + " - 각 원소는 중복될 수 없다.\n", + " - [note] 시퀀스 자료형이 아니다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 집합 자료형 생성" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def calc(a, b):\n", - " return a+b, a*b\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "set([1, 2, 3])\n", "\n", - "x, y = calc(5, 4)" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 27 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud29c\ud50c\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 2: \ubb38\uc790\uc5f4 \ud3ec\uba67\ud305" + "\n", + "set([1, 2, 3])\n", + "\n", + "\n", + "set(['a', 'c', 'b'])\n", + "\n", + "\n", + "set([1, 2, 3])\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 'id : %s, name : %s' % ('gslee', 'GangSeong')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "id : gslee, name : GangSeong\n" - ] - } - ], - "prompt_number": 28 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud29c\ud50c\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 3: \uace0\uc815\ub41c \uac12\uc744 \uc30d\uc73c\ub85c \ud45c\ud604\ud558\ub294 \uacbd\uc6b0" + } + ], + "source": [ + "a = set([1, 2, 3])\n", + "print type(a)\n", + "print a\n", + "print\n", + "\n", + "b = set((1, 2, 3))\n", + "print type(b)\n", + "print b\n", + "print\n", + "\n", + "c = set({'a':1, 'b':2, 'c':3})\n", + "print type(c)\n", + "print c\n", + "print\n", + "\n", + "d = set({'a':1, 'b':2, 'c':3}.values())\n", + "print type(d)\n", + "print d" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set의 원소로는 변경 불가능(Immutable)한 것만 할당 가능하다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "set([])\n", + "set([1, 2, 3, 4, 5])\n", + "set([1, 2, 3, 4])\n", + "set(['a', 'c', 'b'])\n", + "set([(4, 5, 6), (1, 2, 3)])\n" ] }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one':1, 'two':2}\n", - "print d.items()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[('two', 2), ('one', 1)]\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \uc9d1\ud569 \uc790\ub8cc\ud615\n", - "***\n", - "- set \ub0b4\uc7a5 \ud568\uc218\ub97c \uc0ac\uc6a9\ud55c \uc9d1\ud569 \uc790\ub8cc \uc0dd\uc131 \n", - " - \ubcc0\uacbd \uac00\ub2a5(Mutable)\ud55c \uac1d\uccb4\uc774\ub2e4.\n", - " - \uac01 \uc6d0\uc18c\uac04\uc5d0 \uc21c\uc11c\ub294 \uc5c6\ub2e4.\n", - " - \uac01 \uc6d0\uc18c\ub294 \uc911\ubcf5\ub420 \uc218 \uc5c6\ub2e4.\n", - " - [note] \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774 \uc544\ub2c8\ub2e4." + "ename": "TypeError", + "evalue": "unhashable type: 'list'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 문자열은 각 문자를 집합 원소로 지닌다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 각 튜플은 원소로 가질 수 있음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \uc9d1\ud569 \uc790\ub8cc\ud615 \uc0dd\uc131" + } + ], + "source": [ + "print set() # 빈 set 객체 생성\n", + "print set([1,2,3,4,5]) # 초기 값은 일반적으로 시퀀스 자료형인 리스트를 넣어준다.\n", + "print set([1,2,3,2,3,4]) # 중복된 원소는 한 번만 표현\n", + "print set('abc') # 문자열은 각 문자를 집합 원소로 지닌다. \n", + "print set([(1,2,3),(4,5,6)]) # 각 튜플은 원소로 가질 수 있음 \n", + "print set([[1,2,3],[4,5,6]]) # 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set의 기본 연산\n", + "\n", + "| set 연산 | 동일 연산자 | 내용 |\n", + "|---------------------------|-------------|-----------------------------|\n", + "| len(s) | | 원소의 개수 |\n", + "| x in s | | x가 집합 s의 원소인가? |\n", + "| x not in s | | x가 집합 s의 원소가 아닌가? |" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n", + "True\n", + "True\n" ] - }, + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "\n", + "print len(A) # 집합의 원소의 수\n", + "print 5 in A # 멤버십 테스트\n", + "print 10 not in A # 멤버십 테스트" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 집합 자료형 메소드" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set의 주요 메소드\n", + " - 다음 연산은 원래 집합은 변경하지 않고 새로운 집합을 반환한다. \n", + "\n", + "| set 연산 | 동일 연산자 | 내용 |\n", + "|---------------------------|-------------|-----------------------------|\n", + "| s.issubset(t) | s <= t | s가 t의 부분집합인가? |\n", + "| s.issuperset(t) | s >= t | s가 t의 슈퍼집합인가? |\n", + "| s.union(t) | s | t | 새로운 s와 t의 합집합 |\n", + "| s.intersection(t) | s & t | 새로운 s와 t의 교집합 |\n", + "| s.difference(t) | s - t | 새로운 s와 t의 차집합 |\n", + "| s.symmetric_difference(t) | s ^ t | 새로운 s와 t의 배타집합 |\n", + "| s.copy() | | 집합 s의 shallow 복사 |" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n", + "\n" + ] + } + ], + "source": [ + "B = set([4,5,6,10,20,30])\n", + "C = set([10,20,30])\n", + "\n", + "print C.issubset(B) # C가 B의 부분집합?\n", + "print C <= B\n", + "print B.issuperset(C) # B가 C를 포함하는 집합?\n", + "print B >= C\n", + "print" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = set([1, 2, 3])\n", - "print type(a)\n", - "print a\n", - "print\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "\n", - "b = set((1, 2, 3))\n", - "print type(b)\n", - "print b\n", - "print\n", + "set([4, 5, 6])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "\n", - "c = set({'a':1, 'b':2, 'c':3})\n", - "print type(c)\n", - "print c\n", - "print\n", + "set([1, 2, 3, 7, 8, 9])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "\n", - "d = set({'a':1, 'b':2, 'c':3}.values())\n", - "print type(d)\n", - "print d" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "set([1, 2, 3])\n", - "\n", - "\n", - "set([1, 2, 3])\n", - "\n", - "\n", - "set(['a', 'c', 'b'])\n", - "\n", - "\n", - "set([1, 2, 3])\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- set\uc758 \uc6d0\uc18c\ub85c\ub294 \ubcc0\uacbd \ubd88\uac00\ub2a5(Immutable)\ud55c \uac83\ub9cc \ud560\ub2f9 \uac00\ub2a5\ud558\ub2e4." + "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print set() # \ube48 set \uac1d\uccb4 \uc0dd\uc131\n", - "print set([1,2,3,4,5]) # \ucd08\uae30 \uac12\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc778 \ub9ac\uc2a4\ud2b8\ub97c \ub123\uc5b4\uc900\ub2e4.\n", - "print set([1,2,3,2,3,4]) # \uc911\ubcf5\ub41c \uc6d0\uc18c\ub294 \ud55c \ubc88\ub9cc \ud45c\ud604\n", - "print set('abc') # \ubb38\uc790\uc5f4\uc740 \uac01 \ubb38\uc790\ub97c \uc9d1\ud569 \uc6d0\uc18c\ub85c \uc9c0\ub2cc\ub2e4. \n", - "print set([(1,2,3),(4,5,6)]) # \uac01 \ud29c\ud50c\uc740 \uc6d0\uc18c\ub85c \uac00\uc9c8 \uc218 \uc788\uc74c \n", - "print set([[1,2,3],[4,5,6]]) # \ubcc0\uacbd \uac00\ub2a5 \uc790\ub8cc\uc778 \ub9ac\uc2a4\ud2b8\ub294 \uc9d1\ud569\uc758 \uc6d0\uc18c\uac00 \ub420 \uc218 \uc5c6\ub2e4." - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([])\n", - "set([1, 2, 3, 4, 5])\n", - "set([1, 2, 3, 4])\n", - "set(['a', 'c', 'b'])\n", - "set([(4, 5, 6), (1, 2, 3)])\n" - ] - }, - { - "ename": "TypeError", - "evalue": "unhashable type: 'list'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubb38\uc790\uc5f4\uc740 \uac01 \ubb38\uc790\ub97c \uc9d1\ud569 \uc6d0\uc18c\ub85c \uc9c0\ub2cc\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \uac01 \ud29c\ud50c\uc740 \uc6d0\uc18c\ub85c \uac00\uc9c8 \uc218 \uc788\uc74c\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubcc0\uacbd \uac00\ub2a5 \uc790\ub8cc\uc778 \ub9ac\uc2a4\ud2b8\ub294 \uc9d1\ud569\uc758 \uc6d0\uc18c\uac00 \ub420 \uc218 \uc5c6\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- set\uc758 \uae30\ubcf8 \uc5f0\uc0b0\n", - "\n", - "| set \uc5f0\uc0b0 | \ub3d9\uc77c \uc5f0\uc0b0\uc790 | \ub0b4\uc6a9 |\n", - "|---------------------------|-------------|-----------------------------|\n", - "| len(s) | | \uc6d0\uc18c\uc758 \uac1c\uc218 |\n", - "| x in s | | x\uac00 \uc9d1\ud569 s\uc758 \uc6d0\uc18c\uc778\uac00? |\n", - "| x not in s | | x\uac00 \uc9d1\ud569 s\uc758 \uc6d0\uc18c\uac00 \uc544\ub2cc\uac00? |" + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "B = set([4,5,6,10,20,30])\n", + "\n", + "print A.union(B) # A와 B의 합집합\n", + "print A\n", + "print\n", + "\n", + "print A.intersection(B) # A와 B의 교집합\n", + "print A\n", + "print\n", + "\n", + "print A.difference(B) # A - B (차집합)\n", + "print A\n", + "print\n", + "\n", + "print A.symmetric_difference(B) # 베타집합. A와 B의 합집합에서 교집합의 원소를 제외한 집합\n", + "print A" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "set([4, 5, 6])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "set([1, 2, 3, 7, 8, 9])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", + "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "\n", - "print len(A) # \uc9d1\ud569\uc758 \uc6d0\uc18c\uc758 \uc218\n", - "print 5 in A # \uba64\ubc84\uc2ed \ud14c\uc2a4\ud2b8\n", - "print 10 not in A # \uba64\ubc84\uc2ed \ud14c\uc2a4\ud2b8" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9\n", - "True\n", - "True\n" - ] - } - ], - "prompt_number": 34 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \uc9d1\ud569 \uc790\ub8cc\ud615 \uba54\uc18c\ub4dc" + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "B = set([4,5,6,10,20,30])\n", + "\n", + "print A | B # A와 B의 합집합\n", + "print A\n", + "print\n", + "\n", + "print A & B # A와 B의 교집합\n", + "print A\n", + "print\n", + "\n", + "print A - B #A - B (차집합)\n", + "print A\n", + "print\n", + "\n", + "print A.symmetric_difference(B) # 베타집합. A와 B의 합집합에서 교집합의 원소를 제외한 집합\n", + "print A ^ B\n", + "print A" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "True\n", + "False\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- set\uc758 \uc8fc\uc694 \uba54\uc18c\ub4dc\n", - " - \ub2e4\uc74c \uc5f0\uc0b0\uc740 \uc6d0\ub798 \uc9d1\ud569\uc740 \ubcc0\uacbd\ud558\uc9c0 \uc54a\uace0 \uc0c8\ub85c\uc6b4 \uc9d1\ud569\uc744 \ubc18\ud658\ud55c\ub2e4. \n", - "\n", - "| set \uc5f0\uc0b0 | \ub3d9\uc77c \uc5f0\uc0b0\uc790 | \ub0b4\uc6a9 |\n", - "|---------------------------|-------------|-----------------------------|\n", - "| s.issubset(t) | s <= t | s\uac00 t\uc758 \ubd80\ubd84\uc9d1\ud569\uc778\uac00? |\n", - "| s.issuperset(t) | s >= t | s\uac00 t\uc758 \uc288\ud37c\uc9d1\ud569\uc778\uac00? |\n", - "| s.union(t) | s | t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \ud569\uc9d1\ud569 |\n", - "| s.intersection(t) | s & t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \uad50\uc9d1\ud569 |\n", - "| s.difference(t) | s - t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \ucc28\uc9d1\ud569 |\n", - "| s.symmetric_difference(t) | s ^ t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \ubc30\ud0c0\uc9d1\ud569 |\n", - "| s.copy() | | \uc9d1\ud569 s\uc758 shallow \ubcf5\uc0ac |" + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "D = A.copy()\n", + "print D\n", + "print\n", + "\n", + "print A == D #자료값 비교\n", + "print A is D #객체 동등성 비교" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set은 시퀀스 자료형이 아니므로 인덱싱, 슬라이싱, 정렬 등을 지원하지 않는다. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'set' object does not support indexing", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'set' object does not support indexing" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "B = set([4,5,6,10,20,30])\n", - "C = set([10,20,30])\n", - "\n", - "print C.issubset(B) # C\uac00 B\uc758 \ubd80\ubd84\uc9d1\ud569?\n", - "print C <= B\n", - "print B.issuperset(C) # B\uac00 C\ub97c \ud3ec\ud568\ud558\ub294 \uc9d1\ud569?\n", - "print B >= C\n", - "print" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n", - "True\n", - "True\n", - "\n" - ] - } - ], - "prompt_number": 33 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "B = set([4,5,6,10,20,30])\n", - "\n", - "print A.union(B) # A\uc640 B\uc758 \ud569\uc9d1\ud569\n", - "print A\n", - "print\n", - "\n", - "print A.intersection(B) # A\uc640 B\uc758 \uad50\uc9d1\ud569\n", - "print A\n", - "print\n", - "\n", - "print A.difference(B) # A - B (\ucc28\uc9d1\ud569)\n", - "print A\n", - "print\n", - "\n", - "print A.symmetric_difference(B) # \ubca0\ud0c0\uc9d1\ud569. A\uc640 B\uc758 \ud569\uc9d1\ud569\uc5d0\uc11c \uad50\uc9d1\ud569\uc758 \uc6d0\uc18c\ub97c \uc81c\uc678\ud55c \uc9d1\ud569\n", - "print A" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([4, 5, 6])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([1, 2, 3, 7, 8, 9])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "B = set([4,5,6,10,20,30])\n", - "\n", - "print A | B # A\uc640 B\uc758 \ud569\uc9d1\ud569\n", - "print A\n", - "print\n", - "\n", - "print A & B # A\uc640 B\uc758 \uad50\uc9d1\ud569\n", - "print A\n", - "print\n", - "\n", - "print A - B #A - B (\ucc28\uc9d1\ud569)\n", - "print A\n", - "print\n", - "\n", - "print A.symmetric_difference(B) # \ubca0\ud0c0\uc9d1\ud569. A\uc640 B\uc758 \ud569\uc9d1\ud569\uc5d0\uc11c \uad50\uc9d1\ud569\uc758 \uc6d0\uc18c\ub97c \uc81c\uc678\ud55c \uc9d1\ud569\n", - "print A ^ B\n", - "print A" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([4, 5, 6])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([1, 2, 3, 7, 8, 9])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", - "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "D = A.copy()\n", - "print D\n", - "print\n", - "\n", - "print A == D #\uc790\ub8cc\uac12 \ube44\uad50\n", - "print A is D #\uac1d\uccb4 \ub3d9\ub4f1\uc131 \ube44\uad50" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "True\n", - "False\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- set\uc740 \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774 \uc544\ub2c8\ubbc0\ub85c \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc815\ub82c \ub4f1\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294\ub2e4. " + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "print A[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'set' object has no attribute '__getitem__'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'set' object has no attribute '__getitem__'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "print A[0]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'set' object does not support indexing", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'set' object does not support indexing" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print A[1:4]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'set' object has no attribute '__getitem__'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'set' object has no attribute '__getitem__'" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print A.sort()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'set' object has no attribute 'sort'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'set' object has no attribute 'sort'" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc9d1\ud569\uc744 \ub9ac\uc2a4\ud2b8\ub098 \ud29c\ud50c\ub85c \ubcc0\uacbd\uac00\ub2a5\n", - " - \uc9d1\ud569\uc5d0 \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc815\ub82c \ub4f1\uc744 \uc801\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub9ac\uc2a4\ud2b8\ub098 \ud29c\ud50c\ub85c \ubcc0\uacbd\ud55c\ub2e4." + } + ], + "source": [ + "print A[1:4]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'set' object has no attribute 'sort'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: 'set' object has no attribute 'sort'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print list(A)\n", - "print tuple(A)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2, 3, 4, 5, 6, 7, 8, 9]\n", - "(1, 2, 3, 4, 5, 6, 7, 8, 9)\n" - ] - } - ], - "prompt_number": 14 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud558\uc9c0\ub9cc \uc9d1\ud569\uc5d0 for ~ in \uc5f0\uc0b0\uc740 \uc801\uc6a9 \uac00\ub2a5\ud558\ub2e4." + } + ], + "source": [ + "print A.sort()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 집합을 리스트나 튜플로 변경가능\n", + " - 집합에 인덱싱, 슬라이싱, 정렬 등을 적용하기 위해서는 리스트나 튜플로 변경한다." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "(1, 2, 3, 4, 5, 6, 7, 8, 9)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "for ele in A:\n", - " print ele," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 2 3 4 5 6 7 8 9\n" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- set\uc740 \ubcc0\uacbd \uac00\ub2a5(Mutable)\ud55c \uc790\ub8cc \uad6c\uc870 \uac1d\uccb4 \n", - "- \ub2e4\uc74c \uba54\uc18c\ub4dc\ub4e4\uc740 set\uc744 \ubcc0\uacbd\ud558\ub294 \uc9d1\ud569 \uc790\ub8cc \uad6c\uc870 \uba54\uc18c\ub4dc\ub4e4\uc784\n", - "\n", - "| set \uc5f0\uc0b0 | \ub3d9\uc77c \uc5f0\uc0b0\uc790 | \ub0b4\uc6a9 |\n", - "|---------------------------|-------------|-----------------------------|\n", - "| s.update(t) | s |= t | s\uc640 t\uc758 \ud569\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", - "| s.intersection_update(t) | s &= t | s\uc640 t\uc758 \uad50\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", - "| s.difference_update(t) | s -= t | s\uc640 t\uc758 \ucc28\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", - "| s.symmetric_difference_update(t)| s ^= t | s\uc640 t\uc758 \ubc30\ud0c0\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", - "| s.add(x) | | \uc6d0\uc18c x\ub97c \uc9d1\ud569 s\uc5d0 \ucd94\uac00 |\n", - "| s.remove(x) | | \uc6d0\uc18c x\ub97c \uc9d1\ud569 s\uc5d0\uc11c \uc81c\uac70, \uc6d0\uc18c x\uac00 \uc9d1\ud569 s\uc5d0 \uc5c6\uc73c\uba74 \uc608\uc678 \ubc1c\uc0dd |\n", - "| s.discard(x) | | \uc6d0\uc18c x\ub97c \uc9d1\ud569 s\uc5d0\uc11c \uc81c\uac70 |\n", - "| s.pop() | | \uc784\uc758\uc758 \uc6d0\uc18c\ub97c \uc9d1\ud569 s\uc5d0\uc11c \uc81c\uac70, \uc9d1\ud569 s\uac00 \uacf5\uc9d1\ud569\uc774\uba74 \uc608\uc678 \ubc1c\uc0dd |\n", - "| s.clear() | | \uc9d1\ud569 s\uc758 \ubaa8\ub4e0 \uc6d0\uc18c \uc81c\uac70 |" + } + ], + "source": [ + "print list(A)\n", + "print tuple(A)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 하지만 집합에 for ~ in 연산은 적용 가능하다." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3 4 5 6 7 8 9\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4])\n", - "B = set([3,4,5,6])\n", - "\n", - "A.update(B) # A\uc5d0 B \uc9d1\ud569\uc758 \uc6d0\uc18c\ub97c \ucd94\uac00 \uc2dc\ud0b4\n", - "print A\n", - "\n", - "A.intersection_update([4,5,6,7,8]) # &=\n", - "print A\n", - "\n", - "A.difference_update([6,7,8]) # -=\n", - "print A\n", - "\n", - "A.symmetric_difference_update([5,6,7]) # ^=\n", - "print A\n", - "\n", - "A.add(8) # \uc6d0\uc18c \ucd94\uac00\n", - "print A\n", - "\n", - "A.remove(8) # \uc6d0\uc18c \uc81c\uac70\n", - "print A" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([1, 2, 3, 4, 5, 6])\n", - "set([4, 5, 6])\n", - "set([4, 5])\n", - "set([4, 6, 7])\n", - "set([8, 4, 6, 7])\n", - "set([4, 6, 7])\n" - ] - } - ], - "prompt_number": 40 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "A.remove(10) # \uc5c6\ub294 \uc6d0\uc18c\ub97c \uc81c\uac70\ud558\uba74 KeyError \ubc1c\uc0dd" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "10", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#\uc5c6\ub294 \uc6d0\uc18c\ub97c \uc81c\uac70\ud558\uba74 KeyError \ubc1c\uc0dd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m: 10" - ] - } - ], - "prompt_number": 21 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "A.discard(10) # remove\uc640 \uac19\uc73c\ub098 \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc74c\n", - "A.discard(6) # \uc6d0\uc18c 6\uc81c\uac70\n", - "print A\n", - "\n", - "A.pop() # \uc784\uc758\uc758 \uc6d0\uc18c \ud558\ub098 \uaebc\ub0b4\uae30\n", - "print A \n", - "\n", - "A = set([1,2,3,4])\n", - "A.clear() # \uc6d0\uc18c\ub4e4 \uc5c6\uc560\uae30\n", - "print A" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([4, 7])\n", - "set([7])\n", - "set([])\n" - ] - } - ], - "prompt_number": 41 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "for ele in A:\n", + " print ele," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set은 변경 가능(Mutable)한 자료 구조 객체 \n", + "- 다음 메소드들은 set을 변경하는 집합 자료 구조 메소드들임\n", + "\n", + "| set 연산 | 동일 연산자 | 내용 |\n", + "|---------------------------|-------------|-----------------------------|\n", + "| s.update(t) | s |= t | s와 t의 합집합을 s에 저장 |\n", + "| s.intersection_update(t) | s &= t | s와 t의 교집합을 s에 저장 |\n", + "| s.difference_update(t) | s -= t | s와 t의 차집합을 s에 저장 |\n", + "| s.symmetric_difference_update(t)| s ^= t | s와 t의 배타집합을 s에 저장 |\n", + "| s.add(x) | | 원소 x를 집합 s에 추가 |\n", + "| s.remove(x) | | 원소 x를 집합 s에서 제거, 원소 x가 집합 s에 없으면 예외 발생 |\n", + "| s.discard(x) | | 원소 x를 집합 s에서 제거 |\n", + "| s.pop() | | 임의의 원소를 집합 s에서 제거, 집합 s가 공집합이면 예외 발생 |\n", + "| s.clear() | | 집합 s의 모든 원소 제거 |" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "set([1, 2, 3, 4, 5, 6])\n", + "set([4, 5, 6])\n", + "set([4, 5])\n", + "set([4, 6, 7])\n", + "set([8, 4, 6, 7])\n", + "set([4, 6, 7])\n" + ] + } + ], + "source": [ + "A = set([1,2,3,4])\n", + "B = set([3,4,5,6])\n", + "\n", + "A.update(B) # A에 B 집합의 원소를 추가 시킴\n", + "print A\n", + "\n", + "A.intersection_update([4,5,6,7,8]) # &=\n", + "print A\n", + "\n", + "A.difference_update([6,7,8]) # -=\n", + "print A\n", + "\n", + "A.symmetric_difference_update([5,6,7]) # ^=\n", + "print A\n", + "\n", + "A.add(8) # 원소 추가\n", + "print A\n", + "\n", + "A.remove(8) # 원소 제거\n", + "print A" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "10", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#없는 원소를 제거하면 KeyError 발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 10" + ] + } + ], + "source": [ + "A.remove(10) # 없는 원소를 제거하면 KeyError 발생" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "set([4, 7])\n", + "set([7])\n", + "set([])\n" ] } ], - "metadata": {} + "source": [ + "A.discard(10) # remove와 같으나 예외가 발생하지 않음\n", + "A.discard(6) # 원소 6제거\n", + "print A\n", + "\n", + "A.pop() # 임의의 원소 하나 꺼내기\n", + "print A \n", + "\n", + "A = set([1,2,3,4])\n", + "A.clear() # 원소들 없애기\n", + "print A" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python12.ipynb b/python12.ipynb index 0aeddf7..16c4f43 100644 --- a/python12.ipynb +++ b/python12.ipynb @@ -1,694 +1,666 @@ { - "metadata": { - "celltoolbar": "Raw Cell Format", - "name": "", - "signature": "sha256:118de544f1b6b0240b193fd4cb88dd0599a38507af3056036f93153d7914bf90" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 12. \uc0ac\uc804(Dictionaries)\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \uc0ac\uc804 \ud65c\uc6a9\ubc95\n", - "***\n", - "- \uc0ac\uc804(Dictionary) \uac1d\uccb4\uc758 \ud2b9\uc9d5\n", - " - \uc9d1\ud569\uc801 \uc790\ub8cc\ud615\n", - " - \uc790\ub8cc\uc758 \uc21c\uc11c\ub97c \uc815\ud558\uc9c0 \uc54a\ub294 \ub9e4\ud551(Mapping)\ud615\n", - " - \ud0a4(Key)\ub97c \uc774\uc6a9\ud558\uc5ec \uac12(Value)\uc5d0 \uc811\uadfc\n", - " - \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc740 \uc544\ub2d8\n", - " - \ud0a4\uc640 \uac12\uc758 \ub9e4\ud551 1\uac1c\ub97c \uc544\uc774\ud15c(item)\uc774\ub77c\uace0 \ubd80\ub984" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 12. 사전(Dictionaries)\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 사전 활용법\n", + "***\n", + "- 사전(Dictionary) 객체의 특징\n", + " - 집합적 자료형\n", + " - 자료의 순서를 정하지 않는 매핑(Mapping)형\n", + " - 키(Key)를 이용하여 값(Value)에 접근\n", + " - 시퀀스 자료형은 아님\n", + " - 키와 값의 매핑 1개를 아이템(item)이라고 부름" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", - "print member['baseball'] # \uac80\uc0c9" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uac12\uc744 \uc800\uc7a5\ud560 \uc2dc\uc5d0 \ud0a4\ub97c \uc0ac\uc6a9\n", - " - \ud0a4\uac00 \uc5c6\ub2e4\uba74 \uc0c8\ub85c\uc6b4 \ud0a4\uc640 \uac12\uc758 \uc544\uc774\ud15c\uc774 \uc0dd\uc131\n", - " - \ud0a4\uac00 \uc774\ubbf8 \uc874\uc7ac\ud55c\ub2e4\uba74 \uadf8 \ud0a4\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\uc774 \ubcc0\uacbd" + } + ], + "source": [ + "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", + "print member['baseball'] # 검색" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 값을 저장할 시에 키를 사용\n", + " - 키가 없다면 새로운 키와 값의 아이템이 생성\n", + " - 키가 이미 존재한다면 그 키에 해당하는 값이 변경" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'soccer': 11, 'basketball': 5, 'baseball': 9, 'volleyball': 6}\n", + "4\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", - "member['volleyball'] = 7 # \uc0c8\ub85c\uc6b4 \uc544\uc774\ud15c \uc124\uc815\n", - "member['volleyball'] = 6 # \ubcc0\uacbd\n", - "print member\n", - "print len(member) # \uc544\uc774\ud15c\uc758 \uac1c\uc218 \ubc18\ud658 " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'soccer': 11, 'basketball': 5, 'baseball': 9, 'volleyball': 6}\n", - "4\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804\uc744 \ucd9c\ub825\ud558\uba74 \uac01 \uc544\uc774\ud15c\ub4e4\uc774 \uc784\uc758\uc758 \uc21c\uc11c\ub85c \ucd9c\ub825\ub41c\ub2e4.\n", - "- \uc0c8\ub85c\uc6b4 \uc544\uc774\ud15c\uc774 \ub4e4\uc5b4\uc624\uba74 \ud0a4 \ub0b4\uc6a9\uc5d0 \ub530\ub77c \uadf8 \uc21c\uc11c\uac00 \ub2ec\ub77c\uc9c4\ub2e4.\n", - "- \ub0b4\ubd80\uc801\uc73c\ub85c \ud0a4 \ub0b4\uc6a9\uc5d0 \ub300\ud574 \ud574\uc26c(Hash) \uae30\ubc95\uc744 \uc0ac\uc6a9\n", - " - \uac80\uc0c9 \uc18d\ub3c4\uac00 \ub9e4\uc6b0 \ube60\ub984\n", - " - [\ucc38\uace0]: http://www.laurentluce.com/posts/python-dictionary-implementation/\n", - "- \ud0a4\uc640 \uac12 \ub9e4\ud551\uc5d0 \ub300\ud55c \uc544\uc774\ud15c\uc744 \uc0ad\uc81c\ud560 \ub54c\uc5d0\ub294 del\uacfc \ud568\uaed8 \ud0a4\uac12 \uba85\uc2dc " + } + ], + "source": [ + "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", + "member['volleyball'] = 7 # 새로운 아이템 설정\n", + "member['volleyball'] = 6 # 변경\n", + "print member\n", + "print len(member) # 아이템의 개수 반환 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전을 출력하면 각 아이템들이 임의의 순서로 출력된다.\n", + "- 새로운 아이템이 들어오면 키 내용에 따라 그 순서가 달라진다.\n", + "- 내부적으로 키 내용에 대해 해쉬(Hash) 기법을 사용\n", + " - 검색 속도가 매우 빠름\n", + " - [참고]: http://www.laurentluce.com/posts/python-dictionary-implementation/\n", + "- 키와 값 매핑에 대한 아이템을 삭제할 때에는 del과 함께 키값 명시 " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'soccer': 11, 'baseball': 9}\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", - "del member['basketball'] # \ud56d\ubaa9 \uc0ad\uc81c\n", - "print member" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'soccer': 11, 'baseball': 9}\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [\uc911\uc694] \ud0a4\ub294 \ubcc0\uacbd \ubd88\uac00\ub2a5 (Immutable) \uc790\ub8cc\ub9cc \uac00\ub2a5\n", - " - \ubb38\uc790\uc5f4, \uc22b\uc790, \ud29c\ud50c\uc740 \uac00\ub2a5\n", - " - \ub9ac\uc2a4\ud2b8, \uc0ac\uc804\uc740 \ud0a4\uac00 \ub420 \uc218 \uc5c6\uc74c\n", - "- \ubc18\uba74\uc5d0 \uc0ac\uc804\uc5d0 \uc785\ub825\ub418\ub294 \uac12\uc740 \uc784\uc758\uc758 \uac1d\uccb4" + } + ], + "source": [ + "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", + "del member['basketball'] # 항목 삭제\n", + "print member" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [중요] 키는 변경 불가능 (Immutable) 자료만 가능\n", + " - 문자열, 숫자, 튜플은 가능\n", + " - 리스트, 사전은 키가 될 수 없음\n", + "- 반면에 사전에 입력되는 값은 임의의 객체" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unhashable type: 'list'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'tuple'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'list'\u001b[0m \u001b[0;31m# 리스트는 키가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {}\n", - "d['str'] = 'abc'\n", - "d[1] = 4\n", - "d[(1,2,3)] = 'tuple'\n", - "d[[1,2,3]] = 'list' # \ub9ac\uc2a4\ud2b8\ub294 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4." - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "unhashable type: 'list'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'tuple'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'list'\u001b[0m \u001b[0;31m# \ub9ac\uc2a4\ud2b8\ub294 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d[{1:2}] = 3 # \uc0ac\uc804\uc740 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4." - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "unhashable type: 'dict'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m3\u001b[0m \u001b[0;31m# \uc0ac\uc804\uc740 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'dict'" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc774\ub984\uc740 \uc0ac\uc804\uc758 \ud0a4\ub098 \uac12\uc73c\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud568" + } + ], + "source": [ + "d = {}\n", + "d['str'] = 'abc'\n", + "d[1] = 4\n", + "d[(1,2,3)] = 'tuple'\n", + "d[[1,2,3]] = 'list' # 리스트는 키가 될 수 없다." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unhashable type: 'dict'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m3\u001b[0m \u001b[0;31m# 사전은 키가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'dict'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a, b):\n", - " return a + b\n", - "\n", - "def sub(a, b):\n", - " return a - b\n", + } + ], + "source": [ + "d[{1:2}] = 3 # 사전은 키가 될 수 없다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 이름은 사전의 키나 값으로 사용 가능함" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n", + "-1\n", "\n", - "action = {0: add, 1: sub} # \ud568\uc218 \uc774\ub984\uc744 \uc0ac\uc804\uc758 \uac12\uc73c\ub85c \uc0ac\uc6a9\n", - "print action[0](4, 5)\n", - "print action[1](4, 5)\n", - "print\n", - "action2 = {add: 1, sub: 2} # \ud568\uc218 \uc774\ub984\uc744 \uc0ac\uc804\uc758 \ud0a4\ub85c \uc0ac\uc6a9\n", - "print action2[add]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9\n", - "-1\n", - "\n", - "1\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804\uc744 \uc0dd\uc131\ud558\ub294 \ub2e4\ub978 \ubc29\ubc95: \ub0b4\uc7a5\ud568\uc218 dict() \uc0ac\uc6a9" + "1\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = dict()\n", - "print type(d)\n", - "print \n", + } + ], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "def sub(a, b):\n", + " return a - b\n", + "\n", + "action = {0: add, 1: sub} # 함수 이름을 사전의 값으로 사용\n", + "print action[0](4, 5)\n", + "print action[1](4, 5)\n", + "print\n", + "action2 = {add: 1, sub: 2} # 함수 이름을 사전의 키로 사용\n", + "print action2[add]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전을 생성하는 다른 방법: 내장함수 dict() 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", "\n", - "print dict(one=1, two=2)\n", - "print dict([('one', 1), ('two', 2)])\n", - "print dict({'one':1, 'two':2})" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "{'two': 2, 'one': 1}\n", - "{'two': 2, 'one': 1}\n", - "{'two': 2, 'one': 1}\n" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "keys = ['one', 'two', 'three']\n", - "values = (1, 2, 3)\n", - "print zip(keys, values) # zip(): \ub450 \uac1c\uc758 \uc790\ub8cc\ub97c \uc21c\uc11c\ub300\ub85c \uc30d\uc73c\ub85c \ubb36\uc740 \ud29c\ud50c\ub4e4\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", - "print dict(zip(keys, values))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[('one', 1), ('two', 2), ('three', 3)]\n", - "{'three': 3, 'two': 2, 'one': 1}\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \uc0ac\uc804 \uba54\uc18c\ub4dc\n", - "***" + "{'two': 2, 'one': 1}\n", + "{'two': 2, 'one': 1}\n", + "{'two': 2, 'one': 1}\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804\uc774 \uc9c0\uc6d0\ud558\ub294 \uc911\uc694 \uba54\uc18c\ub4dc\n", - " - D.keys(): \uc0ac\uc804 D\uc5d0\uc11c \ud0a4\ub4e4\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\n", - " - D.values(): \uc0ac\uc804 D\uc5d0\uc11c \uac12\ub4e4\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\n", - " - D.items(): \uc0ac\uc804 D\uc5d0\uc11c \uac01 \uc544\uc774\ud15c\uc744 \ud29c\ud50c\ud615\ud0dc\ub85c \uac00\uc838\uc640 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\n", - "- key in D: \uc0ac\uc804 D\uc548\uc5d0 key\ub97c \ud0a4\uac12\uc744 \uac00\uc9c4 \uc544\uc774\ud15c\uc774 \uc788\ub294\uc9c0 \ud655\uc778" + } + ], + "source": [ + "d = dict()\n", + "print type(d)\n", + "print \n", + "\n", + "print dict(one=1, two=2)\n", + "print dict([('one', 1), ('two', 2)])\n", + "print dict({'one':1, 'two':2})" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('one', 1), ('two', 2), ('three', 3)]\n", + "{'three': 3, 'two': 2, 'one': 1}\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + } + ], + "source": [ + "keys = ['one', 'two', 'three']\n", + "values = (1, 2, 3)\n", + "print zip(keys, values) # zip(): 두 개의 자료를 순서대로 쌍으로 묶은 튜플들의 리스트 반환\n", + "print dict(zip(keys, values))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 사전 메소드\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전이 지원하는 중요 메소드\n", + " - D.keys(): 사전 D에서 키들을 리스트로 반환\n", + " - D.values(): 사전 D에서 값들을 리스트로 반환\n", + " - D.items(): 사전 D에서 각 아이템을 튜플형태로 가져와 리스트로 반환\n", + "- key in D: 사전 D안에 key를 키값을 가진 아이템이 있는지 확인" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['jin', 'Joseph', 'jack']\n", + "[1111, 6584321, 9465215]\n", + "[('jin', 1111), ('Joseph', 6584321), ('jack', 9465215)]\n", "\n", - "print phone.keys() # \ud0a4\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", - "print phone.values() # \uac12\ub4e4\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", - "print phone.items() # (\ud0a4, \uac12)\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", - "print\n", - "print 'jack' in phone # 'jack'\uc774 phone\uc758 \ud0a4\uc5d0 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n", - "print 'lee' in phone" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['jin', 'Joseph', 'jack']\n", - "[1111, 6584321, 9465215]\n", - "[('jin', 1111), ('Joseph', 6584321), ('jack', 9465215)]\n", - "\n", - "True\n", - "False\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- D2 = D.copy(): \uc0ac\uc804 D\ub97c \ubcf5\uc0ac\ud558\uc5ec D2 \uc0ac\uc804\uc5d0 \ud560\ub2f9\ud55c\ub2e4." + "True\n", + "False\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", - "p = phone # \uc0ac\uc804 \ub808\ud37c\ub7f0\uc2a4 \ubcf5\uc0ac. \uc0ac\uc804 \uac1d\uccb4\ub294 \uacf5\uc720\ub41c\ub2e4.\n", - "\n", - "phone['jack'] = 1234 # phone\uc744 \ubcc0\uacbd\ud558\uba74\n", - "print phone\n", - "print p # p\ub3c4 \ud568\uaed8 \ubcc0\uacbd\ub41c\ub2e4.\n", - "print\n", + } + ], + "source": [ + "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "\n", + "print phone.keys() # 키의 리스트 반환\n", + "print phone.values() # 값들의 리스트 반환\n", + "print phone.items() # (키, 값)의 리스트 반환\n", + "print\n", + "print 'jack' in phone # 'jack'이 phone의 키에 포함되어 있는가?\n", + "print 'lee' in phone" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- D2 = D.copy(): 사전 D를 복사하여 D2 사전에 할당한다." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n", + "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n", "\n", - "ph = phone.copy() # \uc0ac\uc804\ubcf5\uc0ac. \ubcc4\ub3c4\uc758 \uc0ac\uc804 \uac1d\uccb4\uac00 \ub9c8\ub828\ub41c\ub2e4.\n", - "phone['jack'] = 1111 # phone\uc744 \ubc14\uafd4\ub3c4\n", - "print phone\n", - "print ph # ph\ub294 \ubc14\ub00c\uc9c0 \uc54a\ub294\ub2e4." - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n", - "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n", - "\n", - "{'jin': 1111, 'Joseph': 6584321, 'jack': 1111}\n", - "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [\uc8fc\uc758] D.copy()\ub294 Shallow Copy\ub97c \uc218\ud589\ud55c\ub2e4." + "{'jin': 1111, 'Joseph': 6584321, 'jack': 1111}\n", + "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "phone = {'a': [1,2,3], 'b': 4}\n", - "phone2 = phone.copy()\n", - "print phone\n", - "print phone2\n", - "print\n", + } + ], + "source": [ + "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "p = phone # 사전 레퍼런스 복사. 사전 객체는 공유된다.\n", + "\n", + "phone['jack'] = 1234 # phone을 변경하면\n", + "print phone\n", + "print p # p도 함께 변경된다.\n", + "print\n", + "\n", + "ph = phone.copy() # 사전복사. 별도의 사전 객체가 마련된다.\n", + "phone['jack'] = 1111 # phone을 바꿔도\n", + "print phone\n", + "print ph # ph는 바뀌지 않는다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [주의] D.copy()는 Shallow Copy를 수행한다." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'a': [1, 2, 3], 'b': 4}\n", + "{'a': [1, 2, 3], 'b': 4}\n", "\n", - "phone['b'] = 100\n", - "print phone\n", - "print phone2\n", - "print\n", + "{'a': [1, 2, 3], 'b': 100}\n", + "{'a': [1, 2, 3], 'b': 4}\n", "\n", - "phone['a'][0] = 100\n", - "print phone\n", - "print phone2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'a': [1, 2, 3], 'b': 4}\n", - "{'a': [1, 2, 3], 'b': 4}\n", - "\n", - "{'a': [1, 2, 3], 'b': 100}\n", - "{'a': [1, 2, 3], 'b': 4}\n", - "\n", - "{'a': [100, 2, 3], 'b': 100}\n", - "{'a': [100, 2, 3], 'b': 4}\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/shallow_copy.png)" + "{'a': [100, 2, 3], 'b': 100}\n", + "{'a': [100, 2, 3], 'b': 4}\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", - "\n", - "print ph.get('jack') # 'jack'\uc5d0 \ub300\ud55c \uac12\uc744 \uc5bb\ub294\ub2e4. ph['jack']\uacfc \uac19\ub2e4.\n", - "print ph.get('gslee') # 'gslee'\uc5d0 \ub300\ud55c \uac12\uc744 \uc5bb\ub294\ub2e4. \uac12\uc774 \uc5c6\ub294 \uacbd\uc6b0 None\ubc18\ud658" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9465215\n", - "None\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", - "print ph['gslee'] # ph['gslee']\ub294 \ud0a4\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc608\uc678\ubc1c\uc0dd" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'gslee'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'jack'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m9465215\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'jin'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m1111\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Joseph'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m6584321\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mph\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'gslee'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# ph['gslee']\ub294 \ud0a4\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc608\uc678\ubc1c\uc0dd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m: 'gslee'" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", - "print ph.get('gslee', 5284) # \uc778\uc218\ub97c \ud558\ub098 \ub354 \uc81c\uacf5\ud558\uba74 'gslee'\uac00 \uc5c6\ub294 \uacbd\uc6b0\uc5d0 5284 \ub9ac\ud134\n", - "print ph # \uc0ac\uc804\uc5d0\ub294 \ubcc0\ud654\uac00 \uc5c6\ub2e4\n", - "print \n", + } + ], + "source": [ + "phone = {'a': [1,2,3], 'b': 4}\n", + "phone2 = phone.copy()\n", + "print phone\n", + "print phone2\n", + "print\n", + "\n", + "phone['b'] = 100\n", + "print phone\n", + "print phone2\n", + "print\n", + "\n", + "phone['a'][0] = 100\n", + "print phone\n", + "print phone2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/shallow_copy.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9465215\n", + "None\n" + ] + } + ], + "source": [ + "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "\n", + "print ph.get('jack') # 'jack'에 대한 값을 얻는다. ph['jack']과 같다.\n", + "print ph.get('gslee') # 'gslee'에 대한 값을 얻는다. 값이 없는 경우 None반환" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'gslee'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'jack'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m9465215\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'jin'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m1111\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Joseph'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m6584321\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mph\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'gslee'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# ph['gslee']는 키가 없는 경우 예외발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 'gslee'" + ] + } + ], + "source": [ + "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "print ph['gslee'] # ph['gslee']는 키가 없는 경우 예외발생" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5284\n", + "{'jin': 1111, 'Joseph': 6584321, 'jack': 9465215}\n", "\n", - "print ph.popitem() # \uc784\uc758\uc758 \uc544\uc774\ud15c\uc744 \uaebc\ub0b8\ub2e4.\n", - "print ph\n", - "print\n", + "('jin', 1111)\n", + "{'Joseph': 6584321, 'jack': 9465215}\n", "\n", - "print ph.popitem() # \uc784\uc758\uc758 \uc544\uc774\ud15c\uc744 \uaebc\ub0b8\ub2e4.\n", - "print ph \n", - "print\n", + "('Joseph', 6584321)\n", + "{'jack': 9465215}\n", "\n", - "print ph.pop('jack') # \ud0a4 \uac12\uc744 \ud1b5\ud574 \ud574\ub2f9 \uc544\uc774\ud15c\uc744 \uc9c0\uc815\ud558\uc5ec \uaebc\ub0b8\ub2e4.\n", - "print ph" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "5284\n", - "{'jin': 1111, 'Joseph': 6584321, 'jack': 9465215}\n", - "\n", - "('jin', 1111)\n", - "{'Joseph': 6584321, 'jack': 9465215}\n", - "\n", - "('Joseph', 6584321)\n", - "{'jack': 9465215}\n", - "\n", - "9465215\n", - "{}\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", - "ph = {'kim':12312, 'lee': 9090}\n", - "phone.update(ph) # \uc0ac\uc804 phone\uc758 \ub0b4\uc6a9\uc744 ph\uc73c\ub85c \ucd94\uac00 \uac31\uc2e0\n", - "print phone\n", - "print\n", - "phone.clear() # \uc0ac\uc804\uc758 \ubaa8\ub4e0 \uc785\ub825\uc744 \uc5c6\uc564\ub2e4.\n", - "print phone" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'jin': 1111, 'Joseph': 6584321, 'jack': 9465215, 'kim': 12312, 'lee': 9090}\n", - "\n", - "{}\n" - ] - } - ], - "prompt_number": 14 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \ub8e8\ud504\ub97c \uc774\uc6a9\ud55c \uc0ac\uc804 \ub0b4\uc6a9 \ucc38\uc870\n", - "***" + "9465215\n", + "{}\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804\uc758 \ubaa8\ub4e0 \ud0a4\uac12\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \ucc38\uc870\ud558\ub294 \ubc29\ubc95" + } + ], + "source": [ + "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "print ph.get('gslee', 5284) # 인수를 하나 더 제공하면 'gslee'가 없는 경우에 5284 리턴\n", + "print ph # 사전에는 변화가 없다\n", + "print \n", + "\n", + "print ph.popitem() # 임의의 아이템을 꺼낸다.\n", + "print ph\n", + "print\n", + "\n", + "print ph.popitem() # 임의의 아이템을 꺼낸다.\n", + "print ph \n", + "print\n", + "\n", + "print ph.pop('jack') # 키 값을 통해 해당 아이템을 지정하여 꺼낸다.\n", + "print ph" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'jin': 1111, 'Joseph': 6584321, 'jack': 9465215, 'kim': 12312, 'lee': 9090}\n", + "\n", + "{}\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "D = {'a':1, 'b':2, 'c':3}\n", - "for key in D.keys():\n", - " print key, D[key]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "a 1\n", - "c 3\n", - "b 2\n" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804 \uc790\uccb4\ub97c for\ub8e8\ud504\uc5d0 \ud65c\uc6a9\ud558\uba74 \ud0a4\uc5d0 \ub300\ud55c \ub8e8\ud504\uac00 \uc2e4\ud589\ub41c\ub2e4." + } + ], + "source": [ + "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "ph = {'kim':12312, 'lee': 9090}\n", + "phone.update(ph) # 사전 phone의 내용을 ph으로 추가 갱신\n", + "print phone\n", + "print\n", + "phone.clear() # 사전의 모든 입력을 없앤다.\n", + "print phone" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 루프를 이용한 사전 내용 참조\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전의 모든 키값을 순차적으로 참조하는 방법" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a 1\n", + "c 3\n", + "b 2\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "D = {'a':1, 'b':2, 'c':3}\n", - "for key in D:\n", - " print key, D[key]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "a 1\n", - "c 3\n", - "b 2\n" - ] - } - ], - "prompt_number": 16 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud0a4\uc640 \uac12\uc744 \ub3d9\uc2dc\uc5d0 \ucc38\uc870\ud558\ub824\uba74 D.items()\ub97c \ud65c\uc6a9\ud55c\ub2e4." + } + ], + "source": [ + "D = {'a':1, 'b':2, 'c':3}\n", + "for key in D.keys():\n", + " print key, D[key]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전 자체를 for루프에 활용하면 키에 대한 루프가 실행된다." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a 1\n", + "c 3\n", + "b 2\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for key, value in D.items():\n", - " print key, value" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "a 1\n", - "c 3\n", - "b 2\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804\uc5d0 \uc785\ub825\ub41c \uc544\uc774\ud15c\ub4e4\uc740 \uc77c\uc815\ud55c \uc21c\uc11c\uac00 \uc5c6\ub2e4.\n", - "- \ud0a4\uac12\uc5d0 \ub300\ud55c \uc815\ub82c\uc740 \uc544\uc774\ud15c\ub4e4\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubf51\uc740 \ub2e4\uc74c\uc5d0 \ud574\ub2f9 \ub9ac\uc2a4\ud2b8\uc5d0 \uc788\ub294 sort() \ud568\uc218\ub97c \ud65c\uc6a9\ud55c\ub2e4." + } + ], + "source": [ + "D = {'a':1, 'b':2, 'c':3}\n", + "for key in D:\n", + " print key, D[key]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 키와 값을 동시에 참조하려면 D.items()를 활용한다." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a 1\n", + "c 3\n", + "b 2\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "D = {'a':1, 'b':2, 'c':3}\n", - "items = D.items()\n", - "print items\n", - "print\n", + } + ], + "source": [ + "for key, value in D.items():\n", + " print key, value" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전에 입력된 아이템들은 일정한 순서가 없다.\n", + "- 키값에 대한 정렬은 아이템들을 리스트로 뽑은 다음에 해당 리스트에 있는 sort() 함수를 활용한다." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('a', 1), ('c', 3), ('b', 2)]\n", "\n", - "items.sort()\n", - "print items\n", - "print \n", + "[('a', 1), ('b', 2), ('c', 3)]\n", "\n", - "for k,v in items:\n", - " print k, v" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[('a', 1), ('c', 3), ('b', 2)]\n", - "\n", - "[('a', 1), ('b', 2), ('c', 3)]\n", - "\n", - "a 1\n", - "b 2\n", - "c 3\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + "a 1\n", + "b 2\n", + "c 3\n" ] } ], - "metadata": {} + "source": [ + "D = {'a':1, 'b':2, 'c':3}\n", + "items = D.items()\n", + "print items\n", + "print\n", + "\n", + "items.sort()\n", + "print items\n", + "print \n", + "\n", + "for k,v in items:\n", + " print k, v" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "celltoolbar": "Raw Cell Format", + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python13.ipynb b/python13.ipynb index 642488b..70ca12e 100644 --- a/python13.ipynb +++ b/python13.ipynb @@ -1,843 +1,809 @@ { - "metadata": { - "name": "", - "signature": "sha256:c387afc0482bfe7414617f8b0ed2da8e5a212c552ab5fb398cf546389f46f5e1" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 13. \ud30c\uc77c \uc785\ucd9c\ub825\n", - "***\n", - "***\n", - "- \ud30c\uc77c\uc744 \uc5f4\uc5b4\uc11c \uc77d\uace0, \uc4f0\uace0, \ub367\ubd99\uc774\ub294 \ubc29\ubc95\n", - " - open(filename, mode) \ub0b4\uc7a5 \ud568\uc218\ub85c filename \uc774\ub984\uc744 \uc9c0\ub2cc file \uac1d\uccb4\ub97c \uc5bb\ub294\ub2e4. \n", - " - \uc5bb\uc5b4\uc9c4 \ud30c\uc77c \uac1d\uccb4\uc5d0\uc11c \uc790\ub8cc\ub97c \uc77d\uac70\ub098, \uc4f0\uac70\ub098, \ub367\ubd99\uc774\ub294 \uc791\uc5c5 \uc218\ud589\n", - " - \ubaa8\ub4e0 \uc791\uc5c5\uc774 \ub05d\ub098\uba74 close()\ub97c \ud638\ucd9c\ud558\uc5ec \uc791\uc5c5 \ud504\ub85c\uc138\uc2a4\uc758 \uc790\uc6d0 \uc810\uc720 \ud574\uc81c" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud30c\uc77c \uc785\ucd9c\ub825 \ubc29\ubc95\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ud30c\uc77c \ucc98\ub9ac \ubaa8\ub4dc\uc758 \uc885\ub958\n", - "- open \ub0b4\uc7a5 \ud568\uc218\uc758 \ub450\ubc88\uc9f8 \uc778\uc790 mode \uc124\uba85\n", - " - \ub450\ubc88\uc9f8 \uc778\uc790 mode \uc0dd\ub7b5\uc2dc\uc5d0\ub294 \uc77d\uae30 \uc804\uc6a9(r) \ubaa8\ub4dc\ub85c \uc124\uc815\n", - " \n", - "| Mode | \uac04\ub2e8 \uc124\uba85 | \uc790\uc138\ud55c \uc124\uba85\n", - "|--------|-----------------------------|------------|\n", - "| 'r' | \uc77d\uae30 \uc804\uc6a9 (\uae30\ubcf8 \ubaa8\ub4dc) | \ud30c\uc77c \uac1d\uccb4\ub97c \uc77d\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uace0, \ud30c\uc77c \ud3ec\uc778\ud130\ub97c \ud30c\uc77c \ucc98\uc74c \uc704\uce58\uc5d0 \ub193\ub294\ub2e4.|\n", - "| 'w' | \uc4f0\uae30 \uc804\uc6a9 | \uc0c8\ub85c\uc6b4 \ud30c\uc77c\uc744 \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uac70\ub098 \ud574\ub2f9 \ud30c\uc77c\uc774 \uc774\ubbf8 \uc874\uc7ac\ud558\uba74 \ub0b4\uc6a9\uc744 \ubaa8\ub450 \uc5c6\uc5d0\uba74\uc11c \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uace0, \ud30c\uc77c \ud3ec\uc778\ud130\ub97c \ud30c\uc77c \ucc98\uc74c \uc704\uce58\uc5d0 \ub193\ub294\ub2e4. |\n", - "| 'a' | \ud30c\uc77c \ub05d\uc5d0 \ucd94\uac00 | \uc774\ubbf8 \uc874\uc7ac\ud558\ub294 \ud30c\uc77c\uc744 \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uac70\ub098 \ud30c\uc77c\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc73c\uba74 \uc0c8\ub86d\uac8c \ud30c\uc77c\uc744 \uc0dd\uc131\ud558\uba74\uc11c \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uace0, \ud30c\uc77c \ud3ec\uc778\ud130\ub97c \ud30c\uc77c\uc758 \ub9c8\uc9c0\ub9c9 \uc704\uce58\uc5d0 \ub193\ub294\ub2e4. \uadf8\ub798\uc11c, \uc774\ud6c4 \uc791\uc131\ub418\ub294 \ub0b4\uc6a9\uc740 \ud30c\uc77c\uc758 \ub4b7 \ubd80\ubd84\uc5d0 \ucd94\uac00\ub41c\ub2e4.|\n", - "\n", - " - \uc774\uc9c4 \ud30c\uc77c\ub85c \uc800\uc7a5\uc744 \uc704\ud574\uc11c\ub294 \uc544\ub798 \ubaa8\ub4dc \uc0ac\uc6a9\n", - "\n", - "| Mode | \uac04\ub2e8 \uc124\uba85 |\n", - "|--------|-----------------------------|\n", - "| 'rb' | \uc774\uc9c4 \ud30c\uc77c \uc77d\uae30 \uc804\uc6a9 |\n", - "| 'wb' | \uc774\uc9c4 \ud30c\uc77c \uc4f0\uae30 \uc804\uc6a9 |\n", - "| 'ab' | \uc774\uc9c4 \ud30c\uc77c \ub05d\uc5d0 \ucd94\uac00 |" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \ud30c\uc77c \uc4f0\uae30" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 13. 파일 입출력\n", + "***\n", + "***\n", + "- 파일을 열어서 읽고, 쓰고, 덧붙이는 방법\n", + " - open(filename, mode) 내장 함수로 filename 이름을 지닌 file 객체를 얻는다. \n", + " - 얻어진 파일 객체에서 자료를 읽거나, 쓰거나, 덧붙이는 작업 수행\n", + " - 모든 작업이 끝나면 close()를 호출하여 작업 프로세스의 자원 점유 해제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 파일 입출력 방법\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 파일 처리 모드의 종류\n", + "- open 내장 함수의 두번째 인자 mode 설명\n", + " - 두번째 인자 mode 생략시에는 읽기 전용(r) 모드로 설정\n", + " \n", + "| Mode | 간단 설명 | 자세한 설명\n", + "|--------|-----------------------------|------------|\n", + "| 'r' | 읽기 전용 (기본 모드) | 파일 객체를 읽기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다.|\n", + "| 'w' | 쓰기 전용 | 새로운 파일을 쓰기 모드로 생성하거나 해당 파일이 이미 존재하면 내용을 모두 없에면서 쓰기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다. |\n", + "| 'a' | 파일 끝에 추가 | 이미 존재하는 파일을 쓰기 모드로 생성하거나 파일이 존재하지 않으면 새롭게 파일을 생성하면서 쓰기 모드로 생성하고, 파일 포인터를 파일의 마지막 위치에 놓는다. 그래서, 이후 작성되는 내용은 파일의 뒷 부분에 추가된다.|\n", + "\n", + " - 이진 파일로 저장을 위해서는 아래 모드 사용\n", + "\n", + "| Mode | 간단 설명 |\n", + "|--------|-----------------------------|\n", + "| 'rb' | 이진 파일 읽기 전용 |\n", + "| 'wb' | 이진 파일 쓰기 전용 |\n", + "| 'ab' | 이진 파일 끝에 추가 |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 파일 쓰기" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "\n", - "print os.getcwd()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/git/python-e-learning\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = \"\"\"Its power: Python developers typically report \n", + } + ], + "source": [ + "import os\n", + "\n", + "print os.getcwd()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "s = \"\"\"Its power: Python developers typically report \n", + "they are able to develop applications in a half\n", + "to a tenth the amount of time it takes them to do\n", + "the same work in such languages as C.\"\"\"\n", + "f = open('t.txt', 'w')\n", + "f.write(s) # 문자열을 파일에 기록\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 파일 읽기\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Its power: Python developers typically report \n", "they are able to develop applications in a half\n", "to a tenth the amount of time it takes them to do\n", - "the same work in such languages as C.\"\"\"\n", - "f = open('t.txt', 'w')\n", - "f.write(s) # \ubb38\uc790\uc5f4\uc744 \ud30c\uc77c\uc5d0 \uae30\ub85d\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ud30c\uc77c \uc77d\uae30\n" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = file('t.txt') # f = open('t.txt', 'r')\uacfc \ub3d9\uc77c\n", - "s = f.read()\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Its power: Python developers typically report \n", - "they are able to develop applications in a half\n", - "to a tenth the amount of time it takes them to do\n", - "the same work in such languages as C.\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- close()\uc744 \ub9c8\uc9c0\ub9c9\uc5d0 \ud638\ucd9c\ud558\uc9c0 \uc54a\uc73c\uba74 \ud574\ub2f9 file \uac1d\uccb4\uac00 \ub2e4\ub978 \uac12\uc73c\ub85c \uce58\ud658\ub418\uac70\ub098 \ud504\ub85c\uadf8\ub7a8\uc774 \uc885\ub8cc\ub420 \ub54c \uc790\ub3d9\uc73c\ub85c close()\uac00 \ubd88\ub9ac\uc6cc\uc9c4\ub2e4.\n", - " - \ud558\uc9c0\ub9cc \uba85\uc2dc\uc801\uc73c\ub85c close()\ub97c \ud638\ucd9c\ud558\ub294 \uac83\uc744 \uad8c\uc7a5\ud568" + "the same work in such languages as C.\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ub77c\uc778 \ub2e8\uc704\ub85c \ud30c\uc77c \uc77d\uae30\n", - "- \ucd1d 4\uac00\uc9c0 \ubc29\ubc95 \uc874\uc7ac\n", - " - \ud30c\uc77c \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790(iterator) \uc774\uc6a9\ud558\uae30\n", - " - \ud30c\uc77c \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790\ub294 \uac01 \ub77c\uc778\ubcc4\ub85c \ub0b4\uc6a9\uc744 \uc77d\uc5b4\uc624\ub3c4\ub85d \uc124\uc815\ub418\uc5b4 \uc788\uc74c\n", - " - \ud30c\uc77c\uc744 \ub77c\uc778\ubcc4\ub85c \uc77d\ub294 \ubc29\ubc95 \uc911 \uac00\uc7a5 \ud6a8\uacfc\uc801\uc784\n", - " - readline(): \ud55c\ubc88\uc5d0 \ud55c\uc904\uc529 \uc77d\ub294\ub2e4.\n", - " - readlines(): \ud30c\uc77c \uc804\uccb4\ub97c \ub77c\uc778 \ub2e8\uc704\ub85c \ub04a\uc5b4\uc11c \ub9ac\uc2a4\ud2b8\uc5d0 \uc800\uc7a5\ud55c\ub2e4.\n", - " - xreadlines(): readlines()\uacfc \uc720\uc0ac\ud558\uc9c0\ub9cc \ud30c\uc77c \uc804\uccb4\ub97c \ud55c\uaebc\ubc88\uc5d0 \uc77d\uc9c0 \uc54a\uace0, \uc0c1\ud669\ubcc4\ub85c \ud544\uc694\ud55c \ub77c\uc778\ub9cc \uc77d\ub294\ub2e4. \ub300\uc6a9\ub7c9\uc758 \ud30c\uc77c\uc744 for \ubb38 \ub4f1\uc73c\ub85c \ub77c\uc778 \ub2e8\uc704\ub85c \uc77d\uc744 \ub54c \ud6a8\uc728\uc801\uc774\ub2e4. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc77c \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790 \uc0ac\uc6a9" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "i = 1\n", - "for line in f:\n", - " print i, \":\", line,\n", - " i += 1\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 : Its power: Python developers typically report \n", - "2 : they are able to develop applications in a half\n", - "3 : to a tenth the amount of time it takes them to do\n", - "4 : the same work in such languages as C.\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- readline() \uc0ac\uc6a9" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "line = f.readline()\n", - "i = 1\n", - "while line:\n", - " print i, \":\", line,\n", - " line = f.readline()\n", - " i += 1\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 : Its power: Python developers typically report \n", - "2 : they are able to develop applications in a half\n", - "3 : to a tenth the amount of time it takes them to do\n", - "4 : the same work in such languages as C.\n" - ] - } - ], - "prompt_number": 14 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- readlines() \uc0ac\uc6a9\n", - " - \uac01 \ub77c\uc778\uc744 \ubaa8\ub450 \uc77d\uc5b4\uc11c \uba54\ubaa8\ub9ac\uc5d0 \ub9ac\uc2a4\ud2b8\ub85c \uc800\uc7a5\ud568" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "print f.readlines()\n", - "print\n", - "\n", - "f.seek(0)\n", - "i = 1\n", - "for line in f.readlines():\n", - " print i, \":\", line,\n", - " i += 1\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['Its power: Python developers typically report \\n', 'they are able to develop applications in a half\\n', 'to a tenth the amount of time it takes them to do\\n', 'the same work in such languages as C.']\n", - "\n", - "1 : Its power: Python developers typically report \n", - "2 : they are able to develop applications in a half\n", - "3 : to a tenth the amount of time it takes them to do\n", - "4 : the same work in such languages as C.\n" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- xreadlines() \uc0ac\uc6a9" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "print f.xreadlines()\n", - "print\n", - "\n", - "f.seek(0)\n", - "i = 1\n", - "for line in f.xreadlines():\n", - " print i, \":\", line,\n", - " i += 1\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "1 : 0123456789abcdef\n" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-5 \ub77c\uc778 \ub2e8\uc704\ub85c \ud30c\uc77c \uc4f0\uae30" + } + ], + "source": [ + "f = file('t.txt') # f = open('t.txt', 'r')과 동일\n", + "s = f.read()\n", + "print s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- close()을 마지막에 호출하지 않으면 해당 file 객체가 다른 값으로 치환되거나 프로그램이 종료될 때 자동으로 close()가 불리워진다.\n", + " - 하지만 명시적으로 close()를 호출하는 것을 권장함" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 라인 단위로 파일 읽기\n", + "- 총 4가지 방법 존재\n", + " - 파일 객체의 반복자(iterator) 이용하기\n", + " - 파일 객체의 반복자는 각 라인별로 내용을 읽어오도록 설정되어 있음\n", + " - 파일을 라인별로 읽는 방법 중 가장 효과적임\n", + " - readline(): 한번에 한줄씩 읽는다.\n", + " - readlines(): 파일 전체를 라인 단위로 끊어서 리스트에 저장한다.\n", + " - xreadlines(): readlines()과 유사하지만 파일 전체를 한꺼번에 읽지 않고, 상황별로 필요한 라인만 읽는다. 대용량의 파일을 for 문 등으로 라인 단위로 읽을 때 효율적이다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파일 객체의 반복자 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 : Its power: Python developers typically report \n", + "2 : they are able to develop applications in a half\n", + "3 : to a tenth the amount of time it takes them to do\n", + "4 : the same work in such languages as C.\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- writelines(): \ub9ac\uc2a4\ud2b8 \uc548\uc5d0 \uc788\ub294 \uac01 \ubb38\uc790\uc5f4\uc744 \uc5f0\uc18d\ud574\uc11c \ud30c\uc77c\ub85c \ucd9c\ub825\ud55c\ub2e4." + } + ], + "source": [ + "f = open('t.txt')\n", + "i = 1\n", + "for line in f:\n", + " print i, \":\", line,\n", + " i += 1\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- readline() 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 : Its power: Python developers typically report \n", + "2 : they are able to develop applications in a half\n", + "3 : to a tenth the amount of time it takes them to do\n", + "4 : the same work in such languages as C.\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "lines = ['first line\\n', 'second line\\n', 'third line\\n']\n", - "f = open('t1.txt', 'w')\n", - "f.writelines(lines)\n", - "f.close()\n", + } + ], + "source": [ + "f = open('t.txt')\n", + "line = f.readline()\n", + "i = 1\n", + "while line:\n", + " print i, \":\", line,\n", + " line = f.readline()\n", + " i += 1\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- readlines() 사용\n", + " - 각 라인을 모두 읽어서 메모리에 리스트로 저장함" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Its power: Python developers typically report \\n', 'they are able to develop applications in a half\\n', 'to a tenth the amount of time it takes them to do\\n', 'the same work in such languages as C.']\n", "\n", - "f = open('t1.txt')\n", - "f.seek(0)\n", - "print f.read()\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "first line\n", - "second line\n", - "third line\n", - "\n" - ] - } - ], - "prompt_number": 20 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- write() \uc774\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubb38\uc790\uc5f4\uc744 \uac01 \ub77c\uc778\ubcc4\ub85c \ud30c\uc77c\ub85c \ucd9c\ub825\ud558\ub294 \ubc29\ubc95" + "1 : Its power: Python developers typically report \n", + "2 : they are able to develop applications in a half\n", + "3 : to a tenth the amount of time it takes them to do\n", + "4 : the same work in such languages as C.\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "lines = ['first line', 'second line', 'third line']\n", - "f = open('t1.txt', 'w')\n", - "f.write('\\n'.join(lines))\n", - "f.close()\n", + } + ], + "source": [ + "f = open('t.txt')\n", + "print f.readlines()\n", + "print\n", + "\n", + "f.seek(0)\n", + "i = 1\n", + "for line in f.readlines():\n", + " print i, \":\", line,\n", + " i += 1\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- xreadlines() 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", "\n", - "f = open('t1.txt')\n", - "f.seek(0)\n", - "print f.read()\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "first line\n", - "second line\n", - "third line\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud14d\uc2a4\ud2b8 \ud30c\uc77c t.txt\uc758 \ub2e8\uc5b4(\uacf5\ubc31\uc73c\ub85c \ubd84\ub9ac\ub41c \ubb38\uc790\uc5f4) \uc218\ub97c \ucd9c\ub825\ud558\ub294 \ubc29\ubc95" + "1 : 0123456789abcdef\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "s = f.read()\n", - "n = len(s.split())\n", - "print n\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "35\n" - ] - } - ], - "prompt_number": 40 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-6 \uae30\uc874 \ud30c\uc77c\uc5d0 \ub0b4\uc6a9 \ucd94\uac00" + } + ], + "source": [ + "f = open('t.txt')\n", + "print f.xreadlines()\n", + "print\n", + "\n", + "f.seek(0)\n", + "i = 1\n", + "for line in f.xreadlines():\n", + " print i, \":\", line,\n", + " i += 1\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 라인 단위로 파일 쓰기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- writelines(): 리스트 안에 있는 각 문자열을 연속해서 파일로 출력한다." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "first line\n", + "second line\n", + "third line\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('removeme.txt', 'w') # \ud30c\uc77c\uc758 \uc0dd\uc131\n", - "f.write('first line\\n')\n", - "f.write('second line\\n')\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 23 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('removeme.txt', 'a') # \ud30c\uc77c \ucd94\uac00 \ubaa8\ub4dc\ub85c \uc624\ud508\n", - "f.write('third line\\n')\n", - "f.close()\n", - "\n", - "f = open('removeme.txt') # \ud30c\uc77c \uc77d\uae30\n", - "print f.read()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "first line\n", - "second line\n", - "third line\n", - "\n" - ] - } - ], - "prompt_number": 24 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-7 \ud30c\uc77c \ub0b4 \uc784\uc758 \uc704\uce58\ub85c \uc811\uadfc\n", - "- \ud30c\uc77c \ud3ec\uc778\ud130 (pointer)\n", - " - \ud30c\uc77c \ub0b4\uc5d0\uc11c \ud604\uc7ac \uc704\uce58\ub97c \uac00\ub9ac\ud0a4\uace0 \uc788\uc74c\n", - "- \ud30c\uc77c \uc811\uadfc \ubc29\ubc95\n", - " - \uc21c\ucc28 \uc811\uadfc (\uae30\ubcf8 \ubc29\uc2dd): \ud30c\uc77c\uc744 \uc55e\uc5d0\uc11c \ubd80\ud130 \uc21c\ucc28\uc801\uc73c\ub85c \uc77d\uace0 \uc4f0\ub294 \ubc29\uc2dd\n", - " - \uc784\uc758 \uc811\uadfc: \ud30c\uc77c \ub0b4 \uc784\uc758 \uc704\uce58\uc5d0\uc11c \uc77d\uace0 \uc4f0\ub294 \ubc29\uc2dd\n", - " - \uc784\uc758 \uc811\uadfc\uc744 \uc704\ud55c file \uac1d\uccb4 \ud3ec\uc778\ud130 (pointer) \uad00\ub828 \uba54\uc18c\ub4dc\n", - " - seek(n): \ud30c\uc77c\uc758 \uac00\uc7a5 \uccab\ubc88\uc9f8 \uc704\uce58\uc5d0\uc11c n\ubc88\uc9f8 \ubc14\uc774\ud2b8\ub85c \ud3ec\uc778\ud130 \uc774\ub3d9\n", - " - tell(): \ud30c\uc77c \ub0b4 \ud604\uc7ac \ud3ec\uc778\ud130 \uc704\uce58\ub97c \ubc18\ud658" + } + ], + "source": [ + "lines = ['first line\\n', 'second line\\n', 'third line\\n']\n", + "f = open('t1.txt', 'w')\n", + "f.writelines(lines)\n", + "f.close()\n", + "\n", + "f = open('t1.txt')\n", + "f.seek(0)\n", + "print f.read()\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- write() 이용하여 여러 문자열을 각 라인별로 파일로 출력하는 방법" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "first line\n", + "second line\n", + "third line\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "name = 't.txt' \n", - "f = open(name, 'w+') # \uc77d\uace0 \uc4f0\uae30\ub85c \uc624\ud508, \ub2e8, \ud30c\uc77c\uc774 \uc774\ubbf8 \uc874\uc7ac\ud55c\ub2e4\uba74 \uae30\uc874 \ud30c\uc77c\uc740 \uc5c6\uc5b4\uc9c0\uace0 \ub2e4\uc2dc \uc0dd\uc131\ub41c\ub2e4.\n", - "s = '0123456789abcdef'\n", - "f.write(s)\n", - "\n", - "f.seek(5) # \uc2dc\uc791\ubd80\ud130 5\ubc14\uc774\ud2b8 \ud3ec\uc778\ud130 \uc774\ub3d9\n", - "print f.tell() # \ud604\uc7ac \uc704\uce58 \ub3cc\ub824\uc90c\n", - "print f.read(1) # 1\ubb38\uc790 \uc77d\uae30\n", - "print f.tell()\n", - "print" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "5\n", - "5\n", - "6\n", - "\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ud45c\uc900 \ucd9c\ub825 \ubc29\ud5a5 \uc804\ud658\n", - "***\n", - "\n", - "- sys \ubaa8\ub4c8\uc758 \ud45c\uc900 \uc785\ucd9c\ub825 \uad00\ub828 \uac1d\uccb4\n", - " - sys.stdout: \ud45c\uc900 \ucd9c\ub825\n", - " - sys.stderr: \ud45c\uc900 \uc5d0\ub7ec \ucd9c\ub825\n", - " - sys.stdin: \ud45c\uc900 \uc785\ub825\n", - "- \uc608\ub97c \ub4e4\uc5b4, sys.stdout\uc744 \ud30c\uc77c \uac1d\uccb4\ub85c \ubcc0\ud658\ud558\uba74 \ubaa8\ub4e0 \ud45c\uc900 \ucd9c\ub825(print \ucd9c\ub825)\uc740 \ud574\ub2f9 \ud30c\uc77c\ub85c \uc800\uc7a5\ub41c\ub2e4." + } + ], + "source": [ + "lines = ['first line', 'second line', 'third line']\n", + "f = open('t1.txt', 'w')\n", + "f.write('\\n'.join(lines))\n", + "f.close()\n", + "\n", + "f = open('t1.txt')\n", + "f.seek(0)\n", + "print f.read()\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 텍스트 파일 t.txt의 단어(공백으로 분리된 문자열) 수를 출력하는 방법" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "35\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ud45c\uc900 \ucd9c\ub825\uc744 \ud30c\uc77c\ub85c \uc800\uc7a5\ud558\uae30" + } + ], + "source": [ + "f = open('t.txt')\n", + "s = f.read()\n", + "n = len(s.split())\n", + "print n\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-6 기존 파일에 내용 추가" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "f = open('removeme.txt', 'w') # 파일의 생성\n", + "f.write('first line\\n')\n", + "f.write('second line\\n')\n", + "f.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "first line\n", + "second line\n", + "third line\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import sys\n", - "\n", - "f = open('t.txt', 'w')\n", - "stdout = sys.stdout # \ud45c\uc900 \ucd9c\ub825 \uc800\uc7a5\ud574 \ub450\uae30\n", - "sys.stdout = f # \ud30c\uc77c \uac1d\uccb4\ub85c \ud45c\uc900 \ucd9c\ub825 \ubcc0\uacbd\n", - "print 'Sample output'\n", - "print 'Good'\n", - "print 'Good'\n", - "f.close()\n", - "sys.stdout = stdout # \ud544\uc694\ud558\uba74 \ud45c\uc900 \ucd9c\ub825 \uc6d0\uc0c1 \ubcf5\uad6c" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "print f.read()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Sample output\n", - "Good\n", - "Good\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- print\ub97c \uc9c1\uc811 \uc774\uc6a9\ud558\uc5ec \ucd9c\ub825\uc744 \ub2e4\ub978 \uac1d\uccb4\ub85c \uc804\ud658\ud558\uae30 " + } + ], + "source": [ + "f = open('removeme.txt', 'a') # 파일 추가 모드로 오픈\n", + "f.write('third line\\n')\n", + "f.close()\n", + "\n", + "f = open('removeme.txt') # 파일 읽기\n", + "print f.read()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-7 파일 내 임의 위치로 접근\n", + "- 파일 포인터 (pointer)\n", + " - 파일 내에서 현재 위치를 가리키고 있음\n", + "- 파일 접근 방법\n", + " - 순차 접근 (기본 방식): 파일을 앞에서 부터 순차적으로 읽고 쓰는 방식\n", + " - 임의 접근: 파일 내 임의 위치에서 읽고 쓰는 방식\n", + " - 임의 접근을 위한 file 객체 포인터 (pointer) 관련 메소드\n", + " - seek(n): 파일의 가장 첫번째 위치에서 n번째 바이트로 포인터 이동\n", + " - tell(): 파일 내 현재 포인터 위치를 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n", + "5\n", + "6\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print >> sys.stderr, \"Warning, action field not supplied\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stderr", - "text": [ - "Warning, action field not supplied\n" - ] - } - ], - "prompt_number": 14 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub3d9\uc77c \ubc29\ubc95\uc73c\ub85c \ud45c\uc900 \ucd9c\ub825(print)\uc744 \ud30c\uc77c \uac1d\uccb4\ub85c \uc804\ud658" + } + ], + "source": [ + "name = 't.txt' \n", + "f = open(name, 'w+') # 읽고 쓰기로 오픈, 단, 파일이 이미 존재한다면 기존 파일은 없어지고 다시 생성된다.\n", + "s = '0123456789abcdef'\n", + "f.write(s)\n", + "\n", + "f.seek(5) # 시작부터 5바이트 포인터 이동\n", + "print f.tell() # 현재 위치 돌려줌\n", + "print f.read(1) # 1문자 읽기\n", + "print f.tell()\n", + "print" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 표준 출력 방향 전환\n", + "***\n", + "\n", + "- sys 모듈의 표준 입출력 관련 객체\n", + " - sys.stdout: 표준 출력\n", + " - sys.stderr: 표준 에러 출력\n", + " - sys.stdin: 표준 입력\n", + "- 예를 들어, sys.stdout을 파일 객체로 변환하면 모든 표준 출력(print 출력)은 해당 파일로 저장된다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 표준 출력을 파일로 저장하기" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "\n", + "f = open('t.txt', 'w')\n", + "stdout = sys.stdout # 표준 출력 저장해 두기\n", + "sys.stdout = f # 파일 객체로 표준 출력 변경\n", + "print 'Sample output'\n", + "print 'Good'\n", + "print 'Good'\n", + "f.close()\n", + "sys.stdout = stdout # 필요하면 표준 출력 원상 복구" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sample output\n", + "Good\n", + "Good\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt', 'w')\n", - "print >> f, 'spam string'\n", - "f.close()\n", - "\n", - "f = open('t.txt')\n", - "print f.read()\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "spam string\n", - "\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 StringIO \ubaa8\ub4c8 \uc0ac\uc6a9\ud558\uae30\n", - "- StringIO \ubaa8\ub4c8\uc758 StringIO \ud074\ub798\uc2a4 \uac1d\uccb4\n", - " - \ud30c\uc77c \uac1d\uccb4\ucc98\ub7fc \uc785\ucd9c\ub825 \uac00\ub2a5\ud55c \ubb38\uc790\uc5f4 \uac1d\uccb4\n", - " - StringIO\uc5d0 \uc9c0\uc6d0\ub418\ub294 \uba54\uc18c\ub4dc\ub294 \ud30c\uc77c \uac1d\uccb4\uac00 \uc9c0\uc6d0\ud558\ub294 \uba54\uc18c\ub4dc\uc640 \uac70\uc758 \ub3d9\uc77c\ud558\ub2e4.\n", - " - getvalue() \uba54\uc18c\ub4dc\n", - " - \ud604\uc7ac\uae4c\uc9c0 \ub2f4\uc544 \ub193\uc740 \uc804\uccb4 \ub0b4\uc6a9\uc744 \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "f = open('t.txt')\n", + "print f.read()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- print를 직접 이용하여 출력을 다른 객체로 전환하기 " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning, action field not supplied\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import StringIO\n", - "\n", - "f = StringIO.StringIO()\n", - "f.write(\"abc\")\n", - "f.seek(0)\n", - "s = f.read()\n", - "print s\n", - "print\n", - "\n", - "s2 = f.getvalue()\n", - "print s2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "abc\n", - "\n", - "abc\n" - ] - } - ], - "prompt_number": 29 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud45c\uc900 \ucd9c\ub825\uc73c\ub85c \ubb38\uc790\uc5f4 \uac1d\uccb4\uc5d0 \ub0b4\uc6a9 \uc791\uc131\ud558\uae30" + } + ], + "source": [ + "print >> sys.stderr, \"Warning, action field not supplied\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 동일 방법으로 표준 출력(print)을 파일 객체로 전환" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "spam string\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import sys\n", - "import StringIO\n", - "\n", - "stdout = sys.stdout # \ud45c\uc900 \ucd9c\ub825 \uc800\uc7a5\ud574 \ub450\uae30\n", - "sys.stdout = f = StringIO.StringIO() \n", - "\n", - "print type(f)\n", - "print 'Sample output'\n", - "print 'Good'\n", - "print 'Good'\n", - "\n", - "sys.stdout = stdout" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 30 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = f.getvalue()\n", + } + ], + "source": [ + "f = open('t.txt', 'w')\n", + "print >> f, 'spam string'\n", + "f.close()\n", + "\n", + "f = open('t.txt')\n", + "print f.read()\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 StringIO 모듈 사용하기\n", + "- StringIO 모듈의 StringIO 클래스 객체\n", + " - 파일 객체처럼 입출력 가능한 문자열 객체\n", + " - StringIO에 지원되는 메소드는 파일 객체가 지원하는 메소드와 거의 동일하다.\n", + " - getvalue() 메소드\n", + " - 현재까지 담아 놓은 전체 내용을 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abc\n", "\n", - "print 'Done-------'\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Done-------\n", - "\n", - "Sample output\n", - "Good\n", - "Good\n", - "\n" - ] - } - ], - "prompt_number": 31 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \ud30c\uc77c\ub85c\uc758 \uc9c0\uc18d \ubaa8\ub4c8\n", - "***" + "abc\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc9c0\uc18d\uc131(Persistence)\n", - " - \ud504\ub85c\uadf8\ub7a8 \ub0b4\uc5d0 \uc0dd\uc131\ub41c \uac01\uc885 \uac1d\uccb4\ub4e4\uc744 \ud574\ub2f9 \ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc \uc774\ud6c4\uc5d0\ub3c4 \uc874\uc7ac\ud558\uac8c \ub9cc\ub4e4\uace0, \uadf8\uac83\ub4e4\uc744 \ub3d9\uc77c\ud55c \ub610\ub294 \ub2e4\ub978 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uae30\ub2a5\n", - "- \uc9c0\uc18d\uc131 \uae30\ub2a5\uc744 \uc9c0\uc6d0\ud558\ub294 \ubaa8\ub4c8\n", - " - DBM \uad00\ub828 \ubaa8\ub4c8\n", - " - anydbm, dbm, gdbm, dbhash, dumbdbm\n", - " - anydbm: \uc2dc\uc2a4\ud15c\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud55c \ubaa8\ub4c8 \uc911 \uac00\uc7a5 \ucd5c\uc801\uc758 \ubaa8\ub4c8\uc744 \ubc18\ud658\ud568\n", - " - \uae30\ubcf8\uc801\uc73c\ub85c dumbdbm\uc744 \ubc18\ud658\ud55c\ub2e4\n", - " - \uc0ac\uc804 \uc790\ub8cc\ud615\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uacfc \ub3d9\uc77c\ud55c \ubc29\ubc95\uc73c\ub85c \uc0ac\uc6a9\n", - " - pickle \ubaa8\ub4c8\n", - " - \ud30c\uc774\uc36c\uc758 \uac1d\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \uc77c\ubc18\ud654\ub41c \uc9c0\uc18d\uc131 \ubaa8\ub4c8\n", - " - \ud30c\uc774\uc36c\uc758 \uae30\ubcf8 \uac1d\uccb4\ubfd0\ub9cc \uc544\ub2c8\ub77c \uc0ac\uc6a9\uc790 \uc815\uc758\uc758 \ubcf5\uc7a1\ud55c \uac1d\uccb4\ub3c4 \uc800\uc7a5 \uac00\ub2a5\n", - " - \uae30\ubcf8\uc801\uc73c\ub85c \ud14d\uc2a4\ud2b8 \ubaa8\ub4dc\ub85c \uc800\uc7a5\ud558\uc9c0\ub9cc \uc774\uc9c4 \ubaa8\ub4dc\ub85c\ub3c4 \uc800\uc7a5 \uac00\ub2a5" + } + ], + "source": [ + "import StringIO\n", + "\n", + "f = StringIO.StringIO()\n", + "f.write(\"abc\")\n", + "f.seek(0)\n", + "s = f.read()\n", + "print s\n", + "print\n", + "\n", + "s2 = f.getvalue()\n", + "print s2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 표준 출력으로 문자열 객체에 내용 작성하기" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import StringIO\n", + "\n", + "stdout = sys.stdout # 표준 출력 저장해 두기\n", + "sys.stdout = f = StringIO.StringIO() \n", + "\n", + "print type(f)\n", + "print 'Sample output'\n", + "print 'Good'\n", + "print 'Good'\n", + "\n", + "sys.stdout = stdout" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done-------\n", + "\n", + "Sample output\n", + "Good\n", + "Good\n", + "\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud53c\ud074\ub9c1(pickling) \ubaa8\ub4c8 \uc0ac\uc6a9\ud558\uae30" + } + ], + "source": [ + "s = f.getvalue()\n", + "\n", + "print 'Done-------'\n", + "print s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 파일로의 지속 모듈\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 지속성(Persistence)\n", + " - 프로그램 내에 생성된 각종 객체들을 해당 프로그램 종료 이후에도 존재하게 만들고, 그것들을 동일한 또는 다른 프로그램에서 사용하는 기능\n", + "- 지속성 기능을 지원하는 모듈\n", + " - DBM 관련 모듈\n", + " - anydbm, dbm, gdbm, dbhash, dumbdbm\n", + " - anydbm: 시스템에서 사용가능한 모듈 중 가장 최적의 모듈을 반환함\n", + " - 기본적으로 dumbdbm을 반환한다\n", + " - 사전 자료형을 사용하는 것과 동일한 방법으로 사용\n", + " - pickle 모듈\n", + " - 파이썬의 객체를 저장하는 일반화된 지속성 모듈\n", + " - 파이썬의 기본 객체뿐만 아니라 사용자 정의의 복잡한 객체도 저장 가능\n", + " - 기본적으로 텍스트 모드로 저장하지만 이진 모드로도 저장 가능" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 피클링(pickling) 모듈 사용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'jim': 6851325, 'Joseph': 6584321, 'jack': 9465215, 'tom': 4358382}\n", + "['string', 1234, 0.2345]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import pickle\n", - "\n", - "phone = {'tom':4358382, 'jack':9465215, 'jim':6851325, 'Joseph':6584321}\n", - "List = ['string', 1234, 0.2345]\n", - "Tuple = (phone, List) # \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804\uc758 \ubcf5\ud569 \uac1d\uccb4\n", - "\n", - "f = open('pickle.txt', 'w') # \ud30c\uc77c \uac1d\uccb4\ub97c \uc5bb\ub294\ub2e4.\n", - "\n", - "pickle.dump(Tuple, f) # \ud30c\uc77c\ub85c \ucd9c\ub825(pickling), \ubcf5\ud569 \uac1d\uccb4 \ucd9c\ub825 \n", - "f.close() \n", - "\n", - "f = open('pickle.txt') \n", - " \n", - "x,y = pickle.load(f) # \ud30c\uc77c\uc5d0\uc11c \uc77d\uc5b4\uc624\uae30. \ud29c\ud50c\uc758 \ub0b4\uc6a9\uc744 x, y\uc5d0 \ubc1b\ub294\ub2e4.\n", - "print x # \uc0ac\uc804\n", - "print y # \ub9ac\uc2a4\ud2b8" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'jim': 6851325, 'Joseph': 6584321, 'jack': 9465215, 'tom': 4358382}\n", - "['string', 1234, 0.2345]\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import pickle\n", - "\n", - "class Simple: # \uac00\uc7a5 \ub2e8\uc21c\ud55c \ud074\ub798\uc2a4\ub97c \uc815\uc758\n", - " pass\n", - "\n", - "s = Simple() # \uc778\uc2a4\ud134\uc2a4 \uac1d\uccb4 \uc0dd\uc131\n", - "s.count = 10 # \uc778\uc2a4\ud134\uc2a4 \uc774\ub984 \uacf5\uac04\uc5d0 \ubcc0\uc218 \uc0dd\uc131\n", - "\n", - "f = open('pickle2.txt', 'w')\n", - "pickle.dump(s, f) # \uc778\uc2a4\ud134\uc2a4 \uc800\uc7a5\n", - "f.close()\n", - "\n", - "f = open('pickle2.txt')\n", - "t = pickle.load(f) # \uc778\uc2a4\ud134\uc2a4 \uac00\uc838\uc624\uae30\n", - "print t.count" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "10\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "import pickle\n", + "\n", + "phone = {'tom':4358382, 'jack':9465215, 'jim':6851325, 'Joseph':6584321}\n", + "List = ['string', 1234, 0.2345]\n", + "Tuple = (phone, List) # 리스트, 튜플, 사전의 복합 객체\n", + "\n", + "f = open('pickle.txt', 'w') # 파일 객체를 얻는다.\n", + "\n", + "pickle.dump(Tuple, f) # 파일로 출력(pickling), 복합 객체 출력 \n", + "f.close() \n", + "\n", + "f = open('pickle.txt') \n", + " \n", + "x,y = pickle.load(f) # 파일에서 읽어오기. 튜플의 내용을 x, y에 받는다.\n", + "print x # 사전\n", + "print y # 리스트" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n" ] } ], - "metadata": {} + "source": [ + "import pickle\n", + "\n", + "class Simple: # 가장 단순한 클래스를 정의\n", + " pass\n", + "\n", + "s = Simple() # 인스턴스 객체 생성\n", + "s.count = 10 # 인스턴스 이름 공간에 변수 생성\n", + "\n", + "f = open('pickle2.txt', 'w')\n", + "pickle.dump(s, f) # 인스턴스 저장\n", + "f.close()\n", + "\n", + "f = open('pickle2.txt')\n", + "t = pickle.load(f) # 인스턴스 가져오기\n", + "print t.count" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python05.ipynb b/python3.6/python05.ipynb index 2d41fdc..18ed988 100644 --- a/python3.6/python05.ipynb +++ b/python3.6/python05.ipynb @@ -1,734 +1,720 @@ { - "metadata": { - "name": "", - "signature": "sha256:7cd7f3f2924b132a4999a6a44ccc57b6b4603c593c705bafa1e22da085a44552" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 5. \ud30c\uc774\uc36c\uc758 \uac01\uc885 \uc5f0\uc0b0\uc790\n", - "***\n", - "***" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 5. 파이썬의 각종 연산자\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 산술 연산자\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 연산자 | 우선순위 | 설명 | 결합순서 |\n", + "|:------:|:------:|:-----------------:|:-----------:|\n", + "| +, - | 1 | 단항 연산자 | - | \n", + "| ** | 2 |지수 연산자 | 왼쪽 <- 오른쪽 | \n", + "| *,/,%,// | 3 |곱하기,나누기,나머지,몫 | 왼쪽 -> 오른쪽 | \n", + "| +, - | 4 |더하기,빼기 | 왼쪽 -> 오른쪽 |" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n", + "1\n", + "1\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \uc0b0\uc220 \uc5f0\uc0b0\uc790\n", - "***" + } + ], + "source": [ + "print(2 ** 3)\n", + "print(5 % 2)\n", + "print(-5 % 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n", + "8.0\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "| \uc5f0\uc0b0\uc790 | \uc6b0\uc120\uc21c\uc704 | \uc124\uba85 | \uacb0\ud569\uc21c\uc11c |\n", - "|:------:|:------:|:-----------------:|:-----------:|\n", - "| +, - | 1 | \ub2e8\ud56d \uc5f0\uc0b0\uc790 | - | \n", - "| ** | 2 |\uc9c0\uc218 \uc5f0\uc0b0\uc790 | \uc67c\ucabd <- \uc624\ub978\ucabd | \n", - "| *,/,%,// | 3 |\uacf1\ud558\uae30,\ub098\ub204\uae30,\ub098\uba38\uc9c0,\ubaab | \uc67c\ucabd -> \uc624\ub978\ucabd | \n", - "| +, - | 4 |\ub354\ud558\uae30,\ube7c\uae30 | \uc67c\ucabd -> \uc624\ub978\ucabd |" + } + ], + "source": [ + "print(3 + 5)\n", + "print(3 + 5.0) # 정수 + 실수의 결과는 실수" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.5\n", + "2.5\n", + " \n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 2 ** 3\n", - "print 5 % 2\n", - "print -5 % 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "8\n", - "1\n", - "1\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 3 + 5\n", - "print 3 + 5.0 # \uc815\uc218 + \uc2e4\uc218\uc758 \uacb0\uacfc\ub294 \uc2e4\uc218" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "8\n", - "8.0\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 5 / 2.0 # \uc815\uc218 / \uc2e4\uc218\uc758 \uacb0\uacfc\ub294 \uc2e4\uc218\n", - "print 5 / 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2.5\n", - "2\n" - ] - } - ], - "prompt_number": 64 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 5 / 3\n", - "b = 5 % 3\n", - "\n", - "print a, b\n", - "\n", - "print divmod(5,3)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 2\n", - "(1, 2)\n" - ] - } - ], - "prompt_number": 44 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 5 / 3\n", - "print 5 // 3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1\n", - "1\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub2e8\ud56d \uc5f0\uc0b0\uc790(-)\uc758 \uc6b0\uc120\uc21c\uc704\uac00 \uc774\ud56d \uc5f0\uc0b0\uc790(/)\uc758 \uc6b0\uc120\uc21c\uc704\ubcf4\ub2e4 \ub192\ub2e4" + } + ], + "source": [ + "a = 5 / 2.0\n", + "b = 5 / 2\n", + "print(a) # 정수 / 실수의 결과\n", + "print(b) # 정수 / 정수의 결과\n", + "# 2.5\n", + "# 2\n", + "print(type(a), type(b))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.6666666666666667 2\n", + "(1, 2)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print -7/4 # -7\uc744 4\ub85c \ub098\ub208\ub2e4\n", - "print -(7/4) " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "-2\n", - "-1\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 2 + 3 * 4\n", - "print (2 + 3) * 4" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "14\n", - "20\n" - ] - } - ], - "prompt_number": 51 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 4 / 2 * 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "4\n" - ] - } - ], - "prompt_number": 53 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- ** \uc5f0\uc0b0\uc790\uc758 \uacb0\ud569\uc21c\uc11c\ub294 \uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd" + } + ], + "source": [ + "a = 5 / 3\n", + "b = 5 % 3\n", + "\n", + "print(a, b)\n", + "print(divmod(5,3))\n", + "# 1 2\n", + "# (1, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.6666666666666667\n", + "1\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 2 ** 3 ** 2\n", - "print (2 ** 3) ** 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "512\n", - "64\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \uad00\uacc4 \uc5f0\uc0b0\uc790\n", - "***" + } + ], + "source": [ + "print(5 / 3)\n", + "print(5 // 3)\n", + "# 1\n", + "# 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 단항 연산자(-)의 우선순위가 이항 연산자(/)의 우선순위보다 높다" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-1.75\n", + "-1.75\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uad00\uacc4 \uc5f0\uc0b0\uc790: \uac1d\uccb4\uac00 \uc9c0\ub2cc \uac12\uc758 \ud06c\uae30(\ub300\uc18c)\ub97c \ube44\uad50\ud558\uc5ec True \ub610\ub294 False\ub97c \ubc18\ud658\ud568" + } + ], + "source": [ + "print(-7/4) # -7을 4로 나눈다\n", + "print(-(7/4)) \n", + "# -2\n", + "# -1" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14\n", + "20\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 6 == 9\n", - "print 6 != 9\n", - "print 1 > 3\n", - "print 4 <= 5\n", - "\n", - "a = 5\n", - "b = 10\n", - "print a < b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "True\n", - "False\n", - "True\n", - "True\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 5\n", - "b = 10\n", - "print 0 < a < b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 5\n", - "b = 10\n", - "print 0 < a and a < b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubb38\uc790\uc5f4, \ud29c\ud50c, \ub9ac\uc2a4\ud2b8\uc758 \uad00\uacc4 \uc5f0\uc0b0 \ube44\uad50\ub294 \uc77c\ubc18 \uc0ac\uc804 \uc21c\uc11c \n", - "- \uc0ac\uc804\uc5d0\uc11c \uc55e\uc5d0 \ub098\uc624\ub294 \uac12\uc774 \uc791\uc740 \uac12\uc73c\ub85c \ud3c9\uac00\ub428" + } + ], + "source": [ + "print(2 + 3 * 4)\n", + "print((2 + 3) * 4)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4.0\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 'abcd' > 'abd' \n", - "print (1, 2, 4) < (2, 1, 0) \n", - "print [1, 3, 2] == [1, 2, 3]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "True\n", - "False\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc11c\ub85c \ub2e4\ub978 \uc790\ub8cc\ud615\uac04\uc758 \ud06c\uae30 \uad00\uacc4\n", - " - \uc22b\uc790 < \uc0ac\uc804 < \ub9ac\uc2a4\ud2b8 < \ubb38\uc790\uc5f4 < \ud29c\ud50c" + } + ], + "source": [ + "print(4 / 2 * 2)\n", + "# 4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- ** 연산자의 결합순서는 오른쪽에서 왼쪽" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "512\n", + "64\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 9999999999999999999999L < 'abc'\n", - "print {3:2} < [1,2,3] < (1,2,3)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n" - ] - } - ], - "prompt_number": 64 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1,2,3, 'abc', 'a', 'z', (1,2,3), [1,2,3], {1:2}, ['abc']]\n", - "L.sort()\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2, 3, {1: 2}, [1, 2, 3], ['abc'], 'a', 'abc', 'z', (1, 2, 3)]\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = [1,2,3]\n", - "y = [1,2,3]\n", - "z = y\n", - "\n", - "print x == y\n", - "print x == z\n", - "print x is y\n", - "print x is z\n", - "print y is z" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n", - "False\n", - "False\n", - "True\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/objectIdentity.png)" + } + ], + "source": [ + "print(2 ** 3 ** 2)\n", + "print((2 ** 3) ** 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 관계 연산자\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 관계 연산자: 객체가 지닌 값의 크기(대소)를 비교하여 True 또는 False를 반환함" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "False\n", + "True\n", + "True\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \ub17c\ub9ac \uc5f0\uc0b0\uc790 (or \ubd80\uc6b8 \uc5f0\uc0b0\uc790)\n", - "***" + } + ], + "source": [ + "print(6 == 9)\n", + "print(6 != 9)\n", + "print(1 > 3)\n", + "print(4 <= 5)\n", + "\n", + "a = 5\n", + "b = 10\n", + "print(a < b)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud53c\uc5f0\uc0b0\uc790\uc758 \uac12\uc73c\ub85c \uc9c4\ub9ac\uac12\uc778 True \ub610\ub294 False\uc744 \ucde8\ud558\uc5ec \ub17c\ub9ac \uc801\uc778 \uacc4\uc0b0\uc744 \uc218\ud589\ud558\ub294 \uc5f0\uc0b0\uc790\n", - " - and\n", - " - or\n", - " - not\n", - "- [\uc8fc\uc758] \ub17c\ub9ac \uc5f0\uc0b0\uc790 \uc790\uccb4\uac00 \uac12\uc744 \ubc18\ud658\ud558\uc9c0\ub294 \uc54a\ub294\ub2e4. \n", - " - \ub17c\ub9ac \uc5f0\uc0b0\uc744 \ub530\ub77c \ucd5c\uc885\uc801\uc73c\ub85c \ud3c9\uac00(Evaluation)\ub418\uc5b4\uc9c4 \uac12\uc774 \ubc18\ud658\ub41c\ub2e4." + } + ], + "source": [ + "a = 5\n", + "b = 10\n", + "print(0 < a < b)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 20\n", - "b = 30\n", - "print a > 10 and b < 50" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc9c4\ub9ac\uac12\uc5d0 \ud574\ub2f9\ud558\ub294 True\uc640 False\ub294 \ub2e4\ub978 \uc0ac\uce59\uc5f0\uc0b0\uc790\ub97c \ub9cc\ub098\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ud3c9\uac00\ub428\n", - " - True: 1\n", - " - False: 0" + } + ], + "source": [ + "a = 5\n", + "b = 10\n", + "print(0 < a and a < b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열, 튜플, 리스트의 관계 연산 비교는 일반 사전 순서 \n", + "- 사전에서 앞에 나오는 값이 작은 값으로 평가됨" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "False\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print True + 1\n", - "print False + 1\n", - "print False * 75\n", - "print True * 75" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "1\n", - "0\n", - "75\n" - ] - } - ], - "prompt_number": 77 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- bool() \ub0b4\uc7a5 \ud568\uc218\ub97c \uc774\uc6a9\ud574\uc11c \uc218\uce58 \uac12\uc744 \uc9c4\ub9ac \uac12\uc73c\ub85c \uad50\ud658 \uac00\ub2a5" + } + ], + "source": [ + "print('abcd' > 'abd') \n", + "print((1, 2, 4) < (2, 1, 0)) \n", + "print([1, 3, 2] == [1, 2, 3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 서로 다른 자료형간의 크기 관계\n", + " - 숫자 < 사전 < 리스트 < 문자열 < 튜플" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'<' not supported between instances of 'int' and 'str'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m9999999999999999999999\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# True\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# True\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: '<' not supported between instances of 'int' and 'str'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print bool(0) # \uc815\uc218 0\uc740 \uac70\uc9d3\n", - "print bool(1)\n", - "print bool(100)\n", - "print bool(-100)\n", - "print\n", - "print bool(0.0) # \uc2e4\uc218 0.0\uc740 \uac70\uc9d3\n", - "print bool(0.1)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "True\n", - "True\n", - "True\n", - "\n", - "False\n", - "True\n" - ] - } - ], - "prompt_number": 82 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uac12\uc774 \uc5c6\ub294 \ube48 \uac1d\uccb4\ub098 None \uac1d\uccb4\ub294 False\ub85c \ud3c9\uac00\ub428" + } + ], + "source": [ + "print(9999999999999999999999 < 'abc')\n", + "print({3:2} < [1,2,3] < (1,2,3))\n", + "# True\n", + "# True" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'<' not supported between instances of 'str' and 'int'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'a'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'z'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: '<' not supported between instances of 'str' and 'int'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print bool('abc')\n", - "print bool('')\n", - "print\n", - "print bool([]) # \uacf5 \ub9ac\uc2a4\ud2b8\ub294 \uac70\uc9d3\n", - "print bool([1,2,3])\n", - "print \n", - "print bool(()) # \uacf5 \ud29c\ud50c\uc740 \uac70\uc9d3\n", - "print bool((1,2,3))\n", - "print \n", - "print bool({}) # \uacf5 \uc0ac\uc804\uc740 \uac70\uc9d3\n", - "print bool({1:2})\n", - "print\n", - "print bool(None) # None \uac1d\uccb4\ub294 \uac70\uc9d3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "False\n", - "\n", - "False\n", - "True\n", - "\n", - "False\n", - "True\n", - "\n", - "False\n", - "True\n", - "\n", - "False\n" - ] - } - ], - "prompt_number": 81 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 1 and 1\n", - "print 1 and 0\n", - "print 0 or 0 \n", - "print 1 or 0\n", - "print \n", - "print [] or 1 # [] \uac70\uc9d3\n", - "print [] or () # [], () \uac70\uc9d3\n", - "print [] and 1 # [] \uac70\uc9d3\uc774\ubbc0\ub85c 1\uc740 \ucc38\uc870\ud560 \ud544\uc694 \uc5c6\uc74c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1\n", - "0\n", - "0\n", - "1\n", - "\n", - "1\n", - "()\n", - "[]\n" - ] - } - ], - "prompt_number": 85 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 1 and 2 \n", - "print 1 or 2\n", - "print \n", - "print [[]] or 1 # [[]] \ucc38\uc73c\ub85c \uac04\uc8fc\n", - "print [{}] or 1 # [{}] \ucc38\uc73c\ub85c \uac04\uc8fc\n", - "print '' or 1 # \ube48 \ubb38\uc790\uc5f4('')\uc740 \uac70\uc9d3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "1\n", - "\n", - "[[]]\n", - "[{}]\n", - "1\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print not(True)\n", - "print not(1 and 2)\n", - "print not('' or 1)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "False\n", - "False\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## [\ucc38\uace0] \uc5f0\uc0b0\uc790 \uc6b0\uc120 \uc21c\uc704 \ud45c\n", - "***" + } + ], + "source": [ + "L = [1,2,3, 'abc', 'a', 'z', (1,2,3), [1,2,3], {1:2}, ['abc']]\n", + "L.sort()\n", + "print(L)\n", + "# [1, 2, 3, {1: 2}, [1, 2, 3], ['abc'], 'a', 'abc', 'z', (1, 2, 3)]" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "False\n", + "False\n", + "True\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc5f0\uc0b0\uc790 \uc6b0\uc120 \uc21c\uc704 \ud45c: https://wikidocs.net/1165\n", - "- \uc2e4\uc81c \ucf54\ub4dc \uac1c\ubc1c\uc744 \ud560 \ub54c\uc5d0\ub294 \uc5f0\uc0b0\uc790 \uc6b0\uc120 \uc21c\uc704\uc5d0 \ub9ce\uc740 \uc758\uc874 \uc5c6\uc774 \uad04\ud638(())\ub97c \uc801\uc808\ud558\uac8c \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ub192\uc774\ub294 \uac83\uc774 \uc88b\ub2e4." + } + ], + "source": [ + "x = [1,2,3]\n", + "y = [1,2,3]\n", + "z = y\n", + "\n", + "print(x == y)\n", + "print(x == z)\n", + "print(x is y)\n", + "print(x is z)\n", + "print(y is z)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/objectIdentity.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 논리 연산자 (or 부울 연산자)\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 피연산자의 값으로 진리값인 True 또는 False을 취하여 논리 적인 계산을 수행하는 연산자\n", + " - and\n", + " - or\n", + " - not\n", + "- [주의] 논리 연산자 자체가 값을 반환하지는 않는다. \n", + " - 논리 연산을 따라 최종적으로 평가(Evaluation)되어진 값이 반환된다." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "a = 20\n", + "b = 30\n", + "print(a > 10 and b < 50)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 진리값에 해당하는 True와 False는 다른 사칙연산자를 만나면 다음과 같이 평가됨\n", + " - True: 1\n", + " - False: 0" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "1\n", + "0\n", + "75\n" + ] + } + ], + "source": [ + "print(True + 1)\n", + "print(False + 1)\n", + "print(False * 75)\n", + "print(True * 75)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- bool() 내장 함수를 이용해서 수치 값을 진리 값으로 교환 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "True\n", + "True\n", + "\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "print(bool(0)) # 정수 0은 거짓\n", + "print(bool(1))\n", + "print(bool(100))\n", + "print(bool(-100))\n", + "print()\n", + "print(bool(0.0)) # 실수 0.0은 거짓\n", + "print(bool(0.1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 값이 없는 빈 객체나 None 객체는 False로 평가됨" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "\n", + "False\n", + "True\n", + "\n", + "False\n", + "True\n", + "\n", + "False\n", + "True\n", + "\n", + "False\n" + ] + } + ], + "source": [ + "print(bool('abc'))\n", + "print(bool(''))\n", + "print()\n", + "print(bool([])) # 공 리스트는 거짓\n", + "print(bool([1,2,3]))\n", + "print()\n", + "print(bool(())) # 공 튜플은 거짓\n", + "print(bool((1,2,3)))\n", + "print()\n", + "print(bool({})) # 공 사전은 거짓\n", + "print(bool({1:2}))\n", + "print()\n", + "print(bool(None)) # None 객체는 거짓" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "0\n", + "0\n", + "1\n", + "\n", + "1\n", + "()\n", + "[]\n" + ] + } + ], + "source": [ + "print(1 and 1)\n", + "print(1 and 0)\n", + "print(0 or 0)\n", + "print(1 or 0)\n", + "print()\n", + "print([] or 1) # [] 거짓\n", + "print([] or ()) # [], () 거짓\n", + "print([] and 1) # [] 거짓이므로 1은 참조할 필요 없음" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "1\n", + "\n", + "[[]]\n", + "[{}]\n", + "1\n" + ] + } + ], + "source": [ + "print(1 and 2)\n", + "print(1 or 2)\n", + "print()\n", + "print([[]] or 1) # [[]] 참으로 간주\n", + "print([{}] or 1) # [{}] 참으로 간주\n", + "print('' or 1) # 빈 문자열('')은 거짓" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "False\n", + "False\n" ] } ], - "metadata": {} + "source": [ + "print(not(True))\n", + "print(not(1 and 2))\n", + "print(not('' or 1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## [참고] 연산자 우선 순위 표\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 연산자 우선 순위 표: https://wikidocs.net/1165\n", + "- 실제 코드 개발을 할 때에는 연산자 우선 순위에 많은 의존 없이 괄호(())를 적절하게 사용하여 코드의 가독성을 높이는 것이 좋다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" } - ] -} \ No newline at end of file + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python06.ipynb b/python3.6/python06.ipynb index 5b723b0..3d56c0f 100644 --- a/python3.6/python06.ipynb +++ b/python3.6/python06.ipynb @@ -1,1104 +1,1050 @@ { - "metadata": { - "name": "", - "signature": "sha256:6f27a552542890768672efb0fe113387ea0d8e173bd95364d1cec38a4bfa7a1c" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 6. 제어문과 함수 기초\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 파이썬 제어문\n", + "***" + ] + }, { - "cells": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 들여쓰기와 제어문" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파이썬은 들여쓰기를 강제하여 코드의 가독성을 높인다.\n", + "- 가장 바깥쪽의 코드는 반드시 1열에 시작한다.\n", + "- 블록 내부에 있는 statement들은 동일한 열에 위치해야 한다.\n", + "- 블록의 끝은 들여쓰기가 끝나는 부분으로 간주된다.\n", + " - python에는 {, }, begin, end 등의 키워드가 존재하지 않는다.\n", + "- 들여쓰기를 할 때에는 탭과 공백을 섞어 쓰지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 6. \uc81c\uc5b4\ubb38\uacfc \ud568\uc218 \uae30\ucd08\n", - "***\n", - "***" + "ename": "IndentationError", + "evalue": "unexpected indent (, line 2)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m a = 1 # 실패\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" ] - }, + } + ], + "source": [ + "a = 1 # 성공\n", + " a = 1 # 실패" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud30c\uc774\uc36c \uc81c\uc5b4\ubb38\n", - "***" + "ename": "IndentationError", + "evalue": "unexpected indent (, line 3)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m3\u001b[0m\n\u001b[0;31m print('really?')\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" ] - }, + } + ], + "source": [ + "if a > 1:\n", + " print('big')\n", + " print('really?')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 if문\n", + "- if문의 형식\n", + "\n", + "> if 조건식1:\n", + "\n", + ">   statements\n", + "\n", + "> elif 조건식2:\n", + "\n", + ">   statements\n", + "\n", + "> elif 조건식3:\n", + "\n", + ">   statements\n", + "\n", + "> else:\n", + "\n", + ">   statements\n", + "\n", + "- 조건식이나 else 다음에 콜론(:) 표기 필요\n", + "- 들여쓰기(indentation)를 잘 지켜야 함" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ub4e4\uc5ec\uc4f0\uae30\uc640 \uc81c\uc5b4\ubb38" + "name": "stdout", + "output_type": "stream", + "text": [ + "Congratulations!!! \n" ] - }, + } + ], + "source": [ + "score = 90\n", + "if score >= 90:\n", + " print('Congratulations!!! ')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc774\uc36c\uc740 \ub4e4\uc5ec\uc4f0\uae30\ub97c \uac15\uc81c\ud558\uc5ec \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ub192\uc778\ub2e4.\n", - "- \uac00\uc7a5 \ubc14\uae65\ucabd\uc758 \ucf54\ub4dc\ub294 \ubc18\ub4dc\uc2dc 1\uc5f4\uc5d0 \uc2dc\uc791\ud55c\ub2e4.\n", - "- \ube14\ub85d \ub0b4\ubd80\uc5d0 \uc788\ub294 statement\ub4e4\uc740 \ub3d9\uc77c\ud55c \uc5f4\uc5d0 \uc704\uce58\ud574\uc57c \ud55c\ub2e4.\n", - "- \ube14\ub85d\uc758 \ub05d\uc740 \ub4e4\uc5ec\uc4f0\uae30\uac00 \ub05d\ub098\ub294 \ubd80\ubd84\uc73c\ub85c \uac04\uc8fc\ub41c\ub2e4.\n", - " - python\uc5d0\ub294 {, }, begin, end \ub4f1\uc758 \ud0a4\uc6cc\ub4dc\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4.\n", - "- \ub4e4\uc5ec\uc4f0\uae30\ub97c \ud560 \ub54c\uc5d0\ub294 \ud0ed\uacfc \uacf5\ubc31\uc744 \uc11e\uc5b4 \uc4f0\uc9c0 \uc54a\ub294\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "Big\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 1 # \uc131\uacf5\n", - " a = 1 # \uc2e4\ud328" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "IndentationError", - "evalue": "unexpected indent (, line 2)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m a = 1 # \uc2e4\ud328\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" - ] - } - ], - "prompt_number": 160 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "if a > 1:\n", - " print 'big'\n", - " print 'really?'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "IndentationError", - "evalue": "unexpected indent (, line 3)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m3\u001b[0m\n\u001b[0;31m print 'really?'\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" - ] - } - ], - "prompt_number": 161 - }, + } + ], + "source": [ + "a = 10\n", + "if a > 5:\n", + " print('Big')\n", + "else:\n", + " print('Small')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- statement가 1개인 경우 조건식과 한 줄에 위치 가능 (추천하지는 않음)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 if\ubb38\n", - "- if\ubb38\uc758 \ud615\uc2dd\n", - "\n", - "> if \uc870\uac74\uc2dd1:\n", - "\n", - ">   statements\n", - "\n", - "> elif \uc870\uac74\uc2dd2:\n", - "\n", - ">   statements\n", - "\n", - "> elif \uc870\uac74\uc2dd3:\n", - "\n", - ">   statements\n", - "\n", - "> else:\n", - "\n", - ">   statements\n", - "\n", - "- \uc870\uac74\uc2dd\uc774\ub098 else \ub2e4\uc74c\uc5d0 \ucf5c\ub860(:) \ud45c\uae30 \ud544\uc694\n", - "- \ub4e4\uc5ec\uc4f0\uae30(indentation)\ub97c \uc798 \uc9c0\ucf1c\uc57c \ud568" + "name": "stdout", + "output_type": "stream", + "text": [ + "Big\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "score = 90\n", - "if score >= 90:\n", - " print 'Congratulations!!! '" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Congratulations!!! \n" - ] - } - ], - "prompt_number": 153 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10\n", - "if a > 5:\n", - " print 'Big'\n", - "else:\n", - " print 'Small'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Big\n" - ] - } - ], - "prompt_number": 61 - }, + } + ], + "source": [ + "a = 10\n", + "if a > 5: print('Big')\n", + "else: print('Small')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- statement\uac00 1\uac1c\uc778 \uacbd\uc6b0 \uc870\uac74\uc2dd\uacfc \ud55c \uc904\uc5d0 \uc704\uce58 \uac00\ub2a5 (\ucd94\ucc9c\ud558\uc9c0\ub294 \uc54a\uc74c)" + "name": "stdout", + "output_type": "stream", + "text": [ + "Negative\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10\n", - "if a > 5: print 'Big'\n", - "else: print 'Small'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Big\n" - ] - } - ], - "prompt_number": 155 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "n = -2\n", - "if n > 0:\n", - " print 'Positive'\n", - "elif n < 0:\n", - " print 'Negative'\n", - "else:\n", - " print 'Zero'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Negative\n" - ] - } - ], - "prompt_number": 156 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "order = 'spagetti'\n", - "\n", - "if order == 'spam':\n", - " price = 500\n", - "elif order == 'ham':\n", - " price = 700\n", - "elif order == 'egg':\n", - " price = 300\n", - "elif order == 'spagetti':\n", - " price = 900\n", - " \n", - "print price" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "900\n" - ] - } - ], - "prompt_number": 65 - }, + } + ], + "source": [ + "n = -2\n", + "if n > 0:\n", + " print('Positive')\n", + "elif n < 0:\n", + " print('Negative')\n", + "else:\n", + " print('Zero')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc704 \ucf54\ub4dc\uc640 \ub3d9\uc77c\ud55c dictionary \uc790\ub8cc\uad6c\uc870\ub97c \uc0ac\uc6a9\ud55c \ucf54\ub4dc" + "name": "stdout", + "output_type": "stream", + "text": [ + "900\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "order = 'spagetti'\n", - "menu = {'spam':500, 'ham':700, 'egg':300, 'spagetti':900}\n", - "price = menu[order]\n", - "print price" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "900\n" - ] - } - ], - "prompt_number": 66 - }, + } + ], + "source": [ + "order = 'spagetti'\n", + "\n", + "if order == 'spam':\n", + " price = 500\n", + "elif order == 'ham':\n", + " price = 700\n", + "elif order == 'egg':\n", + " price = 300\n", + "elif order == 'spagetti':\n", + " price = 900\n", + " \n", + "print(price)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위 코드와 동일한 dictionary 자료구조를 사용한 코드" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 for\ubb38\n", - "\n", - "> for <\ud0c0\uac9f> in <\ucee8\ud14c\uc774\ub108 \uac1d\uccb4>:\n", - "\n", - ">   statements\n", - "\n", - "> else:\n", - "\n", - ">   statements" + "name": "stdout", + "output_type": "stream", + "text": [ + "900\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = ['cat', 'cow', 'tiger']\n", - "for x in a:\n", - " print len(x), x" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3 cat\n", - "3 cow\n", - "5 tiger\n" - ] - } - ], - "prompt_number": 168 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in [1,2,3]:\n", - " print x," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 2 3\n" - ] - } - ], - "prompt_number": 169 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print range(10)\n", - "\n", - "for x in range(10):\n", - " print x," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", - "0 1 2 3 4 5 6 7 8 9\n" - ] - } - ], - "prompt_number": 172 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "sum = 0\n", - "for x in range(1, 11):\n", - " sum = sum + x\n", - " \n", - "print sum" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "55\n" - ] - } - ], - "prompt_number": 174 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "prod = 1\n", - "for x in range(1, 11):\n", - " prod = prod * x\n", - " \n", - "print prod" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3628800\n" - ] - } - ], - "prompt_number": 1 - }, + } + ], + "source": [ + "order = 'spagetti'\n", + "menu = {'spam':500, 'ham':700, 'egg':300, 'spagetti':900}\n", + "price = menu[order]\n", + "print(price)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 for문\n", + "\n", + "> for <타겟> in <컨테이너 객체>:\n", + "\n", + ">   statements\n", + "\n", + "> else:\n", + "\n", + ">   statements" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- enumerate() \ub0b4\uc7a5 \ud568\uc218: \ucee8\ud14c\uc774\ub108 \uac1d\uccb4\uac00 \uc9c0\ub2cc \uac01 \uc694\uc18c\uac12\ubfd0\ub9cc \uc544\ub2c8\ub77c \uc778\ub371\uc2a4 \uac12\ub3c4 \ud568\uaed8 \ubc18\ud658\ud55c\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "3 cat\n", + "3 cow\n", + "5 tiger\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l = ['cat', 'dog', 'bird', 'pig']\n", - "for k, animal in enumerate(l):\n", - " print k, animal" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 cat\n", - "1 dog\n", - "2 bird\n", - "3 pig\n" - ] - } - ], - "prompt_number": 67 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = ('cat', 'dog', 'bird', 'pig')\n", - "for k, animal in enumerate(t):\n", - " print k, animal" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 cat\n", - "1 dog\n", - "2 bird\n", - "3 pig\n" - ] - } - ], - "prompt_number": 68 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'c':'cat', 'd':'dog', 'b':'bird', 'p':'pig'}\n", - "for k, key in enumerate(d):\n", - " print k, key, d[key]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 p pig\n", - "1 c cat\n", - "2 b bird\n", - "3 d dog\n" - ] - } - ], - "prompt_number": 71 - }, + } + ], + "source": [ + "a = ['cat', 'cow', 'tiger']\n", + "for x in a:\n", + " print(len(x), x)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- break: \ub8e8\ud504\ub97c \ube60\uc838\ub098\uac04\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3 " ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in range(10):\n", - " if x > 3: \n", - " break\n", - " print x\n", - " \n", - "print 'done'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "done\n" - ] - } - ], - "prompt_number": 176 - }, + } + ], + "source": [ + "for x in [1,2,3]:\n", + " print(x, end=\" \")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- continue: \ub8e8\ud504 \ube14\ub85d \ub0b4\uc758 continue \uc774\ud6c4 \ubd80\ubd84\uc740 \uc218\ud589\ud558\uc9c0 \uc54a\uace0 \ub8e8\ud504\uc758 \uc2dc\uc791\ubd80\ubd84\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "range(0, 10)\n", + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "0 1 2 3 4 5 6 7 8 9 " ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in range(10):\n", - " if x < 8:\n", - " continue\n", - " print x\n", - " \n", - "print 'done'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "8\n", - "9\n", - "done\n" - ] - } - ], - "prompt_number": 2 - }, + } + ], + "source": [ + "print(range(10))\n", + "# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "print(list(range(10)))\n", + "\n", + "for x in range(10):\n", + " print(x, end=\" \")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- else: \ub8e8\ud504\uac00 break\uc5d0 \uc758\ud55c \uc911\ub2e8 \uc5c6\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ubaa8\ub450 \uc218\ud589\ub418\uba74 else \ube14\ub85d\uc774 \uc218\ud589\ub41c\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "55\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in range(10):\n", - " print x, # \ucf64\ub9c8(,) \ub54c\ubb38\uc5d0 \uc904\uc774 \ubc14\ub00c\uc9c0 \uc54a\ub294\ub2e4.\n", - "else:\n", - " print 'else block'\n", - "\n", - "print 'done'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 1 2 3 4 5 6 7 8 9 else block\n", - "done\n" - ] - } - ], - "prompt_number": 73 - }, + } + ], + "source": [ + "sum = 0\n", + "for x in range(1, 11):\n", + " sum = sum + x\n", + " \n", + "print(sum)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- break\uc5d0 \uc758\ud558\uc5ec \ub8e8\ud504\ub97c \ube60\uc838\ub098\uac00\uba74 else \ube14\ub85d\ub3c4 \uc218\ud589\ub418\uc9c0 \uc54a\ub294\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "3628800\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in range(10):\n", - " break\n", - " print x,\n", - "else:\n", - " print 'else block'\n", - " \n", - "print 'done'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "done\n" - ] - } - ], - "prompt_number": 179 - }, + } + ], + "source": [ + "prod = 1\n", + "for x in range(1, 11):\n", + " prod = prod * x\n", + " \n", + "print(prod)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- enumerate() 내장 함수: 컨테이너 객체가 지닌 각 요소값뿐만 아니라 인덱스 값도 함께 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- for \ub8e8\ud504\uc758 \uc911\ucca9" + "name": "stdout", + "output_type": "stream", + "text": [ + "0 cat\n", + "1 dog\n", + "2 bird\n", + "3 pig\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for x in range(2, 4):\n", - " for y in range(2, 10):\n", - " print x, '*', y, '=', x*y\n", - " print" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2 * 2 = 4\n", - "2 * 3 = 6\n", - "2 * 4 = 8\n", - "2 * 5 = 10\n", - "2 * 6 = 12\n", - "2 * 7 = 14\n", - "2 * 8 = 16\n", - "2 * 9 = 18\n", - "\n", - "3 * 2 = 6\n", - "3 * 3 = 9\n", - "3 * 4 = 12\n", - "3 * 5 = 15\n", - "3 * 6 = 18\n", - "3 * 7 = 21\n", - "3 * 8 = 24\n", - "3 * 9 = 27\n", - "\n" - ] - } - ], - "prompt_number": 182 - }, + } + ], + "source": [ + "l = ['cat', 'dog', 'bird', 'pig']\n", + "for k, animal in enumerate(l):\n", + " print(k, animal)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 while\ubb38" + "name": "stdout", + "output_type": "stream", + "text": [ + "0 cat\n", + "1 dog\n", + "2 bird\n", + "3 pig\n" ] - }, + } + ], + "source": [ + "t = ('cat', 'dog', 'bird', 'pig')\n", + "for k, animal in enumerate(t):\n", + " print(k, animal)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- while \uc870\uac74\uc2dd\uc774 \ub9cc\uc871\ud558\ub294 \ub3d9\uc548 while \ube14\ub85d\ub0b4\uc758 statements \ub4e4\uc744 \ubc18\ubcf5 \uc218\ud589\ud55c\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "0 c cat\n", + "1 d dog\n", + "2 b bird\n", + "3 p pig\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "count = 1\n", - "while count < 11:\n", - " print count\n", - " count = count + 1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1\n", - "2\n", - "3\n", - "4\n", - "5\n", - "6\n", - "7\n", - "8\n", - "9\n", - "10\n" - ] - } - ], - "prompt_number": 183 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "sum = 0\n", - "a = 0\n", - "while a < 10:\n", - " a = a + 1\n", - " sum = sum + a\n", - "print sum" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "55\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = 0\n", - "while x < 10:\n", - " print x, # \ucf64\ub9c8(,) \ub54c\ubb38\uc5d0 \uc904\uc774 \ubc14\ub00c\uc9c0 \uc54a\ub294\ub2e4.\n", - " x = x + 1\n", - "else:\n", - " print 'else block'\n", - "\n", - "print 'done'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 1 2 3 4 5 6 7 8 9 else block\n", - "done\n" - ] - } - ], - "prompt_number": 6 - }, + } + ], + "source": [ + "d = {'c':'cat', 'd':'dog', 'b':'bird', 'p':'pig'}\n", + "for k, key in enumerate(d):\n", + " print(k, key, d[key])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- break: 루프를 빠져나간다." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ud30c\uc774\uc36c \ud568\uc218 \uae30\ucd08\n", - "***" + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "done\n" ] - }, + } + ], + "source": [ + "for x in range(10):\n", + " if x > 3: \n", + " break\n", + " print(x)\n", + " \n", + "print('done')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- continue: 루프 블록 내의 continue 이후 부분은 수행하지 않고 루프의 시작부분으로 이동한다." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1. \ud568\uc218\uc758 \uc7a5\uc810 \ubc0f \ud568\uc218 \uc0ac\uc6a9\ubc95\n", - "- \ud568\uc218\uc758 \uc7a5\uc810\n", - " - \ud568\uc218\ub294 \ubc18\ubcf5\uc801\uc778 \ucf54\ub4dc\ub97c \uc5c6\uc5d0 \uc8fc\uc5b4 \ucf54\ub4dc\uc758 \uae38\uc774\ub97c \uc9e7\uac8c \ub9cc\ub4e4\uc5b4 \uc900\ub2e4.\n", - " - \ucf54\ub4dc\uc758 \uc720\uc9c0\ubcf4\uc218\ub97c \uc27d\uac8c \ub9cc\ub4e4\uc5b4 \uc900\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n", + "9\n", + "done\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a, b):\n", - " return a + b\n", - "\n", - "print add(3, 4)\n", - "\n", - "print add([1,2,3], [4,5,6])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "7\n", - "[1, 2, 3, 4, 5, 6]\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c = add(10, 30)\n", - "print c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "40\n" - ] - } - ], - "prompt_number": 5 - }, + } + ], + "source": [ + "for x in range(10):\n", + " if x < 8:\n", + " continue\n", + " print(x)\n", + " \n", + "print('done')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- else: 루프가 break에 의한 중단 없이 정상적으로 모두 수행되면 else 블록이 수행된다." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc774\ub984\uc5d0 \uc800\uc7a5\ub41c \ub808\ud37c\ub7f0\uc2a4\ub97c \ub2e4\ub978 \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud558\uc5ec \uadf8 \ubcc0\uc218\ub97c \uc774\uc6a9\ud55c \ud568\uc218 \ud638\ucd9c \uac00\ub2a5" + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 else block\n", + "done\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = add\n", - "print f(4, 5)\n", - "\n", - "print f\n", - "\n", - "print f is add" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9\n", - "\n", - "True\n" - ] - } - ], - "prompt_number": 6 - }, + } + ], + "source": [ + "for x in range(10):\n", + " print(x, end=\" \") \n", + "else:\n", + " print('else block')\n", + "\n", + "print('done')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- break에 의하여 루프를 빠져나가면 else 블록도 수행되지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218\uc758 \ubab8\uccb4\uc5d0\ub294 \ucd5c\uc18c\ud55c \ud55c\uac1c \uc774\uc0c1\uc758 statement\uac00 \uc874\uc7ac\ud574\uc57c \ud568\n", - " - \uadf8\ub7ec\ubbc0\ub85c, \uc544\ubb34\ub7f0 \ub0b4\uc6a9\uc774 \uc5c6\ub294 \ubab8\uccb4\ub97c \uc9c0\ub2cc \ud568\uc218\ub97c \ub9cc\ub4e4 \ub54c\uc5d0\ub294 pass \ub77c\ub294 \ud0a4\uc6cc\ub4dc\ub97c \ubab8\uccb4\uc5d0 \uc801\uc5b4\uc8fc\uc5b4\uc57c \ud568" + "name": "stdout", + "output_type": "stream", + "text": [ + "done\n" ] - }, + } + ], + "source": [ + "for x in range(10):\n", + " break\n", + " print(x, end=\" \")\n", + "else:\n", + " print('else block')\n", + " \n", + "print('done')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- for 루프의 중첩" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def simple():\n", - " pass\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "2 * 2 = 4\n", + "2 * 3 = 6\n", + "2 * 4 = 8\n", + "2 * 5 = 10\n", + "2 * 6 = 12\n", + "2 * 7 = 14\n", + "2 * 8 = 16\n", + "2 * 9 = 18\n", "\n", - "print simple()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "None\n" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218\uc5d0\uc11c \ub2e4\ub978 \ud568\uc218 \ud638\ucd9c \uac00\ub2a5" + "3 * 2 = 6\n", + "3 * 3 = 9\n", + "3 * 4 = 12\n", + "3 * 5 = 15\n", + "3 * 6 = 18\n", + "3 * 7 = 21\n", + "3 * 8 = 24\n", + "3 * 9 = 27\n", + "\n" ] - }, + } + ], + "source": [ + "for x in range(2, 4):\n", + " for y in range(2, 10):\n", + " print(x, '*', y, '=', x*y)\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 while문" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- while 조건식이 만족하는 동안 while 블록내의 statements 들을 반복 수행한다." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a, b):\n", - " return a + b\n", - "\n", - "def myabs(x):\n", - " if x < 0: \n", - " x = -x\n", - " return x\n", - "\n", - "def addabs(a, b):\n", - " c = add(a, b)\n", - " return myabs(c)\n", - "\n", - "print addabs(-5, -7)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "12\n" - ] - } - ], - "prompt_number": 2 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "10\n" + ] + } + ], + "source": [ + "count = 1\n", + "while count < 11:\n", + " print(count)\n", + " count = count + 1" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc778\uc790\uc758 \uc774\ub984\uacfc \ud568\uaed8 \uc778\uc790 \uac12\uc744 \ub118\uaca8\uc904 \uc218 \uc788\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "55\n" ] - }, + } + ], + "source": [ + "sum = 0\n", + "a = 0\n", + "while a < 10:\n", + " a = a + 1\n", + " sum = sum + a\n", + "print(sum)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def minus(a, b):\n", - " return a - b\n", - "print minus(a=12, b=20)\n", - "print minus(b=20, a=12)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "-8\n", - "-8\n" - ] - } - ], - "prompt_number": 7 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 else block\n", + "done\n" + ] + } + ], + "source": [ + "x = 0\n", + "while x < 10:\n", + " print(x, end=\" \") # 콤마(,) 때문에 줄이 바뀌지 않는다.\n", + " x = x + 1\n", + "else:\n", + " print('else block')\n", + "\n", + "print('done')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 파이썬 함수 기초\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1. 함수의 장점 및 함수 사용법\n", + "- 함수의 장점\n", + " - 함수는 반복적인 코드를 없에 주어 코드의 길이를 짧게 만들어 준다.\n", + " - 코드의 유지보수를 쉽게 만들어 준다." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc778\uc790\uc758 \ub514\ud3f4\ud2b8 \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "7\n", + "[1, 2, 3, 4, 5, 6]\n" ] - }, + } + ], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "print(add(3, 4))\n", + "\n", + "print(add([1,2,3], [4,5,6]))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def incr(x, y=1):\n", - " return x + y\n", - "\n", - "print incr(5)\n", - "\n", - "print incr(5, 10)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "6\n", - "15\n" - ] - } - ], - "prompt_number": 9 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "40\n" + ] + } + ], + "source": [ + "c = add(10, 30)\n", + "print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 이름에 저장된 레퍼런스를 다른 변수에 할당하여 그 변수를 이용한 함수 호출 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub450 \uac1c \uc774\uc0c1\uc758 \uac12\uc744 \ub3d9\uc2dc\uc5d0 \ubc18\ud658\ud560 \uc218 \uc788\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n", + "\n", + "True\n" ] - }, + } + ], + "source": [ + "f = add\n", + "print(f(4, 5))\n", + "\n", + "print(f)\n", + "\n", + "print(f is add)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수의 몸체에는 최소한 한개 이상의 statement가 존재해야 함\n", + " - 그러므로, 아무런 내용이 없는 몸체를 지닌 함수를 만들 때에는 pass 라는 키워드를 몸체에 적어주어야 함" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def calc(x, y):\n", - " return x + y, x - y, x * y, x / y\n", - "\n", - "print calc(10, 2)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "(12, 8, 20, 5)\n" - ] - } - ], - "prompt_number": 1 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] + } + ], + "source": [ + "def simple():\n", + " pass\n", + "\n", + "print(simple())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수에서 다른 함수 호출 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ud568\uc218 \ud638\ucd9c\uc2dc \ub3d9\uc801\uc778 \uc790\ub8cc\ud615 \uacb0\uc815" + "name": "stdout", + "output_type": "stream", + "text": [ + "12\n" ] - }, + } + ], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "def myabs(x):\n", + " if x < 0: \n", + " x = -x\n", + " return x\n", + "\n", + "def addabs(a, b):\n", + " c = add(a, b)\n", + " return myabs(c)\n", + "\n", + "print(addabs(-5, -7))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인자의 이름과 함께 인자 값을 넘겨줄 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc774\uc36c\uc5d0\uc11c\ub294 \ubaa8\ub4e0 \uac1d\uccb4\ub294 \ub3d9\uc801\uc73c\ub85c (\uc2e4\ud589\uc2dc\uac04\uc5d0) \uadf8 \ud0c0\uc785\uc774 \uacb0\uc815\ub41c\ub2e4.\n", - " - \ud568\uc218 \uc778\uc790\ub294 \ud568\uc218\uac00 \ud638\ucd9c\ub418\ub294 \uc21c\uac04 \ud574\ub2f9 \uc778\uc790\uc5d0 \uc804\ub2ec\ub418\ub294 \uac1d\uccb4\uc5d0 \ub530\ub77c \uadf8 \ud0c0\uc785\uc774 \uacb0\uc815\ub41c\ub2e4.\n", - " - \ud568\uc218 \ubab8\uccb4 \ub0b4\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \uc5ec\ub7ec \uac00\uc9c0 \uc5f0\uc0b0\uc790\ub4e4\uc740 \ud568\uc218 \ud638\ucd9c\uc2dc\uc5d0 \uacb0\uc815\ub41c \uac1d\uccb4 \ud0c0\uc785\uc5d0 \ub9de\uac8c \uc2e4\ud589\ub41c\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "-8\n", + "-8\n" ] - }, + } + ], + "source": [ + "def minus(a, b):\n", + " return a - b\n", + "print(minus(a=12, b=20))\n", + "print(minus(b=20, a=12))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인자의 디폴트 값을 지정할 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a, b):\n", - " return a + b\n", - "\n", - "c = add(1, 3.4)\n", - "d = add('dynamic', 'typing')\n", - "e = add(['list'], ['and', 'list'])\n", - "print c\n", - "print d\n", - "print e" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "4.4\n", - "dynamictyping\n", - "['list', 'and', 'list']\n" - ] - } - ], - "prompt_number": 3 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n", + "15\n" + ] + } + ], + "source": [ + "def incr(x, y=1):\n", + " return x + y\n", + "\n", + "print(incr(5))\n", + "\n", + "print(incr(5, 10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 두 개 이상의 값을 동시에 반환할 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \uc7ac\uadc0\uc801 \ud568\uc218 \ud638\ucd9c\n", - "- \uc7ac\uadc0(Recursive) \ud568\uc218: \ud568\uc218 \ubab8\uccb4\uc5d0\uc11c \uc790\uae30 \uc790\uc2e0\uc744 \ud638\ucd9c\ud558\ub294 \ud568\uc218\n", - " - \uc218\ud559\uc5d0\uc11c \uc810\ud654\uc2dd\uacfc \uc720\uc0ac\ud55c \ucf54\ub4dc\n", - " - \ubc18\ub4dc\uc2dc \uc885\uacb0 \uc870\uac74 \ubc0f \uc885\uacb0 \uc870\uac74\uc774 \ub9cc\uc871\ud560 \ub54c\uc758 \ubc18\ud658 \uac12\uc774 \uc788\uc5b4\uc57c \ud55c\ub2e4.\n", - "\n", - "- 1\ubd80\ud130 N\uae4c\uc9c0 \ub354\ud558\ub294 \uc7ac\uadc0 \ud568\uc218" + "name": "stdout", + "output_type": "stream", + "text": [ + "(12, 8, 20, 5.0)\n" ] - }, + } + ], + "source": [ + "def calc(x, y):\n", + " return x + y, x - y, x * y, x / y\n", + "\n", + "print(calc(10, 2))\n", + "# (12, 8, 20, 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 함수 호출시 동적인 자료형 결정" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파이썬에서는 모든 객체는 동적으로 (실행시간에) 그 타입이 결정된다.\n", + " - 함수 인자는 함수가 호출되는 순간 해당 인자에 전달되는 객체에 따라 그 타입이 결정된다.\n", + " - 함수 몸체 내에서 사용되는 여러 가지 연산자들은 함수 호출시에 결정된 객체 타입에 맞게 실행된다." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "def sum(N):\n", - " if N == 1: # \uc885\uacb0 \uc870\uac74\n", - " return 1 # \uc885\uacb0 \uc870\uac74\uc774 \ub9cc\uc871\ud560 \ub54c\uc758 \ubc18\ud658 \uac12\n", - " return N + sum(N-1) # \uc7ac\uadc0 \ud638\ucd9c\n", - "\n", - "print sum(10)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "55\n" - ] - } - ], - "prompt_number": 4 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "4.4\n", + "dynamictyping\n", + "['list', 'and', 'list']\n" + ] + } + ], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "c = add(1, 3.4)\n", + "d = add('dynamic', 'typing')\n", + "e = add(['list'], ['and', 'list'])\n", + "print(c)\n", + "print(d)\n", + "print(e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 재귀적 함수 호출\n", + "- 재귀(Recursive) 함수: 함수 몸체에서 자기 자신을 호출하는 함수\n", + " - 수학에서 점화식과 유사한 코드\n", + " - 반드시 종결 조건 및 종결 조건이 만족할 때의 반환 값이 있어야 한다.\n", + "\n", + "- 1부터 N까지 더하는 재귀 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + "name": "stdout", + "output_type": "stream", + "text": [ + "55\n" ] } ], - "metadata": {} + "source": [ + "def sum(N):\n", + " if N == 1: # 종결 조건\n", + " return 1 # 종결 조건이 만족할 때의 반환 값\n", + " return N + sum(N-1) # 재귀 호출\n", + "\n", + "print(sum(10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python07.ipynb b/python3.6/python07.ipynb index 91eb40f..df7b962 100644 --- a/python3.6/python07.ipynb +++ b/python3.6/python07.ipynb @@ -31,10 +31,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "s = 'abcdef'\n", @@ -66,10 +64,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -87,35 +83,34 @@ "source": [ "s = 'abcdef'\n", "l = [100, 200, 300]\n", - "print s[0]\n", - "print s[1]\n", - "print s[-1]\n", - "print\n", - "print l[1]\n", + "print(s[0])\n", + "print(s[1])\n", + "print(s[-1])\n", + "print()\n", + "print(l[1])\n", "l[1] = 900\n", - "print l[1]" + "print(l[1])" ] }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "ename": "IndexError", "evalue": "list index out of range", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] } ], "source": [ - "print l[100]" + "print(l[100])" ] }, { @@ -128,10 +123,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -151,13 +144,13 @@ "s = 'abcdef'\n", "L = [100, 200, 300]\n", "\n", - "print s[1:3]\n", - "print s[1:]\n", - "print s[:]\n", - "print s[-100:100]\n", - "print\n", - "print L[:-1] # L[:2] 와 동일\n", - "print L[:2]" + "print(s[1:3])\n", + "print(s[1:])\n", + "print(s[:])\n", + "print(s[-100:100])\n", + "print()\n", + "print(L[:-1]) # L[:2] 와 동일\n", + "print(L[:2])" ] }, { @@ -170,10 +163,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -186,8 +177,8 @@ ], "source": [ "s = 'abcd'\n", - "print s[::2] #step:2 - 각 원소들 사이의 거리가 인덱스 기준으로 2가 됨\n", - "print s[::-1] #step:-1 - 왼쪽 방향으로 1칸씩" + "print(s[::2]) #step:2 - 각 원소들 사이의 거리가 인덱스 기준으로 2가 됨\n", + "print(s[::-1]) #step:-1 - 왼쪽 방향으로 1칸씩" ] }, { @@ -199,10 +190,8 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -215,10 +204,10 @@ ], "source": [ "s = 'abc' + 'def'\n", - "print s\n", + "print(s)\n", "\n", "L = [1,2,3] + [4,5,6]\n", - "print L" + "print(L)" ] }, { @@ -230,10 +219,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -246,10 +233,10 @@ ], "source": [ "s = 'abc'\n", - "print s * 4\n", + "print(s * 4)\n", "\n", "L = [1,2,3]\n", - "print L * 2" + "print(L * 2)" ] }, { @@ -261,10 +248,8 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -279,20 +264,18 @@ ], "source": [ "s = 'abcde'\n", - "print 'c' in s\n", + "print('c' in s)\n", "\n", "t = (1,2,3,4,5)\n", - "print 2 in t\n", - "print 10 in t\n", - "print 10 not in t" + "print(2 in t)\n", + "print(10 in t)\n", + "print(10 not in t)" ] }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -306,10 +289,10 @@ } ], "source": [ - "print 'ab' in 'abcd'\n", - "print 'ad' in 'abcd'\n", - "print ' ' in 'abcd'\n", - "print ' ' in 'abcd '" + "print('ab' in 'abcd')\n", + "print('ad' in 'abcd')\n", + "print(' ' in 'abcd')\n", + "print(' ' in 'abcd ')" ] }, { @@ -321,10 +304,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -340,9 +321,9 @@ "s = 'abcde'\n", "l = [1,2,3]\n", "t = (1, 2, 3, 4)\n", - "print len(s)\n", - "print len(l)\n", - "print len(t)" + "print(len(s))\n", + "print(len(l))\n", + "print(len(t))" ] }, { @@ -354,22 +335,20 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "a b c d\n" + "a b c d " ] } ], "source": [ "for c in 'abcd':\n", - " print c," + " print(c, end=\" \")" ] }, { @@ -390,10 +369,8 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [], "source": [ "s = ''\n", @@ -404,10 +381,8 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, + "execution_count": 15, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -419,7 +394,7 @@ ], "source": [ "str4 = 'Don\\'t walk. \"Run\"'\n", - "print str4" + "print(str4)" ] }, { @@ -431,10 +406,8 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -448,7 +421,7 @@ "source": [ "long_str = \"This is a rather long string \\\n", "containing back slash and new line.\\nGood!\"\n", - "print long_str" + "print(long_str)" ] }, { @@ -460,10 +433,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 17, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -486,13 +457,13 @@ "the Perl scripting language, the Linux commnunity,\n", "long since past the pleasing shock of Perl's power,\n", "has been catching on to a different scripting animal -- Python.\"\"\"\n", - "print multiline\n", - "print\n", + "print(multiline)\n", + "print()\n", "ml = ''' While the rest of the world has been catching on to\n", "the Perl scripting language, the Linux commnunity,\n", "long since past the pleasing shock of Perl's power,\n", "has been catching on to a different scripting animal -- Python.'''\n", - "print ml" + "print(ml)" ] }, { @@ -516,10 +487,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 18, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -536,11 +505,11 @@ } ], "source": [ - "print '\\\\abc\\\\'\n", - "print\n", - "print 'abc\\tdef\\tghi'\n", - "print\n", - "print 'a\\nb\\nc'" + "print('\\\\abc\\\\')\n", + "print()\n", + "print('abc\\tdef\\tghi')\n", + "print()\n", + "print('a\\nb\\nc')" ] }, { @@ -552,10 +521,8 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, + "execution_count": 19, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -576,14 +543,14 @@ "str1 = 'First String'\n", "str2 = 'Second String'\n", "str3 = str1 + ' ' + str2\n", - "print str3\n", - "print str1 * 3\n", - "print\n", - "print str1[2]\n", - "print str1[1:-1]\n", - "print len(str1)\n", - "print\n", - "print str1[0:len(str1)]" + "print(str3)\n", + "print(str1 * 3)\n", + "print()\n", + "print(str1[2])\n", + "print(str1[1:-1])\n", + "print(len(str1))\n", + "print()\n", + "print(str1[0:len(str1)])" ] }, { @@ -595,18 +562,17 @@ }, { "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, + "execution_count": 20, + "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'str' object does not support item assignment", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstr1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'f'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstr1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'f'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" ] } @@ -617,18 +583,17 @@ }, { "cell_type": "code", - "execution_count": 48, - "metadata": { - "collapsed": false - }, + "execution_count": 21, + "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'str' object does not support item assignment", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstr1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstr1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" ] } @@ -647,10 +612,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, + "execution_count": 22, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -663,7 +626,7 @@ "source": [ "s = 'spam and egg'\n", "s = s[:4] + ', cheese, ' + s[5:]\n", - "print s" + "print(s)" ] }, { @@ -683,10 +646,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 23, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -694,37 +655,46 @@ "text": [ "Spam and Egg\n", "\n", - "\n", + "\n", "a\n", - "\n", + "\n", "bc\n", "\n", - "\n", + "\n", "abc\n" ] } ], "source": [ - "print u'Spam and Egg'\n", - "print \n", + "print(u'Spam and Egg')\n", + "print()\n", "a = 'a'\n", "b = u'bc'\n", - "print type(a)\n", - "print a\n", - "print type(b)\n", - "print b\n", - "print\n", + "print(type(a))\n", + "print(a)\n", + "print(type(b))\n", + "print(b)\n", + "print()\n", "c = a + b # 일반 문자열과 유니코드를 합치면 유니코드로 변환\n", - "print type(c)\n", - "print c" + "print(type(c))\n", + "print(c)\n", + "\n", + "\n", + "# Spam and Egg\n", + "\n", + "# \n", + "# a\n", + "# \n", + "# bc\n", + "\n", + "# \n", + "# abc" ] }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, + "execution_count": 24, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -735,60 +705,74 @@ } ], "source": [ - "print u'Spam \\uB610 Egg' # 문자열 내에 유티코드 이스케이프 문자인 \\uHHHH 사용가능, HHHH는 4자리 16진수 (unicode 포맷)" + "print(u'Spam \\uB610 Egg') # 문자열 내에 유티코드 이스케이프 문자인 \\uHHHH 사용가능, HHHH는 4자리 16진수 (unicode 포맷)" ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 27, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "한글\n" ] } ], "source": [ - "a = unicode('한글', 'utf-8') # '한글' 문자열의 인코딩 방식을 'utf-8'형태로 인식시키면서 해당 문자열을 unicode로 변환\n", - "print type(a)\n", - "print a" + "#a = unicode('한글', 'utf-8') # '한글' 문자열의 인코딩 방식을 'utf-8'형태로 인식시키면서 해당 문자열을 unicode로 변환\n", + "a = str('한글')\n", + "print(type(a))\n", + "print(a)\n", + "\n", + "\n", + "# \n", + "# 한글" ] }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, + "execution_count": 31, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "22\n", - "8\n", "8\n" ] + }, + { + "ename": "NameError", + "evalue": "name 'unicode' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'한글과 세종대왕'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0municode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'한글과 세종대왕'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#유니코드 타입의 문자열은 한글 문자열 길이를 올바르게 반환함\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mu'한글과 세종대왕'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'unicode' is not defined" + ] } ], "source": [ - "print len('한글과 세종대왕')\n", - "print len(unicode('한글과 세종대왕', 'utf-8')) #유니코드 타입의 문자열은 한글 문자열 길이를 올바르게 반환함\n", - "print len(u'한글과 세종대왕')" + "print(len('한글과 세종대왕'))\n", + "print(len(unicode('한글과 세종대왕', 'utf-8'))) #유니코드 타입의 문자열은 한글 문자열 길이를 올바르게 반환함\n", + "print(len(u'한글과 세종대왕'))\n", + "\n", + "\n", + "\n", + "# 22\n", + "# 8\n", + "# 8" ] }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, + "execution_count": 33, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -806,37 +790,59 @@ "세종대왕\n", "왕대종세 과글한\n", "\n", - "�\n", - "�\n", "한\n", - "��과 세종대왕\n", - "��쀌녢츄� ��ꀸ꜕�\n", + "글\n", + "한글과\n", + "세종대왕\n", + "왕대종세 과글한\n", "\n" ] } ], "source": [ - "u = unicode('한글과 세종대왕', 'utf-8') #유니코드 타입의 한글 문자열에 대해서는 인덱싱 및 슬라이싱이 올바르게 수행됨 \n", - "print u[0]\n", - "print u[1]\n", - "print u[:3]\n", - "print u[4:]\n", - "print u[::-1]\n", - "print\n", + "# u = unicode('한글과 세종대왕', 'utf-8') #유니코드 타입의 한글 문자열에 대해서는 인덱싱 및 슬라이싱이 올바르게 수행됨 \n", + "u = str('한글과 세종대왕') #유니코드 타입의 한글 문자열에 대해서는 인덱싱 및 슬라이싱이 올바르게 수행됨 \n", + "print(u[0])\n", + "print(u[1])\n", + "print(u[:3])\n", + "print(u[4:])\n", + "print(u[::-1])\n", + "print()\n", "u2 = u'한글과 세종대왕' \n", - "print u2[0]\n", - "print u2[1]\n", - "print u2[:3]\n", - "print u2[4:]\n", - "print u2[::-1]\n", - "print \n", + "print(u2[0])\n", + "print(u2[1])\n", + "print(u2[:3])\n", + "print(u2[4:])\n", + "print(u2[::-1])\n", + "print()\n", "u3 = '한글과 세종대왕'\n", - "print u3[0]\n", - "print u3[1]\n", - "print u3[:3]\n", - "print u3[4:]\n", - "print u3[::-1]\n", - "print" + "print(u3[0])\n", + "print(u3[1])\n", + "print(u3[:3])\n", + "print(u3[4:])\n", + "print(u3[::-1])\n", + "print()\n", + "\n", + "\n", + "\n", + "\n", + "# 한\n", + "# 글\n", + "# 한글과\n", + "# 세종대왕\n", + "# 왕대종세 과글한\n", + "\n", + "# 한\n", + "# 글\n", + "# 한글과\n", + "# 세종대왕\n", + "# 왕대종세 과글한\n", + "\n", + "# �\n", + "# �\n", + "# 한\n", + "# ��과 세종대왕\n", + "# ��쀌녢츄� ��ꀸ꜕�" ] }, { @@ -847,7 +853,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/python3.6/python08.ipynb b/python3.6/python08.ipynb index d5aa40c..0d7a6c1 100644 --- a/python3.6/python08.ipynb +++ b/python3.6/python08.ipynb @@ -22,10 +22,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -41,19 +39,17 @@ ], "source": [ "s = 'i like programming.'\n", - "print s.upper()\n", - "print s.upper().lower()\n", - "print 'I Like Programming'.swapcase() # 대문자는 소문자로, 소문자는 대문자로 변환\n", - "print s.capitalize() # 첫 문자를 대문자로 변환\n", - "print s.title() # 각 단어의 첫 문자를 대문자로 변환 " + "print(s.upper())\n", + "print(s.upper().lower())\n", + "print('I Like Programming'.swapcase()) # 대문자는 소문자로, 소문자는 대문자로 변환\n", + "print(s.capitalize()) # 첫 문자를 대문자로 변환\n", + "print(s.title()) # 각 단어의 첫 문자를 대문자로 변환 " ] }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -73,23 +69,21 @@ ], "source": [ "s = 'i like programming, i like swimming.'\n", - "print s.count('like') # 'like' 문자열이 출현한 횟수를 반환\n", - "print\n", - "print s.find('like') # 'like'의 첫글자 위치 (offset)를 반환\n", - "print s.find('programming') # 'programming'의 첫글자 위치를 반환\n", - "print s.find('programmin') # 'programmin'의 첫글자 위치를 반환\n", - "print s.find('programmii') # 'programmii' 단어는 없기 때문에 -1 반환\n", - "print\n", - "print s.find('like', 3) # offset=3 부터 'like'을 검색하여 'like'의 첫글자 위치 반환 \n", - "print s.find('my') # 'my' 단어는 없기 때문에 -1 반환" + "print(s.count('like')) # 'like' 문자열이 출현한 횟수를 반환\n", + "print()\n", + "print(s.find('like')) # 'like'의 첫글자 위치 (offset)를 반환\n", + "print(s.find('programming')) # 'programming'의 첫글자 위치를 반환\n", + "print(s.find('programmin')) # 'programmin'의 첫글자 위치를 반환\n", + "print(s.find('programmii')) # 'programmii' 단어는 없기 때문에 -1 반환\n", + "print()\n", + "print(s.find('like', 3)) # offset=3 부터 'like'을 검색하여 'like'의 첫글자 위치 반환 \n", + "print(s.find('my')) # 'my' 단어는 없기 때문에 -1 반환" ] }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -106,21 +100,19 @@ ], "source": [ "s = 'i like programming, i like swimming.'\n", - "print s.startswith('i like') # 'i like'로 시작하는 문자열인지 판단\n", - "print s.startswith('I like') # 대소문자 구별\n", - "print\n", + "print(s.startswith('i like')) # 'i like'로 시작하는 문자열인지 판단\n", + "print(s.startswith('I like')) # 대소문자 구별\n", + "print()\n", "\n", - "print s.endswith('swimming.') # 'swimming.'로 끝나는 문자열인지 판단\n", - "print s.startswith('progr', 7) # 7번째 문자열이 'progr'로 시작하는지 판단\n", - "print" + "print(s.endswith('swimming.')) # 'swimming.'로 끝나는 문자열인지 판단\n", + "print(s.startswith('progr', 7)) # 7번째 문자열이 'progr'로 시작하는지 판단\n", + "print()" ] }, { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -139,24 +131,22 @@ ], "source": [ "u = ' spam and ham '\n", - "print u.strip() # 좌우 공백을 제거하여 새로운 스트링 생성\n", - "print u # 스트링은 변경불가능 \n", + "print(u.strip()) # 좌우 공백을 제거하여 새로운 스트링 생성\n", + "print(u) # 스트링은 변경불가능 \n", "y = u.strip() # strip()는 새로운 스트링을 생성함\n", - "print y\n", - "print\n", + "print(y)\n", + "print()\n", "\n", - "print u.rstrip() # 오른쪽 공백 제거\n", - "print u.lstrip() # 왼쪽 공백 제거 \n", - "print ' abc '.strip() \n", - "print '><><><>'.strip('<>') # 인자로 주어진 스트링 안에 지정된 모든 문자를 좌우에서 제거" + "print(u.rstrip()) # 오른쪽 공백 제거\n", + "print(u.lstrip()) # 왼쪽 공백 제거 \n", + "print(' abc '.strip()) \n", + "print('><><><>'.strip('<>')) # 인자로 주어진 스트링 안에 지정된 모든 문자를 좌우에서 제거" ] }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -169,16 +159,14 @@ ], "source": [ "p = ' \\t abc \\t '\n", - "print p\n", - "print p.strip() # \\t도 공백문자이므로 제거됨" + "print(p)\n", + "print(p.strip()) # \\t도 공백문자이므로 제거됨" ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -191,16 +179,14 @@ ], "source": [ "u = 'spam and ham'\n", - "print u.replace('spam', 'spam, egg') # replace()는 새로운 스트링을 생성함\n", - "print u" + "print(u.replace('spam', 'spam, egg')) # replace()는 새로운 스트링을 생성함\n", + "print(u)" ] }, { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -215,20 +201,18 @@ ], "source": [ "u = ' spam and ham '\n", - "print u.split() # 공백으로 분리 (모든 공백 제거 및 문자열 내의 단어 리스트를 얻을 수 있음)\n", - "print u.split('and') # 'and'로 분리\n", - "print\n", + "print(u.split()) # 공백으로 분리 (모든 공백 제거 및 문자열 내의 단어 리스트를 얻을 수 있음)\n", + "print(u.split('and')) # 'and'로 분리\n", + "print()\n", "\n", "u2 = 'spam and ham\\tegg\\ncheese'\n", - "print u2.split()" + "print(u2.split())" ] }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -236,7 +220,7 @@ "text": [ "['spam', 'ham', 'egg', 'cheese']\n", "\n", - "\n", + "\n", "spam:ham:egg:cheese\n", "\n", "spam,ham,egg,cheese\n", @@ -252,32 +236,32 @@ "source": [ "u = 'spam ham\\tegg\\ncheese'\n", "t = u.split() # 문자열 내의 단어 리스트 \n", - "print t\n", - "print\n", + "print(t)\n", + "print()\n", "t2 = ':'.join(t) # 리스트 t 내부의 각 원소들을 ':'로 연결한 문자열 반환\n", - "print type(t2)\n", - "print t2\n", - "print\n", + "print(type(t2))\n", + "# \n", + "\n", + "print(t2)\n", + "print()\n", "t3 = \",\".join(t) # 리스트 t 내부의 각 원소들을 ','으로 연결한 문자열 반환\n", - "print t3\n", - "print\n", + "print(t3)\n", + "print()\n", "t4 = '\\n'.join(t) # 리스트 t 내부의 각 원소들을 '\\n'으로 연결한 문자열 반환\n", - "print t4\n", - "print" + "print(t4)\n", + "print()" ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 9, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[u'\\uc2a4\\ud338', u'\\ud584', u'\\uacc4\\ub780', u'\\uce58\\uc988']\n", + "['스팸', '햄', '계란', '치즈']\n", "스팸 햄 계란 치즈\n" ] } @@ -285,23 +269,25 @@ "source": [ "u2 = u\"스팸 햄 계란 치즈\"\n", "t2 = u2.split()\n", - "print t2\n", - "print t2[0], t2[1], t2[2], t2[3]" + "print(t2)\n", + "print(t2[0], t2[1], t2[2], t2[3])\n", + "\n", + "\n", + "# [u'\\uc2a4\\ud338', u'\\ud584', u'\\uacc4\\ub780', u'\\uce58\\uc988']\n", + "# 스팸 햄 계란 치즈" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "\n", + "\n", + "\n", "['first line', 'second line', 'third line']\n" ] } @@ -310,24 +296,27 @@ "lines = '''first line\n", "second line\n", "third line'''\n", - "print type(lines)\n", + "print(type(lines))\n", "lines2 = lines.splitlines() # 문자열을 라인 단위로 분리한 각 원소들을 지닌 리스트 반환\n", - "print type(lines2)\n", - "print lines2" + "print(type(lines2))\n", + "print(lines2)\n", + "\n", + "\n", + "# \n", + "# \n", + "# ['first line', 'second line', 'third line']" ] }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", " spam and egg \n", "spam and egg \n", " spam and egg\n" @@ -337,18 +326,17 @@ "source": [ "u = 'spam and egg'\n", "c = u.center(60) # 60자리를 확보하되 기존 문자열을 가운데 정렬한 새로운 문자열 반환\n", - "print type(c)\n", - "print c\n", - "print u.ljust(60) # 60자리를 확보하되 기존 문자열을 왼쪽 정렬한 새로운 문자열 반환\n", - "print u.rjust(60) # 60자리를 확보하되 기존 문자열을 오른쪽 정렬한 새로운 문자열 반환" + "print(type(c))\n", + "# \n", + "print(c)\n", + "print(u.ljust(60)) # 60자리를 확보하되 기존 문자열을 왼쪽 정렬한 새로운 문자열 반환\n", + "print(u.rjust(60)) # 60자리를 확보하되 기존 문자열을 오른쪽 정렬한 새로운 문자열 반환" ] }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -362,17 +350,15 @@ ], "source": [ "u = 'spam and egg'\n", - "print u.center(60, '-') # 공백에 채워질 문자를 선택할 수 있음\n", - "print u.ljust(60, '-')\n", - "print u.rjust(60, '-')" + "print(u.center(60, '-')) # 공백에 채워질 문자를 선택할 수 있음\n", + "print(u.ljust(60, '-'))\n", + "print(u.rjust(60, '-'))" ] }, { "cell_type": "code", - "execution_count": 42, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -389,21 +375,19 @@ } ], "source": [ - "print '1234'.isdigit() # 문자열 내의 Character들이 모두 숫자인가?\n", - "print 'abcd'.isalpha() # 문자열 내의 Character들이 모두 영문자인가?\n", - "print '1abc234'.isalnum() # 문자열 내의 Character들이 모두 영문자 또는 숫자인가? \n", - "print 'abc'.islower() # 문자열 내의 Character들이 모두 소문자인가?\n", - "print 'ABC'.isupper() # 문자열 내의 Character들이 모두 대문자인가?\n", - "print '\\t\\r\\n'.isspace() # 문자열 내의 Character들이 모두 공백 문자인가?\n", - "print 'This Is A Title'.istitle() # 문자열이 Title 형식 (각 단어의 첫글자가 대문자)인가?" + "print('1234'.isdigit()) # 문자열 내의 Character들이 모두 숫자인가?\n", + "print('abcd'.isalpha()) # 문자열 내의 Character들이 모두 영문자인가?\n", + "print('1abc234'.isalnum()) # 문자열 내의 Character들이 모두 영문자 또는 숫자인가? \n", + "print('abc'.islower()) # 문자열 내의 Character들이 모두 소문자인가?\n", + "print('ABC'.isupper()) # 문자열 내의 Character들이 모두 대문자인가?\n", + "print('\\t\\r\\n'.isspace()) # 문자열 내의 Character들이 모두 공백 문자인가?\n", + "print('This Is A Title'.istitle()) # 문자열이 Title 형식 (각 단어의 첫글자가 대문자)인가?" ] }, { "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, + "execution_count": 15, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -416,8 +400,8 @@ ], "source": [ "s = '123'\n", - "print s.zfill(5) # 5글자 자리 확보뒤 문자열을 쓰되 남는 공백에는 zero (0)를 채움 \n", - "print 'goofy'.zfill(6) # 6글자 자리 확보뒤 ..." + "print(s.zfill(5)) # 5글자 자리 확보뒤 문자열을 쓰되 남는 공백에는 zero (0)를 채움 \n", + "print('goofy'.zfill(6)) # 6글자 자리 확보뒤 ..." ] }, { @@ -455,10 +439,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -469,15 +451,13 @@ } ], "source": [ - "print 'name = %s, age = %s' % ('gslee', '24')" + "print('name = %s, age = %s' % ('gslee', '24'))" ] }, { "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, + "execution_count": 17, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -535,13 +515,13 @@ "\n", "이강성 드림'''\n", "name = '홍길동'\n", - "print letter % name\n", - "print \n", + "print(letter % name)\n", + "print()\n", "names = ['한학신', '정인숙', '박미경']\n", "for name in names:\n", - " print letter % name\n", - " print '-' * 40\n", - " print" + " print(letter % name)\n", + " print('-' * 40)\n", + " print()" ] }, { @@ -575,10 +555,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 18, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -589,15 +567,13 @@ } ], "source": [ - "print \"%s -- %s -- %d -- %f -- %e\" % ((1, 2), [3,4,5], 5, 5.3, 101.3)" + "print(\"%s -- %s -- %d -- %f -- %e\" % ((1, 2), [3,4,5], 5, 5.3, 101.3))" ] }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 19, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -608,15 +584,13 @@ } ], "source": [ - "print \"%3d -- %5.2f -- %.2e\" % (5, 5.356, 101.3)" + "print(\"%3d -- %5.2f -- %.2e\" % (5, 5.356, 101.3))" ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 20, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -628,7 +602,7 @@ ], "source": [ "a = 456\n", - "print '%d -- %o -- %x -- %X' % (a, a, a, a)" + "print('%d -- %o -- %x -- %X' % (a, a, a, a))" ] }, { @@ -640,10 +614,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, + "execution_count": 21, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -656,9 +628,9 @@ } ], "source": [ - "print '%(이름)s -- %(전화번호)s' %{'이름':'홍길동', '전화번호':5284}\n", - "print '%(이름)s -- %(전화번호)s' %{'전화번호':5284, '이름':'홍길동'}\n", - "print '%(이름)s -- %(전화번호)s' %{'전화번호':5284, '이름':'홍길동', '주소':'Seoul'}" + "print('%(이름)s -- %(전화번호)s' %{'이름':'홍길동', '전화번호':5284})\n", + "print('%(이름)s -- %(전화번호)s' %{'전화번호':5284, '이름':'홍길동'})\n", + "print('%(이름)s -- %(전화번호)s' %{'전화번호':5284, '이름':'홍길동', '주소':'Seoul'})" ] }, { @@ -669,7 +641,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/python3.6/python09.ipynb b/python3.6/python09.ipynb index 9a36ecc..2de5241 100644 --- a/python3.6/python09.ipynb +++ b/python3.6/python09.ipynb @@ -1,830 +1,817 @@ { - "metadata": { - "name": "", - "signature": "sha256:c1c3f4f13845f8b92c98b7fdc07017380320b4dfeb43cc5c398d9851cd7751ea" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 9. \ub9ac\uc2a4\ud2b8\uc758 \uae30\ucd08\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ub9ac\uc2a4\ud2b8 \uc0dd\uc131 \ubc0f \uae30\ubcf8 \uc5f0\uc0b0\n", - "***\n", - "- \ub9ac\uc2a4\ud2b8: \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774\uba74\uc11c \ubcc0\uacbd \uac00\ub2a5(Mutable)\n", - "- \ub9ac\uc2a4\ud2b8\uc5d0\uc11c \uc9c0\uc6d0\ud558\ub294 \uc77c\ubc18\uc801\uc778 \uc5f0\uc0b0\n", - " - \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc5f0\uacb0, \ubc18\ubcf5, \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l = []\n", - "l = [1, 2, \"Great\"]\n", - "print l[0], l[-1]\n", - "print l[1:3], l[:]\n", - "print\n", + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 9. 리스트의 기초\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 리스트 생성 및 기본 연산\n", + "***\n", + "- 리스트: 시퀀스 자료형이면서 변경 가능(Mutable)\n", + "- 리스트에서 지원하는 일반적인 연산\n", + " - 인덱싱, 슬라이싱, 연결, 반복, 멤버쉽 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 Great\n", + "[2, 'Great'] [1, 2, 'Great']\n", "\n", - "L = range(10)\n", - "print L[::2]\n", - "print\n", + "range(0, 10, 2)\n", + "[0, 2, 4, 6, 8]\n", "\n", - "print l * 2\n", - "print l + [3, 4, 5]\n", - "print len(l)\n", - "print\n", - "print 4 in L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 Great\n", - "[2, 'Great'] [1, 2, 'Great']\n", - "\n", - "[0, 2, 4, 6, 8]\n", - "\n", - "[1, 2, 'Great', 1, 2, 'Great']\n", - "[1, 2, 'Great', 3, 4, 5]\n", - "3\n", - "\n", - "True\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- Mutable \ud2b9\uc131\uc744 \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8\uc758 \uac12 \ubcc0\uacbd" + "[1, 2, 'Great', 1, 2, 'Great']\n", + "[1, 2, 'Great', 3, 4, 5]\n", + "3\n", + "\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = ['spam', 'eggs', 100, 1234]\n", - "a[2] = a[2] + 23\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['spam', 'eggs', 123, 1234]\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658" + } + ], + "source": [ + "l = []\n", + "l = [1, 2, \"Great\"]\n", + "print(l[0], l[-1])\n", + "print(l[1:3], l[:])\n", + "print()\n", + "\n", + "L = range(10)\n", + "print(L[::2])\n", + "print(list(L)[::2])\n", + "print()\n", + "\n", + "print(l * 2)\n", + "print(l + [3, 4, 5])\n", + "print(len(l))\n", + "print()\n", + "print(4 in L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Mutable 특성을 지닌 리스트의 값 변경" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['spam', 'eggs', 123, 1234]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = ['spam', 'eggs', 123, 1234]\n", - "a[0:2] = [1,12] # \ub3d9\uc77c\ud55c \ud06c\uae30\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658\n", - "print a\n", - "\n", - "a[0:2] = [1] # \uc11c\ub85c \ub2e4\ub978 \ud06c\uae30\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658\n", - "print a\n", - "\n", - "a[0:1] = [1, 2, 3] # \uc11c\ub85c \ub2e4\ub978 \ud06c\uae30\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uce58\ud658\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 12, 123, 1234]\n", - "[1, 123, 1234]\n", - "[1, 2, 3, 123, 1234]\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uc2ac\ub77c\uc774\uc2a4 \uc0ad\uc81c" + } + ], + "source": [ + "a = ['spam', 'eggs', 100, 1234]\n", + "a[2] = a[2] + 23\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 원소에 대한 슬라이스 치환" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 12, 123, 1234]\n", + "[1, 123, 1234]\n", + "[1, 2, 3, 123, 1234]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = [1, 12, 123, 1234]\n", - "a[0:2] = []\n", - "\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[123, 1234]\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c \uc0ac\uc774\uc5d0 \uc2ac\ub77c\uc774\uc2a4 \uc0bd\uc785" + } + ], + "source": [ + "a = ['spam', 'eggs', 123, 1234]\n", + "a[0:2] = [1,12] # 동일한 크기에 대한 슬라이스 치환\n", + "print(a)\n", + "\n", + "a[0:2] = [1] # 서로 다른 크기에 대한 슬라이스 치환\n", + "print(a)\n", + "\n", + "a[0:1] = [1, 2, 3] # 서로 다른 크기에 대한 슬라이스 치환\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 원소에 대한 슬라이스 삭제" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[123, 1234]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = [123, 1234]\n", - "a[1:1] = ['spam', 'ham'] # 1\ubc88\uc9f8 \uc778\ub371\uc2a4\uc5d0 \uc0bd\uc785\n", - "print a\n", - "\n", - "b = [123, 1234] \n", - "b[1:2] = ['spam', 'ham'] # 1\ubc88\uc9f8 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uce58\ud658\n", - "print b\n", - "\n", - "a[:0] = a # \ub9ac\uc2a4\ud2b8 \ub9e8 \uc55e\uc5d0 \uc790\uae30 \uc790\uc2e0\uc744 \uc0bd\uc785\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[123, 'spam', 'ham', 1234]\n", - "[123, 'spam', 'ham']\n", - "[123, 'spam', 'ham', 1234, 123, 'spam', 'ham', 1234]\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- del\uc744 \uc774\uc6a9\ud55c \ub9ac\uc2a4\ud2b8 \uc694\uc18c \uc0ad\uc81c" + } + ], + "source": [ + "a = [1, 12, 123, 1234]\n", + "a[0:2] = []\n", + "\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 원소 사이에 슬라이스 삽입" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[123, 'spam', 'ham', 1234]\n", + "[123, 'spam', 'ham']\n", + "[123, 'spam', 'ham', 1234, 123, 'spam', 'ham', 1234]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = [1, 2, 3, 4]\n", - "del a[0]\n", - "print a\n", - "\n", - "del a[1:]\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[2, 3, 4]\n", - "[2]\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = range(4)\n", - "print a\n", - "print a[::2]\n", - "\n", - "del a[::2]\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 2, 3]\n", - "[0, 2]\n", - "[1, 3]\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc790\uccb4\uc5d0 \ub300\ud55c \uc0ad\uc81c\n", - " - \uc815\ud655\ud788\ub294 \ub9ac\uc2a4\ud2b8\ub97c \uac00\ub9ac\ud0a4\ub294 \ub808\ud37c\ub7f0\uc2a4\ub97c \uc9c0\ub2cc \ubcc0\uc218 a \uc0ad\uc81c" + } + ], + "source": [ + "a = [123, 1234]\n", + "a[1:1] = ['spam', 'ham'] # 1번째 인덱스에 삽입\n", + "print(a)\n", + "\n", + "b = [123, 1234] \n", + "b[1:2] = ['spam', 'ham'] # 1번째 원소에 대한 치환\n", + "print(b)\n", + "\n", + "a[:0] = a # 리스트 맨 앞에 자기 자신을 삽입\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- del을 이용한 리스트 요소 삭제" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 3, 4]\n", + "[2]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = range(5)\n", - "del a\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'a' is not defined", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'a' is not defined" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc911\ucca9 \ub9ac\uc2a4\ud2b8: \ub9ac\uc2a4\ud2b8 \uc548\uc5d0 \uc694\uc18c\ub85c\uc11c \ub9ac\uc2a4\ud2b8\ub97c \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8" + } + ], + "source": [ + "a = [1, 2, 3, 4]\n", + "del a[0]\n", + "print(a)\n", + "\n", + "del a[1:]\n", + "print(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 2, 3]\n", + "[0, 2]\n", + "[1, 3]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [1, 2, 3]\n", - "t = ['begin', s, 'end']\n", - "print t\n", - "\n", - "print t[1][1]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['begin', [1, 2, 3], 'end']\n", - "2\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s[1] = 100\n", - "print t" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['begin', [1, 100, 3], 'end']\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, ['a', ['x', 'y'], 'b'], 3]\n", - "print L[0]\n", - "print L[1]\n", - "print L[1][1]\n", - "print L[1][1][1]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1\n", - "['a', ['x', 'y'], 'b']\n", - "['x', 'y']\n", - "y\n" - ] - } - ], - "prompt_number": 22 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- range: \uc21c\ucc28\uc801\uc778 \uc815\uc218 \ub9ac\uc2a4\ud2b8 \ub9cc\ub4e4\uae30" + } + ], + "source": [ + "# a = range(4)\n", + "a = list(range(4))\n", + "print(a)\n", + "print(a[::2])\n", + "\n", + "del a[::2]\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 자체에 대한 삭제\n", + " - 정확히는 리스트를 가리키는 레퍼런스를 지닌 변수 a 삭제" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'a' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'a' is not defined" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print range(10) # 0(Included)\ubd80\ud130 10(Excluded)\uae4c\uc9c0\n", - "\n", - "print range(5, 15) # 5(Included)\ubd80\ud130 15(Excluded)\uae4c\uc9c0\n", - "\n", - "print range(5, 15, 2) # 0(Included)\ubd80\ud130 10(Excluded)\uae4c\uc9c0, Step: 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", - "[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]\n", - "[5, 7, 9, 11, 13]\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for el in range(10):\n", - " print el, 'inch=', el * 2.54, 'centi'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 inch= 0.0 centi\n", - "1 inch= 2.54 centi\n", - "2 inch= 5.08 centi\n", - "3 inch= 7.62 centi\n", - "4 inch= 10.16 centi\n", - "5 inch= 12.7 centi\n", - "6 inch= 15.24 centi\n", - "7 inch= 17.78 centi\n", - "8 inch= 20.32 centi\n", - "9 inch= 22.86 centi\n" - ] - } - ], - "prompt_number": 80 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "sun, mon, tue, wed, thu, fri, sat = range(7)\n", - "print sun, mon, tue, wed, thu, fri, sat" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 1 2 3 4 5 6\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc548\uc758 \uac01 \uc790\ub8cc\uac00 \ud29c\ud50c\uc77c \ub54c for \ubb38\uc744 \uc0ac\uc6a9\ud558\uc5ec \uac12 \ucd94\ucd9c \ubc29\ubc95" + } + ], + "source": [ + "a = range(5)\n", + "del a\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 중첩 리스트: 리스트 안에 요소로서 리스트를 지닌 리스트" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['begin', [1, 2, 3], 'end']\n", + "2\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "lt = [('one', 1), ('two', 2), ('three', 3)]\n", - "for t in lt:\n", - " print 'name =', t[0] ,', num =', t[1]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "name = one , num = 1\n", - "name = two , num = 2\n", - "name = three , num = 3\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc544\ub798 \ucf54\ub4dc\uac00 \ub354 \ud6a8\uc728\uc801" + } + ], + "source": [ + "s = [1, 2, 3]\n", + "t = ['begin', s, 'end']\n", + "print(t)\n", + "\n", + "print(t[1][1])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['begin', [1, 100, 3], 'end']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "lt = [('one', 1), ('two', 2), ('three', 3)]\n", - "for t in lt:\n", - " print 'name = %s, num = %s' % t" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "name = one, num = 1\n", - "name = two, num = 2\n", - "name = three, num = 3\n" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- for \ubb38\uc758 \ud5e4\ub354\uc5d0\uc11c \uac01 \ud29c\ud50c\uc758 \uac12 \ucd94\ucd9c" + } + ], + "source": [ + "s[1] = 100\n", + "print(t)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "['a', ['x', 'y'], 'b']\n", + "['x', 'y']\n", + "y\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "lt = [('one', 1), ('two', 2), ('three', 3)]\n", - "for name, num in lt:\n", - " print name, num" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "one 1\n", - "two 2\n", - "three 3\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uc548\uc758 \uac01 \uc790\ub8cc\uac00 \ub9ac\uc2a4\ud2b8\uc5ec\ub3c4 for \ubb38\uc758 \ud5e4\ub354\uc5d0\uc11c \ub3d9\uc77c\ud558\uac8c \uac12 \ucd94\ucd9c \uac00\ub2a5" + } + ], + "source": [ + "L = [1, ['a', ['x', 'y'], 'b'], 3]\n", + "print(L[0])\n", + "print(L[1])\n", + "print(L[1][1])\n", + "print(L[1][1][1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- range: 순차적인 정수 리스트 만들기" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "range(0, 10)\n", + "range(5, 15)\n", + "range(5, 15, 2)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "LL = [['one', 1], ['two', 2], ['three', 3]]\n", - "for name, num in LL:\n", - " print name, num" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "one 1\n", - "two 2\n", - "three 3\n" - ] - } - ], - "prompt_number": 38 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub9ac\uc2a4\ud2b8 \uba54\uc18c\ub4dc\n", - "***" + } + ], + "source": [ + "print(range(10)) # 0(Included)부터 10(Excluded)까지\n", + "\n", + "print(range(5, 15)) # 5(Included)부터 15(Excluded)까지\n", + "\n", + "print(range(5, 15, 2)) # 0(Included)부터 10(Excluded)까지, Step: 2" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]\n", + "[5, 7, 9, 11, 13]\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ub9ac\uc2a4\ud2b8\uac00 \uc9c0\uc6d0\ud558\ub294 \uba54\uc18c\ub4dc" + } + ], + "source": [ + "print(list(range(10))) # 0(Included)부터 10(Excluded)까지\n", + "\n", + "print(list(range(5, 15))) # 5(Included)부터 15(Excluded)까지\n", + "\n", + "print(list(range(5, 15, 2))) # 0(Included)부터 10(Excluded)까지, Step: 2" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 inch= 0.0 centi\n", + "1 inch= 2.54 centi\n", + "2 inch= 5.08 centi\n", + "3 inch= 7.62 centi\n", + "4 inch= 10.16 centi\n", + "5 inch= 12.7 centi\n", + "6 inch= 15.24 centi\n", + "7 inch= 17.78 centi\n", + "8 inch= 20.32 centi\n", + "9 inch= 22.86 centi\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [1, 2, 3]\n", - "\n", - "s.append(5) # \ub9ac\uc2a4\ud2b8 \ub9e8 \ub9c8\uc9c0\ub9c9\uc5d0 \uc815\uc218 \uac12 5 \ucd94\uac00\n", - "print s\n", - "\n", - "s.insert(3, 4) # 3 \uc778\ub371\uc2a4 \uc704\uce58\uc5d0 \uc815\uc218 \uac12 4 \ucd94\uac00\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2, 3, 5]\n", - "[1, 2, 3, 4, 5]\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [1, 2, 3, 4, 5]\n", - "\n", - "print s.index(3) # \uac12 3\uc758 \uc778\ub371\uc2a4 \ubc18\ud658\n", - "\n", - "print s.count(2) # \uac12 2\uc758 \uac1c\uc218 \ubc18\ud658\n", - "\n", - "s = [1, 2, 2, 2, 2, 2, 3, 4, 5]\n", - "print s.count(2)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "1\n", - "5\n" - ] - } - ], - "prompt_number": 24 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- python\uc758 \uc18c\ud305 \uc54c\uace0\ub9ac\uc998: Timsort (\ubcc0\ud615\ub41c merge sort)\n", - " - \ucc38\uace0: http://orchistro.tistory.com/175" + } + ], + "source": [ + "for el in range(10):\n", + " print(el, 'inch=', el * 2.54, 'centi')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [1, 2, -10, -7, 100]\n", - "s.reverse() # \uc790\ub8cc\uc758 \uc21c\uc11c\ub97c \ub4a4\uc9d1\uae30 (\ubc18\ud658\uac12 \uc5c6\uc74c) \n", - "print s\n", - "\n", - "s.sort() # \uc815\ub82c (\ubc18\ud658\uac12 \uc5c6\uc74c)\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[100, -7, -10, 2, 1]\n", - "[-10, -7, 1, 2, 100]\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [10, 20, 30, 40, 50]\n", - "s.remove(10) # \uc790\ub8cc \uac12 10 \uc0ad\uc81c\n", - "print s\n", - "\n", - "s = [10, 20, 30, 20, 40, 50] # \uc790\ub8cc \uac12\uc774 \uc5ec\ub7ec\uac1c \uc874\uc7ac\ud558\uba74 \uccab\ubc88\uc9f8 \uac83\ub9cc \uc0ad\uc81c\n", - "s.remove(20)\n", - "print s\n", - "\n", - "s.extend([60, 70]) # \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8([60, 70]\ub97c \uae30\uc874 \ub9ac\uc2a4\ud2b8 s \ub4a4\uc5d0 \ubcd1\ud569\n", - "print s\n", - "\n", - "s.append([60, 70]) # \uc8fc\uc758: append\ub85c \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8\ub97c \ucd94\uac00\ud558\uba74 \ud558\ub098\uc758 \uc790\ub8cc \uc694\uc18c\ub85c\uc11c \ucd94\uac00\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[20, 30, 40, 50]\n", - "[10, 30, 20, 40, 50]\n", - "[10, 30, 20, 40, 50, 60, 70]\n", - "[10, 30, 20, 40, 50, 60, 70, [60, 70]]\n" - ] - } - ], - "prompt_number": 36 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ub9ac\uc2a4\ud2b8\ub97c \uc2a4\ud0dd(Stack)\uc73c\ub85c \uc0ac\uc6a9\ud558\uae30" + } + ], + "source": [ + "sun, mon, tue, wed, thu, fri, sat = range(7)\n", + "print(sun, mon, tue, wed, thu, fri, sat)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 안의 각 자료가 튜플일 때 for 문을 사용하여 값 추출 방법" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name = one , num = 1\n", + "name = two , num = 2\n", + "name = three , num = 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [10, 20, 30, 40, 50]\n", - "s.append(60)\n", - "print s\n", - "\n", - "print s.pop()\n", - "\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[10, 20, 30, 40, 50, 60]\n", - "60\n", - "[10, 20, 30, 40, 50]\n" - ] - } - ], - "prompt_number": 37 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/stack.png)" + } + ], + "source": [ + "lt = [('one', 1), ('two', 2), ('three', 3)]\n", + "for t in lt:\n", + " print('name =', t[0] ,', num =', t[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래 코드가 더 효율적" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name = one, num = 1\n", + "name = two, num = 2\n", + "name = three, num = 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = [10, 20, 30, 40, 50]\n", - "print s.pop(0) #0 \ubc88\uc9f8 \uc778\ub371\uc2a4 \uac12\uc744 \uaebc\ub0b8\ub2e4.\n", - "\n", - "print s\n", - "\n", - "print s.pop(1) #1 \ubc88\uc9f8 \uc778\ub371\uc2a4 \uac12\uc744 \uaebc\ub0b8\ub2e4.\n", - "\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "10\n", - "[20, 30, 40, 50]\n", - "30\n", - "[20, 40, 50]\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \ub9ac\uc2a4\ud2b8\ub97c \ud050(Queue)\ub85c \uc0ac\uc6a9\ud558\uae30" + } + ], + "source": [ + "lt = [('one', 1), ('two', 2), ('three', 3)]\n", + "for t in lt:\n", + " print('name = %s, num = %s' % t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- for 문의 헤더에서 각 튜플의 값 추출" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "one 1\n", + "two 2\n", + "three 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "q = [10, 20, 30, 40, 50]\n", - "q.append(60)\n", - "print q.pop(0)\n", - "\n", - "print q" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "10\n", - "[20, 30, 40, 50, 60]\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/queue.png)" + } + ], + "source": [ + "lt = [('one', 1), ('two', 2), ('three', 3)]\n", + "for name, num in lt:\n", + " print(name, num)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 안의 각 자료가 리스트여도 for 문의 헤더에서 동일하게 값 추출 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "one 1\n", + "two 2\n", + "three 3\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "LL = [['one', 1], ['two', 2], ['three', 3]]\n", + "for name, num in LL:\n", + " print(name, num)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 리스트 메소드\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 리스트가 지원하는 메소드" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 5]\n", + "[1, 2, 3, 4, 5]\n" ] } ], - "metadata": {} + "source": [ + "s = [1, 2, 3]\n", + "\n", + "s.append(5) # 리스트 맨 마지막에 정수 값 5 추가\n", + "print(s)\n", + "\n", + "s.insert(3, 4) # 3 인덱스 위치에 정수 값 4 추가\n", + "print(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "1\n", + "5\n" + ] + } + ], + "source": [ + "s = [1, 2, 3, 4, 5]\n", + "\n", + "print(s.index(3)) # 값 3의 인덱스 반환\n", + "\n", + "print(s.count(2)) # 값 2의 개수 반환\n", + "\n", + "s = [1, 2, 2, 2, 2, 2, 3, 4, 5]\n", + "print(s.count(2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- python의 소팅 알고리즘: Timsort (변형된 merge sort)\n", + " - 참고: http://orchistro.tistory.com/175" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[100, -7, -10, 2, 1]\n", + "[-10, -7, 1, 2, 100]\n" + ] + } + ], + "source": [ + "s = [1, 2, -10, -7, 100]\n", + "s.reverse() # 자료의 순서를 뒤집기 (반환값 없음) \n", + "print(s)\n", + "\n", + "s.sort() # 정렬 (반환값 없음)\n", + "print(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[20, 30, 40, 50]\n", + "[10, 30, 20, 40, 50]\n", + "[10, 30, 20, 40, 50, 60, 70]\n", + "[10, 30, 20, 40, 50, 60, 70, [60, 70]]\n" + ] + } + ], + "source": [ + "s = [10, 20, 30, 40, 50]\n", + "s.remove(10) # 자료 값 10 삭제\n", + "print(s)\n", + "\n", + "s = [10, 20, 30, 20, 40, 50] # 자료 값이 여러개 존재하면 첫번째 것만 삭제\n", + "s.remove(20)\n", + "print(s)\n", + "\n", + "s.extend([60, 70]) # 새로운 리스트([60, 70]를 기존 리스트 s 뒤에 병합\n", + "print(s)\n", + "\n", + "s.append([60, 70]) # 주의: append로 새로운 리스트를 추가하면 하나의 자료 요소로서 추가\n", + "print(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 리스트를 스택(Stack)으로 사용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[10, 20, 30, 40, 50, 60]\n", + "60\n", + "[10, 20, 30, 40, 50]\n" + ] + } + ], + "source": [ + "s = [10, 20, 30, 40, 50]\n", + "s.append(60)\n", + "print(s)\n", + "\n", + "print(s.pop())\n", + "\n", + "print(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/stack.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "[20, 30, 40, 50]\n", + "30\n", + "[20, 40, 50]\n" + ] + } + ], + "source": [ + "s = [10, 20, 30, 40, 50]\n", + "print(s.pop(0)) #0 번째 인덱스 값을 꺼낸다.\n", + "\n", + "print(s)\n", + "\n", + "print(s.pop(1)) #1 번째 인덱스 값을 꺼낸다.\n", + "\n", + "print(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 리스트를 큐(Queue)로 사용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "[20, 30, 40, 50, 60]\n" + ] + } + ], + "source": [ + "q = [10, 20, 30, 40, 50]\n", + "q.append(60)\n", + "print(q.pop(0))\n", + "\n", + "print(q)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/queue.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python10.ipynb b/python3.6/python10.ipynb index e1bf96f..8d57a35 100644 --- a/python3.6/python10.ipynb +++ b/python3.6/python10.ipynb @@ -1,675 +1,708 @@ { - "metadata": { - "name": "", - "signature": "sha256:751463e29cb1f77a958f648aa418de343a35c9ebe451d93376ba1eec3e5dda1c" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 10. \ub9ac\uc2a4\ud2b8\uc758 \ud65c\uc6a9\n", - "***\n", - "***" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 10. 리스트의 활용\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 리스트 정렬하기\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 리스트의 sort 메소드\n", + "- L.sort() 함수는 리스트 L 자체를 변경하며 리턴값을 반환하지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n", + "[1, 2, 3, 4, 5, 8, 9]\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ub9ac\uc2a4\ud2b8 \uc815\ub82c\ud558\uae30\n", - "***" + } + ], + "source": [ + "L = [1, 5, 3, 9, 8, 4, 2]\n", + "print(L.sort())\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파이썬은 디폴트로 cmp(a, b) 내장 함수를 이용하여 정렬 방식을 결정한다.\n", + "- cmp(a, b)\n", + " - if a < b: return -1\n", + " - if a > b: return 1\n", + " - if a == b: return 0" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'cmp' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'cmp' is not defined" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ub9ac\uc2a4\ud2b8\uc758 sort \uba54\uc18c\ub4dc\n", - "- L.sort() \ud568\uc218\ub294 \ub9ac\uc2a4\ud2b8 L \uc790\uccb4\ub97c \ubcc0\uacbd\ud558\uba70 \ub9ac\ud134\uac12\uc744 \ubc18\ud658\ud558\uc9c0 \uc54a\ub294\ub2e4." + } + ], + "source": [ + "print(cmp(1,2))\n", + "\n", + "print(cmp(5,2))\n", + "\n", + "print(cmp('abc', 'abc'))\n", + "\n", + "\n", + "# -1\n", + "# 1\n", + "# 0" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-1\n", + "1\n", + "0\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 5, 3, 9, 8, 4, 2]\n", - "print L.sort()\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "None\n", - "[1, 2, 3, 4, 5, 8, 9]\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc774\uc36c\uc740 \ub514\ud3f4\ud2b8\ub85c cmp(a, b) \ub0b4\uc7a5 \ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \uc815\ub82c \ubc29\uc2dd\uc744 \uacb0\uc815\ud55c\ub2e4.\n", - "- cmp(a, b)\n", - " - if a < b: return -1\n", - " - if a > b: return 1\n", - " - if a == b: return 0" + } + ], + "source": [ + "def cmp(a, b):\n", + " return (a > b) - (a < b) \n", + "\n", + "print(cmp(1,2))\n", + "\n", + "print(cmp(5,2))\n", + "\n", + "print(cmp('abc', 'abc'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 기본 정렬 방식을 변경하려면 cmp(a, b)와 같은 비교 함수를 직접 만들어서 sort() 함수의 인자로 넣는다." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "must use keyword argument for key function", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: must use keyword argument for key function" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print cmp(1,2)\n", - "\n", - "print cmp(5,2)\n", - "\n", - "print cmp('abc', 'abc')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "-1\n", - "1\n", - "0\n" - ] - } - ], - "prompt_number": 45 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uae30\ubcf8 \uc815\ub82c \ubc29\uc2dd\uc744 \ubcc0\uacbd\ud558\ub824\uba74 cmp(a, b)\uc640 \uac19\uc740 \ube44\uad50 \ud568\uc218\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\uc11c sort() \ud568\uc218\uc758 \uc778\uc790\ub85c \ub123\ub294\ub2e4." + } + ], + "source": [ + "def mycmp(a1, a2): # 대소관계에 따른 순서를 반대로 바꾸었음\n", + " return cmp(a2, a1)\n", + "\n", + "L = [1, 5, 3, 2, 4, 6]\n", + "L.sort(mycmp) # 역순으로 정렬\n", + "print(L)\n", + "\n", + "\n", + "# [6, 5, 4, 3, 2, 1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 여러 튜플을 요소로 지닌 리스트인 경우, 튜플의 첫번째 값이 아닌 다른 위치에 있는 값을 기준으로 정렬 " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sorted by name: [('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n" ] }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "def mycmp(a1, a2): # \ub300\uc18c\uad00\uacc4\uc5d0 \ub530\ub978 \uc21c\uc11c\ub97c \ubc18\ub300\ub85c \ubc14\uafb8\uc5c8\uc74c\n", - " return cmp(a2, a1)\n", - "\n", - "L = [1, 5, 3, 2, 4, 6]\n", - "L.sort(mycmp) # \uc5ed\uc21c\uc73c\ub85c \uc815\ub82c\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[6, 5, 4, 3, 2, 1]\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc5ec\ub7ec \ud29c\ud50c\uc744 \uc694\uc18c\ub85c \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8\uc778 \uacbd\uc6b0, \ud29c\ud50c\uc758 \uccab\ubc88\uc9f8 \uac12\uc774 \uc544\ub2cc \ub2e4\ub978 \uc704\uce58\uc5d0 \uc788\ub294 \uac12\uc744 \uae30\uc900\uc73c\ub85c \uc815\ub82c " + "ename": "TypeError", + "evalue": "must use keyword argument for key function", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by name:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp_1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by experience:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: must use keyword argument for key function" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def cmp_1(a1, a2):\n", - " return cmp(a1[1], a2[1])\n", - "\n", - "def cmp_2(a1, a2):\n", - " return cmp(a1[2], a2[2])\n", - "\n", - "L = [ ('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", - "L.sort()\n", - "print 'sorted by name:', L\n", - "\n", - "L.sort(cmp_1)\n", - "print 'sorted by experience:', L\n", - "\n", - "L.sort(cmp_2)\n", - "print 'sorted by age:', L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "sorted by name: [('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n", - "sorted by experience: [('kim', 3, 28), ('lee', 5, 38), ('jung', 10, 36)]\n", - "sorted by age: [('kim', 3, 28), ('jung', 10, 36), ('lee', 5, 38)]\n" - ] - } - ], - "prompt_number": 49 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- sort() \ud568\uc218 \uc778\uc790\ub85c reverse \uac12\uc744 \ubc1b\uc744 \uc218 \uc788\ub2e4.\n", - " - \ub514\ud3f4\ud2b8 reverse \uc778\uc790\uac12\uc740 False\n", - " - reverse \uc778\uc790\uac12\uc744 True\ub85c \uc8fc\uba74 \uc5ed\uc21c\uc73c\ub85c \uc815\ub82c\ub428" + } + ], + "source": [ + "def cmp_1(a1, a2):\n", + " return cmp(a1[1], a2[1])\n", + "\n", + "def cmp_2(a1, a2):\n", + " return cmp(a1[2], a2[2])\n", + "\n", + "L = [ ('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", + "L.sort()\n", + "print('sorted by name:', L)\n", + "\n", + "L.sort(cmp_1)\n", + "print('sorted by experience:', L)\n", + "\n", + "L.sort(cmp_2)\n", + "print('sorted by age:', L)\n", + "\n", + "\n", + "\n", + "\n", + "# sorted by name: [('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n", + "# sorted by experience: [('kim', 3, 28), ('lee', 5, 38), ('jung', 10, 36)]\n", + "# sorted by age: [('kim', 3, 28), ('jung', 10, 36), ('lee', 5, 38)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- sort() 함수 인자로 reverse 값을 받을 수 있다.\n", + " - 디폴트 reverse 인자값은 False\n", + " - reverse 인자값을 True로 주면 역순으로 정렬됨" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[9, 8, 6, 6, 3, 2, 1]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "L.sort(reverse = True)\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[9, 8, 6, 6, 3, 2, 1]\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- sort() \ud568\uc218 \uc778\uc790\ub85c key\uc5d0 \ud568\uc218\ub97c \ub123\uc5b4\uc904 \uc218 \uc788\ub2e4.\n", - " - key \uc778\uc790\uc5d0 \ud568\uc218\uac00 \ud560\ub2f9\ub418\uc5b4 \uc788\uc73c\uba74 \uac01 \ub9ac\uc2a4\ud2b8 \uc6d0\uc18c\uc5d0 \ub300\ud574 \ube44\uad50\ud568\uc218 \ud638\ucd9c \uc9c1\uc804\uc5d0 key \ud568\uc218\ub97c \uba3c\uc800 \ud638\ucd9c\ud55c\ub2e4. " + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "L.sort(reverse = True)\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- sort() 함수 인자로 key에 함수를 넣어줄 수 있다.\n", + " - key 인자에 함수가 할당되어 있으면 각 리스트 원소에 대해 비교함수 호출 직전에 key 함수를 먼저 호출한다. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['123', '2345', '34', '56']\n", + "['34', '56', '123', '2345']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = ['123', '34', '56', '2345']\n", - "L.sort()\n", - "print L\n", - "\n", - "L.sort(key=int)\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['123', '2345', '34', '56']\n", - "['34', '56', '123', '2345']\n" - ] - } - ], - "prompt_number": 51 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 sorted \ub0b4\uc7a5 \ud568\uc218\n", - "- sorted() \ub0b4\uc7a5\ud568\uc218\ub294 L \uc790\uccb4\uc5d0\ub294 \ub0b4\uc6a9 \ubcc0\uacbd \uc5c6\uc774 \uc815\ub82c\uc774 \ub418\uc5b4\uc9c4 \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "L = ['123', '34', '56', '2345']\n", + "L.sort()\n", + "print(L)\n", + "\n", + "L.sort(key=int)\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 sorted 내장 함수\n", + "- sorted() 내장함수는 L 자체에는 내용 변경 없이 정렬이 되어진 새로운 리스트를 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 6, 6, 8, 9]\n", + "[1, 6, 3, 8, 6, 2, 9]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "newList = sorted(L)\n", - "print newList\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2, 3, 6, 6, 8, 9]\n", - "[1, 6, 3, 8, 6, 2, 9]\n" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for ele in sorted(L):\n", - " print ele," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 2 3 6 6 8 9\n" - ] - } - ], - "prompt_number": 55 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- sorted() \ud568\uc218\uc758 \ub450\ubc88\uc9f8 \uc778\uc790\ub85c cmp \ud568\uc218 \uc9c0\uc815 \uac00\ub2a5" + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "newList = sorted(L)\n", + "print(newList)\n", + "print(L)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3 6 6 8 9 " ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def mycmp(a1, a2): # \ub300\uc18c\uad00\uacc4\uc5d0 \ub530\ub978 \uc21c\uc11c\ub97c \ubc18\ub300\ub85c \ubc14\uafb8\uc5c8\uc74c\n", - " return cmp(a2, a1)\n", - "\n", - "L = [1, 5, 3, 2, 4, 6]\n", - "print sorted(L, mycmp) # \uc5ed\uc21c\uc73c\ub85c \uc815\ub82c\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[6, 5, 4, 3, 2, 1]\n", - "[1, 5, 3, 2, 4, 6]\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc778\uc790\ub85c reverse\uc640 key \uc9c0\uc815 \uac00\ub2a5" + } + ], + "source": [ + "for ele in sorted(L):\n", + " print(ele, end=\" \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- sorted() 함수의 두번째 인자로 cmp 함수 지정 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "must use keyword argument for key function", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: must use keyword argument for key function" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "print sorted(L, reverse=True)\n", - "\n", - "L = ['123', '34', '56', '2345']\n", - "print sorted(L, key=int)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[9, 8, 6, 6, 3, 2, 1]\n", - "['34', '56', '123', '2345']\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 L.reverse() \uc640 reversed() \ub0b4\uc7a5 \ud568\uc218\n", - "- L.reverse()\ub3c4 \ubc18\ud658\uac12\uc774 \uc5c6\ub2e4.\n", - " - \uc989, L \uc790\uccb4\ub97c \uc5ed\uc21c\uc73c\ub85c \ub4a4\uc9d1\ub294\ub2e4.\n", - " - [\uc8fc\uc758] \uc5ed\uc21c \uc815\ub82c\uc774 \uc544\ub2c8\ub2e4." + } + ], + "source": [ + "def mycmp(a1, a2): # 대소관계에 따른 순서를 반대로 바꾸었음\n", + " return cmp(a2, a1)\n", + "\n", + "L = [1, 5, 3, 2, 4, 6]\n", + "print(sorted(L, mycmp)) # 역순으로 정렬\n", + "print(L)\n", + "\n", + "\n", + "# ['123', '2345', '34', '56']\n", + "# ['34', '56', '123', '2345']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인자로 reverse와 key 지정 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[9, 8, 6, 6, 3, 2, 1]\n", + "['34', '56', '123', '2345']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "print L.reverse()\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "None\n", - "[9, 2, 6, 8, 3, 6, 1]\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "L.reverse() # \uc5ed\uc21c\uc73c\ub85c \ub4a4\uc9d1\ub294\ub2e4.\n", - "for ele in L:\n", - " print ele + 2,\n", - "\n", - "print\n", - "L.reverse() # \ub2e4\uc2dc \uc6d0\uc0c1\ud0dc\ub85c \ubcf5\uadc0\uc2dc\ud0a8\ub2e4.\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "11 4 8 10 5 8 3\n", - "[1, 6, 3, 8, 6, 2, 9]\n" - ] - } - ], - "prompt_number": 27 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- reversed() \ub0b4\uc7a5\ud568\uc218\ub294 sorted() \ucc98\ub7fc \ub0b4\uc6a9\uc774 \ub4a4\uc9d1\ud78c \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud55c\ub2e4.\n", - " - sorted() \ucc98\ub7fc \uc6d0\ub798 \ub9ac\uc2a4\ud2b8 \ub0b4\uc6a9\uc5d0\ub294 \ubcc0\ud568\uc5c6\ub2e4." + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "print(sorted(L, reverse=True))\n", + "\n", + "L = ['123', '34', '56', '2345']\n", + "print(sorted(L, key=int))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 L.reverse() 와 reversed() 내장 함수\n", + "- L.reverse()도 반환값이 없다.\n", + " - 즉, L 자체를 역순으로 뒤집는다.\n", + " - [주의] 역순 정렬이 아니다." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n", + "[9, 2, 6, 8, 3, 6, 1]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "print L\n", - "for ele in reversed(L):\n", - " print ele + 2, \n", - "print\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 6, 3, 8, 6, 2, 9]\n", - "11 4 8 10 5 8 3\n", - "[1, 6, 3, 8, 6, 2, 9]\n" - ] - } - ], - "prompt_number": 31 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec(List Comprehension)\n", - "***\n", - "- \uc77c\ubc18\uc801\uc778 \ub9ac\uc2a4\ud2b8 \uc0dd\uc131\ubc95" + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "print(L.reverse())\n", + "print(L)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11 4 8 10 5 8 3 \n", + "[1, 6, 3, 8, 6, 2, 9]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = []\n", - "for k in range(10):\n", - " L.append(k*k)\n", - " \n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" - ] - } - ], - "prompt_number": 74 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc704 \ucf54\ub529\uc740 \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec \ub9ac\ud130\ub7f4 \ubc29\uc2dd\uc744 \ud65c\uc6a9\ud574\uc11c \uc544\ub798\uc640 \uac19\uc774 \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4." + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "L.reverse() # 역순으로 뒤집는다.\n", + "for ele in L:\n", + " print(ele + 2, end=\" \")\n", + "\n", + "print()\n", + "L.reverse() # 다시 원상태로 복귀시킨다.\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- reversed() 내장함수는 sorted() 처럼 내용이 뒤집힌 리스트를 반환한다.\n", + " - sorted() 처럼 원래 리스트 내용에는 변함없다." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 6, 3, 8, 6, 2, 9]\n", + "11 4 8 10 5 8 3 \n", + "[1, 6, 3, 8, 6, 2, 9]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [k * k for k in range(10)]\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" - ] - } - ], - "prompt_number": 32 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec \ub9ac\ud130\ub7f4\n", - "
\n",
-      "[expression for expr1 in sequence1\n",
-      "              for expr2 in sequence2 \n",
-      "              ...\n",
-      "              for exprN in sequenceN\n",
-      "              if condition]\n",
-      "
\n", - "- expression\uc758 \ud3c9\uac00 \uacb0\uacfc \ubc18\ub4dc\uc2dc \ud55c \uac1c\uc758 \uc6d0\uc18c\uac00 \ub098\uc640\uc57c \ud55c\ub2e4.\n", - " - \ud2c0\ub9b0 \uc608: [ x, y for x in seq1 for u in seq2 ]\n", - "- \ub9cc\uc57d \ub450 \uac1c\uc758 \uc774\uc0c1\uc758 \ud3c9\uac00 \uacb0\uacfc\uac00 \ub098\uc624\uba74 \ud29c\ud50c \ub4f1\uc73c\ub85c \uac10\uc2f8 \uc8fc\uc5b4\uc57c \ud55c\ub2e4.\n", - " - \uc62c\ubc14\ub978 \uc608: [ (x, y) for x in seq1 for u in seq2 ]\n", - "- \uc704 \ub9ac\ud130\ub7f4\uc740 \ub2e4\uc74c\uc758 \uc77c\ubc18\uc801\uc778 for \ubb38\uc758 \ub9ac\ud138\ub7ec\uacfc \ub3d9\uc77c\n", - "
\n",
-      "l = []\n",
-      "for expr1 in sequence1:\n",
-      "  for expr2 in sequence2:\n",
-      "      ...\n",
-      "         for exprtN in sequenceN:\n",
-      "            if condition:\n",
-      "               l.append(expression)\n",
-      "
\n", - " " + } + ], + "source": [ + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "print(L)\n", + "for ele in reversed(L):\n", + " print(ele + 2, end=\" \")\n", + "print()\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 리스트 내포(List Comprehension)\n", + "***\n", + "- 일반적인 리스트 생성법" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [k * k for k in range(10) if k % 2] # \ud640\uc218\uc758 \uc81c\uacf1\ub9cc \ub9ac\uc2a4\ud2b8\ub85c \ud615\uc131\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 9, 25, 49, 81]\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc704\uc758 \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec \ucf54\ub4dc\ub294 \uc544\ub798\uc640 \ub3d9\uc77c" + } + ], + "source": [ + "L = []\n", + "for k in range(10):\n", + " L.append(k*k)\n", + " \n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위 코딩은 리스트 내포 리터럴 방식을 활용해서 아래와 같이 변경할 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = []\n", - "for k in range(10):\n", - " if k%2:\n", - " L.append(k*k)\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 9, 25, 49, 81]\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 20\ubcf4\ub2e4 \uc791\uc740 2\uc758 \ubc30\uc218\uc640 3\uc758 \ubc30\uc218\uc5d0 \ub300\ud574 \uadf8 \ub450 \uc218\uc758 \ud569\uc774 7\uc758 \ubc30\uc218\uc778 \uac83\ub4e4\uc5d0 \ub300\ud574 \uadf8 \ub450 \uc218\uc758 \uacf1\uc744 \ucd9c\ub825\ud558\ub294 \ucf54\ub4dc" + } + ], + "source": [ + "L = [k * k for k in range(10)]\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 내포 리터럴\n", + "
\n",
+    "[expression for expr1 in sequence1\n",
+    "              for expr2 in sequence2 \n",
+    "              ...\n",
+    "              for exprN in sequenceN\n",
+    "              if condition]\n",
+    "
\n", + "- expression의 평가 결과 반드시 한 개의 원소가 나와야 한다.\n", + " - 틀린 예: [ x, y for x in seq1 for u in seq2 ]\n", + "- 만약 두 개의 이상의 평가 결과가 나오면 튜플 등으로 감싸 주어야 한다.\n", + " - 올바른 예: [ (x, y) for x in seq1 for u in seq2 ]\n", + "- 위 리터럴은 다음의 일반적인 for 문의 리털러과 동일\n", + "
\n",
+    "l = []\n",
+    "for expr1 in sequence1:\n",
+    "  for expr2 in sequence2:\n",
+    "      ...\n",
+    "         for exprtN in sequenceN:\n",
+    "            if condition:\n",
+    "               l.append(expression)\n",
+    "
\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 9, 25, 49, 81]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [(i, j, i*j) for i in range(2, 20, 2) for j in range(3, 20, 3) if (i + j) % 7 == 0]\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[(2, 12, 24), (4, 3, 12), (6, 15, 90), (8, 6, 48), (10, 18, 180), (12, 9, 108), (16, 12, 192), (18, 3, 54)]\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub450 \uac1c\uc758 \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc5d0 \ub300\ud574 \uac01\uac01\uc758 \uc6d0\uc18c\uc5d0 \ub300\ud55c \uc30d\uc744 \ud29c\ud50c \ud615\ud0dc\ub85c \ub9cc\ub4e4\uba74\uc11c \ub9ac\uc2a4\ud2b8\uc5d0 \uc800\uc7a5\ud558\ub294 \ucf54\ub4dc" + } + ], + "source": [ + "L = [k * k for k in range(10) if k % 2] # 홀수의 제곱만 리스트로 형성\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위의 리스트 내포 코드는 아래와 동일" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 9, 25, 49, 81]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "seq1 = 'abc'\n", - "seq2 = (1, 2, 3)\n", - "print [(x, y) for x in seq1 for y in seq2]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "words = 'The quick brown fox jumps over the lazy dog'.split()\n", - "stuff = [[w.upper(), w.lower(), len(w)] for w in words]\n", - "for i in stuff:\n", - " print i" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['THE', 'the', 3]\n", - "['QUICK', 'quick', 5]\n", - "['BROWN', 'brown', 5]\n", - "['FOX', 'fox', 3]\n", - "['JUMPS', 'jumps', 5]\n", - "['OVER', 'over', 4]\n", - "['THE', 'the', 3]\n", - "['LAZY', 'lazy', 4]\n", - "['DOG', 'dog', 3]\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "L = []\n", + "for k in range(10):\n", + " if k%2:\n", + " L.append(k*k)\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 20보다 작은 2의 배수와 3의 배수에 대해 그 두 수의 합이 7의 배수인 것들에 대해 그 두 수의 곱을 출력하는 코드" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(2, 12, 24), (4, 3, 12), (6, 15, 90), (8, 6, 48), (10, 18, 180), (12, 9, 108), (16, 12, 192), (18, 3, 54)]\n" + ] + } + ], + "source": [ + "L = [(i, j, i*j) for i in range(2, 20, 2) for j in range(3, 20, 3) if (i + j) % 7 == 0]\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 두 개의 시퀀스 자료형에 대해 각각의 원소에 대한 쌍을 튜플 형태로 만들면서 리스트에 저장하는 코드" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]\n" + ] + } + ], + "source": [ + "seq1 = 'abc'\n", + "seq2 = (1, 2, 3)\n", + "print([(x, y) for x in seq1 for y in seq2])" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['THE', 'the', 3]\n", + "['QUICK', 'quick', 5]\n", + "['BROWN', 'brown', 5]\n", + "['FOX', 'fox', 3]\n", + "['JUMPS', 'jumps', 5]\n", + "['OVER', 'over', 4]\n", + "['THE', 'the', 3]\n", + "['LAZY', 'lazy', 4]\n", + "['DOG', 'dog', 3]\n" ] } ], - "metadata": {} + "source": [ + "words = 'The quick brown fox jumps over the lazy dog'.split()\n", + "stuff = [[w.upper(), w.lower(), len(w)] for w in words]\n", + "for i in stuff:\n", + " print(i)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python11.ipynb b/python3.6/python11.ipynb index 4ca3fba..ef6bd39 100644 --- a/python3.6/python11.ipynb +++ b/python3.6/python11.ipynb @@ -1,989 +1,1030 @@ { - "metadata": { - "name": "", - "signature": "sha256:f605b6651a091856e85ef998f6e29cc76ddb9f4c91c5080420c4886641d801ea" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 11. \ud29c\ud50c\uacfc \uc9d1\ud569\n", - "***\n", - "***" - ] - }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 11. 튜플과 집합\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 튜플 활용법\n", + "***\n", + "- 튜플(Tuples): 순서있는 임의의 객체 모음 (시퀀스형)\n", + "- 튜플은 변경 불가능(Immutable)\n", + "- 시퀀스형이 가지는 다음 연산 모두 지원\n", + " - 인덱싱, 슬라이싱, 연결, 반복, 멤버쉽 테스트" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 튜플 연산" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud29c\ud50c \ud65c\uc6a9\ubc95\n", - "***\n", - "- \ud29c\ud50c(Tuples): \uc21c\uc11c\uc788\ub294 \uc784\uc758\uc758 \uac1d\uccb4 \ubaa8\uc74c (\uc2dc\ud000\uc2a4\ud615)\n", - "- \ud29c\ud50c\uc740 \ubcc0\uacbd \ubd88\uac00\ub2a5(Immutable)\n", - "- \uc2dc\ud000\uc2a4\ud615\uc774 \uac00\uc9c0\ub294 \ub2e4\uc74c \uc5f0\uc0b0 \ubaa8\ub450 \uc9c0\uc6d0\n", - " - \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc5f0\uacb0, \ubc18\ubcf5, \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8" + "name": "stdout", + "output_type": "stream", + "text": [ + " \n" ] - }, + } + ], + "source": [ + "t1 = () # 비어있는 튜플\n", + "t2 = (1,2,3) # 괄호 사용\n", + "\n", + "t3 = 1,2,3 # 괄호가 없어도 튜플이 됨\n", + "print(type(t1), type(t2), type(t3))\n", + "\n", + "\n", + "# " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ud29c\ud50c \uc5f0\uc0b0" + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t1 = () # \ube44\uc5b4\uc788\ub294 \ud29c\ud50c\n", - "t2 = (1,2,3) # \uad04\ud638 \uc0ac\uc6a9\n", - "\n", - "t3 = 1,2,3 # \uad04\ud638\uac00 \uc5c6\uc5b4\ub3c4 \ud29c\ud50c\uc774 \ub428\n", - "print type(t1), type(t2), type(t3)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " \n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "r1 = (1,) # \uc790\ub8cc\uac00 \ud55c \uac1c\uc77c \ub54c\ub294 \ubc18\ub4dc\uc2dc \ucf64\ub9c8\uac00 \uc788\uc5b4\uc57c \ud55c\ub2e4.\n", - "r2 = 1, # \uad04\ud638\ub294 \uc5c6\uc5b4\ub3c4 \ucf64\ub9c8\ub294 \uc788\uc5b4\uc57c \ud55c\ub2e4.\n", - "print type(r1)\n", - "print type(r2)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = (1, 2, 3)\n", - "print t * 2 # \ubc18\ubcf5\n", - "print t + ('PyKUG', 'users') # \uc5f0\uacb0\n", - "print t\n", - "print\n", - "\n", - "print t[0], t[1:3] # \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1\n", - "print len(t) # \uae38\uc774\n", - "print 1 in t # \uba64\ubc84\uc2ed \ud14c\uc2a4\ud2b8" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "(1, 2, 3, 1, 2, 3)\n", - "(1, 2, 3, 'PyKUG', 'users')\n", - "(1, 2, 3)\n", - "\n", - "1 (2, 3)\n", - "3\n", - "True\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t[0] = 100 # \ud29c\ud50c\uc740 \ubcc0\uacbd \ubd88\uac00\ub2a5, \uc5d0\ub7ec\ubc1c\uc0dd" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'tuple' object does not support item assignment", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m \u001b[0;31m# \ud29c\ud50c\uc740 \ubcc0\uacbd \ubd88\uac00\ub2a5, \uc5d0\ub7ec\ubc1c\uc0dd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" - ] - } - ], - "prompt_number": 10 - }, + } + ], + "source": [ + "r1 = (1,) # 자료가 한 개일 때는 반드시 콤마가 있어야 한다.\n", + "r2 = 1, # 괄호는 없어도 콤마는 있어야 한다.\n", + "print(type(r1))\n", + "print(type(r2))\n", + "\n", + "# \n", + "# " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = (12345, 54321, 'hello!') \n", - "u = t, (1, 2, 3, 4, 5) # \ud29c\ud50c \ub0b4\ubd80 \uc6d0\uc18c\ub85c \ub2e4\ub978 \ud29c\ud50c\uc744 \uac00\uc9c8 \uc218 \uc788\uc74c\n", - "print u\n", - "\n", - "t2 = [1, 2, 3] # \ud29c\ud50c \ub0b4\ubd80 \uc6d0\uc18c\ub85c \ub9ac\uc2a4\ud2b8 \uac00\uc9c8 \uc218 \uc788\uc74c \n", - "u2 = t2, (1, 2, 4)\n", - "print u2\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 2, 3, 1, 2, 3)\n", + "(1, 2, 3, 'PyKUG', 'users')\n", + "(1, 2, 3)\n", "\n", - "t3 = {1:\"abc\", 2:\"def\"} # \ud29c\ud50c \ub0b4\ubd80 \uc6d0\uc18c\ub85c \uc0ac\uc804 \uac00\uc9c8 \uc218 \uc788\uc74c \n", - "u3 = t3, (1, 2, 3)\n", - "print u3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))\n", - "([1, 2, 3], (1, 2, 4))\n", - "({1: 'abc', 2: 'def'}, (1, 2, 3))\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x, y, z = 1, 2, 3 # \ud29c\ud50c\uc744 \uc774\uc6a9\ud55c \ubcf5\uc218 \uac1c\uc758 \uc790\ub8cc \ud560\ub2f9\n", - "print type(x), type(y), type(z)\n", - "print x\n", - "print y\n", - "print z" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " \n", - "1\n", - "2\n", - "3\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = 1\n", - "y = 2\n", - "x, y = y, x # \ud29c\ud50c\uc744 \uc774\uc6a9\ud55c \ub450 \uc790\ub8cc\uc758 \uac12 \ubcc0\uacbd\n", - "print x, y" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2 1\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \ud328\ud0b9\uacfc \uc5b8\ud328\ud0b9" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud328\ud0b9 (Packing): \ud558\ub098\uc758 \ud29c\ud50c \uc548\uc5d0 \uc5ec\ub7ec \uac1c\uc758 \ub370\uc774\ud130\ub97c \ub123\ub294 \uc791\uc5c5" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = 1, 2, 'hello'" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 7 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc5b8\ud328\ud0b9 (Unpacking): \ud558\ub098\uc758 \ud29c\ud50c\uc5d0\uc11c \uc5ec\ub7ec \uac1c\uc758 \ub370\uc774\ud130\ub97c \ud55c\uaebc\ubc88\uc5d0 \uaebc\ub0b4\uc640 \uac01\uac01 \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud558\ub294 \uc791\uc5c5" + "1 (2, 3)\n", + "3\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x, y, z = t" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 19 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8\ub85c\ub3c4 \ube44\uc2b7\ud55c \uc791\uc5c5\uc774 \uac00\ub2a5\ud558\uc9c0\ub9cc, \ub2e8\uc21c \ud328\ud0b9/\uc5b8\ud328\ud0b9 \uc791\uc5c5\ub9cc\uc744 \ubaa9\uc801\uc73c\ub85c \ud55c\ub2e4\uba74 \ud29c\ud50c \uc0ac\uc6a9 \ucd94\ucc9c" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = ['foo', 'bar', 4, 5]\n", - "[x, y, z, w] = a" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 22 - }, + } + ], + "source": [ + "t = (1, 2, 3)\n", + "print(t * 2) # 반복\n", + "print(t + ('PyKUG', 'users')) # 연결\n", + "print(t)\n", + "print()\n", + "\n", + "print(t[0], t[1:3]) # 인덱싱, 슬라이싱\n", + "print(len(t)) # 길이\n", + "print(1 in t) # 멤버십 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud29c\ud50c\uacfc \ub9ac\uc2a4\ud2b8\uc640\uc758 \uacf5\ud1b5\uc810\n", - " - \uc6d0\uc18c\ub85c\uc11c \uc784\uc758\uc758 \uac1d\uccb4\ub97c \uc800\uc7a5\n", - " - \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\n", - " - \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc5f0\uacb0, \ubc18\ubcf5, \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8 \uc5f0\uc0b0 \uc9c0\uc6d0\n", - " \n", - "- \ub9ac\uc2a4\ud2b8\uc640 \ub2e4\ub978 \ud29c\ud50c\ub9cc\uc758 \ud2b9\uc9d5\n", - " - \ubcc0\uacbd \ubd88\uac00\ub2a5 (Immutable)\n", - " - \uba54\uc18c\ub4dc\ub97c \uac00\uc9c0\uc9c0 \uc54a\ub294\ub2e4.\n", - "\n", - "- list() \uc640 tuple() \ub0b4\uc7a5 \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub9ac\uc2a4\ud2b8\uc640 \ud29c\ud50c\uc744 \uc0c1\ud638 \ubcc0\ud658\ud560 \uc218 \uc788\uc74c" + "ename": "TypeError", + "evalue": "'tuple' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m \u001b[0;31m# 튜플은 변경 불가능, 에러발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "T = (1,2,3,4,5)\n", - "L = list(T)\n", - "L[0] = 100\n", - "print L\n", - "\n", - "T = tuple(L)\n", - "print T" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[100, 2, 3, 4, 5]\n", - "(100, 2, 3, 4, 5)\n" - ] - } - ], - "prompt_number": 25 - }, + } + ], + "source": [ + "t[0] = 100 # 튜플은 변경 불가능, 에러발생" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ud29c\ud50c\uc758 \uc0ac\uc6a9 \uc6a9\ub3c4" + "name": "stdout", + "output_type": "stream", + "text": [ + "((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))\n", + "([1, 2, 3], (1, 2, 4))\n", + "({1: 'abc', 2: 'def'}, (1, 2, 3))\n" ] - }, + } + ], + "source": [ + "t = (12345, 54321, 'hello!') \n", + "u = t, (1, 2, 3, 4, 5) # 튜플 내부 원소로 다른 튜플을 가질 수 있음\n", + "print(u)\n", + "\n", + "t2 = [1, 2, 3] # 튜플 내부 원소로 리스트 가질 수 있음 \n", + "u2 = t2, (1, 2, 4)\n", + "print(u2)\n", + "\n", + "t3 = {1:\"abc\", 2:\"def\"} # 튜플 내부 원소로 사전 가질 수 있음 \n", + "u3 = t3, (1, 2, 3)\n", + "print(u3)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud29c\ud50c\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 1: \ud568\uc218\uac00 \ud558\ub098 \uc774\uc0c1\uc758 \uac12\uc744 \ub9ac\ud134\ud558\ub294 \uacbd\uc6b0" + "name": "stdout", + "output_type": "stream", + "text": [ + " \n", + "1\n", + "2\n", + "3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def calc(a, b):\n", - " return a+b, a*b\n", - "\n", - "x, y = calc(5, 4)" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 27 - }, + } + ], + "source": [ + "x, y, z = 1, 2, 3 # 튜플을 이용한 복수 개의 자료 할당\n", + "print(type(x), type(y), type(z))\n", + "print(x)\n", + "print(y)\n", + "print(z)\n", + "\n", + "\n", + "# \n", + "# 1\n", + "# 2\n", + "# 3" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud29c\ud50c\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 2: \ubb38\uc790\uc5f4 \ud3ec\uba67\ud305" + "name": "stdout", + "output_type": "stream", + "text": [ + "2 1\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print 'id : %s, name : %s' % ('gslee', 'GangSeong')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "id : gslee, name : GangSeong\n" - ] - } - ], - "prompt_number": 28 - }, + } + ], + "source": [ + "x = 1\n", + "y = 2\n", + "x, y = y, x # 튜플을 이용한 두 자료의 값 변경\n", + "print(x, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 패킹과 언패킹" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 패킹 (Packing): 하나의 튜플 안에 여러 개의 데이터를 넣는 작업" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "t = 1, 2, 'hello'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 언패킹 (Unpacking): 하나의 튜플에서 여러 개의 데이터를 한꺼번에 꺼내와 각각 변수에 할당하는 작업" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "x, y, z = t" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트로도 비슷한 작업이 가능하지만, 단순 패킹/언패킹 작업만을 목적으로 한다면 튜플 사용 추천" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "a = ['foo', 'bar', 4, 5]\n", + "[x, y, z, w] = a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 튜플과 리스트와의 공통점\n", + " - 원소로서 임의의 객체를 저장\n", + " - 시퀀스 자료형\n", + " - 인덱싱, 슬라이싱, 연결, 반복, 멤버쉽 테스트 연산 지원\n", + " \n", + "- 리스트와 다른 튜플만의 특징\n", + " - 변경 불가능 (Immutable)\n", + " - 메소드를 가지지 않는다.\n", + "\n", + "- list() 와 tuple() 내장 함수를 사용하여 리스트와 튜플을 상호 변환할 수 있음" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud29c\ud50c\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 3: \uace0\uc815\ub41c \uac12\uc744 \uc30d\uc73c\ub85c \ud45c\ud604\ud558\ub294 \uacbd\uc6b0" + "name": "stdout", + "output_type": "stream", + "text": [ + "[100, 2, 3, 4, 5]\n", + "(100, 2, 3, 4, 5)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one':1, 'two':2}\n", - "print d.items()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[('two', 2), ('one', 1)]\n" - ] - } - ], - "prompt_number": 10 - }, + } + ], + "source": [ + "T = (1,2,3,4,5)\n", + "L = list(T)\n", + "L[0] = 100\n", + "print(L)\n", + "\n", + "T = tuple(L)\n", + "print(T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 튜플의 사용 용도" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 튜플을 사용하는 경우 1: 함수가 하나 이상의 값을 리턴하는 경우" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def calc(a, b):\n", + " return a+b, a*b\n", + "\n", + "x, y = calc(5, 4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 튜플을 사용하는 경우 2: 문자열 포멧팅" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \uc9d1\ud569 \uc790\ub8cc\ud615\n", - "***\n", - "- set \ub0b4\uc7a5 \ud568\uc218\ub97c \uc0ac\uc6a9\ud55c \uc9d1\ud569 \uc790\ub8cc \uc0dd\uc131 \n", - " - \ubcc0\uacbd \uac00\ub2a5(Mutable)\ud55c \uac1d\uccb4\uc774\ub2e4.\n", - " - \uac01 \uc6d0\uc18c\uac04\uc5d0 \uc21c\uc11c\ub294 \uc5c6\ub2e4.\n", - " - \uac01 \uc6d0\uc18c\ub294 \uc911\ubcf5\ub420 \uc218 \uc5c6\ub2e4.\n", - " - [note] \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774 \uc544\ub2c8\ub2e4." + "name": "stdout", + "output_type": "stream", + "text": [ + "id : gslee, name : GangSeong\n" ] - }, + } + ], + "source": [ + "print('id : %s, name : %s' % ('gslee', 'GangSeong'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 튜플을 사용하는 경우 3: 고정된 값을 쌍으로 표현하는 경우" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \uc9d1\ud569 \uc790\ub8cc\ud615 \uc0dd\uc131" + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_items([('one', 1), ('two', 2)])\n" ] - }, + } + ], + "source": [ + "d = {'one':1, 'two':2}\n", + "print(d.items())\n", + "\n", + "\n", + "# [('two', 2), ('one', 1)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 집합 자료형\n", + "***\n", + "- set 내장 함수를 사용한 집합 자료 생성 \n", + " - 변경 가능(Mutable)한 객체이다.\n", + " - 각 원소간에 순서는 없다.\n", + " - 각 원소는 중복될 수 없다.\n", + " - [note] 시퀀스 자료형이 아니다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 집합 자료형 생성" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = set([1, 2, 3])\n", - "print type(a)\n", - "print a\n", - "print\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "{1, 2, 3}\n", "\n", - "b = set((1, 2, 3))\n", - "print type(b)\n", - "print b\n", - "print\n", + "\n", + "{1, 2, 3}\n", "\n", - "c = set({'a':1, 'b':2, 'c':3})\n", - "print type(c)\n", - "print c\n", - "print\n", + "\n", + "{'c', 'a', 'b'}\n", "\n", - "d = set({'a':1, 'b':2, 'c':3}.values())\n", - "print type(d)\n", - "print d" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "set([1, 2, 3])\n", - "\n", - "\n", - "set([1, 2, 3])\n", - "\n", - "\n", - "set(['a', 'c', 'b'])\n", - "\n", - "\n", - "set([1, 2, 3])\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- set\uc758 \uc6d0\uc18c\ub85c\ub294 \ubcc0\uacbd \ubd88\uac00\ub2a5(Immutable)\ud55c \uac83\ub9cc \ud560\ub2f9 \uac00\ub2a5\ud558\ub2e4." + "\n", + "{1, 2, 3}\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print set() # \ube48 set \uac1d\uccb4 \uc0dd\uc131\n", - "print set([1,2,3,4,5]) # \ucd08\uae30 \uac12\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc778 \ub9ac\uc2a4\ud2b8\ub97c \ub123\uc5b4\uc900\ub2e4.\n", - "print set([1,2,3,2,3,4]) # \uc911\ubcf5\ub41c \uc6d0\uc18c\ub294 \ud55c \ubc88\ub9cc \ud45c\ud604\n", - "print set('abc') # \ubb38\uc790\uc5f4\uc740 \uac01 \ubb38\uc790\ub97c \uc9d1\ud569 \uc6d0\uc18c\ub85c \uc9c0\ub2cc\ub2e4. \n", - "print set([(1,2,3),(4,5,6)]) # \uac01 \ud29c\ud50c\uc740 \uc6d0\uc18c\ub85c \uac00\uc9c8 \uc218 \uc788\uc74c \n", - "print set([[1,2,3],[4,5,6]]) # \ubcc0\uacbd \uac00\ub2a5 \uc790\ub8cc\uc778 \ub9ac\uc2a4\ud2b8\ub294 \uc9d1\ud569\uc758 \uc6d0\uc18c\uac00 \ub420 \uc218 \uc5c6\ub2e4." - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([])\n", - "set([1, 2, 3, 4, 5])\n", - "set([1, 2, 3, 4])\n", - "set(['a', 'c', 'b'])\n", - "set([(4, 5, 6), (1, 2, 3)])\n" - ] - }, - { - "ename": "TypeError", - "evalue": "unhashable type: 'list'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubb38\uc790\uc5f4\uc740 \uac01 \ubb38\uc790\ub97c \uc9d1\ud569 \uc6d0\uc18c\ub85c \uc9c0\ub2cc\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \uac01 \ud29c\ud50c\uc740 \uc6d0\uc18c\ub85c \uac00\uc9c8 \uc218 \uc788\uc74c\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubcc0\uacbd \uac00\ub2a5 \uc790\ub8cc\uc778 \ub9ac\uc2a4\ud2b8\ub294 \uc9d1\ud569\uc758 \uc6d0\uc18c\uac00 \ub420 \uc218 \uc5c6\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" - ] - } - ], - "prompt_number": 1 - }, + } + ], + "source": [ + "a = set([1, 2, 3])\n", + "print(type(a))\n", + "print(a)\n", + "print()\n", + "\n", + "b = set((1, 2, 3))\n", + "print(type(b))\n", + "print(b)\n", + "print()\n", + "\n", + "c = set({'a':1, 'b':2, 'c':3})\n", + "print(type(c))\n", + "print(c)\n", + "print()\n", + "\n", + "d = set({'a':1, 'b':2, 'c':3}.values())\n", + "print(type(d))\n", + "print(d)\n", + "\n", + "\n", + "# \n", + "# set([1, 2, 3])\n", + "\n", + "# \n", + "# set([1, 2, 3])\n", + "\n", + "# \n", + "# set(['a', 'c', 'b'])\n", + "\n", + "# \n", + "# set([1, 2, 3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set의 원소로는 변경 불가능(Immutable)한 것만 할당 가능하다." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- set\uc758 \uae30\ubcf8 \uc5f0\uc0b0\n", - "\n", - "| set \uc5f0\uc0b0 | \ub3d9\uc77c \uc5f0\uc0b0\uc790 | \ub0b4\uc6a9 |\n", - "|---------------------------|-------------|-----------------------------|\n", - "| len(s) | | \uc6d0\uc18c\uc758 \uac1c\uc218 |\n", - "| x in s | | x\uac00 \uc9d1\ud569 s\uc758 \uc6d0\uc18c\uc778\uac00? |\n", - "| x not in s | | x\uac00 \uc9d1\ud569 s\uc758 \uc6d0\uc18c\uac00 \uc544\ub2cc\uac00? |" + "name": "stdout", + "output_type": "stream", + "text": [ + "set()\n", + "{1, 2, 3, 4, 5}\n", + "{1, 2, 3, 4}\n", + "{'c', 'a', 'b'}\n", + "{(4, 5, 6), (1, 2, 3)}\n" ] }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "\n", - "print len(A) # \uc9d1\ud569\uc758 \uc6d0\uc18c\uc758 \uc218\n", - "print 5 in A # \uba64\ubc84\uc2ed \ud14c\uc2a4\ud2b8\n", - "print 10 not in A # \uba64\ubc84\uc2ed \ud14c\uc2a4\ud2b8" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9\n", - "True\n", - "True\n" - ] - } - ], - "prompt_number": 34 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \uc9d1\ud569 \uc790\ub8cc\ud615 \uba54\uc18c\ub4dc" + "ename": "TypeError", + "evalue": "unhashable type: 'list'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 문자열은 각 문자를 집합 원소로 지닌다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 각 튜플은 원소로 가질 수 있음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" ] - }, + } + ], + "source": [ + "print(set()) # 빈 set 객체 생성\n", + "print(set([1,2,3,4,5])) # 초기 값은 일반적으로 시퀀스 자료형인 리스트를 넣어준다.\n", + "print(set([1,2,3,2,3,4])) # 중복된 원소는 한 번만 표현\n", + "print(set('abc')) # 문자열은 각 문자를 집합 원소로 지닌다. \n", + "print(set([(1,2,3),(4,5,6)])) # 각 튜플은 원소로 가질 수 있음 \n", + "print(set([[1,2,3],[4,5,6]])) # 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다.\n", + "\n", + "\n", + "# set([])\n", + "# set([1, 2, 3, 4, 5])\n", + "# set([1, 2, 3, 4])\n", + "# set(['a', 'c', 'b'])\n", + "# set([(4, 5, 6), (1, 2, 3)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set의 기본 연산\n", + "\n", + "| set 연산 | 동일 연산자 | 내용 |\n", + "|---------------------------|-------------|-----------------------------|\n", + "| len(s) | | 원소의 개수 |\n", + "| x in s | | x가 집합 s의 원소인가? |\n", + "| x not in s | | x가 집합 s의 원소가 아닌가? |" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- set\uc758 \uc8fc\uc694 \uba54\uc18c\ub4dc\n", - " - \ub2e4\uc74c \uc5f0\uc0b0\uc740 \uc6d0\ub798 \uc9d1\ud569\uc740 \ubcc0\uacbd\ud558\uc9c0 \uc54a\uace0 \uc0c8\ub85c\uc6b4 \uc9d1\ud569\uc744 \ubc18\ud658\ud55c\ub2e4. \n", - "\n", - "| set \uc5f0\uc0b0 | \ub3d9\uc77c \uc5f0\uc0b0\uc790 | \ub0b4\uc6a9 |\n", - "|---------------------------|-------------|-----------------------------|\n", - "| s.issubset(t) | s <= t | s\uac00 t\uc758 \ubd80\ubd84\uc9d1\ud569\uc778\uac00? |\n", - "| s.issuperset(t) | s >= t | s\uac00 t\uc758 \uc288\ud37c\uc9d1\ud569\uc778\uac00? |\n", - "| s.union(t) | s | t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \ud569\uc9d1\ud569 |\n", - "| s.intersection(t) | s & t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \uad50\uc9d1\ud569 |\n", - "| s.difference(t) | s - t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \ucc28\uc9d1\ud569 |\n", - "| s.symmetric_difference(t) | s ^ t | \uc0c8\ub85c\uc6b4 s\uc640 t\uc758 \ubc30\ud0c0\uc9d1\ud569 |\n", - "| s.copy() | | \uc9d1\ud569 s\uc758 shallow \ubcf5\uc0ac |" + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n", + "True\n", + "True\n" ] - }, + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "\n", + "print(len(A)) # 집합의 원소의 수\n", + "print(5 in A) # 멤버십 테스트\n", + "print(10 not in A) # 멤버십 테스트" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 집합 자료형 메소드" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set의 주요 메소드\n", + " - 다음 연산은 원래 집합은 변경하지 않고 새로운 집합을 반환한다. \n", + "\n", + "| set 연산 | 동일 연산자 | 내용 |\n", + "|---------------------------|-------------|-----------------------------|\n", + "| s.issubset(t) | s <= t | s가 t의 부분집합인가? |\n", + "| s.issuperset(t) | s >= t | s가 t의 슈퍼집합인가? |\n", + "| s.union(t) | s | t | 새로운 s와 t의 합집합 |\n", + "| s.intersection(t) | s & t | 새로운 s와 t의 교집합 |\n", + "| s.difference(t) | s - t | 새로운 s와 t의 차집합 |\n", + "| s.symmetric_difference(t) | s ^ t | 새로운 s와 t의 배타집합 |\n", + "| s.copy() | | 집합 s의 shallow 복사 |" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "B = set([4,5,6,10,20,30])\n", - "C = set([10,20,30])\n", - "\n", - "print C.issubset(B) # C\uac00 B\uc758 \ubd80\ubd84\uc9d1\ud569?\n", - "print C <= B\n", - "print B.issuperset(C) # B\uac00 C\ub97c \ud3ec\ud568\ud558\ub294 \uc9d1\ud569?\n", - "print B >= C\n", - "print" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n", - "True\n", - "True\n", - "\n" - ] - } - ], - "prompt_number": 33 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n", + "\n" + ] + } + ], + "source": [ + "B = set([4,5,6,10,20,30])\n", + "C = set([10,20,30])\n", + "\n", + "print(C.issubset(B)) # C가 B의 부분집합?\n", + "print(C <= B)\n", + "print(B.issuperset(C)) # B가 C를 포함하는 집합?\n", + "print(B >= C)\n", + "print()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "B = set([4,5,6,10,20,30])\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30}\n", + "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", "\n", - "print A.union(B) # A\uc640 B\uc758 \ud569\uc9d1\ud569\n", - "print A\n", - "print\n", + "{4, 5, 6}\n", + "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", "\n", - "print A.intersection(B) # A\uc640 B\uc758 \uad50\uc9d1\ud569\n", - "print A\n", - "print\n", + "{1, 2, 3, 7, 8, 9}\n", + "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", "\n", - "print A.difference(B) # A - B (\ucc28\uc9d1\ud569)\n", - "print A\n", - "print\n", - "\n", - "print A.symmetric_difference(B) # \ubca0\ud0c0\uc9d1\ud569. A\uc640 B\uc758 \ud569\uc9d1\ud569\uc5d0\uc11c \uad50\uc9d1\ud569\uc758 \uc6d0\uc18c\ub97c \uc81c\uc678\ud55c \uc9d1\ud569\n", - "print A" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([4, 5, 6])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([1, 2, 3, 7, 8, 9])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n" - ] - } - ], - "prompt_number": 17 - }, + "{1, 2, 3, 7, 8, 9, 10, 20, 30}\n", + "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n" + ] + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "B = set([4,5,6,10,20,30])\n", + "\n", + "print(A.union(B)) # A와 B의 합집합\n", + "print(A)\n", + "print()\n", + "\n", + "print(A.intersection(B)) # A와 B의 교집합\n", + "print(A)\n", + "print()\n", + "\n", + "print(A.difference(B)) # A - B (차집합)\n", + "print(A)\n", + "print()\n", + "\n", + "print(A.symmetric_difference(B)) # 베타집합. A와 B의 합집합에서 교집합의 원소를 제외한 집합\n", + "print(A)\n", + "\n", + "\n", + "# set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", + "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "# set([4, 5, 6])\n", + "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "# set([1, 2, 3, 7, 8, 9])\n", + "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "# set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", + "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "B = set([4,5,6,10,20,30])\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30}\n", + "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", "\n", - "print A | B # A\uc640 B\uc758 \ud569\uc9d1\ud569\n", - "print A\n", - "print\n", + "{4, 5, 6}\n", + "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", "\n", - "print A & B # A\uc640 B\uc758 \uad50\uc9d1\ud569\n", - "print A\n", - "print\n", + "{1, 2, 3, 7, 8, 9}\n", + "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", "\n", - "print A - B #A - B (\ucc28\uc9d1\ud569)\n", - "print A\n", - "print\n", - "\n", - "print A.symmetric_difference(B) # \ubca0\ud0c0\uc9d1\ud569. A\uc640 B\uc758 \ud569\uc9d1\ud569\uc5d0\uc11c \uad50\uc9d1\ud569\uc758 \uc6d0\uc18c\ub97c \uc81c\uc678\ud55c \uc9d1\ud569\n", - "print A ^ B\n", - "print A" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([4, 5, 6])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([1, 2, 3, 7, 8, 9])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", - "set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n" - ] - } - ], - "prompt_number": 18 - }, + "{1, 2, 3, 7, 8, 9, 10, 20, 30}\n", + "{1, 2, 3, 7, 8, 9, 10, 20, 30}\n", + "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n" + ] + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "B = set([4,5,6,10,20,30])\n", + "\n", + "print(A | B) # A와 B의 합집합\n", + "print(A)\n", + "print()\n", + "\n", + "print(A & B) # A와 B의 교집합\n", + "print(A)\n", + "print()\n", + "\n", + "print(A - B) #A - B (차집합)\n", + "print(A)\n", + "print()\n", + "\n", + "print(A.symmetric_difference(B)) # 베타집합. A와 B의 합집합에서 교집합의 원소를 제외한 집합\n", + "print(A ^ B)\n", + "print(A)\n", + "\n", + "\n", + "# set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", + "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "# set([4, 5, 6])\n", + "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "# set([1, 2, 3, 7, 8, 9])\n", + "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "# set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", + "# set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", + "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "D = A.copy()\n", - "print D\n", - "print\n", + "name": "stdout", + "output_type": "stream", + "text": [ + "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", "\n", - "print A == D #\uc790\ub8cc\uac12 \ube44\uad50\n", - "print A is D #\uac1d\uccb4 \ub3d9\ub4f1\uc131 \ube44\uad50" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "True\n", - "False\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- set\uc740 \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc774 \uc544\ub2c8\ubbc0\ub85c \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc815\ub82c \ub4f1\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294\ub2e4. " + "True\n", + "False\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "print A[0]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'set' object does not support indexing", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'set' object does not support indexing" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print A[1:4]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'set' object has no attribute '__getitem__'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'set' object has no attribute '__getitem__'" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print A.sort()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'set' object has no attribute 'sort'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'set' object has no attribute 'sort'" - ] - } - ], - "prompt_number": 11 - }, + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "D = A.copy()\n", + "print(D)\n", + "print()\n", + "\n", + "print(A == D) #자료값 비교\n", + "print(A is D) #객체 동등성 비교\n", + "\n", + "\n", + "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "\n", + "# True\n", + "# False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set은 시퀀스 자료형이 아니므로 인덱싱, 슬라이싱, 정렬 등을 지원하지 않는다. " + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc9d1\ud569\uc744 \ub9ac\uc2a4\ud2b8\ub098 \ud29c\ud50c\ub85c \ubcc0\uacbd\uac00\ub2a5\n", - " - \uc9d1\ud569\uc5d0 \uc778\ub371\uc2f1, \uc2ac\ub77c\uc774\uc2f1, \uc815\ub82c \ub4f1\uc744 \uc801\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub9ac\uc2a4\ud2b8\ub098 \ud29c\ud50c\ub85c \ubcc0\uacbd\ud55c\ub2e4." + "ename": "TypeError", + "evalue": "'set' object does not support indexing", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'set' object does not support indexing" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print list(A)\n", - "print tuple(A)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2, 3, 4, 5, 6, 7, 8, 9]\n", - "(1, 2, 3, 4, 5, 6, 7, 8, 9)\n" - ] - } - ], - "prompt_number": 14 - }, + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "print(A[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud558\uc9c0\ub9cc \uc9d1\ud569\uc5d0 for ~ in \uc5f0\uc0b0\uc740 \uc801\uc6a9 \uac00\ub2a5\ud558\ub2e4." + "ename": "TypeError", + "evalue": "'set' object is not subscriptable", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'set' object is not subscriptable" ] - }, + } + ], + "source": [ + "print(A[1:4])" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "for ele in A:\n", - " print ele," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 2 3 4 5 6 7 8 9\n" - ] - } - ], - "prompt_number": 15 - }, + "ename": "AttributeError", + "evalue": "'set' object has no attribute 'sort'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: 'set' object has no attribute 'sort'" + ] + } + ], + "source": [ + "print(A.sort())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 집합을 리스트나 튜플로 변경가능\n", + " - 집합에 인덱싱, 슬라이싱, 정렬 등을 적용하기 위해서는 리스트나 튜플로 변경한다." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- set\uc740 \ubcc0\uacbd \uac00\ub2a5(Mutable)\ud55c \uc790\ub8cc \uad6c\uc870 \uac1d\uccb4 \n", - "- \ub2e4\uc74c \uba54\uc18c\ub4dc\ub4e4\uc740 set\uc744 \ubcc0\uacbd\ud558\ub294 \uc9d1\ud569 \uc790\ub8cc \uad6c\uc870 \uba54\uc18c\ub4dc\ub4e4\uc784\n", - "\n", - "| set \uc5f0\uc0b0 | \ub3d9\uc77c \uc5f0\uc0b0\uc790 | \ub0b4\uc6a9 |\n", - "|---------------------------|-------------|-----------------------------|\n", - "| s.update(t) | s |= t | s\uc640 t\uc758 \ud569\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", - "| s.intersection_update(t) | s &= t | s\uc640 t\uc758 \uad50\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", - "| s.difference_update(t) | s -= t | s\uc640 t\uc758 \ucc28\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", - "| s.symmetric_difference_update(t)| s ^= t | s\uc640 t\uc758 \ubc30\ud0c0\uc9d1\ud569\uc744 s\uc5d0 \uc800\uc7a5 |\n", - "| s.add(x) | | \uc6d0\uc18c x\ub97c \uc9d1\ud569 s\uc5d0 \ucd94\uac00 |\n", - "| s.remove(x) | | \uc6d0\uc18c x\ub97c \uc9d1\ud569 s\uc5d0\uc11c \uc81c\uac70, \uc6d0\uc18c x\uac00 \uc9d1\ud569 s\uc5d0 \uc5c6\uc73c\uba74 \uc608\uc678 \ubc1c\uc0dd |\n", - "| s.discard(x) | | \uc6d0\uc18c x\ub97c \uc9d1\ud569 s\uc5d0\uc11c \uc81c\uac70 |\n", - "| s.pop() | | \uc784\uc758\uc758 \uc6d0\uc18c\ub97c \uc9d1\ud569 s\uc5d0\uc11c \uc81c\uac70, \uc9d1\ud569 s\uac00 \uacf5\uc9d1\ud569\uc774\uba74 \uc608\uc678 \ubc1c\uc0dd |\n", - "| s.clear() | | \uc9d1\ud569 s\uc758 \ubaa8\ub4e0 \uc6d0\uc18c \uc81c\uac70 |" + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "(1, 2, 3, 4, 5, 6, 7, 8, 9)\n" ] - }, + } + ], + "source": [ + "print(list(A))\n", + "print(tuple(A))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 하지만 집합에 for ~ in 연산은 적용 가능하다." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "A = set([1,2,3,4])\n", - "B = set([3,4,5,6])\n", - "\n", - "A.update(B) # A\uc5d0 B \uc9d1\ud569\uc758 \uc6d0\uc18c\ub97c \ucd94\uac00 \uc2dc\ud0b4\n", - "print A\n", - "\n", - "A.intersection_update([4,5,6,7,8]) # &=\n", - "print A\n", - "\n", - "A.difference_update([6,7,8]) # -=\n", - "print A\n", - "\n", - "A.symmetric_difference_update([5,6,7]) # ^=\n", - "print A\n", - "\n", - "A.add(8) # \uc6d0\uc18c \ucd94\uac00\n", - "print A\n", - "\n", - "A.remove(8) # \uc6d0\uc18c \uc81c\uac70\n", - "print A" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([1, 2, 3, 4, 5, 6])\n", - "set([4, 5, 6])\n", - "set([4, 5])\n", - "set([4, 6, 7])\n", - "set([8, 4, 6, 7])\n", - "set([4, 6, 7])\n" - ] - } - ], - "prompt_number": 40 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3 4 5 6 7 8 9 " + ] + } + ], + "source": [ + "A = set([1,2,3,4,5,6,7,8,9])\n", + "for ele in A:\n", + " print(ele,end=\" \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set은 변경 가능(Mutable)한 자료 구조 객체 \n", + "- 다음 메소드들은 set을 변경하는 집합 자료 구조 메소드들임\n", + "\n", + "| set 연산 | 동일 연산자 | 내용 |\n", + "|---------------------------|-------------|-----------------------------|\n", + "| s.update(t) | s |= t | s와 t의 합집합을 s에 저장 |\n", + "| s.intersection_update(t) | s &= t | s와 t의 교집합을 s에 저장 |\n", + "| s.difference_update(t) | s -= t | s와 t의 차집합을 s에 저장 |\n", + "| s.symmetric_difference_update(t)| s ^= t | s와 t의 배타집합을 s에 저장 |\n", + "| s.add(x) | | 원소 x를 집합 s에 추가 |\n", + "| s.remove(x) | | 원소 x를 집합 s에서 제거, 원소 x가 집합 s에 없으면 예외 발생 |\n", + "| s.discard(x) | | 원소 x를 집합 s에서 제거 |\n", + "| s.pop() | | 임의의 원소를 집합 s에서 제거, 집합 s가 공집합이면 예외 발생 |\n", + "| s.clear() | | 집합 s의 모든 원소 제거 |" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "A.remove(10) # \uc5c6\ub294 \uc6d0\uc18c\ub97c \uc81c\uac70\ud558\uba74 KeyError \ubc1c\uc0dd" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "10", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#\uc5c6\ub294 \uc6d0\uc18c\ub97c \uc81c\uac70\ud558\uba74 KeyError \ubc1c\uc0dd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m: 10" - ] - } - ], - "prompt_number": 21 - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "{1, 2, 3, 4, 5, 6}\n", + "{4, 5, 6}\n", + "{4, 5}\n", + "{4, 6, 7}\n", + "{4, 6, 7, 8}\n", + "{4, 6, 7}\n" + ] + } + ], + "source": [ + "A = set([1,2,3,4])\n", + "B = set([3,4,5,6])\n", + "\n", + "A.update(B) # A에 B 집합의 원소를 추가 시킴\n", + "print(A)\n", + "\n", + "A.intersection_update([4,5,6,7,8]) # &=\n", + "print(A)\n", + "\n", + "A.difference_update([6,7,8]) # -=\n", + "print(A)\n", + "\n", + "A.symmetric_difference_update([5,6,7]) # ^=\n", + "print(A)\n", + "\n", + "A.add(8) # 원소 추가\n", + "print(A)\n", + "\n", + "A.remove(8) # 원소 제거\n", + "print(A)\n", + "\n", + "\n", + "# set([1, 2, 3, 4, 5, 6])\n", + "# set([4, 5, 6])\n", + "# set([4, 5])\n", + "# set([4, 6, 7])\n", + "# set([8, 4, 6, 7])\n", + "# set([4, 6, 7])" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "scrolled": true + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "A.discard(10) # remove\uc640 \uac19\uc73c\ub098 \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc74c\n", - "A.discard(6) # \uc6d0\uc18c 6\uc81c\uac70\n", - "print A\n", - "\n", - "A.pop() # \uc784\uc758\uc758 \uc6d0\uc18c \ud558\ub098 \uaebc\ub0b4\uae30\n", - "print A \n", - "\n", - "A = set([1,2,3,4])\n", - "A.clear() # \uc6d0\uc18c\ub4e4 \uc5c6\uc560\uae30\n", - "print A" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "set([4, 7])\n", - "set([7])\n", - "set([])\n" - ] - } - ], - "prompt_number": 41 - }, + "ename": "KeyError", + "evalue": "10", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 없는 원소를 제거하면 KeyError 발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 10" + ] + } + ], + "source": [ + "A.remove(10) # 없는 원소를 제거하면 KeyError 발생" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + "name": "stdout", + "output_type": "stream", + "text": [ + "{4, 7}\n", + "{7}\n", + "set()\n" ] } ], - "metadata": {} + "source": [ + "A.discard(10) # remove와 같으나 예외가 발생하지 않음\n", + "A.discard(6) # 원소 6제거\n", + "print(A)\n", + "\n", + "A.pop() # 임의의 원소 하나 꺼내기\n", + "print(A)\n", + "\n", + "A = set([1,2,3,4])\n", + "A.clear() # 원소들 없애기\n", + "print(A)\n", + "\n", + "\n", + "# set([4, 7])\n", + "# set([7])\n", + "# set([])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python12.ipynb b/python3.6/python12.ipynb index 0aeddf7..6b0cdfe 100644 --- a/python3.6/python12.ipynb +++ b/python3.6/python12.ipynb @@ -1,694 +1,703 @@ { - "metadata": { - "celltoolbar": "Raw Cell Format", - "name": "", - "signature": "sha256:118de544f1b6b0240b193fd4cb88dd0599a38507af3056036f93153d7914bf90" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 12. \uc0ac\uc804(Dictionaries)\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \uc0ac\uc804 \ud65c\uc6a9\ubc95\n", - "***\n", - "- \uc0ac\uc804(Dictionary) \uac1d\uccb4\uc758 \ud2b9\uc9d5\n", - " - \uc9d1\ud569\uc801 \uc790\ub8cc\ud615\n", - " - \uc790\ub8cc\uc758 \uc21c\uc11c\ub97c \uc815\ud558\uc9c0 \uc54a\ub294 \ub9e4\ud551(Mapping)\ud615\n", - " - \ud0a4(Key)\ub97c \uc774\uc6a9\ud558\uc5ec \uac12(Value)\uc5d0 \uc811\uadfc\n", - " - \uc2dc\ud000\uc2a4 \uc790\ub8cc\ud615\uc740 \uc544\ub2d8\n", - " - \ud0a4\uc640 \uac12\uc758 \ub9e4\ud551 1\uac1c\ub97c \uc544\uc774\ud15c(item)\uc774\ub77c\uace0 \ubd80\ub984" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 12. 사전(Dictionaries)\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 사전 활용법\n", + "***\n", + "- 사전(Dictionary) 객체의 특징\n", + " - 집합적 자료형\n", + " - 자료의 순서를 정하지 않는 매핑(Mapping)형\n", + " - 키(Key)를 이용하여 값(Value)에 접근\n", + " - 시퀀스 자료형은 아님\n", + " - 키와 값의 매핑 1개를 아이템(item)이라고 부름" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", - "print member['baseball'] # \uac80\uc0c9" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uac12\uc744 \uc800\uc7a5\ud560 \uc2dc\uc5d0 \ud0a4\ub97c \uc0ac\uc6a9\n", - " - \ud0a4\uac00 \uc5c6\ub2e4\uba74 \uc0c8\ub85c\uc6b4 \ud0a4\uc640 \uac12\uc758 \uc544\uc774\ud15c\uc774 \uc0dd\uc131\n", - " - \ud0a4\uac00 \uc774\ubbf8 \uc874\uc7ac\ud55c\ub2e4\uba74 \uadf8 \ud0a4\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\uc774 \ubcc0\uacbd" + } + ], + "source": [ + "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", + "print(member['baseball']) # 검색" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 값을 저장할 시에 키를 사용\n", + " - 키가 없다면 새로운 키와 값의 아이템이 생성\n", + " - 키가 이미 존재한다면 그 키에 해당하는 값이 변경" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'basketball': 5, 'soccer': 11, 'baseball': 9, 'volleyball': 6}\n", + "4\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", - "member['volleyball'] = 7 # \uc0c8\ub85c\uc6b4 \uc544\uc774\ud15c \uc124\uc815\n", - "member['volleyball'] = 6 # \ubcc0\uacbd\n", - "print member\n", - "print len(member) # \uc544\uc774\ud15c\uc758 \uac1c\uc218 \ubc18\ud658 " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'soccer': 11, 'basketball': 5, 'baseball': 9, 'volleyball': 6}\n", - "4\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804\uc744 \ucd9c\ub825\ud558\uba74 \uac01 \uc544\uc774\ud15c\ub4e4\uc774 \uc784\uc758\uc758 \uc21c\uc11c\ub85c \ucd9c\ub825\ub41c\ub2e4.\n", - "- \uc0c8\ub85c\uc6b4 \uc544\uc774\ud15c\uc774 \ub4e4\uc5b4\uc624\uba74 \ud0a4 \ub0b4\uc6a9\uc5d0 \ub530\ub77c \uadf8 \uc21c\uc11c\uac00 \ub2ec\ub77c\uc9c4\ub2e4.\n", - "- \ub0b4\ubd80\uc801\uc73c\ub85c \ud0a4 \ub0b4\uc6a9\uc5d0 \ub300\ud574 \ud574\uc26c(Hash) \uae30\ubc95\uc744 \uc0ac\uc6a9\n", - " - \uac80\uc0c9 \uc18d\ub3c4\uac00 \ub9e4\uc6b0 \ube60\ub984\n", - " - [\ucc38\uace0]: http://www.laurentluce.com/posts/python-dictionary-implementation/\n", - "- \ud0a4\uc640 \uac12 \ub9e4\ud551\uc5d0 \ub300\ud55c \uc544\uc774\ud15c\uc744 \uc0ad\uc81c\ud560 \ub54c\uc5d0\ub294 del\uacfc \ud568\uaed8 \ud0a4\uac12 \uba85\uc2dc " + } + ], + "source": [ + "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", + "member['volleyball'] = 7 # 새로운 아이템 설정\n", + "member['volleyball'] = 6 # 변경\n", + "print(member)\n", + "print(len(member)) # 아이템의 개수 반환 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전을 출력하면 각 아이템들이 임의의 순서로 출력된다.\n", + "- 새로운 아이템이 들어오면 키 내용에 따라 그 순서가 달라진다.\n", + "- 내부적으로 키 내용에 대해 해쉬(Hash) 기법을 사용\n", + " - 검색 속도가 매우 빠름\n", + " - [참고]: http://www.laurentluce.com/posts/python-dictionary-implementation/\n", + "- 키와 값 매핑에 대한 아이템을 삭제할 때에는 del과 함께 키값 명시 " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'soccer': 11, 'baseball': 9}\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", - "del member['basketball'] # \ud56d\ubaa9 \uc0ad\uc81c\n", - "print member" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'soccer': 11, 'baseball': 9}\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [\uc911\uc694] \ud0a4\ub294 \ubcc0\uacbd \ubd88\uac00\ub2a5 (Immutable) \uc790\ub8cc\ub9cc \uac00\ub2a5\n", - " - \ubb38\uc790\uc5f4, \uc22b\uc790, \ud29c\ud50c\uc740 \uac00\ub2a5\n", - " - \ub9ac\uc2a4\ud2b8, \uc0ac\uc804\uc740 \ud0a4\uac00 \ub420 \uc218 \uc5c6\uc74c\n", - "- \ubc18\uba74\uc5d0 \uc0ac\uc804\uc5d0 \uc785\ub825\ub418\ub294 \uac12\uc740 \uc784\uc758\uc758 \uac1d\uccb4" + } + ], + "source": [ + "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", + "del member['basketball'] # 항목 삭제\n", + "print(member)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [중요] 키는 변경 불가능 (Immutable) 자료만 가능\n", + " - 문자열, 숫자, 튜플은 가능\n", + " - 리스트, 사전은 키가 될 수 없음\n", + "- 반면에 사전에 입력되는 값은 임의의 객체" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unhashable type: 'list'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'tuple'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'list'\u001b[0m \u001b[0;31m# 리스트는 키가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {}\n", - "d['str'] = 'abc'\n", - "d[1] = 4\n", - "d[(1,2,3)] = 'tuple'\n", - "d[[1,2,3]] = 'list' # \ub9ac\uc2a4\ud2b8\ub294 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4." - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "unhashable type: 'list'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'tuple'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'list'\u001b[0m \u001b[0;31m# \ub9ac\uc2a4\ud2b8\ub294 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d[{1:2}] = 3 # \uc0ac\uc804\uc740 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4." - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "unhashable type: 'dict'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m3\u001b[0m \u001b[0;31m# \uc0ac\uc804\uc740 \ud0a4\uac00 \ub420 \uc218 \uc5c6\ub2e4.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'dict'" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc774\ub984\uc740 \uc0ac\uc804\uc758 \ud0a4\ub098 \uac12\uc73c\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud568" + } + ], + "source": [ + "d = {}\n", + "d['str'] = 'abc'\n", + "d[1] = 4\n", + "d[(1,2,3)] = 'tuple'\n", + "d[[1,2,3]] = 'list' # 리스트는 키가 될 수 없다." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unhashable type: 'dict'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m3\u001b[0m \u001b[0;31m# 사전은 키가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'dict'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a, b):\n", - " return a + b\n", - "\n", - "def sub(a, b):\n", - " return a - b\n", + } + ], + "source": [ + "d[{1:2}] = 3 # 사전은 키가 될 수 없다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 이름은 사전의 키나 값으로 사용 가능함" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n", + "-1\n", "\n", - "action = {0: add, 1: sub} # \ud568\uc218 \uc774\ub984\uc744 \uc0ac\uc804\uc758 \uac12\uc73c\ub85c \uc0ac\uc6a9\n", - "print action[0](4, 5)\n", - "print action[1](4, 5)\n", - "print\n", - "action2 = {add: 1, sub: 2} # \ud568\uc218 \uc774\ub984\uc744 \uc0ac\uc804\uc758 \ud0a4\ub85c \uc0ac\uc6a9\n", - "print action2[add]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9\n", - "-1\n", - "\n", - "1\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804\uc744 \uc0dd\uc131\ud558\ub294 \ub2e4\ub978 \ubc29\ubc95: \ub0b4\uc7a5\ud568\uc218 dict() \uc0ac\uc6a9" + "1\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = dict()\n", - "print type(d)\n", - "print \n", + } + ], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "def sub(a, b):\n", + " return a - b\n", + "\n", + "action = {0: add, 1: sub} # 함수 이름을 사전의 값으로 사용\n", + "print(action[0](4, 5))\n", + "print(action[1](4, 5))\n", + "print()\n", + "action2 = {add: 1, sub: 2} # 함수 이름을 사전의 키로 사용\n", + "print(action2[add])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전을 생성하는 다른 방법: 내장함수 dict() 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", "\n", - "print dict(one=1, two=2)\n", - "print dict([('one', 1), ('two', 2)])\n", - "print dict({'one':1, 'two':2})" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "{'two': 2, 'one': 1}\n", - "{'two': 2, 'one': 1}\n", - "{'two': 2, 'one': 1}\n" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "keys = ['one', 'two', 'three']\n", - "values = (1, 2, 3)\n", - "print zip(keys, values) # zip(): \ub450 \uac1c\uc758 \uc790\ub8cc\ub97c \uc21c\uc11c\ub300\ub85c \uc30d\uc73c\ub85c \ubb36\uc740 \ud29c\ud50c\ub4e4\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", - "print dict(zip(keys, values))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[('one', 1), ('two', 2), ('three', 3)]\n", - "{'three': 3, 'two': 2, 'one': 1}\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \uc0ac\uc804 \uba54\uc18c\ub4dc\n", - "***" + "{'one': 1, 'two': 2}\n", + "{'one': 1, 'two': 2}\n", + "{'one': 1, 'two': 2}\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804\uc774 \uc9c0\uc6d0\ud558\ub294 \uc911\uc694 \uba54\uc18c\ub4dc\n", - " - D.keys(): \uc0ac\uc804 D\uc5d0\uc11c \ud0a4\ub4e4\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\n", - " - D.values(): \uc0ac\uc804 D\uc5d0\uc11c \uac12\ub4e4\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\n", - " - D.items(): \uc0ac\uc804 D\uc5d0\uc11c \uac01 \uc544\uc774\ud15c\uc744 \ud29c\ud50c\ud615\ud0dc\ub85c \uac00\uc838\uc640 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\n", - "- key in D: \uc0ac\uc804 D\uc548\uc5d0 key\ub97c \ud0a4\uac12\uc744 \uac00\uc9c4 \uc544\uc774\ud15c\uc774 \uc788\ub294\uc9c0 \ud655\uc778" + } + ], + "source": [ + "d = dict()\n", + "print(type(d))\n", + "print()\n", + "\n", + "print(dict(one=1, two=2))\n", + "print(dict([('one', 1), ('two', 2)]))\n", + "print(dict({'one':1, 'two':2}))\n", + "\n", + "\n", + "# \n", + "\n", + "# {'two': 2, 'one': 1}\n", + "# {'two': 2, 'one': 1}\n", + "# {'two': 2, 'one': 1}" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "{'one': 1, 'two': 2, 'three': 3}\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + } + ], + "source": [ + "keys = ['one', 'two', 'three']\n", + "values = (1, 2, 3)\n", + "print(zip(keys, values)) # zip(): 두 개의 자료를 순서대로 쌍으로 묶은 튜플들의 리스트 반환\n", + "print(dict(zip(keys, values)))\n", + "\n", + "\n", + "# [('one', 1), ('two', 2), ('three', 3)]\n", + "# {'three': 3, 'two': 2, 'one': 1}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 사전 메소드\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전이 지원하는 중요 메소드\n", + " - D.keys(): 사전 D에서 키들을 리스트로 반환\n", + " - D.values(): 사전 D에서 값들을 리스트로 반환\n", + " - D.items(): 사전 D에서 각 아이템을 튜플형태로 가져와 리스트로 반환\n", + "- key in D: 사전 D안에 key를 키값을 가진 아이템이 있는지 확인" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_keys(['jack', 'jin', 'Joseph'])\n", + "dict_values([9465215, 1111, 6584321])\n", + "dict_items([('jack', 9465215), ('jin', 1111), ('Joseph', 6584321)])\n", "\n", - "print phone.keys() # \ud0a4\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", - "print phone.values() # \uac12\ub4e4\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", - "print phone.items() # (\ud0a4, \uac12)\uc758 \ub9ac\uc2a4\ud2b8 \ubc18\ud658\n", - "print\n", - "print 'jack' in phone # 'jack'\uc774 phone\uc758 \ud0a4\uc5d0 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n", - "print 'lee' in phone" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['jin', 'Joseph', 'jack']\n", - "[1111, 6584321, 9465215]\n", - "[('jin', 1111), ('Joseph', 6584321), ('jack', 9465215)]\n", - "\n", - "True\n", - "False\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- D2 = D.copy(): \uc0ac\uc804 D\ub97c \ubcf5\uc0ac\ud558\uc5ec D2 \uc0ac\uc804\uc5d0 \ud560\ub2f9\ud55c\ub2e4." + "True\n", + "False\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", - "p = phone # \uc0ac\uc804 \ub808\ud37c\ub7f0\uc2a4 \ubcf5\uc0ac. \uc0ac\uc804 \uac1d\uccb4\ub294 \uacf5\uc720\ub41c\ub2e4.\n", - "\n", - "phone['jack'] = 1234 # phone\uc744 \ubcc0\uacbd\ud558\uba74\n", - "print phone\n", - "print p # p\ub3c4 \ud568\uaed8 \ubcc0\uacbd\ub41c\ub2e4.\n", - "print\n", + } + ], + "source": [ + "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "\n", + "print(phone.keys()) # 키의 리스트 반환\n", + "print(phone.values()) # 값들의 리스트 반환\n", + "print(phone.items()) # (키, 값)의 리스트 반환\n", + "print()\n", + "print('jack' in phone) # 'jack'이 phone의 키에 포함되어 있는가?\n", + "print('lee' in phone)\n", + "\n", + "\n", + "# ['jin', 'Joseph', 'jack']\n", + "# [1111, 6584321, 9465215]\n", + "# [('jin', 1111), ('Joseph', 6584321), ('jack', 9465215)]\n", + "\n", + "# True\n", + "# False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- D2 = D.copy(): 사전 D를 복사하여 D2 사전에 할당한다." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'jack': 1234, 'jin': 1111, 'Joseph': 6584321}\n", + "{'jack': 1234, 'jin': 1111, 'Joseph': 6584321}\n", "\n", - "ph = phone.copy() # \uc0ac\uc804\ubcf5\uc0ac. \ubcc4\ub3c4\uc758 \uc0ac\uc804 \uac1d\uccb4\uac00 \ub9c8\ub828\ub41c\ub2e4.\n", - "phone['jack'] = 1111 # phone\uc744 \ubc14\uafd4\ub3c4\n", - "print phone\n", - "print ph # ph\ub294 \ubc14\ub00c\uc9c0 \uc54a\ub294\ub2e4." - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n", - "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n", - "\n", - "{'jin': 1111, 'Joseph': 6584321, 'jack': 1111}\n", - "{'jin': 1111, 'Joseph': 6584321, 'jack': 1234}\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [\uc8fc\uc758] D.copy()\ub294 Shallow Copy\ub97c \uc218\ud589\ud55c\ub2e4." + "{'jack': 1111, 'jin': 1111, 'Joseph': 6584321}\n", + "{'jack': 1234, 'jin': 1111, 'Joseph': 6584321}\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "phone = {'a': [1,2,3], 'b': 4}\n", - "phone2 = phone.copy()\n", - "print phone\n", - "print phone2\n", - "print\n", + } + ], + "source": [ + "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "p = phone # 사전 레퍼런스 복사. 사전 객체는 공유된다.\n", + "\n", + "phone['jack'] = 1234 # phone을 변경하면\n", + "print(phone)\n", + "print(p) # p도 함께 변경된다.\n", + "print()\n", + "\n", + "ph = phone.copy() # 사전복사. 별도의 사전 객체가 마련된다.\n", + "phone['jack'] = 1111 # phone을 바꿔도\n", + "print(phone)\n", + "print(ph) # ph는 바뀌지 않는다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [주의] D.copy()는 Shallow Copy를 수행한다." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'a': [1, 2, 3], 'b': 4}\n", + "{'a': [1, 2, 3], 'b': 4}\n", "\n", - "phone['b'] = 100\n", - "print phone\n", - "print phone2\n", - "print\n", + "{'a': [1, 2, 3], 'b': 100}\n", + "{'a': [1, 2, 3], 'b': 4}\n", "\n", - "phone['a'][0] = 100\n", - "print phone\n", - "print phone2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'a': [1, 2, 3], 'b': 4}\n", - "{'a': [1, 2, 3], 'b': 4}\n", - "\n", - "{'a': [1, 2, 3], 'b': 100}\n", - "{'a': [1, 2, 3], 'b': 4}\n", - "\n", - "{'a': [100, 2, 3], 'b': 100}\n", - "{'a': [100, 2, 3], 'b': 4}\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/shallow_copy.png)" + "{'a': [100, 2, 3], 'b': 100}\n", + "{'a': [100, 2, 3], 'b': 4}\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + } + ], + "source": [ + "phone = {'a': [1,2,3], 'b': 4}\n", + "phone2 = phone.copy()\n", + "print(phone)\n", + "print(phone2)\n", + "print()\n", + "\n", + "phone['b'] = 100\n", + "print(phone)\n", + "print(phone2)\n", + "print()\n", + "\n", + "phone['a'][0] = 100\n", + "print(phone)\n", + "print(phone2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/shallow_copy.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9465215\n", + "None\n" + ] + } + ], + "source": [ + "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "\n", + "print(ph.get('jack')) # 'jack'에 대한 값을 얻는다. ph['jack']과 같다.\n", + "print(ph.get('gslee')) # 'gslee'에 대한 값을 얻는다. 값이 없는 경우 None반환" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'gslee'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'jack'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m9465215\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'jin'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m1111\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Joseph'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m6584321\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mph\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'gslee'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# ph['gslee']는 키가 없는 경우 예외발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 'gslee'" + ] + } + ], + "source": [ + "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "print(ph['gslee']) # ph['gslee']는 키가 없는 경우 예외발생" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5284\n", + "{'jack': 9465215, 'jin': 1111, 'Joseph': 6584321}\n", "\n", - "print ph.get('jack') # 'jack'\uc5d0 \ub300\ud55c \uac12\uc744 \uc5bb\ub294\ub2e4. ph['jack']\uacfc \uac19\ub2e4.\n", - "print ph.get('gslee') # 'gslee'\uc5d0 \ub300\ud55c \uac12\uc744 \uc5bb\ub294\ub2e4. \uac12\uc774 \uc5c6\ub294 \uacbd\uc6b0 None\ubc18\ud658" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9465215\n", - "None\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", - "print ph['gslee'] # ph['gslee']\ub294 \ud0a4\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc608\uc678\ubc1c\uc0dd" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'gslee'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'jack'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m9465215\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'jin'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m1111\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Joseph'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m6584321\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mph\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'gslee'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# ph['gslee']\ub294 \ud0a4\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc608\uc678\ubc1c\uc0dd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m: 'gslee'" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", - "print ph.get('gslee', 5284) # \uc778\uc218\ub97c \ud558\ub098 \ub354 \uc81c\uacf5\ud558\uba74 'gslee'\uac00 \uc5c6\ub294 \uacbd\uc6b0\uc5d0 5284 \ub9ac\ud134\n", - "print ph # \uc0ac\uc804\uc5d0\ub294 \ubcc0\ud654\uac00 \uc5c6\ub2e4\n", - "print \n", + "('Joseph', 6584321)\n", + "{'jack': 9465215, 'jin': 1111}\n", "\n", - "print ph.popitem() # \uc784\uc758\uc758 \uc544\uc774\ud15c\uc744 \uaebc\ub0b8\ub2e4.\n", - "print ph\n", - "print\n", + "('jin', 1111)\n", + "{'jack': 9465215}\n", "\n", - "print ph.popitem() # \uc784\uc758\uc758 \uc544\uc774\ud15c\uc744 \uaebc\ub0b8\ub2e4.\n", - "print ph \n", - "print\n", + "9465215\n", + "{}\n" + ] + } + ], + "source": [ + "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "print(ph.get('gslee', 5284)) # 인수를 하나 더 제공하면 'gslee'가 없는 경우에 5284 리턴\n", + "print(ph) # 사전에는 변화가 없다\n", + "print()\n", + "\n", + "print(ph.popitem()) # 임의의 아이템을 꺼낸다.\n", + "print(ph)\n", + "print()\n", + "\n", + "print(ph.popitem()) # 임의의 아이템을 꺼낸다.\n", + "print(ph)\n", + "print()\n", + "\n", + "print(ph.pop('jack')) # 키 값을 통해 해당 아이템을 지정하여 꺼낸다.\n", + "print(ph)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'jack': 9465215, 'jin': 1111, 'Joseph': 6584321, 'kim': 12312, 'lee': 9090}\n", "\n", - "print ph.pop('jack') # \ud0a4 \uac12\uc744 \ud1b5\ud574 \ud574\ub2f9 \uc544\uc774\ud15c\uc744 \uc9c0\uc815\ud558\uc5ec \uaebc\ub0b8\ub2e4.\n", - "print ph" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "5284\n", - "{'jin': 1111, 'Joseph': 6584321, 'jack': 9465215}\n", - "\n", - "('jin', 1111)\n", - "{'Joseph': 6584321, 'jack': 9465215}\n", - "\n", - "('Joseph', 6584321)\n", - "{'jack': 9465215}\n", - "\n", - "9465215\n", - "{}\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", - "ph = {'kim':12312, 'lee': 9090}\n", - "phone.update(ph) # \uc0ac\uc804 phone\uc758 \ub0b4\uc6a9\uc744 ph\uc73c\ub85c \ucd94\uac00 \uac31\uc2e0\n", - "print phone\n", - "print\n", - "phone.clear() # \uc0ac\uc804\uc758 \ubaa8\ub4e0 \uc785\ub825\uc744 \uc5c6\uc564\ub2e4.\n", - "print phone" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'jin': 1111, 'Joseph': 6584321, 'jack': 9465215, 'kim': 12312, 'lee': 9090}\n", - "\n", - "{}\n" - ] - } - ], - "prompt_number": 14 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \ub8e8\ud504\ub97c \uc774\uc6a9\ud55c \uc0ac\uc804 \ub0b4\uc6a9 \ucc38\uc870\n", - "***" + "{}\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804\uc758 \ubaa8\ub4e0 \ud0a4\uac12\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \ucc38\uc870\ud558\ub294 \ubc29\ubc95" + } + ], + "source": [ + "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "ph = {'kim':12312, 'lee': 9090}\n", + "phone.update(ph) # 사전 phone의 내용을 ph으로 추가 갱신\n", + "print(phone)\n", + "print()\n", + "phone.clear() # 사전의 모든 입력을 없앤다.\n", + "print(phone)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 루프를 이용한 사전 내용 참조\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전의 모든 키값을 순차적으로 참조하는 방법" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a 1\n", + "b 2\n", + "c 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "D = {'a':1, 'b':2, 'c':3}\n", - "for key in D.keys():\n", - " print key, D[key]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "a 1\n", - "c 3\n", - "b 2\n" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804 \uc790\uccb4\ub97c for\ub8e8\ud504\uc5d0 \ud65c\uc6a9\ud558\uba74 \ud0a4\uc5d0 \ub300\ud55c \ub8e8\ud504\uac00 \uc2e4\ud589\ub41c\ub2e4." + } + ], + "source": [ + "D = {'a':1, 'b':2, 'c':3}\n", + "for key in D.keys():\n", + " print(key, D[key])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전 자체를 for루프에 활용하면 키에 대한 루프가 실행된다." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a 1\n", + "b 2\n", + "c 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "D = {'a':1, 'b':2, 'c':3}\n", - "for key in D:\n", - " print key, D[key]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "a 1\n", - "c 3\n", - "b 2\n" - ] - } - ], - "prompt_number": 16 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud0a4\uc640 \uac12\uc744 \ub3d9\uc2dc\uc5d0 \ucc38\uc870\ud558\ub824\uba74 D.items()\ub97c \ud65c\uc6a9\ud55c\ub2e4." + } + ], + "source": [ + "D = {'a':1, 'b':2, 'c':3}\n", + "for key in D:\n", + " print(key, D[key])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 키와 값을 동시에 참조하려면 D.items()를 활용한다." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a 1\n", + "b 2\n", + "c 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for key, value in D.items():\n", - " print key, value" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "a 1\n", - "c 3\n", - "b 2\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804\uc5d0 \uc785\ub825\ub41c \uc544\uc774\ud15c\ub4e4\uc740 \uc77c\uc815\ud55c \uc21c\uc11c\uac00 \uc5c6\ub2e4.\n", - "- \ud0a4\uac12\uc5d0 \ub300\ud55c \uc815\ub82c\uc740 \uc544\uc774\ud15c\ub4e4\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubf51\uc740 \ub2e4\uc74c\uc5d0 \ud574\ub2f9 \ub9ac\uc2a4\ud2b8\uc5d0 \uc788\ub294 sort() \ud568\uc218\ub97c \ud65c\uc6a9\ud55c\ub2e4." + } + ], + "source": [ + "for key, value in D.items():\n", + " print(key, value)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전에 입력된 아이템들은 일정한 순서가 없다.\n", + "- 키값에 대한 정렬은 아이템들을 리스트로 뽑은 다음에 해당 리스트에 있는 sort() 함수를 활용한다." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_items([('a', 1), ('b', 2), ('c', 3)])\n", + "\n" ] }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "D = {'a':1, 'b':2, 'c':3}\n", - "items = D.items()\n", - "print items\n", - "print\n", - "\n", - "items.sort()\n", - "print items\n", - "print \n", - "\n", - "for k,v in items:\n", - " print k, v" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[('a', 1), ('c', 3), ('b', 2)]\n", - "\n", - "[('a', 1), ('b', 2), ('c', 3)]\n", - "\n", - "a 1\n", - "b 2\n", - "c 3\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + "ename": "AttributeError", + "evalue": "'dict_items' object has no attribute 'sort'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mitems\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAttributeError\u001b[0m: 'dict_items' object has no attribute 'sort'" ] } ], - "metadata": {} + "source": [ + "D = {'a':1, 'b':2, 'c':3}\n", + "items = D.items()\n", + "print(items)\n", + "print()\n", + "\n", + "items.sort()\n", + "print(items)\n", + "print()\n", + "\n", + "for k,v in items:\n", + " print(k, v)\n", + " \n", + " \n", + "# [('a', 1), ('c', 3), ('b', 2)]\n", + "\n", + "# [('a', 1), ('b', 2), ('c', 3)]\n", + "\n", + "# a 1\n", + "# b 2\n", + "# c 3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "celltoolbar": "Raw Cell Format", + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python13.ipynb b/python3.6/python13.ipynb index 642488b..05935ae 100644 --- a/python3.6/python13.ipynb +++ b/python3.6/python13.ipynb @@ -1,843 +1,863 @@ { - "metadata": { - "name": "", - "signature": "sha256:c387afc0482bfe7414617f8b0ed2da8e5a212c552ab5fb398cf546389f46f5e1" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 13. \ud30c\uc77c \uc785\ucd9c\ub825\n", - "***\n", - "***\n", - "- \ud30c\uc77c\uc744 \uc5f4\uc5b4\uc11c \uc77d\uace0, \uc4f0\uace0, \ub367\ubd99\uc774\ub294 \ubc29\ubc95\n", - " - open(filename, mode) \ub0b4\uc7a5 \ud568\uc218\ub85c filename \uc774\ub984\uc744 \uc9c0\ub2cc file \uac1d\uccb4\ub97c \uc5bb\ub294\ub2e4. \n", - " - \uc5bb\uc5b4\uc9c4 \ud30c\uc77c \uac1d\uccb4\uc5d0\uc11c \uc790\ub8cc\ub97c \uc77d\uac70\ub098, \uc4f0\uac70\ub098, \ub367\ubd99\uc774\ub294 \uc791\uc5c5 \uc218\ud589\n", - " - \ubaa8\ub4e0 \uc791\uc5c5\uc774 \ub05d\ub098\uba74 close()\ub97c \ud638\ucd9c\ud558\uc5ec \uc791\uc5c5 \ud504\ub85c\uc138\uc2a4\uc758 \uc790\uc6d0 \uc810\uc720 \ud574\uc81c" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud30c\uc77c \uc785\ucd9c\ub825 \ubc29\ubc95\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ud30c\uc77c \ucc98\ub9ac \ubaa8\ub4dc\uc758 \uc885\ub958\n", - "- open \ub0b4\uc7a5 \ud568\uc218\uc758 \ub450\ubc88\uc9f8 \uc778\uc790 mode \uc124\uba85\n", - " - \ub450\ubc88\uc9f8 \uc778\uc790 mode \uc0dd\ub7b5\uc2dc\uc5d0\ub294 \uc77d\uae30 \uc804\uc6a9(r) \ubaa8\ub4dc\ub85c \uc124\uc815\n", - " \n", - "| Mode | \uac04\ub2e8 \uc124\uba85 | \uc790\uc138\ud55c \uc124\uba85\n", - "|--------|-----------------------------|------------|\n", - "| 'r' | \uc77d\uae30 \uc804\uc6a9 (\uae30\ubcf8 \ubaa8\ub4dc) | \ud30c\uc77c \uac1d\uccb4\ub97c \uc77d\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uace0, \ud30c\uc77c \ud3ec\uc778\ud130\ub97c \ud30c\uc77c \ucc98\uc74c \uc704\uce58\uc5d0 \ub193\ub294\ub2e4.|\n", - "| 'w' | \uc4f0\uae30 \uc804\uc6a9 | \uc0c8\ub85c\uc6b4 \ud30c\uc77c\uc744 \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uac70\ub098 \ud574\ub2f9 \ud30c\uc77c\uc774 \uc774\ubbf8 \uc874\uc7ac\ud558\uba74 \ub0b4\uc6a9\uc744 \ubaa8\ub450 \uc5c6\uc5d0\uba74\uc11c \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uace0, \ud30c\uc77c \ud3ec\uc778\ud130\ub97c \ud30c\uc77c \ucc98\uc74c \uc704\uce58\uc5d0 \ub193\ub294\ub2e4. |\n", - "| 'a' | \ud30c\uc77c \ub05d\uc5d0 \ucd94\uac00 | \uc774\ubbf8 \uc874\uc7ac\ud558\ub294 \ud30c\uc77c\uc744 \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uac70\ub098 \ud30c\uc77c\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc73c\uba74 \uc0c8\ub86d\uac8c \ud30c\uc77c\uc744 \uc0dd\uc131\ud558\uba74\uc11c \uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc0dd\uc131\ud558\uace0, \ud30c\uc77c \ud3ec\uc778\ud130\ub97c \ud30c\uc77c\uc758 \ub9c8\uc9c0\ub9c9 \uc704\uce58\uc5d0 \ub193\ub294\ub2e4. \uadf8\ub798\uc11c, \uc774\ud6c4 \uc791\uc131\ub418\ub294 \ub0b4\uc6a9\uc740 \ud30c\uc77c\uc758 \ub4b7 \ubd80\ubd84\uc5d0 \ucd94\uac00\ub41c\ub2e4.|\n", - "\n", - " - \uc774\uc9c4 \ud30c\uc77c\ub85c \uc800\uc7a5\uc744 \uc704\ud574\uc11c\ub294 \uc544\ub798 \ubaa8\ub4dc \uc0ac\uc6a9\n", - "\n", - "| Mode | \uac04\ub2e8 \uc124\uba85 |\n", - "|--------|-----------------------------|\n", - "| 'rb' | \uc774\uc9c4 \ud30c\uc77c \uc77d\uae30 \uc804\uc6a9 |\n", - "| 'wb' | \uc774\uc9c4 \ud30c\uc77c \uc4f0\uae30 \uc804\uc6a9 |\n", - "| 'ab' | \uc774\uc9c4 \ud30c\uc77c \ub05d\uc5d0 \ucd94\uac00 |" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 13. 파일 입출력\n", + "***\n", + "***\n", + "- 파일을 열어서 읽고, 쓰고, 덧붙이는 방법\n", + " - open(filename, mode) 내장 함수로 filename 이름을 지닌 file 객체를 얻는다. \n", + " - 얻어진 파일 객체에서 자료를 읽거나, 쓰거나, 덧붙이는 작업 수행\n", + " - 모든 작업이 끝나면 close()를 호출하여 작업 프로세스의 자원 점유 해제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 파일 입출력 방법\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 파일 처리 모드의 종류\n", + "- open 내장 함수의 두번째 인자 mode 설명\n", + " - 두번째 인자 mode 생략시에는 읽기 전용(r) 모드로 설정\n", + " \n", + "| Mode | 간단 설명 | 자세한 설명\n", + "|--------|-----------------------------|------------|\n", + "| 'r' | 읽기 전용 (기본 모드) | 파일 객체를 읽기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다.|\n", + "| 'w' | 쓰기 전용 | 새로운 파일을 쓰기 모드로 생성하거나 해당 파일이 이미 존재하면 내용을 모두 없에면서 쓰기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다. |\n", + "| 'a' | 파일 끝에 추가 | 이미 존재하는 파일을 쓰기 모드로 생성하거나 파일이 존재하지 않으면 새롭게 파일을 생성하면서 쓰기 모드로 생성하고, 파일 포인터를 파일의 마지막 위치에 놓는다. 그래서, 이후 작성되는 내용은 파일의 뒷 부분에 추가된다.|\n", + "\n", + " - 이진 파일로 저장을 위해서는 아래 모드 사용\n", + "\n", + "| Mode | 간단 설명 |\n", + "|--------|-----------------------------|\n", + "| 'rb' | 이진 파일 읽기 전용 |\n", + "| 'wb' | 이진 파일 쓰기 전용 |\n", + "| 'ab' | 이진 파일 끝에 추가 |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 파일 쓰기" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/do-hyungkwon/GoogleDrive/git/script_programming/python3.6\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \ud30c\uc77c \uc4f0\uae30" + } + ], + "source": [ + "import os\n", + "\n", + "print(os.getcwd())" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "s = \"\"\"Its power: Python developers typically report \n", + "they are able to develop applications in a half\n", + "to a tenth the amount of time it takes them to do\n", + "the same work in such languages as C.\"\"\"\n", + "f = open('t.txt', 'w')\n", + "f.write(s) # 문자열을 파일에 기록\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 파일 읽기\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'file' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m't.txt'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# f = open('t.txt', 'r')과 동일\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'file' is not defined" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "\n", - "print os.getcwd()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/git/python-e-learning\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = \"\"\"Its power: Python developers typically report \n", + } + ], + "source": [ + "f = file('t.txt') # f = open('t.txt', 'r')과 동일\n", + "s = f.read()\n", + "print(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Its power: Python developers typically report \n", "they are able to develop applications in a half\n", "to a tenth the amount of time it takes them to do\n", - "the same work in such languages as C.\"\"\"\n", - "f = open('t.txt', 'w')\n", - "f.write(s) # \ubb38\uc790\uc5f4\uc744 \ud30c\uc77c\uc5d0 \uae30\ub85d\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ud30c\uc77c \uc77d\uae30\n" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = file('t.txt') # f = open('t.txt', 'r')\uacfc \ub3d9\uc77c\n", - "s = f.read()\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Its power: Python developers typically report \n", - "they are able to develop applications in a half\n", - "to a tenth the amount of time it takes them to do\n", - "the same work in such languages as C.\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- close()\uc744 \ub9c8\uc9c0\ub9c9\uc5d0 \ud638\ucd9c\ud558\uc9c0 \uc54a\uc73c\uba74 \ud574\ub2f9 file \uac1d\uccb4\uac00 \ub2e4\ub978 \uac12\uc73c\ub85c \uce58\ud658\ub418\uac70\ub098 \ud504\ub85c\uadf8\ub7a8\uc774 \uc885\ub8cc\ub420 \ub54c \uc790\ub3d9\uc73c\ub85c close()\uac00 \ubd88\ub9ac\uc6cc\uc9c4\ub2e4.\n", - " - \ud558\uc9c0\ub9cc \uba85\uc2dc\uc801\uc73c\ub85c close()\ub97c \ud638\ucd9c\ud558\ub294 \uac83\uc744 \uad8c\uc7a5\ud568" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ub77c\uc778 \ub2e8\uc704\ub85c \ud30c\uc77c \uc77d\uae30\n", - "- \ucd1d 4\uac00\uc9c0 \ubc29\ubc95 \uc874\uc7ac\n", - " - \ud30c\uc77c \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790(iterator) \uc774\uc6a9\ud558\uae30\n", - " - \ud30c\uc77c \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790\ub294 \uac01 \ub77c\uc778\ubcc4\ub85c \ub0b4\uc6a9\uc744 \uc77d\uc5b4\uc624\ub3c4\ub85d \uc124\uc815\ub418\uc5b4 \uc788\uc74c\n", - " - \ud30c\uc77c\uc744 \ub77c\uc778\ubcc4\ub85c \uc77d\ub294 \ubc29\ubc95 \uc911 \uac00\uc7a5 \ud6a8\uacfc\uc801\uc784\n", - " - readline(): \ud55c\ubc88\uc5d0 \ud55c\uc904\uc529 \uc77d\ub294\ub2e4.\n", - " - readlines(): \ud30c\uc77c \uc804\uccb4\ub97c \ub77c\uc778 \ub2e8\uc704\ub85c \ub04a\uc5b4\uc11c \ub9ac\uc2a4\ud2b8\uc5d0 \uc800\uc7a5\ud55c\ub2e4.\n", - " - xreadlines(): readlines()\uacfc \uc720\uc0ac\ud558\uc9c0\ub9cc \ud30c\uc77c \uc804\uccb4\ub97c \ud55c\uaebc\ubc88\uc5d0 \uc77d\uc9c0 \uc54a\uace0, \uc0c1\ud669\ubcc4\ub85c \ud544\uc694\ud55c \ub77c\uc778\ub9cc \uc77d\ub294\ub2e4. \ub300\uc6a9\ub7c9\uc758 \ud30c\uc77c\uc744 for \ubb38 \ub4f1\uc73c\ub85c \ub77c\uc778 \ub2e8\uc704\ub85c \uc77d\uc744 \ub54c \ud6a8\uc728\uc801\uc774\ub2e4. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc77c \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790 \uc0ac\uc6a9" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "i = 1\n", - "for line in f:\n", - " print i, \":\", line,\n", - " i += 1\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 : Its power: Python developers typically report \n", - "2 : they are able to develop applications in a half\n", - "3 : to a tenth the amount of time it takes them to do\n", - "4 : the same work in such languages as C.\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- readline() \uc0ac\uc6a9" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "line = f.readline()\n", - "i = 1\n", - "while line:\n", - " print i, \":\", line,\n", - " line = f.readline()\n", - " i += 1\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 : Its power: Python developers typically report \n", - "2 : they are able to develop applications in a half\n", - "3 : to a tenth the amount of time it takes them to do\n", - "4 : the same work in such languages as C.\n" - ] - } - ], - "prompt_number": 14 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- readlines() \uc0ac\uc6a9\n", - " - \uac01 \ub77c\uc778\uc744 \ubaa8\ub450 \uc77d\uc5b4\uc11c \uba54\ubaa8\ub9ac\uc5d0 \ub9ac\uc2a4\ud2b8\ub85c \uc800\uc7a5\ud568" + "the same work in such languages as C.\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "print f.readlines()\n", - "print\n", + } + ], + "source": [ + "f = open('t.txt') # f = open('t.txt', 'r')과 동일\n", + "s = f.read()\n", + "print(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- close()을 마지막에 호출하지 않으면 해당 file 객체가 다른 값으로 치환되거나 프로그램이 종료될 때 자동으로 close()가 불리워진다.\n", + " - 하지만 명시적으로 close()를 호출하는 것을 권장함" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 라인 단위로 파일 읽기\n", + "- 총 4가지 방법 존재\n", + " - 파일 객체의 반복자(iterator) 이용하기\n", + " - 파일 객체의 반복자는 각 라인별로 내용을 읽어오도록 설정되어 있음\n", + " - 파일을 라인별로 읽는 방법 중 가장 효과적임\n", + " - readline(): 한번에 한줄씩 읽는다.\n", + " - readlines(): 파일 전체를 라인 단위로 끊어서 리스트에 저장한다.\n", + " - xreadlines(): readlines()과 유사하지만 파일 전체를 한꺼번에 읽지 않고, 상황별로 필요한 라인만 읽는다. 대용량의 파일을 for 문 등으로 라인 단위로 읽을 때 효율적이다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파일 객체의 반복자 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 : Its power: Python developers typically report \n", "\n", - "f.seek(0)\n", - "i = 1\n", - "for line in f.readlines():\n", - " print i, \":\", line,\n", - " i += 1\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['Its power: Python developers typically report \\n', 'they are able to develop applications in a half\\n', 'to a tenth the amount of time it takes them to do\\n', 'the same work in such languages as C.']\n", - "\n", - "1 : Its power: Python developers typically report \n", - "2 : they are able to develop applications in a half\n", - "3 : to a tenth the amount of time it takes them to do\n", - "4 : the same work in such languages as C.\n" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- xreadlines() \uc0ac\uc6a9" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "print f.xreadlines()\n", - "print\n", + "2 : they are able to develop applications in a half\n", "\n", - "f.seek(0)\n", - "i = 1\n", - "for line in f.xreadlines():\n", - " print i, \":\", line,\n", - " i += 1\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "1 : 0123456789abcdef\n" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-5 \ub77c\uc778 \ub2e8\uc704\ub85c \ud30c\uc77c \uc4f0\uae30" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- writelines(): \ub9ac\uc2a4\ud2b8 \uc548\uc5d0 \uc788\ub294 \uac01 \ubb38\uc790\uc5f4\uc744 \uc5f0\uc18d\ud574\uc11c \ud30c\uc77c\ub85c \ucd9c\ub825\ud55c\ub2e4." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "lines = ['first line\\n', 'second line\\n', 'third line\\n']\n", - "f = open('t1.txt', 'w')\n", - "f.writelines(lines)\n", - "f.close()\n", + "3 : to a tenth the amount of time it takes them to do\n", "\n", - "f = open('t1.txt')\n", - "f.seek(0)\n", - "print f.read()\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "first line\n", - "second line\n", - "third line\n", - "\n" - ] - } - ], - "prompt_number": 20 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- write() \uc774\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubb38\uc790\uc5f4\uc744 \uac01 \ub77c\uc778\ubcc4\ub85c \ud30c\uc77c\ub85c \ucd9c\ub825\ud558\ub294 \ubc29\ubc95" + "4 : the same work in such languages as C.\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "lines = ['first line', 'second line', 'third line']\n", - "f = open('t1.txt', 'w')\n", - "f.write('\\n'.join(lines))\n", - "f.close()\n", + } + ], + "source": [ + "f = open('t.txt')\n", + "i = 1\n", + "for line in f:\n", + " print(i, \":\", line,)\n", + " i += 1\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- readline() 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 : Its power: Python developers typically report \n", "\n", - "f = open('t1.txt')\n", - "f.seek(0)\n", - "print f.read()\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "first line\n", - "second line\n", - "third line\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud14d\uc2a4\ud2b8 \ud30c\uc77c t.txt\uc758 \ub2e8\uc5b4(\uacf5\ubc31\uc73c\ub85c \ubd84\ub9ac\ub41c \ubb38\uc790\uc5f4) \uc218\ub97c \ucd9c\ub825\ud558\ub294 \ubc29\ubc95" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "s = f.read()\n", - "n = len(s.split())\n", - "print n\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "35\n" - ] - } - ], - "prompt_number": 40 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-6 \uae30\uc874 \ud30c\uc77c\uc5d0 \ub0b4\uc6a9 \ucd94\uac00" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('removeme.txt', 'w') # \ud30c\uc77c\uc758 \uc0dd\uc131\n", - "f.write('first line\\n')\n", - "f.write('second line\\n')\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 23 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('removeme.txt', 'a') # \ud30c\uc77c \ucd94\uac00 \ubaa8\ub4dc\ub85c \uc624\ud508\n", - "f.write('third line\\n')\n", - "f.close()\n", + "2 : they are able to develop applications in a half\n", "\n", - "f = open('removeme.txt') # \ud30c\uc77c \uc77d\uae30\n", - "print f.read()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "first line\n", - "second line\n", - "third line\n", - "\n" - ] - } - ], - "prompt_number": 24 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-7 \ud30c\uc77c \ub0b4 \uc784\uc758 \uc704\uce58\ub85c \uc811\uadfc\n", - "- \ud30c\uc77c \ud3ec\uc778\ud130 (pointer)\n", - " - \ud30c\uc77c \ub0b4\uc5d0\uc11c \ud604\uc7ac \uc704\uce58\ub97c \uac00\ub9ac\ud0a4\uace0 \uc788\uc74c\n", - "- \ud30c\uc77c \uc811\uadfc \ubc29\ubc95\n", - " - \uc21c\ucc28 \uc811\uadfc (\uae30\ubcf8 \ubc29\uc2dd): \ud30c\uc77c\uc744 \uc55e\uc5d0\uc11c \ubd80\ud130 \uc21c\ucc28\uc801\uc73c\ub85c \uc77d\uace0 \uc4f0\ub294 \ubc29\uc2dd\n", - " - \uc784\uc758 \uc811\uadfc: \ud30c\uc77c \ub0b4 \uc784\uc758 \uc704\uce58\uc5d0\uc11c \uc77d\uace0 \uc4f0\ub294 \ubc29\uc2dd\n", - " - \uc784\uc758 \uc811\uadfc\uc744 \uc704\ud55c file \uac1d\uccb4 \ud3ec\uc778\ud130 (pointer) \uad00\ub828 \uba54\uc18c\ub4dc\n", - " - seek(n): \ud30c\uc77c\uc758 \uac00\uc7a5 \uccab\ubc88\uc9f8 \uc704\uce58\uc5d0\uc11c n\ubc88\uc9f8 \ubc14\uc774\ud2b8\ub85c \ud3ec\uc778\ud130 \uc774\ub3d9\n", - " - tell(): \ud30c\uc77c \ub0b4 \ud604\uc7ac \ud3ec\uc778\ud130 \uc704\uce58\ub97c \ubc18\ud658" + "3 : to a tenth the amount of time it takes them to do\n", + "\n", + "4 : the same work in such languages as C.\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "name = 't.txt' \n", - "f = open(name, 'w+') # \uc77d\uace0 \uc4f0\uae30\ub85c \uc624\ud508, \ub2e8, \ud30c\uc77c\uc774 \uc774\ubbf8 \uc874\uc7ac\ud55c\ub2e4\uba74 \uae30\uc874 \ud30c\uc77c\uc740 \uc5c6\uc5b4\uc9c0\uace0 \ub2e4\uc2dc \uc0dd\uc131\ub41c\ub2e4.\n", - "s = '0123456789abcdef'\n", - "f.write(s)\n", + } + ], + "source": [ + "f = open('t.txt')\n", + "line = f.readline()\n", + "i = 1\n", + "while line:\n", + " print(i, \":\", line,)\n", + " line = f.readline()\n", + " i += 1\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- readlines() 사용\n", + " - 각 라인을 모두 읽어서 메모리에 리스트로 저장함" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Its power: Python developers typically report \\n', 'they are able to develop applications in a half\\n', 'to a tenth the amount of time it takes them to do\\n', 'the same work in such languages as C.']\n", "\n", - "f.seek(5) # \uc2dc\uc791\ubd80\ud130 5\ubc14\uc774\ud2b8 \ud3ec\uc778\ud130 \uc774\ub3d9\n", - "print f.tell() # \ud604\uc7ac \uc704\uce58 \ub3cc\ub824\uc90c\n", - "print f.read(1) # 1\ubb38\uc790 \uc77d\uae30\n", - "print f.tell()\n", - "print" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "5\n", - "5\n", - "6\n", - "\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ud45c\uc900 \ucd9c\ub825 \ubc29\ud5a5 \uc804\ud658\n", - "***\n", + "1 : Its power: Python developers typically report \n", + "\n", + "2 : they are able to develop applications in a half\n", "\n", - "- sys \ubaa8\ub4c8\uc758 \ud45c\uc900 \uc785\ucd9c\ub825 \uad00\ub828 \uac1d\uccb4\n", - " - sys.stdout: \ud45c\uc900 \ucd9c\ub825\n", - " - sys.stderr: \ud45c\uc900 \uc5d0\ub7ec \ucd9c\ub825\n", - " - sys.stdin: \ud45c\uc900 \uc785\ub825\n", - "- \uc608\ub97c \ub4e4\uc5b4, sys.stdout\uc744 \ud30c\uc77c \uac1d\uccb4\ub85c \ubcc0\ud658\ud558\uba74 \ubaa8\ub4e0 \ud45c\uc900 \ucd9c\ub825(print \ucd9c\ub825)\uc740 \ud574\ub2f9 \ud30c\uc77c\ub85c \uc800\uc7a5\ub41c\ub2e4." + "3 : to a tenth the amount of time it takes them to do\n", + "\n", + "4 : the same work in such languages as C.\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ud45c\uc900 \ucd9c\ub825\uc744 \ud30c\uc77c\ub85c \uc800\uc7a5\ud558\uae30" + } + ], + "source": [ + "f = open('t.txt')\n", + "print(f.readlines())\n", + "print()\n", + "\n", + "f.seek(0)\n", + "i = 1\n", + "for line in f.readlines():\n", + " print(i, \":\", line,)\n", + " i += 1\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- xreadlines() 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'_io.TextIOWrapper' object has no attribute 'xreadlines'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m't.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxreadlines\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseek\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAttributeError\u001b[0m: '_io.TextIOWrapper' object has no attribute 'xreadlines'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import sys\n", - "\n", - "f = open('t.txt', 'w')\n", - "stdout = sys.stdout # \ud45c\uc900 \ucd9c\ub825 \uc800\uc7a5\ud574 \ub450\uae30\n", - "sys.stdout = f # \ud30c\uc77c \uac1d\uccb4\ub85c \ud45c\uc900 \ucd9c\ub825 \ubcc0\uacbd\n", - "print 'Sample output'\n", - "print 'Good'\n", - "print 'Good'\n", - "f.close()\n", - "sys.stdout = stdout # \ud544\uc694\ud558\uba74 \ud45c\uc900 \ucd9c\ub825 \uc6d0\uc0c1 \ubcf5\uad6c" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt')\n", - "print f.read()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Sample output\n", - "Good\n", - "Good\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- print\ub97c \uc9c1\uc811 \uc774\uc6a9\ud558\uc5ec \ucd9c\ub825\uc744 \ub2e4\ub978 \uac1d\uccb4\ub85c \uc804\ud658\ud558\uae30 " + } + ], + "source": [ + "f = open('t.txt')\n", + "print(f.xreadlines())\n", + "print()\n", + "\n", + "f.seek(0)\n", + "i = 1\n", + "for line in f.xreadlines():\n", + " print(i, \":\", line,)\n", + " i += 1\n", + "f.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "f = open('t.txt')\n", + "print(f.readlines())\n", + "print()\n", + "\n", + "f.seek(0)\n", + "i = 1\n", + "for line in f.readlines():\n", + " print(i, \":\", line,)\n", + " i += 1\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 라인 단위로 파일 쓰기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- writelines(): 리스트 안에 있는 각 문자열을 연속해서 파일로 출력한다." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "first line\n", + "second line\n", + "third line\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print >> sys.stderr, \"Warning, action field not supplied\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stderr", - "text": [ - "Warning, action field not supplied\n" - ] - } - ], - "prompt_number": 14 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub3d9\uc77c \ubc29\ubc95\uc73c\ub85c \ud45c\uc900 \ucd9c\ub825(print)\uc744 \ud30c\uc77c \uac1d\uccb4\ub85c \uc804\ud658" + } + ], + "source": [ + "lines = ['first line\\n', 'second line\\n', 'third line\\n']\n", + "f = open('t1.txt', 'w')\n", + "f.writelines(lines)\n", + "f.close()\n", + "\n", + "f = open('t1.txt')\n", + "f.seek(0)\n", + "print(f.read())\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- write() 이용하여 여러 문자열을 각 라인별로 파일로 출력하는 방법" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "first line\n", + "second line\n", + "third line\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('t.txt', 'w')\n", - "print >> f, 'spam string'\n", - "f.close()\n", - "\n", - "f = open('t.txt')\n", - "print f.read()\n", - "f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "spam string\n", - "\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 StringIO \ubaa8\ub4c8 \uc0ac\uc6a9\ud558\uae30\n", - "- StringIO \ubaa8\ub4c8\uc758 StringIO \ud074\ub798\uc2a4 \uac1d\uccb4\n", - " - \ud30c\uc77c \uac1d\uccb4\ucc98\ub7fc \uc785\ucd9c\ub825 \uac00\ub2a5\ud55c \ubb38\uc790\uc5f4 \uac1d\uccb4\n", - " - StringIO\uc5d0 \uc9c0\uc6d0\ub418\ub294 \uba54\uc18c\ub4dc\ub294 \ud30c\uc77c \uac1d\uccb4\uac00 \uc9c0\uc6d0\ud558\ub294 \uba54\uc18c\ub4dc\uc640 \uac70\uc758 \ub3d9\uc77c\ud558\ub2e4.\n", - " - getvalue() \uba54\uc18c\ub4dc\n", - " - \ud604\uc7ac\uae4c\uc9c0 \ub2f4\uc544 \ub193\uc740 \uc804\uccb4 \ub0b4\uc6a9\uc744 \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "lines = ['first line', 'second line', 'third line']\n", + "f = open('t1.txt', 'w')\n", + "f.write('\\n'.join(lines))\n", + "f.close()\n", + "\n", + "f = open('t1.txt')\n", + "f.seek(0)\n", + "print(f.read())\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 텍스트 파일 t.txt의 단어(공백으로 분리된 문자열) 수를 출력하는 방법" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "35\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import StringIO\n", - "\n", - "f = StringIO.StringIO()\n", - "f.write(\"abc\")\n", - "f.seek(0)\n", - "s = f.read()\n", - "print s\n", - "print\n", - "\n", - "s2 = f.getvalue()\n", - "print s2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "abc\n", - "\n", - "abc\n" - ] - } - ], - "prompt_number": 29 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud45c\uc900 \ucd9c\ub825\uc73c\ub85c \ubb38\uc790\uc5f4 \uac1d\uccb4\uc5d0 \ub0b4\uc6a9 \uc791\uc131\ud558\uae30" + } + ], + "source": [ + "f = open('t.txt')\n", + "s = f.read()\n", + "n = len(s.split())\n", + "print(n)\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-6 기존 파일에 내용 추가" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "f = open('removeme.txt', 'w') # 파일의 생성\n", + "f.write('first line\\n')\n", + "f.write('second line\\n')\n", + "f.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "first line\n", + "second line\n", + "third line\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import sys\n", - "import StringIO\n", - "\n", - "stdout = sys.stdout # \ud45c\uc900 \ucd9c\ub825 \uc800\uc7a5\ud574 \ub450\uae30\n", - "sys.stdout = f = StringIO.StringIO() \n", - "\n", - "print type(f)\n", - "print 'Sample output'\n", - "print 'Good'\n", - "print 'Good'\n", - "\n", - "sys.stdout = stdout" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 30 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "s = f.getvalue()\n", - "\n", - "print 'Done-------'\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Done-------\n", - "\n", - "Sample output\n", - "Good\n", - "Good\n", - "\n" - ] - } - ], - "prompt_number": 31 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \ud30c\uc77c\ub85c\uc758 \uc9c0\uc18d \ubaa8\ub4c8\n", - "***" + } + ], + "source": [ + "f = open('removeme.txt', 'a') # 파일 추가 모드로 오픈\n", + "f.write('third line\\n')\n", + "f.close()\n", + "\n", + "f = open('removeme.txt') # 파일 읽기\n", + "print(f.read())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-7 파일 내 임의 위치로 접근\n", + "- 파일 포인터 (pointer)\n", + " - 파일 내에서 현재 위치를 가리키고 있음\n", + "- 파일 접근 방법\n", + " - 순차 접근 (기본 방식): 파일을 앞에서 부터 순차적으로 읽고 쓰는 방식\n", + " - 임의 접근: 파일 내 임의 위치에서 읽고 쓰는 방식\n", + " - 임의 접근을 위한 file 객체 포인터 (pointer) 관련 메소드\n", + " - seek(n): 파일의 가장 첫번째 위치에서 n번째 바이트로 포인터 이동\n", + " - tell(): 파일 내 현재 포인터 위치를 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n", + "5\n", + "6\n", + "\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc9c0\uc18d\uc131(Persistence)\n", - " - \ud504\ub85c\uadf8\ub7a8 \ub0b4\uc5d0 \uc0dd\uc131\ub41c \uac01\uc885 \uac1d\uccb4\ub4e4\uc744 \ud574\ub2f9 \ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc \uc774\ud6c4\uc5d0\ub3c4 \uc874\uc7ac\ud558\uac8c \ub9cc\ub4e4\uace0, \uadf8\uac83\ub4e4\uc744 \ub3d9\uc77c\ud55c \ub610\ub294 \ub2e4\ub978 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uae30\ub2a5\n", - "- \uc9c0\uc18d\uc131 \uae30\ub2a5\uc744 \uc9c0\uc6d0\ud558\ub294 \ubaa8\ub4c8\n", - " - DBM \uad00\ub828 \ubaa8\ub4c8\n", - " - anydbm, dbm, gdbm, dbhash, dumbdbm\n", - " - anydbm: \uc2dc\uc2a4\ud15c\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud55c \ubaa8\ub4c8 \uc911 \uac00\uc7a5 \ucd5c\uc801\uc758 \ubaa8\ub4c8\uc744 \ubc18\ud658\ud568\n", - " - \uae30\ubcf8\uc801\uc73c\ub85c dumbdbm\uc744 \ubc18\ud658\ud55c\ub2e4\n", - " - \uc0ac\uc804 \uc790\ub8cc\ud615\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uacfc \ub3d9\uc77c\ud55c \ubc29\ubc95\uc73c\ub85c \uc0ac\uc6a9\n", - " - pickle \ubaa8\ub4c8\n", - " - \ud30c\uc774\uc36c\uc758 \uac1d\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \uc77c\ubc18\ud654\ub41c \uc9c0\uc18d\uc131 \ubaa8\ub4c8\n", - " - \ud30c\uc774\uc36c\uc758 \uae30\ubcf8 \uac1d\uccb4\ubfd0\ub9cc \uc544\ub2c8\ub77c \uc0ac\uc6a9\uc790 \uc815\uc758\uc758 \ubcf5\uc7a1\ud55c \uac1d\uccb4\ub3c4 \uc800\uc7a5 \uac00\ub2a5\n", - " - \uae30\ubcf8\uc801\uc73c\ub85c \ud14d\uc2a4\ud2b8 \ubaa8\ub4dc\ub85c \uc800\uc7a5\ud558\uc9c0\ub9cc \uc774\uc9c4 \ubaa8\ub4dc\ub85c\ub3c4 \uc800\uc7a5 \uac00\ub2a5" + } + ], + "source": [ + "name = 't.txt' \n", + "f = open(name, 'w+') # 읽고 쓰기로 오픈, 단, 파일이 이미 존재한다면 기존 파일은 없어지고 다시 생성된다.\n", + "s = '0123456789abcdef'\n", + "f.write(s)\n", + "\n", + "f.seek(5) # 시작부터 5바이트 포인터 이동\n", + "print(f.tell()) # 현재 위치 돌려줌\n", + "print(f.read(1)) # 1문자 읽기\n", + "print(f.tell())\n", + "print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 표준 출력 방향 전환\n", + "***\n", + "\n", + "- sys 모듈의 표준 입출력 관련 객체\n", + " - sys.stdout: 표준 출력\n", + " - sys.stderr: 표준 에러 출력\n", + " - sys.stdin: 표준 입력\n", + "- 예를 들어, sys.stdout을 파일 객체로 변환하면 모든 표준 출력(print 출력)은 해당 파일로 저장된다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 표준 출력을 파일로 저장하기" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "\n", + "f = open('t.txt', 'w')\n", + "stdout = sys.stdout # 표준 출력 저장해 두기\n", + "sys.stdout = f # 파일 객체로 표준 출력 변경\n", + "print('Sample output')\n", + "print('Good')\n", + "print('Good')\n", + "f.close()\n", + "sys.stdout = stdout # 필요하면 표준 출력 원상 복구" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sample output\n", + "Good\n", + "Good\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud53c\ud074\ub9c1(pickling) \ubaa8\ub4c8 \uc0ac\uc6a9\ud558\uae30" + } + ], + "source": [ + "f = open('t.txt')\n", + "print(f.read())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- print를 직접 이용하여 출력을 다른 객체로 전환하기 " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning, action field not supplied\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import pickle\n", - "\n", - "phone = {'tom':4358382, 'jack':9465215, 'jim':6851325, 'Joseph':6584321}\n", - "List = ['string', 1234, 0.2345]\n", - "Tuple = (phone, List) # \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804\uc758 \ubcf5\ud569 \uac1d\uccb4\n", - "\n", - "f = open('pickle.txt', 'w') # \ud30c\uc77c \uac1d\uccb4\ub97c \uc5bb\ub294\ub2e4.\n", - "\n", - "pickle.dump(Tuple, f) # \ud30c\uc77c\ub85c \ucd9c\ub825(pickling), \ubcf5\ud569 \uac1d\uccb4 \ucd9c\ub825 \n", - "f.close() \n", - "\n", - "f = open('pickle.txt') \n", - " \n", - "x,y = pickle.load(f) # \ud30c\uc77c\uc5d0\uc11c \uc77d\uc5b4\uc624\uae30. \ud29c\ud50c\uc758 \ub0b4\uc6a9\uc744 x, y\uc5d0 \ubc1b\ub294\ub2e4.\n", - "print x # \uc0ac\uc804\n", - "print y # \ub9ac\uc2a4\ud2b8" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'jim': 6851325, 'Joseph': 6584321, 'jack': 9465215, 'tom': 4358382}\n", - "['string', 1234, 0.2345]\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import pickle\n", - "\n", - "class Simple: # \uac00\uc7a5 \ub2e8\uc21c\ud55c \ud074\ub798\uc2a4\ub97c \uc815\uc758\n", - " pass\n", - "\n", - "s = Simple() # \uc778\uc2a4\ud134\uc2a4 \uac1d\uccb4 \uc0dd\uc131\n", - "s.count = 10 # \uc778\uc2a4\ud134\uc2a4 \uc774\ub984 \uacf5\uac04\uc5d0 \ubcc0\uc218 \uc0dd\uc131\n", - "\n", - "f = open('pickle2.txt', 'w')\n", - "pickle.dump(s, f) # \uc778\uc2a4\ud134\uc2a4 \uc800\uc7a5\n", - "f.close()\n", + } + ], + "source": [ + "print()>> sys.stderr, \"Warning, action field not supplied\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 동일 방법으로 표준 출력(print)을 파일 객체로 전환" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "spam string\n", + "\n" + ] + } + ], + "source": [ + "f = open('t.txt', 'w')\n", + "print() >> f, 'spam string'\n", + "f.close()\n", + "\n", + "f = open('t.txt')\n", + "print(f.read())\n", + "f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 StringIO 모듈 사용하기\n", + "- StringIO 모듈의 StringIO 클래스 객체\n", + " - 파일 객체처럼 입출력 가능한 문자열 객체\n", + " - StringIO에 지원되는 메소드는 파일 객체가 지원하는 메소드와 거의 동일하다.\n", + " - getvalue() 메소드\n", + " - 현재까지 담아 놓은 전체 내용을 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abc\n", "\n", - "f = open('pickle2.txt')\n", - "t = pickle.load(f) # \uc778\uc2a4\ud134\uc2a4 \uac00\uc838\uc624\uae30\n", - "print t.count" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "10\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + "abc\n" + ] + } + ], + "source": [ + "import StringIO\n", + "\n", + "f = StringIO.StringIO()\n", + "f.write(\"abc\")\n", + "f.seek(0)\n", + "s = f.read()\n", + "print(s)\n", + "print()\n", + "\n", + "s2 = f.getvalue()\n", + "print(s2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 표준 출력으로 문자열 객체에 내용 작성하기" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import StringIO\n", + "\n", + "stdout = sys.stdout # 표준 출력 저장해 두기\n", + "sys.stdout = f = StringIO.StringIO() \n", + "\n", + "print(type(f))\n", + "print('Sample output')\n", + "print('Good')\n", + "print('Good'))\n", + "\n", + "sys.stdout = stdout" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done-------\n", + "\n", + "Sample output\n", + "Good\n", + "Good\n", + "\n" + ] + } + ], + "source": [ + "s = f.getvalue()\n", + "\n", + "print('Done-------')\n", + "print(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 파일로의 지속 모듈\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 지속성(Persistence)\n", + " - 프로그램 내에 생성된 각종 객체들을 해당 프로그램 종료 이후에도 존재하게 만들고, 그것들을 동일한 또는 다른 프로그램에서 사용하는 기능\n", + "- 지속성 기능을 지원하는 모듈\n", + " - DBM 관련 모듈\n", + " - anydbm, dbm, gdbm, dbhash, dumbdbm\n", + " - anydbm: 시스템에서 사용가능한 모듈 중 가장 최적의 모듈을 반환함\n", + " - 기본적으로 dumbdbm을 반환한다\n", + " - 사전 자료형을 사용하는 것과 동일한 방법으로 사용\n", + " - pickle 모듈\n", + " - 파이썬의 객체를 저장하는 일반화된 지속성 모듈\n", + " - 파이썬의 기본 객체뿐만 아니라 사용자 정의의 복잡한 객체도 저장 가능\n", + " - 기본적으로 텍스트 모드로 저장하지만 이진 모드로도 저장 가능" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 피클링(pickling) 모듈 사용하기" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'jim': 6851325, 'Joseph': 6584321, 'jack': 9465215, 'tom': 4358382}\n", + "['string', 1234, 0.2345]\n" ] } ], - "metadata": {} + "source": [ + "import pickle\n", + "\n", + "phone = {'tom':4358382, 'jack':9465215, 'jim':6851325, 'Joseph':6584321}\n", + "List = ['string', 1234, 0.2345]\n", + "Tuple = (phone, List) # 리스트, 튜플, 사전의 복합 객체\n", + "\n", + "f = open('pickle.txt', 'w') # 파일 객체를 얻는다.\n", + "\n", + "pickle.dump(Tuple, f) # 파일로 출력(pickling), 복합 객체 출력 \n", + "f.close() \n", + "\n", + "f = open('pickle.txt') \n", + " \n", + "x,y = pickle.load(f) # 파일에서 읽어오기. 튜플의 내용을 x, y에 받는다.\n", + "print(x) # 사전\n", + "print(y) # 리스트" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n" + ] + } + ], + "source": [ + "import pickle\n", + "\n", + "class Simple: # 가장 단순한 클래스를 정의\n", + " pass\n", + "\n", + "s = Simple() # 인스턴스 객체 생성\n", + "s.count = 10 # 인스턴스 이름 공간에 변수 생성\n", + "\n", + "f = open('pickle2.txt', 'w')\n", + "pickle.dump(s, f) # 인스턴스 저장\n", + "f.close()\n", + "\n", + "f = open('pickle2.txt')\n", + "t = pickle.load(f) # 인스턴스 가져오기\n", + "print(t.count)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 5753c8b06037ad40d7ad8ed3080b9682926f9af5 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 25 Sep 2017 15:43:27 +0900 Subject: [PATCH 050/124] ... --- Untitled.ipynb | 383 ------------------------------------------------- 1 file changed, 383 deletions(-) delete mode 100644 Untitled.ipynb diff --git a/Untitled.ipynb b/Untitled.ipynb deleted file mode 100644 index 9de5455..0000000 --- a/Untitled.ipynb +++ /dev/null @@ -1,383 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "y_4:0\n", - "40\n", - "y_4:0\n" - ] - } - ], - "source": [ - "import tensorflow as tf\n", - "\n", - "x = tf.constant(35, name='x')\n", - "y = tf.Variable(x + 5, name='y')\n", - "\n", - "print y.name\n", - "model = tf.initialize_all_variables()\n", - "\n", - "with tf.Session() as session:\n", - " session.run(model)\n", - " print(session.run(y)) " - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ 21 440 945 ..., 926 661 62]\n", - "[ 21 440 945 ..., 926 661 62]\n", - "[ 2157 966695 4462305 ..., 4284617 2182637 19049]\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "data = np.random.randint(1000, size=10000)\n", - "x = tf.constant(data, name= 'x')\n", - "y = tf.Variable(5 * x ** 2 - 3 * x + 15)\n", - "\n", - "model = tf.initialize_all_variables()\n", - "\n", - "with tf.Session() as session:\n", - " session.run(model)\n", - " print x.eval()\n", - " print(session.run(x))\n", - " print(session.run(y))" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class S1:\n", - " a = 1" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n" - ] - } - ], - "source": [ - "print S1.a" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "S1.b = 2" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n" - ] - } - ], - "source": [ - "print S1.b" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['__doc__', '__module__', 'a', 'b']\n" - ] - } - ], - "source": [ - "print dir(S1)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class MyClass:\n", - " def set(self, v):\n", - " self.value = v\n", - " def get(self):\n", - " return self.value" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class MyClass2:\n", - " def set(self, v):\n", - " self.value = v\n", - " def get(self):\n", - " return self.value\n", - " @staticmethod\n", - " def spam(x, y): # self가 없다.\n", - " print 'static method', x.value" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "20" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = MyClass()\n", - "b = MyClass2()\n", - "a.set(10)\n", - "a.value = 20\n", - "a.get()" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "MyClass.set(a, \"egg\")" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "static method egg\n" - ] - } - ], - "source": [ - "MyClass2.spam(a, \"egg2\")" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "__main__.MyClass\n" - ] - } - ], - "source": [ - "print MyClass" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "__main__\n" - ] - } - ], - "source": [ - "print __name__" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['In',\n", - " 'MyClass',\n", - " 'MyClass2',\n", - " 'Out',\n", - " 'S1',\n", - " '_',\n", - " '_25',\n", - " '_26',\n", - " '__',\n", - " '___',\n", - " '__builtin__',\n", - " '__builtins__',\n", - " '__doc__',\n", - " '__name__',\n", - " '_dh',\n", - " '_i',\n", - " '_i1',\n", - " '_i10',\n", - " '_i11',\n", - " '_i12',\n", - " '_i13',\n", - " '_i14',\n", - " '_i15',\n", - " '_i16',\n", - " '_i17',\n", - " '_i18',\n", - " '_i19',\n", - " '_i2',\n", - " '_i20',\n", - " '_i21',\n", - " '_i22',\n", - " '_i23',\n", - " '_i24',\n", - " '_i25',\n", - " '_i26',\n", - " '_i27',\n", - " '_i28',\n", - " '_i29',\n", - " '_i3',\n", - " '_i30',\n", - " '_i31',\n", - " '_i4',\n", - " '_i5',\n", - " '_i6',\n", - " '_i7',\n", - " '_i8',\n", - " '_i9',\n", - " '_ih',\n", - " '_ii',\n", - " '_iii',\n", - " '_oh',\n", - " '_sh',\n", - " 'a',\n", - " 'b',\n", - " 'exit',\n", - " 'get_ipython',\n", - " 'quit']" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dir()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python [Root]", - "language": "python", - "name": "Python [Root]" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} From b7433941399160c483812cc04a2fc4605a327d26 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 25 Sep 2017 15:54:25 +0900 Subject: [PATCH 051/124] =?UTF-8?q?05=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python05.ipynb | 132 +++++++++++++++++++++++++-------------- 1 file changed, 86 insertions(+), 46 deletions(-) diff --git a/python3.6/python05.ipynb b/python3.6/python05.ipynb index 18ed988..bb0c80e 100644 --- a/python3.6/python05.ipynb +++ b/python3.6/python05.ipynb @@ -35,7 +35,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -56,7 +58,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -74,8 +78,10 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": {}, + "execution_count": 6, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -91,16 +97,17 @@ "a = 5 / 2.0\n", "b = 5 / 2\n", "print(a) # 정수 / 실수의 결과\n", - "print(b) # 정수 / 정수의 결과\n", - "# 2.5\n", - "# 2\n", + "print(b) # 정수 / 정수의 결과 <-- python 3 부터는 '정수 / 실수'의 결과와 동일\n", + "\n", "print(type(a), type(b))" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, + "execution_count": 2, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -123,23 +130,23 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, + "execution_count": 7, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1.6666666666666667\n", - "1\n" + "1\n", + "1.0\n" ] } ], "source": [ - "print(5 / 3)\n", - "print(5 // 3)\n", - "# 1\n", - "# 1" + "print(5 // 3) # Floor Division\n", + "print(5 // 3.0) # Floor Division - 이 경우에는 '정수 // 정수'와 '정수 // 실수'의 결과 다름 " ] }, { @@ -151,8 +158,10 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, + "execution_count": 13, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -165,15 +174,15 @@ ], "source": [ "print(-7/4) # -7을 4로 나눈다\n", - "print(-(7/4)) \n", - "# -2\n", - "# -1" + "print(-(7/4))" ] }, { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -191,8 +200,10 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, + "execution_count": 14, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -203,8 +214,7 @@ } ], "source": [ - "print(4 / 2 * 2)\n", - "# 4" + "print(4 / 2 * 2)" ] }, { @@ -216,8 +226,10 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, + "execution_count": 15, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -252,7 +264,9 @@ { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -280,7 +294,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -299,7 +315,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -326,7 +344,9 @@ { "cell_type": "code", "execution_count": 18, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -348,14 +368,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 서로 다른 자료형간의 크기 관계\n", - " - 숫자 < 사전 < 리스트 < 문자열 < 튜플" + "- 서로 다른 자료형간의 크기 관계 비교\n", + " - Python 3 버전에서는 지원하지 않음" ] }, { "cell_type": "code", "execution_count": 36, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -379,7 +401,9 @@ { "cell_type": "code", "execution_count": 39, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -403,7 +427,9 @@ { "cell_type": "code", "execution_count": 24, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -460,7 +486,9 @@ { "cell_type": "code", "execution_count": 25, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -488,7 +516,9 @@ { "cell_type": "code", "execution_count": 26, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -518,7 +548,9 @@ { "cell_type": "code", "execution_count": 27, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -554,7 +586,9 @@ { "cell_type": "code", "execution_count": 28, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -595,7 +629,9 @@ { "cell_type": "code", "execution_count": 29, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -626,7 +662,9 @@ { "cell_type": "code", "execution_count": 30, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -653,7 +691,9 @@ { "cell_type": "code", "execution_count": 31, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -712,7 +752,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, From 8d7142763d1935b909e1429ec9bc670a483cb73c Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Tue, 10 Oct 2017 00:20:41 +0900 Subject: [PATCH 052/124] =?UTF-8?q?python=2007,=2008=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EB=B0=8F=20assignment=202=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-1.ipynb | 2 +- python3.6/assignment-2.ipynb | 542 ++++++++++++++++++++++++++++++++++- python3.6/python07.ipynb | 161 ++++++----- python3.6/python08.ipynb | 101 +++++-- 4 files changed, 703 insertions(+), 103 deletions(-) diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb index 71f2a42..00c8a17 100644 --- a/python3.6/assignment-1.ipynb +++ b/python3.6/assignment-1.ipynb @@ -163,7 +163,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/assignment-2.ipynb b/python3.6/assignment-2.ipynb index a868650..cf37b55 100644 --- a/python3.6/assignment-2.ipynb +++ b/python3.6/assignment-2.ipynb @@ -111,23 +111,549 @@ " \n", " - 단어를 나누는 기준은 오로지 공백문자 (whitespace)이다.\n", " - 즉, 위 순수 텍스트 문자열인 \"로그인 유지\"에서 분리한 단어는 \"로그인\"과 \"유지\"이다.\n", + " - 중복을 고려하지 않고 무조건 모든 단어의 개수를 세어서 출력한다. \n", " - 다음은 URL로 지정된 웹페이지를 특정 문자열로 가져오는 코드이다. \n", " - 즉, 숙제 코드는 아래 코드로 부터 시작해야 한다." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { - "collapsed": true + "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" + ] + } + ], "source": [ - "from urllib.request import urlopen\n", + "from urllib import request \n", + " \n", + "url = 'http://cse.koreatech.ac.kr'\n", + "f = request.urlopen(url)\n", + "source_bytes = f.read()\n", + "source = source_bytes.decode('utf-8')\n", "\n", - "source = urlopen(\"http://cse.koreatech.ac.kr/\").read()\n", - "\n", - "print(source) # 추후 숙제 답안 제출 때엔 왼쪽 라인은 주석처리할 것" + "# 추후 숙제 답안 제출 때엔 아래 코드는 주석처리할 것 \n", + "print(type(source_bytes))\n", + "print(type(source))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "컴퓨터공학부\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tSchoolfun - Study and Fun\n", + "\t\n", + "\t\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\t\n", + "\t\t\t\n", + "\n", + "\n", + "
\n", + "\t
\n", + "\t\t
\n", + "\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\n", + "\t\t\t\"School\n", + "\t\t\t\n", + "\t\t
\n", + "\t
\n", + "\t\n", + "
\n", + "\t \t \n", + "\n", + "
\n", + " \n", + "\t
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

IT 교육의 글로벌 메카

\n", + "

한국기술교육대학교 컴퓨터공학부 홈페이지에 오신 것을
환영합니다!

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\t
\n", + "
\n", + "

IT 융합소프트웨어 인력양성사업

\n", + "

글로벌 수준의 IT전문인력 양성
\n", + "IT융합분야에 대한 국제적인 경쟁력 고취

\n", + " 바로가기\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\t
\n", + "
\n", + "

교육역량강화사업 컨텐츠

\n", + "

교육역량강화사업 온라인 컨텐츠를 소개합니다.

\n", + " 바로가기\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\t\t\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "# 추후 숙제 답안 제출 때엔 아래 코드는 주석처리할 것\n", + "print(source)" ] } ], @@ -148,7 +674,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/python07.ipynb b/python3.6/python07.ipynb index df7b962..4024385 100644 --- a/python3.6/python07.ipynb +++ b/python3.6/python07.ipynb @@ -32,7 +32,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "s = 'abcdef'\n", @@ -65,7 +67,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -95,7 +99,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "IndexError", @@ -124,7 +130,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -164,7 +172,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -191,7 +201,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -220,7 +232,9 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -249,7 +263,9 @@ { "cell_type": "code", "execution_count": 10, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -275,7 +291,9 @@ { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -305,7 +323,9 @@ { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -336,7 +356,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -370,7 +392,9 @@ { "cell_type": "code", "execution_count": 14, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "s = ''\n", @@ -382,7 +406,9 @@ { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -407,7 +433,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -434,7 +462,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -488,7 +518,9 @@ { "cell_type": "code", "execution_count": 18, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -522,7 +554,9 @@ { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -563,7 +597,9 @@ { "cell_type": "code", "execution_count": 20, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -584,7 +620,9 @@ { "cell_type": "code", "execution_count": 21, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -613,7 +651,9 @@ { "cell_type": "code", "execution_count": 22, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -641,13 +681,17 @@ "metadata": {}, "source": [ "- 다국어 문자의 올바른 표현을 위하여 유니코드 타입 지원이 됨\n", - "- 유니코드 타입의 문자열 리터럴: u'Hello'" + "- 유니코드 타입의 문자열 리터럴: u'Hello'\n", + "- 하지만 Python 3 부터는 모든 str은 기본적으로 Unicode로 저장되기 때문에 u 표기 리터럴을 사용할 필요가 없음\n", + " - Since Python 3.0, the language features a str type that contain Unicode characters, meaning any string created using \"unicode rocks!\", 'unicode rocks!', or the triple-quoted string syntax is stored as Unicode [Source: https://docs.python.org/3/howto/unicode.html]." ] }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, + "execution_count": 1, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -675,26 +719,17 @@ "print(type(b))\n", "print(b)\n", "print()\n", - "c = a + b # 일반 문자열과 유니코드를 합치면 유니코드로 변환\n", + "c = a + b\n", "print(type(c))\n", - "print(c)\n", - "\n", - "\n", - "# Spam and Egg\n", - "\n", - "# \n", - "# a\n", - "# \n", - "# bc\n", - "\n", - "# \n", - "# abc" + "print(c)" ] }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, + "execution_count": 3, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -705,13 +740,15 @@ } ], "source": [ - "print(u'Spam \\uB610 Egg') # 문자열 내에 유티코드 이스케이프 문자인 \\uHHHH 사용가능, HHHH는 4자리 16진수 (unicode 포맷)" + "print('Spam \\uB610 Egg') # 문자열 내에 유티코드 이스케이프 문자인 \\uHHHH 사용가능, HHHH는 4자리 16진수 (unicode 포맷)" ] }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, + "execution_count": 5, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -723,7 +760,7 @@ } ], "source": [ - "#a = unicode('한글', 'utf-8') # '한글' 문자열의 인코딩 방식을 'utf-8'형태로 인식시키면서 해당 문자열을 unicode로 변환\n", + "#a = unicode('한글', 'utf-8') # '한글' 문자열의 인코딩 방식을 'utf-8'로 인식시키며 unicode로 변환 --> python3 부터는 지원되지 않음\n", "a = str('한글')\n", "print(type(a))\n", "print(a)\n", @@ -735,44 +772,32 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, + "execution_count": 7, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "8\n", "8\n" ] - }, - { - "ename": "NameError", - "evalue": "name 'unicode' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'한글과 세종대왕'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0municode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'한글과 세종대왕'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#유니코드 타입의 문자열은 한글 문자열 길이를 올바르게 반환함\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mu'한글과 세종대왕'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'unicode' is not defined" - ] } ], "source": [ "print(len('한글과 세종대왕'))\n", - "print(len(unicode('한글과 세종대왕', 'utf-8'))) #유니코드 타입의 문자열은 한글 문자열 길이를 올바르게 반환함\n", - "print(len(u'한글과 세종대왕'))\n", - "\n", - "\n", - "\n", - "# 22\n", - "# 8\n", - "# 8" + "#print(len(unicode('한글과 세종대왕', 'utf-8'))) #python 3 에서 지원하지 않음\n", + "print(len(u'한글과 세종대왕'))" ] }, { "cell_type": "code", - "execution_count": 33, - "metadata": {}, + "execution_count": 8, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -800,8 +825,8 @@ } ], "source": [ - "# u = unicode('한글과 세종대왕', 'utf-8') #유니코드 타입의 한글 문자열에 대해서는 인덱싱 및 슬라이싱이 올바르게 수행됨 \n", - "u = str('한글과 세종대왕') #유니코드 타입의 한글 문자열에 대해서는 인덱싱 및 슬라이싱이 올바르게 수행됨 \n", + "# u = unicode('한글과 세종대왕', 'utf-8') #python 3에서 지원하지 않음 \n", + "u = str('한글과 세종대왕') #python 3 부터는 임의의 str은 유니코드이기 때문에 한글이 포함된 str에 대해서도 인덱싱 및 슬라이싱이 올바르게 수행됨 \n", "print(u[0])\n", "print(u[1])\n", "print(u[:3])\n", @@ -869,7 +894,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/python08.ipynb b/python3.6/python08.ipynb index 0d7a6c1..cab9933 100644 --- a/python3.6/python08.ipynb +++ b/python3.6/python08.ipynb @@ -23,7 +23,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -48,8 +50,10 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, + "execution_count": 1, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -71,7 +75,7 @@ "s = 'i like programming, i like swimming.'\n", "print(s.count('like')) # 'like' 문자열이 출현한 횟수를 반환\n", "print()\n", - "print(s.find('like')) # 'like'의 첫글자 위치 (offset)를 반환\n", + "print(s.find('like')) # 'like'의 첫글자의 인덱스인 위치(offset)를 반환\n", "print(s.find('programming')) # 'programming'의 첫글자 위치를 반환\n", "print(s.find('programmin')) # 'programmin'의 첫글자 위치를 반환\n", "print(s.find('programmii')) # 'programmii' 단어는 없기 때문에 -1 반환\n", @@ -83,7 +87,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -112,7 +118,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -133,7 +141,7 @@ "u = ' spam and ham '\n", "print(u.strip()) # 좌우 공백을 제거하여 새로운 스트링 생성\n", "print(u) # 스트링은 변경불가능 \n", - "y = u.strip() # strip()는 새로운 스트링을 생성함\n", + "y = u.strip() # 즉, strip()는 새로운 스트링을 생성함\n", "print(y)\n", "print()\n", "\n", @@ -146,7 +154,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -166,7 +176,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -186,7 +198,9 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -212,7 +226,9 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -254,8 +270,10 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, + "execution_count": 3, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -267,7 +285,8 @@ } ], "source": [ - "u2 = u\"스팸 햄 계란 치즈\"\n", + "#u2 = u\"스팸 햄 계란 치즈\" \n", + "u2 = \"스팸 햄 계란 치즈\" # python 3 부터는 u 리터럴 표기 불필요\n", "t2 = u2.split()\n", "print(t2)\n", "print(t2[0], t2[1], t2[2], t2[3])\n", @@ -280,7 +299,9 @@ { "cell_type": "code", "execution_count": 10, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -310,7 +331,9 @@ { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -336,7 +359,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -358,7 +383,9 @@ { "cell_type": "code", "execution_count": 14, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -387,7 +414,9 @@ { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -440,7 +469,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -457,7 +488,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -556,7 +589,9 @@ { "cell_type": "code", "execution_count": 18, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -573,7 +608,9 @@ { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -590,7 +627,9 @@ { "cell_type": "code", "execution_count": 20, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -615,7 +654,9 @@ { "cell_type": "code", "execution_count": 21, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -633,6 +674,14 @@ "print('%(이름)s -- %(전화번호)s' %{'전화번호':5284, '이름':'홍길동', '주소':'Seoul'})" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 [참고] 새로운 포매팅 방법 (Python 3 기준)\n", + "- https://pyformat.info/" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -657,7 +706,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, From 3152c9d0c93c9ecfca31f6da63f486d8ca336610 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Tue, 10 Oct 2017 00:32:36 +0900 Subject: [PATCH 053/124] =?UTF-8?q?Assignment=202=20-=20ACM=20ICPC=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=EB=A5=BC=201=EA=B0=9C=EB=A1=9C=20=EC=A4=84?= =?UTF-8?q?=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-2.ipynb | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/python3.6/assignment-2.ipynb b/python3.6/assignment-2.ipynb index cf37b55..72c78ff 100644 --- a/python3.6/assignment-2.ipynb +++ b/python3.6/assignment-2.ipynb @@ -6,11 +6,11 @@ "source": [ "# Assignment 2\n", "### [정보]\n", - "#### 1) Due Date: 2017년 10월 16일 (월), 23시 59분\n", + "#### 1) Due Date: 2017년 10월 19일 (목), 23시 59분\n", "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", - "#### 5) 문제 (ACM-ICPC 3문제 포함하여 총 7개)" + "#### 5) 문제 (ACM-ICPC 1문제 및 Incremental Project 문제 포함하여 총 5개)" ] }, { @@ -66,21 +66,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [프로젝트 오일러 문제 4]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [프로젝트 오일러 문제 5]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [프로젝트 오일러 문제 6]" + "- [ACM-ICPC 문제 4]" ] }, { From d4e89faa7288d7fb455fda3c3e7042ca367da3fa Mon Sep 17 00:00:00 2001 From: dohyung Date: Tue, 10 Oct 2017 00:47:20 +0900 Subject: [PATCH 054/124] =?UTF-8?q?python10,=2012=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python10.ipynb | 64 ++++++++++++++++++---------------------- python3.6/python12.ipynb | 10 ++++++- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/python3.6/python10.ipynb b/python3.6/python10.ipynb index 8d57a35..a383d5a 100644 --- a/python3.6/python10.ipynb +++ b/python3.6/python10.ipynb @@ -52,11 +52,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 파이썬은 디폴트로 cmp(a, b) 내장 함수를 이용하여 정렬 방식을 결정한다.\n", - "- cmp(a, b)\n", - " - if a < b: return -1\n", - " - if a > b: return 1\n", - " - if a == b: return 0" + "- 파이썬2에서는 cmp(a,b) 내장 함수가 지원되었으나,\n", + "- 파이썬3부터는 cmp(a,b) 내장 함수가 지원되지 않는다." ] }, { @@ -91,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -105,6 +102,10 @@ } ], "source": [ + "# cmp(a, b)\n", + "# if a < b: return -1\n", + "# if a > b: return 1\n", + "# if a == b: return 0\n", "def cmp(a, b):\n", " return (a > b) - (a < b) \n", "\n", @@ -119,23 +120,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 기본 정렬 방식을 변경하려면 cmp(a, b)와 같은 비교 함수를 직접 만들어서 sort() 함수의 인자로 넣는다." + "- (수정필요..)기본 정렬 방식을 변경하려면 cmp(a, b)와 같은 비교 함수를 직접 만들어서 sort() 함수의 인자로 넣는다." ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 55, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "must use keyword argument for key function", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: must use keyword argument for key function" + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 5, 3, 2, 4, 6]\n" ] } ], @@ -143,11 +140,10 @@ "def mycmp(a1, a2): # 대소관계에 따른 순서를 반대로 바꾸었음\n", " return cmp(a2, a1)\n", "\n", - "L = [1, 5, 3, 2, 4, 6]\n", - "L.sort(mycmp) # 역순으로 정렬\n", - "print(L)\n", - "\n", - "\n", + "# L = [1, 5, 3, 2, 4, 6]\n", + "# print(L)\n", + "# mycmp(L)\n", + "# L.sort(mycmp) # 역순으로 정렬\n", "# [6, 5, 4, 3, 2, 1]" ] }, @@ -155,7 +151,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 여러 튜플을 요소로 지닌 리스트인 경우, 튜플의 첫번째 값이 아닌 다른 위치에 있는 값을 기준으로 정렬 " + "- (수정필요..)여러 튜플을 요소로 지닌 리스트인 경우, 튜플의 첫번째 값이 아닌 다른 위치에 있는 값을 기준으로 정렬 " ] }, { @@ -218,20 +214,20 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[9, 8, 6, 6, 3, 2, 1]\n" + "[1, 2, 3, 6, 6, 8, 9]\n" ] } ], "source": [ "L = [1, 6, 3, 8, 6, 2, 9]\n", - "L.sort(reverse = True)\n", + "L.sort(reverse = True) # L.sort(reverse = 1)\n", "print(L)" ] }, @@ -317,23 +313,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- sorted() 함수의 두번째 인자로 cmp 함수 지정 가능" + "- (수정필요..)sorted() 함수의 두번째 인자로 cmp 함수 지정 가능" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 60, "metadata": {}, "outputs": [ { "ename": "TypeError", - "evalue": "must use keyword argument for key function", + "evalue": "mycmp() missing 1 required positional argument: 'a2'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: must use keyword argument for key function" + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'pinfo'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'sorted'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: mycmp() missing 1 required positional argument: 'a2'" ] } ], @@ -342,10 +338,8 @@ " return cmp(a2, a1)\n", "\n", "L = [1, 5, 3, 2, 4, 6]\n", - "print(sorted(L, mycmp)) # 역순으로 정렬\n", + "print(sorted(L, key=mycmp)) # 역순으로 정렬\n", "print(L)\n", - "\n", - "\n", "# ['123', '2345', '34', '56']\n", "# ['34', '56', '123', '2345']" ] @@ -411,7 +405,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 58, "metadata": {}, "outputs": [ { @@ -427,7 +421,7 @@ "L = [1, 6, 3, 8, 6, 2, 9]\n", "L.reverse() # 역순으로 뒤집는다.\n", "for ele in L:\n", - " print(ele + 2, end=\" \")\n", + " print(ele + 2, end=\" \")\n", "\n", "print()\n", "L.reverse() # 다시 원상태로 복귀시킨다.\n", diff --git a/python3.6/python12.ipynb b/python3.6/python12.ipynb index 6b0cdfe..ad5835d 100644 --- a/python3.6/python12.ipynb +++ b/python3.6/python12.ipynb @@ -121,6 +121,13 @@ "execution_count": 4, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'str': 'abc', 1: 4, (1, 2, 3): 'tuple'}\n" + ] + }, { "ename": "TypeError", "evalue": "unhashable type: 'list'", @@ -128,7 +135,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'tuple'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'list'\u001b[0m \u001b[0;31m# 리스트는 키가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'tuple'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'list'\u001b[0m \u001b[0;31m# 리스트는 키가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" ] } @@ -138,6 +145,7 @@ "d['str'] = 'abc'\n", "d[1] = 4\n", "d[(1,2,3)] = 'tuple'\n", + "print(d)\n", "d[[1,2,3]] = 'list' # 리스트는 키가 될 수 없다." ] }, From d0dc3f10092de529da0e689254f95e12fb4a538c Mon Sep 17 00:00:00 2001 From: dohyung Date: Tue, 10 Oct 2017 01:07:29 +0900 Subject: [PATCH 055/124] =?UTF-8?q?assignment2=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-2.ipynb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/python3.6/assignment-2.ipynb b/python3.6/assignment-2.ipynb index 72c78ff..d254f6d 100644 --- a/python3.6/assignment-2.ipynb +++ b/python3.6/assignment-2.ipynb @@ -66,7 +66,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [ACM-ICPC 문제 4]" + "- [ACM-ICPC 문제 1110번]\n", + " - 더하기 사이클
\n", + "https://www.acmicpc.net/problem/1110" ] }, { @@ -105,9 +107,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -134,9 +134,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -660,7 +658,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.1" } }, "nbformat": 4, From 452b298430eab3c9a8e46421761f6a2fa3e148c9 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Tue, 10 Oct 2017 07:24:34 +0900 Subject: [PATCH 056/124] ... --- python3.6/assignment-2.ipynb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python3.6/assignment-2.ipynb b/python3.6/assignment-2.ipynb index 72c78ff..26a9b4e 100644 --- a/python3.6/assignment-2.ipynb +++ b/python3.6/assignment-2.ipynb @@ -97,7 +97,8 @@ " \n", " - 단어를 나누는 기준은 오로지 공백문자 (whitespace)이다.\n", " - 즉, 위 순수 텍스트 문자열인 \"로그인 유지\"에서 분리한 단어는 \"로그인\"과 \"유지\"이다.\n", - " - 중복을 고려하지 않고 무조건 모든 단어의 개수를 세어서 출력한다. \n", + " - 중복을 고려하지 않고 무조건 모든 단어의 개수를 세어서 출력한다.\n", + " - 본 숙제를 위하여 HTML 파싱과 관련된 모듈 (예. BeautifulSoup) 사용 금지\n", " - 다음은 URL로 지정된 웹페이지를 특정 문자열로 가져오는 코드이다. \n", " - 즉, 숙제 코드는 아래 코드로 부터 시작해야 한다." ] From 40fbcfd0892f9274d308b2038bd166200f0f3a9a Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 16 Oct 2017 19:15:12 +0900 Subject: [PATCH 057/124] =?UTF-8?q?python3=20-=2009,=2010=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python09.ipynb | 118 ++++++++---- python3.6/python10.ipynb | 389 ++++++++++++++++++++++++++++++++------- 2 files changed, 407 insertions(+), 100 deletions(-) diff --git a/python3.6/python09.ipynb b/python3.6/python09.ipynb index 2de5241..03e6010 100644 --- a/python3.6/python09.ipynb +++ b/python3.6/python09.ipynb @@ -25,8 +25,10 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, + "execution_count": 1, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -75,7 +77,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -101,7 +105,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -135,7 +141,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -162,7 +170,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -197,7 +207,9 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -220,7 +232,9 @@ { "cell_type": "code", "execution_count": 9, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -253,7 +267,9 @@ { "cell_type": "code", "execution_count": 10, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "NameError", @@ -283,7 +299,9 @@ { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -305,7 +323,9 @@ { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -323,7 +343,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -354,7 +376,9 @@ { "cell_type": "code", "execution_count": 14, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -377,7 +401,9 @@ { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -400,7 +426,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -427,7 +455,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -452,7 +482,9 @@ { "cell_type": "code", "execution_count": 18, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -480,7 +512,9 @@ { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -508,7 +542,9 @@ { "cell_type": "code", "execution_count": 20, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -536,7 +572,9 @@ { "cell_type": "code", "execution_count": 21, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -573,7 +611,9 @@ { "cell_type": "code", "execution_count": 22, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -597,7 +637,9 @@ { "cell_type": "code", "execution_count": 23, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -630,31 +672,39 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, + "execution_count": 4, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "None\n", "[100, -7, -10, 2, 1]\n", + "None\n", "[-10, -7, 1, 2, 100]\n" ] } ], "source": [ "s = [1, 2, -10, -7, 100]\n", - "s.reverse() # 자료의 순서를 뒤집기 (반환값 없음) \n", + "k = s.reverse() # 자료의 순서를 뒤집기 (반환값 없음) \n", + "print(k)\n", "print(s)\n", "\n", - "s.sort() # 정렬 (반환값 없음)\n", + "k = s.sort() # 정렬 (반환값 없음)\n", + "print(k)\n", "print(s)" ] }, { "cell_type": "code", "execution_count": 25, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -693,7 +743,9 @@ { "cell_type": "code", "execution_count": 26, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -725,7 +777,9 @@ { "cell_type": "code", "execution_count": 27, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -759,7 +813,9 @@ { "cell_type": "code", "execution_count": 28, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -809,7 +865,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/python10.ipynb b/python3.6/python10.ipynb index a383d5a..25af325 100644 --- a/python3.6/python10.ipynb +++ b/python3.6/python10.ipynb @@ -31,7 +31,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -59,7 +61,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "NameError", @@ -68,7 +72,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNameError\u001b[0m: name 'cmp' is not defined" ] } @@ -88,8 +92,10 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, + "execution_count": 3, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -109,9 +115,9 @@ "def cmp(a, b):\n", " return (a > b) - (a < b) \n", "\n", - "print(cmp(1,2))\n", + "print(cmp(1, 2))\n", "\n", - "print(cmp(5,2))\n", + "print(cmp(5, 2))\n", "\n", "print(cmp('abc', 'abc'))" ] @@ -120,13 +126,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- (수정필요..)기본 정렬 방식을 변경하려면 cmp(a, b)와 같은 비교 함수를 직접 만들어서 sort() 함수의 인자로 넣는다." + "- Python2: 기본 정렬 방식을 변경하려면 cmp(a, b)와 같은 비교 함수를 직접 만들어서 sort() 함수의 인자로 넣는다.\n", + "- Python3: 기본 정렬 방식을 변경할 수 없다." ] }, { "cell_type": "code", - "execution_count": 55, - "metadata": {}, + "execution_count": 4, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -134,11 +143,26 @@ "text": [ "[1, 5, 3, 2, 4, 6]\n" ] + }, + { + "ename": "TypeError", + "evalue": "must use keyword argument for key function", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;31m# L = [1, 5, 3, 2, 4, 6]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: must use keyword argument for key function" + ] } ], "source": [ - "def mycmp(a1, a2): # 대소관계에 따른 순서를 반대로 바꾸었음\n", - " return cmp(a2, a1)\n", + "def mycmp(a, b): # 대소관계에 따른 순서를 반대로 바꾸었음\n", + " return cmp(b, a)\n", + "\n", + "L = [1, 5, 3, 2, 4, 6]\n", + "print(L)\n", + "L.sort(mycmp) # 역순으로 정렬\n", "\n", "# L = [1, 5, 3, 2, 4, 6]\n", "# print(L)\n", @@ -151,13 +175,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- (수정필요..)여러 튜플을 요소로 지닌 리스트인 경우, 튜플의 첫번째 값이 아닌 다른 위치에 있는 값을 기준으로 정렬 " + "- 여러 튜플을 요소로 지닌 리스트인 경우, 튜플의 첫번째 값이 아닌 다른 위치에 있는 값을 기준으로 정렬 " ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "execution_count": 5, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -173,12 +199,13 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by name:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp_1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by experience:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by name:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp_1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by experience:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: must use keyword argument for key function" ] } ], "source": [ + "#Python2 기준 예제\n", "def cmp_1(a1, a2):\n", " return cmp(a1[1], a2[1])\n", "\n", @@ -195,14 +222,78 @@ "L.sort(cmp_2)\n", "print('sorted by age:', L)\n", "\n", - "\n", - "\n", - "\n", "# sorted by name: [('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n", "# sorted by experience: [('kim', 3, 28), ('lee', 5, 38), ('jung', 10, 36)]\n", "# sorted by age: [('kim', 3, 28), ('jung', 10, 36), ('lee', 5, 38)]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Python3: sort의 인자인 key에 객체가 지닌 원소들 내에 키값을 지정하는 함수를 지정가능" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sorted by name: [('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n", + "sorted by experience: [('kim', 3, 28), ('lee', 5, 38), ('jung', 10, 36)]\n" + ] + } + ], + "source": [ + "#Python3 기준 예제\n", + "L = [ ('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", + "\n", + "def cmp_by_each_element(a):\n", + " return a[1]\n", + "\n", + "L.sort()\n", + "print('sorted by name:', L)\n", + "\n", + "L.sort(key=cmp_by_each_element)\n", + "print('sorted by experience:', L)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sorted by the first character: ['jung', 'kim', 'loh']\n", + "sorted by the second character: ['kim', 'loh', 'jung']\n" + ] + } + ], + "source": [ + "#Python3 기준 예제\n", + "S = ['loh', 'kim', 'jung']\n", + "\n", + "def cmp_by_each_element(a):\n", + " return a[1]\n", + "\n", + "S.sort()\n", + "print('sorted by the first character:', S)\n", + "\n", + "S.sort(key=cmp_by_each_element)\n", + "print('sorted by the second character:', S)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -214,13 +305,16 @@ }, { "cell_type": "code", - "execution_count": 57, - "metadata": {}, + "execution_count": 8, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "[9, 8, 6, 6, 3, 2, 1]\n", "[1, 2, 3, 6, 6, 8, 9]\n" ] } @@ -228,6 +322,8 @@ "source": [ "L = [1, 6, 3, 8, 6, 2, 9]\n", "L.sort(reverse = True) # L.sort(reverse = 1)\n", + "print(L)\n", + "L.sort(reverse = False) # L.sort(reverse = 1)\n", "print(L)" ] }, @@ -241,8 +337,10 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, + "execution_count": 9, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -272,8 +370,10 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, + "execution_count": 10, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -293,8 +393,10 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, + "execution_count": 11, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -313,13 +415,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- (수정필요..)sorted() 함수의 두번째 인자로 cmp 함수 지정 가능" + "- Python2: sorted() 함수의 두번째 인자로 cmp 함수 할당 가능\n", + "- Python3: sorted() 함수의 두번째 인자로 key를 지정하는 함수 할당 가능 " ] }, { "cell_type": "code", - "execution_count": 60, - "metadata": {}, + "execution_count": 12, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -328,7 +433,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'pinfo'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'sorted'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# ['123', '2345', '34', '56']\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: mycmp() missing 1 required positional argument: 'a2'" ] } @@ -344,6 +449,76 @@ "# ['34', '56', '123', '2345']" ] }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n", + "[('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", + "\n", + "[('kim', 3, 28), ('lee', 5, 38), ('jung', 10, 36)]\n", + "[('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n" + ] + } + ], + "source": [ + "#Python3 기준 예제\n", + "L = [ ('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", + "\n", + "def cmp_by_each_element(a):\n", + " return a[1]\n", + "\n", + "print(sorted(L))\n", + "print(L)\n", + "\n", + "print()\n", + "\n", + "print(sorted(L, key=cmp_by_each_element))\n", + "print(L)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['jung', 'kim', 'loh']\n", + "['loh', 'kim', 'jung']\n", + "\n", + "['kim', 'loh', 'jung']\n", + "['loh', 'kim', 'jung']\n" + ] + } + ], + "source": [ + "#Python3 기준 예제\n", + "S = ['loh', 'kim', 'jung']\n", + "\n", + "def cmp_by_each_element(a):\n", + " return a[1]\n", + "\n", + "print(sorted(S))\n", + "print(S)\n", + "\n", + "print()\n", + "\n", + "print(sorted(S, key=cmp_by_each_element))\n", + "print(S)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -353,24 +528,48 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, + "execution_count": 15, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[9, 8, 6, 6, 3, 2, 1]\n", - "['34', '56', '123', '2345']\n" + "[9, 8, 6, 6, 3, 2, 1]\n" ] } ], "source": [ "L = [1, 6, 3, 8, 6, 2, 9]\n", - "print(sorted(L, reverse=True))\n", - "\n", + "print(sorted(L, reverse=True))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['123', '2345', '34', '56']\n", + "['34', '56', '123', '2345']\n", + "['2345', '123', '56', '34']\n" + ] + } + ], + "source": [ "L = ['123', '34', '56', '2345']\n", - "print(sorted(L, key=int))" + "print(sorted(L))\n", + "\n", + "print(sorted(L, key=int))\n", + "\n", + "print(sorted(L, key=int, reverse=True))" ] }, { @@ -385,8 +584,10 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, + "execution_count": 17, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -405,8 +606,10 @@ }, { "cell_type": "code", - "execution_count": 58, - "metadata": {}, + "execution_count": 18, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -438,8 +641,10 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, + "execution_count": 19, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -472,8 +677,10 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, + "execution_count": 20, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -500,8 +707,10 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, + "execution_count": 21, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -547,8 +756,10 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": {}, + "execution_count": 22, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -572,8 +783,10 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, + "execution_count": 23, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -586,7 +799,7 @@ "source": [ "L = []\n", "for k in range(10):\n", - " if k%2:\n", + " if k % 2:\n", " L.append(k*k)\n", "print(L)" ] @@ -595,57 +808,95 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 20보다 작은 2의 배수와 3의 배수에 대해 그 두 수의 합이 7의 배수인 것들에 대해 그 두 수의 곱을 출력하는 코드" + "- 두 개의 시퀀스 자료형에 대해 각각의 원소에 대한 쌍을 튜플 형태로 만들면서 리스트에 저장하는 코드" ] }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, + "execution_count": 24, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[(2, 12, 24), (4, 3, 12), (6, 15, 90), (8, 6, 48), (10, 18, 180), (12, 9, 108), (16, 12, 192), (18, 3, 54)]\n" + "[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]\n" ] } ], "source": [ - "L = [(i, j, i*j) for i in range(2, 20, 2) for j in range(3, 20, 3) if (i + j) % 7 == 0]\n", - "print(L)" + "seq1 = 'abc'\n", + "seq2 = (1, 2, 3)\n", + "print([(x, y) for x in seq1 for y in seq2])" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]\n" + ] + } + ], + "source": [ + "seq1 = 'abc'\n", + "seq2 = (1, 2, 3)\n", + "l = []\n", + "for x in seq1:\n", + " for y in seq2:\n", + " l.append((x, y))\n", + "print(l) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- 두 개의 시퀀스 자료형에 대해 각각의 원소에 대한 쌍을 튜플 형태로 만들면서 리스트에 저장하는 코드" + "- 20보다 작은 2의 배수와 3의 배수에 대해 그 두 수의 합이 7의 배수인 것들에 대해 그 두 수의 곱을 출력하는 코드" ] }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, + "execution_count": 26, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]\n" + "[(2, 12, 24), (4, 3, 12), (6, 15, 90), (8, 6, 48), (10, 18, 180), (12, 9, 108), (16, 12, 192), (18, 3, 54)]\n" ] } ], "source": [ - "seq1 = 'abc'\n", - "seq2 = (1, 2, 3)\n", - "print([(x, y) for x in seq1 for y in seq2])" + "L = [(i, j, i*j) for i in range(2, 20, 2) for j in range(3, 20, 3) if (i + j) % 7 == 0]\n", + "print(L)" ] }, { - "cell_type": "code", - "execution_count": 29, + "cell_type": "markdown", "metadata": {}, + "source": [ + "- 문장 내 단어의 길이 출력" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -694,7 +945,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, From ca233cf3130c273fc5a476cc7c29a5b07e96e15a Mon Sep 17 00:00:00 2001 From: dohyung Date: Tue, 24 Oct 2017 00:00:23 +0900 Subject: [PATCH 058/124] =?UTF-8?q?assignment=203=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-1.ipynb | 2 +- python3.6/assignment-3.ipynb | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb index 00c8a17..71f2a42 100644 --- a/python3.6/assignment-1.ipynb +++ b/python3.6/assignment-1.ipynb @@ -163,7 +163,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.1" } }, "nbformat": 4, diff --git a/python3.6/assignment-3.ipynb b/python3.6/assignment-3.ipynb index 60bc53d..f58aa86 100644 --- a/python3.6/assignment-3.ipynb +++ b/python3.6/assignment-3.ipynb @@ -6,11 +6,11 @@ "source": [ "# Assignment 3\n", "### [정보]\n", - "#### 1) Due Date: 2017년 10월 30일 (월), 23시 59분\n", + "#### 1) Due Date: 2017년 10월 31일 (월), 23시 59분\n", "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", - "#### 5) 문제 (ACM-ICPC 3문제 포함하여 총 11개)" + "#### 5) 문제 (ACM-ICPC 1문제 포함하여 총 9개)" ] }, { @@ -174,6 +174,17 @@ " - http://www.nytimes.com" ] }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "- [ACM-ICPC 문제 1152번] \n", + " - 단어의 개수
\n", + " https://www.acmicpc.net/problem/1152" + ] + }, { "cell_type": "code", "execution_count": null, From 4349044eea4b2b1522329647bd9eb9a6526a6781 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Tue, 24 Oct 2017 00:03:41 +0900 Subject: [PATCH 059/124] ... --- images/shallow_copy.graphml | 64 ++++++++------------ images/shallow_copy.png | Bin 30653 -> 30781 bytes python3.6/python11.ipynb | 115 +++++++++++++++++++++++++++--------- python3.6/python12.ipynb | 78 +++++++++++++++++------- 4 files changed, 168 insertions(+), 89 deletions(-) diff --git a/images/shallow_copy.graphml b/images/shallow_copy.graphml index 27f2dcd..6178a30 100644 --- a/images/shallow_copy.graphml +++ b/images/shallow_copy.graphml @@ -609,23 +609,6 @@ - - - - - - - 4 - - - - - - - - - - @@ -737,21 +720,7 @@ - - - - - - - - - - - - - - - + @@ -763,7 +732,7 @@ - + @@ -778,7 +747,7 @@ - + @@ -793,7 +762,7 @@ - + @@ -808,7 +777,7 @@ - + @@ -822,7 +791,7 @@ - + @@ -836,7 +805,7 @@ - + @@ -848,7 +817,7 @@ - + @@ -862,7 +831,7 @@ - + @@ -876,6 +845,21 @@ + + + + + + + + + + + + + + + diff --git a/images/shallow_copy.png b/images/shallow_copy.png index 1e10fc3c24df25123e049b6986ddf7a879877f00..1f1bac684f7dd1ca31ff56e3b08ab791c939a351 100644 GIT binary patch literal 30781 zcmbrmbzGEN+dn#hf&zj;2~r|0At4=tbeBjYBHi5~0xAMSH%K=~4vk1Sw1lL9lynUx z{aZ8Wv!DH*_k7OhoZ~-xbl>+{*Shk1#k$`qD@xtKCdGz8AU9;BpQ=J2nDGz@`onAJ z;9txKgnS_ow<|JFpQyV{tWV*4sVz4C-oaW>^1mM=LG;MTIiYQUv2K+K=K4#2&E~Uw zy;j)}zd*6hQdf{Ftm*NCzJe*6T<6!%o;}#?P@$jvtwt-BqJmA3A7!4)n~ACUyu^ib zK92bb&2NEV~nE}d-aKCm!gCU6BvnJ$Y@!9yMkgq zl{Z71-+5H|$j9rbzl$C#zePKve^vbC4(jiId+9eZj+MH!1L!V=wIWW9xtA7Qg$Wdb zuYcC=8WmmrR9_5O9l22E9&#b7VE0D-!tWMk&ySCf&2D^C0vhz}pLIn`5FU;EDJ8|l zEF`#tq$ClovkVLjA7gs81&0!-ed|Beo?uB)s2(3|n|B?Sb^g7!5(KVPfKi*ExQoFFMNNY)KVe$Y2N z&HTl&5|ND1r;-xI($Pt)$6%*}k&ogK2y)?(k!OtbIph$CABUP6P%m=mZHhA~l?MIN zUXv)Xjjb&uTgz|M5WjkI_UE>?rJcqZm(LD;E3m0#I+OD6>h2zDw7W;Si+si|87SWc zpz^(f0;e)F8m0B^D1RnSbAE^&3}aaY@RdAYg6bx`yIbxMM*PGgkpyhHuhcw~*71iT zzjI)O>Ji#|dwbisH;=<335khaot?AGxR-B2K2PC&ya313$Ra8(F4oY{;9@+JDzmV# zNK8r^8Y6YO2Ki}&^$oZpKPJ@>Crueqi^MFa(L|XcG(ejulCD*0mcg?|31}i6I>e*Y~0|LMWd*R8WR{m{oYTv#0;5U%({Re0uwnV=yn1e}PNxOCLAN}Gj9&cJ}O zSMH*d)q@5CNmO8ASQzl-qF^V60Pd0{jIMoOak93yZZU*bXJ0V9L20R7{Zuj=1X3BL zt^8jr@^BP>pBNdDEFAQW?y!L+^_r}9Lm+1KRUe^J7Xxmebs>P&HdpY1TaC(;nbR*A zqK5f&baeP$frlRa`=JH#od+Dp;YRL_(+v%R%`^R47!XmKe8vr#ivfqrg~F_^uL`fU zx3>eom&^@;NGm+K=sfzvw(;A;-h-AX3G!J2%};!N9<__+2t?&7P)?h7k_AKg8v79l zgo^v>8T}H*FJQZyF2-`ohca6$D~}T7|MxX9{2`45kk5@|ogZ-`5({Vz`I!Nmx~s_O z;js|Nx4Fg>iNz*W5`F&j><71vJ(#fL`>-KDHW(uOtbl9TpQ&eDP=V8Me;57i^b80= z>fIG%IiMyN(+bq#VifuLnCLkb=zvJs2UI%f5Ye+k8*Fz1gtP+pP4*N*pd>2y(Z+8B zg==;VFZZbWWmC4Evt5|4*dEw$m?m_9AE93ogM8eP?~<_0r|9Lh5Xi9a7R9Um)%PLc z#pBxS8sKTz<9o34b@G`EsFX!wH`{>%jbWdAw`*b>s^{;=?wWa?Q1r8X}C*}?{Bxb27C2a zHU8oZ(rwlqFZ3>vJx=yH zRx?ejKC`4hJmc63u)hCE+-rU0#>@5Lli>1;t#ke-XwI*S#3I=``OF z8luuCCqum@9losRG}ytZG-KznU^#kY=wg8JeCAoL9gz|mD|7I13(x;@JO<4?C^3gF zAKQ_bexCm0%IA-_C-k|`d|}tphHovVNKtUYSy|+an*bEYi;Lza&@@{YV=akcz%d)mOJOsY9N~7 zlGNeDT)7zk(u~?5B1BN^ZsfxS@|9clOiFm)+f(a}T0Cu?n_(B(7iViBCqite`=P9( zqeba3{-v~aefox^cK@ZtDx=K4tnRsVA_K=tsOz0TLDeB$ynm_bB54VfrzSbhi+XFt z@kV;x*mUp4*+oIze&hGEzNAS5M}9F|=N{pWn6H7RnZHjc7fQ>01m*Wxbb^odvrpNy z{}+1S@ZG~h)40oHliY43Qx0`?izE4+V{tJ}d=A@cZ{C=q9qs-xDdanTd{F31;&vzz z{JVQ=amDt$7%{&Qq9QWO#0qp>yr=8kCK0X5-2y0of4n&B1CfO2R@QZG9UWbm=0sUY^$EL z(Q4e+xo-$jCM_K;99o%}n0VbnRh-V%%Hp!~O&p()h=}4u!rURSL6eB^&8m@7@6nG< z11^vA;o8H{5*}BPvpKd+FN;mSbXYPWz4K&yTG~zTM}@ZI`~+Y-HI^&#rdRzQNSY!& z06g{@3B=*`A1n}UZb!|g{$;Z4Ww2A%{pKC0E_MIK-k8D?31(9f|6bKj(NL;2#o?FI zHcQJzb0@4+%If3TVgT!a=Rp~Vw2@N|REj#>>YX2&=-EBI;C7=Itf@wU*zOpX!_`$) zD^7I`;jA*7cikynLYmJVG8}F83dTG7?^d6(ms-aBo_{$P8bM(dS1i8s;eRDno%QCm z4`e)HOLL4`nwpw%}-bMq?vVRGv|?zNc{1K{e>{Tpl@C<`d-e|rkyqs zL3R_%B)3`3j6)tH+ppK;dQH}pi?rn|3IhFBiXhOoWx+0j7rj#sMz=h;zvov$56>&U zo)ZpsS4FD7L!GDH!^1q;&%@|)WA~vl<7AALhi|UVdRE&&_6cjK` zJejSlug5C2j6eVvVnO8fB=sJk9pSh(t;^P2?-}YgK<#V4uVlIK>P5ETw|cGLy1>h^ zmdRYmEylI_dX5&%W82*dKHj}khUdJWt%4W%IXzY#DbwDwKb%Qcu68mlKJ9Kz375P$ z{`^xj@;i)+eDxb1pU;X$6+q16x6v^CR{w(OE&vR*wY9Oau?IEb0u6HKOlw$^3mIb< zHW4%4o|$%~QQfA4_})ov^*Rfk_E@m)_A2EdK4o}RWNQnbbzA!Rv3ilXgpf3PaNP!( zac)*lEhREaMUtdMb;sUcb*0>j+$C9|eZ`bcDb~DnPvfr5PvuB;^3{XH<>2Gl{VZ8y zxhuGk0!>}rAK$-A2;@ol`uYO+#gFYCP-x;$jzA}fJU4CgOhNcwoMY979r)@Yww$ux zY;S**nh1=Iw<`_N_roEVJ@$P`$+Y@J(ld`z`9HDsZAMNG03l!X>sd4c1sS9w90`)A&y+fYXLyqB?CO&vq#5P%?1)TPtbZ!U4CQ36Dz{2VTp9-zPls3Y zjFLcJ_vz6t7Mm_vVouz1i@H6@fg`BfX53eeUSVNv-YDtX8NfNs4_=6FT7>w^EZ0n; zpJKt0)1lsZvv{}r)A0n^9+%$Kp}_55rxBp#?%hBN>}KG&RV=1K<^V}%a$JFd=K(9f z`FujIE$>;)C^F?l5p5Teqddm&a)lnh5^Nmv7K@pW$ir&%fzJdLWYB z2rX4r{@;_|D8h3=o{*LGz<+qp^@7Exj^Wgzmb;~WXw%^SdbM%fGdTp+h1ceo$Wsq% z&o}GQFPP$x0Zf!20LLBd7|FJ35z2 z3ttb9VO^X*F-1Zi%*DirPdRK1h)pZ}(V7oO@SBV@ENpDyV`HPEaiSKantcZubo#ni zan&wSmkKV+!VQ)sS}nN1AdQQjH$t>=eF|1Lv*Ed8yR|-X=yI4wVS#P!TW8f#sPwjx z9O39CGDauT;#$M!q{TOU$h7F&S5B%*TTY9P3F+`Me%-&sNrLO`?LE*>6DWx74w!fi z#Y9|9IGJvr94e~WrCMH#=@3*Zb%$+*`+DY@rY!|FH`SgM#|el}^7ILBNCc1V>Xgke zinJZJZY~?V>jgf=Gv>6vw$a2XWHyp1!s{kGg#FF^MfXh$wKibUw~5Pb zKAYFNHFoQaxon(&*tG<=)QM;w8ADMag+wgkwhgTQ(&APQ8j{P?-=2(FgA}Ef!i~AhEIL;i{On$mBYg{Kkbm=#! z-gLLIcH5lP%C)w>ZHRXwbS2048Z_*RzLj=`F!*J zFcS-l9?XW^8v`&DKfe1m9Pe*54Jrx5rhQvC*4~OQ;fbGsUO87?h zrBWXVs3&AI=W3>T`XjX;A2v)0&L0`PCno>WX!B-O=NaBU3${DT$pCe^RzIb$r6n^1 zX(d2&)IuMBQKdaOF=2+)PO1yX5xTY2NuS0=f*TP&C|v?QR9YHSxJW!F+OK-mnN^}O zmu=8Jw0xX)3k!y?TsNx?FM~Y zXXpK&@7y9!Pfr)pB3$k2-A-oTCH;~tO%$pXUD9TBDIzKr6h;JWlshn_{$pQuf^utE0WD!+Vd-~v9s~vkc9v>;ng#z}ax|Lhcq9-fKjkpqNw!2H zru5NsQ1E4Uq)bVS(IgEbb6Ni)<@e+e%|q^_7;$e`>cWvomRmsCe$h0#Y)!LdX9}l< zH=zYFqMyGJqxj7JX4XwG6@fs^5|yy9vMQECiH|8jd}y1wpz4qG+`oR5@5rM|U0vN- zTA~4fl!!2$z7F%WyXv&*&+bn%`8PS0Vhz|%S8Gb!B=1?AtUeDeXyiapUB9>L8G{fp z9aqS-!D2=3h6xE$ZtJvqEN~C+7?ULD8n2ff{}r%(9w`|aO_QR)b1f|`py=QBVEFaz z7n4k-!eub=)Oot2`IinG>p(CwdNI`vyIH5w0vFGA2Ku&no-;S!3rn~BZqK=LA8+5m zvq)Ue+dMkp!+|nPmzlB!z|$A+{m}d#QLdEPOw~OUjtWK|`zmJ7tLyBzFP?iItmo(D zz14;n78J-fL0z+?QjJ~Bf^~IIPAJ=aa!)st))oU_WnXM=K$|g{t>dQ8KAns?E@NW5 zPij)~M6u2(4_;8rE34phOo)Fspr@P-vsHn=jKB2UtDr#k<;$1UR0`B#e~-1S+=R5= zG;*xfO*>mRrNMT0c6RP0Mqn10P`Y%_mGPk<$TnCXDo`<&|V5|I}&FaRi9y2aw*+Q~%zLF>7p@Gvqjfsib{nbl$ zs-VMIDq91E{U?+am;}3aD&?Gf((ySAu%6X43~rE^@Nv^zu()l&dh4p%qKuZ|uxn$y;;R{#$*WKtg3C>Dh3R(~9n2%KR_#wY1DD#!*kf|2$Qck&#hc z9QqGgK|?EC3GzP8X-Kw({qYoNfOx=6EnUVB$R|t4A%@q!6EN;_k%qFyg&?2oaK7{@ zP*EynUESoVm@ms@hVgTt@)@M8U~XYiP*kLDH3J{PFomcNy}(xthL8l^G^!XcPn8$| zL9x9G1A?1AF}v^K%%AdgUd6->YzHDOODqV97WBL`84Wd} z$y?a7124%|Cuu{;nL!wN+00LZFCe@Dhn$r zD)RE+OS=O+5KyuL7#H(OK+D{m5hIR<-a@)V>ab4M@3plx0e*gh7>R%vvI1zF#u&Kb z6SS|WEk{eT|HDo*bMr?@y{n-!TZgVLF06WWm6et1qC)E~0$g%8nqau#*7S zcqs+kZKRd@^rs4OUFGOp+t)6B7ScXAI{KA82IF!g(%uXwemx~6{J&=+rRD@RVqmdm zSjK^WT;7mrt%h7XvnZvlHok_1WWm83Bi)zV5BOzp$HQLbGKCGfEQmxY)CSg92t4L z9TZ@i(CY33eS5%3VsiTi1?Uh^XMeOvz8-jQe&1skfjIRMNl5j;FxkFJ5>(l~;>5&< z)T0tOP-mGNL2M?=?Vrg+nrCb|5}wbaW2;=|VL7?ees{f)Cjc3SD$)0;DS&K1b(4xm z$`;$bOU=N*Ku1STK$QBjLf*MIOvWC-_L)74`f*Zmd3hwTHx@L}zOZQm1cAxn<`ibY zlWe)b`}CLXorslu9z#q6zZcTXf)wHUrJ8O;5;G9J2%y@Lq_~U=j336Wo~;ihq$^x@ zisY3V(KvsjRaB@E4rmvTR98RlBSm>(s)!b-SgO&O73hudPoOJFmrbxy@5duua!DU{dTPUc!`@+w5F!W3%hg=+QVmzmvyog6a>s z=~JM#F?0%`4itQq2ONaCc{;i1+|$qbBD_K*h9q6qpfvh8Ng*@>prrgl5Jy2lf$`S* z>MG*oELoXd{!t0KXc3Y~bSD>=*y!l(;g?X}TXx!biul0iI6QZCb$#(7-DAzbU-V;c zZf;doRZfn{=8szR)${{4sVEjSKW(Y4-(7aT-m*WMpXwe<*dH?*eQ~pYujp0#)XG4C znvMG?sngh@R+sClbn-P`7OY$>V12brB)CK%2D6<>3v9@eK0N#N%j8m) z$XES))K(^NR#kO$Cck|X6`)!xdS(e4oGavL7@|R#txs{>Mf4tw{^}DB5YwMaRy0*n zxn+Qb_U;av8XSYb+Z$%zchSl` z5^7FNUYw%?0>A{FCB2i)RM3ZC}x&A=hh_Tk}r zt#j6mXqnj=qW-}UC8aoDcEZR+x;)UC1Lo!e0YvzUQRBlyt=@_0cT~b){V4)*Y}|f5 z0ifp~t&rIS@|H9KwLTWMvkbRWiZa_f2E_`osBE^#9;yF*qMvb_MCp)K)P$alJr8e` zVQ}CB0Z?&=9@njz@RbSLR$puS%!yFVEH5uFD~mvFYf1%7nd;8??ZAc)=4NJj#l_j= zqQ9PiQ)lJ0Hva05y3?JAUN+*>|tSw-CdhRzIa?8! zHmXA^*DwPdm-;rAmoFDhxc<+g4~gU)9XU53$a7HL)zq~Q9L}_$)IVN@|OLG*`e8!SiI=Z3=y-Yd$MyM;r7!Ep`3m!~Hn#0`~?5rA0A)Ox~0} z5R#gPFBg>|Kzs}w-aDr?a?r0yHjSqq`N3j)x^rWeW#*VP-(2_9r@7O3ZjFj+h~}p} zX3tL?V+NfJXxuXp>$@^^S&0?UP_!YJi5TAdyleE;V&~WK{9{?))7?9B+pMZXHN(Th z0K-q98GBqw?gWm_zvq=40b)=}Hoc&rzzhrO4t#BACKT(Hg}HgeZHlyhDT{)e^{!j2 zOiaKtI4MF`ZrRac(5+pKY!dE_E$^M*A;HB22u=;99nutmf(%ihCF^1Ge62?&xs zR`XR2*_ux|Ox3!lo}YHxErM#y-IuUQW+tZPSSkV9pFLReBRCJdy*uL8bnVNMH|0s# z`h>;3rb!gPbfi$}+tBOCzVBWHsLLxK&6vViZjY;tT{+2fz3gkphr2YGo&Ei;{3$A~ zKAW{mIr0e{Zc8gexrc{`_|r$<(!~c;(_Kybl0hAe!+L^iWeJQs5Hdf*C6*MF5_a4E z`6Uo18z}YXTrvK8ZE4nv{$5E^bRP8|*h$66|XB!y-QcDB;)}#F@ZnJB# zLHG9W8k9Ji7Tf(`#M`)bu~U2_!>}M3qTw58#b^)e*dQisOjKPO$g=rcYV{{coThzm zuHUh+wA5oAJ=tpBa^hFwTO=?)S;O`RfMU4t@p9X{ zJJ}nca2OEoHLB+-Lzb(MRBb+#^DUM}Dhw2OgkF9Pi>bDqthP2Iv8QkcRyZhW4)aH! znR13JeX|_=F27Js)X`XCQAY1T@BArdi`JLNH9Ct?d@K?vYg=vkG(xQF#&oq z=0H<#a?(67!qNCfrx<<4qhDaBa1 z?M&0Rwz|dcIH}W6O+DwB%Cpnmei4TSX>_USX5Wj2&Zz8Apy?E2zjwY;rnyX*4|ar- z@i-`Qo7IR-|8z)&KeSGL3&tB7^|$stR-%x4QFP@}FX*)4CoA{)(D+YqvE8pnBIpBJ zKAHAYB%&KrwDnwjHzr0{xw^WVZrhv4E$6ZJE6Fx&%)Kv}4-4-eNyAbo&oqNIAoTom z?Ds-VIh~GhN|C+m_&U{A*ERSBDU{HqY%DFKs=bbf(!zMxU&ZM?cG{fw>lwBGcn>2` z&}1Q7$K2e!t@H|nLkPXk__J}N=-}v*8AmEcKh6?{(LRU$VegmIt025Z2#3pDXGS_O zBVPwd@U^DW^M2>H)tkif>m|Re_8GL?8YKaK-DqI%rY*=rRUrJB$3&y$DzH zTzTwV-HN@rp`k@e`9Nd2cgvfbk4Zzti7hcuzB%290MT^(y;RmVCN?`)Jc{8N3~gm z7n{ghQAH4i%fpyBa)$QCjszz_~B51+|?^`FZzxeW#`_V`Hbg^kW+6I;E9Lr6jZkyX{ zTiH+^?8e4MP^S~8e0v?5a@#KGk3XK5b^;;NG39TFv@&MgbXfz#3>o7~b(q|os{aa{m9^Jue(rr2{RX$PN^ju3D1Cmv zK$r44*?`e2CNo$!08h;4eGO>bJC!eF8WtXbg7_Lg?Dzs3R6e0{ial{8Nh27~p6UQE zjf}bh&90EVmE#XI16pqR$!qc=D!+ASStcnW(!%I3%Do$Ye@e14Cjj6dn1~sc9Syxn z6%PjoBXCGu=7Sjcg6!;`p!xUwA(8nBZJaKL(~?`4btHhR=JP*l9cR1`r~E@fs~-Tj z!2^xLXS7}m0-H57TvKcrvcG}X+L(leJH9toRl|1A{0;z>u5Qoh6Hy>M*=x^lS>KxP z#uK$MmLuE35&34^^}v47_x-MdQ4fi|MglyE%C^DA-)+&pJiBJ^;D8i22sDBd(UBtE z2>sAwnlwnh@aB$UJn)-`%@=3K#~v%e-?D1s41D-fhq)|jt${98nD)n3_b2o1<|Nr1 zcPja)s;E5jIdwDdUIdT*-kyCE?zQ|a{VER88$@sjTa(+)Ts!QCLwAEa$hHt5B=hD< z({TflGXb3a>60Buf1KC>gFoFy&w*kY-`9!MKV-WVwfkjJuod@c;K5)A<;=}#L~&^Z zOM7-v(Fbl;QGoku2jFno>J^9DEc}J^q^+^CmrK1#FxRbVUbUgT#mAjklwR8#w!WTS z(To^4x0d&hgDHJ@&$C=>Xymfyk>L?TDpk-Oag|ti8?>SA6(i&=WT|b{SHm(~{ehz< zyv-gc2vD2qvhz>(vX@nEj%W5{*&^ph*X`Yi#|Pobiu3^asK1MM%!!C-w{o0m@&*C} z&QE&Qz#i~`XWH%M+DP$M0c-rWX!Ui48GA`BxQ=gWo;KB9 z+U<%x#2rHqUvUeMWB@lo3>d0H>Oj}^crl8bYZFmztV=5J?)YrExM!N0Lo6t;JOrnj zyfVl^5|#r!e4fc$w~cso6a_%H>d>bu%hB?VtH9koH%H4|`}R0#V^EH*5tv4H+GweP zfrdu*=$dJ7qVr;m=E1>1hjj7(dxYW^_CFAc`Yk2lAWSJ38t8U0EWDCjmb(GawkoYr zU$&$qoeDf4Xp`5T81XBak?sR=l_vJ6?9O?G!`UW5O2gTnTAP%BjKX4RrQDGz0OM!a z#<^FD^8ALJm;J3)%Dz&NIiA|OBX)OF6itUy(mXe7Tl%lZ%BKkn&ADF*#v_kBz-<(8 z{M8c~83{tWj0h;U0RLrF!!9X^XbHd~X4M4|jNf?`sBNF%uDrYd0HfMt+vy&OlEnd* zFW*oQ1(}7~*yJd^Mk+#nM1;)YjPJ$%s6n&EcP0R#eZRh|hw|9Jw)^4!!)3I~ZqO1I zk=RxEZQJ=KQs2=r6m6+(LCm~ECl8erjqBb&KiL9>Sv5sIiF4Zim0aJw0jXO8X^wq- zQS?ep%NZf}@T7cwFEYc0`R(VPntQ%{IscPp#(7k4umc>ydZLoCauFUua|j>`u!rmo z;0MV_0p!xJwo0g!m@xfV=XyBhDyL)8pV})PSS45|!CixdCm3SPxW{Kc#}A}q-txtf z-h}`S>Cl50p36qVOjZ_QHchf?`T1YxX8}wH%K8d3d0K25U?g%psWvRcHkKMxd^)X7fx04t#6b1<&_4?1B%p_8Tg za1r5+%AqU(PHYzVN7t8$#PgErIphLNsVh4qOik&@Z)eH2CBF>Cg_z&Pjnb(aIlX#R zeDxw{UrgWKoeyN09dG5soWgTTN<(=jDN zC)<%bCDFyniGYw0^rMhQlz^6dcGq2eh9jvL!RAi%ki>oo%)Y!8(-#*HsC+e2q$Q5O zw&NzY7}KIu6|xJ5O}QlPeZ8Y3xDz?QvXAINB-zxxThpz`Br_=PWnHNoS#bi>g45Uj zy*I0{fzR5+(S(A+nNM?z;oG_%^2;#5ixb#T>a$-6ww9HX`r&Ryy#)YcY_+ak%T;lF z&+VTr$`P*?yJ9kh9F{+|GP1EPA(`G`L_FS3N(^Q)e%-S%hDdiC#)F|51`!?UANrY7 z!%o1FgU-kvEmC=nF#5!(x8_0?Pdchb^#$ho#Btn1h*%=4lbuJv+3LYKf^z<=v*Z0t zp}&|zh-Pjg1Q}tG`79c6mw#-1_L7&t(3|+Opod-av%{{FG^7d&o}Qk&ySqpH*N_bD zL^Dl?g5v9<0piCc-dOm*;0>oyB;JtpT#%x0e|kI*kUu8dTeLRT*-$1OZAaL1m#F8y zY#^*Nu(ImcyRe+yL@HI`rBcnaE+`~2P}C^gTe)tFyM8m)9dRJXI&5RX^y>U^QfSzf zay9g44xd+87XAxs_;yxU>$LUl5FkKzP{^c*#C%>&Nrpm@U{Sg-1Wz;#5H1-`=`s9;RhR& zU!B9EjY0Z6*M?FA6BaHGh%pcM*^$w#HY2uaP_v?dOHsUQ*w|$H!0_}cN9y}pDqc|5M+mwgaxAh9!{Fi`bKIY;ASgY5I!8R^ygk5K;XY%+^3tbJQOL zOZB(rJz=lkAXORz{U)ShO#D1KIZ5+9cVGE=Yxl(OO$8`6?J%>jfG#0ew}J?GW^h7P zc!*)yb5K)X7D0MrjVsB48kT4`Oyt1S$l4a62F{yvHKSO4-J>)x9Y%l%1C!~s<5njB zV+}GSjskFD6&t_>P`NSx_-{mj?asmIJGkNmD$IM#|Jt4G=Cv#GbZVZS0x4L?kQ?jA zxPX=bj|KCve5UWO&r58?AkbfIi7=0DDGqc_Dv3yVRYr+T)62!NzOufHT*~F|LC6d% z#(PXSg;48cAVW9E(JzkIN)4(k2sN+4V}a+rLx1gS%2#XGV%+}jipffSIB0Ny855AH zJ24>_lSIa=MQK_06L?+ZJWrt;Oyko1ImS$z|#x+ zDzZ}nD(9d&!Oi+vL+Nt?&SlOd4~8PXUqEM=QVOTU^w~*37fzK`!WBLL_M=@!0??M? zjPfN7l?1mS#<7r_vHsl*ByUUIwt4~v^?`y(z0be|hQWWmlnIKMSy^v@78R!YegBge zCIHXumUud{!A;7t0IY1qi64}#{`)mQZdQ;!Yy2(q=)q5ZLB*z-!-GdpCl209;G>3(9IQCSsU&Qs@! zvX|`*j&0LnHDOTCz=oV0Iv~A&n4I7XfGlWo9Q-)}uZ7)o?_BTxmuBwMuii;dN15z@ z9=XZ6)oQ{~T?QaUq$XSn_QPV@)vH%QOOz82x{}X-x&3ZCZleR^*MgD~FmAL*`QHr7 zeKT|eJScSeAkcFLXIEFUP|4IsxFA;lQeyy(PLqch!z)hurE&lB(S+V#2L~?v_`rW9 zD5Zl*pF}he6QL`Ms+T1X`oM;PPm>!a6$z;rV6~hGq>wnZb#yLSMm5wOdU-}AY?Ic0Z#n0Nd1%z7ip&mcqV&yITGAD*lQNv zU6RA;C7h;T3aX3A27dBvU(rEjmLzDf&!j>_Q`2#}g;uEtG|h3-6Iw`#Aqn~=n4n(8 zj+-6#b)NCz!-c!8KO^Z)kOMQQZenM5cT~BuBCBXloF~#9;EJ!jDtit%$hY#(b6}Fe z+RW@{54y1j-(A3{&+O5Xin*ZG`qmWpp98ke+QrM$fqNDSR{AZ}*z`^+bx<=gmpr#bR5?mv$uCMJR-ZeI@+M3E*B8o%ZMxGoU@p3h$Lyb@LL zoZfJ8tOHl$P)EE=^(qw<0l=`$Y%-F#dzZu!U0QCk<ybTygpzYf_BqkyP$dc-i)g3gdehO#H zr*pG{(QjV+_se_)h?>>wyz^*7#lYg*K;8l^j1vTnK)W>6oUX1efUNowRXy+m1xq~8 z``kV|SpvI%0%lr4=kb`0o&etXmjq>SJx#yVG?e@5{yl7W5ImB1{8mPQYP|-h13-m0 zNmNlEdAg7JC(+umzT8Q@;7>Bg)hRE=g$Phu>%hp-0iDu!cD1@d>A>Vl#r1^+6#pkw zw6!M&2GUP?$?<|ajg3NaUQKzu92xLpE!z>cU#ptSH~8>rY2@*Xlh}9>rHA>qm8RK* zClV4jBl+E$YYJbP1gs#5et_sn^As^i1;3p=fR-b$LQ0#OvedW=yFF&nmeoYZbK zD~QhLh13H-7tmV<^C`@N@b(bmxVSjSast=g&}YIr&h@%ak~m~eM|NpomN*}kD+baQ;7SAV+obGMq=qD9deQWy;0I!(65aO*uO z5}P*gVN)tf;!`gO2V=Tmsv8)yR00>sg21&SFg-a&jiB$|5-xv; zDAuIFzi4c1mNC9$1o%$%z3UUmv4 z!8D{$^9{;_#RG<|FiQI7s$ZK=UBG>goVdwLg?E#Arza!x&ZyZD%?@S3kzjPG_*r4Q zkxJh#f{0DOhtyK*Ruz;OMHy_dWgG3}v4r~}DEh;E4jTWxSj}%Q;S|NMq{M!bC`w6rakdOpSk;!G%yGV;iW@bc|+;W47csfvE+ zOo2{3ybp{W?>PtM# zv~0&;aFr9LtUc>sUfAH#P5s?xT#E|LC_{Z_Yis-DiT~)@Vl-pkf1gwNGHEX=i{;EW zUl&XDEsT$)tZn7Qe`ik*C%dSm+qq;HFG}uQ4=cuh{P@vxq^eoXwT-lr6?w+;_Qw%^v5`Y+JiC7C^TTEG z44ZV_Vlqz2R9~Jwc;*D^@S2y09{?BHLG))#ne$>4(RqJ-y!mC@(bw}lSd8LQRj#5O zTsrx1YGO&99_~_)TITweHlyMI`DCtP!KcX}1zo8s&K0x-eML-^%4J+Dwg)rA{ED$m z<=N?_&LSeQGbn)r48oB1b$(!NzsNo!D&JhNR5R^n^YJ^kmC?EFlIRV24}j95fOYz> z>wX7!2xP-Pm6er&@eR%xnHx85fRN$SEOKPEQmXWBg}%#xA9^lF9gZ5{_=sI(pWbCP zD#?cDKCiqiqK*>EhUmk$?*dWhFeag&aVx{W69oC(#rB1DG zZ`k`<(@v3wWvX`SUF1L>L*md1z;zlXIKUo36A&3E{nsxWLR}wUw;|+A_#e7P(&3@b4iMUn%W&p-8}Brbf^@_+3(^5yEG0( zeW^foBqMKW5ey`hg88C~D0fhX6Yq8}tH|~hWRBZbBw?x+1U1)v8CPS|Z1*wC`rFg89&NZjo?t>tNj z16%`g?8Wbk#Vk3Eka|In#4Zvg{H#avJJR$tNjN{(zOSN^7 zM*Oz5{x5rmTNWJv=0J|QWD0-*E>UTadN$+rW*9eVpX72I&0Tr)vJQ;mf3*fTVNvrk z%0-6k&(+n3r>7OwAYhzH@I7*z$;-hh6bDQRm5Ns|B($?O>E7QG0WW?T|Jq2W5DiQ7 z4m#Zp5Xt(x#!ZmMAcwOeknc)^;se;Sq$RK+owniSVSrgojjw>~0^8C#a#S5T_5guo z16&SJv~f_cNywQ@IzT@vYW%vaqi@q}vb>}3eBz1*Rclt4&o1>suiV+ZN&UET;(JXd zsOv#NWLDN~mfAC3Z2F}Cy({dg`=SDL>u!=JT;v3%3hyRGp?8wRqitnkDvzoNg8?|cUDv?_F|t;cl+B}KPeJV_I-m7Wwkz8V3*2ANox3B2 zOy79AH9`dR6Di-R{^z?+_8PDPr!c|(=K1@20=d^x!p+*=toLLt}RQDR_QCwU4BNTvY{QZAjK}ZBc}!>@WqitLS&&T>dV(BPw~bH z5W}7*nnicPjMWWH418y_a#|zR)GxX7fw-yBx!d5>0rZR6FZrkG!RI!5BPFfP-vYN6 zD3E5F|>=3imJ?dmYbdfKvdbd*pv?U6m{^-W5?W_hT`L8En`rxAiK*wO9erZR&OcU|A(z@=?*`5&#ikYfXQc_?*5QrhN z7ld6EIN7xTIrMK~tE(2@g>)gA*>zVZsv&5Buq#kC^WYzk-GG^BY7+NGx&v#L3^o5zV=sFWbn-3r&J*(r z0q;u-^-J)^g=oP%4>v&_J^ZV<+JCQw94D`O{;*Qq2Dm}GD8`Ir6%7rEZex95eX>bm z#J69nrgG%Ebi_x0brOUqql3>u{P-a+0O=$v^I33w7kcmpz!6G$!_De24Zar>{EQ1U;gKI(N$w%DQB6e$+TRAWvL~43FG*j# zp+L#i@0R%N#m$81l-yeCC3^WasN!Rc$a@X;f@ao+$@oXJl&s8z!7f>bOVPxL#AddR zl$+4gw+44Z4B4NuSPXyv zJ|LXH^CL^}mEu>Ncffu-m9#(bGls9YL7>iqybq_Y2nYz6V^h%v6;c-0=_&f;$ltzj zjsPAP!9(BZxnh6R>7?PPAb)QH2? zJBXRz`nfe*Biqeo$IP-17py%*b!}sk)}~kx!|lb^bJez|Yx84bNJ2AVuu)LTFMGUH zRauG4lk#51eVoHdHPr}k>S;=J?m|^~refDiehP@O9sntzh_eC7>ayF<9QCEI+nDW2 zETMWvy~WlXM?V7kN&4=mV;zTSgr=!X7Y0hFTstX4>hN7Ff?!t(o73^bFGu<_bk2e_ zTVMDb*iF-(P~(3#1Hq$yN>N||`L&p|G|Ksw3owaRsru^%a`P2844NSA96*XZiUtO1 zmI%q06szc2%7XiuV}T8Ifrxs8vvByvp_k_Lx$P2NlOr8*z1#fZY_#pX_bS7}RP$53 zUur|ZKfcug4K^8>>q_*U?f_hY%)8aQ>RHC<+L@2YjTm>}3>m$EJ^XR7?=CeKUI&H^ zVq=LW(4^BJ;JEvf-}fy)-K6QhKjX2uV|V-eNzzl7K0E5Iex)}U%U;stfen;XR9KEX zN5H4H(N_lLBSeB}^bX@QIll;A+~3Daq}|0->QXxg{?uQ_y(=w@n1lU~3Z$f@0DqK4 z3scH~!j@pO$D`dFD%0d5iawUTQ}5Q3XOT5wN^iSwS86BnPQ|8YQi+1@I+3HI-aW%~P zZFOVeeRr7`rnHzZ2!{|7qXomG?W!cZkxaGrU91G0VTyV^X%Azk9tclM06mmWR?G#H zxhoH}o5yL+LX+u`EdeyqZs1mrQm~;NKZM_jP0t^`QKL#@?y3*uT!fJp+!^QN3~V@F zTbS>UXVpJ;)~2h;rul_mA2>xvrw9$m*9Kqz5(U?IKAUlsAjjdq9rsdT!}D&tF`6c@ z01VRhZstCQmXZL-0IP*=m-IGPQFqnTD@M$CYzG5@`-@G_SuOXp7(6=sT{VSzhaw10f zcm;SFw|-Dj-yw)eIiDZ53#s}c3r^4e!^YLe#|M1&N1>%RRZ>|@QbJE&4FuQ6plBEy z8_PkC54V}P`+u8X@)ZX*7z}p@pAB>E9B&OLrcg{1p1WAjy8^o-kp%ai!1b>Uh%6y? zXI@^2Ig=se+edJDEuiHy0AV9TeI$W`D^+t?ho1 z8x}0v@cIQGfJtB5)1kyRS4A~y+jGIAcs2TvL;m)3@`%#bdV;u=%}Ih<{^H>e1`i_x z7~`2Pn2~OS0JLmELQuY08XE^khys5Dy8l7e<4D(N-g|DuvR$oN*-1}cmW|>x{rABr z=oo!EufMk)i$zGj-Le4&qIb5#pH7LXxTG`iglw@!lO0Lp1565sf+ zC~n5-lK6yD($n+heA%W9E{Q%4e)fn@3Ct-g6?yLA@dYHtvUPljSem&ZgvfJIbf;F5 zT{6-+bZmc>8&Z0UKJ5X|D1s8sd@-%XEHc4nywU%>ib#|TSR(k?TP21Vm^XTqiQRaP z@U-vdo@*F4S|8hH@mdUz)*-e$_xY_^6zT6r8yC~1#Qn^KdJA^p{jjg)k#Cu_*QZeM zQMfEU(B2~r1xY-q$_yUt5u<_Mkz>#fJ4&DB9|4X3#K){9Lo zquuwzOBV~}qO8knYv86BC|2Z%UJGn^XrdmlTfi9A=BxKW;CW8 zf&yDjI;}4>eI?QZ8x-*0t`$4j>}?Y53@DaWDf~DH{Xgw}X*iW__xGg;5u!pFb_0^6 zB2(Ce$}AMgkkVkDGHi1sQL#%>$($);5j$gwY)$5I8`^9UA)Cy$|GMZNkLQ0J&zJYZ z`yQ`P_uaLxb6V$G=Q`I~zu)Ej#i$sM4lAz55n|BF%r-+;Ee$GWvl57rPPdmCT2GBV zO*?JZ`s-^9+zXAdf_4uo4^t`2)b0F}g;43HoC0b+iqX7g>UJiz(Nv z>fF)kUx&yUM2s5Qc?Gb(@o;o)=kEbmw#Fz#)MK9yOBpPj04J&5B{J0B{)jz(%Gw^m)i8bRJ0*|UbJ z?xNE_-=%>9PZ4!Uqd@`?F0fJzyWn{FlCo;6dC*ksvZ;uf}9c2$1eDh)G1n4z)bn6_Agsb z6Mg|{t8DWv7}-&S{308n@U6S|tr#U$~;t>Dohn)B#d?(4rM4>4E}$E{UyY%lm! z_?^zBE`;1Z=i)j^G~%IMENV02Kk#+8;;tfhtnunn_fw*(?;774#BxOT?HvjW>1FmmL{7pWLch6onbzjVPe<7)t zijN7}#wPyxw|UC`jH3_iZf z5nH9>9{JSJ>&=SS8N!+H+U+&(u$(KE<)!So&vmEh{gs(_(yJF9Jbx!+b63@5j@5SF z_Qw^`l9+Q=kM(_^TH!j{}qoK7<$WAG#y26LTQ> zAw!PICVS17V(Lj7RE8CcorK@hzb$`V_gQh)S1J1C{XWH6FPv+=Tf)?5zj?t(5v8=0 zMPoV^D$>-{)g^EB_6C%%>WLz*!%}L@7*3!ngz#3m$^9+N)R&V?`-pDAbW~HQLvwJ* zkw++PHn%vH_jEhI+r+Lkmne_lrD7p1pfY&D@t`uz*3oh1VJY(3YkM+1ei4$nZ&hsD zbImnX!s&6HUi8toUsoaXStTV4r?|7jqdNKyXjtpOa4Kcb$hg6}3hZuI(_6MSd4<#&f*`@>G z=}DMm=}mS)#~TRoQjh}i6j&1&8kLuO`p)X(W<9K;)mwV^wa4lZ^t<@}&gSZdi$Mwq z#vD#sFzq7<{v$mOe|y`06K7y3$y%={4BV+rFE7-DLpDc(k&fsBP0PhfJ8YM{e5am( z;X+^TA(N{Z1&tU3`9z4pPu*Hi8!IkPH;*XaEFhpgH$u%6_;<@Yc`>uhR7|myl+;t) zx5pMO$~PgMV4P!`%7!TKgHsK-P+RF%e-jG+v+kpVWGHGj+<4f?(6GRF-qjsALFL6+ zgJ4}U*DKS@7jY_&XJlnf73+J4p#7Y3b8~| zlRt6jvW*}d%rJZAKLp-zjvj|7hofr+&?6Yq9wutyinwVZ(Ng8R`RaQzeZFq85zp5i zB{+0KDL;V#u^!Q3_0{JP#sx90H9UL;q#JkW;!XL6($$97TtQe7PI_EJg2!0b5#KrI zD6Vo{;MjeZQC8;LoTl^pRXsiI@-);?wp_OmL1$xRV$#vo^?YqMG(hxPSX$<>P0OnQ z3F?TP)z@qejJ(b{=ETZulNZT_h1Vu}%QaQz7wsjJrnvnyq= zO*5>$n1o@+97Er;%mzLR0>P^`f?rd`lH*_RsRQQ+s;CVo(0M!`x)G!h$aKU(D3G@O zk+ehCGq&l?XnPB0&zX>WHeH%XXM1Sv6>x2YGuu6Jf(gWHRL{(SLpIx@trdd}eDY-be|iFyia`CN#Xo!$UH?|M zV=4m5H=e*wn&|;b9;k{nU|fhmH`A}D`glf;q_iA*yx(srDfeaO<3A`)|_d${ub(lVtWi)x8(Rs6IqtLsA9R+wKi;b|6*^@#K$iZCCZ_Q7lk6qBg#K+{__!BozEB< zWvoZ49slbw7~Uq+roDg8ja4yJGU@Vc-NL%@I6v2tt-(*HdN}A^EB-ZR`2B(SCnx(i zZeU1{=UH;c;jhhERV~E8TwecsE}1pXQ+B}%^Ht-XB>$zQ*7I}uYSPA2b}%2uKj#Bx z9+ReeS+8$uyz4e+XSZBB+AX?N)|RM%8q!g*)E1Po29*Uoi6(y2RXl}f#FIb{n0Gd! zv0I*kyMbWhQ*2DhJztJgJr@Zc8e*93+hVk22F4%+WP|@~BN`>q%$W(cGO)2QHt(AZ zS6(W={IjvVnoB}eFLrbGE!p1z^(sCGQujy$F?NDDkd*IL6{fT!b6HWG1%t3W7C21D z!p)erb!zG8@T^QZDfi&i21OP4F$aUM( zqP>Vp3P7!wEhqu;OW_{k?$}-^z}AQoh67h-*A@zZMeTlcywG~Mf1VPhHv>3Azr~po zf_{bh2RFY1yg4*n(0Fa=$=9BtU~KME-G#Y<+7-?pi{-Fv#;B0mR+p^+H}&n%#rGL& zjfR-}0Zc4zo1ph_5+y3V$iB0`n3pk9amK{lyeESHC>YEax;q~rhvjd8%^VR;z_2I! zG3K?{45LJ2}?lFyHNHC;V+UfiGYns^!Ub|52%IH>Frz->aJB1 zL0rd$l-TTB4prp|Gpx*%*@P*9Khn?ZhT=b1xDT*aTE2F@1P7{yh6Y?3Qe!Mitlr(s zC3&(^mFB(%1I7_jn&TNM5y1Jg^rN7@#Bl}SBR5Os2Ok)QhlhWWAI-MQef=#;Pw6}D z^0Swu1^{up0k#K<_m>C*5iCxv05&z8pY>mwtgXXL$0R0Gf`^B_;STe22W-&{H>ENE&EqePod+I|xX4XTPc-hOu+K zo_&7g5BE+8%)j5^w8wa6qHpERdiFh7WpL15DUuwng5HrY5YGC%@myJ+4HW~T=Fx>T zFaELK^2IxnUzm!sv$LnOBExc3EZYAu_6^NVuegOaB)aL!{9aKZu0nvf0g;iXnUlS} z_BZ~IF%lCce!~D78=HHE!rVh{8(ZKmQEPL~6$>Yr6klyj)?KOnC{d|khF$zoFgwwg zFz%=d*fO9J*vO3qNZ(8is2_O_KwOlgeNdz;!u1sP&q8Z$byZMVgo_2<++P$~#vj{D zXMK(75(j0uIlCIUHWC)3;0=5HR+4ql8AHS7U&)YJ_?ZmAr_9lrf!fHv*KSv8e~so< zDw!onJD5^yhY|vmmRuSVRZ2a^MhZy)EEgHLlRuhPN@{?5sCUs9BNdC99VNYcTs#)5RJsJG!|74Etfl8wT+YpY&;$ zJ@gpH7v0Os-XrUw)*qX2_t0V|3B8kZJz!${G_7Q8fBm;UP9(&h2e ziTmuM^-7EOC8Z91Q&pcH9ZDHpae3xwk1u0dup2nF=8Hcelp@ePmQL@qi$1Q6{_O0uW(-Y~!x)%d>rYY5PDw zY)VQuDFSwptO;chwe{7qk3{0Vc6HAIE{O&@|YG^%rX!tM^iU&Ub zCeV2h^mU@}5;Y_jl^7r}(K!QbnMc9PnLuzRza3w(0Zh(3erH(mkk@ch=u+~!BQdTJ{C z7MEr;?4-6*=+p?US8#>$UvKlf8p?`@pM6OITf-V!35aZxW2wWhk=F4;)Apv`V~s^J zQoQne2-7iDomiF)tV{>6*uDEt?x$V${@Ey&CgdH3DlMh(tf{GYhgIlZK`iazIY+>A z>CWj;HQa!aM$bil>-J0l=Ig&GjiYGvPdie4@I}rNl(*_l>(KDd-vIw?v9SoE<2(@@EUS=5UX5fZ00Nn z@3vZhv9PnFgJC&c;r_wgRF~&~Li& z?OQcgLqo#>f7Oy^1FGGBa2#yHdRw}?`QojfujdepOZyD61k*Lv{knjAg&SbBB!bHT z=pPqbXu1F5Ia57CAWytZ!cqDei*T}>(2b-bF1v`q*MiHqx#;I!8c5N`D2>Fo=C^ZM0 z_9JjH;8&~hJM%c#52A2VUWs#WJJN181&p)T0wfK(r~d6?n6%4al@cSdG}-x|Gi~Rb zUXNB=bK0&R-G2_UFsN)&gn=PAs7ovO{gvRnfEeP$asDV1td&vzkRM!rbBh)%9zV43 zovfk5E*t8)xJ&{nl8rD)a;of^^b1nmef$p4jD06e!Y+L$9u*TIpy=K7OauG{>p4Fw zD>A@5**zo;I;Y_L_N>`ze1m(_4rzPXP$F^H4ElrBLfQNv;>A8c;Ri0s{o*7*P^_+{ zi1~nmih!KrhxOHUaBTX2KGMGbT#>futzRhtA5?n31||B_^xAeLIPCC_Y3J3UbA8o% z#dXj+NZNmC4(h<6+{no$M0$`2@T!gf`g#hW&k2`Ub#YZz62`VQaRi+ z!<66!lmbP0_B|y>=BrD9^T>SxYvDgXNM7i?l28sfVu2qxuq3c2$o*inJ1XXY>X9~91%IRY{U82@I4tUdvtL)C&6rp{cEy))_-aF2vnoOCbmXfyQS|PP*;y|_%8=T<3mBc5@|qD@Y5Y$$r73%94q`5*WhgO^ku_L zKEC1G!O$o$NEb*@T)4805-rl}wwJKDVNI2^bGvo$GVZqhRb=oglqm1b2a4b>5h4bB zNn<4>I1hxT9z=^7&z!GE0nyZ`0|rZsy||$`@(eJ`7?gGB9_vx_veALi#ln>bj7a~? zaDpq|(;)^kkz(9+yzf>0pQ_*(R0efSAU*IZ@H;&3lAvIpFP9Zy!vi9wd&*a6i*=z7 zA%0oN=z}s;y^RK~iAV@@IS2@QHNqtL0?V+wUZ+%haE_n{xvBSGE=4E*+WgY_D4Tfs z6mTc<1I$SmMoU!&Db)+OfQzuT$-lQYK;KC=%RtCryQuZ0>s6ezu8`v*TtpdJc{mPK z&=yAFUn&~hDa3m~4B^Ksoo)~T1cVp}`6=9W?;3`Yj=@n%?tgqGeja#;UP-{g0tLgNqi{ZqPR38X9*U|g%lFn;K z|6rB$c%lCrg81}UabK_3z+Kf)HiyW1O-;>sNGUiv9uN0n3t5yKCk%AWni&~MfwrW_ zd+)<#Vj?XP9)hImidK(5Kyy~(D7C7Xs^_wc&0>XWG5Wl*D+NA4#_D?%YaXZ zYVA8;s*6G}cproki_wiQ2*wxg|0ogC$SoVuXpEDyiavHlWb|%*k)nhXF3u)Q8wf0o zA;f*=jOHYQDN3=C7L`@T7DAAaH9fWEA4f&J0iLl3WdJsAS%=uL7b0q@5Q4UrpS7OJ ze6eATS z3{E*R-K@-_Y=j2m)7Mx0+MDXMAn4E|6T_G^kJoErD&1%eDmUEda%AqB|@?V)%$2)Rx$hHheo#qFj> zRz2<8Q^9-Cq+& zqxFF&|F*Pf?ElvEfBl1-Zh9a;1SwZ)*tbsE8deiN1y?=$XGQ}4Z&FbN!pdqHAUXt5 z_Wdhyf*>4ye`ZAf|7&P2>5nB*EFYTY9}Ec=@c!f9l9&}MhL)1_D!N6IN>%mHFD>@_ z=2}UoJZji=v{j*Li$6H7QAj|D74Q$Yf0oW<#07XO^0=t!AKW`>3C$77Fd_~+$PvSN1=;e`8}9?f(o^3V zGZ`0)aFt&6N_N_Kc6F{mxwx#GeSa*rg@u|p#D{(&)CH`|t83p4+%cJo#8KfdT8D^P zi({5EKRv5x?m-H}3~cb7(LjQoqodNdM;FnI_LimBT6oVlvJzmgJ_oR{?cjM3!AhH0 z(OlX~4E`jCeyjAPH4bbRjHOp1a{UHeTz{GB2HeVoXBg8&{`IP(TBI|O$Ce94zeegX zGCGRhKAE|MKRuRAPfD_aw52U48dn)}>D?Jzb~|0T=&9x6Ksc<-&`)^d>j`kN;Rq{+ zuY}}^8m7@Vq+pyH19a_YK896Q^uf$zRtFI%cxkSwYh~HsAOXW8w`&f&G9@w!DdMN^ z;QNfo+^L&_9+O!bVPhvEnEd@m^eS$$>SiZ+U+7;HT2aR{Dw5H@5dRiY;^-E#5JZ%g z$9O~iUB&~@6z`u;1t|On-)fBr6BidetBkYQf1WnMcMQee=IWd9hRyQF?+PJ+?YOJ# znX137Lwg=Y%dY%{fc0BcYREHmPr0q`DJV2j5tyz|N=LsGs%#30Wo&3XY9bJu?<)A1 zeyB4jIl8(zkdwDD>8hkimZI=fYLYg~(ZFT1&Pze!CllxCEs8||U$PTY{ zgy11UjCR67hgwV6@d#ux;7<*$T!6n_%3yEdZ!-pRC9oNo(3CO^kRG*upfl_KUwS=o ZgV=~amX{hU}J`!7Bqp_GaU2!bFg9nuXO1*E$qMWjo5Xai6X7zF8%ZjkPfkO8C-q!orP z8A|%BXK=rJzu$BHe&@Q*dH>>duV<}$-SN3|&0AGvSz-bz0vHTNEcfW4It+#v3xi>^ zUBm|eVl^P<2ZOo4mV5Y@rpNf&)Mamt`G((H_$ZYZw?9ae-#2xQYf~sr%P(^Bve>BD z!24RBaNVn-S9x`$rZjc9u$cI5nRV3!vvPk|aNCsNiW#+E-oqRo`4_jhy2>>Y)n2i( z>D0w-b$|GH^*HHisrn$V()NC0V&Bn+m|`a6h^!2myYsQ){{m|p}01Q}=Y5<_%vIv2O~3bjMp2S-O` zZHT1*kYg4-vq>SP+VbG#O%ho(wW}5Nsega|)k*Lsc}Rd;v*nQ@6ImKFUizOKa_5(p zmNqmbxi#nL7HZcjk^Q+4-K&?MP5%1pFF!vCr59>j2j1#^5r>zR?*Dx^Bwf{n9e121 z{+-nF^78ELAUDdtxnicOudlD9M7-{QXZYK}@5L6H%WqEv!xU32Fx&+KeUm&1GEu3wr{cQaUpp~W^r-&2Wl80J9eCs7;(j(kWC5zJ6qT%Sz_o^;YdKb3z+(lR zTV7730c5vmXoPoY=TzFNZra>jKPO#Qzl7&v3+JoL8S;zI>_Z=XEtBt8?qUq>T(21w0CVgZf$LCseTx4 z`t94dipom!Pkc*PV9iq`AI|^-wKB-#ir)JV^Ge4R@%{JlW`|xObbLx`SxqNO@g%Ux zb=V;=c2!wxdK#8=)=SVgpG~;ZvHtrjL}tGqFD(}Z4B{GwMw(n)J%SV2IV@*D(LcBQ zzgkF*8`Me1URrCLA!>4|@Ubf9a^5!kOB|pjI_aP1Kf$pfT8yvEt*ucC3E$ybM+EQm~_i~*pD=MCM!C?K5{(BKJ zXjaZ_=TbvT#q<$VUC+JEK5=uS=N_gdkMg2==Cp` zO7Fs8b=(E)^qpht}pVM!iScIQE$cVAI4wesjlbjRA6ya}s2?pDpsgu=fsGXgC zYEwzBqy<(NhISN6cy$OcqaxxLoSR*=fv{!Y;+QGGU^!>gNt*PVy`CjcL%;7@zM~1N z4fo2__355WCE1KRyEK?@js=}@eEEN#5y^rQ+lu_YTgOl*y@Y$PJ5YqYd}}jWAS{na zz>!I=mc-R->Qm6+=Us>e+Y%ObtgIZF+j{57swhjpnWMjR<}|yJ zuQKh__+)N5Tf%kEN~F=vX@-+P{5!`>k@g@lr}Z`D#zO^%3qg6w{OpE7!PlV6Yq0+} zubgTOIF^+K>?f-Q=j+SK&|$UGn`x2!N$|rjL+QqK4zZ_I99w6VodIPJ2^@ulhWDG4 z>BEP4&o2Cz=xSO5>OcMLg6C48TXsuR+e=@JhQ%+R)oJ}UoPD*97SNv~`{Cr8Gf@PI zG5!o|NDm9(%3V?fI~MGt!7D;|>xXT1PSnY66C=r2PiMoD=A)hQruxS9!lDjC9p7gk zt@pZou3Z+K&l^jnK@(N~q;-nPf54s_aVE`A0ME#R)BKmlbn%rV1j-X*Od&?C6^RQO zPbK@%u2jpsYSytyQ}yqF{8nuLXjLnL65zA zvIFW9nErPKU>bD{sQ)})KTHT$NwK*&+P-JEymThpP_S8;>^?oY6+d*c_ju&&fs-MrXkt+lT)HBqzHw$PT?Kk{t z^5HyvHe+97v@rJbWT>*r_~fLyj#IcT#g|dVkI**qmV>|!Yl)DkW~K3#qlWHNey59m@)8;9NRgFj z#x|j|`}^xjG}JzuYa3qr$-9-Cp&M1kej61Q!YvMV@jl~4vhDdQZ%z{0XHu@++ItxD z)yXR-p*Zb7LZu5BIFO!i9HcZFKg-OJH&ehNg2~TqAGin`dU<()7>O^+ytG!rsO1ziyZ+44sa$;^<9gGi+ zCs*`~NTh)RY7$~@7%&hAAwcO}Y&`#ZlZwX^6BAbW&!`NLAh2`Wm}E{WU2+i3&_)u9 zin(nI1-{_SC-JcpUM;uK?`Zg?ur)3Wr<(e_7*yCezoH76T?Gbt)G3pgQEEsA{o5um zRf(Y1CndVEA=$b=rKX#yD%RK6g_AhGq${X<$xH`{&Gt3LE+taeSywKn5b67=_BT8} z?t3~L8bNCdG<56T-xlXjCSw7i8#4MLB}|ipk|>N?AZ&4#S7?TOs8EY~S&cAR z{>b}yYkCMUGPs1pxutczsuFcy8?zHzv!fc$)=K;WcAN@tYu(1&=l-7%Gk`Eas<5yy zARu6i{F(v~!+6&5Xw~1RL!L{-O4UcVYV$SLS(w)rAe&}dVphgL~oH^*D zxJzyZHO!j=0fi(%y0iM2 zy6%8x1vz?p+{2*D13#B^j1=pFe|!aqScixENeD)VhIl*-L&^b!XqEL7qEXfRDIZew z_ZRREro?R8Lr4xn^8IvKISE+0e72+-KKDenins8NnAE49H(!O3thpk07bsc_ot6|z}(w}#qnZ6^sI**Rqc`#$X zwV@4nnoOl}dd{BsgoF&8fpT|2yc{rjV>wAhlrB9mAm729CW{Uq`V&{8{-B9qs1sK15 zo?~`BEFk0T#+Fgc@l4aHQBgWjnqv_|W_nTXr3km5ckhX=KBf5467>Fb=66sq95Fz< za`caHHO{#>gp zT!KAOE@N^NI005=@q>BpgVg(jb@vG!e?E}g{30>zh%bjy#ZRHo*A6bcEMvYGk@P-( z!5#9rZ$8`dE4(TmuzaV{t1wzD=0%ZIzWjAaAlY|vHMdN~%USyKOiHBR=ig6Mq;RX( zZUxW4-?Lxkf^jV{9JQ=Qf`E5nVd3RV>}8_BTPZPLIs}56eCZE7+)=J(vBmD94N{7U zbn#7MEis~DYhms=S1*&Ess8LZ*ut?0WDbRVq(9{!r)CAeA_sh8TJW=uJo7VKk45*V zhba*{XyJP2*VqQiB;Sy8uR9^LrreG&R96@NJ<)GeTvb_FSx~_Cc6g`i?5=Mq6Z)~Q z&HIq-siueD?Q%H^qi6p*J)JD^d$TisdU1@oRZ|?JrIdIS=s?!ROe5s#*?ijzJ%=LJ zg{Jl6Z^oy?4GxQ6dKQzYr@wDcUE6o<3g0BQjkIVc_9d4aW@QYjogY^rgbPHlMEqfb zLdLstkS16^H8wUT&9#yenh1&acz&HrF_#HKiZ-r)yU4~v)C9K~h z^<)XrVbbYSm-cr$DOZk!=NEtbelqlZx#{S<#yPaW-~~vq=_^k|AEgU%R!2>*VGbu>s_te2XrPdlZ(<$^66fcg|wr^T5;RLit0=wcj=&BBIkC2x=0jaaSs1s|ij?HH6YLRoFm;gGY&WsQ)JB5zXPg;Dq(6~O)xYeA! zTk0+UoCI3kVAHkJ`0a^@`#a87==k>`akH`lZGvRyE)5o_ znxO-S9~|zkE>oMt4uaeyTGIZvw|J8B==8L>3%e%MUtfVY_5J-b!J!d8S^d1j{71Gn z(yJzw$$-kssaImXrs-f^!X;q!nIR#|?TH?q}FseV(njsTO<=sQ-0sE7=<@_v-VN6QWxF}RQ zfqgk%>Ra3f6$_H&H;l||Y>Fp0;6ZM0s%|A$!|m7d#v%z_inL4@skXZ27$m-PFb2*3 zYiB_lgMNW#uFMMm8nzdc2H!*}RDQ0ktgN|#Kx1WX?WXWm6?FrH#KXLbAot)V3C2AK zsxq6-;lh}tdaE${W1L#X9-c~$IMn02l@hllf;V<&f}2FefJ+5ot~+_DH9O>>U{A%l zZTgbM)P+~}k02@B{-FYDD?|?{!$wyN3kq)9{~RA290a=dbF&0k$nowznyp4B1(71` z-g@0szwQ|Dr_b{!rK8PewM|5&>xjtv#@>XM=|U%ZHNcp5|HJp32kW}mHdS|ZWNzJg z`@pB_@#!L4oz?Jq^WA1HX&{^{!8ma}=0UB00R<$(k|j|Nf>8!u(QtNl9v-#A&(Fzu zRDz%Yiu@$}x8DTn8{?j9m-FPEv+Y;|5wB$(w7X6w`=%(f#308fCGT=pH1Ws^r>yCc zkuCUbm?Nl?4w<>pVW{~V?p3!@>SNnz_>{~s1KFu;QvJa1(vfO zHn{f4bc0uZUY;pA8q@+n%ueIl9k~WlpAZ|rlLo;bQ8PZyuj)S)?9BKip+`+J*9Yrv z?cMYunUbV;=!l;)AC#t%Kb)Dn$+Ga5j91Q=RTRVImJ$J+NCQNQ?+zX{nQ-YE7_7O~ zowNEWe)a4~wFU#~GX;W+g4&#$1hx4@O7(rYr-H=Lb+>H8>tBk@vk&eu z)TQf0{&tFEif2)Yr+(}YT=-5?2jtdnY^nPBDT_9!+xl>E7lL}|pF;=jH>Vq9((g0= zQC<{KUaUa+cg^c=35r>&Oyw4Rv}I#AIZ&X)cY9gNNOxd(sU>dby?4C`nt);|kmKUf z4#EBBFD*~^KKUv9J`*k#nNF1veU$j1q2_0G=UWJQ&s~w5mX?;Co!t&GsIDBIUvCQp z6T(ToFC>bLn;NUDzyEZ+qlP?M_j{Yd7F-`aBdi!;lksX2a#880`9mIvCJFa7WBP_l z2`T#UC&B(${`YS!508!M85t$#^KmQzYfyIrm;`IRGFvjS{^7$1HR@NNKlUvuq#|_FiNTWn#RT{pG}rFH?tjJ8CfNl z|5%5ELvfTeE;iO7-rxM70sQEW;lwO!rA;Kk;v%BY0v_^j!-7QyZB$9T>|R@dwZ2b+NCfCh*`%#Nd(GrcMG0FMj7=U@(REv+3UXqbj(5Ka?Y%= zCuL(~rC)G;E)Z$Rlf-tDnovr;W6R6UeG6@lxu{vt=<2uCT^}DGNKh`X|6Fxp%OiuW zYjb}H033t?vEgeuMMafkwwP6@KdZF0w7yMGEB`}Q>#|F{ViqXt&cGfi$%+foV4G03 z`1khqqS5G^MPxG2%25&^4(s43I8~@jOt&<&@|rMarIaogB^x_?&$|2*2(6#5!(b0` zvOpzTQ%8rj(gC&df(Mqn{OQ~#FP4qj3iYKyN-zt`lYy%1pqdJlYju}}ryd*!IHr7! zGK=gw*8~1$E}S?iZGv=&F*f)>Y8C0AZdy{JR`QeGuvWA4=Zh!u30OR47l+AA)= zh*GK49zV|e%Ey6+gZ-kVr3JVjWpc`_sB7nB;679P=W67jTCSz7%_5=9j08pGUW)&$ z%W&=K>FMeOxBJNI1hK(#dUbV`hbojdT=pPU_$En6dkgc0)+i@zb0i*RAaBp+{;G@c zycyWM|9XuZ%%7fj6L>Wc1Lob;kM?{+_KBq{40v!U4B3b*;Az3dqZ+ZG0tisM^t!qU z6D}NVtO}g9Ee~rO8$tpCrbWP&OXpk}2OnsutIt9%2$Y?nAeT@oRn^KWH!2{H1MMiJ zvcj%@92y#$l#~?QmG+q{Gs*u(DZrKW_oWEe)scb!u#?TWanhDQU*J@dt{+qYU6u#Y zXeX>);Qfg-;O9)rPy;#c_3PJDRp0!Fz-Dm4-NOd2{XsJ1y_7zSipT8a3dY8_S~Y2L zz9NXZh^%-+2A5szs}lbHBosm8>guYbq*Q*v3Dh^pu3yhBkCwIeocz4p18YU#eH$GW z;N?A+GvKdV^_2aq&&|&BhzFSXfN5PsE+Z>lT+r}_3FTlsIGHN+3lQcZ9#rD{G-k^y zMXsr-$+W)wwVy8k+c+=->%0~JPET;@9%fcnjkO`8<#Xvtvb=i2Kkx(U5U3O6eTh>= z@`$GtfBZ;y>b31Py;^h`}mObnPLC?lescd`)KqCf__ySwEV$kNX9NJW(f zES}%MaZ;Ivq>?s$eX00X@TK&Ae6PN6H!Tc94Wng*B>h8*} zXMn}uDn*z186lP265C_mE}nE_9EB;v{%g5u36md5&9K1l0CvhON*z%Bf!4nVF1)e6 zJ`r4i3G_J>Rlc256aT|SI8-JbUB-kdZy@)8`BW3YeA)s!C@I*AoCY3*dueU3`901e?nnu>I*m6+iO_a2S0X9 z{GTvw0!!A^*3P^87*i1Bw z;s~ai#F`r5`g^>h4-my&T3KOXWu43IpnHD%$Ge+}v_xD)^Cij2AjUV{9cg;``Qya8 zJ*a-?=O>7`7x{bUoOBO>vhT-{0g)2!$&?h*ea@>fzG{iS!LeLMiD}o2Ij)I}s3H|q zPR+UF3^*v1ut*uPdy$`)Kf_v88wmoW?%ut-I#QUJG=7-8=eP=U~7wy1*eEBxNL@apVj26JdXUD!G^I zvX1MTTU_j5ZJkDga6VUnoiKkaI)ztHN(1Us*xuVXTcrF&&k0w~F3ZSxUHl4?5HkuZ zxKX_9EuM-h@W`J{ejT0g;yU#%Zs%^z-UUVf3SYrnN?RL0wp$MTb;}edeag7}UH}3x zx`tZ*3W*7dw-2J&Gtsy89lSy)H|5LkWZ{vCT{!1xOHV99YQRY+by!Y zC1Qi+lp==*2h|M?l`v`|k&3`afkcO%(?(cWc%e6`JBCVf;V*zA8Cmy@Px{{Y32XGS zbDpGm9MhKg@fa5>eVEx4pd>1Ij*%t+?M6xd(z^ukv9D>Mn>VqZ#r)6b?o(`x(ThFg zsT3YEMxMY^3J3@ckwA2_;e7o;XvUxqf+0SDgBVyqih|As@blH9$8aZ8J)Ij*OG3)b zBjUpztEhx`ni1f=;>CTGcu|lLGSe|+G!yDsP{-WBvWro1OcpE-e~c7SUSTuJpEUrtPLy zc6OOGn0sW*2D26+Jco$|CM7lKj5UUo_N7OvW4YxF4mM}KBPn@g47BJ8?jfm*_34b@ ziNm~Vtl9-8p@fL#tB(8-T$M(E8gn;x_K@D=$6bGToAE}9wj2>Z-SkkA<4x2y5l`EA z-F&D-Eq&>Hf-wW1(j&SnTycutG&p9SIEg*}H@si4JyRe0LTkGW1795ckE9(gLWl&b#8Zx5muOd8s&THa13Z7Z$v5kf#1>FIIyh8h8$H<8 zK$kt@I7t&cA%hEj(r}sWerDQ1Rhr2QqBeUgtJHHwx8?d9crIt|PkR;bYzGokgA8iN z^Q1tptf(H{H9b9@lY~!!HUcZ8L&$rQ#f~x}l}mNmiknV7zs@;KR;vjQFG`#pbVf3! zxKG1Jjr~sYiyNsV-rK)2f+1%W`RlohSH7HZ8 zb+b27sH~vCcD&qbun+XtS#^qTa=d#O=DpOP8bC-P@1T?<>^fZ!w@8L()qh!vVg}0m z^R@NR52`X#?bZ{nqE_l8GD>kNwaXZ&WCU6P%;mqu}Au(Jh~yfw$Kf>>Q0iN|OrmMVMi}H6S<f!h+Szy{Dy&NL+g8oQ>9)sNt3E$&> zMp4_TT0Vp2U!DzeH)|Ri49C%9eZKrFpJEK%#`Q9l2Ykb~0m`-32ofX(0e z+J*9m$kyC~0#u^)l@LQz;_xs?oYvijs3BMpBKiX>bOXzNGRKkiBZ<{JA+uXvZKpln z75rMyo;`b&VuACwswYZKw^MYlb{TuES1@ddmQPk%MtE~dtQM37((VCG_^I9vkmkK0 z`u$yn7FI*Y4K5Q$pq!T+G;^5)>N8YcxKs>Yht91b{?EBJtL8$ZLJpM|8=860gC-y+ z214=9#hOIE)%zCu&KBGf0$>x%l!`uO$wcm=D0BYeGL z6r9QsE_&N8j_XOw55D^!pMw^fWxf<06{}TLwkGsgIjMdA(BWP zqc5D}@wG=T3w@E!Nwr;+A%=;3A+}a78OL&m{decpd2y>Fu9f9c-xwn+`sg!9J@aP# zw2QU)b+_F_l|%TrP=wP&vY6MGcQ+X9yjOCw)7*^eJxa=bz(3sb{r!Yg*7s<=icvX{ z$*vwCv5?P2{YGziBI$IF`VcD$o--TR&5R0t`OVtS!6Ew=#xQ6<-5xgu*XoXDr#^1D zAgMHJf&I3(MPc5+;_z+DX0Ywp>6>F0(Sw-vIna1FQ%G0U(HZUUmlW}*7P_C`5D}sD zlVChUE|S*c$BP$Z&Yw;CO-mk4aMqySr;0GD+eZ!$4?m(_>`gk_sM{p5UEA2;U}KA_ zEH-KoUS^ni-a+$o*;h@gC0zW_^6c~^Q6uAhygHJ)Ff1$#1UZc)*Z^L%rJ92+Lj;Z8 zU}y&YaTjCMi+dXP-m;z6->_?#pxHEn`C~joxjV#bFH<8bLIwGm^9V$IBpE&o|D&n(7(^@btl7%$^iT z=bR=WeB3k#&n?5B<9A0xCL>KD-ffpt>RSm4AP8 zW@c*2=hu(VyrO+{}WK)jp_anZOhEg8S1A<93XWs(yEOI8!~b%vxNQ~8jGladgA@y zcwDKo8}}7BC9tygM>DcIa&vNYOH6SM3C*%`3KF4kd#gxH?%0VopuRw_)&<0P>{Fx} z@@jJn)DhdVioS8s}Y>yGmrZ+wm8>F(;vQcAdYVxX$} z$!WgpXA9*PGKhrcakXP=xzEaQF7W#z+h2L+ab>a<$4Z|OQq)AtRxv&32HmaFbfEd5 zODui~Qpju>8U881vlA#HTlto6MSwcP5Z`vG<@w_C3B&x`a>Y|J)-1(Rt)qWQ0;nY* z5-ba-2R>6Vmg_GnEJKdbqs^vG7hx5ld9s5T(d?Ad0ohy9>)yRWi;Bsj2WcT3VAAyD z#CNuf#axsZah4*Xgv#3*BveR~SV#KeJ=Xiv z@tH9*wFfMP*;&9xf@}`5(;JTFgz#&O$}WO8)ovjfnouPZ>2A^9%L>LIbGb0F*q6d- zSAV#Yk6*bq(t)n8D7{zyR&v(MjbR6rH4mOPu~LA5xCww;wNm zyJ}FDu7C5VQ!%a27&&4jwoz?q&w2E-lg#SU5h8PyFKH#cRLHgNP!oem%RzPVVBgPORydJ7c= zh#5?t;U#Wapoo3CZTY*KP;`YCh;Fqhgk_I*^K?7ZF5fG1?g_I8&b}&R^>OwPT$I+6;lIzW`|W*DXtQV|z(s0RV#<8i0YxD-TUYpD-{TBM`3^0hfxqV4*zM{FEPxYFtOG>Tk8SCndnLJP3;`t9(a{--fs{9x zSP(y;K7=!RlX}$1YaR0cDE7zYkH(!w^el+Q)?Qq|Z^?`%rsjXQhg67WyHxD*dG}q8 z4W}{)ImSo>>hFMxZrM44hErpBdCvfO^aUX`%^EJNKC>Qf$;$@{knC)1s8u?Mp?C2U zUr8koSVsAEIv=e=F%F{2XF};Jy%xx`wOXGt9aA!GZ6HI-fVpaysan^a2ar-V@}DbJHA28D&Ep6E^I@7X%1LIn zZPa>- zPWEK6UIeUCm;nE<^)u*J*dEfM>0}QwS#}U=aK`ZB%^+pHg=JP|j6WhMG`zg(zFE)T zXoaj#)c%k4S$lp_eBPpae^GI(;fySFv{M3^lARS2Bf=XW@8;q{MnQ3O;wwxFxvEYq zi%LNIUE#@R9&8cj3BqpL~Ej13nd?)-wd!$V2*{}Dhua993>aR1T#0@(tLEQ#a;Lad4*1GCQqFso~8_Q12fwHUC8D_h3*!M=y^Z9&J$h5Hr zQpCJH__}#n+__)<&mIn3=gvN#)r0^J>ROpEq^6(t%nk*_gfl0yC0#TDrY-m zJS)r9GID@;P9LC<^9m83(mf4XS^Ok?Nb1p0ya9?-ppP$P5qxP*`s4!|`^lyR>*%KP zK<9*tgtT{gh}1NrLJY?n75?%<=_8PXQHvujzuz$@_ILWginUAAcOQkuF@K4SJ=I6foMb5CK z0}ZdTNI%eStDEW_!-o#z`1>%Bye)P+7>XFz1&Ai} zXoHHS@xMMw2R(;^f_K3A<|q4qqx_SeKc?^Vh(8`#cco%SfuiEFi!dlz{rfY2J`NbS znAYEAo`2AFRowTQ z5FU9i7~lSy>{LYP=cE>Hm1*D3fJ-!Y&YajleTbLpK>Y&nN^vTwU`8Rn;Z7B{f%N`ia-1Is%_Xz4_x{`f$J()xeYS`A z_9u39$4P?pzV-882M-lI4s?*!p4T`p6EOzV4}hK=u-@bgV7IIYNJt{!0meDY=!Uw(&+n*0 z0Kc?-bb|LPwW=!S-)j%RgaORV^MDM}nw8x+C2NNwFrJl_b+48fIu&&DF=BUh<+Hc} z_DjI@&QjTy*Vp+lrEdt8{ zzsmA*$6ze(25$l&cN5C4K#-b(&N|@4KbzD|+4E9$N`O_OkkNou)h1k)+;JXXxT;Za z&&d%v_H8mMb{9@cH1=2I?863?0Lnn_Uh^{0OLdz5d{^Zwm=YmM9s5j00gE$g!~?|{ zE~01AqpR#391AyEf4pZj2TgUzM(d_P;ZdEus}uJh%FDoXwZ1+zBaH#NO%a-_iKhW& z4G@(j>VeZZp}GS&4Y}+R9ToNK-4n;oYdm011hggvZ<0iIl7UuI893GG&#Cgj%Bezu z&{UBO7&e7T(wT5kg1)w3;lGFj4Qs+aN<8sYge>Mrb^wN8YzUQzZRQET31kC0Ygffn zREkHvL}`@;B^z{SeQ*{X+6%b#?6VHM*f8DWHs?j|I)>>amgca(`S=NCy3)YL(nKJ?0E& zILIAdsAdSRpzPaZoIO;xgrP55@FVeoUgGOnwYTRq6BJzz>g6HT`tEIb=>SBEAF_LpXnB_0;(RJQ#Bro zv7uhhf7UgsGMRD535$pby@kakyPfOLU@PcK_n0elAa4D=U*p1pIYz0=$L;qdAIdfj1Z>DOZ7koL)KrD!J#}45sdX( zah=sJsW559S=Syu3uRuOqYnaEw{oBa{%h zh?;JApPIPxwK$_wT*WHT|5GoupQ;7+#GEu+j(y%7x-3JQE|tloQw7>txGW#MqRg+(@c4&<7c4t$jBcBsDWc3oT6QCs0?aJH{_OY+2c zz6 z&M&$PFZ@57IMx^>az2~#e)^&BbVuZQH{WdinCY7C)ykEiEduAzQE4}7o_pxlXY;ea zdU@9r|HWf9F#iG`e{NqyZDCkEJ^)5E!05>@ItorB13kUYPW8zi0qq0Z-E}8iyRJK1 zwub*7s6%FkeMLsii>bcUq@#bRq?1z#p5aa{fh!K zx)n8}eypBr5nb^`Oh)vZDov4$BTDg1M)2eBU-nb3TO_lb8LJ%MIXFM-`Jc0Z?Dgib zkw+MPw zxIq>WIq!Z;kNji=WPzvC)5eTtJOQE@tb#NoR0gm&`K!2lf7FbA`x7pa(c05EAqt-$+kkm}j#$IN6C{-{? zxV156fpp+wQ#1$fLx8`g;hLfX@bD(86GUmxH(;R{1o`+32t7aFW_d6Z_$+LsB0Xq0 zF$96>zb|!*J<&6VhtE3KFx+oC=RU)>CooO%pr-J4$-d4j^79mi;1T9WmHL z)(%Yrd5%;gQ`y+uN=_n>PiDp`=ccY@BOSzkzcO>X*M0YIcK2T#DK?gH-!Sl{$%{&U zKpzgmhV9GBuAg2b54tymwn$5KWT@ke^uIt^K)2_}t`qZ0| zRTPR>PWtYY@#t~<=YF$RwzdU%d9zW>IS?kkXI$_GIf0}ic?g&c9U!Th-}Rh}`bDau zGzVUFjCO5yZ$_Uu@9a?*BdTT`;b@V_`S;87e~d>LKp_YpL8zyZ_3_{Ld;s7F*qJ_lvP04*dgn_Lox^eKILaNvuDNr_`t;S@8H`>mDj1FpHnUc17)|HT z(QciV0WgN}3&w)U!LHdDSqYIwkS0KK^idzbK4gj1wk;G;S#)^d2GwPuqr~x(0Af`CJ-Qs zF<5^BPyquok0Rh8L!Uaz-ni^9-)Ac16VpU0RR%PlR1qgshgn+;Uf^!1CpzEpiqV`Y z=oKZhX_+ZJFkba@V{1x9bYRd?RlIl{XgXjyko z>cdz|NU(1NEr_0<0VJct2M80D`&x?rSs-{<K5i!6&ivcK-!_ukKA;IH5Zn3)h&-t3`HDvG?XmPTFn#8S@`bb*N;yjo~DAKPAD~t4bKnMq=>8-NNCNb8SU&@rMl@+p;AT~YU z$l!M>N5S*d5uzX|T2Sb>5CisvcuErVpcV--dL^YEFm4OVLvx(&2sJP?d@RhX6Ud4p z=2&d+i!Q3xo!;&}e5w!lfw>@A5eP%U5UZQ2RbaYz;yr-Ugg^sOMqHGj91lJRgMZG8 zz1N$U2;r=aoSS=_6mJ;n{$|hc=Xoa(C`!&gY)%&u6r+^X1(_#cX{u)9T z%T_>HxEFAB4iZO12aEWAKm^b%2kavq6rq8cDsKF2{0j&$M(0ZtuMb|HK2Y%J*uXDg zd4A@!fi&(t`AH03f5u)_-Mq%pMu)uM7X z4;dQFXmjyy|4ikObo+gB3c4bKeD@N1vdUvK`?8;7YyZd|{jER&Mjlm}qAKfS#EH2I zsEGnWfg}EQRfYk-@+D4gvyiLFZWOx&eihLcsQH@#q9FAl`trcgpDl!kS;cB-t7TTD zOJmrj{?qSB^q?TkCg_sGfH|$Ku3F)1eMDr>UXz9Lso!KEQ5>VNP*29ro(murU{)zH zzDI4ZZseIg=OaabxnD56BYkN3w`&e~{I0R}mI2DKyg^1B%E#fq79zx~5(mx-Oo+;E zUiP?ftLUk6m%^q?Jv6mN#rRAO)ImgYa05iIrwBs%WOMe=ONgo8z6rRfC!0biCPiic zvZ%Y96cw|#?2!U~@uR#TJv|*fo?34u;I=3asK+tZlq`Kd3+1e^6mNB7<313w7Cltz z(m;dTrADI3L})l|monPGjn&aca6H5?sCIsTU+6Ds$2+f|SQ`Y*`cYJno7 zgAU0G#STJhQD&9vL#lWxUEOWx7ad3KdWM9A_=w+9O64F!YkFgdm7K`9T%H%JbOBZM zLJpo68%9B%9F?7hbw`w$^TE&-$O-W+HGr)EBVYe0{IAa{F1-5OKQW=80TZ$)8yn`P z;ba3xN~;7AfFt|=@b*rqf85bLj5}B=IauZ9{cBt>OG+TguAloyF`ULlMX_4Eeq04L zHA2oQ)nF{vE~vAvukl2qfh=|Ii<urFTFIm>r-90frZi!EqDY_^v-SnOn#mpEx`9+cba`UJ2xlIpIUR=cb zWC(`gxn*V0C}2=6EO!B<6HF-L*PriVS<2ek6|T^7z)*4<(vSv@&+Q+%3LC1ZTvo!$ zhzG7X9U*W9F9zr1RdoVTW`YY}LRf(xDXATqmB3A}tkhNmX14GfOF@K*#RS-R1?yPgWu!kAuwc>!pk&VM*mR|5TiN>X|s(r-3!Z2h?0R@HcqZTt1E@x0&E2>u6s zq)7RLHC+bU(^N}cCKe8|59V7*0qAAHl`I6l$xe$3wMg`(7yjL&6Dk7)8I4tXqrn6Ih^YZ;zr(3VjiXh1G=0cA$FQ4U$1DIyaZ#C^{$`<#^KSbDs{(498pIluLY^xM&@nOmrx)X^S*mtModtkjgo?uq$0{mgIdK4lWC!$rO;J~C z=1&M+_JARr!2@^g{10xhK@M;TL-*~9n#+|P9{X!NVfuQmnj#iu2%WMYLk=d2A5wts zNKFrSb|kB5poO;fvRTHv`cuOcMJ zK~7hsVXEj$6bc8!_sUoNH&m!G5(;RN+y$*=fwz6VwlE!mNaQniHYS=c* zNGx|&+R;B7rGeYb`2cNMmYNQ?M}*tP-VbI;PAeU15~H>%nXiHjm#g}ogd2v4?-UZjjW`S6U7%Fzz+h@`ECuS#MGCcJAVl@%bZ3LzJ%lfU$Hjy(z z4+82Bwoy-&lh~$LNrT*Fn!?t!4cuz|oOf2r)p>kN9+G5P<{cMYo4QHvFr^bC&!suU`=vc@yNvL`5DPOemeH=WUTX ziIklJ8ce4Eraa%tFhKJ8;AZbDY2fq(#pj!th>8tn@Vi;7zOp&dhQhx8q+YaSV?YE& zWc@f5OnfK%3G5)#$A#7dM46L998UVkVv;x-WfHyLPa1%jzWCV7qT$%G>65F(vu}@K zCFQ^^YikdZKpOUIRi)`#l>tL<0{fS+(8(5^6V)2ml95em-*%Q87j>QVYK}FZJ|jo_ zZX0*Z-n_X@q0oju0Xm72Ujn4)(+9p|!u%R}5uF)v+uYT!8c)|YAKz6Tpqa?F%=K+jFg`uzo=hvm1&u42FE9s0Vy^>xJ07rz5F$a)#s z+w347>dyhqn!v#S)!uhTMVV~vz7j-135uW~K@c$!M#(uy8YC(zK|nzP$=N1L5Cjx3 zzyJ~@h$3mosRfjvWKfYD8W71%hK9cTZJimV0^LVhBK@^ag(8^Ess{uD>1eOo!50BMddtk^I{yvRUi+~uhq9w(`! zSY>p8*ZKL5;0G0wCl?kzK>?M>X>9|8a-VIm#@aT@>75FLz>&d-FK5@)c(q)om89uJ zx)L}8$}1|sg+beEDHeWu4^vGK;2~YZIrWhXIUjY{(lu zbUM@`RPA8USnG4jeTYHc&G(S%qy|s)X{?(rIDu4h9W1P@)<8K%B{y>984C?Ym`0FEJ*K+!nPCd5I53CoQlUwbNd<@T|vE zkb0UvDb<?OLv;l{z!M$DTG_I;h=VIJR;wRbdxtG=! zq435(=FzXv%FfQt(lVJ1kz*iD{rXv^kD-UoK)|p@`gThaFR=paw*W1(HJ~E&I=PO;Ek# zVOBOCYiN4UeaR6QQD$(-wbU=7T*+(NH{+ec;HdSxCf*0Ex%6PI*s&`8`U0{80yYC$ z`bA7gX9grNAb@p4kaRC}V~h3#DJZ{igya?I>yPoj_XWQROTe5CsuU`8xNG(3q;uN= z!z&Xut=tGM2@ti=Rf9J)N3`2XvkL<~etkLLmU|H9o&RpL`&+T`X**Ahlp1NR;{j$IW)owB6hisB=fOnce zA|GZRQ%1hp03!n+>x>g93KrQ5`_}JqZ<3QAWo696r6$L zZa=g{8f$B}x3`-zB45>_sJ>c5>kTAqp$GXlAXx1*h0Z|$O^8tWWv4d=%n17s)^B}` zjs^BatM;BAF^A!|y}br6kVb=0sYYFBtAaMm6?R}IOlv@SKRlK#osq`d@R>3MN-)!< zNo^Q3BP}frR(cdEh~=Uy=;$wVo-ZAvMdu?87)E2D3Y_9Z^fjZX^etdE=+{U?YFJrK zK~L5lSO@yqWDJ%t4o|TFlF76NXy%7rD8jKLoLi^xoE6YI9?l~C;Ry@yUdDs4t-3N| z$>mlr;pCYh!OkM>v25?N#QFjr>75xQpJ&@A;*5m64Yj3+lm=r);A2GmTzZSFuim(k zB92_}hiRTvfZo0A>gvIh=#VY(qA1vC0-@gvt7C%eU}>^V6o_0qv%tx(tn5FEaLL0Y zQvmK-SlI0e?1_=Lp-=vGcD4|epQ<)a{>ouVw;7mq^De|s2vC)C+iOGiv`AEPV?eVZ z^x9(m$&g3}v>WZPO3NruaPp+3rKKRcH@TISl^GfJKb~|%#QJkKK%nAb zYmNZc8?wXJKSsNF$HwNUm_ss-0+Gvj`t+$yUvbNi@5C+xR_P(TH0%V@_>?r-2@nH? z61%ysnwpxcYmqoiJKwqXt^P4N7baV7zl-{S3DD8$fM&*UGQ=-D;oxaJ!c}O=y373c zzjp^Q$3NGOqM}bx>f6J~En?FHP40Pc)u7UTG8q^u<+q2gR~crhqw||>uMoQLb^p8_ zOMMYG{XB^BT%!8^U7Y8_iW%fK0cG$yFRvY)C_y}hi;h!)^tSC_qu-vhAi_?dfdqG$ z;To(i4fqf*Ttc|=U^7&Kkuf9#xnSBMLKX=rTY8OMA#Xu2|L;7&j~#G*ALx-(g?J>k zbmSDUEq}Wo8LPRQHu7HjAgJY$kMwYky&DO(aWWJJe$8iBl#$q`YoG%7$gD==}NBh*P802oBV*+C%We!^ZXcisk{1F;p{A51|I@YkNYfljw8%~KJ zr|4oq%gsEqM4=>E4+rIG@I@u|xA|4wa8OQ|0e|QR#SAXG;U44f50P_E^5F!GAG;Jq zlq#F44nIP76!yex|dh1cA z&E1oU3z}4PvU%&V2bq@8s zp?&qngesx1!hIg_Rf_(uEmV1Jdql!O{%zXOq<@nhgOyRNz>|g_%yHO=(YM{b>ftXV|8VU&5-rUFh z7rHX%_Trb~a#fWA0ihlf$v1v9ScVum+w_m2OHGk z@vw5W*lvJD06*xpq=9WoOn&w1G{Kebs90Wrgq9Gc*s9?kZof1;g}s^SL)b%}e2+i+ zGCr3%zUpSGs7dQ1BeEV517=QDzr}H5JO;&65xk(67hXWu2*9Z?M$Rn&s_L5`DsS8Z z=x?T0lFZF_AqTaj^0TvN0O4wjC9>LAGO&N2`LnIHtqr?SOJiTTSkGrz>_RX*?$px` zU{T+%w_^4m6%`bh@B`UTSKHR1rr`Y4@?XQsw3y&n@d*6R1x3UxZ%afl0-So3FSJ|zI z?nB-szQmn3YaBwB+KP&b9}~A$XKCESOoUv%wdb2PBs$dY9f8gZOc)d2cl-@Sz!c5` zo`}O($n>qB<5+zHW+FCU^uX+p@26LKD%)!^JL_YMNh!buWRK;wypChbYP|$zYl|#fsP(*xJsb*i1nF z982;Iut%iCLPB|uEK)CMms?y>rhW+-Eyjq(2eeupja-wap1)<=Tt_|Qi8K6@R?L~Tv6^4BbZYkni~|6-5Mt!6uNXh%ST+AHsHETldF{f*wXR_;Nw+Q#l<3n?q>~) zv$uCrl6ICe-*9w`IF7z^7y|^vsL5PUKKIVsa)4GBZ^#}CD{H=%yS_H@rgKc=%5_a(PKz<2mfLOcLpRkJ zF+@RWCcjo`MKBhp=bcfKKr-w%?~?3e^|#QatCYMEjixiw!25ig12LRuc&^~BR_26xs=hTCr1D>57Hyck}=)I2JYh6q(RJAli+Hn1nY zVaTCw|AU#K499pGX}4f$fJdwb50p7uRBGwx-&C@oV=V_*`sln%)UfOVz&vQypqkY= zx^nSNSmo*=q`u8~&W1eeatB%kl@1Lxm| zRdVayO$g1%l{wIy$dY|68QfIUpURzIC;fQ^1jKuv+a&$WMo`(8@8GX} zKH}n)msyPYxXEmm`-pi<(rakAVh9||$n3iT(7S|1X$rosYifyuAzdm#F*a;k!TY5Fgt{2KRb;gn@S#`;7NZ5~=BeFT z1x?@14OFZZIWG*$W4$E~X`nv4@%OHyZ)ms7gJ&2g(f~h%Lc(sWpAiti0&E8aG0UR( zrL!|$O9-2+M)au>mZjmB;QjXLOzB(!rvPv9;?*bq5ymmm2q&c#^x(gQ%K)q#L<^FD zv^nB)z_-00aE=EqX3nyfBuKhHI{X_~zZlqFI0iC+WC0Kt%4kr>chwkkE1vz$C8a^& zH-Ll1NCyN87ykgw2BK(TU0eins*7t$k|maoJqojU0X;V* zxU@5Hdr#+L-KtXlv^qt&`#q6UHg_ZRvXIzn=kbyHEjznG{51A4%v{*&&*EaYp1d1; z^6(%>6R$<3(W&LUhkc?$Ue0~CB`Y9B9wvCnfO%G97vYy`&B{#db;1z{1el-{Xu+cT zAxxT792%!pc4x{ODBa}$-#Gy*_ggd4*BijVcnVNr4Hp9*j>K>f)g2bdA^6aZ6>*>G z(YboH#C?8{aYq1juoS8&@GodYa9q|`QLzpJ=ejY^S7!&LvIR|zFQg@x3a(NM#uN2P zKALgi@BN?O7{XNy^a@k2x)dL4zZ{d$0z0e^?rH)b-Z++(uqYi%OyiWjwh<1*7w^@* z&kY&r>AC(lhe0yr3W{l3p6XHwKkPXAfH(TtGw;o*%wXxA|Kcv(#Q}D6r{E($E2Kd{ z>MT2^vnGV~JoF-7ALs*T!N}D^^}rp+w0~xJ8n2vq1h>3DA;o<=vUb`Ks_A&Q$rVXFmVwEVxag&cezxMey$ZEZvZ-@t6c$caUej0Gou% zx1M}6EwPcng(c8KAV^`GYEZ>B{-1jbdYQq;Q$%{dU{JsAfR^-1_e0UaQkN;+7s=~Tms%Eg+rm93E-ntY%=jZr&K# zW8$PK>kX#T)(urlc%hJfpdh_}|9*^#k2o*^^~<==^?z0Yp$FGJ{2!c#Szlmqkpjcy zU{-3VUbEK79RY?V{BXzOH1&L6$vkjJ>{&Z|=8SXIl(^crJOk1SkOJQ76UI2bol!yN zL(KL3<=YY@FL=|uT6{2hd}87XDDEKei}VpOq;URG8X4&zvT^ur-v;v8yI>x&ZMfzUcv1G=RT=fw1Kq{ zSo&6Bp3Dt9j{(DJ>&7nbgaZ>{IFI?rR}$Cr;3sE;__7TdYF8 zys=_az>N7J2M;O2fJwM7gw_I_Dj$ox80XTR0I=!L8Ful))>lf?|IK9}Gy+!BzH}UX zVeE1+HH}#WXOe{L_Z!66^A@f91lXkRE(CMBzloi zV^@J|mexePf(G zj)fmNUmMmcF`fN6VprPa@niOG5I+ZkM3s!yW`u+Nsq7B@GWdy$Ap_$5;2fw7lz9(` z0J`1bLJKj@noMnSv>QJG1pFEp_+xxnT`fa zh*e1L17?h9(HXpqN0sOe85q;Zu;5bKb~^cxY$hNN#2cNd1|tG9A!RCd67hvw0`hcrxQ zzpW>&ezizinf@Zszm(s=?#wrpFOjoQ9vMx$MW93%pCw)~eNjl-%(6YxT@c?q+=`{W zy>oh1ZRWDIcHWdQoT#vvA14Y1nUA$dw8AVKUAlBhUtfPlKs?5{*Jtv=_hM~urAr;V zU+S3nY~1=-548obXAWDP>FO0;I4TY=!5s&z2;T?@4la}q{H^utBX;Dw_w_*IK(!lO zE8kuzGIu^kWpegGMnv15J0^SX@3-}lu$>>QDP0N>xO3qWn#y>xF>yBlstnx_?nQB{ z3}Pk|P=%CzAZuv{wrLhXwsw6`mIz_suAK#{8DLrZu1F{C0z@n%n5)zHv#Z5Z9TKiM zFsd4HLZ^I8gm2Ua9yx!zAI|<*{X@vr!Ql>>cZS#@SrIt1+&`tzkWvM5^)IG!^lIj> zP&}ND!}c$_X_pA~R9q3F45>vAc!`iDK!hNFy+y?0mf7LgM3_yy9Mcl|Y-DW)m^LTk z?d>XNi&4etwg3+th>E{_nMOb{xKSWmkXpvVq$KP(7@#k23`-ycc}g4u)XL|a>#XcUmu^kX{goUc zIlt)5*k4oe*}u>wjm!SMfAURT?Yp|#Mu&}-{xn^ZRfim6n!r!L0qlLK)Hj=`wGaKn z5%Wz1Udjy!KG2k7C*#jM{>jE|C3crrjjWj4keB+yO=D(%ZM6sQ=b`=L;>Fv`$7*)g z($T+X`1|iCQ1oy;tG!XVOO`knACE3>e1hVWvrk^tYS2W(INxjVfDl!YxD3c4nVbH| zC-MBNZAX>$2z4QH;TB{%RYlg0ujLe_GdJ+ZEt~zvM^|yzw`20d>LYaFx78w3Y?2l(-u~+4a;DDcq29L%!wwvL-UN{{PfWkq&CqS&|do{m(>w;xp(ViRovz_a8B$ zqlLI6Q*xe0v+M)LopD&+rOETuszygM{@O=u{+SeFO*mYK9rD z%XnJG`4yus&zk8a|1T4iCRH%vaXWZKY*`yQSY8L>_FCI>@vfuaKB#F}gjQn9WJ3BD zv|zZ=3}D-e-2zQ$B!k-15owP?@%Cp=;sOmT$0MltpkCGe%LAcfVF{0iY>ypdA>=&- z1O$fiZq(^$-Z@~s=tI0B_-&mt(|!gE;}&ZPk~O~F-zI$!LG)2VWXRnCVVANz8bJ^` zoY}fDdzmmpzVrlKZBI&KspMf{snsU?*M~5X7m`dVBJZ&#dY(X#0yX%F03i2jzE>K} zl^Y--P{Wn`{fnkml`ohu#4XM2+UYLI zYb9xzFfKaXc3vp(4&R?l+zUP!lytrO9UGwN<^gm~UEJ|ZW?*1>Vm?fvU94|0s1%O89t zL)y8TGC%Kpc`a|JDR@_VVTiaHFbndn(NAHJ+iiDuF7_K3O9b&J9Af#g+6Vk5&Zzxz`7@epKJU<=&Wow5^AsjIGR-Q+nlpdA1_+(K z(f=?qY&7I5VqRDgvWkqk=^jg*5&EeT*Q+N;#_6_@9!{S6r=AAbX{u|?Q|7kO7{@bv z-U)aKmCoHS;F8mI>pD-?*zC>j;%u-PKOJwPdbdvY!SAr)=ip-Fyai{=uepCx-aR9I zJc2mIRzotlf^i-r%&Oz4@^Y_Xpynz{WdI)WXTru3D=X_0Ep@E#nZqt#aLcWlpx45H zi!L0Ref@9@J9B^0*D&zz1q&FNnB24{c^*es6FJwLg7TM_-VM~e97(K%;^bN(T0L$g zJqfCcF=zE}(iVm=V;ogpEgeu(*TX(yOCj*qr0gdN{EY^bjg`?gAIS%9mnT{>D31}G zi)pTTRo6kCuFhWHeVfa)p}VPwOY`{xkV8RSuEs+_IUJqaxm&-gtL)L7Mr)Hv*XPkY zYYEqazGS-R*{Lltk=FC+#7R6SH%T}EMWda634}|}A;p2F_8}uVRw6lk&6SiI{o-g) zen-KkO}uNTPzk*x+>7=OH2pATe&J9h?S(@QHG22yHzki)girgmGGl0nBE@}e^%PXH z+Hh+iN8_JY?lKQDPc+yv$=zKhUIRCuFL9c#7z#uP@`y)s5GhbNXYaPSl%Ky%MMupq zvqr_S?PS*1Ce6LNF^YvGHxxeOpNRTpx0l0`MuY{vs+`38c-3?yJ>OarB@L6>(!?rv z1thETY9TIWhMN&%QgzU)Y*UZ}BcA`*?o(>d~2zoJ|1m*{oHk^+hP z@6VYNxedif`g`bu;N>@yN%~b-zda}a<6>KS2)#(j;^Mpc_Bx^)c=10zmh6T diff --git a/python3.6/python11.ipynb b/python3.6/python11.ipynb index ef6bd39..05dd5bd 100644 --- a/python3.6/python11.ipynb +++ b/python3.6/python11.ipynb @@ -34,7 +34,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -58,7 +60,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -82,7 +86,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -113,7 +119,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -134,7 +142,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -163,7 +173,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -193,7 +205,9 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -227,7 +241,9 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "t = 1, 2, 'hello'" @@ -243,7 +259,9 @@ { "cell_type": "code", "execution_count": 9, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "x, y, z = t" @@ -259,7 +277,9 @@ { "cell_type": "code", "execution_count": 10, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "a = ['foo', 'bar', 4, 5]\n", @@ -285,7 +305,9 @@ { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -323,7 +345,9 @@ { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "def calc(a, b):\n", @@ -342,7 +366,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -366,7 +392,9 @@ { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -408,7 +436,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -472,7 +502,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -529,7 +561,9 @@ { "cell_type": "code", "execution_count": 18, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -577,7 +611,9 @@ { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -605,7 +641,9 @@ { "cell_type": "code", "execution_count": 20, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -661,7 +699,9 @@ { "cell_type": "code", "execution_count": 22, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -720,7 +760,9 @@ { "cell_type": "code", "execution_count": 23, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -759,7 +801,9 @@ { "cell_type": "code", "execution_count": 24, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -781,7 +825,9 @@ { "cell_type": "code", "execution_count": 25, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -802,7 +848,9 @@ { "cell_type": "code", "execution_count": 26, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "AttributeError", @@ -831,7 +879,9 @@ { "cell_type": "code", "execution_count": 27, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -857,7 +907,9 @@ { "cell_type": "code", "execution_count": 28, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -896,7 +948,9 @@ { "cell_type": "code", "execution_count": 29, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -946,6 +1000,7 @@ "cell_type": "code", "execution_count": 30, "metadata": { + "collapsed": false, "scrolled": true }, "outputs": [ @@ -968,7 +1023,9 @@ { "cell_type": "code", "execution_count": 31, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1022,7 +1079,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/python12.ipynb b/python3.6/python12.ipynb index ad5835d..2d31299 100644 --- a/python3.6/python12.ipynb +++ b/python3.6/python12.ipynb @@ -29,7 +29,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -56,7 +58,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -90,7 +94,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -119,7 +125,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -152,7 +160,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -180,7 +190,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -218,7 +230,9 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -252,7 +266,9 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -297,7 +313,9 @@ { "cell_type": "code", "execution_count": 9, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -341,7 +359,9 @@ { "cell_type": "code", "execution_count": 10, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -380,7 +400,9 @@ { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -424,7 +446,9 @@ { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -445,7 +469,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "KeyError", @@ -467,7 +493,9 @@ { "cell_type": "code", "execution_count": 14, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -508,7 +536,9 @@ { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -549,7 +579,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -577,7 +609,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -605,7 +639,9 @@ { "cell_type": "code", "execution_count": 18, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -633,7 +669,9 @@ { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -703,7 +741,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, From 2767e882996751c616ea5eccaeca58f4a307b880 Mon Sep 17 00:00:00 2001 From: dohyung Date: Tue, 24 Oct 2017 00:06:07 +0900 Subject: [PATCH 060/124] =?UTF-8?q?assignment=203=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-3.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python3.6/assignment-3.ipynb b/python3.6/assignment-3.ipynb index f58aa86..c4a7d46 100644 --- a/python3.6/assignment-3.ipynb +++ b/python3.6/assignment-3.ipynb @@ -6,7 +6,7 @@ "source": [ "# Assignment 3\n", "### [정보]\n", - "#### 1) Due Date: 2017년 10월 31일 (월), 23시 59분\n", + "#### 1) Due Date: 2017년 10월 30일 (월), 23시 59분\n", "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", From 54f74324c7e2ab0d148b3268d7a2eb7481a529f4 Mon Sep 17 00:00:00 2001 From: dohyung Date: Tue, 24 Oct 2017 00:08:46 +0900 Subject: [PATCH 061/124] =?UTF-8?q?assignment=203=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-3.ipynb | 38 +++--------------------------------- 1 file changed, 3 insertions(+), 35 deletions(-) diff --git a/python3.6/assignment-3.ipynb b/python3.6/assignment-3.ipynb index c4a7d46..0976575 100644 --- a/python3.6/assignment-3.ipynb +++ b/python3.6/assignment-3.ipynb @@ -135,21 +135,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [프로젝트 오일러 문제 7]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [프로젝트 오일러 문제 8]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [프로젝트 오일러 문제 9]" + "- [ACM-ICPC 문제 1152번] \n", + " - 단어의 개수
\n", + " https://www.acmicpc.net/problem/1152" ] }, { @@ -173,26 +161,6 @@ " - http://www.daum.net\n", " - http://www.nytimes.com" ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "- [ACM-ICPC 문제 1152번] \n", - " - 단어의 개수
\n", - " https://www.acmicpc.net/problem/1152" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { From 00fb1285be64842321a7af1a446349c11e3db157 Mon Sep 17 00:00:00 2001 From: Do-Hyung Date: Mon, 6 Nov 2017 00:03:44 +0900 Subject: [PATCH 062/124] =?UTF-8?q?python=2014,15,16=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/__pycache__/mymath.cpython-36.pyc | Bin 405 -> 0 bytes python3.6/{t.txt => example/t1.txt} | 0 python3.6/python13.ipynb | 20 +- python3.6/python14.ipynb | 1630 +++++++------- python3.6/python15.ipynb | 2100 +++++++++---------- python3.6/python16.ipynb | 114 +- python3.6/sample.txt | 1 + python3.6/sample_new.txt | 1 + 8 files changed, 1879 insertions(+), 1987 deletions(-) delete mode 100644 python3.6/__pycache__/mymath.cpython-36.pyc rename python3.6/{t.txt => example/t1.txt} (100%) create mode 100644 python3.6/sample.txt create mode 100644 python3.6/sample_new.txt diff --git a/python3.6/__pycache__/mymath.cpython-36.pyc b/python3.6/__pycache__/mymath.cpython-36.pyc deleted file mode 100644 index 5b13453958a9d6c35dece521c030000aa8e3d198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmYjMy-LJD5Z=jd&L|#O2zJ`or0}*luo4L<+8u~kc#XvDnglP|Fq=~X*PT9qt#4ps z?X#q{^bM?>UGQ|^n{RgK@0;;(xbgD(etpLn`y{N4Q18byeCHqo(V5 zs+7CHdL@7%#hF{<%<)RqCOulxwe8`R#n6kYYf56kKXE9iv==GrbU@MXXm?glAlphN mu|Svf3(=+eu)(r!|Bdn2`dQIYWz>A8kKLDbeIkf>#D4&JB~By& diff --git a/python3.6/t.txt b/python3.6/example/t1.txt similarity index 100% rename from python3.6/t.txt rename to python3.6/example/t1.txt diff --git a/python3.6/python13.ipynb b/python3.6/python13.ipynb index 05935ae..903107e 100644 --- a/python3.6/python13.ipynb +++ b/python3.6/python13.ipynb @@ -76,7 +76,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "s = \"\"\"Its power: Python developers typically report \n", @@ -447,7 +449,9 @@ { "cell_type": "code", "execution_count": 23, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "f = open('removeme.txt', 'w') # 파일의 생성\n", @@ -550,7 +554,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import sys\n", @@ -691,7 +697,9 @@ { "cell_type": "code", "execution_count": 30, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import sys\n", @@ -703,7 +711,7 @@ "print(type(f))\n", "print('Sample output')\n", "print('Good')\n", - "print('Good'))\n", + "print('Good')\n", "\n", "sys.stdout = stdout" ] @@ -855,7 +863,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.3" } }, "nbformat": 4, diff --git a/python3.6/python14.ipynb b/python3.6/python14.ipynb index fb7b84f..d2ffb47 100644 --- a/python3.6/python14.ipynb +++ b/python3.6/python14.ipynb @@ -1,871 +1,835 @@ { - "metadata": { - "name": "", - "signature": "sha256:dd334c6957c3dc2ae7bdb34ebf3a2b75cf1fc20f77f9f62ace43f18da4b929e9" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 14. \ud30c\uc77c\uacfc \ub514\ub809\ud1a0\ub9ac \ub2e4\ub8e8\uae30\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud30c\uc77c \ub2e4\ub8e8\uae30\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ud30c\uc77c \ubaa9\ub85d \uc5bb\uae30\n", - "- os.listdir('\uacbd\ub85c')\n", - " - \ub514\ub809\ud1a0\ub9ac \uc548\uc5d0 \ub4e4\uc5b4 \uc788\ub294 \uac01 \ud30c\uc77c \ubaa9\ub85d \ubc18\ud658" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "\n", - "print os.listdir('.') # \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\uc758 \ud30c\uc77c \ubaa9\ub85d \uc5bb\uae30\n", - "print \n", + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 14. 파일과 디렉토리 다루기\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 파일 다루기\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 파일 목록 얻기\n", + "- os.listdir('경로')\n", + " - 디렉토리 안에 들어 있는 각 파일 목록 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['.DS_Store', '.git', '.gitignore', '.ipynb_checkpoints', 'example', 'files', 'images', 'python01.ipynb', 'python02.ipynb', 'python03.ipynb', 'python04.ipynb', 'python05.ipynb', 'python06.ipynb', 'python07.ipynb', 'python08.ipynb', 'python09.ipynb', 'python10.ipynb', 'python11.ipynb', 'python12.ipynb', 'python13.ipynb', 'python14.ipynb', 'python15.ipynb', 'python16.ipynb', 'python17.ipynb', 'python18.ipynb', 'python19.ipynb', 'README.md', 'removeme.txt', 'sample.txt', 't1.txt', 'teststring2.pyc']\n", "\n", - "print os.listdir('../') # \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\uc758 \ubd80\ubaa8 \ub514\ub809\ud1a0\ub9ac\uc758 \ud30c\uc77c \ubaa9\ub85d \uc5bb\uae30" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['.DS_Store', '.git', '.gitignore', '.ipynb_checkpoints', 'example', 'files', 'images', 'python01.ipynb', 'python02.ipynb', 'python03.ipynb', 'python04.ipynb', 'python05.ipynb', 'python06.ipynb', 'python07.ipynb', 'python08.ipynb', 'python09.ipynb', 'python10.ipynb', 'python11.ipynb', 'python12.ipynb', 'python13.ipynb', 'python14.ipynb', 'python15.ipynb', 'python16.ipynb', 'python17.ipynb', 'python18.ipynb', 'python19.ipynb', 'README.md', 'removeme.txt', 'sample.txt', 't1.txt', 'teststring2.pyc']\n", - "\n", - "['.DS_Store', 'calendar', 'calendar-dev', 'ipython', 'jms', 'jms-scheduler', 'mySpringFrame', 'python-e-learning', 'python-e-learning-movie', 'reviewer-recommend']\n" - ] - } - ], - "prompt_number": 27 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \ud30c\uc77c \uc885\ub958 \uc54c\uc544\ubcf4\uae30\n", - "- os.path \ubaa8\ub4c8\uc758 \ub2e4\uc74c \ud568\uc218\ub4e4\uc740 \ud30c\uc77c\uc758 \uc885\ub958\ub97c \ud310\ub2e8\ud558\uc5ec True \ub610\ub294 False\ub97c \ubc18\ud658\ud55c\ub2e4.\n", - " - isfile(filepath)\n", - " - \uc21c\uc218 \ud30c\uc77c\uc774\uba74 True\n", - " - isdir(filepath)\n", - " - \ub514\ub809\ud1a0\ub9ac\uc774\uba74 True\n", - " - islink(filepath)\n", - " - \uc2ec\ubcfc\ub9ad\ub9c1\ud06c\uc774\uba74 True" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "def filetype(fpath):\n", - " print fpath, ':',\n", - " if os.path.isfile(fpath):\n", - " print 'Regular file'\n", - " if os.path.isdir(fpath):\n", - " print 'Directory'\n", - " if os.path.islink(fpath):\n", - " print 'Symbolic link'\n", - " \n", - "flist = os.listdir('.')\n", - "for fname in flist:\n", - " filetype(fname)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - ".DS_Store : Regular file\n", - ".git : Directory\n", - ".gitignore : Regular file\n", - ".ipynb_checkpoints : Directory\n", - "example : Directory\n", - "files : Directory\n", - "images : Directory\n", - "module_test.py : Regular file\n", - "module_test.pyc : Regular file\n", - "music : Regular file\n", - "mymath.py : Regular file\n", - "mymath.pyc : Regular file\n", - "pickle.txt : Regular file\n", - "pickle2.txt : Regular file\n", - "python01.ipynb : Regular file\n", - "python02.ipynb : Regular file\n", - "python03.ipynb : Regular file\n", - "python04.ipynb : Regular file\n", - "python05.ipynb : Regular file\n", - "python06.ipynb : Regular file\n", - "python07.ipynb : Regular file\n", - "python08.ipynb : Regular file\n", - "python09.ipynb : Regular file\n", - "python10.ipynb : Regular file\n", - "python11.ipynb : Regular file\n", - "python12.ipynb : Regular file\n", - "python13.ipynb : Regular file\n", - "python14.ipynb : Regular file\n", - "python15.ipynb : Regular file\n", - "python16.ipynb : Regular file\n", - "python17.ipynb : Regular file\n", - "python18.ipynb : Regular file\n", - "python19.ipynb : Regular file\n", - "python20.ipynb : Regular file\n", - "python21.ipynb : Regular file\n", - "README.md : Regular file\n", - "removeme.txt : Regular file\n", - "sample.txt : Regular file\n", - "sample_new.txt : Regular file\n", - "t.txt : Regular file\n", - "t1.txt : Regular file\n", - "t2.txt : Regular file\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ud30c\uc77c\uc758 \ud5c8\uac00\uad8c\n", - "#### 1) \ud30c\uc77c\uc758 \ud5c8\uac00\uad8c \uc54c\uc544\ubcf4\uae30\n", - "- os.access(filepath, mode)\n", - " - mode\uc5d0 \ub4e4\uc5b4\uac08 \uac12\n", - " - os.F_OK: \ud30c\uc77c \uc790\uccb4\uac00 \uc874\uc7ac\ud558\ub294 \uac83\uc744 \ud14c\uc2a4\ud2b8\n", - " - os.R_OK: \uc77d\uae30 \uad8c\ud55c\uc774 \uc788\ub294 \uac83\uc744 \ud14c\uc2a4\ud2b8\n", - " - os.W_OK: \uc4f0\uae30 \uad8c\ud55c\uc774 \uc788\ub294 \uac83\uc744 \ud14c\uc2a4\ud2b8\n", - " - os.X_OK: \uc2e4\ud589 \uad8c\ud55c\uc774 \uc788\ub294 \uac83(\ub610\ub294 \ub514\ub809\ud1a0\ub9ac\uc778\uc9c0)\uc744 \ud14c\uc2a4\ud2b8" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "def fileaccess(fpath):\n", - " print fpath, ':',\n", - " if os.access(fpath, os.F_OK): \n", - " print 'Exists',\n", - " else: \n", - " return\n", - " if os.access(fpath, os.R_OK): \n", - " print 'R',\n", - " if os.access(fpath, os.W_OK): \n", - " print 'W',\n", - " if os.access(fpath, os.X_OK): \n", - " print 'X',\n", - " print \n", - " \n", - "flist = os.listdir('.')\n", - "for fname in flist:\n", - " fileaccess(fname)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - ".DS_Store : Exists R W\n", - ".git : Exists R W X\n", - ".gitignore : Exists R W\n", - ".ipynb_checkpoints : Exists R W X\n", - "example : Exists R W X\n", - "files : Exists R W X\n", - "images : Exists R W X\n", - "module_test.py : Exists R W\n", - "module_test.pyc : Exists R W\n", - "music : Exists R W\n", - "mymath.py : Exists R W\n", - "mymath.pyc : Exists R W\n", - "pickle.txt : Exists R W\n", - "pickle2.txt : Exists R W\n", - "python01.ipynb : Exists R W\n", - "python02.ipynb : Exists R W\n", - "python03.ipynb : Exists R W\n", - "python04.ipynb : Exists R W\n", - "python05.ipynb : Exists R W\n", - "python06.ipynb : Exists R W\n", - "python07.ipynb : Exists R W\n", - "python08.ipynb : Exists R W\n", - "python09.ipynb : Exists R W\n", - "python10.ipynb : Exists R W\n", - "python11.ipynb : Exists R W\n", - "python12.ipynb : Exists R W\n", - "python13.ipynb : Exists R W\n", - "python14.ipynb : Exists R W\n", - "python15.ipynb : Exists R W\n", - "python16.ipynb : Exists R W\n", - "python17.ipynb : Exists R W\n", - "python18.ipynb : Exists R W\n", - "python19.ipynb : Exists R W\n", - "python20.ipynb : Exists R W\n", - "python21.ipynb : Exists R W\n", - "README.md : Exists R W\n", - "removeme.txt : Exists R W\n", - "sample.txt : Exists R W X\n", - "sample_new.txt : Exists R W\n", - "t.txt : Exists R W\n", - "t1.txt : Exists R W\n", - "t2.txt : Exists R W\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) \ud30c\uc77c\uc758 \ud5c8\uac00\uad8c \ubcc0\uacbd\ud558\uae30\n", - "- os.chmod(filepath, mode)" + "['.DS_Store', 'calendar', 'calendar-dev', 'ipython', 'jms', 'jms-scheduler', 'mySpringFrame', 'python-e-learning', 'python-e-learning-movie', 'reviewer-recommend']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.chmod('sample.txt', 0777) # \ub9ac\ub205\uc2a4\uc5d0\uc11c\uc758 \uc2e4\ud589 \uc608" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 18 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![inheritance](images/chmod.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ud30c\uc77c \uc870\uc791\ud558\uae30\n", - "#### 1) \ud30c\uc77c \uc774\ub984 \ubcc0\uacbd\ud558\uae30\n", - "- os.rename(old_filepath, new_filepath)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "os.rename('t.txt', 't1.txt') # t.txt\ub97c t1.txt\ub85c \ubc14\uafbc\ub2e4\n", - "print os.access('t.txt', os.F_OK)\n", - "print os.access('t1.txt', os.F_OK)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "True\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) \ud30c\uc77c \uc774\ub3d9\ud558\uae30\n", - "- os.rename(old_filepath, new_filepath)" + } + ], + "source": [ + "import os\n", + "\n", + "print(os.listdir('.')) # 현재 디렉토리의 파일 목록 얻기\n", + "print()\n", + "\n", + "print(os.listdir('../')) # 현재 디렉토리의 부모 디렉토리의 파일 목록 얻기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 파일 종류 알아보기\n", + "- os.path 모듈의 다음 함수들은 파일의 종류를 판단하여 True 또는 False를 반환한다.\n", + " - isfile(filepath)\n", + " - 순수 파일이면 True\n", + " - isdir(filepath)\n", + " - 디렉토리이면 True\n", + " - islink(filepath)\n", + " - 심볼릭링크이면 True" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ".DS_Store : Regular file\n", + ".git : Directory\n", + ".gitignore : Regular file\n", + ".ipynb_checkpoints : Directory\n", + "example : Directory\n", + "files : Directory\n", + "images : Directory\n", + "module_test.py : Regular file\n", + "module_test.pyc : Regular file\n", + "music : Regular file\n", + "mymath.py : Regular file\n", + "mymath.pyc : Regular file\n", + "pickle.txt : Regular file\n", + "pickle2.txt : Regular file\n", + "python01.ipynb : Regular file\n", + "python02.ipynb : Regular file\n", + "python03.ipynb : Regular file\n", + "python04.ipynb : Regular file\n", + "python05.ipynb : Regular file\n", + "python06.ipynb : Regular file\n", + "python07.ipynb : Regular file\n", + "python08.ipynb : Regular file\n", + "python09.ipynb : Regular file\n", + "python10.ipynb : Regular file\n", + "python11.ipynb : Regular file\n", + "python12.ipynb : Regular file\n", + "python13.ipynb : Regular file\n", + "python14.ipynb : Regular file\n", + "python15.ipynb : Regular file\n", + "python16.ipynb : Regular file\n", + "python17.ipynb : Regular file\n", + "python18.ipynb : Regular file\n", + "python19.ipynb : Regular file\n", + "python20.ipynb : Regular file\n", + "python21.ipynb : Regular file\n", + "README.md : Regular file\n", + "removeme.txt : Regular file\n", + "sample.txt : Regular file\n", + "sample_new.txt : Regular file\n", + "t.txt : Regular file\n", + "t1.txt : Regular file\n", + "t2.txt : Regular file\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.rename('t1.txt', 'example/t1.txt') # \ud604\uc7ac \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac\uc758 t1.txt\ub97c example\uc5d0 t1.txt\uc774\ub984\uc73c\ub85c \uc62e\uae34\ub2e4.\n", - "print os.access('example/t1.txt', os.F_OK)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 3) \ud30c\uc77c \ubcf5\uc0ac\ud558\uae30\n", - "- shutil \ubaa8\ub4c8 \ud65c\uc6a9\n", - "- shutil.copyfile(src_filepath, dest_filepath)" + } + ], + "source": [ + "import os\n", + "def filetype(fpath):\n", + " print(fpath, ':',)\n", + " if os.path.isfile(fpath):\n", + " print (Regular file')\n", + " if os.path.isdir(fpath):\n", + " print('Directory')\n", + " if os.path.islink(fpath):\n", + " print('Symbolic link')\n", + " \n", + "flist = os.listdir('.')\n", + "for fname in flist:\n", + " filetype(fname)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 파일의 허가권\n", + "#### 1) 파일의 허가권 알아보기\n", + "- os.access(filepath, mode)\n", + " - mode에 들어갈 값\n", + " - os.F_OK: 파일 자체가 존재하는 것을 테스트\n", + " - os.R_OK: 읽기 권한이 있는 것을 테스트\n", + " - os.W_OK: 쓰기 권한이 있는 것을 테스트\n", + " - os.X_OK: 실행 권한이 있는 것(또는 디렉토리인지)을 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ".DS_Store : Exists R W\n", + ".git : Exists R W X\n", + ".gitignore : Exists R W\n", + ".ipynb_checkpoints : Exists R W X\n", + "example : Exists R W X\n", + "files : Exists R W X\n", + "images : Exists R W X\n", + "module_test.py : Exists R W\n", + "module_test.pyc : Exists R W\n", + "music : Exists R W\n", + "mymath.py : Exists R W\n", + "mymath.pyc : Exists R W\n", + "pickle.txt : Exists R W\n", + "pickle2.txt : Exists R W\n", + "python01.ipynb : Exists R W\n", + "python02.ipynb : Exists R W\n", + "python03.ipynb : Exists R W\n", + "python04.ipynb : Exists R W\n", + "python05.ipynb : Exists R W\n", + "python06.ipynb : Exists R W\n", + "python07.ipynb : Exists R W\n", + "python08.ipynb : Exists R W\n", + "python09.ipynb : Exists R W\n", + "python10.ipynb : Exists R W\n", + "python11.ipynb : Exists R W\n", + "python12.ipynb : Exists R W\n", + "python13.ipynb : Exists R W\n", + "python14.ipynb : Exists R W\n", + "python15.ipynb : Exists R W\n", + "python16.ipynb : Exists R W\n", + "python17.ipynb : Exists R W\n", + "python18.ipynb : Exists R W\n", + "python19.ipynb : Exists R W\n", + "python20.ipynb : Exists R W\n", + "python21.ipynb : Exists R W\n", + "README.md : Exists R W\n", + "removeme.txt : Exists R W\n", + "sample.txt : Exists R W X\n", + "sample_new.txt : Exists R W\n", + "t.txt : Exists R W\n", + "t1.txt : Exists R W\n", + "t2.txt : Exists R W\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import shutil\n", - "shutil.copyfile('sample.txt', 'sample_new.txt')\n", - "print os.access('sample_new.txt', os.F_OK)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n" - ] - } - ], - "prompt_number": 34 - }, + } + ], + "source": [ + "import os\n", + "def fileaccess(fpath):\n", + " print(fpath, ':',)\n", + " if os.access(fpath, os.F_OK): \n", + " print('Exists',)\n", + " else: \n", + " return\n", + " if os.access(fpath, os.R_OK): \n", + " print('R',)\n", + " if os.access(fpath, os.W_OK): \n", + " print('W',)\n", + " if os.access(fpath, os.X_OK): \n", + " print('X',)\n", + " print()\n", + " \n", + "flist = os.listdir('.')\n", + "for fname in flist:\n", + " fileaccess(fname)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 파일의 허가권 변경하기\n", + "- os.chmod(filepath, mode)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "os.chmod('sample.txt', 0777) # 리눅스에서의 실행 예" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/chmod.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 파일 조작하기\n", + "#### 1) 파일 이름 변경하기\n", + "- os.rename(old_filepath, new_filepath)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-5 \ud30c\uc77c \uc774\ub984 \ub2e4\ub8e8\uae30" + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n" ] - }, + } + ], + "source": [ + "import os\n", + "os.rename('t.txt', 't1.txt') # t.txt를 t1.txt로 바꾼다\n", + "print(os.access('t.txt', os.F_OK))\n", + "print(os.access('t1.txt', os.F_OK))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 파일 이동하기\n", + "- os.rename(old_filepath, new_filepath)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1) \uc0c1\ub300 \uacbd\ub85c\ub97c \uc808\ub300 \uacbd\ub85c\ub85c \ubcc0\ud658\ud558\uae30\n", - "- os.path.abspath(\uc0c1\ub300\uacbd\ub85c)\n", - " - \uc2e4\uc81c \ud30c\uc77c \uc874\uc7ac\uc640\ub294 \ubb34\uad00\ud558\uac8c \uc808\ub300\uacbd\ub85c\ub85c \ubcc0\uacbd\ud568" + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "print os.path.abspath('o.txt')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/git/python-e-learning/o.txt\n" - ] - } - ], - "prompt_number": 51 - }, + } + ], + "source": [ + "os.rename('t1.txt', 'example/t1.txt') # 현재 작업 디렉토리의 t1.txt를 example에 t1.txt이름으로 옮긴다.\n", + "print(os.access('example/t1.txt', os.F_OK))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) 파일 복사하기\n", + "- shutil 모듈 활용\n", + "- shutil.copyfile(src_filepath, dest_filepath)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) \uc8fc\uc5b4\uc9c4 \uacbd\ub85c\uc758 \ud30c\uc77c\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\n", - "- os.path.exists(filepath)" + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = '/Users/yhhan/git/python-e-learning/sample.txt'\n", - "print os.path.exists(f)\n", - "print os.path.exists('sample.txt')\n", - "print os.path.exists('asdf.txt')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n", - "False\n" - ] - } - ], - "prompt_number": 54 - }, + } + ], + "source": [ + "import shutil\n", + "shutil.copyfile('sample.txt', 'sample_new.txt')\n", + "print(os.access('sample_new.txt', os.F_OK))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 파일 이름 다루기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) 상대 경로를 절대 경로로 변환하기\n", + "- os.path.abspath(상대경로)\n", + " - 실제 파일 존재와는 무관하게 절대경로로 변경함" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 3) \ud604\uc7ac/\ubd80\ubaa8 \ub514\ub809\ud1a0\ub9ac\ub97c \uac00\ub9ac\ud0a4\ub294 \uc774\ub984 \uc5bb\uae30" + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning/o.txt\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print os.curdir #\ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\n", - "print os.pardir #\ubd80\ubaa8 \ub514\ub809\ud1a0\ub9ac" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - ".\n", - "..\n" - ] - } - ], - "prompt_number": 25 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 4) \ub514\ub809\ud1a0\ub9ac \ubd84\ub9ac \ubb38\uc790 \uc5bb\uae30" + } + ], + "source": [ + "import os\n", + "print(os.path.abspath('o.txt'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 주어진 경로의 파일이 존재하는지 확인\n", + "- os.path.exists(filepath)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "False\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print os.sep" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/\n" - ] - } - ], - "prompt_number": 26 - }, + } + ], + "source": [ + "f = '/Users/yhhan/git/python-e-learning/sample.txt'\n", + "print(os.path.exists(f))\n", + "print(os.path.exists('sample.txt'))\n", + "print(os.path.exists('asdf.txt'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) 현재/부모 디렉토리를 가리키는 이름 얻기" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-6 \uacbd\ub85c\uba85 \ubd84\ub9ac\ud558\uae30" + "name": "stdout", + "output_type": "stream", + "text": [ + ".\n", + "..\n" ] - }, + } + ], + "source": [ + "print(os.curdir) #현재 디렉토리\n", + "print(os.pardir) #부모 디렉토리" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4) 디렉토리 분리 문자 얻기" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1) \uacbd\ub85c\uc640 \ud30c\uc77c\uba85\uc73c\ub85c \ubd84\ub9ac" + "name": "stdout", + "output_type": "stream", + "text": [ + "/\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = '/Users/yhhan/git/python-e-learning/t.txt'\n", - "\n", - "print os.path.basename(f) # \ud30c\uc77c\uba85\ub9cc \ucd94\ucd9c\n", - "print os.path.dirname(f) # \ub514\ub809\ud1a0\ub9ac \uacbd\ub85c \ucd94\ucd9c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "t.txt\n", - "/Users/yhhan/git/python-e-learning\n" - ] - } - ], - "prompt_number": 57 - }, + } + ], + "source": [ + "print(os.sep)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-6 경로명 분리하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) 경로와 파일명으로 분리" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) \uacbd\ub85c\uba85\uacfc \ud30c\uc77c\uba85\uc744 \ud55c\ubc88\uc5d0 \ubd84\ub9ac" + "name": "stdout", + "output_type": "stream", + "text": [ + "t.txt\n", + "/Users/yhhan/git/python-e-learning\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print os.path.split(f)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "('/Users/yhhan/git/python-e-learning', 't.txt')\n" - ] - } - ], - "prompt_number": 58 - }, + } + ], + "source": [ + "f = '/Users/yhhan/git/python-e-learning/t.txt'\n", + "\n", + "print(os.path.basename(f)) # 파일명만 추출\n", + "print(os.path.dirname(f)) # 디렉토리 경로 추출" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 경로명과 파일명을 한번에 분리" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 3) MS \uc708\ub3c4\uc6b0\uc988\uc5d0\uc11c \ub4dc\ub77c\uc774\ube0c\uba85\uacfc \ud30c\uc77c \uacbd\ub85c\uba85\uc744 \ubd84\ub9ac" + "name": "stdout", + "output_type": "stream", + "text": [ + "('/Users/yhhan/git/python-e-learning', 't.txt')\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print os.path.splitdrive(f)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "('', '/Users/yhhan/git/python-e-learning/t.txt')\n" - ] - } - ], - "prompt_number": 59 - }, + } + ], + "source": [ + "print(os.path.split(f))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) MS 윈도우즈에서 드라이브명과 파일 경로명을 분리" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 4) \ud655\uc7a5\uc790 \ubd84\ub9ac" + "name": "stdout", + "output_type": "stream", + "text": [ + "('', '/Users/yhhan/git/python-e-learning/t.txt')\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print os.path.splitext(f)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "('/Users/yhhan/git/python-e-learning/t', '.txt')\n" - ] - } - ], - "prompt_number": 60 - }, + } + ], + "source": [ + "print(os.path.splitdrive(f))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4) 확장자 분리" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub514\ub809\ud1a0\ub9ac \ub2e4\ub8e8\uae30\n", - "***" + "name": "stdout", + "output_type": "stream", + "text": [ + "('/Users/yhhan/git/python-e-learning/t', '.txt')\n" ] - }, + } + ], + "source": [ + "print(os.path.splitext(f))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 디렉토리 다루기\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 디렉토리에 관련된 일반 작업" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) 현재 작업 디렉토리 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ub514\ub809\ud1a0\ub9ac\uc5d0 \uad00\ub828\ub41c \uc77c\ubc18 \uc791\uc5c5" + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning\n" ] - }, + } + ], + "source": [ + "import os\n", + "print(os.getcwd())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 작업 디렉토리 변경하기" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1) \ud604\uc7ac \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac \uc54c\uc544\ubcf4\uae30" + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/Public\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "print os.getcwd()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/git/python-e-learning\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac \ubcc0\uacbd\ud558\uae30" + } + ], + "source": [ + "os.chdir('/Users/yhhan/Public/')\n", + "print(os.getcwd())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) 디렉토리 만들기" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "ename": "OSError", + "evalue": "[Errno 17] File exists: 'temp'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmkdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 0755 기본 모드(rwxr-xr-x)로 만들어짐\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmkdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp2'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0700\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 0700 모드(rwx------)로 만들어짐\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmakedirs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp/level1/level2'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#0755 기본 모드, 중간에 필요한 디렉토리도 모두생성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mOSError\u001b[0m: [Errno 17] File exists: 'temp'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.chdir('/Users/yhhan/Public/')\n", - "print os.getcwd()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/Public\n" - ] - } - ], - "prompt_number": 20 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 3) \ub514\ub809\ud1a0\ub9ac \ub9cc\ub4e4\uae30" + } + ], + "source": [ + "import os\n", + "\n", + "os.mkdir('temp') # 0755 기본 모드(rwxr-xr-x)로 만들어짐\n", + "# os.mkdir('temp2', 0700) # 0700 모드(rwx------)로 만들어짐\n", + "os.mkdir('temp2', 0o700)\n", + "os.makedirs('temp/level1/level2') #0755 기본 모드, 중간에 필요한 디렉토리도 모두생성\n", + "\n", + "print(os.access('/Users/yhhan/Public/temp', os.F_OK))\n", + "print(os.access('/Users/yhhan/Public/temp2', os.F_OK))\n", + "print(os.access('/Users/yhhan/Public/temp/level1/level2', os.F_OK))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4) 디렉토리 삭제" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "os.rmdir('temp2') #디렉토리에 내용이 없을 때 삭제가능" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "ename": "OSError", + "evalue": "[Errno 66] Directory not empty: 'temp'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrmdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#디렉토리에 다른 파일이 있으면 삭제할 수 없음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mOSError\u001b[0m: [Errno 66] Directory not empty: 'temp'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "\n", - "os.mkdir('temp') # 0755 \uae30\ubcf8 \ubaa8\ub4dc(rwxr-xr-x)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\n", - "os.mkdir('temp2', 0700) # 0700 \ubaa8\ub4dc(rwx------)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\n", - "os.makedirs('temp/level1/level2') #0755 \uae30\ubcf8 \ubaa8\ub4dc, \uc911\uac04\uc5d0 \ud544\uc694\ud55c \ub514\ub809\ud1a0\ub9ac\ub3c4 \ubaa8\ub450\uc0dd\uc131\n", + } + ], + "source": [ + "os.rmdir('temp') #디렉토리에 다른 파일이 있으면 삭제할 수 없음" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 5) 다단계 디렉토리 삭제\n", + "- os.removedirs(filepath)\n", + " - filepath에 지정된 디렉토리들 중 맨 오른쪽 디렉토리 부터 차례차례로 삭제한다.\n", + " - 디렉토리에 다른 파일이 있으면 삭제하기 않고 중단" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [], + "source": [ + "os.removedirs('temp/level1/level2')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 6) 하위 디렉토리까지 모두 한번에 삭제\n", + "- shutil.rmtree() \n", + " - 파일은 물론 하위 디렉토리까지 모두 한번에 삭제 가능\n", + " - 조심해서 사용해야 함" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "import shutil\n", + "shutil.rmtree('temp')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 7) 디렉토리 복사\n", + "- shutil.copytree(src_filepath, dest_filepath)\n", + " - 하위 디렉토리와 파일등을 지니고 있는 디렉토리를 복사" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "os.mkdir('temp') \n", + "# os.mkdir('temp/temp2', 0700)\n", + "os.mkdir('temp/temp2', 0o700)\n", + "shutil.copytree('temp', 'myweb_backup')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 디렉토리(트리) 탐색하기\n", + "- os.walk(filepath)\n", + " - filepath 부터 시작하여 재귀적으로 모든 하위 디렉토리까지 탐색을 하는 함수\n", + " - 탐색시 발견하는 모든 파일에 대해서는 다음 튜플을 리턴함\n", + " - (dirpath, dirnames, filemnames)\n", + " - dirpath: 탐색하고 있는 디렉토리 경로\n", + " - dirnames: dirpath 안에 존재하는 서브 디렉토리의 리스트\n", + " - filenames: dirpath 안에 존재하는 파일 리스트" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래 예는 현재 디렉토리부터 모든 하위 디렉토리 내에 존재하는 모든 pyc 파일을 삭제하는 프로그램" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning\n", "\n", - "print os.access('/Users/yhhan/Public/temp', os.F_OK)\n", - "print os.access('/Users/yhhan/Public/temp2', os.F_OK)\n", - "print os.access('/Users/yhhan/Public/temp/level1/level2', os.F_OK)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "OSError", - "evalue": "[Errno 17] File exists: 'temp'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmkdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 0755 \uae30\ubcf8 \ubaa8\ub4dc(rwxr-xr-x)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmkdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp2'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0700\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 0700 \ubaa8\ub4dc(rwx------)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmakedirs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp/level1/level2'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#0755 \uae30\ubcf8 \ubaa8\ub4dc, \uc911\uac04\uc5d0 \ud544\uc694\ud55c \ub514\ub809\ud1a0\ub9ac\ub3c4 \ubaa8\ub450\uc0dd\uc131\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mOSError\u001b[0m: [Errno 17] File exists: 'temp'" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 4) \ub514\ub809\ud1a0\ub9ac \uc0ad\uc81c" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.rmdir('temp2') #\ub514\ub809\ud1a0\ub9ac\uc5d0 \ub0b4\uc6a9\uc774 \uc5c6\uc744 \ub54c \uc0ad\uc81c\uac00\ub2a5" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 42 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.rmdir('temp') #\ub514\ub809\ud1a0\ub9ac\uc5d0 \ub2e4\ub978 \ud30c\uc77c\uc774 \uc788\uc73c\uba74 \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc74c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "OSError", - "evalue": "[Errno 66] Directory not empty: 'temp'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrmdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#\ub514\ub809\ud1a0\ub9ac\uc5d0 \ub2e4\ub978 \ud30c\uc77c\uc774 \uc788\uc73c\uba74 \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc74c\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mOSError\u001b[0m: [Errno 66] Directory not empty: 'temp'" - ] - } - ], - "prompt_number": 43 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 5) \ub2e4\ub2e8\uacc4 \ub514\ub809\ud1a0\ub9ac \uc0ad\uc81c\n", - "- os.removedirs(filepath)\n", - " - filepath\uc5d0 \uc9c0\uc815\ub41c \ub514\ub809\ud1a0\ub9ac\ub4e4 \uc911 \ub9e8 \uc624\ub978\ucabd \ub514\ub809\ud1a0\ub9ac \ubd80\ud130 \ucc28\ub840\ucc28\ub840\ub85c \uc0ad\uc81c\ud55c\ub2e4.\n", - " - \ub514\ub809\ud1a0\ub9ac\uc5d0 \ub2e4\ub978 \ud30c\uc77c\uc774 \uc788\uc73c\uba74 \uc0ad\uc81c\ud558\uae30 \uc54a\uace0 \uc911\ub2e8" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.removedirs('temp/level1/level2')" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 79 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 6) \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uae4c\uc9c0 \ubaa8\ub450 \ud55c\ubc88\uc5d0 \uc0ad\uc81c\n", - "- shutil.rmtree() \n", - " - \ud30c\uc77c\uc740 \ubb3c\ub860 \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uae4c\uc9c0 \ubaa8\ub450 \ud55c\ubc88\uc5d0 \uc0ad\uc81c \uac00\ub2a5\n", - " - \uc870\uc2ec\ud574\uc11c \uc0ac\uc6a9\ud574\uc57c \ud568" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import shutil\n", - "shutil.rmtree('temp')" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 22 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 7) \ub514\ub809\ud1a0\ub9ac \ubcf5\uc0ac\n", - "- shutil.copytree(src_filepath, dest_filepath)\n", - " - \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uc640 \ud30c\uc77c\ub4f1\uc744 \uc9c0\ub2c8\uace0 \uc788\ub294 \ub514\ub809\ud1a0\ub9ac\ub97c \ubcf5\uc0ac" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.mkdir('temp') \n", - "os.mkdir('temp/temp2', 0700)\n", - "shutil.copytree('temp', 'myweb_backup')" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 23 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ub514\ub809\ud1a0\ub9ac(\ud2b8\ub9ac) \ud0d0\uc0c9\ud558\uae30\n", - "- os.walk(filepath)\n", - " - filepath \ubd80\ud130 \uc2dc\uc791\ud558\uc5ec \uc7ac\uadc0\uc801\uc73c\ub85c \ubaa8\ub4e0 \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uae4c\uc9c0 \ud0d0\uc0c9\uc744 \ud558\ub294 \ud568\uc218\n", - " - \ud0d0\uc0c9\uc2dc \ubc1c\uacac\ud558\ub294 \ubaa8\ub4e0 \ud30c\uc77c\uc5d0 \ub300\ud574\uc11c\ub294 \ub2e4\uc74c \ud29c\ud50c\uc744 \ub9ac\ud134\ud568\n", - " - (dirpath, dirnames, filemnames)\n", - " - dirpath: \ud0d0\uc0c9\ud558\uace0 \uc788\ub294 \ub514\ub809\ud1a0\ub9ac \uacbd\ub85c\n", - " - dirnames: dirpath \uc548\uc5d0 \uc874\uc7ac\ud558\ub294 \uc11c\ube0c \ub514\ub809\ud1a0\ub9ac\uc758 \ub9ac\uc2a4\ud2b8\n", - " - filenames: dirpath \uc548\uc5d0 \uc874\uc7ac\ud558\ub294 \ud30c\uc77c \ub9ac\uc2a4\ud2b8" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc544\ub798 \uc608\ub294 \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\ubd80\ud130 \ubaa8\ub4e0 \ud558\uc704 \ub514\ub809\ud1a0\ub9ac \ub0b4\uc5d0 \uc874\uc7ac\ud558\ub294 \ubaa8\ub4e0 pyc \ud30c\uc77c\uc744 \uc0ad\uc81c\ud558\ub294 \ud504\ub85c\uadf8\ub7a8" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "os.chdir('/Users/yhhan/git/python-e-learning')\n", - "print os.getcwd()\n", - "print\n", - "for path, subdirs, files in os.walk(os.getcwd()):\n", - " for fname in files:\n", - " if fname.endswith('.pyc'):\n", - " fullpath = os.path.join(path, fname)\n", - " print 'removing', fullpath\n", - " os.remove(fullpath)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/git/python-e-learning\n", - "\n", - "removing /Users/yhhan/git/python-e-learning/module_test.pyc\n", - "removing /Users/yhhan/git/python-e-learning/mymath.pyc\n" - ] - } - ], - "prompt_number": 24 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + "removing /Users/yhhan/git/python-e-learning/module_test.pyc\n", + "removing /Users/yhhan/git/python-e-learning/mymath.pyc\n" ] } ], - "metadata": {} + "source": [ + "import os\n", + "os.chdir('/Users/yhhan/git/python-e-learning')\n", + "print(os.getcwd())\n", + "print()\n", + "for path, subdirs, files in os.walk(os.getcwd()):\n", + " for fname in files:\n", + " if fname.endswith('.pyc'):\n", + " fullpath = os.path.join(path, fname)\n", + " print('removing', fullpath)\n", + " os.remove(fullpath)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.3" } - ] -} \ No newline at end of file + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python15.ipynb b/python3.6/python15.ipynb index 26ce69d..7172a43 100644 --- a/python3.6/python15.ipynb +++ b/python3.6/python15.ipynb @@ -1,1117 +1,1063 @@ { - "metadata": { - "name": "", - "signature": "sha256:656b15dd9bebc0387448c683e6aac1bb080f9d09a975f111de451b9e13225fec" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 15. \ud30c\uc774\uc36c \ud568\uc218\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud568\uc218\uc758 \uc815\uc758\uc640 \ud638\ucd9c\n", - "***\n", - "- \ud568\uc218: \uc5ec\ub7ec \uac1c\uc758 Statement\ub4e4\uc744 \ud558\ub098\ub85c \ubb36\uc740 \ub2e8\uc704\n", - "- \ud568\uc218 \uc0ac\uc6a9\uc758 \uc7a5\uc810\n", - " - \ubc18\ubcf5\uc801\uc778 \uc218\ud589\uc774 \uac00\ub2a5\ud558\ub2e4\n", - " - \ucf54\ub4dc\ub97c \ub17c\ub9ac\uc801\uc73c\ub85c \uc774\ud574\ud558\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc900\ub2e4\n", - " - \ucf54\ub4dc\uc758 \uc77c\uc815 \ubd80\ubd84\uc744 \ubcc4\ub3c4\uc758 \ub17c\ub9ac\uc801 \uac1c\ub150\uc73c\ub85c \ub3c5\ub9bd\ud654\ud560 \uc218 \uc788\uc74c\n", - " - \uc218\ud559\uc5d0\uc11c \ubcf5\uc7a1\ud55c \uac1c\ub150\uc744 \ud558\ub098\uc758 \ub2e8\uc21c\ud55c \uae30\ud638\ub85c \ub300\uce58\ud558\ub294 \uac83\uacfc \ube44\uc2b7" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \uac04\ub2e8\ud55c \ud568\uc218\uc758 \uc815\uc758\n", - "- \ud568\uc218 \uc815\uc758\uc2dc \uc0ac\uc6a9\ud558\ub294 \ud0a4\uc6cc\ub4dc: def" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a, b):\n", - " return a+b\n", - "\n", - "print add(1, 2)\n", - "print\n", - "\n", - "def myabs(x):\n", - " if x < 0 : \n", - " x = -x\n", - " return x\n", - "\n", - "print abs(-4)\n", - "print myabs(-4)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3\n", - "\n", - "4\n", - "4\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \ud568\uc218 \uac1d\uccb4\uc640 \ud568\uc218 \ud638\ucd9c\n", - "- \ud568\uc218\uc758 \uc774\ub984 \uc790\uccb4\ub294 \ud568\uc218 \uac1d\uccb4\uc758 \ub808\ud37c\ub7f0\uc2a4(Reference)\ub97c \uc9c0\ub2c8\uace0 \uc788\ub2e4." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a, b):\n", - " return a + b\n", - "\n", - "print add" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c = add(10, 30)\n", - "print c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "40\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc774\ub984\uc5d0 \uc800\uc7a5\ub41c \ub808\ud37c\ub7f0\uc2a4\ub97c \ub2e4\ub978 \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud558\uc5ec \uadf8 \ubcc0\uc218\ub97c \uc774\uc6a9\ud55c \ud568\uc218 \ud638\ucd9c \uac00\ub2a5 " - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = add\n", - "print f(4, 5)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "9\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print f\n", - "\n", - "print f is add" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "True\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218\uc758 \ubab8\uccb4\uc5d0\ub294 \ucd5c\uc18c\ud55c \ud55c\uac1c \uc774\uc0c1\uc758 statement\uac00 \uc874\uc7ac\ud574\uc57c \ud568\n", - " - \uc544\ubb34\ub7f0 \ub0b4\uc6a9\uc774 \uc5c6\ub294 \ubab8\uccb4\ub97c \uc9c0\ub2cc \ud568\uc218\ub97c \ub9cc\ub4e4 \ub54c\uc5d0\ub294 pass \ub77c\ub294 \ud0a4\uc6cc\ub4dc\ub97c \ubab8\uccb4\uc5d0 \uc801\uc5b4\uc8fc\uc5b4\uc57c \ud568" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def simpleFunction():\n", - " pass\n", - "\n", - "simpleFunction()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 8 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc0ac\uc6a9 \uc608" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def addmember(members, newmember):\n", - " if newmember not in members: # \uae30\uc874 \uba64\ubc84\uac00 \uc544\ub2c8\uba74\n", - " members.append(newmember) # \ucd94\uac00\n", - "\n", - "members = ['hwang', 'lee', 'park', 'youn'] # \ub9ac\uc2a4\ud2b8\uc5d0 \ucd08\uae30 \uba64\ubc84 \uc124\uc815\n", - "\n", - "addmember(members, 'jo') # \uc0c8\ub85c\uc6b4 \uba64\ubc84 \ucd94\uac00\n", - "\n", - "addmember(members, 'hwang') # (\uc774\ubbf8 \uc874\uc7ac\ud558\ub294) \uc0c8\ub85c\uc6b4 \uba64\ubc84 \ucd94\uac00\n", + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 15. 파이썬 함수\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 함수의 정의와 호출\n", + "***\n", + "- 함수: 여러 개의 Statement들을 하나로 묶은 단위\n", + "- 함수 사용의 장점\n", + " - 반복적인 수행이 가능하다\n", + " - 코드를 논리적으로 이해하는 데 도움을 준다\n", + " - 코드의 일정 부분을 별도의 논리적 개념으로 독립화할 수 있음\n", + " - 수학에서 복잡한 개념을 하나의 단순한 기호로 대치하는 것과 비슷" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 간단한 함수의 정의\n", + "- 함수 정의시 사용하는 키워드: def" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", "\n", - "print members" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['hwang', 'lee', 'park', 'youn', 'jo']\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ud568\uc218 \uc778\uc218\uac12 \uc804\ub2ec\ubc29\ubc95\n", - "- \ud30c\uc774\uc36c\uc5d0\uc11c\uc758 \uc778\uc218\uac12 \uc804\ub2ec \ubc29\ubc95\n", - " - \uae30\ubcf8\uc801\uc73c\ub85c \uac12\uc5d0 \uc758\ud55c \ud638\ucd9c(Call-by-Value)\n", - " - \ud558\uc9c0\ub9cc \ubcc0\uc218\uc5d0 \uc800\uc7a5\ub41c \uac12\uc774 \ucc38\uc870\uac12(Reference)\uc774\ubbc0\ub85c \uc2e4\uc81c\ub85c\ub294 \ucc38\uc870\uc5d0 \uc758\ud55c \ud638\ucd9c(Call-by-Reference)\ub85c \uc2e4\ud589\ub428" + "4\n", + "4\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc778\uc790\uc5d0 \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) \uac1d\uccb4\uc778 \uc22b\uc790\uac12\uc744 \uc804\ub2ec\n", - " - \ud568\uc218 \ub0b4\uc5d0\uc11c \ub2e4\ub978 \uc22b\uc790\uac12\uc73c\ub85c \uce58\ud658 --> \uc758\ubbf8 \uc5c6\ub294 \uc778\uc790 \uc804\ub2ec" + } + ], + "source": [ + "def add(a, b):\n", + " return a+b\n", + "\n", + "print(add(1, 2))\n", + "print()\n", + "\n", + "def myabs(x):\n", + " if x < 0 : \n", + " x = -x\n", + " return x\n", + "\n", + "print(abs(-4))\n", + "print(myabs(-4))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 함수 객체와 함수 호출\n", + "- 함수의 이름 자체는 함수 객체의 레퍼런스(Reference)를 지니고 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f1(b):\n", - " b = 100\n", - "\n", - "a = 200\n", - "f1(a)\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "200\n" - ] - } - ], - "prompt_number": 23 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/function_arg_int.png)" + } + ], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "print(add)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "40\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc778\uc790\uc5d0 \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) \uac1d\uccb4\uc778 \ubb38\uc790\uc5f4\uc744 \uc804\ub2ec\n", - " - \ud568\uc218 \ub0b4\uc5d0\uc11c \ub2e4\ub978 \ubb38\uc790\uc5f4\ub85c \uce58\ud658 --> \uc758\ubbf8 \uc5c6\ub294 \uc778\uc790 \uc804\ub2ec" + } + ], + "source": [ + "c = add(10, 30)\n", + "print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 이름에 저장된 레퍼런스를 다른 변수에 할당하여 그 변수를 이용한 함수 호출 가능 " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f2(b):\n", - " b = \"abc\"\n", - "\n", - "a = \"def\"\n", - "f2(a)\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "def\n" - ] - } - ], - "prompt_number": 26 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/function_arg_str.png)" + } + ], + "source": [ + "f = add\n", + "print(f(4, 5))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "True\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc778\uc790\uc5d0 \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) \uac1d\uccb4\uc778 \ud29c\ud50c\uc744 \uc804\ub2ec\n", - " - \ud568\uc218 \ub0b4\uc5d0\uc11c \ub2e4\ub978 \ud29c\ud50c\ub85c \uce58\ud658 --> \uc758\ubbf8 \uc5c6\ub294 \uc778\uc790 \uc804\ub2ec" + } + ], + "source": [ + "print(f)\n", + "\n", + "print(f is add)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수의 몸체에는 최소한 한개 이상의 statement가 존재해야 함\n", + " - 아무런 내용이 없는 몸체를 지닌 함수를 만들 때에는 pass 라는 키워드를 몸체에 적어주어야 함" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def simpleFunction():\n", + " pass\n", + "\n", + "simpleFunction()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 사용 예" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['hwang', 'lee', 'park', 'youn', 'jo']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f3(b):\n", - " b = (1,2,3)\n", - "\n", - "a = (4,5,6)\n", - "f3(a)\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "(4, 5, 6)\n" - ] - } - ], - "prompt_number": 27 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/function_arg_tuple.png)" + } + ], + "source": [ + "def addmember(members, newmember):\n", + " if newmember not in members: # 기존 멤버가 아니면\n", + " members.append(newmember) # 추가\n", + "\n", + "members = ['hwang', 'lee', 'park', 'youn'] # 리스트에 초기 멤버 설정\n", + "\n", + "addmember(members, 'jo') # 새로운 멤버 추가\n", + "\n", + "addmember(members, 'hwang') # (이미 존재하는) 새로운 멤버 추가\n", + "\n", + "print(members)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 함수 인수값 전달방법\n", + "- 파이썬에서의 인수값 전달 방법\n", + " - 기본적으로 값에 의한 호출(Call-by-Value)\n", + " - 하지만 변수에 저장된 값이 참조값(Reference)이므로 실제로는 참조에 의한 호출(Call-by-Reference)로 실행됨" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 인자에 변경불가능(Immutable) 객체인 숫자값을 전달\n", + " - 함수 내에서 다른 숫자값으로 치환 --> 의미 없는 인자 전달" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "200\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc778\uc790\uc5d0 \ubcc0\uacbd\uac00\ub2a5\ud55c(Mutable)\ud55c \uac1d\uccb4\uc778 \ub9ac\uc2a4\ud2b8 \uc804\ub2ec \ubc0f \ub0b4\uc6a9 \uc218\uc815\n", - " - \uc804\ud615\uc801\uc778 \ud568\uc218 \uc778\uc790 \uc804\ub2ec\ubc95 \ubc0f \ud65c\uc6a9\ubc95" + } + ], + "source": [ + "def f1(b):\n", + " b = 100\n", + "\n", + "a = 200\n", + "f1(a)\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/function_arg_int.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 인자에 변경불가능(Immutable) 객체인 문자열을 전달\n", + " - 함수 내에서 다른 문자열로 치환 --> 의미 없는 인자 전달" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "def\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f4(b):\n", - " b[1] = 10\n", - "\n", - "a = [4,5,6]\n", - "f4(a)\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[4, 10, 6]\n" - ] - } - ], - "prompt_number": 30 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/function_arg_list.png)" + } + ], + "source": [ + "def f2(b):\n", + " b = \"abc\"\n", + "\n", + "a = \"def\"\n", + "f2(a)\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/function_arg_str.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 인자에 변경불가능(Immutable) 객체인 튜플을 전달\n", + " - 함수 내에서 다른 튜플로 치환 --> 의미 없는 인자 전달" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(4, 5, 6)\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc778\uc790\uc5d0 \ubcc0\uacbd\uac00\ub2a5\ud55c(Mutable)\ud55c \uac1d\uccb4\uc778 \uc0ac\uc804 \uc804\ub2ec \ubc0f \ub0b4\uc6a9 \uc218\uc815\n", - " - \uc804\ud615\uc801\uc778 \ud568\uc218 \uc778\uc790 \uc804\ub2ec\ubc95 \ubc0f \ud65c\uc6a9\ubc95" + } + ], + "source": [ + "def f3(b):\n", + " b = (1,2,3)\n", + "\n", + "a = (4,5,6)\n", + "f3(a)\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/function_arg_tuple.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 인자에 변경가능한(Mutable)한 객체인 리스트 전달 및 내용 수정\n", + " - 전형적인 함수 인자 전달법 및 활용법" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4, 10, 6]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f5(b):\n", - " b['a'] = 10\n", - "\n", - "a = {\"a\":1, \"b\":2}\n", - "f5(a)\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'a': 10, 'b': 2}\n" - ] - } - ], - "prompt_number": 33 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/function_arg_dict.png)" + } + ], + "source": [ + "def f4(b):\n", + " b[1] = 10\n", + "\n", + "a = [4,5,6]\n", + "f4(a)\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/function_arg_list.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 인자에 변경가능한(Mutable)한 객체인 사전 전달 및 내용 수정\n", + " - 전형적인 함수 인자 전달법 및 활용법" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'a': 10, 'b': 2}\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ubc18\ud658(return)\ubb38" + } + ], + "source": [ + "def f5(b):\n", + " b['a'] = 10\n", + "\n", + "a = {\"a\":1, \"b\":2}\n", + "f5(a)\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](images/function_arg_dict.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 반환(return)문" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 인수 없이 return 문을 사용하면 실제로는 None 객체가 전달된다.\n", + " - None 객체: 파이썬 내장 객체로서 아무 값도 없음을 나타내기 위한 객체" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc778\uc218 \uc5c6\uc774 return \ubb38\uc744 \uc0ac\uc6a9\ud558\uba74 \uc2e4\uc81c\ub85c\ub294 None \uac1d\uccb4\uac00 \uc804\ub2ec\ub41c\ub2e4.\n", - " - None \uac1d\uccb4: \ud30c\uc774\uc36c \ub0b4\uc7a5 \uac1d\uccb4\ub85c\uc11c \uc544\ubb34 \uac12\ub3c4 \uc5c6\uc74c\uc744 \ub098\ud0c0\ub0b4\uae30 \uc704\ud55c \uac1d\uccb4" + } + ], + "source": [ + "def nothing():\n", + " return\n", + "\n", + "print(nothing())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- return문 없이 리턴하기" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1. Snack\n", + "2. Snake\n", + "3. Snick\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def nothing():\n", - " return\n", - "\n", - "print nothing()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "None\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- return\ubb38 \uc5c6\uc774 \ub9ac\ud134\ud558\uae30" + } + ], + "source": [ + "def print_menu():\n", + " print('1. Snack')\n", + " print('2. Snake')\n", + " print('3. Snick')\n", + " \n", + "print_menu()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- return문 없는 함수라고 할 지라도 실제로는 None 객체가 전달됨" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1. Snack\n", + "2. Snake\n", + "3. Snick\n", + "None\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def print_menu():\n", - " print '1. Snack'\n", - " print '2. Snake'\n", - " print '3. Snick'\n", - " \n", - "print_menu()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1. Snack\n", - "2. Snake\n", - "3. Snick\n" - ] - } - ], - "prompt_number": 38 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- return\ubb38 \uc5c6\ub294 \ud568\uc218\ub77c\uace0 \ud560 \uc9c0\ub77c\ub3c4 \uc2e4\uc81c\ub85c\ub294 None \uac1d\uccb4\uac00 \uc804\ub2ec\ub428" + } + ], + "source": [ + "a = print_menu()\n", + "\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 한 개의 값을 리턴할 때" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = print_menu()\n", + } + ], + "source": [ + "def abs(x):\n", + " if x < 0 : return -x\n", + " return x\n", + "\n", + "print(abs(-10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 두 개 이상의 값을 리턴할 때" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10 20\n", "\n", - "print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1. Snack\n", - "2. Snake\n", - "3. Snick\n", - "None\n" - ] - } - ], - "prompt_number": 50 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud55c \uac1c\uc758 \uac12\uc744 \ub9ac\ud134\ud560 \ub54c" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def abs(x):\n", - " if x < 0 : return -x\n", - " return x\n", + "20 10\n", "\n", - "print abs(-10)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "10\n" - ] - } - ], - "prompt_number": 40 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub450 \uac1c \uc774\uc0c1\uc758 \uac12\uc744 \ub9ac\ud134\ud560 \ub54c" + "20 10\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def swap(x, y):\n", - " return y, x # \ud29c\ud50c\ub85c \ub9ac\ud134\ub41c\ub2e4.\n", - "\n", - "a = 10\n", - "b = 20\n", - "print a, b\n", - "print \n", - "\n", - "a, b = swap(a, b) # \uacb0\uacfc\uc801\uc73c\ub85c a, b = b, a\uc640 \ub3d9\uc77c\n", - "print a, b\n", - "print\n", - "\n", - "a = 10\n", - "b = 20\n", - "x = swap(a, b)\n", - "print x[0], x[1] # \ud558\ub098\uc758 \uc774\ub984\uc73c\ub85c \ud29c\ud50c\uc744 \ubc1b\uc544\uc11c \ucc98\ub9ac\ud560 \uc218 \ub3c4\uc788\ub2e4." - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "10 20\n", - "\n", - "20 10\n", - "\n", - "20 10\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8\ub97c \ub9ac\ud134\ud558\ub294 \ud568\uc218 \uc608\n", - " - \ubb38\uc790\uc5f4 \ub9ac\uc2a4\ud2b8\ub97c \ubc1b\uc544\uc11c \uac01 \ubb38\uc790\uc5f4\uc758 \uae38\uc774 \uc815\ubcf4\ub97c \uc9c0\ub2cc \ub9ac\uc2a4\ud2b8\ub97c \ub9ac\ud134 " + } + ], + "source": [ + "def swap(x, y):\n", + " return y, x # 튜플로 리턴된다.\n", + "\n", + "a = 10\n", + "b = 20\n", + "print(a, b)\n", + "print()\n", + "\n", + "a, b = swap(a, b) # 결과적으로 a, b = b, a와 동일\n", + "print(a, b)\n", + "print()\n", + "\n", + "a = 10\n", + "b = 20\n", + "x = swap(a, b)\n", + "print(x[0], x[1]) # 하나의 이름으로 튜플을 받아서 처리할 수 도있다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 새로운 리스트를 리턴하는 함수 예\n", + " - 문자열 리스트를 받아서 각 문자열의 길이 정보를 지닌 리스트를 리턴 " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[6, 5, 7, 5]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def length_list(l):\n", - " res = []\n", - " for el in l:\n", - " res.append(len(el))\n", - " return res\n", - "\n", - "l = ['python', 'pyson', 'pythong', 'pydon']\n", - "print length_list(l)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[6, 5, 7, 5]\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l = ['python', 'pyson', 'pythong', 'pydon']\n", - "print [len(s) for s in l]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[6, 5, 7, 5]\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-5 \ud568\uc218 \uc778\uc790\uc5d0 \ub300\ud55c \ub3d9\uc801\uc778 \uc790\ub8cc\ud615 \uacb0\uc815\n", - "- \ud30c\uc774\uc36c\uc5d0\uc11c\ub294 \ubaa8\ub4e0 \uac1d\uccb4\ub294 \ub3d9\uc801\uc73c\ub85c (\uc2e4\ud589\uc2dc\uac04\uc5d0) \uadf8 \ud0c0\uc785\uc774 \uacb0\uc815\ub41c\ub2e4.\n", - "- \uadf8\ub7ec\ubbc0\ub85c, \ud568\uc218 \uc778\uc790\ub294 \ud568\uc218\uac00 \ud638\ucd9c\ub418\ub294 \uc21c\uac04 \ud574\ub2f9 \uc778\uc790\uc5d0 \uc804\ub2ec\ub418\ub294 \uac1d\uccb4\uc5d0 \ub530\ub77c \uadf8 \ud0c0\uc785\uc774 \uacb0\uc815\ub41c\ub2e4.\n", - " - \ud568\uc218 \ubab8\uccb4 \ub0b4\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \uc5ec\ub7ec\uac00\uc9c0 \uc5f0\uc0b0\uc790\ub4e4\uc740 \ud568\uc218 \ud638\ucd9c\uc2dc\uc5d0 \uacb0\uc815\ub41c \uac1d\uccb4 \ud0c0\uc785\uc5d0 \ub9de\uac8c \uc2e4\ud589\ub41c\ub2e4." + } + ], + "source": [ + "def length_list(l):\n", + " res = []\n", + " for el in l:\n", + " res.append(len(el))\n", + " return res\n", + "\n", + "l = ['python', 'pyson', 'pythong', 'pydon']\n", + "print(length_list(l))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[6, 5, 7, 5]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def add(a, b):\n", - " return a + b\n", - "\n", - "c = add(1, 3.4)\n", - "d = add('dynamic', 'typing')\n", - "e = add(['list'], ['and', 'list'])\n", - "print c\n", - "print d\n", - "print e" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "4.4\n", - "dynamictyping\n", - "['list', 'and', 'list']\n" - ] - } - ], - "prompt_number": 49 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ud568\uc218 \uc778\uc218 \ucc98\ub9ac\n", - "***" + } + ], + "source": [ + "l = ['python', 'pyson', 'pythong', 'pydon']\n", + "print([len(s) for s in l])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 함수 인자에 대한 동적인 자료형 결정\n", + "- 파이썬에서는 모든 객체는 동적으로 (실행시간에) 그 타입이 결정된다.\n", + "- 그러므로, 함수 인자는 함수가 호출되는 순간 해당 인자에 전달되는 객체에 따라 그 타입이 결정된다.\n", + " - 함수 몸체 내에서 사용되는 여러가지 연산자들은 함수 호출시에 결정된 객체 타입에 맞게 실행된다." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4.4\n", + "dynamictyping\n", + "['list', 'and', 'list']\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \uae30\ubcf8 \uc778\uc218 \uac12\n", - "- \uae30\ubcf8 \uc778\uc218 \uac12\n", - " - \ud568\uc218\ub97c \ud638\ucd9c\ud560 \ub54c \uc778\uc218\ub97c \ub118\uaca8\uc8fc\uc9c0 \uc54a\uc544\ub3c4 \uc778\uc218\uac00 \uae30\ubcf8\uc801\uc73c\ub85c \uac00\uc9c0\ub294 \uac12" + } + ], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "c = add(1, 3.4)\n", + "d = add('dynamic', 'typing')\n", + "e = add(['list'], ['and', 'list'])\n", + "print(c)\n", + "print(d)\n", + "print(e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 함수 인수 처리\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 기본 인수 값\n", + "- 기본 인수 값\n", + " - 함수를 호출할 때 인수를 넘겨주지 않아도 인수가 기본적으로 가지는 값" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "12\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def incr(a, step=1):\n", - " return a + step\n", - "\n", - "b = 1\n", - "b = incr(b) # 1 \uc99d\uac00\n", - "print b\n", - "\n", - "b = incr(b, 10) # 10 \uc99d\uac00\n", - "print b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "12\n" - ] - } - ], - "prompt_number": 81 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [\uc8fc\uc758] \ud568\uc218 \uc815\uc758\ub97c \ud560 \ub54c \uae30\ubcf8 \uac12\uc744 \uc9c0\ub2cc \uc778\uc218 \ub4a4\uc5d0 \uc77c\ubc18\uc801\uc778 \uc778\uc218\uac00 \uc62c \uc218 \uc5c6\uc74c" + } + ], + "source": [ + "def incr(a, step=1):\n", + " return a + step\n", + "\n", + "b = 1\n", + "b = incr(b) # 1 증가\n", + "print(b)\n", + "\n", + "b = incr(b, 10) # 10 증가\n", + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [주의] 함수 정의를 할 때 기본 값을 지닌 인수 뒤에 일반적인 인수가 올 수 없음" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "non-default argument follows default argument (, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m def incr(step=1, a):\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-default argument follows default argument\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def incr(step=1, a):\n", - " return a + step" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "non-default argument follows default argument (, line 1)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m def incr(step=1, a):\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-default argument follows default argument\n" - ] - } - ], - "prompt_number": 82 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \uc815\uc758 \uc2dc\uc5d0 \uc5ec\ub7ec \uac1c\uc758 \uae30\ubcf8 \uc778\uc218 \uac12 \uc815\uc758 \uac00\ub2a5" + } + ], + "source": [ + "def incr(step=1, a):\n", + " return a + step" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 정의 시에 여러 개의 기본 인수 값 정의 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "21\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def incr(a, step=1, step2=10):\n", - " return a + step + step2\n", - "\n", - "print incr(10)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "21\n" - ] - } - ], - "prompt_number": 83 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ud0a4\uc6cc\ub4dc \uc778\uc218\n", - "- \ud0a4\uc6cc\ub4dc \uc778\uc218\n", - " - \uc778\uc218 \uac12 \uc804\ub2ec \uc2dc\uc5d0 \uc778\uc218 \uc774\ub984\uacfc \ud568\uaed8 \uac12\uc744 \uc804\ub2ec\ud558\ub294 \ubc29\uc2dd\uc744 \uc77c\uceeb\ub294\ub2e4." + } + ], + "source": [ + "def incr(a, step=1, step2=10):\n", + " return a + step + step2\n", + "\n", + "print(incr(10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 키워드 인수\n", + "- 키워드 인수\n", + " - 인수 값 전달 시에 인수 이름과 함께 값을 전달하는 방식을 일컫는다." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "height string height string height string \n", + "200\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def area(height, width):\n", - " return height * width\n", - "\n", - "#\uc21c\uc11c\uac00 \uc544\ub2cc \uc774\ub984\uc73c\ub85c \uac12\uc774 \uc804\ub2ec\n", - "a = area(height='height string ', width=3)\n", - "print a\n", - "\n", - "b = area(width=20, height=10)\n", - "print b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "height string height string height string \n", - "200\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218\ub97c \ud638\ucd9c \ud560 \ub54c\uc5d0 \ud0a4\uc6cc\ub4dc \uc778\uc218\ub294 \ub9c8\uc9c0\ub9c9\uc5d0 \ub193\uc5ec\uc838\uc57c \ud55c\ub2e4." + } + ], + "source": [ + "def area(height, width):\n", + " return height * width\n", + "\n", + "#순서가 아닌 이름으로 값이 전달\n", + "a = area(height='height string ', width=3)\n", + "print(a)\n", + "\n", + "b = area(width=20, height=10)\n", + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수를 호출 할 때에 키워드 인수는 마지막에 놓여져야 한다." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print area(20, width=5)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "100\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [\uc8fc\uc758] \ud568\uc218 \ud638\ucd9c\uc2dc\uc5d0 \ud0a4\uc6cc\ub4dc \uc778\uc218 \ub4a4\uc5d0 \uc77c\ubc18 \uc778\uc218 \uac12\uc774 \uc62c \uc218 \uc5c6\ub2e4. " + } + ], + "source": [ + "print(area(20, width=5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [주의] 함수 호출시에 키워드 인수 뒤에 일반 인수 값이 올 수 없다. " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "positional argument follows keyword argument (, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m area(width=5, 20)\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m positional argument follows keyword argument\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "area(width=5, 20)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "non-keyword arg after keyword arg (, line 1)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m area(width=5, 20)\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-keyword arg after keyword arg\n" - ] - } - ], - "prompt_number": 80 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uae30\ubcf8 \uc778\uc218\uac12 \ubc0f \ud0a4\uc6cc\ub4dc \uc778\uc218\uc758 \ud63c\uc6a9" + } + ], + "source": [ + "area(width=5, 20)\n", + "# SyntaxError: non-keyword arg after keyword arg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 기본 인수값 및 키워드 인수의 혼용" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "212\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def incr(a, step=1, step2=10, step3=100):\n", - " return a + step + step2 + step3\n", - "\n", - "print incr(10, 2, step2=100)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "212\n" - ] - } - ], - "prompt_number": 88 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \ud638\ucd9c \uc2dc\uc5d0 \ud0a4\uc6cc\ub4dc \uc778\uc218 \ub4a4\uc5d0 \uc77c\ubc18 \uc778\uc218 \uac12\uc774 \uc624\uba74 \uc5d0\ub7ec " + } + ], + "source": [ + "def incr(a, step=1, step2=10, step3=100):\n", + " return a + step + step2 + step3\n", + "\n", + "print(incr(10, 2, step2=100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 호출 시에 키워드 인수 뒤에 일반 인수 값이 오면 에러 " + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "non-keyword arg after keyword arg (, line 4)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m print incr(10, 2, step2=100, 200)\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-keyword arg after keyword arg\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def incr(a, step=1, step2=10, step3=100):\n", - " return a + step + step2 + step3\n", - "\n", - "print incr(10, 2, step2=100, 200)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "non-keyword arg after keyword arg (, line 4)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m print incr(10, 2, step2=100, 200)\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-keyword arg after keyword arg\n" - ] - } - ], - "prompt_number": 89 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def incr(a, step=1, step2=10, step3=100):\n", - " return a + step + step2 + step3\n", - "\n", - "print incr(10, 2, step2=100, step3=200)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "312\n" - ] - } - ], - "prompt_number": 90 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \uac00\ubcc0 \uc778\uc218 \ub9ac\uc2a4\ud2b8\n", - "- \ud568\uc218 \uc815\uc758\uc2dc\uc5d0 \uc77c\ubc18\uc801\uc778 \uc778\uc218 \uc120\uc5b8 \ub4a4\uc5d0 *var \ud615\uc2dd\uc758 \uc778\uc218\ub85c \uac00\ubcc0 \uc778\uc218\ub97c \uc120\uc5b8\ud560 \uc218 \uc788\uc74c\n", - " - var\uc5d0\ub294 \ud568\uc218 \ud638\ucd9c\uc2dc \ub123\uc5b4\uc8fc\ub294 \uc778\uc218 \uac12\ub4e4 \uc911 \uc77c\ubc18 \uc778\uc218\uc5d0 \ud560\ub2f9\ub418\ub294 \uac12\uc744 \uc81c\uc678\ud55c \ub098\uba38\uc9c0 \uac12\ub4e4\uc744 \uc9c0\ub2cc \ud29c\ud50c \uac1d\uccb4\uac00 \ud560\ub2f9\ub41c\ub2e4." + } + ], + "source": [ + "def incr(a, step=1, step2=10, step3=100):\n", + " return a + step + step2 + step3\n", + "\n", + "print(incr(10, 2, step2=100, 200))" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "312\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def varg(a, *arg):\n", - " print a, arg\n", - "\n", - "varg(1)\n", - "varg(2,3)\n", - "varg(2,3,4,5,6)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 ()\n", - "2 (3,)\n", - "2 (3, 4, 5, 6)\n" - ] - } - ], - "prompt_number": 91 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- C\uc5b8\uc5b4\uc758 printf\ubb38\uacfc \uc720\uc0ac\ud55c \ud615\ud0dc\uc758 printf \uc815\uc758 \ubc29\ubc95" + } + ], + "source": [ + "def incr(a, step=1, step2=10, step3=100):\n", + " return a + step + step2 + step3\n", + "\n", + "print(incr(10, 2, step2=100, step3=200))\n", + "# SyntaxError: positional argument follows keyword argument" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 가변 인수 리스트\n", + "- 함수 정의시에 일반적인 인수 선언 뒤에 *var 형식의 인수로 가변 인수를 선언할 수 있음\n", + " - var에는 함수 호출시 넣어주는 인수 값들 중 일반 인수에 할당되는 값을 제외한 나머지 값들을 지닌 튜플 객체가 할당된다." + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 ()\n", + "2 (3,)\n", + "2 (3, 4, 5, 6)\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def printf(format, *args):\n", - " print format % args\n", - "\n", - "printf(\"I've spent %d days and %d night to do this\", 6, 5)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "I've spent 6 days and 5 night to do this\n" - ] - } - ], - "prompt_number": 84 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-5 \ud29c\ud50c \uc778\uc218\uc640 \uc0ac\uc804 \uc778\uc218\ub85c \ud568\uc218 \ud638\ucd9c\ud558\uae30\n", - "- \ud568\uc218 \ud638\ucd9c\uc5d0 \uc0ac\uc6a9\ub420 \uc778\uc218\uac12\ub4e4\uc774 \ud29c\ud50c\uc5d0 \uc788\ub2e4\uba74 \"*\ud29c\ud50c\ubcc0\uc218\"\ub97c \uc774\uc6a9\ud558\uc5ec \ud568\uc218 \ud638\ucd9c\uc774 \uac00\ub2a5" + } + ], + "source": [ + "def varg(a, *arg):\n", + " print(a, arg)\n", + "\n", + "varg(1)\n", + "varg(2,3)\n", + "varg(2,3,4,5,6)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- C언어의 printf문과 유사한 형태의 printf 정의 방법" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I've spent 6 days and 5 night to do this\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def h(a, b, c):\n", - " print a,b,c\n", - " \n", - "args = (1, 2, 3)\n", - "h(*args)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 2 3\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud568\uc218 \ud638\ucd9c\uc5d0 \uc0ac\uc6a9\ub420 \uc778\uc218\uac12\ub4e4\uc774 \uc0ac\uc804\uc5d0 \uc788\ub2e4\uba74 \"*\uc0ac\uc804\ubcc0\uc218\"\ub97c \uc774\uc6a9\ud558\uc5ec \ud568\uc218 \ud638\ucd9c\uc774 \uac00\ub2a5" + } + ], + "source": [ + "def printf(format, *args):\n", + " print(format % args)\n", + "\n", + "printf(\"I've spent %d days and %d night to do this\", 6, 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-5 튜플 인수와 사전 인수로 함수 호출하기\n", + "- 함수 호출에 사용될 인수값들이 튜플에 있다면 \"*튜플변수\"를 이용하여 함수 호출이 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "dargs = {'a':1, 'b':2, 'c':3}\n", - "h(**dargs)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 2 3\n" - ] - } - ], - "prompt_number": 88 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "def h(a, b, c):\n", + " print(a,b,c)\n", + " \n", + "args = (1, 2, 3)\n", + "h(*args)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 호출에 사용될 인수값들이 사전에 있다면 \"*사전변수\"를 이용하여 함수 호출이 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 2 3\n" ] } ], - "metadata": {} + "source": [ + "dargs = {'a':1, 'b':2, 'c':3}\n", + "h(**dargs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python16.ipynb b/python3.6/python16.ipynb index b84b26f..e82f284 100644 --- a/python3.6/python16.ipynb +++ b/python3.6/python16.ipynb @@ -43,9 +43,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -70,9 +68,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -97,9 +93,7 @@ { "cell_type": "code", "execution_count": 99, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -126,9 +120,7 @@ { "cell_type": "code", "execution_count": 100, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -153,9 +145,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -183,9 +173,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -214,9 +202,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -278,9 +264,7 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -309,9 +293,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -343,9 +325,7 @@ { "cell_type": "code", "execution_count": 25, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -370,9 +350,7 @@ { "cell_type": "code", "execution_count": 26, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -397,9 +375,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -426,9 +402,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "print filter(lambda x: x > 2, [1, 2, 3, 34])" @@ -444,9 +418,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -474,9 +446,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "print filter(lambda x: x % 2, [1, 2, 3, 4, 5, 6])" @@ -492,9 +462,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "print filter(lambda x: x % 2 - 1, [1, 2, 3, 4, 5, 6])" @@ -510,9 +478,7 @@ { "cell_type": "code", "execution_count": 77, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -540,9 +506,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -576,9 +540,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -615,9 +577,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -641,9 +601,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -660,9 +618,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -689,9 +645,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -726,7 +680,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.3" + } + }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/python3.6/sample.txt b/python3.6/sample.txt new file mode 100644 index 0000000..eb38943 --- /dev/null +++ b/python3.6/sample.txt @@ -0,0 +1 @@ +Do you work in C, C++, or Java on large projects? We'll show how Python will give you results quicker and more reliably. Are you already scripting in a laguage other than Python? Whatever programming you're doing now, Python can improve it. \ No newline at end of file diff --git a/python3.6/sample_new.txt b/python3.6/sample_new.txt new file mode 100644 index 0000000..eb38943 --- /dev/null +++ b/python3.6/sample_new.txt @@ -0,0 +1 @@ +Do you work in C, C++, or Java on large projects? We'll show how Python will give you results quicker and more reliably. Are you already scripting in a laguage other than Python? Whatever programming you're doing now, Python can improve it. \ No newline at end of file From 48ad1176d8aee2b4552ac3b107a56d88528f0a94 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 6 Nov 2017 19:41:25 +0900 Subject: [PATCH 063/124] ... --- Speech/Recognition/HMM.pyc | Bin 534 -> 0 bytes Speech/Recognition/__init__.pyc | Bin 117 -> 0 bytes Speech/__init__.pyc | Bin 105 -> 0 bytes aaa/__init__.pyc | Bin 102 -> 0 bytes aaa/bbb/__init__.pyc | Bin 106 -> 0 bytes aaa/bbb/ccc.pyc | Bin 224 -> 0 bytes mymath.pyc | Bin 380 -> 0 bytes python3.6/__pycache__/mymath.cpython-36.pyc | Bin 405 -> 0 bytes python3.6/output.txt | 1 + python3.6/python13.ipynb | 352 ++-- python3.6/python14.ipynb | 1721 ++++++++++--------- python3.6/t_new.txt | 4 + 12 files changed, 1134 insertions(+), 944 deletions(-) delete mode 100644 Speech/Recognition/HMM.pyc delete mode 100644 Speech/Recognition/__init__.pyc delete mode 100644 Speech/__init__.pyc delete mode 100644 aaa/__init__.pyc delete mode 100644 aaa/bbb/__init__.pyc delete mode 100644 aaa/bbb/ccc.pyc delete mode 100644 mymath.pyc delete mode 100644 python3.6/__pycache__/mymath.cpython-36.pyc create mode 100644 python3.6/output.txt create mode 100644 python3.6/t_new.txt diff --git a/Speech/Recognition/HMM.pyc b/Speech/Recognition/HMM.pyc deleted file mode 100644 index c0581a0c0427bcad594654b215231f79e53e191d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534 zcmZSn%*(}+r4y0N00oRd+5w1*<$**B149b~Llls~2xc%cq%eUQObjW^48a;KKs6{j zok2P|K{^>3+&zHWgEg3dJiiiFAQ@7Wn3<;mWH6u+#gag=;DXfDCb`b2YG@F z`-2n9QYo>&7^WZO7`Xj@8q7d$5GYK7z$}pK(0oY1a~wb&Ho5sJr8%i~@UZ1%;bZ{- DI^kC} diff --git a/Speech/Recognition/__init__.pyc b/Speech/Recognition/__init__.pyc deleted file mode 100644 index a0f6c28bab027231c1acae2dd63e3f64702ccbaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117 zcmZSn%*(YiQzs&s0SXv_v;zPN@-529mt?!AZ7pnF;Nwq diff --git a/Speech/__init__.pyc b/Speech/__init__.pyc deleted file mode 100644 index 53714fcf7e982ad887975ebf05153b5412e5de09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmZSn%*(YTQzs&s0SXv_v;z4 diff --git a/aaa/bbb/ccc.pyc b/aaa/bbb/ccc.pyc deleted file mode 100644 index 8d9f22258a45249a10904028fa7e229ed3b5cbd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmZSn%*!S7-zhAa0SXv_v;z}hA1F|ks(-v2`GZ1&KabR6Qquj!QBI> z7^23ngcT?jQk0mPrvYRzpb^Dm*%WW9n)u!a(l29Wi|EFfKstc-pd bAZ`$dAi@j|pfa1>{FKt1R6DRSKt2Niq3<7l diff --git a/mymath.pyc b/mymath.pyc deleted file mode 100644 index e85f6462c51191c70e0a2a5fbf6e1cf88fc4b0e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380 zcmZSn%*)jy*&LG000m4y+5w1*)qz9`149&$WMpUoG8h?Bn7|AshEyho6lR8IMh16} z6c&bH4OXDqbotiTfji_l9g;ytz_2sOC=MV|14N7r;=vk>K#rdVkYLaNDJlW+6TxH> zL=+@d%n2lND{~V|GV}^6OPE1wQh-(hWk8x37?VNTKp4aYTfzfmlz{CK0oo-3vk0W7 zgat_CRu*J}EeG3GgwrmN+Qg#NL^dD|wJaUT1OfpEKMjx*g1`jG;vkU65hj6IXinz< Zs<6q;PbtkwwF9}O7-TLR6DKn#GXV8-F{A(h diff --git a/python3.6/__pycache__/mymath.cpython-36.pyc b/python3.6/__pycache__/mymath.cpython-36.pyc deleted file mode 100644 index 5b13453958a9d6c35dece521c030000aa8e3d198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmYjMy-LJD5Z=jd&L|#O2zJ`or0}*luo4L<+8u~kc#XvDnglP|Fq=~X*PT9qt#4ps z?X#q{^bM?>UGQ|^n{RgK@0;;(xbgD(etpLn`y{N4Q18byeCHqo(V5 zs+7CHdL@7%#hF{<%<)RqCOulxwe8`R#n6kYYf56kKXE9iv==GrbU@MXXm?glAlphN mu|Svf3(=+eu)(r!|Bdn2`dQIYWz>A8kKLDbeIkf>#D4&JB~By& diff --git a/python3.6/output.txt b/python3.6/output.txt new file mode 100644 index 0000000..665232c --- /dev/null +++ b/python3.6/output.txt @@ -0,0 +1 @@ +Hello koreatech! diff --git a/python3.6/python13.ipynb b/python3.6/python13.ipynb index 05935ae..d69bc48 100644 --- a/python3.6/python13.ipynb +++ b/python3.6/python13.ipynb @@ -57,13 +57,15 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "/Users/do-hyungkwon/GoogleDrive/git/script_programming/python3.6\n" + "/Users/yhhan/git/python-e-learning/python3.6\n" ] } ], @@ -76,7 +78,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "s = \"\"\"Its power: Python developers typically report \n", @@ -92,36 +96,76 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-3 파일 읽기\n" + "### 1-3 파일 읽기\n", + "- read() 메소드 사용\n", + " - 대용량 파일인 경우 사용 비추천" ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, + "execution_count": 15, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "NameError", - "evalue": "name 'file' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m't.txt'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# f = open('t.txt', 'r')과 동일\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'file' is not defined" + "name": "stdout", + "output_type": "stream", + "text": [ + "Its power: Python developers typically report \n", + "they are able to develop applications in a half\n", + "to a tenth the amount of time it takes them to do\n", + "the same work in such languages as C.\n", + "\n" ] } ], "source": [ - "f = file('t.txt') # f = open('t.txt', 'r')과 동일\n", + "#f = file('t.txt') \n", + "f = open('t.txt', 'r')\n", "s = f.read()\n", - "print(s)" + "print(s)\n", + "print(type(s))" ] }, { - "cell_type": "code", - "execution_count": 4, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- close()을 마지막에 호출하지 않으면 해당 file 객체가 다른 값으로 치환되거나 프로그램이 종료될 때 자동으로 close()가 불리워진다.\n", + " - 하지만 명시적으로 close()를 호출하는 것을 권장함" + ] + }, + { + "cell_type": "markdown", "metadata": {}, + "source": [ + "- with ~ as ~ 사용 추천\n", + " - with ~ as ~ 블럭이 끝나면 자동으로 close()를 해줌 " + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = \"\"\"Its power: Python developers typically report \n", + "they are able to develop applications in a half\n", + "to a tenth the amount of time it takes them to do\n", + "the same work in such languages as C.\"\"\"\n", + "with open('t.txt', 'w') as f:\n", + " f.write(s) # 문자열을 파일에 기록" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -130,22 +174,16 @@ "Its power: Python developers typically report \n", "they are able to develop applications in a half\n", "to a tenth the amount of time it takes them to do\n", - "the same work in such languages as C.\n" + "the same work in such languages as C.\n", + "\n" ] } ], "source": [ - "f = open('t.txt') # f = open('t.txt', 'r')과 동일\n", - "s = f.read()\n", - "print(s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- close()을 마지막에 호출하지 않으면 해당 file 객체가 다른 값으로 치환되거나 프로그램이 종료될 때 자동으로 close()가 불리워진다.\n", - " - 하지만 명시적으로 close()를 호출하는 것을 권장함" + "with open('t.txt', 'r') as f:\n", + " s = f.read()\n", + " print(s)\n", + " print(type(s))" ] }, { @@ -171,20 +209,19 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "execution_count": 6, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 : Its power: Python developers typically report \n", - "\n", "2 : they are able to develop applications in a half\n", - "\n", "3 : to a tenth the amount of time it takes them to do\n", - "\n", - "4 : the same work in such languages as C.\n" + "4 : the same work in such languages as C." ] } ], @@ -192,7 +229,7 @@ "f = open('t.txt')\n", "i = 1\n", "for line in f:\n", - " print(i, \":\", line,)\n", + " print(i, \":\", line, end=\"\")\n", " i += 1\n", "f.close()" ] @@ -207,28 +244,29 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "\n", "1 : Its power: Python developers typically report \n", - "\n", "2 : they are able to develop applications in a half\n", - "\n", "3 : to a tenth the amount of time it takes them to do\n", - "\n", - "4 : the same work in such languages as C.\n" + "4 : the same work in such languages as C." ] } ], "source": [ "f = open('t.txt')\n", "line = f.readline()\n", + "print(type(line))\n", "i = 1\n", "while line:\n", - " print(i, \":\", line,)\n", + " print(i, \":\", line, end=\"\")\n", " line = f.readline()\n", " i += 1\n", "f.close()" @@ -239,39 +277,77 @@ "metadata": {}, "source": [ "- readlines() 사용\n", - " - 각 라인을 모두 읽어서 메모리에 리스트로 저장함" + " - 각 라인을 모두 읽어서 메모리에 리스트로 저장함\n", + " - 대용량 파일인 경우 사용 비추천" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, + "execution_count": 10, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Its power: Python developers typically report \\n', 'they are able to develop applications in a half\\n', 'to a tenth the amount of time it takes them to do\\n', 'the same work in such languages as C.']\n", + "\n", "\n", "1 : Its power: Python developers typically report \n", - "\n", "2 : they are able to develop applications in a half\n", - "\n", "3 : to a tenth the amount of time it takes them to do\n", - "\n", - "4 : the same work in such languages as C.\n" + "4 : the same work in such languages as C." ] } ], "source": [ "f = open('t.txt')\n", "print(f.readlines())\n", + "print(type(f.readlines()))\n", "print()\n", "\n", "f.seek(0)\n", "i = 1\n", "for line in f.readlines():\n", - " print(i, \":\", line,)\n", + " print(i, \":\", line, end=\"\")\n", + " i += 1\n", + "f.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Its power: Python developers typically report \\n', 'they are able to develop applications in a half\\n', 'to a tenth the amount of time it takes them to do\\n', 'the same work in such languages as C.']\n", + "\n", + "\n", + "1 : Its power: Python developers typically report \n", + "2 : they are able to develop applications in a half\n", + "3 : to a tenth the amount of time it takes them to do\n", + "4 : the same work in such languages as C." + ] + } + ], + "source": [ + "f = open('t.txt')\n", + "print(f.readlines())\n", + "print(type(f.readlines()))\n", + "print()\n", + "f.close()\n", + "\n", + "f = open('t.txt')\n", + "i = 1\n", + "for line in f.readlines():\n", + " print(i, \":\", line, end=\"\")\n", " i += 1\n", "f.close()" ] @@ -280,13 +356,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- xreadlines() 사용" + "- xreadlines() 사용 (python3에서는 지원하지 않는 메소드)\n", + " - python3에서는 xreadlines()사용과 파일 객체의 반복자 사용하는 경우와 동일함.\n", + " " ] }, { "cell_type": "code", "execution_count": 10, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "AttributeError", @@ -313,26 +393,6 @@ "f.close()" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "f = open('t.txt')\n", - "print(f.readlines())\n", - "print()\n", - "\n", - "f.seek(0)\n", - "i = 1\n", - "for line in f.readlines():\n", - " print(i, \":\", line,)\n", - " i += 1\n", - "f.close()" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -349,8 +409,10 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, + "execution_count": 13, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -370,7 +432,6 @@ "f.close()\n", "\n", "f = open('t1.txt')\n", - "f.seek(0)\n", "print(f.read())\n", "f.close()" ] @@ -384,8 +445,10 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, + "execution_count": 14, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -404,7 +467,6 @@ "f.close()\n", "\n", "f = open('t1.txt')\n", - "f.seek(0)\n", "print(f.read())\n", "f.close()" ] @@ -419,7 +481,9 @@ { "cell_type": "code", "execution_count": 40, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -447,7 +511,9 @@ { "cell_type": "code", "execution_count": 23, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "f = open('removeme.txt', 'w') # 파일의 생성\n", @@ -459,7 +525,9 @@ { "cell_type": "code", "execution_count": 24, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -499,7 +567,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -549,8 +619,10 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": {}, + "execution_count": 16, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import sys\n", @@ -562,13 +634,15 @@ "print('Good')\n", "print('Good')\n", "f.close()\n", - "sys.stdout = stdout # 필요하면 표준 출력 원상 복구" + "sys.stdout = stdout # 표준 출력 원상 복구" ] }, { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -576,7 +650,8 @@ "text": [ "Sample output\n", "Good\n", - "Good\n" + "Good\n", + "\n" ] } ], @@ -585,17 +660,82 @@ "print(f.read())" ] }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "print(\"Hello koreatech!\", file=open(\"output.txt\", \"w\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello koreatech!\n", + "\n" + ] + } + ], + "source": [ + "f = open('output.txt')\n", + "print(f.read())" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- print를 직접 이용하여 출력을 다른 객체로 전환하기 " + "- print를 직접 이용하여 출력을 다른 객체로 전환하기 \n", + " - 아래와 같은 방식은 python3에서 더이상 지원하지 않음" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unsupported operand type(s) for >>: 'builtin_function_or_method' and 'OutStream'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m \u001b[0;34m>>\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstderr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Warning, action field not supplied\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for >>: 'builtin_function_or_method' and 'OutStream'" + ] + } + ], + "source": [ + "print >> sys.stderr, \"Warning, action field not supplied\"" + ] + }, + { + "cell_type": "markdown", "metadata": {}, + "source": [ + "- 대신 아래 방법 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stderr", @@ -606,7 +746,7 @@ } ], "source": [ - "print()>> sys.stderr, \"Warning, action field not supplied\"" + "print(\"Warning, action field not supplied\", file=sys.stderr)" ] }, { @@ -618,8 +758,10 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, + "execution_count": 29, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -632,7 +774,7 @@ ], "source": [ "f = open('t.txt', 'w')\n", - "print() >> f, 'spam string'\n", + "print('spam string', file=f)\n", "f.close()\n", "\n", "f = open('t.txt')\n", @@ -655,7 +797,9 @@ { "cell_type": "code", "execution_count": 29, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -691,7 +835,9 @@ { "cell_type": "code", "execution_count": 30, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import sys\n", @@ -711,7 +857,9 @@ { "cell_type": "code", "execution_count": 31, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -770,7 +918,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -803,7 +953,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -855,7 +1007,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/python14.ipynb b/python3.6/python14.ipynb index fb7b84f..32cf8b8 100644 --- a/python3.6/python14.ipynb +++ b/python3.6/python14.ipynb @@ -1,871 +1,904 @@ { - "metadata": { - "name": "", - "signature": "sha256:dd334c6957c3dc2ae7bdb34ebf3a2b75cf1fc20f77f9f62ace43f18da4b929e9" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 14. \ud30c\uc77c\uacfc \ub514\ub809\ud1a0\ub9ac \ub2e4\ub8e8\uae30\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud30c\uc77c \ub2e4\ub8e8\uae30\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ud30c\uc77c \ubaa9\ub85d \uc5bb\uae30\n", - "- os.listdir('\uacbd\ub85c')\n", - " - \ub514\ub809\ud1a0\ub9ac \uc548\uc5d0 \ub4e4\uc5b4 \uc788\ub294 \uac01 \ud30c\uc77c \ubaa9\ub85d \ubc18\ud658" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "\n", - "print os.listdir('.') # \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\uc758 \ud30c\uc77c \ubaa9\ub85d \uc5bb\uae30\n", - "print \n", + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 14. 파일과 디렉토리 다루기\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 파일 다루기\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 파일 목록 얻기\n", + "- os.listdir('경로')\n", + " - 디렉토리 안에 들어 있는 각 파일 목록 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['.ipynb_checkpoints', '__pycache__', 'assignment-1.ipynb', 'assignment-2.ipynb', 'assignment-3.ipynb', 'assignment-4.ipynb', 'assignment-5.ipynb', 'mymath.py', 'output.txt', 'python01.ipynb', 'python02.ipynb', 'python03.ipynb', 'python04.ipynb', 'python05.ipynb', 'python06.ipynb', 'python07.ipynb', 'python08.ipynb', 'python09.ipynb', 'python10.ipynb', 'python11.ipynb', 'python12.ipynb', 'python13.ipynb', 'python14.ipynb', 'python15.ipynb', 'python16.ipynb', 'python17.ipynb', 'python18.ipynb', 'python19.ipynb', 'python20.ipynb', 'python21.ipynb', 'python22.ipynb', 'python23.ipynb', 'supplement-2016-09.ipynb', 't.txt', 't1.txt']\n", "\n", - "print os.listdir('../') # \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\uc758 \ubd80\ubaa8 \ub514\ub809\ud1a0\ub9ac\uc758 \ud30c\uc77c \ubaa9\ub85d \uc5bb\uae30" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['.DS_Store', '.git', '.gitignore', '.ipynb_checkpoints', 'example', 'files', 'images', 'python01.ipynb', 'python02.ipynb', 'python03.ipynb', 'python04.ipynb', 'python05.ipynb', 'python06.ipynb', 'python07.ipynb', 'python08.ipynb', 'python09.ipynb', 'python10.ipynb', 'python11.ipynb', 'python12.ipynb', 'python13.ipynb', 'python14.ipynb', 'python15.ipynb', 'python16.ipynb', 'python17.ipynb', 'python18.ipynb', 'python19.ipynb', 'README.md', 'removeme.txt', 'sample.txt', 't1.txt', 'teststring2.pyc']\n", - "\n", - "['.DS_Store', 'calendar', 'calendar-dev', 'ipython', 'jms', 'jms-scheduler', 'mySpringFrame', 'python-e-learning', 'python-e-learning-movie', 'reviewer-recommend']\n" - ] - } - ], - "prompt_number": 27 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \ud30c\uc77c \uc885\ub958 \uc54c\uc544\ubcf4\uae30\n", - "- os.path \ubaa8\ub4c8\uc758 \ub2e4\uc74c \ud568\uc218\ub4e4\uc740 \ud30c\uc77c\uc758 \uc885\ub958\ub97c \ud310\ub2e8\ud558\uc5ec True \ub610\ub294 False\ub97c \ubc18\ud658\ud55c\ub2e4.\n", - " - isfile(filepath)\n", - " - \uc21c\uc218 \ud30c\uc77c\uc774\uba74 True\n", - " - isdir(filepath)\n", - " - \ub514\ub809\ud1a0\ub9ac\uc774\uba74 True\n", - " - islink(filepath)\n", - " - \uc2ec\ubcfc\ub9ad\ub9c1\ud06c\uc774\uba74 True" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "def filetype(fpath):\n", - " print fpath, ':',\n", - " if os.path.isfile(fpath):\n", - " print 'Regular file'\n", - " if os.path.isdir(fpath):\n", - " print 'Directory'\n", - " if os.path.islink(fpath):\n", - " print 'Symbolic link'\n", - " \n", - "flist = os.listdir('.')\n", - "for fname in flist:\n", - " filetype(fname)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - ".DS_Store : Regular file\n", - ".git : Directory\n", - ".gitignore : Regular file\n", - ".ipynb_checkpoints : Directory\n", - "example : Directory\n", - "files : Directory\n", - "images : Directory\n", - "module_test.py : Regular file\n", - "module_test.pyc : Regular file\n", - "music : Regular file\n", - "mymath.py : Regular file\n", - "mymath.pyc : Regular file\n", - "pickle.txt : Regular file\n", - "pickle2.txt : Regular file\n", - "python01.ipynb : Regular file\n", - "python02.ipynb : Regular file\n", - "python03.ipynb : Regular file\n", - "python04.ipynb : Regular file\n", - "python05.ipynb : Regular file\n", - "python06.ipynb : Regular file\n", - "python07.ipynb : Regular file\n", - "python08.ipynb : Regular file\n", - "python09.ipynb : Regular file\n", - "python10.ipynb : Regular file\n", - "python11.ipynb : Regular file\n", - "python12.ipynb : Regular file\n", - "python13.ipynb : Regular file\n", - "python14.ipynb : Regular file\n", - "python15.ipynb : Regular file\n", - "python16.ipynb : Regular file\n", - "python17.ipynb : Regular file\n", - "python18.ipynb : Regular file\n", - "python19.ipynb : Regular file\n", - "python20.ipynb : Regular file\n", - "python21.ipynb : Regular file\n", - "README.md : Regular file\n", - "removeme.txt : Regular file\n", - "sample.txt : Regular file\n", - "sample_new.txt : Regular file\n", - "t.txt : Regular file\n", - "t1.txt : Regular file\n", - "t2.txt : Regular file\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ud30c\uc77c\uc758 \ud5c8\uac00\uad8c\n", - "#### 1) \ud30c\uc77c\uc758 \ud5c8\uac00\uad8c \uc54c\uc544\ubcf4\uae30\n", - "- os.access(filepath, mode)\n", - " - mode\uc5d0 \ub4e4\uc5b4\uac08 \uac12\n", - " - os.F_OK: \ud30c\uc77c \uc790\uccb4\uac00 \uc874\uc7ac\ud558\ub294 \uac83\uc744 \ud14c\uc2a4\ud2b8\n", - " - os.R_OK: \uc77d\uae30 \uad8c\ud55c\uc774 \uc788\ub294 \uac83\uc744 \ud14c\uc2a4\ud2b8\n", - " - os.W_OK: \uc4f0\uae30 \uad8c\ud55c\uc774 \uc788\ub294 \uac83\uc744 \ud14c\uc2a4\ud2b8\n", - " - os.X_OK: \uc2e4\ud589 \uad8c\ud55c\uc774 \uc788\ub294 \uac83(\ub610\ub294 \ub514\ub809\ud1a0\ub9ac\uc778\uc9c0)\uc744 \ud14c\uc2a4\ud2b8" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "def fileaccess(fpath):\n", - " print fpath, ':',\n", - " if os.access(fpath, os.F_OK): \n", - " print 'Exists',\n", - " else: \n", - " return\n", - " if os.access(fpath, os.R_OK): \n", - " print 'R',\n", - " if os.access(fpath, os.W_OK): \n", - " print 'W',\n", - " if os.access(fpath, os.X_OK): \n", - " print 'X',\n", - " print \n", - " \n", - "flist = os.listdir('.')\n", - "for fname in flist:\n", - " fileaccess(fname)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - ".DS_Store : Exists R W\n", - ".git : Exists R W X\n", - ".gitignore : Exists R W\n", - ".ipynb_checkpoints : Exists R W X\n", - "example : Exists R W X\n", - "files : Exists R W X\n", - "images : Exists R W X\n", - "module_test.py : Exists R W\n", - "module_test.pyc : Exists R W\n", - "music : Exists R W\n", - "mymath.py : Exists R W\n", - "mymath.pyc : Exists R W\n", - "pickle.txt : Exists R W\n", - "pickle2.txt : Exists R W\n", - "python01.ipynb : Exists R W\n", - "python02.ipynb : Exists R W\n", - "python03.ipynb : Exists R W\n", - "python04.ipynb : Exists R W\n", - "python05.ipynb : Exists R W\n", - "python06.ipynb : Exists R W\n", - "python07.ipynb : Exists R W\n", - "python08.ipynb : Exists R W\n", - "python09.ipynb : Exists R W\n", - "python10.ipynb : Exists R W\n", - "python11.ipynb : Exists R W\n", - "python12.ipynb : Exists R W\n", - "python13.ipynb : Exists R W\n", - "python14.ipynb : Exists R W\n", - "python15.ipynb : Exists R W\n", - "python16.ipynb : Exists R W\n", - "python17.ipynb : Exists R W\n", - "python18.ipynb : Exists R W\n", - "python19.ipynb : Exists R W\n", - "python20.ipynb : Exists R W\n", - "python21.ipynb : Exists R W\n", - "README.md : Exists R W\n", - "removeme.txt : Exists R W\n", - "sample.txt : Exists R W X\n", - "sample_new.txt : Exists R W\n", - "t.txt : Exists R W\n", - "t1.txt : Exists R W\n", - "t2.txt : Exists R W\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) \ud30c\uc77c\uc758 \ud5c8\uac00\uad8c \ubcc0\uacbd\ud558\uae30\n", - "- os.chmod(filepath, mode)" + "['.DS_Store', '.git', '.gitignore', '.ipynb_checkpoints', 'aaa', 'assignment-1.ipynb', 'assignment-2.ipynb', 'assignment-3.ipynb', 'assignment-4.ipynb', 'assignment-5.ipynb', 'example', 'files', 'images', 'module_test.py', 'music', 'mymath.ipynb', 'mymath.py', 'mymath.pyc', 'pickle.txt', 'pickle2.txt', 'python01.ipynb', 'python02.ipynb', 'python03.ipynb', 'python04.ipynb', 'python05.ipynb', 'python06.ipynb', 'python07.ipynb', 'python08.ipynb', 'python09.ipynb', 'python10.ipynb', 'python11.ipynb', 'python12.ipynb', 'python13.ipynb', 'python14.ipynb', 'python15.ipynb', 'python16.ipynb', 'python17.ipynb', 'python18.ipynb', 'python19.ipynb', 'python20.ipynb', 'python21.ipynb', 'python22.ipynb', 'python23.ipynb', 'python3.6', 'README.md', 'readme.txt', 'removeme.txt', 'sample.txt', 'sample_new.txt', 'Speech', 'supplement-2016-09.ipynb', 'supplement.ipynb', 't.txt', 't1.txt', 't2.txt', 'The Python Challenge.webloc', 'turtle_example.png', 'turtle_method-1.png', 'turtle_method-2.png', 'turtle_method-3.png', 'Untitled.ipynb', 'Untitled1.ipynb', 'Untitled2.ipynb', 'Untitled3.ipynb', '범이의 데이터 아키텍처 -- [Python] [개념을 잡아주는 프로그래밍 정석] 4.8 연습문제.webloc']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.chmod('sample.txt', 0777) # \ub9ac\ub205\uc2a4\uc5d0\uc11c\uc758 \uc2e4\ud589 \uc608" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 18 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![inheritance](images/chmod.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ud30c\uc77c \uc870\uc791\ud558\uae30\n", - "#### 1) \ud30c\uc77c \uc774\ub984 \ubcc0\uacbd\ud558\uae30\n", - "- os.rename(old_filepath, new_filepath)" + } + ], + "source": [ + "import os\n", + "\n", + "print(os.listdir('.')) # 현재 디렉토리의 파일 목록 얻기\n", + "print()\n", + "\n", + "print(os.listdir('../')) # 현재 디렉토리의 부모 디렉토리의 파일 목록 얻기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 파일 종류 알아보기\n", + "- os.path 모듈의 다음 함수들은 파일의 종류를 판단하여 True 또는 False를 반환한다.\n", + " - isfile(filepath)\n", + " - 순수 파일이면 True\n", + " - isdir(filepath)\n", + " - 디렉토리이면 True\n", + " - islink(filepath)\n", + " - 심볼릭링크이면 True" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ".ipynb_checkpoints :Directory\n", + "__pycache__ :Directory\n", + "assignment-1.ipynb :Regular file\n", + "assignment-2.ipynb :Regular file\n", + "assignment-3.ipynb :Regular file\n", + "assignment-4.ipynb :Regular file\n", + "assignment-5.ipynb :Regular file\n", + "mymath.py :Regular file\n", + "output.txt :Regular file\n", + "python01.ipynb :Regular file\n", + "python02.ipynb :Regular file\n", + "python03.ipynb :Regular file\n", + "python04.ipynb :Regular file\n", + "python05.ipynb :Regular file\n", + "python06.ipynb :Regular file\n", + "python07.ipynb :Regular file\n", + "python08.ipynb :Regular file\n", + "python09.ipynb :Regular file\n", + "python10.ipynb :Regular file\n", + "python11.ipynb :Regular file\n", + "python12.ipynb :Regular file\n", + "python13.ipynb :Regular file\n", + "python14.ipynb :Regular file\n", + "python15.ipynb :Regular file\n", + "python16.ipynb :Regular file\n", + "python17.ipynb :Regular file\n", + "python18.ipynb :Regular file\n", + "python19.ipynb :Regular file\n", + "python20.ipynb :Regular file\n", + "python21.ipynb :Regular file\n", + "python22.ipynb :Regular file\n", + "python23.ipynb :Regular file\n", + "supplement-2016-09.ipynb :Regular file\n", + "t.txt :Regular file\n", + "t1.txt :Regular file\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "os.rename('t.txt', 't1.txt') # t.txt\ub97c t1.txt\ub85c \ubc14\uafbc\ub2e4\n", - "print os.access('t.txt', os.F_OK)\n", - "print os.access('t1.txt', os.F_OK)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "True\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) \ud30c\uc77c \uc774\ub3d9\ud558\uae30\n", - "- os.rename(old_filepath, new_filepath)" + } + ], + "source": [ + "import os\n", + "def filetype(fpath):\n", + " print (fpath, ':', end=\"\"),\n", + " if os.path.isfile(fpath):\n", + " print('Regular file')\n", + " if os.path.isdir(fpath):\n", + " print('Directory')\n", + " if os.path.islink(fpath):\n", + " print('Symbolic link')\n", + " \n", + "flist = os.listdir('.')\n", + "for fname in flist:\n", + " filetype(fname)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 파일의 허가권\n", + "#### 1) 파일의 허가권 알아보기\n", + "- os.access(filepath, mode)\n", + " - mode에 들어갈 값\n", + " - os.F_OK: 파일 자체가 존재하는 것을 테스트\n", + " - os.R_OK: 읽기 권한이 있는 것을 테스트\n", + " - os.W_OK: 쓰기 권한이 있는 것을 테스트\n", + " - os.X_OK: 실행 권한이 있는 것(또는 디렉토리인지)을 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ".ipynb_checkpoints :Exists - RWX\n", + "__pycache__ :Exists - RWX\n", + "assignment-1.ipynb :Exists - RW\n", + "assignment-2.ipynb :Exists - RW\n", + "assignment-3.ipynb :Exists - RW\n", + "assignment-4.ipynb :Exists - RW\n", + "assignment-5.ipynb :Exists - RW\n", + "mymath.py :Exists - RW\n", + "output.txt :Exists - RW\n", + "python01.ipynb :Exists - RW\n", + "python02.ipynb :Exists - RW\n", + "python03.ipynb :Exists - RW\n", + "python04.ipynb :Exists - RW\n", + "python05.ipynb :Exists - RW\n", + "python06.ipynb :Exists - RW\n", + "python07.ipynb :Exists - RW\n", + "python08.ipynb :Exists - RW\n", + "python09.ipynb :Exists - RW\n", + "python10.ipynb :Exists - RW\n", + "python11.ipynb :Exists - RW\n", + "python12.ipynb :Exists - RW\n", + "python13.ipynb :Exists - RW\n", + "python14.ipynb :Exists - RW\n", + "python15.ipynb :Exists - RW\n", + "python16.ipynb :Exists - RW\n", + "python17.ipynb :Exists - RW\n", + "python18.ipynb :Exists - RW\n", + "python19.ipynb :Exists - RW\n", + "python20.ipynb :Exists - RW\n", + "python21.ipynb :Exists - RW\n", + "python22.ipynb :Exists - RW\n", + "python23.ipynb :Exists - RW\n", + "supplement-2016-09.ipynb :Exists - RW\n", + "t.txt :Exists - RW\n", + "t1.txt :Exists - RW\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.rename('t1.txt', 'example/t1.txt') # \ud604\uc7ac \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac\uc758 t1.txt\ub97c example\uc5d0 t1.txt\uc774\ub984\uc73c\ub85c \uc62e\uae34\ub2e4.\n", - "print os.access('example/t1.txt', os.F_OK)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 3) \ud30c\uc77c \ubcf5\uc0ac\ud558\uae30\n", - "- shutil \ubaa8\ub4c8 \ud65c\uc6a9\n", - "- shutil.copyfile(src_filepath, dest_filepath)" + } + ], + "source": [ + "import os\n", + "def fileaccess(fpath):\n", + " print(fpath, ':', end=\"\")\n", + " if os.access(fpath, os.F_OK): \n", + " print('Exists - ', end=\"\")\n", + " else: \n", + " return\n", + " if os.access(fpath, os.R_OK): \n", + " print('R', end=\"\")\n", + " if os.access(fpath, os.W_OK): \n", + " print('W', end=\"\")\n", + " if os.access(fpath, os.X_OK): \n", + " print('X', end=\"\")\n", + " print()\n", + " \n", + "flist = os.listdir('.')\n", + "for fname in flist:\n", + " fileaccess(fname)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 파일의 허가권 변경하기\n", + "- os.chmod(filepath, mode)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "os.chmod('t.txt', 777) # 리눅스에서의 실행 예" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 파일 조작하기\n", + "#### 1) 파일 이름 변경하기\n", + "- os.rename(old_filepath, new_filepath)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import shutil\n", - "shutil.copyfile('sample.txt', 'sample_new.txt')\n", - "print os.access('sample_new.txt', os.F_OK)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n" - ] - } - ], - "prompt_number": 34 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-5 \ud30c\uc77c \uc774\ub984 \ub2e4\ub8e8\uae30" + } + ], + "source": [ + "import os\n", + "os.rename('t.txt', 't1.txt') # t.txt를 t1.txt로 바꾼다\n", + "print(os.access('t.txt', os.F_OK))\n", + "print(os.access('t1.txt', os.F_OK))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 파일 이동하기\n", + "- os.rename(old_filepath, new_filepath)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1) \uc0c1\ub300 \uacbd\ub85c\ub97c \uc808\ub300 \uacbd\ub85c\ub85c \ubcc0\ud658\ud558\uae30\n", - "- os.path.abspath(\uc0c1\ub300\uacbd\ub85c)\n", - " - \uc2e4\uc81c \ud30c\uc77c \uc874\uc7ac\uc640\ub294 \ubb34\uad00\ud558\uac8c \uc808\ub300\uacbd\ub85c\ub85c \ubcc0\uacbd\ud568" + } + ], + "source": [ + "os.rename('t1.txt', 'examples/t1.txt') # 현재 작업 디렉토리의 t1.txt를 example에 t1.txt이름으로 옮긴다.\n", + "print(os.access('examples/t1.txt', os.F_OK))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) 파일 복사하기\n", + "- shutil 모듈 활용\n", + "- shutil.copyfile(src_filepath, dest_filepath)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = \"\"\"Its power: Python developers typically report \n", + "they are able to develop applications in a half\n", + "to a tenth the amount of time it takes them to do\n", + "the same work in such languages as C.\"\"\"\n", + "with open('t.txt', 'w') as f:\n", + " f.write(s) # 문자열을 파일에 기록" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "print os.path.abspath('o.txt')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/git/python-e-learning/o.txt\n" - ] - } - ], - "prompt_number": 51 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) \uc8fc\uc5b4\uc9c4 \uacbd\ub85c\uc758 \ud30c\uc77c\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\n", - "- os.path.exists(filepath)" + } + ], + "source": [ + "import shutil\n", + "shutil.copyfile('t.txt', 't_new.txt')\n", + "print(os.access('t_new.txt', os.F_OK))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 파일 이름 다루기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) 상대 경로를 절대 경로로 변환하기\n", + "- os.path.abspath(상대경로)\n", + " - 실제 파일 존재와는 무관하게 절대경로로 변경함" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning/python3.6/o.txt\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = '/Users/yhhan/git/python-e-learning/sample.txt'\n", - "print os.path.exists(f)\n", - "print os.path.exists('sample.txt')\n", - "print os.path.exists('asdf.txt')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n", - "False\n" - ] - } - ], - "prompt_number": 54 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 3) \ud604\uc7ac/\ubd80\ubaa8 \ub514\ub809\ud1a0\ub9ac\ub97c \uac00\ub9ac\ud0a4\ub294 \uc774\ub984 \uc5bb\uae30" + } + ], + "source": [ + "import os\n", + "print(os.path.abspath('o.txt'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 주어진 경로의 파일이 존재하는지 확인\n", + "- os.path.exists(filepath)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "False\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print os.curdir #\ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\n", - "print os.pardir #\ubd80\ubaa8 \ub514\ub809\ud1a0\ub9ac" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - ".\n", - "..\n" - ] - } - ], - "prompt_number": 25 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 4) \ub514\ub809\ud1a0\ub9ac \ubd84\ub9ac \ubb38\uc790 \uc5bb\uae30" + } + ], + "source": [ + "f = '/Users/yhhan/git/python-e-learning/sample.txt'\n", + "print(os.path.exists(f))\n", + "print(os.path.exists('sample.txt'))\n", + "print(os.path.exists('asdf.txt'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) 현재/부모 디렉토리를 가리키는 이름 얻기" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ".\n", + "..\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print os.sep" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/\n" - ] - } - ], - "prompt_number": 26 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-6 \uacbd\ub85c\uba85 \ubd84\ub9ac\ud558\uae30" + } + ], + "source": [ + "print(os.curdir) #현재 디렉토리\n", + "print(os.pardir) #부모 디렉토리" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4) 디렉토리 분리 문자 얻기" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1) \uacbd\ub85c\uc640 \ud30c\uc77c\uba85\uc73c\ub85c \ubd84\ub9ac" + } + ], + "source": [ + "print(os.sep)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-6 경로명 분리하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) 경로와 파일명으로 분리" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "t.txt\n", + "/Users/yhhan/git/python-e-learning\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = '/Users/yhhan/git/python-e-learning/t.txt'\n", - "\n", - "print os.path.basename(f) # \ud30c\uc77c\uba85\ub9cc \ucd94\ucd9c\n", - "print os.path.dirname(f) # \ub514\ub809\ud1a0\ub9ac \uacbd\ub85c \ucd94\ucd9c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "t.txt\n", - "/Users/yhhan/git/python-e-learning\n" - ] - } - ], - "prompt_number": 57 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) \uacbd\ub85c\uba85\uacfc \ud30c\uc77c\uba85\uc744 \ud55c\ubc88\uc5d0 \ubd84\ub9ac" + } + ], + "source": [ + "f = '/Users/yhhan/git/python-e-learning/t.txt'\n", + "\n", + "print(os.path.basename(f)) # 파일명만 추출\n", + "print(os.path.dirname(f)) # 디렉토리 경로 추출" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 경로명과 파일명을 한번에 분리" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('/Users/yhhan/git/python-e-learning', 't.txt')\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print os.path.split(f)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "('/Users/yhhan/git/python-e-learning', 't.txt')\n" - ] - } - ], - "prompt_number": 58 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 3) MS \uc708\ub3c4\uc6b0\uc988\uc5d0\uc11c \ub4dc\ub77c\uc774\ube0c\uba85\uacfc \ud30c\uc77c \uacbd\ub85c\uba85\uc744 \ubd84\ub9ac" + } + ], + "source": [ + "print(os.path.split(f))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) MS 윈도우즈에서 드라이브명과 파일 경로명을 분리" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('', '/Users/yhhan/git/python-e-learning/t.txt')\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print os.path.splitdrive(f)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "('', '/Users/yhhan/git/python-e-learning/t.txt')\n" - ] - } - ], - "prompt_number": 59 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 4) \ud655\uc7a5\uc790 \ubd84\ub9ac" + } + ], + "source": [ + "print(os.path.splitdrive(f))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4) 확장자 분리" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('/Users/yhhan/git/python-e-learning/t', '.txt')\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print os.path.splitext(f)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "('/Users/yhhan/git/python-e-learning/t', '.txt')\n" - ] - } - ], - "prompt_number": 60 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub514\ub809\ud1a0\ub9ac \ub2e4\ub8e8\uae30\n", - "***" + } + ], + "source": [ + "print(os.path.splitext(f))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 디렉토리 다루기\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 디렉토리에 관련된 일반 작업" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) 현재 작업 디렉토리 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning/python3.6\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ub514\ub809\ud1a0\ub9ac\uc5d0 \uad00\ub828\ub41c \uc77c\ubc18 \uc791\uc5c5" + } + ], + "source": [ + "import os\n", + "print(os.getcwd())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 작업 디렉토리 변경하기" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/Public\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1) \ud604\uc7ac \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac \uc54c\uc544\ubcf4\uae30" + } + ], + "source": [ + "os.chdir('/Users/yhhan/Public/')\n", + "print(os.getcwd())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3) 디렉토리 만들기" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "print os.getcwd()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/git/python-e-learning\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac \ubcc0\uacbd\ud558\uae30" + } + ], + "source": [ + "import os\n", + "\n", + "os.mkdir('temp') # 755 기본 모드(rwxr-xr-x)로 만들어짐\n", + "os.mkdir('temp2', 700) # 700 모드(rwx------)로 만들어짐\n", + "os.makedirs('temp/level1/level2') #0755 기본 모드, 중간에 필요한 디렉토리도 모두생성\n", + "\n", + "print(os.access('/Users/yhhan/Public/temp', os.F_OK))\n", + "print(os.access('/Users/yhhan/Public/temp2', os.F_OK))\n", + "print(os.access('/Users/yhhan/Public/temp/level1/level2', os.F_OK))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4) 디렉토리 삭제" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "os.rmdir('temp2') #디렉토리에 내용이 없을 때 삭제가능" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "OSError", + "evalue": "[Errno 66] Directory not empty: 'temp'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrmdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#디렉토리에 다른 파일이 있으면 삭제할 수 없음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mOSError\u001b[0m: [Errno 66] Directory not empty: 'temp'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.chdir('/Users/yhhan/Public/')\n", - "print os.getcwd()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/Public\n" - ] - } - ], - "prompt_number": 20 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 3) \ub514\ub809\ud1a0\ub9ac \ub9cc\ub4e4\uae30" + } + ], + "source": [ + "os.rmdir('temp') #디렉토리에 다른 파일이 있으면 삭제할 수 없음" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 5) 다단계 디렉토리 삭제\n", + "- os.removedirs(filepath)\n", + " - filepath에 지정된 디렉토리들 중 맨 오른쪽 디렉토리 부터 차례차례로 삭제한다.\n", + " - 디렉토리에 다른 파일이 있으면 삭제하기 않고 중단" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "os.removedirs('temp/level1/level2')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 6) 하위 디렉토리까지 모두 한번에 삭제\n", + "- shutil.rmtree() \n", + " - 파일은 물론 하위 디렉토리까지 모두 한번에 삭제 가능\n", + " - 조심해서 사용해야 함" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning/python3.6\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "\n", - "os.mkdir('temp') # 0755 \uae30\ubcf8 \ubaa8\ub4dc(rwxr-xr-x)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\n", - "os.mkdir('temp2', 0700) # 0700 \ubaa8\ub4dc(rwx------)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\n", - "os.makedirs('temp/level1/level2') #0755 \uae30\ubcf8 \ubaa8\ub4dc, \uc911\uac04\uc5d0 \ud544\uc694\ud55c \ub514\ub809\ud1a0\ub9ac\ub3c4 \ubaa8\ub450\uc0dd\uc131\n", + } + ], + "source": [ + "os.chdir('/Users/yhhan/git/python-e-learning/python3.6')\n", + "print(os.getcwd())\n", + "\n", + "import shutil\n", + "shutil.rmtree('examples')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 7) 디렉토리 복사\n", + "- shutil.copytree(src_filepath, dest_filepath)\n", + " - 하위 디렉토리와 파일등을 지니고 있는 디렉토리를 복사" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'myweb_backup'" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.mkdir('temp') \n", + "os.mkdir('temp/temp2')\n", + "shutil.copytree('temp', 'myweb_backup')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 디렉토리(트리) 탐색하기\n", + "- os.walk(filepath)\n", + " - filepath 부터 시작하여 재귀적으로 모든 하위 디렉토리까지 탐색을 하는 함수\n", + " - 탐색시 발견하는 모든 파일에 대해서는 다음 튜플을 리턴함\n", + " - (dirpath, dirnames, filemnames)\n", + " - dirpath: 탐색하고 있는 디렉토리 경로\n", + " - dirnames: dirpath 안에 존재하는 서브 디렉토리의 리스트\n", + " - filenames: dirpath 안에 존재하는 파일 리스트" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래 예는 현재 디렉토리부터 모든 하위 디렉토리 내에 존재하는 모든 pyc 파일을 삭제하는 프로그램" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning\n", "\n", - "print os.access('/Users/yhhan/Public/temp', os.F_OK)\n", - "print os.access('/Users/yhhan/Public/temp2', os.F_OK)\n", - "print os.access('/Users/yhhan/Public/temp/level1/level2', os.F_OK)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "OSError", - "evalue": "[Errno 17] File exists: 'temp'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmkdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 0755 \uae30\ubcf8 \ubaa8\ub4dc(rwxr-xr-x)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmkdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp2'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0700\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 0700 \ubaa8\ub4dc(rwx------)\ub85c \ub9cc\ub4e4\uc5b4\uc9d0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmakedirs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp/level1/level2'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#0755 \uae30\ubcf8 \ubaa8\ub4dc, \uc911\uac04\uc5d0 \ud544\uc694\ud55c \ub514\ub809\ud1a0\ub9ac\ub3c4 \ubaa8\ub450\uc0dd\uc131\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mOSError\u001b[0m: [Errno 17] File exists: 'temp'" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 4) \ub514\ub809\ud1a0\ub9ac \uc0ad\uc81c" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.rmdir('temp2') #\ub514\ub809\ud1a0\ub9ac\uc5d0 \ub0b4\uc6a9\uc774 \uc5c6\uc744 \ub54c \uc0ad\uc81c\uac00\ub2a5" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 42 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.rmdir('temp') #\ub514\ub809\ud1a0\ub9ac\uc5d0 \ub2e4\ub978 \ud30c\uc77c\uc774 \uc788\uc73c\uba74 \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc74c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "OSError", - "evalue": "[Errno 66] Directory not empty: 'temp'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrmdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#\ub514\ub809\ud1a0\ub9ac\uc5d0 \ub2e4\ub978 \ud30c\uc77c\uc774 \uc788\uc73c\uba74 \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc74c\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mOSError\u001b[0m: [Errno 66] Directory not empty: 'temp'" - ] - } - ], - "prompt_number": 43 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 5) \ub2e4\ub2e8\uacc4 \ub514\ub809\ud1a0\ub9ac \uc0ad\uc81c\n", - "- os.removedirs(filepath)\n", - " - filepath\uc5d0 \uc9c0\uc815\ub41c \ub514\ub809\ud1a0\ub9ac\ub4e4 \uc911 \ub9e8 \uc624\ub978\ucabd \ub514\ub809\ud1a0\ub9ac \ubd80\ud130 \ucc28\ub840\ucc28\ub840\ub85c \uc0ad\uc81c\ud55c\ub2e4.\n", - " - \ub514\ub809\ud1a0\ub9ac\uc5d0 \ub2e4\ub978 \ud30c\uc77c\uc774 \uc788\uc73c\uba74 \uc0ad\uc81c\ud558\uae30 \uc54a\uace0 \uc911\ub2e8" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.removedirs('temp/level1/level2')" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 79 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 6) \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uae4c\uc9c0 \ubaa8\ub450 \ud55c\ubc88\uc5d0 \uc0ad\uc81c\n", - "- shutil.rmtree() \n", - " - \ud30c\uc77c\uc740 \ubb3c\ub860 \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uae4c\uc9c0 \ubaa8\ub450 \ud55c\ubc88\uc5d0 \uc0ad\uc81c \uac00\ub2a5\n", - " - \uc870\uc2ec\ud574\uc11c \uc0ac\uc6a9\ud574\uc57c \ud568" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import shutil\n", - "shutil.rmtree('temp')" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 22 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 7) \ub514\ub809\ud1a0\ub9ac \ubcf5\uc0ac\n", - "- shutil.copytree(src_filepath, dest_filepath)\n", - " - \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uc640 \ud30c\uc77c\ub4f1\uc744 \uc9c0\ub2c8\uace0 \uc788\ub294 \ub514\ub809\ud1a0\ub9ac\ub97c \ubcf5\uc0ac" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.mkdir('temp') \n", - "os.mkdir('temp/temp2', 0700)\n", - "shutil.copytree('temp', 'myweb_backup')" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 23 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ub514\ub809\ud1a0\ub9ac(\ud2b8\ub9ac) \ud0d0\uc0c9\ud558\uae30\n", - "- os.walk(filepath)\n", - " - filepath \ubd80\ud130 \uc2dc\uc791\ud558\uc5ec \uc7ac\uadc0\uc801\uc73c\ub85c \ubaa8\ub4e0 \ud558\uc704 \ub514\ub809\ud1a0\ub9ac\uae4c\uc9c0 \ud0d0\uc0c9\uc744 \ud558\ub294 \ud568\uc218\n", - " - \ud0d0\uc0c9\uc2dc \ubc1c\uacac\ud558\ub294 \ubaa8\ub4e0 \ud30c\uc77c\uc5d0 \ub300\ud574\uc11c\ub294 \ub2e4\uc74c \ud29c\ud50c\uc744 \ub9ac\ud134\ud568\n", - " - (dirpath, dirnames, filemnames)\n", - " - dirpath: \ud0d0\uc0c9\ud558\uace0 \uc788\ub294 \ub514\ub809\ud1a0\ub9ac \uacbd\ub85c\n", - " - dirnames: dirpath \uc548\uc5d0 \uc874\uc7ac\ud558\ub294 \uc11c\ube0c \ub514\ub809\ud1a0\ub9ac\uc758 \ub9ac\uc2a4\ud2b8\n", - " - filenames: dirpath \uc548\uc5d0 \uc874\uc7ac\ud558\ub294 \ud30c\uc77c \ub9ac\uc2a4\ud2b8" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc544\ub798 \uc608\ub294 \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\ubd80\ud130 \ubaa8\ub4e0 \ud558\uc704 \ub514\ub809\ud1a0\ub9ac \ub0b4\uc5d0 \uc874\uc7ac\ud558\ub294 \ubaa8\ub4e0 pyc \ud30c\uc77c\uc744 \uc0ad\uc81c\ud558\ub294 \ud504\ub85c\uadf8\ub7a8" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "os.chdir('/Users/yhhan/git/python-e-learning')\n", - "print os.getcwd()\n", - "print\n", - "for path, subdirs, files in os.walk(os.getcwd()):\n", - " for fname in files:\n", - " if fname.endswith('.pyc'):\n", - " fullpath = os.path.join(path, fname)\n", - " print 'removing', fullpath\n", - " os.remove(fullpath)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/git/python-e-learning\n", - "\n", - "removing /Users/yhhan/git/python-e-learning/module_test.pyc\n", - "removing /Users/yhhan/git/python-e-learning/mymath.pyc\n" - ] - } - ], - "prompt_number": 24 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + "removing /Users/yhhan/git/python-e-learning/mymath.pyc\n", + "removing /Users/yhhan/git/python-e-learning/aaa/__init__.pyc\n", + "removing /Users/yhhan/git/python-e-learning/aaa/bbb/__init__.pyc\n", + "removing /Users/yhhan/git/python-e-learning/aaa/bbb/ccc.pyc\n", + "removing /Users/yhhan/git/python-e-learning/python3.6/__pycache__/mymath.cpython-36.pyc\n", + "removing /Users/yhhan/git/python-e-learning/Speech/__init__.pyc\n", + "removing /Users/yhhan/git/python-e-learning/Speech/Recognition/__init__.pyc\n", + "removing /Users/yhhan/git/python-e-learning/Speech/Recognition/HMM.pyc\n" ] } ], - "metadata": {} + "source": [ + "import os\n", + "os.chdir('/Users/yhhan/git/python-e-learning')\n", + "print(os.getcwd())\n", + "print()\n", + "for path, subdirs, files in os.walk(os.getcwd()):\n", + " for fname in files:\n", + " if fname.endswith('.pyc'):\n", + " fullpath = os.path.join(path, fname)\n", + " print('removing', fullpath)\n", + " os.remove(fullpath)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.0" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python3.6/t_new.txt b/python3.6/t_new.txt new file mode 100644 index 0000000..de02ddc --- /dev/null +++ b/python3.6/t_new.txt @@ -0,0 +1,4 @@ +Its power: Python developers typically report +they are able to develop applications in a half +to a tenth the amount of time it takes them to do +the same work in such languages as C. \ No newline at end of file From d563b497e47430cc44eadb1a6466df8a76ba3dcf Mon Sep 17 00:00:00 2001 From: Do-Hyung Date: Sun, 12 Nov 2017 22:05:39 +0900 Subject: [PATCH 064/124] python 16 --- python3.6/python16.ipynb | 220 ++++++++++++++++++++++++++++----------- 1 file changed, 157 insertions(+), 63 deletions(-) diff --git a/python3.6/python16.ipynb b/python3.6/python16.ipynb index e82f284..b9ad708 100644 --- a/python3.6/python16.ipynb +++ b/python3.6/python16.ipynb @@ -42,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -55,7 +55,7 @@ ], "source": [ "f = lambda x: x + 1\n", - "print f(1)" + "print(f(1))" ] }, { @@ -67,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -80,7 +80,7 @@ ], "source": [ "g = lambda x, y: x + y\n", - "print g(1, 2)" + "print(g(1, 2))" ] }, { @@ -92,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -106,8 +106,8 @@ ], "source": [ "incr = lambda x, inc = 1: x + inc\n", - "print incr(10) #inc 기본 인수 값으로 1 사용\n", - "print incr(10, 5)" + "print(incr(10))#inc 기본 인수 값으로 1 사용\n", + "print(incr(10, 5))" ] }, { @@ -119,20 +119,25 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(2, 3, 4, 5)\n" + "(2, 3, 4, 5)\n", + "\n", + "\n" ] } ], "source": [ "vargs = lambda x, *args: args\n", - "print vargs(1,2,3,4,5)" + "print(vargs(1,2,3,4,5))\n", + "# 이전 jupyter notebook 참고; \"넣어주는 인수 값들 중 일반 인수에 할당되는 값을 제외한 나머지 값들을 지닌 튜플 객체가 할당된다.\"\n", + "print(type(vargs))\n", + "print(type(vargs(1,2,3,4,5)))" ] }, { @@ -144,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -166,13 +171,13 @@ "def g(func):\n", " return [func(x) for x in range(-10, 10)]\n", "\n", - "print g(f1)\n", - "print g(f2)" + "print(g(f1))\n", + "print(g(f2))" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -188,8 +193,8 @@ "def g(func):\n", " return [func(x) for x in range(-10, 10)]\n", "\n", - "print g(lambda x: x*x + 3*x - 10)\n", - "print g(lambda x: x*x*x)" + "print(g(lambda x: x*x + 3*x - 10))\n", + "print(g(lambda x: x*x*x))" ] }, { @@ -201,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -212,7 +217,8 @@ "1. sub\n", "2. mul\n", "3. div\n", - "4. quit\n" + "4. quit\n", + "Select menu:4\n" ] } ], @@ -221,12 +227,15 @@ "func = [lambda x, y: x + y, lambda x, y: x - y, lambda x, y: x * y, lambda x, y: x / y]\n", "\n", "def menu():\n", - " print \"0. add\"\n", - " print \"1. sub\"\n", - " print \"2. mul\"\n", - " print \"3. div\"\n", - " print \"4. quit\"\n", - " return input('Select menu:')\n", + " print(\"0. add\")\n", + " print(\"1. sub\")\n", + " print(\"2. mul\")\n", + " print(\"3. div\")\n", + " print(\"4. quit\")\n", + "# 기존: return input('Select menu:')\n", + " return int(input('Select menu:'))\n", + "# 또는\n", + "# return eval(input('Select menu:'))\n", "\n", "while 1:\n", " sel = menu() \n", @@ -236,7 +245,7 @@ " break\n", " x = input('First operand:') \n", " y = input('Second operand:') \n", - " print 'Result =', func[sel](x,y) " + " print('Result =', func[sel](x,y))" ] }, { @@ -246,9 +255,9 @@ "***\n", "## 2 람다 함수의 활용\n", "***\n", - "- map, filter, reduce 내장 함수\n", - " - 첫번째 인자: function\n", - " - 첫번째 일반적으로 람다 함수를 인자로 받는다.\n", + "- map, filter, reduce 내장 함수\n", + " - 첫번째 인자: function\n", + " - 첫번째 인자는 일반적으로 람다 함수를 인자로 받는다.\n", " - 두번째 인자: 시퀀스 자료형 (문자열, 리스트, 튜플)" ] }, @@ -257,13 +266,13 @@ "metadata": {}, "source": [ "### 2-1 map 내장 함수\n", - "- map(function, seq)\n", + "- map(function, seq)\n", " - seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 결과를 동일 시퀀스 자료형으로 반환한다." ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -279,8 +288,10 @@ " return x * x\n", "\n", "X = [1, 2, 3, 4, 5]\n", - "Y = map(f, X)\n", - "print Y" + "Y = list(map(f, X)) \n", + "#기존: Y = map(f, X)\n", + "# X seq 자료형이 리스트라면, list()를 써주어야 한다. 페이지 아래의 'filter, map은 iterator를 리턴함'문구 참고 필요\n", + "print(Y)" ] }, { @@ -292,7 +303,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -312,7 +323,7 @@ "for x in X:\n", " y = f(x)\n", " Y.append(y)\n", - "print Y" + "print(Y)" ] }, { @@ -324,7 +335,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -337,7 +348,8 @@ ], "source": [ "X = [1, 2, 3, 4, 5]\n", - "print map(lambda x: x * x, X)" + "#기존: print map(lambda x: x * x, X)\n", + "print(list(map(lambda x: x * x, X)))" ] }, { @@ -349,7 +361,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -361,8 +373,9 @@ } ], "source": [ - "Y = map(lambda x: x * x + 4 * x + 5, range(10))\n", - "print Y" + "#기존: Y = map(lambda x: x * x + 4 * x + 5, range(10))\n", + "Y = list(map(lambda x: x * x + 4 * x + 5, range(10)))\n", + "print(Y)" ] }, { @@ -374,7 +387,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -386,8 +399,8 @@ } ], "source": [ - "y = map(lambda x: len(x), [\"Hello\", \"Python\", \"Programming\"])\n", - "print y" + "y = list(map(lambda x: len(x), [\"Hello\", \"Python\", \"Programming\"]))\n", + "print(y)" ] }, { @@ -395,7 +408,7 @@ "metadata": {}, "source": [ "### 2-2 filter 내장 함수\n", - "- filter(function, seq)\n", + "- filter(function, seq)\n", " - seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 결과가 참인 원소값들만을 동일 시퀀스 자료형으로 반환한다." ] }, @@ -405,7 +418,8 @@ "metadata": {}, "outputs": [], "source": [ - "print filter(lambda x: x > 2, [1, 2, 3, 34])" + "#기존: print(filter(lambda x: x > 2, [1, 2, 3, 34]))\n", + "print(list(filter(lambda x: x > 2, [1, 2, 3, 34])))" ] }, { @@ -417,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -433,7 +447,7 @@ "for x in [1, 2, 3, 34]:\n", " if x > 2:\n", " y.append(x)\n", - "print y" + "print(y)" ] }, { @@ -449,7 +463,7 @@ "metadata": {}, "outputs": [], "source": [ - "print filter(lambda x: x % 2, [1, 2, 3, 4, 5, 6])" + "print(list(filter(lambda x: x % 2, [1, 2, 3, 4, 5, 6])))" ] }, { @@ -465,7 +479,7 @@ "metadata": {}, "outputs": [], "source": [ - "print filter(lambda x: x % 2 - 1, [1, 2, 3, 4, 5, 6])" + "print(list(ilter(lambda x: x % 2 - 1, [1, 2, 3, 4, 5, 6])))" ] }, { @@ -477,7 +491,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -491,7 +505,8 @@ "source": [ "def F():\n", " x = 1\n", - " print filter(lambda a: a > x, range(-5, 5))\n", + " #기존: print filter(lambda a: a > x, range(-5, 5))\n", + " print(list(filter(lambda a: a > x, range(-5, 5))))\n", " \n", "F()" ] @@ -500,9 +515,73 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "## 검토필요" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(기존)\n", "- filter의 결과는 주어진 seq 자료형과 동일함" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(수정)\n", + "- filter, map은 iterator를 리턴함\n", + "- 참고\n", + " - https://docs.python.org/3/library/functions.html#map\n", + " - https://docs.python.org/3/library/functions.html#filter\n", + " - https://stackoverflow.com/questions/12319025/filters-in-python3" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "#추가됨\n", + "print(filter(lambda x: x > 2, [1, 2, 3, 34]))\n", + "print(filter(lambda x: x > 2, (1, 2, 3, 34)))\n", + "print(filter(lambda x: x < 'a', 'abcABCdefDEF'))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[3, 34]\n", + "(3, 34)\n", + "\n" + ] + } + ], + "source": [ + "#추가됨\n", + "print(list(filter(lambda x: x > 2, [1, 2, 3, 34])))\n", + "print(tuple(filter(lambda x: x > 2, (1, 2, 3, 34))))\n", + "print(str(filter(lambda x: x < 'a', 'abcABCdefDEF')))" + ] + }, { "cell_type": "code", "execution_count": 17, @@ -519,6 +598,7 @@ } ], "source": [ + "#기존\n", "print filter(lambda x: x > 2, [1, 2, 3, 34])\n", "print filter(lambda x: x > 2, (1, 2, 3, 34))\n", "print filter(lambda x: x < 'a', 'abcABCdefDEF')" @@ -529,17 +609,31 @@ "metadata": {}, "source": [ "### 2-4 reduce 내장 함수\n", - "- reduce (function, seq[, initial])\n", - " - seq 시퀀스 자료형이 지닌 원소값들에 대해 function 함수를 적용하면서 하나의 값으로 매핑한다.\n", + "- reduce (function, seq[, initial])\n", + " - 파이썬3에서는 다음의 라인을 추가해주어야 한다.\n", + " - from functools import reduce\n", + " - seq 시퀀스 자료형이 지닌 원소값들에 대해 function 함수를 적용하면서 하나의 값으로 매핑한다.(reduce returns a single value.)\n", " - 첫번째 인자인 function 함수는 반드시 두 개의 인자 (예를 들어, x, y)를 받아야 한다.\n", " - seq 시퀀스 자료형의 각 원소값들은 각 단계별로 y에 순차적으로 들어간다. \n", " - 함수가 수행된 값은 각 단계별로 x에 순차적으로 들어간다.\n", - " - 추가적으로 제공가능한 세번째 인자인 initial은 첫번째 단계에 x에 할당할 초기값으로 사용된다. " + " - 추가적으로 제공가능한 세번째 인자인 initial은 첫번째 단계에 x에 할당할 초기값으로 사용된다. \n", + " - 참고: https://www.python-course.eu/python3_lambda.php" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from functools import reduce" + ] + }, + { + "cell_type": "code", + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -551,7 +645,7 @@ } ], "source": [ - "print reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])" + "print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5]))" ] }, { @@ -576,7 +670,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -588,7 +682,7 @@ } ], "source": [ - "print reduce(lambda x, y: x + y, [1, 2, 3, 4, 5], 100)" + "print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5], 100))" ] }, { @@ -600,7 +694,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -612,12 +706,12 @@ } ], "source": [ - "print reduce(lambda x, y: x + y * y, range(1, 11), 0)" + "print(reduce(lambda x, y: x + y * y, range(1, 11), 0))" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -632,7 +726,7 @@ "x = 0\n", "for y in range(1, 11):\n", " x = x + y * y\n", - "print x" + "print(x)" ] }, { @@ -644,7 +738,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -656,7 +750,7 @@ } ], "source": [ - "print reduce(lambda x, y: y + x, 'abcde')" + "print(reduce(lambda x, y: y + x, 'abcde'))" ] }, { From 0643d1e877bf59f8c7df857271b5bd77ba714c16 Mon Sep 17 00:00:00 2001 From: Do-Hyung Date: Sun, 12 Nov 2017 22:10:27 +0900 Subject: [PATCH 065/124] python 15 --- python3.6/python15.ipynb | 98 ++++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/python3.6/python15.ipynb b/python3.6/python15.ipynb index 7172a43..bb73516 100644 --- a/python3.6/python15.ipynb +++ b/python3.6/python15.ipynb @@ -96,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -121,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -186,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -231,7 +231,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -255,7 +255,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![image](images/function_arg_int.png)" + "![image](../images/function_arg_int.png)" ] }, { @@ -268,7 +268,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -292,7 +292,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![image](images/function_arg_str.png)" + "![image](../images/function_arg_str.png)" ] }, { @@ -305,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -329,7 +329,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![image](images/function_arg_tuple.png)" + "![image](../images/function_arg_tuple.png)" ] }, { @@ -342,7 +342,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -366,7 +366,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![image](images/function_arg_list.png)" + "![image](../images/function_arg_list.png)" ] }, { @@ -379,7 +379,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -403,7 +403,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![image](images/function_arg_dict.png)" + "![image](../images/function_arg_dict.png)" ] }, { @@ -423,7 +423,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -450,7 +450,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -476,12 +476,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- return문 없는 함수라고 할 지라도 실제로는 None 객체가 전달됨" + "- return문이 없는 함수라 해도, 실제로는 None 객체가 리턴됨" ] }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -510,7 +510,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -522,11 +522,11 @@ } ], "source": [ - "def abs(x):\n", + "def abs_function(x):\n", " if x < 0 : return -x\n", " return x\n", "\n", - "print(abs(-10))" + "print(abs_function(-10))" ] }, { @@ -538,7 +538,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -576,13 +576,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 새로운 리스트를 리턴하는 함수 예\n", + "- 새로운 리스트를 리턴하는 함수의 예\n", " - 문자열 리스트를 받아서 각 문자열의 길이 정보를 지닌 리스트를 리턴 " ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -606,7 +606,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -627,14 +627,14 @@ "metadata": {}, "source": [ "### 1-5 함수 인자에 대한 동적인 자료형 결정\n", - "- 파이썬에서는 모든 객체는 동적으로 (실행시간에) 그 타입이 결정된다.\n", + "- 파이썬에서는 모든 객체는 동적으로 (실행 시간에) 그 타입이 결정된다.\n", "- 그러므로, 함수 인자는 함수가 호출되는 순간 해당 인자에 전달되는 객체에 따라 그 타입이 결정된다.\n", " - 함수 몸체 내에서 사용되는 여러가지 연산자들은 함수 호출시에 결정된 객체 타입에 맞게 실행된다." ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -679,7 +679,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -738,7 +738,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -767,7 +767,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -800,7 +800,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -829,16 +829,16 @@ "outputs": [ { "ename": "SyntaxError", - "evalue": "positional argument follows keyword argument (, line 1)", + "evalue": "positional argument follows keyword argument (, line 1)", "output_type": "error", "traceback": [ - "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m area(width=5, 20)\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m positional argument follows keyword argument\n" + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m area(width=5, 20)\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m positional argument follows keyword argument\n" ] } ], "source": [ "area(width=5, 20)\n", - "# SyntaxError: non-keyword arg after keyword arg" + "# 기존: SyntaxError: non-keyword arg after keyword arg" ] }, { @@ -850,7 +850,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -877,15 +877,15 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 28, "metadata": {}, "outputs": [ { "ename": "SyntaxError", - "evalue": "non-keyword arg after keyword arg (, line 4)", + "evalue": "positional argument follows keyword argument (, line 4)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m print incr(10, 2, step2=100, 200)\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m non-keyword arg after keyword arg\n" + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m4\u001b[0m\n\u001b[1;33m print(incr(10, 2, step2=100, 200))\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m positional argument follows keyword argument\n" ] } ], @@ -893,12 +893,13 @@ "def incr(a, step=1, step2=10, step3=100):\n", " return a + step + step2 + step3\n", "\n", - "print(incr(10, 2, step2=100, 200))" + "print(incr(10, 2, step2=100, 200))\n", + "# 기존: SyntaxError: non-keyword arg after keyword arg" ] }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -913,8 +914,7 @@ "def incr(a, step=1, step2=10, step3=100):\n", " return a + step + step2 + step3\n", "\n", - "print(incr(10, 2, step2=100, step3=200))\n", - "# SyntaxError: positional argument follows keyword argument" + "print(incr(10, 2, step2=100, step3=200))" ] }, { @@ -922,13 +922,13 @@ "metadata": {}, "source": [ "### 2-3 가변 인수 리스트\n", - "- 함수 정의시에 일반적인 인수 선언 뒤에 *var 형식의 인수로 가변 인수를 선언할 수 있음\n", - " - var에는 함수 호출시 넣어주는 인수 값들 중 일반 인수에 할당되는 값을 제외한 나머지 값들을 지닌 튜플 객체가 할당된다." + "- 함수 정의시에 일반적인 인수 선언 뒤에 *var 형식의 인수로 가변 인수를 선언할 수 있음\n", + " - var에는 함수 호출시 넣어주는 인수 값들 중 일반 인수에 할당되는 값을 제외한 나머지 값들을 지닌 튜플 객체가 할당된다." ] }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -959,7 +959,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -982,12 +982,12 @@ "metadata": {}, "source": [ "### 2-5 튜플 인수와 사전 인수로 함수 호출하기\n", - "- 함수 호출에 사용될 인수값들이 튜플에 있다면 \"*튜플변수\"를 이용하여 함수 호출이 가능" + "- 함수 호출에 사용될 인수값들이 튜플에 있다면 \"*튜플변수\"를 이용하여 함수 호출이 가능" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -1010,12 +1010,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 함수 호출에 사용될 인수값들이 사전에 있다면 \"*사전변수\"를 이용하여 함수 호출이 가능" + "- 함수 호출에 사용될 인수값들이 사전에 있다면 \"*사전변수\"를 이용하여 함수 호출이 가능" ] }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 33, "metadata": {}, "outputs": [ { From 74fee2f462b0f8c0133c1e42a0e7ff98c56e6aab Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 13 Nov 2017 23:15:13 +0900 Subject: [PATCH 066/124] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python15.ipynb | 136 ++++++++++++++++++++++-------- python3.6/python16.ipynb | 177 ++++++++++++++++++++++++++++----------- 2 files changed, 229 insertions(+), 84 deletions(-) diff --git a/python3.6/python15.ipynb b/python3.6/python15.ipynb index bb73516..555cb81 100644 --- a/python3.6/python15.ipynb +++ b/python3.6/python15.ipynb @@ -37,7 +37,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -77,7 +79,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -97,7 +101,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -122,7 +128,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -140,7 +148,9 @@ { "cell_type": "code", "execution_count": 9, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -168,7 +178,9 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "def simpleFunction():\n", @@ -187,7 +199,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -232,7 +246,9 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -269,7 +285,9 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -306,7 +324,9 @@ { "cell_type": "code", "execution_count": 9, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -343,7 +363,9 @@ { "cell_type": "code", "execution_count": 10, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -380,7 +402,9 @@ { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -424,7 +448,9 @@ { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -451,7 +477,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -482,7 +510,9 @@ { "cell_type": "code", "execution_count": 14, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -511,7 +541,9 @@ { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -539,7 +571,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -583,7 +617,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -607,7 +643,9 @@ { "cell_type": "code", "execution_count": 18, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -635,7 +673,9 @@ { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -680,7 +720,9 @@ { "cell_type": "code", "execution_count": 20, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -713,7 +755,9 @@ { "cell_type": "code", "execution_count": 82, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "SyntaxError", @@ -739,7 +783,9 @@ { "cell_type": "code", "execution_count": 22, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -768,7 +814,9 @@ { "cell_type": "code", "execution_count": 23, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -801,7 +849,9 @@ { "cell_type": "code", "execution_count": 24, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -825,7 +875,9 @@ { "cell_type": "code", "execution_count": 26, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "SyntaxError", @@ -851,7 +903,9 @@ { "cell_type": "code", "execution_count": 27, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -878,7 +932,9 @@ { "cell_type": "code", "execution_count": 28, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "SyntaxError", @@ -900,7 +956,9 @@ { "cell_type": "code", "execution_count": 29, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -929,7 +987,9 @@ { "cell_type": "code", "execution_count": 30, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -960,7 +1020,9 @@ { "cell_type": "code", "execution_count": 31, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -988,7 +1050,9 @@ { "cell_type": "code", "execution_count": 32, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1010,13 +1074,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 함수 호출에 사용될 인수값들이 사전에 있다면 \"*사전변수\"를 이용하여 함수 호출이 가능" + "- 함수 호출에 사용될 인수값들이 사전에 있다면 \"**사전변수\"를 이용하여 함수 호출이 가능" ] }, { "cell_type": "code", "execution_count": 33, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1055,7 +1121,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/python16.ipynb b/python3.6/python16.ipynb index b9ad708..ed3cf1e 100644 --- a/python3.6/python16.ipynb +++ b/python3.6/python16.ipynb @@ -43,7 +43,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -68,7 +70,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -93,7 +97,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -120,7 +126,9 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -150,7 +158,9 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -178,7 +188,9 @@ { "cell_type": "code", "execution_count": 9, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -207,7 +219,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -267,13 +281,17 @@ "source": [ "### 2-1 map 내장 함수\n", "- map(function, seq)\n", - " - seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 결과를 동일 시퀀스 자료형으로 반환한다." + " - (python2) seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 결과를 동일 시퀀스 자료형으로 반환한다.\n", + " - (python3) seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 원소를 지닌 map 객체를 반환한다.\n", + " - 이후 동일한 자료형으로 다시 변환 필요" ] }, { "cell_type": "code", "execution_count": 42, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -304,7 +322,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -336,7 +356,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -362,7 +384,9 @@ { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -388,7 +412,9 @@ { "cell_type": "code", "execution_count": 20, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -409,14 +435,26 @@ "source": [ "### 2-2 filter 내장 함수\n", "- filter(function, seq)\n", - " - seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 결과가 참인 원소값들만을 동일 시퀀스 자료형으로 반환한다." + " - (python2) seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 결과가 참인 원소값들만을 동일 시퀀스 자료형으로 반환한다.\n", + " - (python3) seq 시퀀스 자료형이 지닌 각 원소값들에 대해 function에 적용한 결과가 참인 원소값들만을 지닌 filter 객체를 반환한다.\n", + " - 이후 동일한 자료형으로 다시 변환 필요" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[3, 34]\n" + ] + } + ], "source": [ "#기존: print(filter(lambda x: x > 2, [1, 2, 3, 34]))\n", "print(list(filter(lambda x: x > 2, [1, 2, 3, 34])))" @@ -431,8 +469,10 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, + "execution_count": 2, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -459,9 +499,19 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 3, 5]\n" + ] + } + ], "source": [ "print(list(filter(lambda x: x % 2, [1, 2, 3, 4, 5, 6])))" ] @@ -475,11 +525,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 4, 6]\n" + ] + } + ], "source": [ - "print(list(ilter(lambda x: x % 2 - 1, [1, 2, 3, 4, 5, 6])))" + "print(list(filter(lambda x: x % 2 - 1, [1, 2, 3, 4, 5, 6])))" ] }, { @@ -491,8 +551,10 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, + "execution_count": 6, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -515,22 +577,22 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 검토필요" + "## python2 --> python3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "(기존)\n", - "- filter의 결과는 주어진 seq 자료형과 동일함" + "(python2)\n", + "- map과 filter의 결과는 주어진 seq 자료형과 동일함" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "(수정)\n", + "(python3)\n", "- filter, map은 iterator를 리턴함\n", "- 참고\n", " - https://docs.python.org/3/library/functions.html#map\n", @@ -540,16 +602,18 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, + "execution_count": 7, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "\n", - "\n" + "\n", + "\n", + "\n" ] } ], @@ -562,8 +626,10 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, + "execution_count": 8, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -571,7 +637,7 @@ "text": [ "[3, 34]\n", "(3, 34)\n", - "\n" + "\n" ] } ], @@ -585,7 +651,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -598,7 +666,7 @@ } ], "source": [ - "#기존\n", + "#기존(python2)\n", "print filter(lambda x: x > 2, [1, 2, 3, 34])\n", "print filter(lambda x: x > 2, (1, 2, 3, 34))\n", "print filter(lambda x: x < 'a', 'abcABCdefDEF')" @@ -610,7 +678,8 @@ "source": [ "### 2-4 reduce 내장 함수\n", "- reduce (function, seq[, initial])\n", - " - 파이썬3에서는 다음의 라인을 추가해주어야 한다.\n", + " - 파이썬3에서 reduce() 내장 함수 지원하지 않음.\n", + " - 파이썬3에서 reduce() 함수를 사용하려면 다음의 라인을 상단에 추가해주어야 한다.\n", " - from functools import reduce\n", " - seq 시퀀스 자료형이 지닌 원소값들에 대해 function 함수를 적용하면서 하나의 값으로 매핑한다.(reduce returns a single value.)\n", " - 첫번째 인자인 function 함수는 반드시 두 개의 인자 (예를 들어, x, y)를 받아야 한다.\n", @@ -634,7 +703,9 @@ { "cell_type": "code", "execution_count": 35, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -671,7 +742,9 @@ { "cell_type": "code", "execution_count": 36, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -695,7 +768,9 @@ { "cell_type": "code", "execution_count": 37, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -712,7 +787,9 @@ { "cell_type": "code", "execution_count": 38, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -739,7 +816,9 @@ { "cell_type": "code", "execution_count": 39, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -790,7 +869,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.0" } }, "nbformat": 4, From c77305a217a7af7d501a81e79167f7a053b0e49b Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 13 Nov 2017 23:26:30 +0900 Subject: [PATCH 067/124] =?UTF-8?q?=EC=88=99=EC=A0=9C=204=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-4.ipynb | 35 +++++++---------------------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/python3.6/assignment-4.ipynb b/python3.6/assignment-4.ipynb index e6f52c8..5f79bbe 100644 --- a/python3.6/assignment-4.ipynb +++ b/python3.6/assignment-4.ipynb @@ -10,7 +10,7 @@ "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", - "#### 5) 문제 (ACM-ICPC 6문제 포함하여 총 14개)" + "#### 5) 문제 (마지막 Incremental Project에 집중하기 위하여 이번 숙제에는 ACM-ICPC 문제는 포함하지 않음)" ] }, { @@ -92,7 +92,9 @@ { "cell_type": "code", "execution_count": 10, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -188,30 +190,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "##### [8번 문제]\n", - "프로젝트 오일러 문제 10\n", - "\n", - "##### [9번 문제]\n", - "프로젝트 오일러 문제 11\n", - "\n", - "##### [10번 문제]\n", - "프로젝트 오일러 문제 12\n", - "\n", - "##### [11번 문제]\n", - "프로젝트 오일러 문제 13\n", - "\n", - "##### [12번 문제]\n", - "프로젝트 오일러 문제 14\n", - "\n", - "##### [13번 문제]\n", - "프로젝트 오일러 문제 15" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### [14번 문제] \n", + "##### [8번 문제] \n", "이전 Assignment 3의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3를 확장하여 다음과 같은 조건을 만족하도록 구현하시오.\n", " - 1) 다음 사이트에서 제시되는 영어 불용어 (Stop words)를 참고하여 이전 숙제에서 구성했던 단어 사전에서 영어 불용어들을 모두 제거하는 코드를 추가하시오.\n", " - http://www.lextek.com/manuals/onix/stopwords1.html\n", @@ -241,7 +220,7 @@ " - ...\n", " - similarity[url2] = x2\n", " - ...\n", - " \n", + " - 위 코드에서 x1 과 x2는 입력단어와 해당 URL의 웹 사이트 간의 similarity를 나타내는 수치값 \n", " - 유사도가 높은 웹 사이트가 상위에 출력되어야 함 (즉, 유사도 기준 내림 차순)\n", " - 유사도가 동일한 웹 사이트들에 대해서는 임의 배치함.\n", " - 7) [주의] 필수사항\n", @@ -266,7 +245,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, From b676816b38a065adaa78e3f2bf339b946dccb272 Mon Sep 17 00:00:00 2001 From: dohyung Date: Tue, 14 Nov 2017 10:35:28 +0900 Subject: [PATCH 068/124] =?UTF-8?q?python=2016=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python16.ipynb | 104 ++++++++++----------------------------- 1 file changed, 27 insertions(+), 77 deletions(-) diff --git a/python3.6/python16.ipynb b/python3.6/python16.ipynb index ed3cf1e..e4da0d4 100644 --- a/python3.6/python16.ipynb +++ b/python3.6/python16.ipynb @@ -43,9 +43,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -70,9 +68,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -97,9 +93,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -126,9 +120,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -158,9 +150,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -188,9 +178,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -219,9 +207,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -238,7 +224,7 @@ ], "source": [ "# 더하기, 빼기, 곱하기, 나누기에 해당하는 람다 함수 리스트 정의\n", - "func = [lambda x, y: x + y, lambda x, y: x - y, lambda x, y: x * y, lambda x, y: x / y]\n", + "func = [lambda x, y: int(x) + int(y), lambda x, y: int(x) - int(y), lambda x, y: int(x) * int(y), lambda x, y: int(x) / int(y)]\n", "\n", "def menu():\n", " print(\"0. add\")\n", @@ -289,9 +275,7 @@ { "cell_type": "code", "execution_count": 42, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -322,9 +306,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -356,9 +338,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -384,9 +364,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -412,9 +390,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -443,9 +419,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -470,9 +444,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -500,9 +472,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -526,9 +496,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -552,9 +520,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -603,9 +569,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -627,9 +591,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -651,9 +613,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -703,9 +663,7 @@ { "cell_type": "code", "execution_count": 35, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -742,9 +700,7 @@ { "cell_type": "code", "execution_count": 36, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -768,9 +724,7 @@ { "cell_type": "code", "execution_count": 37, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -787,9 +741,7 @@ { "cell_type": "code", "execution_count": 38, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -816,9 +768,7 @@ { "cell_type": "code", "execution_count": 39, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -869,7 +819,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.1" } }, "nbformat": 4, From 7b4ec80750c409af5794dad287ac7dc761a24065 Mon Sep 17 00:00:00 2001 From: dohyung Date: Tue, 14 Nov 2017 10:38:36 +0900 Subject: [PATCH 069/124] =?UTF-8?q?python=2016=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python16.ipynb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/python3.6/python16.ipynb b/python3.6/python16.ipynb index e4da0d4..b6a5bbe 100644 --- a/python3.6/python16.ipynb +++ b/python3.6/python16.ipynb @@ -224,7 +224,10 @@ ], "source": [ "# 더하기, 빼기, 곱하기, 나누기에 해당하는 람다 함수 리스트 정의\n", - "func = [lambda x, y: int(x) + int(y), lambda x, y: int(x) - int(y), lambda x, y: int(x) * int(y), lambda x, y: int(x) / int(y)]\n", + "func = [lambda x, y: int(x) + int(y), \n", + " lambda x, y: int(x) - int(y), \n", + " lambda x, y: int(x) * int(y), \n", + " lambda x, y: int(x) / int(y)]\n", "\n", "def menu():\n", " print(\"0. add\")\n", @@ -243,8 +246,10 @@ " continue\n", " if sel == len(func): \n", " break\n", - " x = input('First operand:') \n", + " x = input('First operand:') \n", + " #또는 x = float(input('First operand:'))\n", " y = input('Second operand:') \n", + " #또는 y = float(input('Second operand:'))\n", " print('Result =', func[sel](x,y))" ] }, From 1518ee64c77657f67c649fc9dc214fddb0dfa1c7 Mon Sep 17 00:00:00 2001 From: dohyung Date: Sat, 18 Nov 2017 22:04:57 +0900 Subject: [PATCH 070/124] python code revised --- python3.6/Speech/Recognition/HMM.py | 11 + python3.6/Speech/Recognition/__init__.py | 0 .../__pycache__/HMM.cpython-36.pyc | Bin 0 -> 510 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 157 bytes python3.6/Speech/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 145 bytes .../__pycache__/module_test.cpython-36.pyc | Bin 0 -> 439 bytes python3.6/__pycache__/mymath.cpython-36.pyc | Bin 0 -> 388 bytes python3.6/__pycache__/prname.cpython-36.pyc | Bin 0 -> 136 bytes python3.6/module_test.py | 10 + python3.6/prname.ipynb | 34 + python3.6/prname.py | 7 + python3.6/python17.ipynb | 192 +- python3.6/python18.ipynb | 344 +-- python3.6/python19.ipynb | 330 +-- python3.6/python20.ipynb | 353 ++- python3.6/python21.ipynb | 1534 ++++++----- python3.6/python22.ipynb | 2316 ++++++++--------- python3.6/python23.ipynb | 1812 +++++++------ 19 files changed, 3509 insertions(+), 3434 deletions(-) create mode 100644 python3.6/Speech/Recognition/HMM.py create mode 100644 python3.6/Speech/Recognition/__init__.py create mode 100644 python3.6/Speech/Recognition/__pycache__/HMM.cpython-36.pyc create mode 100644 python3.6/Speech/Recognition/__pycache__/__init__.cpython-36.pyc create mode 100644 python3.6/Speech/__init__.py create mode 100644 python3.6/Speech/__pycache__/__init__.cpython-36.pyc create mode 100644 python3.6/__pycache__/module_test.cpython-36.pyc create mode 100644 python3.6/__pycache__/mymath.cpython-36.pyc create mode 100644 python3.6/__pycache__/prname.cpython-36.pyc create mode 100644 python3.6/module_test.py create mode 100644 python3.6/prname.ipynb create mode 100644 python3.6/prname.py diff --git a/python3.6/Speech/Recognition/HMM.py b/python3.6/Speech/Recognition/HMM.py new file mode 100644 index 0000000..a2bbea6 --- /dev/null +++ b/python3.6/Speech/Recognition/HMM.py @@ -0,0 +1,11 @@ +def train(): + print("Train") + pass + +def loadModel(): + print("LoadModel") + pass + +def saveModel(): + print("SaveModel") + pass diff --git a/python3.6/Speech/Recognition/__init__.py b/python3.6/Speech/Recognition/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python3.6/Speech/Recognition/__pycache__/HMM.cpython-36.pyc b/python3.6/Speech/Recognition/__pycache__/HMM.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..101050f55a7593d63448dead41305d9eed5c1b81 GIT binary patch literal 510 zcmb7A!Ait15KY>~ZN&vYz#quL&0)clh#-OoyP(y}-fAbb!J3pbReIK|AL1|d>R)); z$u8SP5Y)iTn@Qfxo5_4S-M`_7%XdP^C)#)djLy;8BXmH3zL6z?0766x5irC6_An_mR19T4SUMar&je(zXK3an*Oae0(ul zl*(1zgJ^nJVYY$!>_lXZltm?OWnoIKoWjSeG@Uj5z?_$$eu4-cp)s`#@$W+>*CvP5 zfUG&Sex2Qro5=Sal6uSX-FI4(|7m6Uv;1AF-LjHzT0UFwaJ`@P!q(sXIBtCUWT30% K+4wVY6h|xT0$b1k literal 0 HcmV?d00001 diff --git a/python3.6/Speech/Recognition/__pycache__/__init__.cpython-36.pyc b/python3.6/Speech/Recognition/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c6e065c9a0cffd4b2295774a22952b06febcbd7 GIT binary patch literal 157 zcmXr!<>fkO$Q8u^1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFE9Pj;?$yI{giy& zjLOoy^z8EdJpJ^{l8n+M{esGp3?L6e8S9zp2N$HKCTHjer6%X6=Vg{;0wv?)Gl8u5 Yc)fzkTO2mI`6;D2sdgYcih-B`03%Q+6951J literal 0 HcmV?d00001 diff --git a/python3.6/Speech/__init__.py b/python3.6/Speech/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python3.6/Speech/__pycache__/__init__.cpython-36.pyc b/python3.6/Speech/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf2fddc8d5612c48dbee506a94bdf3a9ff6905fd GIT binary patch literal 145 zcmXr!<>fkO$Q8u^1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFFXCv;?$yI{giy& zjLOoy^z8EdJpJ^{l8n+M{esGp3?L6e8S9zp2N$HKCTHl!$7kkcmc+;F6;$5hu*uC& ODa}c>1DRV4#0&s3jw4q9 literal 0 HcmV?d00001 diff --git a/python3.6/__pycache__/module_test.cpython-36.pyc b/python3.6/__pycache__/module_test.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b80a57a015832c52bb6c3b4a716e820446cc395b GIT binary patch literal 439 zcmZut%}N773{GaZ?NF?E^WddN7qlxBJcx+keG$Y2mJhw(@?z-$T2TJD&8UFYy$A0Vp(AQ2+n{ literal 0 HcmV?d00001 diff --git a/python3.6/__pycache__/mymath.cpython-36.pyc b/python3.6/__pycache__/mymath.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..452b9f3ce6d9c24846dee06414e83668507ce850 GIT binary patch literal 388 zcmYjMy-LJD5T4oHobm9$La@`uCWRN|&`Km=e;{IWUG6p}LG#0If&{KReHh=sr|6W6=kcA*jE!}3 zS`2-iKRh*coR?kEFXMLT3d(+HHob_ep-Q`A+73>pTC-s552FbvUh!5o=Bn?)5k5XY(JSt%5c#iG+c5)Ys$L&x5j_Y?+P!g RM)!}|6+c;?QzDe1{08(PMtcAN literal 0 HcmV?d00001 diff --git a/python3.6/__pycache__/prname.cpython-36.pyc b/python3.6/__pycache__/prname.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04ef272283943fc3470f0e754cb0b14dc0645006 GIT binary patch literal 136 zcmXr!<>lhk5QvgvU|@I*#Bjg}WH|tFF$<7LVF+f>Wb|9fPy`Z25Wh_ILyJ?3iuF_S zbu%hU^U|}+^Yir6GfOf`lk^KJOEQ2w2xY8ire9E$mzbNXS5SG2!zMRBr8Fni4rE+0 H5HkP(lTjaV literal 0 HcmV?d00001 diff --git a/python3.6/module_test.py b/python3.6/module_test.py new file mode 100644 index 0000000..153fa75 --- /dev/null +++ b/python3.6/module_test.py @@ -0,0 +1,10 @@ +def add(a, b): + return a + b + +def f(): + print("Python is becoming popular.") + + +if __name__ == "__main__": + print(add(1, 10)) + f() diff --git a/python3.6/prname.ipynb b/python3.6/prname.ipynb new file mode 100644 index 0000000..13fcb96 --- /dev/null +++ b/python3.6/prname.ipynb @@ -0,0 +1,34 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python3.6/prname.py b/python3.6/prname.py new file mode 100644 index 0000000..c856598 --- /dev/null +++ b/python3.6/prname.py @@ -0,0 +1,7 @@ + +# coding: utf-8 + +# In[ ]: + + + diff --git a/python3.6/python17.ipynb b/python3.6/python17.ipynb index f7551c0..1acacbc 100644 --- a/python3.6/python17.ipynb +++ b/python3.6/python17.ipynb @@ -34,7 +34,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![image](images/scoping_rule.png)" + "![image](../images/scoping_rule.png)" ] }, { @@ -49,9 +49,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -72,8 +70,8 @@ " b = h + a + g # b도 지역, g는 r-value이므로 기존 값을 참조 - 전역 변수\n", " return b\n", "\n", - "print f(h) # 함수 호출시에 사용되는 변수는 해당 위치의 스코프에서 값을 찾음 - 전역 변수\n", - "print h # 전역 변수 h는 변함 없음" + "print(f(h)) # 함수 호출시에 사용되는 변수는 해당 위치의 스코프에서 값을 찾음 - 전역 변수\n", + "print(h) # 전역 변수 h는 변함 없음" ] }, { @@ -81,15 +79,13 @@ "metadata": {}, "source": [ "- 함수 내부에서 전역 변수를 직접 사용하고자 할 때\n", - " - global 키워드 활용" + " - global 키워드 활용" ] }, { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -105,7 +101,7 @@ "\n", "def f(a): # a는 지역\n", " global h # h 변수를 전역이라고 미리 선언함\n", - " h = a + 10 # h는 l-velue로 정의되더라도 미리 선언된 내용 때문에 전역 변수\n", + " h = a + 10 # h는 l-value로 정의되더라도 미리 선언된 내용 때문에 전역 변수\n", " return h\n", "\n", "print f(10)\n", @@ -124,9 +120,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "UnboundLocalError", @@ -149,15 +143,13 @@ " g = 20 # l-value로 정의되는 g는 지역 변수\n", " return a\n", "\n", - "print f()" + "print(f())" ] }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -177,8 +169,8 @@ " g = 20 # g는 전역 변수\n", " return a\n", "\n", - "print f()\n", - "print g" + "print(f())\n", + "print(g)" ] }, { @@ -197,28 +189,26 @@ " - 함수 이름\n", " - 클래스 이름\n", " - 모듈 이름\n", - "- dir(): 함수가 호출된 스코프에서 정의되어 있는 모든 Name들을 문자열 리스트로 반환한다. \n", - "- dir(object): object이 지니고 있는 모든 Name들을 문자열 리스트로 반환한다." + "- dir(): 함수가 호출된 스코프에서 정의되어 있는 모든 Name들을 문자열 리스트로 반환한다. \n", + "- dir(object): object이 지니고 있는 모든 Name들을 문자열 리스트로 반환한다." ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" + "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" ] } ], "source": [ "l = []\n", - "print dir(l)" + "print(dir(l))" ] }, { @@ -232,10 +222,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -250,7 +238,7 @@ "def F():\n", " x = 1\n", " def G():\n", - " print x\n", + " print(x)\n", " G()\n", "\n", "F()" @@ -266,12 +254,11 @@ "- 모듈: 파이썬 프로그램 파일로서 파이썬 데이터와 함수등을 정의하고 있는 단위\n", " - 서로 연관된 작업을 하는 코드들을 묶어서 독립성을 유지하되 재사용 가능하게 만드는 단위\n", " - 모듈을 사용하는 측에서는 모듈에 정의된 함수나 변수 이름을 사용\n", - "\n", "- 모듈의 종류\n", " - 표준 모듈\n", " - 파이썬 언어 패키지 안에 기본적으로 포함된 모듈\n", " - 대표적인 표준 모듈 예\n", - " - math, string\n", + " - math, string\n", " - 사용자 생성 모듈\n", " - 개발자가 직접 정의한 모듈\n", " - 써드 파티 모듈\n", @@ -288,8 +275,8 @@ " - 모듈 코드를 저장하는 물리적인 단위\n", " - 모듈\n", " - 논리적으로 하나의 단위로 조직된 코드의 모임\n", - "- 파이썬 모듈이 정의되는 파일의 확장자: .py\n", - "- 다른 곳에서 모듈을 사용하게 되면 해당 모듈의 .py는 바이트 코드로 컴파일 되어 .pyc로 존재한다." + "- 파이썬 모듈이 정의되는 파일의 확장자: .py\n", + "- 다른 곳에서 모듈을 사용하게 되면 해당 모듈의 .py는 바이트 코드로 컴파일 되어 .pyc로 존재한다." ] }, { @@ -301,9 +288,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -321,24 +308,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 모듈 이름은 해당 모듈을 정의한 파일 이름에서 .py를 제외한 것\n", - " - 모듈을 불러오는 키워드: import\n", + "- 모듈 이름은 해당 모듈을 정의한 파일 이름에서 .py를 제외한 것\n", + " - 모듈을 불러오는 키워드: import\n", "- 모듈에서 정의한 이름 사용하기" ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "50.24\n", - "['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'add', 'area', 'mypi']\n", + "['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add', 'area', 'mypi']\n", "3.14\n", "78.5\n" ] @@ -347,9 +331,9 @@ "source": [ "import mymath\n", "\n", - "print dir(mymath) # mymath에 정의된 이름들 확인하기\n", - "print mymath.mypi # mymath 안에 정의된 mypi를 사용한다\n", - "print mymath.area(5) # mymath 안에 정의된 area를 사용한다" + "print(dir(mymath)) # mymath에 정의된 이름들 확인하기\n", + "print(mymath.mypi) # mymath 안에 정의된 mypi를 사용한다\n", + "print(mymath.area(5)) # mymath 안에 정의된 area를 사용한다" ] }, { @@ -376,27 +360,35 @@ "metadata": {}, "source": [ "### 2-4 모듈이 지닌 이름들 알아보기\n", - "- dir(모듈): 모듈이 지니고 있는 모든 이름들을 리스트로 반환 " + "- dir(모듈): 모듈이 지니고 있는 모든 이름들을 리스트로 반환 " ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['Formatter', 'Template', '_TemplateMetaclass', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_float', '_idmap', '_idmapL', '_int', '_long', '_multimap', '_re', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'atof', 'atof_error', 'atoi', 'atoi_error', 'atol', 'atol_error', 'capitalize', 'capwords', 'center', 'count', 'digits', 'expandtabs', 'find', 'hexdigits', 'index', 'index_error', 'join', 'joinfields', 'letters', 'ljust', 'lower', 'lowercase', 'lstrip', 'maketrans', 'octdigits', 'printable', 'punctuation', 'replace', 'rfind', 'rindex', 'rjust', 'rsplit', 'rstrip', 'split', 'splitfields', 'strip', 'swapcase', 'translate', 'upper', 'uppercase', 'whitespace', 'zfill']\n" + "['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']\n" ] } ], "source": [ "import string\n", - "print dir(string)" + "print(dir(string))\n", + "\n", + "# 기존:\n", + "# ['Formatter', 'Template', '_TemplateMetaclass', '__builtins__', '__doc__', '__file__', \n", + "# '__name__', '__package__', '_float', '_idmap', '_idmapL', '_int', '_long', '_multimap', \n", + "# '_re', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'atof', 'atof_error', 'atoi', \n", + "# 'atoi_error', 'atol', 'atol_error', 'capitalize', 'capwords', 'center', 'count', 'digits', \n", + "# 'expandtabs', 'find', 'hexdigits', 'index', 'index_error', 'join', 'joinfields', 'letters', \n", + "# 'ljust', 'lower', 'lowercase', 'lstrip', 'maketrans', 'octdigits', 'printable', 'punctuation', \n", + "# 'replace', 'rfind', 'rindex', 'rjust', 'rsplit', 'rstrip', 'split', 'splitfields', 'strip', \n", + "# 'swapcase', 'translate', 'upper', 'uppercase', 'whitespace', 'zfill']" ] }, { @@ -415,17 +407,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- string 모듈 이름 공간에 변수 a를 생성한다.\n", + "- string 모듈 이름 공간에 변수 a를 생성한다.\n", " - 표준 모듈에 사용자가 정의하는 이름을 생성하는 것은 비추천\n", " - 단지 모듈 자체가 독립적인 이름 공간을 제공한다는 것을 알려줌" ] }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 15, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -438,7 +428,7 @@ "source": [ "import string\n", "string.a = 1\n", - "print string.a" + "print(string.a)" ] }, { @@ -450,10 +440,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -472,9 +460,9 @@ "\n", "c = C() # 클래스 인스턴스 객체 생성\n", "c.a = 1 # 클래스에서 생성된 인스턴스 객체도 별도의 이름 공간\n", - "print c.a\n", - "print c.__class__.a\n", - "print C.a" + "print(c.a)\n", + "print(c.__class__.a)\n", + "print(C.a)" ] }, { @@ -487,10 +475,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 17, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -507,7 +493,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mprint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'function' object has no attribute 'a'" ] } @@ -518,9 +504,9 @@ " a = 1\n", " b = 2 # 현재 모듈에 정의되는 함수 f 내에 이름 a,b를 정의하고있다. 함수도 독립적인 이름 공간\n", "f.c = 1\n", - "print f.c\n", - "print\n", - "print f.a" + "print(f.c)\n", + "print()\n", + "print(f.a)" ] }, { @@ -536,25 +522,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 3-1 PYTHONPATH 환경 변수 설정하기\n", + "### 3-1 PYTHONPATH 환경 변수 설정하기\n", "- 파이썬이 모듈을 찾는 순서\n", " - 1) 이미 메모리에 로딩되어진 것\n", - " - 2) 현재 디렉토리 (ipython에서 pwd 명령으로 확인 가능)\n", - " - 3) PYTHONPATH 환경 변수에 기술된 디렉토리 목록을 차례로 탐색\n", + " - 2) 현재 디렉토리 (ipython에서 pwd 명령으로 확인 가능)\n", + " \n", + " - ! pwd\n", + " \n", + " \n", + " - 3) PYTHONPATH 환경 변수에 기술된 디렉토리 목록을 차례로 탐색\n", " - 4) 표준 라이브러리 디렉토리들\n", - " - sys 모듈 임포트 후 sys.path 로 확인 가능\n", - " - sys.path.append(), sys.path.remove()로 추가, 삭제 가능\n", - "- PYTHONPATH 환경 변수 설정 방법\n", + " - sys 모듈 임포트 후 sys.path 로 확인 가능\n", + " - sys.path.append(), sys.path.remove()로 추가, 삭제 가능\n", + "- PYTHONPATH 환경 변수 설정 방법\n", " - 윈도우즈\n", " - 제어판\\시스템 및 보안\\시스템\\고급 시스템 설정\\환경 변수\n", - " - 새로 만들기: 변수 이름 - PYTHONPATH, 변수 값 - C:\\Users\\yhhan\\mypythonlib\n", + " - 새로 만들기: 변수 이름 - PYTHONPATH, 변수 값 - C:\\Users\\yhhan\\mypythonlib\n", " - python 새로 시작하기 (cmd창 새로 시작한 후)\n", " - MAC이나 리눅스\n", - " - ~/.bash_profile 혹은 ~/.profile 파일에 다음 라인 추가\n", - " - export PYTHONPATH=/Users/yhhan/mypythonlib\n", + " - ~/.bash_profile 혹은 ~/.profile 파일에 다음 라인 추가\n", + " - export PYTHONPATH=/Users/yhhan/mypythonlib\n", " - 터미널 창에서 다음 명령어 수행 \n", - " - source ~/.bash_profile\n", - " - 이클립스에서 PYTHONPATH 설정\n", + " - source ~/.bash_profile\n", + " - 이클립스에서 PYTHONPATH 설정\n", " - [참고] https://goo.gl/crPFi0 " ] }, @@ -562,7 +552,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![inheritance](images/pythonpath_eclipse.png)" + "![inheritance](../images/pythonpath_eclipse.png)" ] }, { @@ -575,9 +565,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -602,9 +590,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -631,23 +617,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python [Root]", + "display_name": "Python 3", "language": "python", - "name": "Python [Root]" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.6.1" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/python3.6/python18.ipynb b/python3.6/python18.ipynb index f343912..ab012aa 100644 --- a/python3.6/python18.ipynb +++ b/python3.6/python18.ipynb @@ -16,7 +16,7 @@ "metadata": {}, "source": [ "***\n", - "## 1 모듈의 다양한 import 방법\n", + "## 1 모듈의 다양한 import 방법\n", "***" ] }, @@ -24,18 +24,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-1 모듈 import 하기\n", - "#### 1) import 모듈명\n", + "### 1-1 모듈 import 하기\n", + "#### 1) import 모듈명\n", "- 가장 기본적인 형태\n", - " - 이름 공간 mymath가 그대로 유지되므로 mymath.area() 형태로 자격 이름 사용" + " - 이름 공간 mymath가 그대로 유지되므로 mymath.area() 형태로 자격 이름 사용" ] }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -47,25 +45,23 @@ ], "source": [ "import mymath\n", - "print mymath.area(5)" + "print(mymath.area(5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 2) from 모듈명 import 이름들\n", + "#### 2) from 모듈명 import 이름들\n", "- 해당 모듈에 존재하는 지정 이름들을 현재 이름 공간으로 불러들인다.\n", "- 불러들인 각 이름들은 모듈 이름 없이 직접 사용 가능하다.\n", - "- import 하는 이름들이 기존에 미리 존재하고 있었다면 그 이름들에 의해 참조되던 기존 객체들은 상실된다." + "- import 하는 이름들이 기존에 미리 존재하고 있었다면 그 이름들에 의해 참조되던 기존 객체들은 상실된다." ] }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -77,23 +73,21 @@ ], "source": [ "from mymath import area, mypi\n", - "print area(5)" + "print(area(5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 3) from 모듈명 import *\n", + "#### 3) from 모듈명 import *\n", "- 해당 모듈에 존재하는 '\\_\\_'로 시작되는 이름들을 제외한 모든 이름들을 현재 이름 공간으로 불러들인다. " ] }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -105,14 +99,14 @@ ], "source": [ "from mymath import *\n", - "print area(5)" + "print(area(5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 4) import 모듈명 as 새로운 모듈 이름\n", + "#### 4) import 모듈명 as 새로운 모듈 이름\n", "- 해당 모듈을 새로운 다른 이름으로 사용하고자 할 때 사용\n", "- 기존 모듈 이름이 너무 길거나 현재 사용중인 다름 이름들과 충돌이 일어날 때 유용" ] @@ -120,9 +114,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -136,99 +128,154 @@ ], "source": [ "import string as chstr\n", - "print chstr\n", - "print\n", - "print chstr.punctuation" + "print(chstr)\n", + "print()\n", + "print(chstr.punctuation)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 5) from 모듈명 import 이름 as 새로운 이름[, 이름 as 새로운 이름]\n", + "#### 5) from 모듈명 import 이름 as 새로운 이름[, 이름 as 새로운 이름]\n", "- 해당 모듈 내에 정의된 이름을 다른 새로운 이름으로 사용하고자 할 때 사용" ] }, { "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "ham egg spam\n" + "This Is A Text\n" + ] + } + ], + "source": [ + "mystring = \"This Is A String\"\n", + "print(mystring.replace(\"String\",\"Text\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "ename": "ImportError", + "evalue": "cannot import name 'replace'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mstring\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mreplace\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0msubstitute\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msubstitute\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msubstitute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'ham chicken spam'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'chicken'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'egg'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m# 기존:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mImportError\u001b[0m: cannot import name 'replace'" ] } ], "source": [ "from string import replace as substitute\n", - "print substitute\n", - "print substitute('ham chicken spam', 'chicken', 'egg')" + "print(substitute)\n", + "print(substitute('ham chicken spam', 'chicken', 'egg'))\n", + "\n", + "# 기존:\n", + "# \n", + "# ham egg spam" ] }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, + "execution_count": 15, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "ABC\n" + "ham egg spam\n" + ] + } + ], + "source": [ + "print('ham chicken spam'.replace(\"chicken\",\"egg\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "Missing parentheses in call to 'print' (, line 2)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m print up\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m Missing parentheses in call to 'print'\n" ] } ], "source": [ "from string import replace as substitute, upper as up\n", "print up\n", - "print up('abc')" + "print up('abc')\n", + "\n", + "#기존:\n", + "# \n", + "# ABC" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ABC\n" + ] + } + ], + "source": [ + "print('abc'.upper())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- import 문은 보통의 문(statement)이 작성될 수 있는 곳이면 어디에서나 사용 가능\n", - " - 예를 들면 함수 정의 def 문 안이나 if 문 안에서 사용할 수 있음" + "- import 문은 보통의 문(statement)이 작성될 수 있는 곳이면 어디에서나 사용 가능\n", + " - 예를 들면 함수 정의 def 문 안이나 if 문 안에서 사용할 수 있음" ] }, { "cell_type": "code", "execution_count": 40, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "def str_test(s):\n", " import string\n", " t = string.split(s)\n", - " return t" + " return(t)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-2 import에 의한 모듈 코드 수행\n", - "- import는 코드를 가져오기만 하는 것이 아니라 가져온 코드를 수행한다." + "### 1-2 import에 의한 모듈 코드 수행\n", + "- import는 코드를 가져오기만 하는 것이 아니라 가져온 코드를 수행한다." ] }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 18, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -248,26 +295,19 @@ "def area(r):\n", " return mypi * r * r\n", "\n", - "print area(4.0)" + "print(area(4.0))" ] }, { "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "50.24\n" - ] - } - ], + "execution_count": 19, + "metadata": {}, + "outputs": [], "source": [ - "import mymath" + "import mymath\n", + "\n", + "#기존:\n", + "#50.24" ] }, { @@ -275,17 +315,17 @@ "metadata": {}, "source": [ "### 1-3 컴파일과 적재시간\n", - "- import mymath를 수행할 때 발생하는 일\n", - " - 1) 우선 mymath.pyc를 찾는다.\n", - " - 2) mymath.pyc가 없다면 mymath.py를 찾아서 mymath.pyc를 생성한다.\n", - " - 3) 생성된 mymath.pyc를 메모리로 읽어들여 수행한다.\n", - "- .pyc 파일\n", + "- import mymath를 수행할 때 발생하는 일\n", + " - 1) 우선 mymath.pyc를 찾는다.\n", + " - 2) mymath.pyc가 없다면 mymath.py를 찾아서 mymath.pyc를 생성한다.\n", + " - 3) 생성된 mymath.pyc를 메모리로 읽어들여 수행한다.\n", + "- .pyc 파일\n", " - 바이트 코드 파일\n", " - 기계나 플랫폼(OS)에 의존하지 않도록 만들어진 일종의 목적 코드 (Object Code)\n", " - 파이썬은 컴파일 언어이면서 동시에 인터프리터 언어의 수행 방식을 취하고 있다.\n", - "- 새로운 .pyc 생성에 대한 판단\n", - " - .py 수정 시간이 .pyc 수정 시간보다 더 최근일 때\n", - "- .py가 없이도 .pyc 파일만 있어도 import 가능\n", + "- 새로운 .pyc 생성에 대한 판단\n", + " - .py 수정 시간이 .pyc 수정 시간보다 더 최근일 때\n", + "- .py가 없이도 .pyc 파일만 있어도 import 가능\n", " - 코드를 숨기는 간단한 기법으로 활용 가능" ] }, @@ -300,9 +340,7 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -321,9 +359,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -336,22 +372,20 @@ "source": [ "import string\n", "string = \"My first string\" #여기서 string이란 이름은 문자열을 참조하게 된다.\n", - "print string" + "print(string)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- 한번 import 되었던 모듈은 메모리에 적재되어지고, 나중에 다시 동일한 모듈을 import하면 메모리에 적재되어 있던 모듈이 즉시 사용된다." + "- 한번 import 되었던 모듈은 메모리에 적재되어지고, 나중에 다시 동일한 모듈을 import하면 메모리에 적재되어 있던 모듈이 즉시 사용된다." ] }, { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -366,10 +400,10 @@ "import string\n", "string.a = 1\n", "string = \"My first string\"\n", - "print string\n", + "print(string)\n", "\n", "import string\n", - "print string.a # 여기서 string 모듈이 기존에 이미 등록되었던 것임을 알 수 있다." + "print(string.a) # 여기서 string 모듈이 기존에 이미 등록되었던 것임을 알 수 있다." ] }, { @@ -380,7 +414,7 @@ "## 2 모듈의 실행과 테스트 코드\n", "***\n", "- \\_\\_name\\_\\_\n", - " - 현재의 모듈이 최상위 모듈로서 수행되는지, 아니면 다른 모듈에 의해 import 되어 수행되는지를 구별하기 위해 주로 활용\n", + " - 현재의 모듈이 최상위 모듈로서 수행되는지, 아니면 다른 모듈에 의해 import 되어 수행되는지를 구별하기 위해 주로 활용\n", " - 최상위 모듈: 파이썬 인터프리터가 기본적으로 가장 먼저 인식하여 처리하는 모듈" ] }, @@ -388,18 +422,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- prname.py를 직접 수행할 때의 출력 내용: \\_\\_main\\_\\_\n", - " - \\>\\>\\> ipython prname.py\n", + "- prname.py를 직접 수행할 때의 출력 내용: \\_\\_main\\_\\_\n", + " - \\>\\>\\> ipython prname.py\n", " - \\_\\_main\\_\\_\n", - " - prname.py가 최상위 모듈로서 수행됨을 의미" + " - prname.py가 최상위 모듈로서 수행됨을 의미" ] }, { "cell_type": "code", "execution_count": 38, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -411,22 +443,20 @@ ], "source": [ "#FILE : prname.py\n", - "print __name__" + "print(__name__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- prname.py가 모듈로서 다른 이름 공간으로 import 되어질 때의 출력 내용: prname" + "- prname.py가 모듈로서 다른 이름 공간으로 import 되어질 때의 출력 내용: prname" ] }, { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -439,15 +469,13 @@ ], "source": [ "import prname\n", - "print prname.__name__" + "print(prname.__name__)" ] }, { "cell_type": "code", - "execution_count": 63, - "metadata": { - "collapsed": false - }, + "execution_count": 28, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -455,39 +483,37 @@ "text": [ "string\n", "re\n", - "mimetools\n", "os\n" ] } ], "source": [ "import string\n", - "print string.__name__\n", + "print(string.__name__)\n", "\n", "import re\n", - "print re.__name__\n", + "print(re.__name__)\n", "\n", - "import mimetools\n", - "print mimetools.__name__\n", + "# import mimetools\n", + "# print(mimetools.__name__)\n", + "# PYthon2.x에서는 사용 가능힘\n", "\n", "import os\n", - "print os.__name__" + "print(os.__name__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- 아래 코드는 최상위 모듈로서 수행될 때에만 test() 함수 호출이 일어난다. \n", + "- 아래 코드는 최상위 모듈로서 수행될 때에만 test() 함수 호출이 일어난다. \n", "- 보통 파이썬 모듈을 개발할 때에는 마지막 부분에 if \\_\\_name\\_\\_ == \"\\_\\_main\\_\\_\": 과 같은 코드를 추가하여 테스트 코드를 삽입한다." ] }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 29, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -504,10 +530,10 @@ " return a + b\n", "\n", "def f():\n", - " print \"Python is becoming popular.\"\n", + " print(\"Python is becoming popular.\")\n", "\n", "if __name__ == \"__main__\":\n", - " print add(1, 10)\n", + " print(add(1, 10))\n", " f()" ] }, @@ -515,16 +541,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 정의된 모듈이 다른 모듈로 import되어질 때에는 \\_\\_name\\_\\_은 모듈 이름 자체이므로 위 코드에서 if 문이 수행되지 않는다. \n", - " - 즉, test() 함수 호출이 곧바로 되지 않는다." + "- 정의된 모듈이 다른 모듈로 import되어질 때에는 \\_\\_name\\_\\_은 모듈 이름 자체이므로 위 코드에서 if 문이 수행되지 않는다. \n", + " - 즉, test() 함수 호출이 곧바로 되지 않는다." ] }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 32, + "metadata": {}, "outputs": [], "source": [ "import module_test" @@ -563,15 +587,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![inheritance](images/package.png)" + "![inheritance](../images/package.png)" ] }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, + "execution_count": 33, + "metadata": {}, "outputs": [], "source": [ "import Speech" @@ -582,34 +604,34 @@ "metadata": {}, "source": [ "- Speech 디렉토리의 위치\n", - " - sys.path(또는 PYTHONPATH 환경 변수)에 열거된 폴더 중 하나에 위치해야 한다." + " - sys.path(또는 PYTHONPATH 환경 변수)에 열거된 폴더 중 하나에 위치해야 한다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- Speech/Recognition/HMM.py 코드 내용" + "- Speech/Recognition/HMM.py 코드 내용" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 34, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ "def train():\n", - " print \"Train\"\n", + " print(\"Train\")\n", " pass\n", "\n", "def loadModel():\n", - " print \"LoadModel\"\n", + " print(\"LoadModel\")\n", " pass\n", "\n", "def saveModel():\n", - " print \"SaveModel\" \n", + " print(\"SaveModel\")\n", " pass" ] }, @@ -625,15 +647,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 3-3 import 하기" + "### 3-3 import 하기" ] }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 36, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -650,10 +670,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 37, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -670,10 +688,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 38, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -692,15 +708,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 3-4 import * 하기" + "### 3-4 import * 하기" ] }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 39, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -729,23 +743,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python [Root]", + "display_name": "Python 3", "language": "python", - "name": "Python [Root]" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.6.1" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/python3.6/python19.ipynb b/python3.6/python19.ipynb index c4133bd..21c2dce 100644 --- a/python3.6/python19.ipynb +++ b/python3.6/python19.ipynb @@ -26,8 +26,8 @@ "source": [ "- 파이썬 클래스는 새로운 이름 공간을 지원하는 또 다른 단위\n", "- 클래스 정의 구문\n", - "> class 클래스 이름: #헤더(Header)
\n", - ">         pass #몸체(Body)\n", + "> class 클래스 이름: #헤더(Header)
\n", + ">         pass #몸체(Body)\n", "- 인스턴스: 클래스로 부터 만들어낸 객체\n", "- 모듈 vs. 클래스 vs. 인스턴스\n", " - 모듈: 파일 단위로 이름 공간을 구성\n", @@ -38,9 +38,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -59,16 +57,16 @@ "class S1:\n", " a = 1\n", " \n", - "print S1.a\n", - "print\n", + "print(S1.a)\n", + "print()\n", "\n", "S1.b = 2 # 클래스 이름 공간에 새로운 이름의 생성\n", - "print S1.b\n", - "print\n", + "print(S1.b)\n", + "print()\n", "\n", - "print dir(S1) # S1에 포함된 이름들을 리스트로 반환\n", + "print(dir(S1)) # S1에 포함된 이름들을 리스트로 반환\n", "del S1.b # 이름 공간 S1에서 b삭제\n", - "print dir(S1)" + "print(dir(S1))" ] }, { @@ -82,9 +80,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -98,20 +94,18 @@ ], "source": [ "x = S1() # x는 S1의 클래스 인스턴스\n", - "print x.a\n", + "print(x.a)\n", "\n", "x.a = 10 # 클래스 인스턴스 x의 이름 공간에 이름 생성\n", - "print x.a\n", + "print(x.a)\n", "\n", - "print S1.a # 클래스 이름 공간과 클래스 인스턴스의 이름공간은 다르다" + "print(S1.a) # 클래스 이름 공간과 클래스 인스턴스의 이름공간은 다르다" ] }, { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -128,17 +122,15 @@ "\n", "y.a = 300 # 클래스 인스턴스 y의 이름 공간에 이름 생성\n", "\n", - "print y.a \n", - "print x.a # x 인스턴스 공간의 이름 a 확인\n", - "print S1.a # 클래스 이름 공간의 a 확인" + "print(y.a)\n", + "print(x.a) # x 인스턴스 공간의 이름 a 확인\n", + "print(S1.a) # 클래스 이름 공간의 a 확인" ] }, { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "class Simple:\n", @@ -151,9 +143,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -168,13 +158,13 @@ }, { "ename": "AttributeError", - "evalue": "Simple instance has no attribute 'stack'", + "evalue": "'Simple' object has no attribute 'stack'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mprint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m \u001b[0;31m# 최종 s1.stack값\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m \u001b[0;31m# s2에는 stack을 정의한 적이 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: Simple instance has no attribute 'stack'" + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 최종 s1.stack값\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# s2에는 stack을 정의한 적이 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: 'Simple' object has no attribute 'stack'" ] } ], @@ -184,27 +174,28 @@ "s1.stack.append(2)\n", "s1.stack.append(3)\n", "\n", - "print s1.stack \n", - "print s1.stack.pop() \n", - "print s1.stack.pop()\n", - "print\n", - "print s1.stack # 최종 s1.stack값\n", - "print s2.stack # s2에는 stack을 정의한 적이 없다." + "print(s1.stack)\n", + "print(s1.stack.pop()) \n", + "print(s1.stack.pop())\n", + "print()\n", + "print(s1.stack) # 최종 s1.stack값\n", + "print(s2.stack) # s2에는 stack을 정의한 적이 없다.\n", + "\n", + "#기존에러:\n", + "#AttributeError: Simple instance has no attribute 'stack'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "![inheritance](images/instance.png)" + "![inheritance](../images/instance.png)" ] }, { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "del s1.stack # s1에서 stack삭제" @@ -230,18 +221,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 클래스 내부에 메소드 선언 - def 키워드 사용\n", - " - 일반 함수와 다른 점은 첫번째 인수로 self 사용 (self라는 이름은 관례적)\n", - " - self: 인스턴스 객체 자신의 레퍼런스를 지니고 있음\n", - " - 각 인스턴스들은 self를 이용하여 자신의 이름 공간에 접근 " + "- 클래스 내부에 메소드 선언 - def 키워드 사용\n", + " - 일반 함수와 다른 점은 첫번째 인수로 self 사용 (self라는 이름은 관례적)\n", + " - self: 인스턴스 객체 자신의 레퍼런스를 지니고 있음\n", + " - 각 인스턴스들은 self를 이용하여 자신의 이름 공간에 접근 " ] }, { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "class MyClass:\n", @@ -255,15 +244,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 인스턴스 객체를 통하여 메소드를 호출할 때 self 인자는 없다고 생각" + "- 인스턴스 객체를 통하여 메소드를 호출할 때 self 인자는 없다고 생각" ] }, { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -277,8 +264,8 @@ "source": [ "c = MyClass() # 인스턴스 생성 \n", "c.set('egg') # 메소드 set 호출\n", - "print c.get() # 메소드 get 호출\n", - "print c.value # 인스턴스 변수에 직접 접근" + "print(c.get()) # 메소드 get 호출\n", + "print(c.value) # 인스턴스 변수에 직접 접근" ] }, { @@ -291,9 +278,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -307,16 +292,41 @@ "source": [ "c = MyClass() # 인스턴스 생성 \n", "MyClass.set(c, 'egg')\n", - "print MyClass.get(c)\n", - "print c.value" + "print(MyClass.get(c))\n", + "print(c.value)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- python2.x\n", + " - MyClass.set(s1, 'egg')와 같이 다른 클래스의 인스턴스를 넣어주면 에러 발생\n", + "- python3.x\n", + " - 에러가 발생하지 않음" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": true }, + "outputs": [], + "source": [ + "#python3.x\n", + "class Simple:\n", + " pass\n", + "\n", + "c = MyClass()\n", + "s1 = Simple()\n", + "MyClass.set(s1, 'egg') # 다른 클래스의 인스턴스를 넣어주면 에러 발생" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -331,6 +341,7 @@ } ], "source": [ + "#python2.x\n", "class Simple:\n", " pass\n", "\n", @@ -360,9 +371,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -385,27 +394,25 @@ " \n", "c = MyClass()\n", "c.set(1)\n", - "print c.get()\n", + "print(c.get())\n", "\n", - "print\n", + "print()\n", "\n", "c.incr()\n", - "print c.get()" + "print(c.get())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- 만약 위 코드에서 self.set(self.value + 1)를 set(self.value + 1)으로 바꾸면 set 함수를 클래스 외부에서 찾는다. " + "- 만약 위 코드에서 self.set(self.value + 1)set(self.value + 1)으로 바꾸면 set 함수를 클래스 외부에서 찾는다. " ] }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -420,7 +427,7 @@ ], "source": [ "def set(i):\n", - " print \"set function outside function - \", i\n", + " print(\"set function outside function - \", i)\n", " \n", "class MyClass:\n", " def set(self, v):\n", @@ -432,12 +439,12 @@ " \n", "c = MyClass()\n", "c.set(1)\n", - "print c.get()\n", + "print(c.get())\n", "\n", - "print\n", + "print()\n", "\n", "c.incr()\n", - "print c.get()" + "print(c.get())" ] }, { @@ -447,15 +454,13 @@ "### 2-3 정적 메소드(static method)\n", "- 정적 메소드: 인스턴스 객체와 무관하게 클래스 이름 공간에 존재하는 메소드로서 클래스 이름을 이용하여 직접 호출할 수 있는 메소드\n", " - [주의] 해당 클래스의 인스턴스를 통해서도 호출 가능\n", - "- 장식자(Decorator) @staticmethod 활용 " + "- 장식자(Decorator) @staticmethod 활용 " ] }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -471,11 +476,11 @@ "class D:\n", " @staticmethod\n", " def spam(x, y): # self가 없다.\n", - " print 'static method', x, y\n", + " print('static method', x, y)\n", " \n", "D.spam(1,2) # 인스턴스 객체 없이 클래스에서 직접 호출\n", "\n", - "print\n", + "print()\n", "d = D()\n", "d.spam(1,2) # 인스턴스 객체를 통해서도 호출 가능" ] @@ -487,23 +492,21 @@ "### 2-4 클래스 메소드(class method)\n", "- 클래스 메소드: 인스턴스 객체와 무관하게 클래스 이름 공간에 존재하는 메소드로서 클래스 이름을 이용하여 호출하며 첫 인수로 클래스 객체를 자동으로 받는 메소드\n", " - [주의] 해당 클래스의 인스턴스를 통해서도 호출 가능\n", - "- 장식자(Decorator) @classmethod 활용 " + "- 장식자(Decorator) @classmethod 활용 " ] }, { "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": false - }, + "execution_count": 15, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "__main__.C\n", - "__main__.C -> 5\n", - "__main__.C -> 5\n" + "\n", + " -> 5\n", + " -> 5\n" ] } ], @@ -511,14 +514,19 @@ "class C:\n", " @classmethod\n", " def spam(cls, y):\n", - " print cls, '->', y\n", + " print(cls, '->', y)\n", " \n", - "print C\n", + "print(C)\n", "\n", "C.spam(5) # 첫번째 인수로 C가 잠재적으로 전달된다.\n", "\n", "c = C()\n", - "c.spam(5) # 인스턴스 객체를 통해서도 호출 가능." + "c.spam(5) # 인스턴스 객체를 통해서도 호출 가능.\n", + "\n", + "#기존\n", + "# __main__.C\n", + "# __main__.C -> 5\n", + "# __main__.C -> 5" ] }, { @@ -530,22 +538,20 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "__main__.D -> 3\n", + " -> 3\n", "None\n", "\n", - "__main__.D -> 3\n", + " -> 3\n", "None\n", "\n", - "__main__.C -> 3\n", + " -> 3\n", "None\n" ] } @@ -554,14 +560,24 @@ "class D(C):\n", " pass\n", "\n", - "print D.spam(3)\n", - "print\n", + "print(D.spam(3))\n", + "print()\n", "\n", "d = D()\n", - "print d.spam(3)\n", - "print\n", + "print(d.spam(3))\n", + "print()\n", "\n", - "print C.spam(3)" + "print(C.spam(3))\n", + "\n", + "#기존\n", + "# __main__.D -> 3\n", + "# None\n", + "\n", + "# __main__.D -> 3\n", + "# None\n", + "\n", + "# __main__.C -> 3\n", + "# None" ] }, { @@ -588,9 +604,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -599,16 +615,14 @@ " def f(self): \n", " self.i_mem = 200 # 인스턴스 멤버 정의\n", " def g(self):\n", - " print self.i_mem\n", - " print self.c_mem " + " print(self.i_mem)\n", + " print(self.c_mem)" ] }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 18, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -622,34 +636,36 @@ }, { "ename": "AttributeError", - "evalue": "Var instance has no attribute 'i_mem'", + "evalue": "'Var' object has no attribute 'i_mem'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mprint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mv2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2 생성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mv2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mi_mem\u001b[0m \u001b[0;31m# 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: Var instance has no attribute 'i_mem'" + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mv2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2 생성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mi_mem\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: 'Var' object has no attribute 'i_mem'" ] } ], "source": [ - "print Var.c_mem # 클래스 객체를 통하여 클래스 멤버 접근\n", + "print(Var.c_mem) # 클래스 객체를 통하여 클래스 멤버 접근\n", "\n", "v1 = Var() # 인스턴스 v1 생성\n", - "print v1.c_mem # 인스턴스를 통하여 클래스 멤버 접근\n", + "print(v1.c_mem) # 인스턴스를 통하여 클래스 멤버 접근\n", "v1.f() # 인스턴스 멤버 i_mem이 생성됨\n", - "print v1.i_mem # 인스턴스 v1을 통하여 인스턴스 멤버 접근\n", + "print(v1.i_mem) # 인스턴스 v1을 통하여 인스턴스 멤버 접근\n", "\n", - "print\n", + "print()\n", "v2 = Var() # 인스턴스 v2 생성\n", - "print v2.i_mem # 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성" + "print(v2.i_mem) # 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성\n", + "\n", + "#기존 오류:AttributeError: Var instance has no attribute 'i_mem'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "![inheritance](images/instance2.png)" + "![inheritance](../images/instance2.png)" ] }, { @@ -663,10 +679,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, + "execution_count": 19, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -682,21 +696,21 @@ } ], "source": [ - "print v1.c_mem # 인스턴스 v1을 통해 클래스 멤버 참조\n", - "print v2.c_mem # 인스턴스 v2를 통해 클래스 멤버 참조\n", + "print(v1.c_mem) # 인스턴스 v1을 통해 클래스 멤버 참조\n", + "print(v2.c_mem) # 인스턴스 v2를 통해 클래스 멤버 참조\n", "\n", - "print\n", + "print()\n", "v1.c_mem = 50 # 인스턴스 이름 공간에 c_mem생성\n", - "print v1.c_mem # 인스턴스 v1을 통해 인스턴스 멤버 참조\n", - "print v2.c_mem # 인스턴스 v2을 통해 클래스 멤버참조 (인스턴스 멤버가 없으므로, 클래스 멤버 참조)\n", - "print Var.c_mem # 클래스 멤버참조" + "print(v1.c_mem) # 인스턴스 v1을 통해 인스턴스 멤버 참조\n", + "print(v2.c_mem) # 인스턴스 v2을 통해 클래스 멤버참조 (인스턴스 멤버가 없으므로, 클래스 멤버 참조)\n", + "print(Var.c_mem) # 클래스 멤버참조" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "![inheritance](images/instance3.png)" + "![inheritance](../images/instance3.png)" ] }, { @@ -714,10 +728,10 @@ "source": [ "- \\_\\_init__: 생성자 메소드\n", " - 객체가 생성될 때 자동으로 불리어지는 메소드\n", - " - self 인자가 정의되어야 함\n", + " - self 인자가 정의되어야 함\n", "- \\_\\_del__: 소멸자 메소드\n", " - 객체가 소멸 (메모리에서 해제)될 때 자동으로 불리어지는 메소드\n", - " - self 인자가 정의되어야 함\n", + " - self 인자가 정의되어야 함\n", " - 개발자가 특별히 작성하지 않아도 될 메소드\n", " - 이유: 파이썬에서는 메모리나 기타 자원들의 해제가 자동으로 되기 때문에\n", "- [참고] \\_\\_ (연속된 두 개의 언더라인)의 의미: 예약된 이름" @@ -728,25 +742,23 @@ "metadata": {}, "source": [ "- 다음 코드에 대한 설명\n", - " - mylife = Life() 로서 인스턴스 mylife가 생성되는 순간 \\_\\_init__ 생성자 메소드 호출\n", - " - sleep(3)에 의해 3초간 sleep 상태\n", + " - mylife = Life() 로서 인스턴스 mylife가 생성되는 순간 \\_\\_init__ 생성자 메소드 호출\n", + " - sleep(3)에 의해 3초간 sleep 상태\n", " - 3초 이후 함수가 리턴됨 --> 로컬 변수가 메모리에서 해제됨 --> \\_\\_del__ 소멸자 메소드 호출" ] }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, + "execution_count": 20, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Birthday Wed Nov 18 22:51:54 2015\n", + "Birthday Sat Nov 18 21:48:45 2017\n", "Sleeping for 3 sec\n", - "Deathday Wed Nov 18 22:51:57 2015\n" + "Deathday Sat Nov 18 21:48:48 2017\n" ] } ], @@ -757,13 +769,13 @@ "class Life:\n", " def __init__(self): # 생성자\n", " self.birth = ctime() # 현재시간에 대한 문자열을 얻는다.\n", - " print 'Birthday', self.birth # 현재 시간 출력\n", + " print('Birthday', self.birth) # 현재 시간 출력\n", " def __del__(self): # 소멸자\n", - " print 'Deathday', ctime() # 소멸 시간 출력 \n", + " print('Deathday', ctime()) # 소멸 시간 출력 \n", "\n", "def test():\n", " mylife = Life()\n", - " print 'Sleeping for 3 sec'\n", + " print('Sleeping for 3 sec')\n", " sleep(3) #3초간 sleep(block)상태에 있음 (CPU 점유 못함)\n", "\n", "test()" @@ -774,15 +786,13 @@ "metadata": {}, "source": [ "- 인자를 받는 생성자 호출 가능\n", - "- [참고] \\_\\_str\\_\\_: print 예약어나 str() 내장함수 호출에 대응되는 메소드" + "- [참고] \\_\\_str\\_\\_: print 예약어나 str() 내장함수 호출에 대응되는 메소드" ] }, { "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": false - }, + "execution_count": 21, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -801,8 +811,8 @@ " return str(self.i)\n", "\n", "i = Integer(10)\n", - "print i\n", - "print str(i)" + "print(i)\n", + "print(str(i))" ] }, { @@ -815,23 +825,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.6.1" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/python3.6/python20.ipynb b/python3.6/python20.ipynb index 99ed360..3bc2d74 100644 --- a/python3.6/python20.ipynb +++ b/python3.6/python20.ipynb @@ -113,9 +113,7 @@ { "cell_type": "code", "execution_count": 75, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -140,24 +138,55 @@ " return self.i + other\n", "\n", "i = Integer(10)\n", - "print i\n", - "print str(i)\n", + "print(i)\n", + "print(str(i))\n", "\n", - "print\n", + "print()\n", "i = i + 10\n", - "print i\n", + "print(i)\n", "\n", - "print\n", + "print()\n", "i += 10\n", - "print i" + "print(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unsupported operand type(s) for /: 'MyString' and 'str'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMyString\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"abcd_abcd_abcd\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_a\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for /: 'MyString' and 'str'" + ] + } + ], + "source": [ + "#python3.x\n", + "class MyString:\n", + " def __init__(self, str):\n", + " self.str = str\n", + " def __div__(self, sep): # 나누기 연산자 /가 사용되었을 때 호출되는 함수 \n", + " return self.str.split(sep) # 문자열 self.str을 sep를 기준으로 분리\n", + "\n", + "m = MyString(\"abcd_abcd_abcd\")\n", + "print(m / \"_\")\n", + "print(m / \"_a\")\n", + "\n", + "print()\n", + "print(m.__div__(\"_\"))" ] }, { "cell_type": "code", "execution_count": 85, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -171,6 +200,7 @@ } ], "source": [ + "#python2.x\n", "class MyString:\n", " def __init__(self, str):\n", " self.str = str\n", @@ -193,12 +223,44 @@ " - 메소드 이름 앞에 r이 추가된 메소드 정의" ] }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unsupported operand type(s) for /: 'MyString' and 'str'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMyString\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"abcd_abcd_abcd\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_a\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for /: 'MyString' and 'str'" + ] + } + ], + "source": [ + "#python3.x\n", + "class MyString:\n", + " def __init__(self, str):\n", + " self.str = str\n", + " def __div__(self, sep):\n", + " return str.split(self.str, sep)\n", + " __rdiv__ = __div__\n", + "\n", + "m = MyString(\"abcd_abcd_abcd\")\n", + "print(m / \"_\")\n", + "print(m / \"_a\")\n", + "print()\n", + "print(\"_\" / m)\n", + "print(\"_a\" / m)" + ] + }, { "cell_type": "code", "execution_count": 87, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -213,6 +275,7 @@ } ], "source": [ + "#python2.x\n", "class MyString:\n", " def __init__(self, str):\n", " self.str = str\n", @@ -231,9 +294,7 @@ { "cell_type": "code", "execution_count": 90, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -296,12 +357,39 @@ " - c.\\_\\_cmp\\_\\_() 호출 결과가 양수이면 True 반환, 아니면 False 반환" ] }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'>' not supported between instances of 'MyCmp' and 'int'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMyCmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# c.__cmp__(1)을 호출, 반환값이 양수이어야 True\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# c.__cmp__(1)을 호출, 반환값이 음수이어야 True\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# c.__cmp__(1)을 호출, 반환값이 0이어야 True\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: '>' not supported between instances of 'MyCmp' and 'int'" + ] + } + ], + "source": [ + "#python3.x\n", + "class MyCmp:\n", + " def __cmp__(self, y):\n", + " return 1 - y\n", + " \n", + "c = MyCmp() \n", + "print(c > 1) # c.__cmp__(1)을 호출, 반환값이 양수이어야 True\n", + "print(c < 1) # c.__cmp__(1)을 호출, 반환값이 음수이어야 True\n", + "print(c == 1) # c.__cmp__(1)을 호출, 반환값이 0이어야 True" + ] + }, { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -314,6 +402,7 @@ } ], "source": [ + "#python2.x\n", "class MyCmp:\n", " def __cmp__(self, y):\n", " return 1 - y\n", @@ -336,10 +425,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -357,9 +444,9 @@ " return 1 < y\n", "\n", "m = MyCmp2()\n", - "print m < 10 # m.__lt__(10)을 호출\n", - "print m < 2\n", - "print m < 1" + "print(m < 10) # m.__lt__(10)을 호출\n", + "print(m < 2)\n", + "print(m < 1)" ] }, { @@ -375,9 +462,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -457,12 +542,43 @@ " - 리스트, 튜플, 문자열등에서도 동일한 조건에서 발생됨 " ] }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 8)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m8\u001b[0m\n\u001b[0;31m raise IndexError, k\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "#python3.x\n", + "class Square:\n", + " def __init__(self, end):\n", + " self.end = end\n", + " def __len__(self):\n", + " return self.end\n", + " def __getitem__(self, k):\n", + " if k < 0 or self.end <= k: \n", + " raise IndexError, k\n", + " return k * k\n", + " \n", + "s1 = Square(10)\n", + "print(len(s1)) # s1.__len__()\n", + "print(s1[1]) #s1.__getitem__(1)\n", + "print(s1[4])\n", + "print(s1[20])\n" + ] + }, { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -486,6 +602,7 @@ } ], "source": [ + "#python2.x\n", "class Square:\n", " def __init__(self, end):\n", " self.end = end\n", @@ -512,22 +629,22 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "0 1 4 9 16 25 36 49 64 81\n" + "0 1 4 9 16 25 36 49 64 81 " ] } ], "source": [ + "s1 = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n", "for x in s1:\n", - " print x," + " #print(x,)\n", + " print(x, end=\" \")" ] }, { @@ -539,10 +656,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -554,8 +669,8 @@ } ], "source": [ - "print list(s1)\n", - "print tuple(s1)" + "print(list(s1))\n", + "print(tuple(s1))" ] }, { @@ -575,16 +690,14 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "<__main__.MyDict instance at 0x10bb37638>\n", + "<__main__.MyDict object at 0x104476ef0>\n", "light\n", "darkness\n", "2\n" @@ -606,26 +719,24 @@ "m = MyDict() #__init__호출\n", "m['day'] = 'light' #__setitem__호출\n", "m['night'] = 'darkness' #__setitem__호출 \n", - "print m\n", - "print m['day'] #__getitem__호출\n", - "print m['night'] #__getitem__호출\n", - "print len(m) #__len__호출" + "print(m)\n", + "print(m['day']) #__getitem__호출\n", + "print(m['night']) #__getitem__호출\n", + "print(len(m)) #__len__호출" ] }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['three', 'two', 'one']\n", - "[3, 2, 1]\n", - "[('three', 3), ('two', 2), ('one', 1)]\n" + "dict_keys(['one', 'two', 'three'])\n", + "dict_values([1, 2, 3])\n", + "dict_items([('one', 1), ('two', 2), ('three', 3)])\n" ] } ], @@ -648,9 +759,14 @@ " return self.d.items()\n", " \n", "m = MyDict({'one':1, 'two':2, 'three':3})\n", - "print m.keys()\n", - "print m.values()\n", - "print m.items()" + "print(m.keys())\n", + "print(m.values())\n", + "print(m.items())\n", + "\n", + "#기존\n", + "# ['three', 'two', 'one']\n", + "# [3, 2, 1]\n", + "# [('three', 3), ('two', 2), ('one', 1)]" ] }, { @@ -678,10 +794,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -689,7 +803,6 @@ "text": [ "str called\n", "str called\n", - "repr called\n", "repr called\n" ] } @@ -702,10 +815,16 @@ " return 'str called'\n", " \n", "s = StringRepr()\n", - "print s\n", - "print str(s)\n", - "print repr(s)\n", - "print `s`" + "print(s)\n", + "print(str(s))\n", + "print(repr(s))\n", + "# print(`s`)\n", + "\n", + "# 기존:\n", + "# str called\n", + "# str called\n", + "# repr called\n", + "# repr called" ] }, { @@ -718,16 +837,13 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 18, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "repr called\n", "repr called\n", "repr called\n", "repr called\n" @@ -740,10 +856,16 @@ " return 'repr called'\n", " \n", "s = StringRepr()\n", - "print s\n", - "print repr(s)\n", - "print str(s)\n", - "print `s`" + "print(s)\n", + "print(str(s))\n", + "print(repr(s))\n", + "# print(`s`)\n", + "\n", + "# 기존:\n", + "# str called\n", + "# str called\n", + "# repr called\n", + "# repr called" ] }, { @@ -757,19 +879,16 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, + "execution_count": 19, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "str called\n", - "<__main__.StringRepr instance at 0x101d3f908>\n", "str called\n", - "<__main__.StringRepr instance at 0x101d3f908>\n" + "<__main__.StringRepr object at 0x104464160>\n" ] } ], @@ -779,10 +898,16 @@ " return 'str called'\n", "\n", "s = StringRepr()\n", - "print s\n", - "print repr(s)\n", - "print str(s)\n", - "print `s`" + "print(s)\n", + "print(str(s))\n", + "print(repr(s))\n", + "# print(`s`)\n", + "\n", + "#기존\n", + "# str called\n", + "# <__main__.StringRepr instance at 0x101d3f908>\n", + "# str called\n", + "# <__main__.StringRepr instance at 0x101d3f908>" ] }, { @@ -796,10 +921,8 @@ }, { "cell_type": "code", - "execution_count": 48, - "metadata": { - "collapsed": false - }, + "execution_count": 20, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -821,10 +944,10 @@ " return self.sum\n", " \n", "acc = Accumulator()\n", - "print acc(1,2,3,4,5)\n", - "print acc(6)\n", - "print acc(7,8,9)\n", - "print acc.sum" + "print(acc(1,2,3,4,5))\n", + "print(acc(6))\n", + "print(acc(7,8,9))\n", + "print(acc.sum)" ] }, { @@ -836,10 +959,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 21, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -856,9 +977,9 @@ "source": [ "def check(func):\n", " if callable(func):\n", - " print 'callable'\n", + " print('callable')\n", " else:\n", - " print 'not callable'\n", + " print('not callable')\n", "\n", "class B:\n", " def func(self, v):\n", @@ -871,9 +992,9 @@ "b = B()\n", "check(a)\n", "check(b)\n", - "print\n", - "print callable(a)\n", - "print callable(b)" + "print()\n", + "print(callable(a))\n", + "print(callable(b))" ] }, { @@ -886,23 +1007,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.6.1" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/python3.6/python21.ipynb b/python3.6/python21.ipynb index fb14b29..07ecb76 100644 --- a/python3.6/python21.ipynb +++ b/python3.6/python21.ipynb @@ -1,808 +1,780 @@ { - "metadata": { - "name": "", - "signature": "sha256:8f9b177eb7705dd02d3af4493e8b1149b369cd12a697af1db111d8dfe3b6e92e" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 21. \uc0c1\uc18d\uacfc \ub2e4\ud615\uc131\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud074\ub798\uc2a4 \uc0c1\uc18d\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ud074\ub798\uc2a4 \uc0c1\uc18d\uacfc \uc774\ub984 \uacf5\uac04\uc758 \uad00\uacc4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0c1\uc18d\uc758 \uc774\uc720\n", - " - \ucf54\ub4dc\uc758 \uc7ac\uc0ac\uc6a9\n", - " - \uc0c1\uc18d\ubc1b\uc740 \uc790\uc2dd \ud074\ub798\uc2a4\ub294 \uc0c1\uc18d\uc744 \ud574\uc900 \ubd80\ubaa8 \ud074\ub798\uc2a4\uc758 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uadf8\ub300\ub85c \uc0ac\uc6a9\n", - " - \uc790\uc2dd \ud074\ub798\uc2a4\ub294 \ud544\uc694\ud55c \uae30\ub2a5\ub9cc\uc744 \uc815\uc758\ud558\uac70\ub098 \uae30\uc874\uc758 \uae30\ub2a5\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\uc74c" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Person:\n", - " def __init__(self, name, phone=None):\n", - " self.name = name\n", - " self.phone = phone\n", - " def __str__(self):\n", - " return '' % (self.name, self.phone)" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Employee(Person): # \uad04\ud638 \uc548\uc5d0 \uc4f0\uc5ec\uc9c4 \ud074\ub798\uc2a4\ub294 \uc288\ud37c\ud074\ub798\uc2a4\ub97c \uc758\ubbf8\ud55c\ub2e4.\n", - " def __init__(self, name, phone, position, salary):\n", - " Person.__init__(self, name, phone) # Person\ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790 \ud638\ucd9c\n", - " self.position = position\n", - " self.salary = salary" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc774\ub984 \uacf5\uac04\uc758 \ud3ec\ud568\uad00\uacc4\n", - " - \uc790\uc2dd \ud074\ub798\uc2a4 > \ubd80\ubaa8 \ud074\ub798\uc2a4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![inheritance](images/inheritance2.png)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "p1 = Person('\ud64d\uae38\ub3d9', 1498)\n", - "print p1.name\n", - "print p1\n", - "\n", - "print\n", + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 21. 상속과 다형성\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 클래스 상속\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 클래스 상속과 이름 공간의 관계" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 상속의 이유\n", + " - 코드의 재사용\n", + " - 상속받은 자식 클래스는 상속을 해준 부모 클래스의 모든 기능을 그대로 사용\n", + " - 자식 클래스는 필요한 기능만을 정의하거나 기존의 기능을 변경할 수 있음" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "class Person:\n", + " def __init__(self, name, phone=None):\n", + " self.name = name\n", + " self.phone = phone\n", + " def __str__(self):\n", + " return '' % (self.name, self.phone)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "class Employee(Person): # 괄호 안에 쓰여진 클래스는 슈퍼클래스를 의미한다.\n", + " def __init__(self, name, phone, position, salary):\n", + " Person.__init__(self, name, phone) # Person클래스의 생성자 호출\n", + " self.position = position\n", + " self.salary = salary" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 이름 공간의 포함관계\n", + " - 자식 클래스 > 부모 클래스" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/inheritance2.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "홍길동\n", + "\n", "\n", - "m1 = Employee('\uc190\ucc3d\ud76c', 5564, '\ub300\ub9ac', 200)\n", - "m2 = Employee('\uae40\uae30\ub3d9', 8546, '\uacfc\uc7a5', 300)\n", - "print m1.name, m1.position # \uc288\ud37c\ud074\ub798\uc2a4\uc640 \uc11c\ube0c\ud074\ub798\uc2a4\uc758 \uba64\ubc84\ub97c \ud558\ub098\uc529 \ucd9c\ub825\ud55c\ub2e4.\n", - "print m1\n", - "print m2.name, m2.position\n", - "print m2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\ud64d\uae38\ub3d9\n", - "\n", - "\n", - "\uc190\ucc3d\ud76c \ub300\ub9ac\n", - "\n", - "\uae40\uae30\ub3d9 \uacfc\uc7a5\n", - "\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![inheritance](images/inheritance3.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \uc0dd\uc131\uc790 \ud638\ucd9c\n", - "- \uc11c\ube0c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub294 \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub97c \uc790\ub3d9\uc73c\ub85c \ud638\ucd9c\ud558\uc9c0 \uc54a\ub294\ub2e4." + "손창희 대리\n", + "\n", + "김기동 과장\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Super:\n", - " def __init__(self):\n", - " print 'Super init called'\n", - "\n", - "class Sub(Super):\n", - " def __init__(self):\n", - " print 'Sub init called'\n", - " \n", - "s = Sub()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Sub init called\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc11c\ube0c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub97c \uba85\uc2dc\uc801\uc73c\ub85c \ud638\ucd9c\ud574\uc57c \ud55c\ub2e4." + } + ], + "source": [ + "p1 = Person('홍길동', 1498)\n", + "print p1.name\n", + "print p1\n", + "\n", + "print\n", + "\n", + "m1 = Employee('손창희', 5564, '대리', 200)\n", + "m2 = Employee('김기동', 8546, '과장', 300)\n", + "print m1.name, m1.position # 슈퍼클래스와 서브클래스의 멤버를 하나씩 출력한다.\n", + "print m1\n", + "print m2.name, m2.position\n", + "print m2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/inheritance3.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 생성자 호출\n", + "- 서브 클래스의 생성자는 슈퍼 클래스의 생성자를 자동으로 호출하지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sub init called\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Super:\n", - " def __init__(self):\n", - " print 'Super init called'\n", - " \n", - "class Sub(Super):\n", - " def __init__(self):\n", - " Super.__init__(self) # \uba85\uc2dc\uc801\uc73c\ub85c \uc288\ud37c\ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub97c \ud638\ucd9c\ud55c\ub2e4.\n", - " print 'Sub init called'\n", - " \n", - "s = Sub()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Super init called\n", - "Sub init called\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc11c\ube0c \ud074\ub798\uc2a4\uc5d0 \uc0dd\uc131\uc790\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uc5d0\ub294 \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\uac00 \ud638\ucd9c\ub41c\ub2e4. " + } + ], + "source": [ + "class Super:\n", + " def __init__(self):\n", + " print 'Super init called'\n", + "\n", + "class Sub(Super):\n", + " def __init__(self):\n", + " print 'Sub init called'\n", + " \n", + "s = Sub()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 명시적으로 호출해야 한다." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Super init called\n", + "Sub init called\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Super:\n", - " def __init__(self):\n", - " print 'Super init called'\n", - " \n", - "class Sub(Super):\n", - " pass\n", - "\n", - "s = Sub()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Super init called\n" - ] - } - ], - "prompt_number": 66 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \uba54\uc3d8\ub4dc\uc758 \ub300\uce58 (\uba54\uc18c\ub4dc \uc624\ubc84\ub77c\uc774\ub4dc - Override)\n", - "- \uc11c\ube0c \ud074\ub798\uc2a4\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc5d0 \uc815\uc758\ub41c \uba54\uc18c\ub4dc\ub97c \uc7ac\uc815\uc758\ud558\uc5ec \ub300\uce58\ud558\ub294 \uae30\ub2a5" + } + ], + "source": [ + "class Super:\n", + " def __init__(self):\n", + " print 'Super init called'\n", + " \n", + "class Sub(Super):\n", + " def __init__(self):\n", + " Super.__init__(self) # 명시적으로 슈퍼클래스의 생성자를 호출한다.\n", + " print 'Sub init called'\n", + " \n", + "s = Sub()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 서브 클래스에 생성자가 정의되어 있지 않은 경우에는 슈퍼 클래스의 생성자가 호출된다. " + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Super init called\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Person:\n", - " def __init__(self, name, phone=None):\n", - " self.name = name\n", - " self.phone = phone\n", - " def __str__(self):\n", - " return '' % (self.name, self.phone)\n", - " \n", - "class Employee(Person):\n", - " def __init__(self, name, phone, position, salary):\n", - " Person.__init__(self, name, phone)\n", - " self.position = position\n", - " self.salary = salary\n", - " \n", - "p1 = Person('gslee', 5284)\n", - "m1 = Employee('kslee', 5224, 'President', 500)\n", - "\n", - "print p1\n", - "print m1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Employee(Person):\n", - " def __init__(self, name, phone, position, salary):\n", - " Person.__init__(self, name, phone)\n", - " self.position = position\n", - " self.salary = salary\n", - " def __str__(self):\n", - " return '' % (self.name, self.phone, self.position, self.salary)\n", - " \n", - "p1 = Person('gslee', 5284)\n", - "m1 = Employee('kslee', 5224, 'President', 500)\n", - "\n", - "print p1\n", - "print m1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ub2e4\ud615\uc131(Polymorphism)\n", - "- \uc0c1\uc18d \uad00\uacc4 \ub0b4\uc758 \ub2e4\ub978 \ud074\ub798\uc2a4\ub4e4\uc758 \uc778\uc2a4\ud134\uc2a4\ub4e4\uc774 \uac19\uc740 \uba64\ubc84 \ud568\uc218 \ud638\ucd9c\uc5d0 \ub300\ud574 \uac01\uac01 \ub2e4\ub974\uac8c \ubc18\uc751\ud558\ub3c4\ub85d \ud558\ub294 \uae30\ub2a5\n", - " - \uc5f0\uc0b0\uc790 \uc624\ubc84\ub85c\ub529\ub3c4 \ub2e4\ud615\uc131\uc744 \uc9c0\uc6d0\ud558\ub294 \uc911\uc694\ud55c \uae30\uc220 \n", - " - \uc608\ub97c \ub4e4\uc5b4, a\uc640 b\uc758 \uac1d\uccb4 \ud615\uc5d0 \ub530\ub77c a + b\uc758 + \uc5f0\uc0b0\uc790 \ud589\ub3d9 \ubc29\uc2dd\uc774 \ubcc0\uacbd\ub418\ub294 \uac83\n", - "\n", - "- \ub2e4\ud615\uc131\uc758 \uc7a5\uc810\n", - " - \uc801\uc740 \ucf54\ub529\uc73c\ub85c \ub2e4\uc591\ud55c \uac1d\uccb4\ub4e4\uc5d0\uac8c \uc720\uc0ac\ud55c \uc791\uc5c5\uc744 \uc218\ud589\uc2dc\ud0ac \uc218 \uc788\uc74c\n", - " - \ud504\ub85c\uadf8\ub7a8 \uc791\uc131 \ucf54\ub4dc \ub7c9\uc774 \uc904\uc5b4\ub4e0\ub2e4.\n", - " - \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ub192\ud600\uc900\ub2e4.\n", - " \n", - "- \ud30c\uc774\uc36c\uc5d0\uc11c \ub2e4\ud615\uc131\uc758 \uc7a5\uc810\n", - " - \ud615 \uc120\uc5b8\uc774 \uc5c6\ub2e4\ub294 \uc810\uc5d0\uc11c \ud30c\uc774\uc36c\uc5d0\uc11c\ub294 \ub2e4\ud615\uc131\uc744 \uc801\uc6a9\ud558\uae30\uac00 \ub354\uc6b1 \uc6a9\uc774\ud558\ub2e4.\n", - " - \uc2e4\uc2dc\uac04\uc73c\ub85c \uac1d\uccb4\uc758 \ud615\uc774 \uacb0\uc815\ub418\ubbc0\ub85c \ub2e8 \ud558\ub098\uc758 \uba54\uc18c\ub4dc\uc5d0 \uc758\ud574 \ucc98\ub9ac\ub420 \uc218 \uc788\ub294 \uac1d\uccb4\uc758 \uc885\ub958\uc5d0 \uc81c\ud55c\uc774 \uc5c6\ub2e4.\n", - " - \uc989, \ub2e4\ub978 \uc5b8\uc5b4\ubcf4\ub2e4 \ucf54\ub4dc\uc758 \uc591\uc774 \ub354\uc6b1 \uc904\uc5b4\ub4e0\ub2e4." + } + ], + "source": [ + "class Super:\n", + " def __init__(self):\n", + " print 'Super init called'\n", + " \n", + "class Sub(Super):\n", + " pass\n", + "\n", + "s = Sub()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 메쏘드의 대치 (메소드 오버라이드 - Override)\n", + "- 서브 클래스에서 슈퍼 클래스에 정의된 메소드를 재정의하여 대치하는 기능" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Animal:\n", - " def cry(self):\n", - " print '...'\n", - " \n", - "class Dog(Animal):\n", - " def cry(self):\n", - " print '\uba4d\uba4d'\n", - " \n", - "class Duck(Animal):\n", - " def cry(self):\n", - " print '\uaf65\uaf65'\n", - " \n", - "class Fish(Animal):\n", - " pass\n", - "\n", - "for each in (Dog(), Duck(), Fish()):\n", - " each.cry()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\uba4d\uba4d\n", - "\uaf65\uaf65\n", - "...\n" - ] - } - ], - "prompt_number": 57 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uacfc \ud074\ub798\uc2a4\uc758 \ud1b5\uc77c\n", - "***\n", - "- \ub0b4\uc7a5 \uc790\ub8cc\ud615(list, dict, tuple, string)\uc744 \uc0c1\uc18d\ud558\uc5ec \uc0ac\uc6a9\uc790 \ud074\ub798\uc2a4\ub97c \uc815\uc758\ud558\ub294 \uac83\n", - " - \ub0b4\uc7a5 \uc790\ub8cc\ud615\uacfc \uc0ac\uc6a9\uc790 \uc790\ub8cc\ud615\uc758 \ucc28\uc774\ub97c \uc5c6\uc5d0\uace0 \ud1b5\uc77c\ub41c \uad00\uc810\uc73c\ub85c \ubaa8\ub4e0 \uac1d\uccb4\ub97c \ub2e4\ub8f0 \uc218 \uc788\ub294 \ubc29\uc548\n", - "- \ud074\ub798\uc2a4 \uc815\uc758\ub294 \uc0c8\ub85c\uc6b4 \uc790\ub8cc\ud615\uc758 \uc815\uc758\uc784" + } + ], + "source": [ + "class Person:\n", + " def __init__(self, name, phone=None):\n", + " self.name = name\n", + " self.phone = phone\n", + " def __str__(self):\n", + " return '' % (self.name, self.phone)\n", + " \n", + "class Employee(Person):\n", + " def __init__(self, name, phone, position, salary):\n", + " Person.__init__(self, name, phone)\n", + " self.position = position\n", + " self.salary = salary\n", + " \n", + "p1 = Person('gslee', 5284)\n", + "m1 = Employee('kslee', 5224, 'President', 500)\n", + "\n", + "print p1\n", + "print m1" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ub9ac\uc2a4\ud2b8 \uc11c\ube0c \ud074\ub798\uc2a4 \ub9cc\ub4e4\uae30" + } + ], + "source": [ + "class Employee(Person):\n", + " def __init__(self, name, phone, position, salary):\n", + " Person.__init__(self, name, phone)\n", + " self.position = position\n", + " self.salary = salary\n", + " def __str__(self):\n", + " return '' % (self.name, self.phone, self.position, self.salary)\n", + " \n", + "p1 = Person('gslee', 5284)\n", + "m1 = Employee('kslee', 5224, 'President', 500)\n", + "\n", + "print p1\n", + "print m1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 다형성(Polymorphism)\n", + "- 상속 관계 내의 다른 클래스들의 인스턴스들이 같은 멤버 함수 호출에 대해 각각 다르게 반응하도록 하는 기능\n", + " - 연산자 오버로딩도 다형성을 지원하는 중요한 기술 \n", + " - 예를 들어, a와 b의 객체 형에 따라 a + b의 + 연산자 행동 방식이 변경되는 것\n", + "\n", + "- 다형성의 장점\n", + " - 적은 코딩으로 다양한 객체들에게 유사한 작업을 수행시킬 수 있음\n", + " - 프로그램 작성 코드 량이 줄어든다.\n", + " - 코드의 가독성을 높혀준다.\n", + " \n", + "- 파이썬에서 다형성의 장점\n", + " - 형 선언이 없다는 점에서 파이썬에서는 다형성을 적용하기가 더욱 용이하다.\n", + " - 실시간으로 객체의 형이 결정되므로 단 하나의 메소드에 의해 처리될 수 있는 객체의 종류에 제한이 없다.\n", + " - 즉, 다른 언어보다 코드의 양이 더욱 줄어든다." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "멍멍\n", + "꽥꽥\n", + "...\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = list()\n", - "print a\n", - "print dir(a)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[]\n", - "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc544\ub798 \uc608\uc81c\ub294 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc778 list\ub97c \uc0c1\uc18d\ud558\uc5ec \ube84\uc148 \uc5f0\uc0b0(-)\uc744 \ucd94\uac00\ud568" + } + ], + "source": [ + "class Animal:\n", + " def cry(self):\n", + " print '...'\n", + " \n", + "class Dog(Animal):\n", + " def cry(self):\n", + " print '멍멍'\n", + " \n", + "class Duck(Animal):\n", + " def cry(self):\n", + " print '꽥꽥'\n", + " \n", + "class Fish(Animal):\n", + " pass\n", + "\n", + "for each in (Dog(), Duck(), Fish()):\n", + " each.cry()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 내장 자료형과 클래스의 통일\n", + "***\n", + "- 내장 자료형(list, dict, tuple, string)을 상속하여 사용자 클래스를 정의하는 것\n", + " - 내장 자료형과 사용자 자료형의 차이를 없에고 통일된 관점으로 모든 객체를 다룰 수 있는 방안\n", + "- 클래스 정의는 새로운 자료형의 정의임" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 리스트 서브 클래스 만들기" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n", + "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class MyList(list):\n", - " def __sub__(self, other): # '-' \uc5f0\uc0b0\uc790 \uc911\ubcf5 \ud568\uc218 \uc815\uc758\n", - " for x in other:\n", - " if x in self:\n", - " self.remove(x) # \uac01 \ud56d\ubaa9\uc744 \ud558\ub098\uc529 \uc0ad\uc81c\ud55c\ub2e4.\n", - " return self\n", - "\n", - "L = MyList([1, 2, 3, 'spam', 4, 5])\n", - "print L\n", - "print\n", + } + ], + "source": [ + "a = list()\n", + "print a\n", + "print dir(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래 예제는 내장 자료형인 list를 상속하여 뺄셈 연산(-)을 추가함" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 'spam', 4, 5]\n", "\n", - "L = L - ['spam', 4]\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2, 3, 'spam', 4, 5]\n", - "\n", - "[1, 2, 3, 5]\n" - ] - } - ], - "prompt_number": 51 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1) Stack \ud074\ub798\uc2a4 \uc815\uc758 \uc608\n", - "- \uc288\ud37c \ud074\ub798\uc2a4\ub85c list \ud074\ub798\uc2a4\ub97c \uc9c0\ub2cc\ub2e4.\n", - "- \uc989, list \ud074\ub798\uc2a4\ub97c \ud655\uc7a5\ud558\uc5ec Stack \ud074\ub798\uc2a4\ub97c \uc815\uc758\ud568" + "[1, 2, 3, 5]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Stack(list): # \ud074\ub798\uc2a4 \uc815\uc758\n", - " push = list.append\n", - " \n", - "s = Stack() # \uc778\uc2a4\ud134\uc2a4 \uc0dd\uc131\n", - "\n", - "s.push(4)\n", - "s.push(5)\n", - "print s\n", - "print\n", + } + ], + "source": [ + "class MyList(list):\n", + " def __sub__(self, other): # '-' 연산자 중복 함수 정의\n", + " for x in other:\n", + " if x in self:\n", + " self.remove(x) # 각 항목을 하나씩 삭제한다.\n", + " return self\n", + "\n", + "L = MyList([1, 2, 3, 'spam', 4, 5])\n", + "print L\n", + "print\n", + "\n", + "L = L - ['spam', 4]\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) Stack 클래스 정의 예\n", + "- 슈퍼 클래스로 list 클래스를 지닌다.\n", + "- 즉, list 클래스를 확장하여 Stack 클래스를 정의함" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4, 5]\n", "\n", - "s = Stack([1,2,3])\n", - "s.push(4)\n", - "s.push(5)\n", - "print s\n", - "print\n", + "[1, 2, 3, 4, 5]\n", "\n", - "print s.pop() # \uc288\ud37c \ud074\ub798\uc2a4\uc778 \ub9ac\uc2a4\ud2b8 \ud074\ub798\uc2a4\uc758 pop() \uba54\uc18c\ub4dc \ud638\ucd9c\n", - "print s.pop()\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[4, 5]\n", - "\n", - "[1, 2, 3, 4, 5]\n", - "\n", - "5\n", - "4\n", - "[1, 2, 3]\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) Queue \ud074\ub798\uc2a4 \uc815\uc758 \uc608\n", - "- \uc288\ud37c \ud074\ub798\uc2a4\ub85c \uc5ed\uc2dc list\ub97c \uc9c0\ub2cc\ub2e4.\n", - "- \uc989, list \ud074\ub798\uc2a4\ub97c \ud655\uc7a5\ud558\uc5ec Queue \ud074\ub798\uc2a4\ub97c \uc815\uc758\ud568 " + "5\n", + "4\n", + "[1, 2, 3]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Queue(list):\n", - " enqueue = list.append\n", - " def dequeue(self):\n", - " return self.pop(0)\n", - " \n", - "q = Queue()\n", - "q.enqueue(1) # \ub370\uc774\ud130 \ucd94\uac00\n", - "q.enqueue(2)\n", - "print q\n", - "\n", - "print q.dequeue() # \ub370\uc774\ud130 \uaebc\ub0b4\uae30\n", - "print q.dequeue()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2]\n", - "1\n", - "2\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \uc0ac\uc804 \uc11c\ube0c \ud074\ub798\uc2a4 \ub9cc\ub4e4\uae30" + } + ], + "source": [ + "class Stack(list): # 클래스 정의\n", + " push = list.append\n", + " \n", + "s = Stack() # 인스턴스 생성\n", + "\n", + "s.push(4)\n", + "s.push(5)\n", + "print s\n", + "print\n", + "\n", + "s = Stack([1,2,3])\n", + "s.push(4)\n", + "s.push(5)\n", + "print s\n", + "print\n", + "\n", + "print s.pop() # 슈퍼 클래스인 리스트 클래스의 pop() 메소드 호출\n", + "print s.pop()\n", + "print s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) Queue 클래스 정의 예\n", + "- 슈퍼 클래스로 역시 list를 지닌다.\n", + "- 즉, list 클래스를 확장하여 Queue 클래스를 정의함 " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2]\n", + "1\n", + "2\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = dict()\n", - "print a\n", - "print dir(a)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{}\n", - "['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc544\ub798 \uc608\uc81c\ub294 keys() \uba54\uc18c\ub4dc\ub97c \uc815\ub82c\ub41c \ud0a4\uac12 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud558\ub3c4\ub85d \uc7ac\uc815\uc758\ud55c\ub2e4." + } + ], + "source": [ + "class Queue(list):\n", + " enqueue = list.append\n", + " def dequeue(self):\n", + " return self.pop(0)\n", + " \n", + "q = Queue()\n", + "q.enqueue(1) # 데이터 추가\n", + "q.enqueue(2)\n", + "print q\n", + "\n", + "print q.dequeue() # 데이터 꺼내기\n", + "print q.dequeue()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 사전 서브 클래스 만들기" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{}\n", + "['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class MyDict(dict):\n", - " def keys(self):\n", - " K = dict.keys(self) # \uc5b8\ubc14\uc6b4\ub4dc \uba54\uc18c\ub4dc \ud638\ucd9c --> K = self.keys() \ub77c\uace0 \ud638\ucd9c\ud558\uba74 \ubb34\ud55c \uc7ac\uadc0 \ud638\ucd9c\n", - " K.sort()\n", - " return K\n", - "\n", - "d = MyDict({'one':1, 'two':2, 'three':3})\n", - "print d.keys()\n", - "print\n", + } + ], + "source": [ + "a = dict()\n", + "print a\n", + "print dir(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래 예제는 keys() 메소드를 정렬된 키값 리스트를 반환하도록 재정의한다." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['one', 'three', 'two']\n", "\n", - "d2 = {'one':1, 'two':2, 'three':3}\n", - "print d2.keys()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['one', 'three', 'two']\n", - "\n", - "['three', 'two', 'one']\n" - ] - } - ], - "prompt_number": 56 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \uc0c1\uc18d \uad00\uacc4\uc5d0 \uc788\ub294 \ud074\ub798\uc2a4\ub4e4\uc758 \uc815\ubcf4 \ud68d\ub4dd\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-1 \uac1d\uccb4\uac00 \uc5b4\ub5a4 \ud074\ub798\uc2a4\uc5d0 \uc18d\ud574 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uae30" + "['three', 'two', 'one']\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uac1d\uccb4\uc758 \uc790\ub8cc\ud615 \ube44\uad50 \ubc29\ubc95 I (\uc804\ud1b5\uc801 \ubc29\ubc95)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import types\n", - "\n", - "print type(123) == types.IntType\n", - "print type(123) == type(0)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uac1d\uccb4\uc758 \uc790\ub8cc\ud615 \ube44\uad50 \ubc29\ubc95 II (\uc0c8\ub85c\uc6b4 \ubc29\ubc95)\n", - " - isinstance() \ub0b4\uc7a5 \ud568\uc218\uc640 \uae30\ubcf8 \uac1d\uccb4 \ud074\ub798\uc2a4 \uc0ac\uc6a9" + } + ], + "source": [ + "class MyDict(dict):\n", + " def keys(self):\n", + " K = dict.keys(self) # 언바운드 메소드 호출 --> K = self.keys() 라고 호출하면 무한 재귀 호출\n", + " K.sort()\n", + " return K\n", + "\n", + "d = MyDict({'one':1, 'two':2, 'three':3})\n", + "print d.keys()\n", + "print\n", + "\n", + "d2 = {'one':1, 'two':2, 'three':3}\n", + "print d2.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 상속 관계에 있는 클래스들의 정보 획득\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 객체가 어떤 클래스에 속해 있는지 확인하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 객체의 자료형 비교 방법 I (전통적 방법)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print isinstance(123, int)\n", - "print int" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " True\n", - "\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc11c\ube0c \ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4\ub294 \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4\uc774\uae30\ub3c4 \ud558\ub2e4." + } + ], + "source": [ + "import types\n", + "\n", + "print type(123) == types.IntType\n", + "print type(123) == type(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 객체의 자료형 비교 방법 II (새로운 방법)\n", + " - isinstance() 내장 함수와 기본 객체 클래스 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " True\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class A:\n", - " pass\n", - "\n", - "class B:\n", - " def f(self):\n", - " pass\n", - " \n", - "class C(B):\n", - " pass\n", - "\n", - "def check(obj):\n", - " print obj, '=>',\n", - " if isinstance(obj, A):\n", - " print 'A',\n", - " if isinstance(obj, B):\n", - " print 'B',\n", - " if isinstance(obj, C):\n", - " print 'C',\n", - " print\n", - " \n", - "a = A()\n", - "b = B()\n", - "c = C()\n", - "\n", - "check(a)\n", - "check(b)\n", - "check(c)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "<__main__.A instance at 0x10de34e60> => A\n", - "<__main__.B instance at 0x10de34e18> => B\n", - "<__main__.C instance at 0x10de34cf8> => B C\n" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-2 \ud074\ub798\uc2a4 \uac04\uc758 \uc0c1\uc18d \uad00\uacc4 \uc54c\uc544\ub0b4\uae30\n", - "- issubclass() \ub0b4\uc7a5 \ud568\uc218 \ud65c\uc6a9" + } + ], + "source": [ + "print isinstance(123, int)\n", + "print int" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 서브 클래스의 인스턴스는 슈퍼 클래스의 인스턴스이기도 하다." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<__main__.A instance at 0x10de34e60> => A\n", + "<__main__.B instance at 0x10de34e18> => B\n", + "<__main__.C instance at 0x10de34cf8> => B C\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class A:\n", - " pass\n", - "\n", - "class B:\n", - " def f(self):\n", - " pass\n", - " \n", - "class C(B):\n", - " pass\n", - "\n", - "def check(obj):\n", - " print obj, '=>',\n", - " if issubclass(obj, A):\n", - " print 'A',\n", - " if issubclass(obj, B):\n", - " print 'B',\n", - " if issubclass(obj, C):\n", - " print 'C',\n", - " print\n", - " \n", - "check(A)\n", - "check(B)\n", - "check(C)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "__main__.A => A\n", - "__main__.B => B\n", - "__main__.C => B C\n" - ] - } - ], - "prompt_number": 20 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "class A:\n", + " pass\n", + "\n", + "class B:\n", + " def f(self):\n", + " pass\n", + " \n", + "class C(B):\n", + " pass\n", + "\n", + "def check(obj):\n", + " print obj, '=>',\n", + " if isinstance(obj, A):\n", + " print 'A',\n", + " if isinstance(obj, B):\n", + " print 'B',\n", + " if isinstance(obj, C):\n", + " print 'C',\n", + " print\n", + " \n", + "a = A()\n", + "b = B()\n", + "c = C()\n", + "\n", + "check(a)\n", + "check(b)\n", + "check(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 클래스 간의 상속 관계 알아내기\n", + "- issubclass() 내장 함수 활용" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__main__.A => A\n", + "__main__.B => B\n", + "__main__.C => B C\n" ] } ], - "metadata": {} + "source": [ + "class A:\n", + " pass\n", + "\n", + "class B:\n", + " def f(self):\n", + " pass\n", + " \n", + "class C(B):\n", + " pass\n", + "\n", + "def check(obj):\n", + " print obj, '=>',\n", + " if issubclass(obj, A):\n", + " print 'A',\n", + " if issubclass(obj, B):\n", + " print 'B',\n", + " if issubclass(obj, C):\n", + " print 'C',\n", + " print\n", + " \n", + "check(A)\n", + "check(B)\n", + "check(C)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" } - ] -} \ No newline at end of file + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python22.ipynb b/python3.6/python22.ipynb index 6d187a0..8366791 100644 --- a/python3.6/python22.ipynb +++ b/python3.6/python22.ipynb @@ -1,1230 +1,1178 @@ { - "metadata": { - "name": "", - "signature": "sha256:deab20a429b0ce5b40ffe86207fc2fe2d87b2ddd5861904afbf2609154ffefc7" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 22. \uc57d\ud55c\ucc38\uc870, \ubc18\ubcf5\uc790, \ubc1c\uc0dd\uc790\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \uc57d\ud55c \ucc38\uc870\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \uc57d\ud55c \ucc38\uc870\uc758 \uc815\uc758\n", - "- \uc57d\ud55c \ucc38\uc870 (Weak Reference)\n", - " - \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8\ub85c \uace0\ub824\ub418\uc9c0 \uc54a\ub294 \ucc38\uc870" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \uc57d\ud55c \ucc38\uc870\uc758 \ud544\uc694\uc131" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![inheritance](images/cyclingref.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 1) \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8\uac00 \uc99d\uac00\ub418\uc9c0 \uc54a\uc73c\ubbc0\ub85c \uc21c\ud658 \ucc38\uc870\uac00 \ubc29\uc9c0\ub41c\ub2e4.\n", - " - \uc21c\ud658 \ucc38\uc870 (Cyclic Reference)\n", - " - \uc11c\ub85c \ub2e4\ub978 \uac1d\uccb4\ub4e4 \uc0ac\uc774\uc5d0 \ucc38\uc870 \ubc29\uc2dd\uc774 \uc21c\ud658 \ud615\ud0dc\ub85c \uc5f0\uacb0\ub418\ub294 \ubc29\uc2dd\n", - " - \ub3c5\ub9bd\uc801\uc73c\ub85c \uc874\uc7ac\ud558\uc9c0\ub9cc \uc21c\ud658 \ucc38\uc870\ub418\ub294 \uc11c\ub85c \ub2e4\ub978 \uac1d\uccb4 \uadf8\ub8f9\uc740 \uc4f0\ub808\uae30 \uc218\uc9d1\uc774 \uc548\ub41c\ub2e4.\n", - " - \uc8fc\uae30\uc801\uc73c\ub85c \uc21c\ud658 \ucc38\uc870\ub97c \uc870\uc0ac\ud558\uc5ec \uc4f0\ub808\uae30 \uc218\uc9d1\ud558\ub294 \uae30\ub2a5\uc774 \uc788\uc9c0\ub9cc, CPU \uc790\uc6d0 \ub0ad\ube44\uac00 \uc2ec\ud558\ub2e4.\n", - " - \uc774\ub7ec\ud55c \uc4f0\ub808\uae30 \uc218\uc9d1 \ube48\ub3c4\uac00 \ub0ae\uc73c\uba74 \uc21c\ud658 \ucc38\uc870\ub418\ub294 \ub9ce\uc740 \uac1d\uccb4\ub4e4\uc774 \uba54\ubaa8\ub9ac\ub97c \uc4f8\ub370\uc5c6\uc774 \uc810\uc720\ud558\uac8c \ub428\n", - "- 2) \ub2e4\uc591\ud55c \uc778\uc2a4\ud134\uc2a4\ub4e4 \uc0ac\uc774\uc5d0\uc11c \uacf5\uc720\ub418\ub294 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc77c\uc885\uc758 \ucf00\uc2dc(Cache)\ub97c \ub9cc\ub4dc\ub294 \ub370 \ud65c\uc6a9\ub41c\ub2e4." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \uc57d\ud55c \ucc38\uc870 \ubaa8\ub4c8\n", - "#### 1) weakref.ref(o)\n", - "- weakref \ubaa8\ub4c8\uc758 ref(o) \ud568\uc218\n", - " - \uac1d\uccb4 o\uc5d0 \ub300\ud55c \uc57d\ud55c \ucc38\uc870\ub97c \uc0dd\uc131\ud55c\ub2e4.\n", - " - \ud574\ub2f9 \uac1d\uccb4\uac00 \uba54\ubaa8\ub9ac\uc5d0 \uc815\uc0c1\uc801\uc73c\ub85c \ub0a8\uc544 \uc788\ub294\uc9c0 \uc870\uc0ac\ud55c\ub2e4.\n", - " - \uac1d\uccb4\uac00 \uba54\ubaa8\ub9ac\uc5d0 \ub0a8\uc544 \uc788\uc9c0 \uc54a\uc73c\uba74 None\uc744 \ubc18\ud658\ud55c\ub2e4.\n", - "\n", - "- \uc57d\ud55c \ucc38\uc870\ub85c \ubd80\ud130 \uc2e4\uc81c \uac1d\uccb4\ub97c \ucc38\uc870\ud558\ub294 \ubc29\ubc95\n", - " - \uc57d\ud55c \ucc38\uc870 \uac1d\uccb4\uc5d0 \ud568\uc218\ud615\ud0dc \ud638\ucd9c" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import sys\n", - "import weakref # weakref \ubaa8\ub4c8 \uc784\ud3ec\ud2b8\n", - "class C:\n", - " pass\n", - "c = C() # \ud074\ub798\uc2a4 C\uc758 \uc778\uc2a4\ud134\uc2a4 \uc0dd\uc131 \n", - "c.a = 1 # \uc778\uc2a4\ud134\uc2a4 c\uc5d0 \ud14c\uc2a4\ud2b8\uc6a9 \uac12 \uc124\uc815 \n", - "print \"refcount -\", sys.getrefcount(c) # \uac1d\uccb4 c\uc758 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc870\ud68c\n", - "print\n", - "\n", - "d = c # \uc77c\ubc18\uc801\uc778 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc99d\uac00 \ubc29\ubc95\n", - "print \"refcount -\", sys.getrefcount(c) # \uac1d\uccb4 c\uc758 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc870\ud68c\n", - "print \n", + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 22. 약한참조, 반복자, 발생자\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 약한 참조\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 약한 참조의 정의\n", + "- 약한 참조 (Weak Reference)\n", + " - 레퍼런스 카운트로 고려되지 않는 참조" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 약한 참조의 필요성" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/cyclingref.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 1) 레퍼런스 카운트가 증가되지 않으므로 순환 참조가 방지된다.\n", + " - 순환 참조 (Cyclic Reference)\n", + " - 서로 다른 객체들 사이에 참조 방식이 순환 형태로 연결되는 방식\n", + " - 독립적으로 존재하지만 순환 참조되는 서로 다른 객체 그룹은 쓰레기 수집이 안된다.\n", + " - 주기적으로 순환 참조를 조사하여 쓰레기 수집하는 기능이 있지만, CPU 자원 낭비가 심하다.\n", + " - 이러한 쓰레기 수집 빈도가 낮으면 순환 참조되는 많은 객체들이 메모리를 쓸데없이 점유하게 됨\n", + "- 2) 다양한 인스턴스들 사이에서 공유되는 객체에 대한 일종의 케시(Cache)를 만드는 데 활용된다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 약한 참조 모듈\n", + "#### 1) weakref.ref(o)\n", + "- weakref 모듈의 ref(o) 함수\n", + " - 객체 o에 대한 약한 참조를 생성한다.\n", + " - 해당 객체가 메모리에 정상적으로 남아 있는지 조사한다.\n", + " - 객체가 메모리에 남아 있지 않으면 None을 반환한다.\n", + "\n", + "- 약한 참조로 부터 실제 객체를 참조하는 방법\n", + " - 약한 참조 객체에 함수형태 호출" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "refcount - 2\n", "\n", - "r = weakref.ref(c) # \uc57d\ud55c \ucc38\uc870 \uac1d\uccb4 r \uc0dd\uc131\n", - "print \"refcount -\", sys.getrefcount(c) # \uac1d\uccb4 c\uc758 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc870\ud68c --> \uce74\uc6b4\ud2b8 \ubd88\ubcc0\n", - "print" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "refcount - 2\n", - "\n", - "refcount - 3\n", - "\n", - "refcount - 3\n", - "\n" - ] - } - ], - "prompt_number": 16 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print r # \uc57d\ud55c \ucc38\uc870(weakref) \uac1d\uccb4\n", - "print r() # \uc57d\ud55c \ucc38\uc870\ub85c \ubd80\ud130 \uc2e4\uc81c \uac1d\uccb4\ub97c \ucc38\uc870\ud558\ub294 \ubc29\ubc95: \uc57d\ud55c \ucc38\uc870 \uac1d\uccb4\uc5d0 \ud568\uc218\ud615\ud0dc\ub85c \ud638\ucd9c\n", - "print c \n", - "print r().a # \uc57d\ud55c \ucc38\uc870\ub97c \uc774\uc6a9\ud55c \uc2e4\uc81c \uac1d\uccb4 \uba64\ubc84 \ucc38\uc870\n", - "print \n", + "refcount - 3\n", "\n", - "del c # \uac1d\uccb4 \uc81c\uac70\n", - "del d\n", - "print r() # None\uc744 \ub9ac\ud134\ud55c\ub2e4\n", - "print r().a # \uc18d\uc131\ub3c4 \ucc38\uc870\ud560 \uc218 \uc5c6\ub2e4" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "<__main__.C instance at 0x10d893830>\n", - "<__main__.C instance at 0x10d893830>\n", - "1\n", - "\n", - "None\n" - ] - }, - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'a'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# None\uc744 \ub9ac\ud134\ud55c\ub2e4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m \u001b[0;31m# \uc18d\uc131\ub3c4 \ucc38\uc870\ud560 \uc218 \uc5c6\ub2e4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'a'" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub0b4\uc7a5 \uc790\ub8cc\ud615 \uac1d\uccb4 (\ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804 \ub4f1)\uc5d0 \ub300\ud574\uc11c\ub294 \uc57d\ud55c \ucc38\uc870\ub97c \ub9cc\ub4e4 \uc218 \uc5c6\ub2e4." + "refcount - 3\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one': 1, 'two': 2}\n", - "wd = weakref.ref(d)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "cannot create weak reference to 'dict' object", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'one'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'two'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mwd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mweakref\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mref\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: cannot create weak reference to 'dict' object" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) weakref.proxy(o)\n", - "- weakref\uc758 proxy(o)\ub294 \uac1d\uccb4 o\uc5d0 \ub300\ud55c \uc57d\ud55c \ucc38\uc870 \ud504\ub85d\uc2dc\ub97c \uc0dd\uc131\ud55c\ub2e4.\n", - " - \ud504\ub85d\uc2dc\ub97c \uc774\uc6a9\ud558\uba74 \ud568\uc218 \ud615\uc2dd\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc2e4\uc81c \uac1d\uccb4\ub97c \ubc14\ub85c \ucc38\uc870\ud560 \uc218 \uc788\ub2e4.\n", - " - ref(o) \ud568\uc218\ubcf4\ub2e4 \ub354 \uc120\ud638\ub418\ub294 \ud568\uc218" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import sys\n", - "import weakref\n", - "class C:\n", - " pass\n", - "\n", - "c = C()\n", - "c.a = 2\n", - "print \"refcount -\", sys.getrefcount(c) # \uac1d\uccb4 c\uc758 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc870\ud68c\n", - "p = weakref.proxy(c) # \ud504\ub85d\uc2dc \uac1d\uccb4\ub97c \ub9cc\ub4e0\ub2e4\n", - "print \"refcount -\", sys.getrefcount(c) # \uac1d\uccb4 c\uc758 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8 \uc870\ud68c --> \uce74\uc6b4\ud2b8 \ubd88\ubcc0\n", - "print \n", - "print p\n", - "print c\n", - "print p.a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "refcount - 2\n", - "refcount - 2\n", - "\n", - "<__main__.C instance at 0x10d8a9998>\n", - "<__main__.C instance at 0x10d8a9998>\n", - "2\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import weakref\n", - "class C:\n", - " pass\n", + } + ], + "source": [ + "import sys\n", + "import weakref # weakref 모듈 임포트\n", + "class C:\n", + " pass\n", + "c = C() # 클래스 C의 인스턴스 생성 \n", + "c.a = 1 # 인스턴스 c에 테스트용 값 설정 \n", + "print \"refcount -\", sys.getrefcount(c) # 객체 c의 레퍼런스 카운트 조회\n", + "print\n", + "\n", + "d = c # 일반적인 레퍼런스 카운트 증가 방법\n", + "print \"refcount -\", sys.getrefcount(c) # 객체 c의 레퍼런스 카운트 조회\n", + "print \n", + "\n", + "r = weakref.ref(c) # 약한 참조 객체 r 생성\n", + "print \"refcount -\", sys.getrefcount(c) # 객체 c의 레퍼런스 카운트 조회 --> 카운트 불변\n", + "print" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "<__main__.C instance at 0x10d893830>\n", + "<__main__.C instance at 0x10d893830>\n", + "1\n", "\n", - "c = C() # \ucc38\uc870\ud560 \uac1d\uccb4 \uc0dd\uc131\n", - "r = weakref.ref(c) # weakref \uc0dd\uc131\n", - "p = weakref.proxy(c) # weakref \ud504\ub85d\uc2dc \uc0dd\uc131\n", - "print weakref.getweakrefcount(c) # weakref \uac1c\uc218 \uc870\ud68c\n", - "print weakref.getweakrefs(c) # weakref \ubaa9\ub85d \uc870\ud68c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "[, ]\n" - ] - } - ], - "prompt_number": 30 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \uc57d\ud55c \uc0ac\uc804\n", - "- \uc57d\ud55c \uc0ac\uc804 (Weak Dictionary)\n", - " - \uc0ac\uc804\uc758 \ud0a4(key)\ub098 \uac12(value)\uc73c\ub85c \ub2e4\ub978 \uac1d\uccb4\ub4e4\uc5d0 \ub300\ud55c \uc57d\ud55c \ucc38\uc870\ub97c \uc9c0\ub2c8\ub294 \uc0ac\uc804\n", - " - \uc8fc\ub85c \ub2e4\ub978 \uac1d\uccb4\ub4e4\uc5d0 \ub300\ud55c \uce90\uc2dc(Cache)\ub85c \ud65c\uc6a9\n", - " - \uc77c\ubc18\uc801\uc778 \uc0ac\uc804\uacfc\uc758 \ucc28\uc774\uc810\n", - " - \ud0a4(key)\ub098 \uac12(value)\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uac1d\uccb4\ub294 \uc57d\ud55c \ucc38\uc870\ub97c \uc9c0\ub2cc\ub2e4.\n", - " - \uc2e4\uc81c \uac1d\uccb4\uac00 \uc0ad\uc81c\ub418\uba74 \uc790\ub3d9\uc801\uc73c\ub85c \uc57d\ud55c \uc0ac\uc804\uc5d0 \uc788\ub294 (\ud0a4, \uac12)\uc758 \uc30d\ub3c4 \uc0ad\uc81c\ub41c\ub2e4.\n", - " - \uc989, \uc2e4\uc81c \uac1d\uccb4\uac00 \uc0ac\ub77c\uc9c0\uba74 \uce90\uc2dc\uc5ed\ud560\uc744 \ud558\ub294 \uc57d\ud55c \uc0ac\uc804\uc5d0\uc11c\ub3c4 \ud574\ub2f9 \uc544\uc774\ud15c\uc774 \uc81c\uac70\ub418\ubbc0\ub85c \ud6a8\uc728\uc801\uc778 \uac1d\uccb4 \uc18c\uba78 \uad00\ub9ac\uac00 \uac00\ub2a5\ud558\ub2e4. " + "None\n" ] }, { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- weakref \ubaa8\ub4c8\uc758 WeakValueDictionary \ud074\ub798\uc2a4\n", - " - weakref \ubaa8\ub4c8\uc758 WeakValueDictionary \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub294 \uc57d\ud55c \uc0ac\uc804\uc744 \uc0dd\uc131\ud55c\ub2e4." + "ename": "AttributeError", + "evalue": "'NoneType' object has no attribute 'a'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# None을 리턴한다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m \u001b[0;31m# 속성도 참조할 수 없다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'a'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import weakref\n", - "class C:\n", - " pass\n", - "\n", - "c = C()\n", - "c.a = 4\n", - "d = weakref.WeakValueDictionary() # WeakValueDictionary \uac1d\uccb4 \uc0dd\uc131\n", - "print d\n", - "\n", - "d[1] = c # \uc2e4\uc81c \uac1d\uccb4\uc5d0 \ub300\ud55c \uc57d\ud55c \ucc38\uc870 \uc544\uc774\ud15c \uc0dd\uc131\n", - "print d.items() # \uc0ac\uc804 \ub0b4\uc6a9 \ud655\uc778\n", - "print d[1].a # \uc2e4\uc81c \uac1d\uccb4\uc758 \uc18d\uc131 \ucc38\uc870\n", - "\n", - "del c # \uc2e4\uc81c \uac1d\uccb4 \uc0ad\uc81c\n", - "print d.items() # \uc57d\ud55c \uc0ac\uc804\uc5d0 \ud574\ub2f9 \uac1d\uccb4 \uc544\uc774\ud15c\ub3c4 \uc81c\uac70\ub418\uc5b4 \uc788\uc74c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "[(1, <__main__.C instance at 0x10dccad40>)]\n", - "4\n", - "[]\n" - ] - } - ], - "prompt_number": 16 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc77c\ubc18 \uc0ac\uc804\uc744 \ud1b5\ud558\uc5ec \ub3d9\uc77c\ud55c \uc608\uc81c\ub97c \uc218\ud589\ud558\uba74 \ub9c8\uc9c0\ub9c9\uc5d0 \ud574\ub2f9 \uac1d\uccb4\ub97c \uc0ad\uc81c\ud574\ub3c4 \uc77c\ubc18 \uc0ac\uc804 \ub0b4\uc5d0\uc11c\ub294 \uc5ec\uc804\ud788 \uc874\uc7ac\ud568" + } + ], + "source": [ + "print r # 약한 참조(weakref) 객체\n", + "print r() # 약한 참조로 부터 실제 객체를 참조하는 방법: 약한 참조 객체에 함수형태로 호출\n", + "print c \n", + "print r().a # 약한 참조를 이용한 실제 객체 멤버 참조\n", + "print \n", + "\n", + "del c # 객체 제거\n", + "del d\n", + "print r() # None을 리턴한다\n", + "print r().a # 속성도 참조할 수 없다" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 내장 자료형 객체 (리스트, 튜플, 사전 등)에 대해서는 약한 참조를 만들 수 없다." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "cannot create weak reference to 'dict' object", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'one'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'two'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mwd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mweakref\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mref\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: cannot create weak reference to 'dict' object" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class C:\n", - " pass\n", - "\n", - "c = C()\n", - "c.a = 4\n", - "d = {} # \uc77c\ubc18 \uc0ac\uc804 \uac1d\uccb4 \uc0dd\uc131\n", - "print d\n", - "\n", - "d[1] = c # \uc2e4\uc81c \uac1d\uccb4\uc5d0 \ub300\ud55c \uc77c\ubc18 \ucc38\uc870 \uc544\uc774\ud15c \uc0dd\uc131\n", - "print d.items() # \uc0ac\uc804 \ub0b4\uc6a9 \ud655\uc778\n", - "print d[1].a # \uc2e4\uc81c \uac1d\uccb4\uc758 \uc18d\uc131 \ucc38\uc870\n", + } + ], + "source": [ + "d = {'one': 1, 'two': 2}\n", + "wd = weakref.ref(d)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) weakref.proxy(o)\n", + "- weakref의 proxy(o)는 객체 o에 대한 약한 참조 프록시를 생성한다.\n", + " - 프록시를 이용하면 함수 형식을 사용하지 않아도 실제 객체를 바로 참조할 수 있다.\n", + " - ref(o) 함수보다 더 선호되는 함수" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "refcount - 2\n", + "refcount - 2\n", "\n", - "del c # \uac1d\uccb4 \uc0ad\uc81c (\uc0ac\uc804\uc5d0 \ud574\ub2f9 \uac1d\uccb4\uc758 \ub808\ud37c\ub7f0\uc2a4\uac00 \uc788\uc73c\ubbc0\ub85c \uac1d\uccb4\ub294 \uc2e4\uc81c\ub85c \uba54\ubaa8\ub9ac \ud574\uc81c\ub418\uc9c0 \uc54a\uc74c)\n", - "print d.items() # \uc77c\ubc18 \uc0ac\uc804\uc5d0 \ud574\ub2f9 \uac1d\uccb4 \uc544\uc774\ud15c\uc774 \uc5ec\uc804\ud788 \ub0a8\uc544 \uc788\uc74c" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{}\n", - "[(1, <__main__.C instance at 0x10d893878>)]\n", - "4\n", - "[(1, <__main__.C instance at 0x10d893878>)]\n" - ] - } - ], - "prompt_number": 21 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ubc18\ubcf5\uc790\n", - "***" + "<__main__.C instance at 0x10d8a9998>\n", + "<__main__.C instance at 0x10d8a9998>\n", + "2\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ubc18\ubcf5\uc790 \uac1d\uccb4\n", - "- \ubc18\ubcf5\uc790 \uac1d\uccb4\n", - " - next() \uba54\uc18c\ub4dc\ub97c \uc9c0\ub2c8\uace0 \uc788\ub294 \uac1d\uccb4\n", - " - next() \uba54\uc18c\ub4dc\ub85c \ub354 \uc774\uc0c1 \uc790\ub8cc\ub97c \ub150\uaca8\uc904 \uc218 \uc5c6\uc744 \ub54c StopIteration \uc608\uc678\uac00 \ubc1c\uc0dd\ud55c\ub2e4.\n", - "- \ubc18\ubcf5\uc790 \uac1d\uccb4 \uc0dd\uc131 \ubc29\ubc95\n", - " - iter(o) \ub0b4\uc7a5 \ud568\uc218\n", - " - \uac1d\uccb4 o\uc758 \ubc18\ubcf5\uc790 \uac1d\uccb4\ub97c \ubc18\ud658\ud55c\ub2e4.\n", - "- \ubc18\ubcf5\uc790 \uac1d\uccb4\uc758 \ud6a8\uc728\uc131\n", - " - \ubc18\ubcf5\uc790\uac00 \uc6d0 \uac1d\uccb4\uc758 \uc6d0\uc18c\ub4e4\uc744 \ubcf5\uc0ac\ud558\uc5ec \uc9c0\ub2c8\uace0 \uc788\uc9c0 \uc54a\ub2e4." + } + ], + "source": [ + "import sys\n", + "import weakref\n", + "class C:\n", + " pass\n", + "\n", + "c = C()\n", + "c.a = 2\n", + "print \"refcount -\", sys.getrefcount(c) # 객체 c의 레퍼런스 카운트 조회\n", + "p = weakref.proxy(c) # 프록시 객체를 만든다\n", + "print \"refcount -\", sys.getrefcount(c) # 객체 c의 레퍼런스 카운트 조회 --> 카운트 불변\n", + "print \n", + "print p\n", + "print c\n", + "print p.a" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "[, ]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "I = iter([1,2,3])\n", - "print I\n", - "\n", - "print I.next()\n", - "print I.next()\n", - "print I.next()\n", - "print I.next()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "1\n", - "2\n", - "3\n" - ] - }, - { - "ename": "StopIteration", - "evalue": "", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mStopIteration\u001b[0m: " - ] - } - ], - "prompt_number": 20 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uac1d\uccb4\uc5d0 \ub300\ud574 \uc77c\ubc18\uc801\uc778 for ~ in \ubc18\ubcf5 \ubb38 \uc0ac\uc6a9\uc608" + } + ], + "source": [ + "import weakref\n", + "class C:\n", + " pass\n", + "\n", + "c = C() # 참조할 객체 생성\n", + "r = weakref.ref(c) # weakref 생성\n", + "p = weakref.proxy(c) # weakref 프록시 생성\n", + "print weakref.getweakrefcount(c) # weakref 개수 조회\n", + "print weakref.getweakrefs(c) # weakref 목록 조회" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 약한 사전\n", + "- 약한 사전 (Weak Dictionary)\n", + " - 사전의 키(key)나 값(value)으로 다른 객체들에 대한 약한 참조를 지니는 사전\n", + " - 주로 다른 객체들에 대한 캐시(Cache)로 활용\n", + " - 일반적인 사전과의 차이점\n", + " - 키(key)나 값(value)으로 사용되는 객체는 약한 참조를 지닌다.\n", + " - 실제 객체가 삭제되면 자동적으로 약한 사전에 있는 (키, 값)의 쌍도 삭제된다.\n", + " - 즉, 실제 객체가 사라지면 캐시역할을 하는 약한 사전에서도 해당 아이템이 제거되므로 효율적인 객체 소멸 관리가 가능하다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- weakref 모듈의 WeakValueDictionary 클래스\n", + " - weakref 모듈의 WeakValueDictionary 클래스의 생성자는 약한 사전을 생성한다." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "[(1, <__main__.C instance at 0x10dccad40>)]\n", + "4\n", + "[]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f(x):\n", - " print x + 1\n", - "\n", - "for x in [1,2,3]:\n", - " f(x)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "prompt_number": 53 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \uac1d\uccb4\uc5d0 \ubc18\ubcf5\uc790\ub97c \ud65c\uc6a9\ud55c \uc608" + } + ], + "source": [ + "import weakref\n", + "class C:\n", + " pass\n", + "\n", + "c = C()\n", + "c.a = 4\n", + "d = weakref.WeakValueDictionary() # WeakValueDictionary 객체 생성\n", + "print d\n", + "\n", + "d[1] = c # 실제 객체에 대한 약한 참조 아이템 생성\n", + "print d.items() # 사전 내용 확인\n", + "print d[1].a # 실제 객체의 속성 참조\n", + "\n", + "del c # 실제 객체 삭제\n", + "print d.items() # 약한 사전에 해당 객체 아이템도 제거되어 있음" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 일반 사전을 통하여 동일한 예제를 수행하면 마지막에 해당 객체를 삭제해도 일반 사전 내에서는 여전히 존재함" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{}\n", + "[(1, <__main__.C instance at 0x10d893878>)]\n", + "4\n", + "[(1, <__main__.C instance at 0x10d893878>)]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f(x):\n", - " print x + 1\n", - "\n", - "t = iter([1,2,3])\n", - "while 1:\n", - " try:\n", - " x = t.next()\n", - " except StopIteration:\n", - " break\n", - " f(x)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "prompt_number": 23 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- for ~ in \uad6c\ubb38\uc5d0 \ubc18\ubcf5\uc790\ub97c \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4.\n", - " - for \ubb38\uc774 \ub3cc\ub54c \ub9c8\ub2e4 \ubc18\ubcf5\uc790 \uac1d\uccb4\uc758 next() \ud568\uc218\uac00 \uc790\ub3d9\uc73c\ub85c \ud638\ucd9c\ub418\uc5b4 \uc21c\ucc28\uc801\uc73c\ub85c \uac01 \uac1d\uccb4\uc5d0 \uc811\uadfc \uac00\ub2a5\ud558\ub2e4.\n", - " - StopIteration\uc774 \ubc1c\uc0dd\ud558\uba74 for ~ in \uad6c\ubb38\uc774 \uba48\ucd98\ub2e4." + } + ], + "source": [ + "class C:\n", + " pass\n", + "\n", + "c = C()\n", + "c.a = 4\n", + "d = {} # 일반 사전 객체 생성\n", + "print d\n", + "\n", + "d[1] = c # 실제 객체에 대한 일반 참조 아이템 생성\n", + "print d.items() # 사전 내용 확인\n", + "print d[1].a # 실제 객체의 속성 참조\n", + "\n", + "del c # 객체 삭제 (사전에 해당 객체의 레퍼런스가 있으므로 객체는 실제로 메모리 해제되지 않음)\n", + "print d.items() # 일반 사전에 해당 객체 아이템이 여전히 남아 있음" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 반복자\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 반복자 객체\n", + "- 반복자 객체\n", + " - next() 메소드를 지니고 있는 객체\n", + " - next() 메소드로 더 이상 자료를 념겨줄 수 없을 때 StopIteration 예외가 발생한다.\n", + "- 반복자 객체 생성 방법\n", + " - iter(o) 내장 함수\n", + " - 객체 o의 반복자 객체를 반환한다.\n", + "- 반복자 객체의 효율성\n", + " - 반복자가 원 객체의 원소들을 복사하여 지니고 있지 않다." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "1\n", + "2\n", + "3\n" ] }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f(x):\n", - " print x + 1\n", - "\n", - "t = iter([1,2,3])\n", - "for x in t:\n", - " f(x)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f(x):\n", - " print x + 1\n", - "\n", - "for x in iter([1,2,3]):\n", - " f(x)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f(x):\n", - " print x + 1\n", - "\n", - "for x in iter((1,2,3)):\n", - " f(x)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "prompt_number": 24 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ud074\ub798\uc2a4\uc5d0 \ubc18\ubcf5\uc790 \uad6c\ud604\ud558\uae30" + "ename": "StopIteration", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m: " ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub0b4\uc7a5 \ud568\uc218 iter(o)\uc5d0 \ub300\uc751\ub418\ub294 \\_\\_iter\\_\\_(self)\uc758 \uad6c\ud604 \n", - " - \uac1d\uccb4 o\uc5d0 iter(o)\ub97c \ud638\ucd9c\ud558\uba74 \uc790\ub3d9\uc73c\ub85c \\_\\_iter\\_\\_(self) \ud568\uc218 \ud638\ucd9c\n", - " - \\_\\_iter\\_\\_(self) \ud568\uc218\ub294 next() \ud568\uc218\ub97c \uc9c0\ub2cc \ubc18\ubcf5\uc790 \uac1d\uccb4\ub97c \ubc18\ud658\ud574\uc57c \ud55c\ub2e4." + } + ], + "source": [ + "I = iter([1,2,3])\n", + "print I\n", + "\n", + "print I.next()\n", + "print I.next()\n", + "print I.next()\n", + "print I.next()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 객체에 대해 일반적인 for ~ in 반복 문 사용예" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "3\n", + "4\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Seq:\n", - " def __init__(self, fname):\n", - " self.file = open(fname)\n", - " #def __getitem__(self, n):\n", - " # if n == 10:\n", - " # raise StopIteration\n", - " # return n\n", - " def __iter__(self):\n", - " return self\n", - " def next(self):\n", - " line = self.file.readline() # \ud55c \ub77c\uc778\uc744 \uc77d\ub294\ub2e4.\n", - " if not line: \n", - " raise StopIteration # \uc77d\uc744 \uc218 \uc5c6\uc73c\uba74 \uc608\uc678 \ubc1c\uc0dd\n", - " return line # \uc77d\uc740 \ub77c\uc778\uc744 \ub9ac\ud134\ud55c\ub2e4.\n", - " \n", - "s = Seq('readme.txt') # s \uc778\uc2a4\ud134\uc2a4\uac00 next() \uba54\uc18c\ub4dc\ub97c \uc9c0\ub2c8\uace0 \uc788\uc73c\ubbc0\ub85c s \uc778\uc2a4\ud134\uc2a4 \uc790\uccb4\uac00 \ubc18\ubcf5\uc790\uc784 \n", - "for line in s: # \uc6b0\uc120 __iter__() \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uc5ec \ubc18\ubcf5\uc790\ub97c \uc5bb\uace0, \ubc18\ubcf5\uc790\uc5d0 \ub300\ud574\uc11c for ~ in \uad6c\ubb38\uc5d0 \uc758\ud558\uc5ec next() \uba54\uc18c\ub4dc\uac00 \ud638\ucd9c\ub428\n", - " print line,\n", - "\n", - "print \n", - "\n", - "print Seq('readme.txt')\n", - "\n", - "print list(Seq('readme.txt')) # list() \ub0b4\uc7a5 \ud568\uc218\uac00 \uac1d\uccb4\ub97c \uc778\uc218\ub85c \ubc1b\uc73c\uba74 \ud574\ub2f9 \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790\ub97c \uc5bb\uc5b4\uc640 next()\ub97c \ub9e4\ubc88 \ud638\ucd9c\ud558\uc5ec \uac01 \uc6d0\uc18c\ub97c \uc5bb\uc5b4\uc628\ub2e4. \n", - "print tuple(Seq('readme.txt')) # tuple() \ub0b4\uc7a5 \ud568\uc218\uac00 \uac1d\uccb4\ub97c \uc778\uc218\ub85c \ubc1b\uc73c\uba74 \ud574\ub2f9 \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790\ub97c \uc5bb\uc5b4\uc640 next()\ub97c \ub9e4\ubc88 \ud638\ucd9c\ud558\uc5ec \uac01 \uc6d0\uc18c\ub97c \uc5bb\uc5b4\uc628\ub2e4. " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "abc\n", - "def\n", - "ghi\n", - "\n", - "<__main__.Seq instance at 0x10ddc5680>\n", - "['abc\\n', 'def\\n', 'ghi\\n']\n", - "('abc\\n', 'def\\n', 'ghi\\n')\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \uc0ac\uc804\uc758 \ubc18\ubcf5\uc790" + } + ], + "source": [ + "def f(x):\n", + " print x + 1\n", + "\n", + "for x in [1,2,3]:\n", + " f(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 객체에 반복자를 활용한 예" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "3\n", + "4\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0ac\uc804\uc5d0 \ub300\ud574 for ~ in \uad6c\ubb38\uc740 \ud0a4\uc5d0 \ub300\ud574 \ubc18\ubcf5\ud55c\ub2e4." + } + ], + "source": [ + "def f(x):\n", + " print x + 1\n", + "\n", + "t = iter([1,2,3])\n", + "while 1:\n", + " try:\n", + " x = t.next()\n", + " except StopIteration:\n", + " break\n", + " f(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- for ~ in 구문에 반복자를 활용할 수 있다.\n", + " - for 문이 돌때 마다 반복자 객체의 next() 함수가 자동으로 호출되어 순차적으로 각 객체에 접근 가능하다.\n", + " - StopIteration이 발생하면 for ~ in 구문이 멈춘다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "3\n", + "4\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}\n", - "for key in d:\n", - " print key, d[key]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "four 4\n", - "three 3\n", - "five 5\n", - "two 2\n", - "one 1\n" - ] - } - ], - "prompt_number": 53 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}\n", - "for key in iter(d):\n", - " print key, d[key]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "four 4\n", - "three 3\n", - "five 5\n", - "two 2\n", - "one 1\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- d.iterkeys() \ud568\uc218\n", - " - \uc0ac\uc804 d\uac00 \uc9c0\ub2cc \ud0a4\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790 \uac1d\uccb4\ub97c \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "def f(x):\n", + " print x + 1\n", + "\n", + "t = iter([1,2,3])\n", + "for x in t:\n", + " f(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "3\n", + "4\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for key in d.iterkeys(): # \ud0a4\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790, d.iterkeys() \uac00 \ubc18\ud658\ud55c \ubc18\ubcf5\uc790\uc5d0 \ub300\ud574 next() \ud568\uc218\uac00 \uc21c\ucc28\uc801\uc73c\ub85c \ubd88\ub9ac\uc6cc\uc9d0\n", - " print key," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "four three five two one\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "keyset = d.iterkeys()\n", - "print keyset.next() # \ubc18\ubcf5\uc790 \uac1d\uccb4\ub294 \ud56d\uc0c1 next() \uba54\uc18c\ub4dc\ub97c \uc9c0\ub2c8\uace0 \uc788\uc74c\n", - "for key in keyset: # keyset \ubc18\ubcf5\uc790\uc5d0 \ub300\ud574 next() \uba54\uc18c\ub4dc\uac00 \uc21c\ucc28\uc801\uc73c\ub85c \ud638\ucd9c\ub428\n", - " print key," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "four\n", - "three five two one\n" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- d.itervalues() \ud568\uc218\n", - " - \uc0ac\uc804 d\uac00 \uc9c0\ub2cc \uac12\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790 \uac1d\uccb4\ub97c \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "def f(x):\n", + " print x + 1\n", + "\n", + "for x in iter([1,2,3]):\n", + " f(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "3\n", + "4\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for value in d.itervalues(): # \uac12\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790\n", - " print value, " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "4 3 5 2 1\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- d.iteritems() \ud568\uc218\n", - " - \uc0ac\uc804 d\uc758 \uac01 \uc544\uc774\ud15c\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790 \uac1d\uccb4\ub97c \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "def f(x):\n", + " print x + 1\n", + "\n", + "for x in iter((1,2,3)):\n", + " f(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 클래스에 반복자 구현하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 내장 함수 iter(o)에 대응되는 \\_\\_iter\\_\\_(self)의 구현 \n", + " - 객체 o에 iter(o)를 호출하면 자동으로 \\_\\_iter\\_\\_(self) 함수 호출\n", + " - \\_\\_iter\\_\\_(self) 함수는 next() 함수를 지닌 반복자 객체를 반환해야 한다." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abc\n", + "def\n", + "ghi\n", + "\n", + "<__main__.Seq instance at 0x10ddc5680>\n", + "['abc\\n', 'def\\n', 'ghi\\n']\n", + "('abc\\n', 'def\\n', 'ghi\\n')\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for key, value in d.iteritems(): #(\ud0a4,\uac12)\uc5d0 \ub300\ud55c \ubc18\ubcf5\uc790\n", - " print key, value" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "four 4\n", - "three 3\n", - "five 5\n", - "two 2\n", - "one 1\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-4 \ud30c\uc77c \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790" + } + ], + "source": [ + "class Seq:\n", + " def __init__(self, fname):\n", + " self.file = open(fname)\n", + " #def __getitem__(self, n):\n", + " # if n == 10:\n", + " # raise StopIteration\n", + " # return n\n", + " def __iter__(self):\n", + " return self\n", + " def next(self):\n", + " line = self.file.readline() # 한 라인을 읽는다.\n", + " if not line: \n", + " raise StopIteration # 읽을 수 없으면 예외 발생\n", + " return line # 읽은 라인을 리턴한다.\n", + " \n", + "s = Seq('readme.txt') # s 인스턴스가 next() 메소드를 지니고 있으므로 s 인스턴스 자체가 반복자임 \n", + "for line in s: # 우선 __iter__() 메소드를 호출하여 반복자를 얻고, 반복자에 대해서 for ~ in 구문에 의하여 next() 메소드가 호출됨\n", + " print line,\n", + "\n", + "print \n", + "\n", + "print Seq('readme.txt')\n", + "\n", + "print list(Seq('readme.txt')) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. \n", + "print tuple(Seq('readme.txt')) # tuple() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 사전의 반복자" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전에 대해 for ~ in 구문은 키에 대해 반복한다." + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "four 4\n", + "three 3\n", + "five 5\n", + "two 2\n", + "one 1\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc77c \uac1d\uccb4\ub294 \uadf8 \uc790\uccb4\uac00 \ubc18\ubcf5\uc790\uc784\n", - " - next() \ud568\uc218\uc5d0 \uc758\ud574 \uac01 \ub77c\uc778\uc774 \uc21c\ucc28\uc801\uc73c\ub85c \uc77d\ud600\uc9d0" + } + ], + "source": [ + "d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}\n", + "for key in d:\n", + " print key, d[key]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "four 4\n", + "three 3\n", + "five 5\n", + "two 2\n", + "one 1\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "f = open('readme.txt')\n", - "print \"f.next()\", f.next()\n", - "for line in f: # f.next() \uac00 \uc21c\ucc28\uc801\uc73c\ub85c \ud638\ucd9c\ub428\n", - " print line, " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "f.next() 1: Hello World\n", - "\n", - "2: Hello World\n", - "3: Hello World\n", - "4: Hello World\n", - "5: Hello World\n" - ] - } - ], - "prompt_number": 21 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \ubc1c\uc0dd\uc790\n", - "***" + } + ], + "source": [ + "d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}\n", + "for key in iter(d):\n", + " print key, d[key]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- d.iterkeys() 함수\n", + " - 사전 d가 지닌 키에 대한 반복자 객체를 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "four three five two one\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-1 \ubc1c\uc0dd\uc790\ub780?\n", - "- \ubc1c\uc0dd\uc790(Generator)\n", - " - (\uc911\ub2e8\ub428 \uc2dc\uc810\ubd80\ud130) \uc7ac\uc2e4\ud589 \uac00\ub2a5\ud55c \ud568\uc218\n", - " \n", - "- \uc544\ub798 \ud568\uc218 f()\ub294 \uc790\uc2e0\uc758 \uc778\uc218 \ubc0f \ub0b4\ubd80 \ubcc0\uc218\ub85c\uc11c a, b, c, d\ub97c \uc9c0\ub2c8\uace0 \uc788\ub2e4.\n", - " - \uc774\ub7ec\ud55c a, b, c, d \ubcc0\uc218\ub4e4\uc740 \ud568\uc218\uac00 \uc885\ub8cc\ub418\uace0 \ubc18\ud658\ub420 \ub54c \ubaa8\ub450 \uc0ac\ub77c\uc9c4\ub2e4.\n", - "- \ubc1c\uc0dd\uc790\ub294 f()\uc640 \uac19\uc774 \ud568\uc218\uac00 \uc885\ub8cc\ub420 \ub54c \uba54\ubaa8\ub9ac\uc5d0\uc11c \ud574\uc81c\ub418\ub294 \uac83\uc744 \ub9c9\uace0 \ub2e4\uc2dc \ud568\uc218\uac00 \ud638\ucd9c \ub420 \ub54c \uc774\uc804\uc5d0 \uc218\ud589\uc774 \uc885\ub8cc\ub418\uc5c8\ub358 \uc9c0\uc810 \ubd80\ud130 \uacc4\uc18d \uc218\ud589\uc774 \uac00\ub2a5\ud558\ub3c4\ub85d \uad6c\ud604\ub41c \ud568\uc218\uc774\ub2e4." + } + ], + "source": [ + "for key in d.iterkeys(): # 키에 대한 반복자, d.iterkeys() 가 반환한 반복자에 대해 next() 함수가 순차적으로 불리워짐\n", + " print key," + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "four\n", + "three five two one\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f(a,b):\n", - " c = a * b\n", - " d = a + b\n", - " return c, d" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- yield \ud0a4\uc6cc\ub4dc\n", - " - return \ub300\uc2e0\uc5d0 yield\uc5d0 \uc758\ud574 \uac12\uc744 \ubc18\ud658\ud558\ub294 \ud568\uc218\ub294 \ubc1c\uc0dd\uc790\uc774\ub2e4.\n", - " - yield\ub294 return\uacfc \uc720\uc0ac\ud558\uac8c \uc784\uc758\uc758 \uac12\uc744 \ubc18\ud658\ud558\uc9c0\ub9cc \ud568\uc218\uc758 \uc2e4\ud589 \uc0c1\ud0dc\ub97c \ubcf4\uc874\ud558\uba74\uc11c \ud568\uc218\ub97c \ud638\ucd9c\ud55c \ucabd\uc73c\ub85c \ubcf5\uadc0\uc2dc\ucf1c\uc900\ub2e4.\n", - "- \ubc1c\uc0dd\uc790\ub294 \uace7 \ubc18\ubcf5\uc790\uc774\ub2e4.\n", - " - \uc989, \ubc1c\uc0dd\uc790\uc5d0\uac8c next() \ud638\ucd9c\uc774 \uac00\ub2a5\ud558\ub2e4." + } + ], + "source": [ + "keyset = d.iterkeys()\n", + "print keyset.next() # 반복자 객체는 항상 next() 메소드를 지니고 있음\n", + "for key in keyset: # keyset 반복자에 대해 next() 메소드가 순차적으로 호출됨\n", + " print key," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- d.itervalues() 함수\n", + " - 사전 d가 지닌 값에 대한 반복자 객체를 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4 3 5 2 1\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def generate_ints(N):\n", - " for i in range(N):\n", - " yield i" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "gen = generate_ints(3) # \ubc1c\uc0dd\uc790 \uac1d\uccb4\ub97c \uc5bb\ub294\ub2e4. generate_ints() \ud568\uc218\uc5d0 \ub300\ud55c \ucd08\uae30 \uc2a4\ud0dd \ud504\ub808\uc784\uc774 \ub9cc\ub4e4\uc5b4\uc9c0\ub098 \uc2e4\ud589\uc740 \uc911\ub2e8\ub418\uc5b4 \uc788\ub294 \uc0c1\ud0dc\uc784\n", - "print gen\n", - "print gen.next() # \ubc1c\uc0dd\uc790 \uac1d\uccb4\ub294 \ubc18\ubcf5\uc790 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uac00\uc9c4\ub2e4. \ubc1c\uc0dd\uc790\uc758 \uc2e4\ud589\uc774 \uc7ac\uac1c\ub428. yield\uc5d0 \uc758\ud574 \uac12 \ubc18\ud658 \ud6c4 \ub2e4\uc2dc \uc2e4\ud589\uc774 \uc911\ub2e8\ub428\n", - "print gen.next() # \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \uac12 \ubc18\ud658 \ud6c4 \ub2e4\uc2dc \uc911\ub2e8\n", - "print gen.next() # \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \uac12 \ubc18\ud658 \ud6c4 \ub2e4\uc2dc \uc911\ub2e8\n", - "print gen.next() # \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \ub354 \uc774\uc0c1 \ubc18\ud658\ud560 \uac12\uc774 \uc5c6\ub2e4\uba74 StopIteration \uc608\uc678\ub97c \ub358\uc9d0" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "0\n", - "1\n", - "2\n" - ] - }, - { - "ename": "StopIteration", - "evalue": "", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \uac12 \ubc18\ud658 \ud6c4 \ub2e4\uc2dc \uc911\ub2e8\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \uac12 \ubc18\ud658 \ud6c4 \ub2e4\uc2dc \uc911\ub2e8\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# \ubc1c\uc0dd\uc790 \uc2e4\ud589 \uc7ac\uac1c. yield\uc5d0 \uc758\ud574 \ub354 \uc774\uc0c1 \ubc18\ud658\ud560 \uac12\uc774 \uc5c6\ub2e4\uba74 StopIteration \uc608\uc678\ub97c \ub358\uc9d0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mStopIteration\u001b[0m: " - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc704\uc640 \uac19\uc740 \uc138\ubd80 \ub3d9\uc791 \ubc29\uc2dd\uc744 \uc774\uc6a9\ud558\uc5ec, \ub2e4\uc74c\uacfc \uac19\uc774 for ~ in \uad6c\ubb38\uc5d0 \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4." + } + ], + "source": [ + "for value in d.itervalues(): # 값에 대한 반복자\n", + " print value, " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- d.iteritems() 함수\n", + " - 사전 d의 각 아이템에 대한 반복자 객체를 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "four 4\n", + "three 3\n", + "five 5\n", + "two 2\n", + "one 1\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for i in generate_ints(5):\n", - " print i," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0 1 2 3 4\n" - ] - } - ], - "prompt_number": 22 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubc1c\uc0dd\uc790 \ud568\uc218\uc640 \uc77c\ubc18 \ud568\uc218\uc758 \ucc28\uc774\uc810\n", - " - \uc77c\ubc18 \ud568\uc218\ub294 \ud568\uc218\uac00 \ud638\ucd9c\ub418\uba74 \uadf8 \ud568\uc218 \ub0b4\ubd80\uc5d0 \uc815\uc758\ub41c \ubaa8\ub4e0 \uc77c\uc744 \ub9c8\uce58\uace0 \uacb0\uacfc\ub97c \ubc18\ud658\ud568\n", - " - \ubc1c\uc0dd\uc790 \ud568\uc218\ub294 \ud568\uc218 \ub0b4\uc5d0\uc11c \uc218\ud589 \uc911\uc5d0 \uc911\uac04 \uacb0\uacfc \uac12\uc744 \ubc18\ud658\ud560 \uc218 \uc788\uc74c\n", - "- \ubc1c\uc0dd\uc790\uac00 \uc720\uc6a9\ud558\uac8c \uc0ac\uc6a9\ub418\ub294 \uacbd\uc6b0\n", - " - \ud568\uc218 \ucc98\ub9ac\uc758 \uc911\uac04 \uacb0\uacfc\ub97c \ub2e4\ub978 \ucf54\ub4dc\uc5d0\uc11c \ucc38\uc870\ud560 \uacbd\uc6b0\n", - " - \ubaa8\ub4e0 \uacb0\uacfc\ub97c \ud55c\uaebc\ubc88\uc5d0 \ucc98\ub9ac\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \ud568\uc218 \ucc98\ub9ac \uc911\uc5d0 \ub098\uc628 \uc911\uac04 \uacb0\uacfc\ub97c \uc0ac\uc6a9\ud574\uc57c \ud560 \uacbd\uc6b0" + } + ], + "source": [ + "for key, value in d.iteritems(): #(키,값)에 대한 반복자\n", + " print key, value" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4 파일 객체의 반복자" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파일 객체는 그 자체가 반복자임\n", + " - next() 함수에 의해 각 라인이 순차적으로 읽혀짐" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f.next() 1: Hello World\n", + "\n", + "2: Hello World\n", + "3: Hello World\n", + "4: Hello World\n", + "5: Hello World\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-2 \ubc1c\uc0dd\uc790 \uad6c\ubb38\n", - "- \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec(List Comprehension)\n", - " - \ub9ac\uc2a4\ud2b8 \uac1d\uccb4\uc758 \uc0c8\ub85c\uc6b4 \uc0dd\uc131\n", - " - \uba54\ubaa8\ub9ac\ub97c \uc2e4\uc81c\ub85c \uc810\uc720\ud558\uba74\uc11c \uc0dd\uc131\ub428" + } + ], + "source": [ + "f = open('readme.txt')\n", + "print \"f.next()\", f.next()\n", + "for line in f: # f.next() 가 순차적으로 호출됨\n", + " print line, " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 발생자\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 발생자란?\n", + "- 발생자(Generator)\n", + " - (중단됨 시점부터) 재실행 가능한 함수\n", + " \n", + "- 아래 함수 f()는 자신의 인수 및 내부 변수로서 a, b, c, d를 지니고 있다.\n", + " - 이러한 a, b, c, d 변수들은 함수가 종료되고 반환될 때 모두 사라진다.\n", + "- 발생자는 f()와 같이 함수가 종료될 때 메모리에서 해제되는 것을 막고 다시 함수가 호출 될 때 이전에 수행이 종료되었던 지점 부터 계속 수행이 가능하도록 구현된 함수이다." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def f(a,b):\n", + " c = a * b\n", + " d = a + b\n", + " return c, d" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- yield 키워드\n", + " - return 대신에 yield에 의해 값을 반환하는 함수는 발생자이다.\n", + " - yield는 return과 유사하게 임의의 값을 반환하지만 함수의 실행 상태를 보존하면서 함수를 호출한 쪽으로 복귀시켜준다.\n", + "- 발생자는 곧 반복자이다.\n", + " - 즉, 발생자에게 next() 호출이 가능하다." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_ints(N):\n", + " for i in range(N):\n", + " yield i" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0\n", + "1\n", + "2\n" ] }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "print [k for k in range(100) if k % 5 == 0]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8 \ub0b4\ud3ec \uad6c\ubb38\uc5d0 []\uac00 \uc544\ub2c8\ub77c () \uc0ac\uc6a9\n", - " - \ub9ac\uc2a4\ud2b8 \ub300\uc2e0\uc5d0 \ubc1c\uc0dd\uc790 \uc0dd\uc131\n", - " - \ucc98\uc74c\ubd80\ud130 \ubaa8\ub4e0 \uc6d0\uc18c\uac00 \uc0dd\uc131\ub418\uc9c0 \uc54a\uace0 \ud544\uc694\ud55c \uc2dc\uc810\uc5d0 \uac01 \uc6d0\uc18c\uac00 \ub9cc\ub4e4\uc5b4\uc9d0\n", - " - \uba54\ubaa8\ub9ac\ub97c \ubcf4\ub2e4 \ud6a8\uc728\uc801\uc73c\ub85c \uc0ac\uc6a9\ud568" + "ename": "StopIteration", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 더 이상 반환할 값이 없다면 StopIteration 예외를 던짐\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m: " ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = (k for k in range(100) if k % 5 == 0)\n", - "print a\n", - "print a.next()\n", - "print a.next()\n", - "print a.next()\n", - "for i in a:\n", - " print i," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " at 0x10d84df50>\n", - "0\n", - "5\n", - "10\n", - "15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc544\ub798 \uc608\ub294 sum \ub0b4\uc7a5 \ud568\uc218\uc5d0 \ubc1c\uc0dd\uc790\ub97c \ub123\uc5b4\uc90c\n", - " - sum\uc744 \ud638\ucd9c\ud558\ub294 \uc2dc\uc810\uc5d0\ub294 \ubc1c\uc0dd\uc790\uac00 \uc544\uc9c1 \ud638\ucd9c\ub418\uae30 \uc9c1\uc804\uc774\ubbc0\ub85c \uac01 \uc6d0\uc18c\ub4e4\uc740 \uc544\uc9c1 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4.\n", - " - sum \ub0b4\ubd80\uc5d0\uc11c \ubc1c\uc0dd\uc790\uac00 \uc9c0\ub2c8\uace0 \uc788\ub294 next() \ud568\uc218\ub97c \ud638\ucd9c\ud558\uc5ec \uac01 \uc6d0\uc18c\ub4e4\uc744 \uc9c1\uc811 \ub9cc\ub4e4\uc5b4 \ud65c\uc6a9\ud55c\ub2e4.\n", - " - \uba54\ubaa8\uc2dc \uc0ac\uc6a9 \ud6a8\uc728\uc774 \ub192\ub2e4." + } + ], + "source": [ + "gen = generate_ints(3) # 발생자 객체를 얻는다. generate_ints() 함수에 대한 초기 스택 프레임이 만들어지나 실행은 중단되어 있는 상태임\n", + "print gen\n", + "print gen.next() # 발생자 객체는 반복자 인터페이스를 가진다. 발생자의 실행이 재개됨. yield에 의해 값 반환 후 다시 실행이 중단됨\n", + "print gen.next() # 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\n", + "print gen.next() # 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\n", + "print gen.next() # 발생자 실행 재개. yield에 의해 더 이상 반환할 값이 없다면 StopIteration 예외를 던짐" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위와 같은 세부 동작 방식을 이용하여, 다음과 같이 for ~ in 구문에 적용할 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print sum((k for k in range(100) if k % 5 == 0))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "950\n" - ] - } - ], - "prompt_number": 35 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-3 \ubc1c\uc0dd\uc790\uc758 \ud65c\uc6a9 \uc608 1 - \ud53c\ubcf4\ub098\uce58 \uc218\uc5f4" + } + ], + "source": [ + "for i in generate_ints(5):\n", + " print i," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 발생자 함수와 일반 함수의 차이점\n", + " - 일반 함수는 함수가 호출되면 그 함수 내부에 정의된 모든 일을 마치고 결과를 반환함\n", + " - 발생자 함수는 함수 내에서 수행 중에 중간 결과 값을 반환할 수 있음\n", + "- 발생자가 유용하게 사용되는 경우\n", + " - 함수 처리의 중간 결과를 다른 코드에서 참조할 경우\n", + " - 모든 결과를 한꺼번에 처리하는 것이 아니라 함수 처리 중에 나온 중간 결과를 사용해야 할 경우" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 발생자 구문\n", + "- 리스트 내포(List Comprehension)\n", + " - 리스트 객체의 새로운 생성\n", + " - 메모리를 실제로 점유하면서 생성됨" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def fibonacci(a = 1, b = 1):\n", - " while 1:\n", - " yield a \n", - " a, b = b, a + b\n", - " \n", - "for k in fibonacci(): # \ubc1c\uc0dd\uc790\ub97c \uc9c1\uc811 for ~ in \uad6c\ubb38\uc5d0 \ud65c\uc6a9\n", - " if k > 100: \n", - " break\n", - " print k," - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 1 2 3 5 8 13 21 34 55 89\n" - ] - } - ], - "prompt_number": 42 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-4 \ubc1c\uc0dd\uc790\uc758 \ud65c\uc6a9 \uc608 2 - \ud640\uc218 \uc9d1\ud569 \ub9cc\ub4e4\uae30" + } + ], + "source": [ + "print [k for k in range(100) if k % 5 == 0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트 내포 구문에 []가 아니라 () 사용\n", + " - 리스트 대신에 발생자 생성\n", + " - 처음부터 모든 원소가 생성되지 않고 필요한 시점에 각 원소가 만들어짐\n", + " - 메모리를 보다 효율적으로 사용함" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " at 0x10d84df50>\n", + "0\n", + "5\n", + "10\n", + "15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubc18\ubcf5\uc790\ub97c \ud65c\uc6a9\ud55c \uc608" + } + ], + "source": [ + "a = (k for k in range(100) if k % 5 == 0)\n", + "print a\n", + "print a.next()\n", + "print a.next()\n", + "print a.next()\n", + "for i in a:\n", + " print i," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래 예는 sum 내장 함수에 발생자를 넣어줌\n", + " - sum을 호출하는 시점에는 발생자가 아직 호출되기 직전이므로 각 원소들은 아직 존재하지 않는다.\n", + " - sum 내부에서 발생자가 지니고 있는 next() 함수를 호출하여 각 원소들을 직접 만들어 활용한다.\n", + " - 메모시 사용 효율이 높다." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "950\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Odds:\n", - " def __init__(self, limit = None): # \uc0dd\uc131\uc790 \uc815\uc758\n", - " self.data = -1 # \ucd08\uae30 \uac12\n", - " self.limit = limit # \ud55c\uacc4 \uac12\n", - " def __iter__(self): # Odds \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790\ub97c \ubc18\ud658\ud558\ub294 \ud2b9\uc218 \ud568\uc218\n", - " return self\n", - " def next(self): # \ubc18\ubcf5\uc790\uc758 \ud544\uc218 \ud568\uc218\n", - " self.data += 2\n", - " if self.limit and self.limit <= self.data:\n", - " raise StopIteration\n", - " return self.data\n", - "\n", - "for k in Odds(20):\n", - " print k,\n", - "print\n", - "print list(Odds(20)) # list() \ub0b4\uc7a5 \ud568\uc218\uac00 \uac1d\uccb4\ub97c \uc778\uc218\ub85c \ubc1b\uc73c\uba74 \ud574\ub2f9 \uac1d\uccb4\uc758 \ubc18\ubcf5\uc790\ub97c \uc5bb\uc5b4\uc640 next()\ub97c \ub9e4\ubc88 \ud638\ucd9c\ud558\uc5ec \uac01 \uc6d0\uc18c\ub97c \uc5bb\uc5b4\uc628\ub2e4. " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 3 5 7 9 11 13 15 17 19\n", - "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n" - ] - } - ], - "prompt_number": 43 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubc1c\uc0dd\uc790\ub97c \ud65c\uc6a9\ud55c \uc608" + } + ], + "source": [ + "print sum((k for k in range(100) if k % 5 == 0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-3 발생자의 활용 예 1 - 피보나치 수열" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 1 2 3 5 8 13 21 34 55 89\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def odds(limit=None):\n", - " k = 1\n", - " while not limit or limit >= k:\n", - " yield k\n", - " k += 2\n", - " \n", - "for k in odds(20):\n", - " print k,\n", - "print\n", - "print list(odds(20)) # list() \ub0b4\uc7a5 \ud568\uc218\uac00 \ubc1c\uc0dd\uc790\ub97c \uc778\uc218\ub85c \ubc1b\uc73c\uba74 \ud574\ub2f9 \ubc1c\uc0dd\uc790\uc758 next()\ub97c \ub9e4\ubc88 \ud638\ucd9c\ud558\uc5ec \uac01 \uc6d0\uc18c\ub97c \uc5bb\uc5b4\uc628\ub2e4. " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1 3 5 7 9 11 13 15 17 19\n", - "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n" - ] - } - ], - "prompt_number": 71 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "def fibonacci(a = 1, b = 1):\n", + " while 1:\n", + " yield a \n", + " a, b = b, a + b\n", + " \n", + "for k in fibonacci(): # 발생자를 직접 for ~ in 구문에 활용\n", + " if k > 100: \n", + " break\n", + " print k," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-4 발생자의 활용 예 2 - 홀수 집합 만들기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 반복자를 활용한 예" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 3 5 7 9 11 13 15 17 19\n", + "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n" ] } ], - "metadata": {} + "source": [ + "class Odds:\n", + " def __init__(self, limit = None): # 생성자 정의\n", + " self.data = -1 # 초기 값\n", + " self.limit = limit # 한계 값\n", + " def __iter__(self): # Odds 객체의 반복자를 반환하는 특수 함수\n", + " return self\n", + " def next(self): # 반복자의 필수 함수\n", + " self.data += 2\n", + " if self.limit and self.limit <= self.data:\n", + " raise StopIteration\n", + " return self.data\n", + "\n", + "for k in Odds(20):\n", + " print k,\n", + "print\n", + "print list(Odds(20)) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 발생자를 활용한 예" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 3 5 7 9 11 13 15 17 19\n", + "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n" + ] + } + ], + "source": [ + "def odds(limit=None):\n", + " k = 1\n", + " while not limit or limit >= k:\n", + " yield k\n", + " k += 2\n", + " \n", + "for k in odds(20):\n", + " print k,\n", + "print\n", + "print list(odds(20)) # list() 내장 함수가 발생자를 인수로 받으면 해당 발생자의 next()를 매번 호출하여 각 원소를 얻어온다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" } - ] -} \ No newline at end of file + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/python23.ipynb b/python3.6/python23.ipynb index 6d13d1b..8f5d973 100644 --- a/python3.6/python23.ipynb +++ b/python3.6/python23.ipynb @@ -1,957 +1,919 @@ { - "metadata": { - "name": "", - "signature": "sha256:1129ada8bea533775e5222c2157b572fbfef33239fe0b2b06d5d1b1085944d84" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 23. \uc608\uc678\ucc98\ub9ac\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud30c\uc774\uc36c \uc608\uc678\uc758 \uc885\ub958\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uad6c\ubb38 \uc5d0\ub7ec (Syntax Error)\n", - " - \ubb38\ubc95\uc801 \uc5d0\ub7ec\n", - " - \uc774\ud074\ub9bd\uc2a4 \ub4f1\uc758 \ud1b5\ud569\uac1c\ubc1c\ud658\uacbd \ub3c4\uad6c\uc5d0\uc11c\ub294 \uc790\ub3d9\uc73c\ub85c \uc2e4\ud589 \uc804\uc5d0 \uad6c\ubb38 \uc5d0\ub7ec\ub97c \uccb4\ud06c \ud574 \uc90c\n", - " - \ud30c\uc774\uc36c\uc740 \uc0c1\ub300\uc801\uc73c\ub85c \uc5b8\uc5b4\uc801 \ubb38\ubc95\uc774 \uac04\ub2e8\ud558\uae30 \ub54c\ubb38\uc5d0 \uad6c\ubb38 \uc790\uccb4\uc758 \uc5d0\ub7ec \ubc1c\uc0dd \ube44\uc728\uc774 \ub0ae\uac70\ub098 \ub2e4\ub978 \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc644\ubcbd\ud558\uac8c \uc81c\uac70\ud560 \uc218 \uc788\uc74c\n", - "\n", - "- \uc608\uc678 (Exception)\n", - " - \uad6c\ubb38 \uc5d0\ub7ec\ub294 \uc5c6\uc73c\ub098 \ud504\ub85c\uadf8\ub7a8 \uc2e4\ud589 \uc911 \ub354 \uc774\uc0c1 \uc9c4\ud589 \ud560 \uc218 \uc5c6\ub294 \uc0c1\ud669" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c \ubcf4\uae30\n", - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 1: \uc815\uc758\ub418\uc9c0 \uc54a\uc740 \ubcc0\uc218 \uc0ac\uc6a9\ud558\uae30\n", - " - NameError" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 23. 예외처리\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 파이썬 예외의 종류\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 구문 에러 (Syntax Error)\n", + " - 문법적 에러\n", + " - 이클립스 등의 통합개발환경 도구에서는 자동으로 실행 전에 구문 에러를 체크 해 줌\n", + " - 파이썬은 상대적으로 언어적 문법이 간단하기 때문에 구문 자체의 에러 발생 비율이 낮거나 다른 도구를 사용하여 완벽하게 제거할 수 있음\n", + "\n", + "- 예외 (Exception)\n", + " - 구문 에러는 없으나 프로그램 실행 중 더 이상 진행 할 수 없는 상황" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 예외 발생 예제 보기\n", + "- 예외 발생 예제 1: 정의되지 않은 변수 사용하기\n", + " - NameError" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'spam' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m4\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mspam\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'spam' is not defined" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "4 + spam*3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'spam' is not defined", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m4\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mspam\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'spam' is not defined" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 2: 0\uc73c\ub85c \uc22b\uc790 \ub098\ub204\uae30\n", - " - ZeroDivisionError" + } + ], + "source": [ + "4 + spam*3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 발생 예제 2: 0으로 숫자 나누기\n", + " - ZeroDivisionError" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "integer division or modulo by zero", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m: integer division or modulo by zero" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10\n", - "b = 0 \n", - "c = a / b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "ZeroDivisionError", - "evalue": "integer division or modulo by zero", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mZeroDivisionError\u001b[0m: integer division or modulo by zero" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- [note] \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uba74 \ud504\ub85c\uadf8\ub7a8\uc740 \ubc14\ub85c \uc885\ub8cc\ub41c\ub2e4." + } + ], + "source": [ + "a = 10\n", + "b = 0 \n", + "c = a / b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [note] 예외가 발생하면 프로그램은 바로 종료된다." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "float division by zero", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mdivision\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def division():\n", - " for n in range(0, 5):\n", - " print 10.0 / n\n", - "\n", - "division() " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "ZeroDivisionError", - "evalue": "float division by zero", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mdivision\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" - ] - } - ], - "prompt_number": 48 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 3: \ubb38\uc790\uc5f4\uacfc \uc22b\uc790 \ub354\ud558\uae30\n", - " - TypeError" + } + ], + "source": [ + "def division():\n", + " for n in range(0, 5):\n", + " print 10.0 / n\n", + "\n", + "division() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 발생 예제 3: 문자열과 숫자 더하기\n", + " - TypeError" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "cannot concatenate 'str' and 'int' objects", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m'2'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: cannot concatenate 'str' and 'int' objects" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "'2' + 2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "cannot concatenate 'str' and 'int' objects", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m'2'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: cannot concatenate 'str' and 'int' objects" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 4: \ucc38\uc870 \ubc94\uc704\ub97c \ub118\uc5b4\uc11c \uc778\ub371\uc2a4 \uc0ac\uc6a9\n", - " - IndexError" + } + ], + "source": [ + "'2' + 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 발생 예제 4: 참조 범위를 넘어서 인덱스 사용\n", + " - IndexError" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "list index out of range", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l = [1, 2]\n", - "print l[2]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "IndexError", - "evalue": "list index out of range", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mIndexError\u001b[0m: list index out of range" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 5: \ub4f1\ub85d\ub418\uc9c0 \uc54a\uc740 \ud0a4\ub85c \uc0ac\uc804 \uac80\uc0c9\n", - " - KeyError" + } + ], + "source": [ + "l = [1, 2]\n", + "print l[2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 발생 예제 5: 등록되지 않은 키로 사전 검색\n", + " - KeyError" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'c'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"a\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 'c'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {\"a\": 1, \"b\": 2}\n", - "print d['c']" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'c'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"a\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m: 'c'" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ubc1c\uc0dd \uc608\uc81c 6: \uc788\uc9c0\ub3c4 \uc54a\uc740 \ud30c\uc77c\uc744 \uc5f4\ub824\uace0 \ud560 \ub54c\n", - " - IOError" + } + ], + "source": [ + "d = {\"a\": 1, \"b\": 2}\n", + "print d['c']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 발생 예제 6: 있지도 않은 파일을 열려고 할 때\n", + " - IOError" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "ename": "IOError", + "evalue": "[Errno 2] No such file or directory: 'aaa.txt'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIOError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'aaa.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIOError\u001b[0m: [Errno 2] No such file or directory: 'aaa.txt'" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = open('aaa.txt')" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "IOError", - "evalue": "[Errno 2] No such file or directory: 'aaa.txt'", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIOError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'aaa.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mIOError\u001b[0m: [Errno 2] No such file or directory: 'aaa.txt'" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \ub0b4\uc7a5 \uc608\uc678\uc758 \uc885\ub958\n", - "- \uc608\uc678 \ud074\ub798\uc2a4\uc758 \uacc4\uce35 \uad6c\uc870 ([\ucc38\uace0] https://docs.python.org/2/library/exceptions.html)\n", - "
BaseException\n",
-      " +-- SystemExit\n",
-      " +-- KeyboardInterrupt\n",
-      " +-- GeneratorExit\n",
-      " +-- Exception\n",
-      "      +-- StopIteration\n",
-      "      +-- StandardError\n",
-      "      |    +-- BufferError\n",
-      "      |    +-- ArithmeticError\n",
-      "      |    |    +-- FloatingPointError\n",
-      "      |    |    +-- OverflowError\n",
-      "      |    |    +-- ZeroDivisionError\n",
-      "      |    +-- AssertionError\n",
-      "      |    +-- AttributeError\n",
-      "      |    +-- EnvironmentError\n",
-      "      |    |    +-- IOError\n",
-      "      |    |    +-- OSError\n",
-      "      |    |         +-- WindowsError (Windows)\n",
-      "      |    |         +-- VMSError (VMS)\n",
-      "      |    +-- EOFError\n",
-      "      |    +-- ImportError\n",
-      "      |    +-- LookupError\n",
-      "      |    |    +-- IndexError\n",
-      "      |    |    +-- KeyError\n",
-      "      |    +-- MemoryError\n",
-      "      |    +-- NameError\n",
-      "      |    |    +-- UnboundLocalError\n",
-      "      |    +-- ReferenceError\n",
-      "      |    +-- RuntimeError\n",
-      "      |    |    +-- NotImplementedError\n",
-      "      |    +-- SyntaxError\n",
-      "      |    |    +-- IndentationError\n",
-      "      |    |         +-- TabError\n",
-      "      |    +-- SystemError\n",
-      "      |    +-- TypeError\n",
-      "      |    +-- ValueError\n",
-      "      |         +-- UnicodeError\n",
-      "      |              +-- UnicodeDecodeError\n",
-      "      |              +-- UnicodeEncodeError\n",
-      "      |              +-- UnicodeTranslateError\n",
-      "      +-- Warning\n",
-      "           +-- DeprecationWarning\n",
-      "           +-- PendingDeprecationWarning\n",
-      "           +-- RuntimeWarning\n",
-      "           +-- SyntaxWarning\n",
-      "           +-- UserWarning\n",
-      "           +-- FutureWarning\n",
-      "\t   +-- ImportWarning\n",
-      "\t   +-- UnicodeWarning\n",
-      "\t   +-- BytesWarning\n",
-      "
" + } + ], + "source": [ + "a = open('aaa.txt')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 내장 예외의 종류\n", + "- 예외 클래스의 계층 구조 ([참고] https://docs.python.org/2/library/exceptions.html)\n", + "
BaseException\n",
+    " +-- SystemExit\n",
+    " +-- KeyboardInterrupt\n",
+    " +-- GeneratorExit\n",
+    " +-- Exception\n",
+    "      +-- StopIteration\n",
+    "      +-- StandardError\n",
+    "      |    +-- BufferError\n",
+    "      |    +-- ArithmeticError\n",
+    "      |    |    +-- FloatingPointError\n",
+    "      |    |    +-- OverflowError\n",
+    "      |    |    +-- ZeroDivisionError\n",
+    "      |    +-- AssertionError\n",
+    "      |    +-- AttributeError\n",
+    "      |    +-- EnvironmentError\n",
+    "      |    |    +-- IOError\n",
+    "      |    |    +-- OSError\n",
+    "      |    |         +-- WindowsError (Windows)\n",
+    "      |    |         +-- VMSError (VMS)\n",
+    "      |    +-- EOFError\n",
+    "      |    +-- ImportError\n",
+    "      |    +-- LookupError\n",
+    "      |    |    +-- IndexError\n",
+    "      |    |    +-- KeyError\n",
+    "      |    +-- MemoryError\n",
+    "      |    +-- NameError\n",
+    "      |    |    +-- UnboundLocalError\n",
+    "      |    +-- ReferenceError\n",
+    "      |    +-- RuntimeError\n",
+    "      |    |    +-- NotImplementedError\n",
+    "      |    +-- SyntaxError\n",
+    "      |    |    +-- IndentationError\n",
+    "      |    |         +-- TabError\n",
+    "      |    +-- SystemError\n",
+    "      |    +-- TypeError\n",
+    "      |    +-- ValueError\n",
+    "      |         +-- UnicodeError\n",
+    "      |              +-- UnicodeDecodeError\n",
+    "      |              +-- UnicodeEncodeError\n",
+    "      |              +-- UnicodeTranslateError\n",
+    "      +-- Warning\n",
+    "           +-- DeprecationWarning\n",
+    "           +-- PendingDeprecationWarning\n",
+    "           +-- RuntimeWarning\n",
+    "           +-- SyntaxWarning\n",
+    "           +-- UserWarning\n",
+    "           +-- FutureWarning\n",
+    "\t   +-- ImportWarning\n",
+    "\t   +-- UnicodeWarning\n",
+    "\t   +-- BytesWarning\n",
+    "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 예외 처리 방법\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 try/except/else/finally 절 사용하기\n", + "- 예외가 발생할 수 있는 상황을 예상하여 예외 발생 상황을 전체 코드 흐름을 함께 제어할 수 있다.\n", + "- try/except/else/finally 절\n", + " - 구문\n", + "> try:
\n", + ">     (예외 발생 가능한) 일반적인 수행문들
\n", + "> except Exception:
\n", + ">     예외가 발생하였을 때 수행되는 문들
\n", + "> else:
\n", + ">     예외가 발생하지 않았을 때 수행되는 문들
\n", + "> finally:
\n", + ">     예외 발생 유무와 관계없이 무조건 수행되는 문들
" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "zero division error!!!\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \uc608\uc678 \ucc98\ub9ac \ubc29\ubc95\n", - "***" + } + ], + "source": [ + "try:\n", + " print 1.0 / 0.0\n", + "except ZeroDivisionError:\n", + " print 'zero division error!!!'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외 처리를 하면 예외 발생시 프로그램 종료가 되지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "float division by zero\n", + "10.0\n", + "5.0\n", + "3.33333333333\n", + "2.5\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 try/except/else/finally \uc808 \uc0ac\uc6a9\ud558\uae30\n", - "- \uc608\uc678\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \uc0c1\ud669\uc744 \uc608\uc0c1\ud558\uc5ec \uc608\uc678 \ubc1c\uc0dd \uc0c1\ud669\uc744 \uc804\uccb4 \ucf54\ub4dc \ud750\ub984\uc744 \ud568\uaed8 \uc81c\uc5b4\ud560 \uc218 \uc788\ub2e4.\n", - "- try/except/else/finally \uc808\n", - " - \uad6c\ubb38\n", - "> try:
\n", - ">     (\uc608\uc678 \ubc1c\uc0dd \uac00\ub2a5\ud55c) \uc77c\ubc18\uc801\uc778 \uc218\ud589\ubb38\ub4e4
\n", - "> except Exception:
\n", - ">     \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc600\uc744 \ub54c \uc218\ud589\ub418\ub294 \ubb38\ub4e4
\n", - "> else:
\n", - ">     \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc558\uc744 \ub54c \uc218\ud589\ub418\ub294 \ubb38\ub4e4
\n", - "> finally:
\n", - ">     \uc608\uc678 \ubc1c\uc0dd \uc720\ubb34\uc640 \uad00\uacc4\uc5c6\uc774 \ubb34\uc870\uac74 \uc218\ud589\ub418\ub294 \ubb38\ub4e4
" + } + ], + "source": [ + "def division():\n", + " for n in range(0, 5):\n", + " try:\n", + " print 10.0 / n\n", + " except ZeroDivisionError, msg:\n", + " print msg\n", + "\n", + "division()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- else: 구문은 except: 구문없이 사용 못한다. " + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 5)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m else:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "try:\n", - " print 1.0 / 0.0\n", - "except ZeroDivisionError:\n", - " print 'zero division error!!!'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "zero division error!!!\n" - ] - } - ], - "prompt_number": 14 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678 \ucc98\ub9ac\ub97c \ud558\uba74 \uc608\uc678 \ubc1c\uc0dd\uc2dc \ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4." + } + ], + "source": [ + "def division():\n", + " for n in range(0, 5):\n", + " try:\n", + " print 10.0 / n\n", + " else:\n", + " print \"Success\"\n", + "\n", + "division() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 상황에 따라서는 에러와 함께 따라오는 정보를 함께 받을 수도 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error - name 'spam' is not defined\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def division():\n", - " for n in range(0, 5):\n", - " try:\n", - " print 10.0 / n\n", - " except ZeroDivisionError, msg:\n", - " print msg\n", - "\n", - "division()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "float division by zero\n", - "10.0\n", - "5.0\n", - "3.33333333333\n", - "2.5\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- else: \uad6c\ubb38\uc740 except: \uad6c\ubb38\uc5c6\uc774 \uc0ac\uc6a9 \ubabb\ud55c\ub2e4. " + } + ], + "source": [ + "try:\n", + " spam()\n", + "except NameError, msg:\n", + " print 'Error -', msg" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error - name 'spam' is not defined\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def division():\n", - " for n in range(0, 5):\n", - " try:\n", - " print 10.0 / n\n", - " else:\n", - " print \"Success\"\n", - "\n", - "division() " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 5)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m else:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" - ] - } - ], - "prompt_number": 49 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0c1\ud669\uc5d0 \ub530\ub77c\uc11c\ub294 \uc5d0\ub7ec\uc640 \ud568\uaed8 \ub530\ub77c\uc624\ub294 \uc815\ubcf4\ub97c \ud568\uaed8 \ubc1b\uc744 \uc218\ub3c4 \uc788\ub2e4." + } + ], + "source": [ + "try:\n", + " spam()\n", + "except NameError as msg:\n", + " print 'Error -', msg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- try 절 안에서 간접적으로 호출한 함수의 내부 예외도 처리할 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "zero division error!!! - integer division or modulo by zero\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "try:\n", - " spam()\n", - "except NameError, msg:\n", - " print 'Error -', msg" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Error - name 'spam' is not defined\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "try:\n", - " spam()\n", - "except NameError as msg:\n", - " print 'Error -', msg" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Error - name 'spam' is not defined\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- try \uc808 \uc548\uc5d0\uc11c \uac04\uc811\uc801\uc73c\ub85c \ud638\ucd9c\ud55c \ud568\uc218\uc758 \ub0b4\ubd80 \uc608\uc678\ub3c4 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4." + } + ], + "source": [ + "def zero_division():\n", + " x = 1 / 0\n", + "\n", + "try:\n", + " zero_division()\n", + "except ZeroDivisionError, msg:\n", + " print 'zero division error!!! -', msg" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "zero division error!!! - integer division or modulo by zero\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def zero_division():\n", - " x = 1 / 0\n", - "\n", - "try:\n", - " zero_division()\n", - "except ZeroDivisionError, msg:\n", - " print 'zero division error!!! -', msg" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "zero division error!!! - integer division or modulo by zero\n" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def zero_division():\n", - " x = 1 / 0\n", - "\n", - "try:\n", - " zero_division()\n", - "except ZeroDivisionError as msg:\n", - " print 'zero division error!!! -', msg" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "zero division error!!! - integer division or modulo by zero\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- except \ub4a4\uc5d0 \uc544\ubb34\ub7f0 \uc608\uc678\ub3c4 \uae30\uc220\ud558\uc9c0 \uc54a\uc73c\uba74 \ubaa8\ub4e0 \uc608\uc678\uc5d0 \ub300\ud574 \ucc98\ub9ac\ub41c\ub2e4." + } + ], + "source": [ + "def zero_division():\n", + " x = 1 / 0\n", + "\n", + "try:\n", + " zero_division()\n", + "except ZeroDivisionError as msg:\n", + " print 'zero division error!!! -', msg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- except 뒤에 아무런 예외도 기술하지 않으면 모든 예외에 대해 처리된다." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "try:\n", - " spam()\n", - " print 1.0 / 0.0\n", - "except:\n", - " print 'Error'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Error\n" - ] - } - ], - "prompt_number": 31 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc5ec\ub7ec \uc608\uc678\ub4e4 \uac01\uac01\uc5d0 \ub300\ud574 except \uc808\uc744 \ub2e4\uc911\uc73c\ub85c \uc0bd\uc785\ud560 \uc218 \uc788\ub2e4." + } + ], + "source": [ + "try:\n", + " spam()\n", + " print 1.0 / 0.0\n", + "except:\n", + " print 'Error'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 여러 예외들 각각에 대해 except 절을 다중으로 삽입할 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ZeroDivisionError !!!\n", + "Exit !!!\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "b = 0.0\n", - "name = 'aaa.txt'\n", - "try:\n", - " print 1.0 / b\n", - " spam()\n", - " f = open(name, 'r')\n", - " '2' + 2\n", - "except NameError:\n", - " print 'NameError !!!'\n", - "except ZeroDivisionError:\n", - " print 'ZeroDivisionError !!!'\n", - "except (TypeError, IOError):\n", - " print 'TypeError or IOError !!!'\n", - "else:\n", - " print 'No Exception !!!'\n", - "finally:\n", - " print 'Exit !!!'" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ZeroDivisionError !!!\n", - "Exit !!!\n" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ud30c\uc77c\uc5d0\uc11c \uc22b\uc790\ub97c \uc77d\uc5b4\uc640\uc11c \uc77d\uc740 \uc22b\uc790\ub85c \ub098\ub204\uae30\ub97c \ud558\ub294 \uc608\uc81c\n", - " - \uaf3c\uaf3c\ud55c \uc608\uc678 \ucc98\ub9ac \uc608\uc81c" + } + ], + "source": [ + "b = 0.0\n", + "name = 'aaa.txt'\n", + "try:\n", + " print 1.0 / b\n", + " spam()\n", + " f = open(name, 'r')\n", + " '2' + 2\n", + "except NameError:\n", + " print 'NameError !!!'\n", + "except ZeroDivisionError:\n", + " print 'ZeroDivisionError !!!'\n", + "except (TypeError, IOError):\n", + " print 'TypeError or IOError !!!'\n", + "else:\n", + " print 'No Exception !!!'\n", + "finally:\n", + " print 'Exit !!!'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파일에서 숫자를 읽어와서 읽은 숫자로 나누기를 하는 예제\n", + " - 꼼꼼한 예외 처리 예제" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning\n", + "1.0\n", + "Finally!!!\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "print os.getcwd()\n", - "filename = 't.txt'\n", - "\n", - "try:\n", - " f = open(filename, 'r')\n", - "except IOError, msg:\n", - " print msg\n", - "else:\n", - " a = float(f.readline())\n", - " try:\n", - " answer = 1.0 / a\n", - " except ZeroDivisionError, msg:\n", - " print msg\n", - " else:\n", - " print answer\n", - " finally:\n", - " print \"Finally!!!\"\n", - " f.close()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/yhhan/git/python-e-learning\n", - "1.0\n", - "Finally!!!\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \uac19\uc740 \ubd80\ub958\uc758 \uc608\uc678 \ub2e4 \uc7a1\uc544\ub0b4\uae30\n", - "- \uc608\uc678 \ud074\ub798\uc2a4\ub4e4\uc740 \uc0c1\uc18d\uc5d0 \uc758\ud55c \uacc4\uce35 \uad00\uacc4\ub97c \uc9c0\ub2c8\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc774\ub97c \uc774\uc6a9\ud558\uba74 \uc5ec\ub7ec \uc608\uc678\ub4e4\uc744 \ud55c\uaebc\ubc88\uc5d0 \uc7a1\uc744 \uc218 \uc788\ub2e4.\n", - "- \uc608\ub97c \ub4e4\uc5b4, ArithmeticError\uc758 \ud558\uc704 \ud074\ub798\uc2a4\ub85c\uc11c FloatingPointError, OverflowError, ZeroDivisionError\uac00 \uc874\uc7ac\ud558\uae30 \ub54c\ubb38\uc5d0 \uc774\ub4e4 \ud558\uc704 \ud074\ub798\uc2a4 \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc600\uc744 \uacbd\uc6b0 ArithmeticError\ub85c\uc11c \uc7a1\uc544\ub0bc \uc218 \uc788\ub2e4. " + } + ], + "source": [ + "import os\n", + "print os.getcwd()\n", + "filename = 't.txt'\n", + "\n", + "try:\n", + " f = open(filename, 'r')\n", + "except IOError, msg:\n", + " print msg\n", + "else:\n", + " a = float(f.readline())\n", + " try:\n", + " answer = 1.0 / a\n", + " except ZeroDivisionError, msg:\n", + " print msg\n", + " else:\n", + " print answer\n", + " finally:\n", + " print \"Finally!!!\"\n", + " f.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 같은 부류의 예외 다 잡아내기\n", + "- 예외 클래스들은 상속에 의한 계층 관계를 지니고 있기 때문에 이를 이용하면 여러 예외들을 한꺼번에 잡을 수 있다.\n", + "- 예를 들어, ArithmeticError의 하위 클래스로서 FloatingPointError, OverflowError, ZeroDivisionError가 존재하기 때문에 이들 하위 클래스 예외가 발생하였을 경우 ArithmeticError로서 잡아낼 수 있다. " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ArithmeticException occured\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def dosomething():\n", - " a = 1/0\n", - "\n", - "try:\n", - " dosomething()\n", - "except ArithmeticError:\n", - " print \"ArithmeticException occured\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ArithmeticException occured\n" - ] - } - ], - "prompt_number": 16 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678\uac00 \uc784\uc758\uc758 except\uc5d0 \uc758\ud574 \uc7a1\ud788\uba74 \ub2e4\ub978 except\uc5d0 \uc758\ud574\uc11c\ub294 \uc7a1\ud788\uc9c0 \uc54a\ub294\ub2e4. " + } + ], + "source": [ + "def dosomething():\n", + " a = 1/0\n", + "\n", + "try:\n", + " dosomething()\n", + "except ArithmeticError:\n", + " print \"ArithmeticException occured\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외가 임의의 except에 의해 잡히면 다른 except에 의해서는 잡히지 않는다. " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ZeroDivisionError occured\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def dosomething():\n", - " a = 1/0\n", - "\n", - "try:\n", - " dosomething()\n", - "except ZeroDivisionError: # ZeroDivisionError\ub294 \uc774\uacf3\uc5d0\uc11c \uc7a1\ud78c\ub2e4.\n", - " print \"ZeroDivisionError occured\"\n", - "except ArithmeticError: # FloatingPointError, OverflowError\ub294 \uc774\uacf3\uc5d0\uc11c \uc7a1\ud78c\ub2e4.\n", - " print \"ArithmeticException occured\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ZeroDivisionError occured\n" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def dosomething():\n", - " a = 1/0\n", - "\n", - "try:\n", - " dosomething()\n", - "except ArithmeticError:\n", - " print \"ArithmeticException occured\"\n", - "except ZeroDivisionError: # \uc774\uacf3\uc5d0\uc11c ZeroDivisionError\ub294 \uc7a1\ud788\uc9c0 \uc54a\ub294\ub2e4. ==> \uc798\ubabb\ub41c \ucf54\ub4dc\n", - " print \"ZeroDivisionError occured\" " - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "ArithmeticException occured\n" - ] - } - ], - "prompt_number": 20 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \uc608\uc678 \ubc1c\uc0dd\n", - "***\n", - "### 3-1 raise\ub85c \uc608\uc678 \ubc1c\uc0dd\ud558\uae30" + } + ], + "source": [ + "def dosomething():\n", + " a = 1/0\n", + "\n", + "try:\n", + " dosomething()\n", + "except ZeroDivisionError: # ZeroDivisionError는 이곳에서 잡힌다.\n", + " print \"ZeroDivisionError occured\"\n", + "except ArithmeticError: # FloatingPointError, OverflowError는 이곳에서 잡힌다.\n", + " print \"ArithmeticException occured\"" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ArithmeticException occured\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc608\uc678\ub97c \ud2b9\uc815 \uc0c1\ud669 \uc870\uac74\uc5d0\uc11c raise \ud0a4\uc6cc\ub4dc\ub97c \ud1b5\ud574 \ubc1c\uc0dd\uc2dc\ud0ac \uc218 \uc788\ub2e4.\n", - "- \uc544\ub798 \uc608\ub294 \uc2dc\ud000\uc2a4 \ud615 \ud074\ub798\uc2a4\ub97c \uc124\uacc4\ud560 \ub54c \uc778\ub371\uc2f1\uc744 \uad6c\ud604\ud558\ub294 \\_\\_getitem\\_\\_ \uba54\uc18c\ub4dc\uc5d0\uc11c \uc778\ub371\uc2a4\uac00 \ubc94\uc704\ub97c \ub118\uc744 \ub54c IndexError\ub97c \ubc1c\uc0dd\uc2dc\ud0a8\ub2e4." + } + ], + "source": [ + "def dosomething():\n", + " a = 1/0\n", + "\n", + "try:\n", + " dosomething()\n", + "except ArithmeticError:\n", + " print \"ArithmeticException occured\"\n", + "except ZeroDivisionError: # 이곳에서 ZeroDivisionError는 잡히지 않는다. ==> 잘못된 코드\n", + " print \"ZeroDivisionError occured\" " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 예외 발생\n", + "***\n", + "### 3-1 raise로 예외 발생하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 예외를 특정 상황 조건에서 raise 키워드를 통해 발생시킬 수 있다.\n", + "- 아래 예는 시퀀스 형 클래스를 설계할 때 인덱싱을 구현하는 \\_\\_getitem\\_\\_ 메소드에서 인덱스가 범위를 넘을 때 IndexError를 발생시킨다." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4 16\n", + "0 1 4 9 16 25 36 49 64 81" ] }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "class SquareSeq:\n", - " def __init__(self, n):\n", - " self.n = n\n", - " def __getitem__(self, k):\n", - " if k >= self.n or k < 0 :\n", - " raise IndexError # \ucca8\uc790 \ubc94\uc704\ub97c \ubc97\uc5b4\ub098\uba74 IndexError \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0b4\n", - " return k * k\n", - " def __len__(self):\n", - " return self.n\n", - " \n", - "s = SquareSeq(10)\n", - "print s[2], s[4]\n", - "for x in s: # IndexError\uac00 \ubc1c\uc0dd\ud558\ub294 \uc2dc\uc810\uae4c\uc9c0 \ubc18\ubcf5\ud55c\ub2e4\n", - " print x,\n", - "print s[20] # \ucca8\uc790 \ubc94\uc704\uac00 \ub118\uc5c8\ub2e4" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "4 16\n", - "0 1 4 9 16 25 36 49 64 81" - ] - }, - { - "ename": "IndexError", - "evalue": "", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# IndexError\uac00 \ubc1c\uc0dd\ud558\ub294 \uc2dc\uc810\uae4c\uc9c0 \ubc18\ubcf5\ud55c\ub2e4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# \ucca8\uc790 \ubc94\uc704\uac00 \ub118\uc5c8\ub2e4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m \u001b[0;31m# \ucca8\uc790 \ubc94\uc704\ub97c \ubc97\uc5b4\ub098\uba74 IndexError \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0b4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mIndexError\u001b[0m: " - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-2 \uc0ac\uc6a9\uc790 \ud074\ub798\uc2a4 \uc608\uc678 \uc815\uc758 \ubc0f \ubc1c\uc0dd\uc2dc\ud0a4\uae30\n", - "- \uc0ac\uc6a9\uc790 \uc815\uc758 \uc608\uc678 \ud074\ub798\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \uc77c\ubc18\uc801\uc778 \ubc29\ubc95\uc740 Exception \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d \ubc1b\uc544 \uad6c\ud604\ud55c\ub2e4.\n", - " - Exception \ud074\ub798\uc2a4\uc758 \uc11c\ube0c \ud074\ub798\uc2a4 \uc911 \ud558\ub098\ub97c \uc0c1\uc18d \ubc1b\uc544\ub3c4 \ub41c\ub2e4.\n", - "- \uc0ac\uc6a9\uc790 \uc815\uc758 \uc608\uc678 \ubc1c\uc0dd \ubc29\ubc95\n", - " - \ub0b4\uc7a5 \uc608\uc678 \ubc1c\uc0dd \ubc29\ubc95\uacfc \ub3d9\uc77c\ud558\uac8c raise [\ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4] \uc640 \uac19\uc774 \ud574\ub2f9 \uc608\uc678 \ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4\ub97c \ub358\uc9c4\ub2e4.\n", - "- \uc0ac\uc6a9\uc790 \uc815\uc758 \uc608\uc678\ub97c \uc7a1\ub294 \ubc29\ubc95\n", - " - except [\ud074\ub798\uc2a4 \uc774\ub984] \uacfc \uac19\uc774 \ud574\ub2f9 \uc608\uc678 \ud074\ub798\uc2a4 \uc774\ub984\uc744 \uc0ac\uc6a9\ud55c\ub2e4.\n", - "- \uc544\ub798 \uc608\uc5d0\uc11c except Big\uc774 \uc7a1\ub294 \uc608\uc678\ub294 Big\uacfc Small \uc774\ub2e4.\n", - " - \uc774\uc720: Small\uc740 Big\uc758 \ud558\uc704 \ud074\ub798\uc2a4\uc774\uae30 \ub54c\ubb38" + "ename": "IndexError", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# IndexError가 발생하는 시점까지 반복한다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# 첨자 범위가 넘었다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m \u001b[0;31m# 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mIndexError\u001b[0m: " ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Big(Exception):\n", - " pass\n", - "\n", - "class Small(Big):\n", - " pass\n", - "\n", - "def dosomething1():\n", - " x = Big()\n", - " raise x\n", - " \n", - "def dosomething2():\n", - " raise Small()\n", - " \n", - "for f in (dosomething1, dosomething2):\n", - " try:\n", - " f()\n", - " except Big:\n", - " print \"Exception occurs!\"" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Exception occurs!\n", - "Exception occurs!\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-3 \uc608\uc678\uac12 \uc804\ub2ec\ud558\uae30 \n", - "- raise \ud0a4\uc6cc\ub4dc \ub4a4\uc5d0 \uc608\uc678\uc640 \ud568\uaed8, \ucd94\uac00 \uba54\uc2dc\uc9c0\ub97c \ud568\uaed8 \ub358\uc9c8 \uc218 \uc788\ub2e4." + } + ], + "source": [ + "class SquareSeq:\n", + " def __init__(self, n):\n", + " self.n = n\n", + " def __getitem__(self, k):\n", + " if k >= self.n or k < 0 :\n", + " raise IndexError # 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\n", + " return k * k\n", + " def __len__(self):\n", + " return self.n\n", + " \n", + "s = SquareSeq(10)\n", + "print s[2], s[4]\n", + "for x in s: # IndexError가 발생하는 시점까지 반복한다\n", + " print x,\n", + "print s[20] # 첨자 범위가 넘었다" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 사용자 클래스 예외 정의 및 발생시키기\n", + "- 사용자 정의 예외 클래스를 구현하는 일반적인 방법은 Exception 클래스를 상속 받아 구현한다.\n", + " - Exception 클래스의 서브 클래스 중 하나를 상속 받아도 된다.\n", + "- 사용자 정의 예외 발생 방법\n", + " - 내장 예외 발생 방법과 동일하게 raise [클래스의 인스턴스] 와 같이 해당 예외 클래스의 인스턴스를 던진다.\n", + "- 사용자 정의 예외를 잡는 방법\n", + " - except [클래스 이름] 과 같이 해당 예외 클래스 이름을 사용한다.\n", + "- 아래 예에서 except Big이 잡는 예외는 Big과 Small 이다.\n", + " - 이유: Small은 Big의 하위 클래스이기 때문" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exception occurs!\n", + "Exception occurs!\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def f():\n", - " raise Exception, 'message!!!'\n", - " \n", - "try:\n", - " f()\n", - "except Exception, a:\n", - " print a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "message!!!\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0dd\uc131\uc790 \uc548\uc5d0 \ub123\uc5b4\uc900 \uc5d0\ub7ec \uba54\uc2dc\uc9c0\ub294 except \ud0a4\uc6cc\ub4dc \uc0ac\uc6a9\uc2dc\uc5d0 \ub450 \ubc88\uc9f8 \uc778\uc790\ub85c \ud574\ub2f9 \uba54\uc2dc\uc9c0\ub97c \ubc1b\uc744 \uc218 \uc788\ub2e4." + } + ], + "source": [ + "class Big(Exception):\n", + " pass\n", + "\n", + "class Small(Big):\n", + " pass\n", + "\n", + "def dosomething1():\n", + " x = Big()\n", + " raise x\n", + " \n", + "def dosomething2():\n", + " raise Small()\n", + " \n", + "for f in (dosomething1, dosomething2):\n", + " try:\n", + " f()\n", + " except Big:\n", + " print \"Exception occurs!\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-3 예외값 전달하기 \n", + "- raise 키워드 뒤에 예외와 함께, 추가 메시지를 함께 던질 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "message!!!\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 10\n", - "b = 0\n", - "try:\n", - " if b == 0:\n", - " raise ArithmeticError('0\uc73c\ub85c \ub098\ub204\uace0 \uc788\uc2b5\ub2c8\ub2e4.')\n", - " a / b\n", - "except ArithmeticError, v:\n", - " print v" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "0\uc73c\ub85c \ub098\ub204\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n" - ] - } - ], - "prompt_number": 28 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "def f():\n", + " raise Exception, 'message!!!'\n", + " \n", + "try:\n", + " f()\n", + "except Exception, a:\n", + " print a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 생성자 안에 넣어준 에러 메시지는 except 키워드 사용시에 두 번째 인자로 해당 메시지를 받을 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0으로 나누고 있습니다.\n" ] } ], - "metadata": {} + "source": [ + "a = 10\n", + "b = 0\n", + "try:\n", + " if b == 0:\n", + " raise ArithmeticError('0으로 나누고 있습니다.')\n", + " a / b\n", + "except ArithmeticError, v:\n", + " print v" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 73f63bb725a7fd5b9e6aaf1e07c4dcb613311c72 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 20 Nov 2017 23:43:47 +0900 Subject: [PATCH 071/124] ... --- python3.6/python17.ipynb | 174 ++++++++++++++++++++++++++++++++------ python3.6/python18.ipynb | 177 +++++++++++++++++++++++++-------------- 2 files changed, 265 insertions(+), 86 deletions(-) diff --git a/python3.6/python17.ipynb b/python3.6/python17.ipynb index 1acacbc..37d843b 100644 --- a/python3.6/python17.ipynb +++ b/python3.6/python17.ipynb @@ -49,7 +49,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -85,7 +87,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -120,7 +124,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "UnboundLocalError", @@ -129,8 +135,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mUnboundLocalError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mf\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg\u001b[0m \u001b[0;31m# r-value로 사용되는 g는 전역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m20\u001b[0m \u001b[0;31m# l-value로 정의되는 g는 지역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mf\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg\u001b[0m \u001b[0;31m# r-value로 사용되는 g는 전역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m20\u001b[0m \u001b[0;31m# l-value로 정의되는 g는 지역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mUnboundLocalError\u001b[0m: local variable 'g' referenced before assignment" ] } @@ -149,7 +155,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -193,10 +201,31 @@ "- dir(object): object이 지니고 있는 모든 Name들을 문자열 리스트로 반환한다." ] }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['In', 'Out', '_', '_4', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i2', '_i3', '_i4', '_i5', '_ih', '_ii', '_iii', '_oh', '_sh', 'exit', 'f', 'g', 'get_ipython', 'quit']\n" + ] + } + ], + "source": [ + "print(dir())" + ] + }, { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -222,14 +251,16 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, + "execution_count": 10, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1\n" + "20\n" ] } ], @@ -238,12 +269,73 @@ "def F():\n", " x = 1\n", " def G():\n", + " x = 20\n", " print(x)\n", " G()\n", - "\n", "F()" ] }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "G(): 20\n", + "F(): 1\n", + "Global: 2\n" + ] + } + ], + "source": [ + "x = 2\n", + "def F():\n", + " x = 1\n", + " def G():\n", + " x = 20\n", + " print(\"G():\", x)\n", + " G()\n", + " print(\"F():\", x)\n", + "F()\n", + "print(\"Global:\", x)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "G(): 20\n", + "F(): 1\n", + "Global: 20\n" + ] + } + ], + "source": [ + "x = 2\n", + "def F():\n", + " x = 1\n", + " def G():\n", + " global x\n", + " x = 20\n", + " print(\"G():\", x)\n", + " G()\n", + " print(\"F():\", x)\n", + "F()\n", + "print(\"Global:\", x)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -316,7 +408,9 @@ { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -365,8 +459,10 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, + "execution_count": 15, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -415,7 +511,9 @@ { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -441,7 +539,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -476,7 +576,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -540,7 +642,7 @@ " - 새로 만들기: 변수 이름 - PYTHONPATH, 변수 값 - C:\\Users\\yhhan\\mypythonlib\n", " - python 새로 시작하기 (cmd창 새로 시작한 후)\n", " - MAC이나 리눅스\n", - " - ~/.bash_profile 혹은 ~/.profile 파일에 다음 라인 추가\n", + " - ~/.bashrc, ~/.bash_profile, 혹은 ~/.profile 파일에 다음 라인 추가\n", " - export PYTHONPATH=/Users/yhhan/mypythonlib\n", " - 터미널 창에서 다음 명령어 수행 \n", " - source ~/.bash_profile\n", @@ -565,7 +667,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -589,14 +693,16 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, + "execution_count": 17, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python27.zip', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-darwin', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-mac', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-mac/lib-scriptpackages', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-tk', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-old', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-dynload', '/Users/yhhan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/site-packages', '/Users/yhhan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/IPython/extensions', '~/mypythonlib']\n" + "['', '/Users/yhhan/anaconda/lib/python36.zip', '/Users/yhhan/anaconda/lib/python3.6', '/Users/yhhan/anaconda/lib/python3.6/lib-dynload', '/Users/yhhan/anaconda/lib/python3.6/site-packages', '/Users/yhhan/anaconda/lib/python3.6/site-packages/Sphinx-1.5.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/aeosa', '/Users/yhhan/anaconda/lib/python3.6/site-packages/pip-9.0.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/six-1.10.0-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/sim2net-3.1.2-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/setuptools-33.1.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/IPython/extensions', '/Users/yhhan/.ipython', '~/mypythonlib']\n" ] } ], @@ -604,7 +710,27 @@ "import sys\n", "\n", "sys.path.append('~/mypythonlib')\n", - "print sys.path" + "print(sys.path)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['~/mypythonlib2', '', '/Users/yhhan/anaconda/lib/python36.zip', '/Users/yhhan/anaconda/lib/python3.6', '/Users/yhhan/anaconda/lib/python3.6/lib-dynload', '/Users/yhhan/anaconda/lib/python3.6/site-packages', '/Users/yhhan/anaconda/lib/python3.6/site-packages/Sphinx-1.5.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/aeosa', '/Users/yhhan/anaconda/lib/python3.6/site-packages/pip-9.0.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/six-1.10.0-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/sim2net-3.1.2-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/setuptools-33.1.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/IPython/extensions', '/Users/yhhan/.ipython', '~/mypythonlib']\n" + ] + } + ], + "source": [ + "sys.path.insert(0, '~/mypythonlib2')\n", + "print(sys.path)" ] }, { @@ -631,7 +757,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/python18.ipynb b/python3.6/python18.ipynb index ab012aa..f6af888 100644 --- a/python3.6/python18.ipynb +++ b/python3.6/python18.ipynb @@ -33,7 +33,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -61,7 +63,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -87,7 +91,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -114,7 +120,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -143,8 +151,10 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, + "execution_count": 1, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -161,35 +171,33 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, + "execution_count": 4, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "ImportError", - "evalue": "cannot import name 'replace'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mstring\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mreplace\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0msubstitute\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msubstitute\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msubstitute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'ham chicken spam'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'chicken'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'egg'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m# 기존:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mImportError\u001b[0m: cannot import name 'replace'" + "name": "stdout", + "output_type": "stream", + "text": [ + "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n", + "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n" ] } ], "source": [ - "from string import replace as substitute\n", - "print(substitute)\n", - "print(substitute('ham chicken spam', 'chicken', 'egg'))\n", - "\n", - "# 기존:\n", - "# \n", - "# ham egg spam" + "from string import punctuation\n", + "print(punctuation)\n", + "from string import punctuation as punc\n", + "print(punc)" ] }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, + "execution_count": 5, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -205,32 +213,45 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, + "execution_count": 11, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "SyntaxError", - "evalue": "Missing parentheses in call to 'print' (, line 2)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m print up\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m Missing parentheses in call to 'print'\n" + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "4\n", + "\n", + "5\n", + "\n", + "4\n", + "5\n" ] } ], "source": [ - "from string import replace as substitute, upper as up\n", - "print up\n", - "print up('abc')\n", + "from math import floor as flr, ceil as cil\n", + "print(flr)\n", + "print(flr(4.5))\n", + "print(cil)\n", + "print(cil(4.5))\n", "\n", - "#기존:\n", - "# \n", - "# ABC" + "print()\n", + "\n", + "from math import floor, ceil\n", + "print(floor(4.5))\n", + "print(ceil(4.5))" ] }, { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -255,7 +276,9 @@ { "cell_type": "code", "execution_count": 40, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "def str_test(s):\n", @@ -275,7 +298,9 @@ { "cell_type": "code", "execution_count": 18, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -301,7 +326,9 @@ { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import mymath\n", @@ -339,27 +366,31 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, + "execution_count": 12, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n" + "\n" ] } ], "source": [ "string = \"My first string\"\n", "import string\n", - "print string" + "print(string)" ] }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, + "execution_count": 13, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -384,8 +415,10 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, + "execution_count": 14, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -430,8 +463,10 @@ }, { "cell_type": "code", - "execution_count": 38, - "metadata": {}, + "execution_count": 15, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -456,7 +491,9 @@ { "cell_type": "code", "execution_count": 9, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -475,7 +512,9 @@ { "cell_type": "code", "execution_count": 28, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -513,7 +552,9 @@ { "cell_type": "code", "execution_count": 29, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -548,7 +589,9 @@ { "cell_type": "code", "execution_count": 32, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import module_test" @@ -593,7 +636,9 @@ { "cell_type": "code", "execution_count": 33, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import Speech" @@ -653,7 +698,9 @@ { "cell_type": "code", "execution_count": 36, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -671,7 +718,9 @@ { "cell_type": "code", "execution_count": 37, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -689,7 +738,9 @@ { "cell_type": "code", "execution_count": 38, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -714,7 +765,9 @@ { "cell_type": "code", "execution_count": 39, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -757,7 +810,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, From 00a936f2c589495cd99b73afcc170e51cd726f6d Mon Sep 17 00:00:00 2001 From: dohyung Date: Mon, 27 Nov 2017 17:30:59 +0900 Subject: [PATCH 072/124] =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python20.ipynb | 41 ++- python3.6/python21.ipynb | 190 ++++++------ python3.6/python22.ipynb | 476 +++++++++++++++++++---------- python3.6/python23.ipynb | 340 ++++++++++++++++----- python3.6/readme.txt | 3 + python3.6/supplement-2016-09.ipynb | 334 +++++--------------- 6 files changed, 818 insertions(+), 566 deletions(-) create mode 100644 python3.6/readme.txt diff --git a/python3.6/python20.ipynb b/python3.6/python20.ipynb index 3bc2d74..6d5cd99 100644 --- a/python3.6/python20.ipynb +++ b/python3.6/python20.ipynb @@ -293,7 +293,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -319,8 +319,8 @@ " __invert__ = __neg__\n", " \n", "m = MyString(\"abcdef\")\n", - "print -m\n", - "print ~m" + "print(-m)\n", + "print(~m)" ] }, { @@ -439,6 +439,7 @@ } ], "source": [ + "#python3.x\n", "class MyCmp2:\n", " def __lt__(self, y):\n", " return 1 < y\n", @@ -475,6 +476,7 @@ } ], "source": [ + "#python2.x\n", "class MyCmp3:\n", " def __eq__(self, y):\n", " return 1 == y\n", @@ -575,6 +577,39 @@ "print(s1[20])\n" ] }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 9)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m9\u001b[0m\n\u001b[0;31m raise IndexError, k\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "#python3.x\n", + "class Square:\n", + " def __init__(self, end):\n", + " self.end = end\n", + " def __len__(self):\n", + " return self.end\n", + " def __getitem__(self, k):\n", + " if k < 0 or self.end <= k: \n", + " raise IndexError, k\n", + " return k * k\n", + " \n", + "s1 = Square(10)\n", + "print(len(s1)) # s1.__len__()\n", + "print(s1[1]) #s1.__getitem__(1)\n", + "print(s1[4])\n", + "print(s1[20])\n" + ] + }, { "cell_type": "code", "execution_count": 3, diff --git a/python3.6/python21.ipynb b/python3.6/python21.ipynb index 07ecb76..9927e93 100644 --- a/python3.6/python21.ipynb +++ b/python3.6/python21.ipynb @@ -39,8 +39,10 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": {}, + "execution_count": 2, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "class Person:\n", @@ -53,8 +55,10 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, + "execution_count": 3, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "class Employee(Person): # 괄호 안에 쓰여진 클래스는 슈퍼클래스를 의미한다.\n", @@ -81,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -100,24 +104,24 @@ ], "source": [ "p1 = Person('홍길동', 1498)\n", - "print p1.name\n", - "print p1\n", + "print(p1.name)\n", + "print(p1)\n", "\n", - "print\n", + "print()\n", "\n", "m1 = Employee('손창희', 5564, '대리', 200)\n", "m2 = Employee('김기동', 8546, '과장', 300)\n", - "print m1.name, m1.position # 슈퍼클래스와 서브클래스의 멤버를 하나씩 출력한다.\n", - "print m1\n", - "print m2.name, m2.position\n", - "print m2" + "print(m1.name, m1.position) # 슈퍼클래스와 서브클래스의 멤버를 하나씩 출력한다.\n", + "print(m1)\n", + "print(m2.name, m2.position)\n", + "print(m2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "![inheritance](images/inheritance3.png)" + "![inheritance](../images/inheritance3.png)" ] }, { @@ -130,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -144,11 +148,11 @@ "source": [ "class Super:\n", " def __init__(self):\n", - " print 'Super init called'\n", + " print('Super init called')\n", "\n", "class Sub(Super):\n", " def __init__(self):\n", - " print 'Sub init called'\n", + " print('Sub init called')\n", " \n", "s = Sub()" ] @@ -162,7 +166,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -177,12 +181,12 @@ "source": [ "class Super:\n", " def __init__(self):\n", - " print 'Super init called'\n", + " print('Super init called')\n", " \n", "class Sub(Super):\n", " def __init__(self):\n", " Super.__init__(self) # 명시적으로 슈퍼클래스의 생성자를 호출한다.\n", - " print 'Sub init called'\n", + " print('Sub init called')\n", " \n", "s = Sub()" ] @@ -196,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -210,7 +214,7 @@ "source": [ "class Super:\n", " def __init__(self):\n", - " print 'Super init called'\n", + " print('Super init called')\n", " \n", "class Sub(Super):\n", " pass\n", @@ -228,7 +232,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -257,13 +261,13 @@ "p1 = Person('gslee', 5284)\n", "m1 = Employee('kslee', 5224, 'President', 500)\n", "\n", - "print p1\n", - "print m1" + "print(p1)\n", + "print(m1)" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -287,8 +291,8 @@ "p1 = Person('gslee', 5284)\n", "m1 = Employee('kslee', 5224, 'President', 500)\n", "\n", - "print p1\n", - "print m1" + "print(p1)\n", + "print(m1)" ] }, { @@ -313,7 +317,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -329,15 +333,15 @@ "source": [ "class Animal:\n", " def cry(self):\n", - " print '...'\n", + " print('...')\n", " \n", "class Dog(Animal):\n", " def cry(self):\n", - " print '멍멍'\n", + " print('멍멍')\n", " \n", "class Duck(Animal):\n", " def cry(self):\n", - " print '꽥꽥'\n", + " print('꽥꽥')\n", " \n", "class Fish(Animal):\n", " pass\n", @@ -375,14 +379,14 @@ "output_type": "stream", "text": [ "[]\n", - "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" + "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" ] } ], "source": [ "a = list()\n", - "print a\n", - "print dir(a)" + "print(a)\n", + "print(dir(a))" ] }, { @@ -394,7 +398,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -416,11 +420,11 @@ " return self\n", "\n", "L = MyList([1, 2, 3, 'spam', 4, 5])\n", - "print L\n", - "print\n", + "print(L)\n", + "print()\n", "\n", "L = L - ['spam', 4]\n", - "print L" + "print(L)" ] }, { @@ -434,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -459,18 +463,18 @@ "\n", "s.push(4)\n", "s.push(5)\n", - "print s\n", - "print\n", + "print(s)\n", + "print()\n", "\n", "s = Stack([1,2,3])\n", "s.push(4)\n", "s.push(5)\n", - "print s\n", - "print\n", + "print(s)\n", + "print()\n", "\n", - "print s.pop() # 슈퍼 클래스인 리스트 클래스의 pop() 메소드 호출\n", - "print s.pop()\n", - "print s" + "print(s.pop()) # 슈퍼 클래스인 리스트 클래스의 pop() 메소드 호출\n", + "print(s.pop())\n", + "print(s)" ] }, { @@ -484,7 +488,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -506,10 +510,10 @@ "q = Queue()\n", "q.enqueue(1) # 데이터 추가\n", "q.enqueue(2)\n", - "print q\n", + "print(q)\n", "\n", - "print q.dequeue() # 데이터 꺼내기\n", - "print q.dequeue()" + "print(q.dequeue()) # 데이터 꺼내기\n", + "print(q.dequeue())" ] }, { @@ -535,8 +539,8 @@ ], "source": [ "a = dict()\n", - "print a\n", - "print dir(a)" + "print(a)\n", + "print(dir(a))" ] }, { @@ -548,16 +552,16 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['one', 'three', 'two']\n", + "dict_keys(['one', 'two', 'three'])\n", "\n", - "['three', 'two', 'one']\n" + "dict_keys(['one', 'two', 'three'])\n" ] } ], @@ -565,15 +569,16 @@ "class MyDict(dict):\n", " def keys(self):\n", " K = dict.keys(self) # 언바운드 메소드 호출 --> K = self.keys() 라고 호출하면 무한 재귀 호출\n", - " K.sort()\n", + " # K.sort()\n", + " sorted(K)\n", " return K\n", "\n", "d = MyDict({'one':1, 'two':2, 'three':3})\n", - "print d.keys()\n", - "print\n", + "print(d.keys())\n", + "print()\n", "\n", "d2 = {'one':1, 'two':2, 'three':3}\n", - "print d2.keys()" + "print(d2.keys())" ] }, { @@ -601,7 +606,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -616,8 +621,9 @@ "source": [ "import types\n", "\n", - "print type(123) == types.IntType\n", - "print type(123) == type(0)" + "# print(type(123) == types.IntType)\n", + "print(type(123) == int)\n", + "print(type(123) == type(0))" ] }, { @@ -630,21 +636,21 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " True\n", - "\n" + "True\n", + "\n" ] } ], "source": [ - "print isinstance(123, int)\n", - "print int" + "print(isinstance(123, int))\n", + "print(int)" ] }, { @@ -656,16 +662,23 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "<__main__.A instance at 0x10de34e60> => A\n", - "<__main__.B instance at 0x10de34e18> => B\n", - "<__main__.C instance at 0x10de34cf8> => B C\n" + "<__main__.A object at 0x1118a37f0> =>\n", + "A\n", + "\n", + "<__main__.B object at 0x1119b01d0> =>\n", + "B\n", + "\n", + "<__main__.C object at 0x1119b0ac8> =>\n", + "B\n", + "C\n", + "\n" ] } ], @@ -681,14 +694,14 @@ " pass\n", "\n", "def check(obj):\n", - " print obj, '=>',\n", + " print(obj, '=>'),\n", " if isinstance(obj, A):\n", - " print 'A',\n", + " print('A'),\n", " if isinstance(obj, B):\n", - " print 'B',\n", + " print('B'),\n", " if isinstance(obj, C):\n", - " print 'C',\n", - " print\n", + " print('C'),\n", + " print()\n", " \n", "a = A()\n", "b = B()\n", @@ -709,16 +722,23 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "__main__.A => A\n", - "__main__.B => B\n", - "__main__.C => B C\n" + " =>\n", + "A\n", + "\n", + " =>\n", + "B\n", + "\n", + " =>\n", + "B\n", + "C\n", + "\n" ] } ], @@ -734,14 +754,14 @@ " pass\n", "\n", "def check(obj):\n", - " print obj, '=>',\n", + " print(obj, '=>'),\n", " if issubclass(obj, A):\n", - " print 'A',\n", + " print('A'),\n", " if issubclass(obj, B):\n", - " print 'B',\n", + " print('B'),\n", " if issubclass(obj, C):\n", - " print 'C',\n", - " print\n", + " print('C'),\n", + " print()\n", " \n", "check(A)\n", "check(B)\n", diff --git a/python3.6/python22.ipynb b/python3.6/python22.ipynb index 8366791..eff2289 100644 --- a/python3.6/python22.ipynb +++ b/python3.6/python22.ipynb @@ -40,7 +40,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![inheritance](images/cyclingref.png)" + "![inheritance](../images/cyclingref.png)" ] }, { @@ -73,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -96,30 +96,30 @@ " pass\n", "c = C() # 클래스 C의 인스턴스 생성 \n", "c.a = 1 # 인스턴스 c에 테스트용 값 설정 \n", - "print \"refcount -\", sys.getrefcount(c) # 객체 c의 레퍼런스 카운트 조회\n", - "print\n", + "print(\"refcount -\", sys.getrefcount(c)) # 객체 c의 레퍼런스 카운트 조회\n", + "print()\n", "\n", "d = c # 일반적인 레퍼런스 카운트 증가 방법\n", - "print \"refcount -\", sys.getrefcount(c) # 객체 c의 레퍼런스 카운트 조회\n", - "print \n", + "print(\"refcount -\", sys.getrefcount(c)) # 객체 c의 레퍼런스 카운트 조회\n", + "print()\n", "\n", "r = weakref.ref(c) # 약한 참조 객체 r 생성\n", - "print \"refcount -\", sys.getrefcount(c) # 객체 c의 레퍼런스 카운트 조회 --> 카운트 불변\n", - "print" + "print(\"refcount -\", sys.getrefcount(c)) # 객체 c의 레퍼런스 카운트 조회 --> 카운트 불변\n", + "print()" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "<__main__.C instance at 0x10d893830>\n", - "<__main__.C instance at 0x10d893830>\n", + "\n", + "<__main__.C object at 0x1100ef588>\n", + "<__main__.C object at 0x1100ef588>\n", "1\n", "\n", "None\n" @@ -130,23 +130,24 @@ "evalue": "'NoneType' object has no attribute 'a'", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# None을 리턴한다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m \u001b[0;31m# 속성도 참조할 수 없다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# None을 리턴한다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 속성도 참조할 수 없다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'a'" ] } ], "source": [ - "print r # 약한 참조(weakref) 객체\n", - "print r() # 약한 참조로 부터 실제 객체를 참조하는 방법: 약한 참조 객체에 함수형태로 호출\n", - "print c \n", - "print r().a # 약한 참조를 이용한 실제 객체 멤버 참조\n", - "print \n", + "print(r) # 약한 참조(weakref) 객체\n", + "print(r()) # 약한 참조로 부터 실제 객체를 참조하는 방법: 약한 참조 객체에 함수형태로 호출\n", + "print(c)\n", + "print(r().a) # 약한 참조를 이용한 실제 객체 멤버 참조\n", + "print()\n", "\n", "del c # 객체 제거\n", "del d\n", - "print r() # None을 리턴한다\n", - "print r().a # 속성도 참조할 수 없다" + "print(r()) # None을 리턴한다\n", + "print(r().a) # 속성도 참조할 수 없다" ] }, { @@ -158,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -166,8 +167,9 @@ "evalue": "cannot create weak reference to 'dict' object", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'one'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'two'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mwd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mweakref\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mref\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'one'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'two'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mwd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mweakref\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mref\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: cannot create weak reference to 'dict' object" ] } @@ -189,7 +191,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -199,8 +201,8 @@ "refcount - 2\n", "refcount - 2\n", "\n", - "<__main__.C instance at 0x10d8a9998>\n", - "<__main__.C instance at 0x10d8a9998>\n", + "<__main__.C object at 0x1100fab00>\n", + "<__main__.C object at 0x1100fab00>\n", "2\n" ] } @@ -213,18 +215,18 @@ "\n", "c = C()\n", "c.a = 2\n", - "print \"refcount -\", sys.getrefcount(c) # 객체 c의 레퍼런스 카운트 조회\n", + "print(\"refcount -\", sys.getrefcount(c)) # 객체 c의 레퍼런스 카운트 조회\n", "p = weakref.proxy(c) # 프록시 객체를 만든다\n", - "print \"refcount -\", sys.getrefcount(c) # 객체 c의 레퍼런스 카운트 조회 --> 카운트 불변\n", - "print \n", - "print p\n", - "print c\n", - "print p.a" + "print(\"refcount -\", sys.getrefcount(c)) # 객체 c의 레퍼런스 카운트 조회 --> 카운트 불변\n", + "print( )\n", + "print(p)\n", + "print(c)\n", + "print(p.a)" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -232,7 +234,7 @@ "output_type": "stream", "text": [ "2\n", - "[, ]\n" + "[, ]\n" ] } ], @@ -244,8 +246,12 @@ "c = C() # 참조할 객체 생성\n", "r = weakref.ref(c) # weakref 생성\n", "p = weakref.proxy(c) # weakref 프록시 생성\n", - "print weakref.getweakrefcount(c) # weakref 개수 조회\n", - "print weakref.getweakrefs(c) # weakref 목록 조회" + "print(weakref.getweakrefcount(c)) # weakref 개수 조회\n", + "print(weakref.getweakrefs(c)) # weakref 목록 조회\n", + "\n", + "#python2.x에서의 결과\n", + "# 2\n", + "# [, ]" ] }, { @@ -272,17 +278,17 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "[(1, <__main__.C instance at 0x10dccad40>)]\n", + "\n", + "\n", "4\n", - "[]\n" + "\n" ] } ], @@ -294,14 +300,20 @@ "c = C()\n", "c.a = 4\n", "d = weakref.WeakValueDictionary() # WeakValueDictionary 객체 생성\n", - "print d\n", + "print(d)\n", "\n", "d[1] = c # 실제 객체에 대한 약한 참조 아이템 생성\n", - "print d.items() # 사전 내용 확인\n", - "print d[1].a # 실제 객체의 속성 참조\n", + "print(d.items()) # 사전 내용 확인\n", + "print(d[1].a) # 실제 객체의 속성 참조\n", "\n", "del c # 실제 객체 삭제\n", - "print d.items() # 약한 사전에 해당 객체 아이템도 제거되어 있음" + "print(d.items()) # 약한 사전에 해당 객체 아이템도 제거되어 있음\n", + "\n", + "#python2.x에서의 결과\n", + "# \n", + "# [(1, <__main__.C instance at 0x10dccad40>)]\n", + "# 4\n", + "# []" ] }, { @@ -313,7 +325,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -321,9 +333,9 @@ "output_type": "stream", "text": [ "{}\n", - "[(1, <__main__.C instance at 0x10d893878>)]\n", + "dict_items([(1, <__main__.C object at 0x11024b710>)])\n", "4\n", - "[(1, <__main__.C instance at 0x10d893878>)]\n" + "dict_items([(1, <__main__.C object at 0x11024b710>)])\n" ] } ], @@ -334,14 +346,14 @@ "c = C()\n", "c.a = 4\n", "d = {} # 일반 사전 객체 생성\n", - "print d\n", + "print(d)\n", "\n", "d[1] = c # 실제 객체에 대한 일반 참조 아이템 생성\n", - "print d.items() # 사전 내용 확인\n", - "print d[1].a # 실제 객체의 속성 참조\n", + "print(d.items()) # 사전 내용 확인\n", + "print(d[1].a) # 실제 객체의 속성 참조\n", "\n", "del c # 객체 삭제 (사전에 해당 객체의 레퍼런스가 있으므로 객체는 실제로 메모리 해제되지 않음)\n", - "print d.items() # 일반 사전에 해당 객체 아이템이 여전히 남아 있음" + "print(d.items()) # 일반 사전에 해당 객체 아이템이 여전히 남아 있음" ] }, { @@ -370,14 +382,14 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "1\n", "2\n", "3\n" @@ -388,20 +400,25 @@ "evalue": "", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m: " ] } ], "source": [ "I = iter([1,2,3])\n", - "print I\n", + "print(I)\n", "\n", - "print I.next()\n", - "print I.next()\n", - "print I.next()\n", - "print I.next()" + "# print(I.next())\n", + "# print(I.next())\n", + "# print(I.next())\n", + "# print(I.next())\n", + "print(next(I))\n", + "print(next(I))\n", + "print(next(I))\n", + "print(next(I))" ] }, { @@ -413,7 +430,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -428,7 +445,7 @@ ], "source": [ "def f(x):\n", - " print x + 1\n", + " print(x + 1)\n", "\n", "for x in [1,2,3]:\n", " f(x)" @@ -443,7 +460,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -458,12 +475,13 @@ ], "source": [ "def f(x):\n", - " print x + 1\n", + " print(x + 1)\n", "\n", "t = iter([1,2,3])\n", "while 1:\n", " try:\n", - " x = t.next()\n", + " #x = t.next()\n", + " x = next(t)\n", " except StopIteration:\n", " break\n", " f(x)" @@ -480,7 +498,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -495,7 +513,7 @@ ], "source": [ "def f(x):\n", - " print x + 1\n", + " print(x + 1)\n", "\n", "t = iter([1,2,3])\n", "for x in t:\n", @@ -504,7 +522,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -519,7 +537,7 @@ ], "source": [ "def f(x):\n", - " print x + 1\n", + " print(x + 1)\n", "\n", "for x in iter([1,2,3]):\n", " f(x)" @@ -527,7 +545,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -542,7 +560,7 @@ ], "source": [ "def f(x):\n", - " print x + 1\n", + " print(x + 1)\n", "\n", "for x in iter((1,2,3)):\n", " f(x)" @@ -564,6 +582,52 @@ " - \\_\\_iter\\_\\_(self) 함수는 next() 함수를 지닌 반복자 객체를 반환해야 한다." ] }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "iter() returned non-iterator of type 'Seq'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mSeq\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'readme.txt'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# s 인스턴스가 next() 메소드를 지니고 있으므로 s 인스턴스 자체가 반복자임\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 17\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# 우선 __iter__() 메소드를 호출하여 반복자를 얻고, 반복자에 대해서 for ~ in 구문에 의하여 next() 메소드가 호출됨\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 18\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: iter() returned non-iterator of type 'Seq'" + ] + } + ], + "source": [ + "#python3.x\n", + "class Seq:\n", + " def __init__(self, fname):\n", + " self.file = open(fname)\n", + " #def __getitem__(self, n):\n", + " # if n == 10:\n", + " # raise StopIteration\n", + " # return n\n", + " def __iter__(self):\n", + " return self\n", + " def next(self):\n", + " line = self.file.readline() # 한 라인을 읽는다.\n", + " if not line: \n", + " raise StopIteration # 읽을 수 없으면 예외 발생\n", + " return line # 읽은 라인을 리턴한다.\n", + " \n", + "s = Seq('readme.txt') # s 인스턴스가 next() 메소드를 지니고 있으므로 s 인스턴스 자체가 반복자임 \n", + "for line in s: # 우선 __iter__() 메소드를 호출하여 반복자를 얻고, 반복자에 대해서 for ~ in 구문에 의하여 next() 메소드가 호출됨\n", + " print(line),\n", + "\n", + "print()\n", + "\n", + "print(Seq('readme.txt'))\n", + "\n", + "print(list(Seq('readme.txt'))) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. \n", + "print(tuple(Seq('readme.txt'))) # tuple() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " + ] + }, { "cell_type": "code", "execution_count": 3, @@ -584,6 +648,7 @@ } ], "source": [ + "#python2.x\n", "class Seq:\n", " def __init__(self, fname):\n", " self.file = open(fname)\n", @@ -601,14 +666,14 @@ " \n", "s = Seq('readme.txt') # s 인스턴스가 next() 메소드를 지니고 있으므로 s 인스턴스 자체가 반복자임 \n", "for line in s: # 우선 __iter__() 메소드를 호출하여 반복자를 얻고, 반복자에 대해서 for ~ in 구문에 의하여 next() 메소드가 호출됨\n", - " print line,\n", + " print(line),\n", "\n", - "print \n", + "print()\n", "\n", - "print Seq('readme.txt')\n", + "print(Seq('readme.txt'))\n", "\n", - "print list(Seq('readme.txt')) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. \n", - "print tuple(Seq('readme.txt')) # tuple() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " + "print(list(Seq('readme.txt'))) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. \n", + "print(tuple(Seq('readme.txt'))) # tuple() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " ] }, { @@ -627,95 +692,119 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "four 4\n", - "three 3\n", - "five 5\n", + "one 1\n", "two 2\n", - "one 1\n" + "three 3\n", + "four 4\n", + "five 5\n" ] } ], "source": [ "d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}\n", "for key in d:\n", - " print key, d[key]" + " print(key, d[key])" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "four 4\n", - "three 3\n", - "five 5\n", + "one 1\n", "two 2\n", - "one 1\n" + "three 3\n", + "four 4\n", + "five 5\n" ] } ], "source": [ "d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}\n", "for key in iter(d):\n", - " print key, d[key]" + " print(key, d[key])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- d.iterkeys() 함수\n", - " - 사전 d가 지닌 키에 대한 반복자 객체를 반환한다." + "- python2.x\n", + " - d.iterkeys() 함수\n", + " - 사전 d가 지닌 키에 대한 반복자 객체를 반환한다.\n", + "- python3.x\n", + " - iter(d.keys())\n", + " - 또는 six 모듈을 이용\n", + " - http://portingguide.readthedocs.io/en/latest/dicts.html" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "four three five two one\n" + "one two three four five " ] } ], "source": [ - "for key in d.iterkeys(): # 키에 대한 반복자, d.iterkeys() 가 반환한 반복자에 대해 next() 함수가 순차적으로 불리워짐\n", - " print key," + "for key in iter(d.keys()): # 키에 대한 반복자, d.iterkeys() 가 반환한 반복자에 대해 next() 함수가 순차적으로 불리워짐\n", + " print(key, end=\" \")\n", + " \n", + " \n", + "#또는\n", + "# import six\n", + "# for key in six.iterkeys(d): # 키에 대한 반복자, d.iterkeys() 가 반환한 반복자에 대해 next() 함수가 순차적으로 불리워짐\n", + "# print(key,end=\" \")\n", + " \n", + " \n", + "#python2.x\n", + "# for key in d.iterkeys(): # 키에 대한 반복자, d.iterkeys() 가 반환한 반복자에 대해 next() 함수가 순차적으로 불리워짐\n", + "# print(key,)" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "four\n", - "three five two one\n" + "one\n", + "two three four five " ] } ], "source": [ - "keyset = d.iterkeys()\n", - "print keyset.next() # 반복자 객체는 항상 next() 메소드를 지니고 있음\n", + "\n", + "keyset = iter(d.keys())\n", + "print(next(keyset)) # 반복자 객체는 항상 next() 메소드를 지니고 있음\n", "for key in keyset: # keyset 반복자에 대해 next() 메소드가 순차적으로 호출됨\n", - " print key," + " print(key, end=\" \")\n", + " \n", + "#또는\n", + "# import six\n", + "# keyset = six.iterkeys(d)\n", + "# print(next(keyset)) # 반복자 객체는 항상 next() 메소드를 지니고 있음\n", + "# for key in keyset: # keyset 반복자에 대해 next() 메소드가 순차적으로 호출됨\n", + "# print(key, end=\" \")" ] }, { @@ -728,20 +817,24 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "4 3 5 2 1\n" + "1 2 3 4 5 " ] } ], "source": [ - "for value in d.itervalues(): # 값에 대한 반복자\n", - " print value, " + "import six\n", + "for value in six.iteritems(d): # 값에 대한 반복자\n", + " print(value[1], end=\" \") \n", + "#python2.x\n", + "# for value in d.itervalues(): # 값에 대한 반복자\n", + "# print(value,) " ] }, { @@ -754,24 +847,25 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "four 4\n", - "three 3\n", - "five 5\n", + "one 1\n", "two 2\n", - "one 1\n" + "three 3\n", + "four 4\n", + "five 5\n" ] } ], "source": [ - "for key, value in d.iteritems(): #(키,값)에 대한 반복자\n", - " print key, value" + "import six\n", + "for key, value in six.iteritems(d): #(키,값)에 대한 반복자\n", + " print(key, value)" ] }, { @@ -789,6 +883,31 @@ " - next() 함수에 의해 각 라인이 순차적으로 읽혀짐" ] }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'_io.TextIOWrapper' object has no attribute 'next'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'readme.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"f.next()\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# f.next() 가 순차적으로 호출됨\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAttributeError\u001b[0m: '_io.TextIOWrapper' object has no attribute 'next'" + ] + } + ], + "source": [ + "#python3.x\n", + "f = open('readme.txt')\n", + "print(\"f.next()\", f.next())\n", + "for line in f: # f.next() 가 순차적으로 호출됨\n", + " print(line, ) " + ] + }, { "cell_type": "code", "execution_count": 21, @@ -808,10 +927,11 @@ } ], "source": [ + "#python2.x\n", "f = open('readme.txt')\n", - "print \"f.next()\", f.next()\n", + "print(\"f.next()\", f.next())\n", "for line in f: # f.next() 가 순차적으로 호출됨\n", - " print line, " + " print(line, ) " ] }, { @@ -838,8 +958,10 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, + "execution_count": 69, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "def f(a,b):\n", @@ -861,8 +983,10 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, + "execution_count": 70, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "def generate_ints(N):\n", @@ -872,14 +996,14 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "0\n", "1\n", "2\n" @@ -890,19 +1014,24 @@ "evalue": "", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 더 이상 반환할 값이 없다면 StopIteration 예외를 던짐\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m: " ] } ], "source": [ "gen = generate_ints(3) # 발생자 객체를 얻는다. generate_ints() 함수에 대한 초기 스택 프레임이 만들어지나 실행은 중단되어 있는 상태임\n", - "print gen\n", - "print gen.next() # 발생자 객체는 반복자 인터페이스를 가진다. 발생자의 실행이 재개됨. yield에 의해 값 반환 후 다시 실행이 중단됨\n", - "print gen.next() # 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\n", - "print gen.next() # 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\n", - "print gen.next() # 발생자 실행 재개. yield에 의해 더 이상 반환할 값이 없다면 StopIteration 예외를 던짐" + "print(gen)\n", + "# print(gen.next()) # 발생자 객체는 반복자 인터페이스를 가진다. 발생자의 실행이 재개됨. yield에 의해 값 반환 후 다시 실행이 중단됨\n", + "# print(gen.next()) # 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\n", + "# print(gen.next()) # 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\n", + "# print(gen.next()) # 발생자 실행 재개. yield에 의해 더 이상 반환할 값이 없다면 StopIteration 예외를 던짐\n", + "print(next(gen))\n", + "print(next(gen))\n", + "print(next(gen))\n", + "print(next(gen))" ] }, { @@ -914,20 +1043,20 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "0 1 2 3 4\n" + "0 1 2 3 4 " ] } ], "source": [ "for i in generate_ints(5):\n", - " print i," + " print(i,end=\" \")" ] }, { @@ -954,7 +1083,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 76, "metadata": {}, "outputs": [ { @@ -966,7 +1095,7 @@ } ], "source": [ - "print [k for k in range(100) if k % 5 == 0]" + "print([k for k in range(100) if k % 5 == 0])" ] }, { @@ -981,29 +1110,32 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " at 0x10d84df50>\n", + " at 0x1100bf6d0>\n", "0\n", "5\n", "10\n", - "15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95\n" + "15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 " ] } ], "source": [ "a = (k for k in range(100) if k % 5 == 0)\n", - "print a\n", - "print a.next()\n", - "print a.next()\n", - "print a.next()\n", + "print(a)\n", + "# print(a.next())\n", + "# print(a.next())\n", + "# print(a.next())\n", + "print(next(a))\n", + "print(next(a))\n", + "print(next(a))\n", "for i in a:\n", - " print i," + " print(i,end=\" \")" ] }, { @@ -1018,7 +1150,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 79, "metadata": {}, "outputs": [ { @@ -1030,7 +1162,7 @@ } ], "source": [ - "print sum((k for k in range(100) if k % 5 == 0))" + "print(sum((k for k in range(100) if k % 5 == 0)))" ] }, { @@ -1042,14 +1174,14 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 81, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1 1 2 3 5 8 13 21 34 55 89\n" + "1 1 2 3 5 8 13 21 34 55 89 " ] } ], @@ -1062,7 +1194,7 @@ "for k in fibonacci(): # 발생자를 직접 for ~ in 구문에 활용\n", " if k > 100: \n", " break\n", - " print k," + " print(k,end=\" \")" ] }, { @@ -1079,6 +1211,43 @@ "- 반복자를 활용한 예" ] }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "iter() returned non-iterator of type 'Odds'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mOdds\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mend\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: iter() returned non-iterator of type 'Odds'" + ] + } + ], + "source": [ + "#python3.x\n", + "class Odds:\n", + " def __init__(self, limit = None): # 생성자 정의\n", + " self.data = -1 # 초기 값\n", + " self.limit = limit # 한계 값\n", + " def __iter__(self): # Odds 객체의 반복자를 반환하는 특수 함수\n", + " return self\n", + " def next(self): # 반복자의 필수 함수\n", + " self.data += 2\n", + " if self.limit and self.limit <= self.data:\n", + " raise StopIteration\n", + " return self.data\n", + "\n", + "for k in Odds(20):\n", + " print(k,end=\" \")\n", + "print()\n", + "print(list(Odds(20))) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " + ] + }, { "cell_type": "code", "execution_count": 43, @@ -1094,6 +1263,7 @@ } ], "source": [ + "#python2.x\n", "class Odds:\n", " def __init__(self, limit = None): # 생성자 정의\n", " self.data = -1 # 초기 값\n", @@ -1107,9 +1277,9 @@ " return self.data\n", "\n", "for k in Odds(20):\n", - " print k,\n", - "print\n", - "print list(Odds(20)) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " + " print(k,)\n", + "print()\n", + "print(list(Odds(20))) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " ] }, { @@ -1121,14 +1291,14 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1 3 5 7 9 11 13 15 17 19\n", + "1 3 5 7 9 11 13 15 17 19 \n", "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n" ] } @@ -1141,9 +1311,9 @@ " k += 2\n", " \n", "for k in odds(20):\n", - " print k,\n", - "print\n", - "print list(odds(20)) # list() 내장 함수가 발생자를 인수로 받으면 해당 발생자의 next()를 매번 호출하여 각 원소를 얻어온다. " + " print(k,end=\" \")\n", + "print()\n", + "print(list(odds(20))) # list() 내장 함수가 발생자를 인수로 받으면 해당 발생자의 next()를 매번 호출하여 각 원소를 얻어온다. " ] }, { diff --git a/python3.6/python23.ipynb b/python3.6/python23.ipynb index 8f5d973..f8cc2c2 100644 --- a/python3.6/python23.ipynb +++ b/python3.6/python23.ipynb @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -52,8 +52,9 @@ "evalue": "name 'spam' is not defined", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m4\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mspam\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m4\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mspam\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'spam' is not defined" ] } @@ -72,24 +73,28 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { "ename": "ZeroDivisionError", - "evalue": "integer division or modulo by zero", + "evalue": "division by zero", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mZeroDivisionError\u001b[0m: integer division or modulo by zero" + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero" ] } ], "source": [ "a = 10\n", "b = 0 \n", - "c = a / b" + "c = a / b\n", + "\n", + "# python2.x에서의 결과\n", + "# eroDivisionError: integer division or modulo by zero" ] }, { @@ -101,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -109,9 +114,10 @@ "evalue": "float division by zero", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mdivision\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mdivision\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" ] } @@ -119,7 +125,7 @@ "source": [ "def division():\n", " for n in range(0, 5):\n", - " print 10.0 / n\n", + " print(10.0 / n)\n", "\n", "division() " ] @@ -134,22 +140,26 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [ { "ename": "TypeError", - "evalue": "cannot concatenate 'str' and 'int' objects", + "evalue": "must be str, not int", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m'2'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: cannot concatenate 'str' and 'int' objects" + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m'2'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# python2.x에서의 결과\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# TypeError: cannot concatenate 'str' and 'int' objects\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: must be str, not int" ] } ], "source": [ - "'2' + 2" + "'2' + 2\n", + "\n", + "# python2.x에서의 결과\n", + "# TypeError: cannot concatenate 'str' and 'int' objects" ] }, { @@ -162,7 +172,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -170,15 +180,16 @@ "evalue": "list index out of range", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] } ], "source": [ "l = [1, 2]\n", - "print l[2]" + "print(l[2])" ] }, { @@ -191,7 +202,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -199,15 +210,16 @@ "evalue": "'c'", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"a\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"a\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mKeyError\u001b[0m: 'c'" ] } ], "source": [ "d = {\"a\": 1, \"b\": 2}\n", - "print d['c']" + "print(d['c'])" ] }, { @@ -220,22 +232,26 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { - "ename": "IOError", + "ename": "FileNotFoundError", "evalue": "[Errno 2] No such file or directory: 'aaa.txt'", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIOError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'aaa.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mIOError\u001b[0m: [Errno 2] No such file or directory: 'aaa.txt'" + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'aaa.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'aaa.txt'" ] } ], "source": [ - "a = open('aaa.txt')" + "a = open('aaa.txt')\n", + "\n", + "# python2.x에서의 결과\n", + "# IOError: [Errno 2] No such file or directory: 'aaa.txt'" ] }, { @@ -243,7 +259,10 @@ "metadata": {}, "source": [ "### 1-2 내장 예외의 종류\n", - "- 예외 클래스의 계층 구조 ([참고] https://docs.python.org/2/library/exceptions.html)\n", + "- 예외 클래스의 계층 구조\n", + " - python2: https://docs.python.org/2/library/exceptions.html\n", + " - python3: https://docs.python.org/3/library/exceptions.html\n", + "\n", "
BaseException\n",
     " +-- SystemExit\n",
     " +-- KeyboardInterrupt\n",
@@ -326,7 +345,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [
     {
@@ -339,9 +358,9 @@
    ],
    "source": [
     "try:\n",
-    "    print 1.0 / 0.0\n",
+    "    print(1.0 / 0.0)\n",
     "except ZeroDivisionError:\n",
-    "    print 'zero division error!!!'"
+    "    print('zero division error!!!')"
    ]
   },
   {
@@ -351,6 +370,32 @@
     "- 예외 처리를 하면 예외 발생시 프로그램 종료가 되지 않는다."
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "ename": "SyntaxError",
+     "evalue": "invalid syntax (, line 5)",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;36m  File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m    except ZeroDivisionError, msg:\u001b[0m\n\u001b[0m                            ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
+     ]
+    }
+   ],
+   "source": [
+    "#python3.x\n",
+    "def division():\n",
+    "    for n in range(0, 5):\n",
+    "        try:\n",
+    "            print(10.0 / n)\n",
+    "        except ZeroDivisionError, msg:\n",
+    "            print(msg)\n",
+    "\n",
+    "division()"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": 1,
@@ -369,6 +414,7 @@
     }
    ],
    "source": [
+    "#python2.x\n",
     "def division():\n",
     "    for n in range(0, 5):\n",
     "        try:\n",
@@ -388,15 +434,15 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 49,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [
     {
      "ename": "SyntaxError",
-     "evalue": "invalid syntax (, line 5)",
+     "evalue": "invalid syntax (, line 5)",
      "output_type": "error",
      "traceback": [
-      "\u001b[0;36m  File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m    else:\u001b[0m\n\u001b[0m       ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
+      "\u001b[0;36m  File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m    else:\u001b[0m\n\u001b[0m       ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
      ]
     }
    ],
@@ -404,9 +450,9 @@
     "def division():\n",
     "    for n in range(0, 5):\n",
     "        try:\n",
-    "            print 10.0 / n\n",
+    "            print(10.0 / n)\n",
     "        else:\n",
-    "            print \"Success\"\n",
+    "            print(\"Success\")\n",
     "\n",
     "division() "
    ]
@@ -418,6 +464,28 @@
     "- 상황에 따라서는 에러와 함께 따라오는 정보를 함께 받을 수도 있다."
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "ename": "SyntaxError",
+     "evalue": "invalid syntax (, line 3)",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;36m  File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m3\u001b[0m\n\u001b[0;31m    except NameError, msg:\u001b[0m\n\u001b[0m                    ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
+     ]
+    }
+   ],
+   "source": [
+    "#python3.x\n",
+    "try:\n",
+    "    spam()\n",
+    "except NameError, msg:\n",
+    "    print('Error -', msg)"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": 2,
@@ -432,6 +500,7 @@
     }
    ],
    "source": [
+    "#python2.x\n",
     "try:\n",
     "    spam()\n",
     "except NameError, msg:\n",
@@ -440,7 +509,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [
     {
@@ -455,7 +524,7 @@
     "try:\n",
     "    spam()\n",
     "except NameError as msg:\n",
-    "    print 'Error -', msg"
+    "    print('Error -', msg)"
    ]
   },
   {
@@ -465,6 +534,31 @@
     "- try 절 안에서 간접적으로 호출한 함수의 내부 예외도 처리할 수 있다."
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "ename": "SyntaxError",
+     "evalue": "invalid syntax (, line 6)",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;36m  File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m6\u001b[0m\n\u001b[0;31m    except ZeroDivisionError, msg:\u001b[0m\n\u001b[0m                            ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
+     ]
+    }
+   ],
+   "source": [
+    "#python3.x\n",
+    "def zero_division():\n",
+    "    x = 1 / 0\n",
+    "\n",
+    "try:\n",
+    "    zero_division()\n",
+    "except ZeroDivisionError, msg:\n",
+    "    print('zero division error!!! -', msg)"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": 18,
@@ -479,6 +573,7 @@
     }
    ],
    "source": [
+    "#python2.x\n",
     "def zero_division():\n",
     "    x = 1 / 0\n",
     "\n",
@@ -490,14 +585,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 15,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "zero division error!!! - integer division or modulo by zero\n"
+      "zero division error!!! - division by zero\n"
      ]
     }
    ],
@@ -508,7 +603,10 @@
     "try:\n",
     "    zero_division()\n",
     "except ZeroDivisionError as msg:\n",
-    "    print 'zero division error!!! -', msg"
+    "    print('zero division error!!! -', msg)\n",
+    "    \n",
+    "# python2.x에서의 결과\n",
+    "# zero division error!!! - integer division or modulo by zero"
    ]
   },
   {
@@ -520,7 +618,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 31,
+   "execution_count": 16,
    "metadata": {},
    "outputs": [
     {
@@ -534,9 +632,9 @@
    "source": [
     "try:\n",
     "    spam()\n",
-    "    print 1.0 / 0.0\n",
+    "    print(1.0 / 0.0)\n",
     "except:\n",
-    "    print 'Error'"
+    "    print('Error')"
    ]
   },
   {
@@ -548,7 +646,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 17,
    "metadata": {},
    "outputs": [
     {
@@ -564,20 +662,20 @@
     "b = 0.0\n",
     "name = 'aaa.txt'\n",
     "try:\n",
-    "    print 1.0 / b\n",
+    "    print(1.0 / b)\n",
     "    spam()\n",
     "    f = open(name, 'r')\n",
     "    '2' + 2\n",
     "except NameError:\n",
-    "    print 'NameError !!!'\n",
+    "    print('NameError !!!')\n",
     "except ZeroDivisionError:\n",
-    "    print 'ZeroDivisionError !!!'\n",
+    "    print('ZeroDivisionError !!!')\n",
     "except (TypeError, IOError):\n",
-    "    print 'TypeError or IOError !!!'\n",
+    "    print('TypeError or IOError !!!')\n",
     "else:\n",
-    "    print 'No Exception !!!'\n",
+    "    print('No Exception !!!')\n",
     "finally:\n",
-    "    print 'Exit !!!'"
+    "    print('Exit !!!')"
    ]
   },
   {
@@ -588,6 +686,43 @@
     "  - 꼼꼼한 예외 처리 예제"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "ename": "SyntaxError",
+     "evalue": "invalid syntax (, line 7)",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;36m  File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m7\u001b[0m\n\u001b[0;31m    except IOError, msg:\u001b[0m\n\u001b[0m                  ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
+     ]
+    }
+   ],
+   "source": [
+    "#python3.x\n",
+    "import os\n",
+    "print(os.getcwd())\n",
+    "filename = 't.txt'\n",
+    "\n",
+    "try:\n",
+    "    f = open(filename, 'r')\n",
+    "except IOError, msg:\n",
+    "    print(msg)\n",
+    "else:\n",
+    "    a = float(f.readline())\n",
+    "    try:\n",
+    "        answer = 1.0 / a\n",
+    "    except ZeroDivisionError, msg:\n",
+    "        print(msg)\n",
+    "    else:\n",
+    "        print(answer)\n",
+    "    finally:\n",
+    "        print(\"Finally!!!\")\n",
+    "        f.close()"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": 9,
@@ -604,6 +739,7 @@
     }
    ],
    "source": [
+    "#python2.x\n",
     "import os\n",
     "print os.getcwd()\n",
     "filename = 't.txt'\n",
@@ -636,7 +772,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 19,
    "metadata": {},
    "outputs": [
     {
@@ -654,7 +790,7 @@
     "try:\n",
     "    dosomething()\n",
     "except ArithmeticError:\n",
-    "    print \"ArithmeticException occured\""
+    "    print(\"ArithmeticException occured\")"
    ]
   },
   {
@@ -666,7 +802,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 20,
    "metadata": {},
    "outputs": [
     {
@@ -684,9 +820,9 @@
     "try:\n",
     "    dosomething()\n",
     "except ZeroDivisionError:  # ZeroDivisionError는 이곳에서 잡힌다.\n",
-    "    print \"ZeroDivisionError occured\"\n",
+    "    print(\"ZeroDivisionError occured\")\n",
     "except ArithmeticError:    # FloatingPointError, OverflowError는 이곳에서 잡힌다.\n",
-    "    print \"ArithmeticException occured\""
+    "    print(\"ArithmeticException occured\")"
    ]
   },
   {
@@ -709,9 +845,9 @@
     "try:\n",
     "    dosomething()\n",
     "except ArithmeticError:\n",
-    "    print \"ArithmeticException occured\"\n",
+    "    print(\"ArithmeticException occured\")\n",
     "except ZeroDivisionError:  # 이곳에서 ZeroDivisionError는 잡히지 않는다. ==> 잘못된 코드\n",
-    "    print \"ZeroDivisionError occured\"    "
+    "    print(\"ZeroDivisionError occured\"  )  "
    ]
   },
   {
@@ -734,7 +870,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 21,
    "metadata": {},
    "outputs": [
     {
@@ -742,7 +878,7 @@
      "output_type": "stream",
      "text": [
       "4 16\n",
-      "0 1 4 9 16 25 36 49 64 81"
+      "0 1 4 9 16 25 36 49 64 81 "
      ]
     },
     {
@@ -750,9 +886,10 @@
      "evalue": "",
      "output_type": "error",
      "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m                                Traceback (most recent call last)",
-      "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m     13\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m  \u001b[0;31m# IndexError가 발생하는 시점까지 반복한다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     14\u001b[0m     \u001b[0;32mprint\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m  \u001b[0;31m# 첨자 범위가 넘었다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m      4\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m \u001b[0;31m# 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      7\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      8\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mIndexError\u001b[0m                                Traceback (most recent call last)",
+      "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m     13\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m  \u001b[0;31m# IndexError가 발생하는 시점까지 반복한다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     14\u001b[0m     \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mend\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m  \u001b[0;31m# 첨자 범위가 넘었다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m      4\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m \u001b[0;31m# 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      7\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      8\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mIndexError\u001b[0m: "
      ]
     }
@@ -769,10 +906,10 @@
     "        return self.n\n",
     "    \n",
     "s = SquareSeq(10)\n",
-    "print s[2], s[4]\n",
+    "print(s[2], s[4])\n",
     "for x in s:  # IndexError가 발생하는 시점까지 반복한다\n",
-    "    print x,\n",
-    "print s[20]  # 첨자 범위가 넘었다"
+    "    print(x,end=\" \")\n",
+    "print(s[20])  # 첨자 범위가 넘었다"
    ]
   },
   {
@@ -792,7 +929,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 22,
    "metadata": {},
    "outputs": [
     {
@@ -822,7 +959,7 @@
     "    try:\n",
     "        f()\n",
     "    except Big:\n",
-    "        print \"Exception occurs!\""
+    "        print(\"Exception occurs!\")"
    ]
   },
   {
@@ -833,6 +970,31 @@
     "- raise 키워드 뒤에 예외와 함께, 추가 메시지를 함께 던질 수 있다."
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {},
+   "outputs": [
+    {
+     "ename": "SyntaxError",
+     "evalue": "invalid syntax (, line 2)",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;36m  File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m    raise Exception, 'message!!!'\u001b[0m\n\u001b[0m                   ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
+     ]
+    }
+   ],
+   "source": [
+    "#python3.x\n",
+    "def f():\n",
+    "    raise Exception, 'message!!!'\n",
+    "    \n",
+    "try:\n",
+    "    f()\n",
+    "except Exception, a:\n",
+    "    print(a)"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": 13,
@@ -847,6 +1009,7 @@
     }
    ],
    "source": [
+    "#python2.x\n",
     "def f():\n",
     "    raise Exception, 'message!!!'\n",
     "    \n",
@@ -863,6 +1026,32 @@
     "- 생성자 안에 넣어준 에러 메시지는 except 키워드 사용시에 두 번째 인자로 해당 메시지를 받을 수 있다."
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {},
+   "outputs": [
+    {
+     "ename": "SyntaxError",
+     "evalue": "invalid syntax (, line 7)",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;36m  File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m7\u001b[0m\n\u001b[0;31m    except ArithmeticError, v:\u001b[0m\n\u001b[0m                          ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
+     ]
+    }
+   ],
+   "source": [
+    "#python3.x\n",
+    "a = 10\n",
+    "b = 0\n",
+    "try:\n",
+    "    if b == 0:\n",
+    "        raise ArithmeticError('0으로 나누고 있습니다.')\n",
+    "    a / b\n",
+    "except ArithmeticError, v:\n",
+    "    print(v)"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": 28,
@@ -877,6 +1066,7 @@
     }
    ],
    "source": [
+    "#python2.x\n",
     "a = 10\n",
     "b = 0\n",
     "try:\n",
diff --git a/python3.6/readme.txt b/python3.6/readme.txt
new file mode 100644
index 0000000..f5bc74f
--- /dev/null
+++ b/python3.6/readme.txt
@@ -0,0 +1,3 @@
+abc
+def
+ghi
\ No newline at end of file
diff --git a/python3.6/supplement-2016-09.ipynb b/python3.6/supplement-2016-09.ipynb
index 08fd271..928d278 100644
--- a/python3.6/supplement-2016-09.ipynb
+++ b/python3.6/supplement-2016-09.ipynb
@@ -82,9 +82,7 @@
   {
    "cell_type": "code",
    "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -138,9 +136,7 @@
   {
    "cell_type": "code",
    "execution_count": 3,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -251,9 +247,7 @@
   {
    "cell_type": "code",
    "execution_count": 31,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -282,9 +276,7 @@
   {
    "cell_type": "code",
    "execution_count": 32,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -323,9 +315,7 @@
   {
    "cell_type": "code",
    "execution_count": 33,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -352,9 +342,7 @@
   {
    "cell_type": "code",
    "execution_count": 34,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -380,9 +368,7 @@
   {
    "cell_type": "code",
    "execution_count": 36,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "ename": "SyntaxError",
@@ -402,9 +388,7 @@
   {
    "cell_type": "code",
    "execution_count": 38,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "ename": "TypeError",
@@ -436,9 +420,7 @@
   {
    "cell_type": "code",
    "execution_count": 39,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -470,9 +452,7 @@
   {
    "cell_type": "code",
    "execution_count": 40,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -500,9 +480,7 @@
   {
    "cell_type": "code",
    "execution_count": 41,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -527,9 +505,7 @@
   {
    "cell_type": "code",
    "execution_count": 42,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -556,9 +532,7 @@
   {
    "cell_type": "code",
    "execution_count": 46,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -586,9 +560,7 @@
   {
    "cell_type": "code",
    "execution_count": 47,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -610,9 +582,7 @@
   {
    "cell_type": "code",
    "execution_count": 48,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -631,9 +601,7 @@
   {
    "cell_type": "code",
    "execution_count": 49,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -669,9 +637,7 @@
   {
    "cell_type": "code",
    "execution_count": 50,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -702,9 +668,7 @@
   {
    "cell_type": "code",
    "execution_count": 51,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -723,9 +687,7 @@
   {
    "cell_type": "code",
    "execution_count": 52,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -745,9 +707,7 @@
   {
    "cell_type": "code",
    "execution_count": 53,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -775,9 +735,7 @@
   {
    "cell_type": "code",
    "execution_count": 54,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -804,9 +762,7 @@
   {
    "cell_type": "code",
    "execution_count": 55,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -826,9 +782,7 @@
   {
    "cell_type": "code",
    "execution_count": 56,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -853,9 +807,7 @@
   {
    "cell_type": "code",
    "execution_count": 57,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -901,9 +853,7 @@
   {
    "cell_type": "code",
    "execution_count": 62,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -981,9 +931,7 @@
   {
    "cell_type": "code",
    "execution_count": 65,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1024,9 +972,7 @@
   {
    "cell_type": "code",
    "execution_count": 66,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1052,9 +998,7 @@
   {
    "cell_type": "code",
    "execution_count": 67,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "data": {
@@ -1085,9 +1029,7 @@
   {
    "cell_type": "code",
    "execution_count": 68,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "data": {
@@ -1130,9 +1072,7 @@
   {
    "cell_type": "code",
    "execution_count": 69,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1160,9 +1100,7 @@
   {
    "cell_type": "code",
    "execution_count": 70,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1195,9 +1133,7 @@
   {
    "cell_type": "code",
    "execution_count": 71,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1224,9 +1160,7 @@
   {
    "cell_type": "code",
    "execution_count": 72,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1252,9 +1186,7 @@
   {
    "cell_type": "code",
    "execution_count": 73,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1278,9 +1210,7 @@
   {
    "cell_type": "code",
    "execution_count": 11,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1351,9 +1281,7 @@
   {
    "cell_type": "code",
    "execution_count": 80,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1440,9 +1368,7 @@
   {
    "cell_type": "code",
    "execution_count": 81,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1512,9 +1438,7 @@
   {
    "cell_type": "code",
    "execution_count": 82,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1599,9 +1523,7 @@
   {
    "cell_type": "code",
    "execution_count": 83,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1637,9 +1559,7 @@
   {
    "cell_type": "code",
    "execution_count": 84,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "data": {
@@ -1667,9 +1587,7 @@
   {
    "cell_type": "code",
    "execution_count": 85,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1715,9 +1633,7 @@
   {
    "cell_type": "code",
    "execution_count": 86,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1742,9 +1658,7 @@
   {
    "cell_type": "code",
    "execution_count": 87,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1774,9 +1688,7 @@
   {
    "cell_type": "code",
    "execution_count": 88,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1806,9 +1718,7 @@
   {
    "cell_type": "code",
    "execution_count": 89,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1838,9 +1748,7 @@
   {
    "cell_type": "code",
    "execution_count": 90,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1871,9 +1779,7 @@
   {
    "cell_type": "code",
    "execution_count": 91,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1897,9 +1803,7 @@
   {
    "cell_type": "code",
    "execution_count": 92,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -1982,9 +1886,7 @@
   {
    "cell_type": "code",
    "execution_count": 96,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2005,9 +1907,7 @@
   {
    "cell_type": "code",
    "execution_count": 97,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2033,9 +1933,7 @@
   {
    "cell_type": "code",
    "execution_count": 99,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2056,9 +1954,7 @@
   {
    "cell_type": "code",
    "execution_count": 101,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2088,9 +1984,7 @@
   {
    "cell_type": "code",
    "execution_count": 102,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2115,9 +2009,7 @@
   {
    "cell_type": "code",
    "execution_count": 103,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2135,9 +2027,7 @@
   {
    "cell_type": "code",
    "execution_count": 104,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2154,9 +2044,7 @@
   {
    "cell_type": "code",
    "execution_count": 105,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2173,9 +2061,7 @@
   {
    "cell_type": "code",
    "execution_count": 106,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2195,9 +2081,7 @@
   {
    "cell_type": "code",
    "execution_count": 107,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2217,9 +2101,7 @@
   {
    "cell_type": "code",
    "execution_count": 108,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "ename": "NameError",
@@ -2259,9 +2141,7 @@
   {
    "cell_type": "code",
    "execution_count": 110,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2300,9 +2180,7 @@
   {
    "cell_type": "code",
    "execution_count": 112,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2319,9 +2197,7 @@
   {
    "cell_type": "code",
    "execution_count": 113,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2367,9 +2243,7 @@
   {
    "cell_type": "code",
    "execution_count": 129,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2417,9 +2291,7 @@
   {
    "cell_type": "code",
    "execution_count": 130,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2441,9 +2313,7 @@
   {
    "cell_type": "code",
    "execution_count": 133,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2462,9 +2332,7 @@
   {
    "cell_type": "code",
    "execution_count": 134,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2482,9 +2350,7 @@
   {
    "cell_type": "code",
    "execution_count": 135,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2513,9 +2379,7 @@
   {
    "cell_type": "code",
    "execution_count": 136,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2538,9 +2402,7 @@
   {
    "cell_type": "code",
    "execution_count": 137,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2563,9 +2425,7 @@
   {
    "cell_type": "code",
    "execution_count": 138,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2599,9 +2459,7 @@
   {
    "cell_type": "code",
    "execution_count": 139,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2641,9 +2499,7 @@
   {
    "cell_type": "code",
    "execution_count": 140,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2702,9 +2558,7 @@
   {
    "cell_type": "code",
    "execution_count": 141,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "ename": "SyntaxError",
@@ -2734,9 +2588,7 @@
   {
    "cell_type": "code",
    "execution_count": 142,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2785,9 +2637,7 @@
   {
    "cell_type": "code",
    "execution_count": 143,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2816,9 +2666,7 @@
   {
    "cell_type": "code",
    "execution_count": 145,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -2896,9 +2744,7 @@
   {
    "cell_type": "code",
    "execution_count": 148,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -3005,9 +2851,7 @@
   {
    "cell_type": "code",
    "execution_count": 154,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -3283,9 +3127,7 @@
   {
    "cell_type": "code",
    "execution_count": 157,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "data": {
@@ -3575,9 +3417,7 @@
   {
    "cell_type": "code",
    "execution_count": 158,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -3595,9 +3435,7 @@
   {
    "cell_type": "code",
    "execution_count": 159,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -3621,9 +3459,7 @@
   {
    "cell_type": "code",
    "execution_count": 160,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -3646,9 +3482,7 @@
   {
    "cell_type": "code",
    "execution_count": 161,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -3744,7 +3578,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.6.0"
+   "version": "3.6.1"
   }
  },
  "nbformat": 4,

From 2b4bd3b3a6f3780106eca5d091c98befb04027a6 Mon Sep 17 00:00:00 2001
From: Youn-Hee Han 
Date: Mon, 27 Nov 2017 23:08:43 +0900
Subject: [PATCH 073/124] ...

---
 python3.6/assignment-5.ipynb | 39 +++++++++---------------------------
 1 file changed, 9 insertions(+), 30 deletions(-)

diff --git a/python3.6/assignment-5.ipynb b/python3.6/assignment-5.ipynb
index 457a7a7..7d3143b 100644
--- a/python3.6/assignment-5.ipynb
+++ b/python3.6/assignment-5.ipynb
@@ -6,7 +6,7 @@
    "source": [
     "# Assignment 5\n",
     "### [정보]\n",
-    "#### 1) Due Date: 2017년 12월 5일 (화), 23시 59분\n",
+    "#### 1) Due Date: 2017년 12월 12일 (화), 23시 59분\n",
     "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.jupyter.org에 넣어서 산출된 URL을 EL사이트에 제출\n",
     "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n",
     "#### 4) 숙제이후 소감: 모든 문제의 답을 적은 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n",
@@ -101,7 +101,9 @@
   {
    "cell_type": "code",
    "execution_count": 1,
-   "metadata": {},
+   "metadata": {
+    "collapsed": false
+   },
    "outputs": [
     {
      "name": "stdout",
@@ -191,21 +193,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "##### [7번 문제]\n",
-    "프로젝트 오일러 문제 16\n",
-    "\n",
-    "##### [8번 문제]\n",
-    "프로젝트 오일러 문제 17\n",
-    "\n",
-    "##### [9번 문제]\n",
-    "프로젝트 오일러 문제 18"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "##### [10번 문제] \n",
+    "##### [7번 문제] \n",
     "\n",
     "이전 Assignment 3 (Assignment 4가 아님)의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3을 다시 확장/변형하여 다음과 같은 조건을 만족하도록 구현하시오.\n",
     "  - 1) 새로운 클래스 WebWordsFrequency를 정의하시오.\n",
@@ -261,9 +249,9 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "##### [11번 문제] \n",
+    "##### [8번 문제] \n",
     "\n",
-    "위 10번 문제에서 정의한 WebWordsFrequency 클래스를 상속하여 OrderedWebWordsFrequency 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 오버라이드 하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.\n",
+    "위 7번 문제에서 정의한 WebWordsFrequency 클래스를 상속하여 OrderedWebWordsFrequency 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 오버라이드 하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.\n",
     "  - 리스트 내의 각 원소는 단어와 빈도를 쌍으로 지니는 튜플이다.\n",
     "  - getWordFrequence() 메소드에 reverse 라는 인자를 만들고 true 또는 false를 인자로 받을 수 있도록 한다.\n",
     "    - reverse 인자의 디폴트 값은 false 이며, 기본적으로 내림차순으로 정렬한다.\n",
@@ -282,7 +270,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "##### [12번 문제]\n",
+    "##### [9번 문제]\n",
     "\n",
     "다음과 같은 코딩이 가능하도록 OrderedWebWordsFrequency 안에 반복자와 관련된 메소드를 추가하시오.\n",
     "\n",
@@ -295,15 +283,6 @@
     "> ('program', 1)
\n", "> ('python', 1)
" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { @@ -323,7 +302,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, From 56bd586744a560359f1939fc16bdd9ca1856a25e Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 27 Nov 2017 23:13:25 +0900 Subject: [PATCH 074/124] ... --- python3.6/assignment-5.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python3.6/assignment-5.ipynb b/python3.6/assignment-5.ipynb index 7d3143b..fd0d6ce 100644 --- a/python3.6/assignment-5.ipynb +++ b/python3.6/assignment-5.ipynb @@ -10,7 +10,7 @@ "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.jupyter.org에 넣어서 산출된 URL을 EL사이트에 제출\n", "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 모든 문제의 답을 적은 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", - "#### 5) 문제 (총 12개)" + "#### 5) 문제 (총 9개)" ] }, { From 68e780882e11030ba946935fc4dbc419764bc536 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 4 Dec 2017 12:37:24 +0900 Subject: [PATCH 075/124] ... --- python20.ipynb | 10 +- python21.ipynb | 1572 +++++++++++++++++++------------------- python3.6/python20.ipynb | 606 +++++++++------ python3.6/python21.ipynb | 110 ++- 4 files changed, 1251 insertions(+), 1047 deletions(-) diff --git a/python20.ipynb b/python20.ipynb index bbe35a3..35b8e71 100644 --- a/python20.ipynb +++ b/python20.ipynb @@ -921,21 +921,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python [Root]", + "display_name": "Python 3", "language": "python", - "name": "Python [Root]" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python21.ipynb b/python21.ipynb index fb14b29..b3e275c 100644 --- a/python21.ipynb +++ b/python21.ipynb @@ -1,808 +1,818 @@ { - "metadata": { - "name": "", - "signature": "sha256:8f9b177eb7705dd02d3af4493e8b1149b369cd12a697af1db111d8dfe3b6e92e" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 21. \uc0c1\uc18d\uacfc \ub2e4\ud615\uc131\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ud074\ub798\uc2a4 \uc0c1\uc18d\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ud074\ub798\uc2a4 \uc0c1\uc18d\uacfc \uc774\ub984 \uacf5\uac04\uc758 \uad00\uacc4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc0c1\uc18d\uc758 \uc774\uc720\n", - " - \ucf54\ub4dc\uc758 \uc7ac\uc0ac\uc6a9\n", - " - \uc0c1\uc18d\ubc1b\uc740 \uc790\uc2dd \ud074\ub798\uc2a4\ub294 \uc0c1\uc18d\uc744 \ud574\uc900 \ubd80\ubaa8 \ud074\ub798\uc2a4\uc758 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uadf8\ub300\ub85c \uc0ac\uc6a9\n", - " - \uc790\uc2dd \ud074\ub798\uc2a4\ub294 \ud544\uc694\ud55c \uae30\ub2a5\ub9cc\uc744 \uc815\uc758\ud558\uac70\ub098 \uae30\uc874\uc758 \uae30\ub2a5\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\uc74c" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Person:\n", - " def __init__(self, name, phone=None):\n", - " self.name = name\n", - " self.phone = phone\n", - " def __str__(self):\n", - " return '' % (self.name, self.phone)" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Employee(Person): # \uad04\ud638 \uc548\uc5d0 \uc4f0\uc5ec\uc9c4 \ud074\ub798\uc2a4\ub294 \uc288\ud37c\ud074\ub798\uc2a4\ub97c \uc758\ubbf8\ud55c\ub2e4.\n", - " def __init__(self, name, phone, position, salary):\n", - " Person.__init__(self, name, phone) # Person\ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790 \ud638\ucd9c\n", - " self.position = position\n", - " self.salary = salary" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc774\ub984 \uacf5\uac04\uc758 \ud3ec\ud568\uad00\uacc4\n", - " - \uc790\uc2dd \ud074\ub798\uc2a4 > \ubd80\ubaa8 \ud074\ub798\uc2a4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![inheritance](images/inheritance2.png)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "p1 = Person('\ud64d\uae38\ub3d9', 1498)\n", - "print p1.name\n", - "print p1\n", - "\n", - "print\n", + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 21. 상속과 다형성\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 클래스 상속\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 클래스 상속과 이름 공간의 관계" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 상속의 이유\n", + " - 코드의 재사용\n", + " - 상속받은 자식 클래스는 상속을 해준 부모 클래스의 모든 기능을 그대로 사용\n", + " - 자식 클래스는 필요한 기능만을 정의하거나 기존의 기능을 변경할 수 있음" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Person:\n", + " def __init__(self, name, phone=None):\n", + " self.name = name\n", + " self.phone = phone\n", + " def __str__(self):\n", + " return '' % (self.name, self.phone)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Employee(Person): # 괄호 안에 쓰여진 클래스는 슈퍼클래스를 의미한다.\n", + " def __init__(self, name, phone, position, salary):\n", + " Person.__init__(self, name, phone) # Person클래스의 생성자 호출\n", + " self.position = position\n", + " self.salary = salary" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 이름 공간의 포함관계\n", + " - 자식 클래스 > 부모 클래스" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/inheritance2.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "홍길동\n", + "\n", "\n", - "m1 = Employee('\uc190\ucc3d\ud76c', 5564, '\ub300\ub9ac', 200)\n", - "m2 = Employee('\uae40\uae30\ub3d9', 8546, '\uacfc\uc7a5', 300)\n", - "print m1.name, m1.position # \uc288\ud37c\ud074\ub798\uc2a4\uc640 \uc11c\ube0c\ud074\ub798\uc2a4\uc758 \uba64\ubc84\ub97c \ud558\ub098\uc529 \ucd9c\ub825\ud55c\ub2e4.\n", - "print m1\n", - "print m2.name, m2.position\n", - "print m2" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\ud64d\uae38\ub3d9\n", - "\n", - "\n", - "\uc190\ucc3d\ud76c \ub300\ub9ac\n", - "\n", - "\uae40\uae30\ub3d9 \uacfc\uc7a5\n", - "\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![inheritance](images/inheritance3.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 \uc0dd\uc131\uc790 \ud638\ucd9c\n", - "- \uc11c\ube0c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub294 \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub97c \uc790\ub3d9\uc73c\ub85c \ud638\ucd9c\ud558\uc9c0 \uc54a\ub294\ub2e4." + "손창희 대리\n", + "\n", + "김기동 과장\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Super:\n", - " def __init__(self):\n", - " print 'Super init called'\n", - "\n", - "class Sub(Super):\n", - " def __init__(self):\n", - " print 'Sub init called'\n", - " \n", - "s = Sub()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Sub init called\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc11c\ube0c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub97c \uba85\uc2dc\uc801\uc73c\ub85c \ud638\ucd9c\ud574\uc57c \ud55c\ub2e4." + } + ], + "source": [ + "p1 = Person('홍길동', 1498)\n", + "print p1.name\n", + "print p1\n", + "\n", + "print\n", + "\n", + "m1 = Employee('손창희', 5564, '대리', 200)\n", + "m2 = Employee('김기동', 8546, '과장', 300)\n", + "print m1.name, m1.position # 슈퍼클래스와 서브클래스의 멤버를 하나씩 출력한다.\n", + "print m1\n", + "print m2.name, m2.position\n", + "print m2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](images/inheritance3.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 생성자 호출\n", + "- 서브 클래스의 생성자는 슈퍼 클래스의 생성자를 자동으로 호출하지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sub init called\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Super:\n", - " def __init__(self):\n", - " print 'Super init called'\n", - " \n", - "class Sub(Super):\n", - " def __init__(self):\n", - " Super.__init__(self) # \uba85\uc2dc\uc801\uc73c\ub85c \uc288\ud37c\ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\ub97c \ud638\ucd9c\ud55c\ub2e4.\n", - " print 'Sub init called'\n", - " \n", - "s = Sub()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Super init called\n", - "Sub init called\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc11c\ube0c \ud074\ub798\uc2a4\uc5d0 \uc0dd\uc131\uc790\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uc5d0\ub294 \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\uac00 \ud638\ucd9c\ub41c\ub2e4. " + } + ], + "source": [ + "class Super:\n", + " def __init__(self):\n", + " print 'Super init called'\n", + "\n", + "class Sub(Super):\n", + " def __init__(self):\n", + " print 'Sub init called'\n", + " \n", + "s = Sub()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 명시적으로 호출해야 한다." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Super init called\n", + "Sub init called\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Super:\n", - " def __init__(self):\n", - " print 'Super init called'\n", - " \n", - "class Sub(Super):\n", - " pass\n", - "\n", - "s = Sub()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Super init called\n" - ] - } - ], - "prompt_number": 66 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \uba54\uc3d8\ub4dc\uc758 \ub300\uce58 (\uba54\uc18c\ub4dc \uc624\ubc84\ub77c\uc774\ub4dc - Override)\n", - "- \uc11c\ube0c \ud074\ub798\uc2a4\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc5d0 \uc815\uc758\ub41c \uba54\uc18c\ub4dc\ub97c \uc7ac\uc815\uc758\ud558\uc5ec \ub300\uce58\ud558\ub294 \uae30\ub2a5" + } + ], + "source": [ + "class Super:\n", + " def __init__(self):\n", + " print 'Super init called'\n", + " \n", + "class Sub(Super):\n", + " def __init__(self):\n", + " Super.__init__(self) # 명시적으로 슈퍼클래스의 생성자를 호출한다.\n", + " print 'Sub init called'\n", + " \n", + "s = Sub()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 서브 클래스에 생성자가 정의되어 있지 않은 경우에는 슈퍼 클래스의 생성자가 호출된다. " + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Super init called\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Person:\n", - " def __init__(self, name, phone=None):\n", - " self.name = name\n", - " self.phone = phone\n", - " def __str__(self):\n", - " return '' % (self.name, self.phone)\n", - " \n", - "class Employee(Person):\n", - " def __init__(self, name, phone, position, salary):\n", - " Person.__init__(self, name, phone)\n", - " self.position = position\n", - " self.salary = salary\n", - " \n", - "p1 = Person('gslee', 5284)\n", - "m1 = Employee('kslee', 5224, 'President', 500)\n", - "\n", - "print p1\n", - "print m1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Employee(Person):\n", - " def __init__(self, name, phone, position, salary):\n", - " Person.__init__(self, name, phone)\n", - " self.position = position\n", - " self.salary = salary\n", - " def __str__(self):\n", - " return '' % (self.name, self.phone, self.position, self.salary)\n", - " \n", - "p1 = Person('gslee', 5284)\n", - "m1 = Employee('kslee', 5224, 'President', 500)\n", - "\n", - "print p1\n", - "print m1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ub2e4\ud615\uc131(Polymorphism)\n", - "- \uc0c1\uc18d \uad00\uacc4 \ub0b4\uc758 \ub2e4\ub978 \ud074\ub798\uc2a4\ub4e4\uc758 \uc778\uc2a4\ud134\uc2a4\ub4e4\uc774 \uac19\uc740 \uba64\ubc84 \ud568\uc218 \ud638\ucd9c\uc5d0 \ub300\ud574 \uac01\uac01 \ub2e4\ub974\uac8c \ubc18\uc751\ud558\ub3c4\ub85d \ud558\ub294 \uae30\ub2a5\n", - " - \uc5f0\uc0b0\uc790 \uc624\ubc84\ub85c\ub529\ub3c4 \ub2e4\ud615\uc131\uc744 \uc9c0\uc6d0\ud558\ub294 \uc911\uc694\ud55c \uae30\uc220 \n", - " - \uc608\ub97c \ub4e4\uc5b4, a\uc640 b\uc758 \uac1d\uccb4 \ud615\uc5d0 \ub530\ub77c a + b\uc758 + \uc5f0\uc0b0\uc790 \ud589\ub3d9 \ubc29\uc2dd\uc774 \ubcc0\uacbd\ub418\ub294 \uac83\n", - "\n", - "- \ub2e4\ud615\uc131\uc758 \uc7a5\uc810\n", - " - \uc801\uc740 \ucf54\ub529\uc73c\ub85c \ub2e4\uc591\ud55c \uac1d\uccb4\ub4e4\uc5d0\uac8c \uc720\uc0ac\ud55c \uc791\uc5c5\uc744 \uc218\ud589\uc2dc\ud0ac \uc218 \uc788\uc74c\n", - " - \ud504\ub85c\uadf8\ub7a8 \uc791\uc131 \ucf54\ub4dc \ub7c9\uc774 \uc904\uc5b4\ub4e0\ub2e4.\n", - " - \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ub192\ud600\uc900\ub2e4.\n", - " \n", - "- \ud30c\uc774\uc36c\uc5d0\uc11c \ub2e4\ud615\uc131\uc758 \uc7a5\uc810\n", - " - \ud615 \uc120\uc5b8\uc774 \uc5c6\ub2e4\ub294 \uc810\uc5d0\uc11c \ud30c\uc774\uc36c\uc5d0\uc11c\ub294 \ub2e4\ud615\uc131\uc744 \uc801\uc6a9\ud558\uae30\uac00 \ub354\uc6b1 \uc6a9\uc774\ud558\ub2e4.\n", - " - \uc2e4\uc2dc\uac04\uc73c\ub85c \uac1d\uccb4\uc758 \ud615\uc774 \uacb0\uc815\ub418\ubbc0\ub85c \ub2e8 \ud558\ub098\uc758 \uba54\uc18c\ub4dc\uc5d0 \uc758\ud574 \ucc98\ub9ac\ub420 \uc218 \uc788\ub294 \uac1d\uccb4\uc758 \uc885\ub958\uc5d0 \uc81c\ud55c\uc774 \uc5c6\ub2e4.\n", - " - \uc989, \ub2e4\ub978 \uc5b8\uc5b4\ubcf4\ub2e4 \ucf54\ub4dc\uc758 \uc591\uc774 \ub354\uc6b1 \uc904\uc5b4\ub4e0\ub2e4." + } + ], + "source": [ + "class Super:\n", + " def __init__(self):\n", + " print 'Super init called'\n", + " \n", + "class Sub(Super):\n", + " pass\n", + "\n", + "s = Sub()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 메쏘드의 대치 (메소드 오버라이드 - Override)\n", + "- 서브 클래스에서 슈퍼 클래스에 정의된 메소드를 재정의하여 대치하는 기능" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Animal:\n", - " def cry(self):\n", - " print '...'\n", - " \n", - "class Dog(Animal):\n", - " def cry(self):\n", - " print '\uba4d\uba4d'\n", - " \n", - "class Duck(Animal):\n", - " def cry(self):\n", - " print '\uaf65\uaf65'\n", - " \n", - "class Fish(Animal):\n", - " pass\n", - "\n", - "for each in (Dog(), Duck(), Fish()):\n", - " each.cry()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\uba4d\uba4d\n", - "\uaf65\uaf65\n", - "...\n" - ] - } - ], - "prompt_number": 57 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uacfc \ud074\ub798\uc2a4\uc758 \ud1b5\uc77c\n", - "***\n", - "- \ub0b4\uc7a5 \uc790\ub8cc\ud615(list, dict, tuple, string)\uc744 \uc0c1\uc18d\ud558\uc5ec \uc0ac\uc6a9\uc790 \ud074\ub798\uc2a4\ub97c \uc815\uc758\ud558\ub294 \uac83\n", - " - \ub0b4\uc7a5 \uc790\ub8cc\ud615\uacfc \uc0ac\uc6a9\uc790 \uc790\ub8cc\ud615\uc758 \ucc28\uc774\ub97c \uc5c6\uc5d0\uace0 \ud1b5\uc77c\ub41c \uad00\uc810\uc73c\ub85c \ubaa8\ub4e0 \uac1d\uccb4\ub97c \ub2e4\ub8f0 \uc218 \uc788\ub294 \ubc29\uc548\n", - "- \ud074\ub798\uc2a4 \uc815\uc758\ub294 \uc0c8\ub85c\uc6b4 \uc790\ub8cc\ud615\uc758 \uc815\uc758\uc784" + } + ], + "source": [ + "class Person:\n", + " def __init__(self, name, phone=None):\n", + " self.name = name\n", + " self.phone = phone\n", + " def __str__(self):\n", + " return '' % (self.name, self.phone)\n", + " \n", + "class Employee(Person):\n", + " def __init__(self, name, phone, position, salary):\n", + " Person.__init__(self, name, phone)\n", + " self.position = position\n", + " self.salary = salary\n", + " \n", + "p1 = Person('gslee', 5284)\n", + "m1 = Employee('kslee', 5224, 'President', 500)\n", + "\n", + "print p1\n", + "print m1" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ub9ac\uc2a4\ud2b8 \uc11c\ube0c \ud074\ub798\uc2a4 \ub9cc\ub4e4\uae30" + } + ], + "source": [ + "class Employee(Person):\n", + " def __init__(self, name, phone, position, salary):\n", + " Person.__init__(self, name, phone)\n", + " self.position = position\n", + " self.salary = salary\n", + " def __str__(self):\n", + " return '' % (self.name, self.phone, self.position, self.salary)\n", + " \n", + "p1 = Person('gslee', 5284)\n", + "m1 = Employee('kslee', 5224, 'President', 500)\n", + "\n", + "print p1\n", + "print m1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 다형성(Polymorphism)\n", + "- 상속 관계 내의 다른 클래스들의 인스턴스들이 같은 멤버 함수 호출에 대해 각각 다르게 반응하도록 하는 기능\n", + " - 연산자 오버로딩도 다형성을 지원하는 중요한 기술 \n", + " - 예를 들어, a와 b의 객체 형에 따라 a + b의 + 연산자 행동 방식이 변경되는 것\n", + "\n", + "- 다형성의 장점\n", + " - 적은 코딩으로 다양한 객체들에게 유사한 작업을 수행시킬 수 있음\n", + " - 프로그램 작성 코드 량이 줄어든다.\n", + " - 코드의 가독성을 높혀준다.\n", + " \n", + "- 파이썬에서 다형성의 장점\n", + " - 형 선언이 없다는 점에서 파이썬에서는 다형성을 적용하기가 더욱 용이하다.\n", + " - 실시간으로 객체의 형이 결정되므로 단 하나의 메소드에 의해 처리될 수 있는 객체의 종류에 제한이 없다.\n", + " - 즉, 다른 언어보다 코드의 양이 더욱 줄어든다." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "멍멍\n", + "꽥꽥\n", + "...\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = list()\n", - "print a\n", - "print dir(a)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[]\n", - "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc544\ub798 \uc608\uc81c\ub294 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc778 list\ub97c \uc0c1\uc18d\ud558\uc5ec \ube84\uc148 \uc5f0\uc0b0(-)\uc744 \ucd94\uac00\ud568" + } + ], + "source": [ + "class Animal:\n", + " def cry(self):\n", + " print '...'\n", + " \n", + "class Dog(Animal):\n", + " def cry(self):\n", + " print '멍멍'\n", + " \n", + "class Duck(Animal):\n", + " def cry(self):\n", + " print '꽥꽥'\n", + " \n", + "class Fish(Animal):\n", + " pass\n", + "\n", + "for each in (Dog(), Duck(), Fish()):\n", + " each.cry()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 내장 자료형과 클래스의 통일\n", + "***\n", + "- 내장 자료형(list, dict, tuple, string)을 상속하여 사용자 클래스를 정의하는 것\n", + " - 내장 자료형과 사용자 자료형의 차이를 없에고 통일된 관점으로 모든 객체를 다룰 수 있는 방안\n", + "- 클래스 정의는 새로운 자료형의 정의임" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 리스트 서브 클래스 만들기" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n", + "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class MyList(list):\n", - " def __sub__(self, other): # '-' \uc5f0\uc0b0\uc790 \uc911\ubcf5 \ud568\uc218 \uc815\uc758\n", - " for x in other:\n", - " if x in self:\n", - " self.remove(x) # \uac01 \ud56d\ubaa9\uc744 \ud558\ub098\uc529 \uc0ad\uc81c\ud55c\ub2e4.\n", - " return self\n", - "\n", - "L = MyList([1, 2, 3, 'spam', 4, 5])\n", - "print L\n", - "print\n", + } + ], + "source": [ + "a = list()\n", + "print a\n", + "print dir(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래 예제는 내장 자료형인 list를 상속하여 뺄셈 연산(-)을 추가함" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 'spam', 4, 5]\n", "\n", - "L = L - ['spam', 4]\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2, 3, 'spam', 4, 5]\n", - "\n", - "[1, 2, 3, 5]\n" - ] - } - ], - "prompt_number": 51 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1) Stack \ud074\ub798\uc2a4 \uc815\uc758 \uc608\n", - "- \uc288\ud37c \ud074\ub798\uc2a4\ub85c list \ud074\ub798\uc2a4\ub97c \uc9c0\ub2cc\ub2e4.\n", - "- \uc989, list \ud074\ub798\uc2a4\ub97c \ud655\uc7a5\ud558\uc5ec Stack \ud074\ub798\uc2a4\ub97c \uc815\uc758\ud568" + "[1, 2, 3, 5]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Stack(list): # \ud074\ub798\uc2a4 \uc815\uc758\n", - " push = list.append\n", - " \n", - "s = Stack() # \uc778\uc2a4\ud134\uc2a4 \uc0dd\uc131\n", - "\n", - "s.push(4)\n", - "s.push(5)\n", - "print s\n", - "print\n", + } + ], + "source": [ + "class MyList(list):\n", + " def __sub__(self, other): # '-' 연산자 중복 함수 정의\n", + " for x in other:\n", + " if x in self:\n", + " self.remove(x) # 각 항목을 하나씩 삭제한다.\n", + " return self\n", + "\n", + "L = MyList([1, 2, 3, 'spam', 4, 5])\n", + "print L\n", + "print\n", + "\n", + "L = L - ['spam', 4]\n", + "print L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) Stack 클래스 정의 예\n", + "- 슈퍼 클래스로 list 클래스를 지닌다.\n", + "- 즉, list 클래스를 확장하여 Stack 클래스를 정의함" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4, 5]\n", "\n", - "s = Stack([1,2,3])\n", - "s.push(4)\n", - "s.push(5)\n", - "print s\n", - "print\n", + "[1, 2, 3, 4, 5]\n", "\n", - "print s.pop() # \uc288\ud37c \ud074\ub798\uc2a4\uc778 \ub9ac\uc2a4\ud2b8 \ud074\ub798\uc2a4\uc758 pop() \uba54\uc18c\ub4dc \ud638\ucd9c\n", - "print s.pop()\n", - "print s" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[4, 5]\n", - "\n", - "[1, 2, 3, 4, 5]\n", - "\n", - "5\n", - "4\n", - "[1, 2, 3]\n" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2) Queue \ud074\ub798\uc2a4 \uc815\uc758 \uc608\n", - "- \uc288\ud37c \ud074\ub798\uc2a4\ub85c \uc5ed\uc2dc list\ub97c \uc9c0\ub2cc\ub2e4.\n", - "- \uc989, list \ud074\ub798\uc2a4\ub97c \ud655\uc7a5\ud558\uc5ec Queue \ud074\ub798\uc2a4\ub97c \uc815\uc758\ud568 " + "5\n", + "4\n", + "[1, 2, 3]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class Queue(list):\n", - " enqueue = list.append\n", - " def dequeue(self):\n", - " return self.pop(0)\n", - " \n", - "q = Queue()\n", - "q.enqueue(1) # \ub370\uc774\ud130 \ucd94\uac00\n", - "q.enqueue(2)\n", - "print q\n", - "\n", - "print q.dequeue() # \ub370\uc774\ud130 \uaebc\ub0b4\uae30\n", - "print q.dequeue()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[1, 2]\n", - "1\n", - "2\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \uc0ac\uc804 \uc11c\ube0c \ud074\ub798\uc2a4 \ub9cc\ub4e4\uae30" + } + ], + "source": [ + "class Stack(list): # 클래스 정의\n", + " push = list.append\n", + " \n", + "s = Stack() # 인스턴스 생성\n", + "\n", + "s.push(4)\n", + "s.push(5)\n", + "print s\n", + "print\n", + "\n", + "s = Stack([1,2,3])\n", + "s.push(4)\n", + "s.push(5)\n", + "print s\n", + "print\n", + "\n", + "print s.pop() # 슈퍼 클래스인 리스트 클래스의 pop() 메소드 호출\n", + "print s.pop()\n", + "print s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) Queue 클래스 정의 예\n", + "- 슈퍼 클래스로 역시 list를 지닌다.\n", + "- 즉, list 클래스를 확장하여 Queue 클래스를 정의함 " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2]\n", + "1\n", + "2\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = dict()\n", - "print a\n", - "print dir(a)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{}\n", - "['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc544\ub798 \uc608\uc81c\ub294 keys() \uba54\uc18c\ub4dc\ub97c \uc815\ub82c\ub41c \ud0a4\uac12 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud558\ub3c4\ub85d \uc7ac\uc815\uc758\ud55c\ub2e4." + } + ], + "source": [ + "class Queue(list):\n", + " enqueue = list.append\n", + " def dequeue(self):\n", + " return self.pop(0)\n", + " \n", + "q = Queue()\n", + "q.enqueue(1) # 데이터 추가\n", + "q.enqueue(2)\n", + "print q\n", + "\n", + "print q.dequeue() # 데이터 꺼내기\n", + "print q.dequeue()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 사전 서브 클래스 만들기" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{}\n", + "['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class MyDict(dict):\n", - " def keys(self):\n", - " K = dict.keys(self) # \uc5b8\ubc14\uc6b4\ub4dc \uba54\uc18c\ub4dc \ud638\ucd9c --> K = self.keys() \ub77c\uace0 \ud638\ucd9c\ud558\uba74 \ubb34\ud55c \uc7ac\uadc0 \ud638\ucd9c\n", - " K.sort()\n", - " return K\n", - "\n", - "d = MyDict({'one':1, 'two':2, 'three':3})\n", - "print d.keys()\n", - "print\n", + } + ], + "source": [ + "a = dict()\n", + "print a\n", + "print dir(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래 예제는 keys() 메소드를 정렬된 키값 리스트를 반환하도록 재정의한다." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['one', 'three', 'two']\n", "\n", - "d2 = {'one':1, 'two':2, 'three':3}\n", - "print d2.keys()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['one', 'three', 'two']\n", - "\n", - "['three', 'two', 'one']\n" - ] - } - ], - "prompt_number": 56 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 3 \uc0c1\uc18d \uad00\uacc4\uc5d0 \uc788\ub294 \ud074\ub798\uc2a4\ub4e4\uc758 \uc815\ubcf4 \ud68d\ub4dd\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-1 \uac1d\uccb4\uac00 \uc5b4\ub5a4 \ud074\ub798\uc2a4\uc5d0 \uc18d\ud574 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uae30" + "['three', 'two', 'one']\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uac1d\uccb4\uc758 \uc790\ub8cc\ud615 \ube44\uad50 \ubc29\ubc95 I (\uc804\ud1b5\uc801 \ubc29\ubc95)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import types\n", - "\n", - "print type(123) == types.IntType\n", - "print type(123) == type(0)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uac1d\uccb4\uc758 \uc790\ub8cc\ud615 \ube44\uad50 \ubc29\ubc95 II (\uc0c8\ub85c\uc6b4 \ubc29\ubc95)\n", - " - isinstance() \ub0b4\uc7a5 \ud568\uc218\uc640 \uae30\ubcf8 \uac1d\uccb4 \ud074\ub798\uc2a4 \uc0ac\uc6a9" + } + ], + "source": [ + "class MyDict(dict):\n", + " def keys(self):\n", + " K = dict.keys(self) # 언바운드 메소드 호출 --> K = self.keys() 라고 호출하면 무한 재귀 호출\n", + " K.sort()\n", + " return K\n", + "\n", + "d = MyDict({'one':1, 'two':2, 'three':3})\n", + "print d.keys()\n", + "print\n", + "\n", + "d2 = {'one':1, 'two':2, 'three':3}\n", + "print d2.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 3 상속 관계에 있는 클래스들의 정보 획득\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-1 객체가 어떤 클래스에 속해 있는지 확인하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 객체의 자료형 비교 방법 I (전통적 방법)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print isinstance(123, int)\n", - "print int" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " True\n", - "\n" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc11c\ube0c \ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4\ub294 \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4\uc774\uae30\ub3c4 \ud558\ub2e4." + } + ], + "source": [ + "import types\n", + "\n", + "print type(123) == types.IntType\n", + "print type(123) == type(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 객체의 자료형 비교 방법 II (새로운 방법)\n", + " - isinstance() 내장 함수와 기본 객체 클래스 사용" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " True\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class A:\n", - " pass\n", - "\n", - "class B:\n", - " def f(self):\n", - " pass\n", - " \n", - "class C(B):\n", - " pass\n", - "\n", - "def check(obj):\n", - " print obj, '=>',\n", - " if isinstance(obj, A):\n", - " print 'A',\n", - " if isinstance(obj, B):\n", - " print 'B',\n", - " if isinstance(obj, C):\n", - " print 'C',\n", - " print\n", - " \n", - "a = A()\n", - "b = B()\n", - "c = C()\n", - "\n", - "check(a)\n", - "check(b)\n", - "check(c)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "<__main__.A instance at 0x10de34e60> => A\n", - "<__main__.B instance at 0x10de34e18> => B\n", - "<__main__.C instance at 0x10de34cf8> => B C\n" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3-2 \ud074\ub798\uc2a4 \uac04\uc758 \uc0c1\uc18d \uad00\uacc4 \uc54c\uc544\ub0b4\uae30\n", - "- issubclass() \ub0b4\uc7a5 \ud568\uc218 \ud65c\uc6a9" + } + ], + "source": [ + "print isinstance(123, int)\n", + "print int" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 서브 클래스의 인스턴스는 슈퍼 클래스의 인스턴스이기도 하다." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<__main__.A instance at 0x10de34e60> => A\n", + "<__main__.B instance at 0x10de34e18> => B\n", + "<__main__.C instance at 0x10de34cf8> => B C\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class A:\n", - " pass\n", - "\n", - "class B:\n", - " def f(self):\n", - " pass\n", - " \n", - "class C(B):\n", - " pass\n", - "\n", - "def check(obj):\n", - " print obj, '=>',\n", - " if issubclass(obj, A):\n", - " print 'A',\n", - " if issubclass(obj, B):\n", - " print 'B',\n", - " if issubclass(obj, C):\n", - " print 'C',\n", - " print\n", - " \n", - "check(A)\n", - "check(B)\n", - "check(C)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "__main__.A => A\n", - "__main__.B => B\n", - "__main__.C => B C\n" - ] - } - ], - "prompt_number": 20 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "class A:\n", + " pass\n", + "\n", + "class B:\n", + " def f(self):\n", + " pass\n", + " \n", + "class C(B):\n", + " pass\n", + "\n", + "def check(obj):\n", + " print obj, '=>',\n", + " if isinstance(obj, A):\n", + " print 'A',\n", + " if isinstance(obj, B):\n", + " print 'B',\n", + " if isinstance(obj, C):\n", + " print 'C',\n", + " print\n", + " \n", + "a = A()\n", + "b = B()\n", + "c = C()\n", + "\n", + "check(a)\n", + "check(b)\n", + "check(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3-2 클래스 간의 상속 관계 알아내기\n", + "- issubclass() 내장 함수 활용" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__main__.A => A\n", + "__main__.B => B\n", + "__main__.C => B C\n" ] } ], - "metadata": {} + "source": [ + "class A:\n", + " pass\n", + "\n", + "class B:\n", + " def f(self):\n", + " pass\n", + " \n", + "class C(B):\n", + " pass\n", + "\n", + "def check(obj):\n", + " print obj, '=>',\n", + " if issubclass(obj, A):\n", + " print 'A',\n", + " if issubclass(obj, B):\n", + " print 'B',\n", + " if issubclass(obj, C):\n", + " print 'C',\n", + " print\n", + " \n", + "check(A)\n", + "check(B)\n", + "check(C)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.0" } - ] -} \ No newline at end of file + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python3.6/python20.ipynb b/python3.6/python20.ipynb index 6d5cd99..fef1a08 100644 --- a/python3.6/python20.ipynb +++ b/python3.6/python20.ipynb @@ -32,78 +32,147 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n", + "

메소드(Method)

\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "\n", "\n", + "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", @@ -112,8 +181,10 @@ }, { "cell_type": "code", - "execution_count": 75, - "metadata": {}, + "execution_count": 13, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -124,7 +195,11 @@ "\n", "20\n", "\n", - "30\n" + "30\n", + "\n", + "45\n", + "\n", + "450\n" ] } ], @@ -136,6 +211,11 @@ " return str(self.i)\n", " def __add__(self, other):\n", " return self.i + other\n", + " def __sub__(self, other):\n", + " return self.i - other\n", + " def __mul__(self, other):\n", + " return self.i * other\n", + "\n", "\n", "i = Integer(10)\n", "print(i)\n", @@ -147,23 +227,32 @@ "\n", "print()\n", "i += 10\n", + "print(i)\n", + "\n", + "print()\n", + "i += 15\n", + "print(i)\n", + "\n", + "print()\n", + "i *= 10\n", "print(i)" ] }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, + "execution_count": 4, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "TypeError", - "evalue": "unsupported operand type(s) for /: 'MyString' and 'str'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMyString\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"abcd_abcd_abcd\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_a\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for /: 'MyString' and 'str'" + "name": "stdout", + "output_type": "stream", + "text": [ + "['abcd', 'abcd', 'abcd']\n", + "['abcd', 'bcd', 'bcd']\n", + "\n", + "['abcd', 'abcd', 'abcd']\n" ] } ], @@ -172,7 +261,7 @@ "class MyString:\n", " def __init__(self, str):\n", " self.str = str\n", - " def __div__(self, sep): # 나누기 연산자 /가 사용되었을 때 호출되는 함수 \n", + " def __truediv__(self, sep): # 나누기 연산자 /가 사용되었을 때 호출되는 함수 \n", " return self.str.split(sep) # 문자열 self.str을 sep를 기준으로 분리\n", "\n", "m = MyString(\"abcd_abcd_abcd\")\n", @@ -180,13 +269,15 @@ "print(m / \"_a\")\n", "\n", "print()\n", - "print(m.__div__(\"_\"))" + "print(m.__truediv__(\"_\"))" ] }, { "cell_type": "code", "execution_count": 85, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -225,18 +316,20 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, + "execution_count": 6, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "TypeError", - "evalue": "unsupported operand type(s) for /: 'MyString' and 'str'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMyString\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"abcd_abcd_abcd\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_a\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for /: 'MyString' and 'str'" + "name": "stdout", + "output_type": "stream", + "text": [ + "['abcd', 'abcd', 'abcd']\n", + "['abcd', 'bcd', 'bcd']\n", + "\n", + "['abcd', 'abcd', 'abcd']\n", + "['abcd', 'bcd', 'bcd']\n" ] } ], @@ -245,9 +338,9 @@ "class MyString:\n", " def __init__(self, str):\n", " self.str = str\n", - " def __div__(self, sep):\n", + " def __truediv__(self, sep):\n", " return str.split(self.str, sep)\n", - " __rdiv__ = __div__\n", + " __rtruediv__ = __truediv__\n", "\n", "m = MyString(\"abcd_abcd_abcd\")\n", "print(m / \"_\")\n", @@ -260,7 +353,9 @@ { "cell_type": "code", "execution_count": 87, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -275,7 +370,7 @@ } ], "source": [ - "#python2.x\n", + "b#python2.x\n", "class MyString:\n", " def __init__(self, str):\n", " self.str = str\n", @@ -293,8 +388,10 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, + "execution_count": 9, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -309,9 +406,6 @@ "class MyString:\n", " def __init__(self, str):\n", " self.str = str\n", - " def __div__(self, sep):\n", - " return str.split(self.str, sep)\n", - " __rdiv__ = __div__\n", " def __neg__(self):\n", " t = list(self.str)\n", " t.reverse()\n", @@ -323,6 +417,50 @@ "print(~m)" ] }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "aaaa\n", + "bbbb\n", + "('aaaa', 'cccc')\n", + "\n", + "aaaa\n", + "bbbb\n", + "('aaaa', 'cccc')\n" + ] + } + ], + "source": [ + "class MyString:\n", + " def __init__(self, str):\n", + " self.str = str\n", + " def __floordiv__(self, sep): \n", + " return self.str.split(sep)[0]\n", + " def __mod__(self, sep):\n", + " return self.str.split(sep)[1]\n", + " def __divmod__(self, sep):\n", + " seperated_list = self.str.split(sep)\n", + " return seperated_list[0], seperated_list[-1] \n", + " \n", + "m = MyString(\"aaaa_bbbb_cccc\")\n", + "print(m // \"_\")\n", + "print(m % \"_\")\n", + "print(divmod(m, \"_\"))\n", + "\n", + "print()\n", + "print(m.__floordiv__(\"_\"))\n", + "print(m.__mod__(\"_\"))\n", + "print(m.__divmod__(\"_\"))" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -338,7 +476,7 @@ "\n", "|메소드 |연산자 | 비고 |\n", "|--------|----|----|\n", - "|\\_\\_cmp\\_\\_(self, other) | 아래 메소드가 부재한 상황에 호출되는 메소드| |\n", + "|\\_\\_cmp\\_\\_(self, other) | 아래 메소드가 부재한 상황에 호출되는 메소드| python3.x 에서는 지원하지 않음 |\n", "|\\_\\_lt\\_\\_(self, other) | self < other | |\n", "|\\_\\_le\\_\\_(self, other) | self <= other | |\n", "|\\_\\_eq\\_\\_(self, other) | self == other | |\n", @@ -347,153 +485,139 @@ "|\\_\\_ge\\_\\_(self, other) | self >= other | |" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 객체 c에 대한 c > 1연산의 행동 방식\n", - " - c.\\_\\_gt\\_\\_()가 있다면 호출 결과을 그대로 반환\n", - " - 정의된 c.\\_\\_gt\\_\\_()가 없고, \\_\\_cmp\\_\\_() 함수가 있을 경우\n", - " - c.\\_\\_cmp\\_\\_() 호출 결과가 양수이면 True 반환, 아니면 False 반환" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'>' not supported between instances of 'MyCmp' and 'int'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMyCmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# c.__cmp__(1)을 호출, 반환값이 양수이어야 True\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# c.__cmp__(1)을 호출, 반환값이 음수이어야 True\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# c.__cmp__(1)을 호출, 반환값이 0이어야 True\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: '>' not supported between instances of 'MyCmp' and 'int'" - ] - } - ], - "source": [ - "#python3.x\n", - "class MyCmp:\n", - " def __cmp__(self, y):\n", - " return 1 - y\n", - " \n", - "c = MyCmp() \n", - "print(c > 1) # c.__cmp__(1)을 호출, 반환값이 양수이어야 True\n", - "print(c < 1) # c.__cmp__(1)을 호출, 반환값이 음수이어야 True\n", - "print(c == 1) # c.__cmp__(1)을 호출, 반환값이 0이어야 True" - ] - }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, + "execution_count": 33, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "True\n", + "True\n", "False\n", "False\n", + "\n", + "False\n", "True\n" ] } ], - "source": [ - "#python2.x\n", - "class MyCmp:\n", - " def __cmp__(self, y):\n", - " return 1 - y\n", - " \n", - "c = MyCmp() \n", - "print c > 1 # c.__cmp__(1)을 호출, 반환값이 양수이어야 True\n", - "print c < 1 # c.__cmp__(1)을 호출, 반환값이 음수이어야 True\n", - "print c == 1 # c.__cmp__(1)을 호출, 반환값이 0이어야 True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 객체 m에 대한 m < 10연산의 행동 방식\n", - " - m.\\_\\_lt\\_\\_()가 있다면 호출 결과을 그대로 반환\n", - " - 정의된 m.\\_\\_lt\\_\\_()가 없고, \\_\\_cmp\\_\\_() 함수가 있을 경우\n", - " - m.\\_\\_cmp\\_\\_() 호출 결과가 음수이면 True 반환, 아니면 False 반환" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "True\n", - "False\n" - ] - } - ], "source": [ "#python3.x\n", - "class MyCmp2:\n", + "class MyInteger:\n", + " def __init__(self, i):\n", + " self.i = i\n", + " def __gt__(self, y):\n", + " return self.i > y\n", + " def __ge__(self, y):\n", + " return self.i >= y \n", " def __lt__(self, y):\n", - " return 1 < y\n", - "\n", - "m = MyCmp2()\n", - "print(m < 10) # m.__lt__(10)을 호출\n", - "print(m < 2)\n", - "print(m < 1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 객체 m에 대한 m == 10연산의 행동 방식\n", - " - m.\\_\\_eq\\_\\_()가 있다면 호출 결과을 그대로 반환\n", - " - 정의된 m.\\_\\_eq\\_\\_()가 없고, \\_\\_cmp\\_\\_() 함수가 있을 경우\n", - " - m.\\_\\_cmp\\_\\_() 호출 결과가 0이면 True 반환, 아니면 False 반환" + " return self.i < y \n", + " def __le__(self, y):\n", + " return self.i <= y \n", + " def __eq__(self, y):\n", + " return self.i == y\n", + " def __ne__(self, y):\n", + " return self.i != y \n", + " \n", + "c = MyInteger(10)\n", + "print(c > 1)\n", + "print(c >= 1)\n", + "print(c < 1) \n", + "print(c <= 1)\n", + "print()\n", + "print(c == 1) \n", + "print(c != 1)" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, + "execution_count": 35, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n", + "False\n", + "True\n", "True\n", + "\n", + "False\n", "True\n" ] } ], "source": [ - "#python2.x\n", - "class MyCmp3:\n", + "#python3.x\n", + "class MyInteger:\n", + " def __init__(self, i):\n", + " self.i = i\n", + " def __gt__(self, y):\n", + " if isinstance(y, MyInteger):\n", + " return self.i > y.i\n", + " elif isinstance(y, int):\n", + " return self.i > y\n", + " else:\n", + " return False\n", + " \n", + " def __ge__(self, y):\n", + " if isinstance(y, MyInteger):\n", + " return self.i >= y.i\n", + " elif isinstance(y, int):\n", + " return self.i >= y\n", + " else:\n", + " return False\n", + " \n", + " def __lt__(self, y):\n", + " if isinstance(y, MyInteger):\n", + " return self.i < y.i\n", + " elif isinstance(y, int):\n", + " return self.i < y\n", + " else:\n", + " return False\n", + " \n", + " def __le__(self, y):\n", + " if isinstance(y, MyInteger):\n", + " return self.i <= y.i\n", + " elif isinstance(y, int):\n", + " return self.i <= y\n", + " else:\n", + " return False\n", + " \n", " def __eq__(self, y):\n", - " return 1 == y\n", - "\n", - "m = MyCmp3()\n", - "print m == 10 # m.__eq__(10)을 호출\n", - "m1 = MyCmp3()\n", - "print m == 1\n", + " if isinstance(y, MyInteger):\n", + " return self.i == y.i\n", + " elif isinstance(y, int):\n", + " return self.i == y\n", + " else:\n", + " return False\n", + " \n", + " def __ne__(self, y):\n", + " if isinstance(y, MyInteger):\n", + " return self.i != y.i\n", + " elif isinstance(y, int):\n", + " return self.i != y\n", + " else:\n", + " return False\n", + " \n", + "c = MyInteger(10)\n", + "d = MyInteger(100)\n", "\n", - "class MyCmp4:\n", - " def __init__(self, value):\n", - " self.value = value\n", - " def __cmp__(self, other):\n", - " if self.value == other:\n", - " return 0\n", - "m2 = MyCmp4(10)\n", - "print m2 == 10" + "print(c > d)\n", + "print(c >= d)\n", + "print(c < d) \n", + "print(c <= d)\n", + "print()\n", + "print(c == d) \n", + "print(c != d)" ] }, { @@ -546,48 +670,33 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "execution_count": 47, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 8)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m8\u001b[0m\n\u001b[0;31m raise IndexError, k\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "\n", + "0\n", + "1\n", + "16\n", + "81\n" ] - } - ], - "source": [ - "#python3.x\n", - "class Square:\n", - " def __init__(self, end):\n", - " self.end = end\n", - " def __len__(self):\n", - " return self.end\n", - " def __getitem__(self, k):\n", - " if k < 0 or self.end <= k: \n", - " raise IndexError, k\n", - " return k * k\n", - " \n", - "s1 = Square(10)\n", - "print(len(s1)) # s1.__len__()\n", - "print(s1[1]) #s1.__getitem__(1)\n", - "print(s1[4])\n", - "print(s1[20])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ + }, { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 9)", + "ename": "IndexError", + "evalue": "Out of Index - 20", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m9\u001b[0m\n\u001b[0;31m raise IndexError, k\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#s1.__getitem__(4)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#s1.__getitem__(9)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Out of Index - \"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mIndexError\u001b[0m: Out of Index - 20" ] } ], @@ -600,20 +709,25 @@ " return self.end\n", " def __getitem__(self, k):\n", " if k < 0 or self.end <= k: \n", - " raise IndexError, k\n", + " raise IndexError(\"Out of Index - \" + str(k))\n", " return k * k\n", " \n", "s1 = Square(10)\n", "print(len(s1)) # s1.__len__()\n", + "print()\n", + "print(s1[0]) #s1.__getitem__(0)\n", "print(s1[1]) #s1.__getitem__(1)\n", - "print(s1[4])\n", - "print(s1[20])\n" + "print(s1[4]) #s1.__getitem__(4)\n", + "print(s1[9]) #s1.__getitem__(9)\n", + "print(s1[20])" ] }, { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -664,8 +778,10 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, + "execution_count": 48, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -692,7 +808,9 @@ { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -725,14 +843,16 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, + "execution_count": 49, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "<__main__.MyDict object at 0x104476ef0>\n", + "<__main__.MyDict object at 0x10748c4e0>\n", "light\n", "darkness\n", "2\n" @@ -762,8 +882,10 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, + "execution_count": 50, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -830,7 +952,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -873,7 +997,9 @@ { "cell_type": "code", "execution_count": 18, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -915,7 +1041,9 @@ { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -945,19 +1073,48 @@ "# <__main__.StringRepr instance at 0x101d3f908>" ] }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100\n" + ] + } + ], + "source": [ + "class StringRepr:\n", + " def __init__(self, i = 10):\n", + " self.i = i\n", + " def __repr__(self):\n", + " return 'StringRepr(100)'\n", + "\n", + "s = StringRepr()\n", + "q = eval(repr(s))\n", + "print(q.i)" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3-2 호출 가능한 클래스 인스턴스 만들기\n", "- 클래스 인스턴스에 \\_\\_call\\_\\_ 메소드가 구현되어 있다면 해당 인스턴스는 함수와 같이 호출될 수 있다.\n", - " - 인슽너스 x에 대해 x(a1, a2, a3)와 같이 호출된다면 x.\\_\\_call\\_\\_(a1, a2, a3)가 호출된다." + " - 인스턴스 x에 대해 x(a1, a2, a3)와 같이 호출된다면 x.\\_\\_call\\_\\_(a1, a2, a3)가 호출된다." ] }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, + "execution_count": 58, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -994,8 +1151,10 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, + "execution_count": 59, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1019,6 +1178,7 @@ "class B:\n", " def func(self, v):\n", " return v\n", + " \n", "class A:\n", " def __call__(self, v):\n", " return v\n", @@ -1056,7 +1216,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/python21.ipynb b/python3.6/python21.ipynb index 9927e93..6094772 100644 --- a/python3.6/python21.ipynb +++ b/python3.6/python21.ipynb @@ -86,7 +86,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -135,7 +137,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -167,7 +171,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -201,7 +207,9 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -233,7 +241,9 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -268,7 +278,9 @@ { "cell_type": "code", "execution_count": 9, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -318,7 +330,9 @@ { "cell_type": "code", "execution_count": 10, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -372,7 +386,9 @@ { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -399,7 +415,9 @@ { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -439,7 +457,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -489,7 +509,9 @@ { "cell_type": "code", "execution_count": 14, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -526,7 +548,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -552,32 +576,35 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, + "execution_count": 7, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "dict_keys(['one', 'two', 'three'])\n", + "dict_keys(['b', 'c', 'a'])\n", + "['b', 'c', 'a']\n", "\n", - "dict_keys(['one', 'two', 'three'])\n" + "['a', 'b', 'c']\n" ] } ], "source": [ "class MyDict(dict):\n", " def keys(self):\n", - " K = dict.keys(self) # 언바운드 메소드 호출 --> K = self.keys() 라고 호출하면 무한 재귀 호출\n", - " # K.sort()\n", - " sorted(K)\n", + " K = list(dict.keys(self)) # 언바운드 메소드 호출 --> K = self.keys() 라고 호출하면 무한 재귀 호출\n", + " K.sort()\n", " return K\n", "\n", - "d = MyDict({'one':1, 'two':2, 'three':3})\n", + "d = {'b':1, 'c':2, 'a':3}\n", "print(d.keys())\n", + "print(list(d.keys()))\n", "print()\n", "\n", - "d2 = {'one':1, 'two':2, 'three':3}\n", + "d2 = MyDict({'b':1, 'c':2, 'a':3})\n", "print(d2.keys())" ] }, @@ -606,8 +633,10 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, + "execution_count": 11, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -619,8 +648,7 @@ } ], "source": [ - "import types\n", - "\n", + "#import types\n", "# print(type(123) == types.IntType)\n", "print(type(123) == int)\n", "print(type(123) == type(0))" @@ -636,8 +664,10 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, + "execution_count": 12, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -662,20 +692,22 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, + "execution_count": 14, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "<__main__.A object at 0x1118a37f0> =>\n", + "<__main__.A object at 0x11085ff60> =>\n", "A\n", "\n", - "<__main__.B object at 0x1119b01d0> =>\n", + "<__main__.B object at 0x11092f1d0> =>\n", "B\n", "\n", - "<__main__.C object at 0x1119b0ac8> =>\n", + "<__main__.C object at 0x11085fd68> =>\n", "B\n", "C\n", "\n" @@ -696,11 +728,11 @@ "def check(obj):\n", " print(obj, '=>'),\n", " if isinstance(obj, A):\n", - " print('A'),\n", + " print('A')\n", " if isinstance(obj, B):\n", - " print('B'),\n", + " print('B')\n", " if isinstance(obj, C):\n", - " print('C'),\n", + " print('C')\n", " print()\n", " \n", "a = A()\n", @@ -722,8 +754,10 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, + "execution_count": 15, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -792,7 +826,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, From 69c93f66fb41ce02e5647e2791552b2fa5cd566f Mon Sep 17 00:00:00 2001 From: dohk Date: Tue, 5 Dec 2017 00:39:30 +0900 Subject: [PATCH 076/124] =?UTF-8?q?21=EB=B2=88=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python21.ipynb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python3.6/python21.ipynb b/python3.6/python21.ipynb index 6094772..9bbe4bd 100644 --- a/python3.6/python21.ipynb +++ b/python3.6/python21.ipynb @@ -80,7 +80,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![inheritance](images/inheritance2.png)" + "![inheritance](../images/inheritance2.png)" ] }, { @@ -811,8 +811,9 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, @@ -826,7 +827,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.5.2" } }, "nbformat": 4, From b67353f8aada8dcb585b85e5a23a71b818f73f38 Mon Sep 17 00:00:00 2001 From: dohyung Date: Thu, 7 Dec 2017 10:31:54 +0900 Subject: [PATCH 077/124] =?UTF-8?q?171207=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/python19.ipynb | 14 ++++++++++---- python3.6/python21.ipynb | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/python3.6/python19.ipynb b/python3.6/python19.ipynb index 21c2dce..a67dd8d 100644 --- a/python3.6/python19.ipynb +++ b/python3.6/python19.ipynb @@ -130,7 +130,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "class Simple:\n", @@ -195,7 +197,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "del s1.stack # s1에서 stack삭제" @@ -230,7 +234,9 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "class MyClass:\n", @@ -320,7 +326,7 @@ "\n", "c = MyClass()\n", "s1 = Simple()\n", - "MyClass.set(s1, 'egg') # 다른 클래스의 인스턴스를 넣어주면 에러 발생" + "MyClass.set(s1, 'egg') # 다른 클래스의 인스턴스를 넣어주어도 에러가 발생하지 않음" ] }, { diff --git a/python3.6/python21.ipynb b/python3.6/python21.ipynb index 9927e93..0262dab 100644 --- a/python3.6/python21.ipynb +++ b/python3.6/python21.ipynb @@ -694,7 +694,7 @@ " pass\n", "\n", "def check(obj):\n", - " print(obj, '=>'),\n", + " print(obj, '=>', end=\" \")\n", " if isinstance(obj, A):\n", " print('A'),\n", " if isinstance(obj, B):\n", @@ -754,7 +754,7 @@ " pass\n", "\n", "def check(obj):\n", - " print(obj, '=>'),\n", + " print(obj, '=>', end=\" \")\n", " if issubclass(obj, A):\n", " print('A'),\n", " if issubclass(obj, B):\n", From 35717e82785774f21dd396a759eb366d93b6f134 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 11 Dec 2017 23:47:23 +0900 Subject: [PATCH 078/124] no message --- python3.6/python22.ipynb | 370 +++++++++++++++++++++++---------------- python3.6/python23.ipynb | 240 +++++++++++++++---------- python3.6/t.txt | 1 + 3 files changed, 374 insertions(+), 237 deletions(-) create mode 100644 python3.6/t.txt diff --git a/python3.6/python22.ipynb b/python3.6/python22.ipynb index eff2289..f3321b7 100644 --- a/python3.6/python22.ipynb +++ b/python3.6/python22.ipynb @@ -74,7 +74,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -111,15 +113,17 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "<__main__.C object at 0x1100ef588>\n", - "<__main__.C object at 0x1100ef588>\n", + "\n", + "<__main__.C object at 0x1083f0f28>\n", + "<__main__.C object at 0x1083f0f28>\n", "1\n", "\n", "None\n" @@ -132,7 +136,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# None을 리턴한다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 속성도 참조할 수 없다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# None을 리턴한다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 속성도 참조할 수 없다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'a'" ] } @@ -160,7 +164,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -169,7 +175,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'one'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'two'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mwd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mweakref\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mref\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'one'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'two'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mwd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mweakref\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mref\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: cannot create weak reference to 'dict' object" ] } @@ -192,7 +198,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -201,8 +209,8 @@ "refcount - 2\n", "refcount - 2\n", "\n", - "<__main__.C object at 0x1100fab00>\n", - "<__main__.C object at 0x1100fab00>\n", + "<__main__.C object at 0x10847ce10>\n", + "<__main__.C object at 0x10847ce10>\n", "2\n" ] } @@ -227,14 +235,16 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", - "[, ]\n" + "[, ]\n" ] } ], @@ -278,17 +288,19 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, + "execution_count": 8, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "\n", + "\n", + "[(1, <__main__.C object at 0x10861f048>)]\n", "4\n", - "\n" + "[]\n" ] } ], @@ -303,11 +315,11 @@ "print(d)\n", "\n", "d[1] = c # 실제 객체에 대한 약한 참조 아이템 생성\n", - "print(d.items()) # 사전 내용 확인\n", + "print(list(d.items())) # 사전 내용 확인\n", "print(d[1].a) # 실제 객체의 속성 참조\n", "\n", "del c # 실제 객체 삭제\n", - "print(d.items()) # 약한 사전에 해당 객체 아이템도 제거되어 있음\n", + "print(list(d.items())) # 약한 사전에 해당 객체 아이템도 제거되어 있음\n", "\n", "#python2.x에서의 결과\n", "# \n", @@ -325,17 +337,19 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "execution_count": 9, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{}\n", - "dict_items([(1, <__main__.C object at 0x11024b710>)])\n", + "[(1, <__main__.C object at 0x10861f048>)]\n", "4\n", - "dict_items([(1, <__main__.C object at 0x11024b710>)])\n" + "[(1, <__main__.C object at 0x10861f048>)]\n" ] } ], @@ -349,11 +363,11 @@ "print(d)\n", "\n", "d[1] = c # 실제 객체에 대한 일반 참조 아이템 생성\n", - "print(d.items()) # 사전 내용 확인\n", + "print(list(d.items())) # 사전 내용 확인\n", "print(d[1].a) # 실제 객체의 속성 참조\n", "\n", "del c # 객체 삭제 (사전에 해당 객체의 레퍼런스가 있으므로 객체는 실제로 메모리 해제되지 않음)\n", - "print(d.items()) # 일반 사전에 해당 객체 아이템이 여전히 남아 있음" + "print(list(d.items())) # 일반 사전에 해당 객체 아이템이 여전히 남아 있음" ] }, { @@ -361,7 +375,7 @@ "metadata": {}, "source": [ "***\n", - "## 2 반복자\n", + "## 2 반복자 (Iterator)\n", "***" ] }, @@ -369,10 +383,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2-1 반복자 객체\n", + "### 2-1 반복자 (Iterlator) 객체\n", "- 반복자 객체\n", - " - next() 메소드를 지니고 있는 객체\n", - " - next() 메소드로 더 이상 자료를 념겨줄 수 없을 때 StopIteration 예외가 발생한다.\n", + " - next() 내장 함수에 대해 값을 반환할 수 있는 객체\n", + " - 정확하게는 내부적으로 \\_\\_next\\_\\_(self)를 지니고 있는 객체\n", + " - next() 내장 함수에 대해 더 이상 자료를 념겨줄 수 없을 때 StopIteration 예외를 발생시킴\n", "- 반복자 객체 생성 방법\n", " - iter(o) 내장 함수\n", " - 객체 o의 반복자 객체를 반환한다.\n", @@ -382,14 +397,16 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, + "execution_count": 12, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "1\n", "2\n", "3\n" @@ -402,19 +419,25 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m: " ] } ], "source": [ - "I = iter([1,2,3])\n", + "L = [1,2,3]\n", + "# print(next(L)) <-- 에러 발생\n", + "\n", + "I = iter(L)\n", "print(I)\n", "\n", + "# Python2에서는 반복자 객체에 직접 next() 메소드 호출\n", "# print(I.next())\n", "# print(I.next())\n", "# print(I.next())\n", "# print(I.next())\n", + "\n", + "# Python3에서는 next() 내장 함수 사용\n", "print(next(I))\n", "print(next(I))\n", "print(next(I))\n", @@ -430,8 +453,10 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, + "execution_count": 13, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -460,8 +485,10 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, + "execution_count": 14, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -498,8 +525,10 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, + "execution_count": 15, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -522,8 +551,10 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, + "execution_count": 16, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -545,8 +576,10 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, + "execution_count": 17, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -577,25 +610,31 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 내장 함수 iter(o)에 대응되는 \\_\\_iter\\_\\_(self)의 구현 \n", + "- 내장 함수 iter(o)에 대응되는 \\_\\_iter\\_\\_(self) 및 \\_\\_next\\_\\_(self)의 구현 \n", " - 객체 o에 iter(o)를 호출하면 자동으로 \\_\\_iter\\_\\_(self) 함수 호출\n", - " - \\_\\_iter\\_\\_(self) 함수는 next() 함수를 지닌 반복자 객체를 반환해야 한다." + " - \\_\\_iter\\_\\_(self) 함수는 \\_\\_next\\_\\_(self) 함수를 지닌 반복자 객체를 반환해야 한다." ] }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, + "execution_count": 20, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "TypeError", - "evalue": "iter() returned non-iterator of type 'Seq'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mSeq\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'readme.txt'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# s 인스턴스가 next() 메소드를 지니고 있으므로 s 인스턴스 자체가 반복자임\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 17\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# 우선 __iter__() 메소드를 호출하여 반복자를 얻고, 반복자에 대해서 for ~ in 구문에 의하여 next() 메소드가 호출됨\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 18\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: iter() returned non-iterator of type 'Seq'" + "name": "stdout", + "output_type": "stream", + "text": [ + "abc\n", + "\n", + "def\n", + "\n", + "ghi\n", + "\n", + "<__main__.Seq object at 0x108630240>\n", + "['abc\\n', 'def\\n', 'ghi']\n", + "('abc\\n', 'def\\n', 'ghi')\n" ] } ], @@ -610,14 +649,14 @@ " # return n\n", " def __iter__(self):\n", " return self\n", - " def next(self):\n", + " def __next__(self):\n", " line = self.file.readline() # 한 라인을 읽는다.\n", " if not line: \n", " raise StopIteration # 읽을 수 없으면 예외 발생\n", " return line # 읽은 라인을 리턴한다.\n", " \n", "s = Seq('readme.txt') # s 인스턴스가 next() 메소드를 지니고 있으므로 s 인스턴스 자체가 반복자임 \n", - "for line in s: # 우선 __iter__() 메소드를 호출하여 반복자를 얻고, 반복자에 대해서 for ~ in 구문에 의하여 next() 메소드가 호출됨\n", + "for line in s: # 우선 __iter__() 메소드를 호출하여 반복자를 얻고, 반복자에 대해서 for ~ in 구문에 의하여 __next__() 메소드가 호출됨\n", " print(line),\n", "\n", "print()\n", @@ -631,7 +670,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -692,8 +733,10 @@ }, { "cell_type": "code", - "execution_count": 37, - "metadata": {}, + "execution_count": 22, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -715,8 +758,10 @@ }, { "cell_type": "code", - "execution_count": 38, - "metadata": {}, + "execution_count": 23, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -743,16 +788,17 @@ "- python2.x\n", " - d.iterkeys() 함수\n", " - 사전 d가 지닌 키에 대한 반복자 객체를 반환한다.\n", + "\n", "- python3.x\n", - " - iter(d.keys())\n", - " - 또는 six 모듈을 이용\n", - " - http://portingguide.readthedocs.io/en/latest/dicts.html" + " - iter(d.keys()) 사용" ] }, { "cell_type": "code", - "execution_count": 54, - "metadata": {}, + "execution_count": 31, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -763,16 +809,10 @@ } ], "source": [ - "for key in iter(d.keys()): # 키에 대한 반복자, d.iterkeys() 가 반환한 반복자에 대해 next() 함수가 순차적으로 불리워짐\n", + "#python3.x\n", + "for key in iter(d.keys()): # 키에 대한 반복자, iter(d.keys()) 가 반환한 반복자에 대해 __next__(self) 함수가 순차적으로 불리워짐\n", " print(key, end=\" \")\n", - " \n", - " \n", - "#또는\n", - "# import six\n", - "# for key in six.iterkeys(d): # 키에 대한 반복자, d.iterkeys() 가 반환한 반복자에 대해 next() 함수가 순차적으로 불리워짐\n", - "# print(key,end=\" \")\n", - " \n", - " \n", + " \n", "#python2.x\n", "# for key in d.iterkeys(): # 키에 대한 반복자, d.iterkeys() 가 반환한 반복자에 대해 next() 함수가 순차적으로 불리워짐\n", "# print(key,)" @@ -780,8 +820,10 @@ }, { "cell_type": "code", - "execution_count": 55, - "metadata": {}, + "execution_count": 32, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -793,32 +835,30 @@ } ], "source": [ - "\n", "keyset = iter(d.keys())\n", - "print(next(keyset)) # 반복자 객체는 항상 next() 메소드를 지니고 있음\n", + "print(next(keyset)) # 반복자 객체는 항상 next() 내장 함수에 값을 반환할 수 있음 (내부적으로 __next__(self) 호출)\n", "for key in keyset: # keyset 반복자에 대해 next() 메소드가 순차적으로 호출됨\n", - " print(key, end=\" \")\n", - " \n", - "#또는\n", - "# import six\n", - "# keyset = six.iterkeys(d)\n", - "# print(next(keyset)) # 반복자 객체는 항상 next() 메소드를 지니고 있음\n", - "# for key in keyset: # keyset 반복자에 대해 next() 메소드가 순차적으로 호출됨\n", - "# print(key, end=\" \")" + " print(key, end=\" \")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- d.itervalues() 함수\n", - " - 사전 d가 지닌 값에 대한 반복자 객체를 반환한다." + "- python2.x\n", + " - d.itervalues() 함수\n", + " - 사전 d가 지닌 값에 대한 반복자 객체를 반환한다.\n", + "\n", + "- python3.x\n", + " - iter(d.values()) 사용" ] }, { "cell_type": "code", - "execution_count": 56, - "metadata": {}, + "execution_count": 33, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -829,9 +869,10 @@ } ], "source": [ - "import six\n", - "for value in six.iteritems(d): # 값에 대한 반복자\n", - " print(value[1], end=\" \") \n", + "#python3.x\n", + "for key in iter(d.values()): # 키에 대한 반복자, iter(d.keys()) 가 반환한 반복자에 대해 __next__(self) 함수가 순차적으로 불리워짐\n", + " print(key, end=\" \")\n", + "\n", "#python2.x\n", "# for value in d.itervalues(): # 값에 대한 반복자\n", "# print(value,) " @@ -841,14 +882,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- d.iteritems() 함수\n", - " - 사전 d의 각 아이템에 대한 반복자 객체를 반환한다." + "- python2.x\n", + " - d.iteritems() 함수\n", + " - 사전 d가 지닌 (키, 값)에 대한 반복자 객체를 반환한다.\n", + "\n", + "- python3.x\n", + " - iter(d.items()) 사용" ] }, { "cell_type": "code", - "execution_count": 59, - "metadata": {}, + "execution_count": 35, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -863,9 +910,13 @@ } ], "source": [ - "import six\n", - "for key, value in six.iteritems(d): #(키,값)에 대한 반복자\n", - " print(key, value)" + "#python3.x\n", + "for key, value in iter(d.items()): # 키에 대한 반복자, iter(d.keys()) 가 반환한 반복자에 대해 __next__(self) 함수가 순차적으로 불리워짐\n", + " print(key, value)\n", + "\n", + "#python2.x\n", + "# for value in d.iteritems(): # 값에 대한 반복자\n", + "# print(key, value,) " ] }, { @@ -885,25 +936,27 @@ }, { "cell_type": "code", - "execution_count": 68, - "metadata": {}, + "execution_count": 38, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "AttributeError", - "evalue": "'_io.TextIOWrapper' object has no attribute 'next'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'readme.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"f.next()\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# f.next() 가 순차적으로 호출됨\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mAttributeError\u001b[0m: '_io.TextIOWrapper' object has no attribute 'next'" + "name": "stdout", + "output_type": "stream", + "text": [ + "f.next() - abc\n", + "\n", + "def\n", + "\n", + "ghi\n" ] } ], "source": [ "#python3.x\n", "f = open('readme.txt')\n", - "print(\"f.next()\", f.next())\n", + "print(\"f.next() - \", next(f))\n", "for line in f: # f.next() 가 순차적으로 호출됨\n", " print(line, ) " ] @@ -911,7 +964,9 @@ { "cell_type": "code", "execution_count": 21, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -997,7 +1052,9 @@ { "cell_type": "code", "execution_count": 72, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1044,7 +1101,9 @@ { "cell_type": "code", "execution_count": 75, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1056,7 +1115,7 @@ ], "source": [ "for i in generate_ints(5):\n", - " print(i,end=\" \")" + " print(i, end=\" \")" ] }, { @@ -1083,8 +1142,10 @@ }, { "cell_type": "code", - "execution_count": 76, - "metadata": {}, + "execution_count": 39, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1095,7 +1156,8 @@ } ], "source": [ - "print([k for k in range(100) if k % 5 == 0])" + "a = [k for k in range(100) if k % 5 == 0]\n", + "print(a)" ] }, { @@ -1110,14 +1172,16 @@ }, { "cell_type": "code", - "execution_count": 78, - "metadata": {}, + "execution_count": 41, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " at 0x1100bf6d0>\n", + " at 0x108633f68>\n", "0\n", "5\n", "10\n", @@ -1135,7 +1199,7 @@ "print(next(a))\n", "print(next(a))\n", "for i in a:\n", - " print(i,end=\" \")" + " print(i, end=\" \")" ] }, { @@ -1150,8 +1214,10 @@ }, { "cell_type": "code", - "execution_count": 79, - "metadata": {}, + "execution_count": 42, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1162,7 +1228,8 @@ } ], "source": [ - "print(sum((k for k in range(100) if k % 5 == 0)))" + "a = (k for k in range(100) if k % 5 == 0)\n", + "print(sum(a))" ] }, { @@ -1174,8 +1241,10 @@ }, { "cell_type": "code", - "execution_count": 81, - "metadata": {}, + "execution_count": 43, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1194,7 +1263,7 @@ "for k in fibonacci(): # 발생자를 직접 for ~ in 구문에 활용\n", " if k > 100: \n", " break\n", - " print(k,end=\" \")" + " print(k, end=\" \")" ] }, { @@ -1213,18 +1282,17 @@ }, { "cell_type": "code", - "execution_count": 85, - "metadata": {}, + "execution_count": 45, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "TypeError", - "evalue": "iter() returned non-iterator of type 'Odds'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mOdds\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mend\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: iter() returned non-iterator of type 'Odds'" + "name": "stdout", + "output_type": "stream", + "text": [ + "1 3 5 7 9 11 13 15 17 19 \n", + "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n" ] } ], @@ -1236,22 +1304,24 @@ " self.limit = limit # 한계 값\n", " def __iter__(self): # Odds 객체의 반복자를 반환하는 특수 함수\n", " return self\n", - " def next(self): # 반복자의 필수 함수\n", + " def __next__(self): # 반복자의 필수 함수\n", " self.data += 2\n", " if self.limit and self.limit <= self.data:\n", " raise StopIteration\n", " return self.data\n", "\n", "for k in Odds(20):\n", - " print(k,end=\" \")\n", + " print(k, end=\" \")\n", "print()\n", - "print(list(Odds(20))) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " + "print(list(Odds(20))) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 __next__(self)를 매번 호출하여 각 원소를 얻어온다. " ] }, { "cell_type": "code", "execution_count": 43, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1292,7 +1362,9 @@ { "cell_type": "code", "execution_count": 87, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1311,7 +1383,7 @@ " k += 2\n", " \n", "for k in odds(20):\n", - " print(k,end=\" \")\n", + " print(k, end=\" \")\n", "print()\n", "print(list(odds(20))) # list() 내장 함수가 발생자를 인수로 받으면 해당 발생자의 next()를 매번 호출하여 각 원소를 얻어온다. " ] @@ -1340,7 +1412,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/python23.ipynb b/python3.6/python23.ipynb index f8cc2c2..9e45050 100644 --- a/python3.6/python23.ipynb +++ b/python3.6/python23.ipynb @@ -45,7 +45,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "NameError", @@ -74,7 +76,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "ZeroDivisionError", @@ -107,7 +111,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "ZeroDivisionError", @@ -141,7 +147,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "TypeError", @@ -173,7 +181,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "IndexError", @@ -203,7 +213,9 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "KeyError", @@ -233,7 +245,9 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "FileNotFoundError", @@ -346,7 +360,9 @@ { "cell_type": "code", "execution_count": 9, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -372,15 +388,20 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, + "execution_count": 3, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 5)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m except ZeroDivisionError, msg:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "name": "stdout", + "output_type": "stream", + "text": [ + "float division by zero\n", + "10.0\n", + "5.0\n", + "3.3333333333333335\n", + "2.5\n" ] } ], @@ -390,8 +411,8 @@ " for n in range(0, 5):\n", " try:\n", " print(10.0 / n)\n", - " except ZeroDivisionError, msg:\n", - " print(msg)\n", + " except ZeroDivisionError as e:\n", + " print(e)\n", "\n", "division()" ] @@ -399,7 +420,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -435,7 +458,9 @@ { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "ename": "SyntaxError", @@ -466,15 +491,16 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, + "execution_count": 6, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 3)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m3\u001b[0m\n\u001b[0;31m except NameError, msg:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "name": "stdout", + "output_type": "stream", + "text": [ + "Error - name 'spam' is not defined\n" ] } ], @@ -482,14 +508,16 @@ "#python3.x\n", "try:\n", " spam()\n", - "except NameError, msg:\n", - " print('Error -', msg)" + "except NameError as e:\n", + " print('Error -', e)" ] }, { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -510,7 +538,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -536,15 +566,16 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, + "execution_count": 7, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 6)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m6\u001b[0m\n\u001b[0;31m except ZeroDivisionError, msg:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "name": "stdout", + "output_type": "stream", + "text": [ + "zero division error!!! - division by zero\n" ] } ], @@ -555,14 +586,16 @@ "\n", "try:\n", " zero_division()\n", - "except ZeroDivisionError, msg:\n", - " print('zero division error!!! -', msg)" + "except ZeroDivisionError as e:\n", + " print('zero division error!!! -', e)" ] }, { "cell_type": "code", "execution_count": 18, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -586,7 +619,9 @@ { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -619,7 +654,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -647,7 +684,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -688,15 +727,18 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, + "execution_count": 11, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 7)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m7\u001b[0m\n\u001b[0;31m except IOError, msg:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning/python3.6\n", + "1.0\n", + "Finally!!!\n" ] } ], @@ -708,14 +750,14 @@ "\n", "try:\n", " f = open(filename, 'r')\n", - "except IOError, msg:\n", - " print(msg)\n", + "except IOError as e:\n", + " print(e)\n", "else:\n", " a = float(f.readline())\n", " try:\n", " answer = 1.0 / a\n", - " except ZeroDivisionError, msg:\n", - " print(msg)\n", + " except ZeroDivisionError as e:\n", + " print(e)\n", " else:\n", " print(answer)\n", " finally:\n", @@ -726,7 +768,9 @@ { "cell_type": "code", "execution_count": 9, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -773,7 +817,9 @@ { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -803,7 +849,9 @@ { "cell_type": "code", "execution_count": 20, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -828,7 +876,9 @@ { "cell_type": "code", "execution_count": 20, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -871,7 +921,9 @@ { "cell_type": "code", "execution_count": 21, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -929,15 +981,17 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, + "execution_count": 13, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Exception occurs!\n", - "Exception occurs!\n" + "Big Exception occurs!\n", + "Big Exception occurs!\n" ] } ], @@ -959,7 +1013,7 @@ " try:\n", " f()\n", " except Big:\n", - " print(\"Exception occurs!\")" + " print(\"Big Exception occurs!\")" ] }, { @@ -967,38 +1021,43 @@ "metadata": {}, "source": [ "### 3-3 예외값 전달하기 \n", - "- raise 키워드 뒤에 예외와 함께, 추가 메시지를 함께 던질 수 있다." + "- raise 키워드 뒤에 예외와 함께, 추가 메시지를 함께 던질 수 있다. \n", + " - python3에서는 지원하지 않음\n", + "- python3에서는 예외의 생성자내에 메시지를 넣어서 예외 객체를 생성하여 던진다. " ] }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, + "execution_count": 14, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 2)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m raise Exception, 'message!!!'\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "name": "stdout", + "output_type": "stream", + "text": [ + "message!!!\n" ] } ], "source": [ "#python3.x\n", "def f():\n", - " raise Exception, 'message!!!'\n", + " raise Exception('message!!!')\n", " \n", "try:\n", " f()\n", - "except Exception, a:\n", - " print(a)" + "except Exception as e:\n", + " print(e)" ] }, { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1023,20 +1082,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 생성자 안에 넣어준 에러 메시지는 except 키워드 사용시에 두 번째 인자로 해당 메시지를 받을 수 있다." + "- 생성자 안에 넣어준 에러 메시지는 except 키워드 사용시에 두 번째 인자로 해당 메시지를 받을 수 있다.\n", + " - python3에서는 지원하지 않음\n", + "- python3에서는 예외 객체를 받아서 해당 객체의 \\_\\_str\\_\\_()을 호출하여 메시지를 얻는다." ] }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, + "execution_count": 15, + "metadata": { + "collapsed": false + }, "outputs": [ { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 7)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m7\u001b[0m\n\u001b[0;31m except ArithmeticError, v:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "name": "stdout", + "output_type": "stream", + "text": [ + "0으로 나누고 있습니다.\n" ] } ], @@ -1048,14 +1110,16 @@ " if b == 0:\n", " raise ArithmeticError('0으로 나누고 있습니다.')\n", " a / b\n", - "except ArithmeticError, v:\n", - " print(v)" + "except ArithmeticError as e:\n", + " print(e)" ] }, { "cell_type": "code", "execution_count": 28, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -1101,7 +1165,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/python3.6/t.txt b/python3.6/t.txt new file mode 100644 index 0000000..d3827e7 --- /dev/null +++ b/python3.6/t.txt @@ -0,0 +1 @@ +1.0 From 0f5e764fca1bcf2eb5ebb402c597cf63c61eeb30 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 19 Sep 2018 19:49:13 +0900 Subject: [PATCH 079/124] ... --- python3.6/python03.ipynb | 97 +++++++++++++--------- python3.6/python04.ipynb | 127 +++++++++++++++++++++-------- python3.6/supplement-2016-09.ipynb | 80 ++++++------------ 3 files changed, 173 insertions(+), 131 deletions(-) diff --git a/python3.6/python03.ipynb b/python3.6/python03.ipynb index 76453cb..d566ff6 100644 --- a/python3.6/python03.ipynb +++ b/python3.6/python03.ipynb @@ -52,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -65,8 +65,30 @@ ], "source": [ "import sys\n", - "# print sys.maxint \n", - "print(sys.maxsize) # 최대 정수 값 확인" + "# print sys.maxint <-- python2 에서만 동작\n", + "\n", + "print(sys.maxsize) # 최대 정수 값 확인\n", + "# https://docs.python.org/3/library/sys.html#sys.maxsize" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9223372036854775808\n", + "\n" + ] + } + ], + "source": [ + "a = 9223372036854775808\n", + "print(a)\n", + "print(type(a))" ] }, { @@ -78,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -86,7 +108,14 @@ "output_type": "stream", "text": [ " \n", - "1.2 3500.0 -2e-05\n" + "\n", + "1.2\n", + "3500.0\n", + "-2e-05\n", + "\n", + "1.200\n", + "3500.000\n", + "-0.00002000\n" ] } ], @@ -95,7 +124,14 @@ "b = 3.5e3\n", "c = -0.2e-4\n", "print(type(a), type(b), type(c))\n", - "print(a, b, c)" + "print()\n", + "print(a)\n", + "print(b)\n", + "print(c)\n", + "print()\n", + "print(\"{:5.3f}\".format(a))\n", + "print(\"{:5.3f}\".format(b))\n", + "print(\"{:10.8f}\".format(c))" ] }, { @@ -112,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -150,26 +186,6 @@ "print(type(h4))" ] }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "123456789012345678890" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "123456789012345678890 " - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -179,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -187,6 +203,8 @@ "output_type": "stream", "text": [ "(10+20j)\n", + "\n", + "\n", "(20+25j)\n" ] } @@ -194,6 +212,8 @@ "source": [ "a = 10 + 20j\n", "print(a)\n", + "print(type(a))\n", + "print()\n", "\n", "b = 10 + 5j\n", "print(a + b)" @@ -265,7 +285,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -283,9 +303,7 @@ "print(divmod(5, 2))\n", "print()\n", "print(pow(2, 3))\n", - "print(pow(2.3, 3.5))\n", - "# 18.4521691056\n", - "# 10자리 표현 -> 14자리 표현 가능" + "print(pow(2.3, 3.5))" ] }, { @@ -297,7 +315,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -327,7 +345,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -344,8 +362,7 @@ "\n", "degree = 60.0\n", "rad = math.pi * degree / 180.0 # 각도를 라디안으로 변환\n", - "print(math.sin(rad), math.cos(rad), math.tan(rad)) #sin, cos, tan)\n", - "# 0.866025403784 0.5 1.73205080757" + "print(math.sin(rad), math.cos(rad), math.tan(rad)) #sin, cos, tan" ] }, { @@ -614,21 +631,21 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "HelloWorld\n", + "Hello World\n", "HelloHelloHello\n", "------------------------------------------------------------\n" ] } ], "source": [ - "print('Hello' + '' + 'World')\n", + "print('Hello' + ' ' + 'World')\n", "print('Hello' * 3)\n", "print('-' * 60)" ] @@ -715,7 +732,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.5" } }, "nbformat": 4, diff --git a/python3.6/python04.ipynb b/python3.6/python04.ipynb index 0de2733..b9287d4 100644 --- a/python3.6/python04.ipynb +++ b/python3.6/python04.ipynb @@ -31,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -47,7 +47,9 @@ "[2, 3]\n", "\n", "[1, 2, 3, 1, 2, 3]\n", - "[1, 2, 3, 1, 2, 3, 1, 2, 3]\n" + "[1, 2, 3, 1, 2, 3, 1, 2, 3]\n", + "\n", + "[1, 2, 3]\n" ] } ], @@ -62,19 +64,21 @@ "print(L[1:3])\n", "print()\n", "print(L + L)\n", - "print(L * 3)" + "print(L * 3)\n", + "print()\n", + "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- 리스트는 변경 가능" + "- 리스트의 원소는 변경 가능" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -107,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -136,7 +140,8 @@ "metadata": {}, "source": [ "### 1-2 range() 함수를 통한 인덱스 리스트 생성\n", - "- range(k): 0부터 k-1까지의 range object를 반환함 " + "- range(k): 0부터 k-1까지의 range object를 반환함 (python3)\n", + " - python2 에서는 list 객체를 반환" ] }, { @@ -166,9 +171,6 @@ "print(L[::-1])\n", "print(4 in L)\n", "print()\n", - "# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", - "# [0, 2, 4, 6, 8]\n", - "# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n", "print(list(L))\n", "print(list(L)[::2])\n", "print(list(L)[::-1])" @@ -338,7 +340,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -353,9 +355,9 @@ ], "source": [ "d = {'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", - "print(d.keys()) # 키만 리스트로 추출함\n", - "print(d.values()) # 값만 리스트로 추출함\n", - "print(d.items()) # 키와 값의 튜플을 리스트로 반환함\n", + "print(d.keys()) # 키만 dict_keys 객체로 추출(Python3.6), 키만 리스트로 추출(Python2.7)\n", + "print(d.values()) # 값만 dict_values 객체로 추출(Python3.6), 값만 리스트로 추출(Python2.7)\n", + "print(d.items()) # 키와 값의 튜플을 dict_items 객체로 추출(Python 3.6), 키와 값의 튜플을 리스트로 반환함(Python2.7)\n", "\n", "# ['four', 'three', 'two', 'one']\n", "# ['net', 'set', 'dul', 1]\n", @@ -400,7 +402,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -425,7 +427,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -457,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -480,7 +482,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -495,7 +497,7 @@ } ], "source": [ - "print(type(None)) # NoneType 객체, 아무 값도 없다(혹은 아니다)를 나타내는 객체\n", + "print(type(None)) # NoneType 객체, 아무 값도 없음을 나타내는 객체\n", "print()\n", "a = None\n", "print(a)\n", @@ -523,18 +525,21 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "4405819792\n", - "4405819792\n", + "4469734928\n", + "4469734928\n", "\n", - "4372428800\n", - "4372428800\n" + "4430976352\n", + "4430976352\n", + "\n", + "4469735056\n", + "4469734448\n" ] } ], @@ -544,9 +549,18 @@ "print(id(a))\n", "print(id(b))\n", "print()\n", + "\n", + "# 작은 값의 정수는 계속하여 별도로 객체를 생성하지 않음\n", "x = 1\n", "y = 1\n", "print(id(x))\n", + "print(id(y))\n", + "print()\n", + "\n", + "# 작은 값의 정수는 별도로 객체를 생성\n", + "x = 1000000000000000000\n", + "y = 1000000000000000000\n", + "print(id(x))\n", "print(id(y))" ] }, @@ -559,7 +573,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -603,20 +617,63 @@ "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] } ], "source": [ "c = [1,2,3]\n", "d = [1,2,3]\n", - "c == d" + "print(c == d)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "x = 1\n", + "y = 1\n", + "print(x is y)\n", + "print(id(x) == id(y))\n", + "print(x == y)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "x = 900000000\n", + "y = 900000000\n", + "print(x is y)\n", + "print(id(x) == id(y))\n", + "print(x == y)" ] }, { @@ -643,7 +700,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.5" } }, "nbformat": 4, diff --git a/python3.6/supplement-2016-09.ipynb b/python3.6/supplement-2016-09.ipynb index 928d278..5737b56 100644 --- a/python3.6/supplement-2016-09.ipynb +++ b/python3.6/supplement-2016-09.ipynb @@ -2738,77 +2738,48 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1) 파이썬에서 지원하는 각종 타입들 알아보기" + "### 1) 레퍼런스 카운트 (Reference Count)와 쓰레기 수집 (Garbage Collection) " ] }, { "cell_type": "code", - "execution_count": 148, + "execution_count": 7, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['AsyncGeneratorType', 'BuiltinFunctionType', 'BuiltinMethodType', 'CodeType', 'CoroutineType', 'DynamicClassAttribute', 'FrameType', 'FunctionType', 'GeneratorType', 'GetSetDescriptorType', 'LambdaType', 'MappingProxyType', 'MemberDescriptorType', 'MethodType', 'ModuleType', 'SimpleNamespace', 'TracebackType', '_GeneratorWrapper', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_ag', '_calculate_meta', '_collections_abc', '_functools', 'coroutine', 'new_class', 'prepare_class']\n", - "34\n" - ] - } - ], - "source": [ - "import types\n", - "\n", - "print(dir(types))\n", - "print(len(dir(types)))" - ] - }, - { - "cell_type": "code", - "execution_count": 150, - "metadata": { - "collapsed": true - }, "outputs": [], "source": [ - "# print(type(123) is types.IntType)\n", - "# print(type(123.0) is types.FloatType)\n", - "# print(type('abc') is types.StringType)\n", - "# print(type([]) is types.ListType)\n", - "# print(type(()) is types.TupleType)\n", - "# print(type({}) is types.DictionaryType)" + "x = y = z = 100" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 2) 레퍼런스 카운트 (Reference Count)와 쓰레기 수집 (Garbage Collection) " + "![image](../images/referenceCount1.png)" ] }, { "cell_type": "code", - "execution_count": 151, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "x = y = z = 100" - ] - }, - { - "cell_type": "markdown", + "execution_count": 8, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n" + ] + } + ], "source": [ - "![image](../images/referenceCount1.png)" + "print(x is y)\n", + "print(y is z)" ] }, { "cell_type": "code", - "execution_count": 152, - "metadata": { - "collapsed": true - }, + "execution_count": 9, + "metadata": {}, "outputs": [], "source": [ "del x" @@ -2823,10 +2794,8 @@ }, { "cell_type": "code", - "execution_count": 153, - "metadata": { - "collapsed": true - }, + "execution_count": 10, + "metadata": {}, "outputs": [], "source": [ "y = 200\n", @@ -2850,7 +2819,7 @@ }, { "cell_type": "code", - "execution_count": 154, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -2894,8 +2863,7 @@ "4) [참고] turtle 모듈 활용하기\n", "- https://opentechschool.github.io/python-beginners/ko/simple_drawing.html\n", "- http://openbookproject.net/thinkcs/python/english3e/hello_little_turtles.html\n", - "- https://www.youtube.com/watch?v=vEkiaHtdwIk\n", - "- https://python-turtle-demo.googlecode.com/files/SevenWaysToUseTurtle-PyCon2009.pdf (죽은 링크)" + "- https://www.youtube.com/watch?v=vEkiaHtdwIk" ] }, { @@ -3578,7 +3546,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.5" } }, "nbformat": 4, From ebef5f5fc88fc15cd1b9144520154ad65ac55795 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 19 Sep 2018 19:56:07 +0900 Subject: [PATCH 080/124] ... --- python3.6/assignment-1.ipynb | 37 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb index 71f2a42..4c07a74 100644 --- a/python3.6/assignment-1.ipynb +++ b/python3.6/assignment-1.ipynb @@ -6,8 +6,8 @@ "source": [ "# Assignment 1\n", "### [정보]\n", - "#### 1) Due Date: 2017년 9월 25일 (월), 23시 59분\n", - "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.jupyter.org에 넣어서 산출된 URL을 EL사이트에 제출\n", + "#### 1) Due Date: 2018년 9월 30일 (일), 23시 59분\n", + "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github(추천), naver cloud, dropbox 등에 올리고, 올려진 파일의 URL을 다시 http://nbviewer.jupyter.org에 넣어서 산출된 URL을 EL사이트에 제출\n", "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 11개의 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", "#### 5) 참고: ACM-ICPC 3문제 정답 기재 방법\n", @@ -43,7 +43,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- a=\"Hello Python\" 문자열을 Slicing과 연결 연산자 (+)를 사용하여 \"Python Hello\"로 변경하시오.\n", + "1. a=\"Hello Python\" 문자열을 Slicing과 연결 연산자 (+)를 사용하여 \"Python Hello\"로 변경하시오.\n", " - [주의] a 변수 자체에 \"Python Hello\" 문자열이 저장되어야 함" ] }, @@ -51,7 +51,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- b=\"Hello Python World\" 문자열을 Slicing과 연결 연산자 (+)를 사용하여 \"World Python Hello\"로 변경하시오.\n", + "2. b=\"Hello Python World\" 문자열을 Slicing과 연결 연산자 (+)를 사용하여 \"World Python Hello\"로 변경하시오.\n", " - [주의] b 변수 자체에 \"Python Hello\" 문자열이 저장되어야 함 " ] }, @@ -59,7 +59,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- c=\"Hello\"를 \"olleH\"로 변경하시오\n", + "3. c=\"Hello\"를 \"olleH\"로 변경하시오\n", " - [주의] c 변수 자체에 \"olleH\" 문자열이 저장되어야 함" ] }, @@ -67,7 +67,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- s=\"python\"에 대해 다음 문제를 풀어보시오.\n", + "4. s=\"python\"에 대해 다음 문제를 풀어보시오.\n", " 1. s[0], s[0][0], s[0][0][0]은 각각 어떤 값이 나오는지 확인하고 그 이유를 나름대로 설명해 보시오.\n", " 2. s[-100], s[100]은 값이 나오는지 에러가 나오는지 확인하고 그 결과에 대한 이유를 나름대로 설명해 보시오.\n", " 3. s[-100, 100]은 값이 나오는지 에러가 나오는지 확인하고 그 결과에 대한 이유를 나름대로 설명해 보시오.\n", @@ -79,21 +79,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- for문을 활용하여 1부터 100사이의 홀수를 출력하시오." + "5. for문을 활용하여 1부터 100사이의 홀수를 출력하시오." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- while문을 활용하여 1부터 100사이의 짝수의 합을 계산하여 출력하시오." + "6. while문을 활용하여 1부터 100사이의 짝수의 합을 계산하여 출력하시오." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- 사용자로 부터 임의의 정수를 입력받고, 해당 숫자를 역순으로 출력하는 프로그램을 작성하시오. \n", + "7. 사용자로 부터 임의의 정수를 입력받고, 해당 숫자를 역순으로 출력하는 프로그램을 작성하시오. \n", "\n", " [실행 예]\n", " ```\n", @@ -106,14 +106,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 사용자로 부터 정수를 입력받아서 1부터 그 사이에 존재하는 소수 (Prime number)를 출력하는 파이썬 프로그램을 작성하시오." + "8. 사용자로 부터 정수를 입력받아서 1부터 그 사이에 존재하는 소수 (Prime number)를 출력하는 파이썬 프로그램을 작성하시오." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- [ACM-ICPC 문제 2439번] \n", + "9. [ACM-ICPC 문제 2439번] \n", " - 별찍기-2
\n", " https://www.acmicpc.net/problem/2439" ] @@ -122,7 +122,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [ACM-ICPC 문제 1924번] \n", + "10. [ACM-ICPC 문제 1924번] \n", " - 2007년
\n", "https://www.acmicpc.net/problem/1924" ] @@ -131,19 +131,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [ACM-ICPC 문제 11720번]\n", + "11. [ACM-ICPC 문제 11720번]\n", " - 숫자의 합
\n", " https://www.acmicpc.net/problem/11720" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { @@ -163,7 +154,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.5" } }, "nbformat": 4, From 3de067b65ee3eadd572a97166febd5b89824da2c Mon Sep 17 00:00:00 2001 From: gwondohyung Date: Wed, 19 Sep 2018 20:28:35 +0900 Subject: [PATCH 081/124] =?UTF-8?q?assignment-1=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-1.ipynb | 38 ++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb index 4c07a74..2e96749 100644 --- a/python3.6/assignment-1.ipynb +++ b/python3.6/assignment-1.ipynb @@ -12,14 +12,10 @@ "#### 4) 숙제이후 소감: 11개의 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", "#### 5) 참고: ACM-ICPC 3문제 정답 기재 방법\n", " - https://www.acmicpc.net 사이트 회원가입\n", - " - 반드시 본인 학번으로 회원가입(기가입자도 재가입)\n", - " - 이메일은 학교 이메일을 기입\n", - " - 회원가입 완료 후, [설정]->[학교/회사 정보]에 들어간 후 [학교/회사 정보 추가]란에 학교 정보 추가 후, 학교 이메일 인증을 거친 다음, 다시 백준 사이트로 돌아와서 새로고침 한 후, [학교/회사 정보]에 뜬 자신의 이메일 정보를 확인\n", - " - 정보 수정 -> 상태 메시지 란에 “스크립트 프로그래밍 1분반”을 입력.(조교가 과제 채점 시 해당 사이트에서 직접 확인합니다.)\n", - "
\n", + " - 반드시 본인 학번으로 회원가입(기가입자는 재가입)\n", "\n", - " - ACM-ICPC 문제의 정답 코드를 숙제 제출 리포트 내에 포함시키고\n", - " - https://www.acmicpc.net 사이트에 본인이 작성한 코드를 직접 제출하여 올바른 정답임을 확인해주는 모습을 캡쳐하여 해당 캡쳐 파일도 숙제 제출 리포트(.ipynb파일)내에 내장시켜 제출하시오. 내장시키는 방법은 아래의 참고사이트를 참고하시오.\n", + " - ACM-ICPC 문제의 1. 정답 코드를 숙제 제출 리포트 내에 포함시키고\n", + " - https://www.acmicpc.net 사이트에 본인이 작성한 코드를 직접 제출하여 올바른 정답임을 확인해주는 모습을 캡쳐하여 해당 2. 캡쳐 파일도 숙제 제출 리포트(.ipynb파일)내에 내장시켜 제출하시오. 이미지를 내장시키는 방법은 아래의 참고사이트를 참고하시오.\n", "
\n", "\n", "- 참고 사이트\n", @@ -29,7 +25,15 @@ "
\n", "\n", " - 캡쳐 파일의 모습은 다음과 같아야 합니다. \n", - " ![image](../images/AF91CA27-0B5B-44CE-9018-3D0E8D2DE51F.png)" + " ![image](../images/AF91CA27-0B5B-44CE-9018-3D0E8D2DE51F.png)\n", + " \n", + "
\n", + " - 감점 사항(향후 모든 숙제에 적용됨)\n", + " - ACM-ICPC 정답 코드를 포함하지 않는 경우\n", + " - ACM-ICPC 사이트에서 캡쳐한 이미지의 모습이 예시와 같지 않는 경우(특히 학번이 나와있지 않는 경우)\n", + " - ACM-ICPC 사이트에서 채점 결과가 \"맞았습니다\"가 아닌 경우\n", + " - 단, 정답임에도 \"맞았습니다\"가 아닌 경우에는, 충분한 설명을 주석으로 제시하여 설득할 것\n", + " - nbviewer url로 접근이 불가능한 경우(404 에러 등이 뜨면 안됩니다. github repository를 잘 관리하세요.)" ] }, { @@ -113,27 +117,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "9. [ACM-ICPC 문제 2439번] \n", - " - 별찍기-2
\n", - " https://www.acmicpc.net/problem/2439" + "9. [ACM-ICPC 문제 2441번] \n", + " - 별찍기-4
\n", + " https://www.acmicpc.net/problem/2441" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "10. [ACM-ICPC 문제 1924번] \n", - " - 2007년
\n", - "https://www.acmicpc.net/problem/1924" + "10. [ACM-ICPC 문제 11721번] \n", + " - 열 개씩 끊어 출력하기
\n", + "https://www.acmicpc.net/problem/11721" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "11. [ACM-ICPC 문제 11720번]\n", - " - 숫자의 합
\n", - " https://www.acmicpc.net/problem/11720" + "11. [ACM-ICPC 문제 2839번]\n", + " - 설탕배달
\n", + " https://www.acmicpc.net/problem/2839" ] } ], From f2d5858582cf8b41be24045ffbb0b7b5b535578f Mon Sep 17 00:00:00 2001 From: gwondohyung Date: Thu, 20 Sep 2018 09:02:21 +0900 Subject: [PATCH 082/124] =?UTF-8?q?assignment-1=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-1.ipynb | 1 + 1 file changed, 1 insertion(+) diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb index 2e96749..abc4d59 100644 --- a/python3.6/assignment-1.ipynb +++ b/python3.6/assignment-1.ipynb @@ -26,6 +26,7 @@ "\n", " - 캡쳐 파일의 모습은 다음과 같아야 합니다. \n", " ![image](../images/AF91CA27-0B5B-44CE-9018-3D0E8D2DE51F.png)\n", + "! [image] (../images/AF91CA27-0B5B-44CE-9018-3D0E8D2DE51F.png)\n", " \n", "
\n", " - 감점 사항(향후 모든 숙제에 적용됨)\n", From b8cfa0e6149189b66356e1f95cd3bdc3c3d959c3 Mon Sep 17 00:00:00 2001 From: gwondohyung Date: Thu, 20 Sep 2018 11:22:22 +0900 Subject: [PATCH 083/124] =?UTF-8?q?assignment-1=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-1.ipynb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb index abc4d59..cf9dd66 100644 --- a/python3.6/assignment-1.ipynb +++ b/python3.6/assignment-1.ipynb @@ -34,7 +34,10 @@ " - ACM-ICPC 사이트에서 캡쳐한 이미지의 모습이 예시와 같지 않는 경우(특히 학번이 나와있지 않는 경우)\n", " - ACM-ICPC 사이트에서 채점 결과가 \"맞았습니다\"가 아닌 경우\n", " - 단, 정답임에도 \"맞았습니다\"가 아닌 경우에는, 충분한 설명을 주석으로 제시하여 설득할 것\n", - " - nbviewer url로 접근이 불가능한 경우(404 에러 등이 뜨면 안됩니다. github repository를 잘 관리하세요.)" + " - nbviewer url로 접근이 불가능한 경우(404 에러 등이 뜨면 안됩니다. github repository를 잘 관리하세요.)\n", + " - python2로 코드를 작성한 경우\n", + " - 주석이 자세하지 않거나 지나치게 짧은 경우\n", + " - 2명 이상이 코드가 완벽히 동일한 경우" ] }, { From 012cb8fb36adb1bc642878c7765de2a7219fc416 Mon Sep 17 00:00:00 2001 From: gwondohyung Date: Thu, 20 Sep 2018 14:36:15 +0900 Subject: [PATCH 084/124] =?UTF-8?q?assignment-1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment-1.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python3.6/assignment-1.ipynb b/python3.6/assignment-1.ipynb index cf9dd66..a1c6b3e 100644 --- a/python3.6/assignment-1.ipynb +++ b/python3.6/assignment-1.ipynb @@ -60,7 +60,7 @@ "metadata": {}, "source": [ "2. b=\"Hello Python World\" 문자열을 Slicing과 연결 연산자 (+)를 사용하여 \"World Python Hello\"로 변경하시오.\n", - " - [주의] b 변수 자체에 \"Python Hello\" 문자열이 저장되어야 함 " + " - [주의] b 변수 자체에 \"World Python Hello\" 문자열이 저장되어야 함 " ] }, { From 940336f86602d211aea33e5c35f17de1cf35ee72 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 3 Oct 2018 21:25:03 +0900 Subject: [PATCH 085/124] ... --- python3.6/python05.ipynb | 275 +++++++++++++++++++++++---------------- 1 file changed, 164 insertions(+), 111 deletions(-) diff --git a/python3.6/python05.ipynb b/python3.6/python05.ipynb index bb0c80e..0cdd051 100644 --- a/python3.6/python05.ipynb +++ b/python3.6/python05.ipynb @@ -35,9 +35,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -58,9 +56,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -78,10 +74,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -104,10 +98,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -130,10 +122,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -158,10 +148,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -179,10 +167,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -200,10 +186,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -226,10 +210,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 9, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -263,10 +245,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -293,10 +273,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -314,10 +292,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -337,16 +313,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 문자열, 튜플, 리스트의 관계 연산 비교는 일반 사전 순서 \n", - "- 사전에서 앞에 나오는 값이 작은 값으로 평가됨" + "- 문자열, 튜플, 리스트의 관계 연산 비교는 일반 사전 순서 " ] }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, + "execution_count": 20, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -361,7 +334,61 @@ "source": [ "print('abcd' > 'abd') \n", "print((1, 2, 4) < (2, 1, 0)) \n", - "print([1, 3, 2] == [1, 2, 3])" + "print([1, 3, 2] < [1, 2, 3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전에 대해서는 대소관계 평가하는 관계연산 불가" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'>' not supported between instances of 'dict' and 'dict'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m}\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: '>' not supported between instances of 'dict' and 'dict'" + ] + } + ], + "source": [ + "print({0:0, 1:1} > {2:2, 3:3})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전에 대해 내용이 동일한지 알아보는 관계연산자는 수행가능함" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n" + ] + } + ], + "source": [ + "print({0:0, 1:1} == {2:2, 3:3})\n", + "print({0:0, 1:1} == {0:0, 1:1})" ] }, { @@ -374,10 +401,8 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": { - "collapsed": false - }, + "execution_count": 24, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -386,24 +411,40 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m9999999999999999999999\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# True\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# True\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m9999999999999999999999\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: '<' not supported between instances of 'int' and 'str'" ] } ], "source": [ - "print(9999999999999999999999 < 'abc')\n", - "print({3:2} < [1,2,3] < (1,2,3))\n", - "# True\n", - "# True" + "print(9999999999999999999999 < 'abc')" ] }, { "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": false - }, + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'<' not supported between instances of 'dict' and 'list'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: '<' not supported between instances of 'dict' and 'list'" + ] + } + ], + "source": [ + "print({3:2} < [1,2,3] < (1,2,3))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -412,7 +453,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'a'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'z'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'a'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'z'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# [1, 2, 3, {1: 2}, [1, 2, 3], ['abc'], 'a', 'abc', 'z', (1, 2, 3)]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: '<' not supported between instances of 'str' and 'int'" ] } @@ -426,10 +467,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 27, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -462,6 +501,32 @@ "![image](../images/objectIdentity.png)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [문제] 아래 예제를 통하여 위 그림의 오류를 지적하시오" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n" + ] + } + ], + "source": [ + "print(x[0] == y[0])\n", + "print(x[0] is y[0])" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -480,20 +545,19 @@ " - or\n", " - not\n", "- [주의] 논리 연산자 자체가 값을 반환하지는 않는다. \n", - " - 논리 연산을 따라 최종적으로 평가(Evaluation)되어진 값이 반환된다." + " - 대신, 논리 연산을 따라 최종적으로 평가(Evaluation)되어진 값이 반환된다." ] }, { "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, + "execution_count": 32, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "True\n", "True\n" ] } @@ -501,7 +565,8 @@ "source": [ "a = 20\n", "b = 30\n", - "print(a > 10 and b < 50)" + "print(a > 10 and b < 50)\n", + "print(a > 10 or b < 50)" ] }, { @@ -516,9 +581,7 @@ { "cell_type": "code", "execution_count": 26, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -547,10 +610,8 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, + "execution_count": 34, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -562,6 +623,7 @@ "True\n", "\n", "False\n", + "True\n", "True\n" ] } @@ -573,7 +635,8 @@ "print(bool(-100))\n", "print()\n", "print(bool(0.0)) # 실수 0.0은 거짓\n", - "print(bool(0.1))" + "print(bool(0.1))\n", + "print(bool(0.00000000000000000000000000000000000000000001))" ] }, { @@ -586,9 +649,7 @@ { "cell_type": "code", "execution_count": 28, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -612,7 +673,7 @@ ], "source": [ "print(bool('abc'))\n", - "print(bool(''))\n", + "print(bool('')) # 빈 문자열은 거짓 \n", "print()\n", "print(bool([])) # 공 리스트는 거짓\n", "print(bool([1,2,3]))\n", @@ -628,18 +689,17 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, + "execution_count": 37, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1\n", - "0\n", + "2\n", "0\n", + "\n", + "2\n", "1\n", "\n", "1\n", @@ -649,11 +709,14 @@ } ], "source": [ - "print(1 and 1)\n", + "print(1 and 2)\n", "print(1 and 0)\n", - "print(0 or 0)\n", + "print()\n", + "\n", + "print(0 or 2)\n", "print(1 or 0)\n", "print()\n", + "\n", "print([] or 1) # [] 거짓\n", "print([] or ()) # [], () 거짓\n", "print([] and 1) # [] 거짓이므로 1은 참조할 필요 없음" @@ -661,18 +724,13 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": false - }, + "execution_count": 38, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2\n", - "1\n", - "\n", "[[]]\n", "[{}]\n", "1\n" @@ -680,9 +738,6 @@ } ], "source": [ - "print(1 and 2)\n", - "print(1 or 2)\n", - "print()\n", "print([[]] or 1) # [[]] 참으로 간주\n", "print([{}] or 1) # [{}] 참으로 간주\n", "print('' or 1) # 빈 문자열('')은 거짓" @@ -691,9 +746,7 @@ { "cell_type": "code", "execution_count": 31, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -752,7 +805,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, From 26f8d8c5f7e268f9d5aefe72825e549af7341b4a Mon Sep 17 00:00:00 2001 From: Youn Hee Han Date: Wed, 3 Oct 2018 22:02:14 +0900 Subject: [PATCH 086/124] .... --- python3.6/python06.ipynb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/python3.6/python06.ipynb b/python3.6/python06.ipynb index 3d56c0f..031b818 100644 --- a/python3.6/python06.ipynb +++ b/python3.6/python06.ipynb @@ -305,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -320,7 +320,7 @@ ], "source": [ "print(range(10))\n", - "# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "\n", "print(list(range(10)))\n", "\n", "for x in range(10):\n", @@ -692,7 +692,7 @@ "source": [ "x = 0\n", "while x < 10:\n", - " print(x, end=\" \") # 콤마(,) 때문에 줄이 바뀌지 않는다.\n", + " print(x, end=\" \")\n", " x = x + 1\n", "else:\n", " print('else block')\n", @@ -922,7 +922,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -937,8 +937,7 @@ "def calc(x, y):\n", " return x + y, x - y, x * y, x / y\n", "\n", - "print(calc(10, 2))\n", - "# (12, 8, 20, 5)" + "print(calc(10, 2))" ] }, { @@ -1042,7 +1041,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.4" } }, "nbformat": 4, From 4330126537902f395786b559b841d35907746f53 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Tue, 9 Oct 2018 23:19:03 +0900 Subject: [PATCH 087/124] ... --- python3.6/assignment-2.ipynb | 233 +++++++++++++++++++---------------- python3.6/python07.ipynb | 141 ++++++--------------- python3.6/python08.ipynb | 161 ++++++++++-------------- 3 files changed, 225 insertions(+), 310 deletions(-) diff --git a/python3.6/assignment-2.ipynb b/python3.6/assignment-2.ipynb index b0355d1..fc2b044 100644 --- a/python3.6/assignment-2.ipynb +++ b/python3.6/assignment-2.ipynb @@ -6,18 +6,24 @@ "source": [ "# Assignment 2\n", "### [정보]\n", - "#### 1) Due Date: 2017년 10월 19일 (목), 23시 59분\n", + "#### 1) Due Date: 2018년 10월 19일 (금), 23시 59분\n", "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", - "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", - "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", - "#### 5) 문제 (ACM-ICPC 1문제 및 Incremental Project 문제 포함하여 총 5개)" + "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입.\n", + "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- 다음 6 개의 Expression에 대해 Evaluation 결과 값을 출력하고, 해당 결과가 나온 이유에 대해 설명하시오\n", + "### 일반 연습 문제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1) 다음 6 개의 Expression에 대해 Evaluation 결과 값을 출력하고, 해당 결과가 나온 이유에 대해 설명하시오\n", " - 1 and 2 and 3 and 4\n", " - 1 or 2 or 3 or 4\n", " - 1 and 2 or 3 and 4\n", @@ -30,7 +36,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 경로에 해당하는 문자열 1개를 입력 받아 그 안에 디렉토리 경로명과 파일명을 분리하여 리스트로 반환하는 함수 div_path(s)를 작성하시오.\n", + "2) 경로에 해당하는 문자열 1개를 입력 받아 그 안에 디렉토리 경로명과 파일명을 분리하여 리스트로 반환하는 함수 div_path(s)를 작성하시오.\n", " - 인자로 전달하는 문자열은 경로만 들어간다고 가정한다.\n", " - 각 디렉토리와 파일을 구분하는 문자는 '/'로 가정한다.\n", " - 반환하는 리스트의 첫번째 원소는 디렉토리이고 두번째 원소는 파일명이다.\n", @@ -46,7 +52,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 두 개의 리스트를 인자로 받아서 그 두 개의 리스트에 대한 '합집합'을 반환하는 함수 list_union(lista, listb)를 작성하시오.\n", + "3) 두 개의 리스트를 인자로 받아서 그 두 개의 리스트에 대한 '합집합'을 반환하는 함수 list_union(lista, listb)를 작성하시오.\n", " - 인자로 전달하는 리스트 2 개에는 정수값만 들어간다고 가정하자.\n", " - 함수 내에서 새로운 리스트를 만들어 그 리스트 내에 인자로 받은 두 리스트의 모든 원소를 넣어 반환한다.\n", " - 반환하는 리스트에는 절대로 중복된 원소가 들어 있으면 안된다 (집합의 조건).\n", @@ -66,7 +72,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [ACM-ICPC 문제 1110번]\n", + "### ACM-ICPC 문제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1) [ACM-ICPC 문제 1110번]\n", " - 더하기 사이클
\n", "https://www.acmicpc.net/problem/1110" ] @@ -75,7 +88,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [Incremental Project] 웹 URL로 지정된 웹페이지를 문자열로 가져와 1) 모든 HTML 태그를 제외한 순수 텍스트 문자열만을 걸러내고, 2) 그 순수 텍스트 문자열 안에 존재하는 단어가 총 몇개인지 출력하는 프로그램을 작성하시오.\n", + "### Incremental Project 문제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1) 웹 URL로 지정된 웹페이지를 문자열로 가져와 1) 모든 HTML 태그를 제외한 순수 텍스트 문자열만을 걸러내고, 2) 그 순수 텍스트 문자열 안에 존재하는 단어가 총 몇개인지 출력하는 프로그램을 작성하시오.\n", " - HTML 태그는 다음 조건을 가지는 것이다.\n", " - < 로 시작하여 >로 끝난다.\n", " - 예를 들어, 아래와 같은 HTML 내용 내에 한 줄이 있다고 가정하자.\n", @@ -95,46 +115,36 @@ " \n", " ```\n", " \n", - " - 위 소스는 HTML 태그로만 구성된 것이며 걸러낼 수 있는 순수 텍스 문자열은 존재하지 않는다.\n", + " - 위 한 줄은 HTML 태그로만 구성된 것이며 걸러낼 수 있는 순수 텍스 문자열은 존재하지 않는다.\n", " \n", " - 단어를 나누는 기준은 오로지 공백문자 (whitespace)이다.\n", " - 즉, 위 순수 텍스트 문자열인 \"로그인 유지\"에서 분리한 단어는 \"로그인\"과 \"유지\"이다.\n", " - 중복을 고려하지 않고 무조건 모든 단어의 개수를 세어서 출력한다.\n", " - 본 숙제를 위하여 HTML 파싱과 관련된 모듈 (예. BeautifulSoup) 사용 금지\n", " - 다음은 URL로 지정된 웹페이지를 특정 문자열로 가져오는 코드이다. \n", - " - 즉, 숙제 코드는 아래 코드로 부터 시작해야 한다." + " - 즉, 숙제 코드는 아래 코드로 부터 시작해야 한다.\n", + " - 아래 코드 수행시 requests 모듈이 존재하지 않는 에러가 발생하면 command 창에서 다음 코드 입력하여 requests 모듈 설치후 아래 코드 수행\n", + " ```\n", + " > pip install requests\n", + " ```" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ - "from urllib import request \n", - " \n", - "url = 'http://cse.koreatech.ac.kr'\n", - "f = request.urlopen(url)\n", - "source_bytes = f.read()\n", - "source = source_bytes.decode('utf-8')\n", + "import requests\n", + "\n", + "req = requests.get('http://cse.koreatech.ac.kr')\n", "\n", - "# 추후 숙제 답안 제출 때엔 아래 코드는 주석처리할 것 \n", - "print(type(source_bytes))\n", - "print(type(source))" + "source = req.text" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -151,20 +161,28 @@ "\n", "컴퓨터공학부\n", "\n", - "\n", + "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", @@ -185,13 +203,7 @@ "\n", "\n", + "\n", "\n", "\n" ] @@ -640,6 +652,13 @@ "# 추후 숙제 답안 제출 때엔 아래 코드는 주석처리할 것\n", "print(source)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -659,7 +678,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python07.ipynb b/python3.6/python07.ipynb index 4024385..b6999eb 100644 --- a/python3.6/python07.ipynb +++ b/python3.6/python07.ipynb @@ -32,13 +32,11 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "s = 'abcdef'\n", - "L = [100,200,300]\n", + "L = [100, 200, 300]\n", "t = ('tuple', 'object', 1, 2)" ] }, @@ -67,9 +65,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -99,9 +95,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "IndexError", @@ -130,9 +124,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -172,9 +164,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -187,7 +177,7 @@ ], "source": [ "s = 'abcd'\n", - "print(s[::2]) #step:2 - 각 원소들 사이의 거리가 인덱스 기준으로 2가 됨\n", + "print(s[::2]) #step:2 - 각 원소들 사이의 거리가 인덱스 기준으로 2가 됨\n", "print(s[::-1]) #step:-1 - 왼쪽 방향으로 1칸씩" ] }, @@ -201,9 +191,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -232,9 +220,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -249,7 +235,7 @@ "s = 'abc'\n", "print(s * 4)\n", "\n", - "L = [1,2,3]\n", + "L = [1, 2, 3]\n", "print(L * 2)" ] }, @@ -263,9 +249,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -282,7 +266,7 @@ "s = 'abcde'\n", "print('c' in s)\n", "\n", - "t = (1,2,3,4,5)\n", + "t = (1, 2, 3, 4, 5)\n", "print(2 in t)\n", "print(10 in t)\n", "print(10 not in t)" @@ -290,10 +274,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -322,10 +304,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -339,7 +319,7 @@ ], "source": [ "s = 'abcde'\n", - "l = [1,2,3]\n", + "l = [1, 2, 3]\n", "t = (1, 2, 3, 4)\n", "print(len(s))\n", "print(len(l))\n", @@ -356,9 +336,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -406,9 +384,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -433,9 +409,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -462,9 +436,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -488,7 +460,9 @@ "long since past the pleasing shock of Perl's power,\n", "has been catching on to a different scripting animal -- Python.\"\"\"\n", "print(multiline)\n", + "\n", "print()\n", + "\n", "ml = ''' While the rest of the world has been catching on to\n", "the Perl scripting language, the Linux commnunity,\n", "long since past the pleasing shock of Perl's power,\n", @@ -517,10 +491,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -554,9 +526,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -597,9 +567,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -620,9 +588,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -651,9 +617,7 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -689,9 +653,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -727,9 +689,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -746,9 +706,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -773,9 +731,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -794,10 +750,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -846,28 +800,7 @@ "print(u3[:3])\n", "print(u3[4:])\n", "print(u3[::-1])\n", - "print()\n", - "\n", - "\n", - "\n", - "\n", - "# 한\n", - "# 글\n", - "# 한글과\n", - "# 세종대왕\n", - "# 왕대종세 과글한\n", - "\n", - "# 한\n", - "# 글\n", - "# 한글과\n", - "# 세종대왕\n", - "# 왕대종세 과글한\n", - "\n", - "# �\n", - "# �\n", - "# 한\n", - "# ��과 세종대왕\n", - "# ��쀌녢츄� ��ꀸ꜕�" + "print()" ] }, { @@ -894,7 +827,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python08.ipynb b/python3.6/python08.ipynb index cab9933..dce943d 100644 --- a/python3.6/python08.ipynb +++ b/python3.6/python08.ipynb @@ -23,9 +23,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -51,9 +49,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -73,23 +69,21 @@ ], "source": [ "s = 'i like programming, i like swimming.'\n", - "print(s.count('like')) # 'like' 문자열이 출현한 횟수를 반환\n", + "print(s.count('like')) # 'like' 문자열이 출현한 횟수를 반환\n", "print()\n", - "print(s.find('like')) # 'like'의 첫글자의 인덱스인 위치(offset)를 반환\n", + "print(s.find('like')) # 'like'의 첫글자의 인덱스인 위치(offset)를 반환\n", "print(s.find('programming')) # 'programming'의 첫글자 위치를 반환\n", - "print(s.find('programmin')) # 'programmin'의 첫글자 위치를 반환\n", - "print(s.find('programmii')) # 'programmii' 단어는 없기 때문에 -1 반환\n", + "print(s.find('programmin')) # 'programmin'의 첫글자 위치를 반환\n", + "print(s.find('programmii')) # 'programmii' 단어는 없기 때문에 -1 반환\n", "print()\n", - "print(s.find('like', 3)) # offset=3 부터 'like'을 검색하여 'like'의 첫글자 위치 반환 \n", - "print(s.find('my')) # 'my' 단어는 없기 때문에 -1 반환" + "print(s.find('like', 3)) # offset=3 부터 'like'을 검색하여 'like'의 첫글자 위치 반환 \n", + "print(s.find('my')) # 'my' 단어는 없기 때문에 -1 반환" ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -117,18 +111,18 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "23\n", "spam and ham\n", " spam and ham \n", "spam and ham\n", + "12\n", "\n", " spam and ham\n", "spam and ham \n", @@ -139,14 +133,18 @@ ], "source": [ "u = ' spam and ham '\n", - "print(u.strip()) # 좌우 공백을 제거하여 새로운 스트링 생성\n", - "print(u) # 스트링은 변경불가능 \n", - "y = u.strip() # 즉, strip()는 새로운 스트링을 생성함\n", + "print(len(u))\n", + "print(u.strip()) # 좌우 공백을 제거하여 새로운 스트링 생성\n", + "print(u) # 스트링은 변경불가능 \n", + "y = u.strip() # 즉, strip()는 새로운 스트링을 생성함\n", "print(y)\n", + "print(len(y))\n", "print()\n", "\n", "print(u.rstrip()) # 오른쪽 공백 제거\n", "print(u.lstrip()) # 왼쪽 공백 제거 \n", + "print()\n", + "\n", "print(' abc '.strip()) \n", "print('><><><>'.strip('<>')) # 인자로 주어진 스트링 안에 지정된 모든 문자를 좌우에서 제거" ] @@ -154,9 +152,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -176,9 +172,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -198,9 +192,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -226,9 +218,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -251,18 +241,19 @@ ], "source": [ "u = 'spam ham\\tegg\\ncheese'\n", - "t = u.split() # 문자열 내의 단어 리스트 \n", + "t = u.split() # 문자열 내의 단어 리스트 \n", "print(t)\n", "print()\n", - "t2 = ':'.join(t) # 리스트 t 내부의 각 원소들을 ':'로 연결한 문자열 반환\n", + "t2 = ':'.join(t) # 리스트 t 내부의 각 원소들을 ':'로 연결한 문자열 반환\n", "print(type(t2))\n", "# \n", - "\n", "print(t2)\n", "print()\n", - "t3 = \",\".join(t) # 리스트 t 내부의 각 원소들을 ','으로 연결한 문자열 반환\n", + "\n", + "t3 = \",\".join(t) # 리스트 t 내부의 각 원소들을 ','으로 연결한 문자열 반환\n", "print(t3)\n", "print()\n", + "\n", "t4 = '\\n'.join(t) # 리스트 t 내부의 각 원소들을 '\\n'으로 연결한 문자열 반환\n", "print(t4)\n", "print()" @@ -270,10 +261,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -289,19 +278,13 @@ "u2 = \"스팸 햄 계란 치즈\" # python 3 부터는 u 리터럴 표기 불필요\n", "t2 = u2.split()\n", "print(t2)\n", - "print(t2[0], t2[1], t2[2], t2[3])\n", - "\n", - "\n", - "# [u'\\uc2a4\\ud338', u'\\ud584', u'\\uacc4\\ub780', u'\\uce58\\uc988']\n", - "# 스팸 햄 계란 치즈" + "print(t2[0], t2[1], t2[2], t2[3])" ] }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -331,9 +314,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -359,9 +340,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -383,9 +362,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -414,9 +391,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -469,9 +444,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -488,9 +461,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -568,30 +539,28 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "| 포맷팅 문자 | 설명 |\n", - "|-------------|------------------------------------------------------------------------------|\n", - "| %s | 문자열을 포함한 임의의 객체를 문자열로 변환하여 출력 (str() 내장 함수 사용) |\n", - "| %r | 문자열을 포함한 임의의 객체를 문자열로 변환하여 출력 (repr() 내장 함수 사용) |\n", - "| %c | 1글자 문자 (ex. '%c' % 'k) |\n", - "| %d | 10진 정수 (%5d: 5자리를 확보한 후 정수 포맷팅) |\n", - "| %i | %d와 동일 |\n", - "| %u | 부호 없는 정수. 음수는 양수처럼 해석함 (ex. '%u' % -12 --> '4294967284') |\n", - "| %o | 8진수 정수 (ex. '%o' % 13 --> 15) |\n", - "| %x | 16진수 정수 (소문자 표현) (ex. '%x' % 13 --> 'd') |\n", - "| %X | 16진수 정수 (대문자 표현) (ex. '%X' % 13 --> 'D') |\n", - "| %e | 부동 소수점 실수를 지수 형태로 표현 (%.2e: 2자리는 소수점 이하 자리수) |\n", - "| %E | %e 와 동일 (대문자 E 표현) |\n", - "| %f | 부동 소수점 실수 (%5.2f: 소수점 포함 총 5자리 확보한 후 2자리는 소수점 이하 자리수) |\n", - "| %g | 부동 소수점을 편의에 따라 일반 실수 형식이나 지수 형식으로 변환 |\n", - "| %G | %g와 동일 (대문자 E 표현) |" + "|중요| 포맷팅 문자 | 설명 |\n", + "|--|-------------|------------------------------------------------------------------------------|\n", + "|O | %s | 문자열을 포함한 임의의 객체를 문자열로 변환하여 출력 (str() 내장 함수 사용) |\n", + "| | %r | 문자열을 포함한 임의의 객체를 문자열로 변환하여 출력 (repr() 내장 함수 사용) |\n", + "| | %c | 1글자 문자 (ex. '%c' % 'k) |\n", + "|O | %d | 10진 정수 (%5d: 5자리를 확보한 후 정수 포맷팅) |\n", + "| | %i | %d와 동일 |\n", + "| | %u | 부호 없는 정수. 음수는 양수처럼 해석함 (ex. '%u' % -12 --> '4294967284') |\n", + "| | %o | 8진수 정수 (ex. '%o' % 13 --> 15) |\n", + "| | %x | 16진수 정수 (소문자 표현) (ex. '%x' % 13 --> 'd') |\n", + "| | %X | 16진수 정수 (대문자 표현) (ex. '%X' % 13 --> 'D') |\n", + "| | %e | 부동 소수점 실수를 지수 형태로 표현 (%.2e: 2자리는 소수점 이하 자리수) |\n", + "| | %E | %e 와 동일 (대문자 E 표현) |\n", + "|O | %f | 부동 소수점 실수 (%5.2f: 소수점 포함 총 5자리 확보한 후 2자리는 소수점 이하 자리수) |\n", + "| | %g | 부동 소수점을 편의에 따라 일반 실수 형식이나 지수 형식으로 변환 |\n", + "| | %G | %g와 동일 (대문자 E 표현) |" ] }, { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -608,9 +577,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -627,9 +594,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -654,9 +619,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -706,7 +669,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, From 54f48f3e73e211682e8554bb11d4c05bcc875c6d Mon Sep 17 00:00:00 2001 From: gwondohyung Date: Wed, 10 Oct 2018 17:18:27 +0900 Subject: [PATCH 088/124] assignment-2 update --- python3.6/assignment-2.ipynb | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/python3.6/assignment-2.ipynb b/python3.6/assignment-2.ipynb index fc2b044..3050806 100644 --- a/python3.6/assignment-2.ipynb +++ b/python3.6/assignment-2.ipynb @@ -79,9 +79,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "1) [ACM-ICPC 문제 1110번]\n", - " - 더하기 사이클
\n", - "https://www.acmicpc.net/problem/1110" + "1) [ACM-ICPC 문제 10809번]\n", + " - 알파벳 찾기
\n", + "https://www.acmicpc.net/problem/10809" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2) [ACM-ICPC 문제 2675번]\n", + " - 문자열 반복
\n", + "https://www.acmicpc.net/problem/2675" ] }, { @@ -678,7 +687,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.5" } }, "nbformat": 4, From 0ccaddb1cf3f0c11750bb1b1b1800daa6bc74515 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 17 Oct 2018 18:28:51 +0900 Subject: [PATCH 089/124] ,,, --- python3.6/python08.ipynb | 327 +++++++++++++++++++++++------ python3.6/python09.ipynb | 263 +++++++++++++---------- python3.6/python10.ipynb | 265 +++++++++++------------ python3.6/supplement-2016-09.ipynb | 2 +- 4 files changed, 534 insertions(+), 323 deletions(-) diff --git a/python3.6/python08.ipynb b/python3.6/python08.ipynb index cab9933..6249cac 100644 --- a/python3.6/python08.ipynb +++ b/python3.6/python08.ipynb @@ -23,9 +23,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -51,9 +49,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -87,9 +83,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -118,9 +112,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -154,9 +146,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -176,9 +166,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -198,9 +186,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -226,9 +212,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -271,9 +255,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -299,9 +281,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -331,9 +311,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -359,9 +337,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -383,9 +359,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -414,9 +388,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -469,9 +441,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -488,9 +458,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -589,9 +557,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -608,9 +574,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -627,9 +591,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -654,9 +616,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -678,8 +638,249 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2-3 [참고] 새로운 포매팅 방법 (Python 3 기준)\n", - "- https://pyformat.info/" + "### 2-3 새로운 포매팅 방법 (Python 3 기준) - 오프라인 강의 - 공부 필수\n", + "- https://pyformat.info/\n", + "- https://dojang.io/mod/page/view.php?id=997" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello, world!\n", + "Hello, 100\n" + ] + } + ], + "source": [ + "print('Hello, {0}'.format('world!'))\n", + "print('Hello, {0}'.format(100))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello, Python 3.6 Script\n" + ] + } + ], + "source": [ + "print('Hello, {0} {2} {1}'.format('Python', 'Script', 3.6))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](https://dojang.io/pluginfile.php/5238/mod_page/content/1/025002.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Python Python Script Script\n" + ] + } + ], + "source": [ + "print('{0} {0} {1} {1}'.format('Python', 'Script'))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello, Python 3.6\n" + ] + } + ], + "source": [ + "print('Hello, {language} {version}'.format(language='Python', version=3.6))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 1\n", + " 1\n" + ] + } + ], + "source": [ + "print('%3d' % 1)\n", + "print('{0:3d}'.format(1))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "001\n", + "001\n" + ] + } + ], + "source": [ + "print('%03d' % 1)\n", + "print('{0:03d}'.format(1))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.60\n", + "3.60\n" + ] + } + ], + "source": [ + "print('%.2f' % 3.6)\n", + "print('{0:.2f}'.format(3.6))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 구구단 출력 포맷팅 " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 x 1 = 2\n", + "2 x 2 = 4\n", + "2 x 3 = 6\n", + "2 x 4 = 8\n", + "2 x 5 = 10\n", + "2 x 6 = 12\n", + "2 x 7 = 14\n", + "2 x 8 = 16\n", + "2 x 9 = 18\n", + "\n", + "3 x 1 = 3\n", + "3 x 2 = 6\n", + "3 x 3 = 9\n", + "3 x 4 = 12\n", + "3 x 5 = 15\n", + "3 x 6 = 18\n", + "3 x 7 = 21\n", + "3 x 8 = 24\n", + "3 x 9 = 27\n", + "\n", + "4 x 1 = 4\n", + "4 x 2 = 8\n", + "4 x 3 = 12\n", + "4 x 4 = 16\n", + "4 x 5 = 20\n", + "4 x 6 = 24\n", + "4 x 7 = 28\n", + "4 x 8 = 32\n", + "4 x 9 = 36\n", + "\n", + "5 x 1 = 5\n", + "5 x 2 = 10\n", + "5 x 3 = 15\n", + "5 x 4 = 20\n", + "5 x 5 = 25\n", + "5 x 6 = 30\n", + "5 x 7 = 35\n", + "5 x 8 = 40\n", + "5 x 9 = 45\n", + "\n", + "6 x 1 = 6\n", + "6 x 2 = 12\n", + "6 x 3 = 18\n", + "6 x 4 = 24\n", + "6 x 5 = 30\n", + "6 x 6 = 36\n", + "6 x 7 = 42\n", + "6 x 8 = 48\n", + "6 x 9 = 54\n", + "\n", + "7 x 1 = 7\n", + "7 x 2 = 14\n", + "7 x 3 = 21\n", + "7 x 4 = 28\n", + "7 x 5 = 35\n", + "7 x 6 = 42\n", + "7 x 7 = 49\n", + "7 x 8 = 56\n", + "7 x 9 = 63\n", + "\n", + "8 x 1 = 8\n", + "8 x 2 = 16\n", + "8 x 3 = 24\n", + "8 x 4 = 32\n", + "8 x 5 = 40\n", + "8 x 6 = 48\n", + "8 x 7 = 56\n", + "8 x 8 = 64\n", + "8 x 9 = 72\n", + "\n", + "9 x 1 = 9\n", + "9 x 2 = 18\n", + "9 x 3 = 27\n", + "9 x 4 = 36\n", + "9 x 5 = 45\n", + "9 x 6 = 54\n", + "9 x 7 = 63\n", + "9 x 8 = 72\n", + "9 x 9 = 81\n", + "\n" + ] + } + ], + "source": [ + "for i in range(2, 10):\n", + " for j in range(1, 10):\n", + " print(\"{0} x {1} = {2:2d}\".format(i, j, i*j))\n", + " print()" ] }, { @@ -706,7 +907,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python09.ipynb b/python3.6/python09.ipynb index 03e6010..a56acd6 100644 --- a/python3.6/python09.ipynb +++ b/python3.6/python09.ipynb @@ -25,10 +25,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -77,9 +75,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -104,10 +100,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -121,7 +115,7 @@ ], "source": [ "a = ['spam', 'eggs', 123, 1234]\n", - "a[0:2] = [1,12] # 동일한 크기에 대한 슬라이스 치환\n", + "a[0:2] = [1, 12] # 동일한 크기에 대한 슬라이스 치환\n", "print(a)\n", "\n", "a[0:2] = [1] # 서로 다른 크기에 대한 슬라이스 치환\n", @@ -140,10 +134,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -169,10 +161,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -206,10 +196,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -232,9 +220,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -267,9 +253,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "NameError", @@ -278,7 +262,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'a' is not defined" ] } @@ -299,9 +283,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -323,9 +305,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -343,9 +323,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -370,15 +348,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- range: 순차적인 정수 리스트 만들기" + "- range: 순차적인 정수 리스트 생성 가능한 시퀀스형 range 객체 만들기" ] }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 15, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -400,10 +376,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -425,39 +399,96 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 19, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "0 inch= 0.0 centi\n", - "1 inch= 2.54 centi\n", - "2 inch= 5.08 centi\n", - "3 inch= 7.62 centi\n", - "4 inch= 10.16 centi\n", - "5 inch= 12.7 centi\n", - "6 inch= 15.24 centi\n", - "7 inch= 17.78 centi\n", - "8 inch= 20.32 centi\n", - "9 inch= 22.86 centi\n" + "0 inch = 0.0 centi\n", + "1 inch = 2.54 centi\n", + "2 inch = 5.08 centi\n", + "3 inch = 7.62 centi\n", + "4 inch = 10.16 centi\n", + "5 inch = 12.7 centi\n", + "6 inch = 15.24 centi\n", + "7 inch = 17.78 centi\n", + "8 inch = 20.32 centi\n", + "9 inch = 22.86 centi\n" ] } ], "source": [ "for el in range(10):\n", - " print(el, 'inch=', el * 2.54, 'centi')" + " print(el, 'inch =', el * 2.54, 'centi')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 아래 코드가 더 좋음" ] }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 inch = 0.00 centi\n", + "1 inch = 2.54 centi\n", + "2 inch = 5.08 centi\n", + "3 inch = 7.62 centi\n", + "4 inch = 10.16 centi\n", + "5 inch = 12.70 centi\n", + "6 inch = 15.24 centi\n", + "7 inch = 17.78 centi\n", + "8 inch = 20.32 centi\n", + "9 inch = 22.86 centi\n" + ] + } + ], + "source": [ + "for el in range(10):\n", + " print(\"%d inch = %.2f centi\" % (el, el * 2.54))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 inch = 0.00 centi\n", + "1 inch = 2.54 centi\n", + "2 inch = 5.08 centi\n", + "3 inch = 7.62 centi\n", + "4 inch = 10.16 centi\n", + "5 inch = 12.70 centi\n", + "6 inch = 15.24 centi\n", + "7 inch = 17.78 centi\n", + "8 inch = 20.32 centi\n", + "9 inch = 22.86 centi\n" + ] + } + ], + "source": [ + "for el in range(10):\n", + " print(\"{0} inch = {1:.2f} centi\".format(el, el * 2.54))" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -481,10 +512,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, + "execution_count": 29, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -506,15 +535,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 아래 코드가 더 효율적" + "- 아래 코드가 더 좋음" ] }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, + "execution_count": 30, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -532,6 +559,27 @@ " print('name = %s, num = %s' % t)" ] }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name = one, num = 1\n", + "name = two, num = 2\n", + "name = three, num = 3\n" + ] + } + ], + "source": [ + "lt = [('one', 1), ('two', 2), ('three', 3)]\n", + "for t in lt:\n", + " print('name = {0}, num = {1}'.format(t[0], t[1]))" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -542,9 +590,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -572,9 +618,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -611,9 +655,7 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -637,9 +679,7 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -672,10 +712,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 34, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -690,21 +728,19 @@ ], "source": [ "s = [1, 2, -10, -7, 100]\n", - "k = s.reverse() # 자료의 순서를 뒤집기 (반환값 없음) \n", + "k = s.reverse() # 자료의 순서를 뒤집기 (반환값 없음 --> 리스트 자체의 내부 원소 배열이 변경됨) \n", "print(k)\n", "print(s)\n", "\n", - "k = s.sort() # 정렬 (반환값 없음)\n", + "k = s.sort() # 정렬 (반환값 없음 --> 리스트 자체의 내부 원소 배열이 변경됨)\n", "print(k)\n", "print(s)" ] }, { "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, + "execution_count": 35, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -737,15 +773,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2-2 리스트를 스택(Stack)으로 사용하기" + "### 2-2 리스트를 스택(Stack)으로 사용하기\n", + "- LIFO (Last Input First Output)" ] }, { "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, + "execution_count": 36, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -762,7 +797,8 @@ "s.append(60)\n", "print(s)\n", "\n", - "print(s.pop())\n", + "# If no index is specified, a.pop() removes and returns the last item in the list. \n", + "print(s.pop()) \n", "\n", "print(s)" ] @@ -776,10 +812,8 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, + "execution_count": 37, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -807,15 +841,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2-3 리스트를 큐(Queue)로 사용하기" + "### 2-3 리스트를 큐(Queue)로 사용하기\n", + "- FIFO (First Input First Output)" ] }, { "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, + "execution_count": 38, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -865,7 +898,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python10.ipynb b/python3.6/python10.ipynb index 25af325..c2fee9c 100644 --- a/python3.6/python10.ipynb +++ b/python3.6/python10.ipynb @@ -31,9 +31,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -60,10 +58,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [ { "ename": "NameError", @@ -72,7 +68,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNameError\u001b[0m: name 'cmp' is not defined" ] } @@ -93,9 +89,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -133,9 +127,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -146,13 +138,13 @@ }, { "ename": "TypeError", - "evalue": "must use keyword argument for key function", + "evalue": "'cmp' is an invalid keyword argument for this function", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;31m# L = [1, 5, 3, 2, 4, 6]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: must use keyword argument for key function" + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'cmp' is an invalid keyword argument for this function" ] } ], @@ -162,13 +154,7 @@ "\n", "L = [1, 5, 3, 2, 4, 6]\n", "print(L)\n", - "L.sort(mycmp) # 역순으로 정렬\n", - "\n", - "# L = [1, 5, 3, 2, 4, 6]\n", - "# print(L)\n", - "# mycmp(L)\n", - "# L.sort(mycmp) # 역순으로 정렬\n", - "# [6, 5, 4, 3, 2, 1]" + "L.sort(cmp=mycmp) # 역순으로 정렬" ] }, { @@ -181,9 +167,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -194,13 +178,13 @@ }, { "ename": "TypeError", - "evalue": "must use keyword argument for key function", + "evalue": "'cmp' is an invalid keyword argument for this function", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by name:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp_1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by experience:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: must use keyword argument for key function" + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by name:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcmp_1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by experience:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: 'cmp' is an invalid keyword argument for this function" ] } ], @@ -212,34 +196,29 @@ "def cmp_2(a1, a2):\n", " return cmp(a1[2], a2[2])\n", "\n", - "L = [ ('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", + "L = [('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", "L.sort()\n", "print('sorted by name:', L)\n", "\n", - "L.sort(cmp_1)\n", + "L.sort(cmp=cmp_1)\n", "print('sorted by experience:', L)\n", "\n", - "L.sort(cmp_2)\n", - "print('sorted by age:', L)\n", - "\n", - "# sorted by name: [('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n", - "# sorted by experience: [('kim', 3, 28), ('lee', 5, 38), ('jung', 10, 36)]\n", - "# sorted by age: [('kim', 3, 28), ('jung', 10, 36), ('lee', 5, 38)]" + "L.sort(cmp=cmp_2)\n", + "print('sorted by age:', L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- Python3: sort의 인자인 key에 객체가 지닌 원소들 내에 키값을 지정하는 함수를 지정가능" + "- [중요] **Python3: sort의 인자인 key에 객체가 지닌 원소들 내에 키값을 지정하는 함수를 지정가능**\n", + " - key 인자에 함수가 할당되어 있으면 각 리스트 원소에 대해 기본 비교함수 호출 직전에 key 함수를 먼저 호출한다. " ] }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 9, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -252,7 +231,7 @@ ], "source": [ "#Python3 기준 예제\n", - "L = [ ('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", + "L = [('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", "\n", "def cmp_by_each_element(a):\n", " return a[1]\n", @@ -266,10 +245,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -294,36 +271,26 @@ "print('sorted by the second character:', S)" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- sort() 함수 인자로 reverse 값을 받을 수 있다.\n", - " - 디폴트 reverse 인자값은 False\n", - " - reverse 인자값을 True로 주면 역순으로 정렬됨" - ] - }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[9, 8, 6, 6, 3, 2, 1]\n", - "[1, 2, 3, 6, 6, 8, 9]\n" + "['123', '2345', '34', '56']\n", + "['34', '56', '123', '2345']\n" ] } ], "source": [ - "L = [1, 6, 3, 8, 6, 2, 9]\n", - "L.sort(reverse = True) # L.sort(reverse = 1)\n", + "L = ['123', '34', '56', '2345']\n", + "L.sort()\n", "print(L)\n", - "L.sort(reverse = False) # L.sort(reverse = 1)\n", + "\n", + "L.sort(key=int)\n", "print(L)" ] }, @@ -331,32 +298,30 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- sort() 함수 인자로 key에 함수를 넣어줄 수 있다.\n", - " - key 인자에 함수가 할당되어 있으면 각 리스트 원소에 대해 비교함수 호출 직전에 key 함수를 먼저 호출한다. " + "- sort() 함수 인자로 reverse 값을 받을 수 있다.\n", + " - 디폴트 reverse 인자값은 False\n", + " - reverse 인자값을 True로 주면 역순으로 정렬됨" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['123', '2345', '34', '56']\n", - "['34', '56', '123', '2345']\n" + "[9, 8, 6, 6, 3, 2, 1]\n", + "[1, 2, 3, 6, 6, 8, 9]\n" ] } ], "source": [ - "L = ['123', '34', '56', '2345']\n", - "L.sort()\n", + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "L.sort(reverse=True) # L.sort(reverse = 1)\n", "print(L)\n", - "\n", - "L.sort(key=int)\n", + "L.sort(reverse=False) # L.sort(reverse = 1)\n", "print(L)" ] }, @@ -370,10 +335,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -393,10 +356,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -415,16 +376,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Python2: sorted() 함수의 두번째 인자로 cmp 함수 할당 가능\n", - "- Python3: sorted() 함수의 두번째 인자로 key를 지정하는 함수 할당 가능 " + "- Python2: sorted() 함수의 두번째 인자로 cmp를 지정하는 함수 할당 가능\n", + " - 지정된 cmp 함수는 1, 0, -1만 Return\n", + " \n", + "- Python3: sorted() 함수의 두번째 인자로 key를 지정하는 함수 할당 가능 \n", + " - 지정된 key 함수가 할당되어 있으면 각 리스트 원소에 대해 기본 비교함수 호출 직전에 key 함수를 먼저 호출한다." ] }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 15, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -433,7 +395,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# ['123', '2345', '34', '56']\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# ['123', '2345', '34', '56']\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: mycmp() missing 1 required positional argument: 'a2'" ] } @@ -452,9 +414,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -487,9 +447,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -529,9 +487,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -549,9 +505,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -585,9 +539,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -607,9 +559,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -642,9 +592,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -672,15 +620,29 @@ "***\n", "## 2 리스트 내포(List Comprehension)\n", "***\n", + "- 다음은 고등학교 수학에서 배운 집합의 표기 방법이다.\n", + " - A = {x^2 | x in {0, ..., 9}}\n", + " - B = {1, 2, 4, 8, 16, ..., 2^16}\n", + " - C = {x | x in S and x is odd}\n", + "\n", + "- 파이썬의 리스트 내포(list comprehension)는 바로 위 집합 표기법과 유사한 방식의 리터럴이다. \n", + "- 위 집합들을 리스트 내포 방식으로 표현하면 다음과 같다. \n", + " - A = [x**2 for x in range(10)]\n", + " - B = [2**i for i in range(17)]\n", + " - C = [x for x in S if x % 2 == 1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "- 일반적인 리스트 생성법" ] }, { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -708,9 +670,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -737,10 +697,7 @@ " for exprN in sequenceN\n", " if condition]\n", "\n", - "- expression의 평가 결과 반드시 한 개의 원소가 나와야 한다.\n", - " - 틀린 예: [ x, y for x in seq1 for u in seq2 ]\n", - "- 만약 두 개의 이상의 평가 결과가 나오면 튜플 등으로 감싸 주어야 한다.\n", - " - 올바른 예: [ (x, y) for x in seq1 for u in seq2 ]\n", + "\n", "- 위 리터럴은 다음의 일반적인 for 문의 리털러과 동일\n", "
\n",
     "l = []\n",
@@ -751,15 +708,20 @@
     "            if condition:\n",
     "               l.append(expression)\n",
     "
\n", - " " + " \n", + " \n", + "- expression의 평가 결과 반드시 한 개의 원소가 나와야 한다.\n", + " - 틀린 예: [ x, y for x in seq1 for y in seq2 ]\n", + " \n", + "- 만약 두 개의 이상의 평가 결과가 나오면 튜플 등으로 감싸 주어야 한다.\n", + " - 올바른 예: [ (x, y) for x in seq1 for y in seq2 ]\n", + " \n" ] }, { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -784,9 +746,7 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -814,9 +774,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -835,9 +793,7 @@ { "cell_type": "code", "execution_count": 25, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -867,9 +823,7 @@ { "cell_type": "code", "execution_count": 26, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -894,9 +848,7 @@ { "cell_type": "code", "execution_count": 27, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -921,6 +873,31 @@ " print(i)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 피타고라스 삼각형의 각 3변의 길이 리스트 (조건: 각 변 x, y, z의 길이는 30 보다 작아야 하며, x <= y <= z 이어야 함)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(3, 4, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 15, 17), (9, 12, 15), (10, 24, 26), (12, 16, 20), (15, 20, 25), (20, 21, 29)]\n" + ] + } + ], + "source": [ + "k = [(x,y,z) for x in range(1,30) for y in range(x,30) for z in range(y,30) if x**2 + y**2 == z**2]\n", + "print(k)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -945,7 +922,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/supplement-2016-09.ipynb b/python3.6/supplement-2016-09.ipynb index 5737b56..1c5a17e 100644 --- a/python3.6/supplement-2016-09.ipynb +++ b/python3.6/supplement-2016-09.ipynb @@ -3546,7 +3546,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.6.4" } }, "nbformat": 4, From 0abbc757fa2b3e7d675f85b3b2a71f36a8e26eb5 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Tue, 23 Oct 2018 11:04:30 +0900 Subject: [PATCH 090/124] ... --- python3.6/python08.ipynb | 47 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/python3.6/python08.ipynb b/python3.6/python08.ipynb index 04b91da..976bc1b 100644 --- a/python3.6/python08.ipynb +++ b/python3.6/python08.ipynb @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -82,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -111,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -126,6 +126,7 @@ "\n", " spam and ham\n", "spam and ham \n", + "\n", "abc\n", "abc\n" ] @@ -261,7 +262,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -283,7 +284,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -313,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -339,7 +340,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -361,7 +362,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -390,7 +391,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -443,7 +444,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -460,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -559,7 +560,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -576,7 +577,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -593,7 +594,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -618,7 +619,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -648,7 +649,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -667,7 +668,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -691,7 +692,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -708,7 +709,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -725,7 +726,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -744,7 +745,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -763,7 +764,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -789,7 +790,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 28, "metadata": {}, "outputs": [ { From f4bfdef2098cb36d1f95485130e5af6387fa0a43 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Tue, 23 Oct 2018 12:02:57 +0900 Subject: [PATCH 091/124] ... --- python3.6/assignment-2.ipynb | 2 +- python3.6/assignment-3.ipynb | 49 ++- python3.6/python11.ipynb | 622 +++++++++++++++++++---------------- python3.6/python12.ipynb | 252 ++++++-------- 4 files changed, 491 insertions(+), 434 deletions(-) diff --git a/python3.6/assignment-2.ipynb b/python3.6/assignment-2.ipynb index 3050806..2e6650c 100644 --- a/python3.6/assignment-2.ipynb +++ b/python3.6/assignment-2.ipynb @@ -687,7 +687,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/assignment-3.ipynb b/python3.6/assignment-3.ipynb index 0976575..7807ac7 100644 --- a/python3.6/assignment-3.ipynb +++ b/python3.6/assignment-3.ipynb @@ -6,7 +6,7 @@ "source": [ "# Assignment 3\n", "### [정보]\n", - "#### 1) Due Date: 2017년 10월 30일 (월), 23시 59분\n", + "#### 1) Due Date: 2018년 10월 29일 (월), 23시 59분\n", "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", @@ -135,28 +135,57 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [ACM-ICPC 문제 1152번] \n", - " - 단어의 개수
\n", - " https://www.acmicpc.net/problem/1152" + "- [ACM-ICPC 문제 1673번] \n", + " - 치킨 쿠폰
\n", + " https://www.acmicpc.net/problem/1673" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- [Incremental Project] 이전 Assignment 2의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하고 단어들의 총 개수를 출력하는 프로그램을 작성하는 것이었다. 이번에는 그 마지막 숙제를 그대로 확장하여 웹 URL로 지정된 웹페이지 내 순수 텍스트 안에 존재하는 각 단어들에 대해 다음 요구사항 대로 출력하는 프로그램을 작성하시오. \n", - " - 요구사항 1. 순수 텍스트 안에 존재하는 단어들에 대해 string 모듈을 활용하여 모든 punctuation (구두문자)를 완벽히 제거하시오.\n", + "- [Incremental Project] 이전 Assignment 2의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하고 단어들의 총 개수를 출력하는 프로그램을 작성하는 것이었다. 이번에는 그 마지막 숙제를 그대로 확장하여 웹 URL로 지정된 웹페이지 내 순수 텍스트 안에 존재하는 각 단어들에 대해 다음 요구사항 대로 출력하는 프로그램을 작성하시오.\n", + " - 요구사항 1. CSS와 Javascript 내용도 모두 제거하시오 (이전 숙제에서 이미 제외하였다면 본 요구사항 무시)\n", + " - 즉, 아래와 같은 코드는 전체를 모두 제거" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + " \n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "+   \n", + " - 요구사항 2. 순수 텍스트 안에 존재하는 단어들에 대해 string 모듈을 활용하여 모든 punctuation (구두문자)를 완벽히 제거하시오.\n", " - 예: ['world!', ':', '+hello+', '~python$$$', '=', 'world'] ---> ['world', 'hello', 'python', 'world']\n", " - 모든 punctuation을 확인하는 방법은 아래와 같다.\n", "
\n",
     "    import string\n",
     "    print(string.punctuation)\n",
     "    
\n", - " - 요구사항 2. 만약 punctuation (구두문자)를 제거한 이후 공백으로 판명되는 단어들은 해당 단어 리스트에서 제거하시오.\n", - " - 예: ['컴퓨터공학부!', '---?', '%지향~', '...'] ---> ['컴퓨터공학부', '지향']\n", + " - 요구사항 3. 만약 punctuation (구두문자)를 제거한 이후 공백으로 판명되는 단어들은 해당 단어 리스트에서 제거하시오.\n", + " - 예: ['컴퓨터공학부!', '---?', '%지향~', '...'] ---> ['컴퓨터공학부', '', '지향', ''] ---> ['컴퓨터공학부', '지향'] \n", + "

\n", " - 요구사항 3. 각 단어들의 출현빈도를 사전형태로 저장하여 출력하시오.\n", " - 예: ['world', 'hello', 'python', 'world', '컴퓨터공학부', '지향'] ---> {'world': 2, 'hello': 1, 'python': 1, '컴퓨터공학부': 1, '지향': 1}\n", - " - 요구사항 4. 다음 3개의 사이트에 대한 결과를 출력하시오.\n", + "

\n", + " - 요구사항 4. 다음 5개의 사이트에 대한 단어 출현빈도 결과를 출력하시오.\n", + " - http://cse.koreatech.ac.kr\n", + " - https://www.koreatech.ac.kr\n", " - http://www.naver.com\n", " - http://www.daum.net\n", " - http://www.nytimes.com" @@ -180,7 +209,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python11.ipynb b/python3.6/python11.ipynb index 05dd5bd..66b661c 100644 --- a/python3.6/python11.ipynb +++ b/python3.6/python11.ipynb @@ -34,9 +34,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -60,9 +58,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -86,9 +82,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -119,9 +113,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -142,9 +134,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -173,9 +163,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -205,9 +193,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -276,14 +262,39 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "foo\n", + "bar\n", + "4\n", + "5\n", + "\n", + "foo\n", + "bar\n", + "4\n", + "5\n" + ] + } + ], "source": [ "a = ['foo', 'bar', 4, 5]\n", - "[x, y, z, w] = a" + "[x, y, z, w] = a\n", + "print(x)\n", + "print(y)\n", + "print(z)\n", + "print(w)\n", + "print()\n", + "\n", + "x, y, z, w = a\n", + "print(x)\n", + "print(y)\n", + "print(z)\n", + "print(w)" ] }, { @@ -291,23 +302,46 @@ "metadata": {}, "source": [ "- 튜플과 리스트와의 공통점\n", - " - 원소로서 임의의 객체를 저장\n", + " - 원소에 임의의 객체를 저장\n", " - 시퀀스 자료형\n", " - 인덱싱, 슬라이싱, 연결, 반복, 멤버쉽 테스트 연산 지원\n", " \n", "- 리스트와 다른 튜플만의 특징\n", " - 변경 불가능 (Immutable)\n", - " - 메소드를 가지지 않는다.\n", - "\n", + " - 튜플은 count와 index 외에 다른 메소드를 가지지 않는다." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "0\n" + ] + } + ], + "source": [ + "T = (1, 2, 2, 3, 3, 4, 4, 4, 4, 5)\n", + "print(T.count(4))\n", + "print(T.index(1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "- list() 와 tuple() 내장 함수를 사용하여 리스트와 튜플을 상호 변환할 수 있음" ] }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -319,7 +353,7 @@ } ], "source": [ - "T = (1,2,3,4,5)\n", + "T = (1, 2, 3, 4, 5)\n", "L = list(T)\n", "L[0] = 100\n", "print(L)\n", @@ -366,9 +400,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -392,9 +424,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -423,7 +453,7 @@ " - 변경 가능(Mutable)한 객체이다.\n", " - 각 원소간에 순서는 없다.\n", " - 각 원소는 중복될 수 없다.\n", - " - [note] 시퀀스 자료형이 아니다." + " - [note] set은 컨네이너 자료형이지만 시퀀스 자료형은 아니다." ] }, { @@ -435,24 +465,13 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 33, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "{1, 2, 3}\n", - "\n", - "\n", - "{1, 2, 3}\n", - "\n", - "\n", - "{'c', 'a', 'b'}\n", - "\n", "\n", "{1, 2, 3}\n" ] @@ -461,35 +480,67 @@ "source": [ "a = set([1, 2, 3])\n", "print(type(a))\n", - "print(a)\n", - "print()\n", - "\n", + "print(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "{1, 2, 3}\n" + ] + } + ], + "source": [ "b = set((1, 2, 3))\n", "print(type(b))\n", - "print(b)\n", - "print()\n", - "\n", + "print(b)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "{'c', 'a', 'b'}\n" + ] + } + ], + "source": [ "c = set({'a':1, 'b':2, 'c':3})\n", "print(type(c))\n", - "print(c)\n", - "print()\n", - "\n", + "print(c)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "{1, 2, 3}\n" + ] + } + ], + "source": [ "d = set({'a':1, 'b':2, 'c':3}.values())\n", "print(type(d))\n", - "print(d)\n", - "\n", - "\n", - "# \n", - "# set([1, 2, 3])\n", - "\n", - "# \n", - "# set([1, 2, 3])\n", - "\n", - "# \n", - "# set(['a', 'c', 'b'])\n", - "\n", - "# \n", - "# set([1, 2, 3])" + "print(d)" ] }, { @@ -501,10 +552,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 18, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -524,25 +573,18 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 문자열은 각 문자를 집합 원소로 지닌다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 각 튜플은 원소로 가질 수 있음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 문자열은 각 문자를 집합 원소로 지닌다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 각 튜플은 원소로 가질 수 있음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" ] } ], "source": [ - "print(set()) # 빈 set 객체 생성\n", - "print(set([1,2,3,4,5])) # 초기 값은 일반적으로 시퀀스 자료형인 리스트를 넣어준다.\n", - "print(set([1,2,3,2,3,4])) # 중복된 원소는 한 번만 표현\n", - "print(set('abc')) # 문자열은 각 문자를 집합 원소로 지닌다. \n", - "print(set([(1,2,3),(4,5,6)])) # 각 튜플은 원소로 가질 수 있음 \n", - "print(set([[1,2,3],[4,5,6]])) # 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다.\n", - "\n", - "\n", - "# set([])\n", - "# set([1, 2, 3, 4, 5])\n", - "# set([1, 2, 3, 4])\n", - "# set(['a', 'c', 'b'])\n", - "# set([(4, 5, 6), (1, 2, 3)])" + "print(set()) # 빈 set 객체 생성\n", + "print(set([1, 2, 3, 4, 5])) # 초기 값은 일반적으로 시퀀스 자료형인 리스트를 넣어준다.\n", + "print(set([1, 2, 3, 2, 3, 4])) # 중복된 원소는 한 나만 저장됨\n", + "print(set('abc')) # 문자열은 각 문자를 집합 원소로 지닌다. \n", + "print(set([(1, 2, 3), (4, 5, 6)])) # 각 튜플은 원소로 가질 수 있음 \n", + "print(set([[1, 2, 3], [4, 5, 6]])) # 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다." ] }, { @@ -560,10 +602,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, + "execution_count": 19, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -610,10 +650,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, + "execution_count": 20, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -628,8 +666,8 @@ } ], "source": [ - "B = set([4,5,6,10,20,30])\n", - "C = set([10,20,30])\n", + "B = set([4, 5, 6, 10, 20, 30])\n", + "C = set([10, 20, 30])\n", "\n", "print(C.issubset(B)) # C가 B의 부분집합?\n", "print(C <= B)\n", @@ -640,82 +678,79 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, + "execution_count": 37, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30}\n", - "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", - "\n", - "{4, 5, 6}\n", - "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", - "\n", - "{1, 2, 3, 7, 8, 9}\n", - "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", - "\n", - "{1, 2, 3, 7, 8, 9, 10, 20, 30}\n", + "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30}\n", "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n" ] } ], "source": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "B = set([4,5,6,10,20,30])\n", + "A = set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + "B = set([4, 5, 6, 10, 20, 30])\n", "\n", "print(A.union(B)) # A와 B의 합집합\n", - "print(A)\n", - "print()\n", - "\n", - "print(A.intersection(B)) # A와 B의 교집합\n", - "print(A)\n", - "print()\n", - "\n", - "print(A.difference(B)) # A - B (차집합)\n", - "print(A)\n", - "print()\n", - "\n", - "print(A.symmetric_difference(B)) # 베타집합. A와 B의 합집합에서 교집합의 원소를 제외한 집합\n", - "print(A)\n", - "\n", - "\n", - "# set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", - "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "# set([4, 5, 6])\n", - "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "# set([1, 2, 3, 7, 8, 9])\n", - "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "# set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", - "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])" + "print(A | B)\n", + "print(A)" ] }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, + "execution_count": 38, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30}\n", - "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", - "\n", "{4, 5, 6}\n", - "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", - "\n", + "{4, 5, 6}\n", + "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n" + ] + } + ], + "source": [ + "print(A.intersection(B)) # A와 B의 교집합\n", + "print(A & B)\n", + "print(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ "{1, 2, 3, 7, 8, 9}\n", - "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", - "\n", + "{1, 2, 3, 7, 8, 9}\n", + "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n" + ] + } + ], + "source": [ + "print(A.difference(B)) # A - B (차집합)\n", + "print(A - B)\n", + "print(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ "{1, 2, 3, 7, 8, 9, 10, 20, 30}\n", "{1, 2, 3, 7, 8, 9, 10, 20, 30}\n", "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n" @@ -723,46 +758,15 @@ } ], "source": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", - "B = set([4,5,6,10,20,30])\n", - "\n", - "print(A | B) # A와 B의 합집합\n", - "print(A)\n", - "print()\n", - "\n", - "print(A & B) # A와 B의 교집합\n", - "print(A)\n", - "print()\n", - "\n", - "print(A - B) #A - B (차집합)\n", - "print(A)\n", - "print()\n", - "\n", "print(A.symmetric_difference(B)) # 베타집합. A와 B의 합집합에서 교집합의 원소를 제외한 집합\n", "print(A ^ B)\n", - "print(A)\n", - "\n", - "\n", - "# set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30])\n", - "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "# set([4, 5, 6])\n", - "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "# set([1, 2, 3, 7, 8, 9])\n", - "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "# set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", - "# set([1, 2, 3, 7, 8, 9, 10, 20, 30])\n", - "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])" + "print(A)" ] }, { "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": false - }, + "execution_count": 25, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -782,13 +786,7 @@ "print()\n", "\n", "print(A == D) #자료값 비교\n", - "print(A is D) #객체 동등성 비교\n", - "\n", - "\n", - "# set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", - "\n", - "# True\n", - "# False" + "print(A is D) #객체 동등성 비교" ] }, { @@ -800,10 +798,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 26, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -812,22 +808,20 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m8\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'set' object does not support indexing" ] } ], "source": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", + "A = set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "print(A[0])" ] }, { "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, + "execution_count": 27, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -836,7 +830,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'set' object is not subscriptable" ] } @@ -847,10 +841,8 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, + "execution_count": 28, + "metadata": {}, "outputs": [ { "ename": "AttributeError", @@ -859,7 +851,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'set' object has no attribute 'sort'" ] } @@ -878,10 +870,8 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, + "execution_count": 29, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -906,10 +896,8 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, + "execution_count": 30, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -920,7 +908,7 @@ } ], "source": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", + "A = set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "for ele in A:\n", " print(ele,end=\" \")" ] @@ -947,60 +935,119 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, + "execution_count": 42, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{1, 2, 3, 4, 5, 6}\n", - "{4, 5, 6}\n", - "{4, 5}\n", - "{4, 6, 7}\n", - "{4, 6, 7, 8}\n", - "{4, 6, 7}\n" + "{1, 2, 3, 4, 5, 6}\n" ] } ], "source": [ - "A = set([1,2,3,4])\n", - "B = set([3,4,5,6])\n", + "A = set([1, 2, 3, 4])\n", + "B = set([3,4, 5, 6])\n", "\n", "A.update(B) # A에 B 집합의 원소를 추가 시킴\n", - "print(A)\n", - "\n", + "print(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{4, 5, 6}\n" + ] + } + ], + "source": [ "A.intersection_update([4,5,6,7,8]) # &=\n", - "print(A)\n", - "\n", + "print(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{4, 5}\n" + ] + } + ], + "source": [ "A.difference_update([6,7,8]) # -=\n", - "print(A)\n", - "\n", + "print(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{4, 6, 7}\n" + ] + } + ], + "source": [ "A.symmetric_difference_update([5,6,7]) # ^=\n", - "print(A)\n", - "\n", + "print(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{4, 6, 7, 8}\n" + ] + } + ], + "source": [ "A.add(8) # 원소 추가\n", - "print(A)\n", - "\n", + "print(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{4, 6, 7}\n" + ] + } + ], + "source": [ "A.remove(8) # 원소 제거\n", - "print(A)\n", - "\n", - "\n", - "# set([1, 2, 3, 4, 5, 6])\n", - "# set([4, 5, 6])\n", - "# set([4, 5])\n", - "# set([4, 6, 7])\n", - "# set([8, 4, 6, 7])\n", - "# set([4, 6, 7])" + "print(A)" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 49, "metadata": { - "collapsed": false, "scrolled": true }, "outputs": [ @@ -1011,7 +1058,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 없는 원소를 제거하면 KeyError 발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 없는 원소를 제거하면 KeyError 발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mKeyError\u001b[0m: 10" ] } @@ -1022,37 +1069,58 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": false - }, + "execution_count": 50, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{4, 7}\n", - "{7}\n", - "set()\n" + "{4, 7}\n" ] } ], "source": [ "A.discard(10) # remove와 같으나 예외가 발생하지 않음\n", "A.discard(6) # 원소 6제거\n", - "print(A)\n", - "\n", + "print(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{7}\n" + ] + } + ], + "source": [ "A.pop() # 임의의 원소 하나 꺼내기\n", - "print(A)\n", - "\n", + "print(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "set()\n" + ] + } + ], + "source": [ "A = set([1,2,3,4])\n", - "A.clear() # 원소들 없애기\n", - "print(A)\n", - "\n", - "\n", - "# set([4, 7])\n", - "# set([7])\n", - "# set([])" + "A.clear() # 모든 원소 없애기\n", + "print(A)" ] }, { @@ -1079,7 +1147,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python12.ipynb b/python3.6/python12.ipynb index 2d31299..7b81537 100644 --- a/python3.6/python12.ipynb +++ b/python3.6/python12.ipynb @@ -29,9 +29,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -42,7 +40,7 @@ } ], "source": [ - "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", + "member = {'basketball': 5, 'soccer': 11, 'baseball': 9}\n", "print(member['baseball']) # 검색" ] }, @@ -58,9 +56,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -72,7 +68,7 @@ } ], "source": [ - "member = {'basketball':5, 'soccer':11, 'baseball':9}\n", + "member = {'basketball': 5, 'soccer': 11, 'baseball': 9}\n", "member['volleyball'] = 7 # 새로운 아이템 설정\n", "member['volleyball'] = 6 # 변경\n", "print(member)\n", @@ -84,7 +80,8 @@ "metadata": {}, "source": [ "- 사전을 출력하면 각 아이템들이 임의의 순서로 출력된다.\n", - "- 새로운 아이템이 들어오면 키 내용에 따라 그 순서가 달라진다.\n", + " - 마치 순서대로 출력이 되는 것 처럼 보이지만, 사전내에 있는 아이템들은 순서정보가 없음.\n", + " \n", "- 내부적으로 키 내용에 대해 해쉬(Hash) 기법을 사용\n", " - 검색 속도가 매우 빠름\n", " - [참고]: http://www.laurentluce.com/posts/python-dictionary-implementation/\n", @@ -94,9 +91,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -124,10 +119,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -135,7 +128,21 @@ "text": [ "{'str': 'abc', 1: 4, (1, 2, 3): 'tuple'}\n" ] - }, + } + ], + "source": [ + "d = {}\n", + "d['str'] = 'abc'\n", + "d[1] = 4\n", + "d[(1,2,3)] = 'tuple'\n", + "print(d)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ { "ename": "TypeError", "evalue": "unhashable type: 'list'", @@ -143,26 +150,19 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'tuple'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'list'\u001b[0m \u001b[0;31m# 리스트는 키가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'list'\u001b[0m \u001b[0;31m# 리스트는 키가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" ] } ], "source": [ - "d = {}\n", - "d['str'] = 'abc'\n", - "d[1] = 4\n", - "d[(1,2,3)] = 'tuple'\n", - "print(d)\n", "d[[1,2,3]] = 'list' # 리스트는 키가 될 수 없다." ] }, { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -171,7 +171,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m3\u001b[0m \u001b[0;31m# 사전은 키가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m3\u001b[0m \u001b[0;31m# 사전은 키가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'dict'" ] } @@ -190,18 +190,14 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9\n", - "-1\n", - "\n", - "1\n" + "-1\n" ] } ], @@ -214,8 +210,23 @@ "\n", "action = {0: add, 1: sub} # 함수 이름을 사전의 값으로 사용\n", "print(action[0](4, 5))\n", - "print(action[1](4, 5))\n", - "print()\n", + "print(action[1](4, 5))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n" + ] + } + ], + "source": [ "action2 = {add: 1, sub: 2} # 함수 이름을 사전의 키로 사용\n", "print(action2[add])" ] @@ -229,10 +240,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -253,28 +262,26 @@ "\n", "print(dict(one=1, two=2))\n", "print(dict([('one', 1), ('two', 2)]))\n", - "print(dict({'one':1, 'two':2}))\n", - "\n", - "\n", - "# \n", - "\n", - "# {'two': 2, 'one': 1}\n", - "# {'two': 2, 'one': 1}\n", - "# {'two': 2, 'one': 1}" + "print(dict({'one':1, 'two':2}))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- zip(A, B): 두 개의 컨테이너/시퀀스 자료 A, B에 속한 원소들을 순서대로 쌍으로 묶은 튜플들을 반환할 수 있는 zip 객체 반환" ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "{'one': 1, 'two': 2, 'three': 3}\n" ] } @@ -282,12 +289,8 @@ "source": [ "keys = ['one', 'two', 'three']\n", "values = (1, 2, 3)\n", - "print(zip(keys, values)) # zip(): 두 개의 자료를 순서대로 쌍으로 묶은 튜플들의 리스트 반환\n", - "print(dict(zip(keys, values)))\n", - "\n", - "\n", - "# [('one', 1), ('two', 2), ('three', 3)]\n", - "# {'three': 3, 'two': 2, 'one': 1}" + "print(zip(keys, values)) \n", + "print(dict(zip(keys, values)))" ] }, { @@ -304,18 +307,16 @@ "metadata": {}, "source": [ "- 사전이 지원하는 중요 메소드\n", - " - D.keys(): 사전 D에서 키들을 리스트로 반환\n", - " - D.values(): 사전 D에서 값들을 리스트로 반환\n", - " - D.items(): 사전 D에서 각 아이템을 튜플형태로 가져와 리스트로 반환\n", + " - D.keys(): 사전 D에서 키를 차례로 반환할 수 있는 dict_keys 객체 반환\n", + " - D.values(): 사전 D에서 값을 차례로 반환할 수 있는 dict_values 객체 반환\n", + " - D.items(): 사전 D에서 각 (키, 값) 아이템을 차례로 반환할 수 있는 dict_items 객체 반환\n", "- key in D: 사전 D안에 key를 키값을 가진 아이템이 있는지 확인" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -331,22 +332,14 @@ } ], "source": [ - "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "phone = {'jack': 9465215, 'jin': 1111, 'Joseph': 6584321}\n", "\n", - "print(phone.keys()) # 키의 리스트 반환\n", - "print(phone.values()) # 값들의 리스트 반환\n", - "print(phone.items()) # (키, 값)의 리스트 반환\n", + "print(phone.keys()) \n", + "print(phone.values()) \n", + "print(phone.items())\n", "print()\n", "print('jack' in phone) # 'jack'이 phone의 키에 포함되어 있는가?\n", - "print('lee' in phone)\n", - "\n", - "\n", - "# ['jin', 'Joseph', 'jack']\n", - "# [1111, 6584321, 9465215]\n", - "# [('jin', 1111), ('Joseph', 6584321), ('jack', 9465215)]\n", - "\n", - "# True\n", - "# False" + "print('lee' in phone)" ] }, { @@ -359,9 +352,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -400,9 +391,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -445,10 +434,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -460,7 +447,7 @@ } ], "source": [ - "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "ph = {'jack': 9465215, 'jin': 1111, 'Joseph': 6584321}\n", "\n", "print(ph.get('jack')) # 'jack'에 대한 값을 얻는다. ph['jack']과 같다.\n", "print(ph.get('gslee')) # 'gslee'에 대한 값을 얻는다. 값이 없는 경우 None반환" @@ -468,10 +455,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 15, + "metadata": {}, "outputs": [ { "ename": "KeyError", @@ -480,22 +465,20 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'jack'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m9465215\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'jin'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m1111\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Joseph'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m6584321\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mph\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'gslee'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# ph['gslee']는 키가 없는 경우 예외발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'jack'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m9465215\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'jin'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1111\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Joseph'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m6584321\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mph\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'gslee'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# ph['gslee']는 키가 없는 경우 예외발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mKeyError\u001b[0m: 'gslee'" ] } ], "source": [ - "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "ph = {'jack': 9465215, 'jin': 1111, 'Joseph': 6584321}\n", "print(ph['gslee']) # ph['gslee']는 키가 없는 경우 예외발생" ] }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -516,7 +499,7 @@ } ], "source": [ - "ph = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", + "ph = {'jack': 9465215, 'jin': 1111, 'Joseph': 6584321}\n", "print(ph.get('gslee', 5284)) # 인수를 하나 더 제공하면 'gslee'가 없는 경우에 5284 리턴\n", "print(ph) # 사전에는 변화가 없다\n", "print()\n", @@ -535,10 +518,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 17, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -551,8 +532,9 @@ } ], "source": [ - "phone = {'jack':9465215, 'jin':1111, 'Joseph':6584321}\n", - "ph = {'kim':12312, 'lee': 9090}\n", + "phone = {'jack': 9465215, 'jin': 1111, 'Joseph': 6584321}\n", + "ph = {'kim': 12312, 'lee': 9090}\n", + "\n", "phone.update(ph) # 사전 phone의 내용을 ph으로 추가 갱신\n", "print(phone)\n", "print()\n", @@ -579,9 +561,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -609,9 +589,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -639,9 +617,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -668,34 +644,27 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, + "execution_count": 22, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "dict_items([('a', 1), ('b', 2), ('c', 3)])\n", - "\n" - ] - }, - { - "ename": "AttributeError", - "evalue": "'dict_items' object has no attribute 'sort'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mitems\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mAttributeError\u001b[0m: 'dict_items' object has no attribute 'sort'" + "[('c', 1), ('a', 2), ('b', 3)]\n", + "\n", + "[('a', 2), ('b', 3), ('c', 1)]\n", + "\n", + "a 2\n", + "b 3\n", + "c 1\n" ] } ], "source": [ - "D = {'a':1, 'b':2, 'c':3}\n", - "items = D.items()\n", + "D = {'c':1, 'a':2, 'b':3}\n", + "#items = D.items()\n", + "items = list(D.items())\n", "print(items)\n", "print()\n", "\n", @@ -703,17 +672,8 @@ "print(items)\n", "print()\n", "\n", - "for k,v in items:\n", - " print(k, v)\n", - " \n", - " \n", - "# [('a', 1), ('c', 3), ('b', 2)]\n", - "\n", - "# [('a', 1), ('b', 2), ('c', 3)]\n", - "\n", - "# a 1\n", - "# b 2\n", - "# c 3" + "for k, v in items:\n", + " print(k, v)" ] }, { @@ -741,7 +701,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, From ab4f4cc4e2e9e71a915bd3e819f433feaa5b1d31 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Tue, 23 Oct 2018 12:14:28 +0900 Subject: [PATCH 092/124] ... --- assignment-2.ipynb | 16 +++++++--------- python3.6/assignment-3.ipynb | 27 +++++++++------------------ 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/assignment-2.ipynb b/assignment-2.ipynb index 1472683..43279b3 100644 --- a/assignment-2.ipynb +++ b/assignment-2.ipynb @@ -118,9 +118,7 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import urllib2\n", @@ -134,23 +132,23 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [Root]", + "display_name": "Python 3", "language": "python", - "name": "Python [Root]" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.6.4" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/python3.6/assignment-3.ipynb b/python3.6/assignment-3.ipynb index 7807ac7..75f36e8 100644 --- a/python3.6/assignment-3.ipynb +++ b/python3.6/assignment-3.ipynb @@ -146,30 +146,21 @@ "source": [ "- [Incremental Project] 이전 Assignment 2의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하고 단어들의 총 개수를 출력하는 프로그램을 작성하는 것이었다. 이번에는 그 마지막 숙제를 그대로 확장하여 웹 URL로 지정된 웹페이지 내 순수 텍스트 안에 존재하는 각 단어들에 대해 다음 요구사항 대로 출력하는 프로그램을 작성하시오.\n", " - 요구사항 1. CSS와 Javascript 내용도 모두 제거하시오 (이전 숙제에서 이미 제외하였다면 본 요구사항 무시)\n", - " - 즉, 아래와 같은 코드는 전체를 모두 제거" - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - " \n", - " \n", + " ``` \n", + " \n", + " ```\n", " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "+   \n", + " \n", + " ```\n", " - 요구사항 2. 순수 텍스트 안에 존재하는 단어들에 대해 string 모듈을 활용하여 모든 punctuation (구두문자)를 완벽히 제거하시오.\n", " - 예: ['world!', ':', '+hello+', '~python$$$', '=', 'world'] ---> ['world', 'hello', 'python', 'world']\n", " - 모든 punctuation을 확인하는 방법은 아래와 같다.\n", @@ -188,7 +179,7 @@ " - https://www.koreatech.ac.kr\n", " - http://www.naver.com\n", " - http://www.daum.net\n", - " - http://www.nytimes.com" + " - http://www.nytimes.com " ] } ], From 0e6df225a82549b0b731c46c033487504a24d75d Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Tue, 6 Nov 2018 23:45:10 +0900 Subject: [PATCH 093/124] dsdsds --- python3.6/output.txt | 1 + python3.6/pickle.txt | Bin 0 -> 105 bytes python3.6/pickle2.txt | Bin 0 -> 45 bytes python3.6/python13.ipynb | 213 +++++++++++++++------------------------ python3.6/python14.ipynb | 98 +++++------------- python3.6/removeme.txt | 3 + python3.6/t.txt | 2 +- python3.6/t1.txt | 3 + 8 files changed, 114 insertions(+), 206 deletions(-) create mode 100644 python3.6/output.txt create mode 100644 python3.6/pickle.txt create mode 100644 python3.6/pickle2.txt create mode 100644 python3.6/removeme.txt create mode 100644 python3.6/t1.txt diff --git a/python3.6/output.txt b/python3.6/output.txt new file mode 100644 index 0000000..665232c --- /dev/null +++ b/python3.6/output.txt @@ -0,0 +1 @@ +Hello koreatech! diff --git a/python3.6/pickle.txt b/python3.6/pickle.txt new file mode 100644 index 0000000000000000000000000000000000000000..727531cc0486a791728f34bbce919700006887a3 GIT binary patch literal 105 zcmZo*t}SHHh+t-5U?|DYEoAh1*Wknu!2;xFB_?MVGI`bKPGA5_XJzIVGJE~)%3z3K z14?`47pE3v6tZ|RR-`bL#ul<_fQ5@oiZb)k3)y@xvAElxW09C#vL`FGt&m+00LkJV Aw*UYD literal 0 HcmV?d00001 diff --git a/python3.6/pickle2.txt b/python3.6/pickle2.txt new file mode 100644 index 0000000000000000000000000000000000000000..c53d78f5ca8f97f1079dc29208e22d6c3a402a9a GIT binary patch literal 45 zcmZo*PL7YyP0Y-TkLL=`%q_@C\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m't.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxreadlines\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseek\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m't.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxreadlines\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseek\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAttributeError\u001b[0m: '_io.TextIOWrapper' object has no attribute 'xreadlines'" ] } @@ -409,10 +389,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -445,10 +423,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -480,10 +456,8 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -510,10 +484,8 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, + "execution_count": 15, + "metadata": {}, "outputs": [], "source": [ "f = open('removeme.txt', 'w') # 파일의 생성\n", @@ -524,10 +496,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -567,9 +537,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -619,10 +587,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, + "execution_count": 18, + "metadata": {}, "outputs": [], "source": [ "import sys\n", @@ -639,10 +605,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 19, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -662,10 +626,8 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, + "execution_count": 20, + "metadata": {}, "outputs": [], "source": [ "print(\"Hello koreatech!\", file=open(\"output.txt\", \"w\"))" @@ -673,10 +635,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 21, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -702,20 +662,18 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, + "execution_count": 22, + "metadata": {}, "outputs": [ { "ename": "TypeError", - "evalue": "unsupported operand type(s) for >>: 'builtin_function_or_method' and 'OutStream'", + "evalue": "unsupported operand type(s) for >>: 'builtin_function_or_method' and 'OutStream'. Did you mean \"print(, file=)\"?", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m \u001b[0;34m>>\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstderr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Warning, action field not supplied\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for >>: 'builtin_function_or_method' and 'OutStream'" + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m \u001b[0;34m>>\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstderr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Warning, action field not supplied\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for >>: 'builtin_function_or_method' and 'OutStream'. Did you mean \"print(, file=)\"?" ] } ], @@ -732,10 +690,8 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, + "execution_count": 23, + "metadata": {}, "outputs": [ { "name": "stderr", @@ -758,10 +714,8 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, + "execution_count": 24, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -796,18 +750,18 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, + "execution_count": 25, + "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "abc\n", - "\n", - "abc\n" + "ename": "ModuleNotFoundError", + "evalue": "No module named 'StringIO'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mStringIO\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mStringIO\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mStringIO\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"abc\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseek\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'StringIO'" ] } ], @@ -829,22 +783,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 표준 출력으로 문자열 객체에 내용 작성하기" + "- 표준 출력으로 문자열 객체에 내용 작성하기\n", + " - python3 에서는 io 모듈내에 StringIO 클래스 존재" ] }, { "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, + "execution_count": 36, + "metadata": {}, "outputs": [], "source": [ "import sys\n", - "import StringIO\n", + "from io import StringIO\n", "\n", "stdout = sys.stdout # 표준 출력 저장해 두기\n", - "sys.stdout = f = StringIO.StringIO() \n", + "sys.stdout = f = StringIO() \n", "\n", "print(type(f))\n", "print('Sample output')\n", @@ -856,17 +809,15 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": false - }, + "execution_count": 37, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Done-------\n", - "\n", + "\n", "Sample output\n", "Good\n", "Good\n", @@ -902,7 +853,7 @@ " - anydbm: 시스템에서 사용가능한 모듈 중 가장 최적의 모듈을 반환함\n", " - 기본적으로 dumbdbm을 반환한다\n", " - 사전 자료형을 사용하는 것과 동일한 방법으로 사용\n", - " - pickle 모듈\n", + " - **pickle** 모듈\n", " - 파이썬의 객체를 저장하는 일반화된 지속성 모듈\n", " - 파이썬의 기본 객체뿐만 아니라 사용자 정의의 복잡한 객체도 저장 가능\n", " - 기본적으로 텍스트 모드로 저장하지만 이진 모드로도 저장 가능" @@ -912,21 +863,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 피클링(pickling) 모듈 사용하기" + "- 피클링(pickling) 모듈 사용하기\n", + " - file을 open 할 때 이진 파일로 open 하기\n", + " - 즉, 모드로서 'wb', 'rb' 적용" ] }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 41, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'jim': 6851325, 'Joseph': 6584321, 'jack': 9465215, 'tom': 4358382}\n", + "{'tom': 4358382, 'jack': 9465215, 'jim': 6851325, 'Joseph': 6584321}\n", "['string', 1234, 0.2345]\n" ] } @@ -938,12 +889,12 @@ "List = ['string', 1234, 0.2345]\n", "Tuple = (phone, List) # 리스트, 튜플, 사전의 복합 객체\n", "\n", - "f = open('pickle.txt', 'w') # 파일 객체를 얻는다.\n", + "f = open('pickle.txt', 'wb') # 파일 객체를 얻는다.\n", "\n", "pickle.dump(Tuple, f) # 파일로 출력(pickling), 복합 객체 출력 \n", "f.close() \n", "\n", - "f = open('pickle.txt') \n", + "f = open('pickle.txt', 'rb') \n", " \n", "x,y = pickle.load(f) # 파일에서 읽어오기. 튜플의 내용을 x, y에 받는다.\n", "print(x) # 사전\n", @@ -952,10 +903,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 43, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -974,11 +923,11 @@ "s = Simple() # 인스턴스 객체 생성\n", "s.count = 10 # 인스턴스 이름 공간에 변수 생성\n", "\n", - "f = open('pickle2.txt', 'w')\n", + "f = open('pickle2.txt', 'wb')\n", "pickle.dump(s, f) # 인스턴스 저장\n", "f.close()\n", "\n", - "f = open('pickle2.txt')\n", + "f = open('pickle2.txt', 'rb')\n", "t = pickle.load(f) # 인스턴스 가져오기\n", "print(t.count)" ] @@ -1007,7 +956,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python14.ipynb b/python3.6/python14.ipynb index a572429..40a199f 100644 --- a/python3.6/python14.ipynb +++ b/python3.6/python14.ipynb @@ -32,9 +32,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -72,9 +70,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -155,9 +151,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -237,9 +231,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "os.chmod('sample.txt', 777) # 리눅스에서의 실행 예" @@ -273,9 +265,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -304,9 +294,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "os.mkdir('example') " @@ -315,9 +303,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -344,9 +330,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -381,9 +365,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -409,9 +391,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -440,9 +420,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -468,9 +446,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -501,9 +477,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -531,9 +505,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -557,9 +529,7 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -583,9 +553,7 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -625,9 +593,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -652,9 +618,7 @@ { "cell_type": "code", "execution_count": 25, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -679,9 +643,7 @@ { "cell_type": "code", "execution_count": 26, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -727,9 +689,7 @@ { "cell_type": "code", "execution_count": 28, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "OSError", @@ -781,9 +741,7 @@ { "cell_type": "code", "execution_count": 31, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -811,9 +769,7 @@ { "cell_type": "code", "execution_count": 32, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import shutil\n", @@ -832,9 +788,7 @@ { "cell_type": "code", "execution_count": 33, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -878,9 +832,7 @@ { "cell_type": "code", "execution_count": 35, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -943,7 +895,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/removeme.txt b/python3.6/removeme.txt new file mode 100644 index 0000000..20aeba2 --- /dev/null +++ b/python3.6/removeme.txt @@ -0,0 +1,3 @@ +first line +second line +third line diff --git a/python3.6/t.txt b/python3.6/t.txt index d3827e7..6cf6ad7 100644 --- a/python3.6/t.txt +++ b/python3.6/t.txt @@ -1 +1 @@ -1.0 +spam string diff --git a/python3.6/t1.txt b/python3.6/t1.txt new file mode 100644 index 0000000..272b2e4 --- /dev/null +++ b/python3.6/t1.txt @@ -0,0 +1,3 @@ +first line +second line +third line \ No newline at end of file From 6fdde139ec11ae50412639bdf663fb21da2b6a86 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 14 Nov 2018 23:26:49 +0900 Subject: [PATCH 094/124] dasdas --- python3.6/assignment-4.ipynb | 58 ++++++++-------- python3.6/python15.ipynb | 130 +++++++++-------------------------- python3.6/python16.ipynb | 118 +++++++++++++++++++------------ 3 files changed, 135 insertions(+), 171 deletions(-) diff --git a/python3.6/assignment-4.ipynb b/python3.6/assignment-4.ipynb index 5f79bbe..17dc381 100644 --- a/python3.6/assignment-4.ipynb +++ b/python3.6/assignment-4.ipynb @@ -6,7 +6,7 @@ "source": [ "# Assignment 4\n", "### [정보]\n", - "#### 1) Due Date: 2017년 11월 20일 (월), 23시 59분\n", + "#### 1) Due Date: 2018년 11월 25일 (일), 23시 59분\n", "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", @@ -92,9 +92,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -192,40 +190,38 @@ "source": [ "##### [8번 문제] \n", "이전 Assignment 3의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3를 확장하여 다음과 같은 조건을 만족하도록 구현하시오.\n", - " - 1) 다음 사이트에서 제시되는 영어 불용어 (Stop words)를 참고하여 이전 숙제에서 구성했던 단어 사전에서 영어 불용어들을 모두 제거하는 코드를 추가하시오.\n", - " - http://www.lextek.com/manuals/onix/stopwords1.html\n", - "\n", + " - 1) 다음 사이트에서 제시되는 불용어 (Stop words)를 참고하여 이전 숙제에서 구성했던 단어 사전에서 불용어들을 모두 제거하는 코드를 추가하시오.\n", + " - 영어 불용어: http://www.lextek.com/manuals/onix/stopwords1.html\n", + " - 한글 불용어: https://raw.githubusercontent.com/stopwords-iso/stopwords-ko/master/stopwords-ko.txt\n", " - 2) 각 URL로 지정된 웹페이지의 HTML 소스를 파일로 저장하시오. \n", " - URL이 http://URL 이라면 파일명은 URL.html 이다. \n", - " - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.html 이다. \n", + " - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.html 이다. \n", " - 3) 단어의 출현빈도가 담긴 사전 객체를 위 HTML 소스 파일과 동일한 폴더에 파일로 저장하시오.\n", " - 파일입출력 (E-learning 13주차) 마지막에 학습한 pickle 모듈을 활용하시오. \n", - " - URL이 http://URL 이라면 사전 객체를 담고 있는 파일명은 URL.words.frequency 이다.\n", - " - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.words.frequency 이다.\n", - " - 4) 최소 5개 이상의 영어 웹 사이트 각각에 대한 HTML 소스 파일과 단어 출현빈도 파일을 저장하시오. \n", - " - 즉, 총 10개의 파일을 동일한 폴더에 생성하시오.\n", - " - [주의] 영어 웹사이트 URL로만 5개 이상\n", - " - 가능하면 주제가 서로 다른 웹 사이트들로 선정\n", - " - 5) 위 문제에서 저장한 모든 words.frequency 파일들을 객체로 다시 로드하여 본인이 저장하여 분석한 사이트들 각각에 대해서 가장 많이 출현한 단어 3개씩를 뽑아 제시하시오. \n", - " - 반드시 pickle 모듈로 저장한 5개 이상의 words.frequency를 다시 5개 이상의 사전 객체로 로드 하는 코드가 추가되어야 함\n", + " - URL이 http://URL 이라면 사전 객체를 담고 있는 파일명은 URL.words_frequency.pickle 이다.\n", + " - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.words_frequency.pickle 이다.\n", + " - 4) 최소 5개 이상의 웹 사이트 각각에 대한 HTML 소스 파일과 단어 출현빈도 파일을 저장하시오. \n", + " - 즉, 5개의 웹 사이트에 대해 총 10개의 파일을 동일한 폴더에 생성하시오.\n", + " - [주의] 가능하면 웹사이트에 단어들이 많고 다루는 주제가 서로 다른 웹 사이트들로 선정하는 것 추천\n", + " - 5) 위 문제에서 저장한 모든 pickle 파일들을 객체로 다시 로드하여 본인이 저장하여 분석한 사이트들 각각에 대해서 가장 많이 출현한 단어 3개씩를 뽑아 제시하시오. \n", + " - 반드시 pickle 모듈로 저장한 5개 이상의 pickle 파일들을 다시 5개 이상의 사전 객체로 로드 하는 코드가 추가되어야 함\n", " - 6) 간단한 검색엔진 코딩 (Like Google!!!)\n", - " - 사용자에게 임의의 단어 1개를 입력받으시오.\n", - " - 입력 받은 단어와 유사도(Similarity)가 높은 웹 사이트 기준으로 위 4)에서 미리 지정해 놓은 5개 이상의 웹 사이트 URL들을 일렬로 나열하여 출력하시오.\n", - " - 단어와 웹 사이트 간의 유사도는 본인이 스스로 정하시오.\n", - " - 유사도를 정하는 최소한의 기준은 단어 출현 빈도를 기반으로 해야 하며, 이외의 본인이 생각하는 방안이 있으면 함께 사용해도 됨.\n", - " - 반드시 코딩 내에 similarity 라는 사전 자료 구조가 있어야 함 (즉, 다음과 유사한 코드가 있어야 함).\n", - " - similarity = {}\n", - " - ...\n", - " - similarity[url1] = x1\n", - " - ...\n", - " - similarity[url2] = x2\n", - " - ...\n", - " - 위 코드에서 x1 과 x2는 입력단어와 해당 URL의 웹 사이트 간의 similarity를 나타내는 수치값 \n", + " - 사용자에게 임의의 검색어 (하나 또는 여러 단어로 구성) 를 입력받으시오.\n", + " - 예: \n", + " - 대한민국\n", + " - 컴퓨터 공학\n", + " - 맛있는 음식\n", + " - 파이썬을 쉽게 공부하는 법\n", + " - 한기대 장점을 알려주세요\n", + " - 입력받은 검색어들에 대해서도 1)에서 제시하는 방법처럼 불용어 처리를 하여 정리\n", + " - 입력 받은 검색어와 유사도(Similarity)가 높은 웹 사이트 기준으로 위 4)에서 미리 지정해 놓은 5개 이상의 웹 사이트 URL들을 일렬로 나열하여 출력하시오.\n", + " - 검색어와 웹 사이트 간의 유사도는 본인이 스스로 정하시오.\n", + " - 유사도를 정하는 최소한의 기준은 단어 출현 빈도를 기반으로 해야 하며, 이외의 본인이 생각하는 방안이 있으면 함께 사용해도 됨.\n", " - 유사도가 높은 웹 사이트가 상위에 출력되어야 함 (즉, 유사도 기준 내림 차순)\n", - " - 유사도가 동일한 웹 사이트들에 대해서는 임의 배치함.\n", + " - 유사도가 동일한 웹 사이트들에 대해서는 임의 배치함.\n", " - 7) [주의] 필수사항\n", " - 위에서 만든 검색엔진 코딩은 매우 간단한 것이라 부족한 점이 많이 존재한다.\n", - " - 본인이 생각하기에 상업적인 완성도 높은 검색 로봇/엔진이 되려면 어떤 기능들이 추가적으로 구현되어야 할지 최소 3가지 이상 제시하시오. " + " - 본인이 생각하기에 상업적인 완성도 높은 검색 로봇/엔진이 되려면 어떤 기능들이 추가적으로 구현되어야 할지 최소 1가지 이상 제시하시오. " ] } ], @@ -245,7 +241,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python15.ipynb b/python3.6/python15.ipynb index 555cb81..29c5111 100644 --- a/python3.6/python15.ipynb +++ b/python3.6/python15.ipynb @@ -37,9 +37,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -79,9 +77,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -101,9 +97,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -128,9 +122,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -148,9 +140,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -199,9 +189,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -246,9 +234,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -285,9 +271,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -324,9 +308,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -363,9 +345,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -402,9 +382,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -448,9 +426,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -477,9 +453,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -510,9 +484,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -541,9 +513,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -571,9 +541,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -617,9 +585,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -643,9 +609,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -673,9 +637,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -720,9 +682,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -755,9 +715,7 @@ { "cell_type": "code", "execution_count": 82, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "SyntaxError", @@ -783,9 +741,7 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -814,9 +770,7 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -849,9 +803,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -875,9 +827,7 @@ { "cell_type": "code", "execution_count": 26, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "SyntaxError", @@ -903,9 +853,7 @@ { "cell_type": "code", "execution_count": 27, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -932,9 +880,7 @@ { "cell_type": "code", "execution_count": 28, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "SyntaxError", @@ -956,9 +902,7 @@ { "cell_type": "code", "execution_count": 29, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -987,9 +931,7 @@ { "cell_type": "code", "execution_count": 30, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1020,9 +962,7 @@ { "cell_type": "code", "execution_count": 31, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1050,9 +990,7 @@ { "cell_type": "code", "execution_count": 32, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1080,9 +1018,7 @@ { "cell_type": "code", "execution_count": 33, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1121,7 +1057,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python16.ipynb b/python3.6/python16.ipynb index b6a5bbe..7cee74f 100644 --- a/python3.6/python16.ipynb +++ b/python3.6/python16.ipynb @@ -206,13 +206,31 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "0. add\n", + "1. sub\n", + "2. mul\n", + "3. div\n", + "4. quit\n", + "Select menu:0\n", + "First operand:20\n", + "Second operand:30\n", + "Result = 50\n", + "0. add\n", + "1. sub\n", + "2. mul\n", + "3. div\n", + "4. quit\n", + "Select menu:2\n", + "First operand:10\n", + "Second operand:10\n", + "Result = 100\n", "0. add\n", "1. sub\n", "2. mul\n", @@ -224,10 +242,12 @@ ], "source": [ "# 더하기, 빼기, 곱하기, 나누기에 해당하는 람다 함수 리스트 정의\n", - "func = [lambda x, y: int(x) + int(y), \n", - " lambda x, y: int(x) - int(y), \n", - " lambda x, y: int(x) * int(y), \n", - " lambda x, y: int(x) / int(y)]\n", + "func_list = [\n", + " lambda x, y: int(x) + int(y), \n", + " lambda x, y: int(x) - int(y), \n", + " lambda x, y: int(x) * int(y), \n", + " lambda x, y: int(x) / int(y)\n", + "]\n", "\n", "def menu():\n", " print(\"0. add\")\n", @@ -235,10 +255,7 @@ " print(\"2. mul\")\n", " print(\"3. div\")\n", " print(\"4. quit\")\n", - "# 기존: return input('Select menu:')\n", " return int(input('Select menu:'))\n", - "# 또는\n", - "# return eval(input('Select menu:'))\n", "\n", "while 1:\n", " sel = menu() \n", @@ -246,11 +263,9 @@ " continue\n", " if sel == len(func): \n", " break\n", - " x = input('First operand:') \n", - " #또는 x = float(input('First operand:'))\n", - " y = input('Second operand:') \n", - " #또는 y = float(input('Second operand:'))\n", - " print('Result =', func[sel](x,y))" + " x = int(input('First operand:'))\n", + " y = int(input('Second operand:')) \n", + " print('Result =', func_list[sel](x,y))" ] }, { @@ -279,7 +294,29 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "def f(x):\n", + " return x * x\n", + "\n", + "X = [1, 2, 3, 4, 5]\n", + "m = map(f, X)\n", + "print(type(m))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -297,7 +334,7 @@ "X = [1, 2, 3, 4, 5]\n", "Y = list(map(f, X)) \n", "#기존: Y = map(f, X)\n", - "# X seq 자료형이 리스트라면, list()를 써주어야 한다. 페이지 아래의 'filter, map은 iterator를 리턴함'문구 참고 필요\n", + "# X seq 자료형이 리스트라면, list()를 써주어야 한다.\n", "print(Y)" ] }, @@ -310,7 +347,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -342,7 +379,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -355,7 +392,6 @@ ], "source": [ "X = [1, 2, 3, 4, 5]\n", - "#기존: print map(lambda x: x * x, X)\n", "print(list(map(lambda x: x * x, X)))" ] }, @@ -368,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -380,7 +416,6 @@ } ], "source": [ - "#기존: Y = map(lambda x: x * x + 4 * x + 5, range(10))\n", "Y = list(map(lambda x: x * x + 4 * x + 5, range(10)))\n", "print(Y)" ] @@ -394,7 +429,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -423,7 +458,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -435,7 +470,6 @@ } ], "source": [ - "#기존: print(filter(lambda x: x > 2, [1, 2, 3, 34]))\n", "print(list(filter(lambda x: x > 2, [1, 2, 3, 34])))" ] }, @@ -448,7 +482,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -476,7 +510,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -500,7 +534,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -524,7 +558,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -538,7 +572,6 @@ "source": [ "def F():\n", " x = 1\n", - " #기존: print filter(lambda a: a > x, range(-5, 5))\n", " print(list(filter(lambda a: a > x, range(-5, 5))))\n", " \n", "F()" @@ -564,7 +597,7 @@ "metadata": {}, "source": [ "(python3)\n", - "- filter, map은 iterator를 리턴함\n", + "- filter, map은 iterator 객체인 filter, map을 리턴함\n", "- 참고\n", " - https://docs.python.org/3/library/functions.html#map\n", " - https://docs.python.org/3/library/functions.html#filter\n", @@ -573,16 +606,16 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "\n", - "\n" + "\n", + "\n", + "\n" ] } ], @@ -595,7 +628,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -604,7 +637,7 @@ "text": [ "[3, 34]\n", "(3, 34)\n", - "\n" + "\n" ] } ], @@ -621,12 +654,11 @@ "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "[3, 34]\n", - "(3, 34)\n", - "ABCDEF\n" + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 2)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m print filter(lambda x: x > 2, [1, 2, 3, 34])\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], @@ -646,7 +678,7 @@ " - 파이썬3에서 reduce() 내장 함수 지원하지 않음.\n", " - 파이썬3에서 reduce() 함수를 사용하려면 다음의 라인을 상단에 추가해주어야 한다.\n", " - from functools import reduce\n", - " - seq 시퀀스 자료형이 지닌 원소값들에 대해 function 함수를 적용하면서 하나의 값으로 매핑한다.(reduce returns a single value.)\n", + " - seq 시퀀스 자료형이 지닌 원소값들에 대해 function 함수를 적용하면서 하나의 값으로 축약한다.(reduce returns a single value.)\n", " - 첫번째 인자인 function 함수는 반드시 두 개의 인자 (예를 들어, x, y)를 받아야 한다.\n", " - seq 시퀀스 자료형의 각 원소값들은 각 단계별로 y에 순차적으로 들어간다. \n", " - 함수가 수행된 값은 각 단계별로 x에 순차적으로 들어간다.\n", @@ -824,7 +856,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.4" } }, "nbformat": 4, From 5d6048d22d4ba29894e288bdaa5ea100e78cb5e1 Mon Sep 17 00:00:00 2001 From: gwondohyung Date: Thu, 15 Nov 2018 11:37:33 +0900 Subject: [PATCH 095/124] =?UTF-8?q?=EA=B3=BC=EC=A0=9C3=20=EB=AA=A8?= =?UTF-8?q?=EB=B2=94=EB=8B=B5=EC=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...353\262\224\353\213\265\354\225\210.ipynb" | 203 ++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 "\352\263\274\354\240\2343-\353\252\250\353\262\224\353\213\265\354\225\210.ipynb" diff --git "a/\352\263\274\354\240\2343-\353\252\250\353\262\224\353\213\265\354\225\210.ipynb" "b/\352\263\274\354\240\2343-\353\252\250\353\262\224\353\213\265\354\225\210.ipynb" new file mode 100644 index 0000000..9f91c07 --- /dev/null +++ "b/\352\263\274\354\240\2343-\353\252\250\353\262\224\353\213\265\354\225\210.ipynb" @@ -0,0 +1,203 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### 변수명으로 예약어를 사용하는 것은 무조건 감점입니다. 주의해주세요." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 모범답안 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import re\n", + "import string\n", + "import html\n", + "def countWords(url):\n", + " req = requests.get(url)\n", + " source = html.unescape(req.text).replace('><', '>\\n<')\n", + " line = source.split('\\n')\n", + " regex = re.compile('>.*?<')\n", + " words = []\n", + " for i in line:\n", + " if ('\")+9:] #자바스크립트 내용 건너뜀 \n", + " elif (source.find(\"\")+9:] #스타일 내용 건너뜀\n", + " else : \n", + " source = source[source.find('>')+1:] #'>'를 찾는다\n", + " for ch in source : #'>' 이후부터 한글자씩 가져온다\n", + " if ch == '<' : break # 다시 '<' 문자 등장하면 종료\n", + " elif ch == '\\t' or ch == '\\n' : continue #탭,개행 문자는 순수 텍스트에 포함x\n", + " else : text += ch #순수 텍스트 추가 \n", + " if text.endswith(\" \") == False : text += \" \" #공백으로 분리하기 위해 순수 텍스트 추출 후 뒤에 공백문자 추가\n", + " if(source.find('<') == -1):break #'<' 문자가 더 이상 없는 경우 무한루프종료 \n", + " return text \n", + "import string\n", + "\n", + "def replaceAll(text, dic): ##문자열을 사전에 맵핑된 문자로 대체로 하는 함수\n", + " for i,j in dic.items():\n", + " text = text.replace(i,j,text.count(i)) #문자열에 사전에 키와 같은 문자가 존재하면 키에 맵핑된 value값으로 대체한다.\n", + " return text \n", + "\n", + "def stripSpecialChar(text): ##특수문자 제거 함수\n", + " keys = [ch for ch in string.punctuation] #구두문자를 key리스트로 만듬\n", + " keys.append(\"★\") #구두문자 이외의 특수문자를 key리스트에 추가\n", + " keys.append(\"☆\")\n", + " keys.append(\"※\")\n", + " keys.append(\"nbsp\")#html문자\n", + " keys.append(\"lt\")\n", + " keys.append(\"amp\")\n", + " keys.append(\"quot\")\n", + " keys.append(\"middot\")\n", + " keys.append(\"uarr\")\n", + " keys.append(\"rarr\")\n", + " keys.append(\"darr\")\n", + " keys.append(\"harr\")\n", + " \n", + " values = ['' for _ in keys] #key리스트의 원소 수 만큼 ''문자를 원소를 갖는 value리스트를 만듬\n", + " replaceDic = dict(zip(keys,values)) #key리스트 key로 value리스트를 value값으로 하는 사전 만듬\n", + "\n", + " return replaceAll(text,replaceDic) #추출한 순수 텍스트에서 사전에 맵핑된 제거할 문자들을 모두 제거\n", + "def wordOfFreq(l): #단어의 빈도수를 사전으로 반환하는 함수\n", + " word = [] \n", + " for w in l: #리스트의 각 원소들이\n", + " if (w in word) == False : word.append(w) #word리스트에 포함된 단어가 아니면 단어를 리스트에 추가 (단어중복제거) \n", + " freg = [l.count(w) for w in l] #리스트에서 단어의 출현 빈도수를 리스트로 만듬\n", + " \n", + " return dict(zip(word,freg)) #단어와 단어의 빈도수로 맵핑된 사전 반환\n", + "import requests\n", + "\n", + "req = requests.get('http://cse.koreatech.ac.kr')\n", + "source = req.text\n", + "text = extractText(source) #순수 텍스트 추출\n", + "text = stripSpecialChar(text) #특수문자 제거\n", + "l = text.split() #공백단위분리\n", + "print(wordOfFreq(l)) #출현한 단어의 빈도수" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 모범답안3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import re\n", + "import string \n", + "\n", + "def call(b): \n", + " req = requests.get(b)\n", + " source = req.text\n", + " text1 = re.sub('.*?', ' ', source, 0, re.I|re.S)\n", + " text2 = re.sub('.*?', ' ', text1, 0, re.I|re.S)\n", + " text3 = re.sub('<.+?>', ' ', text2, 0, re.I|re.S)\n", + " text4 = re.sub('-->', ' ', text3, 0, re.I|re.S)\n", + " text5 = re.sub(\"[!|?|<|>|:|\\[|\\]|#|$|%|&|\\(|\\)|*|+|\\-|,|.|/|;|=|@|^|_|`|{|}|~|\\\"|\\'|\\\\\\|/]\",' ', text4, 0, re.I|re.S)\n", + " s=text5.split()\n", + " dic={}\n", + " j=0\n", + " for i in s:\n", + " if i in dic:\n", + " dic[i] += 1\n", + " else:\n", + " dic[i] = 1\n", + " print(dic)\n", + "\n", + "print('http://cse.koreatech.ac.kr') \n", + "call('http://cse.koreatech.ac.kr')\n", + "print()\n", + "\n", + "print('https://www.koreatech.ac.kr')\n", + "call('https://www.koreatech.ac.kr')\n", + "print()\n", + "\n", + "print('http://www.naver.com')\n", + "call('http://www.naver.com')\n", + "print()\n", + "\n", + "print('http://www.daum.net')\n", + "call('http://www.daum.net')\n", + "print()\n", + "\n", + "print('http://www.nytimes.com')\n", + "call('http://www.nytimes.com')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 022bde19bf8fe26a64917550224825304f84b2d3 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Thu, 22 Nov 2018 00:09:26 +0900 Subject: [PATCH 096/124] adas --- .gitignore | 1 + .../__pycache__/module_test.cpython-36.pyc | Bin 439 -> 440 bytes python3.6/__pycache__/prname.cpython-36.pyc | Bin 136 -> 137 bytes python3.6/python17.ipynb | 110 ++++-------- python3.6/python18.ipynb | 168 ++++-------------- 5 files changed, 69 insertions(+), 210 deletions(-) diff --git a/.gitignore b/.gitignore index 7a9a287..babfed3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .* *Answer.ipynb +*.pyc diff --git a/python3.6/__pycache__/module_test.cpython-36.pyc b/python3.6/__pycache__/module_test.cpython-36.pyc index b80a57a015832c52bb6c3b4a716e820446cc395b..03a411f9740ecdef704817b768e4eeb19648cd5c 100644 GIT binary patch delta 56 zcmdnayn~s;n3tDp-G(jE6FIt+t@T5TQ;UlAD>E_@^Yqg*OY{pWOEU8FbW?S6QWJ~v MGV{_mZeeBw040PJ2LJ#7 delta 55 zcmdnNyq%fDn3tF9mxe&pM2;>cEB(;o)S_bjlziQc%F?{_?DG6P{q)R|jM60ig36MN K{Jf1@nHd4^=MyIY diff --git a/python3.6/__pycache__/prname.cpython-36.pyc b/python3.6/__pycache__/prname.cpython-36.pyc index 04ef272283943fc3470f0e754cb0b14dc0645006..a3eb26bde114ba78a0c3adce2032395873128ce0 100644 GIT binary patch delta 55 zcmeBR>}2FH=H=yDw_!{4L=JOhGyTxw)S_bj%8ZP}JpJ^{68(b8l8pR3-BjJ2)Wo8^ K%)Io8iRu9EE)x9! delta 54 zcmeBV>|o?D=H=z$)DVc8$YHKzsvlaMT2!o`lCPUlS(=xgU7nw(pPpHgQJSP*P+5|Z JpEof{9RQEr5i9@z diff --git a/python3.6/python17.ipynb b/python3.6/python17.ipynb index 37d843b..d31d48e 100644 --- a/python3.6/python17.ipynb +++ b/python3.6/python17.ipynb @@ -49,9 +49,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -86,10 +84,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -108,8 +104,8 @@ " h = a + 10 # h는 l-value로 정의되더라도 미리 선언된 내용 때문에 전역 변수\n", " return h\n", "\n", - "print f(10)\n", - "print h # 전역 변수 h 값이 함수 내에서 변경되었음" + "print(f(10))\n", + "print(h) # 전역 변수 h 값이 함수 내에서 변경되었음" ] }, { @@ -123,10 +119,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "ename": "UnboundLocalError", @@ -135,8 +129,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mUnboundLocalError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mf\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg\u001b[0m \u001b[0;31m# r-value로 사용되는 g는 전역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m20\u001b[0m \u001b[0;31m# l-value로 정의되는 g는 지역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mf\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg\u001b[0m \u001b[0;31m# r-value로 사용되는 g는 전역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m20\u001b[0m \u001b[0;31m# l-value로 정의되는 g는 지역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mUnboundLocalError\u001b[0m: local variable 'g' referenced before assignment" ] } @@ -155,9 +149,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -204,9 +196,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -223,9 +213,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -252,9 +240,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -278,9 +264,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -308,9 +292,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -408,9 +390,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -459,10 +439,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -474,17 +452,7 @@ ], "source": [ "import string\n", - "print(dir(string))\n", - "\n", - "# 기존:\n", - "# ['Formatter', 'Template', '_TemplateMetaclass', '__builtins__', '__doc__', '__file__', \n", - "# '__name__', '__package__', '_float', '_idmap', '_idmapL', '_int', '_long', '_multimap', \n", - "# '_re', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'atof', 'atof_error', 'atoi', \n", - "# 'atoi_error', 'atol', 'atol_error', 'capitalize', 'capwords', 'center', 'count', 'digits', \n", - "# 'expandtabs', 'find', 'hexdigits', 'index', 'index_error', 'join', 'joinfields', 'letters', \n", - "# 'ljust', 'lower', 'lowercase', 'lstrip', 'maketrans', 'octdigits', 'printable', 'punctuation', \n", - "# 'replace', 'rfind', 'rindex', 'rjust', 'rsplit', 'rstrip', 'split', 'splitfields', 'strip', \n", - "# 'swapcase', 'translate', 'upper', 'uppercase', 'whitespace', 'zfill']" + "print(dir(string))" ] }, { @@ -494,9 +462,9 @@ "### 2-5 이름 공간을 제공하는 다른 예들\n", "- 독립된 이름 공간(스코프)을 제공하는 것들\n", " - 모듈\n", + " - 함수\n", " - 클래스\n", - " - 객체\n", - " - 함수" + " - 객체" ] }, { @@ -510,10 +478,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -538,10 +504,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -570,15 +534,13 @@ "metadata": {}, "source": [ "- 함수도 독립적인 이름 공간\n", - " - 다만 함수 내에서 선언된 로컬 변수는 함수 외부에서 접근할 수 없다." + " - 다만 함수 내에서 선언된 지역(로컬) 변수는 함수 외부에서 접근할 수 없다." ] }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 9, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -595,7 +557,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'function' object has no attribute 'a'" ] } @@ -667,9 +629,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -694,9 +654,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -716,9 +674,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -757,7 +713,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python18.ipynb b/python3.6/python18.ipynb index f6af888..d6098ac 100644 --- a/python3.6/python18.ipynb +++ b/python3.6/python18.ipynb @@ -33,9 +33,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -63,9 +61,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -91,9 +87,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -120,9 +114,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -152,29 +144,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "This Is A Text\n" - ] - } - ], - "source": [ - "mystring = \"This Is A String\"\n", - "print(mystring.replace(\"String\",\"Text\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -194,29 +164,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ham egg spam\n" - ] - } - ], - "source": [ - "print('ham chicken spam'.replace(\"chicken\",\"egg\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -246,25 +195,6 @@ "print(ceil(4.5))" ] }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ABC\n" - ] - } - ], - "source": [ - "print('abc'.upper())" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -297,10 +227,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -367,9 +295,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -388,9 +314,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -415,10 +339,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -447,8 +369,10 @@ "## 2 모듈의 실행과 테스트 코드\n", "***\n", "- \\_\\_name\\_\\_\n", - " - 현재의 모듈이 최상위 모듈로서 수행되는지, 아니면 다른 모듈에 의해 import 되어 수행되는지를 구별하기 위해 주로 활용\n", - " - 최상위 모듈: 파이썬 인터프리터가 기본적으로 가장 먼저 인식하여 처리하는 모듈" + " - 모듈의 이름이 자동으로 저장되는 변수\n", + " - 현재의 모듈이 최상위 모듈로서 수행되는지, 아니면 다른 모듈에 의해 import되어 수행되는지를 구별하기 위해 주로 활용\n", + " - 최상위 모듈: 파이썬 인터프리터가 기본적으로 가장 먼저 인식하여 처리하는 모듈\n", + " - 모듈의 이름이 항상 \"\\_\\_main\\_\\_\"" ] }, { @@ -463,10 +387,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -490,16 +412,13 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "prname\n", "prname\n" ] } @@ -511,10 +430,8 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -533,10 +450,6 @@ "import re\n", "print(re.__name__)\n", "\n", - "# import mimetools\n", - "# print(mimetools.__name__)\n", - "# PYthon2.x에서는 사용 가능힘\n", - "\n", "import os\n", "print(os.__name__)" ] @@ -545,16 +458,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 아래 코드는 최상위 모듈로서 수행될 때에만 test() 함수 호출이 일어난다. \n", + "- 아래 코드는 최상위 모듈로서 수행될 때 add() 함수 호출이 일어난다. \n", "- 보통 파이썬 모듈을 개발할 때에는 마지막 부분에 if \\_\\_name\\_\\_ == \"\\_\\_main\\_\\_\": 과 같은 코드를 추가하여 테스트 코드를 삽입한다." ] }, { "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, + "execution_count": 9, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -588,10 +499,8 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": true - }, + "execution_count": 10, + "metadata": {}, "outputs": [], "source": [ "import module_test" @@ -623,7 +532,8 @@ " - 최상위 디렉토리 이름이 패키지 이름이 된다.\n", " - 최상위 디렉토리 하위에 여러 서브 디렉토리는 해당 최상위 패키지의 하위 패키지가 된다. \n", "- 예제: Speech 패키지\n", - " - 각 폴더마다 \\_\\_init\\_\\_.py 파일 존재에 유의" + " - 각 폴더마다 \\_\\_init\\_\\_.py 파일 존재에 유의\n", + " - 패키지가 임포트 되면 \\_\\_init\\_\\_.py 파일에 존재하는 내용은 자동으로 실행됨" ] }, { @@ -698,9 +608,7 @@ { "cell_type": "code", "execution_count": 36, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -718,9 +626,7 @@ { "cell_type": "code", "execution_count": 37, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -738,9 +644,7 @@ { "cell_type": "code", "execution_count": 38, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -765,9 +669,7 @@ { "cell_type": "code", "execution_count": 39, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -810,7 +712,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, From 89ac9c3bc24a6c408038667e68edee50ea9b7283 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 28 Nov 2018 23:05:50 +0900 Subject: [PATCH 097/124] qqqwq --- python3.6/assignment-5.ipynb | 32 ++- python3.6/python19.ipynb | 200 +++++--------- python3.6/python20.ipynb | 495 ++++++++++++++++++++--------------- 3 files changed, 363 insertions(+), 364 deletions(-) diff --git a/python3.6/assignment-5.ipynb b/python3.6/assignment-5.ipynb index fd0d6ce..c1a8e71 100644 --- a/python3.6/assignment-5.ipynb +++ b/python3.6/assignment-5.ipynb @@ -6,7 +6,7 @@ "source": [ "# Assignment 5\n", "### [정보]\n", - "#### 1) Due Date: 2017년 12월 12일 (화), 23시 59분\n", + "#### 1) Due Date: 2018년 12월 12일 (수), 23시 59분\n", "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.jupyter.org에 넣어서 산출된 URL을 EL사이트에 제출\n", "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", "#### 4) 숙제이후 소감: 모든 문제의 답을 적은 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", @@ -101,9 +101,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -195,16 +193,16 @@ "source": [ "##### [7번 문제] \n", "\n", - "이전 Assignment 3 (Assignment 4가 아님)의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3을 다시 확장/변형하여 다음과 같은 조건을 만족하도록 구현하시오.\n", - " - 1) 새로운 클래스 WebWordsFrequency를 정의하시오.\n", - " - 이전 Assignment 4에서 고려했던 pickle 모듈등은 전혀 고려하지 마시오.\n", + "이전 Assignment 3 & Assignment 4를 다시 확장/변형하여 다음과 같은 조건을 만족하도록 구현하시오 (CODE REFACTORING!!!).\n", + " - 1) 새로운 클래스 SearchEngine를 정의하시오.\n", + " - 이전 숙제에서 고려했던 pickle 모듈 등은 전혀 고려하지 마시오.\n", " - 즉, 하드디스크에 저장하고 다시 로드하는 기능은 본 숙제에는 배제하시오.\n", - " - Assignment 4에서 고려했던 영어 불용어 처리는 적용하시오.\n", - " - Assignment 4에서 처럼 국문 사이트가 아닌 영어 사이트만을 고려하여 아래 사항을 코딩하시오.\n", + " - 이전 숙제에서 적용했던 국어/영어 불용어 처리는 적용하시오.\n", + "
\n", " - 2) 생성자에 URL을 0개에서 임의의 개수를 넣을 수 있도록 생성자 인수를 가변인수로 정의하여 각각의 URL을 리스트 자료형에 유지하시오.\n", - " > \\>\\>\\> w1 = WebWordsFrequency('http://www.cnn.com', 'http://www.times.com', 'https://www.amazon.com')
\n", - " > \\>\\>\\> w2 = WebWordsFrequency('http://www.cnn.com', 'http://www.times.com')
\n", - " > \\>\\>\\> w3 = WebWordsFrequency()
\n", + " > \\>\\>\\> w1 = SearchEngine('http://www.cnn.com', 'http://www.times.com', 'https://www.amazon.com')
\n", + " > \\>\\>\\> w2 = SearchEngine('http://www.cnn.com', 'http://www.times.com')
\n", + " > \\>\\>\\> w3 = SearchEngine()
\n", " - 3) addUrl() 메소드를 구현하여 인스턴스를 생성한 이후에도 URL을 추가할 수 있도록 한다.\n", " - 반드시 1개의 URL을 추가하도록 구현 (즉, 동시에 여러 개의 URL을 추가하는 것은 배제)\n", " \n", @@ -236,7 +234,7 @@ " > site
\n", " > science\n", " \n", - " - 만약 등록된 URL이 없다면 None을 반환\n", + " - 만약 등록된 URL이 없다면 getMaxFreqencyWords()의 반환 값은 None이 되어야 함.\n", " - 8) 임의의 단어 1개를 파라미터로 받는 searchUrlByWord() 메소드를 구현하여 유사도가 높은 웹 사이트를 출력하시오.\n", " > \\>\\>\\> w1.searchUrlByWord(\"news\")
\n", " > http://www.cnn.com
\n", @@ -251,13 +249,13 @@ "source": [ "##### [8번 문제] \n", "\n", - "위 7번 문제에서 정의한 WebWordsFrequency 클래스를 상속하여 OrderedWebWordsFrequency 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 오버라이드 하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.\n", + "위 7번 문제에서 정의한 SearchEngine 클래스를 상속하여 SearchEngineWithOrderedWebWords 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 ***오버라이드***하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.\n", " - 리스트 내의 각 원소는 단어와 빈도를 쌍으로 지니는 튜플이다.\n", " - getWordFrequence() 메소드에 reverse 라는 인자를 만들고 true 또는 false를 인자로 받을 수 있도록 한다.\n", " - reverse 인자의 디폴트 값은 false 이며, 기본적으로 내림차순으로 정렬한다.\n", " - reverse 인자에 true를 넣으면 오름차순으로 정렬한다.\n", " \n", - " > \\>\\>\\> w4 = OrderedWebWordsFrequency('http://www.times.com', 'https://www.amazon.com', 'https://github.com')\n", + " > \\>\\>\\> w4 = SearchEngineWithOrderedWebWords('http://www.times.com', 'https://www.amazon.com', 'https://github.com')\n", " \n", " > \\>\\>\\> w4.getWordsFrequency()
\n", " > [('site', 12), ('science', 11), ('hello', 8), ('world', 2), ('program', 1), ('python', 1)]\n", @@ -272,7 +270,7 @@ "source": [ "##### [9번 문제]\n", "\n", - "다음과 같은 코딩이 가능하도록 OrderedWebWordsFrequency 안에 반복자와 관련된 메소드를 추가하시오.\n", + "다음과 같은 코딩이 가능하도록 SearchEngineWithOrderedWebWords안에 반복자와 관련된 메소드를 추가하시오.\n", "\n", "> \\>\\>\\> for i in w4:
\n", "> \\>\\>\\>       print(i)
\n", @@ -302,7 +300,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python19.ipynb b/python3.6/python19.ipynb index a67dd8d..0f8be2a 100644 --- a/python3.6/python19.ipynb +++ b/python3.6/python19.ipynb @@ -24,7 +24,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 파이썬 클래스는 새로운 이름 공간을 지원하는 또 다른 단위\n", + "- 파이썬 클래스(Class)는 새로운 이름 공간을 지원하는 또 다른 단위\n", + "- 객체 지향 프로그래밍에서 클래스(Class)의 역할\n", + " - 사용자 정의 타입(Type) 생성\n", "- 클래스 정의 구문\n", "> class 클래스 이름: #헤더(Header)
\n", ">         pass #몸체(Body)\n", @@ -48,8 +50,8 @@ "\n", "2\n", "\n", - "['__doc__', '__module__', 'a', 'b']\n", - "['__doc__', '__module__', 'a']\n" + "['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b']\n", + "['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a']\n" ] } ], @@ -74,7 +76,7 @@ "metadata": {}, "source": [ "- 파이썬에서는 동적으로 인스턴스 외부에서 인스턴스 멤버를 추가할 수 있음\n", - " - 파이썬에서는 클래스와 독립적으로 각 인스턴스를 하나의 이름 공간으로 취급함" + " - 클래스와 독립적으로 각 인스턴스를 하나의 이름 공간으로 취급함" ] }, { @@ -130,9 +132,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Simple:\n", @@ -165,7 +165,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 최종 s1.stack값\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# s2에는 stack을 정의한 적이 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 최종 s1.stack값\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# s2에는 stack을 정의한 적이 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;31m#기존에러:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAttributeError\u001b[0m: 'Simple' object has no attribute 'stack'" ] } @@ -218,14 +218,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2-1 일반 메쏘드의 정의와 호출" + "### 2-1 멤버 메쏘드의 정의와 호출" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- 클래스 내부에 메소드 선언 - def 키워드 사용\n", + "- 클래스 내부에 객체 멤버 메소드 선언 - def 키워드 사용\n", " - 일반 함수와 다른 점은 첫번째 인수로 self 사용 (self라는 이름은 관례적)\n", " - self: 인스턴스 객체 자신의 레퍼런스를 지니고 있음\n", " - 각 인스턴스들은 self를 이용하여 자신의 이름 공간에 접근 " @@ -233,15 +233,14 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 16, + "metadata": {}, "outputs": [], "source": [ "class MyClass:\n", " def set(self, v):\n", " self.value = v\n", + " \n", " def get(self):\n", " return self.value" ] @@ -250,12 +249,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 인스턴스 객체를 통하여 메소드를 호출할 때 self 인자는 없다고 생각" + "- 인스턴스 객체를 통하여 멤버 메소드를 호출할 때 self 인자는 없다고 생각" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -283,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -306,61 +305,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- python2.x\n", - " - MyClass.set(s1, 'egg')와 같이 다른 클래스의 인스턴스를 넣어주면 에러 발생\n", - "- python3.x\n", - " - 에러가 발생하지 않음" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "#python3.x\n", - "class Simple:\n", - " pass\n", - "\n", - "c = MyClass()\n", - "s1 = Simple()\n", - "MyClass.set(s1, 'egg') # 다른 클래스의 인스턴스를 넣어주어도 에러가 발생하지 않음" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "unbound method set() must be called with MyClass instance as first argument (got Simple instance instead)", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMyClass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0ms1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mSimple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mMyClass\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'egg'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 다른 클래스의 인스턴스를 넣어주면 에러 발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: unbound method set() must be called with MyClass instance as first argument (got Simple instance instead)" - ] - } - ], - "source": [ - "#python2.x\n", - "class Simple:\n", - " pass\n", - "\n", - "c = MyClass()\n", - "s1 = Simple()\n", - "MyClass.set(s1, 'egg') # 다른 클래스의 인스턴스를 넣어주면 에러 발생" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 메소드 호출 종류\n", + "- 멤버 메소드 호출 종류\n", " - Unbound method call: 클래스 객체를 이용한 메소드 호출\n", " - 예: MyClass.set(c, 'egg')\n", " - Bound method call: 인스턴스 객체를 통한 메소드 호출 (self 인자는 호출받은 객체가 자동으로 할당)\n", @@ -371,12 +316,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2-2 클래스 내부에서의 메쏘드 호출" + "### 2-2 객체 내부에서의 다른 맴버 메쏘드 호출" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -393,8 +338,10 @@ "class MyClass:\n", " def set(self, v):\n", " self.value = v\n", + " \n", " def incr(self):\n", " self.set(self.value + 1) # 내부 메소드 호출\n", + "\n", " def get(self):\n", " return self.value\n", " \n", @@ -412,12 +359,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 만약 위 코드에서 self.set(self.value + 1)set(self.value + 1)으로 바꾸면 set 함수를 클래스 외부에서 찾는다. " + "- [NOTE!!!] 만약 위 코드에서 self.set(self.value + 1)set(self.value + 1)으로 바꾸면 set 함수를 클래스 외부에서 찾는다. " ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -438,8 +385,10 @@ "class MyClass:\n", " def set(self, v):\n", " self.value = v\n", + " \n", " def incr(self):\n", " set(self.value + 1) # 클래스 외부에 존재하는 set 메소드 호출\n", + "\n", " def get(self):\n", " return self.value\n", " \n", @@ -459,13 +408,15 @@ "source": [ "### 2-3 정적 메소드(static method)\n", "- 정적 메소드: 인스턴스 객체와 무관하게 클래스 이름 공간에 존재하는 메소드로서 클래스 이름을 이용하여 직접 호출할 수 있는 메소드\n", + " - self를 인자로 할당하지 않음\n", " - [주의] 해당 클래스의 인스턴스를 통해서도 호출 가능\n", + " \n", "- 장식자(Decorator) @staticmethod 활용 " ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -484,11 +435,11 @@ " def spam(x, y): # self가 없다.\n", " print('static method', x, y)\n", " \n", - "D.spam(1,2) # 인스턴스 객체 없이 클래스에서 직접 호출\n", + "D.spam(1, 2) # 인스턴스 객체 없이 클래스에서 직접 호출\n", "\n", "print()\n", "d = D()\n", - "d.spam(1,2) # 인스턴스 객체를 통해서도 호출 가능" + "d.spam(1, 2) # 인스턴스 객체를 통해서도 호출 가능" ] }, { @@ -496,14 +447,14 @@ "metadata": {}, "source": [ "### 2-4 클래스 메소드(class method)\n", - "- 클래스 메소드: 인스턴스 객체와 무관하게 클래스 이름 공간에 존재하는 메소드로서 클래스 이름을 이용하여 호출하며 첫 인수로 클래스 객체를 자동으로 받는 메소드\n", + "- 클래스 메소드: 인스턴스 객체와 무관하게 클래스 이름 공간에 존재하는 메소드로서 클래스 이름을 이용하여 호출하며 ***첫 인수로 클래스 객체를 자동으로 받는 메소드***\n", " - [주의] 해당 클래스의 인스턴스를 통해서도 호출 가능\n", "- 장식자(Decorator) @classmethod 활용 " ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -527,12 +478,7 @@ "C.spam(5) # 첫번째 인수로 C가 잠재적으로 전달된다.\n", "\n", "c = C()\n", - "c.spam(5) # 인스턴스 객체를 통해서도 호출 가능.\n", - "\n", - "#기존\n", - "# __main__.C\n", - "# __main__.C -> 5\n", - "# __main__.C -> 5" + "c.spam(5) # 인스턴스 객체를 통해서도 호출 가능." ] }, { @@ -544,7 +490,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -573,17 +519,7 @@ "print(d.spam(3))\n", "print()\n", "\n", - "print(C.spam(3))\n", - "\n", - "#기존\n", - "# __main__.D -> 3\n", - "# None\n", - "\n", - "# __main__.D -> 3\n", - "# None\n", - "\n", - "# __main__.C -> 3\n", - "# None" + "print(C.spam(3))" ] }, { @@ -610,16 +546,16 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": true - }, + "execution_count": 26, + "metadata": {}, "outputs": [], "source": [ "class Var:\n", " c_mem = 100 # 클래스 멤버 정의\n", + " \n", " def f(self): \n", " self.i_mem = 200 # 인스턴스 멤버 정의\n", + "\n", " def g(self):\n", " print(self.i_mem)\n", " print(self.c_mem)" @@ -627,7 +563,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -637,7 +573,8 @@ "100\n", "100\n", "200\n", - "\n" + "-------\n", + "100\n" ] }, { @@ -647,7 +584,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mv2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2 생성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mi_mem\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mv2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2 생성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc_mem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mi_mem\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'Var' object has no attribute 'i_mem'" ] } @@ -655,16 +592,15 @@ "source": [ "print(Var.c_mem) # 클래스 객체를 통하여 클래스 멤버 접근\n", "\n", - "v1 = Var() # 인스턴스 v1 생성\n", + "v1 = Var() # 인스턴스 v1 생성\n", "print(v1.c_mem) # 인스턴스를 통하여 클래스 멤버 접근\n", - "v1.f() # 인스턴스 멤버 i_mem이 생성됨\n", + "v1.f() # 인스턴스 멤버 i_mem이 생성됨\n", "print(v1.i_mem) # 인스턴스 v1을 통하여 인스턴스 멤버 접근\n", "\n", - "print()\n", + "print(\"-------\")\n", "v2 = Var() # 인스턴스 v2 생성\n", - "print(v2.i_mem) # 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성\n", - "\n", - "#기존 오류:AttributeError: Var instance has no attribute 'i_mem'" + "print(v2.c_mem)\n", + "print(v2.i_mem) # 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성" ] }, { @@ -685,7 +621,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -703,7 +639,7 @@ ], "source": [ "print(v1.c_mem) # 인스턴스 v1을 통해 클래스 멤버 참조\n", - "print(v2.c_mem) # 인스턴스 v2를 통해 클래스 멤버 참조\n", + "print(v2.c_mem) # 인스턴스 v2를 통해 클래스 멤버 참조\n", "\n", "print()\n", "v1.c_mem = 50 # 인스턴스 이름 공간에 c_mem생성\n", @@ -734,13 +670,16 @@ "source": [ "- \\_\\_init__: 생성자 메소드\n", " - 객체가 생성될 때 자동으로 불리어지는 메소드\n", + " - 일반적으로 객체가 보유해야 할 변수나 자원들의 초기화하는 코드를 작성함\n", " - self 인자가 정의되어야 함\n", + " \n", "- \\_\\_del__: 소멸자 메소드\n", " - 객체가 소멸 (메모리에서 해제)될 때 자동으로 불리어지는 메소드\n", + " - 일반적으로 객체가 점유하고 있는 메모리나 기타 자원들의 해제하는 코드를 작성함\n", " - self 인자가 정의되어야 함\n", " - 개발자가 특별히 작성하지 않아도 될 메소드\n", - " - 이유: 파이썬에서는 메모리나 기타 자원들의 해제가 자동으로 되기 때문에\n", - "- [참고] \\_\\_ (연속된 두 개의 언더라인)의 의미: 예약된 이름" + " - 이유: 파이썬에서는 객체가 점유하고 있는 메모리나 기타 자원들의 해제가 자동으로 되기 때문에\n", + "- [참고] \\_\\_ (연속된 두 개의 언더라인)의 의미: 예약된 (특수) 이름" ] }, { @@ -748,23 +687,23 @@ "metadata": {}, "source": [ "- 다음 코드에 대한 설명\n", - " - mylife = Life() 로서 인스턴스 mylife가 생성되는 순간 \\_\\_init__ 생성자 메소드 호출\n", + " - mylife = Life() 로서 로컬 변수에 할당되는 인스턴스 mylife가 생성되는 순간 \\_\\_init__ 생성자 메소드 호출\n", " - sleep(3)에 의해 3초간 sleep 상태\n", - " - 3초 이후 함수가 리턴됨 --> 로컬 변수가 메모리에서 해제됨 --> \\_\\_del__ 소멸자 메소드 호출" + " - 3초 이후 함수가 리턴됨 --> 로컬 변수, 즉 mylife 객체가 메모리에서 해제됨 --> \\_\\_del__ 소멸자 메소드 호출" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Birthday Sat Nov 18 21:48:45 2017\n", + "Birthday Wed Nov 28 22:30:18 2018\n", "Sleeping for 3 sec\n", - "Deathday Sat Nov 18 21:48:48 2017\n" + "Deathday Wed Nov 28 22:30:21 2018\n" ] } ], @@ -773,16 +712,17 @@ "from time import ctime, sleep\n", "\n", "class Life:\n", - " def __init__(self): # 생성자\n", - " self.birth = ctime() # 현재시간에 대한 문자열을 얻는다.\n", + " def __init__(self): # 생성자\n", + " self.birth = ctime() # 현재시간에 대한 문자열을 얻는다.\n", " print('Birthday', self.birth) # 현재 시간 출력\n", - " def __del__(self): # 소멸자\n", + " \n", + " def __del__(self): # 소멸자\n", " print('Deathday', ctime()) # 소멸 시간 출력 \n", "\n", "def test():\n", " mylife = Life()\n", " print('Sleeping for 3 sec')\n", - " sleep(3) #3초간 sleep(block)상태에 있음 (CPU 점유 못함)\n", + " sleep(3) #3초간 sleep(block)상태에 있음 (즉, 3초간 CPU 점유 못함)\n", "\n", "test()" ] @@ -797,15 +737,15 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "10\n", - "10\n" + "self.i:10\n", + "self.i:10\n" ] } ], @@ -814,7 +754,7 @@ " def __init__(self, i):\n", " self.i = i\n", " def __str__(self):\n", - " return str(self.i)\n", + " return \"self.i:\" + str(self.i)\n", "\n", "i = Integer(10)\n", "print(i)\n", @@ -845,7 +785,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python20.ipynb b/python3.6/python20.ipynb index fef1a08..fa6bcef 100644 --- a/python3.6/python20.ipynb +++ b/python3.6/python20.ipynb @@ -181,10 +181,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -204,20 +202,24 @@ } ], "source": [ - "class Integer:\n", + "class MyInteger:\n", " def __init__(self, i):\n", " self.i = i\n", + " \n", " def __str__(self):\n", " return str(self.i)\n", + "\n", " def __add__(self, other):\n", " return self.i + other\n", + "\n", " def __sub__(self, other):\n", " return self.i - other\n", + "\n", " def __mul__(self, other):\n", " return self.i * other\n", "\n", "\n", - "i = Integer(10)\n", + "i = MyInteger(10)\n", "print(i)\n", "print(str(i))\n", "\n", @@ -238,12 +240,78 @@ "print(i)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [주의] 위 코드는 연산자 오버로딩을 올바로 설명하지 못하는 코드. 아래 코드가 올바른 코드임. 이유는?" + ] + }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "10\n", + "\n", + "20\n", + "\n", + "30\n", + "\n", + "45\n", + "\n", + "450\n" + ] + } + ], + "source": [ + "class MyInteger2:\n", + " def __init__(self, i):\n", + " self.i = i\n", + " \n", + " def __str__(self):\n", + " return str(self.i)\n", + "\n", + " def __add__(self, other):\n", + " return MyInteger2(self.i + other)\n", + "\n", + " def __sub__(self, other):\n", + " return MyInteger2(self.i - other)\n", + "\n", + " def __mul__(self, other):\n", + " return MyInteger2(self.i * other)\n", + "\n", + "\n", + "i = MyInteger2(10)\n", + "print(i)\n", + "print(str(i))\n", + "\n", + "print()\n", + "i = i + 10\n", + "print(i)\n", + "\n", + "print()\n", + "i += 10\n", + "print(i)\n", + "\n", + "print()\n", + "i += 15\n", + "print(i)\n", + "\n", + "print()\n", + "i *= 10\n", + "print(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -261,6 +329,7 @@ "class MyString:\n", " def __init__(self, str):\n", " self.str = str\n", + " \n", " def __truediv__(self, sep): # 나누기 연산자 /가 사용되었을 때 호출되는 함수 \n", " return self.str.split(sep) # 문자열 self.str을 sep를 기준으로 분리\n", "\n", @@ -274,19 +343,18 @@ }, { "cell_type": "code", - "execution_count": 85, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "['abcd', 'abcd', 'abcd']\n", - "['abcd', 'bcd', 'bcd']\n", - "\n", - "['abcd', 'abcd', 'abcd']\n" + "ename": "TypeError", + "evalue": "unsupported operand type(s) for /: 'MyString' and 'str'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMyString\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"abcd_abcd_abcd\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_a\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for /: 'MyString' and 'str'" ] } ], @@ -295,15 +363,16 @@ "class MyString:\n", " def __init__(self, str):\n", " self.str = str\n", + " \n", " def __div__(self, sep): # 나누기 연산자 /가 사용되었을 때 호출되는 함수 \n", " return self.str.split(sep) # 문자열 self.str을 sep를 기준으로 분리\n", "\n", "m = MyString(\"abcd_abcd_abcd\")\n", - "print m / \"_\"\n", - "print m / \"_a\"\n", + "print(m / \"_\")\n", + "print(m / \"_a\")\n", "\n", "print\n", - "print m.__div__(\"_\")" + "print(m.__div__(\"_\"))" ] }, { @@ -317,9 +386,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -338,8 +405,10 @@ "class MyString:\n", " def __init__(self, str):\n", " self.str = str\n", + " \n", " def __truediv__(self, sep):\n", " return str.split(self.str, sep)\n", + "\n", " __rtruediv__ = __truediv__\n", "\n", "m = MyString(\"abcd_abcd_abcd\")\n", @@ -350,48 +419,10 @@ "print(\"_a\" / m)" ] }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['abcd', 'abcd', 'abcd']\n", - "['abcd', 'bcd', 'bcd']\n", - "\n", - "['abcd', 'abcd', 'abcd']\n", - "['abcd', 'bcd', 'bcd']\n" - ] - } - ], - "source": [ - "b#python2.x\n", - "class MyString:\n", - " def __init__(self, str):\n", - " self.str = str\n", - " def __div__(self, sep):\n", - " return str.split(self.str, sep)\n", - " __rdiv__ = __div__\n", - "\n", - "m = MyString(\"abcd_abcd_abcd\")\n", - "print m / \"_\"\n", - "print m / \"_a\"\n", - "print\n", - "print \"_\" / m\n", - "print \"_a\" / m" - ] - }, { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -406,10 +437,12 @@ "class MyString:\n", " def __init__(self, str):\n", " self.str = str\n", + " \n", " def __neg__(self):\n", " t = list(self.str)\n", " t.reverse()\n", " return ''.join(t)\n", + "\n", " __invert__ = __neg__\n", " \n", "m = MyString(\"abcdef\")\n", @@ -419,10 +452,8 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -442,10 +473,13 @@ "class MyString:\n", " def __init__(self, str):\n", " self.str = str\n", + " \n", " def __floordiv__(self, sep): \n", " return self.str.split(sep)[0]\n", + "\n", " def __mod__(self, sep):\n", " return self.str.split(sep)[1]\n", + "\n", " def __divmod__(self, sep):\n", " seperated_list = self.str.split(sep)\n", " return seperated_list[0], seperated_list[-1] \n", @@ -487,10 +521,8 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -511,16 +543,22 @@ "class MyInteger:\n", " def __init__(self, i):\n", " self.i = i\n", + " \n", " def __gt__(self, y):\n", " return self.i > y\n", + "\n", " def __ge__(self, y):\n", - " return self.i >= y \n", + " return self.i >= y\n", + " \n", " def __lt__(self, y):\n", - " return self.i < y \n", + " return self.i < y\n", + " \n", " def __le__(self, y):\n", " return self.i <= y \n", + " \n", " def __eq__(self, y):\n", " return self.i == y\n", + "\n", " def __ne__(self, y):\n", " return self.i != y \n", " \n", @@ -536,10 +574,8 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -547,10 +583,20 @@ "text": [ "False\n", "False\n", + "\n", + "False\n", + "False\n", + "\n", + "True\n", + "True\n", + "\n", "True\n", "True\n", "\n", "False\n", + "True\n", + "\n", + "False\n", "True\n" ] } @@ -560,6 +606,7 @@ "class MyInteger:\n", " def __init__(self, i):\n", " self.i = i\n", + "\n", " def __gt__(self, y):\n", " if isinstance(y, MyInteger):\n", " return self.i > y.i\n", @@ -610,14 +657,30 @@ " \n", "c = MyInteger(10)\n", "d = MyInteger(100)\n", + "e = 50\n", "\n", "print(c > d)\n", "print(c >= d)\n", + "print()\n", + "\n", + "print(c > e)\n", + "print(c >= e)\n", + "print()\n", + "\n", "print(c < d) \n", "print(c <= d)\n", "print()\n", + "\n", + "print(c < e) \n", + "print(c <= e)\n", + "print()\n", + "\n", "print(c == d) \n", - "print(c != d)" + "print(c != d)\n", + "print()\n", + "\n", + "print(c == e) \n", + "print(c != e)" ] }, { @@ -670,10 +733,8 @@ }, { "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, + "execution_count": 19, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -694,8 +755,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#s1.__getitem__(4)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#s1.__getitem__(9)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Out of Index - \"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#s1.__getitem__(4)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#s1.__getitem__(9)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 21\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Out of Index - \"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mIndexError\u001b[0m: Out of Index - 20" ] } @@ -705,8 +766,10 @@ "class Square:\n", " def __init__(self, end):\n", " self.end = end\n", + " \n", " def __len__(self):\n", " return self.end\n", + "\n", " def __getitem__(self, k):\n", " if k < 0 or self.end <= k: \n", " raise IndexError(\"Out of Index - \" + str(k))\n", @@ -722,66 +785,36 @@ "print(s1[20])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음 for 문은 s1에 대해 \\_\\_getitem()\\_\\_ 메소드를 0부터 호출하여 IndexError가 발생하면 루프를 중단한다. " + ] + }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 22, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "10\n", - "1\n", - "16\n" - ] - }, - { - "ename": "IndexError", - "evalue": "20", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m#s1.__getitem__(1)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mIndexError\u001b[0m: 20" + "0 1 4 9 16 25 36 49 64 81 " ] } ], "source": [ - "#python2.x\n", - "class Square:\n", - " def __init__(self, end):\n", - " self.end = end\n", - " def __len__(self):\n", - " return self.end\n", - " def __getitem__(self, k):\n", - " if k < 0 or self.end <= k: \n", - " raise IndexError, k\n", - " return k * k\n", - " \n", "s1 = Square(10)\n", - "print len(s1) # s1.__len__()\n", - "print s1[1] #s1.__getitem__(1)\n", - "print s1[4]\n", - "print s1[20]\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 다음 for 문은 s1에 대해 \\_\\_getitem()\\_\\_ 메소드를 0부터 호출하여 IndexError가 발생하면 루프를 중단한다. " + "for x in s1:\n", + " print(x, end=\" \")" ] }, { "cell_type": "code", - "execution_count": 48, - "metadata": { - "collapsed": false - }, + "execution_count": 23, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -792,8 +825,8 @@ } ], "source": [ - "s1 = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n", - "for x in s1:\n", + "s2 = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n", + "for x in s2:\n", " #print(x,)\n", " print(x, end=\" \")" ] @@ -807,10 +840,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 24, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -843,16 +874,14 @@ }, { "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": false - }, + "execution_count": 26, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "<__main__.MyDict object at 0x10748c4e0>\n", + "<__main__.MyDict object at 0x10d6553c8>\n", "light\n", "darkness\n", "2\n" @@ -864,10 +893,13 @@ " def __init__(self, d = None):\n", " if d == None: d = {}\n", " self.d = d\n", + " \n", " def __getitem__(self, k): #key\n", " return self.d[k]\n", + " \n", " def __setitem__(self, k, v):\n", " self.d[k] = v\n", + " \n", " def __len__(self):\n", " return len(self.d)\n", " \n", @@ -882,18 +914,16 @@ }, { "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": false - }, + "execution_count": 28, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "dict_keys(['one', 'two', 'three'])\n", - "dict_values([1, 2, 3])\n", - "dict_items([('one', 1), ('two', 2), ('three', 3)])\n" + "['one', 'two', 'three']\n", + "[1, 2, 3]\n", + "[('one', 1), ('two', 2), ('three', 3)]\n" ] } ], @@ -902,28 +932,29 @@ " def __init__(self, d=None):\n", " if d == None: d = {}\n", " self.d = d\n", + " \n", " def __getitem__(self, k):\n", " return self.d[k]\n", + "\n", " def __setitem__(self, k, v):\n", " self.d[k] = v\n", + " \n", " def __len__(self):\n", " return len(self.d)\n", + " \n", " def keys(self):\n", - " return self.d.keys()\n", + " return list(self.d.keys())\n", + "\n", " def values(self):\n", - " return self.d.values()\n", + " return list(self.d.values())\n", + "\n", " def items(self):\n", - " return self.d.items()\n", + " return list(self.d.items())\n", " \n", "m = MyDict({'one':1, 'two':2, 'three':3})\n", "print(m.keys())\n", "print(m.values())\n", - "print(m.items())\n", - "\n", - "#기존\n", - "# ['three', 'two', 'one']\n", - "# [3, 2, 1]\n", - "# [('three', 3), ('two', 2), ('one', 1)]" + "print(m.items())" ] }, { @@ -951,10 +982,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 30, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -970,20 +999,14 @@ "class StringRepr:\n", " def __repr__(self):\n", " return 'repr called'\n", + " \n", " def __str__(self):\n", " return 'str called'\n", " \n", "s = StringRepr()\n", "print(s)\n", "print(str(s))\n", - "print(repr(s))\n", - "# print(`s`)\n", - "\n", - "# 기존:\n", - "# str called\n", - "# str called\n", - "# repr called\n", - "# repr called" + "print(repr(s))" ] }, { @@ -996,10 +1019,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, + "execution_count": 31, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1019,14 +1040,7 @@ "s = StringRepr()\n", "print(s)\n", "print(str(s))\n", - "print(repr(s))\n", - "# print(`s`)\n", - "\n", - "# 기존:\n", - "# str called\n", - "# str called\n", - "# repr called\n", - "# repr called" + "print(repr(s))" ] }, { @@ -1040,10 +1054,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, + "execution_count": 32, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1051,7 +1063,7 @@ "text": [ "str called\n", "str called\n", - "<__main__.StringRepr object at 0x104464160>\n" + "<__main__.StringRepr object at 0x10d658470>\n" ] } ], @@ -1063,22 +1075,72 @@ "s = StringRepr()\n", "print(s)\n", "print(str(s))\n", - "print(repr(s))\n", - "# print(`s`)\n", - "\n", - "#기존\n", - "# str called\n", - "# <__main__.StringRepr instance at 0x101d3f908>\n", - "# str called\n", - "# <__main__.StringRepr instance at 0x101d3f908>" + "print(repr(s))" ] }, { "cell_type": "code", - "execution_count": 57, - "metadata": { - "collapsed": false - }, + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "30" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eval('10 + 20')" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "30" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = '10 + 20'\n", + "eval(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abc\n" + ] + } + ], + "source": [ + "b = \"print('abc')\"\n", + "eval(b)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1092,6 +1154,7 @@ "class StringRepr:\n", " def __init__(self, i = 10):\n", " self.i = i\n", + " \n", " def __repr__(self):\n", " return 'StringRepr(100)'\n", "\n", @@ -1111,10 +1174,8 @@ }, { "cell_type": "code", - "execution_count": 58, - "metadata": { - "collapsed": false - }, + "execution_count": 40, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1131,6 +1192,7 @@ "class Accumulator:\n", " def __init__(self):\n", " self.sum = 0\n", + " \n", " def __call__(self, *args):\n", " self.sum += sum(args)\n", " return self.sum\n", @@ -1151,10 +1213,8 @@ }, { "cell_type": "code", - "execution_count": 59, - "metadata": { - "collapsed": false - }, + "execution_count": 41, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1169,22 +1229,23 @@ } ], "source": [ + "class A:\n", + " def __call__(self, v):\n", + " return v\n", + " \n", + "class B:\n", + " def func(self, v):\n", + " return v\n", + " \n", "def check(func):\n", " if callable(func):\n", " print('callable')\n", " else:\n", " print('not callable')\n", - "\n", - "class B:\n", - " def func(self, v):\n", - " return v\n", - " \n", - "class A:\n", - " def __call__(self, v):\n", - " return v\n", - " \n", + " \n", "a = A()\n", "b = B()\n", + "\n", "check(a)\n", "check(b)\n", "print()\n", @@ -1216,7 +1277,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, From 0daff9d4a0603e9488adb41a58590f7f6201d05c Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 28 Nov 2018 23:14:11 +0900 Subject: [PATCH 098/124] jijij --- python3.6/python18.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python3.6/python18.ipynb b/python3.6/python18.ipynb index d6098ac..806be59 100644 --- a/python3.6/python18.ipynb +++ b/python3.6/python18.ipynb @@ -106,21 +106,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 4) import 모듈명 as 새로운 모듈 이름\n", + "#### 4) import 모듈명 as 새로운 모듈 이름\n", "- 해당 모듈을 새로운 다른 이름으로 사용하고자 할 때 사용\n", "- 기존 모듈 이름이 너무 길거나 현재 사용중인 다름 이름들과 충돌이 일어날 때 유용" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "\n", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n" ] From 89ea7bb7a2b7d8e874ab957d328b15a87dbfbd87 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 5 Dec 2018 16:08:01 +0900 Subject: [PATCH 099/124] sas --- python3.6/python19.ipynb | 2 +- python3.6/python20.ipynb | 86 +++++------------ python3.6/python21.ipynb | 196 +++++++++++++++++---------------------- 3 files changed, 106 insertions(+), 178 deletions(-) diff --git a/python3.6/python19.ipynb b/python3.6/python19.ipynb index a67dd8d..6bd0cac 100644 --- a/python3.6/python19.ipynb +++ b/python3.6/python19.ipynb @@ -845,7 +845,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python20.ipynb b/python3.6/python20.ipynb index fef1a08..6e3659c 100644 --- a/python3.6/python20.ipynb +++ b/python3.6/python20.ipynb @@ -182,9 +182,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -241,9 +239,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -275,9 +271,7 @@ { "cell_type": "code", "execution_count": 85, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -317,9 +311,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -353,9 +345,7 @@ { "cell_type": "code", "execution_count": 87, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -389,9 +379,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -420,9 +408,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -488,9 +474,7 @@ { "cell_type": "code", "execution_count": 33, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -537,9 +521,7 @@ { "cell_type": "code", "execution_count": 35, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -671,9 +653,7 @@ { "cell_type": "code", "execution_count": 47, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -725,9 +705,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -779,9 +757,7 @@ { "cell_type": "code", "execution_count": 48, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -808,9 +784,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -844,9 +818,7 @@ { "cell_type": "code", "execution_count": 49, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -883,9 +855,7 @@ { "cell_type": "code", "execution_count": 50, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -952,9 +922,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -997,9 +965,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1041,9 +1007,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1076,9 +1040,7 @@ { "cell_type": "code", "execution_count": 57, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1112,9 +1074,7 @@ { "cell_type": "code", "execution_count": 58, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1152,9 +1112,7 @@ { "cell_type": "code", "execution_count": 59, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1216,7 +1174,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python21.ipynb b/python3.6/python21.ipynb index d0b1221..b32a272 100644 --- a/python3.6/python21.ipynb +++ b/python3.6/python21.ipynb @@ -34,36 +34,34 @@ "- 상속의 이유\n", " - 코드의 재사용\n", " - 상속받은 자식 클래스는 상속을 해준 부모 클래스의 모든 기능을 그대로 사용\n", - " - 자식 클래스는 필요한 기능만을 정의하거나 기존의 기능을 변경할 수 있음" + " - 자식 클래스는 필요한 기능만을 정의하거나 기존의 기능을 변경(재정의, Override)할 수 있음" ] }, { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Person:\n", " def __init__(self, name, phone=None):\n", " self.name = name\n", " self.phone = phone\n", + " \n", " def __str__(self):\n", - " return '' % (self.name, self.phone)" + " return ''.format(self.name, self.phone)" ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": 15, + "metadata": {}, "outputs": [], "source": [ "class Employee(Person): # 괄호 안에 쓰여진 클래스는 슈퍼클래스를 의미한다.\n", " def __init__(self, name, phone, position, salary):\n", - " Person.__init__(self, name, phone) # Person클래스의 생성자 호출\n", + " Person.__init__(self, name, phone) # Person클래스의 생성자 호출 --> Unbound Method Call\n", + " #super().__init__(name, phone) # --> Bound Method Call\n", " self.position = position\n", " self.salary = salary" ] @@ -85,10 +83,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -137,9 +133,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -170,10 +164,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 19, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -192,6 +184,7 @@ "class Sub(Super):\n", " def __init__(self):\n", " Super.__init__(self) # 명시적으로 슈퍼클래스의 생성자를 호출한다.\n", + " #super().__init__() # 또는 왼쪽처럼 Bound 메소드 호출 \n", " print('Sub init called')\n", " \n", "s = Sub()" @@ -206,10 +199,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 20, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -241,9 +232,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -259,6 +248,7 @@ " def __init__(self, name, phone=None):\n", " self.name = name\n", " self.phone = phone\n", + " \n", " def __str__(self):\n", " return '' % (self.name, self.phone)\n", " \n", @@ -278,9 +268,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -297,6 +285,7 @@ " Person.__init__(self, name, phone)\n", " self.position = position\n", " self.salary = salary\n", + " \n", " def __str__(self):\n", " return '' % (self.name, self.phone, self.position, self.salary)\n", " \n", @@ -329,10 +318,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 21, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -385,10 +372,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 22, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -414,10 +399,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 23, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -450,16 +433,14 @@ "metadata": {}, "source": [ "#### 1) Stack 클래스 정의 예\n", - "- 슈퍼 클래스로 list 클래스를 지닌다.\n", + "- 슈퍼 클래스로 list 클래스를 지정\n", "- 즉, list 클래스를 확장하여 Stack 클래스를 정의함" ] }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 24, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -508,10 +489,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 25, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -526,6 +505,7 @@ "source": [ "class Queue(list):\n", " enqueue = list.append\n", + " \n", " def dequeue(self):\n", " return self.pop(0)\n", " \n", @@ -547,17 +527,15 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 26, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{}\n", - "['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']\n" + "['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']\n" ] } ], @@ -576,10 +554,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 27, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -595,7 +571,7 @@ "source": [ "class MyDict(dict):\n", " def keys(self):\n", - " K = list(dict.keys(self)) # 언바운드 메소드 호출 --> K = self.keys() 라고 호출하면 무한 재귀 호출\n", + " K = list(dict.keys(self)) # 언바운드 메소드 호출 --> K = list(self.keys()) 라고 호출하면 무한 재귀 호출\n", " K.sort()\n", " return K\n", "\n", @@ -624,6 +600,23 @@ "### 3-1 객체가 어떤 클래스에 속해 있는지 확인하기" ] }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "print(int)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -633,25 +626,24 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 29, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "True\n", "True\n", "True\n" ] } ], "source": [ - "#import types\n", - "# print(type(123) == types.IntType)\n", "print(type(123) == int)\n", - "print(type(123) == type(0))" + "print(type(123) == type(0))\n", + "a = 12345678\n", + "print(type(a) == type(0))" ] }, { @@ -664,23 +656,19 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 30, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "True\n", - "\n" + "True\n" ] } ], "source": [ - "print(isinstance(123, int))\n", - "print(int)" + "print(isinstance(123, int))" ] }, { @@ -692,25 +680,16 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 33, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "<__main__.A object at 0x11085ff60> =>\n", - "A\n", - "\n", - "<__main__.B object at 0x11092f1d0> =>\n", - "B\n", - "\n", - "<__main__.C object at 0x11085fd68> =>\n", - "B\n", - "C\n", - "\n" + "<__main__.A object at 0x10c2f9c50> => A\n", + "<__main__.B object at 0x10c2dae48> => B\n", + "<__main__.C object at 0x10c2f9ac8> => BC\n" ] } ], @@ -728,11 +707,11 @@ "def check(obj):\n", " print(obj, '=>', end=\" \")\n", " if isinstance(obj, A):\n", - " print('A')\n", + " print('A', end=\"\")\n", " if isinstance(obj, B):\n", - " print('B')\n", + " print('B', end=\"\")\n", " if isinstance(obj, C):\n", - " print('C')\n", + " print('C', end=\"\")\n", " print()\n", " \n", "a = A()\n", @@ -754,25 +733,16 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 34, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " =>\n", - "A\n", - "\n", - " =>\n", - "B\n", - "\n", - " =>\n", - "B\n", - "C\n", - "\n" + " => A\n", + " => B\n", + " => BC\n" ] } ], @@ -790,11 +760,11 @@ "def check(obj):\n", " print(obj, '=>', end=\" \")\n", " if issubclass(obj, A):\n", - " print('A'),\n", + " print('A', end=\"\")\n", " if issubclass(obj, B):\n", - " print('B'),\n", + " print('B', end=\"\")\n", " if issubclass(obj, C):\n", - " print('C'),\n", + " print('C', end=\"\")\n", " print()\n", " \n", "check(A)\n", @@ -813,7 +783,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [default]", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -827,7 +797,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.4" } }, "nbformat": 4, From 3add1d25c82f2fb6ede30445f8c7543a98977768 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 5 Dec 2018 16:20:03 +0900 Subject: [PATCH 100/124] dada --- python3.6/python20.ipynb | 39 ++------------------------------------- 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/python3.6/python20.ipynb b/python3.6/python20.ipynb index 87b09e0..fa6bcef 100644 --- a/python3.6/python20.ipynb +++ b/python3.6/python20.ipynb @@ -181,7 +181,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -311,7 +311,6 @@ { "cell_type": "code", "execution_count": 6, ->>>>>>> 0daff9d4a0603e9488adb41a58590f7f6201d05c "metadata": {}, "outputs": [ { @@ -420,40 +419,6 @@ "print(\"_a\" / m)" ] }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['abcd', 'abcd', 'abcd']\n", - "['abcd', 'bcd', 'bcd']\n", - "\n", - "['abcd', 'abcd', 'abcd']\n", - "['abcd', 'bcd', 'bcd']\n" - ] - } - ], - "source": [ - "b#python2.x\n", - "class MyString:\n", - " def __init__(self, str):\n", - " self.str = str\n", - " def __div__(self, sep):\n", - " return str.split(self.str, sep)\n", - " __rdiv__ = __div__\n", - "\n", - "m = MyString(\"abcd_abcd_abcd\")\n", - "print m / \"_\"\n", - "print m / \"_a\"\n", - "print\n", - "print \"_\" / m\n", - "print \"_a\" / m" - ] - }, { "cell_type": "code", "execution_count": 9, @@ -556,7 +521,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 11, "metadata": {}, "outputs": [ { From 381d43a429cc46ab02d4c43dc1d71a71b00c9f26 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Wed, 12 Dec 2018 21:20:03 +0900 Subject: [PATCH 101/124] wqdadas --- python3.6/python22.ipynb | 492 +++++++++++++++++++++++++-------------- python3.6/python23.ipynb | 378 ++++++++++++++---------------- 2 files changed, 499 insertions(+), 371 deletions(-) diff --git a/python3.6/python22.ipynb b/python3.6/python22.ipynb index f3321b7..2b2f503 100644 --- a/python3.6/python22.ipynb +++ b/python3.6/python22.ipynb @@ -74,9 +74,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -113,9 +111,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -164,9 +160,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -198,9 +192,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -235,9 +227,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -289,9 +279,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -338,9 +326,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -385,28 +371,28 @@ "source": [ "### 2-1 반복자 (Iterlator) 객체\n", "- 반복자 객체\n", - " - next() 내장 함수에 대해 값을 반환할 수 있는 객체\n", - " - 정확하게는 내부적으로 \\_\\_next\\_\\_(self)를 지니고 있는 객체\n", - " - next() 내장 함수에 대해 더 이상 자료를 념겨줄 수 없을 때 StopIteration 예외를 발생시킴\n", - "- 반복자 객체 생성 방법\n", + " - 내부적으로 \\_\\_next\\_\\_(self)를 지니고 있는 객체\n", + " - 내부적으로 지닌 Sequence 자료를 차례로 반환\n", + " - 더 이상 넘겨줄 자료가 없을 때 StopIteration 예외를 발생시킴\n", + " - next() 내장 함수에 대응됨\n", + " \n", + "- 임의의 객체에 대해 반복자 객체 생성 방법\n", " - iter(o) 내장 함수\n", " - 객체 o의 반복자 객체를 반환한다.\n", - "- 반복자 객체의 효율성\n", + "- 반복자 객체의 메모리 효율성\n", " - 반복자가 원 객체의 원소들을 복사하여 지니고 있지 않다." ] }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "1\n", "2\n", "3\n" @@ -419,7 +405,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 17\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m: " ] } @@ -431,7 +417,7 @@ "I = iter(L)\n", "print(I)\n", "\n", - "# Python2에서는 반복자 객체에 직접 next() 메소드 호출\n", + "# Python2.7에서는 반복자 객체에 직접 next() 메소드 호출\n", "# print(I.next())\n", "# print(I.next())\n", "# print(I.next())\n", @@ -453,10 +439,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -485,10 +469,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -507,7 +489,7 @@ "t = iter([1,2,3])\n", "while 1:\n", " try:\n", - " #x = t.next()\n", + " #x = t.next() <-- Python2.7\n", " x = next(t)\n", " except StopIteration:\n", " break\n", @@ -520,15 +502,13 @@ "source": [ "- for ~ in 구문에 반복자를 활용할 수 있다.\n", " - for 문이 돌때 마다 반복자 객체의 next() 함수가 자동으로 호출되어 순차적으로 각 객체에 접근 가능하다.\n", - " - StopIteration이 발생하면 for ~ in 구문이 멈춘다." + " - StopIteration이 발생하면 for ~ in 구문이 자동으로 멈춘다." ] }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -551,10 +531,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -576,10 +554,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -610,17 +586,52 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 내장 함수 iter(o)에 대응되는 \\_\\_iter\\_\\_(self) 및 \\_\\_next\\_\\_(self)의 구현 \n", - " - 객체 o에 iter(o)를 호출하면 자동으로 \\_\\_iter\\_\\_(self) 함수 호출\n", - " - \\_\\_iter\\_\\_(self) 함수는 \\_\\_next\\_\\_(self) 함수를 지닌 반복자 객체를 반환해야 한다." + "- 내장 함수 iter()에 대응되는 \\_\\_iter\\_\\_(self) 및 next()에 대응되는 \\_\\_next\\_\\_(self)의 구현 \n", + " - 객체 o에 iter()를 호출하면 자동으로 \\_\\_iter\\_\\_(self) 함수 호출\n", + " - \\_\\_iter\\_\\_(self) 함수는 \\_\\_next\\_\\_(self) 함수를 지닌 반복자 객체를 반환" ] }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n" + ] + } + ], + "source": [ + "class Seq:\n", + " def __init__(self, fname):\n", + " self.file = open(fname)\n", + " \n", + " def __getitem__(self, n):\n", + " if n == 10:\n", + " raise StopIteration\n", + " return n\n", + " \n", + "s = Seq('readme.txt') \n", + "for line in s: \n", + " print(line)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -632,7 +643,7 @@ "\n", "ghi\n", "\n", - "<__main__.Seq object at 0x108630240>\n", + "<__main__.Seq object at 0x10875da20>\n", "['abc\\n', 'def\\n', 'ghi']\n", "('abc\\n', 'def\\n', 'ghi')\n" ] @@ -643,12 +654,15 @@ "class Seq:\n", " def __init__(self, fname):\n", " self.file = open(fname)\n", - " #def __getitem__(self, n):\n", - " # if n == 10:\n", - " # raise StopIteration\n", - " # return n\n", + " \n", + " def __getitem__(self, n): # for ~ in 이 호출될 때 __next__() 함수에 의하여 가려짐. \n", + " if n == 10:\n", + " raise StopIteration\n", + " return n\n", + "\n", " def __iter__(self):\n", " return self\n", + " \n", " def __next__(self):\n", " line = self.file.readline() # 한 라인을 읽는다.\n", " if not line: \n", @@ -663,16 +677,17 @@ "\n", "print(Seq('readme.txt'))\n", "\n", - "print(list(Seq('readme.txt'))) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. \n", - "print(tuple(Seq('readme.txt'))) # tuple() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " + "# list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. \n", + "print(list(Seq('readme.txt'))) \n", + "\n", + "# tuple() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. \n", + "print(tuple(Seq('readme.txt'))) " ] }, { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -733,10 +748,8 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, + "execution_count": 15, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -758,10 +771,8 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -790,26 +801,90 @@ " - 사전 d가 지닌 키에 대한 반복자 객체를 반환한다.\n", "\n", "- python3.x\n", - " - iter(d.keys()) 사용" + " - iter(d) 또는 iter(d.keys()) 사용" ] }, { "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": false - }, + "execution_count": 26, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "\n", + "\n" + ] + } + ], + "source": [ + "print(type(d.keys()))\n", + "print(type(iter(d.keys())))" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'dict_keys' object is not an iterator", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'dict_keys' object is not an iterator" + ] + } + ], + "source": [ + "next(d.keys())" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'one'" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(iter(d.keys()))" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "one two three four five \n", "one two three four five " ] } ], "source": [ "#python3.x\n", + "for key in d.keys(): # 키에 대한 반복자, iter(d.keys()) 가 반환한 반복자에 대해 __next__(self) 함수가 순차적으로 불리워짐\n", + " print(key, end=\" \")\n", + "\n", + "print()\n", + "\n", "for key in iter(d.keys()): # 키에 대한 반복자, iter(d.keys()) 가 반환한 반복자에 대해 __next__(self) 함수가 순차적으로 불리워짐\n", " print(key, end=\" \")\n", " \n", @@ -820,10 +895,8 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, + "execution_count": 22, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -835,8 +908,10 @@ } ], "source": [ - "keyset = iter(d.keys())\n", + "keyset = iter(d)\n", + "\n", "print(next(keyset)) # 반복자 객체는 항상 next() 내장 함수에 값을 반환할 수 있음 (내부적으로 __next__(self) 호출)\n", + "\n", "for key in keyset: # keyset 반복자에 대해 next() 메소드가 순차적으로 호출됨\n", " print(key, end=\" \")" ] @@ -855,21 +930,44 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" + ] + } + ], + "source": [ + "print(type(d.values()))\n", + "print(type(iter(d.values())))" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "1 2 3 4 5 \n", "1 2 3 4 5 " ] } ], "source": [ "#python3.x\n", + "for key in d.values(): # 키에 대한 반복자, iter(d.keys()) 가 반환한 반복자에 대해 __next__(self) 함수가 순차적으로 불리워짐\n", + " print(key, end=\" \")\n", + "\n", + "print()\n", + "\n", "for key in iter(d.values()): # 키에 대한 반복자, iter(d.keys()) 가 반환한 반복자에 대해 __next__(self) 함수가 순차적으로 불리워짐\n", " print(key, end=\" \")\n", "\n", @@ -892,10 +990,27 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" + ] + } + ], + "source": [ + "print(type(d.items()))\n", + "print(type(iter(d.items())))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -936,16 +1051,14 @@ }, { "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": false - }, + "execution_count": 37, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "f.next() - abc\n", + "next(f) - abc\n", "\n", "def\n", "\n", @@ -956,7 +1069,7 @@ "source": [ "#python3.x\n", "f = open('readme.txt')\n", - "print(\"f.next() - \", next(f))\n", + "print(\"next(f) - \", next(f))\n", "for line in f: # f.next() 가 순차적으로 호출됨\n", " print(line, ) " ] @@ -964,9 +1077,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1006,20 +1117,18 @@ "- 발생자(Generator)\n", " - (중단됨 시점부터) 재실행 가능한 함수\n", " \n", - "- 아래 함수 f()는 자신의 인수 및 내부 변수로서 a, b, c, d를 지니고 있다.\n", + "- 아래 함수 f()는 자신의 인수 및 내부 로컬 변수로서 a, b, c, d를 지니고 있다.\n", " - 이러한 a, b, c, d 변수들은 함수가 종료되고 반환될 때 모두 사라진다.\n", - "- 발생자는 f()와 같이 함수가 종료될 때 메모리에서 해제되는 것을 막고 다시 함수가 호출 될 때 이전에 수행이 종료되었던 지점 부터 계속 수행이 가능하도록 구현된 함수이다." + "- 발생자는 f()와 같이 함수가 (임시로) 종료될 때 내부 로컬 변수가 메모리에서 해제되는 것을 막고 다시 함수가 호출 될 때 이전에 수행이 종료되었던 지점 부터 계속 수행이 가능하도록 구현된 함수이다." ] }, { "cell_type": "code", - "execution_count": 69, - "metadata": { - "collapsed": true - }, + "execution_count": 39, + "metadata": {}, "outputs": [], "source": [ - "def f(a,b):\n", + "def f(a, b):\n", " c = a * b\n", " d = a + b\n", " return c, d" @@ -1038,10 +1147,8 @@ }, { "cell_type": "code", - "execution_count": 70, - "metadata": { - "collapsed": true - }, + "execution_count": 41, + "metadata": {}, "outputs": [], "source": [ "def generate_ints(N):\n", @@ -1051,16 +1158,14 @@ }, { "cell_type": "code", - "execution_count": 72, - "metadata": { - "collapsed": false - }, + "execution_count": 42, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "0\n", "1\n", "2\n" @@ -1073,7 +1178,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 더 이상 반환할 값이 없다면 StopIteration 예외를 던짐\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m: " ] } @@ -1081,14 +1186,16 @@ "source": [ "gen = generate_ints(3) # 발생자 객체를 얻는다. generate_ints() 함수에 대한 초기 스택 프레임이 만들어지나 실행은 중단되어 있는 상태임\n", "print(gen)\n", - "# print(gen.next()) # 발생자 객체는 반복자 인터페이스를 가진다. 발생자의 실행이 재개됨. yield에 의해 값 반환 후 다시 실행이 중단됨\n", - "# print(gen.next()) # 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\n", - "# print(gen.next()) # 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\n", - "# print(gen.next()) # 발생자 실행 재개. yield에 의해 더 이상 반환할 값이 없다면 StopIteration 예외를 던짐\n", - "print(next(gen))\n", - "print(next(gen))\n", - "print(next(gen))\n", - "print(next(gen))" + "\n", + "# print(gen.next()) \n", + "# print(gen.next()) \n", + "# print(gen.next()) \n", + "# print(gen.next()) \n", + "\n", + "print(next(gen)) # 발생자 객체는 반복자 인터페이스를 가진다. 발생자의 실행이 시작됨. yield에 의해 값 반환 후 실행이 중단됨\n", + "print(next(gen)) # 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\n", + "print(next(gen)) # 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\n", + "print(next(gen)) # 발생자 실행 재개. yield에 의해 더 이상 반환할 값이 없다면 StopIteration 예외를 던짐" ] }, { @@ -1101,9 +1208,7 @@ { "cell_type": "code", "execution_count": 75, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1127,7 +1232,8 @@ " - 발생자 함수는 함수 내에서 수행 중에 중간 결과 값을 반환할 수 있음\n", "- 발생자가 유용하게 사용되는 경우\n", " - 함수 처리의 중간 결과를 다른 코드에서 참조할 경우\n", - " - 모든 결과를 한꺼번에 처리하는 것이 아니라 함수 처리 중에 나온 중간 결과를 사용해야 할 경우" + " - 즉, 모든 결과를 한꺼번에 반환 받는 것이 아니라 함수 처리 중에 나온 중간 결과를 받아서 사용해야 할 경우\n", + " - 시퀀스 자료형을 효율적으로 만들고자 하는 경우" ] }, { @@ -1142,10 +1248,8 @@ }, { "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": false - }, + "execution_count": 45, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1153,11 +1257,22 @@ "text": [ "[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]\n" ] + }, + { + "data": { + "text/plain": [ + "list" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ "a = [k for k in range(100) if k % 5 == 0]\n", - "print(a)" + "print(a)\n", + "type(a)" ] }, { @@ -1166,22 +1281,48 @@ "source": [ "- 리스트 내포 구문에 []가 아니라 () 사용\n", " - 리스트 대신에 발생자 생성\n", - " - 처음부터 모든 원소가 생성되지 않고 필요한 시점에 각 원소가 만들어짐\n", - " - 메모리를 보다 효율적으로 사용함" + " - 즉, 처음부터 모든 원소가 생성되지 않고 필요한 시점에 각 원소가 만들어짐\n", + " - 메모리를 보다 효율적으로 사용할 수 있음" ] }, { "cell_type": "code", - "execution_count": 41, - "metadata": { - "collapsed": false - }, + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " at 0x108759678>\n" + ] + }, + { + "data": { + "text/plain": [ + "generator" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = (k for k in range(100) if k % 5 == 0)\n", + "print(a)\n", + "type(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " at 0x108633f68>\n", "0\n", "5\n", "10\n", @@ -1190,11 +1331,10 @@ } ], "source": [ - "a = (k for k in range(100) if k % 5 == 0)\n", - "print(a)\n", "# print(a.next())\n", "# print(a.next())\n", "# print(a.next())\n", + "\n", "print(next(a))\n", "print(next(a))\n", "print(next(a))\n", @@ -1214,10 +1354,26 @@ }, { "cell_type": "code", - "execution_count": 42, - "metadata": { - "collapsed": false - }, + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n" + ] + } + ], + "source": [ + "a = [1, 2, 3]\n", + "print(sum(a))" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1242,9 +1398,7 @@ { "cell_type": "code", "execution_count": 43, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1257,7 +1411,7 @@ "source": [ "def fibonacci(a = 1, b = 1):\n", " while 1:\n", - " yield a \n", + " yield a\n", " a, b = b, a + b\n", " \n", "for k in fibonacci(): # 발생자를 직접 for ~ in 구문에 활용\n", @@ -1283,9 +1437,7 @@ { "cell_type": "code", "execution_count": 45, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1302,8 +1454,10 @@ " def __init__(self, limit = None): # 생성자 정의\n", " self.data = -1 # 초기 값\n", " self.limit = limit # 한계 값\n", + " \n", " def __iter__(self): # Odds 객체의 반복자를 반환하는 특수 함수\n", " return self\n", + "\n", " def __next__(self): # 반복자의 필수 함수\n", " self.data += 2\n", " if self.limit and self.limit <= self.data:\n", @@ -1319,9 +1473,7 @@ { "cell_type": "code", "execution_count": 43, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1338,8 +1490,10 @@ " def __init__(self, limit = None): # 생성자 정의\n", " self.data = -1 # 초기 값\n", " self.limit = limit # 한계 값\n", + "\n", " def __iter__(self): # Odds 객체의 반복자를 반환하는 특수 함수\n", " return self\n", + " \n", " def next(self): # 반복자의 필수 함수\n", " self.data += 2\n", " if self.limit and self.limit <= self.data:\n", @@ -1356,15 +1510,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 발생자를 활용한 예" + "- 발생자를 활용한 가장 좋은 예" ] }, { "cell_type": "code", - "execution_count": 87, - "metadata": { - "collapsed": false - }, + "execution_count": 50, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1412,7 +1564,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python23.ipynb b/python3.6/python23.ipynb index 9e45050..2f8d6a4 100644 --- a/python3.6/python23.ipynb +++ b/python3.6/python23.ipynb @@ -27,10 +27,31 @@ "- 구문 에러 (Syntax Error)\n", " - 문법적 에러\n", " - 이클립스 등의 통합개발환경 도구에서는 자동으로 실행 전에 구문 에러를 체크 해 줌\n", - " - 파이썬은 상대적으로 언어적 문법이 간단하기 때문에 구문 자체의 에러 발생 비율이 낮거나 다른 도구를 사용하여 완벽하게 제거할 수 있음\n", + " - 파이썬은 상대적으로 언어적 문법이 간단하기 때문에 구문 자체의 에러 발생 비율이 낮으며, 통합개발환경 도구를 사용하여 완벽하게 제거할 수 있음\n", "\n", + "- 논리 에러 (Logical Error)\n", + " - 논리적 에러\n", + " - 문법적 에러가 없으므로 프로그램이 실행이 되며, 비정상적으로 종료되지 않는 버그\n", + " - 논리 오류는 즉시 인식되지는 않지만 의도치 않은 또는 바라지 않은 결과나 다른 행동을 유발\n", + " \n", "- 예외 (Exception)\n", - " - 구문 에러는 없으나 프로그램 실행 중 더 이상 진행 할 수 없는 상황" + " - 문법적 에러는 없으나 프로그램 실행 중 더 이상 진행 할 수 없는 상황\n", + " - 즉, 논리 에러에 해당함\n", + " - 프로그램 실력은 이러한 예외 처리를 얼마나 꼼꼼하게 잘 하는가에 달려 있음" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 파이썬에서의 예외 (Exception) 종류\n", + " - 에러 (Error)\n", + " - 대부분의 예외\n", + " - 대부분의 예외들에 해당하는 클래스 이름은 Error 로 끝남\n", + " - 경고 (Warning)\n", + " - 논리적인 오류로 판단하기에 애매한 상황\n", + " - 일단은 무시하여도 좋음\n", + " - 하지만, 미래에는 다른 판단을 하여 에러로 변경될 수 있음" ] }, { @@ -45,9 +66,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "NameError", @@ -76,9 +95,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "ZeroDivisionError", @@ -111,9 +128,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "ZeroDivisionError", @@ -147,9 +162,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "TypeError", @@ -181,9 +194,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "IndexError", @@ -213,9 +224,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "KeyError", @@ -239,15 +248,14 @@ "metadata": {}, "source": [ "- 예외 발생 예제 6: 있지도 않은 파일을 열려고 할 때\n", - " - IOError" + " - FileNotFoundError (Python3)\n", + " - IOError (Python2)" ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [ { "ename": "FileNotFoundError", @@ -256,7 +264,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'aaa.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'aaa.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# python2.x에서의 결과\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# IOError: [Errno 2] No such file or directory: 'aaa.txt'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'aaa.txt'" ] } @@ -283,40 +291,53 @@ " +-- GeneratorExit\n", " +-- Exception\n", " +-- StopIteration\n", - " +-- StandardError\n", - " | +-- BufferError\n", - " | +-- ArithmeticError\n", - " | | +-- FloatingPointError\n", - " | | +-- OverflowError\n", - " | | +-- ZeroDivisionError\n", - " | +-- AssertionError\n", - " | +-- AttributeError\n", - " | +-- EnvironmentError\n", - " | | +-- IOError\n", - " | | +-- OSError\n", - " | | +-- WindowsError (Windows)\n", - " | | +-- VMSError (VMS)\n", - " | +-- EOFError\n", - " | +-- ImportError\n", - " | +-- LookupError\n", - " | | +-- IndexError\n", - " | | +-- KeyError\n", - " | +-- MemoryError\n", - " | +-- NameError\n", - " | | +-- UnboundLocalError\n", - " | +-- ReferenceError\n", - " | +-- RuntimeError\n", - " | | +-- NotImplementedError\n", - " | +-- SyntaxError\n", - " | | +-- IndentationError\n", - " | | +-- TabError\n", - " | +-- SystemError\n", - " | +-- TypeError\n", - " | +-- ValueError\n", - " | +-- UnicodeError\n", - " | +-- UnicodeDecodeError\n", - " | +-- UnicodeEncodeError\n", - " | +-- UnicodeTranslateError\n", + " +-- StopAsyncIteration\n", + " +-- ArithmeticError\n", + " | +-- FloatingPointError\n", + " | +-- OverflowError\n", + " | +-- ZeroDivisionError\n", + " +-- AssertionError\n", + " +-- AttributeError\n", + " +-- BufferError\n", + " +-- EOFError\n", + " +-- ImportError\n", + " | +-- ModuleNotFoundError\n", + " +-- LookupError\n", + " | +-- IndexError\n", + " | +-- KeyError\n", + " +-- MemoryError\n", + " +-- NameError\n", + " | +-- UnboundLocalError\n", + " +-- OSError\n", + " | +-- BlockingIOError\n", + " | +-- ChildProcessError\n", + " | +-- ConnectionError\n", + " | | +-- BrokenPipeError\n", + " | | +-- ConnectionAbortedError\n", + " | | +-- ConnectionRefusedError\n", + " | | +-- ConnectionResetError\n", + " | +-- FileExistsError\n", + " | +-- FileNotFoundError\n", + " | +-- InterruptedError\n", + " | +-- IsADirectoryError\n", + " | +-- NotADirectoryError\n", + " | +-- PermissionError\n", + " | +-- ProcessLookupError\n", + " | +-- TimeoutError\n", + " +-- ReferenceError\n", + " +-- RuntimeError\n", + " | +-- NotImplementedError\n", + " | +-- RecursionError\n", + " +-- SyntaxError\n", + " | +-- IndentationError\n", + " | +-- TabError\n", + " +-- SystemError\n", + " +-- TypeError\n", + " +-- ValueError\n", + " | +-- UnicodeError\n", + " | +-- UnicodeDecodeError\n", + " | +-- UnicodeEncodeError\n", + " | +-- UnicodeTranslateError\n", " +-- Warning\n", " +-- DeprecationWarning\n", " +-- PendingDeprecationWarning\n", @@ -324,9 +345,10 @@ " +-- SyntaxWarning\n", " +-- UserWarning\n", " +-- FutureWarning\n", - "\t +-- ImportWarning\n", - "\t +-- UnicodeWarning\n", - "\t +-- BytesWarning\n", + " +-- ImportWarning\n", + " +-- UnicodeWarning\n", + " +-- BytesWarning\n", + " +-- ResourceWarning\n", "" ] }, @@ -359,10 +381,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -383,21 +403,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 예외 처리를 하면 예외 발생시 프로그램 종료가 되지 않는다." + "- 예외 처리를 하면 예외 발생시 프로그램 종료가 되지 않는다.\n", + "- as 라는 구문을 통하여 예외 객체를 잡아서 처리할 수 있음." ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 23, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "float division by zero\n", + "ZeroDivisionError 발생\n", + "-----float division by zero\n", + "-----float division by zero\n", + "-----\n", "10.0\n", "5.0\n", "3.3333333333333335\n", @@ -412,27 +434,25 @@ " try:\n", " print(10.0 / n)\n", " except ZeroDivisionError as e:\n", - " print(e)\n", + " print(\"ZeroDivisionError 발생\")\n", + " print(\"-----\" + str(e))\n", + " print(\"-----\" + e.__str__())\n", + " print(\"-----\" + str(e.__class__))\n", "\n", "division()" ] }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, + "execution_count": 24, + "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "float division by zero\n", - "10.0\n", - "5.0\n", - "3.33333333333\n", - "2.5\n" + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 6)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m6\u001b[0m\n\u001b[0;31m except ZeroDivisionError, msg:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], @@ -441,7 +461,7 @@ "def division():\n", " for n in range(0, 5):\n", " try:\n", - " print 10.0 / n\n", + " print(10.0 / n)\n", " except ZeroDivisionError, msg:\n", " print msg\n", "\n", @@ -458,9 +478,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "ename": "SyntaxError", @@ -486,15 +504,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 상황에 따라서는 에러와 함께 따라오는 정보를 함께 받을 수도 있다." + "- 상황에 따라서는 에러와 함께 따라오는 정보를 함께 받을 수도 있다.\n", + " - 그러한 정보를 얻으려면 객체 자체를 print()에 넣어 출력하면 됨" ] }, { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -514,46 +531,23 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 25, + "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error - name 'spam' is not defined\n" + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 4)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m except NameError, msg:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], "source": [ - "#python2.x\n", + "#python2.7\n", "try:\n", " spam()\n", "except NameError, msg:\n", - " print 'Error -', msg" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error - name 'spam' is not defined\n" - ] - } - ], - "source": [ - "try:\n", - " spam()\n", - "except NameError as msg:\n", " print('Error -', msg)" ] }, @@ -567,9 +561,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -593,9 +585,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -619,9 +609,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -654,9 +642,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -684,9 +670,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -728,9 +712,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -768,9 +750,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -783,26 +763,27 @@ } ], "source": [ - "#python2.x\n", + "#python3.x\n", "import os\n", - "print os.getcwd()\n", + "print(os.getcwd())\n", "filename = 't.txt'\n", "\n", "try:\n", " f = open(filename, 'r')\n", - "except IOError, msg:\n", - " print msg\n", + "except IOError as e:\n", + " print(e)\n", + " f = open(default_filename, 'r')\n", + "\n", + "a = float(f.readline())\n", + "try:\n", + " answer = 1.0 / a\n", + "except ZeroDivisionError as e:\n", + " print(e)\n", "else:\n", - " a = float(f.readline())\n", - " try:\n", - " answer = 1.0 / a\n", - " except ZeroDivisionError, msg:\n", - " print msg\n", - " else:\n", - " print answer\n", - " finally:\n", - " print \"Finally!!!\"\n", - " f.close()" + " print(answer)\n", + "finally:\n", + " print(\"Finally!!!\")\n", + " f.close()" ] }, { @@ -816,10 +797,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, + "execution_count": 26, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -849,9 +828,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -876,9 +853,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -920,10 +895,8 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, + "execution_count": 27, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -940,8 +913,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# IndexError가 발생하는 시점까지 반복한다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mend\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 첨자 범위가 넘었다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m \u001b[0;31m# 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mend\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 첨자 범위가 넘었다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m \u001b[0;31m# 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mIndexError\u001b[0m: " ] } @@ -950,17 +923,21 @@ "class SquareSeq:\n", " def __init__(self, n):\n", " self.n = n\n", + " \n", " def __getitem__(self, k):\n", " if k >= self.n or k < 0 :\n", " raise IndexError # 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\n", " return k * k\n", + "\n", " def __len__(self):\n", " return self.n\n", " \n", "s = SquareSeq(10)\n", "print(s[2], s[4])\n", + "\n", "for x in s: # IndexError가 발생하는 시점까지 반복한다\n", " print(x,end=\" \")\n", + "\n", "print(s[20]) # 첨자 범위가 넘었다" ] }, @@ -981,10 +958,21 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "class Big(Exception):\n", + " pass\n", + "\n", + "class Small(Big):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -996,12 +984,6 @@ } ], "source": [ - "class Big(Exception):\n", - " pass\n", - "\n", - "class Small(Big):\n", - " pass\n", - "\n", "def dosomething1():\n", " x = Big()\n", " raise x\n", @@ -1028,10 +1010,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 31, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1055,9 +1035,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1084,15 +1062,15 @@ "source": [ "- 생성자 안에 넣어준 에러 메시지는 except 키워드 사용시에 두 번째 인자로 해당 메시지를 받을 수 있다.\n", " - python3에서는 지원하지 않음\n", - "- python3에서는 예외 객체를 받아서 해당 객체의 \\_\\_str\\_\\_()을 호출하여 메시지를 얻는다." + "- python3에서는 예외 객체를 받아서..\n", + " - 객체 자체를 print() 하거나\n", + " - 해당 객체의 \\_\\_str\\_\\_()을 호출하여 메시지 문자열을 얻어서 print() 한다." ] }, { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1117,9 +1095,7 @@ { "cell_type": "code", "execution_count": 28, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1165,7 +1141,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.6.4" } }, "nbformat": 4, From 09a8cfebaaa007a9ceefc8f9fcceedaf7c05210b Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sun, 15 Sep 2019 21:25:41 +0900 Subject: [PATCH 102/124] =?UTF-8?q?2019=EB=85=84=20=EC=88=99=EC=A0=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python3.6/assignment2019/assignment-1.ipynb | 136 ++++ python3.6/assignment2019/assignment-2.ipynb | 695 ++++++++++++++++++++ python3.6/assignment2019/assignment-3.ipynb | 208 ++++++ python3.6/assignment2019/assignment-4.ipynb | 249 +++++++ python3.6/assignment2019/assignment-5.ipynb | 308 +++++++++ 5 files changed, 1596 insertions(+) create mode 100644 python3.6/assignment2019/assignment-1.ipynb create mode 100644 python3.6/assignment2019/assignment-2.ipynb create mode 100644 python3.6/assignment2019/assignment-3.ipynb create mode 100644 python3.6/assignment2019/assignment-4.ipynb create mode 100644 python3.6/assignment2019/assignment-5.ipynb diff --git a/python3.6/assignment2019/assignment-1.ipynb b/python3.6/assignment2019/assignment-1.ipynb new file mode 100644 index 0000000..51b3b1b --- /dev/null +++ b/python3.6/assignment2019/assignment-1.ipynb @@ -0,0 +1,136 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 1\n", + "### [정보]\n", + "#### 1) Due Date: 2019년 9월 27일 (금), 23시 59분\n", + "#### 2) 제출방법: colab으로 작성된 notebook URL을 EL사이트에 제출 (EL 사이트의 본인 게시물에서 클릭이 되도록 함)\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 colab notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell 등에 넣어 기입하시오.\n", + "#### 4) 숙제이후 소감: 11개의 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### [문제]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. a=\"Hello Python\" 문자열을 Slicing과 연결 연산자 (+)를 사용하여 \"Python Hello\"로 변경하시오.\n", + " - [주의] a 변수 자체에 \"Python Hello\" 문자열이 저장되어야 함" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2. b=\"Hello Python World\" 문자열을 Slicing과 연결 연산자 (+)를 사용하여 \"World Python Hello\"로 변경하시오.\n", + " - [주의] b 변수 자체에 \"World Python Hello\" 문자열이 저장되어야 함 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3. c=\"Hello\"를 \"olleH\"로 변경하시오\n", + " - [주의] c 변수 자체에 \"olleH\" 문자열이 저장되어야 함" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "4. s=\"python\"에 대해 다음 문제를 풀어보시오.\n", + " 1. s[0], s[0][0], s[0][0][0]은 각각 어떤 값이 나오는지 확인하고 그 이유를 나름대로 설명해 보시오.\n", + " 2. s[-100], s[100]은 값이 나오는지 에러가 나오는지 확인하고 그 결과에 대한 이유를 나름대로 설명해 보시오.\n", + " 3. s[-100, 100]은 값이 나오는지 에러가 나오는지 확인하고 그 결과에 대한 이유를 나름대로 설명해 보시오.\n", + " 4. s[1:-1]의 결과를 확인하고 그 결과에 대한 이유를 정확하게 설명하시오.\n", + " 5. s[3:-3]의 결과를 확인하고 그 결과에 대한 이유를 정확하게 설명하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "5. for문을 활용하여 1부터 100사이의 홀수를 출력하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "6. while문을 활용하여 1부터 100사이의 짝수의 합을 계산하여 출력하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "7. 사용자로 부터 임의의 정수를 입력받고, 해당 숫자를 역순으로 출력하는 프로그램을 작성하시오. \n", + "\n", + " [실행 예]\n", + " ```\n", + " 정수를 입력하세요: 3125\n", + " 숫자 역순은 5213 입니다.\n", + " ```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "8. 사용자로 부터 정수를 입력받아서 1부터 그 사이에 존재하는 소수 (Prime number)를 출력하는 파이썬 프로그램을 작성하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "9. (규영) ~~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "10. (규영) ~~~~" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/assignment2019/assignment-2.ipynb b/python3.6/assignment2019/assignment-2.ipynb new file mode 100644 index 0000000..2e6650c --- /dev/null +++ b/python3.6/assignment2019/assignment-2.ipynb @@ -0,0 +1,695 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 2\n", + "### [정보]\n", + "#### 1) Due Date: 2018년 10월 19일 (금), 23시 59분\n", + "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입.\n", + "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 일반 연습 문제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1) 다음 6 개의 Expression에 대해 Evaluation 결과 값을 출력하고, 해당 결과가 나온 이유에 대해 설명하시오\n", + " - 1 and 2 and 3 and 4\n", + " - 1 or 2 or 3 or 4\n", + " - 1 and 2 or 3 and 4\n", + " - (1 and 2) or (3 and 4)\n", + " - 1 or 2 and 3 or 4\n", + " - (1 or 2) and (3 or 4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2) 경로에 해당하는 문자열 1개를 입력 받아 그 안에 디렉토리 경로명과 파일명을 분리하여 리스트로 반환하는 함수 div_path(s)를 작성하시오.\n", + " - 인자로 전달하는 문자열은 경로만 들어간다고 가정한다.\n", + " - 각 디렉토리와 파일을 구분하는 문자는 '/'로 가정한다.\n", + " - 반환하는 리스트의 첫번째 원소는 디렉토리이고 두번째 원소는 파일명이다.\n", + " - 다음과 같은 실행 및 출력 결과가 도출되어야 한다.\n", + " - div_path('/usr/local/bin/python')\n", + " - ['/usr/local/bin', 'python']\n", + " - div_path('/home/chulsoo/test.txt')\n", + " - ['/home/chulsoo', 'test.txt']\n", + " - [참고] 리스트(l) 내에 새로운 정수값 (예를 들어 10)을 넣는 방법은 l.append(10) 이다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3) 두 개의 리스트를 인자로 받아서 그 두 개의 리스트에 대한 '합집합'을 반환하는 함수 list_union(lista, listb)를 작성하시오.\n", + " - 인자로 전달하는 리스트 2 개에는 정수값만 들어간다고 가정하자.\n", + " - 함수 내에서 새로운 리스트를 만들어 그 리스트 내에 인자로 받은 두 리스트의 모든 원소를 넣어 반환한다.\n", + " - 반환하는 리스트에는 절대로 중복된 원소가 들어 있으면 안된다 (집합의 조건).\n", + " - 반환하는 리스트는 정렬이 되어 있어야 한다.\n", + " - 다음과 같은 실행 및 출력 결과가 도출되어야 한다.\n", + " - list_union([1, 2, 3], [1, 2, 4])\n", + " - [1, 2, 3, 4]\n", + " - list_union([-10, -5, 0, -1], [100, 9, 0, 9])\n", + " - [-10, -5, -1, 0, 9, 100]\n", + " - list_union([0, 1, 2], [0, 1, 2])\n", + " - [0, 1, 2]\n", + " - [참고] 리스트(l) 내에 새로운 정수값 (예를 들어 10)을 넣는 방법은 l.append(10) 이다.\n", + " - [참고] 임의의 정수값 (x)이 리스트 (l) 내에 존재하는지 판단하는 방법은 x in l 이다." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ACM-ICPC 문제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1) [ACM-ICPC 문제 10809번]\n", + " - 알파벳 찾기
\n", + "https://www.acmicpc.net/problem/10809" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2) [ACM-ICPC 문제 2675번]\n", + " - 문자열 반복
\n", + "https://www.acmicpc.net/problem/2675" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Incremental Project 문제" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1) 웹 URL로 지정된 웹페이지를 문자열로 가져와 1) 모든 HTML 태그를 제외한 순수 텍스트 문자열만을 걸러내고, 2) 그 순수 텍스트 문자열 안에 존재하는 단어가 총 몇개인지 출력하는 프로그램을 작성하시오.\n", + " - HTML 태그는 다음 조건을 가지는 것이다.\n", + " - < 로 시작하여 >로 끝난다.\n", + " - 예를 들어, 아래와 같은 HTML 내용 내에 한 줄이 있다고 가정하자.\n", + " \n", + " ```\n", + " \n", + " ```\n", + " - 위 소스에서 HTML 태그를 제외한 순수 텍스트 문자열은 아래와 같다.\n", + " \n", + " ```\n", + " 로그인 유지 \n", + " ```\n", + " \n", + " - 한편, 아래와 같은 HTML 한 줄이 있다고 가정하자.\n", + " \n", + " ```\n", + " \n", + " ```\n", + " \n", + " - 위 한 줄은 HTML 태그로만 구성된 것이며 걸러낼 수 있는 순수 텍스 문자열은 존재하지 않는다.\n", + " \n", + " - 단어를 나누는 기준은 오로지 공백문자 (whitespace)이다.\n", + " - 즉, 위 순수 텍스트 문자열인 \"로그인 유지\"에서 분리한 단어는 \"로그인\"과 \"유지\"이다.\n", + " - 중복을 고려하지 않고 무조건 모든 단어의 개수를 세어서 출력한다.\n", + " - 본 숙제를 위하여 HTML 파싱과 관련된 모듈 (예. BeautifulSoup) 사용 금지\n", + " - 다음은 URL로 지정된 웹페이지를 특정 문자열로 가져오는 코드이다. \n", + " - 즉, 숙제 코드는 아래 코드로 부터 시작해야 한다.\n", + " - 아래 코드 수행시 requests 모듈이 존재하지 않는 에러가 발생하면 command 창에서 다음 코드 입력하여 requests 모듈 설치후 아래 코드 수행\n", + " ```\n", + " > pip install requests\n", + " ```" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "req = requests.get('http://cse.koreatech.ac.kr')\n", + "\n", + "source = req.text" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "컴퓨터공학부\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tSchoolfun - Study and Fun\n", + "\t\n", + "\t\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\t\n", + "\t\t\t\n", + "\n", + "\n", + "
\n", + "\t
\n", + "\t\t
\n", + "\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\t\n", + "\t\t\t\n", + "\t\t\t\"School\n", + "\t\t\t\n", + "\t\t
\n", + "\t
\n", + "\t\n", + "
\n", + "\t \t \n", + "\n", + "
\n", + " \n", + "\t
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

IT 교육의 글로벌 메카

\n", + "

한국기술교육대학교 컴퓨터공학부 홈페이지에 오신 것을
환영합니다!

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\t
\n", + "
\n", + "

IT 융합소프트웨어 인력양성사업

\n", + "

글로벌 수준의 IT전문인력 양성
\n", + "IT융합분야에 대한 국제적인 경쟁력 고취

\n", + " 바로가기\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\t
\n", + "
\n", + "

교육역량강화사업 컨텐츠

\n", + "

교육역량강화사업 온라인 컨텐츠를 소개합니다.

\n", + " 바로가기\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\t\t\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "# 추후 숙제 답안 제출 때엔 아래 코드는 주석처리할 것\n", + "print(source)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/assignment2019/assignment-3.ipynb b/python3.6/assignment2019/assignment-3.ipynb new file mode 100644 index 0000000..75f36e8 --- /dev/null +++ b/python3.6/assignment2019/assignment-3.ipynb @@ -0,0 +1,208 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 3\n", + "### [정보]\n", + "#### 1) Due Date: 2018년 10월 29일 (월), 23시 59분\n", + "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", + "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "#### 5) 문제 (ACM-ICPC 1문제 포함하여 총 9개)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- L=[1, 2, 3, 4, 5]일 때 다음 각 문장을 수행한 후의 결과를 보고 납득할 만한 이유를 설명하시오. \n", + " - 1)
L[1:3] = [100]\n",
+    "   print(L)
\n", + " - 2)
L[1:3] = [(100)]\n",
+    "   print(L)
\n", + " - 3)
L[1:3] = 100\n",
+    "   print(L)
\n", + " - 4)
L[1:3] = (100)\n",
+    "   print(L)
\n", + " - 5)
L[1:3] = (100, 101, 102)\n",
+    "   print(L)
\n", + " - 6)
L[1:3] = [100, 101, 102]\n",
+    "   print(L)
\n", + " - 7)
L[1:3] = [(100, 101, 102)]\n",
+    "   print(L)
\n", + " - 8)
L[1:3] = [[100, 101, 102]]\n",
+    "   print(L)
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 문자열 S = 'Hello World and Python'에 대해 다음 요구사항에 대한 Python 코드를 제시하시오. \n", + " - 1) 단어의 순서가 역순으로 되어진 문자열 ('Python and World Hello')을 만들고 \n", + " - 2) 1)의 결과 문자열에 대해 메소드 split과 join을 이용하여 공백을 모두 없엔 문자열 'PythonandWorldHello'을 만드시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음 코드를 보고 물음에 답하시오.\n", + "
a = [1, 2, 3]\n",
+    "  b = a * 3\n",
+    "  c = [a] * 3\n",
+    "  print(b)\n",
+    "  print(c)
\n", + "\n", + " - 1) 위 코드를 수행한 이후 다음 코드를 수행한 후 b와 c의 내용을 확인하시오.\n", + "
a[0]=0
\n", + " - 2) b와 c 객체의 차이는 무엇인가?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음 문자열을 ':'을 기준으로 분리하여 리스트로 만들고 각 문자열의 좌우 공백을 제거하시오 (즉, 문자열 S에서 l을 만들어라)\n", + "
\n",
+    "s = '  first star   :   second star   :    third star  '\n",
+    "l = ['first star', 'second star', 'third star']\n",
+    "
\n", + " - 1) for ~ in 문을 이용한 코드를 작성하시오. \n", + " - 2) 리스트 내포(list comprehension)를 이용한 코드를 작성하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음과 같이 0보다 큰 정수 리스트 변수 list를 인자로 받는 함수 addall(list)와 addallodd(list)를 for ~ in 리터널과 리스트 내포 방식으로 각각 제시하시오.\n", + " - 1) addall(list) 함수 (리스트 내의 모든 정수를 더하는 함수로서 해답으로는 for ~ in 리터럴과 리스트 내포 방식으로 각각 제시하시오.)\n", + " -
>>> addall([1])\n",
+    "    1
\n", + " -
>>> addall([1, 2, 3, 4, 5, 6, 7, 8, 9])\n",
+    "    45
\n", + " - 2) addallodd(list) 함수 (리스트내의 모든 홀수를 더하는 함수로서 해답으로는 for ~ in 리터럴과 리스트 내포 방식으로 각각 제시하시오.)\n", + " -
>>> addallodd([1])\n",
+    "    1
\n", + " -
>>> addallodd([1, 2, 3, 4, 5, 6, 7, 8, 9])\n",
+    "    25
\n", + " - [참고 1]: 리스트 내포 방식으로 addall() 및 addallodd()함수를 만들 때엔 리스트 내포에 의해 생성된 리스트 결과에 대해 내장 함수를 사용하는 방식을 고려해보시오 (주의: 리스트 내포 방식의 addall() 및 addallodd() 함수의 몸체는 단 1줄로 작성되어야 한다.)\n", + " - [참고 2]: sum() 등의 내장함수 사용 가능함" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다음 코드를 보고 물음에 답하시오.\n", + "
L1 = [1, 2, 3]\n",
+    "L2 = [4, 5, 6]\n",
+    "d = {'low':L1, 'high':L2}\n",
+    "e = d\n",
+    "f = d.copy()\n",
+    "print(d)\n",
+    "print(e)\n",
+    "print(f)\n",
+    "print()\n",
+    "d['low'] = [10, 20, 30]\n",
+    "d['high'][1] = 500\n",
+    "print(d)\n",
+    "print(e)\n",
+    "print(f)
\n", + "\n", + " - 1) 위 코드의 수행 결과 d와 e는 항상 같은 결과를 출력한다. 그 이유는 무엇인가?\n", + " - 2) 위 코드의 수행 결과 마지막 f의 내용은 다음과 같다. 이 때 'high' 키의 값 내용 중 500이 출력된 이유와 'low' 키의 값 내용 중 [1, 2, 3]이 출력된 이유를 설명하시오 ([hint]: shallow copy 관점에서 설명하시오.)\n", + "
{'high': [4, 500, 6], 'low': [1, 2, 3]}
\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사전 d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}가 주어졌을 때 다음 요구사항에 맞는 코드를 제시하시오 \n", + " - [참고]: d.keys(), d.values()를 통해 리스트를 얻어낸 후 리스트가 지니고 있는 sort(cmp=None, key=None, reverse=False)함수를 활용하시오.\n", + " - 1) 키의 알파벳 오름차순 순서대로 튜플 (키, 값)을 차례대로 출력하시오.\n", + " - 2) 키의 알파벳 내림차순 순서대로 튜플 (키, 값)을 차례대로 출력하시오.\n", + " - 3) 값의 오름차순 순서대로 튜플 (키, 값)을 차례대로 출력하시오. \n", + " - 4) 값의 내림차순 순서대로 튜플 (키, 값)을 차례대로 출력하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [ACM-ICPC 문제 1673번] \n", + " - 치킨 쿠폰
\n", + " https://www.acmicpc.net/problem/1673" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [Incremental Project] 이전 Assignment 2의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하고 단어들의 총 개수를 출력하는 프로그램을 작성하는 것이었다. 이번에는 그 마지막 숙제를 그대로 확장하여 웹 URL로 지정된 웹페이지 내 순수 텍스트 안에 존재하는 각 단어들에 대해 다음 요구사항 대로 출력하는 프로그램을 작성하시오.\n", + " - 요구사항 1. CSS와 Javascript 내용도 모두 제거하시오 (이전 숙제에서 이미 제외하였다면 본 요구사항 무시)\n", + " - 즉, 아래와 같은 코드는 태그 뿐만 아니라 그 안의 내용 전체를 모두 제거\n", + " ```\n", + " \n", + " ``` \n", + " \n", + " ```\n", + " \n", + " ```\n", + " - 요구사항 2. 순수 텍스트 안에 존재하는 단어들에 대해 string 모듈을 활용하여 모든 punctuation (구두문자)를 완벽히 제거하시오.\n", + " - 예: ['world!', ':', '+hello+', '~python$$$', '=', 'world'] ---> ['world', 'hello', 'python', 'world']\n", + " - 모든 punctuation을 확인하는 방법은 아래와 같다.\n", + "
\n",
+    "    import string\n",
+    "    print(string.punctuation)\n",
+    "    
\n", + " - 요구사항 3. 만약 punctuation (구두문자)를 제거한 이후 공백으로 판명되는 단어들은 해당 단어 리스트에서 제거하시오.\n", + " - 예: ['컴퓨터공학부!', '---?', '%지향~', '...'] ---> ['컴퓨터공학부', '', '지향', ''] ---> ['컴퓨터공학부', '지향'] \n", + "

\n", + " - 요구사항 3. 각 단어들의 출현빈도를 사전형태로 저장하여 출력하시오.\n", + " - 예: ['world', 'hello', 'python', 'world', '컴퓨터공학부', '지향'] ---> {'world': 2, 'hello': 1, 'python': 1, '컴퓨터공학부': 1, '지향': 1}\n", + "

\n", + " - 요구사항 4. 다음 5개의 사이트에 대한 단어 출현빈도 결과를 출력하시오.\n", + " - http://cse.koreatech.ac.kr\n", + " - https://www.koreatech.ac.kr\n", + " - http://www.naver.com\n", + " - http://www.daum.net\n", + " - http://www.nytimes.com " + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/assignment2019/assignment-4.ipynb b/python3.6/assignment2019/assignment-4.ipynb new file mode 100644 index 0000000..17dc381 --- /dev/null +++ b/python3.6/assignment2019/assignment-4.ipynb @@ -0,0 +1,249 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 4\n", + "### [정보]\n", + "#### 1) Due Date: 2018년 11월 25일 (일), 23시 59분\n", + "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", + "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "#### 5) 문제 (마지막 Incremental Project에 집중하기 위하여 이번 숙제에는 ACM-ICPC 문제는 포함하지 않음)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [1번 문제] \n", + "파일 s.txt 내의 다음 내용과 함께 아래 문제의 코드를 제시하시오. \n", + ">pig ham
\n", + ">cat dog
\n", + ">ham bird
\n", + ">dog pig
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "           - 1) 파일 s.txt을 읽어서 각 라인에 있는 첫 번째 단어(문자열) 자체들을 기준으로 라인별 정렬후 파일 s1.txt에 그 결과를 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s1.txt에 있는 파일 내용은 다음과 같다.\n", + ">cat dog
\n", + ">dog pig
\n", + ">ham bird
\n", + ">pig ham
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "           - 2) 파일 s.txt을 읽어서 각 라인에 있는 두 번째 단어(문자열) 자체들을 기준으로 라인별 정렬후 파일 s2.txt에 그 결과를 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s2.txt에 있는 파일 내용은 다음과 같다.\n", + ">ham bird
\n", + ">cat dog
\n", + ">pig ham
\n", + ">dog pig
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "           - 3) 파일 s.txt을 읽어서 각 라인들에 있는 모든 단어들을 순차적으로 다시 나열하되 각 라인에 세 개의 단어들이 오도록 하여 s3.txt에 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s3.txt에 있는 파일 내용은 다음과 같다.\n", + ">pig ham cat
\n", + ">dog ham bird
\n", + ">dog pig
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [2번 문제] \n", + "다음과 같은 조건들을 참고하여 회원 가입 및 로그인 프로그램을 작성하시오. \n", + " - 1) 프로그램 시작 후 다음과 같은 메시지가 출력되어 1, 2, 3 중 하나의 값을 입력 받도록 한다.\n", + ">Welcome to Our Service
\n", + ">1. Sign Up
\n", + ">2. Sign In
\n", + ">3. Quit
\n", + " - 2) 1을 선택하면 ID, Password, Name, School의 4가지 정보를 입력받아 파일에 저장하는 프로그램을 작성한다.\n", + " - 2-1) 입력된 내용은 access.txt 라는 이름의 텍스트 파일 내에 저장된다. \n", + " - 2-2) access.txt 파일의 각 라인에는 가입된 회원 각각의 정보가 \"[id]: [password], [name], [school]\" 형태로 저장된다.\n", + " - 2-3) 즉, 가입 회원이 10명이면 access.txt 파일 내에 라인 수도 정확히 10개이다.\n", + " - 2-4) 암호화 방식은 sha 모듈을 활용한다. sha 모듈 활용 방법은 본 문제의 마지막에 제시된 sha 활용 예를 참고한다.\n", + " - 즉, access.txt 파일 내에 password 정보는 암호화 되어 저장되어야 한다.\n", + " - 2-5) 회원 정보를 입력 받을 때 id를 입력 받은 직후 access.txt를 확인하여 이미 존재하는 id가 입력되었다면 다음 메시지를 출력하고 id 정보를 다시 입력받는다.\n", + " - Sorry, the entered ID is already used.\n", + " - 3) 2를 선택하면 ID, Password의 2가지 정보를 입력받는 프로그램을 작성한다.\n", + " - 3-1) 입력된 ID 정보가 access.txt에 존재하지 않으면 다음과 같은 메시지를 출력하고 다시 입력받는다.\n", + " - Sorry, you are not a registered member.\n", + " - 3-2) 입력된 ID가 올바르게 존재하지만 Password 정보가 access.txt 파일에 있는 정보와 불일치하면 다음과 같은 메시지를 출력하고 Password를 다시 입력받는다.\n", + " - Sorry, the entered password is not correct.\n", + " - 이 때에도 사용자가 입력한 Password 정보와 함께 sha 모듈이 활용되어야 한다.\n", + " - 3-3) 입력된 ID와 Password가 모두 올바르면 다음과 같은 메시지를 출력한다.\n", + " - Hello [name]!\n", + " - 위 [name]에는 access.txt에 기록되어 있는 name 정보를 출력한다.\n", + " - 4) 3을 선택하면 프로그램이 끝난다.\n", + " - [참고] sha 모듈 활용 예" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "import sha\n", + "password_plain = \"12345678\"\n", + "password_encrypted = sha.new(password_plain).hexdigest()\n", + "print password_encrypted\n", + "\n", + "# import hashlib\n", + "# hasher = hashlib.sha1()\n", + "# password_plain = 'ripemd160'\n", + "# password_encrypted = hashlib.new(password_plain)\n", + "# password_encrypted.hexdigest()\n", + "# print(password_encrypted)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [3번 문제]\n", + "range() 함수와 유사한 frange() 함수를 다음 조건을 참고하여 만드시오.\n", + " - 1) frange()의 인자 구성은 다음과 같이 range와 동일하지만 각 인수들은 음수를 받지 않는다고 가정한다.\n", + " > range(stop)
\n", + " > range(start, stop[, step])
\n", + " - 2) frange() 함수의 인자에 대한 기본 시작(start) 값은 0.0이고, 기본 단계(step) 값은 0.1이다. \n", + " - 3) frange 사용 예\n", + " - 3-1) frange(0.5)\n", + " - [0.0, 0.1, 0.2, 0.3, 0.4]\n", + " - 3-2) frange(1.0, 2.0)\n", + " - [1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9]\n", + " - 3-3) frange(2.2, 4.0, 0.5)\n", + " - [2.2, 2.7, 3.2, 3.7]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [4번 문제] \n", + "가변인수를 받는 함수 sum()을 다음과 같은 조건을 참고하여 구현하시오\n", + "- sum() 사용 예 \n", + " - sum()\n", + " - 0\n", + " - sum(1, 2)\n", + " - 3\n", + " - sum(1, 2, 3, 4, 5)\n", + " - 15\n", + " - sum(1, 5, 7, 2, -10)\n", + " - 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [5번 문제] \n", + "여러 단어로 이루어진 문자열을 입력받아 각 단어의 첫글자로 이루어진 단어를 대문자로 출력하는 myinitial() 함수를 다음 조건을 참고하여 작성하시오.\n", + "- 1) 다음에 제시되는 함수들을 모두 이용해야 한다. \n", + " - split\n", + " - map\n", + " - join\n", + "- 2) myinitial() 함수 사용 예\n", + " - myinitial(\"as soon as possible\")\n", + " - ASAP" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [6번 문제]\n", + "음이 아닌 정수 n를 입력받으면 n! (factorial)을 계산하는 myfact() 함수를 재귀적 함수로 구현하시오.\n", + "- [옵션] 참을 수 있는 정도 만큼의 수행시간을 직접 기다려보면서 n을 늘려보도록 합시다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [7번 문제] \n", + "(서술형) import string 과 from string import * 의 차이점을 설명하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [8번 문제] \n", + "이전 Assignment 3의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3를 확장하여 다음과 같은 조건을 만족하도록 구현하시오.\n", + " - 1) 다음 사이트에서 제시되는 불용어 (Stop words)를 참고하여 이전 숙제에서 구성했던 단어 사전에서 불용어들을 모두 제거하는 코드를 추가하시오.\n", + " - 영어 불용어: http://www.lextek.com/manuals/onix/stopwords1.html\n", + " - 한글 불용어: https://raw.githubusercontent.com/stopwords-iso/stopwords-ko/master/stopwords-ko.txt\n", + " - 2) 각 URL로 지정된 웹페이지의 HTML 소스를 파일로 저장하시오. \n", + " - URL이 http://URL 이라면 파일명은 URL.html 이다. \n", + " - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.html 이다. \n", + " - 3) 단어의 출현빈도가 담긴 사전 객체를 위 HTML 소스 파일과 동일한 폴더에 파일로 저장하시오.\n", + " - 파일입출력 (E-learning 13주차) 마지막에 학습한 pickle 모듈을 활용하시오. \n", + " - URL이 http://URL 이라면 사전 객체를 담고 있는 파일명은 URL.words_frequency.pickle 이다.\n", + " - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.words_frequency.pickle 이다.\n", + " - 4) 최소 5개 이상의 웹 사이트 각각에 대한 HTML 소스 파일과 단어 출현빈도 파일을 저장하시오. \n", + " - 즉, 5개의 웹 사이트에 대해 총 10개의 파일을 동일한 폴더에 생성하시오.\n", + " - [주의] 가능하면 웹사이트에 단어들이 많고 다루는 주제가 서로 다른 웹 사이트들로 선정하는 것 추천\n", + " - 5) 위 문제에서 저장한 모든 pickle 파일들을 객체로 다시 로드하여 본인이 저장하여 분석한 사이트들 각각에 대해서 가장 많이 출현한 단어 3개씩를 뽑아 제시하시오. \n", + " - 반드시 pickle 모듈로 저장한 5개 이상의 pickle 파일들을 다시 5개 이상의 사전 객체로 로드 하는 코드가 추가되어야 함\n", + " - 6) 간단한 검색엔진 코딩 (Like Google!!!)\n", + " - 사용자에게 임의의 검색어 (하나 또는 여러 단어로 구성) 를 입력받으시오.\n", + " - 예: \n", + " - 대한민국\n", + " - 컴퓨터 공학\n", + " - 맛있는 음식\n", + " - 파이썬을 쉽게 공부하는 법\n", + " - 한기대 장점을 알려주세요\n", + " - 입력받은 검색어들에 대해서도 1)에서 제시하는 방법처럼 불용어 처리를 하여 정리\n", + " - 입력 받은 검색어와 유사도(Similarity)가 높은 웹 사이트 기준으로 위 4)에서 미리 지정해 놓은 5개 이상의 웹 사이트 URL들을 일렬로 나열하여 출력하시오.\n", + " - 검색어와 웹 사이트 간의 유사도는 본인이 스스로 정하시오.\n", + " - 유사도를 정하는 최소한의 기준은 단어 출현 빈도를 기반으로 해야 하며, 이외의 본인이 생각하는 방안이 있으면 함께 사용해도 됨.\n", + " - 유사도가 높은 웹 사이트가 상위에 출력되어야 함 (즉, 유사도 기준 내림 차순)\n", + " - 유사도가 동일한 웹 사이트들에 대해서는 임의 배치함.\n", + " - 7) [주의] 필수사항\n", + " - 위에서 만든 검색엔진 코딩은 매우 간단한 것이라 부족한 점이 많이 존재한다.\n", + " - 본인이 생각하기에 상업적인 완성도 높은 검색 로봇/엔진이 되려면 어떤 기능들이 추가적으로 구현되어야 할지 최소 1가지 이상 제시하시오. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python3.6/assignment2019/assignment-5.ipynb b/python3.6/assignment2019/assignment-5.ipynb new file mode 100644 index 0000000..c1a8e71 --- /dev/null +++ b/python3.6/assignment2019/assignment-5.ipynb @@ -0,0 +1,308 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 5\n", + "### [정보]\n", + "#### 1) Due Date: 2018년 12월 12일 (수), 23시 59분\n", + "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.jupyter.org에 넣어서 산출된 URL을 EL사이트에 제출\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", + "#### 4) 숙제이후 소감: 모든 문제의 답을 적은 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "#### 5) 문제 (총 9개)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [1번 문제] \n", + "클래스와 모듈의 공통점과 차이점에 대해 설명하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [2번 문제] \n", + "다형성에 대해 설명하고 다형성을 보여주는 자신만의 파이썬 코드 예제를 제시하시오." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [3번 문제] \n", + "\n", + "다음 각 요구사항 모두를 만족시키는 Counter 클래스를 코딩하시오 (정답을 각 요구사항별로 입력할 필요 없이 3번 문제에 대해 1개의 클래스 정의 코드를 제시하면 된다.)\n", + " - 요구사항 1. 생성자에 count 값과 step 값을 인자로 받을 수 있다.\n", + " - count: Counter 인스턴스가 지니는 초기 정수 값\n", + " - step: Counter 인스턴스의 count가 증가되는 증분 (defalt 값: 1)\n", + "\n", + " > \\>\\>\\> c = Counter(10)
\n", + " > \\>\\>\\> d = Counter(10, 2)
\n", + " \n", + " - 요구사항 2. 다음과 같이 Counter의 인스턴스를 출력을 해주는 \\_\\_str\\_\\_() 메소드를 Counter 클래스 내에 구현하시오.\n", + " > \\>\\>\\> print(c)
\n", + " > [Count (step: 1)] 10
\n", + " > \\>\\>\\> print(d)
\n", + " > [Count (step: 2)] 10
\n", + " \n", + " - 요구사항 3. 다음과 같이 step에 주어진 증분만큼 count를 증가시키는 incr() 메소드를 Counter 클래스 내에 구현하시오.\n", + " > \\>\\>\\> c.incr()
\n", + " > \\>\\>\\> d.incr()
\n", + " > \\>\\>\\> print(c)
\n", + " > [Count (step: 1)] 11
\n", + " > \\>\\>\\> print(d)
\n", + " > [Count (step: 2)] 12
\n", + " \n", + " - 요구사항 4. Counter 클래스 내에 관련 메소드를 추가하여 인스턴스 객체를 직접 호출(call)할 수 있도록 하시오. 인스턴스 객체를 직접 호출했을 때에 내부적으로 incr() 메소드를 호출하는 방법으로 구현하시오. \n", + " > \\>\\>\\> c()
\n", + " > \\>\\>\\> d()
\n", + " > \\>\\>\\> print(c)
\n", + " > [Count (step: 1)] 12
\n", + " > \\>\\>\\> print(d)
\n", + " > [Count (step: 2)] 14
\n", + " \n", + " - 요구사항 5. 다음과 같은 두 개의 산술 연산 (+, -)이 수행될 수 있도록 Counter 클래스 내에 관련 메소드를 추가하시오.\n", + " > \\>\\>\\> c = c + 5
\n", + " > \\>\\>\\> d = d - 5
\n", + " > \\>\\>\\> print(c)
\n", + " > [Count (step: 1)] 17
\n", + " > \\>\\>\\> print(d)
\n", + " > [Count (step: 2)] 9
\n", + " \n", + " - 요구사항 6. 다음과 같은 관계연산 (>, <, ==)이 수행될 수 있도록 Counter 클래스 내에 관련 메소드를 추가하시오.\n", + " > \\>\\>\\> print(c) > 10
\n", + " > True
\n", + " > \\>\\>\\> print(d) > 10
\n", + " > False
\n", + " > \\>\\>\\> print(c) < 10
\n", + " > False
\n", + " > \\>\\>\\> print(d) < 10
\n", + " > True
\n", + " > \\>\\>\\> print(c) == 17
\n", + " > True
\n", + " > \\>\\>\\> print(d) != 9
\n", + " > False
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [4번 문제] \n", + "\n", + "다음은 내장 자료형 list를 서브클래싱하여 만든 MySet 클래스 정의 내용이다. 다음 클래스 정의에서 \\_\\_init\\_\\_(), \\_\\_str()\\_\\_(), elimicate_duplicate()의 세 개의 메소드 코드 내용을 자신이 다른 사람에게 가르친다고 생각하며 설명해보시오.\n", + " - MySet은 집합(Set) 자료형을 정의하려는 의도하에 만들어진 클래스이다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MySet: {1 ,2 ,3}\n", + "MySet: {2 ,3 ,4 ,5 ,6 ,7 ,8 ,9}\n" + ] + } + ], + "source": [ + "class MySet(list):\n", + " def __init__(self, l):\n", + " for e in l:\n", + " self.append(e)\n", + " MySet.eliminate_duplicate(self)\n", + " \n", + " def __str__(self):\n", + " result = \"MySet: {\"\n", + " for e in self:\n", + " result = result + str(e) + \" ,\"\n", + " result = result[0:len(result)-2] + \"}\"\n", + " return result\n", + "\n", + " @staticmethod \n", + " def eliminate_duplicate(l):\n", + " s = []\n", + " for e in l:\n", + " if e not in s:\n", + " s.append(e)\n", + " l[:] = []\n", + " for e in s:\n", + " l.append(e)\n", + "\n", + " \n", + "if __name__ == \"__main__\":\n", + " s = MySet([1, 2, 2, 3])\n", + " print(s)\n", + " t = MySet([2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9])\n", + " print(t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [5번 문제] \n", + "\n", + "4번 문제에 정의된 MySet 클래스에 메소드를 추가하여 다음 각 요구사항 모두를 만족시키는 코딩을 제시하시오 \n", + " - 정답을 각 요구사항별로 입력할 필요 없이 요구사항 3개 전체에 대해 1개의 MySet 클래스 정의 코드를 제시하고 주석등으로 해당 코드를 설명한다.\n", + " - 요구사항 1. | 연산으로 두 집합의 합집합을 반환한다.\n", + " > \\>\\>\\> u = s | t
\n", + " > \\>\\>\\> print(u)
\n", + " > MySet: {1, 2, 3, 4, 5, 6, 7, 8, 9}
\n", + " \n", + " - 요구사항 2. & 연산으로 두 집합의 교집합을 반환한다.\n", + " > \\>\\>\\> u = s & t
\n", + " > \\>\\>\\> print(u)
\n", + " > MySet: {2, 3}
\n", + "\n", + " - 요구사항 3. - 연산으로 두 집합의 차집합을 반환한다.\n", + " > \\>\\>\\> s = MySet([1, 2, 3])
\n", + " > \\>\\>\\> t = MySet([3, 4, 5])
\n", + " > \\>\\>\\> u = s - t
\n", + " > \\>\\>\\> print(u)
\n", + " > MySet: {1, 2}
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [6번 문제] \n", + "\n", + "5번 문제에서 정의한 MySet 클래스에 대해 다음 예제를 수행하면 오류없이 올바르게 동작하는 것을 확인할 수 있다. 다음 예제 내에 있는 len(), bool() 내장함수와 in 키워드 사용 예제가 별다른 메소드 정의를 하지 않았는 데도 올바르게 수행되는 이유를 설명하시오.\n", + " \n", + " >>> s = MySet([1, 2, 3, 4, 5, 6])\n", + " >>> print(len(s))\n", + " > 6\n", + " >>> print(bool(s))\n", + " > True\n", + " >>> print(2 in s)\n", + " > True\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [7번 문제] \n", + "\n", + "이전 Assignment 3 & Assignment 4를 다시 확장/변형하여 다음과 같은 조건을 만족하도록 구현하시오 (CODE REFACTORING!!!).\n", + " - 1) 새로운 클래스 SearchEngine를 정의하시오.\n", + " - 이전 숙제에서 고려했던 pickle 모듈 등은 전혀 고려하지 마시오.\n", + " - 즉, 하드디스크에 저장하고 다시 로드하는 기능은 본 숙제에는 배제하시오.\n", + " - 이전 숙제에서 적용했던 국어/영어 불용어 처리는 적용하시오.\n", + "
\n", + " - 2) 생성자에 URL을 0개에서 임의의 개수를 넣을 수 있도록 생성자 인수를 가변인수로 정의하여 각각의 URL을 리스트 자료형에 유지하시오.\n", + " > \\>\\>\\> w1 = SearchEngine('http://www.cnn.com', 'http://www.times.com', 'https://www.amazon.com')
\n", + " > \\>\\>\\> w2 = SearchEngine('http://www.cnn.com', 'http://www.times.com')
\n", + " > \\>\\>\\> w3 = SearchEngine()
\n", + " - 3) addUrl() 메소드를 구현하여 인스턴스를 생성한 이후에도 URL을 추가할 수 있도록 한다.\n", + " - 반드시 1개의 URL을 추가하도록 구현 (즉, 동시에 여러 개의 URL을 추가하는 것은 배제)\n", + " \n", + " > \\>\\>\\> w1.addUrl('https://github.com')
\n", + " > \\>\\>\\> w3.addUrl('http://stackoverflow.com')
\n", + " - 4) removeUrl() 메소드를 구현하여 URL을 삭제할 수 있도록 한다.\n", + " - 반드시 1개의 URL을 삭제하도록 구현 (즉, 동시에 여러 개의 URL을 삭제하는 것은 배제) \n", + " \n", + " > \\>\\>\\> w1.removeUrl('http://www.cnn.com')
\n", + " > \\>\\>\\> w2.removeUrl('http://stackoverflow.com')
\n", + " - 5) listUrls() 메소드를 구현하여 현재 등록된 모든 URL을 출력하는 기능을 추가\n", + " > \\>\\>\\> w1.listUrls()
\n", + " > http://www.times.com
\n", + " > https://www.amazon.com
\n", + " > https://github.com
\n", + " - 6) getWordsFrequency() 메소드를 구현하여 각 URL의 웹페이지들을 종합적으로 분석한 단어 출현 빈도 사전을 반환하시오.\n", + " - 만약 등록된 URL이 없다면 공백 사전을 반환 \n", + " \n", + " > \\>\\>\\> w1.getWordsFrequency()
\n", + " > {'hello': 8, 'site': 12, 'world': 2, 'science': 11, 'program': 1, 'python': 1}\n", + " - 7) getMaxFreqencyWords() 메소드를 구현하여 각 URL의 웹페이지들을 종합적으로 분석한 단어 출현 빈도 사전에서 가장 많이 출현한 단어 리스트를 반환하시오.\n", + " \n", + " > \\>\\>\\> w1.getMaxFreqencyWords()
\n", + " > site
\n", + " \n", + " - 최다 출현 단어의 빈도수가 동일한 경우 모두 출력해주어야 함 \n", + " \n", + " > \\>\\>\\> w2.getMaxFreqencyWords()
\n", + " > site
\n", + " > science\n", + " \n", + " - 만약 등록된 URL이 없다면 getMaxFreqencyWords()의 반환 값은 None이 되어야 함.\n", + " - 8) 임의의 단어 1개를 파라미터로 받는 searchUrlByWord() 메소드를 구현하여 유사도가 높은 웹 사이트를 출력하시오.\n", + " > \\>\\>\\> w1.searchUrlByWord(\"news\")
\n", + " > http://www.cnn.com
\n", + " \n", + " - 파라미터로 받은 단어와 유사도가 동일한 URL이 여러 개이면 해당 URL을 모두 출력하시오. \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [8번 문제] \n", + "\n", + "위 7번 문제에서 정의한 SearchEngine 클래스를 상속하여 SearchEngineWithOrderedWebWords 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 ***오버라이드***하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.\n", + " - 리스트 내의 각 원소는 단어와 빈도를 쌍으로 지니는 튜플이다.\n", + " - getWordFrequence() 메소드에 reverse 라는 인자를 만들고 true 또는 false를 인자로 받을 수 있도록 한다.\n", + " - reverse 인자의 디폴트 값은 false 이며, 기본적으로 내림차순으로 정렬한다.\n", + " - reverse 인자에 true를 넣으면 오름차순으로 정렬한다.\n", + " \n", + " > \\>\\>\\> w4 = SearchEngineWithOrderedWebWords('http://www.times.com', 'https://www.amazon.com', 'https://github.com')\n", + " \n", + " > \\>\\>\\> w4.getWordsFrequency()
\n", + " > [('site', 12), ('science', 11), ('hello', 8), ('world', 2), ('program', 1), ('python', 1)]\n", + " \n", + " > \\>\\>\\> w4.getWordsFrequency(reverse=true)
\n", + " > [('program', 1), ('python', 1), ('world', 2), ('hello', 8), ('science', 11), ('site', 12)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### [9번 문제]\n", + "\n", + "다음과 같은 코딩이 가능하도록 SearchEngineWithOrderedWebWords안에 반복자와 관련된 메소드를 추가하시오.\n", + "\n", + "> \\>\\>\\> for i in w4:
\n", + "> \\>\\>\\>       print(i)
\n", + "> ('site, 12)
\n", + "> ('science', 11)
\n", + "> ('hello', 8)
\n", + "> ('world', 2)
\n", + "> ('program', 1)
\n", + "> ('python', 1)
" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 14e936aef9a576638d6954a6f4507d2f186b27a3 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sun, 15 Sep 2019 21:49:34 +0900 Subject: [PATCH 103/124] ... --- python3.6/assignment2019/assignment-1.ipynb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python3.6/assignment2019/assignment-1.ipynb b/python3.6/assignment2019/assignment-1.ipynb index 51b3b1b..07873f7 100644 --- a/python3.6/assignment2019/assignment-1.ipynb +++ b/python3.6/assignment2019/assignment-1.ipynb @@ -9,7 +9,8 @@ "#### 1) Due Date: 2019년 9월 27일 (금), 23시 59분\n", "#### 2) 제출방법: colab으로 작성된 notebook URL을 EL사이트에 제출 (EL 사이트의 본인 게시물에서 클릭이 되도록 함)\n", "#### 3) 내용: 반드시 python code와 수행 결과를 colab notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell 등에 넣어 기입하시오.\n", - "#### 4) 숙제이후 소감: 11개의 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. " + "#### 4) 숙제이후 소감 작성: 10개의 문제의 답을 모두 작성한 이후에 현재까지 강의를 들은 후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "#### 5) 반드시 본인 스스로 문제를 해결하세요~~~\n" ] }, { From 70c9b336d278009a49e177351132adeded79b79b Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sun, 15 Sep 2019 23:33:51 +0900 Subject: [PATCH 104/124] ... --- .ipynb_checkpoints/python04-checkpoint.ipynb | 1316 ++++++++++-------- python04.ipynb | 340 +++-- python3.6/python04.ipynb | 77 +- python3.6/supplement-2016-09.ipynb | 2 +- 4 files changed, 996 insertions(+), 739 deletions(-) diff --git a/.ipynb_checkpoints/python04-checkpoint.ipynb b/.ipynb_checkpoints/python04-checkpoint.ipynb index 0431058..dceca06 100644 --- a/.ipynb_checkpoints/python04-checkpoint.ipynb +++ b/.ipynb_checkpoints/python04-checkpoint.ipynb @@ -1,644 +1,724 @@ { - "metadata": { - "name": "", - "signature": "sha256:d741b33c2e388a74e523537b59691d549be7e1f2e8d247cdb03a101bac3eea2b" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "***\n", - "# 4. \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804 \ubc0f \ub0b4\uc7a5 \uc790\ub8cc\ud615 \ud2b9\uc131\n", - "***\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 1 \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc0ac\uc804\n", - "***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-1 \ub9ac\uc2a4\ud2b8\uc758 \uc815\uc758\uc640 \ub9ac\uc2a4\ud2b8 \uae30\ubcf8 \uc5f0\uc0b0\n", - "- \ub9ac\uc2a4\ud2b8: \uc784\uc758\uc758 \uac1d\uccb4\ub97c \uc21c\ucc28\uc801\uc73c\ub85c \uc800\uc7a5\ud558\ub294 \uc9d1\ud569\uc801 \uc790\ub8cc\ud615\n", - "- \ubb38\uc790\uc5f4\uc774 \uc9c0\ub2cc \ub300\ubd80\ubd84\uc758 \uc5f0\uc0b0\ub4e4\uc740 \ub9ac\uc2a4\ud2b8\ub3c4 \uc9c0\uc6d0" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1,2,3]\n", - "print type(L)\n", - "print\n", - "print len(L)\n", - "print\n", - "print L[1]\n", - "print L[-1]\n", - "print L[1:3]\n", - "print\n", - "print L + L\n", - "print L * 3" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "3\n", - "\n", - "2\n", - "3\n", - "[2, 3]\n", - "\n", - "[1, 2, 3, 1, 2, 3]\n", - "[1, 2, 3, 1, 2, 3, 1, 2, 3]\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub9ac\uc2a4\ud2b8\ub294 \ubcc0\uacbd \uac00\ub2a5" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l1 = [4,5,6]\n", - "l1[0] = 10\n", - "print l1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[10, 5, 6]\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/changeListElement.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ub3d9\uc77c\ud55c \ubcc0\uc218\uc5d0 \ub2e4\ub978 \ub9ac\uc2a4\ud2b8\ub97c \ud560\ub2f9\ud558\ub294 \uac83\uc740 \ud574\ub2f9 \ubcc0\uc218\uc758 \ub808\ud37c\ub7f0\uc2a4\ub97c \ubcc0\uacbd\ud568" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "l1 = [1,2,3]\n", - "l1 = [4,5,6]\n", - "print l1" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[4, 5, 6]\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](images/referenceChangeList.png)" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "***\n", + "# 4. 리스트, 튜플, 사전 및 내장 자료형 특성\n", + "***\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 1 리스트, 튜플, 사전\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-1 리스트(list)의 정의와 리스트 기본 연산\n", + "- 리스트: 임의의 객체를 순차적으로 저장하는 집합적 자료형\n", + "- 문자열이 지닌 대부분의 연산들은 리스트도 지원" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "3\n", + "\n", + "2\n", + "3\n", + "[2, 3]\n", + "\n", + "[1, 2, 3, 1, 2, 3]\n", + "[1, 2, 3, 1, 2, 3, 1, 2, 3]\n", + "\n", + "[1, 2, 3]\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-2 range() \ud568\uc218\ub97c \ud1b5\ud55c \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8 \uc0dd\uc131\n", - "- range(k): 0\ubd80\ud130 k-1\uae4c\uc9c0\uc758 \uc22b\uc790\uc758 \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud568 " + } + ], + "source": [ + "L = [1,2,3]\n", + "print(type(L))\n", + "print()\n", + "print(len(L))\n", + "print()\n", + "print(L[1])\n", + "print(L[-1])\n", + "print(L[1:3])\n", + "print()\n", + "print(L + L)\n", + "print(L * 3)\n", + "print()\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 리스트의 원소는 변경 가능" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[10, 5, 6]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = range(10)\n", - "print L\n", - "print L[::2]\n", - "print L[::-1]\n", - "print 4 in L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", - "[0, 2, 4, 6, 8]\n", - "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n", - "True\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-3 \ud29c\ud50c\uc758 \uc815\uc758\uc640 \uae30\ubcf8 \uc5f0\uc0b0\n", - "- \ud29c\ud50c: \ub9ac\uc2a4\ud2b8\uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc \ud29c\ud50c \ub0b4\uc758 \uac12\uc744 \ubcc0\uacbd\ud560 \uc218 \uc5c6\uc74c\n", - " - \uc801\ud569\ud55c \uc0ac\uc6a9 \uc608\n", - " - months = ('January','February','March','April','May','June','July','August','September','October','November',' December')\n", - " - \uac01 \uac12\uc5d0 \ub300\ud574 \uc778\ub371\uc2a4\uac00 \ubd80\uc5ec\ub428\n", - "- \ubb38\uc790\uc5f4\uc774 \uc9c0\ub2cc \ub300\ubd80\ubd84\uc758 \uc5f0\uc0b0\ub4e4\uc740 \ud29c\ud50c\ub3c4 \uc9c0\uc6d0" + } + ], + "source": [ + "l1 = [4,5,6]\n", + "l1[0] = 10\n", + "print(l1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/changeListElement.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 동일한 변수에 다른 리스트를 할당하는 것은 해당 변수의 레퍼런스를 변경함" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4, 5, 6]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = (1,2,3)\n", + } + ], + "source": [ + "l1 = [1,2,3]\n", + "l1 = [4,5,6]\n", + "print(l1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/referenceChangeList.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-2 range() 함수를 통한 인덱스 리스트 생성\n", + "- range(k): 0부터 k-1까지의 range object를 반환함 (python3)\n", + " - python2 에서는 list 객체를 반환" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "range(0, 10)\n", + "range(0, 10, 2)\n", + "range(9, -1, -1)\n", + "True\n", "\n", - "print len(t)\n", - "print\n", - "print t[0]\n", - "print t[-1]\n", - "print t[0:2]\n", - "print t[::2]\n", - "print\n", - "print t + t + t\n", - "print t * 3\n", - "print\n", - "print 3 in t" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "3\n", - "\n", - "1\n", - "3\n", - "(1, 2)\n", - "(1, 3)\n", - "\n", - "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", - "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", - "\n", - "True\n" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-4 \ud29c\ud50c\uc758 \uc0c1\uc218\uc801 \uc131\uaca9\n", - "- \ud29c\ud50c\uc740 \ub0b4\uc6a9 \ubcc0\uacbd \ubd88\uac00" + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "[0, 2, 4, 6, 8]\n", + "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = (1,2,3)\n", + } + ], + "source": [ + "L = range(10)\n", + "print(L)\n", + "print(L[::2])\n", + "print(L[::-1])\n", + "print(4 in L)\n", + "print()\n", + "print(list(L))\n", + "print(list(L)[::2])\n", + "print(list(L)[::-1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-3 튜플(tuple)의 정의와 기본 연산\n", + "- 튜플: 리스트와 유사하지만 튜플 내의 값을 변경할 수 없음(immutable하다.)\n", + " - 적합한 사용 예\n", + " - months = ('January','February','March','April','May','June','July','August','September','October','November',' December')\n", + " - 각 값에 대해 인덱스가 부여됨\n", + "- 문자열이 지닌 대부분의 연산들은 튜플도 지원" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", "\n", - "t[0] = 100" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'tuple' object does not support item assignment", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" - ] - } - ], - "prompt_number": 105 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \ubc18\uba74\uc5d0 \ub9ac\uc2a4\ud2b8\ub294 \ub0b4\uc6a9 \ubcc0\uacbd \uac00\ub2a5" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "L = [1,2,3]\n", - "L[0] = 100\n", + "1\n", + "3\n", + "(1, 2)\n", + "(1, 3)\n", "\n", - "print L" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[100, 2, 3]\n" - ] - } - ], - "prompt_number": 107 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1-5 \uc0ac\uc804\uc758 \uc815\uc758\uc640 \uae30\ubcf8 \uc0ac\uc6a9\ubc95\n", - "- \uc815\uc218\ud615 \uc778\ub371\uc2a4\uac00 \uc544\ub2cc \ud0a4\ub97c \uc774\uc6a9\ud558\uc5ec \uac12\uc744 \uc800\uc7a5\ud558\ub294 \uc790\ub8cc \uad6c\uc870\n", - " - \uc800\uc7a5\ub41c \uac01 \uc790\ub8cc\uc5d0 \ub300\ud55c \uc21c\uc11c\ub294 \uc758\ubbf8 \uc5c6\uc74c\n", - "- \ub9e4\ud551(Mapping) \ud568\uc218\uc640 \ube44\uc2b7\ud55c \uc5ed\ud560\uc744 \ud568\n", - " - x\ub77c\ub294 \ud0a4\uac12\uc744 \ub123\uc73c\uba74 \uac12 y\ub97c \ubc18\ud658\ud568" + "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", + "(1, 2, 3, 1, 2, 3, 1, 2, 3)\n", + "\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", - "print d['one']\n" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "hana\n" - ] - } - ], - "prompt_number": 109 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", - "d['four'] = 'net' # \uc0c8 \ud56d\ubaa9\uc758 \uc0bd\uc785\n", - "print d\n", - "d['one'] = 1 # \uae30\uc874 \ud56d\ubaa9\uc758 \uac12 \ubcc0\uacbd\n", - "print d\n", - "print 'one' in d # \ud0a4\uc5d0 \ub300\ud55c \uba64\ubc84\uc27d \ud14c\uc2a4\ud2b8" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 'hana'}\n", - "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 1}\n", - "True\n" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "d = {'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", - "print d.keys() # \ud0a4\ub9cc \ub9ac\uc2a4\ud2b8\ub85c \ucd94\ucd9c\ud568\n", - "print d.values() # \uac12\ub9cc \ub9ac\uc2a4\ud2b8\ub85c \ucd94\ucd9c\ud568\n", - "print d.items() # \ud0a4\uc640 \uac12\uc758 \ud29c\ud50c\uc744 \ub9ac\uc2a4\ud2b8\ub85c \ubc18\ud658\ud568" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "['four', 'three', 'two', 'one']\n", - "['net', 'set', 'dul', 1]\n", - "[('four', 'net'), ('three', 'set'), ('two', 'dul'), ('one', 1)]\n" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "***\n", - "## 2 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc758 \uc815\ub9ac\uc640 \uac1d\uccb4 \uc2e0\uc6d0 \ud30c\uc545\n", - "***" + } + ], + "source": [ + "t = (1,2,3)\n", + "\n", + "print(len(t))\n", + "print()\n", + "print(t[0])\n", + "print(t[-1])\n", + "print(t[0:2])\n", + "print(t[::2])\n", + "print()\n", + "print(t + t + t)\n", + "print(t * 3)\n", + "print()\n", + "print(3 in t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-4 튜플의 상수적 성격\n", + "- 튜플은 내용 변경 불가(immutable)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'tuple' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-1 \ub0b4\uc7a5 \uc790\ub8cc\ud615\uc758 \ud2b9\uc131 \uc815\ub9ac" + } + ], + "source": [ + "t = (1,2,3)\n", + "\n", + "t[0] = 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 반면에 리스트는 내용 변경 가능(mutable)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[100, 2, 3]\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "| \uc790\ub8cc\ud615 | \uc800\uc7a5/\uc811\uadfc \ubc29\ubc95 | \ubcc0\uacbd \uac00\ub2a5\uc131 | \uc800\uc7a5 \ubaa8\ub378 |\n", - "|:------:|:-----------------:|:-----------:|:--------------------:|\n", - "| \uc218\uce58\ud615 | \uc9c1\uc811(Direct) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ub9ac\ud130\ub7f4 (Literal) |\n", - "| \ubb38\uc790\uc5f4 | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ub9ac\ud130\ub7f4 (Literal) |\n", - "| \ub9ac\uc2a4\ud2b8 | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\uac00\ub2a5(Mutable) | \ucee8\ud14c\uc774\ub108 (Container) |\n", - "| \ud29c\ud50c | \uc2dc\ud000\uc2a4 (Sequence) | \ubcc0\uacbd\ubd88\uac00\ub2a5(Immutable) | \ucee8\ud14c\uc774\ub108 (Container) |\n", - "| \uc0ac\uc804 | \ub9e4\ud551 (Mapping) | \ubcc0\uacbd\uac00\ub2a5(Mutable) | \ucee8\ud14c\uc774\ub108 (Container) |" + } + ], + "source": [ + "L = [1,2,3]\n", + "L[0] = 100\n", + "\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-5 사전(dictionary; dict)의 정의와 기본 사용법\n", + "- 정수형 인덱스가 아닌 키(key)를 이용하여 값(value)을 저장하는 자료 구조\n", + " - 저장된 각 자료에 대한 순서는 의미 없음\n", + "- 매핑(Mapping) 함수와 비슷한 역할을 함\n", + " - x라는 키값을 넣으면 값 y를 반환함" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hana\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-2 \ub0b4\uc7a5 \uc790\ub8cc\ud615 \uc54c\uc544\ubcf4\uae30" + } + ], + "source": [ + "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", + "print(d['one'])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'one': 'hana', 'two': 'dul', 'three': 'set', 'four': 'net'}\n", + "{'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print type(3) #\uc815\uc218\n", - "print type(3.3) #\uc2e4\uc218\n", - "print type('abc') #\ubb38\uc790\uc5f4" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "\n" - ] - } - ], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print type([]) #\ub9ac\uc2a4\ud2b8\n", - "print type(()) #\ud29c\ud50c\n", - "print type({}) #\uc0ac\uc804(dict)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- \uc790\ub8cc\ud615\uc758 \ube44\uad50" + } + ], + "source": [ + "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", + "d['four'] = 'net' # 새 항목의 삽입\n", + "print(d)\n", + "d['one'] = 1 # 기존 항목의 값 변경\n", + "print(d)\n", + "print('one' in d) # 키에 대한 멤버쉽 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_keys(['one', 'two', 'three', 'four'])\n", + "dict_values([1, 'dul', 'set', 'net'])\n", + "dict_items([('one', 1), ('two', 'dul'), ('three', 'set'), ('four', 'net')])\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 0\n", - "L = [1,2,3]\n", - "print type(a) == type(0)\n", - "print type(L) == type([])\n", - "print type(L[0]) == type(0)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "True\n", - "True\n", - "True\n" - ] - } - ], - "prompt_number": 41 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print type(None) #None \uac1d\uccb4, \uc544\ubb34 \uac12\ub3c4 \uc5c6\ub2e4(\ud639\uc740 \uc544\ub2c8\ub2e4)\ub97c \ub098\ud0c0\ub0b4\ub294 \uac1d\uccb4\n", - "print\n", - "a = None\n", - "print a\n", - "print type(a)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "\n", - "None\n", - "\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2-3 \uac1d\uccb4\uc758 \uc2e0\uc6d0 \uc2dd\ubcc4\ud558\uae30" + } + ], + "source": [ + "d = {'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", + "print(d.keys()) # 키만 dict_keys 객체로 추출(Python3.6), 키만 리스트로 추출(Python2.7)\n", + "print(d.values()) # 값만 dict_values 객체로 추출(Python3.6), 값만 리스트로 추출(Python2.7)\n", + "print(d.items()) # 키와 값의 튜플을 dict_items 객체로 추출(Python 3.6), 키와 값의 튜플을 리스트로 반환함(Python2.7)\n", + "\n", + "# ['four', 'three', 'two', 'one']\n", + "# ['net', 'set', 'dul', 1]\n", + "# [('four', 'net'), ('three', 'set'), ('two', 'dul'), ('one', 1)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 2 내장 자료형의 정리와 객체 신원 파악\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-1 내장 자료형의 특성 정리" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| 자료형 | 저장/접근 방법 | 변경 가능성 | 저장 모델 |\n", + "|:------:|:-----------------:|:-----------:|:--------------------:|\n", + "| 수치형 | 직접(Direct) | 변경불가능(Immutable) | 리터럴 (Literal) |\n", + "| 문자열 | 시퀀스 (Sequence) | 변경불가능(Immutable) | 리터럴 (Literal) |\n", + "| 리스트 | 시퀀스 (Sequence) | 변경가능(Mutable) | 컨테이너 (Container) |\n", + "| 튜플 | 시퀀스 (Sequence) | 변경불가능(Immutable) | 컨테이너 (Container) |\n", + "| 사전 | 매핑 (Mapping) | 변경가능(Mutable) | 컨테이너 (Container) |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-2 내장 자료형 알아보기" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- id(): \uac1d\uccb4\uc758 \uc2dd\ubcc4\uc790\ub97c \ubc18\ud658\ud55c\ub2e4." + } + ], + "source": [ + "print(type(3)) #정수\n", + "print(type(3.3)) #실수\n", + "print(type('abc')) #문자열\n", + "\n", + "# \n", + "# \n", + "# " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = 500\n", - "b = a\n", - "print id(a)\n", - "print id(b)\n", - "print\n", - "x = 1\n", - "y = 1\n", - "print id(x)\n", - "print id(y)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "4478569376\n", - "4478569376\n", - "\n", - "4298182776\n", - "4298182776\n" - ] - } - ], - "prompt_number": 58 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- is \ud0a4\uc6cc\ub4dc: \ub450 \uac1d\uccb4\uc758 \uc2dd\ubcc4\uc790\uac00 \ub3d9\uc77c\ud55c\uc9c0 \ud14c\uc2a4\ud2b8\ud55c\ub2e4." + } + ], + "source": [ + "print(type([])) #리스트\n", + "print(type(())) #튜플\n", + "print(type({})) #사전(dict)\n", + "\n", + "# \n", + "# \n", + "# " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 자료형의 비교" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c = [1,2,3]\n", - "d = [1,2,3]\n", - "print c is d\n", + } + ], + "source": [ + "a = 0\n", + "L = [1,2,3]\n", + "print(type(a) == type(0))\n", + "print(type(L) == type([]))\n", + "print(type(L[0]) == type(0))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", "\n", - "a = 500\n", - "b = a\n", - "print a is b\n", + "None\n", + "\n" + ] + } + ], + "source": [ + "print(type(None)) # NoneType 객체, 아무 값도 없음을 나타내는 객체\n", + "print()\n", + "a = None\n", + "print(a)\n", + "print(type(a))\n", + "\n", + "# \n", + "\n", + "# None\n", + "# " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-3 객체의 신원 식별하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- id(): 객체의 식별자를 반환한다." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4469734928\n", + "4469734928\n", "\n", - "x = 1\n", - "y = 1\n", - "print x is y\n", + "4430976352\n", + "4430976352\n", "\n", - "e = f = [4,5,6]\n", - "print e is f" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "False\n", - "True\n", - "True\n", - "True\n" - ] - } - ], - "prompt_number": 60 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- == \uc5f0\uc0b0\uc790: \ub450 \uac1d\uccb4\uc758 \uac12\uc774 \ub3d9\uc77c\ud55c\uc9c0\ub97c \ud14c\uc2a4\ud2b8\ud55c\ub2e4." + "4469735056\n", + "4469734448\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c = [1,2,3]\n", - "d = [1,2,3]\n", - "c == d" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 150, - "text": [ - "True" - ] - } - ], - "prompt_number": 150 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

\ucc38\uace0 \ubb38\ud5cc: \ud30c\uc774\uc36c(\uc5f4\ud608\uac15\uc758)(\uac1c\uc815\ud310 VER.2), \uc774\uac15\uc131, FreeLec, 2005\ub144 8\uc6d4 29\uc77c

" + } + ], + "source": [ + "a = 500\n", + "b = a\n", + "print(id(a))\n", + "print(id(b))\n", + "print()\n", + "\n", + "# 작은 값의 정수는 계속하여 별도로 객체를 생성하지 않음\n", + "x = 1\n", + "y = 1\n", + "print(id(x))\n", + "print(id(y))\n", + "print()\n", + "\n", + "# 작은 값의 정수는 별도로 객체를 생성\n", + "x = 1000000000000000000\n", + "y = 1000000000000000000\n", + "print(id(x))\n", + "print(id(y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- is 키워드: 두 객체의 식별자가 동일한지 테스트한다." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "c = [1,2,3]\n", + "d = [1,2,3]\n", + "print(c is d)\n", + "\n", + "a = 500\n", + "b = a\n", + "print(a is b)\n", + "\n", + "x = 1\n", + "y = 1\n", + "print(x is y)\n", + "\n", + "e = f = [4,5,6]\n", + "print(e is f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- == 연산자: 두 객체의 값이 동일한지를 테스트한다." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" ] } ], - "metadata": {} + "source": [ + "c = [1,2,3]\n", + "d = [1,2,3]\n", + "print(c == d)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "x = 1\n", + "y = 1\n", + "print(x is y)\n", + "print(id(x) == id(y))\n", + "print(x == y)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "x = 900000000\n", + "y = 900000000\n", + "print(x is y)\n", + "print(id(x) == id(y))\n", + "print(x == y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4. 레퍼런스 카운트 (Reference Count)와 쓰레기 수집 (Garbage Collection) \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "x = y = z = 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.8" } - ] -} \ No newline at end of file + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/python04.ipynb b/python04.ipynb index a7d6936..dceca06 100644 --- a/python04.ipynb +++ b/python04.ipynb @@ -24,21 +24,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-1 리스트의 정의와 리스트 기본 연산\n", + "### 1-1 리스트(list)의 정의와 리스트 기본 연산\n", "- 리스트: 임의의 객체를 순차적으로 저장하는 집합적 자료형\n", "- 문자열이 지닌 대부분의 연산들은 리스트도 지원" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "\n", "3\n", "\n", @@ -47,29 +47,33 @@ "[2, 3]\n", "\n", "[1, 2, 3, 1, 2, 3]\n", - "[1, 2, 3, 1, 2, 3, 1, 2, 3]\n" + "[1, 2, 3, 1, 2, 3, 1, 2, 3]\n", + "\n", + "[1, 2, 3]\n" ] } ], "source": [ "L = [1,2,3]\n", - "print type(L)\n", - "print\n", - "print len(L)\n", - "print\n", - "print L[1]\n", - "print L[-1]\n", - "print L[1:3]\n", - "print\n", - "print L + L\n", - "print L * 3" + "print(type(L))\n", + "print()\n", + "print(len(L))\n", + "print()\n", + "print(L[1])\n", + "print(L[-1])\n", + "print(L[1:3])\n", + "print()\n", + "print(L + L)\n", + "print(L * 3)\n", + "print()\n", + "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- 리스트는 변경 가능" + "- 리스트의 원소는 변경 가능" ] }, { @@ -88,14 +92,14 @@ "source": [ "l1 = [4,5,6]\n", "l1[0] = 10\n", - "print l1" + "print(l1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "![image](images/changeListElement.png)" + "![image](../images/changeListElement.png)" ] }, { @@ -121,22 +125,23 @@ "source": [ "l1 = [1,2,3]\n", "l1 = [4,5,6]\n", - "print l1" + "print(l1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "![image](images/referenceChangeList.png)" + "![image](../images/referenceChangeList.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-2 range() 함수를 통한 인덱스 리스트 생성\n", - "- range(k): 0부터 k-1까지의 숫자의 리스트를 반환함 " + "### 1-2 range() 함수를 통한 인덱스 리스트 생성\n", + "- range(k): 0부터 k-1까지의 range object를 반환함 (python3)\n", + " - python2 에서는 list 객체를 반환" ] }, { @@ -148,36 +153,44 @@ "name": "stdout", "output_type": "stream", "text": [ + "range(0, 10)\n", + "range(0, 10, 2)\n", + "range(9, -1, -1)\n", + "True\n", + "\n", "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", "[0, 2, 4, 6, 8]\n", - "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n", - "True\n" + "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n" ] } ], "source": [ "L = range(10)\n", - "print L\n", - "print L[::2]\n", - "print L[::-1]\n", - "print 4 in L" + "print(L)\n", + "print(L[::2])\n", + "print(L[::-1])\n", + "print(4 in L)\n", + "print()\n", + "print(list(L))\n", + "print(list(L)[::2])\n", + "print(list(L)[::-1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-3 튜플의 정의와 기본 연산\n", - "- 튜플: 리스트와 유사하지만 튜플 내의 값을 변경할 수 없음\n", + "### 1-3 튜플(tuple)의 정의와 기본 연산\n", + "- 튜플: 리스트와 유사하지만 튜플 내의 값을 변경할 수 없음(immutable하다.)\n", " - 적합한 사용 예\n", - " - months = ('January','February','March','April','May','June','July','August','September','October','November',' December')\n", + " - months = ('January','February','March','April','May','June','July','August','September','October','November',' December')\n", " - 각 값에 대해 인덱스가 부여됨\n", "- 문자열이 지닌 대부분의 연산들은 튜플도 지원" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -201,17 +214,17 @@ "source": [ "t = (1,2,3)\n", "\n", - "print len(t)\n", - "print\n", - "print t[0]\n", - "print t[-1]\n", - "print t[0:2]\n", - "print t[::2]\n", - "print\n", - "print t + t + t\n", - "print t * 3\n", - "print\n", - "print 3 in t" + "print(len(t))\n", + "print()\n", + "print(t[0])\n", + "print(t[-1])\n", + "print(t[0:2])\n", + "print(t[::2])\n", + "print()\n", + "print(t + t + t)\n", + "print(t * 3)\n", + "print()\n", + "print(3 in t)" ] }, { @@ -219,12 +232,12 @@ "metadata": {}, "source": [ "### 1-4 튜플의 상수적 성격\n", - "- 튜플은 내용 변경 불가" + "- 튜플은 내용 변경 불가(immutable)" ] }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -232,8 +245,9 @@ "evalue": "'tuple' object does not support item assignment", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] } @@ -248,12 +262,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 반면에 리스트는 내용 변경 가능" + "- 반면에 리스트는 내용 변경 가능(mutable)" ] }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -268,15 +282,15 @@ "L = [1,2,3]\n", "L[0] = 100\n", "\n", - "print L" + "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 1-5 사전의 정의와 기본 사용법\n", - "- 정수형 인덱스가 아닌 키를 이용하여 값을 저장하는 자료 구조\n", + "### 1-5 사전(dictionary; dict)의 정의와 기본 사용법\n", + "- 정수형 인덱스가 아닌 키(key)를 이용하여 값(value)을 저장하는 자료 구조\n", " - 저장된 각 자료에 대한 순서는 의미 없음\n", "- 매핑(Mapping) 함수와 비슷한 역할을 함\n", " - x라는 키값을 넣으면 값 y를 반환함" @@ -284,7 +298,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -297,20 +311,20 @@ ], "source": [ "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", - "print d['one']\n" + "print(d['one'])" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 'hana'}\n", - "{'four': 'net', 'three': 'set', 'two': 'dul', 'one': 1}\n", + "{'one': 'hana', 'two': 'dul', 'three': 'set', 'four': 'net'}\n", + "{'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", "True\n" ] } @@ -318,32 +332,36 @@ "source": [ "d = {'one': 'hana', 'two': 'dul', 'three': 'set'}\n", "d['four'] = 'net' # 새 항목의 삽입\n", - "print d\n", + "print(d)\n", "d['one'] = 1 # 기존 항목의 값 변경\n", - "print d\n", - "print 'one' in d # 키에 대한 멤버쉽 테스트" + "print(d)\n", + "print('one' in d) # 키에 대한 멤버쉽 테스트" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['four', 'three', 'two', 'one']\n", - "['net', 'set', 'dul', 1]\n", - "[('four', 'net'), ('three', 'set'), ('two', 'dul'), ('one', 1)]\n" + "dict_keys(['one', 'two', 'three', 'four'])\n", + "dict_values([1, 'dul', 'set', 'net'])\n", + "dict_items([('one', 1), ('two', 'dul'), ('three', 'set'), ('four', 'net')])\n" ] } ], "source": [ "d = {'one': 1, 'two': 'dul', 'three': 'set', 'four': 'net'}\n", - "print d.keys() # 키만 리스트로 추출함\n", - "print d.values() # 값만 리스트로 추출함\n", - "print d.items() # 키와 값의 튜플을 리스트로 반환함" + "print(d.keys()) # 키만 dict_keys 객체로 추출(Python3.6), 키만 리스트로 추출(Python2.7)\n", + "print(d.values()) # 값만 dict_values 객체로 추출(Python3.6), 값만 리스트로 추출(Python2.7)\n", + "print(d.items()) # 키와 값의 튜플을 dict_items 객체로 추출(Python 3.6), 키와 값의 튜플을 리스트로 반환함(Python2.7)\n", + "\n", + "# ['four', 'three', 'two', 'one']\n", + "# ['net', 'set', 'dul', 1]\n", + "# [('four', 'net'), ('three', 'set'), ('two', 'dul'), ('one', 1)]" ] }, { @@ -384,44 +402,52 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "\n", - "\n" + "\n", + "\n", + "\n" ] } ], "source": [ - "print type(3) #정수\n", - "print type(3.3) #실수\n", - "print type('abc') #문자열" + "print(type(3)) #정수\n", + "print(type(3.3)) #실수\n", + "print(type('abc')) #문자열\n", + "\n", + "# \n", + "# \n", + "# " ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "\n", - "\n" + "\n", + "\n", + "\n" ] } ], "source": [ - "print type([]) #리스트\n", - "print type(()) #튜플\n", - "print type({}) #사전(dict)" + "print(type([])) #리스트\n", + "print(type(())) #튜플\n", + "print(type({})) #사전(dict)\n", + "\n", + "# \n", + "# \n", + "# " ] }, { @@ -433,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -449,33 +475,38 @@ "source": [ "a = 0\n", "L = [1,2,3]\n", - "print type(a) == type(0)\n", - "print type(L) == type([])\n", - "print type(L[0]) == type(0)" + "print(type(a) == type(0))\n", + "print(type(L) == type([]))\n", + "print(type(L[0]) == type(0))" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "\n", "None\n", - "\n" + "\n" ] } ], "source": [ - "print type(None) #None 객체, 아무 값도 없다(혹은 아니다)를 나타내는 객체\n", - "print\n", + "print(type(None)) # NoneType 객체, 아무 값도 없음을 나타내는 객체\n", + "print()\n", "a = None\n", - "print a\n", - "print type(a)" + "print(a)\n", + "print(type(a))\n", + "\n", + "# \n", + "\n", + "# None\n", + "# " ] }, { @@ -489,48 +520,60 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- id(): 객체의 식별자를 반환한다." + "- id(): 객체의 식별자를 반환한다." ] }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "4478569376\n", - "4478569376\n", + "4469734928\n", + "4469734928\n", "\n", - "4298182776\n", - "4298182776\n" + "4430976352\n", + "4430976352\n", + "\n", + "4469735056\n", + "4469734448\n" ] } ], "source": [ "a = 500\n", "b = a\n", - "print id(a)\n", - "print id(b)\n", - "print\n", + "print(id(a))\n", + "print(id(b))\n", + "print()\n", + "\n", + "# 작은 값의 정수는 계속하여 별도로 객체를 생성하지 않음\n", "x = 1\n", "y = 1\n", - "print id(x)\n", - "print id(y)" + "print(id(x))\n", + "print(id(y))\n", + "print()\n", + "\n", + "# 작은 값의 정수는 별도로 객체를 생성\n", + "x = 1000000000000000000\n", + "y = 1000000000000000000\n", + "print(id(x))\n", + "print(id(y))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- is 키워드: 두 객체의 식별자가 동일한지 테스트한다." + "- is 키워드: 두 객체의 식별자가 동일한지 테스트한다." ] }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -547,18 +590,18 @@ "source": [ "c = [1,2,3]\n", "d = [1,2,3]\n", - "print c is d\n", + "print(c is d)\n", "\n", "a = 500\n", "b = a\n", - "print a is b\n", + "print(a is b)\n", "\n", "x = 1\n", "y = 1\n", - "print x is y\n", + "print(x is y)\n", "\n", "e = f = [4,5,6]\n", - "print e is f" + "print(e is f)" ] }, { @@ -570,24 +613,83 @@ }, { "cell_type": "code", - "execution_count": 150, + "execution_count": 17, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 150, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] } ], "source": [ "c = [1,2,3]\n", "d = [1,2,3]\n", - "c == d" + "print(c == d)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "x = 1\n", + "y = 1\n", + "print(x is y)\n", + "print(id(x) == id(y))\n", + "print(x == y)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "x = 900000000\n", + "y = 900000000\n", + "print(x is y)\n", + "print(id(x) == id(y))\n", + "print(x == y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4. 레퍼런스 카운트 (Reference Count)와 쓰레기 수집 (Garbage Collection) \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "x = y = z = 100" ] }, { @@ -614,7 +716,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/python04.ipynb b/python3.6/python04.ipynb index b9287d4..891fd17 100644 --- a/python3.6/python04.ipynb +++ b/python3.6/python04.ipynb @@ -676,6 +676,81 @@ "print(x == y)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2-4. 레퍼런스 카운트 (Reference Count)와 쓰레기 수집 (Garbage Collection) \n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "x = y = z = 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/referenceCount1.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n" + ] + } + ], + "source": [ + "print(x is y)\n", + "print(y is z)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "del x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/referenceCount2.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "y = 200\n", + "z = 300" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](../images/referenceCount3.png)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -700,7 +775,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/supplement-2016-09.ipynb b/python3.6/supplement-2016-09.ipynb index 1c5a17e..75411bc 100644 --- a/python3.6/supplement-2016-09.ipynb +++ b/python3.6/supplement-2016-09.ipynb @@ -3546,7 +3546,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From e1ec3c81bf28c4b40d56231cde0dbced9f8aeb59 Mon Sep 17 00:00:00 2001 From: HwangGyuYoung Date: Mon, 16 Sep 2019 11:15:27 +0900 Subject: [PATCH 105/124] ... --- python3.6/assignment2019/assignment-1.ipynb | 61 ++++++++++++++++-- .../assignment2019/image/assignment1-9.png | Bin 0 -> 446937 bytes 2 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 python3.6/assignment2019/image/assignment1-9.png diff --git a/python3.6/assignment2019/assignment-1.ipynb b/python3.6/assignment2019/assignment-1.ipynb index 07873f7..fc601de 100644 --- a/python3.6/assignment2019/assignment-1.ipynb +++ b/python3.6/assignment2019/assignment-1.ipynb @@ -94,22 +94,75 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "9. (규영) ~~~~" + "9. Kevin과 Stuart는 게임을 한다. 규칙은 아래와 같다.\n", + "\n", + " - 두 플레이어에게 같은 string, S, 가 주어진다.\n", + " - 두 플레이어는 string S의 문자를 사용하여 substring을 만들어야 한다(중복 가능).\n", + " - Stuart는 자음으로 시작하는 단어를 만들어야 한다.\n", + " - Kevin은 모음으로 시작하는 단어를 만들어야 한다.\n", + " - 게임은 두 플레이어가 만들 수 있는 모든 단어를 만들었을 때 끝난다.\n", + " - 점수 계산 : substring 1개당 +1 점을 획득한다. (아래 그림 참고)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 사용자로 부터 대문자로 이루어진 string S를 입력받고, 승자와 그의 점수를 출력하는 프로그램을 작성하시오.\n", + "\n", + " [실행 예]\n", + " ```\n", + " string S를 입력하세요: BANANA\n", + " 승자: Stuart 점수: 12\n", + " ```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "10. (규영) ~~~~" + "10. 알파벳 소문자만으로 이루어진 string, S, 가 주어지고 아래 2가지 연산을 수행할 수 있다.\n", + " - 추가 : string S의 끝에 알파벳 소문자 하나를 추가한다.\n", + " - 삭제 : string S의 마지막 문자 하나를 삭제한다. empty string에서 삭제 연산을 수행한 결과는 empty string이다.\n", + "\n", + "두 개의 string, s와 t, 그리고 정수 k가 주어질 때, 정확히 k번의 연산을 통해 s를 t로 바꿀 수 있는지 판단하는 함수를 작성하시오." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "def appendDelete(s, t, k):\n", + " '''\n", + " 함수 포맷 변경하지 마세요.\n", + " s를 정확히 k번의 연산을 통해 t로 바꿀 수 있다면 'Yes'를 아니면 'No'를 return 해주세요.\n", + " '''\n", + " return 'Yes' # or 'No'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [예시]\n", + " ```\n", + " 1. s = 'hackerhappy' t = 'hackerrank' k = 9 => 'Yes'\n", + " \n", + " 2. s = 'aba' t = 'aba' k = 7 => 'Yes'\n", + " \n", + " 3. s = 'ashley' t = 'ash' k = 2 => 'No'\n", + " \n", + " ```" + ] } ], "metadata": { diff --git a/python3.6/assignment2019/image/assignment1-9.png b/python3.6/assignment2019/image/assignment1-9.png new file mode 100644 index 0000000000000000000000000000000000000000..135338ae0a7d80e5204400b531262614c209488b GIT binary patch literal 446937 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

Dz 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 )0SI_cn;|(;eQ4vb@yc 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� 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 Qb_Mv+(J)Z2QnilyKcw9b$N&HU literal 0 HcmV?d00001 From 0020d7097b4321a3f762b7a4f208b30a0fe34217 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sun, 22 Sep 2019 20:33:25 +0900 Subject: [PATCH 106/124] ... --- python3.6/Untitled.ipynb | 218 +++++++++++++++++++++++++++++ python3.6/python04.ipynb | 2 +- python3.6/python05.ipynb | 10 +- python3.6/python06.ipynb | 39 +++++- python3.6/supplement-2016-09.ipynb | 96 ++++++------- 5 files changed, 305 insertions(+), 60 deletions(-) create mode 100644 python3.6/Untitled.ipynb diff --git a/python3.6/Untitled.ipynb b/python3.6/Untitled.ipynb new file mode 100644 index 0000000..ab4d623 --- /dev/null +++ b/python3.6/Untitled.ipynb @@ -0,0 +1,218 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4474029488\n", + "4474029488\n", + "True\n", + "\n", + "4513853680\n", + "4513854096\n", + "False\n" + ] + } + ], + "source": [ + "x = 1\n", + "y = 1\n", + "print(id(x))\n", + "print(id(y))\n", + "print(x is y)\n", + "print()\n", + "\n", + "# 작은 값의 정수는 별도로 객체를 생성\n", + "x2 = 1000000000000000000\n", + "y2 = 1000000000000000000\n", + "print(id(x2))\n", + "print(id(y2))\n", + "print(x2 is y2)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4513943152\n", + "4513943152\n", + "True\n" + ] + } + ], + "source": [ + "x = \"abcdefghijklmn\"\n", + "y = \"abcdefghijklmn\"\n", + "print(id(x))\n", + "print(id(y))\n", + "print(x is y)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n" + ] + } + ], + "source": [ + "a = 4\n", + "b = 2\n", + "print(a*b)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n" + ] + } + ], + "source": [ + "print({0:0, 1:1} == {0:0, 1:2})\n", + "print({0:0, 1:1} == {0:0, 1:1})" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "False\n", + "False\n", + "True\n" + ] + } + ], + "source": [ + "x = [1,2,3]\n", + "y = [1,2,3]\n", + "z = y\n", + "\n", + "print(x == y)\n", + "print(x == z)\n", + "print(x is y)\n", + "print(x is z)\n", + "print(y is z)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n" + ] + } + ], + "source": [ + "print(x[0] == y[0])\n", + "print(x[0] is y[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1569151624.751703\n", + "\n", + "\n", + "totalSeconds - 1569151624\n", + "totalMinutes - 26152527\n", + "totalHours - 435875\n", + "현재 시각은 11 : 27 : 4 GMT 입니다.\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "currentTime = time.time() # Unix Epoch 부터 현재까지 경과된 시각 (GMT/UST 기준)을 실수형 초 단위로 최대한 정확하게 얻어온다.\n", + "print(currentTime)\n", + "print(type(currentTime))\n", + "print()\n", + "\n", + "totalSeconds = int(currentTime) # 1970년 1월 1일 0시 이후부터 현재시각까지의 정수형 초 값을 얻어온다.\n", + "print(\"totalSeconds -\", totalSeconds)\n", + "currentSecond = totalSeconds % 60 # 현재 시각의 초 값을 얻어온다.\n", + "\n", + "totalMinutes = totalSeconds // 60 # 전체 분 값을 계산한다. \n", + "print(\"totalMinutes -\", totalMinutes)\n", + "currentMinute = totalMinutes % 60 # 현재 시각의 분 값을 얻어온다.\n", + "\n", + "totalHours = totalMinutes // 60 # 전체 시 값을 계산한다.\n", + "print(\"totalHours -\", totalHours)\n", + "currentHours = totalHours % 24 # 현재 시각의 시 값을 얻어온다.\n", + "\n", + "print(\"현재 시각은\", currentHours, \":\", currentMinute, \":\", currentSecond, \"GMT 입니다.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python3.6/python04.ipynb b/python3.6/python04.ipynb index 891fd17..47f8a05 100644 --- a/python3.6/python04.ipynb +++ b/python3.6/python04.ipynb @@ -557,7 +557,7 @@ "print(id(y))\n", "print()\n", "\n", - "# 작은 값의 정수는 별도로 객체를 생성\n", + "# 큰 값의 정수는 별도로 객체를 생성\n", "x = 1000000000000000000\n", "y = 1000000000000000000\n", "print(id(x))\n", diff --git a/python3.6/python05.ipynb b/python3.6/python05.ipynb index 0cdd051..3dd75e5 100644 --- a/python3.6/python05.ipynb +++ b/python3.6/python05.ipynb @@ -91,7 +91,7 @@ "a = 5 / 2.0\n", "b = 5 / 2\n", "print(a) # 정수 / 실수의 결과\n", - "print(b) # 정수 / 정수의 결과 <-- python 3 부터는 '정수 / 실수'의 결과와 동일\n", + "print(b) # 정수 / 정수의 결과 <-- python 3 부터는 /의 결과는 언제나 실수\n", "\n", "print(type(a), type(b))" ] @@ -122,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -135,8 +135,8 @@ } ], "source": [ - "print(5 // 3) # Floor Division\n", - "print(5 // 3.0) # Floor Division - 이 경우에는 '정수 // 정수'와 '정수 // 실수'의 결과 다름 " + "print(5 // 3) # Floor Division\n", + "print(5 // 3.0) # Floor Division - Floor Division은 '정수 // 정수'와 '정수 // 실수'의 결과 다름 " ] }, { @@ -805,7 +805,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/python06.ipynb b/python3.6/python06.ipynb index 031b818..24b9c51 100644 --- a/python3.6/python06.ipynb +++ b/python3.6/python06.ipynb @@ -610,6 +610,43 @@ " print()" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 * 2 = 4\n", + "2 * 3 = 6\n", + "2 * 4 = 8\n", + "2 * 5 = 10\n", + "2 * 6 = 12\n", + "2 * 7 = 14\n", + "2 * 8 = 16\n", + "2 * 9 = 18\n", + "\n", + "3 * 2 = 6\n", + "3 * 3 = 9\n", + "3 * 4 = 12\n", + "3 * 5 = 15\n", + "3 * 6 = 18\n", + "3 * 7 = 21\n", + "3 * 8 = 24\n", + "3 * 9 = 27\n", + "\n" + ] + } + ], + "source": [ + "for x in range(2, 4):\n", + " for y in range(2, 10):\n", + " print(\"{0} * {1} = {2}\".format(x, y, x * y))\n", + " print()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1041,7 +1078,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/supplement-2016-09.ipynb b/python3.6/supplement-2016-09.ipynb index 75411bc..9de8a26 100644 --- a/python3.6/supplement-2016-09.ipynb +++ b/python3.6/supplement-2016-09.ipynb @@ -2458,7 +2458,7 @@ }, { "cell_type": "code", - "execution_count": 139, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -2474,17 +2474,11 @@ } ], "source": [ - "print(5 / 4) # 자동으로 floor 처리 됨\n", + "print(5 / 4)\n", "print(5.0 / 4)\n", "print()\n", - "print(-5 / 4) # 자동으로 floor 처리 됨\n", - "print(-5.0 / 4)\n", - "\n", - "# 1\n", - "# 1.25\n", - "\n", - "# -2\n", - "# -1.25" + "print(-5 / 4)\n", + "print(-5.0 / 4)" ] }, { @@ -2498,7 +2492,7 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -2532,20 +2526,7 @@ "print(-5.0 / 4)\n", "print(-5.0 // 4) # floor division\n", "print(-5 / 4)\n", - "print(-5 // 4) # floor division\n", - "\n", - "# 0.5\n", - "# 0.0\n", - "\n", - "# 1.25\n", - "# 1.0\n", - "# 1\n", - "# 1\n", - "\n", - "# -1.25\n", - "# -2.0\n", - "# -2\n", - "# -2" + "print(-5 // 4) # floor division" ] }, { @@ -2587,20 +2568,20 @@ }, { "cell_type": "code", - "execution_count": 142, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1504618340.500086\n", + "1569151899.693372\n", "\n", "\n", - "totalSeconds - 1504618340\n", - "totalMinutes - 25076972\n", - "totalHours - 417949\n", - "현재 시각은 13 : 32 : 20 GMT 입니다.\n" + "totalSeconds - 1569151899\n", + "totalMinutes - 26152531\n", + "totalHours - 435875\n", + "현재 시각은 11 : 31 : 39 GMT 입니다.\n" ] } ], @@ -2627,33 +2608,42 @@ "print(\"현재 시각은\", currentHours, \":\", currentMinute, \":\", currentSecond, \"GMT 입니다.\")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 대한민국의 Time Zone 및 로컬타임 얻기" - ] - }, { "cell_type": "code", - "execution_count": 143, + "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "('KST', 'KST')\n", - "\n", - "time.struct_time(tm_year=2017, tm_mon=9, tm_mday=5, tm_hour=22, tm_min=32, tm_sec=27, tm_wday=1, tm_yday=248, tm_isdst=0)\n" + "year: 2019\n", + "month: 09\n", + "day: 22\n", + "현재 시각: 20:31:40\n", + "현재 날짜 & 시각: 20:31:40 09/22/2019\n" ] } ], "source": [ - "print(time.tzname)\n", - "print()\n", - "localtime = time.localtime()\n", - "print(localtime)" + "from datetime import datetime\n", + "\n", + "now = datetime.now() # current date and time\n", + "\n", + "year = now.strftime(\"%Y\")\n", + "print(\"year:\", year)\n", + "\n", + "month = now.strftime(\"%m\")\n", + "print(\"month:\", month)\n", + "\n", + "day = now.strftime(\"%d\")\n", + "print(\"day:\", day)\n", + "\n", + "time_str = now.strftime(\"%H:%M:%S\")\n", + "print(\"현재 시각:\", time_str)\n", + "\n", + "date_time = now.strftime(\"%H:%M:%S %m/%d/%Y\")\n", + "print(\"현재 날짜 & 시각:\", date_time)" ] }, { @@ -2665,7 +2655,7 @@ }, { "cell_type": "code", - "execution_count": 145, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -2677,15 +2667,15 @@ "Well, YHHAN, I am thinking of a number between 1 and 20.\n", "Take a guess.\n", "10\n", - "Your guess is too low.\n", + "Your guess is too high.\n", "Take a guess.\n", - "15\n", - "Your guess is too low.\n", + "5\n", + "Your guess is too high.\n", "Take a guess.\n", - "17\n", - "Your guess is too low.\n", + "3\n", + "Your guess is too high.\n", "Take a guess.\n", - "19\n", + "2\n", "Good job, YHHAN! You guessed my number in 4 guesses!\n" ] } From 1f8c091062d5234e7ba4f1234e9bae358438a727 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sat, 28 Sep 2019 23:19:48 +0900 Subject: [PATCH 107/124] ... --- python3.6/assignment2019/assignment-2.ipynb | 48 +++++++++++---------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/python3.6/assignment2019/assignment-2.ipynb b/python3.6/assignment2019/assignment-2.ipynb index 2e6650c..e40a88c 100644 --- a/python3.6/assignment2019/assignment-2.ipynb +++ b/python3.6/assignment2019/assignment-2.ipynb @@ -6,10 +6,11 @@ "source": [ "# Assignment 2\n", "### [정보]\n", - "#### 1) Due Date: 2018년 10월 19일 (금), 23시 59분\n", - "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", - "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입.\n", - "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출. " + "#### 1) Due Date: 2019년 10월 08일 (금), 23시 59분\n", + "#### 2) 제출방법: colab으로 작성된 notebook URL을 EL사이트에 제출 (EL 사이트의 본인 게시물에서 클릭이 되도록 함)\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 colab notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell 등에 넣어 기입하시오.\n", + "#### 4) 숙제이후 소감 작성: 모든 문제의 답을 작성한 이후에 현재까지 강의를 들은 후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "#### 5) 반드시 본인 스스로 문제를 해결하세요~~~\n" ] }, { @@ -72,25 +73,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### ACM-ICPC 문제" + "4) ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "1) [ACM-ICPC 문제 10809번]\n", - " - 알파벳 찾기
\n", - "https://www.acmicpc.net/problem/10809" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2) [ACM-ICPC 문제 2675번]\n", - " - 문자열 반복
\n", - "https://www.acmicpc.net/problem/2675" + "5) ..." ] }, { @@ -104,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "1) 웹 URL로 지정된 웹페이지를 문자열로 가져와 1) 모든 HTML 태그를 제외한 순수 텍스트 문자열만을 걸러내고, 2) 그 순수 텍스트 문자열 안에 존재하는 단어가 총 몇개인지 출력하는 프로그램을 작성하시오.\n", + "- 웹 URL로 지정된 웹페이지를 문자열로 가져와 1) 모든 HTML 태그를 제외한 순수 텍스트 문자열만을 걸러내고, 2) 그 순수 텍스트 문자열 안에 존재하는 단어가 총 몇개인지 출력하는 프로그램을 작성하시오.\n", " - HTML 태그는 다음 조건을 가지는 것이다.\n", " - < 로 시작하여 >로 끝난다.\n", " - 예를 들어, 아래와 같은 HTML 내용 내에 한 줄이 있다고 가정하자.\n", @@ -114,9 +104,9 @@ " ```\n", " - 위 소스에서 HTML 태그를 제외한 순수 텍스트 문자열은 아래와 같다.\n", " \n", - " ```\n", - " 로그인 유지 \n", - " ```\n", + " ```\n", + " 로그인 유지 \n", + " ```\n", " \n", " - 한편, 아래와 같은 HTML 한 줄이 있다고 가정하자.\n", " \n", @@ -662,6 +652,20 @@ "print(source)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 본 문제에 대한 정확한 답안은 존재하지 않으며, 채점은 코딩 내용을 보고 코딩의 정확성, 완결성, 가독성 등을 보고 평가한다. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 2개 이상의 URL에 대하여 순수한 단어의 개수를 출력하는 예시를 제시할 것" + ] + }, { "cell_type": "code", "execution_count": null, @@ -687,7 +691,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From c9321928f80517134440d898300e252ca4188ee7 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sat, 28 Sep 2019 23:31:31 +0900 Subject: [PATCH 108/124] ... --- python3.6/assignment2019/assignment-2.ipynb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/python3.6/assignment2019/assignment-2.ipynb b/python3.6/assignment2019/assignment-2.ipynb index e40a88c..7e1a23b 100644 --- a/python3.6/assignment2019/assignment-2.ipynb +++ b/python3.6/assignment2019/assignment-2.ipynb @@ -6,10 +6,14 @@ "source": [ "# Assignment 2\n", "### [정보]\n", - "#### 1) Due Date: 2019년 10월 08일 (금), 23시 59분\n", + "#### 1) Due Date: 2019년 10월 11일 (금), 23시 59분\n", + "\n", "#### 2) 제출방법: colab으로 작성된 notebook URL을 EL사이트에 제출 (EL 사이트의 본인 게시물에서 클릭이 되도록 함)\n", + "\n", "#### 3) 내용: 반드시 python code와 수행 결과를 colab notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell 등에 넣어 기입하시오.\n", + "\n", "#### 4) 숙제이후 소감 작성: 모든 문제의 답을 작성한 이후에 현재까지 강의를 들은 후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "\n", "#### 5) 반드시 본인 스스로 문제를 해결하세요~~~\n" ] }, @@ -17,7 +21,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 일반 연습 문제" + "### 일반 문제" ] }, { From 8061100b7c145145de73607f3afc3146c48bbfe0 Mon Sep 17 00:00:00 2001 From: Ho-Bin Date: Sun, 29 Sep 2019 23:01:12 +0900 Subject: [PATCH 109/124] ... --- python3.6/assignment2019/assignment-1.ipynb | 2 +- python3.6/assignment2019/assignment-2.ipynb | 40 +++++++++++++++------ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/python3.6/assignment2019/assignment-1.ipynb b/python3.6/assignment2019/assignment-1.ipynb index fc601de..343b5b3 100644 --- a/python3.6/assignment2019/assignment-1.ipynb +++ b/python3.6/assignment2019/assignment-1.ipynb @@ -182,7 +182,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/python3.6/assignment2019/assignment-2.ipynb b/python3.6/assignment2019/assignment-2.ipynb index 7e1a23b..a8cf86d 100644 --- a/python3.6/assignment2019/assignment-2.ipynb +++ b/python3.6/assignment2019/assignment-2.ipynb @@ -58,6 +58,7 @@ "metadata": {}, "source": [ "3) 두 개의 리스트를 인자로 받아서 그 두 개의 리스트에 대한 '합집합'을 반환하는 함수 list_union(lista, listb)를 작성하시오.\n", + " - **집합 자료형 set은 사용하지 않는다.**\n", " - 인자로 전달하는 리스트 2 개에는 정수값만 들어간다고 가정하자.\n", " - 함수 내에서 새로운 리스트를 만들어 그 리스트 내에 인자로 받은 두 리스트의 모든 원소를 넣어 반환한다.\n", " - 반환하는 리스트에는 절대로 중복된 원소가 들어 있으면 안된다 (집합의 조건).\n", @@ -77,14 +78,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "4) ..." + "4) 두 개의 리스트를 인자로 받아서 그 두 개의 리스트에 대한 '교집합'을 반환하는 함수 list_intersection(lista, listb)와 '차집합'을 반환하는 함수 list_difference(lista, listb)를 작성하시오.\n", + " - 모든 가정과 조건은 3번 문제와 동일하다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "5) ..." + "5) 두 개의 양의 정수를 인자로 받아서 해당 범위안에 있는 소수(prime number)의 리스트를 출력하는 함수 print_primenumber(a, b)를 작성하시오.\n", + " - 이미 구현된 모듈이나 라이브러리는 사용하지 않는다.\n", + " - 함수의 반환(return)은 없으며 함수 내의 끝에서 .format()을 사용하여 다음과 같이 출력한다.\n", + " - print_primenumber(2, 10)\n", + " - 2 이상 10 이하 정수 중 소수 리스트: [2, 3, 5, 7]" ] }, { @@ -145,6 +151,27 @@ "source = req.text" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'primetext'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mprimetext\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mprimelist\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'primetext'" + ] + } + ], + "source": [ + "from primetext import primelist" + ] + }, { "cell_type": "code", "execution_count": 6, @@ -669,13 +696,6 @@ "source": [ "- 2개 이상의 URL에 대하여 순수한 단어의 개수를 출력하는 예시를 제시할 것" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -695,7 +715,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.6.9" } }, "nbformat": 4, From d78cb95d61a45b0fe9bebf36170900bbcbddfa0e Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 30 Sep 2019 10:54:39 +0900 Subject: [PATCH 110/124] ... --- python3.6/assignment-2.ipynb | 36 ++++++++++++++----- python3.6/assignment2019/assignment-2.ipynb | 38 +++++++++++++++------ 2 files changed, 55 insertions(+), 19 deletions(-) diff --git a/python3.6/assignment-2.ipynb b/python3.6/assignment-2.ipynb index 2e6650c..1eed1d8 100644 --- a/python3.6/assignment-2.ipynb +++ b/python3.6/assignment-2.ipynb @@ -108,24 +108,42 @@ " - HTML 태그는 다음 조건을 가지는 것이다.\n", " - < 로 시작하여 >로 끝난다.\n", " - 예를 들어, 아래와 같은 HTML 내용 내에 한 줄이 있다고 가정하자.\n", - " \n", " ```\n", " \n", " ```\n", - " - 위 소스에서 HTML 태그를 제외한 순수 텍스트 문자열은 아래와 같다.\n", - " \n", + " - 위 소스에서 HTML 태그를 제외한 순수 텍스트 문자열: 로그인 유지 \n", + "
\n", + "
\n", + " - 다른 예제\n", " ```\n", - " 로그인 유지 \n", + "
교육역량강화사업 온라인 컨텐츠
\n", " ```\n", + " - 순수 텍스트 문자열: 교육역량강화사업 온라인 컨텐츠\n", + "
\n", + "
\n", " \n", " - 한편, 아래와 같은 HTML 한 줄이 있다고 가정하자.\n", " \n", + " ```\n", + " \n", + " ```\n", + " - 위 한 줄은 HTML 태그로만 구성된 것이며 걸러낼 수 있는 순수 텍스 문자열은 존재하지 않는다.\n", + "

\n", + " - 다른 예제\n", " ```\n", - " \n", + " //\n", " ```\n", - " \n", - " - 위 한 줄은 HTML 태그로만 구성된 것이며 걸러낼 수 있는 순수 텍스 문자열은 존재하지 않는다.\n", - " \n", + " - 순수 텍스트 문자열: 없음\n", + "
\n", + "
\n", " - 단어를 나누는 기준은 오로지 공백문자 (whitespace)이다.\n", " - 즉, 위 순수 텍스트 문자열인 \"로그인 유지\"에서 분리한 단어는 \"로그인\"과 \"유지\"이다.\n", " - 중복을 고려하지 않고 무조건 모든 단어의 개수를 세어서 출력한다.\n", @@ -687,7 +705,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/assignment2019/assignment-2.ipynb b/python3.6/assignment2019/assignment-2.ipynb index 7e1a23b..70c5afd 100644 --- a/python3.6/assignment2019/assignment-2.ipynb +++ b/python3.6/assignment2019/assignment-2.ipynb @@ -102,24 +102,42 @@ " - HTML 태그는 다음 조건을 가지는 것이다.\n", " - < 로 시작하여 >로 끝난다.\n", " - 예를 들어, 아래와 같은 HTML 내용 내에 한 줄이 있다고 가정하자.\n", - " \n", " ```\n", " \n", " ```\n", - " - 위 소스에서 HTML 태그를 제외한 순수 텍스트 문자열은 아래와 같다.\n", - " \n", - " ```\n", - " 로그인 유지 \n", - " ```\n", + " - 위 소스에서 HTML 태그를 제외한 순수 텍스트 문자열: 로그인 유지 \n", + "
\n", + "
\n", + " - 다른 예제\n", + " ```\n", + "
교육역량강화사업 온라인 컨텐츠
\n", + " ```\n", + " - 순수 텍스트 문자열: 교육역량강화사업 온라인 컨텐츠\n", + "
\n", + "
\n", " \n", " - 한편, 아래와 같은 HTML 한 줄이 있다고 가정하자.\n", " \n", + " ```\n", + " \n", + " ```\n", + " - 위 한 줄은 HTML 태그로만 구성된 것이며 걸러낼 수 있는 순수 텍스 문자열은 존재하지 않는다.\n", + "

\n", + " - 다른 예제\n", " ```\n", - " \n", + " //\n", " ```\n", - " \n", - " - 위 한 줄은 HTML 태그로만 구성된 것이며 걸러낼 수 있는 순수 텍스 문자열은 존재하지 않는다.\n", - " \n", + " - 순수 텍스트 문자열: 없음\n", + "
\n", + "
\n", " - 단어를 나누는 기준은 오로지 공백문자 (whitespace)이다.\n", " - 즉, 위 순수 텍스트 문자열인 \"로그인 유지\"에서 분리한 단어는 \"로그인\"과 \"유지\"이다.\n", " - 중복을 고려하지 않고 무조건 모든 단어의 개수를 세어서 출력한다.\n", From 2862a3e49ad6001d1e92ba9078d642264fb5021c Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 30 Sep 2019 10:55:21 +0900 Subject: [PATCH 111/124] ... --- python3.6/assignment2019/assignment-2.ipynb | 23 +-------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/python3.6/assignment2019/assignment-2.ipynb b/python3.6/assignment2019/assignment-2.ipynb index 6e8ff8a..57bb394 100644 --- a/python3.6/assignment2019/assignment-2.ipynb +++ b/python3.6/assignment2019/assignment-2.ipynb @@ -169,27 +169,6 @@ "source = req.text" ] }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'primetext'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mprimetext\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mprimelist\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'primetext'" - ] - } - ], - "source": [ - "from primetext import primelist" - ] - }, { "cell_type": "code", "execution_count": 6, @@ -733,7 +712,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.6.8" } }, "nbformat": 4, From 703cda0c313b603765622f1e3f598e6bf4c21a1c Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sun, 6 Oct 2019 00:45:39 +0900 Subject: [PATCH 112/124] ... --- python3.6/Untitled.ipynb | 160 +++++---------------------------------- python3.6/python09.ipynb | 10 +-- python3.6/python10.ipynb | 30 ++++---- 3 files changed, 38 insertions(+), 162 deletions(-) diff --git a/python3.6/Untitled.ipynb b/python3.6/Untitled.ipynb index ab4d623..68ae2c5 100644 --- a/python3.6/Untitled.ipynb +++ b/python3.6/Untitled.ipynb @@ -1,82 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4474029488\n", - "4474029488\n", - "True\n", - "\n", - "4513853680\n", - "4513854096\n", - "False\n" - ] - } - ], - "source": [ - "x = 1\n", - "y = 1\n", - "print(id(x))\n", - "print(id(y))\n", - "print(x is y)\n", - "print()\n", - "\n", - "# 작은 값의 정수는 별도로 객체를 생성\n", - "x2 = 1000000000000000000\n", - "y2 = 1000000000000000000\n", - "print(id(x2))\n", - "print(id(y2))\n", - "print(x2 is y2)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4513943152\n", - "4513943152\n", - "True\n" - ] - } - ], - "source": [ - "x = \"abcdefghijklmn\"\n", - "y = \"abcdefghijklmn\"\n", - "print(id(x))\n", - "print(id(y))\n", - "print(x is y)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "8\n" - ] - } - ], - "source": [ - "a = 4\n", - "b = 2\n", - "print(a*b)" - ] - }, { "cell_type": "code", "execution_count": 11, @@ -86,43 +9,32 @@ "name": "stdout", "output_type": "stream", "text": [ - "False\n", - "True\n" + "['spam', [1], 'ham', 123, 1234]\n" ] } ], "source": [ - "print({0:0, 1:1} == {0:0, 1:2})\n", - "print({0:0, 1:1} == {0:0, 1:1})" + "a = [123, 1234]\n", + "b = ['spam', [1], 'ham']\n", + "a[0:0] = b\n", + "print(a)" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "True\n", - "True\n", - "False\n", - "False\n", - "True\n" + "3\n" ] } ], "source": [ - "x = [1,2,3]\n", - "y = [1,2,3]\n", - "z = y\n", - "\n", - "print(x == y)\n", - "print(x == z)\n", - "print(x is y)\n", - "print(x is z)\n", - "print(y is z)" + "print(len(a))" ] }, { @@ -134,56 +46,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "True\n", - "True\n" - ] - } - ], - "source": [ - "print(x[0] == y[0])\n", - "print(x[0] is y[0])" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1569151624.751703\n", - "\n", - "\n", - "totalSeconds - 1569151624\n", - "totalMinutes - 26152527\n", - "totalHours - 435875\n", - "현재 시각은 11 : 27 : 4 GMT 입니다.\n" + "[1, 2, 3, 6, 6, 8, 9]\n", + "[9, 8, 6, 6, 3, 2, 1]\n", + "[1, 2, 3, 6, 6, 8, 9]\n" ] } ], "source": [ - "import time\n", - "\n", - "currentTime = time.time() # Unix Epoch 부터 현재까지 경과된 시각 (GMT/UST 기준)을 실수형 초 단위로 최대한 정확하게 얻어온다.\n", - "print(currentTime)\n", - "print(type(currentTime))\n", - "print()\n", - "\n", - "totalSeconds = int(currentTime) # 1970년 1월 1일 0시 이후부터 현재시각까지의 정수형 초 값을 얻어온다.\n", - "print(\"totalSeconds -\", totalSeconds)\n", - "currentSecond = totalSeconds % 60 # 현재 시각의 초 값을 얻어온다.\n", - "\n", - "totalMinutes = totalSeconds // 60 # 전체 분 값을 계산한다. \n", - "print(\"totalMinutes -\", totalMinutes)\n", - "currentMinute = totalMinutes % 60 # 현재 시각의 분 값을 얻어온다.\n", - "\n", - "totalHours = totalMinutes // 60 # 전체 시 값을 계산한다.\n", - "print(\"totalHours -\", totalHours)\n", - "currentHours = totalHours % 24 # 현재 시각의 시 값을 얻어온다.\n", - "\n", - "print(\"현재 시각은\", currentHours, \":\", currentMinute, \":\", currentSecond, \"GMT 입니다.\")" + "L = [1, 6, 3, 8, 6, 2, 9]\n", + "L.sort()\n", + "print(L)\n", + "L.sort(reverse=True) # L.sort(reverse = 1)\n", + "print(L)\n", + "L.sort(reverse=False) # L.sort(reverse = 1)\n", + "print(L)" ] }, { diff --git a/python3.6/python09.ipynb b/python3.6/python09.ipynb index a56acd6..6bdac0f 100644 --- a/python3.6/python09.ipynb +++ b/python3.6/python09.ipynb @@ -399,7 +399,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -487,7 +487,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -739,7 +739,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -762,7 +762,7 @@ "s.remove(20)\n", "print(s)\n", "\n", - "s.extend([60, 70]) # 새로운 리스트([60, 70]를 기존 리스트 s 뒤에 병합\n", + "s.extend([60, 70]) # 새로운 리스트 [60, 70]를 기존 리스트 s 뒤에 병합\n", "print(s)\n", "\n", "s.append([60, 70]) # 주의: append로 새로운 리스트를 추가하면 하나의 자료 요소로서 추가\n", @@ -898,7 +898,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/python10.ipynb b/python3.6/python10.ipynb index c2fee9c..a8851ec 100644 --- a/python3.6/python10.ipynb +++ b/python3.6/python10.ipynb @@ -211,13 +211,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [중요] **Python3: sort의 인자인 key에 객체가 지닌 원소들 내에 키값을 지정하는 함수를 지정가능**\n", + "- [중요] **Python3: sort의 인자인 key에 객체가 지닌 원소들 내에 키값을 지정하는 함수 지정가능**\n", " - key 인자에 함수가 할당되어 있으면 각 리스트 원소에 대해 기본 비교함수 호출 직전에 key 함수를 먼저 호출한다. " ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -233,19 +233,19 @@ "#Python3 기준 예제\n", "L = [('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", "\n", - "def cmp_by_each_element(a):\n", + "def get_key_value(a):\n", " return a[1]\n", "\n", "L.sort()\n", "print('sorted by name:', L)\n", "\n", - "L.sort(key=cmp_by_each_element)\n", + "L.sort(key=get_key_value)\n", "print('sorted by experience:', L)" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -261,19 +261,19 @@ "#Python3 기준 예제\n", "S = ['loh', 'kim', 'jung']\n", "\n", - "def cmp_by_each_element(a):\n", + "def get_key_value(a):\n", " return a[1]\n", "\n", "S.sort()\n", "print('sorted by the first character:', S)\n", "\n", - "S.sort(key=cmp_by_each_element)\n", + "S.sort(key=get_key_value)\n", "print('sorted by the second character:', S)" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -413,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -432,7 +432,7 @@ "#Python3 기준 예제\n", "L = [ ('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", "\n", - "def cmp_by_each_element(a):\n", + "def get_key_value(a):\n", " return a[1]\n", "\n", "print(sorted(L))\n", @@ -440,13 +440,13 @@ "\n", "print()\n", "\n", - "print(sorted(L, key=cmp_by_each_element))\n", + "print(sorted(L, key=get_key_value))\n", "print(L)" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -465,7 +465,7 @@ "#Python3 기준 예제\n", "S = ['loh', 'kim', 'jung']\n", "\n", - "def cmp_by_each_element(a):\n", + "def get_key_value(a):\n", " return a[1]\n", "\n", "print(sorted(S))\n", @@ -473,7 +473,7 @@ "\n", "print()\n", "\n", - "print(sorted(S, key=cmp_by_each_element))\n", + "print(sorted(S, key=get_key_value))\n", "print(S)" ] }, @@ -922,7 +922,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From 3c15d51b1d9769dc3e48c0d1329dbad4bbad29b8 Mon Sep 17 00:00:00 2001 From: HwangGyuYoung Date: Thu, 10 Oct 2019 21:48:13 +0900 Subject: [PATCH 113/124] ... --- python3.6/assignment2019/assignment-3.ipynb | 120 ++++++++++++++++++-- 1 file changed, 111 insertions(+), 9 deletions(-) diff --git a/python3.6/assignment2019/assignment-3.ipynb b/python3.6/assignment2019/assignment-3.ipynb index 75f36e8..5b97d4e 100644 --- a/python3.6/assignment2019/assignment-3.ipynb +++ b/python3.6/assignment2019/assignment-3.ipynb @@ -6,11 +6,15 @@ "source": [ "# Assignment 3\n", "### [정보]\n", - "#### 1) Due Date: 2018년 10월 29일 (월), 23시 59분\n", - "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", - "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", - "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", - "#### 5) 문제 (ACM-ICPC 1문제 포함하여 총 9개)" + "#### 1) Due Date: 2019년 10월 25일 (금), 23시 59분\n", + "\n", + "#### 2) 제출방법: colab으로 작성된 notebook URL을 EL사이트에 제출 (EL 사이트의 본인 게시물에서 클릭이 되도록 함)\n", + "\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 colab notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell 등에 넣어 기입하시오.\n", + "\n", + "#### 4) 숙제이후 소감 작성: 모든 문제의 답을 작성한 이후에 현재까지 강의를 들은 후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "\n", + "#### 5) 반드시 본인 스스로 문제를 해결하세요~~~" ] }, { @@ -135,9 +139,107 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- [ACM-ICPC 문제 1673번] \n", - " - 치킨 쿠폰
\n", - " https://www.acmicpc.net/problem/1673" + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [문제]\n", + " - **length(X)**를 다음과 같이 정의한다 : 10진수로 표현된 X의 자릿수\n", + " - **Strange**라는 숫자를 아래과 같이 정의한다.
\n", + " - 음이 아닌 정수 중 자릿수가 1인 모든 숫자는 **Strange**이다.
\n", + " - **length(X)** > 1 인 숫자 X 는 다음 2가지를 만족하면 **Strange**이다.\n", + " - X는 **length(X)**로 정확히 나누어 떨어진다.\n", + " - X / length(X) 가 **strnage**이다.
\n", + "
\n", + " - 이 문제에서 숫자 하나가 주어질 때, 이 숫자가 Strange인지 판단하는 함수 isStrange(num)을 작성하시오.
\n", + " - isStrange(num) 함수가 재귀적인 함수가 되도록 작성해 보세요." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def isStrange(num):\n", + " '''\n", + " 함수 포맷 변경하지 마세요.\n", + " 재귀적인 함수는 함수 안에서 자기 자신 함수를 호출하는 것을 말합니다.\n", + " '''\n", + " return True # or False or isStrange(매개변수 숫자)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [예시]\n", + " ```\n", + " 1. num = 0 => True\n", + " 2. num = 56 => True\n", + " 3. num = 100 => False\n", + " 4. num = 7882602506492313600 => True\n", + " 5. num = 6012302549522098651 => False\n", + " ```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [문제]\n", + " - 1번 그룹, 2번 그룹, ... n번 그룹으로 번호가 매겨진 **총 n개의 그룹**이 존재하고, **ith** 그룹에는 임의의 팀원 수 **ai** 명이 있다.
\n", + " 하나의 버스 정류장이 있고, 버스는 오직 한 대만 운영한다. 버스는 버스 정류장에 도착하고 모든 그룹은 버스를 통해 여행하길 원한다.
\n", + " 하지만, 같은 그룹에 속한 팀원들은 분리되기를 원치 않는다. 그래서 그룹의 모든 팀원이 탈 수 있을 때 에만 그 그룹은 버스에 탑승한다.
\n", + " 또한, 이들은 그룹의 번호순으로 여행을 하길 원한다. 예를 들어, 3번 그룹은 1번 그룹과 2번 그룹이 여행을 한 뒤에 버스를 탈 수 있거나, 1번 그룹과 2번 그룹이 이미 버스에 탑승한 상태에 있을 때 동시에 버스를 탈 수 있다.
\n", + " 마지막으로, 버스는 빈 좌석이 없을 때 에만 여행을 떠난다.
\n", + "
\n", + " - 이 문제에서 각 그룹의 팀원 수가 리스트로 주어질 때, 가능한 모든 버스의 사이즈 **x**(x명의 사람들이 동시에 탈 수 있음)를 반환하는 함수 solve(a) 를 작성하시오.\n", + " - [주의] 반드시 계산 복잡도를 최대한 낮추세요. 아래 예시 3번을 실행했을 때 결과가 바로 나타날 수 있도록!!" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def solve(a):\n", + " '''\n", + " 함수 포맷 변경하지 마세요.\n", + " 필요시 solve(a)를 해결하기위한 다른 함수를 만들 수는 있음.\n", + " '''\n", + " return []" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [예시]\n", + " ```\n", + " 1. a = [1, 2, 1, 1, 1, 2, 1, 3] => [3, 4, 6, 12]\n", + " 2. a = [1, 1, 1, 1] => [1, 2, 4]\n", + " 3. a = [9999] * 10**5 => \n", + " [9999,19998,39996,49995,79992,99990,159984,199980,249975,319968,399960,499950,799920,999900,1249875,1599840,199980,2499750,3999600,4999500,6249375,7999200,9999000,12498750,19998000,24997500,31246875,39996000,49995000,62493750,99990000,124987500,199980000,249975000,499950000,999900000]\n", + " ```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" ] }, { @@ -200,7 +302,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From 83b2a26af3e7353c3f88cf8844acfd1ea5f6a077 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sat, 12 Oct 2019 21:42:24 +0900 Subject: [PATCH 114/124] ... --- python3.6/assignment2019/assignment-3.ipynb | 4 +- python3.6/python11.ipynb | 112 ++++++++++++++++---- python3.6/python12.ipynb | 84 ++++++++++++++- 3 files changed, 177 insertions(+), 23 deletions(-) diff --git a/python3.6/assignment2019/assignment-3.ipynb b/python3.6/assignment2019/assignment-3.ipynb index 5b97d4e..db411c2 100644 --- a/python3.6/assignment2019/assignment-3.ipynb +++ b/python3.6/assignment2019/assignment-3.ipynb @@ -6,7 +6,7 @@ "source": [ "# Assignment 3\n", "### [정보]\n", - "#### 1) Due Date: 2019년 10월 25일 (금), 23시 59분\n", + "#### 1) Due Date: 2019년 11월 01일 (금), 23시 59분\n", "\n", "#### 2) 제출방법: colab으로 작성된 notebook URL을 EL사이트에 제출 (EL 사이트의 본인 게시물에서 클릭이 되도록 함)\n", "\n", @@ -302,7 +302,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python11.ipynb b/python3.6/python11.ipynb index 66b661c..aac1de3 100644 --- a/python3.6/python11.ipynb +++ b/python3.6/python11.ipynb @@ -543,6 +543,61 @@ "print(d)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- E-learning에서 언급하지 않았던 집합 만드는 방법 --> 꼭 기억하세요~" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "{1, 2, 3, 4, 5}\n" + ] + } + ], + "source": [ + "e = {1, 2, 3, 4, 5}\n", + "print(type(e))\n", + "print(e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- set에는 동일한 자료가 중복해서 저장되지 않는다. 즉 중복이 자동으로 제거됨" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{1, 2, 3}\n", + "{1, 2, 3}\n" + ] + } + ], + "source": [ + "f = {1, 1, 2, 2, 3, 3}\n", + "g = set([1, 1, 2, 2, 3, 3])\n", + "print(f)\n", + "print(g)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -552,7 +607,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -562,7 +617,7 @@ "set()\n", "{1, 2, 3, 4, 5}\n", "{1, 2, 3, 4}\n", - "{'c', 'a', 'b'}\n", + "{'a', 'b', 'c'}\n", "{(4, 5, 6), (1, 2, 3)}\n" ] }, @@ -573,7 +628,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 문자열은 각 문자를 집합 원소로 지닌다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 각 튜플은 원소로 가질 수 있음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 문자열은 각 문자를 집합 원소로 지닌다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 각 튜플은 원소로 가질 수 있음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" ] } @@ -587,6 +642,27 @@ "print(set([[1, 2, 3], [4, 5, 6]])) # 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다." ] }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unhashable type: 'dict'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\"aaa\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\"bbb\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 변경 가능 자료인 사전도 집합의 원소가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'dict'" + ] + } + ], + "source": [ + "print(set([{1:\"aaa\"}, {2:\"bbb\"}])) # 변경 가능 자료인 사전도 집합의 원소가 될 수 없다." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -602,7 +678,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -616,7 +692,7 @@ } ], "source": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", + "A = set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "\n", "print(len(A)) # 집합의 원소의 수\n", "print(5 in A) # 멤버십 테스트\n", @@ -765,7 +841,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -780,7 +856,7 @@ } ], "source": [ - "A = set([1,2,3,4,5,6,7,8,9])\n", + "A = set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "D = A.copy()\n", "print(D)\n", "print()\n", @@ -935,7 +1011,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -948,7 +1024,7 @@ ], "source": [ "A = set([1, 2, 3, 4])\n", - "B = set([3,4, 5, 6])\n", + "B = set([3, 4, 5, 6])\n", "\n", "A.update(B) # A에 B 집합의 원소를 추가 시킴\n", "print(A)" @@ -956,7 +1032,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -974,7 +1050,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -992,7 +1068,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -1010,7 +1086,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -1028,7 +1104,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -1046,7 +1122,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 15, "metadata": { "scrolled": true }, @@ -1058,7 +1134,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 없는 원소를 제거하면 KeyError 발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 없는 원소를 제거하면 KeyError 발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mKeyError\u001b[0m: 10" ] } @@ -1069,7 +1145,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -1088,7 +1164,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 17, "metadata": {}, "outputs": [ { diff --git a/python3.6/python12.ipynb b/python3.6/python12.ipynb index 7b81537..e825296 100644 --- a/python3.6/python12.ipynb +++ b/python3.6/python12.ipynb @@ -184,7 +184,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 함수 이름은 사전의 키나 값으로 사용 가능함" + "- 함수 이름(함수 객체)은 사전의 키나 값으로 사용 가능함" ] }, { @@ -269,7 +269,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- zip(A, B): 두 개의 컨테이너/시퀀스 자료 A, B에 속한 원소들을 순서대로 쌍으로 묶은 튜플들을 반환할 수 있는 zip 객체 반환" + "- [중요] zip(A, B): 두 개의 컨테이너/시퀀스 자료 A, B에 속한 원소들을 순서대로 쌍으로 묶은 튜플들을 반환할 수 있는 zip 객체 반환" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- zip 객체를 사전으로 변환하기" ] }, { @@ -293,6 +300,70 @@ "print(dict(zip(keys, values)))" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'one': 1, 'two': 2, 'three': 3}\n" + ] + } + ], + "source": [ + "keys = ['one', 'two', 'three', 'four']\n", + "values = (1, 2, 3)\n", + "print(dict(zip(keys, values)))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'one': 1, 'two': 2, 'three': 3}\n" + ] + } + ], + "source": [ + "keys = ['one', 'two', 'three']\n", + "values = (1, 2, 3, 4)\n", + "print(dict(zip(keys, values)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- zip 객체를 리스트로 변환하기" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('one', 1), ('two', 2), ('three', 3)]\n" + ] + } + ], + "source": [ + "keys = ['one', 'two', 'three']\n", + "values = (1, 2, 3)\n", + "print(list(zip(keys, values)))" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -390,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -676,6 +747,13 @@ " print(k, v)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 위 리스트에서 각 튜플 원소의 두번째 값을 기준으로 정렬을 해보시오 (각자 실습)" + ] + }, { "cell_type": "markdown", "metadata": {}, From 342125f9f5e30ee734c24817ff446d53a5218563 Mon Sep 17 00:00:00 2001 From: HwangGyuYoung Date: Sat, 26 Oct 2019 14:14:41 +0900 Subject: [PATCH 115/124] ... --- python3.6/assignment2019/assignment-3.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python3.6/assignment2019/assignment-3.ipynb b/python3.6/assignment2019/assignment-3.ipynb index db411c2..6d921e8 100644 --- a/python3.6/assignment2019/assignment-3.ipynb +++ b/python3.6/assignment2019/assignment-3.ipynb @@ -231,7 +231,7 @@ " 1. a = [1, 2, 1, 1, 1, 2, 1, 3] => [3, 4, 6, 12]\n", " 2. a = [1, 1, 1, 1] => [1, 2, 4]\n", " 3. a = [9999] * 10**5 => \n", - " [9999,19998,39996,49995,79992,99990,159984,199980,249975,319968,399960,499950,799920,999900,1249875,1599840,199980,2499750,3999600,4999500,6249375,7999200,9999000,12498750,19998000,24997500,31246875,39996000,49995000,62493750,99990000,124987500,199980000,249975000,499950000,999900000]\n", + " [9999,19998,39996,49995,79992,99990,159984,199980,249975,319968,399960,499950,799920,999900,1249875,1599840,1999800,2499750,3999600,4999500,6249375,7999200,9999000,12498750,19998000,24997500,31246875,39996000,49995000,62493750,99990000,124987500,199980000,249975000,499950000,999900000]\n", " ```" ] }, @@ -302,7 +302,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From d8dc6f0c0e793f70c3a5b2ca21037b06156eb348 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 28 Oct 2019 11:53:20 +0900 Subject: [PATCH 116/124] ... --- python3.6/example/t1.txt | 4 + python3.6/output.txt | 0 python3.6/output_new.txt | 1 + python3.6/python13.ipynb | 182 ++++++++++++++--- python3.6/python14.ipynb | 411 +++++++++++++++++++++++++++------------ python3.6/t.txt | 1 - python3.6/t1.txt | 3 - 7 files changed, 445 insertions(+), 157 deletions(-) create mode 100644 python3.6/example/t1.txt mode change 100644 => 100755 python3.6/output.txt create mode 100644 python3.6/output_new.txt delete mode 100644 python3.6/t.txt delete mode 100644 python3.6/t1.txt diff --git a/python3.6/example/t1.txt b/python3.6/example/t1.txt new file mode 100644 index 0000000..de02ddc --- /dev/null +++ b/python3.6/example/t1.txt @@ -0,0 +1,4 @@ +Its power: Python developers typically report +they are able to develop applications in a half +to a tenth the amount of time it takes them to do +the same work in such languages as C. \ No newline at end of file diff --git a/python3.6/output.txt b/python3.6/output.txt old mode 100644 new mode 100755 diff --git a/python3.6/output_new.txt b/python3.6/output_new.txt new file mode 100644 index 0000000..665232c --- /dev/null +++ b/python3.6/output_new.txt @@ -0,0 +1 @@ +Hello koreatech! diff --git a/python3.6/python13.ipynb b/python3.6/python13.ipynb index caf74d9..086fe15 100644 --- a/python3.6/python13.ipynb +++ b/python3.6/python13.ipynb @@ -36,7 +36,7 @@ "|--------|-----------------------------|------------|\n", "| 'r' | 읽기 전용 (기본 모드) | 파일 객체를 읽기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다.|\n", "| 'w' | 쓰기 전용 | 새로운 파일을 쓰기 모드로 생성하거나 해당 파일이 이미 존재하면 내용을 모두 없에면서 쓰기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다. |\n", - "| 'a' | 파일 끝에 추가 | 이미 존재하는 파일을 쓰기 모드로 생성하거나 파일이 존재하지 않으면 새롭게 파일을 생성하면서 쓰기 모드로 생성하고, 파일 포인터를 파일의 마지막 위치에 놓는다. 그래서, 이후 작성되는 내용은 파일의 뒷 부분에 추가된다.|\n", + "| 'a' | 파일 끝에 추가 | 이미 존재하는 파일을 쓰기 모드로 생성하거나 파일이 존재하지 않으면 새롭게 파일을 생성하면서 쓰기 모드로 생성하고, 파일 포인터를 파일의 마지막 위치에 놓는다. 따라서, 이후 작성되는 내용은 파일의 뒷 부분에 추가된다.|\n", "\n", " - 이진 파일로 저장을 위해서는 아래 모드 사용\n", "\n", @@ -140,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -154,7 +154,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -199,7 +199,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -231,7 +231,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -269,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -302,7 +302,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -456,13 +456,17 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "Its power: Python developers typically report \n", + "they are able to develop applications in a half\n", + "to a tenth the amount of time it takes them to do\n", + "the same work in such languages as C.\n", "35\n" ] } @@ -470,6 +474,8 @@ "source": [ "f = open('t.txt')\n", "s = f.read()\n", + "print(s)\n", + "\n", "n = len(s.split())\n", "print(n)\n", "f.close()" @@ -484,7 +490,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -496,7 +502,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -516,7 +522,8 @@ "f.close()\n", "\n", "f = open('removeme.txt') # 파일 읽기\n", - "print(f.read())" + "print(f.read())\n", + "f.close()" ] }, { @@ -587,7 +594,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -596,6 +603,7 @@ "f = open('t.txt', 'w')\n", "stdout = sys.stdout # 표준 출력 저장해 두기\n", "sys.stdout = f # 파일 객체로 표준 출력 변경\n", + "\n", "print('Sample output')\n", "print('Good')\n", "print('Good')\n", @@ -605,7 +613,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -626,7 +634,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -635,7 +643,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -750,7 +758,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -760,7 +768,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mStringIO\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mStringIO\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mStringIO\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"abc\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseek\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mStringIO\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mStringIO\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mStringIO\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"abc\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseek\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'StringIO'" ] } @@ -789,7 +797,87 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "abcdef\n" + ] + } + ], + "source": [ + "import sys\n", + "from io import StringIO\n", + "\n", + "f = StringIO()\n", + "f.write(\"abc\")\n", + "f.write(\"def\")\n", + "q = f.read()\n", + "print(q)\n", + "\n", + "q1 = f.getvalue()\n", + "print(q1)\n", + "f.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "def f1():\n", + " s = \"\"\n", + " for i in range(10000, 1000000):\n", + " s += str(i)\n", + "\n", + "def f2():\n", + " s = StringIO()\n", + " for i in range(10000, 1000000):\n", + " s.write(str(i))" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "329 ms ± 12.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%timeit f1()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "266 ms ± 3.72 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%timeit f2()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -870,7 +958,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -889,21 +977,19 @@ "List = ['string', 1234, 0.2345]\n", "Tuple = (phone, List) # 리스트, 튜플, 사전의 복합 객체\n", "\n", - "f = open('pickle.txt', 'wb') # 파일 객체를 얻는다.\n", + "with open('pickle.txt', 'wb') as f: # 파일 객체를 얻는다.\n", + " pickle.dump(Tuple, f) # 파일로 출력(pickling), 복합 객체 출력 \n", "\n", - "pickle.dump(Tuple, f) # 파일로 출력(pickling), 복합 객체 출력 \n", - "f.close() \n", + "with open('pickle.txt', 'rb') as f: \n", + " x,y = pickle.load(f) # 파일에서 읽어오기. 튜플의 내용을 x, y에 받는다.\n", "\n", - "f = open('pickle.txt', 'rb') \n", - " \n", - "x,y = pickle.load(f) # 파일에서 읽어오기. 튜플의 내용을 x, y에 받는다.\n", "print(x) # 사전\n", "print(y) # 리스트" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -923,15 +1009,47 @@ "s = Simple() # 인스턴스 객체 생성\n", "s.count = 10 # 인스턴스 이름 공간에 변수 생성\n", "\n", - "f = open('pickle2.txt', 'wb')\n", - "pickle.dump(s, f) # 인스턴스 저장\n", - "f.close()\n", + "with open('pickle2.txt', 'wb') as f:\n", + " pickle.dump(s, f) # 인스턴스 저장\n", "\n", - "f = open('pickle2.txt', 'rb')\n", - "t = pickle.load(f) # 인스턴스 가져오기\n", + "with open('pickle2.txt', 'rb') as f:\n", + " t = pickle.load(f) # 인스턴스 가져오기\n", "print(t.count)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### [참고] 다양한 파일 처리 모드\n", + "\n", + "- open 내장 함수의 두번째 인자 mode 설명\n", + " - 두번째 인자 mode 생략시에는 읽기 전용(r) 모드로 설정\n", + " \n", + "| Mode | 간단 설명 | 자세한 설명\n", + "|--------|-----------------------------|------------|\n", + "| 'r' | 읽기 전용(기본 모드) | 파일 객체를 읽기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다.|\n", + "| 'w' | 쓰기 전용(기존 파일 내용 삭제) | 파일이 존재하지 않으면 새로운 파일을 쓰기 모드로 생성하고, 해당 파일이 이미 존재하면 내용을 모두 없에면서 쓰기 모드로 생성하고, 파일 포인터를 파일 처음 위치에 놓는다. |\n", + "| 'a' | 파일 끝에 추가(쓰기 전용) | 파일이 존재하지 않으면 새롭게 파일을 생성하면서 쓰기 모드로 생성하고, 해당 파일이 이미 존재하면 파일 객체을 쓰기 모드로 생성하면서 파일 포인터를 파일의 마지막 위치에 놓는다. 따라서, 이후 작성되는 내용은 파일의 뒷 부분에 추가됨.|\n", + "| 'r+' | 읽고 쓰기 | 파일 객체를 읽고 쓸 수 있도록 생성한다. 파일 포인터를 파일 처음 위치에 놓는다. |\n", + "| 'w+' | 읽고 쓰기(기존 파일 내용 삭제) | 파일 객체를 읽고 쓸 수 있도록 생성한다. 파일이 존재하지 않으면 새로운 파일을 생성하고, 해당 파일이 이미 존재하면 내용을 모두 없에면서 생성하고, 파일 포인터를 파일 처음 위치에 놓는다.|\n", + "| 'a+' | 읽고 쓰기(파일 끝에 추가) | 파일 객체를 읽고 쓸 수 있도록 생성한다. 파일이 존재하지 않으면 새롭게 파일을 생성하고, 해당 파일이 이미 존재하면 파일 객체을 생성하면서 파일 포인터를 파일의 마지막 위치에 놓는다 (그래서, 이후 작성되는 내용은 파일의 뒷 부분에 추가). |\n", + "\n", + "\n", + " - 이진 파일로 저장을 위해서는 아래 모드 사용\n", + "\n", + "| Mode | 간단 설명 |\n", + "|--------|-----------------------------|\n", + "| 'rb' | 이진 파일 읽기 전용 |\n", + "| 'wb' | 이진 파일 쓰기 전용(기존 파일 내용 삭제) |\n", + "| 'ab' | 이진 파일 끝에 추가(쓰기 전용) |\n", + "| 'rb+' | 이진 파일 읽고 쓰기 |\n", + "| 'wb+' | 이진 파일 읽고 쓰기(기존 파일 내용 삭제) |\n", + "| 'ab+' | 이진 파일 끝에 추가(읽기도 가능) |\n", + "\n", + "\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -956,7 +1074,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/python14.ipynb b/python3.6/python14.ipynb index 40a199f..8267395 100644 --- a/python3.6/python14.ipynb +++ b/python3.6/python14.ipynb @@ -38,9 +38,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "['.DS_Store', '.ipynb_checkpoints', 'assignment-1.ipynb', 'assignment-2.ipynb', 'assignment-3.ipynb', 'assignment-4.ipynb', 'assignment-5.ipynb', 'example', 'mymath.py', 'myweb_backup', 'output.txt', 'python01.ipynb', 'python02.ipynb', 'python03.ipynb', 'python04.ipynb', 'python05.ipynb', 'python06.ipynb', 'python07.ipynb', 'python08.ipynb', 'python09.ipynb', 'python10.ipynb', 'python11.ipynb', 'python12.ipynb', 'python13.ipynb', 'python14.ipynb', 'python15.ipynb', 'python16.ipynb', 'python17.ipynb', 'python18.ipynb', 'python19.ipynb', 'python20.ipynb', 'python21.ipynb', 'python22.ipynb', 'python23.ipynb', 'sample.txt', 'sample_new.txt', 'supplement-2016-09.ipynb', 't_new.txt', 'temp']\n", + "['assignment2019', 'python10.ipynb', 'python09.ipynb', 'mymath.py', 'assignment-5.ipynb', 'python12.ipynb', 'removeme.txt', 'python16.ipynb', 'supplement-2016-09.ipynb', 'assignment-1.ipynb', 'assignment-3.ipynb', 'python14.ipynb', 'Untitled.ipynb', 'assignment-4.ipynb', 't1.txt', 'python13.ipynb', 'python11.ipynb', 'python08.ipynb', 'pickle.txt', 'assignment-2.ipynb', 'python15.ipynb', '__pycache__', 'python17.ipynb', 'Speech', 'python02.ipynb', 't.txt', 'python19.ipynb', 'module_test.py', 'python04.ipynb', 'python20.ipynb', 'prname.ipynb', 'pickle2.txt', 'python22.ipynb', 'python06.ipynb', 'readme.txt', '.ipynb_checkpoints', 'python18.ipynb', 'python01.ipynb', 'python03.ipynb', 'python23.ipynb', 'output.txt', 'python07.ipynb', 'python05.ipynb', 'prname.py', 'python21.ipynb']\n", "\n", - "['.DS_Store', '.git', '.gitignore', '.ipynb_checkpoints', 'aaa', 'assignment-1.ipynb', 'assignment-2.ipynb', 'assignment-3.ipynb', 'assignment-4.ipynb', 'assignment-5.ipynb', 'example', 'files', 'images', 'module_test.py', 'music', 'mymath.ipynb', 'mymath.py', 'pickle.txt', 'pickle2.txt', 'python01.ipynb', 'python02.ipynb', 'python03.ipynb', 'python04.ipynb', 'python05.ipynb', 'python06.ipynb', 'python07.ipynb', 'python08.ipynb', 'python09.ipynb', 'python10.ipynb', 'python11.ipynb', 'python12.ipynb', 'python13.ipynb', 'python14.ipynb', 'python15.ipynb', 'python16.ipynb', 'python17.ipynb', 'python18.ipynb', 'python19.ipynb', 'python20.ipynb', 'python21.ipynb', 'python22.ipynb', 'python23.ipynb', 'python3.6', 'README.md', 'readme.txt', 'removeme.txt', 'sample.txt', 'sample_new.txt', 'Speech', 'supplement-2016-09.ipynb', 'supplement.ipynb', 't.txt', 't1.txt', 't2.txt', 'The Python Challenge.webloc', 'turtle_example.png', 'turtle_method-1.png', 'turtle_method-2.png', 'turtle_method-3.png', 'Untitled.ipynb', 'Untitled1.ipynb', 'Untitled2.ipynb', 'Untitled3.ipynb', '범이의 데이터 아키텍처 -- [Python] [개념을 잡아주는 프로그래밍 정석] 4.8 연습문제.webloc']\n" + "['python10.ipynb', 'music', 'python09.ipynb', 'mymath.py', 'assignment-5.ipynb', 'python12.ipynb', 'Untitled1.ipynb', 'python16.ipynb', 'supplement-2016-09.ipynb', 'assignment-1.ipynb', 'assignment-3.ipynb', 'Untitled3.ipynb', 'python14.ipynb', 'images', 'assignment-4.ipynb', 'python13.ipynb', 'python11.ipynb', 'python08.ipynb', 'The Python Challenge.webloc', 'assignment-2.ipynb', 'turtle_method-3.png', 'turtle_method-2.png', 'python15.ipynb', 'Untitled2.ipynb', 'python3.6', 'python17.ipynb', 'turtle_method-1.png', 'Speech', 'aaa', 'python02.ipynb', 'README.md', 'python19.ipynb', '.gitignore', 'module_test.py', 'python04.ipynb', 'python20.ipynb', 'python22.ipynb', 'files', 'python06.ipynb', 'supplement.ipynb', '.ipynb_checkpoints', 'python18.ipynb', 'python01.ipynb', 'python03.ipynb', '.git', 'python23.ipynb', '과제3-모범답안.ipynb', 'python07.ipynb', 'python05.ipynb', 'turtle_example.png', '범이의 데이터 아키텍처 -- [Python] [개념을 잡아주는 프로그래밍 정석] 4.8 연습문제.webloc', 'mymath.ipynb', 'python21.ipynb']\n" ] } ], @@ -69,52 +69,58 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - ".DS_Store :Regular file\n", - ".ipynb_checkpoints :Directory\n", + "assignment2019 :Directory\n", + "python10.ipynb :Regular file\n", + "python09.ipynb :Regular file\n", + "mymath.py :Regular file\n", + "assignment-5.ipynb :Regular file\n", + "python12.ipynb :Regular file\n", + "removeme.txt :Regular file\n", + "python16.ipynb :Regular file\n", + "supplement-2016-09.ipynb :Regular file\n", "assignment-1.ipynb :Regular file\n", - "assignment-2.ipynb :Regular file\n", "assignment-3.ipynb :Regular file\n", + "python14.ipynb :Regular file\n", + "Untitled.ipynb :Regular file\n", "assignment-4.ipynb :Regular file\n", - "assignment-5.ipynb :Regular file\n", - "example :Directory\n", - "mymath.py :Regular file\n", - "myweb_backup :Directory\n", - "output.txt :Regular file\n", - "python01.ipynb :Regular file\n", - "python02.ipynb :Regular file\n", - "python03.ipynb :Regular file\n", - "python04.ipynb :Regular file\n", - "python05.ipynb :Regular file\n", - "python06.ipynb :Regular file\n", - "python07.ipynb :Regular file\n", - "python08.ipynb :Regular file\n", - "python09.ipynb :Regular file\n", - "python10.ipynb :Regular file\n", - "python11.ipynb :Regular file\n", - "python12.ipynb :Regular file\n", + "t1.txt :Regular file\n", "python13.ipynb :Regular file\n", - "python14.ipynb :Regular file\n", + "python11.ipynb :Regular file\n", + "python08.ipynb :Regular file\n", + "pickle.txt :Regular file\n", + "assignment-2.ipynb :Regular file\n", "python15.ipynb :Regular file\n", - "python16.ipynb :Regular file\n", + "__pycache__ :Directory\n", "python17.ipynb :Regular file\n", - "python18.ipynb :Regular file\n", + "Speech :Directory\n", + "python02.ipynb :Regular file\n", + "t.txt :Regular file\n", "python19.ipynb :Regular file\n", + "module_test.py :Regular file\n", + "python04.ipynb :Regular file\n", "python20.ipynb :Regular file\n", - "python21.ipynb :Regular file\n", + "prname.ipynb :Regular file\n", + "pickle2.txt :Regular file\n", "python22.ipynb :Regular file\n", + "python06.ipynb :Regular file\n", + "readme.txt :Regular file\n", + ".ipynb_checkpoints :Directory\n", + "python18.ipynb :Regular file\n", + "python01.ipynb :Regular file\n", + "python03.ipynb :Regular file\n", "python23.ipynb :Regular file\n", - "sample.txt :Regular file\n", - "sample_new.txt :Regular file\n", - "supplement-2016-09.ipynb :Regular file\n", - "t_new.txt :Regular file\n", - "temp :Directory\n" + "output.txt :Regular file\n", + "python07.ipynb :Regular file\n", + "python05.ipynb :Regular file\n", + "prname.py :Regular file\n", + "python21.ipynb :Regular file\n" ] } ], @@ -122,10 +128,13 @@ "import os\n", "def filetype(fpath):\n", " print(fpath, ':', end=\"\")\n", + " \n", " if os.path.isfile(fpath):\n", " print('Regular file')\n", + " \n", " if os.path.isdir(fpath):\n", " print('Directory')\n", + "\n", " if os.path.islink(fpath):\n", " print('Symbolic link')\n", " \n", @@ -150,52 +159,58 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - ".DS_Store :Exists - RW\n", - ".ipynb_checkpoints :Exists - RWX\n", + "assignment2019 :Exists - RWX\n", + "python10.ipynb :Exists - RW\n", + "python09.ipynb :Exists - RW\n", + "mymath.py :Exists - RW\n", + "assignment-5.ipynb :Exists - RW\n", + "python12.ipynb :Exists - RW\n", + "removeme.txt :Exists - RW\n", + "python16.ipynb :Exists - RW\n", + "supplement-2016-09.ipynb :Exists - RW\n", "assignment-1.ipynb :Exists - RW\n", - "assignment-2.ipynb :Exists - RW\n", "assignment-3.ipynb :Exists - RW\n", + "python14.ipynb :Exists - RW\n", + "Untitled.ipynb :Exists - RW\n", "assignment-4.ipynb :Exists - RW\n", - "assignment-5.ipynb :Exists - RW\n", - "example :Exists - RWX\n", - "mymath.py :Exists - RW\n", - "myweb_backup :Exists - RWX\n", - "output.txt :Exists - RW\n", - "python01.ipynb :Exists - RW\n", - "python02.ipynb :Exists - RW\n", - "python03.ipynb :Exists - RW\n", - "python04.ipynb :Exists - RW\n", - "python05.ipynb :Exists - RW\n", - "python06.ipynb :Exists - RW\n", - "python07.ipynb :Exists - RW\n", - "python08.ipynb :Exists - RW\n", - "python09.ipynb :Exists - RW\n", - "python10.ipynb :Exists - RW\n", - "python11.ipynb :Exists - RW\n", - "python12.ipynb :Exists - RW\n", + "t1.txt :Exists - RW\n", "python13.ipynb :Exists - RW\n", - "python14.ipynb :Exists - RW\n", + "python11.ipynb :Exists - RW\n", + "python08.ipynb :Exists - RW\n", + "pickle.txt :Exists - RW\n", + "assignment-2.ipynb :Exists - RW\n", "python15.ipynb :Exists - RW\n", - "python16.ipynb :Exists - RW\n", + "__pycache__ :Exists - RWX\n", "python17.ipynb :Exists - RW\n", - "python18.ipynb :Exists - RW\n", + "Speech :Exists - RWX\n", + "python02.ipynb :Exists - RW\n", + "t.txt :Exists - RW\n", "python19.ipynb :Exists - RW\n", + "module_test.py :Exists - RW\n", + "python04.ipynb :Exists - RW\n", "python20.ipynb :Exists - RW\n", - "python21.ipynb :Exists - RW\n", + "prname.ipynb :Exists - RW\n", + "pickle2.txt :Exists - RW\n", "python22.ipynb :Exists - RW\n", + "python06.ipynb :Exists - RW\n", + "readme.txt :Exists - RW\n", + ".ipynb_checkpoints :Exists - RWX\n", + "python18.ipynb :Exists - RW\n", + "python01.ipynb :Exists - RW\n", + "python03.ipynb :Exists - RW\n", "python23.ipynb :Exists - RW\n", - "sample.txt :Exists - RW\n", - "sample_new.txt :Exists - RW\n", - "supplement-2016-09.ipynb :Exists - RW\n", - "t_new.txt :Exists - RW\n", - "temp :Exists - RWX\n" + "output.txt :Exists - RW\n", + "python07.ipynb :Exists - RW\n", + "python05.ipynb :Exists - RW\n", + "prname.py :Exists - RW\n", + "python21.ipynb :Exists - RW\n" ] } ], @@ -203,14 +218,18 @@ "import os\n", "def fileaccess(fpath):\n", " print(fpath, ':', end=\"\")\n", + " \n", " if os.access(fpath, os.F_OK): \n", " print('Exists - ', end=\"\")\n", " else: \n", " return\n", + " \n", " if os.access(fpath, os.R_OK): \n", " print('R', end=\"\")\n", + " \n", " if os.access(fpath, os.W_OK): \n", " print('W', end=\"\")\n", + " \n", " if os.access(fpath, os.X_OK): \n", " print('X', end=\"\")\n", " print()\n", @@ -230,11 +249,21 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-rwxrwxrwx 1 yhhan staff 17 10 27 22:40 \u001b[31moutput.txt\u001b[m\u001b[m*\r\n" + ] + } + ], "source": [ - "os.chmod('sample.txt', 777) # 리눅스에서의 실행 예" + "os.chmod('output.txt', 0o777) # 리눅스에서의 실행 예\n", + "\n", + "%ls -al output.txt" ] }, { @@ -248,23 +277,22 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, + "execution_count": 51, + "metadata": {}, "outputs": [], "source": [ "s = \"\"\"Its power: Python developers typically report \n", "they are able to develop applications in a half\n", "to a tenth the amount of time it takes them to do\n", "the same work in such languages as C.\"\"\"\n", + "\n", "with open('t.txt', 'w') as f:\n", " f.write(s) # 문자열을 파일에 기록" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 52, "metadata": {}, "outputs": [ { @@ -293,7 +321,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 53, "metadata": {}, "outputs": [], "source": [ @@ -302,7 +330,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 54, "metadata": {}, "outputs": [ { @@ -314,8 +342,8 @@ } ], "source": [ - "os.rename('t1.txt', 'example/t1.txt') # 현재 작업 디렉토리의 t1.txt를 example에 t1.txt이름으로 옮긴다.\n", - "print(os.access('example/t1.txt', os.F_OK))" + "os.rename('t1.txt', './example/t1.txt') # 현재 작업 디렉토리의 t1.txt를 example에 t1.txt이름으로 옮긴다.\n", + "print(os.access('./example/t1.txt', os.F_OK))" ] }, { @@ -329,7 +357,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 55, "metadata": {}, "outputs": [ { @@ -342,8 +370,8 @@ ], "source": [ "import shutil\n", - "shutil.copyfile('sample.txt', 'sample_new.txt')\n", - "print(os.access('sample_new.txt', os.F_OK))" + "shutil.copyfile('output.txt', 'output_new.txt')\n", + "print(os.access('output_new.txt', os.F_OK))" ] }, { @@ -357,14 +385,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 1) 상대 경로를 절대 경로로 변환하기\n", + "#### 1) 상대 경로를 절대 경로로 변환하기 [중요]\n", "- os.path.abspath(상대경로)\n", " - 실제 파일 존재와는 무관하게 절대경로로 변경함" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 66, "metadata": {}, "outputs": [ { @@ -384,21 +412,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 2) 주어진 경로의 파일이 존재하는지 확인\n", + "#### 2) 주어진 경로의 파일이 존재하는지 확인 [중요]\n", "- os.path.exists(filepath)" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "True\n", - "True\n", + "False\n", + "False\n", "False\n" ] } @@ -419,7 +447,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 68, "metadata": {}, "outputs": [ { @@ -445,7 +473,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 69, "metadata": {}, "outputs": [ { @@ -476,7 +504,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 70, "metadata": {}, "outputs": [ { @@ -504,7 +532,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 71, "metadata": {}, "outputs": [ { @@ -528,7 +556,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 72, "metadata": {}, "outputs": [ { @@ -552,7 +580,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 73, "metadata": {}, "outputs": [ { @@ -567,6 +595,63 @@ "print(os.path.splitext(f))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1-7 경로명 생성하기 [중요]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Linux and Mac" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning/t.txt\n" + ] + } + ], + "source": [ + "path = os.path.join(\"/\", \"Users\", \"yhhan\", \"git\", \"python-e-learning\", \"t.txt\")\n", + "print(path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Windows" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "c:\\/Users/yhhan\n" + ] + } + ], + "source": [ + "path = os.path.join(\"c:\\\\\", \"Users\", \"yhhan\")\n", + "print(path)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -617,7 +702,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 104, "metadata": {}, "outputs": [ { @@ -629,7 +714,10 @@ } ], "source": [ - "os.chdir('/Users/yhhan/Public/')\n", + "path = os.path.join(\"/\", \"Users\", \"yhhan\", \"Public\")\n", + "#path = os.path.join(\"c:\\\\\", \"Users\", \"yhhan\", \"Public\") \n", + "\n", + "os.chdir(path)\n", "print(os.getcwd())" ] }, @@ -642,16 +730,19 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 109, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "total 0\n", + "drwxr-xr-x 2 yhhan staff 64 10 27 23:39 \u001b[34m.\u001b[m\u001b[m/\n", + "drwxr-xr-x+ 6 yhhan staff 192 10 27 23:39 \u001b[34m..\u001b[m\u001b[m/\n", "True\n", "True\n", - "True\n" + "False\n" ] } ], @@ -659,15 +750,31 @@ "import os\n", "\n", "os.mkdir('temp') # 0755 기본 모드(rwxr-xr-x)로 만들어짐\n", + "%ls -al temp\n", "# os.mkdir('temp2', 0700) # 0700 모드(rwx------)로 만들어짐\n", + "\n", "os.mkdir('temp2', 0o700)\n", - "os.makedirs('temp/level1/level2') #0755 기본 모드, 중간에 필요한 디렉토리도 모두생성\n", + "os.makedirs('temp2/level1/level2') #0755 기본 모드, 중간에 필요한 디렉토리도 모두생성\n", "\n", "print(os.access('/Users/yhhan/Public/temp', os.F_OK))\n", "print(os.access('/Users/yhhan/Public/temp2', os.F_OK))\n", "print(os.access('/Users/yhhan/Public/temp/level1/level2', os.F_OK))" ] }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.mkdir('temp3', 0o700)\n", + "\n", + "path = os.path.join(\"temp3\", \"level1\", \"level2\")\n", + "os.makedirs(path) #0755 기본 모드, 중간에 필요한 디렉토리도 모두생성" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -677,34 +784,32 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, + "execution_count": 111, + "metadata": {}, "outputs": [], "source": [ - "os.rmdir('temp2') #디렉토리에 내용이 없을 때 삭제가능" + "os.rmdir('temp') #디렉토리에 내용이 없을 때 삭제가능" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 112, "metadata": {}, "outputs": [ { "ename": "OSError", - "evalue": "[Errno 66] Directory not empty: 'temp'", + "evalue": "[Errno 66] Directory not empty: 'temp3'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrmdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#디렉토리에 다른 파일이 있으면 삭제할 수 없음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mOSError\u001b[0m: [Errno 66] Directory not empty: 'temp'" + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrmdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'temp3'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#디렉토리에 다른 파일이 있으면 삭제할 수 없음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mOSError\u001b[0m: [Errno 66] Directory not empty: 'temp3'" ] } ], "source": [ - "os.rmdir('temp') #디렉토리에 다른 파일이 있으면 삭제할 수 없음" + "os.rmdir('temp3') #디렉토리에 다른 파일이 있으면 삭제할 수 없음" ] }, { @@ -719,13 +824,11 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": true - }, + "execution_count": 113, + "metadata": {}, "outputs": [], "source": [ - "os.removedirs('temp/level1/level2')" + "os.removedirs('temp2/level1/level2')" ] }, { @@ -740,14 +843,13 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 114, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "True\n", "True\n", "True\n" ] @@ -757,23 +859,20 @@ "import os\n", "\n", "os.mkdir('temp') # 0755 기본 모드(rwxr-xr-x)로 만들어짐\n", - "# os.mkdir('temp2', 0700) # 0700 모드(rwx------)로 만들어짐\n", - "os.mkdir('temp2', 0o700)\n", "os.makedirs('temp/level1/level2') #0755 기본 모드, 중간에 필요한 디렉토리도 모두생성\n", "\n", "print(os.access('/Users/yhhan/Public/temp', os.F_OK))\n", - "print(os.access('/Users/yhhan/Public/temp2', os.F_OK))\n", "print(os.access('/Users/yhhan/Public/temp/level1/level2', os.F_OK))" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "import shutil\n", - "shutil.rmtree('temp')" + "shutil.rmtree('temp3')" ] }, { @@ -787,7 +886,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 118, "metadata": {}, "outputs": [ { @@ -796,14 +895,12 @@ "'myweb_backup'" ] }, - "execution_count": 33, + "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "os.mkdir('temp') \n", - "# os.mkdir('temp/temp2', 0700)\n", "os.mkdir('temp/temp2', 0o700)\n", "shutil.copytree('temp', 'myweb_backup')" ] @@ -829,6 +926,78 @@ "- 아래 예는 현재 디렉토리부터 모든 하위 디렉토리 내에 존재하는 모든 txt 파일을 삭제하는 프로그램" ] }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/Public\n" + ] + } + ], + "source": [ + "path = os.path.join(\"/\", \"Users\", \"yhhan\", \"Public\")\n", + "#path = os.path.join(\"c:\\\\\", \"Users\", \"yhhan\", \"Public\") \n", + "\n", + "os.chdir(path)\n", + "print(os.getcwd())" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/Public/temp\n", + "\n", + "removing /Users/yhhan/Public/temp/t.txt\n", + "removing /Users/yhhan/Public/temp/level1/t.txt\n", + "removing /Users/yhhan/Public/temp/level1/level2/t.txt\n", + "\n", + "/Users/yhhan/Public\n" + ] + } + ], + "source": [ + "if os.path.exists('temp'):\n", + " shutil.rmtree('temp')\n", + "\n", + "path = os.path.join(\"temp\", \"level1\", \"level2\")\n", + "os.makedirs(path)\n", + "\n", + "with open(os.path.join(\"temp\", \"t.txt\"), \"w\") as f:\n", + " f.write(\"aaa\")\n", + " \n", + "with open(os.path.join(\"temp\", \"level1\", \"t.txt\"), \"w\") as f:\n", + " f.write(\"aaa\")\n", + " \n", + "with open(os.path.join(\"temp\", \"level1\", \"level2\", \"t.txt\"), \"w\") as f:\n", + " f.write(\"aaa\")\n", + "\n", + "path = os.path.join(\"temp\")\n", + "os.chdir(path)\n", + "print(os.getcwd())\n", + "print()\n", + "for path, subdirs, files in os.walk(os.getcwd()):\n", + " for fname in files:\n", + " if fname.endswith('.txt'):\n", + " fullpath = os.path.join(path, fname)\n", + " print('removing', fullpath)\n", + " os.remove(fullpath)\n", + "\n", + "print()\n", + "os.chdir(\"..\")\n", + "print(os.getcwd())" + ] + }, { "cell_type": "code", "execution_count": 35, @@ -895,7 +1064,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/t.txt b/python3.6/t.txt deleted file mode 100644 index 6cf6ad7..0000000 --- a/python3.6/t.txt +++ /dev/null @@ -1 +0,0 @@ -spam string diff --git a/python3.6/t1.txt b/python3.6/t1.txt deleted file mode 100644 index 272b2e4..0000000 --- a/python3.6/t1.txt +++ /dev/null @@ -1,3 +0,0 @@ -first line -second line -third line \ No newline at end of file From cb89669670e7ba9f1b42202ac4eadcb286798d29 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sun, 3 Nov 2019 22:31:29 +0900 Subject: [PATCH 117/124] ... --- python3.6/python15.ipynb | 435 +++++++++++++++++++++++++++++++++++++-- python3.6/python16.ipynb | 146 +++++++------ 2 files changed, 493 insertions(+), 88 deletions(-) diff --git a/python3.6/python15.ipynb b/python3.6/python15.ipynb index 29c5111..8d40a0e 100644 --- a/python3.6/python15.ipynb +++ b/python3.6/python15.ipynb @@ -52,7 +52,7 @@ ], "source": [ "def add(a, b):\n", - " return a+b\n", + " return a + b\n", "\n", "print(add(1, 2))\n", "print()\n", @@ -923,14 +923,55 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2-3 가변 인수 리스트\n", - "- 함수 정의시에 일반적인 인수 선언 뒤에 *var 형식의 인수로 가변 인수를 선언할 수 있음\n", - " - var에는 함수 호출시 넣어주는 인수 값들 중 일반 인수에 할당되는 값을 제외한 나머지 값들을 지닌 튜플 객체가 할당된다." + "### 2-3 가변 인수 리스트" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 정의시에 일반적인 인수 선언 뒤에 *args 형식의 인수로 가변 인수를 선언할 수 있음\n", + "- The special syntax *args in function definitions in python is used to pass a variable number of arguments to a function." ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ('Hello', 'Welcome', 'to', 'GeeksforGeeks')\n", + "\n", + "Hello\n", + "Welcome\n", + "to\n", + "GeeksforGeeks\n" + ] + } + ], + "source": [ + "def myFun(*args):\n", + " print(type(args), args)\n", + " print()\n", + " for arg in args:\n", + " print(arg) \n", + " \n", + "myFun('Hello', 'Welcome', 'to', 'GeeksforGeeks')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 함수 호출시 넣어주는 인수 값들 중 일반 인수에 할당되는 값을 제외한 나머지 값들만을 지닌 튜플 객체가 할당된다." + ] + }, + { + "cell_type": "code", + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -944,12 +985,12 @@ } ], "source": [ - "def varg(a, *arg):\n", - " print(a, arg)\n", + "def varg(a, *args):\n", + " print(a, args)\n", "\n", "varg(1)\n", - "varg(2,3)\n", - "varg(2,3,4,5,6)" + "varg(2, 3)\n", + "varg(2, 3, 4, 5, 6)" ] }, { @@ -961,7 +1002,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -979,6 +1020,63 @@ "printf(\"I've spent %d days and %d night to do this\", 6, 5)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- The special syntax ****kwargs** in function definitions in python is used to pass a keyworded, variable-length argument list. " + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " {'first': 'Geeks', 'mid': 'for', 'last': 'Geeks'}\n", + "\n", + "first: Geeks\n", + "mid: for\n", + "last: Geeks\n" + ] + } + ], + "source": [ + "def myFun(**kwargs):\n", + " print(type(kwargs), kwargs)\n", + " print()\n", + " for key, value in kwargs.items(): \n", + " print(\"{0}: {1}\".format(key, value)) \n", + " \n", + "myFun(first ='Geeks', mid ='for', last='Geeks') " + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hi - first: Geeks\n", + "Hi - mid: for\n", + "Hi - last: Geeks\n" + ] + } + ], + "source": [ + "def myFun(arg1, **kwargs): \n", + " for key, value in kwargs.items(): \n", + " print (\"{0} - {1}: {2}\".format(arg1, key, value)) \n", + " \n", + "myFun(\"Hi\", first ='Geeks', mid ='for', last='Geeks') " + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -989,7 +1087,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -1002,7 +1100,7 @@ ], "source": [ "def h(a, b, c):\n", - " print(a,b,c)\n", + " print(a, b, c)\n", " \n", "args = (1, 2, 3)\n", "h(*args)" @@ -1017,22 +1115,331 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "aa bb cc\n", "1 2 3\n" ] } ], "source": [ + "def h(a, b, c):\n", + " print(a, b, c)\n", + " \n", + "dargs = {'aa':1, 'bb':2, 'cc':3}\n", + "h(*dargs)\n", + "\n", "dargs = {'a':1, 'b':2, 'c':3}\n", "h(**dargs)" ] }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "arg1: Geeks\n", + "arg2: for\n", + "arg3: Geeks\n", + "arg1: Geeks\n", + "arg2: for\n", + "arg3: Geeks\n" + ] + } + ], + "source": [ + "def myFun(arg1, arg2, arg3): \n", + " print(\"arg1:\", arg1) \n", + " print(\"arg2:\", arg2) \n", + " print(\"arg3:\", arg3) \n", + " \n", + "args = (\"Geeks\", \"for\", \"Geeks\") \n", + "myFun(*args) \n", + " \n", + "kwargs = {\"arg1\" : \"Geeks\", \"arg2\" : \"for\", \"arg3\" : \"Geeks\"} \n", + "myFun(**kwargs)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a 1\n", + "b 2\n", + "c 3\n", + "d 4\n" + ] + } + ], + "source": [ + "def function(**arg):\n", + " for i in arg:\n", + " print (i, arg[i])\n", + "\n", + "function(a=1, b=2, c=3, d=4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Asterisks in Python: what they are and how to use them\n", + " - https://treyhunner.com/2018/10/asterisks-in-python-what-they-are-and-how-to-use-them/" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "[2, 3, 4]\n" + ] + } + ], + "source": [ + "a, *b = [1, 2, 3, 4]\n", + "print(a)\n", + "print(b)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 (2, 3, 4)\n" + ] + } + ], + "source": [ + "def func(a, *b):\n", + " print(a, b)\n", + " \n", + "func(1, 2, 3, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 1, 3, 4, 7, 11, 18]\n" + ] + } + ], + "source": [ + "numbers = [2, 1, 3, 4, 7]\n", + "more_numbers = [*numbers, 11, 18]\n", + "print(more_numbers)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 1 3 4 7 11 18\n" + ] + } + ], + "source": [ + "print(*more_numbers)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "lemon pear watermelon tomato\n", + "lemon pear watermelon tomato\n" + ] + } + ], + "source": [ + "fruits = ['lemon', 'pear', 'watermelon', 'tomato']\n", + "print(fruits[0], fruits[1], fruits[2], fruits[3])\n", + "\n", + "print(*fruits)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n" + ] + } + ], + "source": [ + "def transpose_list(list_of_lists):\n", + " return [list(row) for row in zip(*list_of_lists)]\n", + "\n", + "t_l = transpose_list([[1, 4, 7], [2, 5, 8], [3, 6, 9]])\n", + "print(t_l)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2020-01-01.txt\n" + ] + } + ], + "source": [ + "date_info = {'year': \"2020\", 'month': \"01\", 'day': \"01\"}\n", + "\n", + "filename = \"{year}-{month}-{day}.txt\".format(**date_info)\n", + "\n", + "print(filename)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 1 3 4 7 lemon pear watermelon tomato\n" + ] + } + ], + "source": [ + "fruits = ['lemon', 'pear', 'watermelon', 'tomato']\n", + "numbers = [2, 1, 3, 4, 7]\n", + "print(*numbers, *fruits)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2020-01-01-Beethoven-Symphony No 5.txt\n" + ] + } + ], + "source": [ + "date_info = {'year': \"2020\", 'month': \"01\", 'day': \"01\"}\n", + "track_info = {'artist': \"Beethoven\", 'title': 'Symphony No 5'}\n", + "\n", + "filename = \"{year}-{month}-{day}-{artist}-{title}.txt\".format(\n", + " **date_info,\n", + " **track_info,\n", + ")\n", + "\n", + "print(filename)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " (20,)\n", + "17\n", + " (6, 6)\n", + "10\n", + " (6, 6, 6)\n", + "12\n" + ] + } + ], + "source": [ + "from random import randint\n", + "\n", + "def roll(*dice):\n", + " print(type(dice), dice)\n", + " return sum([randint(1, die) for die in dice])\n", + "\n", + "print(roll(20))\n", + "\n", + "print(roll(6, 6))\n", + "\n", + "print(roll(6, 6, 6))" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "
\n", + "\n" + ] + } + ], + "source": [ + "def tag(tag_name, **attributes):\n", + " attribute_list = [\"{0}='{1}'\".format(name, value) for name, value in attributes.items()]\n", + " return \"<{0} \".format(tag_name) + ' '.join(attribute_list) + \">\"\n", + "\n", + "print(tag('a', href=\"http://treyhunner.com\"))\n", + "\n", + "print(tag('img', height=20, width=40, src=\"face.jpg\"))" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1057,7 +1464,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/python16.ipynb b/python3.6/python16.ipynb index 7cee74f..0fb1a23 100644 --- a/python3.6/python16.ipynb +++ b/python3.6/python16.ipynb @@ -119,7 +119,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -134,10 +134,11 @@ ], "source": [ "vargs = lambda x, *args: args\n", - "print(vargs(1,2,3,4,5))\n", + "print(vargs(1, 2, 3, 4, 5))\n", + "\n", "# 이전 jupyter notebook 참고; \"넣어주는 인수 값들 중 일반 인수에 할당되는 값을 제외한 나머지 값들을 지닌 튜플 객체가 할당된다.\"\n", "print(type(vargs))\n", - "print(type(vargs(1,2,3,4,5)))" + "print(type(vargs(1, 2, 3, 4, 5)))" ] }, { @@ -149,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -163,10 +164,10 @@ ], "source": [ "def f1(x):\n", - " return x*x + 3*x - 10\n", + " return x * x + 3 * x - 10\n", "\n", "def f2(x):\n", - " return x*x*x\n", + " return x * x * x\n", "\n", "def g(func):\n", " return [func(x) for x in range(-10, 10)]\n", @@ -177,7 +178,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -193,8 +194,8 @@ "def g(func):\n", " return [func(x) for x in range(-10, 10)]\n", "\n", - "print(g(lambda x: x*x + 3*x - 10))\n", - "print(g(lambda x: x*x*x))" + "print(g(lambda x: x * x + 3 * x - 10))\n", + "print(g(lambda x: x * x * x))" ] }, { @@ -206,7 +207,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -218,10 +219,11 @@ "2. mul\n", "3. div\n", "4. quit\n", - "Select menu:0\n", - "First operand:20\n", - "Second operand:30\n", - "Result = 50\n", + "Select menu:1\n", + "First operand:10\n", + "Second operand:2\n", + "Result = 8\n", + "\n", "0. add\n", "1. sub\n", "2. mul\n", @@ -231,6 +233,7 @@ "First operand:10\n", "Second operand:10\n", "Result = 100\n", + "\n", "0. add\n", "1. sub\n", "2. mul\n", @@ -243,10 +246,10 @@ "source": [ "# 더하기, 빼기, 곱하기, 나누기에 해당하는 람다 함수 리스트 정의\n", "func_list = [\n", - " lambda x, y: int(x) + int(y), \n", - " lambda x, y: int(x) - int(y), \n", - " lambda x, y: int(x) * int(y), \n", - " lambda x, y: int(x) / int(y)\n", + " lambda x, y: x + y, \n", + " lambda x, y: x - y, \n", + " lambda x, y: x * y, \n", + " lambda x, y: x / y\n", "]\n", "\n", "def menu():\n", @@ -259,13 +262,13 @@ "\n", "while 1:\n", " sel = menu() \n", - " if sel < 0 or sel > len(func): \n", + " if sel < 0 or sel > len(func_list): \n", " continue\n", - " if sel == len(func): \n", + " if sel == len(func_list): \n", " break\n", " x = int(input('First operand:'))\n", " y = int(input('Second operand:')) \n", - " print('Result =', func_list[sel](x,y))" + " print('Result =', func_list[sel](x,y), end=\"\\n\\n\")" ] }, { @@ -316,7 +319,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -333,8 +336,7 @@ "\n", "X = [1, 2, 3, 4, 5]\n", "Y = list(map(f, X)) \n", - "#기존: Y = map(f, X)\n", - "# X seq 자료형이 리스트라면, list()를 써주어야 한다.\n", + "\n", "print(Y)" ] }, @@ -347,7 +349,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -363,6 +365,7 @@ " return x * x\n", "\n", "X = [1, 2, 3, 4, 5]\n", + "\n", "Y = []\n", "for x in X:\n", " y = f(x)\n", @@ -379,7 +382,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -404,7 +407,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -429,7 +432,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -458,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -482,7 +485,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -510,7 +513,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -534,7 +537,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -558,7 +561,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -597,7 +600,7 @@ "metadata": {}, "source": [ "(python3)\n", - "- filter, map은 iterator 객체인 filter, map을 리턴함\n", + "- filter, map은 iterator 객체인 filter, map을 각각 리턴함\n", "- 참고\n", " - https://docs.python.org/3/library/functions.html#map\n", " - https://docs.python.org/3/library/functions.html#filter\n", @@ -606,21 +609,20 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "\n", - "\n" + "\n", + "\n", + "\n" ] } ], "source": [ - "#추가됨\n", "print(filter(lambda x: x > 2, [1, 2, 3, 34]))\n", "print(filter(lambda x: x > 2, (1, 2, 3, 34)))\n", "print(filter(lambda x: x < 'a', 'abcABCdefDEF'))" @@ -628,7 +630,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -637,36 +639,14 @@ "text": [ "[3, 34]\n", "(3, 34)\n", - "\n" + "['A', 'B', 'C', 'D', 'E', 'F']\n" ] } ], "source": [ - "#추가됨\n", "print(list(filter(lambda x: x > 2, [1, 2, 3, 34])))\n", "print(tuple(filter(lambda x: x > 2, (1, 2, 3, 34))))\n", - "print(str(filter(lambda x: x < 'a', 'abcABCdefDEF')))" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 2)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m print filter(lambda x: x > 2, [1, 2, 3, 34])\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" - ] - } - ], - "source": [ - "#기존(python2)\n", - "print filter(lambda x: x > 2, [1, 2, 3, 34])\n", - "print filter(lambda x: x > 2, (1, 2, 3, 34))\n", - "print filter(lambda x: x < 'a', 'abcABCdefDEF')" + "print(list(filter(lambda x: x < 'a', 'abcABCdefDEF')))" ] }, { @@ -688,10 +668,8 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": true - }, + "execution_count": 27, + "metadata": {}, "outputs": [], "source": [ "from functools import reduce" @@ -699,7 +677,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -736,7 +714,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -760,7 +738,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -777,7 +755,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -804,7 +782,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -832,6 +810,26 @@ "| 5 | 'dcba' | 'e' | 'edcba' | " ] }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The maximum element of the list is : 6\n" + ] + } + ], + "source": [ + "lis = [1, 3, 5, 6, 2] \n", + "\n", + "print(\"The maximum element of the list is : \",end=\"\") \n", + "print(reduce(lambda a, b: a if a > b else b, lis)) " + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -856,7 +854,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From a112501e280282af4951134a1fc8c00cf80f9b9c Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sun, 3 Nov 2019 22:54:46 +0900 Subject: [PATCH 118/124] ... --- python3.6/assignment2019/assignment-4.ipynb | 27 +++++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/python3.6/assignment2019/assignment-4.ipynb b/python3.6/assignment2019/assignment-4.ipynb index 17dc381..91a5b0c 100644 --- a/python3.6/assignment2019/assignment-4.ipynb +++ b/python3.6/assignment2019/assignment-4.ipynb @@ -6,11 +6,15 @@ "source": [ "# Assignment 4\n", "### [정보]\n", - "#### 1) Due Date: 2018년 11월 25일 (일), 23시 59분\n", - "#### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.\n", - "#### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n", - "#### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", - "#### 5) 문제 (마지막 Incremental Project에 집중하기 위하여 이번 숙제에는 ACM-ICPC 문제는 포함하지 않음)" + "#### 1) Due Date: 2019년 11월 22일 (금), 23시 59분\n", + "\n", + "#### 2) 제출방법: colab으로 작성된 notebook URL을 EL사이트에 제출 (EL 사이트의 본인 게시물에서 클릭이 되도록 함)\n", + "\n", + "#### 3) 내용: 반드시 python code와 수행 결과를 colab notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell 등에 넣어 기입하시오.\n", + "\n", + "#### 4) 숙제이후 소감 작성: 모든 문제의 답을 작성한 이후에 현재까지 강의를 들은 후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n", + "\n", + "#### 5) 반드시 본인 스스로 문제를 해결하세요~~~" ] }, { @@ -211,8 +215,8 @@ " - 대한민국\n", " - 컴퓨터 공학\n", " - 맛있는 음식\n", - " - 파이썬을 쉽게 공부하는 법\n", - " - 한기대 장점을 알려주세요\n", + " - 파이썬\n", + " - 한기대 장점\n", " - 입력받은 검색어들에 대해서도 1)에서 제시하는 방법처럼 불용어 처리를 하여 정리\n", " - 입력 받은 검색어와 유사도(Similarity)가 높은 웹 사이트 기준으로 위 4)에서 미리 지정해 놓은 5개 이상의 웹 사이트 URL들을 일렬로 나열하여 출력하시오.\n", " - 검색어와 웹 사이트 간의 유사도는 본인이 스스로 정하시오.\n", @@ -223,6 +227,13 @@ " - 위에서 만든 검색엔진 코딩은 매우 간단한 것이라 부족한 점이 많이 존재한다.\n", " - 본인이 생각하기에 상업적인 완성도 높은 검색 로봇/엔진이 되려면 어떤 기능들이 추가적으로 구현되어야 할지 최소 1가지 이상 제시하시오. " ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -241,7 +252,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From e708e040d596dcc47ac8780f37d538dc933d940a Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sun, 10 Nov 2019 23:45:37 +0900 Subject: [PATCH 119/124] ... --- python3.6/Untitled.ipynb | 167 +++++++++++++++++++++++++++++++++++++++ python3.6/python17.ipynb | 23 +++--- python3.6/python18.ipynb | 4 +- 3 files changed, 181 insertions(+), 13 deletions(-) diff --git a/python3.6/Untitled.ipynb b/python3.6/Untitled.ipynb index 68ae2c5..bf90bea 100644 --- a/python3.6/Untitled.ipynb +++ b/python3.6/Untitled.ipynb @@ -62,6 +62,173 @@ "print(L)" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "http://cse.koreatech.ac.kr : [('koreatech', 2), ('ac', 2), ('kr', 2), ('Page', 1), ('Redirection', 1), ('사이트', 1), ('폐쇄', 1), ('안내', 1), ('특성화', 1), ('사업', 1), ('종료로', 1), ('인한', 1), ('itcsw', 1), ('사이트가', 1), ('폐쇄되었습니다', 1), ('잠시후', 1), ('컴퓨터공학부', 1), ('홈페이지로', 1), ('자동', 1), ('연결', 1), ('됩니다', 1), ('If', 1), ('you', 1), ('are', 1), ('not', 1), ('redirected', 1), ('automatically', 1), ('follow', 1), ('the', 1), ('link', 1), ('to', 1), ('cse', 1)]\n", + "http://www.naver.com : [('보기', 21), ('데이터랩', 20), ('그래프', 20), ('구독', 19), ('해지', 18), ('기사보기', 18), ('자동완성', 11), ('검색어', 10), ('디자인', 10), ('네이버', 8), ('주제', 8), ('바로가기', 6), ('내', 6), ('끄기', 5), ('기능을', 5), ('있습니다', 5), ('전체', 5), ('10', 5), ('11', 5), ('언론사', 5), ('NAVER', 4), ('닫기', 4), ('도움말신고검색어저장', 4), ('켜기자동완성', 4), ('다시', 4), ('켤', 4), ('때는', 4), ('펼치기을', 4), ('클릭하세요', 4), ('기능이', 4), ('급상승', 4), ('1', 4), ('chop', 4), ('슬리피', 4), ('날씨', 4), ('관심', 4), ('by', 4), ('컨텍스트', 3), ('꺼져', 3), ('txt', 3), ('in', 3), ('없습니다', 3), ('기록', 3), ('윤정희', 3), ('스포츠', 3), ('설정', 3), ('목록', 3), ('Sign', 3), ('모바일', 3), ('패션', 3), ('연합뉴스', 2), ('타임스퀘어', 2), ('쇼핑캐스트', 2), ('로그인', 2), ('웨일', 2), ('네이버를', 2), ('검색', 2), ('도움말', 2), ('자세히', 2), ('브라우저', 2), ('등록', 2), ('저장', 2), ('해', 2), ('삭제검색어저장', 2), ('끄기자동완성', 2), ('수', 2), ('뉴스', 2), ('영화', 2), ('뮤직', 2), ('웹툰', 2), ('곱창떡볶이', 2), ('2', 2), ('치팅데이뜻', 2), ('3', 2), ('4', 2), ('도어락', 2), ('5', 2), ('송진우', 2), ('6', 2), ('치팅데이', 2), ('7', 2), ('미스트롯', 2), ('콘서트', 2), ('8', 2), ('천정명', 2), ('9', 2), ('만득이', 2), ('핫도그', 2), ('찹찹핫도그', 2), ('최희서', 2), ('12', 2), ('13', 2), ('생활고', 2), ('14', 2), ('창원날씨', 2), ('15', 2), ('16', 2), ('홈플러스', 2), ('플러스데이', 2), ('17', 2), ('홍선영', 2), ('18', 2), ('태풍', 2), ('19', 2), ('이충희', 2), ('20', 2), ('홍진영', 2), ('10위', 2), ('비', 2), ('연예', 2), ('경제', 2), ('이전', 2), ('페이지', 2), ('다음', 2), ('일', 2), ('목록으로', 2), ('이동', 2), ('15°', 2), ('내일', 2), ('비즈니스', 2), ('테크', 2), ('가져오기', 2), ('로그인후', 2), ('사용', 2), ('가능합니다', 2), ('크리에이터', 2), ('텀블러', 2), ('디자이너', 2), ('quot', 2), ('프로젝트', 2), ('꽃', 2), ('정책', 2), ('주제별캐스트', 1), ('Whale', 1), ('지금', 1), ('브라우저에서', 1), ('달라진', 1), ('만나보세요', 1), ('시작페이지로', 1), ('쥬니어네이버', 1), ('해피빈', 1), ('펼치기', 1), ('한글', 1), ('입력기', 1), ('시간대와', 1), ('관심사에', 1), ('맞춘', 1), ('ON선택됨', 1), ('OFF', 1), ('동일한', 1), ('시간대', 1), ('연령', 1), ('남녀별', 1), ('사용자', 1), ('그룹의관심사에', 1), ('맞춰', 1), ('자동완성을', 1), ('제공합니다', 1), ('ON', 1), ('OFF설정은해당', 1), ('기기', 1), ('에', 1), ('저장됩니다', 1), ('레이어', 1), ('현재', 1), ('사용하고', 1), ('계십니다', 1), ('활성화되었습니다', 1), ('켜기', 1), ('최근검색어내', 1), ('date', 1), ('삭제', 1), ('최근검색어', 1), ('내역이', 1), ('해제', 1), ('설정된', 1), ('검색어가', 1), ('최근검색어에서', 1), ('등록를', 1), ('선택하여', 1), ('자주', 1), ('찾는', 1), ('검색어를내', 1), ('검색어로', 1), ('저장해', 1), ('보세요', 1), ('알림공용', 1), ('PC에서는', 1), ('개인정보', 1), ('보호를', 1), ('위하여', 1), ('반드시', 1), ('로그아웃을', 1), ('주세요', 1), ('삭제완료', 1), ('검색어는', 1), ('최대', 1), ('10개', 1), ('까지', 1), ('저장할', 1), ('추가하시려면', 1), ('기존', 1), ('검색어를', 1), ('지워주세요', 1), ('자세히보기', 1), ('메일', 1), ('카페', 1), ('블로그', 1), ('지식인', 1), ('쇼핑', 1), ('네이버페이', 1), ('네이버TV', 1), ('사전', 1), ('증권', 1), ('금융', 1), ('부동산', 1), ('지도', 1), ('책', 1), ('만화', 1), ('더보기', 1), ('전체연령·현재', 1), ('20위', 1), ('2019', 1), ('23', 1), ('기준', 1), ('DataLab', 1), ('트래킹', 1), ('文대통령', 1), ('선거제', 1), ('개혁', 1), ('국회서', 1), ('협의처리', 1), ('…', 1), ('여야정협의체', 1), ('공감', 1), ('총선', 1), ('前', 1), ('개각', 1), ('수면', 1), ('위로…李총리', 1), ('총선투입', 1), ('가시화', 1), ('하나', 1), ('민주당', 1), ('김재원', 1), ('막말', 1), ('사죄하라', 1), ('…김재원', 1), ('우스갯소리', 1), ('김무성', 1), ('내역할', 1), ('통합·총선승리·정권교체…총선', 1), ('안나가', 1), ('통합추진단', 1), ('서두르는', 1), ('한국당…', 1), ('통합없다', 1), ('선긋는', 1), ('변혁', 1), ('내리는', 1), ('월요일', 1), ('출근길…미세먼지', 1), ('보통', 1), ('∼', 1), ('나쁨', 1), ('독도', 1), ('추락', 1), ('헬기', 1), ('잔해물', 1), ('8점', 1), ('인양…사고', 1), ('11일째', 1), ('수색', 1), ('계속', 1), ('싱가포르行', 1), ('아시아나機', 1), ('엔진이상', 1), ('마닐라', 1), ('긴급착륙', 1), ('베트남', 1), ('언론이', 1), ('보도한', 1), ('박항서', 1), ('감독', 1), ('실질', 1), ('연봉', 1), ('사실일까', 1), ('배우', 1), ('알츠하이머', 1), ('투병…딸', 1), ('얼굴도', 1), ('구분', 1), ('못', 1), ('네이버뉴스', 1), ('뉴스스탠드', 1), ('MY', 1), ('이미지형', 1), ('리스트형', 1), ('종합', 1), ('방송', 1), ('통신', 1), ('IT', 1), ('영자지', 1), ('매거진', 1), ('전문지', 1), ('지역', 1), ('설정한', 1), ('언론사가', 1), ('설정에서', 1), ('MY언론사를', 1), ('추가하면설정한', 1), ('언론사의', 1), ('기사들을', 1), ('홈에서', 1), ('바로', 1), ('보실', 1), ('추가', 1), ('Connect', 1), ('with', 1), ('people', 1), ('up', 1), ('Forgot', 1), ('Username', 1), ('or', 1), ('Password', 1), ('서울시', 1), ('을지로1가', 1), ('앞의', 1), ('뒤의', 1), ('흐림', 1), ('9°C', 1), ('6°', 1), ('오전', 1), ('흐리고', 1), ('9°', 1), ('오후', 1), ('구름많음', 1), ('실시간', 1), ('기상', 1), ('정보', 1), ('확인하기', 1), ('주간예보', 1), ('주제형', 1), ('캐스트', 1), ('선택', 1), ('리빙', 1), ('푸드', 1), ('자동차', 1), ('패션뷰티', 1), ('부모i', 1), ('건강', 1), ('게임', 1), ('TV연예', 1), ('책문화', 1), ('함께N', 1), ('여행', 1), ('경제M', 1), ('JOB', 1), ('과학', 1), ('중국', 1), ('FARM', 1), ('스쿨잼', 1), ('공연전시', 1), ('법률', 1), ('동물공감', 1), ('연애·결혼', 1), ('감성충전', 1), ('열기', 1), ('관심주제', 1), ('취소', 1), ('확인', 1), ('초기화', 1), ('전체선택', 1), ('세상을', 1), ('바꾸는', 1), ('디자인트렌드의', 1), ('중심', 1), ('디자인프레스', 1), ('주', 1), ('Oh', 1), ('일러스트레이터', 1), ('진구', 1), ('②', 1), ('MCM', 1), ('이모티콘의', 1), ('주인공', 1), ('콜라보', 1), ('비하인드', 1), ('스토리', 1), ('서울을', 1), ('대표하는', 1), ('건축물', 1), ('아파트', 1), ('ㅇㅍㅌ', 1), ('서울풍경展', 1), ('전시', 1), ('행사', 1), ('당신의', 1), ('일상을', 1), ('완성할', 1), ('탄생', 1), ('AD', 1), ('락앤락', 1), ('파란색의', 1), ('비밀', 1), ('숭상', 1), ('받았던', 1), ('적이', 1), ('한', 1), ('번도', 1), ('없는', 1), ('색', 1), ('BOOK', 1), ('먹음직스러운', 1), ('요리', 1), ('위', 1), ('만든', 1), ('생동감', 1), ('넘치는', 1), ('소인국', 1), ('세상', 1), ('아트', 1), ('포인트는', 1), ('초록', 1), ('벽지', 1), ('대전', 1), ('단독주택', 1), ('뉴트로', 1), ('리모델링', 1), ('인테리어', 1), ('조명식', 1), ('작가가', 1), ('만드는', 1), ('아름다운', 1), ('우리', 1), ('백자', 1), ('아트윈도', 1), ('추천', 1), ('안다즈', 1), ('서울', 1), ('강남의', 1), ('피에트', 1), ('분', 1), ('피플', 1), ('초간단한', 1), ('설정과', 1), ('작동', 1), ('커튼', 1), ('여닫기', 1), ('화려한', 1), ('다', 1), ('모였다', 1), ('스타들의', 1), ('포토월', 1), ('인기', 1), ('콘텐츠', 1), ('이정재·임세령', 1), ('참석한', 1), ('예술', 1), ('행사의', 1), ('정체', 1), ('레드프라이데이', 1), ('굳이', 1), ('에어팟', 1), ('왜', 1), ('사', 1), ('3만원대', 1), ('무선이어폰', 1), ('에어블랙', 1), ('리빙픽미', 1), ('63빌딩보다', 1), ('높은', 1), ('곳에서', 1), ('허술해서', 1), ('더', 1), ('찾는다는', 1), ('중국의', 1), ('이곳', 1), ('여사모', 1), ('유명', 1), ('작품', 1), ('승무원도', 1), ('놀란', 1), ('최악의', 1), ('항공사', 1), ('유니폼', 1), ('트래블뷰', 1), ('https', 1), ('castbox', 1), ('shopping', 1), ('naver', 1), ('com', 1), ('shopbox', 1), ('main', 1), ('nhn', 1), ('말모이', 1), ('100년', 1), ('빼다지를', 1), ('아십니까', 1), ('당신만', 1), ('아는', 1), ('우리말', 1), ('올리고상품권', 1), ('받아가세요', 1), ('middot', 1), ('생활', 1), ('균형으로', 1), ('일생을', 1), ('즐겁게', 1), ('일도', 1), ('생활도', 1), ('결국', 1), ('다내', 1), ('인생이니까', 1), ('공지사항', 1), ('서비스', 1), ('전체보기', 1), ('다운받기', 1), ('네이버웨일', 1), ('Creators', 1), ('스몰비즈니스', 1), ('Partners', 1), ('·', 1), ('광고', 1), ('스토어', 1), ('개설', 1), ('지역업체', 1), ('Developers', 1), ('개발자센터', 1), ('오픈', 1), ('API', 1), ('오픈소스', 1), ('D2', 1), ('랩스', 1), ('및', 1), ('약관', 1), ('회사소개', 1), ('인재채용', 1), ('제휴제안', 1), ('이용약관', 1), ('개인정보처리방침', 1), ('청소년보호정책', 1), ('고객센터', 1), ('ⓒ', 1), ('Corp', 1)]\n", + "http://www.daum.net : [('영상', 22), ('날씨', 22), ('39', 18), ('uarr', 16), ('동영상', 16), ('https', 16), ('gallery', 16), ('v', 16), ('daum', 16), ('net', 16), ('p', 16), ('class', 16), ('link', 16), ('thumb', 16), ('photo', 16), ('viewer', 13), ('middot', 12), ('quot', 10), ('바로가기', 9), ('정보', 9), ('다음', 9), ('탭', 8), ('이전', 7), ('현재', 7), ('오늘의', 6), ('뉴스', 6), ('비온후갬', 6), ('홍선영', 6), ('중국', 6), ('곱창', 6), ('보기', 6), ('서비스', 5), ('실시간', 5), ('블로그', 5), ('포토', 5), ('검색', 5), ('lt', 5), ('gt', 5), ('전체', 5), ('흐림', 5), ('비', 5), ('1위', 5), ('떡볶이', 5), ('2위', 5), ('이충희', 5), ('3위', 5), ('윤정희', 5), ('4위', 5), ('송진우', 5), ('5위', 5), ('다이어트', 5), ('6위', 5), ('홍진영', 5), ('7위', 5), ('천정명', 5), ('8위', 5), ('우한', 5), ('9위', 5), ('최희서', 5), ('10위', 5), ('이영은', 5), ('이슈', 4), ('쇼핑', 4), ('스포츠', 4), ('10도', 4), ('10°C', 4), ('1', 4), ('신규진입', 4), ('미디어', 3), ('검색어', 3), ('카페', 3), ('카카오TV', 3), ('웹툰', 3), ('브런치', 3), ('게임', 3), ('같이가치', 3), ('연예', 3), ('8도', 3), ('8°C', 3), ('천둥번개', 3), ('로그인', 3), ('文대통령', 3), ('한', 3), ('랭킹', 3), ('탭1', 3), ('이', 3), ('완전', 3), ('premium', 3), ('Daum', 2), ('주요', 2), ('멀티미디어', 2), ('유익한', 2), ('amp', 2), ('안내', 2), ('김건모', 2), ('메일', 2), ('지도', 2), ('사전', 2), ('더보기', 2), ('티스토리', 2), ('카카오스토리', 2), ('부동산', 2), ('자동차', 2), ('영화', 2), ('패스', 2), ('카카오', 2), ('전체보기', 2), ('11', 2), ('10', 2), ('9도', 2), ('9°C', 2), ('인천시', 2), ('16도', 2), ('16°C', 2), ('경상북도', 2), ('강원도', 2), ('12도', 2), ('12°C', 2), ('전라남도', 2), ('11도', 2), ('11°C', 2), ('연재', 2), ('TV', 2), ('증시', 2), ('5', 2), ('전일대비', 2), ('상승257', 2), ('상승255', 2), ('상승161', 2), ('상승58', 2), ('상승190', 2), ('상승129', 2), ('상승64', 2), ('상승46', 2), ('TV하이라이트', 2), ('시간', 2), ('날', 2), ('때', 2), ('좋은', 2), ('명장면', 2), ('집', 2), ('맛집이네', 2), ('2', 2), ('3', 2), ('추천갤러리바로가기', 2), ('20191110170040902', 2), ('이미지', 2), ('목록', 2), ('웹', 1), ('접근성', 1), ('자동실행', 1), ('광고', 1), ('설정', 1), ('통합', 1), ('한글입력기', 1), ('인기', 1), ('슈돌', 1), ('연정훈', 1), ('황대헌', 1), ('금메달', 1), ('목재휀스설치', 1), ('부산', 1), ('에어쇼', 1), ('보강토블록', 1), ('롤드컵', 1), ('결승', 1), ('세레나데', 1), ('냉난방기추천', 1), ('강한나', 1), ('런닝맨', 1), ('태양광설치', 1), ('다음을', 1), ('시작페이지로', 1), ('증권', 1), ('주요서비스', 1), ('⋁', 1), ('커뮤니케이션', 1), ('아지트', 1), ('레이지', 1), ('생활', 1), ('쇼핑하우', 1), ('항공권', 1), ('금융', 1), ('문화', 1), ('엔터', 1), ('멜론', 1), ('다음웹툰', 1), ('소셜임팩트', 1), ('메이커스', 1), ('프로젝트100', 1), ('지식', 1), ('어학사전', 1), ('번역', 1), ('단어장', 1), ('백과사전', 1), ('팁', 1), ('배틀그라운드', 1), ('오브', 1), ('엑자일', 1), ('길찾기', 1), ('로드뷰', 1), ('버스정보', 1), ('지하철노선도', 1), ('소식', 1), ('AI', 1), ('메뉴닫기', 1), ('일', 1), ('서울시', 1), ('경기도', 1), ('대구시', 1), ('대전시', 1), ('광주시', 1), ('부산시', 1), ('울산시', 1), ('15도', 1), ('15°C', 1), ('충청북도', 1), ('전라북도', 1), ('14도', 1), ('14°C', 1), ('제주자치도', 1), ('18도', 1), ('18°C', 1), ('7도', 1), ('7°C', 1), ('경상남도', 1), ('날찌정보', 1), ('8897', 1), ('펼치기', 1), ('지역', 1), ('어제보다', 1), ('°C', 1), ('상세보기', 1), ('미세먼지', 1), ('통합대기', 1), ('X', 1), ('날씨정보', 1), ('닫기', 1), ('아이디로', 1), ('카카오계정으로', 1), ('회원가입', 1), ('선택됨', 1), ('1탭', 1), ('오늘만', 1), ('기다렸다', 1), ('치팅데이에', 1), ('룰루랄라', 1), ('“항상', 1), ('힘이', 1), ('돼주신', 1), ('아버지', 1), ('사랑합니다”', 1), ('안송이', 1), ('일반뉴스', 1), ('선거제', 1), ('개혁', 1), ('국회서', 1), ('협의처리', 1), ('여야정협의체', 1), ('공감', 1), ('5黨대표', 1), ('175분간', 1), ('허심탄회', 1), ('대화', 1), ('黃', 1), ('孫', 1), ('설전', 1), ('도', 1), ('첫', 1), ('참가', 1), ('펄어비스', 1), ('붉은사막', 1), ('등', 1), ('신작', 1), ('4종', 1), ('선보인다', 1), ('방글라데시', 1), ('사이클론에', 1), ('6명', 1), ('사망', 1), ('대피', 1), ('상황', 1), ('개선', 1), ('불법촬영', 1), ('피해자', 1), ('사진', 1), ('첨부한', 1), ('판결문', 1), ('법원', 1), ('내부도', 1), ('갑론을박', 1), ('홈쇼핑', 1), ('한국제품', 1), ('특별방송', 1), ('사드', 1), ('풀리나', 1), ('日', 1), ('경제침탈', 1), ('지소미아에는', 1), ('초당적', 1), ('협력', 1), ('필요', 1), ('뇌는', 1), ('스스로', 1), ('청소한다', 1), ('서서히', 1), ('밝혀지는', 1), ('잠의', 1), ('비밀', 1), ('안녕하세요', 1), ('지구인입니다', 1), ('보이저', 1), ('2호에', 1), ('실어', 1), ('보낸', 1), ('인류', 1), ('메시지', 1), ('이란', 1), ('12년', 1), ('전', 1), ('실종', 1), ('CIA', 1), ('요원', 1), ('여전히', 1), ('행방불명', 1), ('라', 1), ('마시아의', 1), ('근본', 1), ('백승호', 1), ('기가', 1), ('막힌', 1), ('청와대', 1), ('만찬', 1), ('결과', 1), ('브리핑', 1), ('남북·한일', 1), ('관계', 1), ('정', 1), ('가을', 1), ('절정인데', 1), ('궂은', 1), ('대수냐', 1), ('유명산·축', 1), ('뉴스홈', 1), ('갤러리', 1), ('열독률', 1), ('높은', 1), ('탭8', 1), ('달러환율', 1), ('157', 1), ('9652', 1), ('상승1', 1), ('국내금', 1), ('54', 1), ('729', 1), ('61', 1), ('9662', 1), ('하락', 1), ('579', 1), ('97', 1), ('관련', 1), ('링크모음', 1), ('환율', 1), ('운세', 1), ('2019', 1), ('23', 1), ('09기준', 1), ('X닫기', 1), ('집사부일체', 1), ('피앙세가', 1), ('준비해준', 1), ('이삿떡', 1), ('돌리기', 1), ('스타트', 1), ('전지적', 1), ('참견시점', 1), ('갑자기', 1), ('침울해지는', 1), ('신봉선의', 1), ('코', 1), ('수술', 1), ('썰', 1), ('ft', 1), ('연골', 1), ('SBS', 1), ('인기가요', 1), ('사랑스러움이', 1), ('꽃', 1), ('피는', 1), ('현아', 1), ('의', 1), ('컴백', 1), ('FLOWER', 1), ('슈퍼맨이', 1), ('돌아왔다', 1), ('할머니로', 1), ('변신했잼과', 1), ('심기', 1), ('불편한', 1), ('벤크루지', 1), ('영감', 1), ('ㅋㅋ', 1), ('정도였어', 1), ('과거', 1), ('미모', 1), ('했다는', 1), ('배우', 1), ('먹성', 1), ('좋기로', 1), ('소문난', 1), ('야구', 1), ('선수', 1), ('엄청나네', 1), ('믿었던', 1), ('직수형', 1), ('정수기', 1), ('충격적인', 1), ('내부', 1), ('상태', 1), ('연', 1), ('매출', 1), ('18억', 1), ('대박집의', 1), ('김치찌개', 1), ('비법', 1), ('슛도사', 1), ('클래스', 1), ('관록美', 1), ('넘치는', 1), ('이충희의', 1), ('여유로운', 1), ('42P', 1), ('10R', 1), ('9A', 1), ('MVP', 1), ('제임스', 1), ('하든의', 1), ('무', 1), ('자신감이', 1), ('느껴지는', 1), ('정성규의', 1), ('연속', 1), ('서브에이스', 1), ('통산', 1), ('500승', 1), ('금자탑', 1), ('을', 1), ('세운', 1), ('유재학', 1), ('감독의', 1), ('인터', 1), ('3천', 1), ('원도', 1), ('안', 1), ('되는', 1), ('가격이라니', 1), ('핵', 1), ('이득', 1), ('입맛', 1), ('자극하는', 1), ('싱싱한', 1), ('해산물이', 1), ('한가득', 1), ('드라마에', 1), ('나온', 1), ('치즈', 1), ('직접', 1), ('먹어봤는데', 1), ('감칠맛', 1), ('장난', 1), ('아닌', 1), ('미국', 1), ('가정식', 1), ('요리', 1), ('탭4', 1), ('대실패', 1), ('취업뽀개기', 1), ('민감한', 1), ('직장인', 1), ('쭉빵카페', 1), ('생존자를', 1), ('발견했', 1), ('gif', 1), ('민초', 1), ('논란', 1), ('jpg', 1), ('카드를', 1), ('다루는', 1), ('손재주', 1), ('어떻게', 1), ('학교를', 1), ('다녔나', 1), ('싶은', 1), ('고등학교', 1), ('시간표', 1), ('돈코츠라멘', 1), ('끓이기', 1), ('도서관에', 1), ('파우치', 1), ('크기의', 1), ('필통을', 1), ('가져와', 1), ('놓고', 1), ('1boon뉴스', 1), ('탭5', 1), ('홈', 1), ('쿠킹', 1), ('머니', 1), ('동물', 1), ('스타일', 1), ('Men', 1), ('여행맛집', 1), ('직장IN', 1), ('뮤직', 1), ('일요웹툰', 1), ('오늘은', 1), ('일요일', 1), ('일주일', 1), ('피로를', 1), ('번에', 1), ('날려버려요', 1), ('울지마', 1), ('찬열이가', 1), ('괴로우면', 1), ('제', 1), ('가슴은', 1), ('더', 1), ('찢어진다구요ㅠㅠ', 1), ('취향저격', 1), ('그녀', 1), ('5구역', 1), ('만약', 1), ('우리가', 1), ('헤어지게', 1), ('된다면', 1), ('꼭', 1), ('다시', 1), ('만나자', 1), ('버닝', 1), ('이펙트', 1), ('손크기', 1), ('얼떨결에', 1), ('하게', 1), ('된', 1), ('하이파이브', 1), ('그린라이트인가요', 1), ('바니와', 1), ('오빠들', 1), ('기다무', 1), ('락가수', 1), ('커플의', 1), ('아슬아슬', 1), ('두근두근', 1), ('사랑이야기', 1), ('비애선언', 1), ('매주', 1), ('목요일', 1), ('치열했던', 1), ('독립운동가들의', 1), ('삶을', 1), ('재조명하다', 1), ('독립운동가', 1), ('프로젝트', 1), ('신규웹툰', 1), ('방탕일기', 1), ('단지', 1), ('레드스톰', 1), ('노경찬', 1), ('암현', 1), ('악역의', 1), ('구원자', 1), ('명랑', 1), ('잿슨', 1), ('풍검', 1), ('김철현', 1), ('완결', 1), ('어쩌다', 1), ('발견한', 1), ('7월', 1), ('무류', 1), ('몸', 1), ('제피가루', 1), ('나빌레라', 1), ('Hun', 1), ('지민', 1), ('탭9', 1), ('탭11', 1), ('phopick', 1), ('north', 1), ('Nb1Gf0pBYq', 1), ('pic0', 1), ('ellekorea', 1), ('jeju', 1), ('N9PoAA7znn', 1), ('pic1', 1), ('hanok4', 1), ('NGJrcaIhEx', 1), ('pic2', 1), ('5000837', 1), ('20191110181955663', 1), ('pic3', 1), ('253', 1), ('20191110155057319', 1), ('pic4', 1), ('250', 1), ('20191110204416282', 1), ('pic5', 1), ('978', 1), ('20191110151730564', 1), ('pic6', 1), ('3521', 1), ('20191110154409149', 1), ('pic7', 1), ('999', 1), ('20191109080301940', 1), ('pic8', 1), ('318190', 1), ('20191110212046627', 1), ('pic9', 1), ('896465', 1), ('20191110173911840', 1), ('pic10', 1), ('5000577', 1), ('20191110205412377', 1), ('pic11', 1), ('379', 1), ('pic12', 1), ('1120776', 1), ('pic13', 1), ('674200', 1), ('20191110175103108', 1), ('pic14', 1), ('5000475', 1), ('20191110160427734', 1), ('pic15', 1), ('공지사항', 1), ('댓글', 1), ('폐지', 1), ('소개', 1), ('및', 1), ('약관', 1), ('회사소개', 1), ('비즈니스', 1), ('검색등록', 1), ('제휴문의', 1), ('인재채용', 1), ('이용약관', 1), ('운영정책', 1), ('청소년보호정책', 1), ('개인정보처리방침', 1), ('웹접근성안내', 1), ('고객센터', 1), ('Copyright', 1), ('©', 1), ('Kakao', 1), ('Corp', 1), ('All', 1), ('rights', 1), ('reserved', 1)]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "http://www.nytimes.com : [('the', 27), ('to', 20), ('and', 19), ('a', 17), ('of', 13), ('in', 12), ('The', 11), ('New', 8), ('on', 8), ('York', 7), ('his', 6), ('it', 6), ('x27', 6), ('s', 6), ('is', 5), ('for', 5), ('Mulvaney', 5), ('with', 5), ('You', 5), ('amp', 5), ('S', 4), ('Y', 4), ('that', 4), ('Trump', 4), ('are', 4), ('as', 4), ('ed', 4), ('Times', 3), ('Mick', 3), ('president’s', 3), ('president', 3), ('Mr', 3), ('has', 3), ('talk', 3), ('but', 3), ('Is', 3), ('From', 3), ('no', 3), ('what', 3), ('News', 2), ('reading', 2), ('main', 2), ('PoliticsN', 2), ('BusinessOpinionTechScienceHealthSportsArtsBooksStyleFoodTravelMagazineT', 2), ('MagazineReal', 2), ('In', 2), ('career', 2), ('will', 2), ('tell', 2), ('Kushner', 2), ('son', 2), ('law', 2), ('senior', 2), ('adviser', 2), ('leaving', 2), ('Air', 2), ('Force', 2), ('One', 2), ('Lexington', 2), ('Ky', 2), ('Monday', 2), ('decision', 2), ('put', 2), ('renewed', 2), ('attention', 2), ('relationship', 2), ('Doug', 2), ('Mills', 2), ('American', 2), ('And', 2), ('Would', 2), ('Sanders', 2), ('videos', 2), ('haunt', 2), ('continue', 2), ('sexually', 2), ('abused', 2), ('children', 2), ('sisters', 2), ('about', 2), ('their', 2), ('lives', 2), ('Far', 2), ('have', 2), ('Under', 2), ('had', 2), ('‘What', 2), ('said', 2), ('there', 2), ('”', 2), ('at', 2), ('bakery', 2), ('they', 2), ('be', 2), ('like', 2), ('toe', 2), ('an', 2), ('Artist', 2), ('pageworldU', 2), ('politicsElection', 2), ('2020New', 2), ('Yorkbusinesstechscienceclimatesportsobituariesthe', 2), ('upshotEspañol中文网today', 2), ('papercorrectionsopiniontoday', 2), ('opinionop', 2), ('columnistseditorialsop', 2), ('Contributorsletterssunday', 2), ('reviewvideo', 2), ('opinionartstoday', 2), ('artsart', 2), ('designbooksdancemoviesmusicPop', 2), ('Culturetelevisiontheaterwatchingvideo', 2), ('artslivingautomobilesCookingcrosswordeducationfoodhealthjobsmagazineparentingreal', 2), ('estatestylet', 2), ('CenterWirecutterLive', 2), ('EventsThe', 2), ('Learning', 2), ('Networktools', 2), ('servicesN', 2), ('C', 2), ('events', 2), ('guidemultimediaphotographyvideoNewslettersNYT', 2), ('storetimes', 2), ('journeysmanage', 2), ('my', 2), ('Breaking', 1), ('World', 1), ('Multimedia', 1), ('Continue', 1), ('storySectionsSEARCHSkip', 1), ('contentSkip', 1), ('site', 1), ('indexEnglishEspañol中文Log', 1), ('InLog', 1), ('InToday’s', 1), ('PaperWorldU', 1), ('EstateVideoWorldU', 1), ('EstateVideoListen', 1), ('‘Modern', 1), ('Love’', 1), ('PodcastZawe', 1), ('Ashton', 1), ('tells', 1), ('near', 1), ('adoption', 1), ('involving', 1), ('startling', 1), ('revelations', 1), ('‘At', 1), ('War’', 1), ('NewsletterThe', 1), ('1969', 1), ('protest', 1), ('started', 1), ('veteran’s', 1), ('Neediest', 1), ('Cases', 1), ('FundAfter', 1), ('homelessness', 1), ('she', 1), ('striving', 1), ('provide', 1), ('her', 1), ('boys', 1), ('v', 1), ('Yes', 1), ('It’s', 1), ('PossibleIn', 1), ('latest', 1), ('twist', 1), ('impeachment', 1), ('inquiry', 1), ('chief', 1), ('staff', 1), ('asked', 1), ('join', 1), ('lawsuit', 1), ('against', 1), ('effect', 1), ('hopes', 1), ('court', 1), ('him', 1), ('whether', 1), ('stay', 1), ('silent', 1), ('or', 1), ('comply', 1), ('subpoena', 1), ('from', 1), ('House', 1), ('which', 1), ('wants', 1), ('testimony', 1), ('Jared', 1), ('TimesRepublicans', 1), ('Argue', 1), ('Impeachment', 1), ('Case', 1), ('Falls', 1), ('Short', 1), ('Proving', 1), ('MisconductHow', 1), ('State', 1), ('Department’s', 1), ('Dissenters', 1), ('Incited', 1), ('Revolt', 1), ('Then', 1), ('Rallying', 1), ('CryShock', 1), ('anger', 1), ('sadness', 1), ('giving', 1), ('way', 1), ('pride', 1), ('among', 1), ('diplomats', 1), ('defending', 1), ('ideals', 1), ('trying', 1), ('hold', 1), ('administration', 1), ('accountable', 1), ('697', 1), ('commentsJared', 1), ('TimesA', 1), ('Changing', 1), ('Population', 1), ('Turned', 1), ('Virginia', 1), ('Solid', 1), ('BlueAn', 1), ('influx', 1), ('immigrants', 1), ('flipped', 1), ('state', 1), ('was', 1), ('once', 1), ('heart', 1), ('confederacy', 1), ('it’s', 1), ('happening', 1), ('elsewhere', 1), ('Warren', 1), ('Take', 1), ('Billionaires', 1), ('Down', 1), ('Few', 1), ('PegsElizabeth', 1), ('Warren’s', 1), ('tax', 1), ('proposals', 1), ('would', 1), ('shrink', 1), ('colossal', 1), ('fortunes', 1), ('over', 1), ('time', 1), ('make', 1), ('harder', 1), ('hand', 1), ('down', 1), ('multibillion', 1), ('dollar', 1), ('legacies', 1), ('Rebukes', 1), ('Bloomberg', 1), ('‘Sorry', 1), ('Ain’t', 1), ('Going', 1), ('Buy', 1), ('This', 1), ('Election’Appearing', 1), ('Iowa', 1), ('Alexandria', 1), ('Ocasio', 1), ('Cortez', 1), ('Bernie', 1), ('pushed', 1), ('populist', 1), ('message', 1), ('drew', 1), ('contrast', 1), ('between', 1), ('grass', 1), ('roots', 1), ('support', 1), ('Bloomberg’s', 1), ('billions', 1), ('Child', 1), ('Abusers', 1), ('Run', 1), ('Rampant', 1), ('Tech', 1), ('Companies', 1), ('Look', 1), ('Other', 1), ('WayPhotos', 1), ('victims', 1), ('into', 1), ('adulthood', 1), ('search', 1), ('engines', 1), ('social', 1), ('networks', 1), ('cloud', 1), ('storage', 1), ('recirculate', 1), ('images', 1), ('F', 1), ('E', 1), ('were', 1), ('A', 1), ('digital', 1), ('trail', 1), ('crimes', 1), ('continues', 1), ('decade', 1), ('later', 1), ('Kholood', 1), ('Eid', 1), ('Times‘If', 1), ('Those', 1), ('Were', 1), ('Pictures', 1), ('Understand’Two', 1), ('candidly', 1), ('after', 1), ('being', 1), ('It', 1), ('been', 1), ('10', 1), ('years', 1), ('online', 1), ('photos', 1), ('follow', 1), ('them', 1), ('‘The', 1), ('Weekly’', 1), ('How', 1), ('Too', 1), ('Yoga', 1), ('Sweaty', 1), ('bodies', 1), ('intimate', 1), ('touching', 1), ('little', 1), ('consent', 1), ('made', 1), ('yoga', 1), ('studio', 1), ('complicated', 1), ('place', 1), ('Watch', 1), ('“The', 1), ('Weekly”', 1), ('FX', 1), ('tonight', 1), ('152', 1), ('commentsBolivian', 1), ('Leader', 1), ('Calls', 1), ('Elections', 1), ('Pressure', 1), ('ProtestsPresident', 1), ('Evo', 1), ('Morales', 1), ('claimed', 1), ('victory', 1), ('recent', 1), ('vote', 1), ('set', 1), ('off', 1), ('violent', 1), ('protests', 1), ('streets', 1), ('French', 1), ('Baguettes', 1), ('Vending', 1), ('Machine', 1), ('Tragedy', 1), ('’In', 1), ('country', 1), ('where', 1), ('“Without', 1), ('bread', 1), ('more', 1), ('life', 1), ('local', 1), ('bakeries', 1), ('disappearing', 1), ('quickly', 1), ('Jeannot', 1), ('Culeron', 1), ('Marigny', 1), ('le', 1), ('Lozon', 1), ('France', 1), ('“When', 1), ('villages', 1), ('lose', 1), ('cry', 1), ('tragedy', 1), ('’”', 1), ('he', 1), ('“But', 1), ('willing', 1), ('walk', 1), ('Kasia', 1), ('Strek', 1), ('TimesHere', 1), ('11', 1), ('our', 1), ('best', 1), ('weekend', 1), ('reads', 1), ('news', 1), ('quiz', 1), ('this', 1), ('week', 1), ('OpinionPhil', 1), ('KlayThe', 1), ('Soldiers', 1), ('We', 1), ('Leave', 1), ('BehindWar', 1), ('immigration', 1), ('means', 1), ('Maureen', 1), ('DowdBloomy', 1), ('BrinkWhat', 1), ('look', 1), ('if', 1), ('Mrs', 1), ('Doubtfire', 1), ('Mendacity', 1), ('go', 1), ('592', 1), ('commentsNicholas', 1), ('KristofLet’s', 1), ('Wage', 1), ('War', 1), ('LonelinessAmy', 1), ('WilentzTrump', 1), ('Likes', 1), ('See', 1), ('Us', 1), ('BurnLiz', 1), ('MairRepublicans', 1), ('Do', 1), ('Really', 1), ('Want', 1), ('Your', 1), ('Rally', 1), ('Ross', 1), ('DouthatWhat', 1), ('Will', 1), ('Happen', 1), ('Conservative', 1), ('Catholicism', 1), ('Malik', 1), ('SajadA', 1), ('Wedding', 1), ('CurfewEugene', 1), ('LindenHow', 1), ('Scientists', 1), ('Got', 1), ('Climate', 1), ('Change', 1), ('So', 1), ('WrongFiroozeh', 1), ('DumasWhen', 1), ('Best', 1), ('Deal', 1), ('What', 1), ('Give', 1), ('AwayJessica', 1), ('GroseEarly', 1), ('Motherhood', 1), ('Has', 1), ('Always', 1), ('Been', 1), ('MiserableA', 1), ('Plea', 1), ('33', 1), ('Writers', 1), ('Words', 1), ('Matter', 1), ('Stop', 1), ('Using', 1), ('‘Quid', 1), ('Pro', 1), ('Quo', 1), ('’Editors’', 1), ('PicksCan', 1), ('Woman', 1), ('Who', 1), ('Ever', 1), ('Just', 1), ('Be', 1), ('two', 1), ('painters', 1), ('Celia', 1), ('Paul', 1), ('Cecily', 1), ('Brown', 1), ('different', 1), ('stories', 1), ('takes', 1), ('thrive', 1), ('medium', 1), ('historically', 1), ('dominated', 1), ('by', 1), ('men', 1), ('Magazine97', 1), ('commentsAt', 1), ('Tennessee', 1), ('Titans', 1), ('Games', 1), ('Fiercest', 1), ('Tailgaters', 1), ('Are', 1), ('KurdsNashville’s', 1), ('big', 1), ('Kurdish', 1), ('community', 1), ('fallen', 1), ('hard', 1), ('football', 1), ('parking', 1), ('lot', 1), ('feasts', 1), ('feature', 1), ('biryani', 1), ('alcohol', 1), ('FoodCult', 1), ('Literary', 1), ('Sad', 1), ('WomanFiction', 1), ('awash', 1), ('female', 1), ('suffering', 1), ('author', 1), ('Leslie', 1), ('Jamison', 1), ('considers', 1), ('affliction’s', 1), ('allure', 1), ('—', 1), ('its', 1), ('alternatives', 1), ('Book', 1), ('ReviewAdvertisementContinue', 1), ('storyWe’d', 1), ('your', 1), ('thoughts', 1), ('home', 1), ('page', 1), ('experience', 1), ('Let', 1), ('us', 1), ('know', 1), ('you', 1), ('think', 1), ('Site', 1), ('Indexnewshome', 1), ('magazinetravellovelistings', 1), ('moreReader', 1), ('accountnewshome', 1), ('magazinetravellovemoreReader', 1), ('accountSubscribehome', 1), ('deliverydigital', 1), ('subscriptionsCrosswordCookingemail', 1), ('newsletterscorporate', 1), ('subscriptionseducation', 1), ('ratemobile', 1), ('applicationsreplica', 1), ('editionEspañol中文网Site', 1), ('Information', 1), ('Navigation©', 1), ('2019', 1), ('CompanyContact', 1), ('UsWork', 1), ('usAdvertiseT', 1), ('Brand', 1), ('StudioYour', 1), ('Ad', 1), ('ChoicesPrivacyTerms', 1), ('ServiceTerms', 1), ('SaleSite', 1), ('MapHelpSubscriptions', 1)]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://www.nytimes.com/section/science : [('the', 48), ('of', 32), ('By', 23), ('to', 20), ('and', 16), ('a', 16), ('in', 12), ('that', 9), ('for', 8), ('amp', 6), ('on', 6), ('from', 6), ('with', 6), ('x27', 6), ('s', 6), ('reading', 5), ('main', 5), ('C', 5), ('The', 4), ('From', 4), ('S', 4), ('most', 4), ('an', 4), ('some', 4), ('ed', 4), ('New', 3), ('York', 3), ('Times', 3), ('people', 3), ('have', 3), ('via', 3), ('world’s', 3), ('species', 3), ('but', 3), ('is', 3), ('it', 3), ('by', 3), ('at', 3), ('E', 3), ('Science', 2), ('2019', 2), ('will', 2), ('across', 2), ('help', 2), ('Knvul', 2), ('Pacific', 2), ('allowing', 2), ('new', 2), ('study', 2), ('Karen', 2), ('EPA', 2), ('National', 2), ('Department', 2), ('one', 2), ('endangered', 2), ('has', 2), ('Canada', 2), ('like', 2), ('other', 2), ('scientists', 2), ('are', 2), ('its', 2), ('1', 2), ('be', 2), ('D', 2), ('et', 2), ('al', 2), ('year', 2), ('Are', 2), ('his', 2), ('Interior', 2), ('nature', 2), ('wrote', 2), ('cause', 2), ('federal', 2), ('e', 2), ('page', 2), ('pageworldU', 2), ('politicsElection', 2), ('2020New', 2), ('Yorkbusinesstechscienceclimatesportsobituariesthe', 2), ('upshotEspañol中文网today', 2), ('papercorrectionsopiniontoday', 2), ('opinionop', 2), ('columnistseditorialsop', 2), ('Contributorsletterssunday', 2), ('reviewvideo', 2), ('opinionartstoday', 2), ('artsart', 2), ('designbooksdancemoviesmusicPop', 2), ('Culturetelevisiontheaterwatchingvideo', 2), ('artslivingautomobilesCookingcrosswordeducationfoodhealthjobsmagazineparentingreal', 2), ('estatestylet', 2), ('CenterWirecutterLive', 2), ('EventsThe', 2), ('Learning', 2), ('Networktools', 2), ('servicesN', 2), ('Y', 2), ('events', 2), ('guidemultimediaphotographyvideoNewslettersNYT', 2), ('storetimes', 2), ('journeysmanage', 2), ('my', 2), ('SectionsSEARCHSkip', 1), ('contentSkip', 1), ('site', 1), ('indexScienceLog', 1), ('InLog', 1), ('InToday’s', 1), ('PaperAdvertisementContinue', 1), ('storySupported', 1), ('byContinue', 1), ('storyScienceClimateSpace', 1), ('CosmosHealthTrilobitesSciencetakeOut', 1), ('ThereHighlightsPhotoCreditThat', 1), ('Tiny', 1), ('Dot', 1), ('It’s', 1), ('Transit', 1), ('MercuryThe', 1), ('planet', 1), ('glide', 1), ('sun', 1), ('Monday', 1), ('Jonathan', 1), ('CorumPhotoCreditThe', 1), ('ClimateMusic', 1), ('ProjectTrilobitesThis', 1), ('Is', 1), ('What', 1), ('Climate', 1), ('Change', 1), ('Sounds', 1), ('LikeScientists', 1), ('artists', 1), ('hope', 1), ('emotional', 1), ('power', 1), ('music', 1), ('move', 1), ('act', 1), ('climate', 1), ('crisis', 1), ('SheikhPhotoCreditSaul', 1), ('Loeb', 1), ('Agence', 1), ('France', 1), ('Presse', 1), ('—', 1), ('Getty', 1), ('ImagesTrilobitesHow', 1), ('Did', 1), ('Virus', 1), ('Atlantic', 1), ('Infect', 1), ('Mammals', 1), ('Thawing', 1), ('sea', 1), ('ice', 1), ('may', 1), ('opened', 1), ('door', 1), ('infection', 1), ('cross', 1), ('oceans', 1), ('suggests', 1), ('WeintraubPhotoCreditJose', 1), ('Mendez', 1), ('ShutterstockTrove', 1), ('Mammoth', 1), ('Skeletons', 1), ('Excavated', 1), ('Near', 1), ('Mexico', 1), ('City', 1), ('Gives', 1), ('Clues', 1), ('About', 1), ('HuntingResearchers', 1), ('Mexico’s', 1), ('Institute', 1), ('Anthropology', 1), ('History', 1), ('say', 1), ('discovery', 1), ('illuminates', 1), ('relationship', 1), ('between', 1), ('humans', 1), ('Pleistocene', 1), ('animals', 1), ('Emily', 1), ('RuebPhotoCreditNew', 1), ('State', 1), ('Environmental', 1), ('ConservationFinding', 1), ('Ways', 1), ('Protect', 1), ('Right', 1), ('Whales', 1), ('With', 1), ('Help', 1), ('FishermenThe', 1), ('decline', 1), ('large', 1), ('whale', 1), ('pushed', 1), ('individual', 1), ('states', 1), ('test', 1), ('technologies', 1), ('ropeless', 1), ('fishing', 1), ('gear', 1), ('WeintraubmatterPhotoCreditAnnette', 1), ('F', 1), ('MuttrayHumans', 1), ('Shipped', 1), ('Awful', 1), ('Cargo', 1), ('Across', 1), ('Seas', 1), ('CancerA', 1), ('cancer', 1), ('afflicting', 1), ('mussels', 1), ('originated', 1), ('off', 1), ('coast', 1), ('then', 1), ('crossed', 1), ('into', 1), ('Europe', 1), ('South', 1), ('America', 1), ('Carl', 1), ('ZimmerPhotoCreditStalking', 1), ('Endangered', 1), ('Wax', 1), ('PalmColombia’s', 1), ('national', 1), ('tree', 1), ('wax', 1), ('palm', 1), ('Now', 1), ('decades', 1), ('guerrilla', 1), ('war', 1), ('retreat', 1), ('rediscovering', 1), ('vast', 1), ('forests', 1), ('racing', 1), ('protect', 1), ('them', 1), ('Jennie', 1), ('Erin', 1), ('Smith', 1), ('Federico', 1), ('Rios', 1), ('EscobarPhotoCreditNASAVoyager', 1), ('2’s', 1), ('Discoveries', 1), ('Interstellar', 1), ('SpaceIn', 1), ('journey', 1), ('beyond', 1), ('boundary', 1), ('solar', 1), ('wind’s', 1), ('bubble', 1), ('probe', 1), ('observed', 1), ('notable', 1), ('differences', 1), ('twin', 1), ('Voyager', 1), ('Kenneth', 1), ('ChangPhotoCreditJames', 1), ('KlarevasTiny', 1), ('Brains', 1), ('Don’t', 1), ('Stop', 1), ('These', 1), ('Birds', 1), ('Having', 1), ('Complex', 1), ('SocietyScientists', 1), ('discovered', 1), ('vulturine', 1), ('guineafowl', 1), ('live', 1), ('multilevel', 1), ('societies', 1), ('reminiscent', 1), ('our', 1), ('own', 1), ('Elizabeth', 1), ('PrestonAdvertisementContinue', 1), ('storyTrilobitesMore', 1), ('Trilobites', 1), ('»PhotoCreditMohammed', 1), ('Saber', 1), ('ShutterstockWhy', 1), ('Do', 1), ('Parrots', 1), ('Waste', 1), ('So', 1), ('Much', 1), ('Food', 1), ('behavior', 1), ('so', 1), ('consistent', 1), ('wild', 1), ('think', 1), ('must', 1), ('intentional', 1), ('Cara', 1), ('GiaimoPhotoCreditBelilla', 1), ('J', 1), ('Moreira', 1), ('Jardillier', 1), ('L', 1), ('They', 1), ('Didn’t', 1), ('Find', 1), ('Life', 1), ('Hopeless', 1), ('PlaceIn', 1), ('saltiest', 1), ('acidic', 1), ('bodies', 1), ('superheated', 1), ('water', 1), ('even', 1), ('extreme', 1), ('forms', 1), ('archaea', 1), ('couldn’t', 1), ('survive', 1), ('Robin', 1), ('George', 1), ('AndrewsPhotoCreditRomona', 1), ('Robbins', 1), ('Cultura', 1), ('Creative', 1), ('Ltd', 1), ('AlamyIn', 1), ('Blue', 1), ('Holes', 1), ('Bahamas', 1), ('Secrets', 1), ('Hurricanes', 1), ('PastScientists', 1), ('assembled', 1), ('500', 1), ('history', 1), ('big', 1), ('storm', 1), ('activity', 1), ('retrieving', 1), ('sediment', 1), ('island', 1), ('country’s', 1), ('submarine', 1), ('caverns', 1), ('Katherine', 1), ('KorneiPhotoCreditde', 1), ('Ruiter', 1), ('Journal', 1), ('Royal', 1), ('Society', 1), ('InterfaceThis', 1), ('Fungus', 1), ('Fires', 1), ('Artillery', 1), ('Backs', 1), ('Zombie', 1), ('FliesAfter', 1), ('Entomophthora', 1), ('muscae', 1), ('fatally', 1), ('infects', 1), ('house', 1), ('flies', 1), ('makes', 1), ('microscopic', 1), ('stalks', 1), ('hurtling', 1), ('spores', 1), ('insects', 1), ('come', 1), ('nearby', 1), ('SheikhPhotoCreditShannon', 1), ('HallSearching', 1), ('Rectangular', 1), ('Sun', 1), ('Above', 1), ('Arctic', 1), ('CircleAs', 1), ('polar', 1), ('winter', 1), ('sets', 1), ('during', 1), ('expedition', 1), ('research', 1), ('vessel', 1), ('reporter', 1), ('hopes', 1), ('she’ll', 1), ('catch', 1), ('glimpse', 1), ('brilliant', 1), ('mirage', 1), ('Shannon', 1), ('HallLatestSearchSearchClear', 1), ('this', 1), ('text', 1), ('inputExperts', 1), ('Back', 1), ('Mandatory', 1), ('Bike', 1), ('Helmets', 1), ('Not', 1), ('All', 1), ('Cyclists', 1), ('SoldThe', 1), ('Transportation', 1), ('Safety', 1), ('Board', 1), ('recommended', 1), ('helmets', 1), ('required', 1), ('bicyclists', 1), ('biking', 1), ('enthusiasts', 1), ('object', 1), ('Jacey', 1), ('FortinThe', 1), ('Hidden', 1), ('Cost', 1), ('Gold', 1), ('Birth', 1), ('Defects', 1), ('Brain', 1), ('DamageIndonesia’s', 1), ('mercury', 1), ('trade', 1), ('intertwined', 1), ('illegal', 1), ('gold', 1), ('mining', 1), ('around', 1), ('world', 1), ('leaving', 1), ('legacy', 1), ('thousands', 1), ('born', 1), ('birth', 1), ('defects', 1), ('half', 1), ('million', 1), ('poisoned', 1), ('Richard', 1), ('PaddockInterior', 1), ('Chief’s', 1), ('Lobbying', 1), ('Past', 1), ('Has', 1), ('Challenged', 1), ('Agency’s', 1), ('Ethics', 1), ('RefereesSince', 1), ('arrival', 1), ('Secretary', 1), ('David', 1), ('Bernhardt', 1), ('shown', 1), ('willingness', 1), ('press', 1), ('ethics', 1), ('lawyers', 1), ('decisions', 1), ('agenda', 1), ('Coral', 1), ('DavenportOn', 1), ('Hunt', 1), ('Mushrooms', 1), ('Central', 1), ('OregonMushrooms', 1), ('greatest', 1), ('reminders', 1), ('“in', 1), ('”', 1), ('as', 1), ('Rachel', 1), ('Carson', 1), ('once', 1), ('“nothing', 1), ('exists', 1), ('alone', 1), ('”Photographs', 1), ('Text', 1), ('Stephen', 1), ('HiltnerDeaths', 1), ('3', 1), ('Infants', 1), ('Traced', 1), ('Contaminated', 1), ('Equipment', 1), ('Hospital', 1), ('SaysGeisinger', 1), ('Medical', 1), ('Center', 1), ('Danville', 1), ('Pa', 1), ('said', 1), ('process', 1), ('used', 1), ('prepare', 1), ('donor', 1), ('breast', 1), ('milk', 1), ('was', 1), ('deadly', 1), ('bacterial', 1), ('infections', 1), ('Aimee', 1), ('OrtizNorman', 1), ('Myers', 1), ('Dies', 1), ('85', 1), ('Sounded', 1), ('Early', 1), ('Alarm', 1), ('EnvironmentHe', 1), ('lobbied', 1), ('governments', 1), ('books', 1), ('papers', 1), ('articles', 1), ('alert', 1), ('public', 1), ('looming', 1), ('disasters', 1), ('mass', 1), ('extinction', 1), ('well', 1), ('before', 1), ('they', 1), ('were', 1), ('common', 1), ('knowledge', 1), ('Daniel', 1), ('SlotnikVaping', 1), ('Illnesses', 1), ('Linked', 1), ('Vitamin', 1), ('Acetate', 1), ('SaysSamples', 1), ('lung', 1), ('fluid', 1), ('patients', 1), ('mysterious', 1), ('illness', 1), ('led', 1), ('breakthrough', 1), ('finding', 1), ('possible', 1), ('More', 1), ('than', 1), ('2', 1), ('000', 1), ('been', 1), ('sickened', 1), ('many', 1), ('illicit', 1), ('marijuana', 1), ('based', 1), ('products', 1), ('Denise', 1), ('GradyGlobal', 1), ('healthWho', 1), ('Owns', 1), ('H', 1), ('I', 1), ('V', 1), ('Prevention', 1), ('Drugs', 1), ('Taxpayers', 1), ('U', 1), ('SaysIn', 1), ('unexpected', 1), ('lawsuit', 1), ('officials', 1), ('claim', 1), ('Gilead', 1), ('Sciences', 1), ('willfully', 1), ('disregarded', 1), ('government', 1), ('patents', 1), ('medicines', 1), ('necessary', 1), ('end', 1), ('AIDS', 1), ('epidemic', 1), ('Donald', 1), ('G', 1), ('McNeil', 1), ('Jr', 1), ('Apoorva', 1), ('MandavilliTrump', 1), ('Administration', 1), ('Makes', 1), ('It', 1), ('Easier', 1), ('Dredge', 1), ('Protected', 1), ('Areas', 1), ('Restore', 1), ('BeachesThe', 1), ('change', 1), ('reverses', 1), ('25', 1), ('old', 1), ('policy', 1), ('coastal', 1), ('communities', 1), ('take', 1), ('sand', 1), ('protected', 1), ('ecosystems', 1), ('rebuild', 1), ('beaches', 1), ('washed', 1), ('away', 1), ('hurricanes', 1), ('Christopher', 1), ('FlavelleJuul', 1), ('Ends', 1), ('Cigarette', 1), ('Sales', 1), ('Mint', 1), ('Flavored', 1), ('PodsThe', 1), ('troubled', 1), ('cigarette', 1), ('company', 1), ('moved', 1), ('advance', 1), ('expected', 1), ('ban', 1), ('flavored', 1), ('cigarettes', 1), ('become', 1), ('popular', 1), ('teenage', 1), ('vapers', 1), ('Sheila', 1), ('KaplanShow', 1), ('MoreAdvertisementContinue', 1), ('storySign', 1), ('Up', 1), ('NewsletterEvery', 1), ('week', 1), ('we', 1), ('ll', 1), ('bring', 1), ('you', 1), ('stories', 1), ('capture', 1), ('wonders', 1), ('human', 1), ('body', 1), ('cosmos', 1), ('SIGN', 1), ('UPAdvertisementContinue', 1), ('storyFollow', 1), ('UsNYTimesSciencefacebook', 1), ('NYTimesScience', 1), ('NYTSciencetwitter', 1), ('NYTScienceSite', 1), ('IndexGo', 1), ('Home', 1), ('Page', 1), ('»newshome', 1), ('magazinetravellovelistings', 1), ('moreReader', 1), ('accountnewshome', 1), ('magazinetravellovemoreReader', 1), ('accountSubscribehome', 1), ('deliverydigital', 1), ('subscriptionsCrosswordCookingemail', 1), ('newsletterscorporate', 1), ('subscriptionseducation', 1), ('ratemobile', 1), ('applicationsreplica', 1), ('editionEspañol中文网Site', 1), ('Information', 1), ('Navigation©', 1), ('CompanyContact', 1), ('UsWork', 1), ('usAdvertiseT', 1), ('Brand', 1), ('StudioYour', 1), ('Ad', 1), ('ChoicesPrivacyTerms', 1), ('ServiceTerms', 1), ('SaleSite', 1), ('MapHelpSubscriptions', 1)]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://policy.naver.com/policy/service.html : [('네이버', 88), ('서비스', 70), ('수', 65), ('또는', 48), ('있습니다', 45), ('서비스를', 39), ('네이버는', 33), ('여러분이', 30), ('및', 30), ('경우', 26), ('게시물', 26), ('약관', 25), ('여러분의', 23), ('등', 23), ('관련', 21), ('본', 18), ('통해', 18), ('서비스의', 15), ('등을', 15), ('있도록', 14), ('내용의', 14), ('이용', 14), ('그', 14), ('대한', 13), ('타인의', 13), ('부득이', 13), ('이용을', 13), ('있는', 13), ('운영정책', 13), ('위해', 13), ('다양한', 12), ('네이버가', 12), ('바랍니다', 12), ('개별', 12), ('각', 12), ('계정', 12), ('등의', 12), ('따라', 12), ('해당', 11), ('콘텐츠를', 10), ('이를', 10), ('회원', 10), ('주시기', 10), ('다른', 9), ('기타', 9), ('이에', 9), ('됩니다', 9), ('이용할', 8), ('일부', 8), ('내용은', 8), ('다만', 8), ('고객센터', 8), ('내', 8), ('단체회원', 8), ('보다', 7), ('제공하는', 7), ('네이버의', 7), ('여러분은', 7), ('있으며', 7), ('하는', 7), ('별도의', 7), ('서비스에', 7), ('대해', 7), ('소중히', 6), ('주세요', 6), ('이용과', 6), ('후', 6), ('이용에', 6), ('상의', 6), ('안내', 6), ('등에서', 6), ('확인해', 6), ('여러분께', 6), ('게재한', 6), ('게시물은', 6), ('없는', 6), ('하겠습니다', 6), ('더', 6), ('범위', 6), ('안', 6), ('행위', 6), ('법령', 6), ('이용약관', 5), ('개인정보를', 5), ('관련하여', 5), ('쉽게', 5), ('운영정책을', 5), ('을', 5), ('콘텐츠', 5), ('각종', 5), ('공지사항', 5), ('특별한', 5), ('예', 5), ('이러한', 5), ('계정을', 5), ('상세한', 5), ('삭제', 5), ('관한', 5), ('한편', 5), ('이', 5), ('또한', 5), ('비공개', 5), ('여러분과', 5), ('제한될', 5), ('않는', 5), ('서비스에서의', 5), ('않습니다', 5), ('2018년', 4), ('같은', 4), ('내용을', 4), ('회원으로', 4), ('편리하게', 4), ('제공한', 4), ('것입니다', 4), ('권리를', 4), ('절차를', 4), ('서비스에는', 4), ('광고가', 4), ('언제든지', 4), ('이용계약을', 4), ('변경', 4), ('시', 4), ('소중한', 4), ('이하', 4), ('이용하는', 4), ('정보를', 4), ('운영', 4), ('이용이', 4), ('도움말', 4), ('경우가', 4), ('역시', 4), ('그리고', 4), ('정한', 4), ('초기', 4), ('자신의', 4), ('아이디', 4), ('권한을', 4), ('할', 4), ('것을', 4), ('상에', 4), ('링크', 4), ('여러분에게', 4), ('연구', 4), ('사전에', 4), ('수단을', 4), ('원활한', 4), ('법령에', 4), ('전자메일', 4), ('광고', 4), ('없이', 4), ('포함된', 4), ('전부', 4), ('한', 4), ('변경된', 4), ('1일', 3), ('다룰', 3), ('포인트를', 3), ('활용해', 3), ('보세요', 3), ('제한할', 3), ('잘', 3), ('의견에', 3), ('귀', 3), ('기울이겠습니다', 3), ('사전', 3), ('공지', 3), ('될', 3), ('검색', 3), ('제공', 3), ('가능한', 3), ('확인하실', 3), ('기본적으로', 3), ('일정한', 3), ('내용', 3), ('특정', 3), ('경우에도', 3), ('각각의', 3), ('회원이', 3), ('말합니다', 3), ('ID', 3), ('를', 3), ('개별적으로', 3), ('계정에', 3), ('등은', 3), ('목적으로', 3), ('자체', 3), ('드립니다', 3), ('콘텐츠에', 3), ('수정', 3), ('필요합니다', 3), ('필요한', 3), ('위한', 3), ('만약', 3), ('경우엔', 3), ('제공하기', 3), ('드릴', 3), ('최선을', 3), ('내에', 3), ('제공을', 3), ('안전하게', 3), ('이용하기', 3), ('알림', 3), ('전자적', 3), ('인해', 3), ('발생할', 3), ('등에', 3), ('참고해', 3), ('유의해', 3), ('포인트는', 3), ('판매', 3), ('명백한', 3), ('타인에게', 3), ('자동화된', 3), ('게재된', 3), ('시도', 3), ('회원의', 3), ('약관의', 3), ('내에서', 3), ('이상', 3), ('인하여', 3), ('제공할', 3), ('발생한', 3), ('손해에', 3), ('책임을', 3), ('부담하지', 3), ('일부를', 3), ('경우에는', 3), ('적용', 3), ('30일', 3), ('서비스와', 3), ('NAVER', 2), ('한국어', 2), ('Korean', 2), ('개인정보처리방침', 2), ('청소년보호정책', 2), ('책임의', 2), ('한계와', 2), ('법적고지', 2), ('검색결과', 2), ('정책', 2), ('정보보호', 2), ('인증', 2), ('이전', 2), ('보기', 2), ('5월', 2), ('여러분을', 2), ('환영합니다', 2), ('즐겨보세요', 2), ('가입하시면', 2), ('보호합니다', 2), ('존중해', 2), ('몇', 2), ('가지', 2), ('주의사항이', 2), ('네이버에서', 2), ('요긴하게', 2), ('합리적인', 2), ('준수합니다', 2), ('잘못은', 2), ('책임집니다', 2), ('포함되어', 2), ('해지하실', 2), ('중단', 2), ('꼭', 2), ('알려드리겠습니다', 2), ('주요', 2), ('사항을', 2), ('안내하고', 2), ('알', 2), ('게시하며', 2), ('개정합니다', 2), ('약관은', 2), ('아울러', 2), ('포함하고', 2), ('되므로', 2), ('www', 2), ('naver', 2), ('com을', 2), ('비롯한', 2), ('도메인의', 2), ('웹사이트', 2), ('응용프로그램', 2), ('어플리케이션', 2), ('앱', 2), ('제공하고', 2), ('자유롭게', 2), ('구체적인', 2), ('여러분', 2), ('모두에게', 2), ('다르게', 2), ('약관이', 2), ('적용됩니다만', 2), ('외', 2), ('등이', 2), ('적용될', 2), ('화면에서', 2), ('약관을', 2), ('가입을', 2), ('가입', 2), ('부여합니다', 2), ('설정한', 2), ('단위를', 2), ('회원은', 2), ('이와', 2), ('방법', 2), ('부여하고', 2), ('관리자는', 2), ('구성원', 2), ('따라서', 2), ('별도', 2), ('탈퇴할', 2), ('있고', 2), ('로그인', 2), ('통한', 2), ('사항은', 2), ('원칙적으로', 2), ('부담합니다', 2), ('권한', 2), ('게시물이', 2), ('자신이', 2), ('부호', 2), ('문자', 2), ('음성', 2), ('음향', 2), ('그림', 2), ('사진', 2), ('동영상', 2), ('등으로', 2), ('구성된', 2), ('파일을', 2), ('약속', 2), ('게시물에', 2), ('지식재산권', 2), ('게시물을', 2), ('복제', 2), ('없으며', 2), ('합니다', 2), ('저작권법', 2), ('법령에서', 2), ('정하는', 2), ('바에', 2), ('새로운', 2), ('개발을', 2), ('준수', 2), ('외부', 2), ('수집', 2), ('밖의', 2), ('이용자들의', 2), ('접근을', 2), ('제공되는', 2), ('고객센터를', 2), ('콘텐츠의', 2), ('조치를', 2), ('위하여', 2), ('내에서만', 2), ('개인정보', 2), ('이용자', 2), ('혹은', 2), ('적절한', 2), ('안내해', 2), ('드린', 2), ('정보가', 2), ('해지할', 2), ('명예훼손', 2), ('권리', 2), ('따른', 2), ('되는', 2), ('조건에', 2), ('조건', 2), ('포인트의', 2), ('있으므로', 2), ('운영을', 2), ('있으니', 2), ('다하고', 2), ('서비스에서', 2), ('확인', 2), ('항상', 2), ('사람에게', 2), ('양도', 2), ('대여', 2), ('담보로', 2), ('제공하거나', 2), ('허락해서는', 2), ('아닌', 2), ('직접적이고', 2), ('위협을', 2), ('가하는', 2), ('사생활', 2), ('타인을', 2), ('지속적으로', 2), ('행위를', 2), ('확인된', 2), ('홍보', 2), ('기능을', 2), ('비정상적으로', 2), ('이용하여', 2), ('부합하지', 2), ('나아가', 2), ('수단', 2), ('소프트웨어를', 2), ('금지됩니다', 2), ('따릅니다', 2), ('세부', 2), ('의견이', 2), ('모든', 2), ('확인할', 2), ('정지시키는', 2), ('별도로', 2), ('않으므로', 2), ('고의', 2), ('과실로', 2), ('손해를', 2), ('손해', 2), ('규정이', 2), ('안타까운', 2), ('지체', 2), ('이전에', 2), ('무료로', 2), ('있습니다만', 2), ('상당한', 2), ('예측', 2), ('것이며', 2), ('관련된', 2), ('전달할', 2), ('개정할', 2), ('약관에', 2), ('운영정책이', 2), ('적용됩니다', 2), ('일자', 2), ('00', 2), ('본문바로가기', 1), ('N', 1), ('네이버정책', 1), ('Terms', 1), ('amp', 1), ('Privacy', 1), ('영어', 1), ('English', 1), ('스팸메일정책', 1), ('수집에', 1), ('SOC', 1), ('시행일자', 1), ('이용약관은', 1), ('다음과', 1), ('담고', 1), ('제품', 1), ('‘서비스’', 1), ('이용해', 1), ('주셔서', 1), ('감사합니다', 1), ('주식회사', 1), ('‘네이버’', 1), ('와', 1), ('‘회원’', 1), ('비회원과의', 1), ('관계를', 1), ('설명하며', 1), ('도움이', 1), ('유익한', 1), ('이용하시거나', 1), ('가입하실', 1), ('정책을', 1), ('확인하거나', 1), ('동의하게', 1), ('잠시', 1), ('시간을', 1), ('내시어', 1), ('주의', 1), ('깊게', 1), ('살펴봐', 1), ('정보', 1), ('이용자와의', 1), ('커뮤니케이션', 1), ('상품', 1), ('쇼핑', 1), ('생활에', 1), ('편리함을', 1), ('더할', 1), ('PC', 1), ('휴대폰', 1), ('인터넷', 1), ('단말기를', 1), ('각양각색의', 1), ('이용하실', 1), ('서비스들의', 1), ('웹고객센터', 1), ('이하‘고객센터’', 1), ('동일한', 1), ('제공합니다', 1), ('청소년보호법', 1), ('법령이나', 1), ('제공에서의', 1), ('필요에', 1), ('의해서', 1), ('연령', 1), ('등급을', 1), ('기준으로', 1), ('이용자를', 1), ('구분하여', 1), ('시간', 1), ('횟수', 1), ('제한하는', 1), ('자세한', 1), ('과정에서', 1), ('적용하는', 1), ('네이버페이', 1), ('V', 1), ('LIVE', 1), ('가', 1), ('계열사가', 1), ('LINE', 1), ('SNOW등', 1), ('회사가', 1), ('고유의', 1), ('읽고', 1), ('동의하신', 1), ('신청하실', 1), ('승낙을', 1), ('완료하고', 1), ('‘계정’', 1), ('계정이란', 1), ('로그인한', 1), ('이후', 1), ('이력을', 1), ('별로', 1), ('관리하기', 1), ('식별', 1), ('좀더', 1), ('관련한', 1), ('회원가입', 1), ('단체에', 1), ('속한', 1), ('여러', 1), ('구성원들이', 1), ('공동의', 1), ('계정으로', 1), ('함께', 1), ('계정도', 1), ('구성원들은', 1), ('하나의', 1), ('공유하되', 1), ('각자', 1), ('비밀번호를', 1), ('입력하여', 1), ('로그인하고', 1), ('이용하게', 1), ('단체회원은', 1), ('관리자와', 1), ('멤버로', 1), ('구성되며', 1), ('전부로부터', 1), ('위임', 1), ('받아', 1), ('단체회원을', 1), ('대표하고', 1), ('운용합니다', 1), ('기존', 1), ('개정에', 1), ('동의하거나', 1), ('단체회원에서', 1), ('멤버들의', 1), ('게재', 1), ('관리', 1), ('포함', 1), ('약관에서', 1), ('규정한', 1), ('적용되며', 1), ('구성원은', 1), ('구성원들의', 1), ('관해', 1), ('연대책임을', 1), ('사용에서의', 1), ('관리자', 1), ('멤버', 1), ('공동', 1), ('책임에', 1), ('사항', 1), ('단체', 1), ('소개', 1), ('이용자들에게', 1), ('전달되어', 1), ('우리', 1), ('모두의', 1), ('삶을', 1), ('더욱', 1), ('풍요롭게', 1), ('해줄', 1), ('기대합니다', 1), ('타인', 1), ('보게', 1), ('생각과', 1), ('감정이', 1), ('표현된', 1), ('보호할', 1), ('제작하여', 1), ('권리는', 1), ('당연히', 1), ('적법하게', 1), ('제공하려면', 1), ('저장', 1), ('공중', 1), ('송신', 1), ('전시', 1), ('배포', 1), ('2차적', 1), ('저작물', 1), ('작성', 1), ('단', 1), ('번역에', 1), ('한함', 1), ('기한과', 1), ('지역', 1), ('제한에', 1), ('정함이', 1), ('대가', 1), ('지급이', 1), ('라이선스', 1), ('게재로', 1), ('네이버에게', 1), ('그러한', 1), ('부여하게', 1), ('보유하고', 1), ('있어야', 1), ('부여해', 1), ('주신', 1), ('노출', 1), ('홍보를', 1), ('활용', 1), ('개선', 1), ('웹', 1), ('접근성', 1), ('법률상', 1), ('의무', 1), ('사이트에서의', 1), ('허용을', 1), ('위해서만', 1), ('제한적으로', 1), ('행사할', 1), ('목적을', 1), ('이용하고자', 1), ('설명을', 1), ('드리고', 1), ('동의를', 1), ('받도록', 1), ('콘텐츠는', 1), ('개선하고', 1), ('인공지능', 1), ('분야', 1), ('기술', 1), ('개발', 1), ('계열사에서', 1), ('사용될', 1), ('지속적인', 1), ('좀', 1), ('편리하고', 1), ('유용한', 1), ('제공해', 1), ('다하겠습니다', 1), ('관리할', 1), ('노력하고', 1), ('관리기능이', 1), ('직접', 1), ('통제할', 1), ('통해서도', 1), ('제외', 1), ('요청할', 1), ('처리가', 1), ('어려울', 1), ('주시길', 1), ('부탁', 1), ('동의한', 1), ('목적과', 1), ('이용하며', 1), ('보호', 1), ('관리합니다', 1), ('회원에', 1), ('처리하기', 1), ('기울이는', 1), ('노력이나', 1), ('처리방침에서', 1), ('일정', 1), ('기간', 1), ('동안', 1), ('접속한', 1), ('기록이', 1), ('파기하거나', 1), ('분리', 1), ('보관할', 1), ('이로', 1), ('필수적인', 1), ('부족해질', 1), ('무심코', 1), ('게시물로', 1), ('저작권이', 1), ('침해되거나', 1), ('침해가', 1), ('문제', 1), ('해결을', 1), ('‘정보통신망', 1), ('이용촉진', 1), ('법률’', 1), ('‘저작권법’', 1), ('근거로', 1), ('권리침해', 1), ('주장자의', 1), ('요청에', 1), ('게시중단', 1), ('원', 1), ('게시자의', 1), ('이의신청에', 1), ('게시', 1), ('재개', 1), ('내용으로', 1), ('게시중단요청서비스를', 1), ('운영하고', 1), ('절차는', 1), ('게시중단요청서비스', 1), ('소개를', 1), ('이용한다고', 1), ('하여', 1), ('지식재산권을', 1), ('보유하게', 1), ('것은', 1), ('아닙니다', 1), ('위해서는', 1), ('법률에', 1), ('허용되는', 1), ('있거나', 1), ('지식재산권자로부터', 1), ('허락을', 1), ('받아야', 1), ('하므로', 1), ('각별한', 1), ('주의가', 1), ('마음껏', 1), ('수반되는', 1), ('소프트웨어', 1), ('사용에', 1), ('자유로운', 1), ('이용은', 1), ('제시하는', 1), ('부합하는', 1), ('허용되고', 1), ('권한은', 1), ('양도가', 1), ('불가능하며', 1), ('비독점적', 1), ('법적고지가', 1), ('적용된다는', 1), ('점을', 1), ('효율적으로', 1), ('연동하여', 1), ('임의로', 1), ('책정하거나', 1), ('조정하여', 1), ('지급하는', 1), ('계산', 1), ('갖는', 1), ('가상', 1), ('데이터를', 1), ('재산적', 1), ('가치가', 1), ('없기', 1), ('때문에', 1), ('금전으로', 1), ('환불', 1), ('전환할', 1), ('없지만', 1), ('많고', 1), ('적음에', 1), ('영향을', 1), ('주는', 1), ('경우에', 1), ('적절히', 1), ('효율적', 1), ('지원하거나', 1), ('개선하기', 1), ('전부를', 1), ('조정할', 1), ('기간에', 1), ('주기적으로', 1), ('소멸할', 1), ('수도', 1), ('포인트가', 1), ('부여되는', 1), ('자유롭고', 1), ('이용하고', 1), ('권리가', 1), ('서로', 1), ('존중되고', 1), ('보호받으려면', 1), ('도움과', 1), ('협조가', 1), ('안전한', 1), ('보호를', 1), ('아래와', 1), ('게재나', 1), ('준수를', 1), ('요청', 1), ('이름', 1), ('생년월일', 1), ('휴대전화번호', 1), ('허위로', 1), ('기재해서는', 1), ('등록된', 1), ('정보는', 1), ('정확한', 1), ('최신', 1), ('유지될', 1), ('관리해', 1), ('사용을', 1), ('계정이', 1), ('무단으로', 1), ('사용해서는', 1), ('타인에', 1), ('신체적', 1), ('자해', 1), ('자살을', 1), ('부추기거나', 1), ('권장하는', 1), ('신상정보', 1), ('드러내는', 1), ('따돌리거나', 1), ('괴롭히는', 1), ('성매매를', 1), ('제안', 1), ('알선', 1), ('유인', 1), ('강요하는', 1), ('공공', 1), ('안전에', 1), ('심각한', 1), ('법령상', 1), ('금지되거나', 1), ('형사처벌의', 1), ('대상이', 1), ('수행하거나', 1), ('교사', 1), ('방조하는', 1), ('범죄', 1), ('직접적인', 1), ('위험이', 1), ('금지하고', 1), ('물건', 1), ('판매하는', 1), ('침해하거나', 1), ('모욕', 1), ('침해', 1), ('침해하는', 1), ('내용이', 1), ('자극적이고', 1), ('노골적인', 1), ('성행위를', 1), ('묘사하는', 1), ('성적', 1), ('수치심을', 1), ('유발시키거나', 1), ('왜곡된', 1), ('성', 1), ('의식', 1), ('야기할', 1), ('잔혹감', 1), ('혐오감을', 1), ('일으킬', 1), ('폭력적이고', 1), ('자극적인', 1), ('본인', 1), ('이외의', 1), ('자를', 1), ('사칭하거나', 1), ('허위사실을', 1), ('주장하는', 1), ('기만하는', 1), ('과도한', 1), ('욕설', 1), ('비속어', 1), ('계속하여', 1), ('반복적으로', 1), ('사용하여', 1), ('심한', 1), ('혐오감', 1), ('불쾌감을', 1), ('일으키는', 1), ('활용하는', 1), ('취지와', 1), ('정상적인', 1), ('불편을', 1), ('초래하고', 1), ('방해하므로', 1), ('제한되는', 1), ('허락', 1), ('매크로', 1), ('프로그램', 1), ('로봇', 1), ('봇', 1), ('스파이더', 1), ('스크래퍼', 1), ('가입하거나', 1), ('로그인을', 1), ('로그인하거나', 1), ('게재하거나', 1), ('커뮤니케이션하거나', 1), ('쪽지', 1), ('수집하거나', 1), ('질의어로', 1), ('검색하거나', 1), ('검색결과에서', 1), ('검색결과를', 1), ('선택', 1), ('이른바', 1), ('‘클릭’', 1), ('사람', 1), ('의', 1), ('실제', 1), ('전제로', 1), ('취지에', 1), ('방식으로', 1), ('이용하거나', 1), ('어뷰징', 1), ('남용', 1), ('막기', 1), ('기술적', 1), ('무력화하려는', 1), ('일체의', 1), ('IP를', 1), ('바꿔가며', 1), ('접속하는', 1), ('Captcha를', 1), ('솔루션', 1), ('우회하거나', 1), ('무력화', 1), ('시도해서는', 1), ('동의', 1), ('수단에', 1), ('의해', 1), ('게재되는', 1), ('영역', 1), ('영역에', 1), ('삽입해서는', 1), ('복사', 1), ('수정할', 1), ('역', 1), ('설계', 1), ('소스코드', 1), ('추출', 1), ('분해', 1), ('모방', 1), ('변형하는', 1), ('행위도', 1), ('오픈소스에', 1), ('해당되는', 1), ('밖에', 1), ('바이러스나', 1), ('악성', 1), ('코드를', 1), ('업로드하거나', 1), ('방해할', 1), ('두어', 1), ('안정적이고', 1), ('가능하도록', 1), ('지원하고', 1), ('정책에는', 1), ('참고할', 1), ('유의사항을', 1), ('본문', 1), ('구성', 1), ('페이지', 1), ('정보와', 1), ('담긴', 1), ('드립니다만', 1), ('위배되는', 1), ('처리하거나', 1), ('게재를', 1), ('거부할', 1), ('이것이', 1), ('검토할', 1), ('의무가', 1), ('있다는', 1), ('의미하지는', 1), ('준수하지', 1), ('않을', 1), ('결과에', 1), ('주의를', 1), ('당부하거나', 1), ('일시', 1), ('영구히', 1), ('제한에도', 1), ('불구하고', 1), ('이용계약의', 1), ('온전한', 1), ('유지를', 1), ('기대하기', 1), ('어려운', 1), ('여러분과의', 1), ('제한해야', 1), ('위반이나', 1), ('권리침해로서', 1), ('긴급한', 1), ('위험', 1), ('피해', 1), ('차단이', 1), ('요구되는', 1), ('사안', 1), ('외에는', 1), ('위와', 1), ('단계적', 1), ('이용제한', 1), ('원칙을', 1), ('위반', 1), ('이유로', 1), ('즉시', 1), ('영구', 1), ('획득한', 1), ('포인트', 1), ('혜택', 1), ('모두', 1), ('소멸되고', 1), ('보상하지', 1), ('제한의', 1), ('참고하시기', 1), ('이용함에', 1), ('있어', 1), ('입게', 1), ('배상합니다', 1), ('천재지변', 1), ('준하는', 1), ('불가항력으로', 1), ('없거나', 1), ('이용자의', 1), ('없어', 1), ('대해서', 1), ('손해배상책임을', 1), ('부담하는', 1), ('통상적으로', 1), ('예견이', 1), ('불가능하거나', 1), ('사정으로', 1), ('인한', 1), ('특별', 1), ('간접', 1), ('징벌적', 1), ('대해서는', 1), ('매개로', 1), ('간', 1), ('비회원', 1), ('간의', 1), ('의견', 1), ('교환', 1), ('거래', 1), ('손해나', 1), ('신뢰함으로써', 1), ('대해서도', 1), ('사정이', 1), ('네이버에게는', 1), ('참', 1), ('일입니다만', 1), ('이용계약', 1), ('해지를', 1), ('신청하여', 1), ('회원에서', 1), ('처리하겠습니다', 1), ('이용계약이', 1), ('해지되면', 1), ('개인정보처리방침에', 1), ('보유할', 1), ('경우를', 1), ('제외하고', 1), ('부속된', 1), ('일체를', 1), ('포함한', 1), ('데이터는', 1), ('소멸됨과', 1), ('동시에', 1), ('복구할', 1), ('없게', 1), ('담아갔거나', 1), ('스크랩한', 1), ('게시물과', 1), ('공용', 1), ('게시판에', 1), ('등록한', 1), ('댓글', 1), ('삭제되지', 1), ('반드시', 1), ('해지', 1), ('신청', 1), ('삭제하신', 1), ('탈퇴하시기', 1), ('이용하다', 1), ('보면', 1), ('간혹', 1), ('이용하면서', 1), ('데이터', 1), ('통신요금은', 1), ('가입하신', 1), ('통신사업자와의', 1), ('이용계약에', 1), ('부담하며', 1), ('열람으로', 1), ('추가적으로', 1), ('발생하는', 1), ('비용', 1), ('원하는', 1), ('원하지', 1), ('광고를', 1), ('봐야', 1), ('이는', 1), ('있게', 1), ('해주는', 1), ('데', 1), ('기여하며', 1), ('개발에', 1), ('투자하여', 1), ('나은', 1), ('기반이', 1), ('최근', 1), ('타사의', 1), ('서비스들이', 1), ('강조하며', 1), ('주된', 1), ('유료로', 1), ('관행이', 1), ('뒷받침합니다', 1), ('본의', 1), ('불편이나', 1), ('부담이', 1), ('최소화될', 1), ('방법에', 1), ('고민하고', 1), ('개선해', 1), ('나가겠습니다', 1), ('연중', 1), ('무휴', 1), ('24시간', 1), ('안정적으로', 1), ('컴퓨터', 1), ('서버', 1), ('정보통신설비의', 1), ('보수점검', 1), ('교체', 1), ('고장', 1), ('통신두절', 1), ('운영상', 1), ('이유가', 1), ('중단할', 1), ('개선을', 1), ('필요성이', 1), ('종료할', 1), ('종료하게', 1), ('된', 1), ('보상을', 1), ('하지', 1), ('상당기간', 1), ('전에', 1), ('안내하며', 1), ('불가능한', 1), ('경우라면', 1), ('사후', 1), ('상세히', 1), ('설명하고', 1), ('드리겠습니다', 1), ('중단의', 1), ('백업할', 1), ('합리적이고', 1), ('충분한', 1), ('기회를', 1), ('제공하도록', 1), ('주요사항을', 1), ('적시에', 1), ('힘쓰겠습니다', 1), ('회원에게', 1), ('통지를', 1), ('알려', 1), ('전체에', 1), ('통지가', 1), ('필요할', 1), ('7일', 1), ('화면', 1), ('게시하도록', 1), ('의견이나', 1), ('개선사항을', 1), ('합리적', 1), ('처리과정', 1), ('결과를', 1), ('화면에', 1), ('게시하고', 1), ('수시로', 1), ('법령을', 1), ('위배하지', 1), ('개정', 1), ('이유와', 1), ('일자를', 1), ('알리도록', 1), ('불리할', 1), ('중대한', 1), ('변경의', 1), ('최소', 1), ('공지하고', 1), ('알릴', 1), ('게시한', 1), ('날로부터', 1), ('효력이', 1), ('발생되는', 1), ('날까지', 1), ('변경에', 1), ('의견을', 1), ('기다립니다', 1), ('위', 1), ('기간이', 1), ('지나도록', 1), ('네이버에', 1), ('접수되지', 1), ('않으면', 1), ('데에', 1), ('동의하는', 1), ('것으로', 1), ('간주됩니다', 1), ('네이버로서는', 1), ('매우', 1), ('일이지만', 1), ('동의하지', 1), ('적용을', 1), ('받는', 1), ('제공이', 1), ('불가능하게', 1), ('고유한', 1), ('특성을', 1), ('반영하기', 1), ('추가로', 1), ('때가', 1), ('운영정책에서', 1), ('제공에', 1), ('관하여', 1), ('운영정책과', 1), ('우선하여', 1), ('한국어를', 1), ('정본으로', 1), ('네이버와의', 1), ('관계에는', 1), ('대한민국의', 1), ('법령이', 1), ('사이에', 1), ('분쟁이', 1), ('분쟁의', 1), ('처리는', 1), ('대한민국', 1), ('민사소송법', 1), ('에서', 1), ('3월', 1), ('궁금하신', 1), ('사항이', 1), ('있으시면', 1), ('대표번호', 1), ('1588', 1), ('–', 1), ('3820', 1), ('평일', 1), ('09', 1), ('18', 1), ('로', 1), ('문의', 1), ('2014년', 1), ('6월', 1), ('25일', 1), ('4월', 1), ('top', 1), ('회사소개', 1), ('인재채용', 1), ('제휴제안', 1), ('검색결과수집에', 1), ('이메일주소', 1), ('무단수집', 1), ('거부', 1), ('Copyright', 1), ('ⓒ', 1), ('Corp', 1), ('All', 1), ('Rights', 1), ('Reserved', 1)]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://policy.naver.com/policy/privacy.html : [('및', 77), ('서비스', 61), ('있습니다', 51), ('개인정보', 44), ('개인정보를', 41), ('수', 26), ('네이버', 24), ('이용자', 23), ('이용', 22), ('경우', 22), ('개인정보의', 20), ('네이버는', 19), ('등', 19), ('운영', 18), ('이용자의', 17), ('등을', 17), ('동의를', 16), ('대한', 15), ('위해', 15), ('개인정보처리방침', 14), ('위하여', 14), ('과정에서', 14), ('본', 12), ('수집하는', 12), ('제공', 12), ('정보를', 12), ('수집합니다', 12), ('또는', 11), ('관한', 11), ('바로가기', 10), ('따라', 10), ('이용자가', 10), ('필요한', 10), ('수집', 10), ('통해', 10), ('대해', 9), ('정보', 9), ('회원', 9), ('이용자에게', 9), ('않습니다', 9), ('개인정보가', 9), ('서비스를', 8), ('아래와', 8), ('법정대리인의', 8), ('위한', 8), ('시', 8), ('이용합니다', 8), ('업무', 8), ('보관', 8), ('정보보호', 7), ('또한', 7), ('개인정보처리방침의', 7), ('필수', 7), ('처리', 7), ('개인정보에', 7), ('있으며', 7), ('가입', 7), ('경우에는', 7), ('내용', 7), ('관련', 7), ('해당', 7), ('동의', 7), ('기록', 7), ('안전하게', 7), ('개발', 7), ('NAVER', 6), ('Privacy', 6), ('있는', 6), ('등에', 6), ('같습니다', 6), ('안내사항', 6), ('이를', 6), ('법정대리인', 6), ('미만', 6), ('아동의', 6), ('같이', 6), ('추가', 6), ('서비스의', 6), ('이벤트', 6), ('수집될', 6), ('확인', 6), ('’', 5), ('1', 5), ('2', 5), ('안내', 5), ('어떤', 5), ('이용자는', 5), ('이', 5), ('메일', 5), ('회원가입', 5), ('개인정보는', 5), ('이름', 5), ('등에서', 5), ('등의', 5), ('개인정보처리방침에', 5), ('PC에', 5), ('외부', 5), ('분석', 5), ('외부에', 5), ('중', 5), ('데이터', 5), ('‘네이버', 5), ('제공받는', 5), ('자의', 5), ('amp', 4), ('인증', 4), ('3', 4), ('보호를', 4), ('제공하는', 4), ('법률', 4), ('보호', 4), ('네이버가', 4), ('위탁', 4), ('네이버의', 4), ('보호책임자', 4), ('개정', 4), ('전', 4), ('같은', 4), ('추가로', 4), ('광고', 4), ('gt', 4), ('만', 4), ('14세', 4), ('모바일', 4), ('정보는', 4), ('파기하고', 4), ('경품', 4), ('항목', 4), ('받습니다', 4), ('IP', 4), ('이용한', 4), ('대해서는', 4), ('의미합니다', 4), ('단', 4), ('전에', 4), ('암호화', 4), ('포함', 4), ('프라이버시', 4), ('방지', 4), ('제공하지', 4), ('제공을', 4), ('위탁하는', 4), ('회사의', 4), ('위탁업무', 4), ('업체', 4), ('다른', 4), ('법령에서', 4), ('기간', 4), ('삭제', 4), ('개인정보보호', 4), ('국내', 4), ('2019년', 4), ('이용약관', 3), ('수집에', 3), ('10', 3), ('보기', 3), ('제공합니다', 3), ('보호에', 3), ('내용을', 3), ('수집한', 3), ('행사', 3), ('방법', 3), ('의무', 3), ('용어를', 3), ('사용한', 3), ('가지고', 3), ('권리를', 3), ('발생하는', 3), ('그', 3), ('네이버와', 3), ('권리', 3), ('회원가입을', 3), ('검색', 3), ('등과', 3), ('혹은', 3), ('할', 3), ('시에', 3), ('비밀번호', 3), ('생년월일', 3), ('입력하는', 3), ('DI', 3), ('를', 3), ('그리고', 3), ('주소', 3), ('이메일주소', 3), ('휴대전화번호를', 3), ('설명', 3), ('더보기', 3), ('닫기', 3), ('목적으로', 3), ('이용에', 3), ('언제든지', 3), ('직접', 3), ('수집할', 3), ('회사는', 3), ('정보통신망법', 3), ('에', 3), ('합니다', 3), ('시점에서', 3), ('원칙적으로', 3), ('해당하지', 3), ('있고', 3), ('후', 3), ('‘개인정보', 3), ('내', 3), ('방법으로', 3), ('기기의', 3), ('고유한', 3), ('수도', 3), ('인터넷', 3), ('접속', 3), ('판매', 3), ('하여', 3), ('이후', 3), ('쿠키의', 3), ('다만', 3), ('네이버에', 3), ('웹', 3), ('앱', 3), ('콘텐츠', 3), ('부정', 3), ('제공에', 3), ('결제', 3), ('없이', 3), ('위탁하고', 3), ('이용하지', 3), ('보유', 3), ('시스템', 3), ('아시아', 3), ('배송', 3), ('고객상담', 3), ('휴대폰', 3), ('하에', 3), ('10월', 3), ('naver', 3), ('com', 3), ('것을', 3), ('제공된', 3), ('사전에', 3), ('보관합니다', 3), ('회원의', 3), ('불가능한', 3), ('5년', 3), ('재생이', 3), ('기업', 3), ('최초로', 3), ('kr', 3), ('국번없이', 3), ('N', 2), ('한국어', 2), ('Korean', 2), ('청소년보호정책', 2), ('책임의', 2), ('한계와', 2), ('법적고지', 2), ('정책', 2), ('SOC', 2), ('이전', 2), ('‘EASY버전’', 2), ('쉽고', 2), ('‘인포그래픽’', 2), ('이하', 2), ('‘정보통신망법’', 2), ('개인정보보호법', 2), ('국제', 2), ('영문', 2), ('있어', 2), ('요구하는', 2), ('사항을', 2), ('의의', 2), ('4', 2), ('5', 2), ('파기', 2), ('6', 2), ('권리와', 2), ('7', 2), ('개인정보보호를', 2), ('노력', 2), ('8', 2), ('담당자', 2), ('9', 2), ('적용', 2), ('범위', 2), ('고지', 2), ('쉬운', 2), ('작성', 2), ('것입니다', 2), ('개인정보처리방침은', 2), ('중요한', 2), ('자신의', 2), ('행사할', 2), ('알려드립니다', 2), ('부모', 2), ('만14세', 2), ('피해를', 2), ('이미', 2), ('발생한', 2), ('받을', 2), ('하지', 2), ('않아도', 2), ('대부분의', 2), ('이용할', 2), ('캘린더', 2), ('블로그', 2), ('회원제', 2), ('이용하기', 2), ('이용을', 2), ('이용자로부터', 2), ('성별', 2), ('필수항목으로', 2), ('휴대전화번호', 2), ('선택항목으로', 2), ('이메일', 2), ('단체아이디로', 2), ('차이', 2), ('정보이며', 2), ('제공하기', 2), ('아이디', 2), ('운영에', 2), ('따르는', 2), ('가입인증', 2), ('조치', 2), ('‘NAVER', 2), ('내정보', 2), ('의', 2), ('받고', 2), ('수집된', 2), ('단체정보의', 2), ('여부', 2), ('연락처', 2), ('수집하기', 2), ('이용자에', 2), ('발생할', 2), ('이용내역', 2), ('확인하기', 2), ('쿠키', 2), ('위치정보가', 2), ('생성되어', 2), ('이미지', 2), ('원래의', 2), ('값을', 2), ('네이버에서', 2), ('서비스에', 2), ('규정하고', 2), ('기기에', 2), ('부여하는', 2), ('매우', 2), ('일시', 2), ('일체', 2), ('가능한', 2), ('모두', 2), ('OS', 2), ('후에', 2), ('웹사이트를', 2), ('웹사이트에서', 2), ('다시', 2), ('빈도', 2), ('한', 2), ('관심에', 2), ('쿠키에', 2), ('모든', 2), ('저장을', 2), ('거부할', 2), ('있을', 2), ('센터', 2), ('아래의', 2), ('방법을', 2), ('하고', 2), ('정보통신망법에', 2), ('제반', 2), ('안전한', 2), ('이용환경', 2), ('의사의', 2), ('진행', 2), ('회원탈퇴', 2), ('기존', 2), ('기반한', 2), ('본인인증', 2), ('프로모션', 2), ('보안', 2), ('사전', 2), ('경우에', 2), ('제공하고', 2), ('일부를', 2), ('업체에', 2), ('관리', 2), ('수탁업체에', 2), ('위탁관련', 2), ('사항', 2), ('수탁업체', 2), ('이용기간', 2), ('계약', 2), ('퍼시픽', 2), ('Service㈜', 2), ('테스트', 2), ('인프라', 2), ('해피빈', 2), ('정산', 2), ('China', 2), ('인공지능', 2), ('CS', 2), ('물품', 2), ('전송', 2), ('부동산', 2), ('㈜KG', 2), ('결제처리', 2), ('기타', 2), ('처리하는', 2), ('업무를', 2), ('비즈니스', 2), ('플랫폼', 2), ('아래', 2), ('통제', 2), ('수행하고', 2), ('2016년', 2), ('privacy', 2), ('규정된', 2), ('보관기간과', 2), ('일치함', 2), ('제3자', 2), ('제공되는', 2), ('이후에는', 2), ('자', 2), ('고지하고', 2), ('처리위탁은', 2), ('제공한', 2), ('갈음할', 2), ('공개하는', 2), ('것으로', 2), ('외에', 2), ('지체없이', 2), ('보관기간에', 2), ('얻은', 2), ('의무를', 2), ('동안', 2), ('경우는', 2), ('6개월간', 2), ('보관하고', 2), ('번호', 2), ('막기', 2), ('QR코드', 2), ('서비스에서', 2), ('등록한', 2), ('복구', 2), ('요청', 2), ('등록', 2), ('1년간', 2), ('전자상거래', 2), ('소비자', 2), ('전자금융거래법', 2), ('통신비밀보호법', 2), ('불만', 2), ('파기합니다', 2), ('않도록', 2), ('이용하여', 2), ('조회하거나', 2), ('수정할', 2), ('철회할', 2), ('정정을', 2), ('제3자에게', 2), ('유출되거나', 2), ('통하여', 2), ('최소한으로', 2), ('교육', 2), ('전사', 2), ('운영하고', 2), ('전문', 2), ('활동에', 2), ('검증을', 2), ('인증인', 2), ('인증’', 2), ('름', 2), ('소', 2), ('속', 2), ('Data', 2), ('Protection', 2), ('직', 2), ('위', 2), ('화', 2), ('1588', 2), ('3820', 2), ('메', 2), ('일', 2), ('문의하기', 2), ('www', 2), ('go', 2), ('개인정보처리방침이', 2), ('최소', 2), ('본문바로가기', 1), ('네이버정책', 1), ('Terms', 1), ('영어', 1), ('English', 1), ('스팸메일정책', 1), ('검색결과', 1), ('처리방침', 1), ('Ver', 1), ('여러', 1), ('경영요소', 1), ('가운데', 1), ('최우선의', 1), ('가치로', 1), ('두고', 1), ('네이버에서만', 1), ('특별한', 1), ('편하게', 1), ('이해할', 1), ('그림으로', 1), ('쉽게', 1), ('만나보는', 1), ('네이버주식회사', 1), ('‘네이버’', 1), ('회사’', 1), ('는', 1), ('기획부터', 1), ('종료까지', 1), ('정보통신망', 1), ('이용촉진', 1), ('국내의', 1), ('법령을', 1), ('철저히', 1), ('준수합니다', 1), ('OECD의', 1), ('가이드라인', 1), ('기준을', 1), ('준수하여', 1), ('‘개인정보보호법’', 1), ('‘OECD', 1), ('Guidelines', 1), ('목차는', 1), ('일부는', 1), ('관계법령이', 1), ('작성에', 1), ('포함하였고', 1), ('나머지는', 1), ('자체적으로', 1), ('중요하다', 1), ('판단하는', 1), ('추가하였습니다', 1), ('개인정보처리방침을', 1), ('정보통신망법을', 1), ('기준으로', 1), ('작성하되', 1), ('내에서의', 1), ('현황을', 1), ('최대한', 1), ('알기', 1), ('상세하게', 1), ('설명하기', 1), ('노력하였습니다', 1), ('이는', 1), ('원칙인', 1), ('‘Plain', 1), ('Language', 1), ('Policy', 1), ('’를', 1), ('도입한', 1), ('‘쉬운', 1), ('체크리스트', 1), ('다음과', 1), ('의미를', 1), ('수집하고', 1), ('어떻게', 1), ('사용하며', 1), ('필요에', 1), ('누구와', 1), ('공유', 1), ('‘위탁', 1), ('제공’', 1), ('하며', 1), ('이용목적을', 1), ('달성한', 1), ('언제·어떻게', 1), ('파기하는지', 1), ('‘개인정보의', 1), ('한살이’와', 1), ('관련한', 1), ('투명하게', 1), ('정보주체로서', 1), ('방법과', 1), ('절차로', 1), ('있는지를', 1), ('있는지도', 1), ('함께', 1), ('안내합니다', 1), ('침해사고가', 1), ('추가적인', 1), ('예방하고', 1), ('복구하기', 1), ('누구에게', 1), ('연락하여', 1), ('도움을', 1), ('있는지', 1), ('무엇보다도', 1), ('개인정보와', 1), ('관련하여', 1), ('이용자간의', 1), ('관계를', 1), ('규정하여', 1), ('‘개인정보자기결정권’을', 1), ('보장하는', 1), ('수단이', 1), ('됩니다', 1), ('뉴스', 1), ('회원과', 1), ('동일하게', 1), ('카페', 1), ('개인화', 1), ('최소한의', 1), ('시점에', 1), ('‘아이디', 1), ('휴대전화번호’를', 1), ('만약', 1), ('생년월일이', 1), ('아동일', 1), ('중복가입확인정보', 1), ('프로필', 1), ('단체아이디', 1), ('단체이름', 1), ('단체', 1), ('대표자명을', 1), ('필수항목과', 1), ('선택항목의', 1), ('필수항목이란', 1), ('본질적', 1), ('기능을', 1), ('수행하기', 1), ('선택항목이란', 1), ('자체에', 1), ('영향을', 1), ('미치지는', 1), ('않으나', 1), ('부가적인', 1), ('가치를', 1), ('정보입니다', 1), ('비밀번호는', 1), ('로그인을', 1), ('성별은', 1), ('구분을', 1), ('사용됩니다', 1), ('휴대폰번호는', 1), ('불법', 1), ('게시', 1), ('부정한', 1), ('시도하는', 1), ('이용제한', 1), ('적용하기', 1), ('선택항목은', 1), ('입력을', 1), ('가입이나', 1), ('제한이', 1), ('없으며', 1), ('필요할', 1), ('회원정보', 1), ('연락처’에서', 1), ('사후에', 1), ('입력하실', 1), ('이유', 1), ('제31조', 1), ('보호자', 1), ('받아야', 1), ('이에', 1), ('휴대폰번호', 1), ('시에만', 1), ('아동이', 1), ('성년이', 1), ('되는', 1), ('인정', 1), ('정의하는', 1), ('‘살아있는', 1), ('자연인에', 1), ('정보’를', 1), ('말합니다', 1), ('따라서', 1), ('단체명', 1), ('영업소', 1), ('전화번호', 1), ('대표자', 1), ('성명', 1), ('법인이나', 1), ('단체에', 1), ('하지만', 1), ('개인', 1), ('사업자', 1), ('단체정보로만', 1), ('처리하기', 1), ('모호한', 1), ('측면이', 1), ('관리자', 1), ('담당자의', 1), ('때문에', 1), ('개인정보처리방침에서는', 1), ('기재하여', 1), ('이해를', 1), ('돕고', 1), ('내의', 1), ('개별', 1), ('응모', 1), ('신청', 1), ('한해', 1), ('수집이', 1), ('‘수집하는', 1), ('이용목적', 1), ('보관기간’에', 1), ('드리고', 1), ('기기정보', 1), ('음성을', 1), ('이미지나', 1), ('음성이', 1), ('구체적으로', 1), ('자동화된', 1), ('생성하여', 1), ('저장', 1), ('하거나', 1), ('확인하지', 1), ('못', 1), ('하도록', 1), ('변환하여', 1), ('위치기반', 1), ('위치정보', 1), ('에서', 1), ('자세하게', 1), ('이와', 1), ('개인정보와의', 1), ('연계', 1), ('해당할', 1), ('않을', 1), ('생성정보', 1), ('Internet', 1), ('Protocol', 1), ('주소란', 1), ('주소는', 1), ('망', 1), ('사업자가', 1), ('인터넷에', 1), ('접속하는', 1), ('PC', 1), ('온라인', 1), ('주소정보', 1), ('입니다', 1), ('주소가', 1), ('해당하는지', 1), ('여부에', 1), ('각국마다', 1), ('다양한', 1), ('견해가', 1), ('이용기록이란', 1), ('목록', 1), ('정상', 1), ('비정상', 1), ('로그', 1), ('수발신', 1), ('기록되는', 1), ('친구', 1), ('초대하기', 1), ('선물하기', 1), ('기기정보란', 1), ('기재된', 1), ('기기정보는', 1), ('생산', 1), ('부여된', 1), ('정보뿐', 1), ('아니라', 1), ('구동을', 1), ('사용되는', 1), ('S', 1), ('W를', 1), ('일컫습니다', 1), ('Windows', 1), ('MAC', 1), ('설치', 1), ('컴퓨터의', 1), ('장착된', 1), ('주변기기의', 1), ('일련번호', 1), ('스마트폰의', 1), ('통신에', 1), ('식별값', 1), ('IMEI', 1), ('IMSI', 1), ('AAID', 1), ('IDFA', 1), ('설정언어', 1), ('설정', 1), ('표준시', 1), ('USIM의', 1), ('통신사', 1), ('코드', 1), ('IMEI와', 1), ('식별값을', 1), ('필요가', 1), ('네이버도', 1), ('알아볼', 1), ('없는', 1), ('방식으로', 1), ('식별성', 1), ('Identifiability', 1), ('을', 1), ('제거한', 1), ('cookie', 1), ('란', 1), ('쿠키는', 1), ('접속할', 1), ('때에', 1), ('웹브라우저를', 1), ('저장하는', 1), ('작은', 1), ('크기의', 1), ('텍스트', 1), ('파일입니다', 1), ('방문할', 1), ('웹사이트', 1), ('서버는', 1), ('저장된', 1), ('읽어', 1), ('설정한', 1), ('환경을', 1), ('유지하여', 1), ('편리한', 1), ('가능케', 1), ('방문한', 1), ('시간', 1), ('생성된', 1), ('입력', 1), ('분석하여', 1), ('취향과', 1), ('특화된', 1), ('제공할', 1), ('선택권을', 1), ('웹브라우저에서', 1), ('옵션을', 1), ('설정함으로써', 1), ('쿠키를', 1), ('허용하거나', 1), ('쿠키가', 1), ('저장될', 1), ('때마다', 1), ('확인을', 1), ('거치거나', 1), ('아니면', 1), ('로그인이', 1), ('일부', 1), ('불편이', 1), ('자세한', 1), ('알아보기', 1), ('고객센터를', 1), ('통한', 1), ('상담', 1), ('웹페이지', 1), ('팩스', 1), ('전화', 1), ('오프라인에서', 1), ('진행되는', 1), ('세미나', 1), ('서면을', 1), ('제휴한', 1), ('기업이나', 1), ('단체로부터', 1), ('제공받을', 1), ('이러한', 1), ('제휴사에서', 1), ('받은', 1), ('기기정보와', 1), ('생성정보는', 1), ('PC웹', 1), ('자동으로', 1), ('회원관리', 1), ('개발·제공', 1), ('향상', 1), ('구축', 1), ('목적으로만', 1), ('연령', 1), ('본인', 1), ('식별', 1), ('회원관리를', 1), ('더하여', 1), ('인구통계학적', 1), ('방문', 1), ('이용기록의', 1), ('이용자간', 1), ('관계의', 1), ('형성', 1), ('지인', 1), ('관심사', 1), ('맞춤형', 1), ('신규', 1), ('요소의', 1), ('발굴', 1), ('개선', 1), ('법령', 1), ('이용약관을', 1), ('위반하는', 1), ('회원에', 1), ('제한', 1), ('행위를', 1), ('포함하여', 1), ('원활한', 1), ('지장을', 1), ('주는', 1), ('행위에', 1), ('제재', 1), ('계정도용', 1), ('부정거래', 1), ('약관', 1), ('고지사항', 1), ('전달', 1), ('분쟁조정을', 1), ('보존', 1), ('민원처리', 1), ('운영을', 1), ('유료', 1), ('구매', 1), ('요금', 1), ('상품', 1), ('배송을', 1), ('참여기회', 1), ('광고성', 1), ('마케팅', 1), ('이용기록과', 1), ('통계', 1), ('통계에', 1), ('따른', 1), ('맞춤', 1), ('게재', 1), ('안전', 1), ('측면에서', 1), ('안심하고', 1), ('구축을', 1), ('제휴사의', 1), ('법령에', 1), ('의거해', 1), ('제출', 1), ('의무가', 1), ('생명이나', 1), ('안전에', 1), ('급박한', 1), ('위험이', 1), ('확인되어', 1), ('해소하기', 1), ('한하여', 1), ('제공이', 1), ('법률에', 1), ('의한', 1), ('투명성', 1), ('보고서', 1), ('관계', 1), ('편리하고', 1), ('더', 1), ('나은', 1), ('위탁받은', 1), ('업체가', 1), ('처리하도록', 1), ('감독을', 1), ('업무와', 1), ('관련된', 1), ('않는', 1), ('제공되지', 1), ('비즈니스플랫폼㈜', 1), ('탈퇴시', 1), ('종료시까지', 1), ('비즈니스플랫폼', 1), ('아이앤에스㈜', 1), ('구입', 1), ('지원', 1), ('Tech', 1), ('NIT', 1), ('㈜인컴즈', 1), ('그린웹서비스㈜', 1), ('㈜컴파트너스', 1), ('웍스', 1), ('모바일㈜', 1), ('주소록', 1), ('메모', 1), ('클라우드', 1), ('오피스', 1), ('재단', 1), ('㈜코즈웍스', 1), ('네이버웹툰㈜', 1), ('디지털', 1), ('후원', 1), ('e북', 1), ('네이버파이낸셜㈜', 1), ('도용', 1), ('문화재단', 1), ('문화', 1), ('네이버뮤직', 1), ('온스테이지', 1), ('㈜오디언소리', 1), ('오디오클립', 1), ('㈜에버영코리아', 1), ('㈜마크티', 1), ('스피커', 1), ('인포마크', 1), ('스피커의', 1), ('AS', 1), ('㈜타이드스퀘어', 1), ('패키지', 1), ('여행', 1), ('물류', 1), ('인포뱅크', 1), ('문자서비스', 1), ('㈜세종텔레콤', 1), ('㈜아톤', 1), ('안심번호', 1), ('사', 1), ('한국인터넷자율정책기구', 1), ('㈜트랜스코스모스코리아', 1), ('㈜컨펌스', 1), ('매물', 1), ('한국거래소시스템즈', 1), ('Korea', 1), ('Marketplace', 1), ('Systems', 1), ('관심', 1), ('분양', 1), ('㈜와이지플러스', 1), ('뮤직', 1), ('저작권료', 1), ('한국마이크로소프트', 1), ('유', 1), ('스마트렌즈를', 1), ('얼굴', 1), ('촬영', 1), ('MS', 1), ('FACE', 1), ('API', 1), ('사용', 1), ('㈜케이에스넷', 1), ('㈜KG이니시스', 1), ('㈜엔에이치엔KCP', 1), ('㈜효성', 1), ('FMS', 1), ('㈜LG', 1), ('U', 1), ('올앳', 1), ('모빌리언스', 1), ('무통장', 1), ('입금', 1), ('계좌이체', 1), ('신용카드', 1), ('지류상품권', 1), ('결제수단', 1), ('환불계좌', 1), ('결제도용', 1), ('NICE평가정보㈜', 1), ('에스씨아이평가정보㈜', 1), ('㈜KG모빌리언스', 1), ('㈜드림시큐리티', 1), ('본인확인', 1), ('처리위탁', 1), ('국외법인에서', 1), ('위탁업무는', 1), ('국외의', 1), ('사업자에게', 1), ('퍼시픽’과', 1), ('차이나’에', 1), ('두', 1), ('계열사로서', 1), ('동일한', 1), ('정책에', 1), ('보호하며', 1), ('엄격한', 1), ('BUSINESS', 1), ('PLATFORM', 1), ('ASIA', 1), ('PACIFIC', 1), ('PTE', 1), ('LTD', 1), ('차이나', 1), ('수탁업체의', 1), ('위치', 1), ('홍콩', 1), ('RM', 1), ('1808', 1), ('18', 1), ('F', 1), ('HARCOURT', 1), ('RD', 1), ('ADMIRALTY', 1), ('HONG', 1), ('KONG', 1), ('중국', 1), ('北京市朝阳区广顺北大街', 1), ('33号院', 1), ('1号楼福码大厦', 1), ('B座', 1), ('10层', 1), ('1001室', 1), ('1일사설', 1), ('전용', 1), ('네트워크를', 1), ('원격지', 1), ('9월', 1), ('26일사내', 1), ('시스템에', 1), ('접속하여', 1), ('정보관리책임자', 1), ('nbpcc', 1), ('nv', 1), ('china', 1), ('보관하는', 1), ('포함하는', 1), ('IP주소', 1), ('가입일시', 1), ('국가', 1), ('재난', 1), ('재해', 1), ('등으로부터', 1), ('국가간', 1), ('백업', 1), ('검수', 1), ('위탁에', 1), ('제공과', 1), ('위탁의', 1), ('제공은', 1), ('처리와', 1), ('이익을', 1), ('책임', 1), ('처리됩니다', 1), ('이런', 1), ('이유로', 1), ('위해서는', 1), ('‘개인정보를', 1), ('목적', 1), ('기간’에', 1), ('처리를', 1), ('이후에도', 1), ('즉', 1), ('위탁자에게', 1), ('수탁', 1), ('감독', 1), ('책임이', 1), ('발생합니다', 1), ('동의가', 1), ('위탁업무와', 1), ('공개', 1), ('통지로', 1), ('계약을', 1), ('이행하고', 1), ('편의', 1), ('증진', 1), ('통지하거나', 1), ('처리위탁에', 1), ('‘수탁', 1), ('내용’을', 1), ('받아야만', 1), ('처리위탁을', 1), ('갈음합니다', 1), ('탈퇴', 1), ('별도의', 1), ('일정', 1), ('정보보관', 1), ('부과하는', 1), ('부정가입', 1), ('징계기록', 1), ('부정이용기록은', 1), ('방지를', 1), ('시점으로부터', 1), ('부정이용기록', 1), ('가', 1), ('부정이용으로', 1), ('징계를', 1), ('받기', 1), ('탈퇴를', 1), ('반복하며', 1), ('이용하는', 1), ('사례를', 1), ('탈퇴한', 1), ('복호화가', 1), ('일방향', 1), ('해시', 1), ('연락처를', 1), ('대응을', 1), ('시점으로', 1), ('부터', 1), ('6개월', 1), ('스마트', 1), ('플레이스', 1), ('분쟁', 1), ('조정', 1), ('고객문의', 1), ('수정', 1), ('요청시', 1), ('시로부터', 1), ('최대', 1), ('등에서의', 1), ('일정기간', 1), ('정보의', 1), ('보관을', 1), ('규정하는', 1), ('법령의', 1), ('규정에', 1), ('보관하며', 1), ('목적으로는', 1), ('절대', 1), ('청약철회', 1), ('대금결제', 1), ('재화', 1), ('공급에', 1), ('소비자의', 1), ('분쟁처리에', 1), ('3년', 1), ('전자금융에', 1), ('로그인', 1), ('3개월', 1), ('종료', 1), ('동의받은', 1), ('보유기간의', 1), ('도래와', 1), ('이용목적이', 1), ('달성된', 1), ('보존의무를', 1), ('부과한', 1), ('정보에', 1), ('대해서도', 1), ('경과', 1), ('전자적', 1), ('파일', 1), ('형태의', 1), ('되지', 1), ('기술적인', 1), ('삭제하며', 1), ('출력물', 1), ('등은', 1), ('분쇄하거나', 1), ('소각하는', 1), ('방식', 1), ('등으로', 1), ('참고로', 1), ('유효기간제’에', 1), ('않은', 1), ('별도로', 1), ('분리', 1), ('보관하여', 1), ('관리하고', 1), ('회원정보’에서', 1), ('‘회원탈퇴’', 1), ('법정대리인이', 1), ('가집니다', 1), ('오류에', 1), ('요청한', 1), ('완료하기', 1), ('전까지', 1), ('잘못된', 1), ('정정', 1), ('처리결과를', 1), ('지체', 1), ('통지하여', 1), ('정정이', 1), ('이루어지도록', 1), ('하겠습니다', 1), ('관리하기', 1), ('최선을', 1), ('다하며', 1), ('개인정보보호법에서', 1), ('수준', 1), ('이상으로', 1), ('보호하고', 1), ('암호화하고', 1), ('암호화를', 1), ('요구하고', 1), ('고유식별정보', 1), ('계좌번호', 1), ('카드번호', 1), ('주소와', 1), ('대내외의', 1), ('위협으로부터', 1), ('관리합니다', 1), ('해킹이나', 1), ('컴퓨터', 1), ('바이러스', 1), ('의해', 1), ('훼손되는', 1), ('외부로부터', 1), ('접근이', 1), ('통제된', 1), ('구역에', 1), ('시스템을', 1), ('설치하고', 1), ('훼손에', 1), ('대비해서', 1), ('자료를', 1), ('수시로', 1), ('백업하고', 1), ('최신', 1), ('백신프로그램을', 1), ('이용자들의', 1), ('개인정보나', 1), ('자료가', 1), ('손상되지', 1), ('방지하고', 1), ('통신', 1), ('네트워크상에서', 1), ('송수신하고', 1), ('개인정보취급자를', 1), ('유지하고', 1), ('직원을', 1), ('관리하며', 1), ('개인정보처리시스템에서', 1), ('다운로드가', 1), ('직원들의', 1), ('업무용', 1), ('인터넷망과', 1), ('내부망을', 1), ('분리하여', 1), ('유출', 1), ('가능성을', 1), ('줄이고', 1), ('개인정보취급자에', 1), ('정기', 1), ('임직원에', 1), ('수시', 1), ('캠페인을', 1), ('보호가', 1), ('가장', 1), ('가치임을', 1), ('끊임없이', 1), ('강조하고', 1), ('전담', 1), ('조직을', 1), ('2007년에', 1), ('고객정보보호팀을', 1), ('만든', 1), ('바', 1), ('현재도', 1), ('Security에서', 1), ('임직원이', 1), ('올바르게', 1), ('준수할', 1), ('있도록', 1), ('기술적', 1), ('관리적', 1), ('보호조치를', 1), ('상시', 1), ('사이트를', 1), ('블로그를', 1), ('개설하여', 1), ('이용자와', 1), ('소통하고', 1), ('프라이버시센터를', 1), ('as', 1), ('a', 1), ('Service', 1), ('로', 1), ('보호활동’', 1), ('블로그’', 1), ('국내외', 1), ('인증기관으로부터', 1), ('ISO', 1), ('IEC', 1), ('27001', 1), ('2013', 1), ('PIMS·ISMS를', 1), ('기관으로부터', 1), ('정기적으로', 1), ('미국', 1), ('공인회계사협회의', 1), ('감사', 1), ('기준에', 1), ('내부', 1), ('수준을', 1), ('검증받고', 1), ('결과를', 1), ('리포트로', 1), ('발간하고', 1), ('‘정보보호', 1), ('‘SOC', 1), ('문의사항', 1), ('담당자를', 1), ('지정하고', 1), ('이진규', 1), ('CPO', 1), ('보호담당자', 1), ('이재림', 1), ('리더', 1), ('침해에', 1), ('신고나', 1), ('상담이', 1), ('기관에', 1), ('문의', 1), ('가능합니다', 1), ('개인정보침해신고센터', 1), ('kisa', 1), ('or', 1), ('118', 1), ('대검찰청', 1), ('사이버수사과', 1), ('spo', 1), ('1301', 1), ('경찰청', 1), ('사이버안전국', 1), ('cyberbureau', 1), ('police', 1), ('182', 1), ('브랜드', 1), ('하나인', 1), ('적용되며', 1), ('브랜드로', 1), ('별개의', 1), ('적용될', 1), ('링크되어', 1), ('적용되지', 1), ('수정이', 1), ('7일', 1), ('‘공지사항’을', 1), ('공지를', 1), ('이용목적의', 1), ('변경', 1), ('권리의', 1), ('중대한', 1), ('변경이', 1), ('때에는', 1), ('30일', 1), ('공지하며', 1), ('필요', 1), ('공고일자', 1), ('24일', 1), ('시행일자', 1), ('11월', 1), ('01일', 1), ('8월', 1), ('28일', 1), ('31일', 1), ('top', 1), ('회사소개', 1), ('인재채용', 1), ('제휴제안', 1), ('검색결과수집에', 1), ('무단수집', 1), ('거부', 1), ('고객센터', 1), ('Copyright', 1), ('ⓒ', 1), ('Corp', 1), ('All', 1), ('Rights', 1), ('Reserved', 1)]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://en.wikipedia.org/wiki/Python_(programming_language) : [('Python', 431), ('the', 266), ('and', 242), ('a', 199), ('91', 197), ('93', 197), ('of', 182), ('to', 172), ('in', 153), ('is', 136), ('Retrieved', 133), ('3', 115), ('for', 109), ('2', 92), ('as', 80), ('The', 76), ('160', 65), ('from', 61), ('with', 60), ('are', 59), ('language', 55), ('1', 52), ('0', 52), ('C', 51), ('s', 51), ('5', 50), ('Software', 49), ('on', 47), ('be', 45), ('programming', 43), ('Foundation', 43), ('org', 42), ('that', 40), ('7', 38), ('by', 38), ('or', 38), ('PEP', 37), ('2012', 37), ('which', 35), ('code', 34), ('it', 32), ('b', 32), ('used', 31), ('2019', 30), ('has', 30), ('was', 28), ('edit', 28), ('February', 28), ('languages', 26), ('March', 25), ('4', 24), ('python', 24), ('an', 24), ('Rossum', 24), ('its', 24), ('also', 24), ('December', 24), ('November', 24), ('software', 24), ('object', 23), ('can', 23), ('van', 22), ('Guido', 22), ('use', 22), ('A', 22), ('2009', 22), ('Java', 21), ('24', 21), ('at', 21), ('It', 21), ('not', 21), ('6', 20), ('x', 20), ('July', 20), ('statement', 20), ('2011', 20), ('other', 19), ('standard', 19), ('January', 19), ('such', 19), ('than', 19), ('division', 19), ('August', 19), ('19', 18), ('operator', 18), ('8', 17), ('20', 17), ('Programming', 17), ('CPython', 17), ('September', 17), ('lt', 17), ('Language', 17), ('June', 17), ('10', 16), ('many', 16), ('version', 16), ('syntax', 16), ('type', 16), ('immutable', 16), ('2013', 16), ('Enhancement', 16), ('–', 16), ('17', 15), ('source', 15), ('documentation', 15), ('In', 15), ('expressions', 15), ('May', 15), ('Proposals', 15), ('uses', 14), ('9', 14), ('including', 14), ('library', 14), ('like', 14), ('2008', 14), ('2015', 14), ('2018', 14), ('example', 14), ('types', 14), ('2010', 14), ('October', 13), ('15', 13), ('e', 13), ('name', 13), ('method', 13), ('This', 13), ('written', 13), ('if', 13), ('number', 13), ('string', 13), ('Web', 13), ('2007', 13), ('Archived', 13), ('original', 13), ('11', 12), ('12', 12), ('13', 12), ('features', 12), ('list', 12), ('block', 12), ('class', 12), ('release', 12), ('2016', 12), ('ISBN', 12), ('com', 12), ('April', 12), ('For', 11), ('oriented', 11), ('design', 11), ('reference', 11), ('implementation', 11), ('development', 11), ('new', 11), ('functions', 11), ('An', 11), ('this', 11), ('g', 11), ('value', 11), ('but', 11), ('expression', 11), ('2017', 11), ('14', 10), ('22', 10), ('Ruby', 10), ('released', 10), ('support', 10), ('modules', 10), ('into', 10), ('more', 10), ('time', 10), ('statements', 10), ('gt', 10), ('round', 10), ('Google', 10), ('Free', 10), ('978', 10), ('PyPy', 9), ('Perl', 9), ('first', 9), ('implementations', 9), ('2006', 9), ('variable', 9), ('similar', 9), ('y', 9), ('most', 9), ('function', 9), ('compiles', 9), ('TIOBE', 9), ('2014', 9), ('Open', 9), ('Wikipedia', 8), ('29', 8), ('philosophy', 8), ('large', 8), ('27', 8), ('typed', 8), ('often', 8), ('major', 8), ('after', 8), ('will', 8), ('available', 8), ('History', 8), ('amp', 8), ('include', 8), ('program', 8), ('some', 8), ('all', 8), ('applications', 8), ('interpreter', 8), ('while', 8), ('eggs', 8), ('have', 8), ('style', 8), ('where', 8), ('programs', 8), ('using', 8), ('same', 8), ('t', 8), ('may', 8), ('three', 8), ('c', 8), ('Type', 8), ('classes', 8), ('Index', 8), ('2003', 8), ('Release', 8), ('ed', 8), ('level', 7), ('32', 7), ('21', 7), ('since', 7), ('JavaScript', 7), ('2000', 7), ('30', 7), ('open', 7), ('generators', 7), ('project', 7), ('core', 7), ('39', 7), ('then', 7), ('names', 7), ('one', 7), ('indentation', 7), ('contain', 7), ('objects', 7), ('data', 7), ('import', 7), ('Some', 7), ('libraries', 7), ('part', 7), ('operators', 7), ('third', 7), ('New', 7), ('precision', 7), ('machine', 7), ('been', 7), ('releases', 7), ('Linux', 7), ('—', 7), ('Chris', 7), ('PDF', 7), ('functional', 6), ('26', 6), ('dynamic', 6), ('Stackless', 6), ('16', 6), ('Go', 6), ('Julia', 6), ('25', 6), ('multiple', 6), ('system', 6), ('run', 6), ('supported', 6), ('systems', 6), ('community', 6), ('Expressions', 6), ('Development', 6), ('Reference', 6), ('API', 6), ('developers', 6), ('better', 6), ('spam', 6), ('range', 6), ('int', 6), ('However', 6), ('over', 6), ('allows', 6), ('module', 6), ('integer', 6), ('point', 6), ('between', 6), ('blah', 6), ('index', 6), ('based', 6), ('negative', 6), ('List', 6), ('instance', 6), ('I', 6), ('several', 6), ('scripting', 6), ('processing', 6), ('platform', 6), ('Comparison', 6), ('IDE', 6), ('Data', 6), ('p', 6), ('Lattner', 6), ('What', 6), ('articles', 6), ('From', 5), ('Haskell', 5), ('18', 5), ('Cobra', 5), ('Swift', 5), ('Its', 5), ('28', 5), ('comprehensions', 5), ('does', 5), ('i', 5), ('end', 5), ('only', 5), ('non', 5), ('semantics', 5), ('Other', 5), ('influenced', 5), ('See', 5), ('Main', 5), ('his', 5), ('long', 5), ('Many', 5), ('typing', 5), ('management', 5), ('generator', 5), ('two', 5), ('tools', 5), ('includes', 5), ('complex', 5), ('functionality', 5), ('means', 5), ('their', 5), ('there', 5), ('speed', 5), ('Monty', 5), ('common', 5), ('rather', 5), ('assignment', 5), ('potentially', 5), ('strings', 5), ('else', 5), ('behavior', 5), ('print', 5), ('provided', 5), ('iterators', 5), ('floating', 5), ('values', 5), ('mutable', 5), ('keys', 5), ('tuple', 5), ('containing', 5), ('both', 5), ('105', 5), ('mixed', 5), ('arbitrary', 5), ('scientific', 5), ('Rust', 5), ('2005', 5), ('dated', 5), ('about', 5), ('Community', 5), ('package', 5), ('Kotlin', 5), ('Why', 5), ('M', 5), ('2001', 5), ('www', 5), ('net', 5), ('License', 5), ('Developer', 5), ('Oracle', 5), ('Built', 5), ('Guide', 5), ('Mark', 5), ('free', 4), ('General', 4), ('59', 4), ('years', 4), ('Typing', 4), ('IronPython', 4), ('CLU', 4), ('Lisp', 4), ('Groovy', 4), ('23', 4), ('general', 4), ('programmers', 4), ('dynamically', 4), ('garbage', 4), ('supports', 4), ('late', 4), ('introduced', 4), ('security', 4), ('issues', 4), ('date', 4), ('operating', 4), ('31', 4), ('Indentation', 4), ('Methods', 4), ('environments', 4), ('compilers', 4), ('Languages', 4), ('links', 4), ('article', 4), ('itself', 4), ('when', 4), ('now', 4), ('set', 4), ('methods', 4), ('memory', 4), ('built', 4), ('contrast', 4), ('just', 4), ('compiler', 4), ('group', 4), ('optional', 4), ('feature', 4), ('termed', 4), ('side', 4), ('variables', 4), ('numeric', 4), ('hand', 4), ('left', 4), ('given', 4), ('each', 4), ('true', 4), ('up', 4), ('before', 4), ('Is', 4), ('There', 4), ('information', 4), ('through', 4), ('multiplication', 4), ('infix', 4), ('NumPy', 4), ('matrix', 4), ('comparison', 4), ('these', 4), ('tuples', 4), ('cannot', 4), ('must', 4), ('elements', 4), ('directly', 4), ('literals', 4), ('format', 4), ('kinds', 4), ('single', 4), ('quote', 4), ('marks', 4), ('being', 4), ('self', 4), ('Objective', 4), ('compile', 4), ('versions', 4), ('bytearray', 4), ('bytes', 4), ('ASCII', 4), ('contains', 4), ('True', 4), ('numbers', 4), ('commonly', 4), ('positive', 4), ('provides', 4), ('mathematics', 4), ('party', 4), ('fact', 4), ('user', 4), ('Server', 4), ('few', 4), ('As', 4), ('frameworks', 4), ('computing', 4), ('RustPython', 4), ('incremented', 4), ('games', 4), ('Facebook', 4), ('GNU', 4), ('learn', 4), ('Sugar', 4), ('Developers', 4), ('FAQ', 4), ('J', 4), ('O', 4), ('Reilly', 4), ('Source', 4), ('Artima', 4), ('David', 4), ('How', 4), ('retrieved', 4), ('Science', 4), ('Computing', 4), ('license', 4), ('high', 3), ('ago', 3), ('MicroPython', 3), ('CircuitPython', 3), ('Jython', 3), ('CoffeeScript', 3), ('Ring', 3), ('significant', 3), ('approach', 3), ('help', 3), ('scale', 3), ('projects', 3), ('included', 3), ('ABC', 3), ('compatible', 3), ('much', 3), ('extension', 3), ('team', 3), ('With', 3), ('Features', 3), ('Syntax', 3), ('Statements', 3), ('control', 3), ('Mathematics', 3), ('examples', 3), ('Libraries', 3), ('Performance', 3), ('inspired', 3), ('exception', 3), ('Van', 3), ('Benevolent', 3), ('Dictator', 3), ('Life', 3), ('term', 3), ('five', 3), ('Barry', 3), ('were', 3), ('easily', 3), ('Object', 3), ('via', 3), ('binding', 3), ('during', 3), ('dictionaries', 3), ('itertools', 3), ('document', 3), ('designed', 3), ('popular', 3), ('interfaces', 3), ('less', 3), ('do', 3), ('should', 3), ('optimization', 3), ('parts', 3), ('would', 3), ('important', 3), ('Cython', 3), ('translates', 3), ('makes', 3), ('related', 3), ('well', 3), ('called', 3), ('Users', 3), ('blocks', 3), ('§', 3), ('structure', 3), ('results', 3), ('others', 3), ('sign', 3), ('traditional', 3), ('receives', 3), ('copy', 3), ('right', 3), ('allocated', 3), ('storage', 3), ('Since', 3), ('result', 3), ('fixed', 3), ('thus', 3), ('executes', 3), ('element', 3), ('attached', 3), ('always', 3), ('raise', 3), ('allowing', 3), ('create', 3), ('alias', 3), ('They', 3), ('floor', 3), ('intended', 3), ('comparisons', 3), ('Conditional', 3), ('distinction', 3), ('lists', 3), ('dictionary', 3), ('produces', 3), ('equal', 3), ('various', 3), ('double', 3), ('shells', 3), ('Windows', 3), ('array', 3), ('start', 3), ('stop', 3), ('Common', 3), ('vs', 3), ('classic', 3), ('argument', 3), ('instances', 3), ('static', 3), ('named', 3), ('Sequence', 3), ('119', 3), ('107', 3), ('hashable', 3), ('no', 3), ('Integer', 3), ('looping', 3), ('Not', 3), ('arithmetic', 3), ('integers', 3), ('towards', 3), ('terms', 3), ('equation', 3), ('expected', 3), ('Integers', 3), ('Decimal', 3), ('numerical', 3), ('world', 3), ('n', 3), ('creating', 3), ('unit', 3), ('Gateway', 3), ('Interface', 3), ('test', 3), ('update', 3), ('Package', 3), ('official', 3), ('repository', 3), ('Documentation', 3), ('Canopy', 3), ('bytecode', 3), ('developed', 3), ('Nokia', 3), ('every', 3), ('NET', 3), ('Pyjs', 3), ('Nuitka', 3), ('GitHub', 3), ('final', 3), ('adopted', 3), ('CERN', 3), ('Instagram', 3), ('Spotify', 3), ('site', 3), ('web', 3), ('Tornado', 3), ('pretty', 3), ('TensorFlow', 3), ('Labs', 3), ('model', 3), ('Tcl', 3), ('Computer', 3), ('portal', 3), ('Application', 3), ('created', 3), ('Kuchling', 3), ('Interview', 3), ('Functions', 3), ('docs', 3), ('far', 3), ('you', 3), ('people', 3), ('v2', 3), ('Tim', 3), ('2004', 3), ('Tools', 3), ('Chapter', 3), ('ideas', 3), ('About', 3), ('Schedule', 3), ('Dev', 3), ('Zadka', 3), ('Moshe', 3), ('2002', 3), ('Docs', 3), ('2nd', 3), ('Media', 3), ('596', 3), ('Code', 3), ('Like', 3), ('Games', 3), ('Design', 3), ('Types', 3), ('Wiki', 3), ('Research', 3), ('v1', 3), ('Bibcode', 3), ('Guidelines', 3), ('Lutz', 3), ('Learning', 3), ('Engineering', 3), ('K', 3), ('reddit', 3), ('started', 3), ('scikit', 3), ('Wikimedia', 3), ('Commons', 3), ('Definition', 3), ('Proprietary', 3), ('identifiersWikipedia', 3), ('page', 3), ('Jump', 2), ('search', 2), ('see', 2), ('purpose', 2), ('paradigm', 2), ('imperative', 2), ('days', 2), ('gradual', 2), ('extensions', 2), ('pyo', 2), ('RPython', 2), ('Starlark', 2), ('68', 2), ('APL', 2), ('Dylan', 2), ('Modula', 2), ('Standard', 2), ('ML', 2), ('Boo', 2), ('D', 2), ('Genie', 2), ('Wikibooks', 2), ('interpreted', 2), ('Created', 2), ('readability', 2), ('whitespace', 2), ('aim', 2), ('small', 2), ('paradigms', 2), ('described', 2), ('batteries', 2), ('conceived', 2), ('1980s', 2), ('successor', 2), ('capable', 2), ('collecting', 2), ('revision', 2), ('completely', 2), ('backward', 2), ('2020', 2), ('ways', 2), ('life', 2), ('profit', 2), ('organization', 2), ('flow', 2), ('Implementations', 2), ('Unsupported', 2), ('Cross', 2), ('Naming', 2), ('Uses', 2), ('References', 2), ('Sources', 2), ('Further', 2), ('reading', 2), ('External', 2), ('SETL', 2), ('began', 2), ('lead', 2), ('until', 2), ('title', 2), ('shares', 2), ('member', 2), ('steering', 2), ('council', 2), ('36', 2), ('38', 2), ('Brett', 2), ('Cannon', 2), ('Warsaw', 2), ('cycle', 2), ('detecting', 2), ('collector', 2), ('Unicode', 2), ('42', 2), ('series', 2), ('Releases', 2), ('translation', 2), ('initially', 2), ('out', 2), ('body', 2), ('existing', 2), ('ported', 2), ('metaprogramming', 2), ('contract', 2), ('offers', 2), ('51', 2), ('implement', 2), ('borrowed', 2), ('Zen', 2), ('53', 2), ('Beautiful', 2), ('implicit', 2), ('Simple', 2), ('Complex', 2), ('extensible', 2), ('made', 2), ('adding', 2), ('programmable', 2), ('choice', 2), ('coding', 2), ('way', 2), ('Alex', 2), ('Martelli', 2), ('To', 2), ('describe', 2), ('something', 2), ('considered', 2), ('culture', 2), ('critical', 2), ('When', 2), ('calls', 2), ('British', 2), ('comedy', 2), ('instead', 2), ('foo', 2), ('bar', 2), ('58', 2), ('pythonic', 2), ('wide', 2), ('say', 2), ('natural', 2), ('rough', 2), ('60', 2), ('English', 2), ('keywords', 2), ('Unlike', 2), ('curly', 2), ('brackets', 2), ('delimit', 2), ('syntactic', 2), ('exceptions', 2), ('special', 2), ('Pascal', 2), ('certain', 2), ('current', 2), ('Thus', 2), ('visual', 2), ('look', 2), ('clean', 2), ('consistent', 2), ('among', 2), ('equals', 2), ('differently', 2), ('mechanism', 2), ('nature', 2), ('location', 2), ('symbolic', 2), ('case', 2), ('generic', 2), ('call', 2), ('greatly', 2), ('etc', 2), ('bound', 2), ('iterable', 2), ('local', 2), ('try', 2), ('caught', 2), ('finally', 2), ('specified', 2), ('re', 2), ('64', 2), ('manager', 2), ('lock', 2), ('pass', 2), ('syntactically', 2), ('needed', 2), ('conditions', 2), ('apply', 2), ('yield', 2), ('returns', 2), ('form', 2), ('definition', 2), ('changed', 2), ('66', 2), ('Before', 2), ('passed', 2), ('possible', 2), ('back', 2), ('stack', 2), ('levels', 2), ('added', 2), ('exponentiation', 2), ('compares', 2), ('versus', 2), ('chained', 2), ('boolean', 2), ('implemented', 2), ('lambda', 2), ('different', 2), ('order', 2), ('operands', 2), ('Lists', 2), ('Tuples', 2), ('contents', 2), ('evaluates', 2), ('assigned', 2), ('sequence', 2), ('writable', 2), ('manner', 2), ('str', 2), ('f', 2), ('80', 2), ('Unix', 2), ('character', 2), ('String', 2), ('became', 2), ('denoted', 2), ('literal', 2), ('regular', 2), ('slicing', 2), ('key', 2), ('step', 2), ('zero', 2), ('indexes', 2), ('slice', 2), ('parameter', 2), ('Each', 2), ('loops', 2), ('exec', 2), ('latter', 2), ('so', 2), ('conditional', 2), ('error', 2), ('equality', 2), ('valid', 2), ('causes', 2), ('access', 2), ('checked', 2), ('operations', 2), ('strongly', 2), ('defined', 2), ('them', 2), ('own', 2), ('calling', 2), ('whether', 2), ('eliminated', 2), ('they', 2), ('mypy', 2), ('placeholder', 2), ('arrays', 2), ('float', 2), ('frozenset', 2), ('Unordered', 2), ('duplicates', 2), ('unsupported', 2), ('specific', 2), ('86', 2), ('remainder', 2), ('125', 2), ('work', 2), ('math', 2), ('rules', 2), ('unary', 2), ('bits', 2), ('shifts', 2), ('places', 2), ('accurate', 2), ('90', 2), ('changes', 2), ('infinity', 2), ('next', 2), ('though', 2), ('interval', 2), ('rounding', 2), ('away', 2), ('even', 2), ('tests', 2), ('derived', 2), ('extensive', 2), ('belonging', 2), ('entirely', 2), ('decimal', 2), ('further', 2), ('native', 2), ('frequently', 2), ('problems', 2), ('manipulation', 2), ('Hello', 2), ('factorial', 2), ('input', 2), ('greatest', 2), ('tasks', 2), ('relational', 2), ('testing', 2), ('covered', 2), ('WSGI', 2), ('follows', 2), ('333', 2), ('internal', 2), ('cross', 2), ('need', 2), ('PyPI', 2), ('000', 2), ('packages', 2), ('Scientific', 2), ('Text', 2), ('integrated', 2), ('Most', 2), ('command', 2), ('line', 2), ('IDLE', 2), ('IPython', 2), ('state', 2), ('browser', 2), ('SageMath', 2), ('developing', 2), ('science', 2), ('hosting', 2), ('executed', 2), ('virtual', 2), ('mixture', 2), ('Platform', 2), ('fast', 2), ('variants', 2), ('EV3', 2), ('Unladen', 2), ('Swallow', 2), ('LLVM', 2), ('Psyco', 2), ('specialized', 2), ('additional', 2), ('S60', 2), ('N900', 2), ('GTK', 2), ('device', 2), ('byte', 2), ('Numba', 2), ('latest', 2), ('Shed', 2), ('Skin', 2), ('respectively', 2), ('EuroSciPy', 2), ('largely', 2), ('primary', 2), ('120', 2), ('originally', 2), ('place', 2), ('running', 2), ('months', 2), ('introduce', 2), ('second', 2), ('last', 2), ('Security', 2), ('dates', 2), ('under', 2), ('cadence', 2), ('PyCon', 2), ('creator', 2), ('references', 2), ('132', 2), ('prefix', 2), ('show', 2), ('Examples', 2), ('Year', 2), ('empirical', 2), ('found', 2), ('Large', 2), ('Reddit', 2), ('Apache', 2), ('Django', 2), ('Pylons', 2), ('Pyramid', 2), ('TurboGears', 2), ('web2py', 2), ('Flask', 2), ('Bottle', 2), ('Zope', 2), ('domain', 2), ('covers', 2), ('3D', 2), ('GIMP', 2), ('printer', 2), ('writing', 2), ('scripts', 2), ('ArcGIS', 2), ('video', 2), ('distributions', 2), ('installer', 2), ('LibreOffice', 2), ('replace', 2), ('Scripting', 2), ('Version', 2), ('Acknowledgements', 2), ('working', 2), ('That', 2), ('Apple', 2), ('change', 2), ('Introduction', 2), ('Using', 2), ('MIT', 2), ('Press', 2), ('efficient', 2), ('UNIX', 2), ('CiteSeerX', 2), ('Tutorial', 2), ('By', 2), ('Peters', 2), ('Generators', 2), ('Baxter', 2), ('Anthony', 2), ('More', 2), ('website', 2), ('ring', 2), ('lang', 2), ('Rails', 2), ('59059', 2), ('Homepage', 2), ('drawing', 2), ('too', 2), ('Book', 2), ('section', 2), ('everything', 2), ('373', 2), ('Mailing', 2), ('Timeline', 2), ('Stepping', 2), ('Down', 2), ('Role', 2), ('Journal', 2), ('8100', 2), ('3000', 2), ('Network', 2), ('Who', 2), ('Hettinger', 2), ('Raymond', 2), ('Powerful', 2), ('Goodger', 2), ('Pythonista', 2), ('Your', 2), ('Eby', 2), ('Phillip', 2), ('dedicated', 2), ('Equality', 2), ('Operators', 2), ('Corporation', 2), ('8212', 2), ('LWN', 2), ('Long', 2), ('wiki', 2), ('Changing', 2), ('Division', 2), ('§2', 2), ('Batista', 2), ('Facundo', 2), ('Reasons', 2), ('Shell', 2), ('Erik', 2), ('Module', 2), ('Counts', 2), ('Style', 2), ('Pypy', 2), ('pypy', 2), ('Home', 2), ('Purpose', 2), ('Stack', 2), ('Inc', 2), ('Organizations', 2), ('we', 2), ('Systems', 2), ('doi', 2), ('1109', 2), ('MCSE', 2), ('CCP', 2), ('EVE', 2), ('Sid', 2), ('Meier', 2), ('Civilization', 2), ('IV', 2), ('Blog', 2), ('learning', 2), ('R', 2), ('KDnuggets', 2), ('Secure', 2), ('Esterbrook', 2), ('Charles', 2), ('cobra', 2), ('TIP', 2), ('EEP', 2), ('Artificial', 2), ('Intelligence', 2), ('AI', 2), ('Think', 2), ('Pilgrim', 2), ('Dive', 2), ('Into', 2), ('Apress', 2), ('Curlie', 2), ('Category', 2), ('drivers', 2), ('Statistics', 2), ('apps', 2), ('movement', 2), ('BNF', 2), ('GND', 2), ('LCCN', 2), ('SUDOC', 2), ('Navigation', 2), ('Privacy', 2), ('encyclopedia', 1), ('navigation', 1), ('PythonParadigmMulti', 1), ('reflectiveDesigned', 1), ('byGuido', 1), ('RossumDeveloperPython', 1), ('FoundationFirst', 1), ('appeared1990', 1), ('1990', 1), ('Stable', 1), ('release3', 1), ('disciplineDuck', 1), ('LicensePython', 1), ('LicenseFilename', 1), ('py', 1), ('pyi', 1), ('pyc', 1), ('pyd', 1), ('prior', 1), ('pyw', 1), ('pyz', 1), ('Websitewww', 1), ('orgMajor', 1), ('implementationsCPython', 1), ('RustPythonDialectsCython', 1), ('Influenced', 1), ('byABC', 1), ('ALGOL', 1), ('Icon', 1), ('InfluencedApache', 1), ('F', 1), ('Nim', 1), ('1991', 1), ('emphasizes', 1), ('notable', 1), ('constructs', 1), ('write', 1), ('clear', 1), ('logical', 1), ('collected', 1), ('procedural', 1), ('due', 1), ('comprehensive', 1), ('collection', 1), ('cycles', 1), ('unmodified', 1), ('sunsetting', 1), ('planned', 1), ('volunteers', 1), ('fix', 1), ('improve', 1), ('later', 1), ('interpreters', 1), ('global', 1), ('develops', 1), ('maintains', 1), ('manages', 1), ('directs', 1), ('resources', 1), ('Contents', 1), ('OSCON', 1), ('Centrum', 1), ('Wiskunde', 1), ('Informatica', 1), ('CWI', 1), ('Netherlands', 1), ('33', 1), ('handling', 1), ('interfacing', 1), ('Amoeba', 1), ('1989', 1), ('34', 1), ('shouldered', 1), ('sole', 1), ('responsibility', 1), ('developer', 1), ('he', 1), ('announced', 1), ('permanent', 1), ('vacation', 1), ('responsibilities', 1), ('bestowed', 1), ('upon', 1), ('him', 1), ('reflect', 1), ('commitment', 1), ('chief', 1), ('decision', 1), ('maker', 1), ('35', 1), ('He', 1), ('leadership', 1), ('person', 1), ('37', 1), ('active', 1), ('elected', 1), ('Nick', 1), ('Coghlan', 1), ('Carol', 1), ('Willing', 1), ('Steering', 1), ('Council', 1), ('40', 1), ('41', 1), ('backported', 1), ('2to3', 1), ('utility', 1), ('automates', 1), ('least', 1), ('partially', 1), ('43', 1), ('postponed', 1), ('concern', 1), ('could', 1), ('forward', 1), ('44', 1), ('45', 1), ('multi', 1), ('structured', 1), ('fully', 1), ('aspect', 1), ('46', 1), ('metaobjects', 1), ('magic', 1), ('47', 1), ('48', 1), ('49', 1), ('logic', 1), ('50', 1), ('combination', 1), ('counting', 1), ('resolution', 1), ('binds', 1), ('execution', 1), ('tradition', 1), ('filter', 1), ('map', 1), ('reduce', 1), ('sets', 1), ('functools', 1), ('52', 1), ('summarized', 1), ('aphorisms', 1), ('ugly', 1), ('Explicit', 1), ('complicated', 1), ('Readability', 1), ('counts', 1), ('Rather', 1), ('having', 1), ('highly', 1), ('compact', 1), ('modularity', 1), ('particularly', 1), ('vision', 1), ('stemmed', 1), ('frustrations', 1), ('espoused', 1), ('opposite', 1), ('strives', 1), ('simpler', 1), ('cluttered', 1), ('grammar', 1), ('giving', 1), ('methodology', 1), ('motto', 1), ('embraces', 1), ('one—and', 1), ('preferably', 1), ('one—obvious', 1), ('Fellow', 1), ('book', 1), ('author', 1), ('writes', 1), ('clever', 1), ('compliment', 1), ('54', 1), ('strive', 1), ('avoid', 1), ('premature', 1), ('reject', 1), ('patches', 1), ('offer', 1), ('marginal', 1), ('increases', 1), ('cost', 1), ('clarity', 1), ('55', 1), ('programmer', 1), ('move', 1), ('script', 1), ('direct', 1), ('goal', 1), ('keeping', 1), ('fun', 1), ('reflected', 1), ('name—a', 1), ('tribute', 1), ('56', 1), ('—and', 1), ('occasionally', 1), ('playful', 1), ('approaches', 1), ('tutorials', 1), ('materials', 1), ('refer', 1), ('famous', 1), ('sketch', 1), ('57', 1), ('neologism', 1), ('meanings', 1), ('idioms', 1), ('shows', 1), ('fluency', 1), ('conforms', 1), ('minimalist', 1), ('emphasis', 1), ('difficult', 1), ('understand', 1), ('reads', 1), ('transcription', 1), ('another', 1), ('unpythonic', 1), ('admirers', 1), ('especially', 1), ('those', 1), ('knowledgeable', 1), ('experienced', 1), ('referred', 1), ('Pythonistas', 1), ('meant', 1), ('readable', 1), ('formatting', 1), ('visually', 1), ('uncluttered', 1), ('punctuation', 1), ('semicolons', 1), ('fewer', 1), ('cases', 1), ('61', 1), ('increase', 1), ('comes', 1), ('decrease', 1), ('signifies', 1), ('62', 1), ('accurately', 1), ('represents', 1), ('semantic', 1), ('sometimes', 1), ('off', 1), ('rule', 1), ('enforcement', 1), ('neat', 1), ('63', 1), ('token', 1), ('operates', 1), ('fundamental', 1), ('illuminates', 1), ('Assignment', 1), ('copied', 1), ('address', 1), ('enough', 1), ('quite', 1), ('declared', 1), ('simplest', 1), ('separate', 1), ('doesn', 1), ('indicated', 1), ('improper', 1), ('Names', 1), ('subsequently', 1), ('rebound', 1), ('any', 1), ('varying', 1), ('procedures', 1), ('Successive', 1), ('assignments', 1), ('z', 1), ('allocating', 1), ('holder', 1), ('unreasonable', 1), ('associate', 1), ('conditionally', 1), ('along', 1), ('elif', 1), ('contraction', 1), ('iterates', 1), ('capturing', 1), ('condition', 1), ('raised', 1), ('handled', 1), ('except', 1), ('clauses', 1), ('ensures', 1), ('regardless', 1), ('how', 1), ('exits', 1), ('attaches', 1), ('namespace', 1), ('def', 1), ('defines', 1), ('encloses', 1), ('within', 1), ('context', 1), ('acquiring', 1), ('releasing', 1), ('afterwards', 1), ('opening', 1), ('file', 1), ('closing', 1), ('Resource', 1), ('Acquisition', 1), ('Initialization', 1), ('RAII', 1), ('replaces', 1), ('idiom', 1), ('65', 1), ('serves', 1), ('NOP', 1), ('empty', 1), ('assert', 1), ('debugging', 1), ('check', 1), ('ought', 1), ('coroutines', 1), ('whose', 1), ('tail', 1), ('continuations', 1), ('according', 1), ('never', 1), ('67', 1), ('coroutine', 1), ('extending', 1), ('69', 1), ('lazy', 1), ('unidirectionally', 1), ('70', 1), ('Addition', 1), ('subtraction', 1), ('differs', 1), ('divisions', 1), ('71', 1), ('72', 1), ('73', 1), ('walrus', 1), ('assigns', 1), ('larger', 1), ('74', 1), ('numerics', 1), ('75', 1), ('76', 1), ('Value', 1), ('performed', 1), ('compare', 1), ('identities', 1), ('words', 1), ('comprehension', 1), ('extended', 1), ('Anonymous', 1), ('however', 1), ('limited', 1), ('77', 1), ('concatenate', 1), ('modify', 1), ('executing', 1), ('yields', 1), ('thereby', 1), ('effectively', 1), ('modifying', 1), ('conforming', 1), ('Parentheses', 1), ('unambiguous', 1), ('contexts', 1), ('78', 1), ('unpacking', 1), ('evaluating', 1), ('anything', 1), ('property', 1), ('associated', 1), ('identical', 1), ('forming', 1), ('whole', 1), ('put', 1), ('expects', 1), ('iterated', 1), ('iterate', 1), ('assigning', 1), ('produced', 1), ('corresponding', 1), ('79', 1), ('analogous', 1), ('printf', 1), ('d', 1), ('supplemented', 1), ('Strings', 1), ('delimited', 1), ('identically', 1), ('Both', 1), ('backslash', 1), ('escape', 1), ('interpolation', 1), ('formatted', 1), ('Triple', 1), ('quoted', 1), ('begin', 1), ('span', 1), ('lines', 1), ('here', 1), ('documents', 1), ('Raw', 1), ('varieties', 1), ('prefixing', 1), ('r', 1), ('Escape', 1), ('sequences', 1), ('hence', 1), ('raw', 1), ('useful', 1), ('backslashes', 1), ('paths', 1), ('Compare', 1), ('quoting', 1), ('Indexes', 1), ('relative', 1), ('Slices', 1), ('take', 1), ('stride', 1), ('skipped', 1), ('reversed', 1), ('Slice', 1), ('omitted', 1), ('entire', 1), ('shallow', 1), ('rigidly', 1), ('enforced', 1), ('Scheme', 1), ('leads', 1), ('duplicating', 1), ('eval', 1), ('former', 1), ('particular', 1), ('advantage', 1), ('avoiding', 1), ('mistaking', 1), ('probably', 1), ('unintended', 1), ('normal', 1), ('sugar', 1), ('Class', 1), ('explicit', 1), ('81', 1), ('hierarchy', 1), ('duck', 1), ('untyped', 1), ('constraints', 1), ('fail', 1), ('signifying', 1), ('suitable', 1), ('Despite', 1), ('forbidding', 1), ('silently', 1), ('attempting', 1), ('make', 1), ('sense', 1), ('define', 1), ('constructed', 1), ('SpamClass', 1), ('EggsClass', 1), ('metaclass', 1), ('reflection', 1), ('had', 1), ('old', 1), ('82', 1), ('styles', 1), ('difference', 1), ('inherited', 1), ('indirectly', 1), ('inherit', 1), ('onwards', 1), ('Old', 1), ('plan', 1), ('83', 1), ('specifying', 1), ('default', 1), ('experimental', 1), ('checker', 1), ('checking', 1), ('84', 1), ('Summary', 1), ('Mutability', 1), ('Description', 1), ('bool', 1), ('Boolean', 1), ('TrueFalse', 1), ('real', 1), ('imaginary', 1), ('7j', 1), ('dict', 1), ('Associative', 1), ('pairs', 1), ('key1', 1), ('False', 1), ('ellipsisa', 1), ('ellipsis', 1), ('Ellipsis', 1), ('Floating', 1), ('1415927', 1), ('unlimited', 1), ('magnitude', 1), ('85', 1), ('NoneTypea', 1), ('representing', 1), ('absence', 1), ('None', 1), ('NotImplementedTypea', 1), ('returned', 1), ('overloaded', 1), ('indicate', 1), ('operand', 1), ('NotImplemented', 1), ('codepoints', 1), ('Spanningmultiplelines', 1), ('Can', 1), ('times', 1), ('accessible', 1), ('usual', 1), ('symbols', 1), ('multiply', 1), ('87', 1), ('precedence', 1), ('additionally', 1), ('Additionally', 1), ('essentially', 1), ('inverts', 1), ('88', 1), ('bitwise', 1), ('shift', 1), ('89', 1), ('significantly', 1), ('earlier', 1), ('otherwise', 1), ('rounds', 1), ('So', 1), ('Adding', 1), ('future', 1), ('higher', 1), ('Rounding', 1), ('adds', 1), ('consistency', 1), ('maintaining', 1), ('validity', 1), ('half', 1), ('lie', 1), ('nearest', 1), ('tie', 1), ('breaking', 1), ('−1', 1), ('92', 1), ('relations', 1), ('94', 1), ('interpret', 1), ('evaluate', 1), ('resulting', 1), ('compared', 1), ('95', 1), ('transparently', 1), ('switched', 1), ('maximum', 1), ('usually', 1), ('L', 1), ('suffix', 1), ('textual', 1), ('representation', 1), ('96', 1), ('contained', 1), ('modes', 1), ('97', 1), ('Fraction', 1), ('fractions', 1), ('rational', 1), ('98', 1), ('Due', 1), ('extends', 1), ('capabilities', 1), ('aid', 1), ('99', 1), ('100', 1), ('Program', 1), ('calculate', 1), ('printed', 1), ('Error', 1), ('cited', 1), ('strengths', 1), ('101', 1), ('suited', 1), ('Internet', 1), ('facing', 1), ('formats', 1), ('protocols', 1), ('MIME', 1), ('HTTP', 1), ('graphical', 1), ('connecting', 1), ('databases', 1), ('generating', 1), ('pseudorandom', 1), ('decimals', 1), ('102', 1), ('manipulating', 1), ('specifications', 1), ('wsgiref', 1), ('103', 1), ('suites', 1), ('supplied', 1), ('because', 1), ('altering', 1), ('rewriting', 1), ('variant', 1), ('200', 1), ('104', 1), ('Graphical', 1), ('Multimedia', 1), ('Databases', 1), ('Networking', 1), ('Test', 1), ('Automation', 1), ('scraping', 1), ('System', 1), ('administration', 1), ('Image', 1), ('read–eval–print', 1), ('loop', 1), ('REPL', 1), ('permitting', 1), ('enters', 1), ('sequentially', 1), ('immediately', 1), ('add', 1), ('abilities', 1), ('auto', 1), ('completion', 1), ('session', 1), ('retention', 1), ('highlighting', 1), ('desktop', 1), ('IDEs', 1), ('PythonAnywhere', 1), ('environment', 1), ('commercial', 1), ('emphasizing', 1), ('106', 1), ('meeting', 1), ('C89', 1), ('select', 1), ('C99', 1), ('intermediate', 1), ('108', 1), ('109', 1), ('distributed', 1), ('platforms', 1), ('modern', 1), ('portability', 1), ('earliest', 1), ('priorities', 1), ('110', 1), ('compliant', 1), ('111', 1), ('brings', 1), ('improvement', 1), ('112', 1), ('fork', 1), ('implements', 1), ('microthreads', 1), ('massively', 1), ('concurrent', 1), ('stackless', 1), ('113', 1), ('optimized', 1), ('microcontrollers', 1), ('Lego', 1), ('Mindstorms', 1), ('114', 1), ('115', 1), ('speeding', 1), ('fold', 1), ('improving', 1), ('multithreading', 1), ('ability', 1), ('thousands', 1), ('cores', 1), ('116', 1), ('specialising', 1), ('integrates', 1), ('transforms', 1), ('runtime', 1), ('emitted', 1), ('faster', 1), ('Series', 1), ('mobile', 1), ('phones', 1), ('PyS60', 1), ('integrate', 1), ('Symbian', 1), ('kept', 1), ('widget', 1), ('enabling', 1), ('target', 1), ('117', 1), ('either', 1), ('unrestricted', 1), ('restricted', 1), ('subset', 1), ('enables', 1), ('Runtime', 1), ('compiled', 1), ('Intermediate', 1), ('build', 1), ('Pythran', 1), ('Somewhat', 1), ('Pyrex', 1), ('Grumpy', 1), ('MyHDL', 1), ('VHDL', 1), ('118', 1), ('performance', 1), ('combinatorial', 1), ('workload', 1), ('presented', 1), ('conducted', 1), ('Proposal', 1), ('process', 1), ('proposing', 1), ('documenting', 1), ('decisions', 1), ('121', 1), ('Outstanding', 1), ('PEPs', 1), ('reviewed', 1), ('commented', 1), ('corresponds', 1), ('mailing', 1), ('dev', 1), ('forum', 1), ('Specific', 1), ('discussed', 1), ('Roundup', 1), ('bug', 1), ('tracker', 1), ('maintained', 1), ('122', 1), ('took', 1), ('hosted', 1), ('Mercurial', 1), ('moved', 1), ('123', 1), ('public', 1), ('come', 1), ('distinguished', 1), ('Backward', 1), ('incompatible', 1), ('break', 1), ('manually', 1), ('These', 1), ('happen', 1), ('infrequently—for', 1), ('Major', 1), ('bugfixes', 1), ('124', 1), ('Bugfix', 1), ('occur', 1), ('sufficient', 1), ('bugs', 1), ('upstream', 1), ('vulnerabilities', 1), ('patched', 1), ('alpha1', 1), ('depends', 1), ('what', 1), ('proposal', 1), ('draft', 1), ('proposals', 1), ('discussion', 1), ('yearly', 1), ('option', 1), ('126', 1), ('127', 1), ('128', 1), ('129', 1), ('alpha', 1), ('beta', 1), ('candidates', 1), ('previews', 1), ('Although', 1), ('schedule', 1), ('delayed', 1), ('ready', 1), ('monitors', 1), ('suite', 1), ('BuildBot', 1), ('continuous', 1), ('integration', 1), ('130', 1), ('contributed', 1), ('131', 1), ('academic', 1), ('conference', 1), ('mentoring', 1), ('programmes', 1), ('Pyladies', 1), ('whom', 1), ('enjoyed', 1), ('appear', 1), ('metasyntactic', 1), ('literature', 1), ('133', 1), ('routines', 1), ('134', 1), ('135', 1), ('Py', 1), ('Pygame', 1), ('SDL', 1), ('PyQt', 1), ('PyGTK', 1), ('bind', 1), ('Qt', 1), ('Sphinx', 1), ('Epydoc', 1), ('HeaderDoc', 1), ('pydoc', 1), ('consistently', 1), ('ranked', 1), ('top', 1), ('ten', 1), ('behind', 1), ('136', 1), ('selected', 1), ('137', 1), ('study', 1), ('productive', 1), ('conventional', 1), ('involving', 1), ('determined', 1), ('consumption', 1), ('worse', 1), ('138', 1), ('organizations', 1), ('139', 1), ('Yahoo', 1), ('140', 1), ('141', 1), ('NASA', 1), ('142', 1), ('143', 1), ('Amazon', 1), ('144', 1), ('145', 1), ('smaller', 1), ('entities', 1), ('ILM', 1), ('146', 1), ('ITA', 1), ('147', 1), ('social', 1), ('news', 1), ('networking', 1), ('148', 1), ('serve', 1), ('mod', 1), ('wsgi', 1), ('server', 1), ('149', 1), ('evolved', 1), ('facilitate', 1), ('maintenance', 1), ('develop', 1), ('client', 1), ('Ajax', 1), ('SQLAlchemy', 1), ('mapper', 1), ('database', 1), ('Twisted', 1), ('framework', 1), ('communications', 1), ('computers', 1), ('Dropbox', 1), ('SciPy', 1), ('Matplotlib', 1), ('allow', 1), ('effective', 1), ('150', 1), ('151', 1), ('Biopython', 1), ('Astropy', 1), ('providing', 1), ('mathematical', 1), ('notebook', 1), ('interface', 1), ('aspects', 1), ('algebra', 1), ('combinatorics', 1), ('theory', 1), ('calculus', 1), ('successfully', 1), ('embedded', 1), ('products', 1), ('finite', 1), ('Abaqus', 1), ('parametric', 1), ('modeler', 1), ('FreeCAD', 1), ('animation', 1), ('3ds', 1), ('Max', 1), ('Blender', 1), ('Cinema', 1), ('4D', 1), ('Lightwave', 1), ('Houdini', 1), ('Maya', 1), ('modo', 1), ('MotionBuilder', 1), ('Softimage', 1), ('effects', 1), ('compositor', 1), ('Nuke', 1), ('2D', 1), ('imaging', 1), ('152', 1), ('Inkscape', 1), ('Scribus', 1), ('Paint', 1), ('Shop', 1), ('Pro', 1), ('153', 1), ('musical', 1), ('notation', 1), ('scorewriter', 1), ('capella', 1), ('Debugger', 1), ('structures', 1), ('containers', 1), ('Esri', 1), ('promotes', 1), ('best', 1), ('154', 1), ('155', 1), ('156', 1), ('App', 1), ('Engine', 1), ('157', 1), ('artificial', 1), ('intelligence', 1), ('Keras', 1), ('Scikit', 1), ('158', 1), ('159', 1), ('161', 1), ('modular', 1), ('architecture', 1), ('simple', 1), ('rich', 1), ('text', 1), ('162', 1), ('component', 1), ('ships', 1), ('AmigaOS', 1), ('FreeBSD', 1), ('NetBSD', 1), ('OpenBSD', 1), ('macOS', 1), ('terminal', 1), ('installers', 1), ('Ubuntu', 1), ('Ubiquity', 1), ('Red', 1), ('Hat', 1), ('Fedora', 1), ('Anaconda', 1), ('Gentoo', 1), ('Portage', 1), ('extensively', 1), ('industry', 1), ('exploit', 1), ('163', 1), ('164', 1), ('One', 1), ('Laptop', 1), ('per', 1), ('Child', 1), ('XO', 1), ('165', 1), ('Raspberry', 1), ('Pi', 1), ('board', 1), ('computer', 1), ('main', 1), ('intends', 1), ('Provider', 1), ('166', 1), ('167', 1), ('168', 1), ('169', 1), ('ECMAScript', 1), ('170', 1), ('171', 1), ('motivated', 1), ('desire', 1), ('bring', 1), ('172', 1), ('macros', 1), ('usable', 1), ('Calling', 1), ('PyCall', 1), ('jl', 1), ('pyjulia', 1), ('direction', 1), ('interactive', 1), ('shell', 1), ('173', 1), ('Yukihiro', 1), ('Matsumoto', 1), ('said', 1), ('wanted', 1), ('powerful', 1), ('why', 1), ('decided', 1), ('my', 1), ('174', 1), ('175', 1), ('GDScript', 1), ('extremely', 1), ('minor', 1), ('differences', 1), ('practices', 1), ('emulated', 1), ('practice', 1), ('requiring', 1), ('describing', 1), ('rationale', 1), ('surrounding', 1), ('176', 1), ('Erlang', 1), ('177', 1), ('received', 1), ('awards', 1), ('award', 1), ('growth', 1), ('popularity', 1), ('year', 1), ('measured', 1), ('178', 1), ('pip', 1), ('Guttag', 1), ('John', 1), ('V', 1), ('Computation', 1), ('Understanding', 1), ('262', 1), ('52962', 1), ('Peterson', 1), ('Benjamin', 1), ('Insider', 1), ('Core', 1), ('483', 1), ('Theory', 1), ('Hints', 1), ('File', 1), ('removed', 1), ('0488', 1), ('Holth', 1), ('Moore', 1), ('0441', 1), ('Improving', 1), ('ZIP', 1), ('Support', 1), ('Andrew', 1), ('1998', 1), ('amk', 1), ('ca', 1), ('1993', 1), ('Programmers', 1), ('Proceedings', 1), ('NLUUG', 1), ('Najaarsconferentie', 1), ('Dutch', 1), ('Group', 1), ('2023', 1), ('ideal', 1), ('influence', 1), ('considerable', 1), ('Classes', 1), ('mechanisms', 1), ('Lundh', 1), ('Fredrik', 1), ('Call', 1), ('effbot', 1), ('record', 1), ('procedure', 1), ('get', 1), ('description', 1), ('Simionato', 1), ('Michele', 1), ('Method', 1), ('Resolution', 1), ('Order', 1), ('C3', 1), ('nothing', 1), ('invented', 1), ('paper', 1), ('lispers', 1), ('Functional', 1), ('HOWTO', 1), ('Schemenauer', 1), ('Neil', 1), ('Hetland', 1), ('Magnus', 1), ('Lie', 1), ('255', 1), ('Smith', 1), ('Kevin', 1), ('Jewett', 1), ('Jim', 1), ('Montanaro', 1), ('Skip', 1), ('318', 1), ('Decorators', 1), ('Control', 1), ('Flow', 1), ('borrows', 1), ('brief', 1), ('guide', 1), ('influences', 1), ('2ality', 1), ('Rauschmayer', 1), ('Axel', 1), ('Nature', 1), ('Influences', 1), ('Speaking', 1), ('We', 1), ('Team', 1), ('Bini', 1), ('Ola', 1), ('Practical', 1), ('JRuby', 1), ('Projects', 1), ('bringing', 1), ('Berkeley', 1), ('APress', 1), ('881', 1), ('product', 1), ('tireless', 1), ('effort', 1), ('experts', 1), ('gurus', 1), ('ninjas', 1), ('incredibly', 1), ('dogfooding', 1), ('who', 1), ('feedback', 1), ('refine', 1), ('battle', 1), ('Of', 1), ('course', 1), ('benefited', 1), ('experiences', 1), ('hard', 1), ('won', 1), ('field', 1), ('Kuhlman', 1), ('Dave', 1), ('Beginning', 1), ('Advanced', 1), ('Exercises', 1), ('Section', 1), ('Fans', 1), ('phrase', 1), ('asynchronous', 1), ('zip', 1), ('files', 1), ('Sunsetting', 1), ('All', 1), ('Venners', 1), ('Bill', 1), ('Making', 1), ('Lukewarm', 1), ('Brief', 1), ('Fairchild', 1), ('Carlie', 1), ('linuxjournal', 1), ('boss', 1), ('steps', 1), ('down', 1), ('Inquirer', 1), ('Automated', 1), ('466', 1), ('Enhancements', 1), ('Cain', 1), ('Gang', 1), ('Ltd', 1), ('Metaclasses', 1), ('Special', 1), ('PyDBC', 1), ('preconditions', 1), ('postconditions', 1), ('invariants', 1), ('Contracts', 1), ('PyDatalog', 1), ('289', 1), ('Generator', 1), ('Ravenscroft', 1), ('Anna', 1), ('Ascher', 1), ('Cookbook', 1), ('Edition', 1), ('230', 1), ('00797', 1), ('Culture', 1), ('Ways', 1), ('Force', 1), ('pprint', 1), ('Idiomatic', 1), ('think', 1), ('good', 1), ('beginning', 1), ('Myths', 1), ('Secnetix', 1), ('de', 1), ('Highlights', 1), ('Sweigart', 1), ('Al', 1), ('Appendix', 1), ('Differences', 1), ('Between', 1), ('Invent', 1), ('Own', 1), ('9821060', 1), ('Tail', 1), ('Recursion', 1), ('Elimination', 1), ('Neopythonic', 1), ('blogspot', 1), ('Just', 1), ('Solving', 1), ('Puzzles', 1), ('forums', 1), ('342', 1), ('Coroutines', 1), ('Enhanced', 1), ('380', 1), ('0465', 1), ('Changelog', 1), ('Numerical', 1), ('308', 1), ('3rc1', 1), ('Sequences', 1), ('1rc2', 1), ('498', 1), ('Literal', 1), ('Interpolation', 1), ('explicitly', 1), ('definitions', 1), ('hinting', 1), ('Optional', 1), ('Static', 1), ('237', 1), ('Unifying', 1), ('465', 1), ('tilde', 1), ('Stackoverflow', 1), ('stackoverflow', 1), ('BitwiseOperators', 1), ('238', 1), ('Operator', 1), ('Floors', 1), ('Beazley', 1), ('Essential', 1), ('4th', 1), ('Kernighan', 1), ('Brian', 1), ('W', 1), ('Ritchie', 1), ('Dennis', 1), ('1988', 1), ('206', 1), ('0327', 1), ('Rocks', 1), ('And', 1), ('Few', 1), ('Doesn', 1), ('Hoyt', 1), ('Koepke', 1), ('stat', 1), ('washington', 1), ('edu', 1), ('Scott', 1), ('introduction', 1), ('Piotrowski', 1), ('Przemyslaw', 1), ('Build', 1), ('Rapid', 1), ('Environment', 1), ('Pages', 1), ('Technology', 1), ('327', 1), ('Debill', 1), ('ModuleCounts', 1), ('Scraping', 1), ('Soup', 1), ('Selenium', 1), ('Geeks', 1), ('likegeeks', 1), ('Enthought', 1), ('enthought', 1), ('internals', 1), ('Oreilly', 1), ('compatibility', 1), ('Speed', 1), ('Doc', 1), ('LEGO', 1), ('Education', 1), ('Interpreter', 1), ('Plans', 1), ('optimizing', 1), ('Project', 1), ('Hosting', 1), ('Stochastic', 1), ('Geometry', 1), ('nuitka', 1), ('Murri', 1), ('Riccardo', 1), ('runtimes', 1), ('European', 1), ('Conference', 1), ('arXiv', 1), ('1404', 1), ('6388', 1), ('2014arXiv1404', 1), ('6388M', 1), ('Hylton', 1), ('Jeremy', 1), ('Guys', 1), ('Developed', 1), ('Norwitz', 1), ('Neal', 1), ('Schedules', 1), ('Stability', 1), ('Aahz', 1), ('Bug', 1), ('Fix', 1), ('605', 1), ('rolling', 1), ('stream', 1), ('602', 1), ('Annual', 1), ('Cycle', 1), ('lwn', 1), ('Buildbot', 1), ('Developer’s', 1), ('DeBill', 1), ('modulecounts', 1), ('Whetting', 1), ('Appetite', 1), ('return', 1), ('Overflow', 1), ('Exchange', 1), ('Oriented', 1), ('9781449379322', 1), ('Fehily', 1), ('Peachpit', 1), ('xv', 1), ('9780201748840', 1), ('Quality', 1), ('Company', 1), ('Prechelt', 1), ('Rexx', 1), ('Quotes', 1), ('holy', 1), ('grail', 1), ('Bulletin', 1), ('Publications', 1), ('Shafer', 1), ('Daniel', 1), ('G', 1), ('Streamlines', 1), ('Space', 1), ('Shuttle', 1), ('Mission', 1), ('Real', 1), ('Time', 1), ('Framework', 1), ('Powers', 1), ('Hundreds', 1), ('Instances', 1), ('Dozens', 1), ('Technologies', 1), ('Fortenberry', 1), ('Industrial', 1), ('Light', 1), ('Magic', 1), ('Runs', 1), ('Taft', 1), ('Darryl', 1), ('Slithers', 1), ('eWeek', 1), ('Ziff', 1), ('Davis', 1), ('Holdings', 1), ('archive', 1), ('historical', 1), ('Archives', 1), ('Usage', 1), ('statistics', 1), ('market', 1), ('share', 1), ('websites', 1), ('Oliphant', 1), ('Travis', 1), ('10–20', 1), ('2007CSE', 1), ('9c', 1), ('10O', 1), ('474', 1), ('6460', 1), ('Millman', 1), ('Jarrod', 1), ('Aivazis', 1), ('Michael', 1), ('Scientists', 1), ('Engineers', 1), ('9–12', 1), ('2011CSE', 1), ('13b', 1), ('9M', 1), ('Installers', 1), ('Frequently', 1), ('Asked', 1), ('Questions', 1), ('jasc', 1), ('psp9components', 1), ('getting', 1), ('geoprocessing', 1), ('Desktop', 1), ('Help', 1), ('Environmental', 1), ('Institute', 1), ('porkbelly', 1), ('Blogs', 1), ('know', 1), ('known', 1), ('Caudill', 1), ('Modding', 1), ('Firaxis', 1), ('XML', 1), ('letting', 1), ('modders', 1), ('experience', 1), ('manipulate', 1), ('game', 1), ('Documents', 1), ('Dean', 1), ('Jeff', 1), ('Monga', 1), ('Rajat', 1), ('et', 1), ('al', 1), ('heterogeneous', 1), ('Piatetsky', 1), ('Gregory', 1), ('eats', 1), ('Top', 1), ('Analytics', 1), ('Machine', 1), ('Trends', 1), ('Analysis', 1), ('Jouppi', 1), ('Norm', 1), ('supercharges', 1), ('TPU', 1), ('custom', 1), ('chip', 1), ('Cloud', 1), ('Natural', 1), ('Toolkit', 1), ('Immunity', 1), ('Knowing', 1), ('You', 1), ('Corelabs', 1), ('Fixes', 1), ('Document', 1), ('Gotchas', 1), ('boo', 1), ('codehaus', 1), ('Codehaus', 1), ('ES4', 1), ('ecmascript', 1), ('Kincaid', 1), ('Jason', 1), ('Meets', 1), ('TechCrunch', 1), ('Strachan', 1), ('James', 1), ('birth', 1), ('Working', 1), ('Command', 1), ('Line', 1), ('Compiler', 1), ('Creator', 1), ('Linuxdevcenter', 1), ('basic', 1), ('knowing', 1), ('existence', 1), ('amazing', 1), ('contributing', 1), ('earnest', 1), ('focus', 1), ('Kupries', 1), ('Andreas', 1), ('Fellows', 1), ('Donal', 1), ('Format', 1), ('tcl', 1), ('tk', 1), ('Xchange', 1), ('Gustafsson', 1), ('Per', 1), ('Niskanen', 1), ('Raimo', 1), ('erlang', 1), ('Paine', 1), ('Jocelyn', 1), ('Expert', 1), ('Newsletter', 1), ('Amzi', 1), ('PyAIML', 1), ('Pypi', 1), ('Russell', 1), ('Stuart', 1), ('Norvig', 1), ('Peter', 1), ('Modern', 1), ('Approach', 1), ('3rd', 1), ('Upper', 1), ('Saddle', 1), ('River', 1), ('NJ', 1), ('Prentice', 1), ('Hall', 1), ('604259', 1), ('Downey', 1), ('Allen', 1), ('B', 1), ('Scientist', 1), ('521', 1), ('72596', 1), ('Hamilton', 1), ('Naomi', 1), ('Z', 1), ('Computerworld', 1), ('5th', 1), ('15806', 1), ('356', 1), ('4302', 1), ('2415', 1), ('Summerfield', 1), ('Addison', 1), ('Wesley', 1), ('Professional', 1), ('321', 1), ('68056', 1), ('sister', 1), ('projectsMedia', 1), ('Quotations', 1), ('Wikiquote', 1), ('Textbooks', 1), ('Resources', 1), ('Wikiversity', 1), ('Official', 1), ('vteProgramming', 1), ('Assembly', 1), ('BASIC', 1), ('COBOL', 1), ('Elixir', 1), ('Fortran', 1), ('JS', 1), ('Lua', 1), ('MATLAB', 1), ('OCaml', 1), ('PHP', 1), ('Scala', 1), ('Smalltalk', 1), ('TypeScript', 1), ('Visual', 1), ('Basic', 1), ('VB', 1), ('Alphabetical', 1), ('Categorical', 1), ('Generational', 1), ('Non', 1), ('vtePythonImplementations', 1), ('CLPython', 1), ('Boa', 1), ('Eric', 1), ('PyCharm', 1), ('PyDev', 1), ('SPE', 1), ('Ninja', 1), ('Topics', 1), ('vtePython', 1), ('BlueBream', 1), ('CherryPy', 1), ('Grok', 1), ('Nagare', 1), ('Nevow', 1), ('Quixote', 1), ('Spyce', 1), ('TACTIC', 1), ('TwistedWeb', 1), ('Webware', 1), ('vteFree', 1), ('softwareGeneral', 1), ('Alternative', 1), ('closed', 1), ('facilities', 1), ('directories', 1), ('Gratis', 1), ('libre', 1), ('Outline', 1), ('Softwarepackages', 1), ('Audio', 1), ('Bioinformatics', 1), ('Codecs', 1), ('Collaboration', 1), ('Configuration', 1), ('Device', 1), ('Graphics', 1), ('Wireless', 1), ('Geophysics', 1), ('Health', 1), ('Operating', 1), ('Routing', 1), ('Television', 1), ('Video', 1), ('Content', 1), ('E', 1), ('commerce', 1), ('Word', 1), ('processors', 1), ('Android', 1), ('iOS', 1), ('Commercial', 1), ('Trademarked', 1), ('Formerly', 1), ('proprietary', 1), ('Events', 1), ('Licenses', 1), ('AFL', 1), ('APSL', 1), ('Artistic', 1), ('Beerware', 1), ('Boost', 1), ('BSD', 1), ('CC0', 1), ('CDDL', 1), ('EPL', 1), ('GPL', 1), ('LGPL', 1), ('ISC', 1), ('MPL', 1), ('Ms', 1), ('PL', 1), ('RL', 1), ('Sleepycat', 1), ('Unlicense', 1), ('WTFPL', 1), ('zlib', 1), ('standards', 1), ('licenses', 1), ('Contributor', 1), ('Agreement', 1), ('Copyleft', 1), ('Debian', 1), ('Cultural', 1), ('Works', 1), ('Permissive', 1), ('Public', 1), ('Viral', 1), ('Challenges', 1), ('Digital', 1), ('rights', 1), ('Firmware', 1), ('Hardware', 1), ('restrictions', 1), ('proliferation', 1), ('Mozilla', 1), ('rebranding', 1), ('firmware', 1), ('SCO', 1), ('controversies', 1), ('boot', 1), ('patents', 1), ('Trusted', 1), ('Related', 1), ('topics', 1), ('Forking', 1), ('Manifesto', 1), ('Microsoft', 1), ('Specification', 1), ('Promise', 1), ('hardware', 1), ('Shared', 1), ('Initiative', 1), ('Cathedral', 1), ('Bazaar', 1), ('Revolution', 1), ('OS', 1), ('WikiProject', 1), ('Authority', 1), ('cb13560465c', 1), ('4434275', 1), ('sh96008834', 1), ('051626225', 1), ('https', 1), ('en', 1), ('wikipedia', 1), ('w', 1), ('php', 1), ('oldid', 1), ('925168408', 1), ('Categories', 1), ('languagesClass', 1), ('languagesComputational', 1), ('notebookComputer', 1), ('NetherlandsCross', 1), ('softwareDutch', 1), ('inventionsDynamically', 1), ('languagesEducational', 1), ('languagesHigh', 1), ('languagesInformation', 1), ('technology', 1), ('NetherlandsObject', 1), ('languagesProgramming', 1), ('1991Python', 1), ('languagesText', 1), ('languagesCross', 1), ('softwareHidden', 1), ('categories', 1), ('Articles', 1), ('short', 1), ('descriptionUse', 1), ('dmy', 1), ('2015Articles', 1), ('2019All', 1), ('statementsArticles', 1), ('2016Articles', 1), ('2018Articles', 1), ('linksWikipedia', 1), ('identifiersGood', 1), ('menu', 1), ('Personal', 1), ('logged', 1), ('inTalkContributionsCreate', 1), ('accountLog', 1), ('Namespaces', 1), ('ArticleTalk', 1), ('Variants', 1), ('Views', 1), ('ReadEditView', 1), ('history', 1), ('Search', 1), ('pageContentsFeatured', 1), ('contentCurrent', 1), ('eventsRandom', 1), ('articleDonate', 1), ('WikipediaWikipedia', 1), ('store', 1), ('Interaction', 1), ('HelpAbout', 1), ('WikipediaCommunity', 1), ('portalRecent', 1), ('changesContact', 1), ('hereRelated', 1), ('changesUpload', 1), ('fileSpecial', 1), ('pagesPermanent', 1), ('linkPage', 1), ('informationWikidata', 1), ('itemCite', 1), ('CommonsWikibooksWikiquoteWikiversity', 1), ('Print', 1), ('export', 1), ('Create', 1), ('bookDownload', 1), ('PDFPrintable', 1), ('AfrikaansAlemannischالعربيةAragonésঅসমীয়াAsturianuAzərbaycancaتۆرکجهবাংলাBân', 1), ('lâm', 1), ('gúБеларускаяБългарскиBosanskiCatalàCebuanoČeštinaCymraegDanskDeutschEestiΕλληνικάEspañolEsperantoEuskaraفارسیFrançaisGalegoગુજરાતી한국어Հայերենहिन्दीHrvatskiBahasa', 1), ('IndonesiaInterlinguaÍslenskaItalianoעבריתქართულიҚазақшаКыргызчаLatinaLatviešuLietuviųLa', 1), ('lojban', 1), ('LumbaartMagyarМакедонскиമലയാളംमराठीBahasa', 1), ('MelayuМонголမြန်မာဘာသာNederlandsनेपाली日本語NorskNorsk', 1), ('nynorskଓଡ଼ିଆOʻzbekcha', 1), ('ўзбекчаਪੰਜਾਬੀپنجابیភាសាខ្មែរPlattdüütschPolskiPortuguêsRomânăРусскийScotsShqipසිංහලSimple', 1), ('EnglishSlovenčinaSlovenščinaکوردیСрпски', 1), ('srpskiSrpskohrvatski', 1), ('српскохрватскиၽႃႇသႃႇတႆး', 1), ('SuomiSvenskaTagalogதமிழ்Татарча', 1), ('tatarçaతెలుగుไทยТоҷикӣTürkçeᨅᨔ', 1), ('ᨕᨘᨁᨗУкраїнськаاردوTiếng', 1), ('ViệtWinaray吴语粵語中文', 1), ('Edit', 1), ('edited', 1), ('08', 1), ('06', 1), ('UTC', 1), ('Creative', 1), ('Attribution', 1), ('ShareAlike', 1), ('agree', 1), ('Terms', 1), ('Use', 1), ('Policy', 1), ('Wikipedia®', 1), ('registered', 1), ('trademark', 1), ('policy', 1), ('Disclaimers', 1), ('Contact', 1), ('Cookie', 1), ('Mobile', 1), ('view', 1)]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://www.kakaocorp.com/service/KakaoTalk : [('서비스', 24), ('카카오', 20), ('카카오톡', 12), ('Daum', 12), ('수', 9), ('테마', 8), ('Kakao', 7), ('IR', 7), ('보기', 7), ('소셜임팩트', 6), ('Melon', 5), ('바로가기', 4), ('편리하게', 4), ('있는', 4), ('자세히', 4), ('테마를', 4), ('보세요', 4), ('다운로드', 4), ('메뉴', 3), ('kakao', 3), ('소개', 3), ('길', 3), ('AI', 3), ('비즈니스', 3), ('일정', 3), ('포털', 3), ('커뮤니케이션', 3), ('상생', 3), ('with', 3), ('gt', 3), ('버전', 3), ('채팅을', 3), ('간편하게', 3), ('카카오톡의', 3), ('내가', 3), ('이모티콘', 3), ('이모티콘을', 3), ('사용자', 3), ('고객센터', 3), ('문화', 2), ('자회사', 2), ('안내', 2), ('홍보채널', 2), ('영상', 2), ('행사', 2), ('오시는', 2), ('투자정보', 2), ('경영정보', 2), ('공시정보', 2), ('주가정보', 2), ('재무정보', 2), ('자료실', 2), ('증권사커버리지', 2), ('공고', 2), ('검색', 2), ('콘텐츠', 2), ('카카오프렌즈', 2), ('커머스', 2), ('게임', 2), ('핀테크', 2), ('모빌리티', 2), ('라이프', 2), ('T', 2), ('카카오같이가치', 2), ('사회공헌', 2), ('제주지역협력', 2), ('Partners', 2), ('고객지원', 2), ('인재영입', 2), ('홈', 2), ('특징', 2), ('PC', 2), ('Windows', 2), ('10', 2), ('풍부하게', 2), ('생활을', 2), ('1', 2), ('사진', 2), ('있어요', 2), ('파일을', 2), ('물론', 2), ('사용해보세요', 2), ('음성', 2), ('있습니다', 2), ('즐겨보세요', 2), ('오직', 2), ('볼', 2), ('톡', 2), ('오픈채팅', 2), ('다양한', 2), ('소중한', 2), ('나만의', 2), ('만들어', 2), ('‘카카오톡', 2), ('테마’와', 2), ('‘사용자', 2), ('Android', 2), ('가이드', 2), ('iOS', 2), ('샘플', 2), ('버전의', 2), ('샘플로', 2), ('다운받아', 2), ('설치해', 2), ('프로젝트', 2), ('파일', 2), ('모임', 2), ('채널', 2), ('카카오콘', 2), ('카카오계정', 2), ('계정', 2), ('기업사이트', 2), ('본문', 1), ('메인', 1), ('비전', 1), ('걸어온', 1), ('CI', 1), ('윤리규정', 1), ('알고리즘', 1), ('윤리', 1), ('광고', 1), ('제휴', 1), ('for', 1), ('Business', 1), ('보도자료', 1), ('브랜드', 1), ('미디어', 1), ('Travel', 1), ('Day', 1), ('주주구성', 1), ('이사회', 1), ('정관', 1), ('기업지배구조', 1), ('연결재무제표', 1), ('별도재무제표', 1), ('신용등급', 1), ('주주총회', 1), ('미팅예약', 1), ('실적발표', 1), ('정기보고서', 1), ('FAQ', 1), ('배당정보', 1), ('공고사항', 1), ('뉴스', 1), ('카카오스토리', 1), ('치즈', 1), ('메일', 1), ('카페', 1), ('아지트', 1), ('티스토리', 1), ('브런치', 1), ('카카오페이지', 1), ('카카오TV', 1), ('카카오뮤직', 1), ('웹툰', 1), ('1boon', 1), ('선물하기', 1), ('카카오스타일', 1), ('쇼핑하기', 1), ('카카오장보기', 1), ('쇼핑하우', 1), ('카카오게임즈', 1), ('카카오페이', 1), ('대리', 1), ('카카오내비', 1), ('카카오맵', 1), ('카카오버스', 1), ('카카오지하철', 1), ('카카오헤어샵', 1), ('카카오메이커스', 1), ('Next', 1), ('Connect', 1), ('Krew', 1), ('상생센터', 1), ('상생서포터즈', 1), ('클래스', 1), ('교육', 1), ('산학', 1), ('지역', 1), ('교류', 1), ('제주창조경제혁신센터', 1), ('언어지원', 1), ('선택됨', 1), ('KOR', 1), ('한국어로', 1), ('ENG', 1), ('영어로', 1), ('페이지', 1), ('이동경로', 1), ('선택됨서비스', 1), ('다운로드새창열기', 1), ('Mac', 1), ('OS', 1), ('X', 1), ('이상', 1), ('Mobile', 1), ('Google', 1), ('Play', 1), ('App', 1), ('Store', 1), ('사람과', 1), ('세상', 1), ('그', 1), ('이상을', 1), ('연결하는', 1), ('무료채팅', 1), ('언제', 1), ('어디서나', 1), ('1년', 1), ('365일', 1), ('몇', 1), ('명과', 1), ('함께하든', 1), ('무료입니다', 1), ('실시간', 1), ('그룹채팅', 1), ('및', 1), ('즐길', 1), ('있고', 1), ('동영상', 1), ('연락처', 1), ('등의', 1), ('멀티미디어도', 1), ('주고', 1), ('받을', 1), ('편리한', 1), ('기능을', 1), ('PC에서도', 1), ('그대로다양한', 1), ('최대', 1), ('300MB까지', 1), ('전송하는', 1), ('것은', 1), ('백업', 1), ('복원', 1), ('무료통화도', 1), ('가능한', 1), ('PC버전', 1), ('MacOS', 1), ('지원', 1), ('을', 1), ('보이스톡', 1), ('페이스톡', 1), ('친구와', 1), ('실시간으로', 1), ('또는', 1), ('영상으로', 1), ('통화할', 1), ('캐릭터', 1), ('필터는', 1), ('뽀샤시한', 1), ('필터로', 1), ('색다른', 1), ('통화를', 1), ('네트워크', 1), ('현황', 1), ('기상도', 1), ('라이브톡', 1), ('채팅방에서만', 1), ('라이브', 1), ('좋아하는', 1), ('친구', 1), ('가족들이', 1), ('모인', 1), ('그룹채팅방에서', 1), ('라이브를', 1), ('하면서', 1), ('채팅도', 1), ('캘린더', 1), ('채팅방마다', 1), ('흩어져있는', 1), ('약속', 1), ('기념일', 1), ('힘드셨죠', 1), ('톡캘린더로', 1), ('등록하고', 1), ('한', 1), ('눈에', 1), ('모아볼', 1), ('참', 1), ('다가오는', 1), ('일정은', 1), ('놓치지', 1), ('않도록', 1), ('죠르디가', 1), ('미리', 1), ('알려', 1), ('드려요', 1), ('관심사로', 1), ('모여', 1), ('대화하는', 1), ('친구추가', 1), ('없이', 1), ('링크로', 1), ('대화를', 1), ('시작해보세요', 1), ('뿐', 1), ('아니라', 1), ('더', 1), ('많은', 1), ('재미있는', 1), ('이모티콘으로', 1), ('카카오톡을', 1), ('즐기세요', 1), ('채팅방의', 1), ('롱탭', 1), ('하면', 1), ('친구들이', 1), ('가지고', 1), ('스토어에서', 1), ('구입하여', 1), ('테마는', 1), ('친구리스트', 1), ('대화방', 1), ('말풍선', 1), ('폰트', 1), ('색상', 1), ('등', 1), ('주요화면', 1), ('이미지와', 1), ('색깔을', 1), ('자신의', 1), ('취향에', 1), ('맞게', 1), ('변경', 1), ('할', 1), ('있도록', 1), ('하는', 1), ('기능입니다', 1), ('우리', 1), ('가족의', 1), ('만든', 1), ('개성있는', 1), ('캐릭터로', 1), ('테마’가', 1), ('무엇이', 1), ('다른가요', 1), ('직접만들고', 1), ('유저들이', 1), ('만드는', 1), ('달리', 1), ('테마’는', 1), ('카카오톡에서', 1), ('제공하는', 1), ('공식', 1), ('말합니다', 1), ('만들기', 1), ('실제', 1), ('만드시려면', 1), ('아래', 1), ('가이드를', 1), ('OS별로', 1), ('선택하여', 1), ('다운받으신', 1), ('후', 1), ('절차에', 1), ('따라하시면', 1), ('됩니다', 1), ('안드로이드', 1), ('APK', 1), ('아이폰', 1), ('ktheme', 1), ('샵검색', 1), ('톡하다가', 1), ('궁금하면', 1), ('샵', 1), ('오늘', 1), ('뭐', 1), ('먹지', 1), ('내일은', 1), ('비가', 1), ('올까', 1), ('대화', 1), ('중에', 1), ('바로', 1), ('검색하고', 1), ('공유', 1), ('톡게시판', 1), ('관리를', 1), ('게시판', 1), ('공지', 1), ('투표', 1), ('기능으로', 1), ('관리는', 1), ('우리들의', 1), ('순간은', 1), ('게시판에', 1), ('올려', 1), ('간직해', 1), ('누구나', 1), ('무료로', 1), ('사용자들과', 1), ('친구를', 1), ('맺고', 1), ('소통할', 1), ('안의', 1), ('탭', 1), ('카톡에', 1), ('최적화된', 1), ('새로운', 1), ('검색의', 1), ('시작', 1), ('주제별', 1), ('콘텐츠와', 1), ('대화창처럼', 1), ('편안한', 1), ('하단', 1), ('검색창을', 1), ('이용해보세요', 1), ('카카오다운', 1), ('놀라운', 1), ('리워드', 1), ('카카오에서만', 1), ('만날', 1), ('특별한', 1), ('혜택을', 1), ('누려보세요', 1), ('카카오크루', 1), ('크루인터뷰', 1), ('지원하기', 1), ('나의지원서', 1), ('멜론', 1), ('계정정보', 1), ('관리', 1), ('비밀번호', 1), ('찾기', 1), ('도움말', 1), ('이용정보', 1), ('이용약관', 1), ('위치기반서비스이용약관', 1), ('개인정보처리방침', 1), ('운영정책', 1), ('청소년보호정책', 1), ('권리침해신고안내', 1), ('공지사항', 1), ('사이버윤리실', 1), ('Copyright', 1), ('copy', 1), ('Corp', 1), ('All', 1), ('rights', 1), ('reserved', 1), ('관련사이트', 1), ('프라이버시', 1), ('디벨로퍼스', 1), ('다음', 1), ('사이트', 1), ('동반성장', 1), ('사이트제주', 1), ('맨위로', 1)]\n", + "https://www.kr.dyson.com/products/cord-free/dyson-v11tm-vacuums/overview : [('다이슨', 51), ('제품', 30), ('청소', 26), ('모드', 23), ('English', 20), ('및', 19), ('무선', 17), ('더', 16), ('따라', 16), ('사용', 15), ('청소기', 13), ('바닥', 13), ('현재', 13), ('재생', 12), ('수', 11), ('당일', 11), ('있습니다', 11), ('V11', 11), ('평점', 11), ('시간', 11), ('CL5', 11), ('무료', 10), ('알아보기', 10), ('of', 10), ('100', 10), ('개의', 10), ('후기', 10), ('강력한', 10), ('V11™', 9), ('간', 9), ('품질', 9), ('보증', 9), ('지능적으로', 9), ('LCD', 9), ('000', 9), ('테스트했습니다', 9), ('7일', 8), ('이메일', 8), ('신제품', 8), ('유형에', 8), ('화면을', 8), ('통한', 8), ('확인', 8), ('총', 8), ('툴', 8), ('구성', 8), ('₩1', 8), ('00', 8), ('입고', 8), ('부스트', 8), ('로', 8), ('결과', 8), ('2년', 7), ('이메일을', 7), ('니켈', 7), ('조절', 7), ('알림', 7), ('IEC', 7), ('62885', 7), ('2시', 6), ('이전', 6), ('주문', 6), ('배송이', 6), ('경우에는', 6), ('배송', 6), ('콜센터', 6), ('5', 6), ('South', 6), ('위한', 6), ('가장', 6), ('흡입력', 6), ('장바구니에', 6), ('추가', 6), ('97', 6), ('재고', 6), ('2의', 6), ('먼지통을', 6), ('독립시험기관', 6), ('독일', 6), ('SLG', 6), ('Pruef', 6), ('und', 6), ('Zertifizierungs', 6), ('GmbH', 6), ('흡입력을', 6), ('10', 6), ('개요', 5), ('to', 5), ('on', 5), ('출고', 5), ('이전에', 5), ('제품은', 5), ('대상입니다', 5), ('내', 5), ('반품', 5), ('제품에', 5), ('a', 5), ('Dyson', 5), ('4', 5), ('배터리', 5), ('토탈', 5), ('클린', 5), ('안', 5), ('다이슨의', 5), ('1', 5), ('8과', 5), ('9에', 5), ('유연한', 5), ('주입구로', 5), ('테스트', 5), ('표준', 5), ('오후', 4), ('제품을', 4), ('부터', 4), ('부품', 4), ('구매하실', 4), ('공기청정기', 4), ('판매', 4), ('또는', 4), ('us', 4), ('Luxembourg', 4), ('Deutsch', 4), ('Français', 4), ('Republika', 4), ('Türkçe', 4), ('America', 4), ('Canada', 4), ('lrm', 4), ('Africa', 4), ('220', 4), ('에어와트', 4), ('CF', 4), ('코퍼', 4), ('컬러', 4), ('흡입력과', 4), ('구석구석을', 4), ('어느', 4), ('유형에서도', 4), ('강력하게', 4), ('8개의', 4), ('190', 4), ('23', 4), ('집', 4), ('청소하기', 4), ('설계', 4), ('품절입니다', 4), ('재고가', 4), ('Please', 4), ('this', 4), ('1흡입력은', 4), ('가득', 4), ('채우고', 4), ('시험실', 4), ('환경에서', 4), ('먼지', 4), ('입자의', 4), ('4253', 4), ('쿠키', 3), ('시', 3), ('주문하시면', 3), ('출고되어', 3), ('그', 3), ('다음', 3), ('날', 3), ('됩니다', 3), ('다만', 3), ('부득이한', 3), ('다소', 3), ('지연될', 3), ('모든', 3), ('제품과', 3), ('부품을', 3), ('때', 3), ('배송비는', 3), ('무료입니다', 3), ('조명', 3), ('헤어드라이어기', 3), ('국내', 3), ('접수', 3), ('결함으로', 3), ('인한', 3), ('반환이나', 3), ('교환을', 3), ('원하는', 3), ('이메일로', 3), ('문의해주세요', 3), ('개봉', 3), ('단순', 3), ('변심에', 3), ('의한', 3), ('취소는', 3), ('수령', 3), ('후', 3), ('이내에', 3), ('전화나', 3), ('통해', 3), ('가능합니다', 3), ('Expert', 3), ('and', 3), ('business', 3), ('dyson', 3), ('선택하기', 3), ('컴플리트', 3), ('블루', 3), ('플러피', 3), ('레드', 3), ('깊숙이', 3), ('오직', 3), ('이', 3), ('제거', 3), ('경질', 3), ('자사', 3), ('시험', 3), ('입자', 3), ('미세먼지를', 3), ('자동', 3), ('자동으로', 3), ('조절합니다', 3), ('3', 3), ('디지털', 3), ('싸이클론', 3), ('효율은', 3), ('모터', 3), ('청소를', 3), ('막힘', 3), ('청소할', 3), ('방법', 3), ('be', 2), ('in', 2), ('your', 2), ('browser', 2), ('For', 2), ('the', 2), ('our', 2), ('취급', 2), ('방침', 2), ('0800', 2), ('345', 2), ('7788', 2), ('9', 2), ('00am', 2), ('30pm', 2), ('email', 2), ('at', 2), ('co', 2), ('uk', 2), ('meeting', 2), ('with', 2), ('you', 2), ('chat', 2), ('Europe', 2), ('Belgie', 2), ('Nederlands', 2), ('Cyprus', 2), ('Danmark', 2), ('Deutschland', 2), ('España', 2), ('France', 2), ('Hrvatska', 2), ('Ireland', 2), ('Italia', 2), ('Latvija', 2), ('Magyarország', 2), ('Nederland', 2), ('Norge', 2), ('Polska', 2), ('Portugal', 2), ('România', 2), ('Schweiz', 2), ('Slovenija', 2), ('Slovenska', 2), ('Suisse', 2), ('Française', 2), ('Suomi', 2), ('Sverige', 2), ('Svizzera', 2), ('Italiano', 2), ('United', 2), ('Kingdom', 2), ('Österreich', 2), ('Česká', 2), ('Ελλάδα', 2), ('Κύπρος', 2), ('ελληνικά', 2), ('България', 2), ('Россия', 2), ('Русский', 2), ('Україна', 2), ('Asia', 2), ('Pacific', 2), ('Australia', 2), ('Hong', 2), ('Kong', 2), ('India', 2), ('Indonesia', 2), ('Bahasa', 2), ('Indoseisa', 2), ('Malaysia', 2), ('New', 2), ('Zealand', 2), ('Philippines', 2), ('Singapore', 2), ('Korea', 2), ('Thailand', 2), ('ประเทศไทย', 2), ('ไทย', 2), ('中国', 2), ('简体中文', 2), ('日本', 2), ('香港', 2), ('繁體中文', 2), ('North', 2), ('Costa', 2), ('Rica', 2), ('El', 2), ('Salvador', 2), ('Guatemala', 2), ('Honduras', 2), ('Mexico', 2), ('USA', 2), ('Brazil', 2), ('Chile', 2), ('Colombia', 2), ('Panama', 2), ('Peru', 2), ('Middle', 2), ('East', 2), ('Israel', 2), ('Lebanon', 2), ('Qatar', 2), ('Saudi', 2), ('Arabia', 2), ('UAE', 2), ('ישראל', 2), ('עברית', 2), ('Yisra', 2), ('el', 2), ('الإمارات', 2), ('العربيّة', 2), ('المتّحدة', 2), ('المملكة', 2), ('العربية', 2), ('السعودية', 2), ('Morocco', 2), ('슈퍼소닉™', 2), ('퓨어쿨', 2), ('크립토믹™', 2), ('퓨어', 2), ('홈', 2), ('청소합니다', 2), ('조명은', 2), ('5년', 2), ('한함', 2), ('다이슨만이', 2), ('다이슨처럼', 2), ('92', 2), ('13', 2), ('6단계', 2), ('고성능', 2), ('필터레이션', 2), ('단독', 2), ('11개의', 2), ('240', 2), ('101', 2), ('위해', 2), ('제품이', 2), ('종료', 2), ('구매에', 2), ('불편을', 2), ('드려', 2), ('죄송합니다', 2), ('해당', 2), ('주소를', 2), ('남겨주시면', 2), ('입고되었을', 2), ('경우', 2), ('알려드리도록', 2), ('하겠습니다', 2), ('마케팅', 2), ('활동에', 2), ('대한', 2), ('받기', 2), ('원치', 2), ('않기에', 2), ('동의하셨다면', 2), ('제품의', 2), ('되었을', 2), ('시에만', 2), ('발송해', 2), ('드릴', 2), ('예정입니다', 2), ('leave', 2), ('blank', 2), ('do', 2), ('not', 2), ('change', 2), ('field', 2), ('70', 2), ('단단한', 2), ('바닥을', 2), ('7개의', 2), ('090', 2), ('흡입력이', 2), ('카본', 2), ('미세먼지까지', 2), ('잡아냅니다', 2), ('성능은', 2), ('편평한', 2), ('마루', 2), ('표준에', 2), ('명시된', 2), ('사용하여', 2), ('ASTM', 2), ('유형을', 2), ('로드', 2), ('센서는', 2), ('하이', 2), ('토크', 2), ('클리너', 2), ('작동합니다', 2), ('포집', 2), ('싸이클론에', 2), ('테스트는', 2), ('수와', 2), ('수를', 2), ('비교하여', 2), ('계산되었습니다', 2), ('진공', 2), ('감지하고', 2), ('초당', 2), ('헤드', 2), ('일반', 2), ('더욱', 2), ('모드로', 2), ('필터', 2), ('표시', 2), ('잔여', 2), ('잔량을', 2), ('최적의', 2), ('제공합니다', 2), ('위생적으로', 2), ('공식', 2), ('온라인', 2), ('문의', 2), ('1588', 2), ('080', 2), ('300', 2), ('수신자', 2), ('부담', 2), ('웹사이트', 2), ('약관', 2), ('2017', 2), ('JavaScript', 1), ('seems', 1), ('disabled', 1), ('best', 1), ('experience', 1), ('site', 1), ('sure', 1), ('turn', 1), ('Javascript', 1), ('설정', 1), ('웹', 1), ('사이트는', 1), ('쿠키를', 1), ('사용하며', 1), ('당사의', 1), ('사이트를', 1), ('계속', 1), ('방문함으로써', 1), ('귀하의', 1), ('장치에', 1), ('쿠키가', 1), ('저장될', 1), ('있음을', 1), ('허용합니다', 1), ('저희가', 1), ('사용하는', 1), ('쿠키의', 1), ('자세한', 1), ('내용', 1), ('삭제나', 1), ('차단에', 1), ('관해서는', 1), ('을', 1), ('참고해', 1), ('주시기', 1), ('바랍니다', 1), ('X', 1), ('2년간', 1), ('품질보증', 1), ('Call', 1), ('Speak', 1), ('Our', 1), ('for', 1), ('Business', 1), ('UK', 1), ('based', 1), ('helpline', 1), ('is', 1), ('open', 1), ('Monday', 1), ('Thursday', 1), ('Friday', 1), ('closed', 1), ('Saturday', 1), ('Sunday', 1), ('both', 1), ('general', 1), ('rental', 1), ('enquiries', 1), ('Request', 1), ('To', 1), ('request', 1), ('can', 1), ('call', 1), ('or', 1), ('complete', 1), ('online', 1), ('form', 1), ('We', 1), ('ll', 1), ('contact', 1), ('within', 1), ('one', 1), ('day', 1), ('Live', 1), ('Simply', 1), ('click', 1), ('live', 1), ('icon', 1), ('exchange', 1), ('messages', 1), ('V10™', 1), ('V8™', 1), ('V7™', 1), ('기술', 1), ('헤어케어', 1), ('에어랩™', 1), ('스타일러', 1), ('헤어드라이어', 1), ('프로페셔널', 1), ('기업고객', 1), ('B2B', 1), ('공기청정선풍기', 1), ('핫앤쿨', 1), ('퓨어쿨™', 1), ('핫앤쿨™', 1), ('미™', 1), ('라이트', 1), ('싸이클™', 1), ('등록', 1), ('고객', 1), ('지원', 1), ('모두보기', 1), ('사용자를', 1), ('안내', 1), ('시간을', 1), ('최적화하여집', 1), ('지속적으로', 1), ('나은', 1), ('설계하는', 1), ('것이', 1), ('우리를', 1), ('이끄는', 1), ('원동력입니다', 1), ('이는', 1), ('집착에', 1), ('가깝습니다', 1), ('작동하는', 1), ('이유입니다', 1), ('제임스', 1), ('다이슨엔지니어', 1), ('창립자', 1), ('당신의', 1), ('청소기가', 1), ('갖춰야', 1), ('할', 1), ('7가지', 1), ('강력합니다', 1), ('파이버', 1), ('필라멘트가', 1), ('2', 1), ('2먼지', 1), ('CL', 1), ('3에', 1), ('틈새', 1), ('그리고', 1), ('카펫에서', 1), ('먼지입자를', 1), ('미세먼지', 1), ('내부', 1), ('테스트인', 1), ('DTM', 1), ('949에', 1), ('마루에서', 1), ('F608', 1), ('PM10', 1), ('작은', 1), ('포함함', 1), ('바닥의', 1), ('감지해', 1), ('3다이나믹', 1), ('헤드가', 1), ('장착된', 1), ('모델의', 1), ('설정에서만', 1), ('만들어내는', 1), ('모터가', 1), ('탑재됐습니다', 1), ('테크놀로지가', 1), ('4싸이클론', 1), ('F1977', 1), ('04를', 1), ('맞게', 1), ('변경하여', 1), ('진행되었습니다', 1), ('들어가는', 1), ('싸이클론에서', 1), ('방출되는', 1), ('99', 1), ('999', 1), ('잡아내', 1), ('깨끗해진', 1), ('공기를', 1), ('배출합니다', 1), ('5필터레이션', 1), ('02', 1), ('Cl', 1), ('11에', 1), ('시험결과', 1), ('미세먼지제거', 1), ('PM0', 1), ('0', 1), ('마이크론', 1), ('크기의', 1), ('먼지로', 1), ('측정되었으며', 1), ('청소기에', 1), ('흡수된', 1), ('배출된', 1), ('포착율은', 1), ('실제', 1), ('환경과', 1), ('모드에', 1), ('달라질', 1), ('변함없이', 1), ('유지됩니다', 1), ('혁신적인', 1), ('특허기술6', 1), ('6특허번호', 1), ('1845322', 1), ('0866354', 1), ('1836300', 1), ('1083290를', 1), ('포함한', 1), ('특허들이', 1), ('여러', 1), ('국가와', 1), ('한국에', 1), ('등록되어', 1), ('청소하는', 1), ('방식을', 1), ('바꿔보세요', 1), ('끊임없이', 1), ('다이나믹', 1), ('브러쉬바의', 1), ('저항을', 1), ('360회', 1), ('마룻바닥과', 1), ('카펫의', 1), ('맞춰', 1), ('속도를', 1), ('변경합니다', 1), ('어떤', 1), ('바닥이든', 1), ('깨끗하게', 1), ('나일론', 1), ('브러쉬가', 1), ('카펫', 1), ('깊숙히', 1), ('박힌', 1), ('먼지를', 1), ('제거하고', 1), ('부드러운', 1), ('정전기', 1), ('방지', 1), ('파이버는', 1), ('마룻바닥', 1), ('틈새의', 1), ('제거합니다', 1), ('인텔리전트', 1), ('감지', 1), ('시간의', 1), ('최적화된', 1), ('균형', 1), ('강력하고', 1), ('인텔리전트한', 1), ('청소기1', 1), ('긴', 1), ('최대', 1), ('60분', 1), ('동안', 1), ('7', 1), ('7사용', 1), ('시간은', 1), ('툴을', 1), ('장착하지', 1), ('않고', 1), ('사용했을', 1), ('때를', 1), ('기준으로', 1), ('한', 1), ('시간입니다', 1), ('지능적인', 1), ('실시간', 1), ('디스플레이', 1), ('화면', 1), ('상태', 1), ('정보를', 1), ('확인할', 1), ('별', 1), ('표시해', 1), ('효과적으로', 1), ('유지', 1), ('보수', 1), ('성능을', 1), ('알림을', 1), ('보여주고', 1), ('여부와', 1), ('방법을', 1), ('알려줍니다', 1), ('크고', 1), ('향상된', 1), ('다이슨에서', 1), ('배터리는', 1), ('큰', 1), ('고용량', 1), ('코발트', 1), ('알류미늄', 1), ('캐소드를', 1), ('채택하여', 1), ('V10', 1), ('™', 1), ('청소기보다', 1), ('15', 1), ('시스템', 1), ('모니터링', 1), ('기능과', 1), ('고도', 1), ('센서로', 1), ('4회', 1), ('측정해', 1), ('1IEC', 1), ('V10™과', 1), ('비교해', 1), ('V11은', 1), ('분당', 1), ('125', 1), ('회전하는', 1), ('모터입니다', 1), ('기술로', 1), ('쉽게', 1), ('구석구석까지', 1), ('사용법', 1), ('충전하는', 1), ('3가지', 1), ('최적화하는', 1), ('쉽고', 1), ('비우는', 1), ('간편한', 1), ('먼지통', 1), ('비우기', 1), ('‘포인트', 1), ('앤', 1), ('슛', 1), ('메커니즘으로', 1), ('편리하고', 1), ('비울', 1), ('전용', 1), ('스탠드형', 1), ('충전', 1), ('거치대', 1), ('청소기를', 1), ('간편하게', 1), ('보관하고', 1), ('충전하세요', 1), ('벽에', 1), ('못을', 1), ('박을', 1), ('필요가', 1), ('없습니다', 1), ('전체', 1), ('85', 1), ('2019년', 1), ('4월', 1), ('10일에', 1), ('작성', 1), ('되었습니다', 1), ('역시', 1), ('다이슨이네요', 1), ('윤아름', 1), ('이번엔', 1), ('진짜', 1), ('거치대가', 1), ('한몫했고', 1), ('바닥감지도', 1), ('해서', 1), ('바닥이랑', 1), ('카펫에', 1), ('착', 1), ('감기네요', 1), ('흡입력도', 1), ('쎄지고', 1), ('아주', 1), ('좋네요', 1), ('상품평', 1), ('전체보기', 1), ('한정', 1), ('V11TM', 1), ('쿠퍼', 1), ('색상은', 1), ('홈페이지에서', 1), ('구매하기', 1), ('혜택', 1), ('연락처', 1), ('전화', 1), ('카카오톡', 1), ('상담', 1), ('한국', 1), ('정보', 1), ('채용', 1), ('언론', 1), ('AM04', 1), ('리콜', 1), ('글로벌', 1), ('개인정보처리방침', 1), ('개인정보방침', 1), ('James', 1), ('재단', 1), ('©', 1), ('다이슨코리아', 1), ('유한회사', 1), ('대표이사', 1), ('알렉산더', 1), ('오델', 1), ('서울특별시', 1), ('강남구', 1), ('테헤란로', 1), ('142', 1), ('아크플레이스', 1), ('17층', 1), ('06236', 1), ('사업자등록번호', 1), ('811', 1), ('81', 1), ('00675', 1), ('통신판매번호', 1), ('서울강남', 1), ('04029', 1), ('사업자정보확인', 1), ('고객센터', 1), ('운영시간', 1), ('월', 1), ('금', 1), ('오전', 1), ('9시', 1), ('6시', 1), ('help', 1), ('kr', 1), ('com', 1), ('호스팅', 1), ('제공자', 1), ('아마존웹서비스', 1)]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://asia.playstation.com/ko-kr/ps4/games/ : [('PS4', 7), ('게임', 5), ('있는', 4), ('게임을', 4), ('자세히', 4), ('오브', 4), ('Games', 3), ('Pro', 3), ('PlayStation', 3), ('출시', 3), ('지금', 3), ('바로', 3), ('Concrete', 3), ('Genie', 3), ('EA', 3), ('SPORTS™', 3), ('FIFA', 3), ('20', 3), ('Monster', 3), ('Hunter', 3), ('World', 3), ('Iceborne', 3), ('2K20', 3), ('더', 3), ('2', 3), ('nbsp', 3), ('수', 2), ('있습니다', 2), ('콜', 2), ('듀티®', 2), ('모던', 2), ('워페어', 2), ('MediEvil', 2), ('MONKEY', 2), ('KING', 2), ('HERO', 2), ('IS', 2), ('BACK', 2), ('ReadySet', 2), ('Heroes', 2), ('코드', 2), ('베인', 2), ('보더랜드', 2), ('3', 2), ('eFootball', 2), ('PES', 2), ('2020', 2), ('NBA', 2), ('캐서린', 2), ('풀', 2), ('보디', 2), ('다크', 2), ('픽처스', 2), ('맨', 2), ('메단', 2), ('저지', 2), ('아이즈', 2), ('사신의', 2), ('유언', 2), ('신', 2), ('가격판', 2), ('드래곤', 2), ('퀘스트', 2), ('빌더즈', 2), ('많은', 2), ('플레이하세요', 2), ('Death', 2), ('Stranding', 2), ('인기', 2), ('식물', 2), ('vs', 2), ('좀비™', 2), ('네이버빌의', 2), ('대난투', 2), ('알아보기', 2), ('GREAT', 2), ('Sony', 2), ('안도', 2), ('테츠야', 2), ('00', 2), ('02', 2), ('New', 1), ('Upcoming', 1), ('기능', 1), ('주변기기', 1), ('신작', 1), ('및', 1), ('예정인', 1), ('게임들을', 1), ('살펴보세요', 1), ('구매하세요', 1), ('플레이', 1), ('할', 1), ('멋진', 1), ('찾고', 1), ('계세요', 1), ('이렇게', 1), ('다양하고', 1), ('신나는', 1), ('게임들이', 1), ('준비되어', 1), ('클릭해서', 1), ('알아보고', 1), ('디스크', 1), ('버전을', 1), ('주문하거나', 1), ('다운로드', 1), ('버전으로', 1), ('즐겨보세요', 1), ('KINGDOM', 1), ('HEARTS', 1), ('III', 1), ('보기', 1), ('예약주문하기', 1), ('분들의', 1), ('기대를', 1), ('한', 1), ('몸에', 1), ('받고', 1), ('예정작을', 1), ('곧', 1), ('PlayStation®4로', 1), ('즐길', 1), ('예고편과', 1), ('영상을', 1), ('보면서', 1), ('게임에', 1), ('대한', 1), ('정보와', 1), ('느낌을', 1), ('파악한', 1), ('뒤', 1), ('마음에', 1), ('드는', 1), ('예약주문하고', 1), ('출시일에', 1), ('Marvel', 1), ('39', 1), ('s', 1), ('Iron', 1), ('Man', 1), ('VR', 1), ('Nioh', 1), ('FINAL', 1), ('FANTASY', 1), ('VII', 1), ('REMAKE', 1), ('성능', 1), ('향상', 1), ('Pro에서', 1), ('가장', 1), ('대작을', 1), ('나에게', 1), ('맞는', 1), ('PlayStation®4', 1), ('찾아보기', 1), ('라이브러리', 1), ('둘러보기', 1), ('뭔가', 1), ('색다른', 1), ('걸', 1), ('찾으세요', 1), ('방대한', 1), ('라인업을', 1), ('쭉', 1), ('훑어보면서', 1), ('플레이하고', 1), ('싶은', 1), ('새로운', 1), ('찾아보세요', 1), ('출시작', 1), ('WWE', 1), ('진격의거인2', 1), ('Final', 1), ('Battle', 1), ('Call', 1), ('of', 1), ('Duty®', 1), ('WWII', 1), ('데스티니', 1), ('커넥트', 1), ('Blood', 1), ('amp', 1), ('Truth', 1), ('예정작', 1), ('표시', 1), ('GAMES', 1), ('PRICE', 1), ('Hits는', 1), ('전', 1), ('세계적으로', 1), ('PS4™', 1), ('소프트웨어를', 1), ('보다', 1), ('합리적인', 1), ('가격으로', 1), ('제공하는', 1), ('시리즈입니다', 1), ('고객지원', 1), ('이용약관', 1), ('개인정보처리방침', 1), ('지적', 1), ('재산권', 1), ('표기', 1), ('회사', 1), ('소개', 1), ('사이트', 1), ('맵', 1), ('Country', 1), ('Regions', 1), ('대한민국', 1), ('About', 1), ('©2019', 1), ('Interactive', 1), ('Entertainment', 1), ('Inc', 1), ('All', 1), ('Rights', 1), ('Reserved', 1), ('서울시', 1), ('강남구', 1), ('테헤란로', 1), ('134', 1), ('포스코타워', 1), ('역삼', 1), ('8층', 1), ('주', 1), ('소니인터랙티브엔터테인먼트코리아', 1), ('대표자', 1), ('사업장등록번호', 1), ('106', 1), ('86', 1), ('02673', 1), ('통신판매업신고', 1), ('2015', 1), ('서울강남', 1), ('02049', 1), ('개인정보', 1), ('보호책임자', 1), ('siek', 1), ('personalinfo02', 1), ('sony', 1), ('com', 1), ('고객센터', 1), ('운영시간', 1), ('09', 1), ('18', 1), ('토', 1), ('일', 1), ('공휴일', 1), ('휴무', 1), ('TEL', 1), ('6677', 1), ('7771', 1), ('080', 1), ('723', 1), ('7235', 1), ('FAX', 1), ('6001', 1), ('6209', 1), ('서비스센터', 1), ('위치안내', 1)]\n" + ] + } + ], + "source": [ + "import requests\n", + "import string\n", + "\n", + "# 소스를 받아서 태그를 지우기\n", + "def textFilter(source):\n", + " # 1. 태그 전부 지우기\n", + " start = source.find(\"<\") # 찾지 못하면 -1 반환\n", + " while(start != -1): # 더이상 \"<\"가 없을 때까지 반복\n", + " # script태그와 그 내용 삭제\n", + " if(source[start:start+7] == \"\", start+7) + len(\"\")\n", + " source = source.replace(source[start:end], \"\")\n", + " # style태그와 그 내용 삭제\n", + " elif(source[start:start+6] == \"\", start+6) + len(\"\")\n", + " source = source.replace(source[start:end], \"\")\n", + " # 주석 삭제\n", + " elif(source[start:start+4] == \"\", start+4) + len(\"-->\")\n", + " source = source.replace(source[start:end], \"\")\n", + " # 그외의 태그들 삭제\n", + " else:\n", + " end = source.find(\">\", start+1) + len(\">\")\n", + " source = source.replace(source[start:end], \"\")\n", + " start = source.find(\"<\", start)\n", + " # 2. 공백문자를 단위로 요소가 분리된 리스트 생성\n", + " textList = source.split()\n", + " # 3. 단어리스트 반환\n", + " return textList\n", + "\n", + "# URL을 받아서 소스를 반환\n", + "def getSource(siteURL):\n", + " req = requests.get(siteURL)\n", + " source = req.text\n", + " return source\n", + "\n", + "# URL를 받아서 사이트 단어를 리스트로 반환\n", + "def getWordList(siteURL):\n", + " source = getSource(siteURL)\n", + " wordList = textFilter(source)\n", + " return wordList\n", + "\n", + "# URL를 받아서 단어수 출력\n", + "def printCountSiteText(siteURL):\n", + " siteCount = len(getWordList(siteURL))\n", + " print(\"{}의 단어수는 : {}개 입니다.\".format(siteURL, siteCount))\n", + "\n", + "# 문자열 리스트를 받아서 구두문자가 제거된 문자열리스트 반환\n", + "def getNoPuncList(wordList):\n", + " wordList\n", + " wordString = \" \".join(wordList) # 리스트를 띄어쓰기로 이어붙인 문자열로 변환\n", + " for puncChr in string.punctuation: # 모든 구두문자 제거\n", + " wordString = wordString.replace(puncChr, \" \")\n", + " wordList = wordString.split() # 구두문자가 제거된 문자열을 공백문자를 기준으로 리스트로 분리\n", + " return wordList\n", + "\n", + "# URL을 받아서 받아서 구두문자가 제거된 사이트 단어를 리스트로 반환\n", + "def getNoPuncListSite(siteURL):\n", + " wordList = getWordList(siteURL)\n", + " wordList = getNoPuncList(wordList)\n", + " return wordList\n", + "\n", + "# 단어 리스트받아서 단어의 빈도수를 정리한 사전을 반환\n", + "def getFreqDict(wordList):\n", + " freqDict = {}\n", + " for word in wordList:\n", + " if word in freqDict.keys():\n", + " freqDict[word] += 1\n", + " else:\n", + " freqDict[word] = 1\n", + " return freqDict\n", + "\n", + "# URL을 받아서 사이트의 단어 빈도수 순서로된 사전을 리스트로 반환\n", + "def getFreqDictSite(siteURL):\n", + " wordList = getNoPuncListSite(siteURL)\n", + " freqDict = getFreqDict(wordList)\n", + " freqList = list(freqDict.items())\n", + " def sortKeys(a):\n", + " return a[1]\n", + " freqList.sort(key = sortKeys, reverse = True)\n", + " return freqList\n", + "\n", + "urlList = [\n", + " \"http://cse.koreatech.ac.kr\",\n", + " \"http://www.naver.com\",\n", + " \"http://www.daum.net\",\n", + " \"http://www.nytimes.com\",\n", + " \"https://www.nytimes.com/section/science\",\n", + " \"https://policy.naver.com/policy/service.html\",\n", + " \"https://policy.naver.com/policy/privacy.html\",\n", + " \"https://en.wikipedia.org/wiki/Python_(programming_language)\",\n", + " \"https://www.kakaocorp.com/service/KakaoTalk\",\n", + " \"https://www.kr.dyson.com/products/cord-free/dyson-v11tm-vacuums/overview\",\n", + " \"https://asia.playstation.com/ko-kr/ps4/games/\"\n", + "]\n", + "\n", + "for url in urlList:\n", + " freqDict = getFreqDictSite(url)\n", + " print(\"{} : {}\".format(url, freqDict))" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/python3.6/python17.ipynb b/python3.6/python17.ipynb index d31d48e..53c187d 100644 --- a/python3.6/python17.ipynb +++ b/python3.6/python17.ipynb @@ -84,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -119,7 +119,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -129,8 +129,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mUnboundLocalError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mf\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg\u001b[0m \u001b[0;31m# r-value로 사용되는 g는 전역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m20\u001b[0m \u001b[0;31m# l-value로 정의되는 g는 지역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mf\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg\u001b[0m \u001b[0;31m# r-value로 사용되는 g는 전역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m20\u001b[0m \u001b[0;31m# l-value로 정의되는 g는 지역 변수\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mUnboundLocalError\u001b[0m: local variable 'g' referenced before assignment" ] } @@ -148,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -202,7 +202,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "['In', 'Out', '_', '_4', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i2', '_i3', '_i4', '_i5', '_ih', '_ii', '_iii', '_oh', '_sh', 'exit', 'f', 'g', 'get_ipython', 'quit']\n" + "['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i2', '_i3', '_i4', '_i5', '_ih', '_ii', '_iii', '_oh', 'exit', 'f', 'g', 'get_ipython', 'h', 'quit']\n" ] } ], @@ -212,7 +212,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -234,12 +234,13 @@ "source": [ "### 1-3 함수의 중첩 영역(Nested Scopes) 지원\n", "- Nested Scope: 함수 안에 정의되어 있는 함수 내부\n", - " - 가장 안쪽의 스코프부터 바깥쪽의 스코프쪽으로 변수를 찾는다." + " - 가장 안쪽의 스코프부터 바깥쪽의 스코프쪽으로 변수를 찾는다.\n", + " - 각각의 중첩 함수마다 독립적인 Scope을 관리한다." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -263,7 +264,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -713,7 +714,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/python18.ipynb b/python3.6/python18.ipynb index 806be59..8187ceb 100644 --- a/python3.6/python18.ipynb +++ b/python3.6/python18.ipynb @@ -27,7 +27,7 @@ "### 1-1 모듈 import 하기\n", "#### 1) import 모듈명\n", "- 가장 기본적인 형태\n", - " - 이름 공간 mymath가 그대로 유지되므로 mymath.area() 형태로 자격 이름 사용" + " - 현재의 이름 공간에 mymath 이름이 유지되므로 mymath.area() 형태로 자격 이름 사용" ] }, { @@ -712,7 +712,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From 98ee780b278dff5b1d800cbcf511536bf9765f35 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sun, 17 Nov 2019 23:05:10 +0900 Subject: [PATCH 120/124] ... --- .../__pycache__/HMM.cpython-36.pyc | Bin 510 -> 511 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 157 -> 158 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 145 -> 146 bytes python3.6/python18.ipynb | 28 ++++- python3.6/python19.ipynb | 14 +-- python3.6/python20.ipynb | 98 ++++++++++++------ 6 files changed, 102 insertions(+), 38 deletions(-) diff --git a/python3.6/Speech/Recognition/__pycache__/HMM.cpython-36.pyc b/python3.6/Speech/Recognition/__pycache__/HMM.cpython-36.pyc index 101050f55a7593d63448dead41305d9eed5c1b81..b76c977a2e85ce7cc678dd6cbf7efc5360624f57 100644 GIT binary patch delta 249 zcmeyz{GXY_n3tDp-G(jE6FE{HqF6(U5;OBO8E>%`6lLa>tYj!+Vqky}zufdgi&Kk= z^(!+n67%%aGfVUfDoZl*^K?^nb5awF@-p+%C$6z%WSRI($0&-^CqFU8H$NpcN0YIL z5oQL$v?6Ap*e%W+m@3wZH>{MSID-?*Qt|4VypU1GkqxNVPm{Tb1!OKOhyaNo84h+d Y*ai-p-29Z%oK!oI8;U_1I9NDX09`aYDF6Tf literal 510 zcmb7A!Ait15KY>~ZN&vYz#quL&0)clh#-OoyP(y}-fAbb!J3pbReIK|AL1|d>R)); z$u8SP5Y)iTn@Qfxo5_4S-M`_7%XdP^C)#)djLy;8BXmH3zL6z?0766x5irC6_An_mR19T4SUMar&je(zXK3an*Oae0(ul zl*(1zgJ^nJVYY$!>_lXZltm?OWnoIKoWjSeG@Uj5z?_$$eu4-cp)s`#@$W+>*CvP5 zfUG&Sex2Qro5=Sal6uSX-FI4(|7m6Uv;1AF-LjHzT0UFwaJ`@P!q(sXIBtCUWT30% K+4wVY6h|xT0$b1k diff --git a/python3.6/Speech/Recognition/__pycache__/__init__.cpython-36.pyc b/python3.6/Speech/Recognition/__pycache__/__init__.cpython-36.pyc index 6c6e065c9a0cffd4b2295774a22952b06febcbd7..857f1f0e4749737a932a27df241f7ad8b604b414 100644 GIT binary patch delta 55 zcmbQsIFFITn3tDp-G(jE6FJP4z4b$jQ;UlAD>E_@^Yqg*OY{pWOEU8FbW?S6QWJ~v LGV{_WCfWc1`aKg- delta 54 zcmbQoIG2&bn3tF9oFP}#L=JN$Fa6Ns)S_bjlziQc%F?{_?DG6P{q)R|jM60ig36MN J{Je=tHUPfZ5=a05 diff --git a/python3.6/Speech/__pycache__/__init__.cpython-36.pyc b/python3.6/Speech/__pycache__/__init__.cpython-36.pyc index cf2fddc8d5612c48dbee506a94bdf3a9ff6905fd..ccf17e44de4346406f0886d6d0247bceb675e6a7 100644 GIT binary patch delta 55 zcmbQpIEj(Nn3tDp-G(jE6FJP4?e#;8Q;UlAD>E_@^Yqg*OY{pWOEU8FbW?S6QWJ~v LGV{_WCK><$^H~!i delta 54 zcmbQlIFXUVn3tF9oFP}#L=JN$JN?k&)S_bjlziQc%F?{_?DG6P{q)R|jM60ig36MN J{Je=t1^~Di5*Ppg diff --git a/python3.6/python18.ipynb b/python3.6/python18.ipynb index 8187ceb..83e05a7 100644 --- a/python3.6/python18.ipynb +++ b/python3.6/python18.ipynb @@ -607,7 +607,33 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import Speech" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train\n" + ] + } + ], + "source": [ + "Speech.Recognition.HMM.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": {}, "outputs": [ { diff --git a/python3.6/python19.ipynb b/python3.6/python19.ipynb index 0f8be2a..6a33906 100644 --- a/python3.6/python19.ipynb +++ b/python3.6/python19.ipynb @@ -321,7 +321,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -364,7 +364,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -546,7 +546,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -563,7 +563,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -584,7 +584,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mv2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2 생성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc_mem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mi_mem\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mv2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2 생성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc_mem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mi_mem\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'Var' object has no attribute 'i_mem'" ] } @@ -621,7 +621,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -785,7 +785,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/python20.ipynb b/python3.6/python20.ipynb index fa6bcef..2932165 100644 --- a/python3.6/python20.ipynb +++ b/python3.6/python20.ipynb @@ -41,138 +41,138 @@ "

\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", "\n", "\n", "\n", @@ -310,7 +310,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -343,7 +343,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -353,7 +353,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMyString\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"abcd_abcd_abcd\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_a\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMyString\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"abcd_abcd_abcd\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m\"_a\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for /: 'MyString' and 'str'" ] } @@ -385,7 +385,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -421,7 +421,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -450,6 +450,44 @@ "print(~m)" ] }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "fedcba\n", + "abcdef\n" + ] + } + ], + "source": [ + "class MyString:\n", + " def __init__(self, str):\n", + " self.str = str\n", + " \n", + " def __neg__(self):\n", + " t = list(self.str)\n", + " t.reverse()\n", + " return MyString(''.join(t))\n", + " \n", + " def __str__(self):\n", + " return self.str\n", + "\n", + " __invert__ = __neg__\n", + " \n", + "m = MyString(\"abcdef\")\n", + "\n", + "m = -m\n", + "print(m)\n", + "\n", + "m = ~m\n", + "print(m)" + ] + }, { "cell_type": "code", "execution_count": 10, @@ -1277,7 +1315,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From 699a1179e375a8b5a4221b06701324458af0c556 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Sun, 24 Nov 2019 10:51:06 +0900 Subject: [PATCH 121/124] ... --- images/MRO.jpg | Bin 0 -> 13394 bytes python3.6/assignment2019/assignment-5.ipynb | 23 +- python3.6/python21.ipynb | 540 +++++++++++++++++++- 3 files changed, 533 insertions(+), 30 deletions(-) create mode 100644 images/MRO.jpg diff --git a/images/MRO.jpg b/images/MRO.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aafc4f0b207ce5e7d4ce19e9548b96a2d7d55bc2 GIT binary patch literal 13394 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\n", " - 2) 생성자에 URL을 0개에서 임의의 개수를 넣을 수 있도록 생성자 인수를 가변인수로 정의하여 각각의 URL을 리스트 자료형에 유지하시오.\n", @@ -226,13 +232,12 @@ " - 7) getMaxFreqencyWords() 메소드를 구현하여 각 URL의 웹페이지들을 종합적으로 분석한 단어 출현 빈도 사전에서 가장 많이 출현한 단어 리스트를 반환하시오.\n", " \n", " > \\>\\>\\> w1.getMaxFreqencyWords()
\n", - " > site
\n", + " > {'site': 12}
\n", " \n", " - 최다 출현 단어의 빈도수가 동일한 경우 모두 출력해주어야 함 \n", " \n", " > \\>\\>\\> w2.getMaxFreqencyWords()
\n", - " > site
\n", - " > science\n", + " > {'site': 12, 'science': 12}
\n", " \n", " - 만약 등록된 URL이 없다면 getMaxFreqencyWords()의 반환 값은 None이 되어야 함.\n", " - 8) 임의의 단어 1개를 파라미터로 받는 searchUrlByWord() 메소드를 구현하여 유사도가 높은 웹 사이트를 출력하시오.\n", @@ -300,7 +305,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/python3.6/python21.ipynb b/python3.6/python21.ipynb index b32a272..7680a2f 100644 --- a/python3.6/python21.ipynb +++ b/python3.6/python21.ipynb @@ -34,12 +34,22 @@ "- 상속의 이유\n", " - 코드의 재사용\n", " - 상속받은 자식 클래스는 상속을 해준 부모 클래스의 모든 기능을 그대로 사용\n", - " - 자식 클래스는 필요한 기능만을 정의하거나 기존의 기능을 변경(재정의, Override)할 수 있음" + " - 자식 클래스는 필요한 기능만을 정의하거나 기존의 기능을 변경(재정의, Override)할 수 있음\n", + "\n", + "- 부모 클래스 메소드 호출 방법\n", + " - Unbound 메소드 호출\n", + " - 부모 클래스.메소드(self, ...)\n", + " - Bound 메소드 호출\n", + " - ```super()```\n", + " - ```super(Subclass, self)```\n", + " - ```super(Subclass, self)``` call is equivalent to the parameterless ```super()``` call.\n", + " - super()에 대한 자세한 설명\n", + " - https://realpython.com/python-super/" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 85, "metadata": {}, "outputs": [], "source": [ @@ -54,14 +64,16 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 86, "metadata": {}, "outputs": [], "source": [ "class Employee(Person): # 괄호 안에 쓰여진 클래스는 슈퍼클래스를 의미한다.\n", " def __init__(self, name, phone, position, salary):\n", - " Person.__init__(self, name, phone) # Person클래스의 생성자 호출 --> Unbound Method Call\n", - " #super().__init__(name, phone) # --> Bound Method Call\n", + " #Person.__init__(self, name, phone) # Person클래스의 생성자 호출 --> Unbound Method Call\n", + " #super().__init__(name, phone) # --> Bound Method Call - 1\n", + " super(Employee, self).__init__(name, phone) # --> Bound Method Call - 2\n", + " \n", " self.position = position\n", " self.salary = salary" ] @@ -83,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -115,6 +127,42 @@ "print(m2)" ] }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['name', 'phone']\n" + ] + } + ], + "source": [ + "l1 = [x for x in dir(p1) if not x.startswith(\"__\")]\n", + "print(l1)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['name', 'phone', 'position', 'salary']\n" + ] + } + ], + "source": [ + "l2 = [x for x in dir(m1) if not x.startswith(\"__\")]\n", + "print(l2)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -132,7 +180,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -164,7 +212,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -183,8 +231,9 @@ " \n", "class Sub(Super):\n", " def __init__(self):\n", - " Super.__init__(self) # 명시적으로 슈퍼클래스의 생성자를 호출한다.\n", - " #super().__init__() # 또는 왼쪽처럼 Bound 메소드 호출 \n", + " #Super.__init__(self) # Unbound 방식으로 슈퍼클래스의 생성자를 호출한다.\n", + " #super().__init__() # 또는 왼쪽처럼 Bound 메소드 호출 \n", + " super(Sub, self).__init__() # 또는 왼쪽처럼 Bound 메소드 호출 \n", " print('Sub init called')\n", " \n", "s = Sub()" @@ -199,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -231,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -254,7 +303,8 @@ " \n", "class Employee(Person):\n", " def __init__(self, name, phone, position, salary):\n", - " Person.__init__(self, name, phone)\n", + " #Person.__init__(self, name, phone)\n", + " super(Employee, self).__init__(name, phone)\n", " self.position = position\n", " self.salary = salary\n", " \n", @@ -267,7 +317,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -282,7 +332,8 @@ "source": [ "class Employee(Person):\n", " def __init__(self, name, phone, position, salary):\n", - " Person.__init__(self, name, phone)\n", + " #Person.__init__(self, name, phone)\n", + " super(Employee, self).__init__(name, phone)\n", " self.position = position\n", " self.salary = salary\n", " \n", @@ -296,6 +347,74 @@ "print(m1)" ] }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " - \n" + ] + } + ], + "source": [ + "class Employee(Person):\n", + " def __init__(self, name, phone, position, salary):\n", + " #Person.__init__(self, name, phone)\n", + " super(Employee, self).__init__(name, phone)\n", + " self.position = position\n", + " self.salary = salary\n", + " \n", + " def __str__(self):\n", + " s = super().__str__() # 부모 객체의 메소드 호출 (bound)\n", + " s = s.replace(\"Person\", \"Employee\")\n", + " return s + ' - <%s %s>' % (self.position, self.salary)\n", + " \n", + "p1 = Person('gslee', 5284)\n", + "m1 = Employee('kslee', 5224, 'President', 500)\n", + "\n", + "print(p1)\n", + "print(m1)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " - \n" + ] + } + ], + "source": [ + "class Employee(Person):\n", + " def __init__(self, name, phone, position, salary):\n", + " #Person.__init__(self, name, phone)\n", + " super(Employee, self).__init__(name, phone)\n", + " self.position = position\n", + " self.salary = salary\n", + " \n", + " def __str__(self):\n", + " s = Person.__str__(self) # 부모 객체의 메소드 호출 (unbound)\n", + " s = s.replace(\"Person\", \"Employee\")\n", + " return s + ' - <%s %s>' % (self.position, self.salary)\n", + " \n", + "p1 = Person('gslee', 5284)\n", + "m1 = Employee('kslee', 5224, 'President', 500)\n", + "\n", + "print(p1)\n", + "print(m1)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -305,10 +424,13 @@ " - 연산자 오버로딩도 다형성을 지원하는 중요한 기술 \n", " - 예를 들어, a와 b의 객체 형에 따라 a + b의 + 연산자 행동 방식이 변경되는 것\n", "\n", + "\n", "- 다형성의 장점\n", " - 적은 코딩으로 다양한 객체들에게 유사한 작업을 수행시킬 수 있음\n", + " - 일관된 코딩 방식이 유지됨\n", " - 프로그램 작성 코드 량이 줄어든다.\n", - " - 코드의 가독성을 높혀준다.\n", + " - 코드의 가독성을 높혀준다\n", + " \n", " \n", "- 파이썬에서 다형성의 장점\n", " - 형 선언이 없다는 점에서 파이썬에서는 다형성을 적용하기가 더욱 용이하다.\n", @@ -399,7 +521,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -439,7 +561,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 51, "metadata": {}, "outputs": [ { @@ -459,6 +581,48 @@ "source": [ "class Stack(list): # 클래스 정의\n", " push = list.append\n", + "\n", + "s = Stack() # 인스턴스 생성\n", + "\n", + "s.push(4)\n", + "s.push(5)\n", + "print(s)\n", + "print()\n", + "\n", + "s = Stack([1,2,3])\n", + "s.push(4)\n", + "s.push(5)\n", + "print(s)\n", + "print()\n", + "\n", + "print(s.pop()) # 슈퍼 클래스인 리스트 클래스의 pop() 메소드 호출\n", + "print(s.pop())\n", + "print(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4, 5]\n", + "\n", + "[1, 2, 3, 4, 5]\n", + "\n", + "5\n", + "4\n", + "[1, 2, 3]\n" + ] + } + ], + "source": [ + "class Stack(list): # 클래스 정의\n", + " def push(self, other):\n", + " self.append(other)\n", " \n", "s = Stack() # 인스턴스 생성\n", "\n", @@ -489,7 +653,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -497,7 +661,9 @@ "output_type": "stream", "text": [ "[1, 2]\n", + "\n", "1\n", + "\n", "2\n" ] } @@ -554,7 +720,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 53, "metadata": {}, "outputs": [ { @@ -584,6 +750,38 @@ "print(d2.keys())" ] }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_keys(['b', 'c', 'a'])\n", + "['b', 'c', 'a']\n", + "\n", + "['a', 'b', 'c']\n" + ] + } + ], + "source": [ + "class MyDict(dict):\n", + " def keys(self):\n", + " K = list(super().keys()) # 바운드 메소드 호출\n", + " K.sort()\n", + " return K\n", + "\n", + "d = {'b':1, 'c':2, 'a':3}\n", + "print(d.keys())\n", + "print(list(d.keys()))\n", + "print()\n", + "\n", + "d2 = MyDict({'b':1, 'c':2, 'a':3})\n", + "print(d2.keys())" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -772,6 +970,306 @@ "check(C)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "## 4 다중 상속\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![inheritance](../images/MRO.jpg)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "class X: pass\n", + "class Y: pass\n", + "class Z: pass\n", + "\n", + "class A(X, Y): pass\n", + "class B(Y, Z): pass\n", + "\n", + "class M(B, A, Z): pass" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "\n", + "False\n", + "False\n", + "\n", + "[, , , ]\n" + ] + } + ], + "source": [ + "x = X()\n", + "y = Y()\n", + "z = Z()\n", + "\n", + "a = A()\n", + "b = B()\n", + "\n", + "m = M()\n", + "\n", + "print(issubclass(A, X))\n", + "print(isinstance(a, X))\n", + "\n", + "print()\n", + "\n", + "print(issubclass(B, X))\n", + "print(isinstance(b, X))\n", + "\n", + "print()\n", + "\n", + "print(B.mro())" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "\n", + "True\n", + "True\n", + "\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "print(issubclass(M, Z))\n", + "print(isinstance(m, Z))\n", + "\n", + "print()\n", + "\n", + "print(issubclass(M, X))\n", + "print(isinstance(m, X))\n", + "\n", + "print()\n", + "\n", + "print(issubclass(M, Y))\n", + "print(isinstance(m, Y))" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[, , , , , , ]\n" + ] + } + ], + "source": [ + "print(M.mro()) # method resolution order" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다중 상속 예제" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Alice\n", + "10\n", + "3\n" + ] + } + ], + "source": [ + "class Human:\n", + " def __init__(self, name):\n", + " self.name = name\n", + "\n", + "class Coder:\n", + " def __init__(self, skills):\n", + " self.skills = skills\n", + "\n", + "class Pythonista(Human, Coder):\n", + " def __init__(self, name, skills, dream):\n", + " Human.__init__(self, name)\n", + " Coder.__init__(self, skills)\n", + " self.dream = dream\n", + "\n", + "obj = Pythonista(\"Alice\", 3, 10)\n", + "\n", + "print(obj.name)\n", + "print(obj.skills)\n", + "print(obj.dream)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 다중 상속 문제 해결 " + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Class D __init__()\n", + "Class B __init__()\n", + "Class A __init__()\n", + "Class C __init__()\n", + "Class A __init__()\n" + ] + } + ], + "source": [ + "class A:\n", + " def __init__(self):\n", + " print(\"Class A __init__()\")\n", + "\n", + "class B(A):\n", + " def __init__(self):\n", + " print(\"Class B __init__()\")\n", + " A.__init__(self)\n", + "\n", + "class C(A):\n", + " def __init__(self):\n", + " print(\"Class C __init__()\")\n", + " A.__init__(self)\n", + "\n", + "class D(B, C):\n", + " def __init__(self):\n", + " print(\"Class D __init__()\")\n", + " B.__init__(self)\n", + " C.__init__(self)\n", + "\n", + "d = D()" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Class D __init__()\n", + "Class B __init__()\n", + "Class C __init__()\n", + "Class A __init__()\n", + "[, , , , ]\n" + ] + } + ], + "source": [ + "class A:\n", + " def __init__(self):\n", + " print(\"Class A __init__()\")\n", + "\n", + "class B(A):\n", + " def __init__(self):\n", + " print(\"Class B __init__()\")\n", + " super().__init__()\n", + "\n", + "class C(A):\n", + " def __init__(self):\n", + " print(\"Class C __init__()\")\n", + " super().__init__()\n", + "\n", + "class D(B, C):\n", + " def __init__(self):\n", + " print(\"Class D __init__()\")\n", + " super().__init__()\n", + "\n", + "d = D()\n", + "print(D.mro())" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Class D __init__()\n", + "Class B __init__()\n", + "Class C __init__()\n", + "Class A __init__()\n", + "[, , , , ]\n" + ] + } + ], + "source": [ + "class A:\n", + " def __init__(self):\n", + " print(\"Class A __init__()\")\n", + "\n", + "class B(A):\n", + " def __init__(self):\n", + " print(\"Class B __init__()\")\n", + " super(B, self).__init__()\n", + "\n", + "class C(A):\n", + " def __init__(self):\n", + " print(\"Class C __init__()\")\n", + " super(C, self).__init__()\n", + "\n", + "class D(B, C):\n", + " def __init__(self):\n", + " print(\"Class D __init__()\")\n", + " super(D, self).__init__()\n", + "\n", + "d = D()\n", + "print(D.mro())" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -797,7 +1295,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From d1a0762b9f5fba67aa17b4b82932ae58c9142342 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 2 Dec 2019 00:59:28 +0900 Subject: [PATCH 122/124] ... --- python3.6/python22.ipynb | 312 +++++++++++++++++++++++++++------------ 1 file changed, 221 insertions(+), 91 deletions(-) diff --git a/python3.6/python22.ipynb b/python3.6/python22.ipynb index 2b2f503..0db8965 100644 --- a/python3.6/python22.ipynb +++ b/python3.6/python22.ipynb @@ -376,7 +376,7 @@ " - 더 이상 넘겨줄 자료가 없을 때 StopIteration 예외를 발생시킴\n", " - next() 내장 함수에 대응됨\n", " \n", - "- 임의의 객체에 대해 반복자 객체 생성 방법\n", + "- 임의의 객체에 대해 반복자 객체를 얻어오는 방법\n", " - iter(o) 내장 함수\n", " - 객체 o의 반복자 객체를 반환한다.\n", "- 반복자 객체의 메모리 효율성\n", @@ -385,14 +385,14 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "1\n", "2\n", "3\n" @@ -405,7 +405,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 17\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 17\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m: " ] } @@ -593,7 +593,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -619,9 +619,9 @@ " self.file = open(fname)\n", " \n", " def __getitem__(self, n):\n", - " if n == 10:\n", - " raise StopIteration\n", - " return n\n", + " if n == 10:\n", + " raise IndexError()\n", + " return n\n", " \n", "s = Seq('readme.txt') \n", "for line in s: \n", @@ -630,7 +630,44 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n" + ] + } + ], + "source": [ + "class Seq:\n", + " def __init__(self, fname):\n", + " self.file = open(fname)\n", + " \n", + " def __getitem__(self, n):\n", + " if n == 10:\n", + " raise StopIteration()\n", + " return n\n", + " \n", + "s = Seq('readme.txt') \n", + "for line in s: \n", + " print(line)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -643,7 +680,7 @@ "\n", "ghi\n", "\n", - "<__main__.Seq object at 0x10875da20>\n", + "<__main__.Seq object at 0x105ef6940>\n", "['abc\\n', 'def\\n', 'ghi']\n", "('abc\\n', 'def\\n', 'ghi')\n" ] @@ -656,9 +693,9 @@ " self.file = open(fname)\n", " \n", " def __getitem__(self, n): # for ~ in 이 호출될 때 __next__() 함수에 의하여 가려짐. \n", - " if n == 10:\n", - " raise StopIteration\n", - " return n\n", + " if n == 10:\n", + " raise StopIteration()\n", + " return n\n", "\n", " def __iter__(self):\n", " return self\n", @@ -671,7 +708,7 @@ " \n", "s = Seq('readme.txt') # s 인스턴스가 next() 메소드를 지니고 있으므로 s 인스턴스 자체가 반복자임 \n", "for line in s: # 우선 __iter__() 메소드를 호출하여 반복자를 얻고, 반복자에 대해서 for ~ in 구문에 의하여 __next__() 메소드가 호출됨\n", - " print(line),\n", + " print(line)\n", "\n", "print()\n", "\n", @@ -686,7 +723,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -694,30 +731,34 @@ "output_type": "stream", "text": [ "abc\n", + "\n", "def\n", + "\n", "ghi\n", "\n", - "<__main__.Seq instance at 0x10ddc5680>\n", - "['abc\\n', 'def\\n', 'ghi\\n']\n", - "('abc\\n', 'def\\n', 'ghi\\n')\n" + "<__main__.Seq object at 0x105ef6278>\n", + "['abc\\n', 'def\\n', 'ghi']\n", + "('abc\\n', 'def\\n', 'ghi')\n" ] } ], "source": [ - "#python2.x\n", "class Seq:\n", " def __init__(self, fname):\n", " self.file = open(fname)\n", + " \n", " #def __getitem__(self, n):\n", " # if n == 10:\n", - " # raise StopIteration\n", + " # raise StopIteration()\n", " # return n\n", + "\n", " def __iter__(self):\n", " return self\n", - " def next(self):\n", + " \n", + " def __next__(self):\n", " line = self.file.readline() # 한 라인을 읽는다.\n", " if not line: \n", - " raise StopIteration # 읽을 수 없으면 예외 발생\n", + " raise StopIteration() # 읽을 수 없으면 예외 발생\n", " return line # 읽은 라인을 리턴한다.\n", " \n", "s = Seq('readme.txt') # s 인스턴스가 next() 메소드를 지니고 있으므로 s 인스턴스 자체가 반복자임 \n", @@ -732,6 +773,63 @@ "print(tuple(Seq('readme.txt'))) # tuple() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " ] }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "\n", + "<__main__.Seq object at 0x105ef61d0>\n", + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)\n" + ] + } + ], + "source": [ + "class Seq:\n", + " def __init__(self, fname):\n", + " self.file = open(fname)\n", + " \n", + " def __getitem__(self, n):\n", + " if n == 10:\n", + " raise StopIteration()\n", + " return n\n", + "\n", + "# def __iter__(self):\n", + "# return self\n", + " \n", + "# def __next__(self):\n", + "# line = self.file.readline() # 한 라인을 읽는다.\n", + "# if not line: \n", + "# raise StopIteration() # 읽을 수 없으면 예외 발생\n", + "# return line # 읽은 라인을 리턴한다.\n", + " \n", + "s = Seq('readme.txt') # s 인스턴스가 next() 메소드를 지니고 있으므로 s 인스턴스 자체가 반복자임 \n", + "for line in s: # 우선 __iter__() 메소드를 호출하여 반복자를 얻고, 반복자에 대해서 for ~ in 구문에 의하여 next() 메소드가 호출됨\n", + " print(line),\n", + "\n", + "print()\n", + "\n", + "print(Seq('readme.txt'))\n", + "\n", + "print(list(Seq('readme.txt'))) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. \n", + "print(tuple(Seq('readme.txt'))) # tuple() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -765,13 +863,14 @@ ], "source": [ "d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}\n", + "\n", "for key in d:\n", " print(key, d[key])" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -788,6 +887,7 @@ ], "source": [ "d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}\n", + "\n", "for key in iter(d):\n", " print(key, d[key])" ] @@ -806,7 +906,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -825,7 +925,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -835,7 +935,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'dict_keys' object is not an iterator" ] } @@ -846,7 +946,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -855,7 +955,7 @@ "'one'" ] }, - "execution_count": 36, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -866,7 +966,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -895,7 +995,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -1051,7 +1151,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -1071,7 +1171,7 @@ "f = open('readme.txt')\n", "print(\"next(f) - \", next(f))\n", "for line in f: # f.next() 가 순차적으로 호출됨\n", - " print(line, ) " + " print(line) " ] }, { @@ -1124,14 +1224,25 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 3\n" + ] + } + ], "source": [ "def f(a, b):\n", " c = a * b\n", " d = a + b\n", - " return c, d" + " return c, d\n", + "\n", + "x, y = f(1, 2)\n", + "print(x, y)" ] }, { @@ -1141,13 +1252,53 @@ "- yield 키워드\n", " - return 대신에 yield에 의해 값을 반환하는 함수는 발생자이다.\n", " - yield는 return과 유사하게 임의의 값을 반환하지만 함수의 실행 상태를 보존하면서 함수를 호출한 쪽으로 복귀시켜준다.\n", + " \n", + " \n", "- 발생자는 곧 반복자이다.\n", " - 즉, 발생자에게 next() 호출이 가능하다." ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 3\n" + ] + }, + { + "ename": "StopIteration", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m: " + ] + } + ], + "source": [ + "def f(a, b):\n", + " c = a * b\n", + " d = a + b\n", + " yield c, d\n", + "\n", + "g = f(1, 2)\n", + "\n", + "x, y = next(g)\n", + "print(x, y)\n", + "\n", + "x, y = next(g)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -1158,14 +1309,14 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "0\n", "1\n", "2\n" @@ -1178,7 +1329,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 더 이상 반환할 값이 없다면 StopIteration 예외를 던짐\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 값 반환 후 다시 중단\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 발생자 실행 재개. yield에 의해 더 이상 반환할 값이 없다면 StopIteration 예외를 던짐\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m: " ] } @@ -1207,7 +1358,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -1230,6 +1381,8 @@ "- 발생자 함수와 일반 함수의 차이점\n", " - 일반 함수는 함수가 호출되면 그 함수 내부에 정의된 모든 일을 마치고 결과를 반환함\n", " - 발생자 함수는 함수 내에서 수행 중에 중간 결과 값을 반환할 수 있음\n", + " \n", + " \n", "- 발생자가 유용하게 사용되는 경우\n", " - 함수 처리의 중간 결과를 다른 코드에서 참조할 경우\n", " - 즉, 모든 결과를 한꺼번에 반환 받는 것이 아니라 함수 처리 중에 나온 중간 결과를 받아서 사용해야 할 경우\n", @@ -1248,7 +1401,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -1264,7 +1417,7 @@ "list" ] }, - "execution_count": 45, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -1287,14 +1440,14 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " at 0x108759678>\n" + " at 0x105eec200>\n" ] }, { @@ -1303,7 +1456,7 @@ "generator" ] }, - "execution_count": 46, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -1316,7 +1469,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -1354,7 +1507,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -1372,7 +1525,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -1397,7 +1550,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -1436,7 +1589,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -1461,49 +1614,15 @@ " def __next__(self): # 반복자의 필수 함수\n", " self.data += 2\n", " if self.limit and self.limit <= self.data:\n", - " raise StopIteration\n", + " raise StopIteration()\n", " return self.data\n", "\n", "for k in Odds(20):\n", " print(k, end=\" \")\n", - "print()\n", - "print(list(Odds(20))) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 __next__(self)를 매번 호출하여 각 원소를 얻어온다. " - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 3 5 7 9 11 13 15 17 19\n", - "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n" - ] - } - ], - "source": [ - "#python2.x\n", - "class Odds:\n", - " def __init__(self, limit = None): # 생성자 정의\n", - " self.data = -1 # 초기 값\n", - " self.limit = limit # 한계 값\n", - "\n", - " def __iter__(self): # Odds 객체의 반복자를 반환하는 특수 함수\n", - " return self\n", " \n", - " def next(self): # 반복자의 필수 함수\n", - " self.data += 2\n", - " if self.limit and self.limit <= self.data:\n", - " raise StopIteration\n", - " return self.data\n", - "\n", - "for k in Odds(20):\n", - " print(k,)\n", "print()\n", - "print(list(Odds(20))) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 next()를 매번 호출하여 각 원소를 얻어온다. " + "\n", + "print(list(Odds(20))) # list() 내장 함수가 객체를 인수로 받으면 해당 객체의 반복자를 얻어와 __next__(self)를 매번 호출하여 각 원소를 얻어온다. " ] }, { @@ -1515,14 +1634,23 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1 3 5 7 9 11 13 15 17 19 \n", + "1 \n", + "3 \n", + "5 \n", + "7 \n", + "9 \n", + "11 \n", + "13 \n", + "15 \n", + "17 \n", + "19 \n", "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n" ] } @@ -1536,7 +1664,9 @@ " \n", "for k in odds(20):\n", " print(k, end=\" \")\n", - "print()\n", + "\n", + " print()\n", + "\n", "print(list(odds(20))) # list() 내장 함수가 발생자를 인수로 받으면 해당 발생자의 next()를 매번 호출하여 각 원소를 얻어온다. " ] }, @@ -1564,7 +1694,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From 0c3a9da37587c5a97609f744a8bfff4dc3ae8944 Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 9 Dec 2019 06:54:34 +0900 Subject: [PATCH 123/124] ... --- python3.6/a.txt | 1 + python3.6/python22.ipynb | 264 ++++++++++++++++----------------------- python3.6/python23.ipynb | 246 +++++++++++++++--------------------- 3 files changed, 213 insertions(+), 298 deletions(-) create mode 100644 python3.6/a.txt diff --git a/python3.6/a.txt b/python3.6/a.txt new file mode 100644 index 0000000..171538e --- /dev/null +++ b/python3.6/a.txt @@ -0,0 +1 @@ +0.0 \ No newline at end of file diff --git a/python3.6/python22.ipynb b/python3.6/python22.ipynb index 0db8965..458a709 100644 --- a/python3.6/python22.ipynb +++ b/python3.6/python22.ipynb @@ -379,6 +379,7 @@ "- 임의의 객체에 대해 반복자 객체를 얻어오는 방법\n", " - iter(o) 내장 함수\n", " - 객체 o의 반복자 객체를 반환한다.\n", + "- 집합적 객체 A --> iter(A) --> 반복자 객체 B 반환 --> next(B) --> 집합적 자료형 안의 내부 원소를 하나씩 반환\n", "- 반복자 객체의 메모리 효율성\n", " - 반복자가 원 객체의 원소들을 복사하여 지니고 있지 않다." ] @@ -430,46 +431,71 @@ "print(next(I))" ] }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n" + ] + } + ], + "source": [ + "K = {1: \"aaa\", 2: \"bbb\", 3: \"ccc\"}\n", + "J = iter(K)\n", + "print(next(J))\n", + "print(next(J))\n", + "print(next(J))" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- 리스트 객체에 대해 일반적인 for ~ in 반복 문 사용예" + "- 리스트 객체에 반복자를 활용한 예" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "1\n", "2\n", - "3\n", - "4\n" + "3\n" ] } ], "source": [ - "def f(x):\n", - " print(x + 1)\n", - "\n", - "for x in [1,2,3]:\n", - " f(x)" + "t = iter([1, 2, 3])\n", + "while 1:\n", + " try:\n", + " x = next(t)\n", + " except StopIteration:\n", + " break\n", + " print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- 리스트 객체에 반복자를 활용한 예" + "- 리스트 객체에 대해 일반적인 for ~ in 반복 문 사용예" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -486,13 +512,7 @@ "def f(x):\n", " print(x + 1)\n", "\n", - "t = iter([1,2,3])\n", - "while 1:\n", - " try:\n", - " #x = t.next() <-- Python2.7\n", - " x = next(t)\n", - " except StopIteration:\n", - " break\n", + "for x in [1,2,3]:\n", " f(x)" ] }, @@ -507,7 +527,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -524,14 +544,14 @@ "def f(x):\n", " print(x + 1)\n", "\n", - "t = iter([1,2,3])\n", + "t = iter([1, 2, 3])\n", "for x in t:\n", " f(x)" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -548,13 +568,13 @@ "def f(x):\n", " print(x + 1)\n", "\n", - "for x in iter([1,2,3]):\n", + "for x in iter([1, 2, 3]):\n", " f(x)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -571,7 +591,7 @@ "def f(x):\n", " print(x + 1)\n", "\n", - "for x in iter((1,2,3)):\n", + "for x in iter((1, 2, 3)):\n", " f(x)" ] }, @@ -582,18 +602,9 @@ "### 2-2 클래스에 반복자 구현하기" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 내장 함수 iter()에 대응되는 \\_\\_iter\\_\\_(self) 및 next()에 대응되는 \\_\\_next\\_\\_(self)의 구현 \n", - " - 객체 o에 iter()를 호출하면 자동으로 \\_\\_iter\\_\\_(self) 함수 호출\n", - " - \\_\\_iter\\_\\_(self) 함수는 \\_\\_next\\_\\_(self) 함수를 지닌 반복자 객체를 반환" - ] - }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -615,59 +626,35 @@ ], "source": [ "class Seq:\n", - " def __init__(self, fname):\n", - " self.file = open(fname)\n", - " \n", " def __getitem__(self, n):\n", " if n == 10:\n", " raise IndexError()\n", " return n\n", " \n", - "s = Seq('readme.txt') \n", + "s = Seq() \n", "for line in s: \n", " print(line)" ] }, { - "cell_type": "code", - "execution_count": 6, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "4\n", - "5\n", - "6\n", - "7\n", - "8\n", - "9\n" - ] - } - ], "source": [ - "class Seq:\n", - " def __init__(self, fname):\n", - " self.file = open(fname)\n", - " \n", - " def __getitem__(self, n):\n", - " if n == 10:\n", - " raise StopIteration()\n", - " return n\n", - " \n", - "s = Seq('readme.txt') \n", - "for line in s: \n", - " print(line)" + "- 내장 함수 iter()에 대응되는 \\_\\_iter\\_\\_(self) 및 next()에 대응되는 \\_\\_next\\_\\_(self)의 구현 \n", + " - 객체 o에 iter()를 호출하면 자동으로 \\_\\_iter\\_\\_(self) 함수 호출\n", + " - \\_\\_iter\\_\\_(self) 함수는 \\_\\_next\\_\\_(self) 함수를 지닌 반복자 객체를 반환" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- for ~ in 호출시에는 ____next ____() 함수가 ____getitem ____() 보다 우선하여 호출됨" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -680,19 +667,18 @@ "\n", "ghi\n", "\n", - "<__main__.Seq object at 0x105ef6940>\n", + "<__main__.Seq object at 0x110e2a748>\n", "['abc\\n', 'def\\n', 'ghi']\n", "('abc\\n', 'def\\n', 'ghi')\n" ] } ], "source": [ - "#python3.x\n", "class Seq:\n", - " def __init__(self, fname):\n", - " self.file = open(fname)\n", + " def __init__(self, file):\n", + " self.file = open(file)\n", " \n", - " def __getitem__(self, n): # for ~ in 이 호출될 때 __next__() 함수에 의하여 가려짐. \n", + " def __getitem__(self, n): # for ~ in 이 호출될 때에는 __next__() 함수에 의하여 가려짐. \n", " if n == 10:\n", " raise StopIteration()\n", " return n\n", @@ -707,6 +693,7 @@ " return line # 읽은 라인을 리턴한다.\n", " \n", "s = Seq('readme.txt') # s 인스턴스가 next() 메소드를 지니고 있으므로 s 인스턴스 자체가 반복자임 \n", + "\n", "for line in s: # 우선 __iter__() 메소드를 호출하여 반복자를 얻고, 반복자에 대해서 for ~ in 구문에 의하여 __next__() 메소드가 호출됨\n", " print(line)\n", "\n", @@ -723,7 +710,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -736,7 +723,7 @@ "\n", "ghi\n", "\n", - "<__main__.Seq object at 0x105ef6278>\n", + "<__main__.Seq object at 0x110e2a780>\n", "['abc\\n', 'def\\n', 'ghi']\n", "('abc\\n', 'def\\n', 'ghi')\n" ] @@ -775,7 +762,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -793,7 +780,7 @@ "8\n", "9\n", "\n", - "<__main__.Seq object at 0x105ef61d0>\n", + "<__main__.Seq object at 0x110e07d68>\n", "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", "(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)\n" ] @@ -846,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -870,7 +857,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -986,11 +973,7 @@ "print()\n", "\n", "for key in iter(d.keys()): # 키에 대한 반복자, iter(d.keys()) 가 반환한 반복자에 대해 __next__(self) 함수가 순차적으로 불리워짐\n", - " print(key, end=\" \")\n", - " \n", - "#python2.x\n", - "# for key in d.iterkeys(): # 키에 대한 반복자, d.iterkeys() 가 반환한 반복자에 대해 next() 함수가 순차적으로 불리워짐\n", - "# print(key,)" + " print(key, end=\" \")" ] }, { @@ -1016,18 +999,6 @@ " print(key, end=\" \")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- python2.x\n", - " - d.itervalues() 함수\n", - " - 사전 d가 지닌 값에 대한 반복자 객체를 반환한다.\n", - "\n", - "- python3.x\n", - " - iter(d.values()) 사용" - ] - }, { "cell_type": "code", "execution_count": 24, @@ -1049,7 +1020,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -1069,23 +1040,7 @@ "print()\n", "\n", "for key in iter(d.values()): # 키에 대한 반복자, iter(d.keys()) 가 반환한 반복자에 대해 __next__(self) 함수가 순차적으로 불리워짐\n", - " print(key, end=\" \")\n", - "\n", - "#python2.x\n", - "# for value in d.itervalues(): # 값에 대한 반복자\n", - "# print(value,) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- python2.x\n", - " - d.iteritems() 함수\n", - " - 사전 d가 지닌 (키, 값)에 대한 반복자 객체를 반환한다.\n", - "\n", - "- python3.x\n", - " - iter(d.items()) 사용" + " print(key, end=\" \")" ] }, { @@ -1109,7 +1064,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -1127,11 +1082,7 @@ "source": [ "#python3.x\n", "for key, value in iter(d.items()): # 키에 대한 반복자, iter(d.keys()) 가 반환한 반복자에 대해 __next__(self) 함수가 순차적으로 불리워짐\n", - " print(key, value)\n", - "\n", - "#python2.x\n", - "# for value in d.iteritems(): # 값에 대한 반복자\n", - "# print(key, value,) " + " print(key, value)" ] }, { @@ -1151,7 +1102,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -1169,37 +1120,13 @@ "source": [ "#python3.x\n", "f = open('readme.txt')\n", + "\n", "print(\"next(f) - \", next(f))\n", + "\n", "for line in f: # f.next() 가 순차적으로 호출됨\n", " print(line) " ] }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "f.next() 1: Hello World\n", - "\n", - "2: Hello World\n", - "3: Hello World\n", - "4: Hello World\n", - "5: Hello World\n" - ] - } - ], - "source": [ - "#python2.x\n", - "f = open('readme.txt')\n", - "print(\"f.next()\", f.next())\n", - "for line in f: # f.next() 가 순차적으로 호출됨\n", - " print(line, ) " - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1260,7 +1187,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -1277,7 +1204,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mStopIteration\u001b[0m: " ] } @@ -1293,7 +1220,38 @@ "x, y = next(g)\n", "print(x, y)\n", "\n", - "x, y = next(g)" + "x, y = next(g)\n", + "print(x, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 3\n", + "2 3\n" + ] + } + ], + "source": [ + "def f(a, b):\n", + " for _ in range(2):\n", + " c = a * b\n", + " d = a + b\n", + " yield c, d\n", + "\n", + "g = f(1, 2)\n", + "\n", + "x, y = next(g)\n", + "print(x, y)\n", + "\n", + "x, y = next(g)\n", + "print(x, y)" ] }, { diff --git a/python3.6/python23.ipynb b/python3.6/python23.ipynb index 2f8d6a4..ed67c82 100644 --- a/python3.6/python23.ipynb +++ b/python3.6/python23.ipynb @@ -75,7 +75,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m4\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mspam\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m4\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mspam\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'spam' is not defined" ] } @@ -94,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -104,7 +104,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero" ] } @@ -112,10 +112,7 @@ "source": [ "a = 10\n", "b = 0 \n", - "c = a / b\n", - "\n", - "# python2.x에서의 결과\n", - "# eroDivisionError: integer division or modulo by zero" + "c = a / b" ] }, { @@ -127,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -137,8 +134,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mdivision\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mdivision\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10.0\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" ] } @@ -148,7 +145,7 @@ " for n in range(0, 5):\n", " print(10.0 / n)\n", "\n", - "division() " + "division()" ] }, { @@ -171,16 +168,13 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m'2'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# python2.x에서의 결과\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# TypeError: cannot concatenate 'str' and 'int' objects\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m'2'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: must be str, not int" ] } ], "source": [ - "'2' + 2\n", - "\n", - "# python2.x에서의 결과\n", - "# TypeError: cannot concatenate 'str' and 'int' objects" + "'2' + 2" ] }, { @@ -203,7 +197,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] } @@ -233,7 +227,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"a\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"a\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mKeyError\u001b[0m: 'c'" ] } @@ -254,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -264,16 +258,13 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'aaa.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# python2.x에서의 결과\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# IOError: [Errno 2] No such file or directory: 'aaa.txt'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'aaa.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'aaa.txt'" ] } ], "source": [ - "a = open('aaa.txt')\n", - "\n", - "# python2.x에서의 결과\n", - "# IOError: [Errno 2] No such file or directory: 'aaa.txt'" + "a = open('aaa.txt')" ] }, { @@ -381,7 +372,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -442,32 +433,6 @@ "division()" ] }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 6)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m6\u001b[0m\n\u001b[0;31m except ZeroDivisionError, msg:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" - ] - } - ], - "source": [ - "#python2.x\n", - "def division():\n", - " for n in range(0, 5):\n", - " try:\n", - " print(10.0 / n)\n", - " except ZeroDivisionError, msg:\n", - " print msg\n", - "\n", - "division()" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -477,15 +442,15 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { "ename": "SyntaxError", - "evalue": "invalid syntax (, line 5)", + "evalue": "invalid syntax (, line 5)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m else:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m else:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], @@ -510,7 +475,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -529,38 +494,17 @@ " print('Error -', e)" ] }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 4)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m except NameError, msg:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" - ] - } - ], - "source": [ - "#python2.7\n", - "try:\n", - " spam()\n", - "except NameError, msg:\n", - " print('Error -', msg)" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- try 절 안에서 간접적으로 호출한 함수의 내부 예외도 처리할 수 있다." + "- try 절 안에서 간접적으로 호출한 함수의 내부 예외는 그 함수를 호출한 쪽에서도 처리할 수 있다\n", + " - 즉, 예외는 함수안에서 처리가 안되면 함수 밖으로 던져진다." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -583,53 +527,37 @@ ] }, { - "cell_type": "code", - "execution_count": 18, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "zero division error!!! - integer division or modulo by zero\n" - ] - } - ], "source": [ - "#python2.x\n", - "def zero_division():\n", - " x = 1 / 0\n", - "\n", - "try:\n", - " zero_division()\n", - "except ZeroDivisionError, msg:\n", - " print 'zero division error!!! -', msg" + "- 함수 안에서 예외 처리를 하면 함수를 호출한 쪽으로 해당 예외가 넘어오지 않는다." ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "zero division error!!! - division by zero\n" + "Inner - zero division error!!! - division by zero\n" ] } ], "source": [ + "#python3.x\n", "def zero_division():\n", - " x = 1 / 0\n", + " try:\n", + " x = 1 / 0\n", + " except ZeroDivisionError as e:\n", + " print('Inner - zero division error!!! -', e)\n", "\n", "try:\n", " zero_division()\n", - "except ZeroDivisionError as msg:\n", - " print('zero division error!!! -', msg)\n", - " \n", - "# python2.x에서의 결과\n", - "# zero division error!!! - integer division or modulo by zero" + "except ZeroDivisionError as e:\n", + " print('Outer - zero division error!!! -', e)" ] }, { @@ -641,7 +569,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -664,12 +592,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- 여러 예외들 각각에 대해 except 절을 다중으로 삽입할 수 있다." + "- 여러 예외들 각각에 대해 except 절을 다중으로 삽입할 수 있다.\n", + " - 하지만 해당 예외가 발생하면 그 다중으로 삽입된 except 중 하나만 처리된다." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -711,7 +640,24 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ls: t.txt: No such file or directory\r\n" + ] + } + ], + "source": [ + "%ls t.txt" + ] + }, + { + "cell_type": "code", + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -719,8 +665,7 @@ "output_type": "stream", "text": [ "/Users/yhhan/git/python-e-learning/python3.6\n", - "1.0\n", - "Finally!!!\n" + "[Errno 2] No such file or directory: 't.txt'\n" ] } ], @@ -749,15 +694,50 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "/Users/yhhan/git/python-e-learning\n", - "1.0\n", + "a.txt\r\n" + ] + } + ], + "source": [ + "%ls a.txt" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0" + ] + } + ], + "source": [ + "%cat a.txt" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yhhan/git/python-e-learning/python3.6\n", + "[Errno 2] No such file or directory: 't.txt'\n", + "float division by zero\n", "Finally!!!\n" ] } @@ -767,7 +747,7 @@ "import os\n", "print(os.getcwd())\n", "filename = 't.txt'\n", - "\n", + "default_filename = 'a.txt'\n", "try:\n", " f = open(filename, 'r')\n", "except IOError as e:\n", @@ -797,7 +777,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -895,7 +875,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -913,8 +893,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mend\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 첨자 범위가 넘었다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m \u001b[0;31m# 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mend\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 첨자 범위가 넘었다\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, k)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIndexError\u001b[0m \u001b[0;31m# 첨자 범위를 벗어나면 IndexError 예외를 발생시킴\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mIndexError\u001b[0m: " ] } @@ -1032,30 +1012,6 @@ " print(e)" ] }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "message!!!\n" - ] - } - ], - "source": [ - "#python2.x\n", - "def f():\n", - " raise Exception, 'message!!!'\n", - " \n", - "try:\n", - " f()\n", - "except Exception, a:\n", - " print a" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1141,7 +1097,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.8" } }, "nbformat": 4, From c4fcaee52cbc4118363b0a4d0716e6311ef4794c Mon Sep 17 00:00:00 2001 From: Youn-Hee Han Date: Mon, 9 Dec 2019 17:45:38 +0900 Subject: [PATCH 124/124] ... --- python3.6/python23.ipynb | 2 +- python3.6/python24.ipynb | 110 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 python3.6/python24.ipynb diff --git a/python3.6/python23.ipynb b/python3.6/python23.ipynb index ed67c82..6314dd2 100644 --- a/python3.6/python23.ipynb +++ b/python3.6/python23.ipynb @@ -1097,7 +1097,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/python3.6/python24.ipynb b/python3.6/python24.ipynb new file mode 100644 index 0000000..e92d155 --- /dev/null +++ b/python3.6/python24.ipynb @@ -0,0 +1,110 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 비동기 파이썬" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 동기적으로 5개 사이트의 소스 가져오기 " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from time import time\n", + "import requests\n", + "\n", + "urls = [\"https://www.naver.com\", \"http://www.google.com\", \"https://www.nytimes.com\", \"https://www.mlb.com\", \"https://www.kakaocorp.com\"]\n", + "\n", + "begin = time()\n", + "result = []\n", + "for url in urls:\n", + " response = requests.get(url)\n", + " page = response.text\n", + " result.append(\"{0} Bytes\".format(len(page)))\n", + "\n", + "print(result)\n", + "end = time()\n", + "print('실행 시간: {0:.3f}초'.format(end - begin))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 비동기적으로 5개 사이트의 소스 가져오기 " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from time import time\n", + "import requests\n", + "import asyncio\n", + "\n", + "urls = [\"https://www.naver.com\", \"http://www.google.com\", \"https://www.nytimes.com\", \"https://www.mlb.com\", \"https://www.kakaocorp.com\"]\n", + "\n", + "\n", + "async def fetch(url):\n", + " response = await loop.run_in_executor(None, requests.get, url) # run_in_executor 사용\n", + " page = response.text\n", + " return \"{0} Bytes\".format(len(page))\n", + "\n", + "\n", + "async def main():\n", + " futures = [asyncio.ensure_future(fetch(url)) for url in urls]\n", + " # 태스크(퓨처) 객체를 리스트로 만듦\n", + " result = await asyncio.gather(*futures) # 결과를 한꺼번에 가져옴\n", + " print(result)\n", + "\n", + "\n", + "begin = time()\n", + "loop = asyncio.get_event_loop() # 이벤트 루프를 얻음\n", + "loop.run_until_complete(main()) # main이 끝날 때까지 기다림\n", + "loop.close() # 이벤트 루프를 닫음\n", + "end = time()\n", + "print('실행 시간: {0:.3f}초'.format(end - begin))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}

버전

메소드(Method)

연산자(Operator)

인스턴스 o에 대한 사용 예

\\_\\_add\\_\\_(self, B)

Python2.x/3.x

\\_\\_add\\_\\_(self, B)

+ (이항)

o + B, o += B

\\_\\_sub\\_\\_(self, B)

Python2.x/3.x

\\_\\_sub\\_\\_(self, B)

- (이항)

o - B, o -= B

\\_\\_mul\\_\\_(self, B)

Python2.x/3.x

\\_\\_mul\\_\\_(self, B)

\\*

o \\* B, o \\*= B

\\_\\_div\\_\\_(self, B)

Python2.x

\\_\\_div\\_\\_(self, B)

/

o / B, o /= B

Python3.x

\\_\\_truediv\\_\\_(self, B)

/

o / B, o /= B

\\_\\_floordiv\\_\\_(self, B)

Python2.x

\\_\\_rdiv\\_\\_(self, B)

/

B / o

Python3.x

\\_\\_rtruediv\\_\\_(self, B)

/

B / o

Python2.x/3.x

\\_\\_floordiv\\_\\_(self, B)

//

o // B, o //= B

\\_\\_mod\\_\\_(self, B)

Python2.x/3.x

\\_\\_mod\\_\\_(self, B)

%

o % B, o %= B

Python2.x/3.x

\\_\\_divmod\\_\\_(self, B)

divmod()

divmod(o, B)

\\_\\_pow\\_\\_(self, B)

Python2.x/3.x

\\_\\_pow\\_\\_(self, B)

pow(), \\*\\*

pow(o, B), o \\*\\* B

\\_\\_lshift\\_\\_(self, B)

Python2.x/3.x

\\_\\_lshift\\_\\_(self, B)

<<

o << B, o <<= B

\\_\\_rshift\\_\\_(self, B)

Python2.x/3.x

\\_\\_rshift\\_\\_(self, B)

>>

o >> B, o >>= B

\\_\\_and\\_\\_(self, B)

Python2.x/3.x

\\_\\_and\\_\\_(self, B)

&

o & B, o &= B

\\_\\_xor\\_\\_(self, B)

Python2.x/3.x

\\_\\_xor\\_\\_(self, B)

^

o ^ B, o ^= B

\\_\\_or\\_\\_(self, B) 

Python2.x/3.x

\\_\\_or\\_\\_(self, B) 

|

o | B, o |= B

\\_\\_neg\\_\\_(self)

Python2.x/3.x

\\_\\_neg\\_\\_(self)

- (단항)

-A

\\_\\_abs\\_\\_(self)

Python2.x/3.x

\\_\\_abs\\_\\_(self)

abs()

abs(o)

\\_\\_pos\\_\\_(self)

Python2.x/3.x

\\_\\_pos\\_\\_(self)

+ (단항)

+o

\\_\\_invert\\_\\_(self)

Python2.x/3.x

\\_\\_invert\\_\\_(self)

~

~o

Python2.x/3.x

\\_\\_add\\_\\_(self, B)

__add__(self, B)

+ (이항)

o + B, o += B

Python2.x/3.x

\\_\\_sub\\_\\_(self, B)

__sub__(self, B)

- (이항)

o - B, o -= B

Python2.x/3.x

\\_\\_mul\\_\\_(self, B)

\\*

o \\* B, o \\*= B

__mul__(self, B)

*

o * B, o *= B

Python2.x

\\_\\_div\\_\\_(self, B)

__div__(self, B)

/

o / B, o /= B

Python3.x

\\_\\_truediv\\_\\_(self, B)

__truediv__(self, B)

/

o / B, o /= B

Python2.x

\\_\\_rdiv\\_\\_(self, B)

__rdiv__(self, B)

/

B / o

Python3.x

\\_\\_rtruediv\\_\\_(self, B)

__rtruediv__(self, B)

/

B / o

Python2.x/3.x

\\_\\_floordiv\\_\\_(self, B)

__floordiv__(self, B)

//

o // B, o //= B

Python2.x/3.x

\\_\\_mod\\_\\_(self, B)

__mod__(self, B)

%

o % B, o %= B

Python2.x/3.x

\\_\\_divmod\\_\\_(self, B)

__divmod__(self, B)

divmod()

divmod(o, B)

Python2.x/3.x

\\_\\_pow\\_\\_(self, B)

pow(), \\*\\*

pow(o, B), o \\*\\* B

__pow__(self, B)

pow(), **

pow(o, B), o ** B

Python2.x/3.x

\\_\\_lshift\\_\\_(self, B)

__lshift__(self, B)

<<

o << B, o <<= B

Python2.x/3.x

\\_\\_rshift\\_\\_(self, B)

__rshift__(self, B)

>>

o >> B, o >>= B

Python2.x/3.x

\\_\\_and\\_\\_(self, B)

__and__(self, B)

&

o & B, o &= B

Python2.x/3.x

\\_\\_xor\\_\\_(self, B)

__xor__(self, B)

^

o ^ B, o ^= B

Python2.x/3.x

\\_\\_or\\_\\_(self, B) 

__or__(self, B) 

|

o | B, o |= B

Python2.x/3.x

\\_\\_neg\\_\\_(self)

__neg__(self)

- (단항)

-A

Python2.x/3.x

\\_\\_abs\\_\\_(self)

__abs__(self)

abs()

abs(o)

Python2.x/3.x

\\_\\_pos\\_\\_(self)

__pos__(self)

+ (단항)

+o

Python2.x/3.x

\\_\\_invert\\_\\_(self)

__invert__(self)

~

~o