diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f68566f --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.swp +.python-version +.ipynb_checkpoints +.idea +.iml +__pycache__ diff --git a/000/ch_000.ipynb b/000/ch_000.ipynb new file mode 100644 index 0000000..c831095 --- /dev/null +++ b/000/ch_000.ipynb @@ -0,0 +1,67 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "test\n" + ] + } + ], + "source": [ + "print('test')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Hello world" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "julia R" + ] + } + ], + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/001/ch_001.ipynb b/001/ch_001.ipynb new file mode 100644 index 0000000..386e5eb --- /dev/null +++ b/001/ch_001.ipynb @@ -0,0 +1,1977 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python基础语法" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## hello world" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello world\n" + ] + } + ], + "source": [ + "print('hello world')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "单独出现的字面常量无意义" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'abc'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "3\n", + "'abc'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "强类型" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "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[0;36m1\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: unsupported operand type(s) for +: 'int' and 'str'" + ] + } + ], + "source": [ + "1 + 'abc'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "动态语言" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = 1" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "int" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "str" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = 'abc'\n", + "type(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "原始类型" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "int float byte" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "复合类型" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "由其他原始类型组合起来的类型" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "list dict" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 算术运算符" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = 10\n", + "b = 20" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "30" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a + b" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "-10" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a - b" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "200" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a * b" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.5" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a / b" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "10" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a % b" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "100000000000000000000" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a ** b" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a // b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 位运算符" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'0b111100'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bin(60)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'0b1101'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bin(13)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "a = 0011 1100\n", + "\n", + "b = 0000 1101" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = 60\n", + "b = 13" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "12" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a & b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "0011 1100\n", + "\n", + "0000 1101\n", + "\n", + "\n", + "0000 1100" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "12" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "int('1100', 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "61" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a | b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "0011 1100\n", + "\n", + "0000 1101\n", + "\n", + "0011 1101" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "bin() takes exactly one argument (2 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[0mbin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'111101'\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: bin() takes exactly one argument (2 given)" + ] + } + ], + "source": [ + "bin('111101', 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "61" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "int('111101', 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "49" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a ^ b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "0011 1100\n", + "\n", + "0000 1101\n", + "\n", + "0011 0001" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "49" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "int('110001', 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "-61" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "~a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "0011 1100\n", + "\n", + "1100 0011" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "195" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "int('11000011',2)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "67" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "int('1000011', 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 比较运算符" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = 10\n", + "b = 20" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a == b" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a != b" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a < b" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a > b" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a <= b" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a >= b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 逻辑运算符" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = True\n", + "b = False" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a and b" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a or b" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "not a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* 逻辑运算符的短路功能" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 2\n" + ] + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def add(x, y):\n", + " print(\"%d + %d\" % (x, y))\n", + " return x+y\n", + "\n", + "add(1, 2) > 4 and add(2, 3) == 5" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 + 3\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(2, 3) == 5 or add(1, 2) > 4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 其他运算符" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = b" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`is` vs `==`" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1000 == 1000" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1000 is 1000" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[1, 2, 3] == [1, 2, 3]" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[1, 2, 3] is [1, 2, 3]" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4505415432" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id([1, 2, 3])" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4505415944" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id([1, 2, 3])" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4504861488" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id(1000)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4504861648" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id(1000)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false + }, + "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 is None\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "is None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "表达式" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a and (1+2) < 3 " + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = 4" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a if a > 0 else 0" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a\n", + "b\n" + ] + } + ], + "source": [ + "if True:\n", + " print('a')\n", + " print('b')" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "if False:\n", + " print('flase')" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = -4" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "if a > 0:\n", + " a = 5\n", + "else:\n", + " a = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a > 0\n" + ] + } + ], + "source": [ + "a = 4\n", + "if a > 5:\n", + " print('a > 5')\n", + "elif a > 0:\n", + " print('a > 0')\n", + "else:\n", + " print('a < 0')" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a > 0\n" + ] + } + ], + "source": [ + "a = 4\n", + "if a > 5:\n", + " print('a > 5')\n", + "else:\n", + " if a > 0:\n", + " print('a > 0')\n", + " else:\n", + " print('a < 0')" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "3\n", + "2\n", + "1\n" + ] + } + ], + "source": [ + "a = 4\n", + "while a > 0:\n", + " print(a)\n", + " a -= 1" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n", + "4\n" + ] + } + ], + "source": [ + "li = [1, 2, 3, 4]\n", + "for i in li:\n", + " print(i)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "range(0, 10)" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "range(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "r = range(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'range' 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[0mr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'range' object is not an iterator" + ] + } + ], + "source": [ + "next(r)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "iter(r)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(range(10))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 6, 7, 8, 9]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(range(5, 10))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 2, 4, 6, 8]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(range(0, 10, 2))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n" + ] + } + ], + "source": [ + "for x in range(10):\n", + " print(x)\n", + " if x > 5:\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "\t 0\n", + "\t 1\n", + "\t 2\n", + "\t 3\n", + "1\n", + "\t 0\n", + "\t 1\n", + "\t 2\n", + "\t 3\n", + "2\n", + "\t 0\n", + "\t 1\n", + "\t 2\n", + "\t 3\n" + ] + } + ], + "source": [ + "for x in range(3):\n", + " print(x)\n", + " for i in range(5):\n", + " print('\\t %d' % i)\n", + " if i > 2:\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----\n", + "----\n", + "1\n", + "----\n", + "----\n", + "3\n", + "----\n", + "----\n", + "5\n", + "----\n", + "----\n", + "7\n", + "----\n", + "----\n", + "9\n" + ] + } + ], + "source": [ + "for x in range(10):\n", + " print('----')\n", + " if x % 2 == 0:\n", + " continue\n", + " print(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n" + ] + } + ], + "source": [ + "for x in range(10):\n", + " if x > 1:\n", + " break\n", + " print(x)\n", + "else:\n", + " print('###')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ok\n" + ] + } + ], + "source": [ + "for x in range(0, 10, 2):\n", + " if x % 2 != 0:\n", + " break\n", + "else:\n", + " print('ok')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "is_ok = True\n", + "for x in range(0, 10, 2):\n", + " if x % 2 != 0:\n", + " is_ok = False\n", + " break\n", + "\n", + "if is_ok:\n", + " print('ok')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/002/ch_002.ipynb b/002/ch_002.ipynb new file mode 100644 index 0000000..7e104bd --- /dev/null +++ b/002/ch_002.ipynb @@ -0,0 +1,3488 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 内置容器" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* 定义列表" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li = []\n", + "li = list()\n", + "li = [1, 2, 3]" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on class list in module builtins:\n", + "\n", + "class list(object)\n", + " | list() -> new empty list\n", + " | list(iterable) -> new list initialized from iterable's items\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __add__(self, value, /)\n", + " | Return self+value.\n", + " | \n", + " | __contains__(self, key, /)\n", + " | Return key in self.\n", + " | \n", + " | __delitem__(self, key, /)\n", + " | Delete self[key].\n", + " | \n", + " | __eq__(self, value, /)\n", + " | Return self==value.\n", + " | \n", + " | __ge__(self, value, /)\n", + " | Return self>=value.\n", + " | \n", + " | __getattribute__(self, name, /)\n", + " | Return getattr(self, name).\n", + " | \n", + " | __getitem__(...)\n", + " | x.__getitem__(y) <==> x[y]\n", + " | \n", + " | __gt__(self, value, /)\n", + " | Return self>value.\n", + " | \n", + " | __iadd__(self, value, /)\n", + " | Implement self+=value.\n", + " | \n", + " | __imul__(self, value, /)\n", + " | Implement self*=value.\n", + " | \n", + " | __init__(self, /, *args, **kwargs)\n", + " | Initialize self. See help(type(self)) for accurate signature.\n", + " | \n", + " | __iter__(self, /)\n", + " | Implement iter(self).\n", + " | \n", + " | __le__(self, value, /)\n", + " | Return self<=value.\n", + " | \n", + " | __len__(self, /)\n", + " | Return len(self).\n", + " | \n", + " | __lt__(self, value, /)\n", + " | Return self None -- append object to end\n", + " | \n", + " | clear(...)\n", + " | L.clear() -> None -- remove all items from L\n", + " | \n", + " | copy(...)\n", + " | L.copy() -> list -- a shallow copy of L\n", + " | \n", + " | count(...)\n", + " | L.count(value) -> integer -- return number of occurrences of value\n", + " | \n", + " | extend(...)\n", + " | L.extend(iterable) -> None -- extend list by appending elements from the iterable\n", + " | \n", + " | index(...)\n", + " | L.index(value, [start, [stop]]) -> integer -- return first index of value.\n", + " | Raises ValueError if the value is not present.\n", + " | \n", + " | insert(...)\n", + " | L.insert(index, object) -- insert object before index\n", + " | \n", + " | pop(...)\n", + " | L.pop([index]) -> item -- remove and return item at index (default last).\n", + " | Raises IndexError if list is empty or index is out of range.\n", + " | \n", + " | remove(...)\n", + " | L.remove(value) -> None -- remove first occurrence of value.\n", + " | Raises ValueError if the value is not present.\n", + " | \n", + " | reverse(...)\n", + " | L.reverse() -- reverse *IN PLACE*\n", + " | \n", + " | sort(...)\n", + " | L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data and other attributes defined here:\n", + " | \n", + " | __hash__ = None\n", + "\n" + ] + } + ], + "source": [ + "help(list)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function append:\n", + "\n", + "append(...) method of builtins.list instance\n", + " L.append(object) -> None -- append object to end\n", + "\n" + ] + } + ], + "source": [ + "help(li.append)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.append(4)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "append() takes exactly one argument (3 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[0mli\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\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;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: append() takes exactly one argument (3 given)" + ] + } + ], + "source": [ + "li.append(5, 6, 7)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function extend:\n", + "\n", + "extend(...) method of builtins.list instance\n", + " L.extend(iterable) -> None -- extend list by appending elements from the iterable\n", + "\n" + ] + } + ], + "source": [ + "help(li.extend)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.extend([5, 6, 7])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4, 5, 6, 7]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function insert:\n", + "\n", + "insert(...) method of builtins.list instance\n", + " L.insert(index, object) -- insert object before index\n", + "\n" + ] + } + ], + "source": [ + "help(li.insert)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.insert(0, 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 3, 4, 5, 6, 7]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function remove:\n", + "\n", + "remove(...) method of builtins.list instance\n", + " L.remove(value) -> None -- remove first occurrence of value.\n", + " Raises ValueError if the value is not present.\n", + "\n" + ] + } + ], + "source": [ + "help(li.remove)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.remove(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 4, 5, 6, 7]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.extend([3, 3, 3])" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 4, 5, 6, 7, 3, 3, 3]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.remove(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 4, 5, 6, 7, 3, 3]" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "ValueError", + "evalue": "list.remove(x): x not in list", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\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[0mli\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mValueError\u001b[0m: list.remove(x): x not in list" + ] + } + ], + "source": [ + "li.remove(8)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function pop:\n", + "\n", + "pop(...) method of builtins.list instance\n", + " L.pop([index]) -> item -- remove and return item at index (default last).\n", + " Raises IndexError if list is empty or index is out of range.\n", + "\n" + ] + } + ], + "source": [ + "help(li.pop)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 4, 5, 6, 7, 3, 3]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li.pop()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 4, 5, 6, 7, 3]" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li.pop(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 5, 6, 7, 3]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "IndexError", + "evalue": "pop index out of range", + "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[0mli\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m7\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m: pop index out of range" + ] + } + ], + "source": [ + "li.pop(7)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "IndexError", + "evalue": "pop from empty list", + "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[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\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: pop from empty list" + ] + } + ], + "source": [ + "[].pop()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function clear:\n", + "\n", + "clear(...) method of builtins.list instance\n", + " L.clear() -> None -- remove all items from L\n", + "\n" + ] + } + ], + "source": [ + "help(li.clear)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 5, 6, 7, 3]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.clear()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.extend(range(5))" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.extend(range(3, 8))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 3, 4, 3, 4, 5, 6, 7]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function reverse:\n", + "\n", + "reverse(...) method of builtins.list instance\n", + " L.reverse() -- reverse *IN PLACE*\n", + "\n" + ] + } + ], + "source": [ + "help(li.reverse)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.reverse()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[7, 6, 5, 4, 3, 4, 3, 2, 1, 0]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function sort:\n", + "\n", + "sort(...) method of builtins.list instance\n", + " L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*\n", + "\n" + ] + } + ], + "source": [ + "help(li.sort)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.sort()" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 3, 3, 4, 4, 5, 6, 7]" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li.sort(reverse=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[7, 6, 5, 4, 4, 3, 3, 2, 1, 0]" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function count:\n", + "\n", + "count(...) method of builtins.list instance\n", + " L.count(value) -> integer -- return number of occurrences of value\n", + "\n" + ] + } + ], + "source": [ + "help(li.count)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li.count(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li.count(6)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li.count(8)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function index:\n", + "\n", + "index(...) method of builtins.list instance\n", + " L.index(value, [start, [stop]]) -> integer -- return first index of value.\n", + " Raises ValueError if the value is not present.\n", + "\n" + ] + } + ], + "source": [ + "help(li.index)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li.index(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[7, 6, 5, 4, 4, 3, 3, 2, 1, 0]" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li.index(3, 6)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li.index(3, 6, 8)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "ValueError", + "evalue": "8 is not in list", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\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[0mli\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mValueError\u001b[0m: 8 is not in list" + ] + } + ], + "source": [ + "li.index(8)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[7, 6, 5, 4, 4, 3, 3, 2, 1, 0]" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "l2 = li.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "l3 = li" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[7, 6, 5, 4, 4, 3, 3, 2, 1, 0]" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l2" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[7, 6, 5, 4, 4, 3, 3, 2, 1, 0]" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l3 " + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4515406280" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id(li)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4526095240" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id(l2)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4515406280" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id(l3)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "l2.clear()" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l2" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[7, 6, 5, 4, 4, 3, 3, 2, 1, 0]" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l3.pop()" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[7, 6, 5, 4, 4, 3, 3, 2, 1]" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l3" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[7, 6, 5, 4, 4, 3, 3, 2, 1]" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "t = ()\n", + "t = tuple()\n", + "t = (1, 2, 3)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(1, 2, 3)" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": false + }, + "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[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;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" + ] + } + ], + "source": [ + "t[0] = 3" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[7, 6, 5, 4, 4, 3, 3, 2, 1]" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "7" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "li[0] = 10" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[10, 6, 5, 4, 4, 3, 3, 2, 1]" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[10, 6, 5, 4, 4, 3, 3, 2, 1]" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[4, 4]" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li[3:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[10, 6, 5, 4, 4]" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li[:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[4, 4, 3, 3, 2, 1]" + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li[3:]" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[10, 6, 5, 4, 4, 3, 3, 2, 1]" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li[:]" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[4, 3, 3]" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li[4:-2]" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[3, 3, 2]" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li[-4:-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 4]" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li[2:6:2]" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[10, 6, 5, 4, 4, 3, 3, 2, 1]" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[3, 3, 4, 4]" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li[6:2:-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 3, 4, 4, 5, 6, 10]" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li[::-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[10, 5, 4, 3, 1]" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "li[::2]" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x, y = (1, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "t = 1, 2" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(1, 2)" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "[2, 3, 4]\n" + ] + } + ], + "source": [ + "x, *y = (1, 2, 3, 4)\n", + "print(x)\n", + "print(y)" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "*x, y = (1, 2, 3, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3]" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x, *_, y = (1, 2, 3, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "4\n", + "5\n" + ] + } + ], + "source": [ + "x, *_, y, z = (1, 2, 3, 4, 5)\n", + "print(x)\n", + "print(y)\n", + "print(z)" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n" + ] + } + ], + "source": [ + "x, (y, z) = (1, (2, 3))\n", + "print(x)\n", + "print(y)\n", + "print(z)" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "1\n" + ] + } + ], + "source": [ + "x = 1\n", + "y = 2\n", + "x, y = y, x\n", + "print(x)\n", + "print(y)" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = set()\n", + "s = set({1, 2, 3})" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{1, 2, 3}" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = {1, 2, 3}" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = {}" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = {1, 2, 3}" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s.add(4)" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{1, 2, 3, 4}" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s.add(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{1, 2, 3, 4}" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s.update([3, 4, 5, 6])" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{1, 2, 3, 4, 5, 6}" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s.remove(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{2, 3, 4, 5, 6}" + ] + }, + "execution_count": 118, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function discard:\n", + "\n", + "discard(...) method of builtins.set instance\n", + " Remove an element from a set if it is a member.\n", + " \n", + " If the element is not a member, do nothing.\n", + "\n" + ] + } + ], + "source": [ + "help(s.discard)" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "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[0ms\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;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 10" + ] + } + ], + "source": [ + "s.remove(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s.discard(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{2, 3, 4, 5, 6}" + ] + }, + "execution_count": 122, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s.discard(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{2, 4, 5, 6}" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 125, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.pop()" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{4, 5, 6}" + ] + }, + "execution_count": 126, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s2 = {3, 4, 5}" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{3, 4, 5, 6}" + ] + }, + "execution_count": 128, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.union(s2)" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{4, 5}" + ] + }, + "execution_count": 129, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.intersection(s2)" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{6}" + ] + }, + "execution_count": 130, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.difference(s2)" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{3}" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s2.difference(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{3, 6}" + ] + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.symmetric_difference(s2)" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on set object:\n", + "\n", + "class set(object)\n", + " | set() -> new empty set object\n", + " | set(iterable) -> new set object\n", + " | \n", + " | Build an unordered collection of unique elements.\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __and__(self, value, /)\n", + " | Return self&value.\n", + " | \n", + " | __contains__(...)\n", + " | x.__contains__(y) <==> y in x.\n", + " | \n", + " | __eq__(self, value, /)\n", + " | Return self==value.\n", + " | \n", + " | __ge__(self, value, /)\n", + " | Return self>=value.\n", + " | \n", + " | __getattribute__(self, name, /)\n", + " | Return getattr(self, name).\n", + " | \n", + " | __gt__(self, value, /)\n", + " | Return self>value.\n", + " | \n", + " | __iand__(self, value, /)\n", + " | Return self&=value.\n", + " | \n", + " | __init__(self, /, *args, **kwargs)\n", + " | Initialize self. See help(type(self)) for accurate signature.\n", + " | \n", + " | __ior__(self, value, /)\n", + " | Return self|=value.\n", + " | \n", + " | __isub__(self, value, /)\n", + " | Return self-=value.\n", + " | \n", + " | __iter__(self, /)\n", + " | Implement iter(self).\n", + " | \n", + " | __ixor__(self, value, /)\n", + " | Return self^=value.\n", + " | \n", + " | __le__(self, value, /)\n", + " | Return self<=value.\n", + " | \n", + " | __len__(self, /)\n", + " | Return len(self).\n", + " | \n", + " | __lt__(self, value, /)\n", + " | Return self size of S in memory, in bytes\n", + " | \n", + " | __sub__(self, value, /)\n", + " | Return self-value.\n", + " | \n", + " | __xor__(self, value, /)\n", + " | Return self^value.\n", + " | \n", + " | add(...)\n", + " | Add an element to a set.\n", + " | \n", + " | This has no effect if the element is already present.\n", + " | \n", + " | clear(...)\n", + " | Remove all elements from this set.\n", + " | \n", + " | copy(...)\n", + " | Return a shallow copy of a set.\n", + " | \n", + " | difference(...)\n", + " | Return the difference of two or more sets as a new set.\n", + " | \n", + " | (i.e. all elements that are in this set but not the others.)\n", + " | \n", + " | difference_update(...)\n", + " | Remove all elements of another set from this set.\n", + " | \n", + " | discard(...)\n", + " | Remove an element from a set if it is a member.\n", + " | \n", + " | If the element is not a member, do nothing.\n", + " | \n", + " | intersection(...)\n", + " | Return the intersection of two sets as a new set.\n", + " | \n", + " | (i.e. all elements that are in both sets.)\n", + " | \n", + " | intersection_update(...)\n", + " | Update a set with the intersection of itself and another.\n", + " | \n", + " | isdisjoint(...)\n", + " | Return True if two sets have a null intersection.\n", + " | \n", + " | issubset(...)\n", + " | Report whether another set contains this set.\n", + " | \n", + " | issuperset(...)\n", + " | Report whether this set contains another set.\n", + " | \n", + " | pop(...)\n", + " | Remove and return an arbitrary set element.\n", + " | Raises KeyError if the set is empty.\n", + " | \n", + " | remove(...)\n", + " | Remove an element from a set; it must be a member.\n", + " | \n", + " | If the element is not a member, raise a KeyError.\n", + " | \n", + " | symmetric_difference(...)\n", + " | Return the symmetric difference of two sets as a new set.\n", + " | \n", + " | (i.e. all elements that are in exactly one of the sets.)\n", + " | \n", + " | symmetric_difference_update(...)\n", + " | Update a set with the symmetric difference of itself and another.\n", + " | \n", + " | union(...)\n", + " | Return the union of sets as a new set.\n", + " | \n", + " | (i.e. all elements that are in either set.)\n", + " | \n", + " | update(...)\n", + " | Update a set with the union of itself and others.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data and other attributes defined here:\n", + " | \n", + " | __hash__ = None\n", + "\n" + ] + } + ], + "source": [ + "help(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{4, 5, 6}" + ] + }, + "execution_count": 135, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 138, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.issubset({3, 5, 6})" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 140, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.issuperset({4, 5, 3})" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 141, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.isdisjoint({3, 4})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s.isdisjoint()" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d = {}" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d = dict()\n", + "d = {'a': 1, 'b':2}" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'a': 1, 'b': 2}" + ] + }, + "execution_count": 144, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 145, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d['a']" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d['a'] = 5" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'a': 5, 'b': 2}" + ] + }, + "execution_count": 147, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'c'", + "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[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'" + ] + } + ], + "source": [ + "d['c']" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['b', 'a'])" + ] + }, + "execution_count": 149, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "5\n" + ] + } + ], + "source": [ + "for key in d.keys():\n", + " print(d[key])" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_values([2, 5])" + ] + }, + "execution_count": 151, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.values()" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "5\n" + ] + } + ], + "source": [ + "for v in d.values():\n", + " print(v)" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_items([('b', 2), ('a', 5)])" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.items()" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b => 2\n", + "a => 5\n" + ] + } + ], + "source": [ + "for k, v in d.items():\n", + " print('%s => %s' % (k, v))" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "pop expected at least 1 arguments, got 0", + "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[0mpop\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: pop expected at least 1 arguments, got 0" + ] + } + ], + "source": [ + "d.pop()" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function pop:\n", + "\n", + "pop(...) method of builtins.dict instance\n", + " D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n", + " If key is not found, d is returned if given, otherwise KeyError is raised\n", + "\n" + ] + } + ], + "source": [ + "help(d.pop)" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 157, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.pop('a')" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'c'", + "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[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\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'" + ] + } + ], + "source": [ + "d.pop('c')" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 159, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.pop('c', 6)" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'b': 2}" + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d['c'] = 6" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'b': 2, 'c': 6}" + ] + }, + "execution_count": 162, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "('b', 2)" + ] + }, + "execution_count": 163, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.popitem()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d.popitem" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/002/dict.ipynb b/002/dict.ipynb new file mode 100644 index 0000000..42fe2e0 --- /dev/null +++ b/002/dict.ipynb @@ -0,0 +1,658 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 字典" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d = {}\n", + "d = dict()\n", + "d = {\"a\":1, \"b\":2}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 获取元素" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d['a']" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.get('a')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'c'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\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[0md\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'c'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m: 'c'" + ] + } + ], + "source": [ + "d['c']" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d.get('c')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function get:\n", + "\n", + "get(...) method of builtins.dict instance\n", + " D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.\n", + "\n" + ] + } + ], + "source": [ + "help(d.get)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'abc'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.get('c', 'abc')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 增加和修改元素" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d['a'] = 3" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'a': 3, 'b': 2}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d['c'] = 4" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'a': 3, 'b': 2, 'c': 4}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 删除元素" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.pop('c')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'a': 3, 'b': 2}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'c'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\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[0md\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'c'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m: 'c'" + ] + } + ], + "source": [ + "d.pop('c')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function pop:\n", + "\n", + "pop(...) method of builtins.dict instance\n", + " D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n", + " If key is not found, d is returned if given, otherwise KeyError is raised\n", + "\n" + ] + } + ], + "source": [ + "help(d.pop)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'abc'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.pop('c', 'abc')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "('b', 2)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.popitem()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "del d['a']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 遍历" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d = {'a': 1, 'b': 2, 'c': 3}" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['b', 'c', 'a'])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b\n", + "c\n", + "a\n" + ] + } + ], + "source": [ + "for k in d.keys():\n", + " print(k)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_values([2, 3, 1])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.values()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "3\n", + "1\n" + ] + } + ], + "source": [ + "for v in d.values():\n", + " print(v)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_items([('b', 2), ('c', 3), ('a', 1)])" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.items()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('b', 2)\n", + "('c', 3)\n", + "('a', 1)\n" + ] + } + ], + "source": [ + "for t in d.items():\n", + " print(t)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b => 2\n", + "c => 3\n", + "a => 1\n" + ] + } + ], + "source": [ + "for k, v in d.items():\n", + " print('{0} => {1}'.format(k, v))" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d = {}" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d['root'] = 'root'" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d['root'] = {}" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d['root']['left'] = 'left'\n", + "d['root']['right'] = 'right'" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'root': {'left': 'left', 'right': 'right'}}" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/002/\345\210\227\350\241\250\350\247\243\346\236\220.ipynb" "b/002/\345\210\227\350\241\250\350\247\243\346\236\220.ipynb" new file mode 100644 index 0000000..9ec56d0 --- /dev/null +++ "b/002/\345\210\227\350\241\250\350\247\243\346\236\220.ipynb" @@ -0,0 +1,578 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 列表解析" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lst = list(range(10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 基本语法" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[x +1 for x in lst]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l = []\n", + "for x in lst:\n", + " l.append(x+1)\n", + "l" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 带条件" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 3, 5, 7, 9]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[x+1 for x in lst if x % 2 == 0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 3, 5, 7, 9]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l = []\n", + "for x in lst:\n", + " if x % 2 == 0:\n", + " l.append(x+1)\n", + "l" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 7, 9]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[x + 1 for x in lst if x % 2 == 0 if x > 2]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 7, 9]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l = []\n", + "for x in lst:\n", + " if x % 2 == 0 \n", + " if x > 2:\n", + " l.append(x+1)\n", + "l" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 多个列表" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "l1 = [1, 3, 5, 7, 9]\n", + "l2 = [0, 2, 4, 6, 8]" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[(1, 0),\n", + " (1, 2),\n", + " (1, 4),\n", + " (1, 6),\n", + " (1, 8),\n", + " (3, 0),\n", + " (3, 2),\n", + " (3, 4),\n", + " (3, 6),\n", + " (3, 8),\n", + " (5, 0),\n", + " (5, 2),\n", + " (5, 4),\n", + " (5, 6),\n", + " (5, 8),\n", + " (7, 0),\n", + " (7, 2),\n", + " (7, 4),\n", + " (7, 6),\n", + " (7, 8),\n", + " (9, 0),\n", + " (9, 2),\n", + " (9, 4),\n", + " (9, 6),\n", + " (9, 8)]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[(x, y) for x in l1 for y in l2]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[(1, 0),\n", + " (1, 2),\n", + " (1, 4),\n", + " (1, 6),\n", + " (1, 8),\n", + " (3, 0),\n", + " (3, 2),\n", + " (3, 4),\n", + " (3, 6),\n", + " (3, 8),\n", + " (5, 0),\n", + " (5, 2),\n", + " (5, 4),\n", + " (5, 6),\n", + " (5, 8),\n", + " (7, 0),\n", + " (7, 2),\n", + " (7, 4),\n", + " (7, 6),\n", + " (7, 8),\n", + " (9, 0),\n", + " (9, 2),\n", + " (9, 4),\n", + " (9, 6),\n", + " (9, 8)]" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l = []\n", + "for x in l1:\n", + " for y in l2:\n", + " l.append((x, y))\n", + "l" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 生成集合" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = {1, 3, 5}" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{2, 4, 6}" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "{x +1 for x in s}" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[2, 4, 6]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[x+1 for x in s]" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "{x+1 for x in range(10)}" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{3}" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "{x+1 for x in [2, 2, 2, 2]}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 生成字典" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d = {'a':1, 'b': 2}" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'a': 1, 'b': 2}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "{k:v for k, v in d.items()}" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{1: 8, 3: 8, 5: 8, 7: 8, 9: 8}" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "{x: y for x in l1 for y in l2}" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'a': 1, 'b': 2}" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "{k:v for k, v in [('a', 1), ('b', 2)]}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/003/test.json b/003/test.json new file mode 100644 index 0000000..bf6d0b8 --- /dev/null +++ b/003/test.json @@ -0,0 +1,3 @@ +{ + "name": "comyn" +} diff --git "a/003/\345\255\227\347\254\246\344\270\262.ipynb" "b/003/\345\255\227\347\254\246\344\270\262.ipynb" new file mode 100644 index 0000000..09c5f3f --- /dev/null +++ "b/003/\345\255\227\347\254\246\344\270\262.ipynb" @@ -0,0 +1,2877 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 字符串与文本操作" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 字符串是一个线性结构" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = 'i love python'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'i'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'n'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s[-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'ove p'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s[3:8]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'nohtyp evol i'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s[::-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i\n", + " \n", + "l\n", + "o\n", + "v\n", + "e\n", + " \n", + "p\n", + "y\n", + "t\n", + "h\n", + "o\n", + "n\n" + ] + } + ], + "source": [ + "for c in s:\n", + " print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 字符串是不可变的" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "' '" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'str' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0ms\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'_'\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: 'str' object does not support item assignment" + ] + } + ], + "source": [ + "s[1] = '_'" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "t = (1, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'tuple' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0mt\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" + ] + } + ], + "source": [ + "t[0] = 3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 字符串的格式化" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### print style format" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'l love Python'" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'l love %s' % ('Python', )" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'I love Python'" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'I love %(name)s' % {'name': 'Python'}" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'I love Python, Python is my first lang'" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'I love %(name)s, %(name)s is my first lang' % {'name': 'Python'}" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'I love Python, Python is my first lang'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'I love %s, %s is my first lang' % ('Python', 'Python')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Conversion" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'4'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'%d' % 4" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "%d format: a number is required, not str", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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;34m'%d'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[1;34m'str'\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: %d format: a number is required, not str" + ] + } + ], + "source": [ + "'%d' % 'str'" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'3'" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'%d' % 3.4" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'1.000000E-09'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'%E' % 0.000000001" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'1.000000E+26'" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'%E' % 100000000000000000000000000" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'0.001'" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'%g' % 0.001" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'1e-10'" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'%g' % 0.0000000001" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### flags" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "' 1'" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'%10d' % 1" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'0000000001'" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'%010d' % 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### format方法" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'hello, world'" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'{0}, {name}'.format('hello', name='world')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 字符串的常用操作" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on class str in module builtins:\n", + "\n", + "class str(object)\n", + " | str(object='') -> str\n", + " | str(bytes_or_buffer[, encoding[, errors]]) -> str\n", + " | \n", + " | Create a new string object from the given object. If encoding or\n", + " | errors is specified, then the object must expose a data buffer\n", + " | that will be decoded using the given encoding and error handler.\n", + " | Otherwise, returns the result of object.__str__() (if defined)\n", + " | or repr(object).\n", + " | encoding defaults to sys.getdefaultencoding().\n", + " | errors defaults to 'strict'.\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __add__(self, value, /)\n", + " | Return self+value.\n", + " | \n", + " | __contains__(self, key, /)\n", + " | Return key in self.\n", + " | \n", + " | __eq__(self, value, /)\n", + " | Return self==value.\n", + " | \n", + " | __format__(...)\n", + " | S.__format__(format_spec) -> str\n", + " | \n", + " | Return a formatted version of S as described by format_spec.\n", + " | \n", + " | __ge__(self, value, /)\n", + " | Return self>=value.\n", + " | \n", + " | __getattribute__(self, name, /)\n", + " | Return getattr(self, name).\n", + " | \n", + " | __getitem__(self, key, /)\n", + " | Return self[key].\n", + " | \n", + " | __getnewargs__(...)\n", + " | \n", + " | __gt__(self, value, /)\n", + " | Return self>value.\n", + " | \n", + " | __hash__(self, /)\n", + " | Return hash(self).\n", + " | \n", + " | __iter__(self, /)\n", + " | Implement iter(self).\n", + " | \n", + " | __le__(self, value, /)\n", + " | Return self<=value.\n", + " | \n", + " | __len__(self, /)\n", + " | Return len(self).\n", + " | \n", + " | __lt__(self, value, /)\n", + " | Return self size of S in memory, in bytes\n", + " | \n", + " | __str__(self, /)\n", + " | Return str(self).\n", + " | \n", + " | capitalize(...)\n", + " | S.capitalize() -> str\n", + " | \n", + " | Return a capitalized version of S, i.e. make the first character\n", + " | have upper case and the rest lower case.\n", + " | \n", + " | casefold(...)\n", + " | S.casefold() -> str\n", + " | \n", + " | Return a version of S suitable for caseless comparisons.\n", + " | \n", + " | center(...)\n", + " | S.center(width[, fillchar]) -> str\n", + " | \n", + " | Return S centered in a string of length width. Padding is\n", + " | done using the specified fill character (default is a space)\n", + " | \n", + " | count(...)\n", + " | S.count(sub[, start[, end]]) -> int\n", + " | \n", + " | Return the number of non-overlapping occurrences of substring sub in\n", + " | string S[start:end]. Optional arguments start and end are\n", + " | interpreted as in slice notation.\n", + " | \n", + " | encode(...)\n", + " | S.encode(encoding='utf-8', errors='strict') -> bytes\n", + " | \n", + " | Encode S using the codec registered for encoding. Default encoding\n", + " | is 'utf-8'. errors may be given to set a different error\n", + " | handling scheme. Default is 'strict' meaning that encoding errors raise\n", + " | a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and\n", + " | 'xmlcharrefreplace' as well as any other name registered with\n", + " | codecs.register_error that can handle UnicodeEncodeErrors.\n", + " | \n", + " | endswith(...)\n", + " | S.endswith(suffix[, start[, end]]) -> bool\n", + " | \n", + " | Return True if S ends with the specified suffix, False otherwise.\n", + " | With optional start, test S beginning at that position.\n", + " | With optional end, stop comparing S at that position.\n", + " | suffix can also be a tuple of strings to try.\n", + " | \n", + " | expandtabs(...)\n", + " | S.expandtabs(tabsize=8) -> str\n", + " | \n", + " | Return a copy of S where all tab characters are expanded using spaces.\n", + " | If tabsize is not given, a tab size of 8 characters is assumed.\n", + " | \n", + " | find(...)\n", + " | S.find(sub[, start[, end]]) -> int\n", + " | \n", + " | Return the lowest index in S where substring sub is found,\n", + " | such that sub is contained within S[start:end]. Optional\n", + " | arguments start and end are interpreted as in slice notation.\n", + " | \n", + " | Return -1 on failure.\n", + " | \n", + " | format(...)\n", + " | S.format(*args, **kwargs) -> str\n", + " | \n", + " | Return a formatted version of S, using substitutions from args and kwargs.\n", + " | The substitutions are identified by braces ('{' and '}').\n", + " | \n", + " | format_map(...)\n", + " | S.format_map(mapping) -> str\n", + " | \n", + " | Return a formatted version of S, using substitutions from mapping.\n", + " | The substitutions are identified by braces ('{' and '}').\n", + " | \n", + " | index(...)\n", + " | S.index(sub[, start[, end]]) -> int\n", + " | \n", + " | Like S.find() but raise ValueError when the substring is not found.\n", + " | \n", + " | isalnum(...)\n", + " | S.isalnum() -> bool\n", + " | \n", + " | Return True if all characters in S are alphanumeric\n", + " | and there is at least one character in S, False otherwise.\n", + " | \n", + " | isalpha(...)\n", + " | S.isalpha() -> bool\n", + " | \n", + " | Return True if all characters in S are alphabetic\n", + " | and there is at least one character in S, False otherwise.\n", + " | \n", + " | isdecimal(...)\n", + " | S.isdecimal() -> bool\n", + " | \n", + " | Return True if there are only decimal characters in S,\n", + " | False otherwise.\n", + " | \n", + " | isdigit(...)\n", + " | S.isdigit() -> bool\n", + " | \n", + " | Return True if all characters in S are digits\n", + " | and there is at least one character in S, False otherwise.\n", + " | \n", + " | isidentifier(...)\n", + " | S.isidentifier() -> bool\n", + " | \n", + " | Return True if S is a valid identifier according\n", + " | to the language definition.\n", + " | \n", + " | Use keyword.iskeyword() to test for reserved identifiers\n", + " | such as \"def\" and \"class\".\n", + " | \n", + " | islower(...)\n", + " | S.islower() -> bool\n", + " | \n", + " | Return True if all cased characters in S are lowercase and there is\n", + " | at least one cased character in S, False otherwise.\n", + " | \n", + " | isnumeric(...)\n", + " | S.isnumeric() -> bool\n", + " | \n", + " | Return True if there are only numeric characters in S,\n", + " | False otherwise.\n", + " | \n", + " | isprintable(...)\n", + " | S.isprintable() -> bool\n", + " | \n", + " | Return True if all characters in S are considered\n", + " | printable in repr() or S is empty, False otherwise.\n", + " | \n", + " | isspace(...)\n", + " | S.isspace() -> bool\n", + " | \n", + " | Return True if all characters in S are whitespace\n", + " | and there is at least one character in S, False otherwise.\n", + " | \n", + " | istitle(...)\n", + " | S.istitle() -> bool\n", + " | \n", + " | Return True if S is a titlecased string and there is at least one\n", + " | character in S, i.e. upper- and titlecase characters may only\n", + " | follow uncased characters and lowercase characters only cased ones.\n", + " | Return False otherwise.\n", + " | \n", + " | isupper(...)\n", + " | S.isupper() -> bool\n", + " | \n", + " | Return True if all cased characters in S are uppercase and there is\n", + " | at least one cased character in S, False otherwise.\n", + " | \n", + " | join(...)\n", + " | S.join(iterable) -> str\n", + " | \n", + " | Return a string which is the concatenation of the strings in the\n", + " | iterable. The separator between elements is S.\n", + " | \n", + " | ljust(...)\n", + " | S.ljust(width[, fillchar]) -> str\n", + " | \n", + " | Return S left-justified in a Unicode string of length width. Padding is\n", + " | done using the specified fill character (default is a space).\n", + " | \n", + " | lower(...)\n", + " | S.lower() -> str\n", + " | \n", + " | Return a copy of the string S converted to lowercase.\n", + " | \n", + " | lstrip(...)\n", + " | S.lstrip([chars]) -> str\n", + " | \n", + " | Return a copy of the string S with leading whitespace removed.\n", + " | If chars is given and not None, remove characters in chars instead.\n", + " | \n", + " | partition(...)\n", + " | S.partition(sep) -> (head, sep, tail)\n", + " | \n", + " | Search for the separator sep in S, and return the part before it,\n", + " | the separator itself, and the part after it. If the separator is not\n", + " | found, return S and two empty strings.\n", + " | \n", + " | replace(...)\n", + " | S.replace(old, new[, count]) -> str\n", + " | \n", + " | Return a copy of S with all occurrences of substring\n", + " | old replaced by new. If the optional argument count is\n", + " | given, only the first count occurrences are replaced.\n", + " | \n", + " | rfind(...)\n", + " | S.rfind(sub[, start[, end]]) -> int\n", + " | \n", + " | Return the highest index in S where substring sub is found,\n", + " | such that sub is contained within S[start:end]. Optional\n", + " | arguments start and end are interpreted as in slice notation.\n", + " | \n", + " | Return -1 on failure.\n", + " | \n", + " | rindex(...)\n", + " | S.rindex(sub[, start[, end]]) -> int\n", + " | \n", + " | Like S.rfind() but raise ValueError when the substring is not found.\n", + " | \n", + " | rjust(...)\n", + " | S.rjust(width[, fillchar]) -> str\n", + " | \n", + " | Return S right-justified in a string of length width. Padding is\n", + " | done using the specified fill character (default is a space).\n", + " | \n", + " | rpartition(...)\n", + " | S.rpartition(sep) -> (head, sep, tail)\n", + " | \n", + " | Search for the separator sep in S, starting at the end of S, and return\n", + " | the part before it, the separator itself, and the part after it. If the\n", + " | separator is not found, return two empty strings and S.\n", + " | \n", + " | rsplit(...)\n", + " | S.rsplit(sep=None, maxsplit=-1) -> list of strings\n", + " | \n", + " | Return a list of the words in S, using sep as the\n", + " | delimiter string, starting at the end of the string and\n", + " | working to the front. If maxsplit is given, at most maxsplit\n", + " | splits are done. If sep is not specified, any whitespace string\n", + " | is a separator.\n", + " | \n", + " | rstrip(...)\n", + " | S.rstrip([chars]) -> str\n", + " | \n", + " | Return a copy of the string S with trailing whitespace removed.\n", + " | If chars is given and not None, remove characters in chars instead.\n", + " | \n", + " | split(...)\n", + " | S.split(sep=None, maxsplit=-1) -> list of strings\n", + " | \n", + " | Return a list of the words in S, using sep as the\n", + " | delimiter string. If maxsplit is given, at most maxsplit\n", + " | splits are done. If sep is not specified or is None, any\n", + " | whitespace string is a separator and empty strings are\n", + " | removed from the result.\n", + " | \n", + " | splitlines(...)\n", + " | S.splitlines([keepends]) -> list of strings\n", + " | \n", + " | Return a list of the lines in S, breaking at line boundaries.\n", + " | Line breaks are not included in the resulting list unless keepends\n", + " | is given and true.\n", + " | \n", + " | startswith(...)\n", + " | S.startswith(prefix[, start[, end]]) -> bool\n", + " | \n", + " | Return True if S starts with the specified prefix, False otherwise.\n", + " | With optional start, test S beginning at that position.\n", + " | With optional end, stop comparing S at that position.\n", + " | prefix can also be a tuple of strings to try.\n", + " | \n", + " | strip(...)\n", + " | S.strip([chars]) -> str\n", + " | \n", + " | Return a copy of the string S with leading and trailing\n", + " | whitespace removed.\n", + " | If chars is given and not None, remove characters in chars instead.\n", + " | \n", + " | swapcase(...)\n", + " | S.swapcase() -> str\n", + " | \n", + " | Return a copy of S with uppercase characters converted to lowercase\n", + " | and vice versa.\n", + " | \n", + " | title(...)\n", + " | S.title() -> str\n", + " | \n", + " | Return a titlecased version of S, i.e. words start with title case\n", + " | characters, all remaining cased characters have lower case.\n", + " | \n", + " | translate(...)\n", + " | S.translate(table) -> str\n", + " | \n", + " | Return a copy of the string S, where all characters have been mapped\n", + " | through the given translation table, which must be a mapping of\n", + " | Unicode ordinals to Unicode ordinals, strings, or None.\n", + " | Unmapped characters are left untouched. Characters mapped to None\n", + " | are deleted.\n", + " | \n", + " | upper(...)\n", + " | S.upper() -> str\n", + " | \n", + " | Return a copy of S converted to uppercase.\n", + " | \n", + " | zfill(...)\n", + " | S.zfill(width) -> str\n", + " | \n", + " | Pad a numeric string S with zeros on the left, to fill a field\n", + " | of the specified width. The string S is never truncated.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Static methods defined here:\n", + " | \n", + " | maketrans(x, y=None, z=None, /)\n", + " | Return a translation table usable for str.translate().\n", + " | \n", + " | If there is only one argument, it must be a dictionary mapping Unicode\n", + " | ordinals (integers) or characters to Unicode ordinals, strings or None.\n", + " | Character keys will be then converted to ordinals.\n", + " | If there are two arguments, they must be strings of equal length, and\n", + " | in the resulting dictionary, each character in x will be mapped to the\n", + " | character at the same position in y. If there is a third argument, it\n", + " | must be a string, whose characters will be mapped to None in the result.\n", + "\n" + ] + } + ], + "source": [ + "help(str)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'I love Python'" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lst = ['I', 'love', 'Python']\n", + "\n", + "' '.join(lst)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'I_love_Python'" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'_'.join(lst)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'I love Python '" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ret = ''\n", + "for s in lst:\n", + " ret += s\n", + " ret += ' '\n", + "ret" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on method_descriptor:\n", + "\n", + "split(...)\n", + " S.split(sep=None, maxsplit=-1) -> list of strings\n", + " \n", + " Return a list of the words in S, using sep as the\n", + " delimiter string. If maxsplit is given, at most maxsplit\n", + " splits are done. If sep is not specified or is None, any\n", + " whitespace string is a separator and empty strings are\n", + " removed from the result.\n", + "\n" + ] + } + ], + "source": [ + "help(str.split)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on method_descriptor:\n", + "\n", + "rsplit(...)\n", + " S.rsplit(sep=None, maxsplit=-1) -> list of strings\n", + " \n", + " Return a list of the words in S, using sep as the\n", + " delimiter string, starting at the end of the string and\n", + " working to the front. If maxsplit is given, at most maxsplit\n", + " splits are done. If sep is not specified, any whitespace string\n", + " is a separator.\n", + "\n" + ] + } + ], + "source": [ + "help(str.rsplit)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Python'" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = 'I love Python'" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['I', 'love', 'Python']" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.split()" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['I l', 've Pyth', 'n']" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.split('o')" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['I', 'love Python']" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.split(' ', 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = 'root:x:0:0:root:/root:/bin/bash'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['root', 'x:0:0:root:/root:/bin/bash']" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.split(':', 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "username, _ = s.split(':', 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'root'" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "username" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = 'URL:http://www.magedu.com'" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "key, value = s.split(':', 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "URL\n", + "http://www.magedu.com\n" + ] + } + ], + "source": [ + "print(key)\n", + "print(value)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['URL', 'http', '//www.magedu.com']" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.split(':')" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['URL', 'http', '//www.magedu.com']" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.rsplit(':')" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['URL:http', '//www.magedu.com']" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.rsplit(':', 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function splitlines:\n", + "\n", + "splitlines(...) method of builtins.str instance\n", + " S.splitlines([keepends]) -> list of strings\n", + " \n", + " Return a list of the lines in S, breaking at line boundaries.\n", + " Line breaks are not included in the resulting list unless keepends\n", + " is given and true.\n", + "\n" + ] + } + ], + "source": [ + "help(s.splitlines)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = '''\n", + "I love Python\n", + "I also love linux\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nI love Python\\nI also love linux\\n'" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['', 'I love Python', 'I also love linux']" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.splitlines()" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['\\n', 'I love Python\\n', 'I also love linux\\n']" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.splitlines(True)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['', 'I love Python', 'I also love linux']" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.splitlines(False)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function partition:\n", + "\n", + "partition(...) method of builtins.str instance\n", + " S.partition(sep) -> (head, sep, tail)\n", + " \n", + " Search for the separator sep in S, and return the part before it,\n", + " the separator itself, and the part after it. If the separator is not\n", + " found, return S and two empty strings.\n", + "\n" + ] + } + ], + "source": [ + "help(s.partition)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = 'root:x:0:0:root:/root:/bin/bash'" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'root:x:0:0:root:/root:/bin/bash'" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "('root', ':', 'x:0:0:root:/root:/bin/bash')" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.partition(':')" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "h, _, t = s.partition(':')" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'x:0:0:root:/root:/bin/bash'" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "h, _, t = t.partition(':')" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'0:0:root:/root:/bin/bash'" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'x:0:0:root:/root:/bin/bash'" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "('root:x:0:0:root:/root', ':', '/bin/bash')" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.rpartition(':')" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = 'I love Python'" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'I love python'" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.capitalize()" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = 'i love python'" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'I love python'" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.capitalize()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'I Love Python'" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.title()" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'I LOVE PYTHON'" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.upper()" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'i love python'" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.lower()" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = s.title()" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'I Love Python'" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'i lOVE pYTHON'" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.swapcase()" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function center:\n", + "\n", + "center(...) method of builtins.str instance\n", + " S.center(width[, fillchar]) -> str\n", + " \n", + " Return S centered in a string of length width. Padding is\n", + " done using the specified fill character (default is a space)\n", + "\n" + ] + } + ], + "source": [ + "help(s.center)" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = 'Python'" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "' Python '" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.center(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'*******Python*******'" + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.center(20, '*')" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function ljust:\n", + "\n", + "ljust(...) method of builtins.str instance\n", + " S.ljust(width[, fillchar]) -> str\n", + " \n", + " Return S left-justified in a Unicode string of length width. Padding is\n", + " done using the specified fill character (default is a space).\n", + "\n" + ] + } + ], + "source": [ + "help(s.ljust)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Python '" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.ljust(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Python**************'" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.ljust(20, '*')" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'**************Python'" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.rjust(20, '*')" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = s.center(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "' Python '" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Python'" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.strip()" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = 'abc\\n'" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'abc\\n'" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'abc'" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.strip()" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "f = open('/etc/passwd', 'r')" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'root:x:0:0:root:/root:/bin/bash\\n'" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.readline()" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'bin:x:1:1:bin:/bin:/sbin/nologin'" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.readline().strip()" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "f.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "f = open('/etc/passwd', 'r')" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/bin/bash\n" + ] + } + ], + "source": [ + "for line in f.readlines():\n", + " line = line.strip()\n", + " if line.startswith('root:'):\n", + " _, shell = line.rsplit(':', 1)\n", + " print(shell)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function startswith:\n", + "\n", + "startswith(...) method of builtins.str instance\n", + " S.startswith(prefix[, start[, end]]) -> bool\n", + " \n", + " Return True if S starts with the specified prefix, False otherwise.\n", + " With optional start, test S beginning at that position.\n", + " With optional end, stop comparing S at that position.\n", + " prefix can also be a tuple of strings to try.\n", + "\n" + ] + } + ], + "source": [ + "help(s.startswith)" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function endswith:\n", + "\n", + "endswith(...) method of builtins.str instance\n", + " S.endswith(suffix[, start[, end]]) -> bool\n", + " \n", + " Return True if S ends with the specified suffix, False otherwise.\n", + " With optional start, test S beginning at that position.\n", + " With optional end, stop comparing S at that position.\n", + " suffix can also be a tuple of strings to try.\n", + "\n" + ] + } + ], + "source": [ + "help(s.endswith)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'abc\\n'" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = 'root:x:0:0:root:/root:/bin/bash\\n'" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'root:x:0:0:root:/root:/bin/bash\\n'" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 102, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.count('r')" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.count('root')" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.index('r')" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "29" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.index('s')" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 106, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.index('root')" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "27" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.index('bash')" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function find:\n", + "\n", + "find(...) method of builtins.str instance\n", + " S.find(sub[, start[, end]]) -> int\n", + " \n", + " Return the lowest index in S where substring sub is found,\n", + " such that sub is contained within S[start:end]. Optional\n", + " arguments start and end are interpreted as in slice notation.\n", + " \n", + " Return -1 on failure.\n", + "\n" + ] + } + ], + "source": [ + "help(s.find)" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.find('root')" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 110, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.find('root', 3)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "-1" + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.find('comyn')" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "ValueError", + "evalue": "substring not found", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\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[0ms\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'comyn'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mValueError\u001b[0m: substring not found" + ] + } + ], + "source": [ + "s.index('comyn')" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function replace:\n", + "\n", + "replace(...) method of builtins.str instance\n", + " S.replace(old, new[, count]) -> str\n", + " \n", + " Return a copy of S with all occurrences of substring\n", + " old replaced by new. If the optional argument count is\n", + " given, only the first count occurrences are replaced.\n", + "\n" + ] + } + ], + "source": [ + "help(s.replace)" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'root:x:0:0:root:/root:/bin/bash\\n'" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'comyn:x:0:0:comyn:/comyn:/bin/bash\\n'" + ] + }, + "execution_count": 115, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.replace('root', 'comyn')" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'comyn:x:0:0:root:/root:/bin/bash\\n'" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.replace('root', 'comyn', 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'comyn:x:0:0:comyn:/comyn:/bin/bash\\n'" + ] + }, + "execution_count": 117, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.replace('root', 'comyn', -1)" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'comyn:x:0:0:comyn:/comyn:/bin/bash\\n'" + ] + }, + "execution_count": 118, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.replace('root', 'comyn', -2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/004/\345\207\275\346\225\260.ipynb" "b/004/\345\207\275\346\225\260.ipynb" new file mode 100644 index 0000000..62d042a --- /dev/null +++ "b/004/\345\207\275\346\225\260.ipynb" @@ -0,0 +1,2415 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 函数" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 函数的定义与调用" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 基本语法" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn():\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn():\n", + " print('execute fn')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "execute fn\n" + ] + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "execute fn\n" + ] + } + ], + "source": [ + "a = fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 函数参数" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def add(x, y):\n", + " return x + y" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(1, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x = 1\n", + "y = 2" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def swap(x, y):\n", + " x, y = y, x" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "swap(x, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lst = [1, 2, 3]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def append(item):\n", + " lst.append(item)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "append(4)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lst" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 位置参数和关键字参数" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "位置参数和关键字参数是在调用的时候决定的" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def add(x, y):\n", + " print(\"x = {0}\".format(x))\n", + " print(\"y = {0}\".format(y))\n", + " return x + y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* 位置参数 通过参数传递的位置来决定" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x = 1\n", + "y = 2\n" + ] + }, + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* 关键字参数 通过参数名称来决定" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x = 1\n", + "y = 2\n" + ] + }, + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(x=1, y=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x = 1\n", + "y = 2\n" + ] + }, + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(y=2, x=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* 混合使用 关键字参数必须在位置参数之后" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x = 1\n", + "y = 2\n" + ] + }, + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(1, y=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "non-keyword arg after keyword arg (, 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 add(x=1, 2)\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m non-keyword arg after keyword arg\n" + ] + } + ], + "source": [ + "add(x=1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 默认参数" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def inc(x, i=1):\n", + " return x + i" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inc(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "8" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inc(5, 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "当默认参赛和关键字参数一起使用的时候,世界都是美好的" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "non-default argument follows default 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 def inc(i=1, x):\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m non-default argument follows default argument\n" + ] + } + ], + "source": [ + "def inc(i=1, x):\n", + " return x + 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 可变参数" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sum(lst):\n", + " ret = 0\n", + " for x in lst:\n", + " ret += x\n", + " return ret" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "15" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum([1, 2, 3, 4, 5])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* 可变位置参数" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sum(*args):\n", + " ret = 0\n", + " print(args)\n", + " for x in args:\n", + " ret += x\n", + " return ret" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 2, 3, 4, 5)\n" + ] + }, + { + "data": { + "text/plain": [ + "15" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(1, 2, 3, 4, 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(5, 4, 3, 2, 1)\n" + ] + }, + { + "data": { + "text/plain": [ + "15" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(5, 4, 3, 2, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* 可变关键字参数" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def print_info(**kwargs):\n", + " for k, v in kwargs.items():\n", + " print('{0} => {1}'.format(k, v))" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a => 1\n", + "b => 2\n" + ] + } + ], + "source": [ + "print_info(a=1, b=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "print_info() takes 0 positional arguments but 3 were given", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0mprint_info\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: print_info() takes 0 positional arguments but 3 were given" + ] + } + ], + "source": [ + "print_info(1, 2, 3)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "sum() got an unexpected keyword argument 'a'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0msum\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: sum() got an unexpected keyword argument 'a'" + ] + } + ], + "source": [ + "sum(a=1, b=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "可变参数函数在定义的时候,就决定了参数是位置参数还是关键字参数" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def print_info(*args, **kwargs):\n", + " for x in args:\n", + " print(x)\n", + " for k, v in kwargs.items():\n", + " print('{0} => {1}'.format(k, v))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n", + "a => 4\n", + "b => 5\n" + ] + } + ], + "source": [ + "print_info(1, 2, 3, a=4, b=5)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def print_info(x, y, *args, **kwargs):\n", + " print('x = {0}'.format(x))\n", + " print('y = {0}'.format(y))\n", + " for x in args:\n", + " print(x)\n", + " for k, v in kwargs.items():\n", + " print('{0} => {1}'.format(k, v))" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x = 1\n", + "y = 2\n", + "4\n", + "5\n", + "6\n", + "a => 7\n", + "b => 8\n" + ] + } + ], + "source": [ + "print_info(1, 2, 4, 5, 6, a=7, b=8)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def print_info(*args, x, y, **kwargs):\n", + " print('x = {0}'.format(x))\n", + " print('y = {0}'.format(y))\n", + " for x in args:\n", + " print(x)\n", + " for k, v in kwargs.items():\n", + " print('{0} => {1}'.format(k, v))" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "print_info() missing 2 required keyword-only arguments: 'x' and 'y'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0mprint_info\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m4\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m5\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m6\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0ma\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: print_info() missing 2 required keyword-only arguments: 'x' and 'y'" + ] + } + ], + "source": [ + "print_info(1, 2, 4, 5, 6, a=7, b=8)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x = 5\n", + "y = 6\n", + "1\n", + "2\n", + "3\n", + "4\n", + "a => 7\n", + "b => 8\n" + ] + } + ], + "source": [ + "print_info(1,2 , 3, 4, x=5, y=6, a=7, b=8)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, 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 def print_info(*args, **kwargs, x, y):\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "def print_info(*args, **kwargs, x, y):\n", + " print('x = {0}'.format(x))\n", + " print('y = {0}'.format(y))\n", + " for x in args:\n", + " print(x)\n", + " for k, v in kwargs.items():\n", + " print('{0} => {1}'.format(k, v))" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def print_info( x, y=0, *args, **kwargs):\n", + " print('x = {0}'.format(x))\n", + " print('y = {0}'.format(y))\n", + " for x in args:\n", + " print(x)\n", + " for k, v in kwargs.items():\n", + " print('{0} => {1}'.format(k, v))" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x = 1\n", + "y = 2\n", + "4\n", + "5\n", + "6\n", + "a => 7\n", + "b => 8\n" + ] + } + ], + "source": [ + "print_info(1, 2, 4, 5, 6, a=7, b=8)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x = 1\n", + "y = 0\n", + "a => 7\n", + "b => 8\n" + ] + } + ], + "source": [ + "print_info(1, a=7, b=8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* 非默认非可变参数, 可变位置参数,可变关键字参数\n", + "* 默认参数不要和可变参数放到一起" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 参数解包" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def add(x, y):\n", + " print('x is {0}'.format(x))\n", + " print('y is {0}'.format(y))\n", + " return x + y" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lst = [1, 2]" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x is 1\n", + "y is 2\n" + ] + }, + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(lst[0], lst[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x is 1\n", + "y is 2\n" + ] + }, + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(*lst)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "d = {'x': 1, 'y': 2}" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x is 1\n", + "y is 2\n" + ] + }, + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(**d)" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "add() takes 2 positional arguments but 4 were given", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0madd\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m4\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: add() takes 2 positional arguments but 4 were given" + ] + } + ], + "source": [ + "add(*[1, 2, 3, 4])" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "add() got an unexpected keyword argument 'z'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0madd\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;34m'x'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'y'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'z'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: add() got an unexpected keyword argument 'z'" + ] + } + ], + "source": [ + "add(**{'x': 1, 'y':2, 'z':3})" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "add() missing 1 required positional argument: 'y'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0madd\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;34m'x'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: add() missing 1 required positional argument: 'y'" + ] + } + ], + "source": [ + "add(**{'x':1})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 默认参数的坑" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn(lst=[]):\n", + " lst.append(1)\n", + " print(lst)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1]\n" + ] + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 1]\n" + ] + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 1, 1]\n" + ] + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 1, 1, 1]\n" + ] + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn(lst = None):\n", + " if lst is None:\n", + " lst = []\n", + " lst.append(1)\n", + " print(lst)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1]\n" + ] + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1]\n" + ] + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1]\n" + ] + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 函数返回值" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn():\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "NoneType" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(fn())" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn():\n", + " return;" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "NoneType" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(fn())" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn():\n", + " return 4" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn():\n", + " return 3, 4, 5" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(3, 4, 5)" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn():\n", + " for x in range(10):\n", + " print(x)\n", + " if x > 5:\n", + " return" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n" + ] + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 第归函数" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "x!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1 * 2 * 3 * 4 ...* x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "x * (x-1)!" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn(x):\n", + " if x == 1:\n", + " return x\n", + " return fn(x - 1) * x" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "120" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fn(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "120" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1 * 2 * 3 * 4 * 5" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fn(100)" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "67526802209645841583879061361800814224269427869589384312198268703685091643180416969132446952698303794226010370578672908593198347699886928591906501031587651846976759681112609524787093848004428636186893395272784450630354080243217646658024696659065951793757223520229235577548653833681102170973893746054649126415909143150172860721156685810655759230011450132992176454983227538696340112610447029002337004887877266387704586077293585433151612518800147764461182680822867092786694982831838641800997499819339206579415325649748486265233918911087114592440896594062675914294925816719862178374679272092637524786939036290035924271782253738059886933923447877769583003016705363339031413069155837518524761078342052635475632113169618774549275701480106933362990003732589370593557325299434734459295866728988740794174654391479926000848846686708729736713207285203712732201272410830836913052635365082888725171636081587151603468291106754640398232146673627370895934090777828827549554232436190464827998683927179246029919443251026464452337939599198528297828591122689960620361238248313158071643395848405047261412680039877733761849874447323867911712630023171745968278465780558568067035013885275080292137360491875164947724464221693533755035300065350065137490832039523382963747026185653050331832380991844842560750923543775188582096487476950254418365198999674684417286265442786651594404781622946901879166382930714196908227460133027605817864877377712193142137625430353718448269390732615776645283198828602917680224041088993892610506802195917247838900106910698057030379190571057605849323113308634452008179881165616449767648354161225066967961297609698742737923389391615207441152319392845687673311899247085327703421862972871644495409572259985563215471482083325653231777113271326579970310755604973969708949477374254974480294652427022436705380184064008853457214518515270985563195412993145274057688634448812449445800617631162768243125606424844709372022149908463572254912654907763445758543980999149122998104378965626781898655221443263601405152073199706585080288735040205417371277253096243200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fn(900)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "RuntimeError", + "evalue": "maximum recursion depth exceeded", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mRuntimeError\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[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mfn\u001b[1;34m(x)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m \u001b[1;33m-\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "... last 1 frames repeated, from the frame below ...\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mfn\u001b[1;34m(x)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m \u001b[1;33m-\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mRuntimeError\u001b[0m: maximum recursion depth exceeded" + ] + } + ], + "source": [ + "fn(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn(x):\n", + " ret = 1\n", + " for i in range(1, x +1):\n", + " ret *= i\n", + " return ret" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "120" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fn(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 作用域与全局变量" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'xx' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mxx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m6\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mxx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mNameError\u001b[0m: name 'xx' is not defined" + ] + } + ], + "source": [ + "def fn():\n", + " xx = 6\n", + "\n", + "print(xx)" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "xx = 6\n", + "def fn():\n", + " print(xx)" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n" + ] + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "6\n" + ] + } + ], + "source": [ + "def fn():\n", + " xx = 3\n", + " print(xx)\n", + "fn()\n", + "print(xx)" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8978880\n", + "8978784\n", + "3\n", + "6\n" + ] + } + ], + "source": [ + "xx= 6\n", + "print(id(xx))\n", + "def fn():\n", + " xx = 3\n", + " print(id(xx))\n", + " print(xx)\n", + "fn()\n", + "print(xx)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "3\n" + ] + } + ], + "source": [ + "xx = 6\n", + "def fn():\n", + " global xx\n", + " xx = 3\n", + " print(xx)\n", + "fn()\n", + "print(xx)" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'_i80': 'def fn():\\n pass', '_24': 3, '_i71': 'fn()', '_i2': 'fn()', '_i31': 'inc(5, 3)', 'inc': , '_i90': 'def fn(x):\\n return fn(x - 1) * x', '_i15': 'def append(item):\\n lst.append(item)\\n ', '__spec__': None, '_i99': 'fn(5)', '_i93': 'fn(5)', '_65': 3, '_i81': 'type(fn())', '_i33': 'def sum(lst):\\n ret = 0\\n for x in lst:\\n ret += x\\n return ret', '_i7': 'def add(x, y):\\n return x + y', '_i17': 'lst', '_i88': 'def fn():\\n for x in range(10):\\n print(x)\\n if x > 5:\\n return', '_i104': 'def fn():\\n xx += 3\\n print(xx)\\nfn()\\nprint(xx)', '_i109': 'xx= 6\\ndef fn():\\n print(id(xx))\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', '_i98': 'def fn(x):\\n ret = 1\\n for i in range(1, x +1):\\n ret *= i\\n return ret', '_i12': 'x', '_i75': 'fn()', 'x': 1, '_i10': 'def swap(x, y):\\n x, y = y, x', 'fn': , '_i28': 'def inc(x, i=1):\\n return x + i', '_i82': 'def fn():\\n return;', '_i77': 'fn()', '_i112': 'xx = 6\\ndef fn():\\n x = 5\\n print(globals())\\n print(locals())\\n\\nfn()', '_i105': 'def fn():\\n xx = 3\\n print(xx)\\nfn()\\nprint(xx)', 'lst': [1, 2], '_i106': 'def fn():\\n print(id(xx))\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', 'Out': {65: 3, 81: , 8: 3, 87: (3, 4, 5), 12: 1, 13: 2, 17: [1, 2, 3, 4], 19: 3, 20: 3, 21: 3, 23: 3, 24: 3, 25: 3, 26: 3, 29: 6, 94: 120, 31: 8, 97: 67526802209645841583879061361800814224269427869589384312198268703685091643180416969132446952698303794226010370578672908593198347699886928591906501031587651846976759681112609524787093848004428636186893395272784450630354080243217646658024696659065951793757223520229235577548653833681102170973893746054649126415909143150172860721156685810655759230011450132992176454983227538696340112610447029002337004887877266387704586077293585433151612518800147764461182680822867092786694982831838641800997499819339206579415325649748486265233918911087114592440896594062675914294925816719862178374679272092637524786939036290035924271782253738059886933923447877769583003016705363339031413069155837518524761078342052635475632113169618774549275701480106933362990003732589370593557325299434734459295866728988740794174654391479926000848846686708729736713207285203712732201272410830836913052635365082888725171636081587151603468291106754640398232146673627370895934090777828827549554232436190464827998683927179246029919443251026464452337939599198528297828591122689960620361238248313158071643395848405047261412680039877733761849874447323867911712630023171745968278465780558568067035013885275080292137360491875164947724464221693533755035300065350065137490832039523382963747026185653050331832380991844842560750923543775188582096487476950254418365198999674684417286265442786651594404781622946901879166382930714196908227460133027605817864877377712193142137625430353718448269390732615776645283198828602917680224041088993892610506802195917247838900106910698057030379190571057605849323113308634452008179881165616449767648354161225066967961297609698742737923389391615207441152319392845687673311899247085327703421862972871644495409572259985563215471482083325653231777113271326579970310755604973969708949477374254974480294652427022436705380184064008853457214518515270985563195412993145274057688634448812449445800617631162768243125606424844709372022149908463572254912654907763445758543980999149122998104378965626781898655221443263601405152073199706585080288735040205417371277253096243200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 34: 15, 99: 120, 36: 15, 38: 15, 39: 15, 93: 120, 83: , 85: 4, 95: 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000, 62: 3, 63: 3}, '_i87': 'fn()', '_13': 2, '_i92': 'def fn(x):\\n if x == 1:\\n return x\\n return fn(x - 1) * x', '_i84': 'def fn():\\n return 4', '_i100': 'def fn():\\n x = 6\\n\\nprint(x)', 'In': ['', 'def fn():\\n pass', 'fn()', \"def fn():\\n print('execute fn')\", 'fn()', 'a = fn()', 'a', 'def add(x, y):\\n return x + y', 'add(1, 2)', 'x = 1\\ny = 2', 'def swap(x, y):\\n x, y = y, x', 'swap(x, y)', 'x', 'y', 'lst = [1, 2, 3]', 'def append(item):\\n lst.append(item)\\n ', 'append(4)', 'lst', 'def add(x, y):\\n return x + y', 'add(1, 2)', 'add(x=1, y=2)', 'add(y=2, x=1)', 'def add(x, y):\\n print(\"x = {0}\".format(x))\\n print(\"y = {0}\".format(y))\\n return x + y', 'add(1, 2)', 'add(x=1, y=2)', 'add(y=2, x=1)', 'add(1, y=2)', 'add(x=1, 2)', 'def inc(x, i=1):\\n return x + i', 'inc(5)', 'def inc(5, 3)', 'inc(5, 3)', 'def inc(i=1, x):\\n return x + 1', 'def sum(lst):\\n ret = 0\\n for x in lst:\\n ret += x\\n return ret', 'sum([1, 2, 3, 4, 5])', 'def sum(*args):\\n ret = 0\\n for x in args:\\n ret += x\\n return ret', 'sum(1, 2, 3, 4, 5)', 'def sum(*args):\\n ret = 0\\n print(args)\\n for x in args:\\n ret += x\\n return ret', 'sum(1, 2, 3, 4, 5)', 'sum(5, 4, 3, 2, 1)', \"def print_info(**kwargs):\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, w))\", 'print_info(a=1, b=2)', \"def print_info(**kwargs):\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(a=1, b=2)', '* 可变关键字参数', 'print_info(1, 2, 3)', 'sum(a=1, b=2)', \"def print_info(*args, **kwargs):\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(1, 2, 3, a=4, b=5)', \"def print_info(x, y, *args, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {1}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(1, 2, 4, 5, 6, a=7, b=8)', \"def print_info(x, y, *args, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(1, 2, 4, 5, 6, a=7, b=8)', \"def print_info(*args, x, y, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(1, 2, 4, 5, 6, a=7, b=8)', 'print_info(1,2 , 3, 4, x=5, y=6, a=7, b=8)', \"def print_info(*args, **kwargs, x, y):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", \"def print_info( x, y=0, *args, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(1, 2, 4, 5, 6, a=7, b=8)', 'print_info(1, a=7, b=8)', \"def add(x, y):\\n print('x is {0}'.format(x))\\n print('y is {0}'.format(y))\\n return x + y\", 'lst = [1, 2]', 'add(lst[0], lst[1])', 'add(*lst)', \"d = {'x': 1, 'y': 2}\", 'add(**d)', 'add(*[1, 2, 3, 4])', \"add(**{'x': 1, 'y':2, 'z':3})\", \"add(**{'x':1})\", 'def fn(lst=[]):\\n lst.append(1)\\n print(lst)', 'fn()', 'fn()', 'fn()', 'fn()', 'def fn(lst = None):\\n if lst is None:\\n lst = []\\n lst.append(a)\\n print(lst)', 'fn()', 'def fn(lst = None):\\n if lst is None:\\n lst = []\\n lst.append(1)\\n print(lst)', 'fn()', 'fn()', 'fn()', 'def fn():\\n pass', 'type(fn())', 'def fn():\\n return;', 'type(fn())', 'def fn():\\n return 4', 'fn()', 'def fn():\\n return 3, 4, 5', 'fn()', 'def fn():\\n for x in range(10):\\n print(x)\\n if x > 5:\\n return', 'fn()', 'def fn(x):\\n return fn(x - 1) * x', 'fn(5)', 'def fn(x):\\n if x == 1:\\n return x\\n return fn(x - 1) * x', 'fn(5)', '1 * 2 * 3 * 4 * 5', 'fn(100)', 'fn(1000)', 'fn(900)', 'def fn(x):\\n ret = 1\\n for i in range(1, x +1):\\n ret *= i\\n return ret', 'fn(5)', 'def fn():\\n x = 6\\n\\nprint(x)', 'def fn():\\n xx = 6\\n\\nprint(xx)', 'xx = 6\\ndef fn():\\n print(xx)', 'fn()', 'def fn():\\n xx += 3\\n print(xx)\\nfn()\\nprint(xx)', 'def fn():\\n xx = 3\\n print(xx)\\nfn()\\nprint(xx)', 'def fn():\\n print(id(xx))\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', 'xx= 6\\ndef fn():\\n print(id(xx))\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', 'xx= 6\\ndef fn():\\n print(id(xx))\\n #xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', 'xx= 6\\ndef fn():\\n print(id(xx))\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', 'xx= 6\\nprint(id(xx))\\ndef fn():\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', 'xx = 6\\ndef fn():\\n global xx\\n xx = 3\\n print(xx)\\nfn()\\nprint(xx)', 'xx = 6\\ndef fn():\\n x = 5\\n print(globals())\\n print(locals())\\n\\nfn()'], '__doc__': 'Automatically created module for IPython interactive environment', '_i57': \"def print_info( x, y=0, *args, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", '_19': 3, '_i69': 'def fn(lst=[]):\\n lst.append(1)\\n print(lst)', '_i21': 'add(y=2, x=1)', 'add': , '_97': 67526802209645841583879061361800814224269427869589384312198268703685091643180416969132446952698303794226010370578672908593198347699886928591906501031587651846976759681112609524787093848004428636186893395272784450630354080243217646658024696659065951793757223520229235577548653833681102170973893746054649126415909143150172860721156685810655759230011450132992176454983227538696340112610447029002337004887877266387704586077293585433151612518800147764461182680822867092786694982831838641800997499819339206579415325649748486265233918911087114592440896594062675914294925816719862178374679272092637524786939036290035924271782253738059886933923447877769583003016705363339031413069155837518524761078342052635475632113169618774549275701480106933362990003732589370593557325299434734459295866728988740794174654391479926000848846686708729736713207285203712732201272410830836913052635365082888725171636081587151603468291106754640398232146673627370895934090777828827549554232436190464827998683927179246029919443251026464452337939599198528297828591122689960620361238248313158071643395848405047261412680039877733761849874447323867911712630023171745968278465780558568067035013885275080292137360491875164947724464221693533755035300065350065137490832039523382963747026185653050331832380991844842560750923543775188582096487476950254418365198999674684417286265442786651594404781622946901879166382930714196908227460133027605817864877377712193142137625430353718448269390732615776645283198828602917680224041088993892610506802195917247838900106910698057030379190571057605849323113308634452008179881165616449767648354161225066967961297609698742737923389391615207441152319392845687673311899247085327703421862972871644495409572259985563215471482083325653231777113271326579970310755604973969708949477374254974480294652427022436705380184064008853457214518515270985563195412993145274057688634448812449445800617631162768243125606424844709372022149908463572254912654907763445758543980999149122998104378965626781898655221443263601405152073199706585080288735040205417371277253096243200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, '_31': 8, '_63': 3, '_i101': 'def fn():\\n xx = 6\\n\\nprint(xx)', '_i46': 'sum(a=1, b=2)', '_i37': 'def sum(*args):\\n ret = 0\\n print(args)\\n for x in args:\\n ret += x\\n return ret', 'sum': , '_oh': {65: 3, 81: , 8: 3, 87: (3, 4, 5), 12: 1, 13: 2, 17: [1, 2, 3, 4], 19: 3, 20: 3, 21: 3, 23: 3, 24: 3, 25: 3, 26: 3, 29: 6, 94: 120, 31: 8, 97: 67526802209645841583879061361800814224269427869589384312198268703685091643180416969132446952698303794226010370578672908593198347699886928591906501031587651846976759681112609524787093848004428636186893395272784450630354080243217646658024696659065951793757223520229235577548653833681102170973893746054649126415909143150172860721156685810655759230011450132992176454983227538696340112610447029002337004887877266387704586077293585433151612518800147764461182680822867092786694982831838641800997499819339206579415325649748486265233918911087114592440896594062675914294925816719862178374679272092637524786939036290035924271782253738059886933923447877769583003016705363339031413069155837518524761078342052635475632113169618774549275701480106933362990003732589370593557325299434734459295866728988740794174654391479926000848846686708729736713207285203712732201272410830836913052635365082888725171636081587151603468291106754640398232146673627370895934090777828827549554232436190464827998683927179246029919443251026464452337939599198528297828591122689960620361238248313158071643395848405047261412680039877733761849874447323867911712630023171745968278465780558568067035013885275080292137360491875164947724464221693533755035300065350065137490832039523382963747026185653050331832380991844842560750923543775188582096487476950254418365198999674684417286265442786651594404781622946901879166382930714196908227460133027605817864877377712193142137625430353718448269390732615776645283198828602917680224041088993892610506802195917247838900106910698057030379190571057605849323113308634452008179881165616449767648354161225066967961297609698742737923389391615207441152319392845687673311899247085327703421862972871644495409572259985563215471482083325653231777113271326579970310755604973969708949477374254974480294652427022436705380184064008853457214518515270985563195412993145274057688634448812449445800617631162768243125606424844709372022149908463572254912654907763445758543980999149122998104378965626781898655221443263601405152073199706585080288735040205417371277253096243200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 34: 15, 99: 120, 36: 15, 38: 15, 39: 15, 93: 120, 83: , 85: 4, 95: 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000, 62: 3, 63: 3}, '_i22': 'def add(x, y):\\n print(\"x = {0}\".format(x))\\n print(\"y = {0}\".format(y))\\n return x + y', '_i35': 'def sum(*args):\\n ret = 0\\n for x in args:\\n ret += x\\n return ret', '_i56': \"def print_info(*args, **kwargs, x, y):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", '_i30': 'def inc(5, 3)', '__loader__': None, '_i43': 'print_info(a=1, b=2)', '_i96': 'fn(1000)', '_29': 6, '_i38': 'sum(1, 2, 3, 4, 5)', '_ii': 'xx= 6\\nprint(id(xx))\\ndef fn():\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', '_i44': '* 可变关键字参数', 'y': 2, '_i86': 'def fn():\\n return 3, 4, 5', '_i34': 'sum([1, 2, 3, 4, 5])', '_12': 1, 'xx': 6, '_i25': 'add(y=2, x=1)', '_i29': 'inc(5)', 'append': , '_i26': 'add(1, y=2)', '_i16': 'append(4)', '_i62': 'add(lst[0], lst[1])', '_i95': 'fn(100)', '_i32': 'def inc(i=1, x):\\n return x + 1', 'quit': , '_i5': 'a = fn()', 'swap': , '_i74': 'def fn(lst = None):\\n if lst is None:\\n lst = []\\n lst.append(a)\\n print(lst)', '_i47': \"def print_info(*args, **kwargs):\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", '_i108': 'xx= 6\\ndef fn():\\n print(id(xx))\\n #xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', '_i78': 'fn()', '_i68': \"add(**{'x':1})\", '_i27': 'add(x=1, 2)', '_62': 3, '_i79': 'fn()', '_i110': 'xx= 6\\nprint(id(xx))\\ndef fn():\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', '_i4': 'fn()', '_95': 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000, '_34': 15, '_i3': \"def fn():\\n print('execute fn')\", '_26': 3, '_8': 3, '_i11': 'swap(x, y)', '_i45': 'print_info(1, 2, 3)', '_i6': 'a', '_i36': 'sum(1, 2, 3, 4, 5)', '_i102': 'xx = 6\\ndef fn():\\n print(xx)', '_i70': 'fn()', '_ih': ['', 'def fn():\\n pass', 'fn()', \"def fn():\\n print('execute fn')\", 'fn()', 'a = fn()', 'a', 'def add(x, y):\\n return x + y', 'add(1, 2)', 'x = 1\\ny = 2', 'def swap(x, y):\\n x, y = y, x', 'swap(x, y)', 'x', 'y', 'lst = [1, 2, 3]', 'def append(item):\\n lst.append(item)\\n ', 'append(4)', 'lst', 'def add(x, y):\\n return x + y', 'add(1, 2)', 'add(x=1, y=2)', 'add(y=2, x=1)', 'def add(x, y):\\n print(\"x = {0}\".format(x))\\n print(\"y = {0}\".format(y))\\n return x + y', 'add(1, 2)', 'add(x=1, y=2)', 'add(y=2, x=1)', 'add(1, y=2)', 'add(x=1, 2)', 'def inc(x, i=1):\\n return x + i', 'inc(5)', 'def inc(5, 3)', 'inc(5, 3)', 'def inc(i=1, x):\\n return x + 1', 'def sum(lst):\\n ret = 0\\n for x in lst:\\n ret += x\\n return ret', 'sum([1, 2, 3, 4, 5])', 'def sum(*args):\\n ret = 0\\n for x in args:\\n ret += x\\n return ret', 'sum(1, 2, 3, 4, 5)', 'def sum(*args):\\n ret = 0\\n print(args)\\n for x in args:\\n ret += x\\n return ret', 'sum(1, 2, 3, 4, 5)', 'sum(5, 4, 3, 2, 1)', \"def print_info(**kwargs):\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, w))\", 'print_info(a=1, b=2)', \"def print_info(**kwargs):\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(a=1, b=2)', '* 可变关键字参数', 'print_info(1, 2, 3)', 'sum(a=1, b=2)', \"def print_info(*args, **kwargs):\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(1, 2, 3, a=4, b=5)', \"def print_info(x, y, *args, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {1}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(1, 2, 4, 5, 6, a=7, b=8)', \"def print_info(x, y, *args, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(1, 2, 4, 5, 6, a=7, b=8)', \"def print_info(*args, x, y, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(1, 2, 4, 5, 6, a=7, b=8)', 'print_info(1,2 , 3, 4, x=5, y=6, a=7, b=8)', \"def print_info(*args, **kwargs, x, y):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", \"def print_info( x, y=0, *args, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'print_info(1, 2, 4, 5, 6, a=7, b=8)', 'print_info(1, a=7, b=8)', \"def add(x, y):\\n print('x is {0}'.format(x))\\n print('y is {0}'.format(y))\\n return x + y\", 'lst = [1, 2]', 'add(lst[0], lst[1])', 'add(*lst)', \"d = {'x': 1, 'y': 2}\", 'add(**d)', 'add(*[1, 2, 3, 4])', \"add(**{'x': 1, 'y':2, 'z':3})\", \"add(**{'x':1})\", 'def fn(lst=[]):\\n lst.append(1)\\n print(lst)', 'fn()', 'fn()', 'fn()', 'fn()', 'def fn(lst = None):\\n if lst is None:\\n lst = []\\n lst.append(a)\\n print(lst)', 'fn()', 'def fn(lst = None):\\n if lst is None:\\n lst = []\\n lst.append(1)\\n print(lst)', 'fn()', 'fn()', 'fn()', 'def fn():\\n pass', 'type(fn())', 'def fn():\\n return;', 'type(fn())', 'def fn():\\n return 4', 'fn()', 'def fn():\\n return 3, 4, 5', 'fn()', 'def fn():\\n for x in range(10):\\n print(x)\\n if x > 5:\\n return', 'fn()', 'def fn(x):\\n return fn(x - 1) * x', 'fn(5)', 'def fn(x):\\n if x == 1:\\n return x\\n return fn(x - 1) * x', 'fn(5)', '1 * 2 * 3 * 4 * 5', 'fn(100)', 'fn(1000)', 'fn(900)', 'def fn(x):\\n ret = 1\\n for i in range(1, x +1):\\n ret *= i\\n return ret', 'fn(5)', 'def fn():\\n x = 6\\n\\nprint(x)', 'def fn():\\n xx = 6\\n\\nprint(xx)', 'xx = 6\\ndef fn():\\n print(xx)', 'fn()', 'def fn():\\n xx += 3\\n print(xx)\\nfn()\\nprint(xx)', 'def fn():\\n xx = 3\\n print(xx)\\nfn()\\nprint(xx)', 'def fn():\\n print(id(xx))\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', 'xx= 6\\ndef fn():\\n print(id(xx))\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', 'xx= 6\\ndef fn():\\n print(id(xx))\\n #xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', 'xx= 6\\ndef fn():\\n print(id(xx))\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', 'xx= 6\\nprint(id(xx))\\ndef fn():\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', 'xx = 6\\ndef fn():\\n global xx\\n xx = 3\\n print(xx)\\nfn()\\nprint(xx)', 'xx = 6\\ndef fn():\\n x = 5\\n print(globals())\\n print(locals())\\n\\nfn()'], '_i8': 'add(1, 2)', '_i48': 'print_info(1, 2, 3, a=4, b=5)', '_i55': 'print_info(1,2 , 3, 4, x=5, y=6, a=7, b=8)', '_i59': 'print_info(1, a=7, b=8)', '_20': 3, '_i85': 'fn()', '_i1': 'def fn():\\n pass', '_i67': \"add(**{'x': 1, 'y':2, 'z':3})\", '___': 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000, '_85': 4, '_25': 3, '_21': 3, '_i97': 'fn(900)', '_i64': \"d = {'x': 1, 'y': 2}\", '_i': 'xx = 6\\ndef fn():\\n global xx\\n xx = 3\\n print(xx)\\nfn()\\nprint(xx)', '_i103': 'fn()', '__builtin__': , '__builtins__': , '_39': 15, '__name__': '__main__', '_i61': 'lst = [1, 2]', '_17': [1, 2, 3, 4], '_i50': 'print_info(1, 2, 4, 5, 6, a=7, b=8)', '_93': 120, '_': 120, '_i19': 'add(1, 2)', '_i39': 'sum(5, 4, 3, 2, 1)', '_36': 15, '_i52': 'print_info(1, 2, 4, 5, 6, a=7, b=8)', '_i24': 'add(x=1, y=2)', '_iii': 'xx= 6\\ndef fn():\\n print(id(xx))\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', '_i66': 'add(*[1, 2, 3, 4])', '_i89': 'fn()', '_99': 120, '_87': (3, 4, 5), '__package__': None, '_i54': 'print_info(1, 2, 4, 5, 6, a=7, b=8)', '_i42': \"def print_info(**kwargs):\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", '_94': 120, '_i73': 'fn()', '_i14': 'lst = [1, 2, 3]', '_i76': 'def fn(lst = None):\\n if lst is None:\\n lst = []\\n lst.append(1)\\n print(lst)', '_i107': 'xx= 6\\ndef fn():\\n print(id(xx))\\n xx = 3\\n print(id(xx))\\n print(xx)\\nfn()\\nprint(xx)', '_i91': 'fn(5)', '_i13': 'y', '_i41': 'print_info(a=1, b=2)', '_i58': 'print_info(1, 2, 4, 5, 6, a=7, b=8)', 'get_ipython': >, '_i65': 'add(**d)', '_i40': \"def print_info(**kwargs):\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, w))\", '_81': , '_i49': \"def print_info(x, y, *args, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {1}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", '_23': 3, 'a': None, '_i72': 'fn()', '_i20': 'add(x=1, y=2)', '_i83': 'type(fn())', '_sh': , '__': 67526802209645841583879061361800814224269427869589384312198268703685091643180416969132446952698303794226010370578672908593198347699886928591906501031587651846976759681112609524787093848004428636186893395272784450630354080243217646658024696659065951793757223520229235577548653833681102170973893746054649126415909143150172860721156685810655759230011450132992176454983227538696340112610447029002337004887877266387704586077293585433151612518800147764461182680822867092786694982831838641800997499819339206579415325649748486265233918911087114592440896594062675914294925816719862178374679272092637524786939036290035924271782253738059886933923447877769583003016705363339031413069155837518524761078342052635475632113169618774549275701480106933362990003732589370593557325299434734459295866728988740794174654391479926000848846686708729736713207285203712732201272410830836913052635365082888725171636081587151603468291106754640398232146673627370895934090777828827549554232436190464827998683927179246029919443251026464452337939599198528297828591122689960620361238248313158071643395848405047261412680039877733761849874447323867911712630023171745968278465780558568067035013885275080292137360491875164947724464221693533755035300065350065137490832039523382963747026185653050331832380991844842560750923543775188582096487476950254418365198999674684417286265442786651594404781622946901879166382930714196908227460133027605817864877377712193142137625430353718448269390732615776645283198828602917680224041088993892610506802195917247838900106910698057030379190571057605849323113308634452008179881165616449767648354161225066967961297609698742737923389391615207441152319392845687673311899247085327703421862972871644495409572259985563215471482083325653231777113271326579970310755604973969708949477374254974480294652427022436705380184064008853457214518515270985563195412993145274057688634448812449445800617631162768243125606424844709372022149908463572254912654907763445758543980999149122998104378965626781898655221443263601405152073199706585080288735040205417371277253096243200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, '_i23': 'add(1, 2)', 'exit': , '_dh': ['/home/comyn/magedu/python/2016/004'], '_i51': \"def print_info(x, y, *args, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", '_i94': '1 * 2 * 3 * 4 * 5', '_38': 15, 'print_info': , '_i18': 'def add(x, y):\\n return x + y', '_i111': 'xx = 6\\ndef fn():\\n global xx\\n xx = 3\\n print(xx)\\nfn()\\nprint(xx)', '_i60': \"def add(x, y):\\n print('x is {0}'.format(x))\\n print('y is {0}'.format(y))\\n return x + y\", '_83': , '_i53': \"def print_info(*args, x, y, **kwargs):\\n print('x = {0}'.format(x))\\n print('y = {0}'.format(y))\\n for x in args:\\n print(x)\\n for k, v in kwargs.items():\\n print('{0} => {1}'.format(k, v))\", 'd': {'y': 2, 'x': 1}, '_i63': 'add(*lst)', '_i9': 'x = 1\\ny = 2'}\n", + "{'x': 5}\n" + ] + } + ], + "source": [ + "xx = 6\n", + "def fn():\n", + " x = 5\n", + " print(globals())\n", + " print(locals())\n", + "\n", + "fn()" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn():\n", + " x = 5\n", + " print(locals())" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'x': 5}\n" + ] + } + ], + "source": [ + "fn()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 函数的调用过程" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def add(x, y):\n", + " return x + y\n", + "\n", + "def inc(x):\n", + " return x+1\n", + "\n", + "def main():\n", + " x = 1\n", + " y = 2\n", + " ret = add(x, y)\n", + " ret = inc(ret)\n", + " print(ret)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def add(x, y):\n", + " return x + y\n", + "\n", + "def inc(x):\n", + " return add(x, 1)\n", + "\n", + "def main():\n", + " x = 5\n", + " inc(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 生成器" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 3, 4]" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def iterator(x):\n", + " return list(range(x))\n", + "\n", + "iterator(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def iterator(x):\n", + " i = 0;\n", + " while i < 5:\n", + " yield i\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 118, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "iterator(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def main():\n", + " for i in iterator(5):\n", + " print(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def iterrator():\n", + " lst = [1, 2, 3, 4, 5]\n", + " yield from lst" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n", + "4\n", + "5\n" + ] + } + ], + "source": [ + "for x in iterrator():\n", + " print(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn(x):\n", + " ret = 1\n", + " for i in range(1, x+1):\n", + " ret *= i\n", + " yield ret\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "6\n", + "24\n", + "120\n" + ] + } + ], + "source": [ + "for x in fn(5):\n", + " print(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 127, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fn(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "it = fn(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 129, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(it)" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 130, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(it)" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 131, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(it)" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "24" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(it)" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "120" + ] + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(it)" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "StopIteration", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mStopIteration\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[0mnext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mit\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mStopIteration\u001b[0m: " + ] + } + ], + "source": [ + "next(it)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/004/\350\243\205\351\245\260\345\231\250.ipynb" "b/004/\350\243\205\351\245\260\345\231\250.ipynb" new file mode 100644 index 0000000..6b822eb --- /dev/null +++ "b/004/\350\243\205\351\245\260\345\231\250.ipynb" @@ -0,0 +1,2785 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 函数是一定公民" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "enumerate([1, 2, 3, 4])" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "1\n", + "2\n", + "2\n", + "3\n", + "3\n", + "4\n" + ] + } + ], + "source": [ + "for idx , item in enumerate([1,2 , 3, 4]):\n", + " print(idx)\n", + " print(item)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on method_descriptor:\n", + "\n", + "insert(...)\n", + " L.insert(index, object) -- insert object before index\n", + "\n" + ] + } + ], + "source": [ + "help(list.insert)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def cmp(x, y):\n", + " return x >= y\n", + "\n", + "def sort(*args):\n", + " ret = []\n", + " for item in args:\n", + " for i, v in enumerate(ret):\n", + " if cmp(item, v):\n", + " ret.insert(i, item)\n", + " break\n", + " else:\n", + " ret.append(item)\n", + " return ret\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 3, 2, 1]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sort(True, 3, 1, 2, 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 5]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sort(False, 3, 1, 2, 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 3, 2, 1]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sort(3, 1, 2, 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 高阶函数" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sort(cmp, *args):\n", + " ret = []\n", + " for item in args:\n", + " for i, v in enumerate(ret):\n", + " if cmp(item, v):\n", + " ret.insert(i, item)\n", + " break\n", + " else:\n", + " ret.append(item)\n", + " return ret" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def cmp1(x, y):\n", + " return x >= y\n", + "\n", + "def cmp2(x, y):\n", + " return x <= y" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 3, 2, 1]" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sort(cmp1, 3, 1, 2, 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 5]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sort(cmp2, 3, 1, 2, 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on class filter in module builtins:\n", + "\n", + "class filter(object)\n", + " | filter(function or None, iterable) --> filter object\n", + " | \n", + " | Return an iterator yielding those items of iterable for which function(item)\n", + " | is true. If function is None, return the items that are true.\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __getattribute__(self, name, /)\n", + " | Return getattr(self, name).\n", + " | \n", + " | __iter__(self, /)\n", + " | Implement iter(self).\n", + " | \n", + " | __new__(*args, **kwargs) from builtins.type\n", + " | Create and return a new object. See help(type) for accurate signature.\n", + " | \n", + " | __next__(self, /)\n", + " | Implement next(self).\n", + " | \n", + " | __reduce__(...)\n", + " | Return state information for pickling.\n", + "\n" + ] + } + ], + "source": [ + "help(filter)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def bigger_5(x):\n", + " if x > 5:\n", + " return True\n", + " return False" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filter(bigger_5, range(10))" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[6, 7, 8, 9]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(filter(bigger_5, range(10)))" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function any in module builtins:\n", + "\n", + "any(...)\n", + " any(iterable) -> bool\n", + " \n", + " Return True if bool(x) is True for any x in the iterable.\n", + " If the iterable is empty, return False.\n", + "\n" + ] + } + ], + "source": [ + "help(any)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on class map in module builtins:\n", + "\n", + "class map(object)\n", + " | map(func, *iterables) --> map object\n", + " | \n", + " | Make an iterator that computes the function using arguments from\n", + " | each of the iterables. Stops when the shortest iterable is exhausted.\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __getattribute__(self, name, /)\n", + " | Return getattr(self, name).\n", + " | \n", + " | __iter__(self, /)\n", + " | Implement iter(self).\n", + " | \n", + " | __new__(*args, **kwargs) from builtins.type\n", + " | Create and return a new object. See help(type) for accurate signature.\n", + " | \n", + " | __next__(self, /)\n", + " | Implement next(self).\n", + " | \n", + " | __reduce__(...)\n", + " | Return state information for pickling.\n", + "\n" + ] + } + ], + "source": [ + "help(map)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def inc(x):\n", + " return x + 1" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'int' object is not iterable", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0mmap\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: 'int' object is not iterable" + ] + } + ], + "source": [ + "map(inc, 1,2 , 3, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "map(inc, [1, 2, 3, 4])" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[2, 3, 4, 5]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(map(inc, [1, 2, 3, 4]))" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def left_fold(fn, *args):\n", + " it = iter(args)\n", + " ret = next(it)\n", + " for x in it:\n", + " ret = fn(ret, x)\n", + " return ret\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def add(x, y):\n", + " return x+y" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "10" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "left_fold(add, 1, 2,3 ,4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 函数作为返回值" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def make_inc(f=1):\n", + " def inc(x):\n", + " return x + f\n", + " return inc" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "inc1 = make_inc(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "function" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(inc1)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inc1(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "inc2 = make_inc(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "7" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inc2(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "make_inc(1)(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def inc(f, x):\n", + " return x + f" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "柯里化" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`f(x, y) -> g(x)(y)`" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def bigger(x):\n", + " def inner_bigger(y):\n", + " return y > x\n", + " return inner_bigger" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[6, 7, 8, 9]" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(filter(bigger(5), range(10)))" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[4, 5, 6, 7, 8, 9]" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(filter(bigger(3), range(10)))" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bigger_3 = bigger(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bigger_3(4)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bigger_3(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[4, 5, 6, 7, 8, 9]" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(filter(bigger_3, range(10)))" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bigger(3)(7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*函数是一等对象 - 它和普通的对象(变量)是一样的*" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def inc(f, x):\n", + " return x + f" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def bigger(x, y):\n", + " return x > y" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from functools import partial" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on class partial in module functools:\n", + "\n", + "class partial(builtins.object)\n", + " | partial(func, *args, **keywords) - new function with partial application\n", + " | of the given arguments and keywords.\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __call__(self, /, *args, **kwargs)\n", + " | Call self as a function.\n", + " | \n", + " | __delattr__(self, name, /)\n", + " | Implement delattr(self, name).\n", + " | \n", + " | __getattribute__(self, name, /)\n", + " | Return getattr(self, name).\n", + " | \n", + " | __new__(*args, **kwargs) from builtins.type\n", + " | Create and return a new object. See help(type) for accurate signature.\n", + " | \n", + " | __reduce__(...)\n", + " | \n", + " | __repr__(self, /)\n", + " | Return repr(self).\n", + " | \n", + " | __setattr__(self, name, value, /)\n", + " | Implement setattr(self, name, value).\n", + " | \n", + " | __setstate__(...)\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data descriptors defined here:\n", + " | \n", + " | __dict__\n", + " | \n", + " | args\n", + " | tuple of arguments to future partial calls\n", + " | \n", + " | func\n", + " | function object to use in future partial calls\n", + " | \n", + " | keywords\n", + " | dictionary of keyword arguments to future partial calls\n", + "\n" + ] + } + ], + "source": [ + "help(partial)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "functools.partial(, y=3)" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "partial(bigger, y=3)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bigger_3 = partial(bigger, y=3)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "callable(bigger_3)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bigger_3(4)" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bigger_3(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def many_args(x, y, z, a, b, c):\n", + " print('x is {}'.format(x))\n", + " print('y is {}'.format(y))\n", + " print('z is {}'.format(z))\n", + " print('a is {}'.format(a))\n", + " print('b is {}'.format(b))\n", + " print('c is {}'.format(c))" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fn1 = partial(many_args, a=1, b=2, c=3)" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x is 4\n", + "y is 5\n", + "z is 6\n", + "a is 1\n", + "b is 2\n", + "c is 3\n" + ] + } + ], + "source": [ + "fn1(4, 5, 6)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fn2 = partial(many_args, x = 1, y=2, z=3)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x is 4\n", + "y is 5\n", + "z is 6\n", + "a is 2\n", + "b is 2\n", + "c is 3\n" + ] + } + ], + "source": [ + "fn1(4,5, 6, a=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 装饰器" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import time" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1456624046.828106" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "time.time()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def timeit(fn):\n", + " start = time.time()\n", + " fn()\n", + " print(time.time() - start)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sleep():\n", + " time.sleep(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.003817319869995\n" + ] + } + ], + "source": [ + "timeit(sleep)" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def timeit(fn):\n", + " def wrap(*args, **kwargs):\n", + " start = time.time()\n", + " ret = fn(*args, **kwargs)\n", + " print(time.time() - start)\n", + " return ret\n", + " return wrap" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sleep(x):\n", + " time.sleep(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.002962589263916\n" + ] + } + ], + "source": [ + "timeit(sleep)(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fn = timeit(sleep)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "function" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(fn)" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.0012524127960205\n" + ] + } + ], + "source": [ + "fn(3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这就是装饰器" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@timeit\n", + "def sleep(x):\n", + " time.sleep(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.006810188293457\n" + ] + } + ], + "source": [ + "sleep(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@timeit\n", + "def aad(x, y):\n", + " return x + y" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(5, 6)" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.430511474609375e-06\n" + ] + }, + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "timeit(add)(5, 6)" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@timeit\n", + "def aad(x, y):\n", + " return x + y" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(5, 6)" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.6226043701171875e-06\n" + ] + }, + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "aad(5, 6)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "装饰器的本质就是一个函数, 这个函数接收一个函数作为参数, 返回一个函数, 通常, 返回的这个函数, 是对传入的函数执行前后增加了一些语句,所以叫做装饰" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def heidong(fn):\n", + " def wrap(*args, **kwargs):\n", + " pass\n", + " return wrap" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@heidong\n", + "def do_something():\n", + " print('run run run')" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "do_something()" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def do_other_things():\n", + " print('go go go')" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "go go go\n" + ] + } + ], + "source": [ + "do_other_things()" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def timeit(fn):\n", + " def wrap(*args, **kwargs):\n", + " start = time.time()\n", + " ret = fn(*args, **kwargs)\n", + " print(time.time() - start)\n", + " return ret\n", + " return wrap" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "自然时间" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3.0039329528808594" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "start = time.time()\n", + "time.sleep(3)\n", + "time.time() - start" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "processor time" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.009999999999999787" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "start = time.clock()\n", + "time.sleep(3)\n", + "time.clock" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def timeit(process_time=False):\n", + " cacl = time.clock if process_time else time.time\n", + " def inner_timeit(fn):\n", + " def wrap(*args, **kwargs):\n", + " start = cacl()\n", + " ret = fn(*args, **kwargs)\n", + " print(cacl() - start)\n", + " return ret\n", + " return wrap\n", + " return inner_timeit\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sleep(x):\n", + " time.sleep(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.004034996032715\n" + ] + } + ], + "source": [ + "timeit(False)(sleep)(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fn1 = timeit(False)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fn2 = fn1(sleep)" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.003953695297241\n" + ] + } + ], + "source": [ + "fn2(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@timeit(False)\n", + "def sleep(x):\n", + " time.sleep(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.0035619735717773\n" + ] + } + ], + "source": [ + "sleep(3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def timeit(process_time=False):\n", + " cacl = time.clock if process_time else time.time\n", + " def inner_timeit(fn):\n", + " def wrap(*args, **kwargs):\n", + " start = cacl()\n", + " ret = fn(*args, **kwargs)\n", + " print(cacl() - start)\n", + " return ret\n", + " return wrap\n", + " return inner_timeit" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def timeit(process_time=False):\n", + " cacl = time.clock if process_time else time.time\n", + " def inner_timeit(fn):\n", + " def wrap(*args, **kwargs):\n", + " start = cacl()\n", + " ret = fn(*args, **kwargs)\n", + " print(cacl() - start)\n", + " # send to monitor system\n", + " return ret\n", + " return wrap\n", + " return inner_timeit" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fn1 = timeit(False)" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fn2 = fn1(sleep)" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.006286859512329\n", + "3.00647234916687\n" + ] + } + ], + "source": [ + "fn2(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.0040056705474854\n", + "3.004228353500366\n" + ] + } + ], + "source": [ + "timeit(False)(sleep)(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fn = timeit(False)" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@fn\n", + "def sleep(x):\n", + " time.sleep(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "@timeit(False)\n", + "def sleep(x):\n", + " time.sleep(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.0036978721618652\n" + ] + } + ], + "source": [ + "sleep(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def make_timeit():\n", + " def timeit():\n", + " def inner_timeit(fn):\n", + " def wrap(*args, **kwargs):\n", + " return fn(*args, **kwargs)\n", + " return wrap\n", + " return inner_timeit\n", + " return timeit" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "timeit = make_timeit()\n", + "@timeit()\n", + "def fn():\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def check(allows):\n", + " def deco(fn):\n", + " def wrap(username, *args, **kwargs):\n", + " if username in allows:\n", + " return fn(username, *args, **kwargs)\n", + " return \"not allow\"\n", + " return wrap\n", + " return deco\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@check(['comyn', 'mage'])\n", + "def private(username):\n", + " print('xxxxxxxx')" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "xxxxxxxx\n" + ] + } + ], + "source": [ + "private('comyn')" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'not allow'" + ] + }, + "execution_count": 130, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "private('xueming')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def test():\n", + " '''this is test\n", + " @return None\n", + " '''\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function test in module __main__:\n", + "\n", + "test()\n", + " this is test\n", + " @return None\n", + "\n" + ] + } + ], + "source": [ + "help(test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "docstring" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function test in module __main__:\n", + "\n", + "test()\n", + " this is test\n", + "\n" + ] + } + ], + "source": [ + "help(test)" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'this is test\\n @return None\\n '" + ] + }, + "execution_count": 137, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test.__doc__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'test'" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test.__name__" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "@check(['comyn', 'mage'])\n", + "def test(username):\n", + " ''' this is test'''\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'wrap'" + ] + }, + "execution_count": 141, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test.__name__" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "test.__doc__" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def check(allows):\n", + " def deco(fn):\n", + " def wrap(username, *args, **kwargs):\n", + " if username in allows:\n", + " return fn(username, *args, **kwargs)\n", + " return \"not allow\"\n", + " wrap.__name__ = fn.__name__\n", + " wrap.__doc__ = fn.__doc__\n", + " return wrap\n", + " return deco\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@check(['comyn', 'mage'])\n", + "def test(username):\n", + " ''' this is test'''\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'test'" + ] + }, + "execution_count": 145, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test.__name__" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function test in module __main__:\n", + "\n", + "test(username, *args, **kwargs)\n", + " this is test\n", + "\n" + ] + } + ], + "source": [ + "help(test)" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from functools import wraps" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function wraps in module functools:\n", + "\n", + "wraps(wrapped, assigned=('__module__', '__name__', '__qualname__', '__doc__', '__annotations__'), updated=('__dict__',))\n", + " Decorator factory to apply update_wrapper() to a wrapper function\n", + " \n", + " Returns a decorator that invokes update_wrapper() with the decorated\n", + " function as the wrapper argument and the arguments to wraps() as the\n", + " remaining arguments. Default arguments are as for update_wrapper().\n", + " This is a convenience function to simplify applying partial() to\n", + " update_wrapper().\n", + "\n" + ] + } + ], + "source": [ + "help(wraps)" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def check(allows):\n", + " @wraps\n", + " def deco(fn):\n", + " @wraps\n", + " def wrap(username, *args, **kwargs):\n", + " if username in allows:\n", + " return fn(username, *args, **kwargs)\n", + " return \"not allow\"\n", + " return wrap\n", + " return deco" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "@check(['comyn', 'mage'])\n", + "def test(username, *args, **kwargs):\n", + " ''' this is test'''\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function deco in module __main__:\n", + "\n", + "deco(fn)\n", + "\n" + ] + } + ], + "source": [ + "help(test)" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import functools\n", + "def decorator(fn):\n", + " @functools.wraps(fn)\n", + " def inner(*args, **kwargs):\n", + " return fn(*args, **kwargs)\n", + " return inner\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@decorator\n", + "def func():\n", + " '''this is test func'''\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'func'" + ] + }, + "execution_count": 165, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "func.__name__" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function func in module __main__:\n", + "\n", + "func()\n", + " this is test func\n", + "\n" + ] + } + ], + "source": [ + "help(func)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function update_wrapper in module functools:\n", + "\n", + "update_wrapper(wrapper, wrapped, assigned=('__module__', '__name__', '__qualname__', '__doc__', '__annotations__'), updated=('__dict__',))\n", + " Update a wrapper function to look like the wrapped function\n", + " \n", + " wrapper is the function to be updated\n", + " wrapped is the original function\n", + " assigned is a tuple naming the attributes assigned directly\n", + " from the wrapped function to the wrapper function (defaults to\n", + " functools.WRAPPER_ASSIGNMENTS)\n", + " updated is a tuple naming the attributes of the wrapper that\n", + " are updated with the corresponding attribute from the wrapped\n", + " function (defaults to functools.WRAPPER_UPDATES)\n", + "\n" + ] + } + ], + "source": [ + "help(functools.update_wrapper)" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 3, 2, 1]" + ] + }, + "execution_count": 167, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sort(lambda x, y: x >= y, 3, 1, 2, 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "func = lambda x, y: x >= y" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 3, 2, 1]" + ] + }, + "execution_count": 169, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sort(func, 3, 1, 2, 5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "partial" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/005/OOP-1.ipynb b/005/OOP-1.ipynb new file mode 100644 index 0000000..fbee32d --- /dev/null +++ b/005/OOP-1.ipynb @@ -0,0 +1,2116 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# 面向对象" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 数据和行为的封装" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "door = [1, 'closed']\n", + "\n", + "def open_dooor(door):\n", + " door[1] = 'opning'\n", + " \n", + "def close_door(door):\n", + " door[1] = 'closed'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Door:\n", + " def __init__(self, number, status):\n", + " self.number = number\n", + " self.status = status\n", + " \n", + " def open(self):\n", + " self.status = 'opeing'\n", + " \n", + " def close(self):\n", + " self.status = 'closed'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "door1 = Door(1, 'closed')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class ClassName:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class ClassName(object):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class ClassName(Door):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class ClassName:\n", + " def method_name(self):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def mathod_a(self):\n", + " print(self)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<__main__.A object at 0x7f15c05e4a58>\n" + ] + } + ], + "source": [ + "a.mathod_a()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class ClassName:\n", + " def __init__(self):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def __init__(self, x):\n", + " self.x = x\n", + " self.y = x" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = A(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.y" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + "# def __new__(cls, *args, **kwargs):\n", + "# print('call __new__')\n", + "# print(type(cls))\n", + "# #return object.__new__(cls)\n", + " \n", + " def __init__(self, x):\n", + " print('call __init__')\n", + " print(type(self))\n", + " s1 = set(dir(self))\n", + " self.x =x\n", + " s2 = set(dir(self))\n", + " print(s2 - s1)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "call __new__\n", + "\n" + ] + } + ], + "source": [ + "a = A(5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "元编程" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function dir in module builtins:\n", + "\n", + "dir(...)\n", + " dir([object]) -> list of strings\n", + " \n", + " If called without an argument, return the names in the current scope.\n", + " Else, return an alphabetized list of names comprising (some of) the attributes\n", + " of the given object, and of attributes reachable from it.\n", + " If the object supplies a method named __dir__, it will be used; otherwise\n", + " the default dir() logic is used and returns:\n", + " for a module object: the module's attributes.\n", + " for a class object: its attributes, and recursively the attributes\n", + " of its bases.\n", + " for any other object: its attributes, its class's attributes, and\n", + " recursively the attributes of its class's base classes.\n", + "\n" + ] + } + ], + "source": [ + "help(dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def __init__(self, x=5):\n", + " self.abcd = x\n", + " print(x+1)\n", + " \n", + " def method_a(self):\n", + " print(x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n" + ] + } + ], + "source": [ + "a1 = A()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'x' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\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[0ma1\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmethod_a\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mmethod_a\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mmethod_a\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mNameError\u001b[0m: name 'x' is not defined" + ] + } + ], + "source": [ + " a1.method_a()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a1.abcd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a2 = A(8)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a1.x" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "8" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a2.x" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a3 = A(x=9)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "9" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a3.x" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def __init__(self, x):\n", + " self.__val = x\n", + " \n", + " def __add(self, i):\n", + " self.__val += i\n", + " \n", + " def get_val(self):\n", + " return self.__val\n", + " \n", + " def inc(self):\n", + " self.__add(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = A(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'A' object has no attribute '__val'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\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[0ma\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__val\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m: 'A' object has no attribute '__val'" + ] + } + ], + "source": [ + "a.__val" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.get_val()" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'A' object has no attribute '__add'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\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[0ma\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__add\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m: 'A' object has no attribute '__add'" + ] + } + ], + "source": [ + "a.__add(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a.inc()" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.get_val()" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['_A__add',\n", + " '_A__val',\n", + " '__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " 'get_val',\n", + " 'inc']" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a._A__val" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " val = 3\n", + " def __init__(self, x):\n", + " self.x = 3\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a1 = A(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a1.val" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a2 = A(9)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a2.val" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a1.val + 1" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a1.val += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a1.val" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a2.val" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A.val" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " val = [1, 2, 3]\n", + " def __init__(self):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a1 = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a2 = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3]" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a1.val" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3]" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a2.val" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a1.val.append(4)" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4]" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a1.val" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4]" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a2.val" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "139731398095304" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id(a1.val)" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "139731398095304" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id(a2.val)" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "139731398095304" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id(A.val)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " 'val']" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(a1)" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a1.x = 5" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " 'val',\n", + " 'x']" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(a1)" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " 'val']" + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(a2)" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " __val = 3\n", + " \n", + " def get_val(self):\n", + " return self.__val" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'A' object has no attribute '__val'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\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[0ma\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__val\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m: 'A' object has no attribute '__val'" + ] + } + ], + "source": [ + "a.__val" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "type object 'A' has no attribute '__val'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\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[0mA\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__val\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m: type object 'A' has no attribute '__val'" + ] + } + ], + "source": [ + "A.__val" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.get_val()" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " __val = 3\n", + " \n", + " def __init__(self, x):\n", + " self.x = x\n", + " \n", + " @classmethod\n", + " def get_val(cls):\n", + " return cls.__val" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A.get_val()" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.get_val()" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.get_val()" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " __val = 3\n", + " \n", + " @staticmethod\n", + " def print_val():\n", + " print(__val)" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name '_A__val' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\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[0ma\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprint_val\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mprint_val\u001b[1;34m()\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mstaticmethod\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mprint_val\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m__val\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mNameError\u001b[0m: name '_A__val' is not defined" + ] + } + ], + "source": [ + "a.print_val()" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name '_A__val' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\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[0mA\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprint_val\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mprint_val\u001b[1;34m()\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mstaticmethod\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mprint_val\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m__val\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mNameError\u001b[0m: name '_A__val' is not defined" + ] + } + ], + "source": [ + "A.print_val()" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def __init__(self):\n", + " self.val = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def __init__(self):\n", + " self.__val = 0\n", + " \n", + " @property\n", + " def val(self):\n", + " print('get val')\n", + " if self.__val < 0:\n", + " return 0\n", + " return self.__val\n", + " \n", + " @val.setter\n", + " def val(self, value):\n", + " print('set val')\n", + " if isinstance(value, (int, float)) and value >= 0:\n", + " self.__val = value\n", + " else:\n", + " self.__val = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a.val = -1" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "-1" + ] + }, + "execution_count": 155, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.val" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a1 = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "method" + ] + }, + "execution_count": 157, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(a1.val)" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + ">" + ] + }, + "execution_count": 158, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a1.val" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a1.val = -1" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "-1" + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a1.val" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on class property in module builtins:\n", + "\n", + "class property(object)\n", + " | property(fget=None, fset=None, fdel=None, doc=None) -> property attribute\n", + " | \n", + " | fget is a function to be used for getting an attribute value, and likewise\n", + " | fset is a function for setting, and fdel a function for del'ing, an\n", + " | attribute. Typical use is to define a managed attribute x:\n", + " | \n", + " | class C(object):\n", + " | def getx(self): return self._x\n", + " | def setx(self, value): self._x = value\n", + " | def delx(self): del self._x\n", + " | x = property(getx, setx, delx, \"I'm the 'x' property.\")\n", + " | \n", + " | Decorators make defining new properties or modifying existing ones easy:\n", + " | \n", + " | class C(object):\n", + " | @property\n", + " | def x(self):\n", + " | \"I am the 'x' property.\"\n", + " | return self._x\n", + " | @x.setter\n", + " | def x(self, value):\n", + " | self._x = value\n", + " | @x.deleter\n", + " | def x(self):\n", + " | del self._x\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __delete__(self, instance, /)\n", + " | Delete an attribute of instance.\n", + " | \n", + " | __get__(self, instance, owner, /)\n", + " | Return an attribute of instance, which is of type owner.\n", + " | \n", + " | __getattribute__(self, name, /)\n", + " | Return getattr(self, name).\n", + " | \n", + " | __init__(self, /, *args, **kwargs)\n", + " | Initialize self. See help(type(self)) for accurate signature.\n", + " | \n", + " | __new__(*args, **kwargs) from builtins.type\n", + " | Create and return a new object. See help(type) for accurate signature.\n", + " | \n", + " | __set__(self, instance, value, /)\n", + " | Set an attribute of instance to value.\n", + " | \n", + " | deleter(...)\n", + " | Descriptor to change the deleter on a property.\n", + " | \n", + " | getter(...)\n", + " | Descriptor to change the getter on a property.\n", + " | \n", + " | setter(...)\n", + " | Descriptor to change the setter on a property.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data descriptors defined here:\n", + " | \n", + " | __isabstractmethod__\n", + " | \n", + " | fdel\n", + " | \n", + " | fget\n", + " | \n", + " | fset\n", + "\n" + ] + } + ], + "source": [ + "help(property)" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def __init__(self):\n", + " self.__val = 0\n", + " \n", + " def get_val(self):\n", + " return self.__val\n", + " \n", + " def set_val(self, value):\n", + " self.__val = value\n", + " \n", + " val = property(get_val, set_val)" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "property" + ] + }, + "execution_count": 165, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(A.val)" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a.val = 3" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 168, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.val" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "prop = property()" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "property" + ] + }, + "execution_count": 170, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(prop)" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__delete__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__get__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__isabstractmethod__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__set__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " 'deleter',\n", + " 'fdel',\n", + " 'fget',\n", + " 'fset',\n", + " 'getter',\n", + " 'setter']" + ] + }, + "execution_count": 171, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(prop)" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "builtin_function_or_method" + ] + }, + "execution_count": 172, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(prop.getter)" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def get():\n", + " return 0" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def set(val):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "prop = property(get, set)" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 176, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prop" + ] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/005/OOP-2.ipynb b/005/OOP-2.ipynb new file mode 100644 index 0000000..5c86d6f --- /dev/null +++ b/005/OOP-2.ipynb @@ -0,0 +1,1502 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 继承" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Door:\n", + " def __init__(self, number, status):\n", + " self.number = number\n", + " self.status = status\n", + " \n", + " def open(self):\n", + " self.status = 'opening'\n", + " \n", + " def close(self):\n", + " self.status = 'closed'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class LockableDoor:\n", + " def __init__(self, number, status, is_locked):\n", + " self.number = number\n", + " self.status = status\n", + " self.is_locked = is_locked\n", + " \n", + " def open(self):\n", + " if not self.is_locked:\n", + " self.status = 'opening'\n", + " else:\n", + " print('is locked')\n", + " \n", + " def close(self):\n", + " self.staus = 'closed'\n", + " \n", + " def lock(self):\n", + " if self.status == 'closed':\n", + " self.is_locked = True\n", + " else:\n", + " print('is opening')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class LockableDoor(Door): # Door 是 LockableDoor 的 超类、父类、基类\n", + " def __init__(self, number, status, is_locked):\n", + " super(LockableDoor, self).__init__(number, status)\n", + " self.is_locked = is_locked\n", + " \n", + " def open(self): # 重写\n", + " if not self.is_locked:\n", + " super(LockableDoor, self).open()\n", + " else:\n", + " print('is locked')\n", + " \n", + " def lock(self):\n", + " if self.status == 'closed':\n", + " self.is_locked = True\n", + " else:\n", + " print('is opening')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on class super in module builtins:\n", + "\n", + "class super(object)\n", + " | super() -> same as super(__class__, )\n", + " | super(type) -> unbound super object\n", + " | super(type, obj) -> bound super object; requires isinstance(obj, type)\n", + " | super(type, type2) -> bound super object; requires issubclass(type2, type)\n", + " | Typical use to call a cooperative superclass method:\n", + " | class C(B):\n", + " | def meth(self, arg):\n", + " | super().meth(arg)\n", + " | This works for class methods too:\n", + " | class C(B):\n", + " | @classmethod\n", + " | def cmeth(cls, arg):\n", + " | super().cmeth(arg)\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __get__(self, instance, owner, /)\n", + " | Return an attribute of instance, which is of type owner.\n", + " | \n", + " | __getattribute__(self, name, /)\n", + " | Return getattr(self, name).\n", + " | \n", + " | __init__(self, /, *args, **kwargs)\n", + " | Initialize self. See help(type(self)) for accurate signature.\n", + " | \n", + " | __new__(*args, **kwargs) from builtins.type\n", + " | Create and return a new object. See help(type) for accurate signature.\n", + " | \n", + " | __repr__(self, /)\n", + " | Return repr(self).\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data descriptors defined here:\n", + " | \n", + " | __self__\n", + " | the instance invoking super(); may be None\n", + " | \n", + " | __self_class__\n", + " | the type of the instance invoking super(); may be None\n", + " | \n", + " | __thisclass__\n", + " | the class invoking super()\n", + "\n" + ] + } + ], + "source": [ + "help(super)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 继承与可见性" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " __class_private_var = 'class private var'\n", + " class_public_var = 'class public var'\n", + " \n", + " def __init__(self):\n", + " self.__instance_private_var = 'instance private var'\n", + " self.instance_pubic_var = 'instance public var'\n", + " \n", + " def __intance_private_method(self):\n", + " try:\n", + " print(self.__class_private_var)\n", + " except:\n", + " pass\n", + " try:\n", + " print(self.class_public_var)\n", + " except:\n", + " pass\n", + " try:\n", + " print(self.__instance_private_var)\n", + " except:\n", + " pass\n", + " try:\n", + " print(self.instance_pubic_var)\n", + " except:\n", + " pass\n", + " \n", + " def instance_pubic_method(self):\n", + " try:\n", + " print(self.__class_private_var)\n", + " except:\n", + " pass\n", + " try:\n", + " print(self.class_public_var)\n", + " except:\n", + " pass\n", + " try:\n", + " print(self.__instance_private_var)\n", + " except:\n", + " pass\n", + " try:\n", + " print(self.instance_pubic_var)\n", + " except:\n", + " pass\n", + " \n", + " @classmethod\n", + " def __private_class_method(cls):\n", + " try:\n", + " print(cls.__class_private_var)\n", + " except:\n", + " pass\n", + " try:\n", + " print(cls.class_public_var)\n", + " except:\n", + " pass\n", + " \n", + " @classmethod\n", + " def public_class_method(cls):\n", + " try:\n", + " print(cls.__class_private_var)\n", + " except:\n", + " pass\n", + " try:\n", + " print(cls.class_public_var)\n", + " except:\n", + " pass\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class B(A):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "b = B()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['_A__class_private_var',\n", + " '_A__instance_private_var',\n", + " '_A__intance_private_method',\n", + " '_A__private_class_method',\n", + " '__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " 'class_public_var',\n", + " 'instance_pubic_method',\n", + " 'instance_pubic_var',\n", + " 'public_class_method']" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(b)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'B' object has no attribute '__intance_private_method'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\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[0mb\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__intance_private_method\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m: 'B' object has no attribute '__intance_private_method'" + ] + } + ], + "source": [ + "b.__intance_private_method()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'B' object has no attribute '__private_class_method'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\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[0mb\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__private_class_method\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m: 'B' object has no attribute '__private_class_method'" + ] + } + ], + "source": [ + "b.__private_class_method()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "class private var\n", + "class public var\n", + "instance private var\n", + "instance public var\n" + ] + } + ], + "source": [ + "b.instance_pubic_method()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "class private var\n", + "class public var\n" + ] + } + ], + "source": [ + "b.public_class_method()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* 私有的方法、变量(类和实例)是不可继承的\n", + "* 公有的方法、变量(类和实例)是可继承的\n", + "* 父类公有的方法(类和实例)是可以访问父类的私有变量的" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class B(A):\n", + " __class_private_var = 'child class private var'\n", + " class_public_var = 'child class public var'\n", + " \n", + " def __init__(self):\n", + " super(B, self).__init__()\n", + " self.__instance_private_var = 'child instance private var'\n", + " self.instance_pubic_var = 'child instance public var'" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "b = B()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "class private var\n", + "child class public var\n", + "instance private var\n", + "child instance public var\n" + ] + } + ], + "source": [ + "b.instance_pubic_method()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['_A__class_private_var',\n", + " '_A__instance_private_var',\n", + " '_A__intance_private_method',\n", + " '_A__private_class_method',\n", + " '_B__class_private_var',\n", + " '_B__instance_private_var',\n", + " '__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " 'class_public_var',\n", + " 'instance_pubic_method',\n", + " 'instance_pubic_var',\n", + " 'public_class_method']" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(b)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def __method(self):\n", + " print('method of A')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class B(A):\n", + " def __method(self):\n", + " super(B, self)._A__method()\n", + " print('method of B')\n", + " \n", + " def method(self):\n", + " self.__method()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "b = B()" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "method of A\n", + "method of B\n" + ] + } + ], + "source": [ + "b.method()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 多继承" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def method_from_a(self):\n", + " print('i am method of a')" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class B:\n", + " def method_from_b(self):\n", + " print('i am method of b')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class C(A, B):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "c = C()" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i am method of a\n" + ] + } + ], + "source": [ + "c.method_from_a()" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i am method of b\n" + ] + } + ], + "source": [ + "c.method_from_b()" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def method(self):\n", + " print('method of A')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class B:\n", + " def method(self):\n", + " print('method of B')" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class C(A, B):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "c = C()" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "method of A\n" + ] + } + ], + "source": [ + "c.method()" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class C(B, A):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "c = C()" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "method of B\n" + ] + } + ], + "source": [ + "c.method()" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class B(A):\n", + " def method(self):\n", + " print('method of B')" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "Cannot create a consistent method resolution\norder (MRO) for bases A, B", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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;32mclass\u001b[0m \u001b[0mC\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mA\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mB\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mpass\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mTypeError\u001b[0m: Cannot create a consistent method resolution\norder (MRO) for bases A, B" + ] + } + ], + "source": [ + "class C(A, B):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class C(B, A):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "c = C()" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "method of B\n" + ] + } + ], + "source": [ + "c.method()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### MRO method resolution order" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "MRO 通过 C3算法计算出来" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "class B: -> mro(B) = [B, O]\n", + "\n", + "class B(A1, A2, ...) -> mro(B) = [B] + merge(mro(A1), mro(A2), ..., [A1, A2, ...])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```\n", + "C(A, B) - >\n", + " [C] + merge(mro(A), mro(B), [A, B])\n", + " [C] + merge([A, O], [B, O], [A, B])\n", + " [C, A] + merge([O], [B, O], [B])\n", + " [C, A, B] + merge([O], [O])\n", + " [C, A, B, O]\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```\n", + "C(B, A) ->\n", + " [C] + merge(mro(B), mro(A), [B, A])\n", + " [C] + merge([B, O], [A, O], [B, A])\n", + " [C, B] + merge([O], [A, O], [A])\n", + " [C, B, A] + merge([O], [O])\n", + " [C, B, A, O]\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```\n", + "C(A, B), B(A) ->\n", + " [C] + merge(mro(A), mro(B), [A, B])\n", + " [C] + merge([A, O], ([B] + merge(mro(A), [A]), [A, B])\n", + " [C] + merge([A, O], ([B] + merge([A, O], [A])), [A, B])\n", + " [C] + merge([A, O], ([B, A] + merge([O])), [A, B])\n", + " [C] + merge([A, O], [B, A, O], [A, B])\n", + " raise TypeError\n", + " ```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```\n", + "C(B, A), B(A) ->\n", + " [C] + merge(mro(B), mro(A), [B, A])\n", + " [C] + merge([B, A, O], [A, O], [B, A])\n", + " [C, B] + merge([A, O], [A, O], [A])\n", + " [C, B, A] + merge([O], [O])\n", + " [C, B, A, O]\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```\n", + "B(A) ->\n", + " [B] + merge(mro(A), [A])\n", + " [B] + merge([A, O], [A])\n", + " [B, A] + merge([O])\n", + " [B, A, O]\n", + "\n", + "C(A, B), B(A) ->\n", + " [C] + merge(mro(A), mro(B), [A, B])\n", + " [C] + merge([A, O], [B, A, O], [A, B])\n", + " raise TypeError\n", + "``` " + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(__main__.C, __main__.B, __main__.A, object)" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "C.__mro__" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Python 的多继承是一济毒药*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### MIXIN" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "他是实现组合的一种方式" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Document:\n", + " def __init__(self, content):\n", + " self.content = content\n", + " \n", + " def format(self):\n", + " pass\n", + " \n", + " def display(self):\n", + " raise NotImplementedError" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Word(Document):\n", + " def format(self):\n", + " self.content = 'i am word, my content is {0}'.format(self.content)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Excel(Document):\n", + " def format(self):\n", + " self.content = 'i am excel, my content is {0}'.format(self.content)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class WordWithMonitor(Word):\n", + " def display(self):\n", + " print('{0} on monitor'.format(self.content))" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class ExcelWithMonitor(Excel):\n", + " def display(self):\n", + " print('{0} on monitor'.format(self.content))" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class WordWithHP(Word):\n", + " def display(self):\n", + " print('{0} on HP'.format(self.content))" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class ExcelWithHP(Excel):\n", + " def display(self):\n", + " print('{0} on HP'.format(self.content))" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Monitor(object):\n", + " def display(self):\n", + " print('{0} on monitor'.format(self.content))" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class HP:\n", + " def display(self):\n", + " print('{0} on HP'.format(self.content))" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class WordWithMonitor(Monitor, Word):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class ExcelWithMonitor(Excel, Monitor):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "wwm = WordWithMonitor('mix in')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "wwm.format()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i am word, my content is mix in on monitor\n" + ] + } + ], + "source": [ + "wwm.display()" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(__main__.WordWithMonitor,\n", + " __main__.Monitor,\n", + " __main__.Word,\n", + " __main__.Document,\n", + " object)" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "WordWithMonitor.__mro__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " 'content',\n", + " 'display',\n", + " 'format']" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(wwm)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'i am word, my content is mix in'" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wwm.content" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "wwm.display()" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'WordWithMonitor' object has no attribute '__mro__'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\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[0mwwm\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__mro__\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m: 'WordWithMonitor' object has no attribute '__mro__'" + ] + } + ], + "source": [ + "wwm.__mro__" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(__main__.WordWithMonitor,\n", + " __main__.Word,\n", + " __main__.Document,\n", + " __main__.Monitor,\n", + " object)" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "WordWithMonitor.__mro__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/005/OOP-3.ipynb b/005/OOP-3.ipynb new file mode 100644 index 0000000..8d6e10a --- /dev/null +++ b/005/OOP-3.ipynb @@ -0,0 +1,3328 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 魔术方法/特殊方法" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 对象的创建与销毁" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* `__new__` 创建对象\n", + "* `__init__` 初始化对象\n", + "* `__del__` 当销毁对象的时候调用" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def __new__(cls):\n", + " print('call __new__')\n", + " return object.__new__(cls)\n", + " \n", + " def __init__(self):\n", + " print('call __init__')\n", + " \n", + " def method(self):\n", + " print('call method')\n", + " \n", + " def __del__(self):\n", + " print('call __del__')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "call __new__\n", + "call __init__\n" + ] + } + ], + "source": [ + "a = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "call method\n" + ] + } + ], + "source": [ + "a.method()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "call __del__\n" + ] + } + ], + "source": [ + "del a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 可视化对象" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<__main__.A object at 0x7f00d4461518>\n" + ] + } + ], + "source": [ + "print(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def __init__(self, name):\n", + " self.name = name\n", + " \n", + " def __repr__(self):\n", + " return self.name\n", + " \n", + " def __str__(self):\n", + " return 'call __str__ name is {0}'.format(self.name)\n", + " \n", + " def __bytes__(self):\n", + " return 'call __str__ name is {0}'.format(self.name).encode('utf-8')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "a = A('magedu')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "magedu\n" + ] + } + ], + "source": [ + "print(a) # print(repr(a))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'call __str__ name is magedu'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "str(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "b'call __str__ name is magedu'" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bytes(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 比较运算符重载" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Person:\n", + " def __init__(self, age):\n", + " self.age = age\n", + " \n", + " def __lt__(self, other):\n", + " print('lt')\n", + " return self.age < other.age\n", + " \n", + " def __le__(self, other):\n", + " print('le')\n", + " return self.age <= other.age\n", + " \n", + " def __eq__(self, other):\n", + " print('eq')\n", + " return self.age == other.age\n", + " \n", + " def __ne__(self, other):\n", + " print('ne')\n", + " return self.age != other.age\n", + " \n", + " def __gt__(self, other):\n", + " print('gt')\n", + " return self.age > other.age\n", + " \n", + " def __ge__(self, other):\n", + " print('ge')\n", + " return self.age >= other.age" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "p1 = Person(18)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "p2 = Person(14)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unorderable types: Person() > Person()", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0mp1\u001b[0m \u001b[1;33m>\u001b[0m \u001b[0mp2\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: unorderable types: Person() > Person()" + ] + } + ], + "source": [ + "p1 > p2" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p1 > p2" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "gt\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p1 > p2" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ge\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p1 >= p2" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "eq\n" + ] + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p1 == p2" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ne\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p1 != p2" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "lt\n" + ] + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p1 < p2" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "le\n" + ] + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p1 <= p2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### bool 函数" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool([])" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(None)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(p1)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Grok:\n", + " def __init__(self, val):\n", + " self.val = val\n", + " \n", + " def __bool__(self):\n", + " return not self.val" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "grok1 = Grok(True)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(grok1)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "grok2 = Grok(False)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(grok2)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__add__',\n", + " '__class__',\n", + " '__contains__',\n", + " '__delattr__',\n", + " '__delitem__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__getitem__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__iadd__',\n", + " '__imul__',\n", + " '__init__',\n", + " '__iter__',\n", + " '__le__',\n", + " '__len__',\n", + " '__lt__',\n", + " '__mul__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__reversed__',\n", + " '__rmul__',\n", + " '__setattr__',\n", + " '__setitem__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " 'append',\n", + " 'clear',\n", + " 'copy',\n", + " 'count',\n", + " 'extend',\n", + " 'index',\n", + " 'insert',\n", + " 'pop',\n", + " 'remove',\n", + " 'reverse',\n", + " 'sort']" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir([])" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class List:\n", + " def __init__(self, *args):\n", + " self.val = args\n", + " \n", + " def __bool__(self):\n", + " return True\n", + " \n", + " def __len__(self):\n", + " return len(self.val)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lst = List(1, 2, 3)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(lst)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(lst)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lst2 = List()" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(lst2)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(lst2)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lst3 = List()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(lst3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### hash() 与可hash对象" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unhashable type: 'list'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0mhash\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: unhashable type: 'list'" + ] + } + ], + "source": [ + "hash([])" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hash('')" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4709425544278937976" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hash('123')" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "19" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len('4709425544278937976')" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "-1341440109335276339" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hash('xxx')" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Grok:\n", + " def __init__(self, val):\n", + " self.val = val\n", + " \n", + " def __hash__(self):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "grok = Grok(123)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "__hash__ method should return an integer", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0mhash\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgrok\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: __hash__ method should return an integer" + ] + } + ], + "source": [ + "hash(grok)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__']" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(object)" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import sys" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "64" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sys.hash_info.width" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 可调用对象" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fn():\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__annotations__',\n", + " '__call__',\n", + " '__class__',\n", + " '__closure__',\n", + " '__code__',\n", + " '__defaults__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__get__',\n", + " '__getattribute__',\n", + " '__globals__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__kwdefaults__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__name__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__qualname__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__']" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(fn)" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Function:\n", + " def __call__(self, name):\n", + " print('i am callable, my name is {0}'.format(name))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "func = Function()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "callable(func)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i am callable, my name is magedu\n" + ] + } + ], + "source": [ + "func('magedu')" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class InjectUser:\n", + " def __init__(self, default_user):\n", + " self.user = default_user\n", + " \n", + " def __call__(self, fn):\n", + " def wrap(*args, **kwargs):\n", + " if 'user' not in kwargs.keys():\n", + " kwargs['user'] = self.user\n", + " return fn(*args, **kwargs)\n", + " return wrap\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@InjectUser('magedu')\n", + "def do_somthings(*args, **kwargs):\n", + " print(kwargs.get('user'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "injectuser = InjectUser('magedu')\n", + "\n", + "injectuser(do_somthings)" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "magedu\n" + ] + } + ], + "source": [ + "do_somthings()" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Single:\n", + " __instance = None\n", + " \n", + " def __init__(self, cls):\n", + " self.cls = cls\n", + " \n", + " def __call__(self, *args, **kwargs):\n", + " if self.__instance is None:\n", + " self.__instance = self.cls(*args, **kwargs)\n", + " return self.__instance\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@Single\n", + "class Grok:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Grok:\n", + " pass\n", + "\n", + "_Grok = Single(Grok)" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "grok = Grok()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "_Grok()" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "139641538253208" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id(grok)" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "grok1 = Grok()" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "139641538253208" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id(grok1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "Single(Grok)()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 反射" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__abs__',\n", + " '__add__',\n", + " '__and__',\n", + " '__bool__',\n", + " '__ceil__',\n", + " '__class__',\n", + " '__delattr__',\n", + " '__dir__',\n", + " '__divmod__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__float__',\n", + " '__floor__',\n", + " '__floordiv__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__getnewargs__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__index__',\n", + " '__init__',\n", + " '__int__',\n", + " '__invert__',\n", + " '__le__',\n", + " '__lshift__',\n", + " '__lt__',\n", + " '__mod__',\n", + " '__mul__',\n", + " '__ne__',\n", + " '__neg__',\n", + " '__new__',\n", + " '__or__',\n", + " '__pos__',\n", + " '__pow__',\n", + " '__radd__',\n", + " '__rand__',\n", + " '__rdivmod__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__rfloordiv__',\n", + " '__rlshift__',\n", + " '__rmod__',\n", + " '__rmul__',\n", + " '__ror__',\n", + " '__round__',\n", + " '__rpow__',\n", + " '__rrshift__',\n", + " '__rshift__',\n", + " '__rsub__',\n", + " '__rtruediv__',\n", + " '__rxor__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__sub__',\n", + " '__subclasshook__',\n", + " '__truediv__',\n", + " '__trunc__',\n", + " '__xor__',\n", + " 'bit_length',\n", + " 'conjugate',\n", + " 'denominator',\n", + " 'from_bytes',\n", + " 'imag',\n", + " 'numerator',\n", + " 'real',\n", + " 'to_bytes']" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, 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 1.__dict__\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "1.__dict__" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'str' object has no attribute '__dict__'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\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;34m'abc'\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__dict__\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m: 'str' object has no attribute '__dict__'" + ] + } + ], + "source": [ + "'abc'.__dict__" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Grok:\n", + " X = 1\n", + " Y = 2\n", + " Z = 3\n", + " def __init__(self, x, y, z):\n", + " self.x = x\n", + " self.y = y\n", + " self.z = z\n", + " \n", + " def method(self):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "grok = Grok(1, 2, 3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'x': 1, 'y': 2, 'z': 3}" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grok.__dict__" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['X',\n", + " 'Y',\n", + " 'Z',\n", + " '__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " 'method',\n", + " 'x',\n", + " 'y',\n", + " 'z']" + ] + }, + "execution_count": 113, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(grok)" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "__main__.Grok" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grok.__class__" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['Y',\n", + " '__repr__',\n", + " 'Z',\n", + " '__eq__',\n", + " '__getattribute__',\n", + " '__str__',\n", + " '__reduce__',\n", + " '__delattr__',\n", + " '__ne__',\n", + " '__le__',\n", + " '__dir__',\n", + " '__hash__',\n", + " '__sizeof__',\n", + " '__weakref__',\n", + " 'z',\n", + " '__class__',\n", + " '__setattr__',\n", + " '__format__',\n", + " '__lt__',\n", + " '__new__',\n", + " '__dict__',\n", + " '__reduce_ex__',\n", + " 'y',\n", + " '__module__',\n", + " 'method',\n", + " 'X',\n", + " '__gt__',\n", + " '__doc__',\n", + " '__ge__',\n", + " 'x',\n", + " '__init__',\n", + " '__subclasshook__']" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grok.__dir__()" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'Grok' object has no attribute ' x'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\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[0mgetattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgrok\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m' x'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m: 'Grok' object has no attribute ' x'" + ] + } + ], + "source": [ + "getattr(grok,' x')" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grok.x" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "getattr(grok, 'method')()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "grok.method()" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "getattr(grok, 'X')" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setattr(grok, 'a', 123)" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "123" + ] + }, + "execution_count": 126, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grok.a" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "delattr(grok, 'a')" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'Grok' object has no attribute 'a'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\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[0mgrok\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m: 'Grok' object has no attribute 'a'" + ] + } + ], + "source": [ + "grok.a" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Grok:\n", + " def __init__(self):\n", + " self.__dict = {'x': 1, 'y': 2}\n", + " self.a = 3\n", + " self.x = 5\n", + " \n", + " def __getattr__(self, name):\n", + " print('get {0}'.format(name))\n", + " return self.__dict.get(name)" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "grok = Grok()" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "get x\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 138, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grok.x" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 139, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grok.a" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 142, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grok.x" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "switch(s) {\n", + " case a:\n", + " kkk\n", + " case b:\n", + " xxxx\n", + " defaut:xxx\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Switch:\n", + " def __init__(self, s):\n", + " self.s = s\n", + " \n", + " def method_a(self):\n", + " pass\n", + " \n", + " \n", + " def __call__(self):\n", + " getattr(self, self.s)()\n", + " \n", + " \n", + " def __getattr__(self, name):\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Grok:\n", + " __dict = {}\n", + " \n", + " def __getattr__(self, name):\n", + " return self.__dict.get(name)\n", + " \n", + " def __getattrute__(self, name):\n", + " return self.__dict.get(name)" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Grok:\n", + " def method_a(self):\n", + " pass\n", + " \n", + " def method_b(self):\n", + " pass\n", + " \n", + " def method_default(self):\n", + " pass\n", + " \n", + " def __getattr__(self, name):\n", + " return self.method_default\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "getattr(grok, config.get('method'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### with语句与 `__enter__` ` __exit__`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "f = open('./notes.adoc')\n", + "f.readline()\n", + "f.close()\n", + "\n", + "pymysql.connect()\n", + "...\n", + "pymysq.close()\n", + "\n", + "socket.connect()\n", + ".....\n", + "socket.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "with open('./notes.adoc') as f:\n", + " f.readline()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Resouce:\n", + " def __init__(self):\n", + " print('init')\n", + " \n", + " def __enter__(self):\n", + " print('enter')\n", + " print(self)\n", + " return self\n", + " \n", + " def __exit__(self, *args, **kwargs):\n", + " print('exit')" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "init\n", + "enter\n", + "<__main__.Resouce object at 0x7f00d443f588>\n", + "<__main__.Resouce object at 0x7f00d443f588>\n", + "exit\n" + ] + } + ], + "source": [ + "with Resouce() as res:\n", + " print(res)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 描述器" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Point:\n", + " def __init__(self, x, y):\n", + " self.x = x\n", + " self.y = y" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Number:\n", + " def __init__(self, name):\n", + " self.name = name\n", + " \n", + " def __get__(self, instance, cls):\n", + " print('get')\n", + " if instance is not None:\n", + " return instance.__dict__[self.name]\n", + " return self\n", + "\n", + " def __set__(self, instance, value):\n", + " print('set')\n", + " if isinstance(value, (int, float)):\n", + " instance.__dict__[self.name] = value\n", + " else:\n", + " raise TypeError('excepted int or float')\n", + " \n", + " def __delete__(self, instance):\n", + " del instance.__dict__[self.name]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Point:\n", + " x = Number('x')\n", + " y = Number('y')\n", + " def __init__(self, x, y):\n", + " self.x = x\n", + " self.y = y" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "set\n", + "set\n" + ] + } + ], + "source": [ + "point = Point(1, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "get\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 157, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "point.x # Point.x.__get__(point, Point)" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "get\n" + ] + }, + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 158, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "point.y" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "excepted int or float", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0mpoint\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'x'\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36m__set__\u001b[1;34m(self, instance, value)\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[0minstance\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__dict__\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 12\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'excepted int or float'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 14\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__delete__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minstance\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mTypeError\u001b[0m: excepted int or float" + ] + } + ], + "source": [ + "point.x = 'x' # Point.y.__set__(point, value)" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Spam:\n", + " def spam(self):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def grok(self):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = Spam()" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + ">" + ] + }, + "execution_count": 166, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grok.__get__(s, Spam)" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + ">" + ] + }, + "execution_count": 167, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.spam # Spam.spam.__get__(s, Sparm)" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "get\n" + ] + }, + { + "data": { + "text/plain": [ + "<__main__.Number at 0x7f00d4461080>" + ] + }, + "execution_count": 170, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Point.x # Point.x.__get__(None, Point)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Typed:\n", + " def __init__(self, name, expected_type):\n", + " self.name = name\n", + " self.expected_type = expected_type\n", + " \n", + " def __get__(self, instance, cls):\n", + " if instance is not None:\n", + " return instance.__dict__[self.name]\n", + " return self\n", + " \n", + " def __set__(self, instance, value):\n", + " if not isinstance(value, self.expected_type):\n", + " raise TypeError('expected type {0}'.format(self.expected_type))\n", + " instance.__dict__[self.name] = value\n", + " \n", + " def __delete__(self, instance):\n", + " del instance.__dict__[self.name]" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Point:\n", + " x = Typed('x', (int, float))\n", + " y = Typed('y', (int, float))\n", + " \n", + " def __init__(self, x, y):\n", + " self.x = x\n", + " self.y = y" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from functools import wraps\n", + "def typeassert(**kwargs):\n", + " def inner(cls):\n", + " @wraps(cls)\n", + " def wrap(**kwargs):\n", + " for k, v in kwargs.items():\n", + " setattr(cls, k, Typed(k, v))\n", + " return cls\n", + " return wrap\n", + " return inner" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "@typeassert(x=int, y=float, z=str)\n", + "class Spam:\n", + " def __init__(self, x, y, z, m):\n", + " self.x = x\n", + " self.y = y\n", + " self.z = z\n", + " self.m = m" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = Spam(x=1, y=1.2, z='test', m=123)" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Property:\n", + " def __init__(self, fget=None, fset=None, fdel=None):\n", + " self.fget = fget\n", + " self.fset = fset\n", + " self.fdel = fdel\n", + " \n", + " def __get__(self, instance, cls):\n", + " if self.fget is not None:\n", + " return self.fget(instance)\n", + " \n", + " def __set__(self, instance, value):\n", + " if self.fset is not None:\n", + " self.fset(instance, value)\n", + " \n", + " def __delete__(self, instance):\n", + " if self.fdel is not None:\n", + " self.fdel(instance)\n", + " \n", + " def getter(self, fn):\n", + " self.fget = fn\n", + " \n", + " def setter(self, fn):\n", + " self.fset = fn\n", + " \n", + " def deler(self, fn):\n", + " self.fdel = fn" + ] + }, + { + "cell_type": "code", + "execution_count": 198, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Spam:\n", + " def __init__(self, val):\n", + " self.__val = val\n", + " \n", + " @Property\n", + " def val(self):\n", + " return self.__val\n", + " \n", + " @val.setter\n", + " def set_val(self, value):\n", + " self.__val = value" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 199, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = Spam(3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 200, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.val # Spam.val.__get__(s, Spam)" + ] + }, + { + "cell_type": "code", + "execution_count": 201, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s.val = 4 # Spam.val.__set__(s, value)" + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 202, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.val" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 193, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "NoneType" + ] + }, + "execution_count": 193, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(s.val)" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['_Spam__val',\n", + " '__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " 'val']" + ] + }, + "execution_count": 194, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 203, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class ClassProperty:\n", + " def __init__(self, fn):\n", + " self.fn = fn\n", + " \n", + " def __get__(self, instance, cls):\n", + " return self.fn(cls)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 207, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Spam:\n", + " __val = 3\n", + " \n", + " @ClassProperty\n", + " def val(cls):\n", + " return cls.__val\n", + " \n", + " @ClassProperty\n", + " def name(cls):\n", + " return cls.__name__.lower()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 208, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = Spam()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 206, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 206, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.val" + ] + }, + { + "cell_type": "code", + "execution_count": 209, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'spam'" + ] + }, + "execution_count": 209, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.name" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 210, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class ClassMethod:\n", + " def __init__(self, fn):\n", + " self.fn = fn\n", + " \n", + " def __get__(self, instance, cls):\n", + " return self.fn(cls)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**描述器其实是一个传递协议**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/006/exc.py b/006/exc.py new file mode 100644 index 0000000..97b0d76 --- /dev/null +++ b/006/exc.py @@ -0,0 +1,10 @@ +def gen(): + c = 0 + while True: + yield 0 + c += 1 + if c > 3: + raise GeneratorExit() + +for x in gen(): + print(x) diff --git a/006/key.py b/006/key.py new file mode 100644 index 0000000..0c38238 --- /dev/null +++ b/006/key.py @@ -0,0 +1,5 @@ +try: + while True: + print('ha ha ha') +except KeyboardInterrupt: + print('exit...') diff --git "a/006/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" "b/006/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" new file mode 100644 index 0000000..ce7ed21 --- /dev/null +++ "b/006/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" @@ -0,0 +1,319 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 异常处理" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, 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 if True abc\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "if True abc" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "division by zero", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mZeroDivisionError\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;36m3\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mZeroDivisionError\u001b[0m: division by zero" + ] + } + ], + "source": [ + "3/0" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "start\n", + "division by zero\n", + "finally\n" + ] + } + ], + "source": [ + "try:\n", + " print('start')\n", + " 3/0\n", + " print('end')\n", + "except ZeroDivisionError as e:\n", + " print(e)\n", + "finally:\n", + " print('finally')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "division by zero\n" + ] + } + ], + "source": [ + "try:\n", + " 3/0\n", + "except SyntaxError as e:\n", + " print(e)\n", + "except ZeroDivisionError as e:\n", + " print(e)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exception\n" + ] + } + ], + "source": [ + "try:\n", + " 3/0\n", + "except Exception:\n", + " print('Exception')\n", + "except ZeroDivisionError:\n", + " print('ZeroDivisionError')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ha ha ha\n", + "finally\n" + ] + } + ], + "source": [ + "def p():\n", + " print('ha ha ha')\n", + "\n", + " \n", + "def main():\n", + " try:\n", + " return p()\n", + " finally:\n", + " print('finally')\n", + "\n", + "main()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "try:\n", + " f = open('./Untitled.ipynb')\n", + " 3/i\n", + "except:\n", + " print('eeeeee')\n", + "finally:\n", + " f.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class InputLessZeroException(Exception):\n", + " pass\n", + "\n", + "def fn(i):\n", + " if i < 0:\n", + " raise InputLessZeroException()\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "division by zero\n" + ] + } + ], + "source": [ + "def fn():\n", + " 3/0\n", + "\n", + "def main():\n", + " fn()\n", + "\n", + "try: \n", + " main()\n", + "except Exception as e:\n", + " print(e)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class MyException(Exception):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "MyException", + "evalue": "exception", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mMyException\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;32mraise\u001b[0m \u001b[0mMyException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'exception'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mMyException\u001b[0m: exception" + ] + } + ], + "source": [ + "raise MyException('exception')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abc\n" + ] + } + ], + "source": [ + "try:\n", + " raise MyException('abc')\n", + "except MyException as e:\n", + " print(e)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/007/bar.py b/007/bar.py new file mode 100644 index 0000000..41fb31e --- /dev/null +++ b/007/bar.py @@ -0,0 +1,6 @@ +from foo import fn as foo + + +def fn(): + foo() + print('im bar') diff --git a/007/foo.py b/007/foo.py new file mode 100644 index 0000000..3406e83 --- /dev/null +++ b/007/foo.py @@ -0,0 +1,6 @@ +from bar import fn as bar + + +def fn(): + bar() + print('im foo') diff --git a/007/m/__init__.py b/007/m/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/007/m/bar.py b/007/m/bar.py new file mode 100644 index 0000000..cf46538 --- /dev/null +++ b/007/m/bar.py @@ -0,0 +1,5 @@ +from .foo import fn + + +def bar(): + fn() diff --git a/007/m/foo.py b/007/m/foo.py new file mode 100644 index 0000000..9c8c4c0 --- /dev/null +++ b/007/m/foo.py @@ -0,0 +1,3 @@ + +def fn(): + print('i am in magedu.foo') diff --git a/007/m/sub/__init__.py b/007/m/sub/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/007/m/sub/sub/__init__.py b/007/m/sub/sub/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/007/m/sub/sub/y.py b/007/m/sub/sub/y.py new file mode 100644 index 0000000..ac4c3e1 --- /dev/null +++ b/007/m/sub/sub/y.py @@ -0,0 +1,5 @@ +from ...foo import fn + + +def y(): + fn() \ No newline at end of file diff --git a/007/m/sub/x.py b/007/m/sub/x.py new file mode 100644 index 0000000..4f165cc --- /dev/null +++ b/007/m/sub/x.py @@ -0,0 +1,4 @@ +from ..foo import fn + +def x(): + fn() \ No newline at end of file diff --git a/007/magedu_007.iml b/007/magedu_007.iml new file mode 100644 index 0000000..ad3c0a3 --- /dev/null +++ b/007/magedu_007.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/007/main.py b/007/main.py new file mode 100644 index 0000000..f94c176 --- /dev/null +++ b/007/main.py @@ -0,0 +1,3 @@ +from foo import fn + +fn() \ No newline at end of file diff --git a/007/requirments.txt b/007/requirments.txt new file mode 100644 index 0000000..0502f92 --- /dev/null +++ b/007/requirments.txt @@ -0,0 +1,30 @@ +Jinja2==2.8 +MarkupSafe==0.23 +Pygments==2.1.3 +backports-abc==0.4 +decorator==4.0.9 +ipykernel==4.3.1 +ipython==4.1.2 +ipython-genutils==0.1.0 +ipywidgets==4.1.1 +jsonschema==2.5.1 +jupyter==1.0.0 +jupyter-client==4.2.0 +jupyter-console==4.1.1 +jupyter-core==4.0.6 +m==0.1.0 +mistune==0.7.2 +nbconvert==4.1.0 +nbformat==4.0.1 +notebook==4.1.0 +path.py==8.1.2 +pexpect==4.0.1 +pickleshare==0.6 +ptyprocess==0.5.1 +pyzmq==15.2.0 +qtconsole==4.2.0 +requests==2.9.0 +simplegeneric==0.8.1 +terminado==0.6 +tornado==4.3 +traitlets==4.1.0 diff --git a/007/setup.py b/007/setup.py new file mode 100644 index 0000000..df585d4 --- /dev/null +++ b/007/setup.py @@ -0,0 +1,8 @@ +from setuptools import setup, find_packages + +setup( + name='m', + version='0.1.0', + packages=find_packages(), + install_requires=['requests>=2.9.0'] +) diff --git "a/007/\346\250\241\345\235\227\345\214\226.ipynb" "b/007/\346\250\241\345\235\227\345\214\226.ipynb" new file mode 100644 index 0000000..97400eb --- /dev/null +++ "b/007/\346\250\241\345\235\227\345\214\226.ipynb" @@ -0,0 +1,341 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import sys" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Copyright (c) 2001-2014 Python Software Foundation.\\nAll Rights Reserved.\\n\\nCopyright (c) 2000 BeOpen.com.\\nAll Rights Reserved.\\n\\nCopyright (c) 1995-2001 Corporation for National Research Initiatives.\\nAll Rights Reserved.\\n\\nCopyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.\\nAll Rights Reserved.'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sys.copyright" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Copyright (c) 2001-2014 Python Software Foundation.\n", + "All Rights Reserved.\n", + "\n", + "Copyright (c) 2000 BeOpen.com.\n", + "All Rights Reserved.\n", + "\n", + "Copyright (c) 1995-2001 Corporation for National Research Initiatives.\n", + "All Rights Reserved.\n", + "\n", + "Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.\n", + "All Rights Reserved.\n" + ] + } + ], + "source": [ + "print(sys.copyright)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from os import path" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'c'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "path.basename('/a/b/c')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'c'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.path.basename('/a/b/c')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from os.path import basename" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'c'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "basename('/a/b/c')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import os.path" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import tornado.web" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class MainHandler(tornado.web.RequestHandler):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from tornado.web import RequestHandler" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class MainHandler(RequestHandler):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def basename():\n", + " return 'ha ha ha'" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from os import path" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from os.path import basename as os_basename" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'c'" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os_basename('/a/b/c')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'ha ha ha'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "basename()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import sys as system" + ] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/008/expr.py b/008/expr.py new file mode 100644 index 0000000..1e9e671 --- /dev/null +++ b/008/expr.py @@ -0,0 +1,61 @@ + + +from stack import Stack + +func_map = { + '+': lambda x, y: x+y, + '*': lambda x, y: x*y, + '/': lambda x, y: x/y, + '-': lambda x, y: x-y +} + +# (3 + 4) * 5 / ((2+3) *3) +def cacl(expr): + stack = Stack() + for c in expr: + if c in '(+-*/': + stack.push(c) + elif c.strip() == '': + pass + else: + if c != ')': + c = int(c) + if stack.top.value in '+-/*': + s = stack.pop() + if not isinstance(stack.top.value, (int, float)): + raise Exception('wrong expr') + v = stack.pop() + v = func_map[s](v, c) + stack.push(v) + else: + stack.push(c) + if c == ')': + if isinstance(stack.top.value, (int, float)): + v = stack.pop() + if stack.top.value == '(': + stack.pop() + stack.push(v) + else: + raise Exception('wrong expr') + else: + raise Exception('wrong expr') + while stack.top: + c = stack.pop() + if not isinstance(c, (int, float)): + raise Exception('wrong expr') + if stack.top.value in '+-/*': + s = stack.pop() + if not isinstance(stack.top.value, (int, float)): + raise Exception('wrong expr') + v = stack.pop() + v = func_map[s](v, c) + if stack.top is None: + return v + stack.push(v) + else: + raise Exception('wrong expr') + +if __name__ == '__main__': + print(cacl('(3 + 4) * 5 / ((2+3) *3)')) + +#TODO 实现带优先级的算术表达式解析 \ No newline at end of file diff --git a/008/heap.py b/008/heap.py new file mode 100644 index 0000000..2dd35f5 --- /dev/null +++ b/008/heap.py @@ -0,0 +1,77 @@ +import math +import random + + +class Heap: + def __init__(self): + self.__data = [] + + def insert(self, value): + self.__data.append(value) + idx = len(self.__data) - 1 + parent = math.floor((idx - 1) / 2) + while parent >= 0 and self.__data[parent] < value: + self.__data[idx] = self.__data[parent] + self.__data[parent] = value + idx = parent + parent = math.floor((idx - 1) / 2) + + def pop(self): + if not self.__data: + raise Exception('Empty') + ret = self.__data[0] + value = self.__data.pop() + self.__data[0] = value + idx = 0 + left = 2 * idx + 1 + right = 2 * idx + 2 + while len(self.__data) > left: + tmp_idx = left + if len(self.__data) > right and self.__data[right] > self.__data[left]: + tmp_idx = right + if self.__data[tmp_idx] > value: + self.__data[idx] = self.__data[tmp_idx] + self.__data[tmp_idx] = value + else: + return ret + idx = tmp_idx + left = 2 * idx + 1 + right = 2 * idx + 2 + return ret + + def remove(self, i): + if len(self.__data) - 1 < i: + raise Exception('Empty') + ret = self.__data[i] + value = self.__data.pop() + self.__data[i] = value + idx = i + left = 2 * idx + 1 + right = 2 * idx + 2 + while len(self.__data) > left: + tmp_idx = left + if len(self.__data) > right and self.__data[right] > self.__data[left]: + tmp_idx = right + if self.__data[tmp_idx] > value: + self.__data[idx] = self.__data[tmp_idx] + self.__data[tmp_idx] = value + else: + return ret + idx = tmp_idx + left = 2 * idx + 1 + right = 2 * idx + 2 + return ret + + def view(self): + print(self.__data) + +if __name__ == '__main__': + heap = Heap() + for _ in range(8): + i = random.randint(0, 100) + print('i is ', i) + heap.insert(i) + heap.view() + #heap.pop() + heap.remove(1) + heap.view() diff --git a/008/linklist.py b/008/linklist.py new file mode 100644 index 0000000..e41a528 --- /dev/null +++ b/008/linklist.py @@ -0,0 +1,69 @@ +class Node: + def __init__(self, data): + self.data = data + self.next = None + + +class LinkedList: + def __init__(self): + self.head = None + self.tail = None + + def append(self, data): + node = Node(data) + if self.head is None: + self.head = node + self.tail = node + else: + self.tail.next = node + self.tail = node + + def iter(self): + if not self.head: + return + cur = self.head + yield cur.data + while cur.next: + cur = cur.next + yield cur.data + + def insert(self, idx, value): + cur = self.head + cur_idx = 0 + while cur_idx < idx-1: + cur = cur.next + if cur is None: + raise Exception('list length less than index') + cur_idx += 1 + node = Node(value) + node.next = cur.next + cur.next = node + if node.next is None: + self.tail = node + + def remove(self, idx): + cur = self.head + cur_idx = 0 + while cur_idx < idx-1: + cur = cur.next + if cur is None: + raise Exception('list length less than index') + cur_idx += 1 + cur.next = cur.next.next + if cur.next is None: + self.tail = cur + +if __name__ == '__main__': + linked_list = LinkedList() + for i in range(10): + linked_list.append(i) + + linked_list.insert(3, 30) + + linked_list.remove(4) + + for node in linked_list.iter(): + print(node) + +#TODO 判空 +#TODO 实现 __len__ \ No newline at end of file diff --git a/008/map.py b/008/map.py new file mode 100644 index 0000000..13511a4 --- /dev/null +++ b/008/map.py @@ -0,0 +1,50 @@ +class Node: + def __init__(self, key, value): + self.key = key + self.value = value + + def __eq__(self, other): + return self.key == other.key + + +class Map: + def __init__(self, init_size, hash=hash): + self.__slot = [[] for _ in range(init_size)] + # for _ in range(init_size): + # self.__slot.append([]) + self.__size = init_size + self.hash = hash + + def put(self, key, value): + node = Node(key, value) + address = self.hash(node.key) % self.__size + self.__slot[address].append(node) + + def get(self, key, default=None): + _key = self.hash(key) + address = _key % self.__size + for node in self.__slot[address]: + if node.key == key: + return node.value + return default + + def remove(self, key): + address = self.hash(key) % self.__size + try: + self.__slot[address].remove(Node(key, None)) + except ValueError: + pass + # for idx, node in enumerate(self.__slot[address].copy()): + # if node.key == key: + # self.__slot[address].pop(idx) + + +if __name__ == '__main__': + map = Map(16) + + for i in range(20): + map.put(i, i) + + map.remove(3) + for i in range(20): + print(map.get(i, 'not set')) \ No newline at end of file diff --git a/008/rule_parser.py b/008/rule_parser.py new file mode 100644 index 0000000..f675fce --- /dev/null +++ b/008/rule_parser.py @@ -0,0 +1,105 @@ +# #expr# & | ! () + +# (#e1# & #e2#) |(!#e3# & #e4#) + +from stack import Stack +# '(#abc# & #324#) | (!#def# & #789#)' + +def match(exprs, line, fn): + stack = Stack() + is_expr = False + expr = [] + for c in exprs: + if c == '#': + if not is_expr: + is_expr = True + else: + is_expr = False + v = fn(line, ''.join(expr)) + expr = [] + if stack.top is None: + stack.push(v) + continue + s = stack.pop() + if s == '!': + v = not v + if stack.top is None: + stack.push(v) + continue + s = stack.pop() + if s == '&': + if isinstance(stack.top.value, bool): + v = stack.pop() and v + stack.push(v) + else: + raise Exception('wrong expr') + elif s == '|': + if isinstance(stack.top.value, bool): + v = stack.pop() or v + stack.push(v) + else: + raise Exception('wrong expr') + elif s == '(': + stack.push(s) + stack.push(v) + else: + raise Exception('wrong expr') + else: + if is_expr: + expr.append(c) + else: + if c in '(&!|': + stack.push(c) + elif c.strip() == '': + pass + elif c == ')': + v = stack.pop() + if not isinstance(v, bool): + raise Exception('wrong expr') + s = stack.pop() + if s == '!': + v = not v + s = stack.pop() + if s == '(': + stack.push(v) + else: + raise Exception('wrong expr') + else: + raise Exception('wrong expr') + + while stack.top: + v = stack.pop() + if not isinstance(v, bool): + raise Exception('wrong expr') + s = stack.pop() + if s == '!': + v = not v + s = stack.pop() + if s == '&': + v2 = stack.pop() + if not isinstance(v2, bool): + raise Exception('wrong expr') + v = v and v2 + elif s == '|': + v2 = stack.pop() + if not isinstance(v2, bool): + raise Exception('wrong expr') + v = v or v2 + else: + raise Exception('wrong expr') + if stack.top is None: + return v + else: + stack.push(v) + +if __name__ == '__main__': + import re + line = 'abc 123 def 456 asd 789' + exprs = '(#abc# & #324#) | (!#def# & #789#)' # False + + def callback(line, expr): + return re.match(expr, line) is not None + + print(match(exprs, line, callback)) + +#TODO 优化两个程序, 使其模块化 \ No newline at end of file diff --git a/008/stack.py b/008/stack.py new file mode 100644 index 0000000..f4915f3 --- /dev/null +++ b/008/stack.py @@ -0,0 +1,39 @@ +class Node: + def __init__(self, value): + self.value = value + self.next = None + + +class Stack: + def __init__(self): + self.top = None + + def push(self, value): + node = Node(value) + node.next = self.top + self.top = node + + def pop(self): + node = self.top + self.top = node.next + return node.value + + +if __name__ == '__main__': + stack = Stack() + exp = '({a * [x/(x+y)]}' + for c in exp: + if c in '{[(': + stack.push(c) + elif c in '}])': + v = stack.top.value + if c == '}' and v != '{': + raise Exception('failed') + if c == ']' and v != '[': + raise Exception('failed') + if c == ')' and v != '(': + raise Exception('failed') + stack.pop() + if stack.top is not None: + raise Exception('failed') + print("ok") diff --git a/008/tree.py b/008/tree.py new file mode 100644 index 0000000..46046f5 --- /dev/null +++ b/008/tree.py @@ -0,0 +1,108 @@ +from stack import Stack +from queue import Queue + + +class Node: + def __init__(self, value): + self.value = value + self.left = None + self.right = None + + +class Tree: + def __init__(self, node): + self.root = node + + def add_left(self, tree): + self.root.left = tree + + def add_right(self, tree): + self.root.right = tree + + @property + def left(self): + return self.root.left + + @property + def right(self): + return self.root.right + + def visit_first(self, fn): + fn(self.root.value) + if self.left: + self.left.visit_first(fn) + if self.right: + self.right.visit_first(fn) + + def visit_middle(self, fn): + if self.left: + self.left.visit_middle(fn) + fn(self.root.value) + if self.right: + self.right.visit_middle(fn) + + def visit_last(self, fn): + if self.left: + self.left.visit_last(fn) + if self.right: + self.right.visit_last(fn) + fn(self.root.value) + + def iter_visit_first(self, fn): + stack = Stack() + stack.push(self) + while stack.top: + p = stack.pop() + fn(p.root.value) + if p.right: + stack.push(p.right) + if p.left: + stack.push(p.left) + + def visit_level(self, fn): + queue = Queue() + queue.put(self) + + while not queue.empty(): + p = queue.get() + fn(p.root.value) + if p.left: + queue.put(p.left) + if p.right: + queue.put(p.right) + + +if __name__ == '__main__': + d = Tree(Node('D')) + e = Tree(Node('E')) + b = Tree(Node('B')) + b.add_left(d) + b.add_right(e) + f = Tree(Node('F')) + g = Tree(Node('G')) + c = Tree(Node('C')) + c.add_left(f) + c.add_right(g) + a = Tree(Node('A')) + a.add_left(b) + a.add_right(c) + + from functools import partial + p = partial(print, end='') + a.visit_first(p) + print() + a.iter_visit_first(p) + print() + a.visit_middle(p) + print() + a.visit_last(p) + print() + a.visit_level(p) + +#TODO 中序、后序便利的非第归方法 + +# ABDECFG first +# DBEAFCG middle +# DEBFGCA last + +# ABCDEFG \ No newline at end of file diff --git "a/Python\347\274\226\347\250\213\345\237\272\347\241\200.xmind" "b/Python\347\274\226\347\250\213\345\237\272\347\241\200.xmind" new file mode 100644 index 0000000..c1e630e Binary files /dev/null and "b/Python\347\274\226\347\250\213\345\237\272\347\241\200.xmind" differ diff --git a/notes/.python-version b/notes/.python-version new file mode 100644 index 0000000..bec3a35 --- /dev/null +++ b/notes/.python-version @@ -0,0 +1 @@ +system diff --git a/notes/20160221.adoc b/notes/20160221.adoc new file mode 100644 index 0000000..380353e --- /dev/null +++ b/notes/20160221.adoc @@ -0,0 +1,89 @@ += 课堂回顾 +2016-02-21 + +== 环境准备 + +=== 安装pyenv + +* yum -y install git gcc make patch zlib-devel gdbm-devel openssl-devel sqlite-devel bzip2-devel readline-devel +* curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash + +=== pyenv 使用 + +* pyenv install 3.4.2 +* pyenv virtualenv 3.4.2 magedu +* pyenv local magedu + +=== ipython 安装 + +* pip install ipython +* pip install jupyter +* jupyter notebook + + +== Python基础语法 + +=== 常量、变量、操作符、表达式 + +* 字面常量 +* 变量 +* 数据类型 +* 操作符 特别注意出发操作 / +* 操作符优先级 +* 表达式 特殊注意 逻辑操作的 *短路* + +=== 程序控制结构 + +==== 顺序结构 + +默认结构 + +==== 分支结构 + +* if 语句 +* if else 语句 +* if elif else 语句 +* 永远只有一个分支会被执行 + +=== 循环结构 +* while语句 +* for in 语句 +* for in的循环体里面永远不要修改迭代器 +* break语句 +* continue语句 +* else字句以及使用场景 + +== 内置数据结构 + +=== 列表 + +* 创建列表 [] list() +* 列表的增删改查操作 + +=== 元组 + +* 创建元组 () tupel() +* 元组不可变 +* 仅有的两个操作 index count + +=== 下标操作与切片 + +* 通过下标访问元素 +* 切片 返回一个区间 [start:stop:step] +* 切片的每个参数都可以是正整数,也可以是负整数 +* 切片每个参数的含义 +* 切片每个参数的默认值, start=0, stop=len(li) step=1 + +=== 集合 + +* 创建集合 {1, 2, 3},set() +* 集合的增删 +* 集合的集合操作 + +=== 字典 + +* 创建字典 {} , dict() +* 字典的遍历 keys, values, items +* get 方法, 当key不存在的时候返回默认值, 默认的默认值是None +* pop,popitem 方法, 从字典中删除元素 + diff --git a/notes/20160227-1.adoc b/notes/20160227-1.adoc new file mode 100644 index 0000000..8bd3a61 --- /dev/null +++ b/notes/20160227-1.adoc @@ -0,0 +1,25 @@ +== dict + +* 初始化 +* 获取元素, 下标操作和get +* 修改元素 +* 删除元素 pop popitem del +* 遍历 keys values items + + +== 列表解析 + +* 基本语法 [expr for item in iterator] +* 带条件 +* 带多个条件的 相当and +* 多个迭代器 相当于嵌套的循环 +* 集合解析 +* 字典解析 + + +== 字符串 + +* 字符串是线性结构 切片 成员运算符 可以迭代 +* 字符串格式化 print style, format方法 +* 字符串的若干操作 join split strip replace startswith endswith +* str 和bytes区别和相互转化 Python2 和Python3处理字符串的一些区别 diff --git a/notes/20160227-2.adoc b/notes/20160227-2.adoc new file mode 100644 index 0000000..ea096e0 --- /dev/null +++ b/notes/20160227-2.adoc @@ -0,0 +1,43 @@ +== 函数 + +=== 函数的基本语法 + +* 定义函数 +* 调用函数 + +=== 函数的参数 +* 基本语法 +* 位置参数和关键字参数 +* 默认参数 +* 可变参数 +* 参数的规则 +* 默认的坑 + +=== 函数的返回值 + +* 默认返回None +* 通过unpacking变相的返回多值 其实返回的是一个元组tuple +* 提前返回 + +=== 第归函数 + +* 调用自己的函数 +* 一定要有退出条件 +* 第归最大深度1000 +* 尽量少用第归 + +=== 变量作用域和全局变量 + +* 变量作用域 变量的可见范围 +* 全局变量 +* 局部作用域 赋值会生成新的局部变量, 除非global关键字 +* 尽量少用全局变量 +* globals() 和 locals() + +=== 函数的执行流程 + +=== 生成器 + +* 生成器的原理 +* 生成器的一些应用, 惰性求值, range xrange + diff --git a/notes/20160228.adoc b/notes/20160228.adoc new file mode 100644 index 0000000..32189ef --- /dev/null +++ b/notes/20160228.adoc @@ -0,0 +1,17 @@ +== 函数作为一等公民 first class + +=== 高阶函数 接收函数作为参数 + +=== 函数作为返回值 + +* 柯里化以及应用 +* functools.partial及其应用 + +=== 装饰器 + +* 装饰器的原理 +* 带参数的装饰器 +* 现实世界中的装饰 -- 装饰器的作用 +* functools.wraps 的作用 + +=== 匿名函数 diff --git a/notes/20160305-1.adoc b/notes/20160305-1.adoc new file mode 100644 index 0000000..8927122 --- /dev/null +++ b/notes/20160305-1.adoc @@ -0,0 +1,34 @@ += 面向对象 + +== 哲学、方法学 + +* 编程範式 +* OOP +* OOP 的三大特征 封装 继承 多态 +* OOP 的本质 对数据和行为的封装 + +== 类和对象 + +* 定义类 +* 定义方法, self指什么 +* 构造方法 __init__ +* __init__ 中的self是从那里来的, 以__init__ 方法作什么 + + +== 封装 + +* 实例级 只有实例可以访问 +** 实例变量 +** 实例方法 + +* 类级 类和实例都可以访问, 所有实例共享, 为什么对不变对象的重新复制,为什么其他实例不可见 +** 类变量 +** 类方法 + +* 私有与共有 +** 私有的只是类内部可以访问 +** 共有的, 类外部也可以访问 + +* 属性 property getter 和 setter + + diff --git a/notes/20160305-2.adoc b/notes/20160305-2.adoc new file mode 100644 index 0000000..db2d7fc --- /dev/null +++ b/notes/20160305-2.adoc @@ -0,0 +1,19 @@ +== 继承 + +* 继承一般语法 +* 默认继承自object +* 父类对子类的可见性 父类的私有变量和私有方法 对子类是不可见 +* super 方法和 super对象 + +== 多继承 +* 允许多继承 +* mro与C3算法 +* 尽量避免使用多继承 +* MixIn 用法,原则 + +== 魔术方法/特殊方法 + +* 总是以双下划线开始,双下划线结束 +* 实例的创建与销毁 +* 实例的可视化 repr str bytes +* 比较运算符的重载 diff --git a/notes/20160307.adoc b/notes/20160307.adoc new file mode 100644 index 0000000..fd3c162 --- /dev/null +++ b/notes/20160307.adoc @@ -0,0 +1,10 @@ +== 魔术方法 + +* bool 与 \\__bool__ \\__len__ +* hash 与 \\__hash__ +* 反射 \\__dict__ \\__dir__ \\__getattr__ \\__setattr__ dir getattr setattr +* 描述器 \\__get__ \\__set__ \\__delete__ +* 描述器 其实是一个方法传递 instance.property 等价于 Class.property.\\__get__(instance, Class) +* instance.property = value 等价于 Class.property.\\__set__(instance, value) +* del instance.property 等价于 Class.proppert.\\__delete__(instance) +* @property @classmathod diff --git "a/000_\347\216\257\345\242\203\345\207\206\345\244\207.adoc" "b/presentations/000_\347\216\257\345\242\203\345\207\206\345\244\207.adoc" similarity index 100% rename from "000_\347\216\257\345\242\203\345\207\206\345\244\207.adoc" rename to "presentations/000_\347\216\257\345\242\203\345\207\206\345\244\207.adoc" diff --git "a/001_\345\237\272\347\241\200\350\257\255\346\263\225.adoc" "b/presentations/001_\345\237\272\347\241\200\350\257\255\346\263\225.adoc" similarity index 98% rename from "001_\345\237\272\347\241\200\350\257\255\346\263\225.adoc" rename to "presentations/001_\345\237\272\347\241\200\350\257\255\346\263\225.adoc" index 91bbcee..badadfd 100644 --- "a/001_\345\237\272\347\241\200\350\257\255\346\263\225.adoc" +++ "b/presentations/001_\345\237\272\347\241\200\350\257\255\346\263\225.adoc" @@ -192,7 +192,7 @@ Python中有两种循环结构: * `for` 语句 === `while` 语句 -循环执行,直到满足条件,循环体内修改条件 +循环执行,知道条件不满足,循环体内修改条件 [source,python] ---- while condition: diff --git "a/002_\345\206\205\347\275\256\345\256\271\345\231\250.adoc" "b/presentations/002_\345\206\205\347\275\256\345\256\271\345\231\250.adoc" similarity index 100% rename from "002_\345\206\205\347\275\256\345\256\271\345\231\250.adoc" rename to "presentations/002_\345\206\205\347\275\256\345\256\271\345\231\250.adoc" diff --git "a/003_\345\255\227\347\254\246\344\270\262\344\270\216\346\226\207\346\234\254\346\223\215\344\275\234.adoc" "b/presentations/003_\345\255\227\347\254\246\344\270\262\344\270\216\346\226\207\346\234\254\346\223\215\344\275\234.adoc" similarity index 100% rename from "003_\345\255\227\347\254\246\344\270\262\344\270\216\346\226\207\346\234\254\346\223\215\344\275\234.adoc" rename to "presentations/003_\345\255\227\347\254\246\344\270\262\344\270\216\346\226\207\346\234\254\346\223\215\344\275\234.adoc" diff --git "a/004_\345\207\275\346\225\260.adoc" "b/presentations/004_\345\207\275\346\225\260.adoc" similarity index 100% rename from "004_\345\207\275\346\225\260.adoc" rename to "presentations/004_\345\207\275\346\225\260.adoc" diff --git "a/presentations/005_\351\235\242\345\220\221\345\257\271\350\261\241.adoc" "b/presentations/005_\351\235\242\345\220\221\345\257\271\350\261\241.adoc" new file mode 100644 index 0000000..f1358f2 --- /dev/null +++ "b/presentations/005_\351\235\242\345\220\221\345\257\271\350\261\241.adoc" @@ -0,0 +1,370 @@ += 面向对象 +comyn +v1.0 +:source-highlighter: pygments +:revealjs_history: false +:revealjs_center: false +:revealjs_embedded: true +:revealjsdir: ../reveal.js +:imagesdir: ../assets/images/5 +:homepage: http://www.magedu.com + +== 编程范式 + +[%step] +* 编程范式指的是软件工程中的一种方法学 +* 常见的编程范式有:OOP、FP、PP、IP +* 通常每种语言都会提倡一些范式,也有的语言支持多种范式 +* Python是一种多范式语言,但是对OOP支持最好 + +== OOP的基本概念 + +=== 基本哲学 + +[%step] +* 世界是由对象组成的 +* 对象具有运动规律和内部状态 +* 对象之间的相互作用和通讯构成世界 + +=== 对象的特性 + +[%step] +* 唯一性:世界上没有两片相同的树叶 +* 分类性:分类是对现实世界的抽象 + +=== OOP的三大特征 + +[%step] +* 继承 +* 多态 +* 封装 + +=== 面向对象的本质 + +[%step] +* 面向对象是对数据和行为的封装 +* 但是有时候,数据仅仅是数据,方法仅仅是方法 + +== 组织数据 + +=== ! + +[source,python] +---- +data = (13, 63, 5, 378, 58, 40) + +def avg(data): + return sum(data) / len(data) + +print(avg(data)) +---- + + +=== 门的例子 + +[%step] +* 数据:门牌号、 打开/关闭的状态 +* 操作:打开、关闭 + +=== 过程化的组织方法 + +[source,python] +---- +door1 = [1, 'closed'] +door2 = [1, 'closed'] + +def open_door(door): + door[1] = 'opening' + return door + +def close_door(door): + door[1] = 'close' + return door +---- + +=== 面向对象的组织方法 + +[source,python] +---- +class Door(object): + def __init__(self, number, status): + self.number = number + self.status = status + + def open(self): + self.status = 'opening' + + def close(self): + self.status = 'closed' +---- + + +== 类的定义与初始化 + +=== 定义类 + +[%step] +[source,python] +---- +class ClassName: +---- + +[source,python] +---- +class ClassName(parents): +---- + +=== 定义方法 + +[source,python] +---- +class ClassName(object): + def method_name(self, args): # <1> <2> + pass +---- +<1> 第一个参数必须是 `self` 其他的和定义函数没有区别 +<2> `self` 是一个变量,指向对象本身。`self` 可以是任意合法的变量名 + +=== 构造方法 + +[source,python] +---- +class ClassName(object): + def __init__(self, arg): + pass +---- + +=== 实例化 + +[source,python] +---- +instance = ClassName(arg) # <1> +---- +<1> 对象的实例化,其实是调用了类的构造方法。但是 `self` 参数无需传入,解释器会自动传入。 + +=== 关于构造函数中的 `self` + +[%step] +* 我们说 `实例化其实是调用构造方法` +* 我们还说 `self指向对象本身` +* 那么,调用构造方法的时候 `self` 是什么鬼? + +=== 关于构造函数中的 `self` + +事实上, `\\__init__` 方法并非实例化时执行的第一个方法。当Python实例化一个对象时, 首先调用的是 `\\__new__` 方法,`\\__new__` 方法的第一个参数指向类本身。并且返回类的一个实例。 这个实例正是传递给 `\\__init__` 的 `self` 。所以严格的讲,`\\__new__` 方法才是真正创建实例的方法, 而 `\\__init__` 方法只是初始化实例的数据。 + + +== 访问控制 + +=== 实例变量和实例方法 + +* 任意实例方法内都可以定义定义实例变量, 通常在构造方法中定义 +* 定义在类中、不加任何装饰器,第一个参数是 `self` 的方法都叫做实例方法 +* 实例变量和实例方法绑定到特定的实例 + +=== 私有成员 + +* 以双下划线开始 +* 不以双下划线结束 + +=== 类变量和类方法 + +* 类变量定义在所有方法之外 +* 类方法使用 `@classmethod` 装饰器装饰 +* 类方法的第一个参数指向类本身, 通常使用 `cls` 命名 +* 相对于实例变量和实例方法, 类变量和类方法绑定到特定的类 + +=== 静态方法 + +* 使用 `@staticmethod` 装饰器装饰 +* 首参无特殊要求 +* 静态方法和普通的函数没有区别 + +=== 属性 + +* 使用 `@property`装饰器装饰的方法 +* 属性有 `getter` 、 `setter` 和 `deleter` + +== 继承 + +=== 单继承 + +[source,python] +---- +class A(object): + pass + +class B(A): + pass +---- + +=== 重写与super +* 子类中定义父类的同名方法,称之为重写 +* 子类中调用父类的方法, 使用super对象 +* super对象使用super方法生成 + +=== 多继承 + +[source,python] +---- +class A(object): + pass + +class B(object): + pass + +class C(A, B): + pass +---- + +=== 多继承与方法选取 + +[source,python] +---- +class A(object): + def method(self): + print('method of A') + +class B(object): + def method(self): + print('method of B') + +class C(A, B): + pass + +class D(B, A): + pass + +c = C() +c.method() + +d = D() +d.method() +---- + +=== 多继承与方法选取 + +[source,python] +---- +class A(object): + def method(self): + print('method of A') + +class B(A): + def method(self): + print('method of B') + +class C(A, B): + pass + +class D(B, A): + pass + +c = C() +c.method() +d = D() +d.method() +---- + +=== MRO + +* method resolution order +* 本地优先级: 根据声明顺序从左往右查找 +* 单调性:所有子类中,也应满足其查找顺序 + +=== C3算法 + +[source] +---- +class B(O) -> mro(B) = [B, O] +class B(A1, A2, ...) -> mro(B) = [B] + merge(mro(A1), mro(A2), ... , [A1, A2, ...]) +---- + +=== C3算法的merge步骤 + +* 顺序遍历列表 +* 首元素满足一下条件,否则遍历下一个序列 +** 在其他序列也是首元素 +** 在其他序列里不存在 +* 从所有序列中移除此元素,合并到MRO序列中 +* 重复执行,直到所有序列为空或无法执行下去 + +=== Mixin + +* mixin通过多重集成实现 +* mixin是组合的一种方式 +* mixin类通常需要满足: +** 不能单独生成实例 +** 不能继承非Mixin的类 + +== 专有方法/魔术方法 + +* 总是以双下划线开始 +* 总是以双下划线结束 + +=== 对象创建与销毁 + +* `\__new__(cls [, ...])` 创建对象 +* `\__init__(self [, ...])` 初始化对象 +* `\__del__(self)` 销毁对象时调用 + +=== 可视化对象 + +* `\\__str__(self)` 当调用 `str(obj)` 时调用此方法, 必须返回一个 `str` +* `\\__bytes__(self)` 当调用 `bytes(obj)` 时调用此方法, 必须返回一个 `bytes` +* `\\__repr__(self)` 当调用 `repr(obj)` 时调用此方法,直接print一个对象时,会自动调用 `repr` 方法 + +=== 比较运算符重载 + +[cols="6,2", options="header"] +|=== +|函数原型|运算符 +|obj.\\__lt__(self, other)| obj < other +|obj.\\__le__(self, other)| obj \<= other +|obj.\\__eq__(self, other)| obj == other +|obj.\\__ne__(self, other)| obj != other +|obj.\\__gt__(self, other)| obj > other +|obj.\\__ge__(self, other)| obj >= other +|=== + +=== `\\__hash__` 与可hash对象 + +* 当调用 `hash(obj)` 时, 事实上调用的是 `obj.\\__hash__()` +* 一个对象,实现了 `__hash__(self)` 方法, 称为可hash对象 + + +=== `\\__bool__` 方法与bool判断 + +* `\\__bool__` 方法总是返回 `True` 或 `False` +* 当定义了 `\\__bool__` 方法时, 调用 `bool(obj)` 实际调用的是 `\\__bool__` 方法 +* 当未定义 `\\__bool__` 方法时, 调用 `bool(obj)` 会调用 `\\__len__` 方法, 返回0时为False, 非0时为True +* 当 `\\__bool__` 和 `__len__` 都未定义时, `bool(obj)` 永远返回 `True` +* `if` 和 `while` 等语句的条件,如果不是bool类型, 会自动使用 `bool` 方法,转化为bool类型 + +=== `\\__call__` 与可调用对象 + +* 当一个对象实现了 `\\__call__` 方法, 那么它就是一个可调用对象 +* 可调用对象可以向函数一样调用 + + +=== `\\__enter__ \\__exit__` 与 `with` 语句 + +* `with` 语法与用途 +* `\\__enter__` 方法进入 +* `\\__exit__` 方法清理现场 + +=== 反射 + +* `\\__getattr__` 与 `\\__getattribute__` +* `\\__setattr__` +* `\\__delattr__` +* `\\__dir__` +* `\\__dict__` 与 `\\__slots__` + + +=== 描述器 + +* `\\__get__` +* `\\__set__` +* `\\__delete__` +* 用类实现装饰器 diff --git a/property_classmethod.ipynb b/property_classmethod.ipynb new file mode 100644 index 0000000..99f55c8 --- /dev/null +++ b/property_classmethod.ipynb @@ -0,0 +1,370 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Property:\n", + " def __init__(self, fget=None, fset=None, fdel=None):\n", + " self.fget = fget\n", + " self.fset = fset\n", + " self.fdel = fdel\n", + " \n", + " def __get__(self, instance, cls):\n", + " if self.fget is not None:\n", + " return self.fget(instance)\n", + " else:\n", + " raise AttributeError('property not define getter')\n", + " \n", + " def __set__(self, instance, value):\n", + " if self.fset is not None:\n", + " self.fset(instance, value)\n", + " else:\n", + " raise AttributeError('property not define setter')\n", + " \n", + " def __delete__(self, instance):\n", + " if self.fdel is not None:\n", + " self.fdel(instance)\n", + " else:\n", + " raise AttributeError('property not define deleter')\n", + " \n", + " def setter(self, fset):\n", + " self.fset = fset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "Spam.x.__get__(spam, Spam)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Spam:\n", + " def __init__(self, x):\n", + " self.__x = x\n", + " \n", + " #@Property\n", + " def x(self):\n", + " return self.__x\n", + " \n", + " #@x.setter\n", + " def set_x(self, x):\n", + " self.__x = x" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "x() missing 1 required positional argument: 'self'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\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[0mSpam\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: x() missing 1 required positional argument: 'self'" + ] + } + ], + "source": [ + "Spam.x()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "spam = Spam(6)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Spam.x(spam)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "spam = Spam(3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spam.x" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "spam.x = 4" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spam.x" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class ClassMethod:\n", + " def __init__(self, fn):\n", + " self.fn = fn\n", + " \n", + " def __get__(self, instance, cls):\n", + " def wrap(*args, **kwargs):\n", + " return self.fn(cls, *args, **kwargs)\n", + " return wrap" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Grok:\n", + " x = '123'\n", + " \n", + " #@ClassMethod\n", + " def method(cls):\n", + " print(cls.x)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "123\n" + ] + } + ], + "source": [ + "Grok.method(Grok)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "grok = Grok()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "123\n" + ] + } + ], + "source": [ + "grok.method()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git "a/\345\244\215\344\271\240.ipynb" "b/\345\244\215\344\271\240.ipynb" new file mode 100644 index 0000000..6b74aee --- /dev/null +++ "b/\345\244\215\344\271\240.ipynb" @@ -0,0 +1,853 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def info(fn):\n", + " def wrap(*args, **kwargs):\n", + " print(fn.__name__)\n", + " kwargs['message'] = 'fuck {0}'.format(kwargs['message'])\n", + " return fn(*args, **kwargs)\n", + " return wrap" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@info\n", + "def p(message):\n", + " print(message)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p\n", + "fuck test\n" + ] + } + ], + "source": [ + "p(message='test')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "info(p)('test')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "routes = {}\n", + "def router(url):\n", + " def wrap(fn):\n", + " routes[url] = fn\n", + " return fn\n", + " return wrap" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@router('/')\n", + "def index():\n", + " print('test')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'/': }" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "routes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'/': }" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "routes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Context" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Context:\n", + " def __enter__(self):\n", + " print('enter context')\n", + " \n", + " def __exit__(self, *args, **kwargs):\n", + " print('exit context')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "enter context\n", + "ha ha ha\n", + "exit context\n" + ] + } + ], + "source": [ + "with Context():\n", + " print('ha ha ha')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Require:\n", + " def __init__(self, perm, env):\n", + " self.perm = perm\n", + " self.env = env\n", + " \n", + " def __enter__(self):\n", + " if self.env.perm!= self.perm:\n", + " raise Exception('require {0}'.format(self.perm))\n", + " \n", + " def __exit__(self, *args, **kwargs):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Env:\n", + " def __init__(self, perm):\n", + " self.perm = perm" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i want write something\n" + ] + } + ], + "source": [ + "with Require('write', Env('write')):\n", + " print('i want write something')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " def __init__(self):\n", + " self.x = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a = A()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " 'x']" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.x" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "getattr(a, 'x')" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class ConfigValues:\n", + " def __init__(self):\n", + " self.a = 0\n", + " self.b = 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "xxxxx = a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "cfg.get('xxxx')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "getattr(ConfigValues(), cfg.get('xxxxx'), default)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "getattr(matcher, 'metch', default)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Spam:\n", + " x = 0\n", + " \n", + " def method(self):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "spam = Spam()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "spam.x -> Spam.x.__get__(spam, Spam)\n", + "spam.x = value -> Spam.x.__set__(spam, value)\n", + "del spam.x -> Spam.x.__delete__(spam)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Positive:\n", + " def __init__(self, name):\n", + " self.name = name\n", + " \n", + " def __set__(self, instance, value):\n", + " if value < 0:\n", + " raise Exception('{0} must be positive')\n", + " instance.__dict__[self.name] = value\n", + "\n", + " def __get__(self, instance, cls):\n", + " #return instance.__dict__[self.name]\n", + " return 0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Point:\n", + " x = Positive('x')\n", + " y = Positive('y')\n", + " \n", + " def __init__(self, x, y):\n", + " self.x = x\n", + " self.y = y\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "p = Point(3, 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p.x" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "p.x = 1000000" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p.x" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " 'x',\n", + " 'y']" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(p)" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'x': 1000000, 'y': 5}" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p.__dict__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ".x.__get__(<__main__.Point object at 0x7fdfc805e2b0>, )\n" + ] + }, + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p.x # -> Point.x.__get__(p, Point)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p.y" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "Exception", + "evalue": "{0} must be positive", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mException\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[0mp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36m__set__\u001b[1;34m(self, instance, value)\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__set__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minstance\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mvalue\u001b[0m \u001b[1;33m<\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 7\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'{0} must be positive'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 8\u001b[0m \u001b[0minstance\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__dict__\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mException\u001b[0m: {0} must be positive" + ] + } + ], + "source": [ + "p.x = -3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Entity:\n", + " id = Column('id', type=int, unique=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class A:\n", + " @staticmethod\n", + " def a():\n", + " print('A.a')" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A.a\n" + ] + } + ], + "source": [ + "A.a()" + ] + }, + { + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}