From 9200a3efdb986ab7755e099c362cb230feb38efd Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Thu, 7 May 2020 09:24:06 +0800 Subject: [PATCH 01/27] 2020.5.7. edit Readme file --- README.md | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0556581..23442bb 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,43 @@ 今后,我们也准备用视频等方式来进行推广,敬请期待。 -从 2016 年开始,有不少同事和朋友参与了这套材料的编辑,稍后详细列出,一并感谢。 +从 2016年底开始,有不少同事和朋友参与了这套材料的编辑,特别感谢张怿檬。 + +--- + +Python Basic 入门教程 + +Python Basic Lesson 01 - 简介.ipynb + +Python Basic Lesson 02 - 变量, print, input.ipynb + +Python Basic Lesson 03 - 循环 for, 字符串.ipynb + +Python Basic Lesson 04 - 列表 list.ipynb + +Python Basic Lesson 05 - 字典 dict, 元组 tuple.ipynb + +Python Basic Lesson 06 - 随机数.ipynb + +Python Basic Lesson 07 - 文件目录操作.ipynb + +Python Basic Lesson 08 - 函数简介.ipynb + +Python Basic Lesson 09 - 日期函数.ipynb + +Python Basic Lesson 10 - 函数参数和匿名函数.ipynb + +Python Basic Lesson 11 - 集合库 collections.ipynb + +Python Basic Lesson 12 - 列表生成式.ipynb + +Python Basic Lesson 13 - 完整的 for 语句结构和 pprint.ipynb + +Python Basic Lesson 14 - 访问网络 requests.ipynb + +Python Basic Lesson 15 - 图片处理 Pillow.ipynb + +Python Basic Lesson 16 - 函数式编程.ipynb + 遵循 GNU GENERAL PUBLIC LICENSE Version 3 协议。未经授权,不得用于商业用途。 From 8063bba3aa19c8ecf2251319943c15857015840b Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Thu, 7 May 2020 18:49:07 +0800 Subject: [PATCH 02/27] 2020.5.7 small edit --- ...5\217\230\351\207\217, print, input.ipynb" | 282 ++++++++++-------- ...345\255\227\347\254\246\344\270\262.ipynb" | 6 +- ...245\345\222\214requests\345\214\205.ipynb" | 3 +- 3 files changed, 155 insertions(+), 136 deletions(-) rename "python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234 requests.ipynb" => "python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234\345\210\235\346\255\245\345\222\214requests\345\214\205.ipynb" (99%) diff --git "a/python_study_basic_notebook/Python Basic Lesson 02 - \345\217\230\351\207\217, print, input.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 02 - \345\217\230\351\207\217, print, input.ipynb" index d190ab7..34ce05e 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 02 - \345\217\230\351\207\217, print, input.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 02 - \345\217\230\351\207\217, print, input.ipynb" @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -59,17 +59,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], + "outputs": [], "source": [ "flag = False # 布尔值\n", "\n", @@ -81,15 +73,7 @@ "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 2 1\n" - ] - } - ], + "outputs": [], "source": [ "# 多个变量赋值, Python 的写法比较简洁\n", "\n", @@ -100,17 +84,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello Hello\n" - ] - } - ], + "outputs": [], "source": [ "# 字符串变量赋值\n", "\n", @@ -120,17 +96,9 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 5, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 2 3\n" - ] - } - ], + "outputs": [], "source": [ "# 多个变量赋值\n", "\n", @@ -140,17 +108,9 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 6, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2 1\n" - ] - } - ], + "outputs": [], "source": [ "# 交换变量\n", "\n", @@ -171,20 +131,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 7, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "\n", - "s\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# 定义一个整数变量\n", "a = 1\n", @@ -213,17 +162,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ABC\n" - ] - } - ], + "outputs": [], "source": [ "# 改变变量的内容\n", "\n", @@ -235,18 +176,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 9, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1484255105584\n", - "1484213441648\n" - ] - } - ], + "outputs": [], "source": [ "# 用 id() 可以得到变量的内存地址\n", "\n", @@ -256,19 +188,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "140707816582640\n", - "140707816582672\n", - "140707816582640\n" - ] - } - ], + "outputs": [], "source": [ "# 指向同一个变量内容的变量内存地址其实是一样的\n", "# 注意id(100)的地址和a 的地址是一样的\n", @@ -282,18 +204,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 11, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "140707816582640\n", - "140707816582704\n" - ] - } - ], + "outputs": [], "source": [ "# 变量内容发生变化后,内存地址会发生变化\n", "\n", @@ -304,23 +217,23 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1484255064464\n", - "1484255065072\n" + "4560441072\n", + "4560441168\n" ] } ], "source": [ "# 指向同一个变量内容的变量内存地址这里又不一样了\n", "\n", - "a = 300\n", - "b = 300\n", + "a = 257\n", + "b = 257\n", "print(id(a))\n", "print(id(b))" ] @@ -329,7 +242,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Python 有一些很优雅的设计,来提升性能,对于0-255这些常用的数字,Python 内部是有缓存的。" + "Python 有一些很优雅的设计,来提升性能,对于0-256这些常用的数字,Python 内部是有缓存的。" ] }, { @@ -349,7 +262,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -372,9 +285,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name:david\n", + "hello david\n" + ] + } + ], "source": [ "# 先通过输入内容到变量,然后再输出\n", "\n", @@ -393,24 +315,53 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "small\n" + ] + } + ], "source": [ "# 根据变量a 的值来判断\n", "\n", "a = 10\n", "if a > 10:\n", " print('big')\n", + " g=0\n", "else:\n", " print('small')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "10\n", + "11\n", + "12\n" + ] + } + ], "source": [ "for i in range(13):\n", " print(i)" @@ -425,9 +376,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "h\n", + "e\n", + "l\n", + "l\n", + "o\n" + ] + } + ], "source": [ "for i in 'hello':\n", " print(i)" @@ -435,9 +398,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The length of hello is 5\n" + ] + } + ], "source": [ "# 支持格式化的 print\n", "\n", @@ -448,9 +419,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello from English\n", + "hello from English\n" + ] + } + ], "source": [ "# 更加好,更加 pythonic 的写法:format函数-增强的格式化字符串函数\n", "# 关于format的更多细节,参见 https://docs.python.org/zh-cn/3/library/string.html#format-string-syntax\n", @@ -463,9 +443,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The length of hello is 5\n" + ] + } + ], "source": [ "# 支持格式化的 print 的另外一种写法\n", "\n", @@ -509,9 +497,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 3.142\n", + "pi = 3.142\n", + "000003.142\n", + "3.142 \n", + "+3.141593\n" + ] + } + ], "source": [ "# 格式化 print 举例\n", "\n", @@ -541,13 +541,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'a is 3.142'" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "a = 3.141592653 \n", "f'a is {a:10.3f}'" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git "a/python_study_basic_notebook/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" index 3db2ff2..acd8872 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" @@ -426,7 +426,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -456,7 +456,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -492,7 +492,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 18, "metadata": {}, "outputs": [ { diff --git "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234 requests.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234\345\210\235\346\255\245\345\222\214requests\345\214\205.ipynb" similarity index 99% rename from "python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234 requests.ipynb" rename to "python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234\345\210\235\346\255\245\345\222\214requests\345\214\205.ipynb" index 7e8a656..84bd9c4 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234 requests.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234\345\210\235\346\255\245\345\222\214requests\345\214\205.ipynb" @@ -4,13 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Lesson 13\n", + "#### Lesson 14 访问网络初步和 requests 包\n", "\n", "* v1.0.0 2016.11 by David.Yi\n", "* v1.1 2020.5 edit by David Yi\n", "\n", "\n", "## 本次内容要点\n", + "* requests 包介绍\n", "* 访问网页\n", "* 调用接口\n", "* 思考一下" From d516c0702053c908f80da8f90f18b68c826ee5f2 Mon Sep 17 00:00:00 2001 From: yijun_hp_ZHAN Date: Sun, 10 May 2020 21:31:40 +0800 Subject: [PATCH 03/27] =?UTF-8?q?2020.5.10=20=E5=AE=8C=E5=96=84=20Lesson?= =?UTF-8?q?=204=EF=BC=8C5=EF=BC=8C6=EF=BC=8C7=EF=BC=8C8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... 04 - \345\210\227\350\241\250 list.ipynb" | 49 +-- ...ict, \345\205\203\347\273\204 tuple.ipynb" | 329 ++++++++++++++---- ...351\232\217\346\234\272\346\225\260.ipynb" | 8 +- ...345\275\225\346\223\215\344\275\234.ipynb" | 299 +++++++++++++--- ...346\225\260\347\256\200\344\273\213.ipynb" | 39 ++- 5 files changed, 566 insertions(+), 158 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" index 49278d1..1bc874a 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -73,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": { "scrolled": true }, @@ -100,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -119,7 +119,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -139,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -160,7 +160,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -186,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -207,7 +207,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -229,7 +229,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -252,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -287,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -305,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -327,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -361,7 +361,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -382,7 +382,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -403,7 +403,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -422,7 +422,7 @@ " 'sort']" ] }, - "execution_count": 17, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -450,7 +450,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -459,7 +459,7 @@ "text": [ "1.0\n", "0.8571428571428571\n", - "0.2857142857142857\n", + "0.11764705882352941\n", "0.5833333333333334\n" ] } @@ -506,8 +506,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "please input name : david\n", - "david not find\n" + "please input name : Ch\n", + "Do you want to find ['Chris']?0\n", + "Chris\n" ] } ], @@ -540,14 +541,14 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Enter number2\n", + "Enter number12\n", "Number \n" ] } @@ -562,7 +563,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 21, "metadata": {}, "outputs": [ { diff --git "a/python_study_basic_notebook/Python Basic Lesson 05 - \345\255\227\345\205\270 dict, \345\205\203\347\273\204 tuple.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 05 - \345\255\227\345\205\270 dict, \345\205\203\347\273\204 tuple.ipynb" index 97c9307..3a65e85 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 05 - \345\255\227\345\205\270 dict, \345\205\203\347\273\204 tuple.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 05 - \345\255\227\345\205\270 dict, \345\205\203\347\273\204 tuple.ipynb" @@ -52,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -75,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -95,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -123,7 +123,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -131,10 +131,10 @@ "evalue": "'Tommy'", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# 去获得不存在的 key 的 value,会报错\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Tommy'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m: 'Tommy'" + "\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[0;32m 1\u001b[0m \u001b[1;31m# 去获得不存在的 key 的 value,会报错\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[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0md\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Tommy'\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;31mKeyError\u001b[0m: 'Tommy'" ] } ], @@ -145,9 +145,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Tom': 95, 'Mary': 90, 'Tracy': 92}\n", + "{'Mary': 90, 'Tracy': 92}\n" + ] + } + ], "source": [ "# 字典删除 key\n", "\n", @@ -161,9 +170,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'id_0': 0, 'id_1': 3, 'id_2': 6, 'id_3': 9, 'id_4': 12, 'id_5': 15, 'id_6': 18, 'id_7': 21, 'id_8': 24, 'id_9': 27, 'id_10': 30, 'id_11': 33, 'id_12': 36, 'id_13': 39, 'id_14': 42, 'id_15': 45, 'id_16': 48, 'id_17': 51, 'id_18': 54, 'id_19': 57, 'id_20': 60, 'id_21': 63, 'id_22': 66, 'id_23': 69, 'id_24': 72, 'id_25': 75, 'id_26': 78, 'id_27': 81, 'id_28': 84, 'id_29': 87}\n", + "30\n" + ] + } + ], "source": [ "# 获得字典的长度\n", "\n", @@ -198,9 +216,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('Tom', 'Jerry', 'Mary')\n" + ] + } + ], "source": [ "# 创建元组,用小括号\n", "\n", @@ -210,9 +236,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Jerry\n" + ] + } + ], "source": [ "# 访问元组的元素\n", "\n", @@ -221,9 +255,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'tuple' object has no attribute 'append'", + "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[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;31m# 会报错\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Someone'\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: 'tuple' object has no attribute 'append'" + ] + } + ], "source": [ "# 元组创建后是不能修改的\n", "\n", @@ -233,9 +279,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "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[0;32m 3\u001b[0m \u001b[1;31m# 像列表一样去定义值也会报错\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;31m# 'tuple' object does not support item assignment\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[0mt\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'aaa'\u001b[0m\u001b[1;33m\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": [ "# 元组创建后是不能修改的\n", "\n", @@ -246,9 +304,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']\n" + ] + } + ], "source": [ "# 看看 tuple 有什么方法,你会发现很少\n", "\n", @@ -257,9 +323,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(['A', 'B', 'C'], 100, 200)\n" + ] + } + ], "source": [ "# 创建复杂一点的元组\n", "\n", @@ -270,9 +344,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['A', 'B', 'C']\n", + "(['A', 'B', 'C'], 100, 200)\n", + "['A', 'B', 'C', 'D']\n", + "(['A', 'B', 'C', 'D'], 100, 200)\n" + ] + } + ], "source": [ "# 变通的实现\"可变\"元组内容\n", "\n", @@ -290,9 +375,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "(1,)\n" + ] + } + ], "source": [ "# 创建只有1个元素的元组\n", "\n", @@ -330,9 +425,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Building prefix dict from the default dictionary ...\n", + "Loading model from cache C:\\Users\\yijun\\AppData\\Local\\Temp\\jieba.cache\n", + "Loading model cost 0.555 seconds.\n", + "Prefix dict has been built successfully.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Full Mode: 今天/ 天上/ 上海/ 的/ 天气/ 怎么/ 怎么样\n" + ] + } + ], "source": [ "import jieba\n", "\n", @@ -345,9 +458,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Default Mode: 明天/ 纽约/ 下雨/ 么\n" + ] + } + ], "source": [ "# 精确模式\n", "# 试图将句子最精确的切开,适合文本分析\n", @@ -358,9 +479,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "现在, 天气, 怎么样\n" + ] + } + ], "source": [ "# 默认是精确模式\n", "\n", @@ -370,9 +499,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "小明, 硕士, 毕业, 于, 中国科学院, 计算所, ,, 后, 在, 日本京都大学, 深造\n" + ] + } + ], "source": [ "# 默认是精确模式\n", "\n", @@ -382,9 +519,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造\n" + ] + } + ], "source": [ "# 搜索引擎模式\n", "# 在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词 \n", @@ -395,9 +540,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "黑夜, 总会, 过去\n", + "黑夜, 夜总会, 总会, 过去\n" + ] + } + ], "source": [ "# 看看网络上的段子,分词带来的烦恼\n", "\n", @@ -409,9 +563,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2016,年,第一季度,支付,事业部,交易量,报表\n" + ] + } + ], "source": [ "# 默认是精确模式\n", "seg_list = jieba.cut(\"2016年第一季度支付事业部交易量报表\") \n", @@ -420,9 +582,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2016\n", + "年\n", + "第一季度\n", + "支付\n", + "事业部\n", + "交易量\n", + "报表\n" + ] + } + ], "source": [ "# 默认是精确模式\n", "seg_list = jieba.cut(\"2016年第一季度支付事业部交易量报表\") \n", @@ -432,9 +608,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "我 r\n", + "爱 v\n", + "北京 ns\n", + "天安门 ns\n" + ] + } + ], "source": [ "import jieba.posseg as pseg\n", "words = pseg.cut(\"我爱北京天安门\")\n", @@ -505,7 +692,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -515,29 +702,29 @@ " \n", " \n", " \n", - " NGYANGYAN NGYANGYAN \n", - " GYANGYANGYANGYANG GYANGYANGYANGYANG \n", - " NGYANGYANGYANGYANGYANGYANGYANGYANGYANGYAN \n", - " NGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGY \n", - " NGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYAN \n", - " GYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANG \n", - " YANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGY \n", - " ANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYA \n", - " NGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYAN \n", - " GYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANG \n", - " ANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANG \n", - " GYANGYANGYANGYANGYANGYANGYANGYANGYANGYANG \n", - " YANGYANGYANGYANGYANGYANGYANGYANGYANGYANGY \n", - " GYANGYANGYANGYANGYANGYANGYANGYANGYANG \n", - " ANGYANGYANGYANGYANGYANGYANGYANGYANG \n", - " GYANGYANGYANGYANGYANGYANGYANGYANG \n", - " NGYANGYANGYANGYANGYANGYANGYAN \n", - " ANGYANGYANGYANGYANGYANGYA \n", - " YANGYANGYANGYANGYANGY \n", - " YANGYANGYANGYAN \n", - " YANGYANGY \n", - " YAN \n", - " N \n", + " OUILOVEYO OVEYOUILO \n", + " VEYOUILOVEYOUILOV UILOVEYOUILOVEYOU \n", + " OVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILO \n", + " OVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOVE \n", + " OVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYO \n", + " VEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOU \n", + " EYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUI \n", + " YOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUIL \n", + " OUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILO \n", + " UILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOV \n", + " LOVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOV \n", + " VEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOV \n", + " EYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOVE \n", + " UILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOV \n", + " LOVEYOUILOVEYOUILOVEYOUILOVEYOUILOV \n", + " VEYOUILOVEYOUILOVEYOUILOVEYOUILOV \n", + " OUILOVEYOUILOVEYOUILOVEYOUILO \n", + " LOVEYOUILOVEYOUILOVEYOUIL \n", + " EYOUILOVEYOUILOVEYOUI \n", + " ILOVEYOUILOVEYO \n", + " EYOUILOVE \n", + " ILO \n", + " O \n", " \n", " \n", " \n", @@ -546,7 +733,7 @@ } ], "source": [ - "print('\\n'.join([''.join([('YANGYANG'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 else' ')for x in range(-30,30)])for y in range(15,-15,-1)]))" + "print('\\n'.join([''.join([('ILOVEYOU'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 else' ')for x in range(-30,30)])for y in range(15,-15,-1)]))" ] }, { diff --git "a/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" index 0c0148a..688fbfb 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" @@ -444,11 +444,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "3. 猜数程序修改为机器猜,根据每次人返回的结果来调整策略" + ] } ], "metadata": { diff --git "a/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" index 3c0e4f6..8b0a554 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" @@ -8,7 +8,7 @@ "\n", "Python Basic, Lesson 5, v1.0.1, 2016.12 by David.Yi \n", "Python Basic, Lesson 5, v1.0.2, 2017.03 modified by Yimeng.Zhang \n", - "v1.1, 2020.4 edit by David Yi\n", + "v1.1, 2020.4 2020.5 edit by David Yi\n", "\n", " \n", "### 本次内容要点\n", @@ -833,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -849,30 +849,88 @@ "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 02-checkpoint.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 03 - 循环 for, 字符串-checkpoint.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 04 - 列表 list -checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 04 - 列表 list-checkpoint.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 04-checkpoint.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 05 - dict tuple-checkpoint.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 05 - 字典 dict, 元组 tuple -checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 05 - 字典 dict, 元组 tuple-checkpoint.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 05-checkpoint.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 06 - 随机数-checkpoint.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 07 - 文件目录操作-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 08 - 函数-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 08 - 函数简介-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 09 - 日期函数-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 10 - 函数参数和匿名函数-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 11 - 集合库 collections-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 12 - 列表生成式-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 13 - 完整的 for 语句结构和 pprint-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 14 - 访问网络 requests-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 15 - 图片处理 Pillow-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 16 - 函数式编程-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\窗口界面编程 tk-checkpoint.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\.ipynb_checkpoints\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\.ipynb_checkpoints\\Python Basic Lesson 05a-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\Python Basic Lesson 05a.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_lesson_04.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_lesson_04_exercise.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_lesson_05.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_lesson_05_exercise.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_lesson_06.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\函数的不同参数.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\.ipynb_checkpoints\\Python Basic Lesson 09 - 日期函数-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\.ipynb_checkpoints\\Python Basic Lesson 10 - 函数参数和匿名函数-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\.ipynb_checkpoints\\Python Basic Lesson 11 - 集合库 collections-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\Python Basic Lesson 12 - 列表生成式-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\Python Basic Lesson 13 - 完整的 for 语句结构和 pprint-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\Python Basic Lesson 15 - 图片处理 Pillow-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\面向对象的编程-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\面向对象的编程之三-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\面向对象的编程之二-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\面向对象的编程之四-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\files\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\files\\test.txt\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\logo.gif\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\logo2.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\logo3.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\map.png\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_blur.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_crop.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_draw.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_edge.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_enhance.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_rotate.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_thumbnail.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 01\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 01\\.ipynb_checkpoints\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 01\\.ipynb_checkpoints\\Basic Exercise A-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 01\\Basic Exercise A.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 01\\python_senior_slides_python_senior_L1_v1.pptx\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 03\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 03\\.ipynb_checkpoints\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 03\\.ipynb_checkpoints\\窗口界面编程 tk-checkpoint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 03\\python_senior_slides_python_senior_L3_v1.pptx\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\python_basic_L2_lesson07.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\python_basic_L2_lesson14.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\python_basic_L2_outline_v1.docx\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\面向对象的编程.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\面向对象的编程之三.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\面向对象的编程之二.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\面向对象的编程之四.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\列表切片.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\匿名函数.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\日期处理.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\单元测试 unittest.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\baidu_logo.gif\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\list_dump.txt\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\ply\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\ply\\calc.py\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\ply\\parser.out\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\ply\\parsetab.py\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test.jpg\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test.txt\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test2.txt\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_blur.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_crop.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_drawline.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_edge.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_enhance.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_rotate.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_thumbnail.jpg\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\anaconda.png\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\guido-headshot-2019.jpg\n", @@ -892,12 +950,23 @@ "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 01 - 简介.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 02 - 变量, print, input.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 03 - 循环 for, 字符串.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 04 - 列表 list .ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 05 - 字典 dict, 元组 tuple .ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 04 - 列表 list.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 05 - 字典 dict, 元组 tuple.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 06 - 随机数.ipynb\n", "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 07 - 文件目录操作.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 08 - 函数.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\python_basic_outline.md\n" + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 08 - 函数简介.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 09 - 日期函数.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 10 - 函数参数和匿名函数.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 11 - 集合库 collections.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 12 - 列表生成式.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 13 - 完整的 for 语句结构和 pprint.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 14 - 访问网络初步和requests包.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 15 - 图片处理 Pillow.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 16 - 函数式编程.ipynb\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\test_thumbnail.jpg\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\__pycache__\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\__pycache__\\parsetab.cpython-37.pyc\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\窗口界面编程 tk.ipynb\n" ] } ], @@ -993,23 +1062,32 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Exercise A.ipynb 5354\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Exercise B.ipynb 7618\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 01 - 简介.ipynb 24389\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 02 - 变量, print, input.ipynb 15027\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 03 - 循环 for, 字符串.ipynb 11220\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 04 - 列表 list .ipynb 12606\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 05 - 字典 dict, 元组 tuple .ipynb 21842\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 06 - 随机数.ipynb 11817\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 07 - 文件目录操作.ipynb 44649\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 08 - 函数.ipynb 11458\n" + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Exercise A.ipynb 8620\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Exercise B.ipynb 13968\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 01 - 简介.ipynb 24745\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 02 - 变量, print, input.ipynb 15893\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 03 - 循环 for, 字符串.ipynb 11789\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 04 - 列表 list.ipynb 15143\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 05 - 字典 dict, 元组 tuple.ipynb 24665\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 06 - 随机数.ipynb 13111\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 07 - 文件目录操作.ipynb 55173\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 08 - 函数简介.ipynb 15008\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 09 - 日期函数.ipynb 11459\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 10 - 函数参数和匿名函数.ipynb 14624\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 11 - 集合库 collections.ipynb 34546\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 12 - 列表生成式.ipynb 7597\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 13 - 完整的 for 语句结构和 pprint.ipynb 11247\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 14 - 访问网络初步和requests包.ipynb 44865\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 15 - 图片处理 Pillow.ipynb 2806102\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 16 - 函数式编程.ipynb 16314\n", + "C:\\dev_python\\python_study\\python_study_basic_notebook\\窗口界面编程 tk.ipynb 2968\n" ] } ], @@ -1056,6 +1134,8 @@ "# 第二个为起始路径下的文件夹, List\n", "# 第三个是起始路径下的文件. List\n", "\n", + "# fnmatch python自带的文件名模式匹配包\n", + "# https://docs.python.org/zh-tw/3/library/fnmatch.html\n", "import fnmatch\n", "import os\n", "\n", @@ -1083,7 +1163,7 @@ "\n", "## 文件和目录操作之二\n", "\n", - "读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。\n", + "读写文件是最常见的IO操作。Python内置了读写文件的函数。\n", "\n", "读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象,然后,通过操作系统提供的接口从这个文件对象中读取数据,或者把数据写入这个文件对象。\n", "\n", @@ -1125,7 +1205,6 @@ "import os\n", "\n", "# 获得当前路径\n", - "# os.chdir('/Users/david.yi/Documents/dev/python_study/python_basic')\n", "s_dir = os.getcwd()\n", "\n", "print(s_dir)\n", @@ -1135,6 +1214,7 @@ "\n", "print(filename)\n", "\n", + "# 和读写文件打交道是一件需要小心的事情,这里用了 try-finally 的方式来避免出错\n", "try:\n", " # 打开文件\n", " f = open(filename, 'r')\n", @@ -1161,7 +1241,7 @@ ], "source": [ "# 简化调用方式\n", - "# 省却了 try...finally,会有 with 来自动控制\n", + "# 省却了 try...finally,会有 with 来自动控制保证可以关闭文件等\n", "\n", "with open(filename, 'r') as f:\n", " print(f.read())" @@ -1321,42 +1401,157 @@ "\n", "glob 是 python 自己带的一个文件操作相关模块,很简洁,用它可以查找符合自己目的的文件,就类似于 Windows 下的文件搜索,而且也支持通配符: `*,?,[]` 这三个通配符,\\* 代表0个或多个字符,? 代表一个字符,[] 匹配指定范围内的字符,如[0-9]匹配数字。\n", "\n", - "glob 的主要方法也叫 glob,该方法返回所有匹配的文件路径列表,该方法需要一个参数用来指定匹配的路径字符串" + "glob 的主要方法也叫 glob,该方法返回所有匹配的文件路径列表,该方法需要一个参数用来指定匹配的路径字符串。\n", + "\n", + "> 2020.5.10 之前的教程我们推荐试用 glob 函数包来进行查找文件,随着 python 的演进,现在推荐试用 pathlib 函数包来进行文件操作,来获得更加好的兼容性和性能,在pathlib 函数包中同样有 glob 函数,下面简单的演示了试用 pathlib 中的 glob 来遍历搜索文件。" ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 35, "metadata": { "scrolled": true }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "C:\\dev_python\\python_study\\python_study_basic_notebook\\*\\*.png\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\anaconda.png\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\jupyter.png\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\pycharm.png\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\pycharm_202001.png\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\python_install_5.png\n" - ] + "data": { + "text/plain": [ + "[WindowsPath('Python Basic Exercise A.ipynb'),\n", + " WindowsPath('Python Basic Exercise B.ipynb'),\n", + " WindowsPath('Python Basic Lesson 01 - 简介.ipynb'),\n", + " WindowsPath('Python Basic Lesson 02 - 变量, print, input.ipynb'),\n", + " WindowsPath('Python Basic Lesson 03 - 循环 for, 字符串.ipynb'),\n", + " WindowsPath('Python Basic Lesson 04 - 列表 list.ipynb'),\n", + " WindowsPath('Python Basic Lesson 05 - 字典 dict, 元组 tuple.ipynb'),\n", + " WindowsPath('Python Basic Lesson 06 - 随机数.ipynb'),\n", + " WindowsPath('Python Basic Lesson 07 - 文件目录操作.ipynb'),\n", + " WindowsPath('Python Basic Lesson 08 - 函数简介.ipynb'),\n", + " WindowsPath('Python Basic Lesson 09 - 日期函数.ipynb'),\n", + " WindowsPath('Python Basic Lesson 10 - 函数参数和匿名函数.ipynb'),\n", + " WindowsPath('Python Basic Lesson 11 - 集合库 collections.ipynb'),\n", + " WindowsPath('Python Basic Lesson 12 - 列表生成式.ipynb'),\n", + " WindowsPath('Python Basic Lesson 13 - 完整的 for 语句结构和 pprint.ipynb'),\n", + " WindowsPath('Python Basic Lesson 14 - 访问网络初步和requests包.ipynb'),\n", + " WindowsPath('Python Basic Lesson 15 - 图片处理 Pillow.ipynb'),\n", + " WindowsPath('Python Basic Lesson 16 - 函数式编程.ipynb'),\n", + " WindowsPath('窗口界面编程 tk.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Exercise A-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Exercise B-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 01 - 简介-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 01-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 02 - 变量, print, input-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 02-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 03 - 循环 for, 字符串-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 04 - 列表 list -checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 04 - 列表 list-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 04-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 05 - dict tuple-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 05 - 字典 dict, 元组 tuple -checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 05 - 字典 dict, 元组 tuple-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 05-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 06 - 随机数-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 07 - 文件目录操作-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 08 - 函数简介-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 09 - 日期函数-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 10 - 函数参数和匿名函数-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 11 - 集合库 collections-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 12 - 列表生成式-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 13 - 完整的 for 语句结构和 pprint-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 14 - 访问网络 requests-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 15 - 图片处理 Pillow-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 16 - 函数式编程-checkpoint.ipynb'),\n", + " WindowsPath('.ipynb_checkpoints/窗口界面编程 tk-checkpoint.ipynb'),\n", + " WindowsPath('draft/列表切片.ipynb'),\n", + " WindowsPath('draft/单元测试 unittest.ipynb'),\n", + " WindowsPath('draft/.ipynb_checkpoints/Python Basic Lesson 09 - 日期函数-checkpoint.ipynb'),\n", + " WindowsPath('draft/.ipynb_checkpoints/Python Basic Lesson 10 - 函数参数和匿名函数-checkpoint.ipynb'),\n", + " WindowsPath('draft/.ipynb_checkpoints/Python Basic Lesson 11 - 集合库 collections-checkpoint.ipynb'),\n", + " WindowsPath('draft/python_basic_2/python_basic_L2_lesson07.ipynb'),\n", + " WindowsPath('draft/python_basic_2/python_basic_L2_lesson14.ipynb'),\n", + " WindowsPath('draft/python_basic_2/面向对象的编程.ipynb'),\n", + " WindowsPath('draft/python_basic_2/面向对象的编程之三.ipynb'),\n", + " WindowsPath('draft/python_basic_2/面向对象的编程之二.ipynb'),\n", + " WindowsPath('draft/python_basic_2/面向对象的编程之四.ipynb'),\n", + " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 12 - 列表生成式-checkpoint.ipynb'),\n", + " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 13 - 完整的 for 语句结构和 pprint-checkpoint.ipynb'),\n", + " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 15 - 图片处理 Pillow-checkpoint.ipynb'),\n", + " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程-checkpoint.ipynb'),\n", + " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之三-checkpoint.ipynb'),\n", + " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之二-checkpoint.ipynb'),\n", + " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之四-checkpoint.ipynb'),\n", + " WindowsPath('draft/python_basic_2/lesson 01/Basic Exercise A.ipynb'),\n", + " WindowsPath('draft/python_basic_2/lesson 01/.ipynb_checkpoints/Basic Exercise A-checkpoint.ipynb'),\n", + " WindowsPath('draft/python_basic_2/lesson 03/.ipynb_checkpoints/窗口界面编程 tk-checkpoint.ipynb')]" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# 使用 glob 来遍历指定路径下的指定类型文件\n", - "import os, glob\n", + "import pathlib\n", "\n", "# 获得当前路径\n", "s_dir = os.getcwd()\n", "\n", - "s_find = os.path.join(s_dir, '*', '*.png' )\n", - "print(s_find)\n", - "\n", - "list_a = glob.glob(s_find)\n", - "for i in list_a:\n", - " print(i)" + "list(pathlib.Path('.').glob('**/*.ipynb'))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们在 fishbase 的 fish_file 包内,也实现了一个搜索文件的功能,也使用了 python 自带的 pathlib 函数包。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# v1.0.14 edit by Hu Jun, edit by Jia Chunying, #38\n", + "# v1.0.17 edit by Hu Jun, #212\n", + "# v1.3 edit by David Yi, #272\n", + "def find_files(path, exts=None):\n", + " \"\"\"\n", + " 查找路径下的文件,返回指定类型的文件列表\n", + "\n", + " :param:\n", + " * path: (string) 查找路径\n", + " * exts: (list) 文件类型列表,默认为空\n", + "\n", + " :return:\n", + " * files_list: (list) 文件列表\n", + "\n", + " 举例如下::\n", + "\n", + " print('--- find_files demo ---')\n", + " path1 = '/root/fishbase_issue'\n", + " all_files = find_files(path1)\n", + " print(all_files)\n", + " exts_files = find_files(path1, exts=['.png', '.py'])\n", + " print(exts_files)\n", + " print('---')\n", + "\n", + " 执行结果::\n", + "\n", + " --- find_files demo ---\n", + " ['/root/fishbase_issue/test.png', '/root/fishbase_issue/head.jpg','/root/fishbase_issue/py/man.png'\n", + " ['/root/fishbase_issue/test.png', '/root/fishbase_issue/py/man.png']\n", + " ---\n", + "\n", + " \"\"\"\n", + " files_list = []\n", + " for root, dirs, files in os.walk(path):\n", + " for name in files:\n", + " files_list.append(os.path.join(root, name))\n", + "\n", + " if exts is not None:\n", + " return [file for file in files_list if pathlib.Path(file).suffix in exts]\n", + "\n", + " return files_list" ] }, { @@ -1369,7 +1564,7 @@ "\n", "## 思考\n", "\n", - "* 想一下,如果要搜索指定目录下的 office 文件,包括 word、excel 和 ppt,然后将搜索到的文件名放在一个字典中,字典的 key 是 doc、xls、ppt 这些后缀,而 value 则是搜索到的文件的绝对路径名的列表;" + "* 想一下,如果要搜索指定目录下的 office 文件,包括 word、excel 和 ppt,然后将搜索到的文件名放在一个字典中,字典的 key 是 doc、xls、ppt 这些后缀,而 value 则是搜索到的文件的绝对路径名的列表;这个题目为我们之后的桌面文档整理程序做准备。" ] }, { diff --git "a/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" index af979d8..8aceef6 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" @@ -6,13 +6,13 @@ "source": [ "# Lesson 8\n", "\n", - " 2020.4 edit by David Yi\n", + "* v1.1, 2020.4 2020.5 edit by David Yi\n", "\n", " \n", "### 本课内容要点\n", "\n", "* 函数介绍和用法\n", - "* 思考:剪刀石头布" + "* 思考一下:剪刀石头布" ] }, { @@ -41,7 +41,7 @@ "函数可以做的很复杂,发展为包(Package)。Python 目前有七万多个各类功能的包,几乎都可以可以免费使用在自己的程序中,这是最近几年 Python 飞速发展的原因之一。\n", "学会使用函数来简化程序之后,可以为以后学习面向对象的编程方法打好基础,也可以真正的开始使用 Python 来解决各类问题。\n", "\n", - "> 2017年编写这个文档的时候,python 有大约7万多个包,现在,2020年4月,我看了一下 pypi,python 包的大本营,目前有 23万个包了。\n" + "> 2017年编写这个文档的时候,python 有大约7万多个包,现在,2020年4月,我看了一下 pypi,python 包的大本营,目前有 23万个包了。增长非常迅速。\n" ] }, { @@ -159,6 +159,31 @@ "如果上面的函数要修改只有一个 return 应该怎么修改呢?" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n" + ] + } + ], + "source": [ + "def my_max(a,b):\n", + " if a > b:\n", + " c = a\n", + " else:\n", + " c = b\n", + " \n", + " return c\n", + "\n", + "print(my_max(3,6))" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -175,7 +200,7 @@ ], "source": [ "# *number 这样的写法,可以理解为传入任意数目个参数,包括0个参数,就是在参数名称前面加上一个 * \n", - "# 为了简化程序逻辑,返回的结果现在是假的\n", + "# 为了简化程序逻辑,返回的结果现在是假的,后面我们会再修改\n", "\n", "def my_max(*number):\n", " print(number)\n", @@ -372,9 +397,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 思考\n", + "## 思考一下\n", "\n", - "1. 剪刀石头布。" + "1. 写一个简单的剪刀石头布的游戏;" ] }, { @@ -527,7 +552,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "2. 写一个电脑来猜数的程序" + "2. 写一个电脑来猜数的程序;" ] }, { From 7c0a4e6ecf4a47728ae88b3626983b65990d02f5 Mon Sep 17 00:00:00 2001 From: yijun_hp_ZHAN Date: Tue, 12 May 2020 23:07:05 +0800 Subject: [PATCH 04/27] 2020.5.12 edit Lesson 9,10,11 --- ...346\234\237\345\207\275\346\225\260.ipynb" | 108 +++--- ...345\220\215\345\207\275\346\225\260.ipynb" | 77 ++-- ...345\220\210\345\272\223 collections.ipynb" | 295 ++++---------- ...345\270\270\345\244\204\347\220\206.ipynb" | 361 ++++++++++++++++++ 4 files changed, 538 insertions(+), 303 deletions(-) create mode 100644 "python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" index 96bcb7e..4818e54 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" @@ -14,7 +14,7 @@ "### 本次内容要点\n", "\n", "* 日期函数库 datetime 用法介绍,datetime、time 等库的介绍,获得日期,字符串和日期转换,日期格式介绍,日期加减计算\n", - "* 思考\n", + "* 思考一下\n", "\n" ] }, @@ -24,11 +24,11 @@ "source": [ "### 日期处理\n", "\n", - "datetime 是Python处理日期和时间的标准库,用于获取日期和进行日期计算等;\n", + "datetime 是 Python处理日期和时间的标准库,用于获取日期和进行日期计算等;\n", "\n", - "Python 的日期相关的标准库比较多(略有杂乱),有 datetime, time, calendar,这是 python 长期发展过程中造成的问题。也有很好的第三方库来解决 python 日期库比较多并且功能略有重叠的问题。\n", + "Python 的日期相关的标准库比较多(略有杂乱),有 datetime, time, calendar等,这是 python 长期发展过程中造成的问题。也有很好的第三方库来解决 python 日期库比较多并且功能略有重叠的问题。\n", "\n", - "datetime 库包括 date 日期,time 时间, datetime 日期和时间,tzinfo 时区,timedelta 时间跨度计算 等主要对象。\n", + "datetime 库包括 date日期,time时间, datetime日期和时间,tzinfo时区,timedelt 时间跨度计算等主要对象。\n", "\n", "获取当前日期和时间:`now = datetime.now()`\n", "\n", @@ -41,16 +41,16 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2020-04-29 22:36:08.706137\n", - "2020-04-29\n", - "1588170968.7061372\n" + "2020-05-12 21:24:40.481649\n", + "2020-05-12\n", + "1589289880.4816499\n" ] } ], @@ -92,7 +92,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -113,7 +115,7 @@ ], "source": [ "# 连续运行显示时间戳,看看时间戳差了多少毫秒\n", - "# 因为电脑运行速度太快,没有意外的话,看到的时间都是一样的\n", + "# 因为电脑运行速度太快,没有意外的话,可能看到的时间是一样的\n", "\n", "for i in range(10):\n", " print(time.time())" @@ -121,14 +123,43 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1589289883.518088\n", + "1589289883.518088\n", + "1589289883.518088\n", + "1589289883.518088\n", + "1589289883.518088\n", + "1589289883.518088\n", + "1589289883.518088\n", + "1589289883.5190854\n", + "1589289883.5190854\n", + "1589289883.5190854\n" + ] + } + ], + "source": [ + "# 如果循环中只是需要记数,而不需要使用变量,for 循环可以写的更加简洁一点点\n", + "\n", + "for _ in range(10):\n", + " print(time.time())" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "time: 0.013513326644897461\n" + "time: 0.010952472686767578\n" ] } ], @@ -199,19 +230,16 @@ "output_type": "stream", "text": [ "2017-01-02 18:19:59\n", - "\n", - "\n", - "\n" + "\n" ] } ], "source": [ "# 字符串转化为日期\n", "\n", - "dday = datetime.strptime('2017-1-2 18:19:59', '%Y-%m-%d %H:%M:%S')\n", - "print(dday)\n", - "print(type(dday))\n", - "print('\\n')" + "day1 = datetime.strptime('2017-1-2 18:19:59', '%Y-%m-%d %H:%M:%S')\n", + "print(day1)\n", + "print(type(day1))" ] }, { @@ -264,38 +292,15 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "time.struct_time(tm_year=2020, tm_mon=4, tm_mday=25, tm_hour=21, tm_min=27, tm_sec=57, tm_wday=5, tm_yday=116, tm_isdst=0)\n", - "time.struct_time(tm_year=2020, tm_mon=4, tm_mday=25, tm_hour=21, tm_min=27, tm_sec=57, tm_wday=5, tm_yday=116, tm_isdst=0)\n", - "\n" - ] - } - ], - "source": [ - "# 格式化时间戳为本地的时间 \n", - "\n", - "print(time.localtime(time.time()))\n", - "print(time.localtime()) \n", - "\n", - "print(type(time.localtime(time.time())))" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2020-04-25 21:28:05\n", + "time.struct_time(tm_year=2020, tm_mon=5, tm_mday=12, tm_hour=21, tm_min=45, tm_sec=25, tm_wday=1, tm_yday=133, tm_isdst=0)\n", + "2020-05-12 21:45:25\n", "\n" ] } @@ -303,9 +308,12 @@ "source": [ "# 本地时间转换为字符串\n", "\n", - "t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())\n", - "print(t)\n", - "print(type(t))" + "t1 = time.localtime()\n", + "print(t1)\n", + "\n", + "t2 = time.strftime('%Y-%m-%d %H:%M:%S',t1)\n", + "print(t2)\n", + "print(type(t2))" ] }, { @@ -340,6 +348,8 @@ "from datetime import timedelta\n", "\n", "now = datetime.now()\n", + "\n", + "# 往后减去十个小时\n", "now1 = now + timedelta(hours=-10)\n", "print(now)\n", "print(now1)" @@ -386,7 +396,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "250\n" + "233\n" ] } ], diff --git "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" index 91ddde7..3e8d7b2 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" @@ -15,7 +15,7 @@ "\n", "* 函数不同参数形式\n", "* 匿名函数\n", - "* 思考:函数可变参数" + "* 思考一下:函数可变参数" ] }, { @@ -28,10 +28,11 @@ "\n", "### 位置参数和默认参数\n", "\n", - "位置参数:必须按照顺序准确传递,如果数量和顺序不对,就会可能造成程序错误;调用函数时候,如果写了参数名称,那么位置就不重要了。 \n", - "默认参数:在参数申明的时候跟一个用于默认值的赋值语句,如果调用函数的时候没有给出值,那么这个赋值语句就执行。\n", + "位置参数:必须按照顺序准确传递,如果数量和顺序不对,就会可能造成程序错误;调用函数时候,如果写了参数名称,那么位置就不重要了; \n", "\n", - "注意:所有必须的参数要在默认参数之前\n", + "默认参数:在参数申明的时候跟一个用于默认值的赋值语句,如果调用函数的时候没有给出值,那么这个赋值语句就执行;\n", + "\n", + "注意:所有必须的参数要在默认参数之前;\n", "\n", "默认参数的好处:\n", "* 减少程序复杂度\n", @@ -40,9 +41,9 @@ "\n", "### 可变长度的参数-元组和字典\n", "\n", - "可变长度的参数,分为不提供关键字和提供关键字两种模式,分别为元组 tuple 和字典 dict。\n", + "可变长度的参数,分为不提供关键字和提供关键字两种模式,分别为元组 tuple 和字典 dict;\n", "\n", - "可变长度的参数,如果是提供关键字,就是字典 dict,需要提供 key – value。\n", + "可变长度的参数,如果是提供关键字,就是字典 dict,需要提供 key – value;\n", "\n", "将字典作为参数传递的时候,可以直接传一个字典变量,也可以在参数列表中写明 key 和 value。\n", "\n", @@ -99,7 +100,7 @@ "source": [ "# 函数默认参数\n", "\n", - "def cal_1(money, bonus=1000, month=12,a=1,b=2):\n", + "def cal_1(money, bonus=1000, month=12,a=1, b=2):\n", " i = money * month + bonus \n", " return i\n", "\n", @@ -333,23 +334,33 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# 等价的函数一般写法和匿名函数写法\n", "\n", "def add(x, y):\n", " return x + y\n", "\n", - "lambda x, y: x + y" + "a = lambda x, y: x + y\n", + "a(1,2)" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -358,19 +369,21 @@ "5" ] }, - "execution_count": 9, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# lambda 同样可以有默认参数\n", + "\n", "a = lambda x, y=2 : x + y \n", "a(3)" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -379,7 +392,7 @@ "8" ] }, - "execution_count": 10, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -407,9 +420,16 @@ "print(a(2))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "几个函数的例子" + ] + }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -433,27 +453,6 @@ "print(yinshu(10))" ] }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "2\n", - "5\n", - "10\n", - "[1, 2, 5, 10]\n" - ] - } - ], - "source": [ - "print(func(10))" - ] - }, { "cell_type": "code", "execution_count": 4, diff --git "a/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" index 73f41b8..87508cf 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" @@ -19,7 +19,8 @@ " * defaultdict: 带有默认值的字典\n", " * OrderedDict: 有序字典\n", " * Counter: 计数器\n", - "* 异常错误处理简介\n" + "* 异常错误处理简介\n", + "* 思考一下\n" ] }, { @@ -265,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "metadata": { "scrolled": true }, @@ -274,8 +275,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.029897212982177734\n", - "0.00005698\n" + "0.011995315551757812\n", + "0.0009975433349609\n" ] } ], @@ -290,8 +291,7 @@ "\n", "# list\n", "a = time.time()\n", - "q0.insert(0,888)\n", - "# q0.append(999)\n", + "q0.insert(0,88888)\n", "b = time.time()\n", "print(b-a)\n", "\n", @@ -300,10 +300,9 @@ "\n", "# deque\n", "a = time.time()\n", - "q1.appendleft(888)\n", - "# q1.append(999)\n", + "q1.appendleft(88888)\n", "b = time.time()\n", - "print('%2.8f' % (b-a))" + "print('%2.16f' % (b-a))" ] }, { @@ -387,6 +386,8 @@ } ], "source": [ + "# 删除左边的元素\n", + "\n", "l = deque(['a','b','c'])\n", "l.popleft()\n", "print(l)" @@ -866,7 +867,9 @@ { "cell_type": "code", "execution_count": 38, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -892,232 +895,94 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## 异常错误处理\n", - "\n", - "异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a:a\n" - ] - }, - { - "ename": "ValueError", - "evalue": "invalid literal for int() with base 10: 'a'", - "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[0;32m 1\u001b[0m \u001b[1;31m# 看似健壮的程序,输入字母会报错\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'a:'\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 4\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0ma\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[0;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"you cannot input 0\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mValueError\u001b[0m: invalid literal for int() with base 10: 'a'" - ] - } - ], - "source": [ - "# 看似健壮的程序,输入字母会报错\n", - "\n", - "a = int(input('a:'))\n", - "if a ==0:\n", - " print(\"you cannot input 0\")\n", - "else: \n", - " r = 10 / a\n", - " print('result:', r)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a:0\n", - "except: division by zero\n" - ] - } - ], "source": [ - "# 防止输入0作为除数\n", - "\n", - "try:\n", - " a = int(input('a:'))\n", - " r = 10 / a\n", - " print('result:', r)\n", - "except ZeroDivisionError as e:\n", - " print('except:',e)" + "## 思考一下\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "a:0\n" + ">--------------------\n", + "->-------------------\n", + "-->------------------\n", + "--->-----------------\n", + "---->----------------\n", + "----->---------------\n", + "------>--------------\n", + "------->-------------\n", + "-------->------------\n", + "--------->-----------\n", + "---------->----------\n", + "----------->---------\n", + "------------>--------\n", + "------------->-------\n", + "-------------->------\n", + "--------------->-----\n", + "---------------->----\n", + "----------------->---\n", + "------------------>--\n", + "------------------->-\n", + "-------------------->\n", + ">--------------------\n", + "->-------------------\n", + "-->------------------\n", + "--->-----------------\n", + "---->----------------\n", + "----->---------------\n", + "------>--------------\n", + "------->-------------\n", + "-------->------------\n", + "--------->-----------\n", + "---------->----------\n", + "----------->---------\n", + "------------>--------\n", + "------------->-------\n", + "-------------->------\n", + "--------------->-----\n", + "---------------->----\n", + "----------------->---\n", + "------------------>--\n", + "------------------->-\n", + "-------------------->\n", + ">--------------------\n", + "->-------------------\n", + "-->------------------\n", + "--->-----------------\n", + "---->----------------\n", + "----->---------------\n", + "------>--------------\n", + "------->-------------\n", + "-------->------------\n", + "--------->-----------\n", + "---------->----------\n", + "----------->---------\n", + "------------>--------\n", + "------------->-------\n", + "-------------->------\n", + "--------------->-----\n" ] }, { - "ename": "ZeroDivisionError", - "evalue": "division by zero", + "ename": "KeyboardInterrupt", + "evalue": "", "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[0;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'a:'\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[0mr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m10\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0ma\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;31mZeroDivisionError\u001b[0m: division by zero" + "\u001b[1;31mKeyboardInterrupt\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 7\u001b[0m \u001b[0mfancy_loading\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrotate\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[0;32m 8\u001b[0m \u001b[0msys\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstdout\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflush\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----> 9\u001b[1;33m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.08\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], - "source": [ - "a = int(input('a:'))\n", - "r = 10 / a" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a:0\n", - "except: division by zero\n" - ] - } - ], - "source": [ - "# 如何捕捉多个类型的错误?\n", - "\n", - "try:\n", - " a = int(input('a:'))\n", - " r = 10 / a\n", - " print('result:', r)\n", - "except ZeroDivisionError as e:\n", - " print('except:',e)\n", - "except ValueError as e:\n", - " print('except:',e)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a:0\n", - "except: division by zero\n", - "finish...\n" - ] - } - ], - "source": [ - "# try...except...finally\n", - "\n", - "a = int(input('a:'))\n", - "\n", - "try:\n", - " r = 10 / a\n", - " print('result:', r)\n", - "except ZeroDivisionError as e:\n", - " print('except:', e)\n", - "finally:\n", - " print('finish...')" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "except: name 'c' is not defined\n" - ] - } - ], - "source": [ - "# 防止错误举例\n", - "\n", - "a = 100\n", - "try:\n", - " b = a + c \n", - " print(b)\n", - "except NameError as e:\n", - " print('except:',e)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a:3\n", - "covert ok\n", - "result: 3.3333333333333335\n", - "finish...\n" - ] - } - ], - "source": [ - "# 对 int 进行判断\n", - "\n", - "a = input('a:')\n", - "\n", - "# 对输入值转换还有更完善的方法,设定一个转换结果\n", - "try:\n", - " a = int(a)\n", - "except ValueError as e:\n", - " print('except:', e) \n", - " a = 1\n", - "finally:\n", - " print('covert ok')\n", - " \n", - "try:\n", - " r = 10 / a\n", - " print('result:', r)\n", - "except ZeroDivisionError as e:\n", - " print('except:', e)\n", - "finally:\n", - " print('finish...')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 思考\n", - "\n", - "对于防止错误比较有效的一个方式,就是打印日志,平时俗称的log。我们在学习 python 的过程中,经常会用 print 打印出一些变量的值什么的,其实也是日志的一种方式。打印日志一方面是记录正常的操作,另一方面很大的作用就是用在出错的时候检查。日志大部分时候是一种文本文件,便于存储、查询和归档。python 中也有比较完善的日志处理模块。" - ] + "source": [] }, { "cell_type": "code", diff --git "a/python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" "b/python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" new file mode 100644 index 0000000..adc78dd --- /dev/null +++ "b/python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" @@ -0,0 +1,361 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## 异常错误处理\n", + "\n", + "异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a:a\n" + ] + }, + { + "ename": "ValueError", + "evalue": "invalid literal for int() with base 10: 'a'", + "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[0;32m 1\u001b[0m \u001b[1;31m# 看似健壮的程序,输入字母会报错\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'a:'\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 4\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0ma\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[0;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"you cannot input 0\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mValueError\u001b[0m: invalid literal for int() with base 10: 'a'" + ] + } + ], + "source": [ + "# 看似健壮的程序,输入字母会报错\n", + "\n", + "a = int(input('a:'))\n", + "if a ==0:\n", + " print(\"you cannot input 0\")\n", + "else: \n", + " r = 10 / a\n", + " print('result:', r)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a:0\n", + "except: division by zero\n" + ] + } + ], + "source": [ + "# 防止输入0作为除数\n", + "\n", + "try:\n", + " a = int(input('a:'))\n", + " r = 10 / a\n", + " print('result:', r)\n", + "except ZeroDivisionError as e:\n", + " print('except:',e)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a:0\n" + ] + }, + { + "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[0;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'a:'\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[0mr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m10\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0ma\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mZeroDivisionError\u001b[0m: division by zero" + ] + } + ], + "source": [ + "a = int(input('a:'))\n", + "r = 10 / a" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a:0\n", + "except: division by zero\n" + ] + } + ], + "source": [ + "# 如何捕捉多个类型的错误?\n", + "\n", + "try:\n", + " a = int(input('a:'))\n", + " r = 10 / a\n", + " print('result:', r)\n", + "except ZeroDivisionError as e:\n", + " print('except:',e)\n", + "except ValueError as e:\n", + " print('except:',e)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a:0\n", + "except: division by zero\n", + "finish...\n" + ] + } + ], + "source": [ + "# try...except...finally\n", + "\n", + "a = int(input('a:'))\n", + "\n", + "try:\n", + " r = 10 / a\n", + " print('result:', r)\n", + "except ZeroDivisionError as e:\n", + " print('except:', e)\n", + "finally:\n", + " print('finish...')" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "except: name 'c' is not defined\n" + ] + } + ], + "source": [ + "# 防止错误举例\n", + "\n", + "a = 100\n", + "try:\n", + " b = a + c \n", + " print(b)\n", + "except NameError as e:\n", + " print('except:',e)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a:3\n", + "covert ok\n", + "result: 3.3333333333333335\n", + "finish...\n" + ] + } + ], + "source": [ + "# 对 int 进行判断\n", + "\n", + "a = input('a:')\n", + "\n", + "# 对输入值转换还有更完善的方法,设定一个转换结果\n", + "try:\n", + " a = int(a)\n", + "except ValueError as e:\n", + " print('except:', e) \n", + " a = 1\n", + "finally:\n", + " print('covert ok')\n", + " \n", + "try:\n", + " r = 10 / a\n", + " print('result:', r)\n", + "except ZeroDivisionError as e:\n", + " print('except:', e)\n", + "finally:\n", + " print('finish...')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 思考一下\n", + "\n", + "对于防止错误比较有效的一个方式,就是打印日志,平时俗称的log。我们在学习 python 的过程中,经常会用 print 打印出一些变量的值什么的,其实也是日志的一种方式。打印日志一方面是记录正常的操作,另一方面很大的作用就是用在出错的时候检查。日志大部分时候是一种文本文件,便于存储、查询和归档。python 中也有比较完善的日志处理模块。\n", + "\n", + "实际操作中,日志文件的数量会非常惊人,其实在大数据处理中日志处理也是重要的一项课题。\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## 异常错误处理\n", + "\n", + "异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。\n", + "\n", + "\n", + "\n", + "# 看似健壮的程序,输入字母会报错\n", + "\n", + "a = int(input('a:'))\n", + "if a ==0:\n", + " print(\"you cannot input 0\")\n", + "else: \n", + " r = 10 / a\n", + " print('result:', r)\n", + "\n", + "# 防止输入0作为除数\n", + "\n", + "try:\n", + " a = int(input('a:'))\n", + " r = 10 / a\n", + " print('result:', r)\n", + "except ZeroDivisionError as e:\n", + " print('except:',e)\n", + "\n", + "a = int(input('a:'))\n", + "r = 10 / a\n", + "\n", + "# 如何捕捉多个类型的错误?\n", + "\n", + "try:\n", + " a = int(input('a:'))\n", + " r = 10 / a\n", + " print('result:', r)\n", + "except ZeroDivisionError as e:\n", + " print('except:',e)\n", + "except ValueError as e:\n", + " print('except:',e)\n", + "\n", + "\n", + "# try...except...finally\n", + "\n", + "a = int(input('a:'))\n", + "\n", + "try:\n", + " r = 10 / a\n", + " print('result:', r)\n", + "except ZeroDivisionError as e:\n", + " print('except:', e)\n", + "finally:\n", + " print('finish...')\n", + "\n", + "# 防止错误举例\n", + "\n", + "a = 100\n", + "try:\n", + " b = a + c \n", + " print(b)\n", + "except NameError as e:\n", + " print('except:',e)\n", + "\n", + "# 对 int 进行判断\n", + "\n", + "a = input('a:')\n", + "\n", + "# 对输入值转换还有更完善的方法,设定一个转换结果\n", + "try:\n", + " a = int(a)\n", + "except ValueError as e:\n", + " print('except:', e) \n", + " a = 1\n", + "finally:\n", + " print('covert ok')\n", + " \n", + "try:\n", + " r = 10 / a\n", + " print('result:', r)\n", + "except ZeroDivisionError as e:\n", + " print('except:', e)\n", + "finally:\n", + " print('finish...')\n", + "\n", + "## 思考一下\n", + "\n", + "对于防止错误比较有效的一个方式,就是打印日志,平时俗称的log。我们在学习 python 的过程中,经常会用 print 打印出一些变量的值什么的,其实也是日志的一种方式。打印日志一方面是记录正常的操作,另一方面很大的作用就是用在出错的时候检查。日志大部分时候是一种文本文件,便于存储、查询和归档。python 中也有比较完善的日志处理模块。\n", + "\n", + "实际操作中,日志文件的数量会非常惊人,其实在大数据处理中日志处理也是重要的一项课题。\n", + "\n", + "\n", + "\n" + ] + } + ], + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From dd300c7d54749318bb396a92d15e669f65641a22 Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Thu, 14 May 2020 16:17:20 +0800 Subject: [PATCH 05/27] 2020.5.14 small edit --- ...345\275\225\346\223\215\344\275\234.ipynb" | 446 ++++++++++-------- python_study_basic_notebook/files/test2.txt | 3 + 2 files changed, 243 insertions(+), 206 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" index 8b0a554..eafb0ae 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" @@ -26,7 +26,7 @@ "\n", "## 文件和目录操作之一\n", "\n", - "Python 的 os 库:有很多和文件、路径和执行系统命令相关的函数。\n", + "Python 的 os 库有很多和文件、路径和执行系统命令相关的函数。\n", "\n", "### os 库常用函数\n", "\n", @@ -390,14 +390,14 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files/test.txt\n" + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test.txt\n" ] }, { @@ -406,14 +406,14 @@ "True" ] }, - "execution_count": 14, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 检查给出的路径是否一个文件,存在\n", - "\n", + "import os\n", "s_dir = os.getcwd()\n", "s_file = os.path.join(s_dir, 'files/test.txt')\n", "print(s_file)\n", @@ -833,140 +833,160 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Exercise A-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Exercise B-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 01 - 简介-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 01-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 02 - 变量, print, input-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 02-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 03 - 循环 for, 字符串-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 04 - 列表 list -checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 04 - 列表 list-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 04-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 05 - dict tuple-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 05 - 字典 dict, 元组 tuple -checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 05 - 字典 dict, 元组 tuple-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 05-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 06 - 随机数-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 07 - 文件目录操作-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 08 - 函数简介-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 09 - 日期函数-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 10 - 函数参数和匿名函数-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 11 - 集合库 collections-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 12 - 列表生成式-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 13 - 完整的 for 语句结构和 pprint-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 14 - 访问网络 requests-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 15 - 图片处理 Pillow-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\Python Basic Lesson 16 - 函数式编程-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\.ipynb_checkpoints\\窗口界面编程 tk-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\.ipynb_checkpoints\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\.ipynb_checkpoints\\Python Basic Lesson 09 - 日期函数-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\.ipynb_checkpoints\\Python Basic Lesson 10 - 函数参数和匿名函数-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\.ipynb_checkpoints\\Python Basic Lesson 11 - 集合库 collections-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\Python Basic Lesson 12 - 列表生成式-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\Python Basic Lesson 13 - 完整的 for 语句结构和 pprint-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\Python Basic Lesson 15 - 图片处理 Pillow-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\面向对象的编程-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\面向对象的编程之三-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\面向对象的编程之二-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\.ipynb_checkpoints\\面向对象的编程之四-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\files\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\files\\test.txt\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\logo.gif\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\logo2.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\logo3.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\map.png\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_blur.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_crop.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_draw.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_edge.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_enhance.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_rotate.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\imgs\\test_thumbnail.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 01\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 01\\.ipynb_checkpoints\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 01\\.ipynb_checkpoints\\Basic Exercise A-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 01\\Basic Exercise A.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 01\\python_senior_slides_python_senior_L1_v1.pptx\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 03\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 03\\.ipynb_checkpoints\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 03\\.ipynb_checkpoints\\窗口界面编程 tk-checkpoint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\lesson 03\\python_senior_slides_python_senior_L3_v1.pptx\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\python_basic_L2_lesson07.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\python_basic_L2_lesson14.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\python_basic_L2_outline_v1.docx\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\面向对象的编程.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\面向对象的编程之三.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\面向对象的编程之二.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\python_basic_2\\面向对象的编程之四.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\列表切片.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\draft\\单元测试 unittest.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\baidu_logo.gif\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\list_dump.txt\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\ply\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\ply\\calc.py\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\ply\\parser.out\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\ply\\parsetab.py\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test.txt\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test2.txt\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_blur.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_crop.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_drawline.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_edge.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_enhance.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_rotate.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\files\\test_thumbnail.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\anaconda.png\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\guido-headshot-2019.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\jupyter.png\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\pycharm.png\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\pycharm_202001.png\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\python_install.jpeg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\python_install_1.jpeg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\python_install_2.jpeg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\python_install_3.jpeg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\python_install_4.jpeg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs\\python_install_5.png\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs_old\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\imgs_old\\python_use.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Exercise A.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Exercise B.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 01 - 简介.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 02 - 变量, print, input.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 03 - 循环 for, 字符串.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 04 - 列表 list.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 05 - 字典 dict, 元组 tuple.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 06 - 随机数.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 07 - 文件目录操作.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 08 - 函数简介.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 09 - 日期函数.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 10 - 函数参数和匿名函数.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 11 - 集合库 collections.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 12 - 列表生成式.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 13 - 完整的 for 语句结构和 pprint.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 14 - 访问网络初步和requests包.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 15 - 图片处理 Pillow.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\Python Basic Lesson 16 - 函数式编程.ipynb\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\test_thumbnail.jpg\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\__pycache__\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\__pycache__\\parsetab.cpython-37.pyc\n", - "C:\\dev_python\\python_study\\python_study_basic_notebook\\窗口界面编程 tk.ipynb\n" + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 15 - 图片处理 Pillow.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 03 - 循环 for, 字符串.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.DS_Store\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints/单元测试 unittest-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 09 - 日期函数-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 06 - 随机数-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 07 - 文件目录操作-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 11 - 集合库 collections-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints/日期处理-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 10 - 函数参数和匿名函数-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints/匿名函数-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints/列表切片-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 08 - 函数-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/.ipynb_checkpoints/函数的不同参数-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/列表切片.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/面向对象的编程之三.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.DS_Store\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/面向对象的编程之二.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/logo.gif\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/map.png\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/test_thumbnail.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/test_rotate.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/test.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/logo3.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/logo2.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/test_enhance.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/test_edge.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/test_crop.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/test_blur.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/imgs/test_draw.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/面向对象的编程.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 03\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 03/.ipynb_checkpoints\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 03/.ipynb_checkpoints/窗口界面编程 tk-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 03/python_senior_slides_python_senior_L3_v1.pptx\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_lesson14.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_outline_v1.docx\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 02\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 02/.ipynb_checkpoints\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/面向对象的编程之四.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_lesson07.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/files\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/files/test.txt\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson07-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson13-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之四-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson08-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之三-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson06-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson12-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson09-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之二-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 15 - 图片处理 Pillow-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson11-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson05-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/面向对象的编程-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson10-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 12 - 列表生成式-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson04-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 13 - 完整的 for 语句结构和 pprint-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson14-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 01\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 01/Basic Exercise A.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 01/python_senior_slides_python_senior_L1_v1.pptx\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 01/.ipynb_checkpoints\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 01/.ipynb_checkpoints/senior_demo_L1-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 01/.ipynb_checkpoints/if_advanced_L1-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/python_basic_2/lesson 01/.ipynb_checkpoints/Basic Exercise A-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/draft/单元测试 unittest.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Exercise B.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.DS_Store\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/窗口界面编程 tk.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/pycharm.png\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/pycharm_202001.png\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/python_install_5.png\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/.DS_Store\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/guido-headshot-2019.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/jupyter.png\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/python_install_1.jpeg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/anaconda.png\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/python_install_2.jpeg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/python_install_3.jpeg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/python_install_4.jpeg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs/python_install.jpeg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs_old\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/imgs_old/python_use.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Exercise A.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 10 - 函数参数和匿名函数.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/test_thumbnail.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/__pycache__\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/__pycache__/parsetab.cpython-37.pyc\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 14 - 访问网络初步和requests包.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 06 - 随机数.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 02 - 变量, print, input.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 04 - 列表 list.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 07 - 文件目录操作.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 01 - 简介.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 13 - 完整的 for 语句结构和 pprint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 11 - 集合库 collections.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 12 - 列表生成式.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/ply\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/ply/parsetab.py\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/ply/parser.out\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/ply/calc.py\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test2.txt\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test_thumbnail.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test_rotate.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/list_dump.txt\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test_enhance.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test_edge.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test.txt\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test_drawline.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test_crop.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test_blur.jpg\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/baidu_logo.gif\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 03 - 循环 for, 字符串-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 04 - 列表 list -checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 02 - 变量, print, input-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 01 - 简介-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 03 - for 循环 range 字符串-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 07 - 文件目录操作-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 02 Exercise-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 02 - 变量 print input-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 03 Exercise-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 14 - 访问网络初步和requests包-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 04 - list -checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 06 - 随机数-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/python_basic_lesson_04-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 05 - 字典 dict, 元组 tuple -checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/python_basic_lesson_03a-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 05 - dict 字典 tuple 元组-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/Python Basic Lesson 08 - 函数简介-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/.ipynb_checkpoints/python_basic_lesson_05-checkpoint.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 08 - 函数简介.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/异常处理.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 05 - 字典 dict, 元组 tuple.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 09 - 日期函数.ipynb\n", + "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/Python Basic Lesson 16 - 函数式编程.ipynb\n" ] } ], @@ -1338,7 +1358,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -1346,6 +1366,9 @@ "output_type": "stream", "text": [ "/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook/files/test2.txt\n", + "Hello, World!\n", + "Hello, Shanghai!\n", + "Hello, CHINA!\n", "\n" ] } @@ -1408,7 +1431,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 5, "metadata": { "scrolled": true }, @@ -1416,75 +1439,89 @@ { "data": { "text/plain": [ - "[WindowsPath('Python Basic Exercise A.ipynb'),\n", - " WindowsPath('Python Basic Exercise B.ipynb'),\n", - " WindowsPath('Python Basic Lesson 01 - 简介.ipynb'),\n", - " WindowsPath('Python Basic Lesson 02 - 变量, print, input.ipynb'),\n", - " WindowsPath('Python Basic Lesson 03 - 循环 for, 字符串.ipynb'),\n", - " WindowsPath('Python Basic Lesson 04 - 列表 list.ipynb'),\n", - " WindowsPath('Python Basic Lesson 05 - 字典 dict, 元组 tuple.ipynb'),\n", - " WindowsPath('Python Basic Lesson 06 - 随机数.ipynb'),\n", - " WindowsPath('Python Basic Lesson 07 - 文件目录操作.ipynb'),\n", - " WindowsPath('Python Basic Lesson 08 - 函数简介.ipynb'),\n", - " WindowsPath('Python Basic Lesson 09 - 日期函数.ipynb'),\n", - " WindowsPath('Python Basic Lesson 10 - 函数参数和匿名函数.ipynb'),\n", - " WindowsPath('Python Basic Lesson 11 - 集合库 collections.ipynb'),\n", - " WindowsPath('Python Basic Lesson 12 - 列表生成式.ipynb'),\n", - " WindowsPath('Python Basic Lesson 13 - 完整的 for 语句结构和 pprint.ipynb'),\n", - " WindowsPath('Python Basic Lesson 14 - 访问网络初步和requests包.ipynb'),\n", - " WindowsPath('Python Basic Lesson 15 - 图片处理 Pillow.ipynb'),\n", - " WindowsPath('Python Basic Lesson 16 - 函数式编程.ipynb'),\n", - " WindowsPath('窗口界面编程 tk.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Exercise A-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Exercise B-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 01 - 简介-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 01-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 02 - 变量, print, input-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 02-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 03 - 循环 for, 字符串-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 04 - 列表 list -checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 04 - 列表 list-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 04-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 05 - dict tuple-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 05 - 字典 dict, 元组 tuple -checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 05 - 字典 dict, 元组 tuple-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 05-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 06 - 随机数-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 07 - 文件目录操作-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 08 - 函数简介-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 09 - 日期函数-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 10 - 函数参数和匿名函数-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 11 - 集合库 collections-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 12 - 列表生成式-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 13 - 完整的 for 语句结构和 pprint-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 14 - 访问网络 requests-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 15 - 图片处理 Pillow-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/Python Basic Lesson 16 - 函数式编程-checkpoint.ipynb'),\n", - " WindowsPath('.ipynb_checkpoints/窗口界面编程 tk-checkpoint.ipynb'),\n", - " WindowsPath('draft/列表切片.ipynb'),\n", - " WindowsPath('draft/单元测试 unittest.ipynb'),\n", - " WindowsPath('draft/.ipynb_checkpoints/Python Basic Lesson 09 - 日期函数-checkpoint.ipynb'),\n", - " WindowsPath('draft/.ipynb_checkpoints/Python Basic Lesson 10 - 函数参数和匿名函数-checkpoint.ipynb'),\n", - " WindowsPath('draft/.ipynb_checkpoints/Python Basic Lesson 11 - 集合库 collections-checkpoint.ipynb'),\n", - " WindowsPath('draft/python_basic_2/python_basic_L2_lesson07.ipynb'),\n", - " WindowsPath('draft/python_basic_2/python_basic_L2_lesson14.ipynb'),\n", - " WindowsPath('draft/python_basic_2/面向对象的编程.ipynb'),\n", - " WindowsPath('draft/python_basic_2/面向对象的编程之三.ipynb'),\n", - " WindowsPath('draft/python_basic_2/面向对象的编程之二.ipynb'),\n", - " WindowsPath('draft/python_basic_2/面向对象的编程之四.ipynb'),\n", - " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 12 - 列表生成式-checkpoint.ipynb'),\n", - " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 13 - 完整的 for 语句结构和 pprint-checkpoint.ipynb'),\n", - " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 15 - 图片处理 Pillow-checkpoint.ipynb'),\n", - " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程-checkpoint.ipynb'),\n", - " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之三-checkpoint.ipynb'),\n", - " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之二-checkpoint.ipynb'),\n", - " WindowsPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之四-checkpoint.ipynb'),\n", - " WindowsPath('draft/python_basic_2/lesson 01/Basic Exercise A.ipynb'),\n", - " WindowsPath('draft/python_basic_2/lesson 01/.ipynb_checkpoints/Basic Exercise A-checkpoint.ipynb'),\n", - " WindowsPath('draft/python_basic_2/lesson 03/.ipynb_checkpoints/窗口界面编程 tk-checkpoint.ipynb')]" + "[PosixPath('Python Basic Lesson 15 - 图片处理 Pillow.ipynb'),\n", + " PosixPath('Python Basic Lesson 03 - 循环 for, 字符串.ipynb'),\n", + " PosixPath('Python Basic Exercise B.ipynb'),\n", + " PosixPath('窗口界面编程 tk.ipynb'),\n", + " PosixPath('Python Basic Exercise A.ipynb'),\n", + " PosixPath('Python Basic Lesson 10 - 函数参数和匿名函数.ipynb'),\n", + " PosixPath('Python Basic Lesson 14 - 访问网络初步和requests包.ipynb'),\n", + " PosixPath('Python Basic Lesson 06 - 随机数.ipynb'),\n", + " PosixPath('Python Basic Lesson 02 - 变量, print, input.ipynb'),\n", + " PosixPath('Python Basic Lesson 04 - 列表 list.ipynb'),\n", + " PosixPath('Python Basic Lesson 07 - 文件目录操作.ipynb'),\n", + " PosixPath('Python Basic Lesson 01 - 简介.ipynb'),\n", + " PosixPath('Python Basic Lesson 13 - 完整的 for 语句结构和 pprint.ipynb'),\n", + " PosixPath('Python Basic Lesson 11 - 集合库 collections.ipynb'),\n", + " PosixPath('Python Basic Lesson 12 - 列表生成式.ipynb'),\n", + " PosixPath('Python Basic Lesson 08 - 函数简介.ipynb'),\n", + " PosixPath('异常处理.ipynb'),\n", + " PosixPath('Python Basic Lesson 05 - 字典 dict, 元组 tuple.ipynb'),\n", + " PosixPath('Python Basic Lesson 09 - 日期函数.ipynb'),\n", + " PosixPath('Python Basic Lesson 16 - 函数式编程.ipynb'),\n", + " PosixPath('draft/列表切片.ipynb'),\n", + " PosixPath('draft/单元测试 unittest.ipynb'),\n", + " PosixPath('draft/.ipynb_checkpoints/单元测试 unittest-checkpoint.ipynb'),\n", + " PosixPath('draft/.ipynb_checkpoints/Python Basic Lesson 09 - 日期函数-checkpoint.ipynb'),\n", + " PosixPath('draft/.ipynb_checkpoints/Python Basic Lesson 06 - 随机数-checkpoint.ipynb'),\n", + " PosixPath('draft/.ipynb_checkpoints/Python Basic Lesson 07 - 文件目录操作-checkpoint.ipynb'),\n", + " PosixPath('draft/.ipynb_checkpoints/Python Basic Lesson 11 - 集合库 collections-checkpoint.ipynb'),\n", + " PosixPath('draft/.ipynb_checkpoints/日期处理-checkpoint.ipynb'),\n", + " PosixPath('draft/.ipynb_checkpoints/Python Basic Lesson 10 - 函数参数和匿名函数-checkpoint.ipynb'),\n", + " PosixPath('draft/.ipynb_checkpoints/匿名函数-checkpoint.ipynb'),\n", + " PosixPath('draft/.ipynb_checkpoints/列表切片-checkpoint.ipynb'),\n", + " PosixPath('draft/.ipynb_checkpoints/Python Basic Lesson 08 - 函数-checkpoint.ipynb'),\n", + " PosixPath('draft/.ipynb_checkpoints/函数的不同参数-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/面向对象的编程之三.ipynb'),\n", + " PosixPath('draft/python_basic_2/面向对象的编程之二.ipynb'),\n", + " PosixPath('draft/python_basic_2/面向对象的编程.ipynb'),\n", + " PosixPath('draft/python_basic_2/python_basic_L2_lesson14.ipynb'),\n", + " PosixPath('draft/python_basic_2/面向对象的编程之四.ipynb'),\n", + " PosixPath('draft/python_basic_2/python_basic_L2_lesson07.ipynb'),\n", + " PosixPath('draft/python_basic_2/lesson 03/.ipynb_checkpoints/窗口界面编程 tk-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson07-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson13-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之四-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson08-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之三-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson06-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson12-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson09-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程之二-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 15 - 图片处理 Pillow-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson11-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson05-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/面向对象的编程-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson10-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 12 - 列表生成式-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson04-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 13 - 完整的 for 语句结构和 pprint-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/.ipynb_checkpoints/python_basic_L2_lesson14-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/lesson 01/Basic Exercise A.ipynb'),\n", + " PosixPath('draft/python_basic_2/lesson 01/.ipynb_checkpoints/senior_demo_L1-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/lesson 01/.ipynb_checkpoints/if_advanced_L1-checkpoint.ipynb'),\n", + " PosixPath('draft/python_basic_2/lesson 01/.ipynb_checkpoints/Basic Exercise A-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 03 - 循环 for, 字符串-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 04 - 列表 list -checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 02 - 变量, print, input-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 01 - 简介-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 03 - for 循环 range 字符串-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 07 - 文件目录操作-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 02 Exercise-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 02 - 变量 print input-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 03 Exercise-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 14 - 访问网络初步和requests包-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 04 - list -checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 06 - 随机数-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/python_basic_lesson_04-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 05 - 字典 dict, 元组 tuple -checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/python_basic_lesson_03a-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 05 - dict 字典 tuple 元组-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/Python Basic Lesson 08 - 函数简介-checkpoint.ipynb'),\n", + " PosixPath('.ipynb_checkpoints/python_basic_lesson_05-checkpoint.ipynb')]" ] }, - "execution_count": 35, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -1492,9 +1529,6 @@ "source": [ "import pathlib\n", "\n", - "# 获得当前路径\n", - "s_dir = os.getcwd()\n", - "\n", "list(pathlib.Path('.').glob('**/*.ipynb'))\n" ] }, @@ -1564,7 +1598,7 @@ "\n", "## 思考\n", "\n", - "* 想一下,如果要搜索指定目录下的 office 文件,包括 word、excel 和 ppt,然后将搜索到的文件名放在一个字典中,字典的 key 是 doc、xls、ppt 这些后缀,而 value 则是搜索到的文件的绝对路径名的列表;这个题目为我们之后的桌面文档整理程序做准备。" + "* 想一下,如果要搜索指定目录下的 office 文件,包括 word、excel 和 powerpoint 等,然后将搜索到的文件名放在一个字典中,字典的 key 是 doc、xls、ppt 这些后缀,而 value 则是搜索到的文件的绝对路径名的列表;这个题目为我们之后的桌面文档整理程序做准备。" ] }, { diff --git a/python_study_basic_notebook/files/test2.txt b/python_study_basic_notebook/files/test2.txt index e69de29..2c87d95 100644 --- a/python_study_basic_notebook/files/test2.txt +++ b/python_study_basic_notebook/files/test2.txt @@ -0,0 +1,3 @@ +Hello, World! +Hello, Shanghai! +Hello, CHINA! From 3e5b373a91a25ff9acb1b986cb38b9feeb0bbba1 Mon Sep 17 00:00:00 2001 From: yijun_hp_ZHAN Date: Thu, 14 May 2020 22:34:57 +0800 Subject: [PATCH 06/27] 2020.5.14 small edit --- ...351\232\217\346\234\272\346\225\260.ipynb" | 27 ++++++ ...346\225\260\347\256\200\344\273\213.ipynb" | 43 +--------- ...346\234\237\345\207\275\346\225\260.ipynb" | 2 +- ...345\220\215\345\207\275\346\225\260.ipynb" | 4 +- ...345\220\210\345\272\223 collections.ipynb" | 84 ------------------- 5 files changed, 31 insertions(+), 129 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" index 688fbfb..9f34d52 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" @@ -449,6 +449,33 @@ "source": [ "3. 猜数程序修改为机器猜,根据每次人返回的结果来调整策略" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 猜数,机器猜\n", + "\n", + "min = 0\n", + "max = 1000\n", + "\n", + "guess_ok_mark = False\n", + "\n", + "while not guess_ok_mark:\n", + "\n", + " cur_guess = int((min + max) / 2)\n", + " print('I guess:', cur_guess)\n", + " human_answer = input('Please tell me big or small:')\n", + " if human_answer == 'big':\n", + " max = cur_guess\n", + " if human_answer == 'small':\n", + " min = cur_guess\n", + " if human_answer == 'ok':\n", + " print('HAHAHA')\n", + " guess_ok_mark = True" + ] } ], "metadata": { diff --git "a/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" index 8aceef6..e7f00dd 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" @@ -156,7 +156,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "如果上面的函数要修改只有一个 return 应该怎么修改呢?" + "如果上面的函数要修改成只有一个 return 应该怎么修改呢?" ] }, { @@ -548,47 +548,6 @@ " print('final computer win')" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2. 写一个电脑来猜数的程序;" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# 猜数,机器猜\n", - "\n", - "min = 0\n", - "max = 1000\n", - "\n", - "guess_ok_mark = False\n", - "\n", - "while not guess_ok_mark:\n", - "\n", - " cur_guess = int((min + max) / 2)\n", - " print('I guess:', cur_guess)\n", - " human_answer = input('Please tell me big or small:')\n", - " if human_answer == 'big':\n", - " max = cur_guess\n", - " if human_answer == 'small':\n", - " min = cur_guess\n", - " if human_answer == 'ok':\n", - " print('HAHAHA')\n", - " guess_ok_mark = True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, diff --git "a/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" index 4818e54..6b2394a 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" @@ -382,7 +382,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 思考 \n", + "## 思考一下\n", "\n", "* 计算倒计时,现在距离2021元旦距离现在还有多少天" ] diff --git "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" index 3e8d7b2..0198624 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" @@ -15,7 +15,7 @@ "\n", "* 函数不同参数形式\n", "* 匿名函数\n", - "* 思考一下:函数可变参数" + "* 思考一下:函数可变参数练习" ] }, { @@ -517,7 +517,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 思考\n", + "## 思考一下\n", "\n", "函数可变参数练习,kind中增加 max 这个key,如果设置为 ignore,则输入的数字中的最大数忽略" ] diff --git "a/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" index 87508cf..947aed4 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" @@ -19,7 +19,6 @@ " * defaultdict: 带有默认值的字典\n", " * OrderedDict: 有序字典\n", " * Counter: 计数器\n", - "* 异常错误处理简介\n", "* 思考一下\n" ] }, @@ -901,89 +900,6 @@ "\n" ] }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">--------------------\n", - "->-------------------\n", - "-->------------------\n", - "--->-----------------\n", - "---->----------------\n", - "----->---------------\n", - "------>--------------\n", - "------->-------------\n", - "-------->------------\n", - "--------->-----------\n", - "---------->----------\n", - "----------->---------\n", - "------------>--------\n", - "------------->-------\n", - "-------------->------\n", - "--------------->-----\n", - "---------------->----\n", - "----------------->---\n", - "------------------>--\n", - "------------------->-\n", - "-------------------->\n", - ">--------------------\n", - "->-------------------\n", - "-->------------------\n", - "--->-----------------\n", - "---->----------------\n", - "----->---------------\n", - "------>--------------\n", - "------->-------------\n", - "-------->------------\n", - "--------->-----------\n", - "---------->----------\n", - "----------->---------\n", - "------------>--------\n", - "------------->-------\n", - "-------------->------\n", - "--------------->-----\n", - "---------------->----\n", - "----------------->---\n", - "------------------>--\n", - "------------------->-\n", - "-------------------->\n", - ">--------------------\n", - "->-------------------\n", - "-->------------------\n", - "--->-----------------\n", - "---->----------------\n", - "----->---------------\n", - "------>--------------\n", - "------->-------------\n", - "-------->------------\n", - "--------->-----------\n", - "---------->----------\n", - "----------->---------\n", - "------------>--------\n", - "------------->-------\n", - "-------------->------\n", - "--------------->-----\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\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 7\u001b[0m \u001b[0mfancy_loading\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrotate\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[0;32m 8\u001b[0m \u001b[0msys\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstdout\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflush\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----> 9\u001b[1;33m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.08\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [] - }, { "cell_type": "code", "execution_count": null, From 829b94c5745125de63f983f134f0cbddaf1e8165 Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Sat, 16 May 2020 09:26:09 +0800 Subject: [PATCH 07/27] 2020.5.15 small edit --- ...ython Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" index 1bc874a..b290bea 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" @@ -242,7 +242,7 @@ ], "source": [ "# 列表追加另一个列表的元素\n", - "# 使用 extned 一个列表,会以元素的形式追加到原来的列表\n", + "# 使用 extend 一个列表,会以元素的形式追加到原来的列表\n", "\n", "a = ['pig', 'cat', 'dog', 'snake']\n", "b = ['cat1', 'cat2', 'cat3']\n", From e0050506f45ebebce02a4cdcf4787405fb2b54dd Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Sun, 17 May 2020 21:13:32 +0800 Subject: [PATCH 08/27] 2020.5.17 edit filename etc. --- ...esson 08 - \345\207\275\346\225\260.ipynb" | 39 ++++++++++++- ...346\234\237\345\207\275\346\225\260.ipynb" | 12 ++-- ...345\220\215\345\207\275\346\225\260.ipynb" | 2 +- ...345\220\210\345\272\223 collections.ipynb" | 56 +++++++++++++++++-- ...347\224\237\346\210\220\345\274\217.ipynb" | 23 +++++++- ...\223\346\236\204\345\222\214 pprint.ipynb" | 4 +- ...351\227\256\347\275\221\347\273\234.ipynb" | 9 +++ 7 files changed, 126 insertions(+), 19 deletions(-) rename "python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" => "python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" (93%) rename "python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234\345\210\235\346\255\245\345\222\214requests\345\214\205.ipynb" => "python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" (99%) diff --git "a/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" similarity index 93% rename from "python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" rename to "python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" index e7f00dd..daf88ba 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" @@ -490,9 +490,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 scissors , 1 stone , 2 cloth , please input:1\n", + "1 stone\n", + "draw\n", + "human:computer 0 : 0\n", + "\n", + "0 scissors , 1 stone , 2 cloth , please input:2\n", + "1 stone\n", + "human win\n", + "human:computer 1 : 0\n", + "\n", + "0 scissors , 1 stone , 2 cloth , please input:2\n", + "1 stone\n", + "human win\n", + "human:computer 2 : 0\n", + "\n", + "0 scissors , 1 stone , 2 cloth , please input:1\n", + "0 scissors\n", + "human win\n", + "human:computer 3 : 0\n", + "\n", + "final human win\n" + ] + } + ], "source": [ "# 五局三胜的剪刀石头布程序\n", "\n", @@ -548,6 +576,13 @@ " print('final computer win')" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "思考一下:上面的这个五局三胜的用户交互界面实在有点丑陋,所以我们看看能不能做得更加好一些,信息显示更加完善,提升用户体验。" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git "a/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" index 6b2394a..7a32ae5 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" @@ -8,13 +8,13 @@ "\n", "* Python Basic, Lesson 4, v1.0.1, 2016.12 by David.Yi \n", "* Python Basic, Lesson 4, v1.0.2, 2017.03 modified by Yimeng.Zhang\n", - "* v1.1,2020.4 edit by David Yi\n", + "* v1.1,2020.4 5, edit by David Yi\n", "\n", " \n", "### 本次内容要点\n", "\n", "* 日期函数库 datetime 用法介绍,datetime、time 等库的介绍,获得日期,字符串和日期转换,日期格式介绍,日期加减计算\n", - "* 思考一下\n", + "* 思考一下:距离某个日期还有几天\n", "\n" ] }, @@ -413,11 +413,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "思考一下:能否做成一个函数,用户输入日期,比如 2021-1-1,然后告知用户距离今天还有多少天。对于用户输入的日期要做判断,格式上是否合法等。" + ] } ], "metadata": { diff --git "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" index 0198624..bf5182e 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" @@ -519,7 +519,7 @@ "source": [ "## 思考一下\n", "\n", - "函数可变参数练习,kind中增加 max 这个key,如果设置为 ignore,则输入的数字中的最大数忽略" + "函数可变参数练习,参数 kind 中增加 max 这个key,如果设置为 ignore,则输入的数字中的最大数忽略" ] }, { diff --git "a/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" index 947aed4..ccbc1fe 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" @@ -398,9 +398,9 @@ "source": [ "## defaultdict\n", "\n", - "我们都知道,在使用Python原生的数据结构dict的时候,如果用 d[key] 这样的方式访问, 当指定的key不存在时,是会抛出KeyError异常的,也就是发生错误。(当然可以用 get 方法来避免这样的错误)\n", + "我们都知道,在使用 Python 原生数据结构字典的时候,如果用 d[key] 这样的方式访问,当指定的key不存在时,是会抛出KeyError异常的,也就是发生错误。(可以用 get 方法来避免这样的错误)\n", "\n", - "如果使用defaultdict,只要你传入一个默认的方法,那么请求一个不存在的key时, 便会调用这个方法,使用其结果来作为这个key的默认值。" + "如果使用 defaultdict,只要你传入一个默认的方法,那么请求一个不存在的 key 时,便会调用这个方法,使用其结果来作为这个key的默认值。" ] }, { @@ -897,15 +897,59 @@ "metadata": {}, "source": [ "## 思考一下\n", - "\n" + "\n", + "1. 回文数:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数,比如 121 就是一个回文数,201 就不是。" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 回文数\n", + "# 参考 leetcode 用了类来表示\n", + "\n", + "class Solution:\n", + " def isPalindrome(self, x: int) -> bool:\n", + " x = str(x)\n", + " return x == x[::-1]\n", + "\n", + "Solution().isPalindrome(x='121')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "类似 -> bool 这样的标示是类型标注,从 python 3.5 开始引入这个功能,表明改函数返回的类型是什么。写了可以提高代码的可读性。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "在 leetcode 上有这道题目 https://leetcode-cn.com/problems/palindrome-number/\n", + "\n", + "如上的方式是最简单的,能够通过,但是我们看一下反馈结果:\n", + "\n", + "执行用时 : 84 ms, 在所有 Python3 提交中击败了 66.08% 的用户\n", + "内存消耗 : 13.5 MB, 在所有 Python3 提交中击败了 5.88% 的用户\n", + "\n", + "执行速度还不错,但是内存消耗有点大。\n", + "\n" + ] } ], "metadata": { diff --git "a/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" index 489333b..b23c0b5 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" @@ -7,11 +7,11 @@ "# Lesson 12\n", "\n", "* v1.0.0,2016.10 by David.Yi\n", - "* v1.1, 2020.4.30 edit by David Yi\n", + "* v1.1, 2020.4.30 5,edit by David Yi\n", "\n", "## 本次内容要点\n", "* 列表生成器用法\n", - "* 思考一下" + "* 思考一下:整理文件的应用需要哪些功能" ] }, { @@ -289,8 +289,25 @@ "source": [ "## 思考一下\n", "\n", - "写一个程序,通过预先设定的后缀,将桌面上的文件自动归类到不同的文件夹,文件夹和后缀的关系是一对多的关系,可以自己定义。" + "我习惯将所有的文件存放在文档目录,然后一周到两周整理一次,但是我发现这个是一个很辛苦的事情,也比较无聊。我们尝试写一个根据一些基本规则来整理文件的程序。\n", + "\n", + "1. 整理文件的规则之一是根据文件名中的关键字,存放到指定的文件夹中\n", + "2. 文件名关键字-文件夹的关系可以自定义\n", + "3. 可以在文件夹下面建立一层按照周或者月的日期范围文件夹,相关文件根据文件创建日期可以放到相应文件夹\n", + "\n", + "大家看看还需要什么功能?\n", + "\n", + "作为一个小小的产品,也可以遵循产品开发的流程,我们先明确需求,先了解好用户需要的功能,再做抽象和归纳。\n", + "\n", + "这个思考一下的场景会比较复杂,我们循序渐进。" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git "a/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" index 28e5958..641d493 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" @@ -13,7 +13,9 @@ "## 本次内容要点\n", "* for break continue else:完整的 for 语句结构 \n", "* pprint 高级打印模块使用\n", - "* 思考一下:四则运算器" + "* 思考一下:\n", + " * 简单的四则运算器实现\n", + " * 更加通用的四则运算器实现" ] }, { diff --git "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234\345\210\235\346\255\245\345\222\214requests\345\214\205.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" similarity index 99% rename from "python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234\345\210\235\346\255\245\345\222\214requests\345\214\205.ipynb" rename to "python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" index 84bd9c4..daa7dd6 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234\345\210\235\346\255\245\345\222\214requests\345\214\205.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" @@ -322,6 +322,15 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 思考一下\n", + "\n", + "如果我们要开发一个简单的信息同步软件,比如一个简单的文本笔记本,在 A 电脑上使用,然后在 B 电脑上打开的时候,就可以同步。我们限制同时只有一台电脑可以编辑。做这样的同步,我们需要考虑哪些要素。" + ] + }, { "cell_type": "code", "execution_count": null, From d5a96e12d1555c2280447c50b7aced56f71cf8ad Mon Sep 17 00:00:00 2001 From: yijun_hp_ZHAN Date: Tue, 19 May 2020 22:55:25 +0800 Subject: [PATCH 09/27] 2020.5.19 small edit --- ...\207\345\244\204\347\220\206 Pillow.ipynb" | 4 +- ...345\274\217\347\274\226\347\250\213.ipynb" | 99 +++---------------- 2 files changed, 15 insertions(+), 88 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" index 6802ac9..86a6d62 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" @@ -12,15 +12,13 @@ "\n", "## 本次内容要点\n", "* 图片处理模块 PIL \n", - "* 思考一下" + "* 思考一下: 简单图片处理" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "---\n", - "\n", "### PIL (Pillow) 模块介绍\n", "\n", "PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。\n", diff --git "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" index 81f7405..cbfafcc 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" @@ -8,7 +8,7 @@ "source": [ "# Lesson 16\n", "\n", - "* v1.1, 2020.5.6 edit by David Yi\n", + "* v1.1, 2020.5 edit by David Yi\n", "\n", "\n", "## 本次内容\n", @@ -51,8 +51,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "---\n", - "\n", "在这个例子中,我们在函数 lazy_sum 中又定义了函数 sum,并且,内部函数 sum 可以引用外部函数 lazy_sum 的参数和局部变量,当 lazy_sum 返回函数 sum 时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”。\n", "\n", "一个函数可以返回一个计算结果,也可以返回一个函数。\n", @@ -64,9 +62,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "##### 偏函数\n", + "## 偏函数\n", "\n", - "Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。\n", + "python 的 functools 模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。\n", "\n", "在介绍函数参数的时候,我们讲到,通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点。" ] @@ -98,7 +96,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "虽然默认参数还是很容易使用,但是如果我们在某个场景需要大量调用的话,还是有点方便,特别是对于有很多参数的函数来说,会让程序先的复杂。还记得之前那个 max min 的程序么?" + "虽然默认参数还是很容易使用,但是如果我们在某个场景需要大量调用的话,还是有点不方便,特别是对于有很多参数的函数来说,会让程序显得复杂。还记得之前那个 max min 的程序么?我们可以用偏函数来解决整个问题。" ] }, { @@ -154,26 +152,18 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 1, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "7\n", - "7\n" - ] - }, - { - "ename": "TypeError", - "evalue": "func() got multiple values for argument 'z'", + "ename": "NameError", + "evalue": "name 'func' is not defined", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: func() got multiple values for argument 'z'" + "\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 1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mfunctools\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mf1\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfunctools\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpartial\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mz\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\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 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf1\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[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\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;31mNameError\u001b[0m: name 'func' is not defined" ] } ], @@ -186,74 +176,13 @@ "print(f1(2,3,4)) # 会报错,不需要再输入 z 的值" ] }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "10\n" - ] - } - ], - "source": [ - "# 思考一下\n", - "\n", - "a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n", - "print(a[1])\n", - "print(a[-1])" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 2, 4, 6, 8, 10]\n", - "[10, 8, 6, 4, 2, 0]\n" - ] - } - ], - "source": [ - "print(a[::2])\n", - "print(a[::-2])" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "abababcd\n", - "a-b-ab-abcd\n" - ] - } - ], - "source": [ - "a = ['a', 'b', 'ab', 'abcd']\n", - "print(\"\".join(a))\n", - "print(\"-\".join(a))\n" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "##### map() 函数\n", + "## map() 函数\n", "\n", - "Python内建了 map() 和 reduce() 这两个功能强大的函数。\n", + "python内建了 map() 和 reduce() 这两个功能强大的函数。\n", "\n", "我们先看 map。map() 函数接收两个参数,一个是函数,一个是可迭代的序列,比如 list,map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 Iterator 可迭代值返回。\n", "\n", @@ -261,7 +190,7 @@ "\n", "![](map.png)\n", "\n", - "> 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念。在 hadoop 时代,map/reduce 的理念是高效并行运算的核心。" + "> 如果你知道 Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念。在 hadoop 时代,map/reduce 的理念是高效并行运算的核心。" ] }, { From aff5e04ff63d24ffcad3b2d852dc3f56b0611e89 Mon Sep 17 00:00:00 2001 From: yijun_hp_ZHAN Date: Wed, 20 May 2020 22:58:48 +0800 Subject: [PATCH 10/27] 2020.5.20 edit Lesson 16 --- ...260\345\274\217\347\274\226\347\250\213.ipynb" | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" index cbfafcc..2fceb1c 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" @@ -248,7 +248,7 @@ } ], "source": [ - "# 这个 f(x) 函数可以更加复杂\n", + "# 这个 f(x) 函数可以比较复杂,包含更多逻辑\n", "\n", "def f(x):\n", " y = x * x + 3\n", @@ -281,7 +281,7 @@ } ], "source": [ - "# 进行 map 处理的数据也可以很复杂\n", + "# 进行 map 处理的数据也可以复杂一些\n", "\n", "def f(x):\n", " y = x * x + 3\n", @@ -543,16 +543,7 @@ "\n", "一般来说,一个函数的代码不要超过20行。\n", "\n", - "复杂的项目,一般要采用面向对象的开发方式,才能有利于维护和更新。\n", - "\n", - "---\n", - "\n", - "python 函数式编程的基本功能点:\n", - "\n", - "函数作为返回值\n", - "偏函数\n", - "高阶函数 map/reduce, filter, sorted\n", - "匿名函数 lambda" + "复杂一些的项目,肯定要采用面向对象的开发方式,才能有利于维护和更新。" ] }, { From 601ab867357ba6c8b9c8ffde9d9770b97a958704 Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Thu, 21 May 2020 20:28:11 +0800 Subject: [PATCH 11/27] 2020.5.21 small edit --- ...esson 08 - \345\207\275\346\225\260.ipynb" | 101 +++++++++++++----- ...346\234\237\345\207\275\346\225\260.ipynb" | 12 ++- 2 files changed, 81 insertions(+), 32 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" index daf88ba..fa2b6d5 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" @@ -105,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -193,7 +193,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "(1, 5, 30, 14, 25)\n", + "\n", "100\n" ] } @@ -203,7 +203,7 @@ "# 为了简化程序逻辑,返回的结果现在是假的,后面我们会再修改\n", "\n", "def my_max(*number):\n", - " print(number)\n", + " print(type(number))\n", " return 100\n", "\n", "print(my_max(1,5,30,14,25))" @@ -211,14 +211,19 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "30\n" + "ename": "TypeError", + "evalue": "'<' not supported between instances of 'str' and 'int'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmy_max\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m30\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m14\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m25\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'40'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mmy_max\u001b[0;34m(*number)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmy_max\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0ma_list\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0ma_list\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: '<' not supported between instances of 'str' and 'int'" ] } ], @@ -303,32 +308,32 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "plese input a word:test\n", - "1\n" + "plese input a word:reason\n", + "3\n" ] } ], "source": [ "# 判断元音\n", "\n", - "def yuanyin(s):\n", + "def reason(s):\n", " b = ['a','e','i','o','u']\n", " c = 0\n", - " for i in list(a):\n", + " for i in list(s):\n", " if i in b:\n", " # c=c+1 的简约写法\n", " c += 1\n", " return c\n", "\n", "a = input('plese input a word:')\n", - "print(yuanyin(a))" + "print(reason(a))" ] }, { @@ -404,9 +409,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0:剪刀 1:石头 2:布\n", + "你出了:2\n", + "电脑出了 石头\n", + "human win\n" + ] + } + ], "source": [ "# 简单的剪刀石头布\n", "\n", @@ -448,9 +464,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 scissors , 1 stone , 2 cloth , please input:0\n", + "human: 0 scissors\n", + "computer: 2 cloth\n", + "human win\n" + ] + } + ], "source": [ "# 优化的剪刀石头布程序\n", "\n", @@ -490,7 +517,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -498,26 +525,46 @@ "output_type": "stream", "text": [ "0 scissors , 1 stone , 2 cloth , please input:1\n", - "1 stone\n", + "2 cloth\n", + "computer win\n", + "human:computer 0 : 1\n", + "\n", + "0 scissors , 1 stone , 2 cloth , please input:0\n", + "2 cloth\n", "draw\n", - "human:computer 0 : 0\n", + "human:computer 0 : 1\n", "\n", "0 scissors , 1 stone , 2 cloth , please input:2\n", "1 stone\n", "human win\n", - "human:computer 1 : 0\n", + "human:computer 1 : 1\n", "\n", "0 scissors , 1 stone , 2 cloth , please input:2\n", + "2 cloth\n", + "draw\n", + "human:computer 1 : 1\n", + "\n", + "0 scissors , 1 stone , 2 cloth , please input:0\n", "1 stone\n", - "human win\n", - "human:computer 2 : 0\n", + "computer win\n", + "human:computer 1 : 2\n", "\n", "0 scissors , 1 stone , 2 cloth , please input:1\n", - "0 scissors\n", + "1 stone\n", + "draw\n", + "human:computer 1 : 2\n", + "\n", + "0 scissors , 1 stone , 2 cloth , please input:2\n", + "1 stone\n", "human win\n", - "human:computer 3 : 0\n", + "human:computer 2 : 2\n", + "\n", + "0 scissors , 1 stone , 2 cloth , please input:2\n", + "0 scissors\n", + "computer win\n", + "human:computer 2 : 3\n", "\n", - "final human win\n" + "final computer win\n" ] } ], diff --git "a/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" index 7a32ae5..e84acdd 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" @@ -152,14 +152,14 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "time: 0.010952472686767578\n" + "time: 0.013781070709228516\n" ] } ], @@ -389,14 +389,15 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "233\n" + "2938 days, 10:36:10.522469\n", + "2938\n" ] } ], @@ -404,11 +405,12 @@ "from datetime import datetime\n", "\n", "#日期格式转换\n", - "newyear = datetime.strptime('2021-01-01', '%Y-%m-%d')\n", + "newyear = datetime.strptime('2028-06-07', '%Y-%m-%d')\n", "#获取现在的时间\n", "now = datetime.now()\n", "#时间差\n", "timedelta = newyear-now\n", + "print(timedelta)\n", "print(timedelta.days)" ] }, From c840b8548bb1dd2d3939923eee07337c5c6ca673 Mon Sep 17 00:00:00 2001 From: yijun_hp_ZHAN Date: Sat, 23 May 2020 08:20:16 +0800 Subject: [PATCH 12/27] 2020.5.23 small edit --- ...2\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" | 2 +- ...11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" index bf5182e..8b53f65 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" @@ -8,7 +8,7 @@ "\n", "* Python Basic, Lesson 4, v1.0.1, 2016.12 by David.Yi \n", "* Python Basic, Lesson 4, v1.0.2, 2017.03 modified by Yimeng.Zhang\n", - "* v1.1, 2020.4 edit by David Yi\n", + "* v1.1, 2020.4 5,edit by David Yi\n", "\n", " \n", "### 本次内容要点\n", diff --git "a/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" index ccbc1fe..fed9d2a 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" @@ -19,7 +19,7 @@ " * defaultdict: 带有默认值的字典\n", " * OrderedDict: 有序字典\n", " * Counter: 计数器\n", - "* 思考一下\n" + "* 思考一下:回文数\n" ] }, { From f17c06dd224670549fa8d42f878fee5d866f607d Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Sun, 24 May 2020 08:35:30 +0800 Subject: [PATCH 13/27] 2020.5.23 small edit and Lesson 16 --- ...351\232\217\346\234\272\346\225\260.ipynb" | 5 ++-- ...345\275\225\346\223\215\344\275\234.ipynb" | 2 +- ...347\224\237\346\210\220\345\274\217.ipynb" | 27 +++++++++++++++---- ...351\227\256\347\275\221\347\273\234.ipynb" | 2 +- ...\207\345\244\204\347\220\206 Pillow.ipynb" | 4 ++- ...345\274\217\347\274\226\347\250\213.ipynb" | 8 ++++-- 6 files changed, 35 insertions(+), 13 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" index 9f34d52..8d157dc 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" @@ -6,7 +6,7 @@ "source": [ "# Lesson 6\n", "\n", - "v1.1, 2020.4 edit by David Yi\n", + "v1.1, 2020.4 5, edit by David Yi\n", "\n", " \n", "### 本次内容要点\n", @@ -32,8 +32,7 @@ "* random.random() 用于生成一个0到1的随机浮点数\n", "* random.uniform() 用于生成一个指定范围内的随机浮点数\n", "* random.randint() 生成一个指定范围内的整数\n", - "* random.shuffle() 将一个列表中的元素打乱\n", - "* random.sample() 从指定序列中随机获取指定长度的片断" + "* random.shuffle() 将一个列表中的元素打乱" ] }, { diff --git "a/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" index eafb0ae..86a1852 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" @@ -36,7 +36,7 @@ "* os.chdir(dirname) 改变工作目录到dirname\n", "* os.getenv() 用来读取环境变量\n", "* os.putenv() 用来设置环境变量 \n", - "* os.listdir() 返回指定目录下的所有文件和目录名 \n", + "* os.listdir() 返回指定目录下的所有文件名和目录名 \n", "* os.remove() 删除一个文件\n", "* os.system() 运行shell命令\n", "* os.linesep 字符串给出当前平台使用的行终止符。例如,Windows使用'/r/n',Mac使用'\\n'。\n", diff --git "a/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" index b23c0b5..bfcff7e 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" @@ -23,7 +23,7 @@ "## 列表生成式\n", "\n", "\n", - "列表生成式是 Python 内置的非常简单却强大的可以用来创建list的方法。\n", + "列表生成式是 Python 内置的非常简单却强大的可以用来创建列表list的方法。\n", "\n", "大家都知道,要生成一个这样的 list:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n", "\n", @@ -32,6 +32,23 @@ "那么如果要生成这样的 list:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100],应该怎么办呢?" ] }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n" + ] + } + ], + "source": [ + "print(list(range(1,11)))" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -138,14 +155,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['Pictures', 'PrintHood', 'PycharmProjects']\n" + "['Pictures', 'Public', 'PAServer']\n" ] } ], @@ -156,7 +173,7 @@ "import os\n", "\n", "# 可以判断各类情况,比如第一个是大写的 P 字母, 用列表生成式的方式,代码精简了很多\n", - "list1 = [x for x in os.listdir('/Users/yijun') if x[0:1] == 'P']\n", + "list1 = [x for x in os.listdir('/Users/yijun') if x[0] == 'P']\n", "print(list1)" ] }, @@ -289,7 +306,7 @@ "source": [ "## 思考一下\n", "\n", - "我习惯将所有的文件存放在文档目录,然后一周到两周整理一次,但是我发现这个是一个很辛苦的事情,也比较无聊。我们尝试写一个根据一些基本规则来整理文件的程序。\n", + "我习惯将所有的文件存放在文档目录,然后一周到两周整理一次,但是我发现这个是一个很辛苦的事情,也比较无聊。我们尝试写一个根据一些基本规则来整理文件的程序。(我们终于要开始做这个项目了,市面上相信肯定有专门的软件,做一个不太复杂、也不太简单、实用的工具,是学习编程的乐趣之一)\n", "\n", "1. 整理文件的规则之一是根据文件名中的关键字,存放到指定的文件夹中\n", "2. 文件名关键字-文件夹的关系可以自定义\n", diff --git "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" index daa7dd6..725e308 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" @@ -14,7 +14,7 @@ "* requests 包介绍\n", "* 访问网页\n", "* 调用接口\n", - "* 思考一下" + "* 思考一下:写个同步数据的软件需要注意哪些方面" ] }, { diff --git "a/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" index 86a6d62..ed4579f 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" @@ -584,7 +584,9 @@ "\n", "1. 检查照片的宽度是否大于 1600,如果大于的话,等比例缩小照片到宽度 1600\n", "2. 原来的照片存放到子文件夹 /source 下面,处理过的照片文件名后跟上 _resize 存放在原来的目录\n", - "3. 如果上面的题目难不倒你的话,再把照片的文件名修改为拍照的日期,用 20191001_0001 这样的格式" + "3. 如果上面的题目难不倒你的话,再把照片的文件名修改为拍照的日期,用 20191001_0001 这样的格式\n", + "\n", + "在我们原来的文档整理程序基础上继续演进。" ] }, { diff --git "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" index 2fceb1c..59d2e42 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" @@ -541,9 +541,13 @@ "\n", "对于一些独立的功能、常用的功能,并且有很明显的输入和输出,放到独立函数中,是比较好的做法。\n", "\n", - "一般来说,一个函数的代码不要超过20行。\n", + "一般来说,一个函数的有效代码不要超过20行。\n", "\n", - "复杂一些的项目,肯定要采用面向对象的开发方式,才能有利于维护和更新。" + "---\n", + "\n", + "复杂的项目,肯定要采用面向对象的开发方式,才能有利于维护和更新。软件架构设计是一门非常复杂的学问,至今我们所学的都是基础,都是一些最基本的编程能力,再复杂的程序也是通过这些语句组合而成,再复杂的概念也是基本概念逐渐演绎推理。基础打好,打的扎实,就可以逐级而上,就可以登高望远。\n", + "\n", + "Python 语言简洁而不简单,几乎具备现代先进的编程语言的所有能力,入门容易精通也难。基础的课程就告一段落了,挂一漏万,也肯定有不少错误,会持续修订。Python 的书籍和网络教程太多了,基础能力方面不打算再去写一遍了,之后会做的是专题分享。" ] }, { From 9932458a288b30128c3fd0a3fb2292cca7dfdd98 Mon Sep 17 00:00:00 2001 From: yijun_hp_ZHAN Date: Sun, 24 May 2020 22:16:55 +0800 Subject: [PATCH 14/27] 2020.5.24 small edit --- .../Python Basic Exercise A.ipynb | 2 +- .../Python Basic Exercise B.ipynb | 727 ------------------ 2 files changed, 1 insertion(+), 728 deletions(-) delete mode 100644 python_study_basic_notebook/Python Basic Exercise B.ipynb diff --git a/python_study_basic_notebook/Python Basic Exercise A.ipynb b/python_study_basic_notebook/Python Basic Exercise A.ipynb index f5944c5..785ba61 100644 --- a/python_study_basic_notebook/Python Basic Exercise A.ipynb +++ b/python_study_basic_notebook/Python Basic Exercise A.ipynb @@ -5,7 +5,7 @@ "metadata": {}, "source": [ "# Python Basic Exercise A\n", - "* v1.1, 2020.4 edit by David Yi" + "* v1.1, 2020.4 5,edit by David Yi" ] }, { diff --git a/python_study_basic_notebook/Python Basic Exercise B.ipynb b/python_study_basic_notebook/Python Basic Exercise B.ipynb deleted file mode 100644 index 5890cda..0000000 --- a/python_study_basic_notebook/Python Basic Exercise B.ipynb +++ /dev/null @@ -1,727 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Please input an integer:300\n", - "More\n" - ] - } - ], - "source": [ - "n = int(input('Please input an integer:'))\n", - "\n", - "if n < 0 :\n", - " print('Negative')\n", - "elif n >= 0 and n < 100:\n", - " print('Between 0..100')\n", - "elif n >= 100 and n < 200:\n", - " print('Between 100..200')\n", - "else :\n", - " print('Others')\n", - "\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Please input an integer:400\n", - "More\n" - ] - } - ], - "source": [ - "n = int(input('Please input an integer:'))\n", - "\n", - "if n < 0 :\n", - " print('Negative')\n", - "else:\n", - " if n >= 0 and n < 100:\n", - " print('Between 0..100')\n", - " else:\n", - " if n >= 100 and n < 200:\n", - " print('Between 100..200')\n", - " else :\n", - " print('More')" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n" - ] - } - ], - "source": [ - "# 找到两个数字中的小的一个\n", - "x, y = 4, 3\n", - "if x < y:\n", - " smaller = x\n", - "else:\n", - " smaller = y\n", - "\n", - "print(smaller)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n" - ] - } - ], - "source": [ - "x, y = 4, 3\n", - "\n", - "smaller = x if x max:\n", - " max = x\n", - " return max\n", - "\n", - "print(find_max([-20,1,6,7,20,5]))" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "20\n" - ] - } - ], - "source": [ - "# Find max number #2\n", - "# 使用递归\n", - "\n", - "def find_max (l):\n", - " if len(l) == 1:\n", - " return l[0]\n", - " v1 = l[0]\n", - " v2 = find_max(l[1:])\n", - " if v1 > v2:\n", - " return v1\n", - " else:\n", - " return v2\n", - "\n", - "print(find_max([1,6,7,20,5]))" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5\n" - ] - } - ], - "source": [ - "print(max(1,3,4,5))" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(2, 4)\n" - ] - } - ], - "source": [ - "print(max((1,2),(2,3),(2,4),(1,5)))" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(2, 4, 1)\n" - ] - } - ], - "source": [ - "print(max((1,2),(2,3),(2,4),(2,4,1)))" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(1, 2)\n" - ] - } - ], - "source": [ - "print(min((1,2),(2,3),(2,4),(2,4,1)))" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "range(0, 10)\n" - ] - } - ], - "source": [ - "print(range(10))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "range(1, 10, 3)\n" - ] - } - ], - "source": [ - "print(range(1,10,3))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "print(type(range(10)))" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "10\n", - "9\n" - ] - } - ], - "source": [ - "print(int('10'))\n", - "print(int(9))" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "143.45\n" - ] - } - ], - "source": [ - "print(float('123.45')+20)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'tom': '100', 'mary': '80', 'jerry': '90'}\n" - ] - } - ], - "source": [ - "l = [('tom', '100'), ('jerry', '90'), ('mary', '80')]\n", - "d = dict(l) \n", - "print(d)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], - "source": [ - "l = [True,True,True,True]\n", - "print(all(l))" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], - "source": [ - "l = [True,True,False,True]\n", - "print(all(l))" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], - "source": [ - "l = [True,True,False,True]\n", - "print(any(l))" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "amy\n", - "tom\n", - "jerry \n" - ] - } - ], - "source": [ - "l = ['amy', 'tom', 'jerry ']\n", - "for item in l:\n", - " print(item)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 amy\n", - "1 tom\n", - "2 jerry \n" - ] - } - ], - "source": [ - "l = ['amy', 'tom', 'jerry ']\n", - "for i, item in enumerate(l):\n", - " print(i, item)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} From e1076ecfbabe8cb33d2f28a9be349d6d7f93e1be Mon Sep 17 00:00:00 2001 From: yijun_hp_ZHAN Date: Mon, 25 May 2020 23:12:45 +0800 Subject: [PATCH 15/27] 2020.5.25 edit Lesson 17 --- .gitignore | 1 + ...345\274\217\347\274\226\347\250\213.ipynb" | 4 +- .../__pycache__/parsetab.cpython-37.pyc | Bin 2619 -> 0 bytes ...345\270\270\345\244\204\347\220\206.ipynb" | 191 ++++++------------ 4 files changed, 71 insertions(+), 125 deletions(-) delete mode 100644 python_study_basic_notebook/__pycache__/parsetab.cpython-37.pyc diff --git a/.gitignore b/.gitignore index dc565ce..fc1788c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ python_basic/.ipynb_checkpoints python_pandas_basic_notebook/COVID-19/.ipynb_checkpoints/ python_study_basic_notebook/.ipynb_checkpoints/ +python_study_basic_notebook/files/ diff --git "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" index 59d2e42..ac643ae 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" @@ -547,7 +547,9 @@ "\n", "复杂的项目,肯定要采用面向对象的开发方式,才能有利于维护和更新。软件架构设计是一门非常复杂的学问,至今我们所学的都是基础,都是一些最基本的编程能力,再复杂的程序也是通过这些语句组合而成,再复杂的概念也是基本概念逐渐演绎推理。基础打好,打的扎实,就可以逐级而上,就可以登高望远。\n", "\n", - "Python 语言简洁而不简单,几乎具备现代先进的编程语言的所有能力,入门容易精通也难。基础的课程就告一段落了,挂一漏万,也肯定有不少错误,会持续修订。Python 的书籍和网络教程太多了,基础能力方面不打算再去写一遍了,之后会做的是专题分享。" + "Python 语言简洁而不简单,几乎具备现代先进的编程语言的所有能力,入门容易精通也难。基础的课程就告一段落了,挂一漏万,也肯定有不少错误,会持续修订。Python 的书籍和网络教程太多了,基础能力方面不打算再去写一遍了,之后会做的是专题分享。\n", + "\n", + "接下来会专门有几个章节课程讲述 python 的面向对象编程,在 python 中一切皆对象。" ] }, { diff --git a/python_study_basic_notebook/__pycache__/parsetab.cpython-37.pyc b/python_study_basic_notebook/__pycache__/parsetab.cpython-37.pyc deleted file mode 100644 index 4f4ca0d02bf57bdbb90472e106aeae8542f17be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2619 zcmb7ETT>%N6z-W!Zj%cT5EfmR(OoWKU0lm5AGRn;SW+bxL?p6XHKJ32(_~YS3zLL` zlyCarBR^mtw8|GB^e6b>&uAZg%Dc6$>jls04(Uk{(dn9R`f|?K-#K%-S5hgP;q(0$ z-+h`%F!nPIE}n7hyo+z+naLP1mx19LV7exRz=AMDAPO;vgI$V20+PX2itUqC0#ed4 zt!-fl?S^3lGB65b@Dhxd#?WR0nJjEKBvQ|UNjV#Xm*Ew-39rJf(wJl&+&hd~0anb8Pvo0ly`qbN%V?#y`$LE5lH`k z@rrl7;+R)zD(>sN?5>v$s%ftabvoM@JB$ZZ#W9xGpW1Gy%v|f_5f6P8{+g|_Pu|}# z-H01KS>iDsh0r8JoSI~xo47WIYjM}+ac&(%&rE;5%(%tli;Ua!Mcc?CJ2Q`lAG0&# z=$FUr;}C=}b5k;Nmn$fRe<6@X`G0OdHQfYiN}{I3|I(C{ntnh{$*v~+_B4Hin#`jw zQBwl$z%>Rc(v&~P=;Lwep2^&qfxF^gBE&L_s}sgkQ?Z+?Ob|33z{p1|J`0{ z4iH?&-%X3&K=)Ah;O@>e2EFH~jP_Y}6B?LPNeoP2{$!5(r!e;&y5Kq%L6{&)5F>~a z(1qB+yO4G8+GCv*L5LtikR(VG3=s?yj1Xi9MhV6c%FoWv&&$6O{D#o^li&}6-)Zgz z!E+j7MX}Cb)Wi2YYYU6YLxg22L`20YA}W-&b%$3$L{v=(i+-*M%YPsuDzze_5|K4U zyjLm0)=9`l+Czm|=iZXjTW*_$S$`6ROJts@xTatd4$Z)mCMf z2MT0gkz@u)@E`>!M*3t_ixsY8J3xYbHZ2lfv$%WAeY$6b?H&4Fg*TtnK%}TorCn^c zeC`g@u(;PmGp~&Ibwe4e84;FKuIU{J(>oTScDas&6MRqIG2ssk{X+ diff --git "a/python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" "b/python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" index adc78dd..62ba3fd 100644 --- "a/python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" +++ "b/python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" @@ -6,10 +6,24 @@ "collapsed": true }, "source": [ - "## 异常错误处理\n", + "# Lesson 17\n", "\n", - "异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。\n", - "\n" + "* v1.1, 2020.5 edit by David Yi\n", + "\n", + "\n", + "## 本次内容\n", + "\n", + "* 异常处理\n", + "* 日志处理\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 异常处理\n", + "\n", + "异常是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在 Python 无法正常处理程序时就会发生一个异常。异常也是Python对象,表示一个错误。当 Python 脚本发生异常时我们需要捕获处理它,否则程序会终止执行。\n" ] }, { @@ -31,74 +45,69 @@ "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[0;32m 1\u001b[0m \u001b[1;31m# 看似健壮的程序,输入字母会报错\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'a:'\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 4\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0ma\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[0;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"you cannot input 0\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# 输入字母会报错\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'a:'\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[0;32m 4\u001b[0m \u001b[0mr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m10\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0ma\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'result:'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mValueError\u001b[0m: invalid literal for int() with base 10: 'a'" ] } ], "source": [ - "# 看似健壮的程序,输入字母会报错\n", + "# 输入字母会报错\n", "\n", "a = int(input('a:'))\n", - "if a ==0:\n", - " print(\"you cannot input 0\")\n", - "else: \n", - " r = 10 / a\n", - " print('result:', r)" + "r = 10 / a\n", + "print('result:', r)" ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, + "execution_count": 8, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "a:0\n", - "except: division by zero\n" + "a:a\n", + "except: invalid literal for int() with base 10: 'a'\n" ] } ], "source": [ - "# 防止输入0作为除数\n", + "# 防止输入字母会报错\n", "\n", "try:\n", " a = int(input('a:'))\n", " r = 10 / a\n", " print('result:', r)\n", - "except ZeroDivisionError as e:\n", + "except ValueError as e:\n", " print('except:',e)" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "a:0\n" - ] - }, - { - "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[0;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'a:'\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[0mr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m10\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0ma\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;31mZeroDivisionError\u001b[0m: division by zero" + "a:0\n", + "except: division by zero\n" ] } ], "source": [ - "a = int(input('a:'))\n", - "r = 10 / a" + "# 防止输入0作为除数\n", + "\n", + "try:\n", + " a = int(input('a:'))\n", + " r = 10 / a\n", + " print('result:', r)\n", + "except ZeroDivisionError as e:\n", + " print('except:',e)" ] }, { @@ -224,117 +233,51 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 思考一下\n", + "## 日志处理\n", "\n", "对于防止错误比较有效的一个方式,就是打印日志,平时俗称的log。我们在学习 python 的过程中,经常会用 print 打印出一些变量的值什么的,其实也是日志的一种方式。打印日志一方面是记录正常的操作,另一方面很大的作用就是用在出错的时候检查。日志大部分时候是一种文本文件,便于存储、查询和归档。python 中也有比较完善的日志处理模块。\n", "\n", "实际操作中,日志文件的数量会非常惊人,其实在大数据处理中日志处理也是重要的一项课题。\n", + "\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "log ok\n" + ] + } + ], "source": [ - "## 异常错误处理\n", - "\n", - "异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。\n", - "\n", - "\n", - "\n", - "# 看似健壮的程序,输入字母会报错\n", - "\n", - "a = int(input('a:'))\n", - "if a ==0:\n", - " print(\"you cannot input 0\")\n", - "else: \n", - " r = 10 / a\n", - " print('result:', r)\n", - "\n", - "# 防止输入0作为除数\n", - "\n", - "try:\n", - " a = int(input('a:'))\n", - " r = 10 / a\n", - " print('result:', r)\n", - "except ZeroDivisionError as e:\n", - " print('except:',e)\n", - "\n", - "a = int(input('a:'))\n", - "r = 10 / a\n", - "\n", - "# 如何捕捉多个类型的错误?\n", - "\n", - "try:\n", - " a = int(input('a:'))\n", - " r = 10 / a\n", - " print('result:', r)\n", - "except ZeroDivisionError as e:\n", - " print('except:',e)\n", - "except ValueError as e:\n", - " print('except:',e)\n", - "\n", - "\n", - "# try...except...finally\n", - "\n", - "a = int(input('a:'))\n", - "\n", - "try:\n", - " r = 10 / a\n", - " print('result:', r)\n", - "except ZeroDivisionError as e:\n", - " print('except:', e)\n", - "finally:\n", - " print('finish...')\n", - "\n", - "# 防止错误举例\n", - "\n", - "a = 100\n", - "try:\n", - " b = a + c \n", - " print(b)\n", - "except NameError as e:\n", - " print('except:',e)\n", + "from fishbase.fish_logger import *\n", + "from fishbase.fish_file import *\n", "\n", - "# 对 int 进行判断\n", + "log_abs_filename = get_abs_filename_with_sub_path('files', 'fish_test.log')[1]\n", "\n", - "a = input('a:')\n", + "set_log_file(log_abs_filename)\n", "\n", - "# 对输入值转换还有更完善的方法,设定一个转换结果\n", - "try:\n", - " a = int(a)\n", - "except ValueError as e:\n", - " print('except:', e) \n", - " a = 1\n", - "finally:\n", - " print('covert ok')\n", - " \n", - "try:\n", - " r = 10 / a\n", - " print('result:', r)\n", - "except ZeroDivisionError as e:\n", - " print('except:', e)\n", - "finally:\n", - " print('finish...')\n", - "\n", - "## 思考一下\n", - "\n", - "对于防止错误比较有效的一个方式,就是打印日志,平时俗称的log。我们在学习 python 的过程中,经常会用 print 打印出一些变量的值什么的,其实也是日志的一种方式。打印日志一方面是记录正常的操作,另一方面很大的作用就是用在出错的时候检查。日志大部分时候是一种文本文件,便于存储、查询和归档。python 中也有比较完善的日志处理模块。\n", - "\n", - "实际操作中,日志文件的数量会非常惊人,其实在大数据处理中日志处理也是重要的一项课题。\n", + "logger.info('test fish base log')\n", + "logger.warning('test fish base log')\n", + "logger.error('test fish base log')\n", "\n", + "print('log ok')\n", "\n", "\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 432b45c34dc80e571d80b75729fca75e1e01ccec Mon Sep 17 00:00:00 2001 From: yijun_hp_ZHAN Date: Wed, 27 May 2020 22:35:52 +0800 Subject: [PATCH 16/27] 2020.5.27 edit Lesson 17 and Lesson 18 --- ...345\270\270\345\244\204\347\220\206.ipynb" | 6 ++-- ...\235\242\347\274\226\347\250\213 tk.ipynb" | 31 ++++++++++++------- 2 files changed, 22 insertions(+), 15 deletions(-) rename "python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" => "python_study_basic_notebook/Python Basic Lesson 17 - \345\274\202\345\270\270\345\244\204\347\220\206.ipynb" (96%) rename "python_study_basic_notebook/\347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" => "python_study_basic_notebook/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" (90%) diff --git "a/python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 17 - \345\274\202\345\270\270\345\244\204\347\220\206.ipynb" similarity index 96% rename from "python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" rename to "python_study_basic_notebook/Python Basic Lesson 17 - \345\274\202\345\270\270\345\244\204\347\220\206.ipynb" index 62ba3fd..a0c8bcd 100644 --- "a/python_study_basic_notebook/\345\274\202\345\270\270\345\244\204\347\220\206.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 17 - \345\274\202\345\270\270\345\244\204\347\220\206.ipynb" @@ -239,7 +239,7 @@ "\n", "实际操作中,日志文件的数量会非常惊人,其实在大数据处理中日志处理也是重要的一项课题。\n", "\n", - "\n" + "python 自带很完整的日志操作函数包,不过用起来还是有点复杂。一般情况下的日志使用,我们推荐使用 fishbase 函数包中的日志模块,对于日志文件名、文件名日期自动变更都做了一定封装,方便调用。\n" ] }, { @@ -267,9 +267,7 @@ "logger.warning('test fish base log')\n", "logger.error('test fish base log')\n", "\n", - "print('log ok')\n", - "\n", - "\n" + "print('log ok')\n" ] }, { diff --git "a/python_study_basic_notebook/\347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" similarity index 90% rename from "python_study_basic_notebook/\347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" rename to "python_study_basic_notebook/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" index 2ba78f5..865fa61 100644 --- "a/python_study_basic_notebook/\347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" @@ -1,11 +1,23 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Lesson 18\n", + "\n", + "* v1.1, 2020.5 edit by David Yi\n", + "\n", + "\n", + "## 本次内容\n", + "\n", + "* 简单窗口编程" + ] + }, { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "import tkinter\n", @@ -16,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -29,10 +41,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "import tkinter\n", @@ -44,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -76,14 +86,13 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Hello, I am computer\n", "Hello, I am computer\n" ] } From 0c143ddc1b7cc6508d84f47342128ea9476e8b39 Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Thu, 28 May 2020 15:49:10 +0800 Subject: [PATCH 17/27] 2020.5.28 small edit --- ...345\220\210\345\272\223 collections.ipynb" | 20 ++++--- ...\207\345\244\204\347\220\206 Pillow.ipynb" | 54 ++++++++++++++---- .../test_thumbnail.jpg | Bin 2486 -> 0 bytes 3 files changed, 54 insertions(+), 20 deletions(-) delete mode 100644 python_study_basic_notebook/test_thumbnail.jpg diff --git "a/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" index fed9d2a..37d9678 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" @@ -56,14 +56,15 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1 2\n" + "1 2\n", + "\n" ] } ], @@ -72,9 +73,10 @@ "\n", "from collections import namedtuple\n", "\n", - "Point = namedtuple('Point', ['x', 'y'])\n", + "point = namedtuple('Point', ['x', 'y'])\n", "p = Point(1, 2)\n", - "print(p.x, p.y) " + "print(p.x, p.y) \n", + "print(type(p))" ] }, { @@ -265,7 +267,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "metadata": { "scrolled": true }, @@ -274,8 +276,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.011995315551757812\n", - "0.0009975433349609\n" + "0.03583407402038574\n", + "0.0000638961791992\n" ] } ], @@ -759,14 +761,14 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[(' ', 6), ('s', 4), ('a', 3), ('c', 3), ('u', 2), ('t', 2), ('i', 2), ('o', 1), ('n', 1), ('e', 1), ('r', 1), ('d', 1), ('b', 1), ('l', 1), ('.', 1)]\n" + "[(' ', 6), ('s', 4), ('a', 3), ('c', 3), ('u', 2)]\n" ] } ], diff --git "a/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" index ed4579f..452c9d1 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" @@ -34,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -67,7 +67,7 @@ "" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -310,19 +310,19 @@ "\n", "##### 增强效果方法列表\n", "\n", - "class PIL.ImageEnhance.Color(image) 调整图片的颜色\n", + "* class PIL.ImageEnhance.Color(image) 调整图片的颜色\n", "\n", "该类可以用于以类似于彩色电视机上的控件的方式调整图像的色彩平衡,增强因子为 0.0 给出黑白图像,因子 1.0 给出原始图像。\n", "\n", - "class PIL.ImageEnhance.Contrast(image) 调整图像对比度\n", + "* class PIL.ImageEnhance.Contrast(image) 调整图像对比度\n", "\n", "这个类可以用于控制图像的对比度,类似于电视机上的对比度控制,增强因子 0.0 给出实心灰色图像,因子 1.0 给出原始图像。\n", "\n", - "class PIL.ImageEnhance.Brightness(image) 调整图像亮度\n", + "* class PIL.ImageEnhance.Brightness(image) 调整图像亮度\n", "\n", "这个类可以用来控制图像的亮度,增强因子 0.0 给出黑色图像,因子 1.0 给出原始图像。\n", "\n", - "class PIL.ImageEnhance.Sharpness(image) 调整图像锐度\n", + "* class PIL.ImageEnhance.Sharpness(image) 调整图像锐度\n", "\n", "此类可用于调整图像的锐度,增强因子 0.0 给出模糊图像,因子 1.0 给出原始图像,因子 2.0给出锐化图像。\n" ] @@ -341,7 +341,7 @@ } ], "source": [ - "# 读取照片\n", + "# 读取照片基本信息\n", "\n", "# 导入 PIL 的 Image 模块\n", "from PIL import Image\n", @@ -378,7 +378,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -403,14 +403,46 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "draw image ok\n" + "{'ColorSpace': 1, 'ExifImageWidth': 1924, 'ExifImageHeight': 1080, 'ExifOffset': 38, 'Orientation': 1}\n" + ] + } + ], + "source": [ + "import PIL.Image\n", + "import PIL.ExifTags\n", + "\n", + "img = PIL.Image.open('files/test.jpg')\n", + "\n", + "exif = {\n", + " PIL.ExifTags.TAGS[k]: v\n", + " for k, v in img._getexif().items()\n", + " if k in PIL.ExifTags.TAGS\n", + "}\n", + "\n", + "print(exif)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'PIL'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# 在图片上画线\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mPIL\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mImage\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mImageDraw\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'files/test.jpg'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'PIL'" ] } ], diff --git a/python_study_basic_notebook/test_thumbnail.jpg b/python_study_basic_notebook/test_thumbnail.jpg deleted file mode 100644 index 50600fb80c13ac5fcabf5e2ba28d82dc34271eda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2486 zcmbW!c{tSj9tZH>7>sSKV;N>lhAa_T$~xp|2xUpgR<B);G}mIRqpqC@3NXeEbjrK_TJ2h9+@<2LuN5@PhgHczO4_iF@w=uLPf@ zlCCAcl(QcMjfd&QrWFY&|5D#6eQID$Mc+R%PEbfjRt_$|UsX+A{a>aX}W zZ1NnHU@|+z1*${3Kjdy4xQCXY@VhD3+SJ&WEqx7@P4hTbme&XRv07pNGPcLfJ;yqg z>IhAy^z`orPuV-fp9TOz7RPASYdo)=U}z|lK|O1f{PrW20?ys6+Two@YM$TQ5KYri zk%sKc2R04rMw=9#5j3uuQn#MRaV+sTCEcfr#Dnr`BGne65AFxLH@=!#c1*g--`+31qSf?WS;3#;U6N|~M797YbQzZ$dsQX3qW4T02rTjf`#_3kz(GJC7c`dOuAaqnk3rk!GK} zZ3ZQO(?51^-(AcOtD^O(-&fNBBluz=8&zPypJl>OFHVh5%fOl>YC~w^A+3Z;D$P5q ztKITKnQb$wZrkJNj#;sdTW1rRv_pec+|f}HI5C({Lx{d$vAU=AMCQc1qtP6|byqCp zOxK#Nl-)zMeTUw8OE?T`Uo^8;K8b~9(sXDGQorvi6z+r;PzIYE#eCoal4iK;bsS{3 zrpk6sMTZwgblvS_@TcbWehl5USSz9^k|!C|2fG>Lj;X#D*f41e5`ks3P!tnJ$}Gv> zvV^m-`IfNP(`mzqxm!A1z~{QwwRLfO$BHbf!A0g~9q5jZeatq|d#n4RO~9 zE1JkXUe;`uY<$3W+D2JzZL|1ra@QRZIgiJh8%&f)j z?;SUh1W}I~8N*lXu`qF%TX;>aM-WSfLL3axl#G1)ji9(dxwqq2ISCKX3Hov|F0KBy z9BOJZ`rY@&V0Im%S@ZiRt1Tn0sdTEiwZ{cFP4OqQd;1qq@1kGP^kSONz=+ zjAPZ3lD|jHqWcdI`;3$#hGuO&D?Fp}*uDPYt$A4sSug1i%&dxcnt8fnxl7??>jwasAgL=x2}DWJqT-7 z&j6llIgGh^BR-|nJ-2(6h_ts!@Wbg!ef8|q%iBV*IH=6XaY937upTKmN=xejN%rD) z;!5M{T|x_9IP7}op&qE7_LtooDRi=ZeKoGE)c+(oIHx`Cxb4uYR~n*Sa~s^hD+<*L z{%!GHyerLaVp?dzIpUDzXUfv5PgvibG6o}KNmgRAE0SOuK3f52SjczhhRDkaF^0Ur z>#rhB!1)qfKn%Zfs+2yzzRb*RxqBh{kwCBvy31^Ta{p|H393d>k>yr5eek4CV--o* z7vj=uXVLnKvP;w?{Gj%DJ{W}3vjdsy`w>h8o?)K(`oq#@PN;Ogo~#)K?y}-(ZK8@Z zd0aB(*z@>Comf%*kivFYhg-ZgkBY?IdVaP_i#OTc6xYYeE@Dj&tM5Bh-Jcm8V8E+aiX&t3n5UTQ{t`kEoP7NE-!c1v` zPYiwEsM>`Rxh=WUKzE_t7(}f*siae zCly?zXH`WX&VRV+cl3C_O7veta8?N*2J=UfM|DN#?li-lwG+y28iA(IOK^!XF;<2bGPArB~LtK#7 aTlRS-y(@*`)uf<+$yhAR$z{ljJN736c7enI From bd4f0a139cc840da2b660ac0914203c1209c822a Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Sun, 31 May 2020 14:21:28 +0800 Subject: [PATCH 18/27] 2020.5.31 edit Lesson 16 and else --- ...esson 08 - \345\207\275\346\225\260.ipynb" | 97 +++++++++++-------- ...346\234\237\345\207\275\346\225\260.ipynb" | 20 ++-- ...345\220\215\345\207\275\346\225\260.ipynb" | 89 +---------------- ...347\224\237\346\210\220\345\274\217.ipynb" | 36 +++---- ...\223\346\236\204\345\222\214 pprint.ipynb" | 69 +++++++++++-- ...351\227\256\347\275\221\347\273\234.ipynb" | 6 +- ...345\274\217\347\274\226\347\250\213.ipynb" | 40 +++----- 7 files changed, 163 insertions(+), 194 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" index fa2b6d5..1325795 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" @@ -211,19 +211,14 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "'<' not supported between instances of 'str' and 'int'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmy_max\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m30\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m14\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m25\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'40'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mmy_max\u001b[0;34m(*number)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmy_max\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0ma_list\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0ma_list\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: '<' not supported between instances of 'str' and 'int'" + "name": "stdout", + "output_type": "stream", + "text": [ + "30\n" ] } ], @@ -336,6 +331,32 @@ "print(reason(a))" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 5, 10]\n" + ] + } + ], + "source": [ + "# 计算一个正整数的因数\n", + "\n", + "def yinshu(number):\n", + " b = []\n", + " for i in range(1,number+1):\n", + " if number % i == 0:\n", + " b.append(i)\n", + " return b\n", + "\n", + "print(yinshu(10))" + ] + }, { "cell_type": "code", "execution_count": 5, @@ -409,7 +430,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -418,8 +439,8 @@ "text": [ "0:剪刀 1:石头 2:布\n", "你出了:2\n", - "电脑出了 石头\n", - "human win\n" + "电脑出了 布\n", + "draw\n" ] } ], @@ -464,16 +485,16 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "0 scissors , 1 stone , 2 cloth , please input:0\n", - "human: 0 scissors\n", - "computer: 2 cloth\n", + "0 scissors , 1 stone , 2 cloth , please input:1\n", + "human: 1 stone\n", + "computer: 0 scissors\n", "human win\n" ] } @@ -517,54 +538,44 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "0 scissors , 1 stone , 2 cloth , please input:1\n", - "2 cloth\n", - "computer win\n", - "human:computer 0 : 1\n", - "\n", - "0 scissors , 1 stone , 2 cloth , please input:0\n", - "2 cloth\n", - "draw\n", - "human:computer 0 : 1\n", - "\n", "0 scissors , 1 stone , 2 cloth , please input:2\n", "1 stone\n", "human win\n", - "human:computer 1 : 1\n", + "human:computer 1 : 0\n", + "\n", + "0 scissors , 1 stone , 2 cloth , please input:1\n", + "0 scissors\n", + "human win\n", + "human:computer 2 : 0\n", "\n", "0 scissors , 1 stone , 2 cloth , please input:2\n", "2 cloth\n", "draw\n", - "human:computer 1 : 1\n", + "human:computer 2 : 0\n", "\n", - "0 scissors , 1 stone , 2 cloth , please input:0\n", - "1 stone\n", + "0 scissors , 1 stone , 2 cloth , please input:1\n", + "2 cloth\n", "computer win\n", - "human:computer 1 : 2\n", + "human:computer 2 : 1\n", "\n", "0 scissors , 1 stone , 2 cloth , please input:1\n", "1 stone\n", "draw\n", - "human:computer 1 : 2\n", - "\n", - "0 scissors , 1 stone , 2 cloth , please input:2\n", - "1 stone\n", - "human win\n", - "human:computer 2 : 2\n", + "human:computer 2 : 1\n", "\n", - "0 scissors , 1 stone , 2 cloth , please input:2\n", + "0 scissors , 1 stone , 2 cloth , please input:1\n", "0 scissors\n", - "computer win\n", - "human:computer 2 : 3\n", + "human win\n", + "human:computer 3 : 1\n", "\n", - "final computer win\n" + "final human win\n" ] } ], diff --git "a/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" index e84acdd..640c50a 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" @@ -41,16 +41,16 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2020-05-12 21:24:40.481649\n", - "2020-05-12\n", - "1589289880.4816499\n" + "2020-05-29 13:06:54.013485\n", + "2020-05-29\n", + "1590728814.0138612\n" ] } ], @@ -152,14 +152,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "time: 0.013781070709228516\n" + "time: 0.012572288513183594\n" ] } ], @@ -389,15 +389,15 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2938 days, 10:36:10.522469\n", - "2938\n" + "5852 days, 10:41:57.714259\n", + "5852\n" ] } ], @@ -405,7 +405,7 @@ "from datetime import datetime\n", "\n", "#日期格式转换\n", - "newyear = datetime.strptime('2028-06-07', '%Y-%m-%d')\n", + "newyear = datetime.strptime('2036-06-07', '%Y-%m-%d')\n", "#获取现在的时间\n", "now = datetime.now()\n", "#时间差\n", diff --git "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" index 8b53f65..a76c9e6 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" @@ -424,93 +424,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "几个函数的例子" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 2, 5, 10]\n" - ] - } - ], - "source": [ - "# 计算一个正整数的因数\n", - "\n", - "def yinshu(number):\n", - " b = []\n", - " for i in range(1,number+1):\n", - " if number % i == 0:\n", - " b.append(i)\n", - " return b\n", - "\n", - "print(yinshu(10))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "20\n", - "-3\n" - ] - } - ], - "source": [ - "# 找到最大数 #1\n", + "匿名函数的用法特点\n", "\n", - "def find_max(l):\n", - " \n", - " # max = float('-inf') 表示负无穷大\n", - " max = float('-inf')\n", - " for x in l:\n", - " if x > max:\n", - " max = x\n", - " return max\n", - "\n", - "print(find_max([-20,1,6,7,20,5]))\n", - "print(find_max([-20,-3,-6,-7,-5]))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "20\n" - ] - } - ], - "source": [ - "# 找到最大数 #2\n", - "# 使用递归\n", - "\n", - "def find_max(l):\n", - " if len(l) == 1:\n", - " return l[0]\n", - " v1 = l[0]\n", - " v2 = find_max(l[1:])\n", - " if v1 > v2:\n", - " return v1\n", - " else:\n", - " return v2\n", - "\n", - "print(find_max([1,6,7,20,5]))" + "* 只用一次的场景,不用取名称,因为给函数取名是比较麻烦的一件事;\n", + "* 函数逻辑简单,使用匿名函数前确认 Python 没有自带类似功能的函数,实际开发中,不要去重复发明轮子;\n" ] }, { diff --git "a/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" index bfcff7e..98b89a6 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" @@ -234,7 +234,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -255,49 +255,49 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[range(0, 5), range(5, 10), range(10, 15)]\n", - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]\n" + "{0: 'h', 1: 'e', 2: 'l', 3: 'l', 4: 'o', 5: ' ', 6: 'w', 7: 'o', 8: 'r', 9: 'l', 10: 'd'}\n" ] } ], "source": [ - "# 将矩阵降维\n", - "\n", - "def list_flatten(matrix):\n", - " return [x for row in matrix for x in row]\n", - "\n", - "matrix = [range(0,5),range(5,10),range(10,15)]\n", - "\n", - "print(matrix)\n", + "# 也可以直接使用 dict() 类型转换,因为这里逻辑比较简单\n", "\n", - "print(list_flatten(matrix))" + "dict1 = dict(zip(range(11),s))\n", + "print(dict1)" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{0: 'h', 1: 'e', 2: 'l', 3: 'l', 4: 'o', 5: ' ', 6: 'w', 7: 'o', 8: 'r', 9: 'l', 10: 'd'}\n" + "[range(0, 5), range(5, 10), range(10, 15)]\n", + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]\n" ] } ], "source": [ - "# 也可以直接使用 dict() 类型转换,因为这里逻辑比较简单\n", + "# 将矩阵降维\n", "\n", - "dict1 = dict(zip(range(11),s))\n", - "print(dict1)" + "def list_flatten(matrix):\n", + " return [x for row in matrix for x in row]\n", + "\n", + "matrix = [range(0,5),range(5,10),range(10,15)]\n", + "\n", + "print(matrix)\n", + "\n", + "print(list_flatten(matrix))" ] }, { diff --git "a/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" index 641d493..b45c707 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" @@ -131,9 +131,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook', '/Users/yijun/anaconda3/envs/py37/lib/python37.zip', '/Users/yijun/anaconda3/envs/py37/lib/python3.7', '/Users/yijun/anaconda3/envs/py37/lib/python3.7/lib-dynload', '', '/Users/yijun/anaconda3/envs/py37/lib/python3.7/site-packages', '/Users/yijun/anaconda3/envs/py37/lib/python3.7/site-packages/IPython/extensions', '/Users/yijun/.ipython']\n" + ] + } + ], "source": [ "import sys\n", "print(sys.path)" @@ -141,9 +149,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook',\n", + " '/Users/yijun/anaconda3/envs/py37/lib/python37.zip',\n", + " '/Users/yijun/anaconda3/envs/py37/lib/python3.7',\n", + " '/Users/yijun/anaconda3/envs/py37/lib/python3.7/lib-dynload',\n", + " '',\n", + " '/Users/yijun/anaconda3/envs/py37/lib/python3.7/site-packages',\n", + " '/Users/yijun/anaconda3/envs/py37/lib/python3.7/site-packages/IPython/extensions',\n", + " '/Users/yijun/.ipython']\n" + ] + } + ], "source": [ "import sys\n", "import pprint\n", @@ -152,11 +175,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['/Users/yijun/Documents/dev_python/python_study/python_study_basic_notebook',\n", + " '/Users/yijun/anaconda3/envs/py37/lib/python37.zip',\n", + " '/Users/yijun/anaconda3/envs/py37/lib/python3.7',\n", + " '/Users/yijun/anaconda3/envs/py37/lib/python3.7/lib-dynload',\n", + " '',\n", + " '/Users/yijun/anaconda3/envs/py37/lib/python3.7/site-packages',\n", + " '/Users/yijun/anaconda3/envs/py37/lib/python3.7/site-packages/IPython/extensions',\n", + " '/Users/yijun/.ipython']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# jupyter notebook 中直接显示一些变量的结果就和采用了 pprint 的方法\n", " \n", @@ -166,10 +207,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], "source": [ + "# 实际上对 list 类型比较优雅的处理\n", + "\n", "import sys\n", "print(type(sys.path))" ] @@ -223,7 +274,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "如果你对使用 python 来构造一种语言,比如适用一些场景的 DSL 感兴趣,如果你觉得 lex 和 yacc 这些编译原理中的概念感兴趣的话,可以参考这里:https://www.dabeaz.com/software.html\n", + "如果你对使用 python 来构造一种语言,比如适用一些场景的 DSL 感兴趣,如果你觉得 lex 和 yacc 这些编译原理中的概念感兴趣的话,可以参考python ply包作者的网站:https://www.dabeaz.com/software.html\n", "\n", "Python 下有很多优秀的包,都可以来实现语言定义和解析,但是 ply 是其中最经典的包,从2001年诞生至今,一致在维护更新,并且不断发展。\n", "\n", diff --git "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" index 725e308..8a210b9 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" @@ -298,7 +298,9 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -328,7 +330,7 @@ "source": [ "## 思考一下\n", "\n", - "如果我们要开发一个简单的信息同步软件,比如一个简单的文本笔记本,在 A 电脑上使用,然后在 B 电脑上打开的时候,就可以同步。我们限制同时只有一台电脑可以编辑。做这样的同步,我们需要考虑哪些要素。" + "如果我们要开发一个简单的信息同步软件,比如一个简单的文本笔记本,在 A 电脑上使用,然后在 B 电脑上打开的时候,就可以同步。我们限制同时只有一台电脑可以编辑。做这样的同步,我们需要考虑哪些要素?" ] }, { diff --git "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" index ac643ae..44ead86 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" @@ -13,10 +13,9 @@ "\n", "## 本次内容\n", "\n", - "* 将函数作为值返回\n", - "* 高阶函数 map/reduce filter sorted\n", - "* 匿名函数\n", - "* 偏函数" + "* 闭包:将函数作为值返回\n", + "* 偏函数\n", + "* 高阶函数 map/reduce/filte" ] }, { @@ -33,6 +32,8 @@ } ], "source": [ + "# 将函数作为值返回\n", + "\n", "def lazy_sum(*args):\n", " \n", " def sum():\n", @@ -51,11 +52,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "## 闭包\n", + "\n", "在这个例子中,我们在函数 lazy_sum 中又定义了函数 sum,并且,内部函数 sum 可以引用外部函数 lazy_sum 的参数和局部变量,当 lazy_sum 返回函数 sum 时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”。\n", "\n", "一个函数可以返回一个计算结果,也可以返回一个函数。\n", "\n", - "返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。" + "返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。\n", + "\n", + "闭包和函数的作用域等有关,掌握和理解闭包,对于后续 Python 的深入开发有很大好处,特别是装饰器。" ] }, { @@ -302,9 +307,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "---\n", - "\n", - "##### reduce() 函数\n", + "## reduce() 函数\n", "\n", "再看 reduce 的用法。reduce 把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce 把结果继续和序列的下一个元素做累积计算,其效果就是:\n", "\n", @@ -447,9 +450,7 @@ "collapsed": true }, "source": [ - "---\n", - "\n", - "##### filter() 函数\n", + "## filter() 函数\n", "\n", "Python内建的filter()函数用于过滤序列。\n", "\n", @@ -532,24 +533,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "---\n", - "##### 高阶函数小结\n", + "#### 高阶函数小结\n", "\n", "使用高阶函数可以让代码简洁优雅,好的函数,可以使程序修改和调试都变得容易。\n", "\n", - "函数式编程,相对传统方式比较难理解,但是这样的确比较 pythonic,符合 python 的发展。\n", - "\n", - "对于一些独立的功能、常用的功能,并且有很明显的输入和输出,放到独立函数中,是比较好的做法。\n", - "\n", - "一般来说,一个函数的有效代码不要超过20行。\n", - "\n", - "---\n", - "\n", - "复杂的项目,肯定要采用面向对象的开发方式,才能有利于维护和更新。软件架构设计是一门非常复杂的学问,至今我们所学的都是基础,都是一些最基本的编程能力,再复杂的程序也是通过这些语句组合而成,再复杂的概念也是基本概念逐渐演绎推理。基础打好,打的扎实,就可以逐级而上,就可以登高望远。\n", - "\n", - "Python 语言简洁而不简单,几乎具备现代先进的编程语言的所有能力,入门容易精通也难。基础的课程就告一段落了,挂一漏万,也肯定有不少错误,会持续修订。Python 的书籍和网络教程太多了,基础能力方面不打算再去写一遍了,之后会做的是专题分享。\n", - "\n", - "接下来会专门有几个章节课程讲述 python 的面向对象编程,在 python 中一切皆对象。" + "函数式编程,相对传统方式比较难理解,但是这样的确比较 pythonic,符合 python 的发展。" ] }, { From ebeba5eae774bd765d06deb44957a51c2bf15407 Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Mon, 1 Jun 2020 08:44:56 +0800 Subject: [PATCH 19/27] 2020.6.1 small edit --- ...260\345\274\217\347\274\226\347\250\213.ipynb" | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" index 44ead86..a87261e 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" @@ -461,7 +461,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -483,7 +485,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -497,7 +499,7 @@ "source": [ "# 筛选一个 list 中为空的元素\n", "\n", - "def not_empty(s):\n", + "def is_empty(s):\n", " # strip() 用于移除字符串头尾指定的字符(默认为空格)\n", " if len(s.strip()) ==0:\n", " return False\n", @@ -548,13 +550,6 @@ }, "outputs": [], "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 302a0d27c0dc86bd63abd88716e60909c096060a Mon Sep 17 00:00:00 2001 From: yijun_hp_ZHAN Date: Tue, 2 Jun 2020 22:57:53 +0800 Subject: [PATCH 20/27] 2020.6.2 edit Lesson 16 and --- ...345\274\217\347\274\226\347\250\213.ipynb" | 95 +++++++++++++++---- ...\235\242\347\274\226\347\250\213 tk.ipynb" | 2 +- ...\347\274\226\347\250\213-checkpoint.ipynb" | 74 +++------------ ...347\232\204\347\274\226\347\250\213.ipynb" | 74 +++------------ 4 files changed, 99 insertions(+), 146 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" index a87261e..62e1a9a 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" @@ -8,7 +8,7 @@ "source": [ "# Lesson 16\n", "\n", - "* v1.1, 2020.5 edit by David Yi\n", + "* v1.1, 2020.5,6 edit by David Yi\n", "\n", "\n", "## 本次内容\n", @@ -145,6 +145,7 @@ ], "source": [ "# 偏函数举例\n", + "# 原来的一个函数\n", "\n", "def func(x=2,y=3,z=4):\n", " return x+y+z\n", @@ -173,6 +174,8 @@ } ], "source": [ + "# 构造偏函数,设置默认值\n", + "\n", "import functools\n", "\n", "f1 = functools.partial(func, z=2)\n", @@ -191,7 +194,7 @@ "\n", "我们先看 map。map() 函数接收两个参数,一个是函数,一个是可迭代的序列,比如 list,map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 Iterator 可迭代值返回。\n", "\n", - "举例说明,比如我们有一个函数 f(x) = x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现如下:\n", + "举例说明,比如我们有一个函数 f(x) = x*x,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现如下:\n", "\n", "![](map.png)\n", "\n", @@ -296,13 +299,67 @@ "\n", "print(l)\n", "\n", - "# 主要的程序还是很简洁\n", + "# 主要的程序还是很简洁就可以了\n", "r = map(f, l)\n", "\n", "for i in r:\n", " print(i)" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[12, 7, 6, 17]\n" + ] + } + ], + "source": [ + "def addition(x, y):\n", + " return x + y\n", + " \n", + "numbers1 = [5, 6, 2, 8]\n", + "numbers2 = [7, 1, 4, 9]\n", + "result = map(addition, numbers1, numbers2)\n", + "print(list(result))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 0]\n", + "[1, 2]\n", + "[4, 4]\n", + "[9, 6]\n", + "[16, 8]\n" + ] + } + ], + "source": [ + "def multiply(x):\n", + " return (x*x)\n", + "\n", + "def add(x):\n", + " return (x+x)\n", + "\n", + "funcs = [multiply, add]\n", + "\n", + "for i in range(5):\n", + " value = list(map(lambda x: x(i), funcs))\n", + " print(value)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -339,14 +396,15 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "13579\n" + "13579\n", + "\n" ] } ], @@ -362,12 +420,14 @@ "def char2int(s):\n", " return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]\n", "\n", - "print(reduce(f, map(char2int, '13579')))" + "i=reduce(f, map(char2int, '13579'))\n", + "print(i)\n", + "print(type(i))" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -385,32 +445,29 @@ "source": [ "# 先 map\n", "\n", - "l = map(char2num, '13579')\n", + "l = map(char2int, '13579')\n", "for i in l:\n", " print(i,type(i))" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 7, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "13579" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "13579\n" + ] } ], "source": [ "# 再 reduce\n", "\n", - "l = map(char2num, '13579')\n", - "print(reduce(fn,l))" + "l = map(char2int, '13579')\n", + "print(reduce(f,l))" ] }, { diff --git "a/python_study_basic_notebook/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" index 865fa61..84f5eef 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" @@ -6,7 +6,7 @@ "source": [ "# Lesson 18\n", "\n", - "* v1.1, 2020.5 edit by David Yi\n", + "* v1.1, 2020.5,6 edit by David Yi\n", "\n", "\n", "## 本次内容\n", diff --git "a/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213-checkpoint.ipynb" "b/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213-checkpoint.ipynb" index a1854f6..4e977ca 100644 --- "a/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213-checkpoint.ipynb" +++ "b/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213-checkpoint.ipynb" @@ -83,13 +83,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "Hello!\n", "Hello!\n" ] } @@ -110,24 +111,21 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'self' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mMyData\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSayHello\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'self' is not defined" + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello!\n" ] } ], "source": [ - "# 类直接调用没有意义,报错\n", - "MyData.SayHello()" + "# 类的方法的直接调用,其实还是实例化了\n", + "\n", + "MyData().SayHello()" ] }, { @@ -222,44 +220,6 @@ "obj_math2.Add()" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "思考一下\n", - "\n", - "启动一个最简单的服务器 `python3 -m http.server`\n", - "\n", - "然后在浏览器中 127.0.0.1:8000 来进行访问这个服务器了" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Please input:3\n", - "small\n" - ] - } - ], - "source": [ - "# 输入 n, 如果 n 等于 1 或者 等于 2 或者 等于 3, 显示 small,其他显示 big\n", - "\n", - "n = int(input('Please input:'))\n", - "\n", - "if n in [1,2,3]:\n", - " print('small')\n", - "else:\n", - " print('big')" - ] - }, { "cell_type": "code", "execution_count": 18, @@ -277,19 +237,7 @@ ] } ], - "source": [ - "def multiply(x):\n", - " return (x*x)\n", - "\n", - "def add(x):\n", - " return (x+x)\n", - "\n", - "funcs = [multiply, add]\n", - "\n", - "for i in range(5):\n", - " value = list(map(lambda x: x(i), funcs))\n", - " print(value)" - ] + "source": [] }, { "cell_type": "code", diff --git "a/python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213.ipynb" "b/python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213.ipynb" index a1854f6..4e977ca 100644 --- "a/python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213.ipynb" +++ "b/python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213.ipynb" @@ -83,13 +83,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "Hello!\n", "Hello!\n" ] } @@ -110,24 +111,21 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'self' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mMyData\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSayHello\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'self' is not defined" + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello!\n" ] } ], "source": [ - "# 类直接调用没有意义,报错\n", - "MyData.SayHello()" + "# 类的方法的直接调用,其实还是实例化了\n", + "\n", + "MyData().SayHello()" ] }, { @@ -222,44 +220,6 @@ "obj_math2.Add()" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "思考一下\n", - "\n", - "启动一个最简单的服务器 `python3 -m http.server`\n", - "\n", - "然后在浏览器中 127.0.0.1:8000 来进行访问这个服务器了" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Please input:3\n", - "small\n" - ] - } - ], - "source": [ - "# 输入 n, 如果 n 等于 1 或者 等于 2 或者 等于 3, 显示 small,其他显示 big\n", - "\n", - "n = int(input('Please input:'))\n", - "\n", - "if n in [1,2,3]:\n", - " print('small')\n", - "else:\n", - " print('big')" - ] - }, { "cell_type": "code", "execution_count": 18, @@ -277,19 +237,7 @@ ] } ], - "source": [ - "def multiply(x):\n", - " return (x*x)\n", - "\n", - "def add(x):\n", - " return (x+x)\n", - "\n", - "funcs = [multiply, add]\n", - "\n", - "for i in range(5):\n", - " value = list(map(lambda x: x(i), funcs))\n", - " print(value)" - ] + "source": [] }, { "cell_type": "code", From 8df5250454676de70ba6f2fbf7dc5f527462e359 Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Wed, 3 Jun 2020 20:02:20 +0800 Subject: [PATCH 21/27] 2020.6.3 small edit' --- ...\223\346\236\204\345\222\214 pprint.ipynb" | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" index b45c707..e90246c 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" @@ -238,9 +238,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " please type in the math operation you would like to complete:\n", + " + for addition\n", + " - for subtraction\n", + " * for multiplication\n", + " / for division\n", + " +\n", + "Please enter the first number: 3\n", + "Please enter the second number: 7\n", + "3.0 + 7.0 = 10.0 \n" + ] + } + ], "source": [ "# 简单四则计算器代码,下面代码参考 https://www.jianshu.com/p/c22bfd91df49\n", "\n", @@ -435,6 +452,31 @@ "# (((2+3)*41)-8)+78" ] }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "Interrupted by user", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m~/Documents/dev_python/python_study/python_study_basic_notebook/files/calc.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 124\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 125\u001b[0;31m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'calc > '\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# Use raw_input on Python 2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 126\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mEOFError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 127\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/envs/py37/lib/python3.7/site-packages/ipykernel/kernelbase.py\u001b[0m in \u001b[0;36mraw_input\u001b[0;34m(self, prompt)\u001b[0m\n\u001b[1;32m 861\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_ident\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 862\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_header\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 863\u001b[0;31m \u001b[0mpassword\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 864\u001b[0m )\n\u001b[1;32m 865\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/envs/py37/lib/python3.7/site-packages/ipykernel/kernelbase.py\u001b[0m in \u001b[0;36m_input_request\u001b[0;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[1;32m 891\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 892\u001b[0m \u001b[0;31m# re-raise KeyboardInterrupt, to truncate traceback\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 893\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Interrupted by user\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 894\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 895\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: Interrupted by user" + ] + } + ], + "source": [ + "%run \"files/calc.py\"" + ] + }, { "cell_type": "code", "execution_count": null, From 7b89569754f521168ab59ae8d99f6f80749ca73f Mon Sep 17 00:00:00 2001 From: yijun_hp_ZHAN Date: Wed, 3 Jun 2020 23:00:35 +0800 Subject: [PATCH 22/27] 2020.6.3 edit Lesson 14 --- ...\256\277\351\227\256\347\275\221\347\273\234.ipynb" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" index 8a210b9..2278dc5 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" @@ -123,12 +123,12 @@ "\n", "我们来做一个读取新冠疫情数据的demo。\n", "\n", - "平时我们说的接口,可以简单的理解为满足一定的认证方式后,通过输入参数的值,获得需要的内容。认证方式、入参、出参这些都是事先约定的。包括接口文档、参数列表、自动联调等这些,在目前 python 的接口开发中都是可以自动生成的。python 本身开发接口非常容易,我们另外专门讲述。相对来说,读取调用接口更为常见。" + "平时我们说的接口,可以简单的理解为满足一定的认证方式后,通过输入参数的值,获得需要的内容。认证方式、入参、出参这些都是事先约定的。包括接口文档、参数列表、自动联调等这些,在目前 python 的接口开发中使用一些新技术都是可以自动生成的。python 本身开发接口非常容易,有机会另外专门讲述。相对来说,读取和调用接口的操作更为常见。" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -197,7 +197,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -247,7 +247,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -297,7 +297,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "metadata": { "scrolled": true }, From ebdb35865da6556d185bbecb87c1dbbba99f044d Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Sun, 7 Jun 2020 19:36:19 +0800 Subject: [PATCH 23/27] 2020.6.7 edit Lesson 16 etc. --- ...345\220\215\345\207\275\346\225\260.ipynb" | 2 +- ...351\227\256\347\275\221\347\273\234.ipynb" | 13 +- ...\207\345\244\204\347\220\206 Pillow.ipynb" | 70 +++++----- ...345\274\217\347\274\226\347\250\213.ipynb" | 121 ++++++++---------- 4 files changed, 84 insertions(+), 122 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" index a76c9e6..a00a30e 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" @@ -286,7 +286,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": {}, "outputs": [ { diff --git "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" index 2278dc5..1d0ec6d 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" @@ -7,7 +7,7 @@ "#### Lesson 14 访问网络初步和 requests 包\n", "\n", "* v1.0.0 2016.11 by David.Yi\n", - "* v1.1 2020.5 edit by David Yi\n", + "* v1.1 2020.5 2020.6 edit by David Yi\n", "\n", "\n", "## 本次内容要点\n", @@ -327,17 +327,6 @@ { "cell_type": "markdown", "metadata": {}, - "source": [ - "## 思考一下\n", - "\n", - "如果我们要开发一个简单的信息同步软件,比如一个简单的文本笔记本,在 A 电脑上使用,然后在 B 电脑上打开的时候,就可以同步。我们限制同时只有一台电脑可以编辑。做这样的同步,我们需要考虑哪些要素?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], "source": [] } ], diff --git "a/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" index 452c9d1..50c2ff3 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" @@ -7,12 +7,11 @@ "# Lesson 15\n", "\n", "* Python Senior, Lesson 9, v1.0.0, 2016.11 by David.Yi\n", - "* v1.1, 2020.5.4 edit by David Yi\n", + "* v1.1, 2020.5.4,6.6 edit by David Yi\n", "\n", "\n", "## 本次内容要点\n", - "* 图片处理模块 PIL \n", - "* 思考一下: 简单图片处理" + "* 图片处理模块 PIL " ] }, { @@ -390,7 +389,7 @@ } ], "source": [ - "# 读取照片\n", + "# 读取照片信息\n", "\n", "# 导入 PIL 的 Image 模块\n", "from PIL import Image\n", @@ -403,46 +402,52 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'ColorSpace': 1, 'ExifImageWidth': 1924, 'ExifImageHeight': 1080, 'ExifOffset': 38, 'Orientation': 1}\n" + "{'ExifVersion': b'0230', 'ComponentsConfiguration': b'\\x01\\x02\\x03\\x00', 'CompressedBitsPerPixel': (3, 1), 'DateTimeOriginal': '2020:05:04 12:09:28', 'DateTimeDigitized': '2020:05:04 12:09:28', 'ShutterSpeedValue': (255, 32), 'ApertureValue': (64, 32), 'ExposureBiasValue': (0, 3), 'MeteringMode': 5, 'Flash': 16, 'FocalLength': (22, 1), 'UserComment': b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00', 'ColorSpace': 1, 'ExifImageWidth': 6000, 'ExifInteroperabilityOffset': 15790, 'FocalPlaneXResolution': (6000000, 879), 'SubsecTime': '85', 'SubsecTimeOriginal': '85', 'SubsecTimeDigitized': '85', 'ExifImageHeight': 3368, 'FocalPlaneYResolution': (4000000, 586), 'FocalPlaneResolutionUnit': 2, 'ImageDescription': ' ', 'SensingMethod': 2, 'Make': 'Canon', 'FileSource': b'\\x03', 'ExposureTime': (1, 250), 'XResolution': (180, 1), 'YCbCrPositioning': 2, 'FNumber': (20, 10), 'Copyright': '', 'YResolution': (180, 1), 'ExposureProgram': 1, 'GPSInfo': {0: b'\\x02\\x03\\x00\\x00'}, 'CustomRendered': 0, 'ISOSpeedRatings': 2000, 'ResolutionUnit': 2, 'ExposureMode': 1, 'FlashPixVersion': b'0100', None: 2000, 'WhiteBalance': 0, 'CameraOwnerName': '', 'BodySerialNumber': '324051003555', 'DigitalZoomRatio': (6000, 6000), 'LensSpecification': ((22, 1), (22, 1), (0, 1), (0, 1)), 'LensModel': 'EF-M22mm f/2 STM', 'LensSerialNumber': '000040f250', 'DateTime': '2020:05:04 12:09:28', 'Artist': '', 'SceneCaptureType': 0, 'Model': 'Canon EOS M5', 'Orientation': 1, 'ExifOffset': 386, 'MakerNote': b'.\\x00\\x01\\x00\\x03\\x002\\x00\\x00\\x00\\x0e\\x06\\x00\\x00\\x03\\x00\\x03\\x00\\x04\\x00\\x00\\x00r\\x06\\x00\\x00\\x04\\x00\\x03\\x00\"\\x00\\x00\\x00z\\x06\\x00\\x00\\x06\\x00\\x02\\x00\\x10\\x00\\x00\\x00\\xbe\\x06\\x00\\x00\\x07\\x00\\x02\\x00\\x16\\x00\\x00\\x00\\xce\\x06\\x00\\x00\\x08\\x00\\x04\\x00\\x01\\x00\\x00\\x00%\\xe5\\x13\\x00\\r\\x00\\x04\\x00M\\x0b\\x00\\x00\\xe4\\x06\\x00\\x00\\x10\\x00\\x04\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x94\\x03\\x13\\x00\\x03\\x00\\x04\\x00\\x00\\x00\\x184\\x00\\x00\\x18\\x00\\x01\\x00\\x00\\x01\\x00\\x00 4\\x00\\x00\\x19\\x00\\x03\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x1c\\x00\\x03\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x1e\\x00\\x04\\x00\\x01\\x00\\x00\\x00\\x00\\x07\\x00\\x01\"\\x00\\x03\\x00\\xd0\\x00\\x00\\x00 5\\x00\\x00#\\x00\\x04\\x00\\x02\\x00\\x00\\x00\\xc06\\x00\\x00\\'\\x00\\x03\\x00$\\x00\\x00\\x00\\xc86\\x00\\x00(\\x00\\x01\\x00\\x10\\x00\\x00\\x00\\x107\\x00\\x00-\\x00\\x04\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00.\\x00\\x03\\x00#\\x00\\x00\\x00 7\\x00\\x00/\\x00\\x03\\x00\"\\x00\\x00\\x00f7\\x00\\x001\\x00\\x03\\x00\\x06\\x00\\x00\\x00\\xaa7\\x00\\x003\\x00\\x04\\x00\\x04\\x00\\x00\\x00\\xb67\\x00\\x005\\x00\\x04\\x00\\x04\\x00\\x00\\x00\\xc67\\x00\\x007\\x00\\x04\\x00\\x02\\x00\\x00\\x00\\xd67\\x00\\x008\\x00\\x07\\x00\\x08\\x00\\x00\\x00\\xde7\\x00\\x00<\\x00\\x03\\x00\\xda\\x00\\x00\\x00\\xe67\\x00\\x00=\\x00\\x04\\x00\\x08\\x00\\x00\\x00\\x9a9\\x00\\x00?\\x00\\x04\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x93\\x00\\x03\\x00!\\x00\\x00\\x00\\xba9\\x00\\x00\\x96\\x00\\x02\\x00\\n\\x00\\x00\\x00\\xfc9\\x00\\x00\\x99\\x00\\x04\\x00#\\x00\\x00\\x00\\x06:\\x00\\x00\\x9a\\x00\\x04\\x00\\x05\\x00\\x00\\x00\\x92:\\x00\\x00\\xa0\\x00\\x03\\x00\\x10\\x00\\x00\\x00\\xa6:\\x00\\x00\\xaa\\x00\\x03\\x00\\x06\\x00\\x00\\x00\\xc6:\\x00\\x00\\xd0\\x00\\x04\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x03\\x00\\x03\\x00\\x00\\x00\\xd2:\\x00\\x00\\t@\\x03\\x00\\x03\\x00\\x00\\x00\\xd8:\\x00\\x00\\x10@\\x02\\x00 \\x00\\x00\\x00\\xde:\\x00\\x00\\x12@\\x02\\x00 \\x00\\x00\\x00\\xfe:\\x00\\x00\\x16@\\x04\\x00\\n\\x00\\x00\\x00\\x1e;\\x00\\x00\\x18@\\x04\\x00\\r\\x00\\x00\\x00F;\\x00\\x00 @\\x04\\x00\\x08\\x00\\x00\\x00z;\\x00\\x00#@\\x04\\x00\\x04\\x00\\x00\\x00\\x9a;\\x00\\x00$@\\x04\\x005\\x00\\x00\\x00\\xaa;\\x00\\x00+@\\x04\\x00\\x06\\x00\\x00\\x00~<\\x00\\x00,@\\x04\\x00\\x02\\x00\\x00\\x00\\x96<\\x00\\x00\\x00\\x00\\x00\\x00d\\x00\\x02\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xff\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x7f\\x0f\\x00\\x03\\x00\\x01\\x00\\x05 \\x04\\x00\\xff\\x7f1\\x10\\x16\\x00\\x16\\x00\\x01\\x00@\\x00\\x1d\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xff\\x00\\x01@\\x00p\\x17p\\x17\\x00\\x00\\x00\\x00\\xff\\xff\\x00\\x00\\x00\\x00\\xff\\x7f\\x01\\x00\\x00\\x00\\xff\\xff\\xc8\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00D\\x00o\\x00\\xc0\\x00\\x05\\x00@\\x00\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00@\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\xfb\\xff\\xfa\\x00\\x00\\x00\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00IMG:EOS M5 JPEG\\x00Firmware Version 1.00\\x004-\\x00\\x00\\x14\\x00\\x00\\x00\\x10\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00L\\x01\\x00\\x00\\xac\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\xf8\\x01\\x00\\x00$\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x1c\\x02\\x00\\x00\\xec\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x05\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x08\\x03\\x00\\x00\\xc8\\x04\\x00\\x00\\x02\\x00\\x00\\x00\\x06\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\xd0\\x07\\x00\\x00T\\x05\\x00\\x00\\x01\\x00\\x00\\x00\\x07\\x00\\x00\\x00\\x04\\x00\\x00\\x00$\\r\\x00\\x00,\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x04\\x00\\x00\\x00P\\r\\x00\\x00<\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\t\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x8c\\r\\x00\\x00\\x14\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x0c\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\xa0\\x0e\\x00\\x00,\\x05\\x00\\x00\\x01\\x00\\x00\\x00\\r\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\xcc\\x13\\x00\\x00\\xa0\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x0e\\x00\\x00\\x00\\x04\\x00\\x00\\x00l\\x14\\x00\\x00(\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x0f\\x00\\x00\\x00\\x07\\x00\\x00\\x00\\x94\\x14\\x00\\x00p\\x16\\x00\\x00\\x02\\x00\\x00\\x00\\x10\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x04+\\x00\\x00\\xc8\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\n\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\xcc+\\x00\\x00\\x94\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x0b\\x00\\x00\\x00\\x04\\x00\\x00\\x00`,\\x00\\x00\\xa0\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x00-\\x00\\x004\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x8d\\x03\\x00\\x00@\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xc0\\x00\\x00\\x00\\x00\\x03\\x00\\x00M\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xc0\\x00\\x00\\x00\\x01\\x02\\x00\\x00a\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x13\\x00\\x00\\x00\\xde\\xff\\xff\\xff\\xf3\\xff\\xff\\xff\\xf1\\xff\\xff\\xff\\xef\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x0b\\x00\\x00\\x00\\t\\x00\\x00\\x00\\x11\\x00\\x00\\x003\\x00\\x00\\x00\\x1d\\x00\\x00\\x00\\x00\\xf4\\xff\\xff\\x00\\xf4\\xff\\xff\\x00\\xf4\\xff\\xff\\x00\\xf4\\xff\\xff\\x00\\xf4\\xff\\xff3\\x00\\x00\\x00\\x1d\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\n\\x00\\x00\\x00\\x00\\x00\\x00\\x00$\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00$\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x00\\x00\\x0b\\x01\\x00\\x00\\x94\\x04\\x00\\x00o\\x03\\x00\\x00\\xcf\\x04\\x00\\x00\\x89\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xcf\\x04\\x00\\x00\\x89\\x03\\x00\\x00\\xb5\\x00\\x00\\x00$\\x01\\x00\\x00\\xe3\\x03\\x00\\x00\\x19\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x04\\x00\\x00\\x02\\x00\\x00\\x00\\xed\\x03\\x00\\x00<\\x03\\x00\\x001\\x00\\x00\\x00\\x00\\x04\\x00\\x00\\xd5\\x03\\x00\\x00\\x1a\\t\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xc0\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00`\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x05\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\xca\\x00\\x03\\x00\\x01\\x00 \\x0b]C\\x80x]C\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x05\\x00\\x00\\x00\\xb8\\x02V\\x05\\xba\\x02X\\x05\\x10\\xe5-\\x00\\xc6\\x00N\\x05\\x00\\x00\\x00\\x00@\\x04\\x92\\x07\\x00\\x1911\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x01\\x01\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x05\\x00\\x00\\x00t\\x01\\xe4\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x88\\x01\\x04\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00L\\x0b\\x00\\x00\\xd7\\n\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00q\\x00r\\x00\\x01\\x00\\x02\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x02\\x00\\x02\\x00\\x02\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x00\\x10\\x00\\x10\\x00\\x10\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\n\\x006\\x01|\\x01|\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8f\\x00X\\x01|\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00G\\x00\\x00\\x00B\\x00\\x00\\x008\\x00\\x00\\x00\\n\\x00\\x00\\x00\\x05\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x00\\x04\\x00\\x04\\x00\\x04\\x00\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00D\\x00D\\x00D\\x00D\\x00D\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x13\\x02\\x13\\x02\\x13\\x02\\x13\\x02\\x13\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x1f\\x00?\\x00_\\x00\\x7f\\x00\\x9f\\x00\\xbf\\x00\\xdf\\x00\\xff\\x00\\x00\\x00\"\\x00H\\x00k\\x00\\x89\\x00\\xa5\\x00\\xc1\\x00\\xdf\\x00\\xff\\x00\\x01\\x00Y\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x16\\x00\\x00\\x00t\\x00\\x00\\x00\\xee\\x00\\x00\\x00r\\x01\\x00\\x00\\x00\\x02\\x00\\x00\\x9c\\x02\\x00\\x00M\\x03\\x00\\x00\\t\\x05\\x00\\x00j\\x07\\x00\\x00R\\x0b\\x00\\x00s\\x10\\x00\\x00\\xff?\\x00\\x00\\xff?\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x00\\x00\\x00\\xd0\\x00\\x00\\x00 \\x01\\x00\\x00X\\x01\\x00\\x00l\\x01\\x00\\x00t\\x01\\x00\\x00\\x04\\x01\\x00\\x00\\xa0\\x00\\x00\\x008\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xd7\\xbf6\\x00c56\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xd4\\x00\\x00\\x00\\xd4\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\xaa\\xaa\\x01\\x00\\x00\\x00\\xac\\x8f+\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x00\\x00\\xd5\\x03\\x00\\x00\\x1a\\t\\x00\\x00\\x00\\x04\\x00\\x00\\xed\\x03\\x00\\x00<\\x03\\x00\\x001\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x05\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xc0\\x00\\x00\\x03\\x00\\xf4@\\x02@\\x02\\x00\\x00M\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\xaa\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x04\\xaa\\xaa\\x04\\x00\\x00\\x001\\x10\\x16\\x00\\x14\\x00\\x16\\x00\\x16\\x00\\x19\\x00\\x18\\x00P\\x00\\x18\\x00\\x1a\\x00\\xff\\x00\\x01\\x00\\xd5\\x00\\x00\\x00\\x00\\x00\\x16\\x00\\x1f\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa]\\x00h\\xfe\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\xaa\\xaa\\xaa\\xa2\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8d\\x03\\xaa\\xaa1\\x10\\x16\\x00\\x14\\x00\\x16\\x00\\x16\\x00\\x19\\x00\\x18\\x00P\\x00\\x18\\x00\\xaa\\xaa\\xff\\x00\\xaa\\xaa\\x01\\x00\\x00\\x00\\xd5\\x00\\x00\\x00\\x00\\x00\\x16\\x00\\x1f\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x00\\x0f\\x00\\xff\\x1f\\xc8\\x1f\\xb3\\x1e\\xe7\\x1c\\x0b\\x1b\\x05\\x19\\xd7\\x16\\x9c\\x14\\x89\\x12r\\x10c\\x0e\\x91\\x0c\\x08\\x0b\\xad\\t\\xe2\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xbd\\x00{\\x018\\x02\\xf5\\x02\\xb2\\x03p\\x04-\\x05\\xea\\x05\\xa7\\x06e\\x07\"\\x08\\xdf\\x08\\x9d\\t\\x1a\\n\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00#\\n-\\x00\\x01\\x00i\\x04\\xaa\\xaa\\x00\\x00\\x00\\x00\\x0c\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00 \\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x02\\x02\\x02\\x05\\x02\\x07\\x02\\t\\x02\\x0c\\x02\\x10\\x02\\x13\\x02\\x15\\x02\\x18\\x02\\x1b\\x02\\x1d\\x02\\x1f\\x02\"\\x02$\\x02&\\x02)\\x02+\\x02-\\x020\\x022\\x025\\x027\\x029\\x02<\\x02>\\x02A\\x02C\\x02E\\x02H\\x02J\\x02L\\x02O\\x02Q\\x02T\\x02V\\x02X\\x02[\\x02]\\x02`\\x02b\\x02e\\x02g\\x02i\\x02l\\x02n\\x02q\\x02s\\x02v\\x02x\\x02{\\x02}\\x02\\x80\\x02\\x83\\x02\\x85\\x02\\x88\\x02\\x8a\\x02\\x8d\\x02\\x8f\\x02\\x92\\x02\\x95\\x02\\x97\\x02\\x9a\\x02\\x9c\\x02\\x9f\\x02\\xa2\\x02\\xa5\\x02\\xa7\\x02\\xaa\\x02\\xad\\x02\\xaf\\x02\\xb2\\x02\\xb4\\x02\\xb7\\x02\\xba\\x02\\xbd\\x02\\xbf\\x02\\xc2\\x02\\xc5\\x02\\xc8\\x02\\xcb\\x02\\xcd\\x02\\xd0\\x02\\xd3\\x02\\xd6\\x02\\xd9\\x02\\xdc\\x02\\xdf\\x02\\xe2\\x02\\xe5\\x02\\xe8\\x02\\xeb\\x02\\xee\\x02\\xf1\\x02\\xf4\\x02\\xf7\\x02\\xfa\\x02\\xfd\\x02\\x00\\x03\\x04\\x03\\x07\\x03\\n\\x03\\r\\x03\\x10\\x03\\x14\\x03\\x17\\x03\\x1a\\x03\\x1e\\x03!\\x03$\\x03\\'\\x03+\\x03.\\x031\\x035\\x038\\x03<\\x03?\\x03B\\x03F\\x03I\\x03M\\x03Q\\x03T\\x03X\\x03\\\\\\x03_\\x03c\\x03f\\x03i\\x03m\\x03p\\x03s\\x03v\\x03y\\x03|\\x03\\x7f\\x03\\x83\\x03\\x86\\x03\\x89\\x03\\x8c\\x03\\x90\\x03\\x93\\x03\\x96\\x03\\x9a\\x03\\x9d\\x03\\xa0\\x03\\xa4\\x03\\xa7\\x03\\xab\\x03\\xae\\x03\\xb2\\x03\\xb5\\x03\\xb9\\x03\\xbc\\x03\\xbf\\x03\\xc3\\x03\\xc6\\x03\\xca\\x03\\xcd\\x03\\xd1\\x03\\xd4\\x03\\xd8\\x03\\xdc\\x03\\xdf\\x03\\xe3\\x03\\xe7\\x03\\xea\\x03\\xee\\x03\\xf2\\x03\\xf6\\x03\\xf9\\x03\\xfd\\x03\\x01\\x04\\x05\\x04\\t\\x04\\r\\x04\\x11\\x04\\x14\\x04\\x18\\x04\\x1b\\x04\\x1e\\x04\"\\x04%\\x04)\\x04,\\x04/\\x043\\x046\\x04:\\x04=\\x04A\\x04D\\x04H\\x04K\\x04O\\x04S\\x04V\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04X\\x04\\x18\\x18\\x00\\x00\\x00\\x07\\x00\\x07\\x00\\x07\\x00\\x07UU\\x00\\x00\\x01\\x01\\x00\\x00\\x00\\x10\\x00\\x00\\x17\\x00\\x00\\x00E\\x00/\\x00i\\x00X\\x00\\x89\\x00{\\x00\\x9e\\x00\\x92\\x00\\xac\\x00\\xa5\\x00\\xbe\\x00\\xb5\\x00\\xdb\\x00\\xca\\x00\\x10\\x01\\x00\\x00\\xeb\\x1f\\x00\\x00\\xc6\\x1f\\xd7\\x1f\\xad\\x1f\\xb8\\x1f\\x9f\\x1f\\xa5\\x1f\\x9e\\x1f\\x9c\\x1f\\xa9\\x1f\\xa2\\x1f\\xb0\\x1f\\xae\\x1f\\xa2\\x1f\\xb1\\x1fe\\x1f\\x00\\x00\\xff\\x05\\xff\\t\\xff\\x05\\xff\\t\\x01\\x1a\\x01\\x16\\x01\\x1a\\x01\\x16\\x00\\x02\\x00\\x00\\x01\\xaa\\xaa\\xaa\\x02\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\xb8\\x01\\x80\\x02h\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xa0\\xa1|\\x01\\x00\\x00\\x00\\x80\\x02\\x00\\x00\\x80\\x02\\x00\\x00h\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xc0\\x00\\x00\\x03\\x8d\\x03\\r\\x00\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\x01\\x00\\x00\\x00\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00@\\x02M\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x00\\x00\\x01\\xaa\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xaa\\xaa\\x00\\x00\\x00\\x00,\\xc0\\xdf\\x01U\\x84\\x9f\\x03zX/\\x05\\x9f(\\xdf\\x06\\xc0\\x00_\\x08\\xdf\\xdc\\xae\\t\\xfb\\xbc\\xee\\n\\x11\\xad\\x0e\\x0c\\x11\\xad\\x0e\\x0c\\xda\\x9f_\\x03\\x04t\\xef\\x040D\\x7f\\x06Y\\x1c\\xff\\x07\\x80\\x00O\\t\\xa4\\xe4\\x9e\\n\\xc6\\xcc\\xce\\x0b\\xe6\\xb8\\x0e\\r\\xfd\\xb8\\xce\\r\\xfd\\xb8\\xde\\r\\xb4#\\xbf\\x06\\xda\\x0f\\xdf\\x07\\x08\\xec>\\t4\\xd4\\xae\\n^\\xbc\\xde\\x0b\\x85\\xb0\\xfe\\x0c\\xaa\\xa8\\x0e\\x0e\\xcc\\xa0\\xfe\\x0e\\xe7\\xac\\xae\\x0f\\xe8\\xac\\xae\\x0f\\x8c\\x8f>\\n\\xb0\\x93\\xde\\n\\xe2\\x83\\x1e\\x0c\\x10tN\\r\\x10\\xb3x\\x0e\\x11\\xd0\\x88\\x9e\\x11\\xd1\\x88\\xae\\x11b\\x07\\xce\\r\\x80\\x07\\xee\\r\\xb5\\xff\\xfd\\x0e\\xe7\\xff\\xfd\\x0f\\x16\\x04\\xde\\x10C\\x10\\xae\\x11m ^\\x12\\x958\\xfe\\x12\\xbaP~\\x13\\xbaP\\x9e\\x138s\\x8d\\x11L\\x8b\\r\\x11\\x84s\\xdd\\x11\\xbbw\\x8d\\x12\\xed\\x87M\\x13\\x1c\\xa0\\r\\x14I\\xbc\\x8d\\x14t\\xe0\\r\\x15\\x9d\\x08^\\x15\\x9d\\x08^\\x15\\x12\\xf7\\xdc\\x14\\x19\\x0b]\\x14Q\\xf7\\xec\\x14\\x8a\\xefL\\x15\\xc1\\xf3\\xcc\\x15\\xf3\\x17M\\x16#D\\xad\\x16Qt\\xfd\\x16}\\xa8=\\x17}\\xa8-\\x17\\x10\\xef\\x0c\\x15\\x10\\xef\\x0c\\x15.\\xc7,\\x16\\\\\\x8b\\xbc\\x17\\x91sl\\x18\\xc8\\x7f\\x9c\\x18\\xfa\\xb3\\xdc\\x18+\\xf0\\xfc\\x18Y0\\xfd\\x18[4\\xfd\\x18\\x10\\xef\\x0c\\x15\\x10\\xef\\x0c\\x15 \\xdb\\xac\\x15M\\x9bL\\x17x_\\xec\\x18\\xa1\\'l\\x1a\\xd1\\x1b\\xec\\x1a\\x06\\\\\\xec\\x1a5\\xac\\xcc\\x1a5\\xac\\xcc\\x1a\\x10\\xef\\x0c\\x15\\x10\\xef\\x0c\\x15\\x1e\\xdb\\x9c\\x15M\\x9bL\\x17x_\\xec\\x18\\xa1\\'l\\x1a\\xd1\\x1b\\xec\\x1a\\x05\\\\\\xec\\x1a5\\xac\\xcc\\x1a5\\xa8\\xbc\\x1a\\xfbkp\\x00\\x1f4\\xb0\\x01N\\xf4o\\x03v\\xbc\\x1f\\x05\\x9bt\\xdf\\x06\\xbc4\\x8f\\x08\\xdc\\xfc.\\n\\xf8\\xc4\\xce\\x0b\\x08\\xa9\\xde\\x0c\\x07\\xa9\\xee\\x0c\\xe23\\xa0\\x02\\x00\\x00\\x00\\x04,\\xbc\\xdf\\x05V|\\x9f\\x07}L/\\t\\xa0\\x1c\\xdf\\n\\xc2\\xecN\\x0c\\xe2\\xc8\\xbe\\r\\xf5\\xb4\\x8e\\x0e\\xf4\\xb4\\x8e\\x0e\\xbd\\xbb\\xef\\x05\\xd6\\x9f\\xef\\x06\\x05h\\x9f\\x0818/\\n[\\x10\\x9f\\x0b\\x83\\xf0\\xfe\\x0c\\xa8\\xccN\\x0e\\xca\\xb4~\\x0f\\xe0\\xac^\\x10\\xe0\\xac^\\x10\\x95\\x1f_\\t\\xaa\\'\\xaf\\t\\xdb\\xff.\\x0b\\n\\xd8\\x9e\\x0c7\\xbc\\x0e\\x0ea\\xa4N\\x0f\\x89\\x98^\\x10\\xae\\x88n\\x11\\xcb\\x88\\x1e\\x12\\xcb\\x88\\x1e\\x12o\\x7f\\xbe\\x0c~\\x93\\xae\\x0c\\xb2\\x83\\xee\\r\\xe4g.\\x0f\\x13X^\\x10@Ln\\x11kH^\\x12\\x93HN\\x13\\xb6P\\xfe\\x13\\xb6L\\x0e\\x14G\\xbf=\\x10O\\xef\\x8d\\x0f\\x83\\xe3\\x9d\\x10\\xb8\\xe3\\xbd\\x11\\xeb\\xdf\\xbd\\x12\\x1b\\xe0\\xad\\x13G\\xe4m\\x14r\\xf4\\x1d\\x15\\x9b\\x08\\xbe\\x15\\x9b\\x08\\xbe\\x15\\x1c#\\xfd\\x13&G\\r\\x13QCm\\x13\\x89;=\\x14\\xbfO\\r\\x15\\xf2[\\xcd\\x15\"p}\\x16P\\x88\\xfd\\x16{\\xa8m\\x17{\\xacm\\x17\\x10\\xef\\x0c\\x15\\x10\\xef\\x0c\\x15#\\xdb\\xac\\x15W\\xb3\\xfc\\x16\\x91\\xafl\\x17\\xc7\\xc3\\xfc\\x17\\xf9\\xe3|\\x18*\\x08\\xdd\\x18X8\\x1d\\x19X8-\\x19\\x10\\xef\\x0c\\x15\\x10\\xef\\x0c\\x15\\x14\\xeb,\\x15@\\xab\\xdc\\x16mo\\x8c\\x18\\x9a?\\x0c\\x1a\\xcfC|\\x1a\\x02x\\xac\\x1a3\\xb0\\xcc\\x1a4\\xb0\\xcc\\x1a\\x10\\xef\\x0c\\x15\\x10\\xef\\x0c\\x15\\x14\\xe7<\\x15A\\xab\\xec\\x16oo\\x9c\\x18\\x9b;\\x1c\\x1a\\xcfG|\\x1a\\x03x\\xac\\x1a4\\xb0\\xcc\\x1a5\\xac\\xbc\\x1a\\xf6\\xfb\\xf0\\x00\\x12\\xc4\\xe0\\x01Bx\\x90\\x03o00\\x05\\x95\\xdc\\x0f\\x07\\xb6\\x84\\x0f\\t\\xd58\\xef\\n\\xf1\\xf0\\xce\\x0c\\xfb\\xc0\\xee\\r\\xfc\\xc0\\xfe\\r\\xe8\\xe3 \\x02\\xfb\\xa7@\\x03\\'T`\\x05P\\x00\\x80\\x07w\\xb8_\\t\\x9bp/\\x0b\\xbe,\\xdf\\x0c\\xdd\\xf0\\x8e\\x0e\\xeb\\xd0~\\x0f\\xea\\xd0~\\x0f\\xc3oP\\x05\\xd1K\\x10\\x06\\x00\\x00\\x00\\x08-\\xb8\\xcf\\tWx\\x8f\\x0b}D/\\r\\xa2\\x0c\\xdf\\x0e\\xc5\\xe0N\\x10\\xd7\\xc4.\\x11\\xd7\\xc4.\\x11\\x9e\\xd3\\x9f\\x08\\xa6\\xd7\\xbf\\x08\\xd7\\x97\\x9f\\n\\x06`?\\x0c3,\\xcf\\r]\\xfcN\\x0f\\x85\\xd8\\xae\\x10\\xaa\\xb4\\xfe\\x11\\xc3\\xa4\\xce\\x12\\xc3\\xa4\\xee\\x12w+\\xef\\x0bz?\\xaf\\x0b\\xab\\x1b\\x1f\\r\\xdd\\xef\\x9e\\x0e\\r\\xc8\\x0e\\x10:\\xa4n\\x11e\\x8c\\x9e\\x12\\x8dx\\xce\\x13\\xael\\x9e\\x14\\xafl\\xae\\x14Qs>\\x0fW\\x93\\xee\\x0e\\x80\\x7f\\xce\\x0f\\xb4k\\x0e\\x11\\xe7SN\\x12\\x17<~\\x13D,~\\x14o$n\\x15\\x97$^\\x16\\x97$^\\x16*\\x9f\\xbd\\x121\\xcb\\x1d\\x12O\\xdbM\\x12\\x87\\xc7m\\x13\\xbc\\xc3\\x8d\\x14\\xef\\xbb\\x8d\\x15\\x1f\\xb8m\\x16M\\xbc-\\x17x\\xc4\\xdd\\x17x\\xc8\\xed\\x17\\x0f\\x03\\x1d\\x15\\x11\\x0b\\xfd\\x14\\x1c\\x1b\\xed\\x14U\\x17\\xdd\\x15\\x8e\\x17\\xbd\\x16\\xc4\\'}\\x17\\xf73=\\x18\\'@\\xfd\\x18VTm\\x19VTm\\x19\\x10\\xef\\x0c\\x15\\x10\\xf3\\x0c\\x15\\x10\\xf7\\x0c\\x156\\xc7\\x8c\\x16e\\x8f\\\\\\x18\\x96{\\x9c\\x19\\xcc\\x8f,\\x1a\\x00\\xb0\\x9c\\x1a1\\xd0\\xfc\\x1a2\\xd0\\xfc\\x1a\\x10\\xef\\x0c\\x15\\x10\\xf3\\x0c\\x15\\x0f\\xf7\\x1c\\x154\\xcb|\\x16c\\x93L\\x18\\x95w\\x9c\\x19\\xcc\\x97,\\x1a\\x00\\xb4\\x9c\\x1a2\\xd0\\xfc\\x1a3\\xc0\\xec\\x1a\\xee\\xab\\x81\\x01\\x02x\\x11\\x024\\x18\\xd1\\x03c\\xc8\\x80\\x05\\x8bh`\\x07\\xae\\xf8\\xbf\\t\\xcd\\x94\\xdf\\x0b\\xea0\\xdf\\r\\xef\\xf8\\x0e\\x0f\\xef\\xf8\\x0e\\x0f\\xec\\xb3\\xd1\\x01\\xf3s\\xe1\\x02 \\x041\\x05I\\x9c\\x80\\x07p@\\xa0\\t\\x95\\xe0\\xaf\\x0b\\xb7\\x88\\x9f\\r\\xd64\\x7f\\x0f\\xdd\\x04\\x9f\\x10\\xdd\\x08\\xaf\\x10\\xc8?\\xe1\\x04\\xca\\x17a\\x05\\xf9\\xb3\\xa0\\x07&X\\xa0\\tO\\x00\\xd0\\x0bw\\xb8\\xaf\\r\\x9cl\\x7f\\x0f\\xbf$/\\x11\\xcd\\xfc\\x1e\\x12\\xcd\\xfc\\x1e\\x12\\xa3\\xa3 \\x08\\xa3\\x9f0\\x08\\xd0O\\x10\\n\\x00\\x00\\x00\\x0c-\\xb4\\xcf\\rXp\\x8f\\x0f\\x7f8/\\x11\\xa4\\x00\\xdf\\x12\\xba\\xe0\\xbe\\x13\\xba\\xe0\\xbe\\x13\\x7f\\xffO\\x0b\\x80\\xff?\\x0b\\xa5\\xd3\\x7f\\x0c\\xd7\\x8fO\\x0e\\x07T\\xef\\x0f5\\x1c\\x7f\\x11`\\xec\\xfe\\x12\\x87\\xc4^\\x14\\xa6\\xa8n\\x15\\xa7\\xa8n\\x15YC\\x9f\\x0e\\\\O_\\x0ex7\\xff\\x0e\\xac\\x13\\x7f\\x10\\xdf\\xdf\\xfe\\x11\\x0f\\xb4^\\x13=\\x8c\\xce\\x14hp\\x0e\\x16\\x90\\\\.\\x17\\x91\\\\.\\x174o\\xde\\x119\\x8b^\\x11J\\x97n\\x11\\x81o\\xde\\x12\\xb7S.\\x14\\xea7^\\x15\\x1a \\x8e\\x16H\\x0c\\x8e\\x17s\\x00\\x8e\\x18r\\x04\\x9e\\x18\\r\\x87M\\x15\\x14\\xaf\\x9d\\x14\\x1c\\xd3\\r\\x14Q\\xbf\\r\\x15\\x89\\xab=\\x16\\xbf\\xa3M\\x17\\xf2\\x97M\\x18#\\x94=\\x19R\\x90\\xed\\x19R\\x94\\xed\\x19\\x0f\\xff\\x1c\\x15\\x0e\\x1b=\\x15\\r3M\\x15(\\x1fm\\x16Z\\xfb<\\x18\\x92\\xf3<\\x19\\xc8\\xfb\\x0c\\x1a\\xfb\\x03\\xbd\\x1a-\\x10]\\x1b-\\x10]\\x1b\\x0f\\x0b\\x1d\\x15\\x0e\\x17-\\x15\\r7M\\x15\\'\\']\\x16Y\\x03=\\x18\\x91\\xfb<\\x19\\xc7\\x03\\r\\x1a\\xfb\\x07\\xbd\\x1a/\\xfc<\\x1b.\\x10]\\x1b\\xe6{B\\x02\\xf1Cr\\x02&\\xd8A\\x04X|\\x01\\x06\\x83\\x08\\x11\\x08\\xa5\\x88\\x80\\n\\xc4\\x0c\\xf0\\x0c\\xe1\\x94/\\x0f\\xe0P_\\x10\\xe0Po\\x10\\xe5\\x87b\\x02\\xe8_\\x82\\x02\\x14\\xd8\\x11\\x05>X\\x91\\x07f\\xe8\\xf0\\t\\x8btP\\x0c\\xad\\x04\\xa0\\x0e\\xcd\\x9c\\xbf\\x10\\xcf\\\\\\xcf\\x11\\xcf`\\xdf\\x11\\xcb/\\x92\\x04\\xc7\\xf7!\\x05\\xf1\\x87q\\x07\\x1e\\x14\\xd1\\tG\\xa8\\x10\\x0coL@\\x0e\\x95\\xe8?\\x10\\xb7\\x88/\\x12\\xc0T/\\x13\\xbeTO\\x13\\xa7\\x93\\xc1\\x07\\xa5{\\x01\\x08\\xc9\\'\\xc1\\t\\xf8\\xbb\\xf0\\x0b&`\\xf0\\rP\\x04\\x10\\x10w\\xb8\\xff\\x11\\x9dh\\xcf\\x13\\xae8\\xcf\\x14\\xae8\\xcf\\x14\\x85\\xef\\xd0\\n\\x83\\xdb\\x00\\x0b\\x9d\\xab\\x10\\x0c\\xd0S\\x10\\x0e\\x00\\x00\\x00\\x10.\\xb0\\xcf\\x11Xl\\x8f\\x13\\x800/\\x15\\x9b\\x04o\\x16\\x9b\\x04o\\x16`3\\x00\\x0ea+\\xf0\\rq\\x13`\\x0e\\xa5\\xd3/\\x10\\xd8\\x8b\\x0f\\x12\\x08L\\xaf\\x136\\x10?\\x15a\\xdc\\xae\\x16\\x88\\xb8\\xfe\\x17\\x89\\xb8\\x0e\\x18:[O\\x11>g\\x0f\\x11Ao\\xbf\\x10w3_\\x12\\xad\\x03\\xdf\\x13\\xe1\\xcfn\\x15\\x11\\xa0\\xce\\x16@x.\\x18kT^\\x19k\\\\n\\x19\\x16{~\\x14\\x1b\\x8b\\x0e\\x14!\\x9f\\x8e\\x13K\\x87\\x8e\\x14\\x83[\\xee\\x15\\xb9?>\\x17\\xed\\x1b~\\x18\\x1d\\x00\\x9e\\x19K\\xec\\xad\\x1aK\\xec\\xad\\x1a\\x08\\xbb\\xcd\\x15\\x07\\xcb\\xcd\\x15\\x07\\xd7\\xdd\\x15\\x1a\\xcb}\\x16S\\xab\\xdd\\x17\\x8c\\x8f\\xfd\\x18\\xc3\\x83\\x1d\\x1a\\xf6s\\x1d\\x1b\\'l\\xed\\x1b\\'p\\xfd\\x1b\\x07\\xbf\\xcd\\x15\\x07\\xc3\\xcd\\x15\\x06\\xe3\\xdd\\x15\\x19\\xd7}\\x16S\\xb3\\xdd\\x17\\x8b\\x97\\r\\x19\\xc1\\x7f\\x1d\\x1a\\xf6w\\x1d\\x1b\\'t\\xfd\\x1b%\\x8c\\x1d\\x1c\\xddc\\x13\\x03\\xe17\\x03\\x03\\x18\\xbc\\xd2\\x04LP\\x92\\x06x\\xc8\\xd1\\x08\\x9b0\\x81\\x0b\\xba\\xa0 \\x0e\\xd7\\x14\\xb0\\x10\\xcd\\xc4\\xff\\x11\\xcd\\xc8\\xff\\x11\\xdcs#\\x03\\xdeG\\x13\\x03\\n\\xc8\"\\x0540\\xe2\\x07[\\xb0\\xb1\\n\\x80$A\\r\\xa3\\x9c\\xc0\\x0f\\xc3 \\x12\\xc0\\xd0/\\x13\\xbf\\xd4O\\x13\\xcb;\\xa3\\x04\\xc4\\xf7B\\x05\\xe5{b\\x07\\x11\\xf4\\x01\\n\\x16\\x11\\xaf\\x0e\\x16M{\\xae\\x17\\x85K\\x0e\\x19\\xbc+^\\x1a\\xef\\x07\\x9e\\x1b \\xe8\\xad\\x1c\\x1f\\x08\\xce\\x1c\\xff\\x9e\\x8e\\x16\\xff\\x9a\\x8e\\x16\\x02\\xb3N\\x16\\x0f\\xb7\\x1e\\x16K\\x83\\x9e\\x17\\x84O\\xfe\\x18\\xba\\'N\\x1a\\xf8\\x07\\xee\\x1b\\x1e\\x08\\xee\\x1c\\x1c \\x0e\\x1d\\xd3S\\xf4\\x03\\xd57\\xe4\\x03\\t\\xb8\\x83\\x05@4C\\x07l\\xa4\\xb2\\t\\x8e\\xf8\\xb1\\x0c\\xaeT\\xb1\\x0f\\xc9\\xb0`\\x12\\xbbT\\xb0\\x13\\xbbX\\xb0\\x13\\xd3[\\xf4\\x03\\xd4G\\xe4\\x03\\xfe\\xd3\\x83\\x05($\\x83\\x08O\\x8c\\x82\\x0bu\\xecQ\\x0e\\x97P\\x11\\x11\\xb8\\xb8\\xa0\\x13\\xae`\\xc0\\x14\\xacl\\xf0\\x14\\xccS\\x94\\x04\\xc2\\x0bt\\x05\\xd9\\x87\\x83\\x07\\x06\\xe8b\\n1P\\x12\\rX\\xc8\\xe1\\x0f~8\\x81\\x12\\xa1\\xb0\\xf0\\x14\\x9f\\\\\\x10\\x16\\x9f\\\\\\x10\\x16\\xab\\xc3\\x83\\x07\\xa3\\x8f3\\x08\\xb1\\'\\xa3\\t\\xe1\\x97R\\x0c\\x0e\\x08\\xe2\\x0e9\\x84a\\x11b\\x10\\xc1\\x13\\x88\\x90 \\x16\\x8fDp\\x17\\x90Dp\\x17\\x89\\'c\\n\\x85\\xeb\\xe2\\n\\x8a\\xb3\\xb2\\x0b\\xbc/2\\x0e\\xec\\xaf\\xc1\\x10\\x1a4\\x11\\x13F\\xc0@\\x15n\\\\`\\x17\\x81\\x0c\\xc0\\x18\\x81\\x0c\\xc0\\x18for\\rdC\\xa2\\rb\\x13\\xf2\\r\\x92\\xb3!\\x10\\xc5;Q\\x12\\xf6\\xcf\\x80\\x14$l\\x90\\x16O\\x08\\xa0\\x18p\\xc4?\\x1ao\\xc8?\\x1aE\\x9fq\\x10D\\x7f\\x81\\x10C[\\x81\\x10f\\x0f\\x11\\x12\\x9b\\xb7\\x10\\x14\\xcf[\\x10\\x16\\x00\\x00\\x00\\x18/\\xac\\xcf\\x19Z`\\x7f\\x1b[h\\x8f\\x1b!\\xb7\\xa0\\x13\"\\xa3p\\x13$\\x8fP\\x137k\\xe0\\x13o\\x13\\xc0\\x15\\xa5\\xcf\\x8f\\x17\\xd9\\x83o\\x19\\n<\\x0f\\x1b9\\xf8\\x8e\\x1c:\\xf8\\x8e\\x1c\\xfe\\xa2\\xaf\\x16\\x01\\xb3O\\x16\\x04\\xaf\\x1f\\x16\\x07\\xaf\\xbf\\x15Ag\\x7f\\x17y\\x1f\\x1f\\x19\\xb0\\xeb\\xae\\x1a\\xe4\\xaf.\\x1c\\x15|\\x8e\\x1d\\x14\\xb0\\xee\\x1d\\xfd\\xae\\xbf\\x16\\x00\\xafo\\x16\\x04\\xbb\\x1f\\x16\\x07\\xb3\\xbf\\x15Ao\\x7f\\x17|+/\\x19\\xb2\\xeb\\xce\\x1a\\xed\\xbf\\xae\\x1c\\x14\\xb0\\xee\\x1d\\x13\\xc4\\x0e\\x1e\\xd0\\x9b4\\x04\\xd1\\x934\\x04\\xfeC\\xc4\\x056\\xe0\\xc3\\x07al\\xb3\\n\\x81\\xdc\"\\x0e\\xa0 R\\x11\\xb6p\\x11\\x14\\xa7\\xf8`\\x15\\xa5\\x04\\x81\\x15\\xd0\\x9b4\\x04\\xd1\\x974\\x04\\xf6S\\x94\\x05\\x1f\\xc8\\xd3\\x08E<3\\x0ch\\xbcr\\x0f\\x8a r\\x12\\xa6|a\\x15\\x9a\\x14\\x91\\x16\\x99\\x1c\\xa1\\x16\\xcf\\x97T\\x04\\xc6s$\\x05\\xd3\\x13D\\x07\\xfe\\x8b\\xa3\\n&\\x08\\xd3\\rL\\x98\\xe2\\x10q\\x0c\\xd2\\x13\\x94p\\x91\\x16\\x8c\\x0c\\xb1\\x17\\x8c\\x0c\\xb1\\x17\\xb23\\xe4\\x06\\xa7\\x07\\xd4\\x07\\xab\\xc7S\\t\\xd9Kc\\x0c\\x04\\xd0R\\x0f.\\\\B\\x12U\\xe41\\x15{T\\xb1\\x17~\\xf4\\xf0\\x18~\\xf4\\xf0\\x18\\x90\\xb7\\xd3\\t\\x87\\x93\\x93\\n\\x80sc\\x0b\\xb0\\x03S\\x0e\\xdf\\x97\"\\x11\\x0c$\\xc2\\x138\\x98Q\\x16` \\xb1\\x18o\\xc40\\x1ao\\xc4P\\x1am;\\xf3\\x0cg\\x1fs\\ra\\x03\\x13\\x0e\\x88\\xbb2\\x10\\xbaC\\xc2\\x12\\xea\\xbfQ\\x15\\x18D\\xa1\\x17D\\xcc\\xe0\\x19ax\\x90\\x1bax\\x90\\x1bI\\xbb\\x12\\x10D\\xab\\x82\\x10A\\x83\\xd2\\x10[/\\x12\\x12\\x90\\xc3q\\x14\\xc4K\\xb1\\x16\\xf5\\xdb\\xd0\\x18$p\\xd0\\x1aO\\x0c\\xf0\\x1cN\\x18\\x00\\x1d$\\x03B\\x13#\\xdbQ\\x13#\\xb7a\\x13,\\x8b\\xc1\\x13e\\x1b\\x01\\x16\\x9a\\xbf \\x18\\xcf_ \\x1a\\x00\\x00\\x00\\x1c.\\xa8\\xcf\\x1d/\\xa8\\xcf\\x1d\\x01\\xf3p\\x16\\x02\\xeb@\\x16\\x04\\xd3\\x10\\x16\\x05\\xbf\\xf0\\x155o\\x80\\x17o\\x13p\\x19\\xa6\\xcb?\\x1b\\xda{\\x1f\\x1d\\x0c0\\xbf\\x1e\\td\\x0f\\x1f\\x01\\xfb`\\x16\\x02\\xe3@\\x16\\x04\\xdb\\x10\\x16\\x05\\xd3\\xf0\\x155\\x7f\\x90\\x17o\\x1f\\x80\\x19\\xa6\\xc7O\\x1b\\xe1\\x83\\x8f\\x1d\\n`\\x0f\\x1f\\x08t/\\x1f\\xd0\\x9b4\\x04\\xd0\\x9b4\\x04\\xf7g\\xb4\\x050\\x18\\xd4\\x07Y\\xa0\\x13\\x0bx\\x14\\xd3\\x0e\\x96xb\\x12\\xa5\\xf0q\\x15\\x92\\x981\\x17\\x90\\xa0a\\x17\\xd0\\x9b4\\x04\\xd0\\x9b4\\x04\\xf0od\\x05\\x1b\\xf4\\xd3\\x08@ls\\x0cc\\xe02\\x10\\x83X\\xa2\\x13\\x98\\xd8\\xa1\\x16\\x88\\x8c!\\x18\\x88\\x8c!\\x18\\xd0\\x9b4\\x04\\xcb\\x8b\\xa4\\x04\\xcf;\\xe4\\x06\\xfa\\xb3s\\n\"4\\xf3\\rG\\xb8R\\x11k4\\xa2\\x14\\x8b\\xb4\\xb1\\x17{t1\\x19{t1\\x19\\xbcW\\x04\\x06\\xae/$\\x07\\xa8\\xf7\\xa3\\x08\\xd6{\\x13\\x0c\\x00\\xf8\\x82\\x0f)\\x84\\xb2\\x12P\\x0c\\xc2\\x15t\\x90\\xd1\\x18pTA\\x1apPA\\x1a\\x99\\xeb\\xf3\\x08\\x8e\\xc7\\x03\\n\\x84\\xa3\\xf3\\n\\xad3\\xe3\\r\\xdb\\xc3\\x02\\x11\\x07P\\x02\\x141\\xdc\\xe1\\x16Xl\\xd1\\x19`,\\x81\\x1ba,\\x81\\x1bx\\x7f\\xe3\\x0bo_\\xc3\\x0cfC\\x83\\r\\x82\\xef\\xc2\\x0f\\xb3\\x83\\xa2\\x12\\xe3\\x13r\\x15\\x0f\\xa81\\x189D\\xd1\\x1aQ\\x00\\xc1\\x1cR\\xfc\\xd0\\x1cT\\x07\\x13\\x0fM\\xef\\xc2\\x0fG\\xd7R\\x10V\\x9f\\xa2\\x11\\x8a;R\\x14\\xbd\\xd7\\xf1\\x16\\xecs\\xa1\\x19\\x19\\x18\\x01\\x1cA\\xc0@\\x1eA\\xccP\\x1e/\\x87b\\x12+s\\xb2\\x12&_\"\\x13$O\\x82\\x13\\\\\\xe7\\x11\\x16\\x90\\x9b\\x91\\x18\\xc3?\\xe1\\x1a\\xf4\\xe3 \\x1d#t0\\x1f\"xP\\x1f\\x07\\xeb\\xd1\\x15\\x06\\xf3\\xe1\\x15\\x04\\xe7\\x11\\x16\\x03\\xe31\\x16*\\x97\\xc1\\x17c\\'\\x01\\x1a\\x99\\xc7 \\x1c\\xcec \\x1e\\x00\\x00\\x00 \\x00\\x00\\x00 \\x07\\xf3\\xc1\\x15\\x06\\xef\\xf1\\x15\\x04\\xf7\\x11\\x16\\x02\\xf3A\\x16)\\xa3\\xd1\\x17b3\\xf1\\x19\\xaa\\x9b\\xb0\\x1c\\xdaK\\x90\\x1e\\x00\\x00\\x00 \\x00\\x00\\x00 \\xd0\\x9b4\\x04\\xd0\\x9b4\\x04\\xf5g\\xa4\\x05/\\x18\\xc4\\x07W\\xa0#\\x0bw\\x10\\xf3\\x0e\\x94\\x84\\xb2\\x12\\xa0\\x0c\\xf2\\x15\\x8b\\xc4\\xd1\\x17\\x8b\\xc4\\xd1\\x17\\xd0\\x9b4\\x04\\xd0\\x9b4\\x04\\xecsD\\x05\\x18\\xf4\\xc3\\x08=h\\x83\\x0c`\\xe0\"\\x10\\x80`\\xc2\\x13\\x94\\xec\\xe1\\x16\\x83\\xa8\\x81\\x18\\x83\\xa8\\x91\\x18\\xd0\\x9b4\\x04\\xcd\\x93\\x84\\x04\\xcfC\\xb4\\x06\\xfa\\xb7S\\n!4\\xf3\\rF\\xb4r\\x11j0\\xe2\\x14\\x89\\xbc\\x01\\x18x\\x88q\\x19x\\x88q\\x19\\xbfc\\xb4\\x05\\xb03\\xf4\\x06\\xa8\\xf7\\x93\\x08\\xd6{\\x13\\x0c\\x00\\xfc\\x82\\x0f(\\x84\\xc2\\x12O\\x0c\\xe2\\x15s\\x98\\x01\\x19m`\\x81\\x1am`\\x81\\x1a\\x9d\\xf7\\xa3\\x08\\x91\\xcf\\xc3\\t\\x85\\xa7\\xd3\\n\\xad;\\xc3\\r\\xdb\\xc7\\xf2\\x10\\x07P\"\\x141\\xe0\\x11\\x17Xt\\xf1\\x19_8\\xa1\\x1b_8\\xa1\\x1bz\\x87\\xa3\\x0bpg\\xa3\\x0cgGs\\r\\x82\\xf3\\xa2\\x0f\\xb3\\x87\\x92\\x12\\xe2\\x1br\\x15\\x0e\\xb8A\\x188T\\xf1\\x1aQ\\x08\\xf1\\x1cQ\\x08\\xf1\\x1cV\\x0f\\xd3\\x0eP\\xf7\\x82\\x0fH\\xdf2\\x10T\\xafr\\x11\\x87GR\\x14\\xba\\xe3\\x01\\x17\\xe9\\x83\\xa1\\x19\\x16(\\x01\\x1c?\\xd0P\\x1e@\\xd0`\\x1e0\\x93B\\x12+\\x83\\xa2\\x12\\'s\\x12\\x13#gr\\x13[\\x03\\x12\\x16\\x90\\xa7\\x91\\x18\\xc3O\\xf1\\x1a\\xf4\\xeb@\\x1d\"\\x80P\\x1f\"\\x80P\\x1f\\x08\\x13\\xb2\\x15\\x07\\x0f\\xd2\\x15\\x05\\x07\\x02\\x16\\x03\\xffA\\x16*\\xaf\\xd1\\x17c;\\x01\\x1a\\x9a\\xcb \\x1c\\xcec \\x1e\\x00\\x00\\x00 \\x00\\x00\\x00 \\x08\\x13\\xb2\\x15\\x06\\x0b\\xe2\\x15\\x04\\x03\\x12\\x16\\x02\\xffA\\x16)\\xaf\\xd1\\x17a;\\x01\\x1a\\xb0\\x9f\\x00\\x1d\\xddC\\xb0\\x1e\\x00\\x00\\x00 \\x00\\x00\\x00 \\x00\\x00\\x1f\\x00?\\x00_\\x00\\x7f\\x00\\x9f\\x00\\xbf\\x00\\xdf\\x00\\xff\\x00\\x00\\x00\"\\x00H\\x00k\\x00\\x89\\x00\\xa5\\x00\\xc1\\x00\\xdf\\x00\\xff\\x00\\x01\\x00Y\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xe8\\x05\\xb0^\\xeb\\x05\\xb0^\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00T\\x1a^\\xafdn\\x00\\x00\\xd4\\x19^\\x00\\x00\\x00\\x00\\x00\\xd4\\x19^\\x00\\x80\\x00\\x00\\x00\\xd4\\x19^\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xbc\\x88^ir\\x07\\x00\\x00\\xd4\\x19^\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xd4\\x19^\\x00\\x00 \\x05\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x80\\x00\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xd4\\x00\\x00\\x00\\x0e\\x00\\x00\\x00\\'\\xf1\\x9c\\x15\\x00\\x00\\x9f\\x00\\x0f\\x00h\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xa0\\x01\\x00\\x00\\x00\\x00\\x10\\x00\\x08\\x00\\x01\\x00\\x01\\x00\\x80\\x02\\xe0\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08\\x00\\x80\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\n\\x00\\x00\\x00\\xff\\xff\\x00\\x00\\xff\\xffH\\x00\\xff\\xff\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xc0\\x00\\x00\\x03@\\x02\\x00\\x00\\x00\\x00M\\x01\\x00\\x00\\x8d\\x03\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00Fh\\xb3\\x9ai\\xf4\\x82\\xf7TY\\xf3\\x97\\x85c\\xbeQF\\x00\\xff\\x7f\\xff\\x7f\\xff\\xff\\xff\\xff\\xff\\x7f\\xff\\x7f\\xff\\x7f\\xe0\\x01\\xff\\xff\\x04\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x7f\\xff\\x7f\\xff\\x7f\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\xff\\xff\\x00\\x00\\xff\\xff\\x01\\x00\\x04\\x00D\\x00\\x02\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x0c\\x00\\x01\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x89zA\\x91\\tI\\x82\\xf7TY\\xf3\\x97\\x85c\\xbeQ\\x10\\x00\\x00\\x00\\xe0\\x01\\x00\\x00\\xfe\\x7f\\x00\\x00\\x00\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x18\\t\\x18*\\xb4\\x01\\r\\x001\\x00\\x01\\x00p\\x17(\\rp\\x17(\\r\\xc8\\x01\\x00\\x00\\x02\\x00\\x8c\\x0eN\\x1b\\x02\\x00\\x02\\x00\\xa8\\x0e\\xff\\xff\\x08\\x00\\xc8\\x0e\\xff\\xff\\x00\\x00\\xe0\\x0e\\x1c\\x1b\\x00\\x00\\xdc\\x84\\x00\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x00\\x00\\x7f\\x00\\n\\x00\\x00\\x00\\xdc\\x84\\x8c\\x0f\\\\\\x9b\\x00\\x00\\x00\\x00\\x18\\x02\\x02\\x00U\\x07\\x00\\x00\\x00\\x00\\x04\\x9b\\x00\\x00\\x00\\x00,G\\x00\\x00\\x00\\x00\\x00\\x00,G\\x00\\x00\\xc5X\\x8d\\x01\\x14D\\x00\\x00(\\xde\\x18\\x01\\xb0\\x0f\\x02\\x00\\x00\\x00\\x9fy\\x8c\\x0e\\xb0\\x0e3\\x00\\x08\\x00\\xad\\xda96\\x00\\x00\\xad\\xda\\x00\\x003\\x003\\x00\\x7f\\x00\\n\\x00\\x00\\x00X\\x01\\xdb\\xda\\x97n\\x00\\x00\\x00\\x00S\\x9c\\xac\\x17\\x00\\x00\\xac\\x17\\x04\\x06\\x18\\x02\\x18\\x02S\\x86\\xf3\\x00\\x9c\\x0f\\x00\\x00i\\x86@\\r\\x00\\x00,G\\xa4\\x17\\x1c@\\x97R\\x00\\x00,G\\xfd\\x94\\xa9\\xd3M\\xdc\\x05\\x00\\x04\\x00\\x94\\xff\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\xe8\\x0e\\x00\\x00\\xff\\xff\\x00\\x00\\xa4\\x0e\\x08\\x00\\xe0\\x0e\\x00\\x00\\x04\\x00\\xe0\\x0e\\x00\\x00\\xff\\xff\\x00\\x00\\x9c\\x0e\\x00\\x00\\x8c\\x0e\\x00\\x00\\x9c\\x0e\\x81\\x00\\xff\\xff\\x8c\\x0e\\xb0\\x0e\\t\\x03\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x18\\x02\\x03\\x00\\xc3y\\x00\\x00\\xbf{\\x08\\x00\\xff\\xff\\x04\\x00\\x04\\x00\\xb9\\xda\\x02\\x00\\xc3y\\x00\\x00\\xbf{\\x00\\x00\\xff\\xff@\\x0e\\x02\\x00\\xa8\\x0e\\xb0\\x0eYv\\x02\\x00@\\x0e\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xfb\\xff \\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00B\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\xd5\\x00\\xff\\xff\\x01\\x00\\x01\\x00\\x19\\x00\\x17\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\xff\\x00\\xff\\xff\\x00\\x00\\x00\\x00\\x16\\x00\\x1f\\x00\\x00\\x00JK0056316\\x00\\x8c\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00 \\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x03\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x00\\x00\\x00H\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x06\\x07\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x0c\\x07\\x00\\x00\\n\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00-\\x00\\x00\\x00\\x0b\\x00\\x00\\x00\\x00\\x00\\x00\\x00*\\x00\\x00\\x00,\\x00\\x00\\x00\\x11\\x07\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x14\\x08\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x07\\x00\\x00\\x00p\\x17\\x00\\x00(\\r\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00 \\x00\\x00\\x00\\x04\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xffP\\x14\\x83\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x00\\x04\\x00\\x0c\\x00\\x0e\\x03\\x00\\x04\\x00\\x042\\t\\x00\\x00\\x87\\x00\\x87\\x00\\x87\\x00\\xff\\x00\\xff\\x00\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00(\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x004\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00 \\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xd4\\x00\\x00\\x00\\x07\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x02\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x02\\x00\\x00\\x01\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x03\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x03\\x00\\x00\\x01\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x04\\x00\\x00\\x008\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x04\\x00\\x00\\x01\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x02\\x04\\x00\\x00\\x01\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x03\\x04\\x00\\x00\\x01\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x04\\x04\\x00\\x00\\x01\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x05\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x05\\x00\\x00\\x01\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x06\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x06\\x00\\x00\\x01\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x07\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x07\\x00\\x00\\x01\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x18\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00II*\\x00\\xe0\\x03\\x00\\x00'}\n" ] } ], "source": [ - "import PIL.Image\n", - "import PIL.ExifTags\n", + "# 读取照片的 exif 信息\n", + "# 我用了一张佳能微单拍的照片来做测试\n", + "# exif 的信息还是比较复杂的,这里可以简单的看一下\n", + "\n", + "from PIL import Image\n", + "from PIL.ExifTags import TAGS\n", + "\n", + "def get_exif(filename):\n", + " image = Image.open(filename)\n", + " image.verify()\n", + " return image._getexif()\n", "\n", - "img = PIL.Image.open('files/test.jpg')\n", + "def get_labeled_exif(exif):\n", + " labeled = {}\n", + " for (key, val) in exif.items():\n", + " labeled[TAGS.get(key)] = val\n", "\n", - "exif = {\n", - " PIL.ExifTags.TAGS[k]: v\n", - " for k, v in img._getexif().items()\n", - " if k in PIL.ExifTags.TAGS\n", - "}\n", + " return labeled\n", "\n", - "print(exif)" + "exif = get_exif('files/img_3845.jpg')\n", + "labeled = get_labeled_exif(exif)\n", + "print(labeled)" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "metadata": {}, "outputs": [ { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'PIL'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# 在图片上画线\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mPIL\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mImage\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mImageDraw\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'files/test.jpg'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'PIL'" + "name": "stdout", + "output_type": "stream", + "text": [ + "draw image ok\n" ] } ], @@ -487,7 +492,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -606,21 +611,6 @@ "img(filename='files/test_edge.jpg')" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 思考一下\n", - "\n", - "图片处理是我们平时经常要操作的,特别是手机用了多之后,拍照片变得容易了,照片数量也大大增加了。假设我们要写个小程序可以把指定路径下的照片做一下处理\n", - "\n", - "1. 检查照片的宽度是否大于 1600,如果大于的话,等比例缩小照片到宽度 1600\n", - "2. 原来的照片存放到子文件夹 /source 下面,处理过的照片文件名后跟上 _resize 存放在原来的目录\n", - "3. 如果上面的题目难不倒你的话,再把照片的文件名修改为拍照的日期,用 20191001_0001 这样的格式\n", - "\n", - "在我们原来的文档整理程序基础上继续演进。" - ] - }, { "cell_type": "code", "execution_count": null, diff --git "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" index 62e1a9a..a4ba9f0 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" @@ -8,7 +8,7 @@ "source": [ "# Lesson 16\n", "\n", - "* v1.1, 2020.5,6 edit by David Yi\n", + "* v1.1, 2020.5, 2020.6 edit by David Yi\n", "\n", "\n", "## 本次内容\n", @@ -58,7 +58,7 @@ "\n", "一个函数可以返回一个计算结果,也可以返回一个函数。\n", "\n", - "返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。\n", + "返回一个函数时,该函数并未执行,返回函数中不要引用任何可能会变化的变量。\n", "\n", "闭包和函数的作用域等有关,掌握和理解闭包,对于后续 Python 的深入开发有很大好处,特别是装饰器。" ] @@ -101,12 +101,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "虽然默认参数还是很容易使用,但是如果我们在某个场景需要大量调用的话,还是有点不方便,特别是对于有很多参数的函数来说,会让程序显得复杂。还记得之前那个 max min 的程序么?我们可以用偏函数来解决整个问题。" + "虽然默认参数还是很容易使用,但是如果我们在某个场景需要大量调用的话,还是有点不方便,特别是对于有很多参数的函数来说,会让程序显得复杂。还记得之前那个 max min 的程序举例么?我们可以用偏函数来解决整个问题。\n", + "\n", + "通过 ```functools.partial``` 来进行操作。" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -129,7 +131,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -158,18 +160,26 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'func' is not defined", + "name": "stdout", + "output_type": "stream", + "text": [ + "7\n", + "7\n" + ] + }, + { + "ename": "TypeError", + "evalue": "func() got multiple values for argument 'z'", "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 1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mfunctools\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mf1\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfunctools\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpartial\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mz\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\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 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf1\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[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\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;31mNameError\u001b[0m: name 'func' is not defined" + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 会报错,不需要再输入 z 的值\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: func() got multiple values for argument 'z'" ] } ], @@ -203,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -236,7 +246,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -270,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -295,12 +305,12 @@ " y = x * x + 3\n", " return y\n", "\n", - "l = [x for x in range(1,100,7) if x % 2 ==0]\n", + "list1 = [x for x in range(1,100,7) if x % 2 ==0]\n", "\n", - "print(l)\n", + "print(list1)\n", "\n", "# 主要的程序还是很简洁就可以了\n", - "r = map(f, l)\n", + "r = map(f, list1)\n", "\n", "for i in r:\n", " print(i)" @@ -320,6 +330,8 @@ } ], "source": [ + "# map 函数也可以同时作用在两组数据上\n", + "\n", "def addition(x, y):\n", " return x + y\n", " \n", @@ -331,7 +343,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -347,16 +359,18 @@ } ], "source": [ + "# map 函数更加复杂的用法\n", + "\n", "def multiply(x):\n", " return (x*x)\n", "\n", "def add(x):\n", " return (x+x)\n", "\n", - "funcs = [multiply, add]\n", + "func = [multiply, add]\n", "\n", "for i in range(5):\n", - " value = list(map(lambda x: x(i), funcs))\n", + " value = list(map(lambda x: x(i), func))\n", " print(value)" ] }, @@ -396,15 +410,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "13579\n", - "\n" + "13579\n" ] } ], @@ -416,18 +429,19 @@ "def f(x, y):\n", " return x * 10 + y\n", "\n", - "# 将字符转换为数字\n", "def char2int(s):\n", - " return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]\n", + " return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, \n", + " '6': 6, '7': 7, '8': 8, '9': 9}[s]\n", "\n", - "i=reduce(f, map(char2int, '13579'))\n", - "print(i)\n", - "print(type(i))" + "def str2int(s):\n", + " return reduce(f, map(char2int, s))\n", + "\n", + "print(str2int('13579'))" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -443,16 +457,16 @@ } ], "source": [ - "# 先 map\n", + "# 拆解上面的函数,先 map\n", "\n", - "l = map(char2int, '13579')\n", - "for i in l:\n", + "list1 = map(char2int, '13579')\n", + "for i in list1:\n", " print(i,type(i))" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -464,41 +478,10 @@ } ], "source": [ - "# 再 reduce\n", - "\n", - "l = map(char2int, '13579')\n", - "print(reduce(f,l))" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "12345\n" - ] - } - ], - "source": [ - "# 将字符串转换成整数的函数再包装一下\n", - "\n", - "from functools import reduce\n", - "\n", - "def f(x, y):\n", - " return x * 10 + y\n", - "\n", - "def char2int(s):\n", - " return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, \n", - " '6': 6, '7': 7, '8': 8, '9': 9}[s]\n", - "\n", - "def str2int(s):\n", - " return reduce(f, map(char2int, s))\n", + "# 拆解上面的函数,再 reduce\n", "\n", - "print(str2int('12345'))" + "list1 = map(char2int, '13579')\n", + "print(reduce(f,list1))" ] }, { @@ -596,7 +579,7 @@ "\n", "使用高阶函数可以让代码简洁优雅,好的函数,可以使程序修改和调试都变得容易。\n", "\n", - "函数式编程,相对传统方式比较难理解,但是这样的确比较 pythonic,符合 python 的发展。" + "函数式编程,相对传统方式比较难理解,但是这样的确比较 pythonic,对于程序项目来说比较容易维护。" ] }, { From 05ce7487e2216fb6b3e3315a5c682daa47cb0e82 Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Sun, 7 Jun 2020 19:45:30 +0800 Subject: [PATCH 24/27] =?UTF-8?q?2020.6.7=20=E4=BF=AE=E6=94=B9=E7=BB=83?= =?UTF-8?q?=E4=B9=A0=E9=A2=98=20A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Python Basic \347\273\203\344\271\240\351\242\230A.ipynb" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename python_study_basic_notebook/Python Basic Exercise A.ipynb => "python_study_basic_notebook/Python Basic \347\273\203\344\271\240\351\242\230A.ipynb" (98%) diff --git a/python_study_basic_notebook/Python Basic Exercise A.ipynb "b/python_study_basic_notebook/Python Basic \347\273\203\344\271\240\351\242\230A.ipynb" similarity index 98% rename from python_study_basic_notebook/Python Basic Exercise A.ipynb rename to "python_study_basic_notebook/Python Basic \347\273\203\344\271\240\351\242\230A.ipynb" index 785ba61..93d12e5 100644 --- a/python_study_basic_notebook/Python Basic Exercise A.ipynb +++ "b/python_study_basic_notebook/Python Basic \347\273\203\344\271\240\351\242\230A.ipynb" @@ -4,8 +4,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Python Basic Exercise A\n", - "* v1.1, 2020.4 5,edit by David Yi" + "# Python Basic 练习题 A\n", + "* v1.1, 2020.4, 2020.5,2020.6, edit by David Yi" ] }, { From 4aa84c471863350c6f709f23bbc4d92654647ff8 Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Thu, 11 Jun 2020 20:00:16 +0800 Subject: [PATCH 25/27] 2020.6.11 small edit --- ...\223\346\236\204\345\222\214 pprint.ipynb" | 54 ++++++++++++------- ...351\227\256\347\275\221\347\273\234.ipynb" | 6 +-- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git "a/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" index e90246c..4851788 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" @@ -238,7 +238,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -251,10 +251,10 @@ " - for subtraction\n", " * for multiplication\n", " / for division\n", - " +\n", - "Please enter the first number: 3\n", - "Please enter the second number: 7\n", - "3.0 + 7.0 = 10.0 \n" + " -\n", + "Please enter the first number: 5\n", + "Please enter the second number: 2\n", + "5.0 - 2.0 = 3.0 \n" ] } ], @@ -300,11 +300,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "ename": "TypeError", + "evalue": " is a built-in module", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mply\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlex\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mlex\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 52\u001b[0;31m \u001b[0mlexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 53\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[0;31m# Parsing rules\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/ply/lex.py\u001b[0m in \u001b[0;36mlex\u001b[0;34m(module, object, debug, optimize, lextab, reflags, nowarn, outputdir, debuglog, errorlog)\u001b[0m\n\u001b[1;32m 906\u001b[0m \u001b[0mlinfo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 907\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0moptimize\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 908\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mlinfo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalidate_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 909\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mSyntaxError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Can't build lexer\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 910\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/ply/lex.py\u001b[0m in \u001b[0;36mvalidate_all\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 577\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalidate_tokens\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 578\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalidate_literals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 579\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalidate_rules\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 580\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merror\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 581\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/ply/lex.py\u001b[0m in \u001b[0;36mvalidate_rules\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 819\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 820\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mmodule\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodules\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 821\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalidate_module\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodule\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 822\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 823\u001b[0m \u001b[0;31m# -----------------------------------------------------------------------------\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/ply/lex.py\u001b[0m in \u001b[0;36mvalidate_module\u001b[0;34m(self, module)\u001b[0m\n\u001b[1;32m 831\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mvalidate_module\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 832\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 833\u001b[0;31m \u001b[0mlines\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlinen\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetsourcelines\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodule\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 834\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mIOError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 835\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.7/inspect.py\u001b[0m in \u001b[0;36mgetsourcelines\u001b[0;34m(object)\u001b[0m\n\u001b[1;32m 953\u001b[0m raised if the source code cannot be retrieved.\"\"\"\n\u001b[1;32m 954\u001b[0m \u001b[0mobject\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munwrap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 955\u001b[0;31m \u001b[0mlines\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlnum\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfindsource\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 956\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 957\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mistraceback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.7/inspect.py\u001b[0m in \u001b[0;36mfindsource\u001b[0;34m(object)\u001b[0m\n\u001b[1;32m 766\u001b[0m is raised if the source code cannot be retrieved.\"\"\"\n\u001b[1;32m 767\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 768\u001b[0;31m \u001b[0mfile\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetsourcefile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 769\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfile\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 770\u001b[0m \u001b[0;31m# Invalidate cache if needed.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.7/inspect.py\u001b[0m in \u001b[0;36mgetsourcefile\u001b[0;34m(object)\u001b[0m\n\u001b[1;32m 682\u001b[0m \u001b[0mReturn\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mno\u001b[0m \u001b[0mway\u001b[0m \u001b[0mcan\u001b[0m \u001b[0mbe\u001b[0m \u001b[0midentified\u001b[0m \u001b[0mto\u001b[0m \u001b[0mget\u001b[0m \u001b[0mthe\u001b[0m \u001b[0msource\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 683\u001b[0m \"\"\"\n\u001b[0;32m--> 684\u001b[0;31m \u001b[0mfilename\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 685\u001b[0m \u001b[0mall_bytecode_suffixes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mimportlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmachinery\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDEBUG_BYTECODE_SUFFIXES\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 686\u001b[0m \u001b[0mall_bytecode_suffixes\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mimportlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmachinery\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOPTIMIZED_BYTECODE_SUFFIXES\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.7/inspect.py\u001b[0m in \u001b[0;36mgetfile\u001b[0;34m(object)\u001b[0m\n\u001b[1;32m 645\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'__file__'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 646\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__file__\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 647\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'{!r} is a built-in module'\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 648\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misclass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 649\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'__module__'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: is a built-in module" + ] + } + ], "source": [ "# -----------------------------------------------------------------------------\n", "# calc.py\n", @@ -454,22 +474,20 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": { "scrolled": true }, "outputs": [ { - "ename": "KeyboardInterrupt", - "evalue": "Interrupted by user", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m~/Documents/dev_python/python_study/python_study_basic_notebook/files/calc.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 124\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 125\u001b[0;31m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'calc > '\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# Use raw_input on Python 2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 126\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mEOFError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 127\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/py37/lib/python3.7/site-packages/ipykernel/kernelbase.py\u001b[0m in \u001b[0;36mraw_input\u001b[0;34m(self, prompt)\u001b[0m\n\u001b[1;32m 861\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_ident\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 862\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_header\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 863\u001b[0;31m \u001b[0mpassword\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 864\u001b[0m )\n\u001b[1;32m 865\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/py37/lib/python3.7/site-packages/ipykernel/kernelbase.py\u001b[0m in \u001b[0;36m_input_request\u001b[0;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[1;32m 891\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 892\u001b[0m \u001b[0;31m# re-raise KeyboardInterrupt, to truncate traceback\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 893\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Interrupted by user\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 894\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 895\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: Interrupted by user" + "name": "stdout", + "output_type": "stream", + "text": [ + "calc > 1+2*3-(5+6)+7685-54\n", + "7627\n", + "calc > h=4\n", + "calc > h+8\n", + "12\n" ] } ], diff --git "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" index 1d0ec6d..678c367 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" +++ "b/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" @@ -128,14 +128,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'code': '90000', 'message': 'success', 'data': {'region': {'US': {'2020-04-24': {'confirmed_add': 36163, 'deaths_add': 1995, 'recovered_add': 18876, 'confirmed': 905284, 'deaths': 51949, 'recovered': 99079}}}}}\n", + "{'code': '90000', 'message': 'success', 'data': {'region': {'US': {'2020-06-04': {'confirmed_add': 21140, 'deaths_add': 1036, 'recovered_add': 5744, 'confirmed': 1872611, 'deaths': 108211, 'recovered': 485002}}}}}\n", "\n" ] } @@ -163,7 +163,7 @@ "# the params\n", "payload = {\n", " 'region': region,\n", - " 'start_date':'2020-04-24'\n", + " 'start_date':'2020-06-04'\n", "}\n", "\n", "# call requets to load \n", From a55e5d90fa14b0a8c072be55c88af331b0a2c34b Mon Sep 17 00:00:00 2001 From: yijun_mbp15 Date: Sat, 13 Jun 2020 22:00:09 +0800 Subject: [PATCH 26/27] =?UTF-8?q?2020.6.13=20=E8=B0=83=E6=95=B4=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E7=BB=93=E6=9E=84=EF=BC=8C=E5=9F=BA=E7=A1=80=E8=AF=BE?= =?UTF-8?q?=E7=A8=8B=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=EF=BC=8C=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E4=B8=93=E9=A2=98=E8=AF=BE=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\261\241\347\274\226\347\250\213 01.ipynb" | 246 +++- ...\261\241\347\274\226\347\250\213 02.ipynb" | 326 ++++- .../pandas/COVID-19.py" | 0 .../pandas/pandas-COVID-19.ipynb" | 0 ...esson 01 - \347\256\200\344\273\213.ipynb" | 0 ...5\217\230\351\207\217, print, input.ipynb" | 0 ...345\255\227\347\254\246\344\270\262.ipynb" | 335 ++++- ... 04 - \345\210\227\350\241\250 list.ipynb" | 0 ...ict, \345\205\203\347\273\204 tuple.ipynb" | 0 ...351\232\217\346\234\272\346\225\260.ipynb" | 0 ...345\275\225\346\223\215\344\275\234.ipynb" | 0 ...esson 08 - \345\207\275\346\225\260.ipynb" | 0 ...346\234\237\345\207\275\346\225\260.ipynb" | 0 ...345\220\215\345\207\275\346\225\260.ipynb" | 0 ...345\220\210\345\272\223 collections.ipynb" | 0 ...347\224\237\346\210\220\345\274\217.ipynb" | 0 ...\223\346\236\204\345\222\214 pprint.ipynb" | 0 ...351\227\256\347\275\221\347\273\234.ipynb" | 0 ...\207\345\244\204\347\220\206 Pillow.ipynb" | 0 ...345\274\217\347\274\226\347\250\213.ipynb" | 0 ...345\270\270\345\244\204\347\220\206.ipynb" | 0 ...\235\242\347\274\226\347\250\213 tk.ipynb" | 0 ...47\273\203\344\271\240\351\242\230A.ipynb" | 802 ++++++++++++ ...\261\241\347\274\226\347\250\213 01.ipynb" | 246 +++- ...\261\241\347\274\226\347\250\213 02.ipynb" | 326 ++++- ...350\241\250\345\210\207\347\211\207.ipynb" | 0 ...03\346\265\213\350\257\225 unittest.ipynb" | 0 .../files/IMG_3845.JPG" | Bin 0 -> 7756393 bytes .../files/baidu_logo.gif" | Bin .../files/calc.py" | 0 .../files/list_dump.txt" | Bin .../files/parser.out" | 0 .../files/parsetab.py" | 0 .../files/ply/calc.py" | 128 ++ .../files/ply/parser.out" | 395 ++++++ .../files/ply/parsetab.py" | 40 + .../files/test.jpg" | Bin .../files/test.txt" | 0 .../files/test2.txt" | 0 .../files/test_blur.jpg" | Bin .../files/test_crop.jpg" | Bin .../files/test_drawline.jpg" | Bin .../files/test_edge.jpg" | Bin .../files/test_enhance.jpg" | Bin .../files/test_rotate.jpg" | Bin .../files/test_thumbnail.jpg" | Bin .../imgs/anaconda.png" | Bin .../imgs/guido-headshot-2019.jpg" | Bin .../imgs/jupyter.png" | Bin .../imgs/pycharm.png" | Bin .../imgs/pycharm_202001.png" | Bin .../imgs/python_install.jpeg" | Bin .../imgs/python_install_1.jpeg" | Bin .../imgs/python_install_2.jpeg" | Bin .../imgs/python_install_3.jpeg" | Bin .../imgs/python_install_4.jpeg" | Bin .../imgs/python_install_5.png" | Bin .../imgs_old/python_use.jpg" | Bin README.md | 3 + ...47\273\203\344\271\240\351\242\230A.ipynb" | 314 ----- ...\345\207\275\346\225\260-checkpoint.ipynb" | 405 ------ ...\345\207\275\346\225\260-checkpoint.ipynb" | 664 ---------- ...\345\272\223 collections-checkpoint.ipynb" | 1150 ----------------- ...\346\210\220\345\274\217-checkpoint.ipynb" | 252 ---- ...6\204\345\222\214 pprint-checkpoint.ipynb" | 597 --------- ...4\204\347\220\206 Pillow-checkpoint.ipynb" | 604 --------- ...\347\274\226\347\250\213-checkpoint.ipynb" | 273 ---- ...\344\271\213\345\233\233-checkpoint.ipynb" | 692 ---------- .../draft/python_basic_2/files/test.txt | 3 - .../draft/python_basic_2/imgs/logo.gif | Bin 1618 -> 0 bytes .../draft/python_basic_2/imgs/logo2.jpg | Bin 74653 -> 0 bytes .../draft/python_basic_2/imgs/logo3.jpg | Bin 20147 -> 0 bytes .../draft/python_basic_2/imgs/map.png | Bin 8390 -> 0 bytes .../draft/python_basic_2/imgs/test.jpg | Bin 138691 -> 0 bytes .../draft/python_basic_2/imgs/test_blur.jpg | Bin 26094 -> 0 bytes .../draft/python_basic_2/imgs/test_crop.jpg | Bin 4817 -> 0 bytes .../draft/python_basic_2/imgs/test_draw.jpg | Bin 46201 -> 0 bytes .../draft/python_basic_2/imgs/test_edge.jpg | Bin 75414 -> 0 bytes .../python_basic_2/imgs/test_enhance.jpg | Bin 40403 -> 0 bytes .../draft/python_basic_2/imgs/test_rotate.jpg | Bin 42363 -> 0 bytes .../python_basic_2/imgs/test_thumbnail.jpg | Bin 2406 -> 0 bytes .../Basic Exercise A-checkpoint.ipynb | 457 ------- .../lesson 01/Basic Exercise A.ipynb | 727 ----------- ...hon_senior_slides_python_senior_L1_v1.pptx | Bin 170747 -> 0 bytes ...7\274\226\347\250\213 tk-checkpoint.ipynb" | 137 -- ...hon_senior_slides_python_senior_L3_v1.pptx | Bin 520334 -> 0 bytes .../python_basic_L2_lesson07.ipynb | 343 ----- .../python_basic_L2_lesson14.ipynb | 322 ----- .../python_basic_L2_outline_v1.docx | Bin 21851 -> 0 bytes ...347\232\204\347\274\226\347\250\213.ipynb" | 273 ---- ...347\250\213\344\271\213\345\233\233.ipynb" | 692 ---------- 91 files changed, 2816 insertions(+), 7936 deletions(-) rename "python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\272\214.ipynb" => "Python \344\270\223\351\242\230\350\257\276\347\250\213/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 01.ipynb" (83%) rename "python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\270\211.ipynb" => "Python \344\270\223\351\242\230\350\257\276\347\250\213/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 02.ipynb" (75%) rename python_pandas_basic_notebook/COVID-19/COVID-19.py => "Python \344\270\223\351\242\230\350\257\276\347\250\213/pandas/COVID-19.py" (100%) rename python_pandas_basic_notebook/COVID-19/COVID-19.ipynb => "Python \344\270\223\351\242\230\350\257\276\347\250\213/pandas/pandas-COVID-19.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 01 - \347\256\200\344\273\213.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 01 - \347\256\200\344\273\213.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 02 - \345\217\230\351\207\217, print, input.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 02 - \345\217\230\351\207\217, print, input.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" (65%) rename "python_study_basic_notebook/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 05 - \345\255\227\345\205\270 dict, \345\205\203\347\273\204 tuple.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 05 - \345\255\227\345\205\270 dict, \345\205\203\347\273\204 tuple.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 17 - \345\274\202\345\270\270\345\244\204\347\220\206.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 17 - \345\274\202\345\270\270\345\244\204\347\220\206.ipynb" (100%) rename "python_study_basic_notebook/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" (100%) create mode 100644 "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic \347\273\203\344\271\240\351\242\230A.ipynb" rename "python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\272\214-checkpoint.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/python_basic_2/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 01.ipynb" (83%) rename "python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\270\211-checkpoint.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/python_basic_2/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 02.ipynb" (75%) rename "python_study_basic_notebook/draft/\345\210\227\350\241\250\345\210\207\347\211\207.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/\345\210\227\350\241\250\345\210\207\347\211\207.ipynb" (100%) rename "python_study_basic_notebook/draft/\345\215\225\345\205\203\346\265\213\350\257\225 unittest.ipynb" => "Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/\345\215\225\345\205\203\346\265\213\350\257\225 unittest.ipynb" (100%) create mode 100644 "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/IMG_3845.JPG" rename python_study_basic_notebook/files/baidu_logo.gif => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/baidu_logo.gif" (100%) rename python_study_basic_notebook/files/ply/calc.py => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/calc.py" (100%) rename python_study_basic_notebook/files/list_dump.txt => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/list_dump.txt" (100%) rename python_study_basic_notebook/files/ply/parser.out => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/parser.out" (100%) rename python_study_basic_notebook/files/ply/parsetab.py => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/parsetab.py" (100%) create mode 100644 "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/calc.py" create mode 100644 "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/parser.out" create mode 100644 "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/parsetab.py" rename python_study_basic_notebook/files/test.jpg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test.jpg" (100%) rename python_study_basic_notebook/files/test.txt => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test.txt" (100%) rename python_study_basic_notebook/files/test2.txt => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test2.txt" (100%) rename python_study_basic_notebook/files/test_blur.jpg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_blur.jpg" (100%) rename python_study_basic_notebook/files/test_crop.jpg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_crop.jpg" (100%) rename python_study_basic_notebook/files/test_drawline.jpg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_drawline.jpg" (100%) rename python_study_basic_notebook/files/test_edge.jpg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_edge.jpg" (100%) rename python_study_basic_notebook/files/test_enhance.jpg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_enhance.jpg" (100%) rename python_study_basic_notebook/files/test_rotate.jpg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_rotate.jpg" (100%) rename python_study_basic_notebook/files/test_thumbnail.jpg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_thumbnail.jpg" (100%) rename python_study_basic_notebook/imgs/anaconda.png => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/anaconda.png" (100%) rename python_study_basic_notebook/imgs/guido-headshot-2019.jpg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/guido-headshot-2019.jpg" (100%) rename python_study_basic_notebook/imgs/jupyter.png => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/jupyter.png" (100%) rename python_study_basic_notebook/imgs/pycharm.png => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/pycharm.png" (100%) rename python_study_basic_notebook/imgs/pycharm_202001.png => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/pycharm_202001.png" (100%) rename python_study_basic_notebook/imgs/python_install.jpeg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install.jpeg" (100%) rename python_study_basic_notebook/imgs/python_install_1.jpeg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_1.jpeg" (100%) rename python_study_basic_notebook/imgs/python_install_2.jpeg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_2.jpeg" (100%) rename python_study_basic_notebook/imgs/python_install_3.jpeg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_3.jpeg" (100%) rename python_study_basic_notebook/imgs/python_install_4.jpeg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_4.jpeg" (100%) rename python_study_basic_notebook/imgs/python_install_5.png => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_5.png" (100%) rename python_study_basic_notebook/imgs_old/python_use.jpg => "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs_old/python_use.jpg" (100%) delete mode 100644 "python_study_basic_notebook/Python Basic \347\273\203\344\271\240\351\242\230A.ipynb" delete mode 100644 "python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260-checkpoint.ipynb" delete mode 100644 "python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260-checkpoint.ipynb" delete mode 100644 "python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections-checkpoint.ipynb" delete mode 100644 "python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217-checkpoint.ipynb" delete mode 100644 "python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint-checkpoint.ipynb" delete mode 100644 "python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow-checkpoint.ipynb" delete mode 100644 "python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213-checkpoint.ipynb" delete mode 100644 "python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\345\233\233-checkpoint.ipynb" delete mode 100644 python_study_basic_notebook/draft/python_basic_2/files/test.txt delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/logo.gif delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/logo2.jpg delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/logo3.jpg delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/map.png delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/test.jpg delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/test_blur.jpg delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/test_crop.jpg delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/test_draw.jpg delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/test_edge.jpg delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/test_enhance.jpg delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/test_rotate.jpg delete mode 100644 python_study_basic_notebook/draft/python_basic_2/imgs/test_thumbnail.jpg delete mode 100644 python_study_basic_notebook/draft/python_basic_2/lesson 01/.ipynb_checkpoints/Basic Exercise A-checkpoint.ipynb delete mode 100644 python_study_basic_notebook/draft/python_basic_2/lesson 01/Basic Exercise A.ipynb delete mode 100644 python_study_basic_notebook/draft/python_basic_2/lesson 01/python_senior_slides_python_senior_L1_v1.pptx delete mode 100644 "python_study_basic_notebook/draft/python_basic_2/lesson 03/.ipynb_checkpoints/\347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk-checkpoint.ipynb" delete mode 100644 python_study_basic_notebook/draft/python_basic_2/lesson 03/python_senior_slides_python_senior_L3_v1.pptx delete mode 100644 python_study_basic_notebook/draft/python_basic_2/python_basic_L2_lesson07.ipynb delete mode 100644 python_study_basic_notebook/draft/python_basic_2/python_basic_L2_lesson14.ipynb delete mode 100644 python_study_basic_notebook/draft/python_basic_2/python_basic_L2_outline_v1.docx delete mode 100644 "python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213.ipynb" delete mode 100644 "python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\345\233\233.ipynb" diff --git "a/python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\272\214.ipynb" "b/Python \344\270\223\351\242\230\350\257\276\347\250\213/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 01.ipynb" similarity index 83% rename from "python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\272\214.ipynb" rename to "Python \344\270\223\351\242\230\350\257\276\347\250\213/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 01.ipynb" index 83f9981..6634c1a 100644 --- "a/python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\272\214.ipynb" +++ "b/Python \344\270\223\351\242\230\350\257\276\347\250\213/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 01.ipynb" @@ -4,20 +4,242 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Lesson 11\n", + "# Python - 面向对象编程 01\n", "\n", - "* Python Begginer, Level 2, Lesson 10, v1.0.0, 2016.11 by David.Yi\n", - "* v1.1. 2020.5.4 edit by David Yi\n", + "* Python Senior, Lesson 10, v1.0.0, 2016.11 by David.Yi\n", + "* v1.1, 2020.5.4, 6.13 edit by David Yi\n", "\n", "\n", "## 本次内容要点\n", "\n", - "* 面向对象的编程之二\n", - " * 创建和使用子类\n", - " * 构造器方法和解构器方法\n", - " * 调用父类的 super() 方法" + "* 类与实例\n", + "* 类的属性\n", + "* 类的方法\n", + "* 创建和使用子类\n", + "* 构造器方法和解构器方法\n", + "* 调用父类的 super() 方法" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "### 面向对象编程\n", + "\n", + "#### 类与实例\n", + "\n", + "类,是一个定义;实例是真正的对象的实现,创建一个实例的过程称作实例化。\n", + "\n", + "所有的类都继承自一个叫做 object 的类。继承的定义之后再说。\n", + "\n", + "类的一些操作方式和函数很像,在没有面向对象编程方式的时候,就是面向过程(函数)的开发方式。\n", + "\n", + "类可以很复杂,也可以很简单,取决于应用的需要。面向对象的编程方式,是现代流行的开发方式,博大精深,需要慢慢理解体会。一开始有些不太清楚,也没有关系。\n", + "\n", + "#### 类的属性\n", + "\n", + "类可以理解为一种称之为命名空间( namespace),在这个类之下,数据都是属于这个类的实例的,我们称为属性,用实例名字+点+属性名字。这样的类比较简单,在 c 语言中称为结构体,在 pascal 中为记录类型,python 的数据结构比较简单。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "5\n" + ] + } + ], + "source": [ + "# 申明一个 class MyData\n", + "class MyData(object):\n", + " pass\n", + "\n", + "# 实例化 MyData, 实例的名字叫做 obj_math\n", + "obj_math = MyData()\n", + "obj_math.x = 4\n", + "print(obj_math.x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "#### 类的方法\n", + "\n", + "光是把类作为命名空间太简单了,可以给类添加功能,称为方法。\n", + "\n", + "方法定义在类中,使用在实例中。可以理解为实例是真正做事情的代码,所以在实例中调用方法完成某个功能是合理的。\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello!\n", + "Hello!\n" + ] + } + ], + "source": [ + "class MyData(object):\n", + " \n", + " # 定义一个 SayHello 的方法,self 可以理解为必须传递的参数\n", + " def SayHello(self):\n", + " print('Hello!')\n", + " \n", + "# 实例化\n", + "obj_math = MyData()\n", + "\n", + "# 调用方法\n", + "obj_math.SayHello()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello!\n" + ] + } + ], + "source": [ + "# 类的方法的直接调用,其实还是实例化了\n", + "\n", + "MyData().SayHello()" ] }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello!\n", + "9\n", + "4\n" + ] + } + ], + "source": [ + "# 在上面基础上,复杂一点的例子\n", + "\n", + "class MyData(object):\n", + " \n", + " # 初始化方法,双下划线前后\n", + " # 实例化的时候,需要传递 self 之后的参数\n", + " def __init__(self, x, y):\n", + " self.x = x\n", + " self.y = y\n", + " \n", + " # 定义一个 SayHello 的方法,self 可以理解为必须传递的参数\n", + " def SayHello(self):\n", + " print('Hello!')\n", + " \n", + " def Add(self):\n", + " print(self.x + self.y)\n", + " \n", + "# 实例化\n", + "obj_math = MyData(3,4)\n", + "\n", + "# 调用方法\n", + "obj_math.SayHello()\n", + "\n", + "obj_math.x = 5\n", + "\n", + "obj_math.Add()\n", + "\n", + "o1 = MyData(1,3)\n", + "o1.Add()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello!\n", + "7\n", + "11\n" + ] + } + ], + "source": [ + "# 再复杂一点,创建多个实例\n", + "\n", + "class MyData(object):\n", + " \n", + " # 初始化方法,双下划线前后\n", + " # 实例化的时候,需要传递 self 之后的参数\n", + " def __init__(self, x, y):\n", + " self.x = x\n", + " self.y = y\n", + " \n", + " # 定义一个 SayHello 的方法,self 可以理解为必须传递的参数\n", + " def SayHello(self):\n", + " print('Hello!')\n", + " \n", + " def Add(self):\n", + " print(self.x + self.y)\n", + " \n", + "# 实例化\n", + "obj_math = MyData(3,4)\n", + "\n", + "# 调用方法\n", + "obj_math.SayHello()\n", + "obj_math.Add()\n", + "\n", + "# 再创建一个实例\n", + "obj_math2 = MyData(5,6)\n", + "obj_math2.Add()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 0]\n", + "[1, 2]\n", + "[4, 4]\n", + "[9, 6]\n", + "[16, 8]\n" + ] + } + ], + "source": [] + }, { "cell_type": "code", "execution_count": 6, @@ -1011,10 +1233,18 @@ " n.show_properties()\n", " s.append(n)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { - "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", diff --git "a/python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\270\211.ipynb" "b/Python \344\270\223\351\242\230\350\257\276\347\250\213/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 02.ipynb" similarity index 75% rename from "python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\270\211.ipynb" rename to "Python \344\270\223\351\242\230\350\257\276\347\250\213/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 02.ipynb" index aabd0ac..0139f1d 100644 --- "a/python_study_basic_notebook/draft/python_basic_2/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\270\211.ipynb" +++ "b/Python \344\270\223\351\242\230\350\257\276\347\250\213/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 02.ipynb" @@ -4,17 +4,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Lesson 12\n", + "# Python - 面向对象编程 02\n", "\n", "* Python Begginer, Level 2, Lesson 12, v1.0.0, 2016.12 by David.Yi\n", - "* v1.1, 2020.5.4 edit by David Yi\n", + "* v1.1, 2020.5.4,6.13 edit by David Yi\n", "\n", "## 本次内容要点\n", "\n", - "* 面向对象的编程之三\n", - " * 更加优雅的程序设计思路\n", - " * 类方法\n", - " * 静态方法\n" + "\n", + "* 更加优雅的程序设计思路\n", + "* 类方法\n", + "* 静态方法\n", + "* 类属性\n", + "* 类属性安全的访问方法\n" ] }, { @@ -856,8 +858,318 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "soldier NPC created!\n", + "name: AA0\n", + "weapon: sword\n", + "blood: 1000\n", + "level: 1\n", + "\n", + "soldier NPC created!\n", + "name: AA1\n", + "weapon: sword\n", + "blood: 1000\n", + "level: 1\n", + "\n", + "wizard NPC created!\n", + "name: CC0\n", + "weapon: staff\n", + "blood: 800\n", + "level: 1\n", + "\n", + "wizard NPC created!\n", + "name: CC1\n", + "weapon: staff\n", + "blood: 800\n", + "level: 1\n", + "\n", + "Begin Fighting:\n", + "('Soldier', 'blood', ('Fight Common', -100))\n", + "('Soldier', 'blood', ('Sword Fight!', -200))\n", + "('Wizard', 'blood', ('Fight Common', -100))\n", + "('Wizard', 'blood', ('Staff Magic!', -300))\n", + "\n", + "npc count: 4\n" + ] + } + ], + "source": [ + "# 进一步优化\n", + "# 加入类属性,npc_count, 计算创建了多少 npc \n", + "# v1.0.13\n", + "\n", + "# npc 的属性字典\n", + "npc_dict = {'soldier':{'weapon':'sword', 'blood':1000, 'level':1}, 'wizard':{'weapon':'staff', 'blood':800, 'level':1}}\n", + "# fight output 字典\n", + "fight_output_dict = {'fight_common':{'name':'Fight Common','blood':-100}, \n", + " 'sword_fight':{'name':'Sword Fight!','blood':-200},\n", + " 'staff_magic':{'name':'Staff Magic!','blood':-300}}\n", + "\n", + "# NPC 类\n", + "class NPC(object):\n", + " \n", + " npc_count = 0\n", + " \n", + " # 初始化 NPC 的属性\n", + " def __init__(self, name):\n", + " self.name = name\n", + " \n", + " # 将类名称转换为全部小写\n", + " self.npc_type = (type(self).__name__).lower()\n", + " \n", + " print('')\n", + " print(self.npc_type, 'NPC created!')\n", + " \n", + " # 初始化值统一放在 NPC 类中\n", + " # 从 npc_dict 中读出\n", + " # weapon_list 保存武器内容\n", + " self.weapon = npc_dict.get(self.npc_type).get('weapon')\n", + " self.blood = npc_dict.get(self.npc_type).get('blood')\n", + " self.level = npc_dict.get(self.npc_type).get('level')\n", + " \n", + " # npc 计数器 +1 \n", + " NPC.npc_count += 1 \n", + " \n", + " # 定义方法 - 显示 NPC 属性\n", + " def show_properties(self):\n", + " print('name:', self.name)\n", + " print('weapon:', self.weapon)\n", + " print('blood:', self.blood)\n", + " print('level:', self.level)\n", + " \n", + " # 定义方法 - 通用攻击\n", + " # fight 的内容从外部读入\n", + " @classmethod\n", + " def fight_common(cls):\n", + " return (cls.__name__, 'blood' , NPC.fight_output('fight_common'))\n", + " \n", + " # 静态方法 - 战斗输出\n", + " # 从外部数据读入战斗输出的值\n", + " @staticmethod\n", + " def fight_output(fight_type):\n", + " name = fight_output_dict.get(fight_type).get('name')\n", + " output = fight_output_dict.get(fight_type).get('blood')\n", + " return (name,output) \n", + " \n", + "# 战士 Soldier 类\n", + "class Soldier(NPC):\n", + " \n", + " # soldier 自己的战斗方法\n", + " def sword_fight(self):\n", + " return ('Soldier', 'blood' , NPC.fight_output('sword_fight')) \n", + " \n", + "# 巫师 Wizard 类\n", + "class Wizard(NPC):\n", + " \n", + " # wizard 自己的战斗方法\n", + " def staff_magic(self):\n", + " return ('Wizard', 'blood' , NPC.fight_output('staff_magic')) \n", + "\n", + "# 执行代码\n", + " \n", + "s = []\n", + "\n", + "for i in range(2):\n", + " n = Soldier('AA' + str(i))\n", + " n.show_properties()\n", + " s.append(n)\n", + " \n", + "for i in range(2):\n", + " n = Wizard('CC' + str(i))\n", + " n.show_properties()\n", + " s.append(n)\n", + "\n", + "\n", + "print('\\nBegin Fighting:')\n", + "print(s[1].fight_common())\n", + "print(s[1].sword_fight())\n", + "print(s[2].fight_common())\n", + "print(s[2].staff_magic())\n", + "# 查看 npc 数量\n", + "print('\\nnpc count: ', NPC.npc_count)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AA0\n", + "npc count: 5\n", + "4\n" + ] + } + ], + "source": [ + "# 类变量容易引起问题,每个实例会和类拥有同名的类变量\n", + "print(s[0].name)\n", + "s[0].npc_count += 1\n", + "print('npc count:',s[0].npc_count)\n", + "print(NPC.npc_count)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "soldier NPC created!\n", + "name: AA0\n", + "weapon: sword\n", + "blood: 1000\n", + "level: 1\n", + "\n", + "soldier NPC created!\n", + "name: AA1\n", + "weapon: sword\n", + "blood: 1000\n", + "level: 1\n", + "\n", + "wizard NPC created!\n", + "name: CC0\n", + "weapon: staff\n", + "blood: 800\n", + "level: 1\n", + "\n", + "wizard NPC created!\n", + "name: CC1\n", + "weapon: staff\n", + "blood: 800\n", + "level: 1\n", + "\n", + "Begin Fighting:\n", + "('Soldier', 'blood', ('Fight Common', -100))\n", + "('Soldier', 'blood', ('Sword Fight!', -200))\n", + "('Wizard', 'blood', ('Fight Common', -100))\n", + "('Wizard', 'blood', ('Staff Magic!', -300))\n", + "\n", + "npc count: 4\n" + ] + } + ], + "source": [ + "# 进一步优化\n", + "# 将类属性修改为私有,__npc_count, 并通过方法来获得创建了多少 npc \n", + "# v1.0.14\n", + "\n", + "# npc 的属性字典\n", + "npc_dict = {'soldier':{'weapon':'sword', 'blood':1000, 'level':1}, 'wizard':{'weapon':'staff', 'blood':800, 'level':1}}\n", + "# fight output 字典\n", + "fight_output_dict = {'fight_common':{'name':'Fight Common','blood':-100}, \n", + " 'sword_fight':{'name':'Sword Fight!','blood':-200},\n", + " 'staff_magic':{'name':'Staff Magic!','blood':-300}}\n", + "\n", + "# NPC 类\n", + "class NPC(object):\n", + " \n", + " __npc_count = 0\n", + " \n", + " # 初始化 NPC 的属性\n", + " def __init__(self, name):\n", + " self.name = name\n", + " \n", + " # 将类名称转换为全部小写\n", + " self.npc_type = (type(self).__name__).lower()\n", + " \n", + " print('')\n", + " print(self.npc_type, 'NPC created!')\n", + " \n", + " # 初始化值统一放在 NPC 类中\n", + " # 从 npc_dict 中读出\n", + " # weapon_list 保存武器内容\n", + " self.weapon = npc_dict.get(self.npc_type).get('weapon')\n", + " self.blood = npc_dict.get(self.npc_type).get('blood')\n", + " self.level = npc_dict.get(self.npc_type).get('level')\n", + " \n", + " # npc 计数器 +1 \n", + " NPC.__npc_count += 1 \n", + " \n", + " # 显示 npc 数量方法\n", + " @staticmethod\n", + " def get_npc_count():\n", + " return NPC.__npc_count\n", + " \n", + " # 定义方法 - 显示 NPC 属性\n", + " def show_properties(self):\n", + " print('name:', self.name)\n", + " print('weapon:', self.weapon)\n", + " print('blood:', self.blood)\n", + " print('level:', self.level)\n", + " \n", + " # 定义方法 - 通用攻击\n", + " # fight 的内容从外部读入\n", + " @classmethod\n", + " def fight_common(cls):\n", + " return (cls.__name__, 'blood' , NPC.fight_output('fight_common'))\n", + " \n", + " # 静态方法 - 战斗输出\n", + " # 从外部数据读入战斗输出的值\n", + " @staticmethod\n", + " def fight_output(fight_type):\n", + " name = fight_output_dict.get(fight_type).get('name')\n", + " output = fight_output_dict.get(fight_type).get('blood')\n", + " return (name,output) \n", + " \n", + "# 战士 Soldier 类\n", + "class Soldier(NPC):\n", + " \n", + " # soldier 自己的战斗方法\n", + " def sword_fight(self):\n", + " return ('Soldier', 'blood' , NPC.fight_output('sword_fight')) \n", + " \n", + "# 巫师 Wizard 类\n", + "class Wizard(NPC):\n", + " \n", + " # wizard 自己的战斗方法\n", + " def staff_magic(self):\n", + " return ('Wizard', 'blood' , NPC.fight_output('staff_magic')) \n", + "\n", + "# 执行代码\n", + " \n", + "s = []\n", + "\n", + "for i in range(2):\n", + " n = Soldier('AA' + str(i))\n", + " n.show_properties()\n", + " s.append(n)\n", + " \n", + "for i in range(2):\n", + " n = Wizard('CC' + str(i))\n", + " n.show_properties()\n", + " s.append(n)\n", + "\n", + "\n", + "print('\\nBegin Fighting:')\n", + "print(s[1].fight_common())\n", + "print(s[1].sword_fight())\n", + "print(s[2].fight_common())\n", + "print(s[2].staff_magic())\n", + "# 查看 npc 数量\n", + "print('\\nnpc count: ', NPC.get_npc_count())" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", diff --git a/python_pandas_basic_notebook/COVID-19/COVID-19.py "b/Python \344\270\223\351\242\230\350\257\276\347\250\213/pandas/COVID-19.py" similarity index 100% rename from python_pandas_basic_notebook/COVID-19/COVID-19.py rename to "Python \344\270\223\351\242\230\350\257\276\347\250\213/pandas/COVID-19.py" diff --git a/python_pandas_basic_notebook/COVID-19/COVID-19.ipynb "b/Python \344\270\223\351\242\230\350\257\276\347\250\213/pandas/pandas-COVID-19.ipynb" similarity index 100% rename from python_pandas_basic_notebook/COVID-19/COVID-19.ipynb rename to "Python \344\270\223\351\242\230\350\257\276\347\250\213/pandas/pandas-COVID-19.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 01 - \347\256\200\344\273\213.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 01 - \347\256\200\344\273\213.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 01 - \347\256\200\344\273\213.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 01 - \347\256\200\344\273\213.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 02 - \345\217\230\351\207\217, print, input.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 02 - \345\217\230\351\207\217, print, input.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 02 - \345\217\230\351\207\217, print, input.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 02 - \345\217\230\351\207\217, print, input.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" similarity index 65% rename from "python_study_basic_notebook/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" index acd8872..821725a 100644 --- "a/python_study_basic_notebook/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" +++ "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 03 - \345\276\252\347\216\257 for, \345\255\227\347\254\246\344\270\262.ipynb" @@ -7,13 +7,14 @@ "# Lesson 3\n", "Python Basic, Lesson 3, \n", "* v1.0, 2016\n", - "* v1.1, 2020.2,3,4 edit by David Yi\n", + "* v1.1, 2020.2,3,4, 6.13 edit by David Yi\n", "\n", "### 本章内容要点\n", "\n", "* for 循环语句和 range() 函数\n", "* 常用数据类型 \n", " * 字符串\n", + " * 字符串处理\n", "* 思考" ] }, @@ -479,6 +480,338 @@ "print('AB' in s) # 成员关系测试" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "#### 字符串处理\n", + "\n", + "字符串是程序中经常碰到的数据类型,字符串的很多处理和 list 有点像,但也有些区别" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "False\n" + ] + } + ], + "source": [ + "# 判断是否是字母\n", + "\n", + "s1 = 'abcde'\n", + "s2 = '12'\n", + "s3 = '12s'\n", + "print(s1.isalpha())\n", + "print(s2.isalpha())\n", + "print(s3.isalpha())" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "False\n" + ] + } + ], + "source": [ + "# 判断是否是字母、是否是数字\n", + "\n", + "s1 = 'abcde'\n", + "s2 = '12'\n", + "s3 = '12s'\n", + "print(s1.isalpha())\n", + "print(s2.isdigit())\n", + "print(s3.isalpha())" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n" + ] + } + ], + "source": [ + "# 判断是否是小写\n", + "\n", + "s1 = 'abc'\n", + "print(s1.islower())\n", + "print(''.islower())" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], + "source": [ + "# 判断是否是大写 \n", + "\n", + "s1 = 'ABC'\n", + "print(s1.isupper())" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], + "source": [ + "# 是否字母数字混合\n", + "\n", + "s1 ='123abc'\n", + "print(s1.isalnum())" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "find it\n", + "8\n" + ] + } + ], + "source": [ + "# 字符串查找\n", + "\n", + "s1 = 'What is your name'\n", + "if s1.find('your') != -1:\n", + " print('find it')\n", + " print(s1.find('your'))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "find it\n" + ] + } + ], + "source": [ + "# 字符串查找的另外一种方式\n", + "\n", + "s1 = 'What is your name'\n", + "if 'your' in s1 != -1:\n", + " print('find it')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "What is my name\n" + ] + } + ], + "source": [ + "# 字符串替换\n", + "\n", + "s1 = 'What is your name'\n", + "s2 = s1.replace('your', 'my')\n", + "print(s2)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "fedcba\n" + ] + } + ], + "source": [ + "# 字符串切片\n", + "\n", + "s1 = 'abcdef'\n", + "s2 = s1[::-1]\n", + "print(s2)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['a', 'b', 'c', 'd', 'e', 'f']\n", + "['', 'a', 'b', 'c', '', 'd', 'e', 'f']\n" + ] + } + ], + "source": [ + "# 字符串和列表的转换\n", + "\n", + "s1 = ' a b c d e f'\n", + "s2 = s1.split()\n", + "s3 = s1.split(' ')\n", + "print(s2)\n", + "print(s3)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abcdef\n", + "ABCDEF\n" + ] + } + ], + "source": [ + "# 字符串转换为小写、大写\n", + "\n", + "s1 = 'aBCdef'\n", + "print(s1.lower())\n", + "print(s1.upper())" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a b c d e f 12\n", + "a b c d e f 14\n", + " a b c d e f\n" + ] + } + ], + "source": [ + "# 字符串去除空格\n", + "\n", + "s1 = ' a b c d e f '\n", + "print(s1.strip(' '),len(s1.strip(' ')))\n", + "print(s1.lstrip(' '),len(s1.lstrip(' ')))\n", + "print(s1.rstrip(' '))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "012\n", + "2302\n", + "12 \n", + "2302\n", + " 12\n", + "2302\n" + ] + } + ], + "source": [ + "# 字符串对齐\n", + "\n", + "s1 = '12'\n", + "s2 = '2302'\n", + "print(s1.zfill(3))\n", + "print(s2.zfill(3))\n", + "\n", + "print(s1.ljust(4))\n", + "print(s2.ljust(4))\n", + "\n", + "print(s1.rjust(4))\n", + "print(s2.rjust(4))" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0976\n" + ] + } + ], + "source": [ + "a='12345679012456'\n", + "print(a[8:4:-1])" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git "a/python_study_basic_notebook/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 04 - \345\210\227\350\241\250 list.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 05 - \345\255\227\345\205\270 dict, \345\205\203\347\273\204 tuple.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 05 - \345\255\227\345\205\270 dict, \345\205\203\347\273\204 tuple.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 05 - \345\255\227\345\205\270 dict, \345\205\203\347\273\204 tuple.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 05 - \345\255\227\345\205\270 dict, \345\205\203\347\273\204 tuple.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 06 - \351\232\217\346\234\272\346\225\260.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 07 - \346\226\207\344\273\266\347\233\256\345\275\225\346\223\215\344\275\234.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 09 - \346\227\245\346\234\237\345\207\275\346\225\260.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 10 - \345\207\275\346\225\260\345\217\202\346\225\260\345\222\214\345\214\277\345\220\215\345\207\275\346\225\260.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 13 - \345\256\214\346\225\264\347\232\204 for \350\257\255\345\217\245\347\273\223\346\236\204\345\222\214 pprint.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 14 - \350\256\277\351\227\256\347\275\221\347\273\234.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 15 - \345\233\276\347\211\207\345\244\204\347\220\206 Pillow.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 16 - \345\207\275\346\225\260\345\274\217\347\274\226\347\250\213.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 17 - \345\274\202\345\270\270\345\244\204\347\220\206.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 17 - \345\274\202\345\270\270\345\244\204\347\220\206.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 17 - \345\274\202\345\270\270\345\244\204\347\220\206.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 17 - \345\274\202\345\270\270\345\244\204\347\220\206.ipynb" diff --git "a/python_study_basic_notebook/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" similarity index 100% rename from "python_study_basic_notebook/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 18 - \347\252\227\345\217\243\347\225\214\351\235\242\347\274\226\347\250\213 tk.ipynb" diff --git "a/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic \347\273\203\344\271\240\351\242\230A.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic \347\273\203\344\271\240\351\242\230A.ipynb" new file mode 100644 index 0000000..c26fd62 --- /dev/null +++ "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic \347\273\203\344\271\240\351\242\230A.ipynb" @@ -0,0 +1,802 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Basic 练习题 A\n", + "* v1.1, 2020.4, 2020.5,2020.6, edit by David Yi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目1:两个正整数a和b, 输出它们的最大公约数。\n", + "\n", + "例如:a = 24, b = 16\n", + "\n", + "则输出:8" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n" + ] + } + ], + "source": [ + "a = 24\n", + "b = 16\n", + "for i in range(min(a,b), 0, -1): \n", + " if a % i == 0 and b % i ==0: \n", + " print(i) \n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n" + ] + } + ], + "source": [ + "while b:\n", + " a,b=b,a%b\n", + "print(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n" + ] + } + ], + "source": [ + "print(max([x for x in range(1,a+1) if a%x==0 and b%x==0]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目2:输出 9*9 乘法口诀表\n", + "\n", + "\n", + "\n", + "程序分析:分行与列考虑,共9行9列,i控制行,j控制列。" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 x 1 = 1 \t\n", + "2 x 1 = 2 \t2 x 2 = 4 \t\n", + "3 x 1 = 3 \t3 x 2 = 6 \t3 x 3 = 9 \t\n", + "4 x 1 = 4 \t4 x 2 = 8 \t4 x 3 = 12 \t4 x 4 = 16 \t\n", + "5 x 1 = 5 \t5 x 2 = 10 \t5 x 3 = 15 \t5 x 4 = 20 \t5 x 5 = 25 \t\n", + "6 x 1 = 6 \t6 x 2 = 12 \t6 x 3 = 18 \t6 x 4 = 24 \t6 x 5 = 30 \t6 x 6 = 36 \t\n", + "7 x 1 = 7 \t7 x 2 = 14 \t7 x 3 = 21 \t7 x 4 = 28 \t7 x 5 = 35 \t7 x 6 = 42 \t7 x 7 = 49 \t\n", + "8 x 1 = 8 \t8 x 2 = 16 \t8 x 3 = 24 \t8 x 4 = 32 \t8 x 5 = 40 \t8 x 6 = 48 \t8 x 7 = 56 \t8 x 8 = 64 \t\n", + "9 x 1 = 9 \t9 x 2 = 18 \t9 x 3 = 27 \t9 x 4 = 36 \t9 x 5 = 45 \t9 x 6 = 54 \t9 x 7 = 63 \t9 x 8 = 72 \t9 x 9 = 81 \t\n" + ] + } + ], + "source": [ + "for i in range(1, 10):\n", + " for j in range(1, i+1):\n", + " print (\"%d x %d = %d\" % (i, j, i*j),\"\\t\",end=\"\")\n", + " if i==j:\n", + " print(\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 x 1 = 1 \t\n", + "1 x 2 = 2 \t2 x 2 = 4 \t\n", + "1 x 3 = 3 \t2 x 3 = 6 \t3 x 3 = 9 \t\n", + "1 x 4 = 4 \t2 x 4 = 8 \t3 x 4 = 12 \t4 x 4 = 16 \t\n", + "1 x 5 = 5 \t2 x 5 = 10 \t3 x 5 = 15 \t4 x 5 = 20 \t5 x 5 = 25 \t\n", + "1 x 6 = 6 \t2 x 6 = 12 \t3 x 6 = 18 \t4 x 6 = 24 \t5 x 6 = 30 \t6 x 6 = 36 \t\n", + "1 x 7 = 7 \t2 x 7 = 14 \t3 x 7 = 21 \t4 x 7 = 28 \t5 x 7 = 35 \t6 x 7 = 42 \t7 x 7 = 49 \t\n", + "1 x 8 = 8 \t2 x 8 = 16 \t3 x 8 = 24 \t4 x 8 = 32 \t5 x 8 = 40 \t6 x 8 = 48 \t7 x 8 = 56 \t8 x 8 = 64 \t\n", + "1 x 9 = 9 \t2 x 9 = 18 \t3 x 9 = 27 \t4 x 9 = 36 \t5 x 9 = 45 \t6 x 9 = 54 \t7 x 9 = 63 \t8 x 9 = 72 \t9 x 9 = 81 \t\n" + ] + } + ], + "source": [ + "i=0\n", + "j=0\n", + "while i<9:\n", + " i+=1\n", + " while j<9:\n", + " j+=1\n", + " print(j,\"x\",i,\"=\",i*j,\"\\t\",end=\"\")\n", + " if i==j:\n", + " j=0\n", + " print(\"\")\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 1 x 1 = 1\n", + " 1 x 2 = 2\t 2 x 2 = 4\n", + " 1 x 3 = 3\t 2 x 3 = 6\t 3 x 3 = 9\n", + " 1 x 4 = 4\t 2 x 4 = 8\t 3 x 4 = 12\t 4 x 4 = 16\n", + " 1 x 5 = 5\t 2 x 5 = 10\t 3 x 5 = 15\t 4 x 5 = 20\t 5 x 5 = 25\n", + " 1 x 6 = 6\t 2 x 6 = 12\t 3 x 6 = 18\t 4 x 6 = 24\t 5 x 6 = 30\t 6 x 6 = 36\n", + " 1 x 7 = 7\t 2 x 7 = 14\t 3 x 7 = 21\t 4 x 7 = 28\t 5 x 7 = 35\t 6 x 7 = 42\t 7 x 7 = 49\n", + " 1 x 8 = 8\t 2 x 8 = 16\t 3 x 8 = 24\t 4 x 8 = 32\t 5 x 8 = 40\t 6 x 8 = 48\t 7 x 8 = 56\t 8 x 8 = 64\n", + " 1 x 9 = 9\t 2 x 9 = 18\t 3 x 9 = 27\t 4 x 9 = 36\t 5 x 9 = 45\t 6 x 9 = 54\t 7 x 9 = 63\t 8 x 9 = 72\t 9 x 9 = 81\n" + ] + } + ], + "source": [ + "print('\\n'.join(['\\t'.join([\"%2s x%2s = %2s\"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目3:编写一个函数,给你三个整数a,b,c, 判断能否以它们为三个边长构成三角形。若能,输出YES,否则输出NO" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "no\n" + ] + } + ], + "source": [ + "def func1(a,b,c):\n", + " if (a+b)>c and (b+c)>a and (a+c)>b:\n", + " return 'yes'\n", + " else:\n", + " return 'no'\n", + "\n", + "\n", + "print(func1(1,2,3))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "yes\n" + ] + } + ], + "source": [ + "\n", + "def func2(a,b,c):\n", + " if max(a,b,c)<(a+b+c)/2.0:\n", + " return 'yes'\n", + " else:\n", + " return 'no'\n", + "\n", + "print(func2(3,4,5))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n" + ] + } + ], + "source": [ + "# if else 的用法\n", + "\n", + "x, y = 4, 5\n", + "\n", + "smaller = x if x > y else y\n", + "\n", + "print(smaller)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "27\n" + ] + } + ], + "source": [ + "# 匿名函数 lambda 用法\n", + "\n", + "a = lambda x, y=2 : x + y*3 \n", + "print(a(3) + a(3, 5))" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n" + ] + } + ], + "source": [ + "# list 的 count方法\n", + "\n", + "l = ['tom', 'steven', 'jerry', 'steven']\n", + "print(l.count('tom') + l.count('steven'))" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n" + ] + } + ], + "source": [ + "# os 用法\n", + "# 计算目录下有多少文件\n", + "\n", + "import os\n", + "\n", + "a = os.listdir()\n", + "print(len(a))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "204" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 获得路径或者文件的大小\n", + "import os\n", + "\n", + "os.path.getsize('/Users')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "164\n" + ] + } + ], + "source": [ + "# 列表生成式用法\n", + "# 在列表生成式后面加上判断,过滤出结果为偶数的结果\n", + "\n", + "n = 0\n", + "for i in [x * x for x in range(8, 11) if x % 2 == 0]:\n", + " n = n + i\n", + "print(n)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello\n", + "byebye\n" + ] + } + ], + "source": [ + "# 简化调用方式\n", + "# 省却了 try...finally,会有 with 来自动控制\n", + "\n", + "filename = 'test.txt'\n", + "\n", + "with open(filename, 'r') as f:\n", + " print(f.read())" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n" + ] + } + ], + "source": [ + "# python 有趣灵活的变量定义\n", + "\n", + "first, second, *rest = (1,2,3,4,5,6,7,8)\n", + "print(first + second + rest[2])" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "letter: t\n" + ] + } + ], + "source": [ + "# for continue 举例\n", + "# 以及 等于 不等于 或者 的逻辑判断\n", + "\n", + "for l in 'computer':\n", + " if l != 't' or l == 'u':\n", + " continue\n", + " print('letter:', l)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3 4 5\n", + "count: 1\n" + ] + } + ], + "source": [ + "# 找到符合 x*x + y*y == z*z + 3 的 x y z\n", + "# 多种循环\n", + "\n", + "n = 0\n", + "\n", + "for x in range(1,10):\n", + " for y in range(x,10):\n", + " for z in range(y,10):\n", + " if x*x + y*y == z*z:\n", + " print(x,y,z)\n", + " n= n + 1\n", + "print('count:',n)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(2, 4, 1)\n" + ] + } + ], + "source": [ + "# python 内置函数 \n", + "\n", + "print(max((1,2),(2,3),(2,4),(2,4,1)))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 amy\n", + "1 tom\n", + "2 jerry \n" + ] + } + ], + "source": [ + "l = ['amy', 'tom', 'jerry ']\n", + "for i, item in enumerate(l):\n", + " print(i, item)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 7, 9, 11, 13, 15, 17, 19, 21, 23]\n", + "18\n" + ] + } + ], + "source": [ + "# question 1\n", + "l = [ x * 2 + 3 for x in range(1, 11)] \n", + "print(l)\n", + "print(l[1]+l[3])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/Users/yijun/dev_python/python_beginner/python_basic_L2'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# question 2\n", + "\n", + "import os\n", + "\n", + "os.getcwd()" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3 4 5\n" + ] + } + ], + "source": [ + "# question 3\n", + "\n", + "first, second, *rest = (1,2,3,4,5)\n", + "print(*rest)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "appendleft() 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[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mq\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdeque\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'a'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'b'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappendleft\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'b'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'a'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcount\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'b'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: appendleft() takes exactly one argument (2 given)" + ] + } + ], + "source": [ + "# question 4\n", + "\n", + "from collections import deque\n", + "\n", + "q = deque(['a', 'b'])\n", + "q.appendleft('b','a')\n", + "\n", + "print(q.count('b'))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "yes\n" + ] + } + ], + "source": [ + "# question 5\n", + "\n", + "x, y = 3, 6\n", + "\n", + "if 1 < x < 4 < y:\n", + " print('yes')\n", + "else:\n", + " print('no')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n" + ] + } + ], + "source": [ + "# question 6\n", + "\n", + "d = dict([('a', 1), ('b', 2)])\n", + "print(d.get('a',2))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n" + ] + } + ], + "source": [ + "# question 7\n", + "\n", + "a = [0, 1, 2, 3, 4, 5]\n", + "n = 0\n", + "for i in a[::-2]:\n", + " n=n+i\n", + "print(n)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a---a\n" + ] + } + ], + "source": [ + "# question 8\n", + "\n", + "a = ['a', '-', 'a']\n", + "print('-'.join(a))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12\n" + ] + } + ], + "source": [ + "# quesion 9\n", + "\n", + "from functools import reduce\n", + "\n", + "def f(x,y=2):\n", + " return x + y\n", + "\n", + "r = map(f, [1, 2, 3])\n", + "\n", + "s = reduce(f,r)\n", + "\n", + "print(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "small\n" + ] + } + ], + "source": [ + "# question 10\n", + "\n", + "if 2 in [1,2,3]:\n", + " print('small')\n", + "else:\n", + " print('big')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "False\n", + "False\n" + ] + } + ], + "source": [ + "# quesion 11\n", + "\n", + "s1 = 'abcde'\n", + "s2 = '12'\n", + "s3 = '12s'\n", + "s4 = '#s'\n", + "print(s1.isalpha())\n", + "print(s2.isalpha())\n", + "print(s3.isalpha())\n", + "print(s4.isalpha())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git "a/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\272\214-checkpoint.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/python_basic_2/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 01.ipynb" similarity index 83% rename from "python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\272\214-checkpoint.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/python_basic_2/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 01.ipynb" index 83f9981..6634c1a 100644 --- "a/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\272\214-checkpoint.ipynb" +++ "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/python_basic_2/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 01.ipynb" @@ -4,20 +4,242 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Lesson 11\n", + "# Python - 面向对象编程 01\n", "\n", - "* Python Begginer, Level 2, Lesson 10, v1.0.0, 2016.11 by David.Yi\n", - "* v1.1. 2020.5.4 edit by David Yi\n", + "* Python Senior, Lesson 10, v1.0.0, 2016.11 by David.Yi\n", + "* v1.1, 2020.5.4, 6.13 edit by David Yi\n", "\n", "\n", "## 本次内容要点\n", "\n", - "* 面向对象的编程之二\n", - " * 创建和使用子类\n", - " * 构造器方法和解构器方法\n", - " * 调用父类的 super() 方法" + "* 类与实例\n", + "* 类的属性\n", + "* 类的方法\n", + "* 创建和使用子类\n", + "* 构造器方法和解构器方法\n", + "* 调用父类的 super() 方法" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "### 面向对象编程\n", + "\n", + "#### 类与实例\n", + "\n", + "类,是一个定义;实例是真正的对象的实现,创建一个实例的过程称作实例化。\n", + "\n", + "所有的类都继承自一个叫做 object 的类。继承的定义之后再说。\n", + "\n", + "类的一些操作方式和函数很像,在没有面向对象编程方式的时候,就是面向过程(函数)的开发方式。\n", + "\n", + "类可以很复杂,也可以很简单,取决于应用的需要。面向对象的编程方式,是现代流行的开发方式,博大精深,需要慢慢理解体会。一开始有些不太清楚,也没有关系。\n", + "\n", + "#### 类的属性\n", + "\n", + "类可以理解为一种称之为命名空间( namespace),在这个类之下,数据都是属于这个类的实例的,我们称为属性,用实例名字+点+属性名字。这样的类比较简单,在 c 语言中称为结构体,在 pascal 中为记录类型,python 的数据结构比较简单。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "5\n" + ] + } + ], + "source": [ + "# 申明一个 class MyData\n", + "class MyData(object):\n", + " pass\n", + "\n", + "# 实例化 MyData, 实例的名字叫做 obj_math\n", + "obj_math = MyData()\n", + "obj_math.x = 4\n", + "print(obj_math.x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "#### 类的方法\n", + "\n", + "光是把类作为命名空间太简单了,可以给类添加功能,称为方法。\n", + "\n", + "方法定义在类中,使用在实例中。可以理解为实例是真正做事情的代码,所以在实例中调用方法完成某个功能是合理的。\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello!\n", + "Hello!\n" + ] + } + ], + "source": [ + "class MyData(object):\n", + " \n", + " # 定义一个 SayHello 的方法,self 可以理解为必须传递的参数\n", + " def SayHello(self):\n", + " print('Hello!')\n", + " \n", + "# 实例化\n", + "obj_math = MyData()\n", + "\n", + "# 调用方法\n", + "obj_math.SayHello()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello!\n" + ] + } + ], + "source": [ + "# 类的方法的直接调用,其实还是实例化了\n", + "\n", + "MyData().SayHello()" ] }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello!\n", + "9\n", + "4\n" + ] + } + ], + "source": [ + "# 在上面基础上,复杂一点的例子\n", + "\n", + "class MyData(object):\n", + " \n", + " # 初始化方法,双下划线前后\n", + " # 实例化的时候,需要传递 self 之后的参数\n", + " def __init__(self, x, y):\n", + " self.x = x\n", + " self.y = y\n", + " \n", + " # 定义一个 SayHello 的方法,self 可以理解为必须传递的参数\n", + " def SayHello(self):\n", + " print('Hello!')\n", + " \n", + " def Add(self):\n", + " print(self.x + self.y)\n", + " \n", + "# 实例化\n", + "obj_math = MyData(3,4)\n", + "\n", + "# 调用方法\n", + "obj_math.SayHello()\n", + "\n", + "obj_math.x = 5\n", + "\n", + "obj_math.Add()\n", + "\n", + "o1 = MyData(1,3)\n", + "o1.Add()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello!\n", + "7\n", + "11\n" + ] + } + ], + "source": [ + "# 再复杂一点,创建多个实例\n", + "\n", + "class MyData(object):\n", + " \n", + " # 初始化方法,双下划线前后\n", + " # 实例化的时候,需要传递 self 之后的参数\n", + " def __init__(self, x, y):\n", + " self.x = x\n", + " self.y = y\n", + " \n", + " # 定义一个 SayHello 的方法,self 可以理解为必须传递的参数\n", + " def SayHello(self):\n", + " print('Hello!')\n", + " \n", + " def Add(self):\n", + " print(self.x + self.y)\n", + " \n", + "# 实例化\n", + "obj_math = MyData(3,4)\n", + "\n", + "# 调用方法\n", + "obj_math.SayHello()\n", + "obj_math.Add()\n", + "\n", + "# 再创建一个实例\n", + "obj_math2 = MyData(5,6)\n", + "obj_math2.Add()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 0]\n", + "[1, 2]\n", + "[4, 4]\n", + "[9, 6]\n", + "[16, 8]\n" + ] + } + ], + "source": [] + }, { "cell_type": "code", "execution_count": 6, @@ -1011,10 +1233,18 @@ " n.show_properties()\n", " s.append(n)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { - "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", diff --git "a/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\270\211-checkpoint.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/python_basic_2/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 02.ipynb" similarity index 75% rename from "python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\270\211-checkpoint.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/python_basic_2/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 02.ipynb" index aabd0ac..0139f1d 100644 --- "a/python_study_basic_notebook/draft/python_basic_2/.ipynb_checkpoints/\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\347\274\226\347\250\213\344\271\213\344\270\211-checkpoint.ipynb" +++ "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/python_basic_2/Python - \351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213 02.ipynb" @@ -4,17 +4,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Lesson 12\n", + "# Python - 面向对象编程 02\n", "\n", "* Python Begginer, Level 2, Lesson 12, v1.0.0, 2016.12 by David.Yi\n", - "* v1.1, 2020.5.4 edit by David Yi\n", + "* v1.1, 2020.5.4,6.13 edit by David Yi\n", "\n", "## 本次内容要点\n", "\n", - "* 面向对象的编程之三\n", - " * 更加优雅的程序设计思路\n", - " * 类方法\n", - " * 静态方法\n" + "\n", + "* 更加优雅的程序设计思路\n", + "* 类方法\n", + "* 静态方法\n", + "* 类属性\n", + "* 类属性安全的访问方法\n" ] }, { @@ -856,8 +858,318 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "soldier NPC created!\n", + "name: AA0\n", + "weapon: sword\n", + "blood: 1000\n", + "level: 1\n", + "\n", + "soldier NPC created!\n", + "name: AA1\n", + "weapon: sword\n", + "blood: 1000\n", + "level: 1\n", + "\n", + "wizard NPC created!\n", + "name: CC0\n", + "weapon: staff\n", + "blood: 800\n", + "level: 1\n", + "\n", + "wizard NPC created!\n", + "name: CC1\n", + "weapon: staff\n", + "blood: 800\n", + "level: 1\n", + "\n", + "Begin Fighting:\n", + "('Soldier', 'blood', ('Fight Common', -100))\n", + "('Soldier', 'blood', ('Sword Fight!', -200))\n", + "('Wizard', 'blood', ('Fight Common', -100))\n", + "('Wizard', 'blood', ('Staff Magic!', -300))\n", + "\n", + "npc count: 4\n" + ] + } + ], + "source": [ + "# 进一步优化\n", + "# 加入类属性,npc_count, 计算创建了多少 npc \n", + "# v1.0.13\n", + "\n", + "# npc 的属性字典\n", + "npc_dict = {'soldier':{'weapon':'sword', 'blood':1000, 'level':1}, 'wizard':{'weapon':'staff', 'blood':800, 'level':1}}\n", + "# fight output 字典\n", + "fight_output_dict = {'fight_common':{'name':'Fight Common','blood':-100}, \n", + " 'sword_fight':{'name':'Sword Fight!','blood':-200},\n", + " 'staff_magic':{'name':'Staff Magic!','blood':-300}}\n", + "\n", + "# NPC 类\n", + "class NPC(object):\n", + " \n", + " npc_count = 0\n", + " \n", + " # 初始化 NPC 的属性\n", + " def __init__(self, name):\n", + " self.name = name\n", + " \n", + " # 将类名称转换为全部小写\n", + " self.npc_type = (type(self).__name__).lower()\n", + " \n", + " print('')\n", + " print(self.npc_type, 'NPC created!')\n", + " \n", + " # 初始化值统一放在 NPC 类中\n", + " # 从 npc_dict 中读出\n", + " # weapon_list 保存武器内容\n", + " self.weapon = npc_dict.get(self.npc_type).get('weapon')\n", + " self.blood = npc_dict.get(self.npc_type).get('blood')\n", + " self.level = npc_dict.get(self.npc_type).get('level')\n", + " \n", + " # npc 计数器 +1 \n", + " NPC.npc_count += 1 \n", + " \n", + " # 定义方法 - 显示 NPC 属性\n", + " def show_properties(self):\n", + " print('name:', self.name)\n", + " print('weapon:', self.weapon)\n", + " print('blood:', self.blood)\n", + " print('level:', self.level)\n", + " \n", + " # 定义方法 - 通用攻击\n", + " # fight 的内容从外部读入\n", + " @classmethod\n", + " def fight_common(cls):\n", + " return (cls.__name__, 'blood' , NPC.fight_output('fight_common'))\n", + " \n", + " # 静态方法 - 战斗输出\n", + " # 从外部数据读入战斗输出的值\n", + " @staticmethod\n", + " def fight_output(fight_type):\n", + " name = fight_output_dict.get(fight_type).get('name')\n", + " output = fight_output_dict.get(fight_type).get('blood')\n", + " return (name,output) \n", + " \n", + "# 战士 Soldier 类\n", + "class Soldier(NPC):\n", + " \n", + " # soldier 自己的战斗方法\n", + " def sword_fight(self):\n", + " return ('Soldier', 'blood' , NPC.fight_output('sword_fight')) \n", + " \n", + "# 巫师 Wizard 类\n", + "class Wizard(NPC):\n", + " \n", + " # wizard 自己的战斗方法\n", + " def staff_magic(self):\n", + " return ('Wizard', 'blood' , NPC.fight_output('staff_magic')) \n", + "\n", + "# 执行代码\n", + " \n", + "s = []\n", + "\n", + "for i in range(2):\n", + " n = Soldier('AA' + str(i))\n", + " n.show_properties()\n", + " s.append(n)\n", + " \n", + "for i in range(2):\n", + " n = Wizard('CC' + str(i))\n", + " n.show_properties()\n", + " s.append(n)\n", + "\n", + "\n", + "print('\\nBegin Fighting:')\n", + "print(s[1].fight_common())\n", + "print(s[1].sword_fight())\n", + "print(s[2].fight_common())\n", + "print(s[2].staff_magic())\n", + "# 查看 npc 数量\n", + "print('\\nnpc count: ', NPC.npc_count)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AA0\n", + "npc count: 5\n", + "4\n" + ] + } + ], + "source": [ + "# 类变量容易引起问题,每个实例会和类拥有同名的类变量\n", + "print(s[0].name)\n", + "s[0].npc_count += 1\n", + "print('npc count:',s[0].npc_count)\n", + "print(NPC.npc_count)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "soldier NPC created!\n", + "name: AA0\n", + "weapon: sword\n", + "blood: 1000\n", + "level: 1\n", + "\n", + "soldier NPC created!\n", + "name: AA1\n", + "weapon: sword\n", + "blood: 1000\n", + "level: 1\n", + "\n", + "wizard NPC created!\n", + "name: CC0\n", + "weapon: staff\n", + "blood: 800\n", + "level: 1\n", + "\n", + "wizard NPC created!\n", + "name: CC1\n", + "weapon: staff\n", + "blood: 800\n", + "level: 1\n", + "\n", + "Begin Fighting:\n", + "('Soldier', 'blood', ('Fight Common', -100))\n", + "('Soldier', 'blood', ('Sword Fight!', -200))\n", + "('Wizard', 'blood', ('Fight Common', -100))\n", + "('Wizard', 'blood', ('Staff Magic!', -300))\n", + "\n", + "npc count: 4\n" + ] + } + ], + "source": [ + "# 进一步优化\n", + "# 将类属性修改为私有,__npc_count, 并通过方法来获得创建了多少 npc \n", + "# v1.0.14\n", + "\n", + "# npc 的属性字典\n", + "npc_dict = {'soldier':{'weapon':'sword', 'blood':1000, 'level':1}, 'wizard':{'weapon':'staff', 'blood':800, 'level':1}}\n", + "# fight output 字典\n", + "fight_output_dict = {'fight_common':{'name':'Fight Common','blood':-100}, \n", + " 'sword_fight':{'name':'Sword Fight!','blood':-200},\n", + " 'staff_magic':{'name':'Staff Magic!','blood':-300}}\n", + "\n", + "# NPC 类\n", + "class NPC(object):\n", + " \n", + " __npc_count = 0\n", + " \n", + " # 初始化 NPC 的属性\n", + " def __init__(self, name):\n", + " self.name = name\n", + " \n", + " # 将类名称转换为全部小写\n", + " self.npc_type = (type(self).__name__).lower()\n", + " \n", + " print('')\n", + " print(self.npc_type, 'NPC created!')\n", + " \n", + " # 初始化值统一放在 NPC 类中\n", + " # 从 npc_dict 中读出\n", + " # weapon_list 保存武器内容\n", + " self.weapon = npc_dict.get(self.npc_type).get('weapon')\n", + " self.blood = npc_dict.get(self.npc_type).get('blood')\n", + " self.level = npc_dict.get(self.npc_type).get('level')\n", + " \n", + " # npc 计数器 +1 \n", + " NPC.__npc_count += 1 \n", + " \n", + " # 显示 npc 数量方法\n", + " @staticmethod\n", + " def get_npc_count():\n", + " return NPC.__npc_count\n", + " \n", + " # 定义方法 - 显示 NPC 属性\n", + " def show_properties(self):\n", + " print('name:', self.name)\n", + " print('weapon:', self.weapon)\n", + " print('blood:', self.blood)\n", + " print('level:', self.level)\n", + " \n", + " # 定义方法 - 通用攻击\n", + " # fight 的内容从外部读入\n", + " @classmethod\n", + " def fight_common(cls):\n", + " return (cls.__name__, 'blood' , NPC.fight_output('fight_common'))\n", + " \n", + " # 静态方法 - 战斗输出\n", + " # 从外部数据读入战斗输出的值\n", + " @staticmethod\n", + " def fight_output(fight_type):\n", + " name = fight_output_dict.get(fight_type).get('name')\n", + " output = fight_output_dict.get(fight_type).get('blood')\n", + " return (name,output) \n", + " \n", + "# 战士 Soldier 类\n", + "class Soldier(NPC):\n", + " \n", + " # soldier 自己的战斗方法\n", + " def sword_fight(self):\n", + " return ('Soldier', 'blood' , NPC.fight_output('sword_fight')) \n", + " \n", + "# 巫师 Wizard 类\n", + "class Wizard(NPC):\n", + " \n", + " # wizard 自己的战斗方法\n", + " def staff_magic(self):\n", + " return ('Wizard', 'blood' , NPC.fight_output('staff_magic')) \n", + "\n", + "# 执行代码\n", + " \n", + "s = []\n", + "\n", + "for i in range(2):\n", + " n = Soldier('AA' + str(i))\n", + " n.show_properties()\n", + " s.append(n)\n", + " \n", + "for i in range(2):\n", + " n = Wizard('CC' + str(i))\n", + " n.show_properties()\n", + " s.append(n)\n", + "\n", + "\n", + "print('\\nBegin Fighting:')\n", + "print(s[1].fight_common())\n", + "print(s[1].sword_fight())\n", + "print(s[2].fight_common())\n", + "print(s[2].staff_magic())\n", + "# 查看 npc 数量\n", + "print('\\nnpc count: ', NPC.get_npc_count())" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", diff --git "a/python_study_basic_notebook/draft/\345\210\227\350\241\250\345\210\207\347\211\207.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/\345\210\227\350\241\250\345\210\207\347\211\207.ipynb" similarity index 100% rename from "python_study_basic_notebook/draft/\345\210\227\350\241\250\345\210\207\347\211\207.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/\345\210\227\350\241\250\345\210\207\347\211\207.ipynb" diff --git "a/python_study_basic_notebook/draft/\345\215\225\345\205\203\346\265\213\350\257\225 unittest.ipynb" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/\345\215\225\345\205\203\346\265\213\350\257\225 unittest.ipynb" similarity index 100% rename from "python_study_basic_notebook/draft/\345\215\225\345\205\203\346\265\213\350\257\225 unittest.ipynb" rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/draft/\345\215\225\345\205\203\346\265\213\350\257\225 unittest.ipynb" diff --git "a/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/IMG_3845.JPG" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/IMG_3845.JPG" new file mode 100644 index 0000000000000000000000000000000000000000..4138905834d12380c504e0443424b26173431ff0 GIT binary patch literal 7756393 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

V6k6F6&lQtHJVq(heUwQQ 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 YQ9BZsf7rUR_zllH5c?I$cP@V+ee*;R(+e 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%0D6S&AVq%TtjdJC<5AzRlbA!-zuPoOtBeqj? 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 z

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