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/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 \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/.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 \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/.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 \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/.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 \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/.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 \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/.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 \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 91% 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" index d190ab7..34ce05e 100644 --- "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" @@ -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 \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 3db2ff2..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", "* 思考" ] }, @@ -426,7 +427,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -456,7 +457,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -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": {}, @@ -492,7 +825,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 18, "metadata": {}, "outputs": [ { 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 98% 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" index 49278d1..b290bea 100644 --- "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" @@ -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": [ { @@ -242,7 +242,7 @@ ], "source": [ "# 列表追加另一个列表的元素\n", - "# 使用 extned 一个列表,会以元素的形式追加到原来的列表\n", + "# 使用 extend 一个列表,会以元素的形式追加到原来的列表\n", "\n", "a = ['pig', 'cat', 'dog', 'snake']\n", "b = ['cat1', 'cat2', 'cat3']\n", @@ -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 \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 63% 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" 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 \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" @@ -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 \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 93% 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" index 0c0148a..8d157dc 100644 --- "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" @@ -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() 将一个列表中的元素打乱" ] }, { @@ -443,12 +442,39 @@ "print(gen_random_id_card(age=30, gender='01', result_type='LIST'))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3. 猜数程序修改为机器猜,根据每次人返回的结果来调整策略" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "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 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 54% 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" index 3c0e4f6..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 \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" @@ -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", @@ -26,7 +26,7 @@ "\n", "## 文件和目录操作之一\n", "\n", - "Python 的 os 库:有很多和文件、路径和执行系统命令相关的函数。\n", + "Python 的 os 库有很多和文件、路径和执行系统命令相关的函数。\n", "\n", "### os 库常用函数\n", "\n", @@ -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", @@ -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,71 +833,160 @@ }, { "cell_type": "code", - "execution_count": 30, + "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-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\\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\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\\files\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\\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\\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_outline.md\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" ] } ], @@ -993,23 +1082,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 +1154,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 +1183,7 @@ "\n", "## 文件和目录操作之二\n", "\n", - "读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。\n", + "读写文件是最常见的IO操作。Python内置了读写文件的函数。\n", "\n", "读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象,然后,通过操作系统提供的接口从这个文件对象中读取数据,或者把数据写入这个文件对象。\n", "\n", @@ -1125,7 +1225,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 +1234,7 @@ "\n", "print(filename)\n", "\n", + "# 和读写文件打交道是一件需要小心的事情,这里用了 try-finally 的方式来避免出错\n", "try:\n", " # 打开文件\n", " f = open(filename, 'r')\n", @@ -1161,7 +1261,7 @@ ], "source": [ "# 简化调用方式\n", - "# 省却了 try...finally,会有 with 来自动控制\n", + "# 省却了 try...finally,会有 with 来自动控制保证可以关闭文件等\n", "\n", "with open(filename, 'r') as f:\n", " print(f.read())" @@ -1258,7 +1358,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -1266,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" ] } @@ -1321,42 +1424,168 @@ "\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": 5, "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": [ + "[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": 5, + "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 +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/Python Basic Lesson 08 - \345\207\275\346\225\260\347\256\200\344\273\213.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 81% 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 \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 08 - \345\207\275\346\225\260.ipynb" index af979d8..1325795 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 \345\237\272\347\241\200\350\257\276\347\250\213/Python Basic Lesson 08 - \345\207\275\346\225\260.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" ] }, { @@ -105,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -156,7 +156,32 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "如果上面的函数要修改只有一个 return 应该怎么修改呢?" + "如果上面的函数要修改成只有一个 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))" ] }, { @@ -168,17 +193,17 @@ "name": "stdout", "output_type": "stream", "text": [ - "(1, 5, 30, 14, 25)\n", + "\n", "100\n" ] } ], "source": [ "# *number 这样的写法,可以理解为传入任意数目个参数,包括0个参数,就是在参数名称前面加上一个 * \n", - "# 为了简化程序逻辑,返回的结果现在是假的\n", + "# 为了简化程序逻辑,返回的结果现在是假的,后面我们会再修改\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))" @@ -186,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -278,32 +303,58 @@ }, { "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))" + ] + }, + { + "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))" ] }, { @@ -372,16 +423,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 思考\n", + "## 思考一下\n", "\n", - "1. 剪刀石头布。" + "1. 写一个简单的剪刀石头布的游戏;" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0:剪刀 1:石头 2:布\n", + "你出了:2\n", + "电脑出了 布\n", + "draw\n" + ] + } + ], "source": [ "# 简单的剪刀石头布\n", "\n", @@ -423,9 +485,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 scissors , 1 stone , 2 cloth , please input:1\n", + "human: 1 stone\n", + "computer: 0 scissors\n", + "human win\n" + ] + } + ], "source": [ "# 优化的剪刀石头布程序\n", "\n", @@ -465,9 +538,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "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: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 2 : 0\n", + "\n", + "0 scissors , 1 stone , 2 cloth , please input:1\n", + "2 cloth\n", + "computer win\n", + "human:computer 2 : 1\n", + "\n", + "0 scissors , 1 stone , 2 cloth , please input:1\n", + "1 stone\n", + "draw\n", + "human:computer 2 : 1\n", + "\n", + "0 scissors , 1 stone , 2 cloth , please input:1\n", + "0 scissors\n", + "human win\n", + "human:computer 3 : 1\n", + "\n", + "final human win\n" + ] + } + ], "source": [ "# 五局三胜的剪刀石头布程序\n", "\n", @@ -527,43 +638,9 @@ "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 \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 79% 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" index 96bcb7e..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 \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" @@ -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" ] }, @@ -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": 1, "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-29 13:06:54.013485\n", + "2020-05-29\n", + "1590728814.0138612\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.012572288513183594\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)" @@ -372,21 +382,22 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 思考 \n", + "## 思考一下\n", "\n", "* 计算倒计时,现在距离2021元旦距离现在还有多少天" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "250\n" + "5852 days, 10:41:57.714259\n", + "5852\n" ] } ], @@ -394,20 +405,21 @@ "from datetime import datetime\n", "\n", "#日期格式转换\n", - "newyear = datetime.strptime('2021-01-01', '%Y-%m-%d')\n", + "newyear = datetime.strptime('2036-06-07', '%Y-%m-%d')\n", "#获取现在的时间\n", "now = datetime.now()\n", "#时间差\n", "timedelta = newyear-now\n", + "print(timedelta)\n", "print(timedelta.days)" ] }, { - "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 \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 81% 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" index 91ddde7..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 \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" @@ -8,14 +8,14 @@ "\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", "* 函数不同参数形式\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", @@ -285,7 +286,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -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" } @@ -408,119 +421,22 @@ ] }, { - "cell_type": "code", - "execution_count": 9, - "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": 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, + "cell_type": "markdown", "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" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 思考\n", + "## 思考一下\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 \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 77% 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" index 73f41b8..37d9678 100644 --- "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" @@ -19,7 +19,7 @@ " * defaultdict: 带有默认值的字典\n", " * OrderedDict: 有序字典\n", " * Counter: 计数器\n", - "* 异常错误处理简介\n" + "* 思考一下:回文数\n" ] }, { @@ -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": 6, + "execution_count": 3, "metadata": { "scrolled": true }, @@ -274,8 +276,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.029897212982177734\n", - "0.00005698\n" + "0.03583407402038574\n", + "0.0000638961791992\n" ] } ], @@ -290,8 +292,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 +301,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 +387,8 @@ } ], "source": [ + "# 删除左边的元素\n", + "\n", "l = deque(['a','b','c'])\n", "l.popleft()\n", "print(l)" @@ -398,9 +400,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的默认值。" ] }, { @@ -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" ] } ], @@ -866,7 +868,9 @@ { "cell_type": "code", "execution_count": 38, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -892,49 +896,11 @@ }, { "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)" + "## 思考一下\n", + "\n", + "1. 回文数:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数,比如 121 就是一个回文数,201 就不是。" ] }, { @@ -943,188 +909,49 @@ "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" - ] + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# try...except...finally\n", + "# 回文数\n", + "# 参考 leetcode 用了类来表示\n", "\n", - "a = int(input('a:'))\n", + "class Solution:\n", + " def isPalindrome(self, x: int) -> bool:\n", + " x = str(x)\n", + " return x == x[::-1]\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...')" + "Solution().isPalindrome(x='121')" ] }, { - "cell_type": "code", - "execution_count": 69, + "cell_type": "markdown", "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...')" + "类似 -> bool 这样的标示是类型标注,从 python 3.5 开始引入这个功能,表明改函数返回的类型是什么。写了可以提高代码的可读性。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 思考\n", + "在 leetcode 上有这道题目 https://leetcode-cn.com/problems/palindrome-number/\n", "\n", - "对于防止错误比较有效的一个方式,就是打印日志,平时俗称的log。我们在学习 python 的过程中,经常会用 print 打印出一些变量的值什么的,其实也是日志的一种方式。打印日志一方面是记录正常的操作,另一方面很大的作用就是用在出错的时候检查。日志大部分时候是一种文本文件,便于存储、查询和归档。python 中也有比较完善的日志处理模块。" + "如上的方式是最简单的,能够通过,但是我们看一下反馈结果:\n", + "\n", + "执行用时 : 84 ms, 在所有 Python3 提交中击败了 66.08% 的用户\n", + "内存消耗 : 13.5 MB, 在所有 Python3 提交中击败了 5.88% 的用户\n", + "\n", + "执行速度还不错,但是内存消耗有点大。\n", + "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "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 \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 78% 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" index 489333b..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 \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" @@ -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", - "* 思考一下" + "* 思考一下:整理文件的应用需要哪些功能" ] }, { @@ -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)" ] }, @@ -217,7 +234,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -238,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))" ] }, { @@ -289,8 +306,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 \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" "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" new file mode 100644 index 0000000..4851788 --- /dev/null +++ "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" @@ -0,0 +1,528 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Lesson 13\n", + "\n", + "* v1.0.0 2016.11 by David.Yi\n", + "* v1.1 2020.5 edit by David Yi\n", + "\n", + "\n", + "## 本次内容要点\n", + "* for break continue else:完整的 for 语句结构 \n", + "* pprint 高级打印模块使用\n", + "* 思考一下:\n", + " * 简单的四则运算器实现\n", + " * 更加通用的四则运算器实现" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 完整的 for 语句结构\n", + "\n", + "* for continue\n", + "* for break\n", + "* for else\n", + "\n", + "\n", + "* continue 语句跳出本次循环,而 break 跳出整个循环;\n", + "* continue 语句用来告诉 Python 跳过当前循环的剩余语句,然后继续进行下一轮循环;\n", + "* continue 语句可以用在 while 和 for 循环中;\n", + "\n", + "break 语句用来终止循环语句。\n", + "\n", + "else 语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "letter: P\n", + "letter: y\n", + "letter: t\n", + "letter: o\n", + "letter: n\n" + ] + } + ], + "source": [ + "# for continue 举例\n", + "\n", + "for l in 'Python':\n", + " if l == 'h':\n", + " continue\n", + " print('letter:', l)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# for continue 举例\n", + "# 去除输入的内容中的元音字母\n", + "\n", + "list1 = input('Input:')\n", + "\n", + "list2 = []\n", + "\n", + "for s in list1:\n", + " if s in ['a','e','i','o','u']:\n", + " continue\n", + " list2.append(s)\n", + "\n", + "# 将列表转换为字符串\n", + "s2 = ''.join(list2)\n", + "print('Output:', s2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# for break else 举例\n", + "# 判断质数\n", + "\n", + "import time\n", + "\n", + "a = time.time()\n", + "\n", + "for num in range(3,20):\n", + " for i in range(2,num): \n", + " if num%i == 0: \n", + " j=num/i \n", + " print(num,i,'*',j)\n", + " break \n", + " else: \n", + " print(num, '是质数')\n", + " \n", + "b = time.time()\n", + "print(b-a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## pprint() 介绍\n", + "\n", + "pprint module提供了可以按照某个格式正确的显示 Python 已知类型数据的一种方法,这种格式很易读。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "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)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "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", + "pprint.pprint(sys.path)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "scrolled": true + }, + "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", + "import sys\n", + "sys.path" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "# 实际上对 list 类型比较优雅的处理\n", + "\n", + "import sys\n", + "print(type(sys.path))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## 思考一下\n", + "\n", + "简单的四则运算器,想一下怎么实现。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "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: 5\n", + "Please enter the second number: 2\n", + "5.0 - 2.0 = 3.0 \n" + ] + } + ], + "source": [ + "# 简单四则计算器代码,下面代码参考 https://www.jianshu.com/p/c22bfd91df49\n", + "\n", + "def calculate():\n", + " operation = input('''\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", + " number_1 = float(input('Please enter the first number: '))\n", + " number_2 = float(input('Please enter the second number: '))\n", + " if operation == '+': \n", + " print('{} + {} = {} '.format(number_1, number_2,number_1 + number_2)) \n", + " \n", + " elif operation == '-':\n", + " print('{} - {} = {} '.format(number_1,number_2,number_1 - number_2))\n", + " elif operation == '*': \n", + " print('{} * {} = {} '.format(number_1, number_2,number_1 * number_2))\n", + " elif operation == '/' and number_2 != 0: \n", + " print('{} / {} = {} '.format(number_1, number_2,number_1 / number_2))\n", + " else:\n", + " print('You have not typed a valid operator, please run the program again.')\n", + "\n", + "\n", + "calculate()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "如果你对使用 python 来构造一种语言,比如适用一些场景的 DSL 感兴趣,如果你觉得 lex 和 yacc 这些编译原理中的概念感兴趣的话,可以参考python ply包作者的网站:https://www.dabeaz.com/software.html\n", + "\n", + "Python 下有很多优秀的包,都可以来实现语言定义和解析,但是 ply 是其中最经典的包,从2001年诞生至今,一致在维护更新,并且不断发展。\n", + "\n", + "下面这个是 ply 自己带的例子,用来实现一个比较完整的计算器。因为是通过语法分析的方式实现,会比较费解,但是功能强大,并且容易扩充。" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "scrolled": true + }, + "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", + "#\n", + "# A simple calculator with variables -- all in one file.\n", + "# -----------------------------------------------------------------------------\n", + "\n", + "tokens = (\n", + " 'NAME', 'NUMBER',\n", + " 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'EQUALS',\n", + " 'LPAREN', 'RPAREN',\n", + ")\n", + "\n", + "# Tokens\n", + "\n", + "t_PLUS = r'\\+'\n", + "t_MINUS = r'-'\n", + "t_TIMES = r'\\*'\n", + "t_DIVIDE = r'/'\n", + "t_EQUALS = r'='\n", + "t_LPAREN = r'\\('\n", + "t_RPAREN = r'\\)'\n", + "t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'\n", + "\n", + "\n", + "def t_NUMBER(t):\n", + " r'\\d+'\n", + " try:\n", + " t.value = int(t.value)\n", + " except ValueError:\n", + " print(\"Integer value too large %d\", t.value)\n", + " t.value = 0\n", + " return t\n", + "\n", + "\n", + "# Ignored characters\n", + "t_ignore = \" \\t\"\n", + "\n", + "\n", + "def t_newline(t):\n", + " r'\\n+'\n", + " t.lexer.lineno += t.value.count(\"\\n\")\n", + "\n", + "\n", + "def t_error(t):\n", + " print(\"Illegal character '%s'\" % t.value[0])\n", + " t.lexer.skip(1)\n", + "\n", + "\n", + "# Build the lexer\n", + "import ply.lex as lex\n", + "\n", + "lexer = lex.lex()\n", + "\n", + "# Parsing rules\n", + "\n", + "precedence = (\n", + " ('left', 'PLUS', 'MINUS'),\n", + " ('left', 'TIMES', 'DIVIDE'),\n", + " ('right', 'UMINUS'),\n", + ")\n", + "\n", + "# dictionary of names\n", + "names = {}\n", + "\n", + "\n", + "def p_statement_assign(t):\n", + " 'statement : NAME EQUALS expression'\n", + " names[t[1]] = t[3]\n", + "\n", + "\n", + "def p_statement_expr(t):\n", + " 'statement : expression'\n", + " print(t[1])\n", + "\n", + "\n", + "def p_expression_binop(t):\n", + " '''expression : expression PLUS expression\n", + " | expression MINUS expression\n", + " | expression TIMES expression\n", + " | expression DIVIDE expression'''\n", + " if t[2] == '+':\n", + " t[0] = t[1] + t[3]\n", + " elif t[2] == '-':\n", + " t[0] = t[1] - t[3]\n", + " elif t[2] == '*':\n", + " t[0] = t[1] * t[3]\n", + " elif t[2] == '/':\n", + " t[0] = t[1] / t[3]\n", + "\n", + "\n", + "def p_expression_uminus(t):\n", + " 'expression : MINUS expression %prec UMINUS'\n", + " t[0] = -t[2]\n", + "\n", + "\n", + "def p_expression_group(t):\n", + " 'expression : LPAREN expression RPAREN'\n", + " t[0] = t[2]\n", + "\n", + "\n", + "def p_expression_number(t):\n", + " 'expression : NUMBER'\n", + " t[0] = t[1]\n", + "\n", + "\n", + "def p_expression_name(t):\n", + " 'expression : NAME'\n", + " try:\n", + " t[0] = names[t[1]]\n", + " except LookupError:\n", + " print(\"Undefined name '%s'\" % t[1])\n", + " t[0] = 0\n", + "\n", + "\n", + "def p_error(t):\n", + " print(\"Syntax error at '%s'\" % t.value)\n", + "\n", + "\n", + "import ply.yacc as yacc\n", + "\n", + "parser = yacc.yacc()\n", + "\n", + "while True:\n", + " try:\n", + " s = input('calc > ') # Use raw_input on Python 2\n", + " except EOFError:\n", + " break\n", + " parser.parse(s)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 不能直接在 notebook 中执行上面代码,%run 命令执行 python 脚本\n", + "# 执行上面的计算器代码,支持加减乘除和括号,支持变量,并且具备非常好的扩展性\n", + "\n", + "%run \"calc.py\"\n", + "\n", + "# 1+1*2\n", + "# (1+1)*2\n", + "# (((2+3)*41)-8)+78" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "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" + ] + } + ], + "source": [ + "%run \"files/calc.py\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} 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 \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 98% 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 \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" index 7e8a656..678c367 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 \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" @@ -4,16 +4,17 @@ "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", + "* v1.1 2020.5 2020.6 edit by David Yi\n", "\n", "\n", "## 本次内容要点\n", + "* requests 包介绍\n", "* 访问网页\n", "* 调用接口\n", - "* 思考一下" + "* 思考一下:写个同步数据的软件需要注意哪些方面" ] }, { @@ -122,19 +123,19 @@ "\n", "我们来做一个读取新冠疫情数据的demo。\n", "\n", - "平时我们说的接口,可以简单的理解为满足一定的认证方式后,通过输入参数的值,获得需要的内容。认证方式、入参、出参这些都是事先约定的。包括接口文档、参数列表、自动联调等这些,在目前 python 的接口开发中都是可以自动生成的。python 本身开发接口非常容易,我们另外专门讲述。相对来说,读取调用接口更为常见。" + "平时我们说的接口,可以简单的理解为满足一定的认证方式后,通过输入参数的值,获得需要的内容。认证方式、入参、出参这些都是事先约定的。包括接口文档、参数列表、自动联调等这些,在目前 python 的接口开发中使用一些新技术都是可以自动生成的。python 本身开发接口非常容易,有机会另外专门讲述。相对来说,读取和调用接口的操作更为常见。" ] }, { "cell_type": "code", - "execution_count": 4, + "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" ] } @@ -162,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", @@ -196,7 +197,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -246,7 +247,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -296,8 +297,10 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, + "execution_count": 4, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -322,10 +325,8 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "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 \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 97% 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" index 6802ac9..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 \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" @@ -7,20 +7,17 @@ "# 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 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "---\n", - "\n", "### PIL (Pillow) 模块介绍\n", "\n", "PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。\n", @@ -36,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -59,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -69,7 +66,7 @@ "" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -312,19 +309,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" ] @@ -343,7 +340,7 @@ } ], "source": [ - "# 读取照片\n", + "# 读取照片基本信息\n", "\n", "# 导入 PIL 的 Image 模块\n", "from PIL import Image\n", @@ -380,7 +377,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -392,7 +389,7 @@ } ], "source": [ - "# 读取照片\n", + "# 读取照片信息\n", "\n", "# 导入 PIL 的 Image 模块\n", "from PIL import Image\n", @@ -405,7 +402,45 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'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": [ + "# 读取照片的 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", + "def get_labeled_exif(exif):\n", + " labeled = {}\n", + " for (key, val) in exif.items():\n", + " labeled[TAGS.get(key)] = val\n", + "\n", + " return labeled\n", + "\n", + "exif = get_exif('files/img_3845.jpg')\n", + "labeled = get_labeled_exif(exif)\n", + "print(labeled)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -457,7 +492,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -576,19 +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 这样的格式" - ] - }, { "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 \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 67% 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" index 81f7405..bd40866 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 \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" @@ -8,15 +8,14 @@ "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", "\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,22 +52,24 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "---\n", + "## 闭包\n", "\n", "在这个例子中,我们在函数 lazy_sum 中又定义了函数 sum,并且,内部函数 sum 可以引用外部函数 lazy_sum 的参数和局部变量,当 lazy_sum 返回函数 sum 时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”。\n", "\n", "一个函数可以返回一个计算结果,也可以返回一个函数。\n", "\n", - "返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。" + "返回一个函数时,该函数并未执行,返回函数中不要引用任何可能会变化的变量。\n", + "\n", + "闭包和函数的作用域等有关,掌握和理解闭包,对于后续 Python 的深入开发有很大好处,特别是装饰器。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "##### 偏函数\n", + "## 偏函数\n", "\n", - "Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。\n", + "python 的 functools 模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。\n", "\n", "在介绍函数参数的时候,我们讲到,通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点。" ] @@ -98,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": [ { @@ -126,7 +131,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -142,6 +147,7 @@ ], "source": [ "# 偏函数举例\n", + "# 原来的一个函数\n", "\n", "def func(x=2,y=3,z=4):\n", " return x+y+z\n", @@ -154,119 +160,59 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "7\n", - "7\n" + "8\n" ] }, { "ename": "TypeError", - "evalue": "func() got multiple values for argument 'z'", + "evalue": "func() got multiple values for argument 'x'", "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[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mf1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunctools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpartial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mz\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 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\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[0;32m----> 7\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;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\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;31m# 会报错,不需要再输入 z 的值\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: func() got multiple values for argument 'x'" ] } ], "source": [ - "import functools\n", + "# 构造偏函数,设置默认值\n", "\n", - "f1 = functools.partial(func, z=2)\n", - "print(f1(2,3))\n", - "print(f1(2))\n", - "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", + "import functools\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" + "f1 = functools.partial(func, x=2,z=3)\n", + "print(f1(y=3))\n", + "print(f1(y=2))\n", + "print(f1(2)) # 会报错,不需要再输入 z 的值" ] }, { "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", - "举例说明,比如我们有一个函数 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", - "> 如果你读过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 的理念是高效并行运算的核心。" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -299,7 +245,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -319,7 +265,7 @@ } ], "source": [ - "# 这个 f(x) 函数可以更加复杂\n", + "# 这个 f(x) 函数可以比较复杂,包含更多逻辑\n", "\n", "def f(x):\n", " y = x * x + 3\n", @@ -333,7 +279,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -352,30 +298,86 @@ } ], "source": [ - "# 进行 map 处理的数据也可以很复杂\n", + "# 进行 map 处理的数据也可以复杂一些\n", "\n", "def f(x):\n", " 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", + "# 主要的程序还是很简洁就可以了\n", + "r = map(f, list1)\n", "\n", "for i in r:\n", " print(i)" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 1, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[12, 7, 6, 17]\n" + ] + } + ], "source": [ - "---\n", + "# map 函数也可以同时作用在两组数据上\n", "\n", - "##### reduce() 函数\n", + "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": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 0]\n", + "[1, 2]\n", + "[4, 4]\n", + "[9, 6]\n", + "[16, 8]\n" + ] + } + ], + "source": [ + "# map 函数更加复杂的用法\n", + "\n", + "def multiply(x):\n", + " return (x*x)\n", + "\n", + "def add(x):\n", + " return (x+x)\n", + "\n", + "func = [multiply, add]\n", + "\n", + "for i in range(5):\n", + " value = list(map(lambda x: x(i), func))\n", + " print(value)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## reduce() 函数\n", "\n", "再看 reduce 的用法。reduce 把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce 把结果继续和序列的下一个元素做累积计算,其效果就是:\n", "\n", @@ -407,14 +409,15 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "13579\n" + "13579\n", + "\n" ] } ], @@ -426,16 +429,20 @@ "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", - "print(reduce(f, map(char2int, '13579')))" + "def str2int(s):\n", + " return reduce(f, map(char2int, s))\n", + "\n", + "print(str2int('13579'))\n", + "print(type(str2int('13579')))" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -451,65 +458,31 @@ } ], "source": [ - "# 先 map\n", + "# 拆解上面的函数,先 map\n", "\n", - "l = map(char2num, '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": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "13579" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 再 reduce\n", - "\n", - "l = map(char2num, '13579')\n", - "print(reduce(fn,l))" - ] - }, - { - "cell_type": "code", - "execution_count": 1, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "12345\n" + "13579\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", + "# 拆解上面的函数,再 reduce\n", "\n", - "def str2int(s):\n", - " return reduce(f, map(char2int, s))\n", - "\n", - "print(str2int('12345'))" + "list1 = map(char2int, '13579')\n", + "print(reduce(f,list1))" ] }, { @@ -518,9 +491,7 @@ "collapsed": true }, "source": [ - "---\n", - "\n", - "##### filter() 函数\n", + "## filter() 函数\n", "\n", "Python内建的filter()函数用于过滤序列。\n", "\n", @@ -531,7 +502,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -553,7 +526,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -567,7 +540,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", @@ -603,27 +576,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 函数式编程的基本功能点:\n", - "\n", - "函数作为返回值\n", - "偏函数\n", - "高阶函数 map/reduce, filter, sorted\n", - "匿名函数 lambda" + "函数式编程,相对传统方式比较难理解,但是这样的确比较 pythonic,对于程序项目来说比较容易维护。" ] }, { @@ -634,13 +591,6 @@ }, "outputs": [], "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git "a/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" "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" new file mode 100644 index 0000000..a0c8bcd --- /dev/null +++ "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" @@ -0,0 +1,302 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# Lesson 17\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" + ] + }, + { + "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[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", + "a = int(input('a:'))\n", + "r = 10 / a\n", + "print('result:', r)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a:a\n", + "except: invalid literal for int() with base 10: 'a'\n" + ] + } + ], + "source": [ + "# 防止输入字母会报错\n", + "\n", + "try:\n", + " a = int(input('a:'))\n", + " r = 10 / a\n", + " print('result:', r)\n", + "except ValueError as e:\n", + " print('except:',e)" + ] + }, + { + "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": 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", + "python 自带很完整的日志操作函数包,不过用起来还是有点复杂。一般情况下的日志使用,我们推荐使用 fishbase 函数包中的日志模块,对于日志文件名、文件名日期自动变更都做了一定封装,方便调用。\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "log ok\n" + ] + } + ], + "source": [ + "from fishbase.fish_logger import *\n", + "from fishbase.fish_file import *\n", + "\n", + "log_abs_filename = get_abs_filename_with_sub_path('files', 'fish_test.log')[1]\n", + "\n", + "set_log_file(log_abs_filename)\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" + ] + }, + { + "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": 4 +} 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 \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 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 \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" index 2ba78f5..84f5eef 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 \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" @@ -1,11 +1,23 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Lesson 18\n", + "\n", + "* v1.1, 2020.5,6 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" ] } 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/\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 \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/\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 \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/\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 \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/\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 \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/\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 \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/\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 \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 0000000..4138905 Binary files /dev/null and "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/IMG_3845.JPG" differ diff --git a/python_study_basic_notebook/files/baidu_logo.gif "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/baidu_logo.gif" similarity index 100% rename from python_study_basic_notebook/files/baidu_logo.gif rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/baidu_logo.gif" diff --git a/python_study_basic_notebook/files/ply/calc.py "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/calc.py" similarity index 100% rename from python_study_basic_notebook/files/ply/calc.py rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/calc.py" diff --git a/python_study_basic_notebook/files/list_dump.txt "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/list_dump.txt" similarity index 100% rename from python_study_basic_notebook/files/list_dump.txt rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/list_dump.txt" diff --git a/python_study_basic_notebook/files/ply/parser.out "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/parser.out" similarity index 100% rename from python_study_basic_notebook/files/ply/parser.out rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/parser.out" diff --git a/python_study_basic_notebook/files/ply/parsetab.py "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/parsetab.py" similarity index 100% rename from python_study_basic_notebook/files/ply/parsetab.py rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/parsetab.py" diff --git "a/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/calc.py" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/calc.py" new file mode 100644 index 0000000..5b30cfa --- /dev/null +++ "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/calc.py" @@ -0,0 +1,128 @@ +# ----------------------------------------------------------------------------- +# calc.py +# +# A simple calculator with variables -- all in one file. +# ----------------------------------------------------------------------------- + +tokens = ( + 'NAME', 'NUMBER', + 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'EQUALS', + 'LPAREN', 'RPAREN', +) + +# Tokens + +t_PLUS = r'\+' +t_MINUS = r'-' +t_TIMES = r'\*' +t_DIVIDE = r'/' +t_EQUALS = r'=' +t_LPAREN = r'\(' +t_RPAREN = r'\)' +t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' + + +def t_NUMBER(t): + r'\d+' + try: + t.value = int(t.value) + except ValueError: + print("Integer value too large %d", t.value) + t.value = 0 + return t + + +# Ignored characters +t_ignore = " \t" + + +def t_newline(t): + r'\n+' + t.lexer.lineno += t.value.count("\n") + + +def t_error(t): + print("Illegal character '%s'" % t.value[0]) + t.lexer.skip(1) + + +# Build the lexer +import ply.lex as lex + +lexer = lex.lex() + +# Parsing rules + +precedence = ( + ('left', 'PLUS', 'MINUS'), + ('left', 'TIMES', 'DIVIDE'), + ('right', 'UMINUS'), +) + +# dictionary of names +names = {} + + +def p_statement_assign(t): + 'statement : NAME EQUALS expression' + names[t[1]] = t[3] + + +def p_statement_expr(t): + 'statement : expression' + print(t[1]) + + +def p_expression_binop(t): + '''expression : expression PLUS expression + | expression MINUS expression + | expression TIMES expression + | expression DIVIDE expression''' + if t[2] == '+': + t[0] = t[1] + t[3] + elif t[2] == '-': + t[0] = t[1] - t[3] + elif t[2] == '*': + t[0] = t[1] * t[3] + elif t[2] == '/': + t[0] = t[1] / t[3] + + +def p_expression_uminus(t): + 'expression : MINUS expression %prec UMINUS' + t[0] = -t[2] + + +def p_expression_group(t): + 'expression : LPAREN expression RPAREN' + t[0] = t[2] + + +def p_expression_number(t): + 'expression : NUMBER' + t[0] = t[1] + + +def p_expression_name(t): + 'expression : NAME' + try: + t[0] = names[t[1]] + except LookupError: + print("Undefined name '%s'" % t[1]) + t[0] = 0 + + +def p_error(t): + print("Syntax error at '%s'" % t.value) + + +import ply.yacc as yacc + +parser = yacc.yacc() + +while True: + try: + s = input('calc > ') # Use raw_input on Python 2 + except EOFError: + break + parser.parse(s) \ No newline at end of file diff --git "a/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/parser.out" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/parser.out" new file mode 100644 index 0000000..eb8c40a --- /dev/null +++ "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/parser.out" @@ -0,0 +1,395 @@ +Created by PLY version 3.11 (http://www.dabeaz.com/ply) + +Grammar + +Rule 0 S' -> statement +Rule 1 statement -> NAME EQUALS expression +Rule 2 statement -> expression +Rule 3 expression -> expression PLUS expression +Rule 4 expression -> expression MINUS expression +Rule 5 expression -> expression TIMES expression +Rule 6 expression -> expression DIVIDE expression +Rule 7 expression -> MINUS expression +Rule 8 expression -> LPAREN expression RPAREN +Rule 9 expression -> NUMBER +Rule 10 expression -> NAME + +Terminals, with rules where they appear + +DIVIDE : 6 +EQUALS : 1 +LPAREN : 8 +MINUS : 4 7 +NAME : 1 10 +NUMBER : 9 +PLUS : 3 +RPAREN : 8 +TIMES : 5 +error : + +Nonterminals, with rules where they appear + +expression : 1 2 3 3 4 4 5 5 6 6 7 8 +statement : 0 + +Parsing method: LALR + +state 0 + + (0) S' -> . statement + (1) statement -> . NAME EQUALS expression + (2) statement -> . expression + (3) expression -> . expression PLUS expression + (4) expression -> . expression MINUS expression + (5) expression -> . expression TIMES expression + (6) expression -> . expression DIVIDE expression + (7) expression -> . MINUS expression + (8) expression -> . LPAREN expression RPAREN + (9) expression -> . NUMBER + (10) expression -> . NAME + + NAME shift and go to state 2 + MINUS shift and go to state 4 + LPAREN shift and go to state 5 + NUMBER shift and go to state 6 + + statement shift and go to state 1 + expression shift and go to state 3 + +state 1 + + (0) S' -> statement . + + + +state 2 + + (1) statement -> NAME . EQUALS expression + (10) expression -> NAME . + + EQUALS shift and go to state 7 + PLUS reduce using rule 10 (expression -> NAME .) + MINUS reduce using rule 10 (expression -> NAME .) + TIMES reduce using rule 10 (expression -> NAME .) + DIVIDE reduce using rule 10 (expression -> NAME .) + $end reduce using rule 10 (expression -> NAME .) + + +state 3 + + (2) statement -> expression . + (3) expression -> expression . PLUS expression + (4) expression -> expression . MINUS expression + (5) expression -> expression . TIMES expression + (6) expression -> expression . DIVIDE expression + + $end reduce using rule 2 (statement -> expression .) + PLUS shift and go to state 8 + MINUS shift and go to state 9 + TIMES shift and go to state 10 + DIVIDE shift and go to state 11 + + +state 4 + + (7) expression -> MINUS . expression + (3) expression -> . expression PLUS expression + (4) expression -> . expression MINUS expression + (5) expression -> . expression TIMES expression + (6) expression -> . expression DIVIDE expression + (7) expression -> . MINUS expression + (8) expression -> . LPAREN expression RPAREN + (9) expression -> . NUMBER + (10) expression -> . NAME + + MINUS shift and go to state 4 + LPAREN shift and go to state 5 + NUMBER shift and go to state 6 + NAME shift and go to state 13 + + expression shift and go to state 12 + +state 5 + + (8) expression -> LPAREN . expression RPAREN + (3) expression -> . expression PLUS expression + (4) expression -> . expression MINUS expression + (5) expression -> . expression TIMES expression + (6) expression -> . expression DIVIDE expression + (7) expression -> . MINUS expression + (8) expression -> . LPAREN expression RPAREN + (9) expression -> . NUMBER + (10) expression -> . NAME + + MINUS shift and go to state 4 + LPAREN shift and go to state 5 + NUMBER shift and go to state 6 + NAME shift and go to state 13 + + expression shift and go to state 14 + +state 6 + + (9) expression -> NUMBER . + + PLUS reduce using rule 9 (expression -> NUMBER .) + MINUS reduce using rule 9 (expression -> NUMBER .) + TIMES reduce using rule 9 (expression -> NUMBER .) + DIVIDE reduce using rule 9 (expression -> NUMBER .) + $end reduce using rule 9 (expression -> NUMBER .) + RPAREN reduce using rule 9 (expression -> NUMBER .) + + +state 7 + + (1) statement -> NAME EQUALS . expression + (3) expression -> . expression PLUS expression + (4) expression -> . expression MINUS expression + (5) expression -> . expression TIMES expression + (6) expression -> . expression DIVIDE expression + (7) expression -> . MINUS expression + (8) expression -> . LPAREN expression RPAREN + (9) expression -> . NUMBER + (10) expression -> . NAME + + MINUS shift and go to state 4 + LPAREN shift and go to state 5 + NUMBER shift and go to state 6 + NAME shift and go to state 13 + + expression shift and go to state 15 + +state 8 + + (3) expression -> expression PLUS . expression + (3) expression -> . expression PLUS expression + (4) expression -> . expression MINUS expression + (5) expression -> . expression TIMES expression + (6) expression -> . expression DIVIDE expression + (7) expression -> . MINUS expression + (8) expression -> . LPAREN expression RPAREN + (9) expression -> . NUMBER + (10) expression -> . NAME + + MINUS shift and go to state 4 + LPAREN shift and go to state 5 + NUMBER shift and go to state 6 + NAME shift and go to state 13 + + expression shift and go to state 16 + +state 9 + + (4) expression -> expression MINUS . expression + (3) expression -> . expression PLUS expression + (4) expression -> . expression MINUS expression + (5) expression -> . expression TIMES expression + (6) expression -> . expression DIVIDE expression + (7) expression -> . MINUS expression + (8) expression -> . LPAREN expression RPAREN + (9) expression -> . NUMBER + (10) expression -> . NAME + + MINUS shift and go to state 4 + LPAREN shift and go to state 5 + NUMBER shift and go to state 6 + NAME shift and go to state 13 + + expression shift and go to state 17 + +state 10 + + (5) expression -> expression TIMES . expression + (3) expression -> . expression PLUS expression + (4) expression -> . expression MINUS expression + (5) expression -> . expression TIMES expression + (6) expression -> . expression DIVIDE expression + (7) expression -> . MINUS expression + (8) expression -> . LPAREN expression RPAREN + (9) expression -> . NUMBER + (10) expression -> . NAME + + MINUS shift and go to state 4 + LPAREN shift and go to state 5 + NUMBER shift and go to state 6 + NAME shift and go to state 13 + + expression shift and go to state 18 + +state 11 + + (6) expression -> expression DIVIDE . expression + (3) expression -> . expression PLUS expression + (4) expression -> . expression MINUS expression + (5) expression -> . expression TIMES expression + (6) expression -> . expression DIVIDE expression + (7) expression -> . MINUS expression + (8) expression -> . LPAREN expression RPAREN + (9) expression -> . NUMBER + (10) expression -> . NAME + + MINUS shift and go to state 4 + LPAREN shift and go to state 5 + NUMBER shift and go to state 6 + NAME shift and go to state 13 + + expression shift and go to state 19 + +state 12 + + (7) expression -> MINUS expression . + (3) expression -> expression . PLUS expression + (4) expression -> expression . MINUS expression + (5) expression -> expression . TIMES expression + (6) expression -> expression . DIVIDE expression + + PLUS reduce using rule 7 (expression -> MINUS expression .) + MINUS reduce using rule 7 (expression -> MINUS expression .) + TIMES reduce using rule 7 (expression -> MINUS expression .) + DIVIDE reduce using rule 7 (expression -> MINUS expression .) + $end reduce using rule 7 (expression -> MINUS expression .) + RPAREN reduce using rule 7 (expression -> MINUS expression .) + + ! PLUS [ shift and go to state 8 ] + ! MINUS [ shift and go to state 9 ] + ! TIMES [ shift and go to state 10 ] + ! DIVIDE [ shift and go to state 11 ] + + +state 13 + + (10) expression -> NAME . + + PLUS reduce using rule 10 (expression -> NAME .) + MINUS reduce using rule 10 (expression -> NAME .) + TIMES reduce using rule 10 (expression -> NAME .) + DIVIDE reduce using rule 10 (expression -> NAME .) + $end reduce using rule 10 (expression -> NAME .) + RPAREN reduce using rule 10 (expression -> NAME .) + + +state 14 + + (8) expression -> LPAREN expression . RPAREN + (3) expression -> expression . PLUS expression + (4) expression -> expression . MINUS expression + (5) expression -> expression . TIMES expression + (6) expression -> expression . DIVIDE expression + + RPAREN shift and go to state 20 + PLUS shift and go to state 8 + MINUS shift and go to state 9 + TIMES shift and go to state 10 + DIVIDE shift and go to state 11 + + +state 15 + + (1) statement -> NAME EQUALS expression . + (3) expression -> expression . PLUS expression + (4) expression -> expression . MINUS expression + (5) expression -> expression . TIMES expression + (6) expression -> expression . DIVIDE expression + + $end reduce using rule 1 (statement -> NAME EQUALS expression .) + PLUS shift and go to state 8 + MINUS shift and go to state 9 + TIMES shift and go to state 10 + DIVIDE shift and go to state 11 + + +state 16 + + (3) expression -> expression PLUS expression . + (3) expression -> expression . PLUS expression + (4) expression -> expression . MINUS expression + (5) expression -> expression . TIMES expression + (6) expression -> expression . DIVIDE expression + + PLUS reduce using rule 3 (expression -> expression PLUS expression .) + MINUS reduce using rule 3 (expression -> expression PLUS expression .) + $end reduce using rule 3 (expression -> expression PLUS expression .) + RPAREN reduce using rule 3 (expression -> expression PLUS expression .) + TIMES shift and go to state 10 + DIVIDE shift and go to state 11 + + ! TIMES [ reduce using rule 3 (expression -> expression PLUS expression .) ] + ! DIVIDE [ reduce using rule 3 (expression -> expression PLUS expression .) ] + ! PLUS [ shift and go to state 8 ] + ! MINUS [ shift and go to state 9 ] + + +state 17 + + (4) expression -> expression MINUS expression . + (3) expression -> expression . PLUS expression + (4) expression -> expression . MINUS expression + (5) expression -> expression . TIMES expression + (6) expression -> expression . DIVIDE expression + + PLUS reduce using rule 4 (expression -> expression MINUS expression .) + MINUS reduce using rule 4 (expression -> expression MINUS expression .) + $end reduce using rule 4 (expression -> expression MINUS expression .) + RPAREN reduce using rule 4 (expression -> expression MINUS expression .) + TIMES shift and go to state 10 + DIVIDE shift and go to state 11 + + ! TIMES [ reduce using rule 4 (expression -> expression MINUS expression .) ] + ! DIVIDE [ reduce using rule 4 (expression -> expression MINUS expression .) ] + ! PLUS [ shift and go to state 8 ] + ! MINUS [ shift and go to state 9 ] + + +state 18 + + (5) expression -> expression TIMES expression . + (3) expression -> expression . PLUS expression + (4) expression -> expression . MINUS expression + (5) expression -> expression . TIMES expression + (6) expression -> expression . DIVIDE expression + + PLUS reduce using rule 5 (expression -> expression TIMES expression .) + MINUS reduce using rule 5 (expression -> expression TIMES expression .) + TIMES reduce using rule 5 (expression -> expression TIMES expression .) + DIVIDE reduce using rule 5 (expression -> expression TIMES expression .) + $end reduce using rule 5 (expression -> expression TIMES expression .) + RPAREN reduce using rule 5 (expression -> expression TIMES expression .) + + ! PLUS [ shift and go to state 8 ] + ! MINUS [ shift and go to state 9 ] + ! TIMES [ shift and go to state 10 ] + ! DIVIDE [ shift and go to state 11 ] + + +state 19 + + (6) expression -> expression DIVIDE expression . + (3) expression -> expression . PLUS expression + (4) expression -> expression . MINUS expression + (5) expression -> expression . TIMES expression + (6) expression -> expression . DIVIDE expression + + PLUS reduce using rule 6 (expression -> expression DIVIDE expression .) + MINUS reduce using rule 6 (expression -> expression DIVIDE expression .) + TIMES reduce using rule 6 (expression -> expression DIVIDE expression .) + DIVIDE reduce using rule 6 (expression -> expression DIVIDE expression .) + $end reduce using rule 6 (expression -> expression DIVIDE expression .) + RPAREN reduce using rule 6 (expression -> expression DIVIDE expression .) + + ! PLUS [ shift and go to state 8 ] + ! MINUS [ shift and go to state 9 ] + ! TIMES [ shift and go to state 10 ] + ! DIVIDE [ shift and go to state 11 ] + + +state 20 + + (8) expression -> LPAREN expression RPAREN . + + PLUS reduce using rule 8 (expression -> LPAREN expression RPAREN .) + MINUS reduce using rule 8 (expression -> LPAREN expression RPAREN .) + TIMES reduce using rule 8 (expression -> LPAREN expression RPAREN .) + DIVIDE reduce using rule 8 (expression -> LPAREN expression RPAREN .) + $end reduce using rule 8 (expression -> LPAREN expression RPAREN .) + RPAREN reduce using rule 8 (expression -> LPAREN expression RPAREN .) + diff --git "a/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/parsetab.py" "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/parsetab.py" new file mode 100644 index 0000000..4bee864 --- /dev/null +++ "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/ply/parsetab.py" @@ -0,0 +1,40 @@ + +# parsetab.py +# This file is automatically generated. Do not edit. +# pylint: disable=W,C,R +_tabversion = '3.10' + +_lr_method = 'LALR' + +_lr_signature = 'leftPLUSMINUSleftTIMESDIVIDErightUMINUSDIVIDE EQUALS LPAREN MINUS NAME NUMBER PLUS RPAREN TIMESstatement : NAME EQUALS expressionstatement : expressionexpression : expression PLUS expression\n | expression MINUS expression\n | expression TIMES expression\n | expression DIVIDE expressionexpression : MINUS expression %prec UMINUSexpression : LPAREN expression RPARENexpression : NUMBERexpression : NAME' + +_lr_action_items = {'NAME':([0,4,5,7,8,9,10,11,],[2,13,13,13,13,13,13,13,]),'MINUS':([0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,],[4,-10,9,4,4,-9,4,4,4,4,4,-7,-10,9,9,-3,-4,-5,-6,-8,]),'LPAREN':([0,4,5,7,8,9,10,11,],[5,5,5,5,5,5,5,5,]),'NUMBER':([0,4,5,7,8,9,10,11,],[6,6,6,6,6,6,6,6,]),'$end':([1,2,3,6,12,13,15,16,17,18,19,20,],[0,-10,-2,-9,-7,-10,-1,-3,-4,-5,-6,-8,]),'EQUALS':([2,],[7,]),'PLUS':([2,3,6,12,13,14,15,16,17,18,19,20,],[-10,8,-9,-7,-10,8,8,-3,-4,-5,-6,-8,]),'TIMES':([2,3,6,12,13,14,15,16,17,18,19,20,],[-10,10,-9,-7,-10,10,10,10,10,-5,-6,-8,]),'DIVIDE':([2,3,6,12,13,14,15,16,17,18,19,20,],[-10,11,-9,-7,-10,11,11,11,11,-5,-6,-8,]),'RPAREN':([6,12,13,14,16,17,18,19,20,],[-9,-7,-10,20,-3,-4,-5,-6,-8,]),} + +_lr_action = {} +for _k, _v in _lr_action_items.items(): + for _x,_y in zip(_v[0],_v[1]): + if not _x in _lr_action: _lr_action[_x] = {} + _lr_action[_x][_k] = _y +del _lr_action_items + +_lr_goto_items = {'statement':([0,],[1,]),'expression':([0,4,5,7,8,9,10,11,],[3,12,14,15,16,17,18,19,]),} + +_lr_goto = {} +for _k, _v in _lr_goto_items.items(): + for _x, _y in zip(_v[0], _v[1]): + if not _x in _lr_goto: _lr_goto[_x] = {} + _lr_goto[_x][_k] = _y +del _lr_goto_items +_lr_productions = [ + ("S' -> statement","S'",1,None,None,None), + ('statement -> NAME EQUALS expression','statement',3,'p_statement_assign','calc.py',67), + ('statement -> expression','statement',1,'p_statement_expr','calc.py',72), + ('expression -> expression PLUS expression','expression',3,'p_expression_binop','calc.py',77), + ('expression -> expression MINUS expression','expression',3,'p_expression_binop','calc.py',78), + ('expression -> expression TIMES expression','expression',3,'p_expression_binop','calc.py',79), + ('expression -> expression DIVIDE expression','expression',3,'p_expression_binop','calc.py',80), + ('expression -> MINUS expression','expression',2,'p_expression_uminus','calc.py',92), + ('expression -> LPAREN expression RPAREN','expression',3,'p_expression_group','calc.py',97), + ('expression -> NUMBER','expression',1,'p_expression_number','calc.py',102), + ('expression -> NAME','expression',1,'p_expression_name','calc.py',107), +] diff --git a/python_study_basic_notebook/files/test.jpg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test.jpg" similarity index 100% rename from python_study_basic_notebook/files/test.jpg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test.jpg" diff --git a/python_study_basic_notebook/files/test.txt "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test.txt" similarity index 100% rename from python_study_basic_notebook/files/test.txt rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test.txt" diff --git a/python_study_basic_notebook/draft/python_basic_2/files/test.txt "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test2.txt" similarity index 65% rename from python_study_basic_notebook/draft/python_basic_2/files/test.txt rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test2.txt" index 24e5f82..2c87d95 100644 --- a/python_study_basic_notebook/draft/python_basic_2/files/test.txt +++ "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test2.txt" @@ -1,3 +1,3 @@ Hello, World! Hello, Shanghai! -Hello, Beijing! +Hello, CHINA! diff --git a/python_study_basic_notebook/files/test_blur.jpg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_blur.jpg" similarity index 100% rename from python_study_basic_notebook/files/test_blur.jpg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_blur.jpg" diff --git a/python_study_basic_notebook/files/test_crop.jpg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_crop.jpg" similarity index 100% rename from python_study_basic_notebook/files/test_crop.jpg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_crop.jpg" diff --git a/python_study_basic_notebook/files/test_drawline.jpg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_drawline.jpg" similarity index 100% rename from python_study_basic_notebook/files/test_drawline.jpg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_drawline.jpg" diff --git a/python_study_basic_notebook/files/test_edge.jpg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_edge.jpg" similarity index 100% rename from python_study_basic_notebook/files/test_edge.jpg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_edge.jpg" diff --git a/python_study_basic_notebook/files/test_enhance.jpg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_enhance.jpg" similarity index 100% rename from python_study_basic_notebook/files/test_enhance.jpg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_enhance.jpg" diff --git a/python_study_basic_notebook/files/test_rotate.jpg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_rotate.jpg" similarity index 100% rename from python_study_basic_notebook/files/test_rotate.jpg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_rotate.jpg" diff --git a/python_study_basic_notebook/files/test_thumbnail.jpg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_thumbnail.jpg" similarity index 100% rename from python_study_basic_notebook/files/test_thumbnail.jpg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/files/test_thumbnail.jpg" diff --git a/python_study_basic_notebook/imgs/anaconda.png "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/anaconda.png" similarity index 100% rename from python_study_basic_notebook/imgs/anaconda.png rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/anaconda.png" diff --git a/python_study_basic_notebook/imgs/guido-headshot-2019.jpg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/guido-headshot-2019.jpg" similarity index 100% rename from python_study_basic_notebook/imgs/guido-headshot-2019.jpg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/guido-headshot-2019.jpg" diff --git a/python_study_basic_notebook/imgs/jupyter.png "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/jupyter.png" similarity index 100% rename from python_study_basic_notebook/imgs/jupyter.png rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/jupyter.png" diff --git a/python_study_basic_notebook/imgs/pycharm.png "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/pycharm.png" similarity index 100% rename from python_study_basic_notebook/imgs/pycharm.png rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/pycharm.png" diff --git a/python_study_basic_notebook/imgs/pycharm_202001.png "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/pycharm_202001.png" similarity index 100% rename from python_study_basic_notebook/imgs/pycharm_202001.png rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/pycharm_202001.png" diff --git a/python_study_basic_notebook/imgs/python_install.jpeg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install.jpeg" similarity index 100% rename from python_study_basic_notebook/imgs/python_install.jpeg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install.jpeg" diff --git a/python_study_basic_notebook/imgs/python_install_1.jpeg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_1.jpeg" similarity index 100% rename from python_study_basic_notebook/imgs/python_install_1.jpeg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_1.jpeg" diff --git a/python_study_basic_notebook/imgs/python_install_2.jpeg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_2.jpeg" similarity index 100% rename from python_study_basic_notebook/imgs/python_install_2.jpeg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_2.jpeg" diff --git a/python_study_basic_notebook/imgs/python_install_3.jpeg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_3.jpeg" similarity index 100% rename from python_study_basic_notebook/imgs/python_install_3.jpeg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_3.jpeg" diff --git a/python_study_basic_notebook/imgs/python_install_4.jpeg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_4.jpeg" similarity index 100% rename from python_study_basic_notebook/imgs/python_install_4.jpeg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_4.jpeg" diff --git a/python_study_basic_notebook/imgs/python_install_5.png "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_5.png" similarity index 100% rename from python_study_basic_notebook/imgs/python_install_5.png rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs/python_install_5.png" diff --git a/python_study_basic_notebook/imgs_old/python_use.jpg "b/Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs_old/python_use.jpg" similarity index 100% rename from python_study_basic_notebook/imgs_old/python_use.jpg rename to "Python \345\237\272\347\241\200\350\257\276\347\250\213/imgs_old/python_use.jpg" diff --git a/README.md b/README.md index 0556581..acc0a54 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,46 @@ 今后,我们也准备用视频等方式来进行推广,敬请期待。 -从 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 + +Python Basic Lesson 17 - 异常处理.ipynb + +Python Basic Lesson 18 - 窗口界面编程tk.ipynb 遵循 GNU GENERAL PUBLIC LICENSE Version 3 协议。未经授权,不得用于商业用途。 diff --git a/python_study_basic_notebook/Python Basic Exercise A.ipynb b/python_study_basic_notebook/Python Basic Exercise A.ipynb deleted file mode 100644 index f5944c5..0000000 --- a/python_study_basic_notebook/Python Basic Exercise A.ipynb +++ /dev/null @@ -1,314 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Python Basic Exercise A\n", - "* v1.1, 2020.4 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": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "yes\n" - ] - } - ], - "source": [ - "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": "markdown", - "metadata": {}, - "source": [ - "## 题目4,简单的四则计算器" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "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: 1\n", - "Please enter the second number: 4\n", - "1.0 + 4.0 = 5.0 \n" - ] - } - ], - "source": [ - "# 简单四则计算器代码,摘自 https://www.jianshu.com/p/c22bfd91df49\n", - "\n", - "def calculate():\n", - " operation = input('''\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", - " number_1 = float(input('Please enter the first number: '))\n", - " number_2 = float(input('Please enter the second number: '))\n", - " if operation == '+': \n", - " print('{} + {} = {} '.format(number_1, number_2,number_1 + number_2)) \n", - " \n", - " elif operation == '-':\n", - " print('{} - {} = {} '.format(number_1,number_2,number_1 - number_2))\n", - " elif operation == '*': \n", - " print('{} * {} = {} '.format(number_1, number_2,number_1 * number_2))\n", - " elif operation == '/' and number_2 != 0: \n", - " print('{} / {} = {} '.format(number_1, number_2,number_1 / number_2))\n", - " else:\n", - " print('You have not typed a valid operator, please run the program again.')\n", - "\n", - "\n", - "calculate()" - ] - } - ], - "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/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 -} 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" deleted file mode 100644 index 28e5958..0000000 --- "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" +++ /dev/null @@ -1,415 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 13\n", - "\n", - "* v1.0.0 2016.11 by David.Yi\n", - "* v1.1 2020.5 edit by David Yi\n", - "\n", - "\n", - "## 本次内容要点\n", - "* for break continue else:完整的 for 语句结构 \n", - "* pprint 高级打印模块使用\n", - "* 思考一下:四则运算器" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "## 完整的 for 语句结构\n", - "\n", - "* for continue\n", - "* for break\n", - "* for else\n", - "\n", - "\n", - "* continue 语句跳出本次循环,而 break 跳出整个循环;\n", - "* continue 语句用来告诉 Python 跳过当前循环的剩余语句,然后继续进行下一轮循环;\n", - "* continue 语句可以用在 while 和 for 循环中;\n", - "\n", - "break 语句用来终止循环语句。\n", - "\n", - "else 语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行。" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "letter: P\n", - "letter: y\n", - "letter: t\n", - "letter: o\n", - "letter: n\n" - ] - } - ], - "source": [ - "# for continue 举例\n", - "\n", - "for l in 'Python':\n", - " if l == 'h':\n", - " continue\n", - " print('letter:', l)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# for continue 举例\n", - "# 去除输入的内容中的元音字母\n", - "\n", - "list1 = input('Input:')\n", - "\n", - "list2 = []\n", - "\n", - "for s in list1:\n", - " if s in ['a','e','i','o','u']:\n", - " continue\n", - " list2.append(s)\n", - "\n", - "# 将列表转换为字符串\n", - "s2 = ''.join(list2)\n", - "print('Output:', s2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# for break else 举例\n", - "# 判断质数\n", - "\n", - "import time\n", - "\n", - "a = time.time()\n", - "\n", - "for num in range(3,20):\n", - " for i in range(2,num): \n", - " if num%i == 0: \n", - " j=num/i \n", - " print(num,i,'*',j)\n", - " break \n", - " else: \n", - " print(num, '是质数')\n", - " \n", - "b = time.time()\n", - "print(b-a)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "## pprint() 介绍\n", - "\n", - "pprint module提供了可以按照某个格式正确的显示 Python 已知类型数据的一种方法,这种格式很易读。" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "print(sys.path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "import pprint\n", - "pprint.pprint(sys.path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# jupyter notebook 中直接显示一些变量的结果就和采用了 pprint 的方法\n", - " \n", - "import sys\n", - "sys.path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "print(type(sys.path))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## 思考一下\n", - "\n", - "简单的四则运算器,想一下怎么实现。" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# 简单四则计算器代码,下面代码参考 https://www.jianshu.com/p/c22bfd91df49\n", - "\n", - "def calculate():\n", - " operation = input('''\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", - " number_1 = float(input('Please enter the first number: '))\n", - " number_2 = float(input('Please enter the second number: '))\n", - " if operation == '+': \n", - " print('{} + {} = {} '.format(number_1, number_2,number_1 + number_2)) \n", - " \n", - " elif operation == '-':\n", - " print('{} - {} = {} '.format(number_1,number_2,number_1 - number_2))\n", - " elif operation == '*': \n", - " print('{} * {} = {} '.format(number_1, number_2,number_1 * number_2))\n", - " elif operation == '/' and number_2 != 0: \n", - " print('{} / {} = {} '.format(number_1, number_2,number_1 / number_2))\n", - " else:\n", - " print('You have not typed a valid operator, please run the program again.')\n", - "\n", - "\n", - "calculate()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "如果你对使用 python 来构造一种语言,比如适用一些场景的 DSL 感兴趣,如果你觉得 lex 和 yacc 这些编译原理中的概念感兴趣的话,可以参考这里:https://www.dabeaz.com/software.html\n", - "\n", - "Python 下有很多优秀的包,都可以来实现语言定义和解析,但是 ply 是其中最经典的包,从2001年诞生至今,一致在维护更新,并且不断发展。\n", - "\n", - "下面这个是 ply 自己带的例子,用来实现一个比较完整的计算器。因为是通过语法分析的方式实现,会比较费解,但是功能强大,并且容易扩充。" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# -----------------------------------------------------------------------------\n", - "# calc.py\n", - "#\n", - "# A simple calculator with variables -- all in one file.\n", - "# -----------------------------------------------------------------------------\n", - "\n", - "tokens = (\n", - " 'NAME', 'NUMBER',\n", - " 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'EQUALS',\n", - " 'LPAREN', 'RPAREN',\n", - ")\n", - "\n", - "# Tokens\n", - "\n", - "t_PLUS = r'\\+'\n", - "t_MINUS = r'-'\n", - "t_TIMES = r'\\*'\n", - "t_DIVIDE = r'/'\n", - "t_EQUALS = r'='\n", - "t_LPAREN = r'\\('\n", - "t_RPAREN = r'\\)'\n", - "t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'\n", - "\n", - "\n", - "def t_NUMBER(t):\n", - " r'\\d+'\n", - " try:\n", - " t.value = int(t.value)\n", - " except ValueError:\n", - " print(\"Integer value too large %d\", t.value)\n", - " t.value = 0\n", - " return t\n", - "\n", - "\n", - "# Ignored characters\n", - "t_ignore = \" \\t\"\n", - "\n", - "\n", - "def t_newline(t):\n", - " r'\\n+'\n", - " t.lexer.lineno += t.value.count(\"\\n\")\n", - "\n", - "\n", - "def t_error(t):\n", - " print(\"Illegal character '%s'\" % t.value[0])\n", - " t.lexer.skip(1)\n", - "\n", - "\n", - "# Build the lexer\n", - "import ply.lex as lex\n", - "\n", - "lexer = lex.lex()\n", - "\n", - "# Parsing rules\n", - "\n", - "precedence = (\n", - " ('left', 'PLUS', 'MINUS'),\n", - " ('left', 'TIMES', 'DIVIDE'),\n", - " ('right', 'UMINUS'),\n", - ")\n", - "\n", - "# dictionary of names\n", - "names = {}\n", - "\n", - "\n", - "def p_statement_assign(t):\n", - " 'statement : NAME EQUALS expression'\n", - " names[t[1]] = t[3]\n", - "\n", - "\n", - "def p_statement_expr(t):\n", - " 'statement : expression'\n", - " print(t[1])\n", - "\n", - "\n", - "def p_expression_binop(t):\n", - " '''expression : expression PLUS expression\n", - " | expression MINUS expression\n", - " | expression TIMES expression\n", - " | expression DIVIDE expression'''\n", - " if t[2] == '+':\n", - " t[0] = t[1] + t[3]\n", - " elif t[2] == '-':\n", - " t[0] = t[1] - t[3]\n", - " elif t[2] == '*':\n", - " t[0] = t[1] * t[3]\n", - " elif t[2] == '/':\n", - " t[0] = t[1] / t[3]\n", - "\n", - "\n", - "def p_expression_uminus(t):\n", - " 'expression : MINUS expression %prec UMINUS'\n", - " t[0] = -t[2]\n", - "\n", - "\n", - "def p_expression_group(t):\n", - " 'expression : LPAREN expression RPAREN'\n", - " t[0] = t[2]\n", - "\n", - "\n", - "def p_expression_number(t):\n", - " 'expression : NUMBER'\n", - " t[0] = t[1]\n", - "\n", - "\n", - "def p_expression_name(t):\n", - " 'expression : NAME'\n", - " try:\n", - " t[0] = names[t[1]]\n", - " except LookupError:\n", - " print(\"Undefined name '%s'\" % t[1])\n", - " t[0] = 0\n", - "\n", - "\n", - "def p_error(t):\n", - " print(\"Syntax error at '%s'\" % t.value)\n", - "\n", - "\n", - "import ply.yacc as yacc\n", - "\n", - "parser = yacc.yacc()\n", - "\n", - "while True:\n", - " try:\n", - " s = input('calc > ') # Use raw_input on Python 2\n", - " except EOFError:\n", - " break\n", - " parser.parse(s)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# 不能直接在 notebook 中执行上面代码,%run 命令执行 python 脚本\n", - "# 执行上面的计算器代码,支持加减乘除和括号,支持变量,并且具备非常好的扩展性\n", - "\n", - "%run \"calc.py\"\n", - "\n", - "# 1+1*2\n", - "# (1+1)*2\n", - "# (((2+3)*41)-8)+78" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} 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 4f4ca0d..0000000 Binary files a/python_study_basic_notebook/__pycache__/parsetab.cpython-37.pyc and /dev/null differ diff --git "a/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" "b/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" deleted file mode 100644 index 42754b0..0000000 --- "a/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" +++ /dev/null @@ -1,405 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 9\n", - "\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.2,2020.4 edit by David Yi\n", - "\n", - " \n", - "### 本次内容要点\n", - "\n", - "* 日期函数库 datetime 用法介绍,datetime、time 等库的介绍,获得日期,字符串和日期转换,日期格式介绍,日期加减计算\n", - "* 思考\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 日期处理\n", - "\n", - "datetime 是Python处理日期和时间的标准库,用于获取日期和进行日期计算等。\n", - "\n", - "需要理解 timestamp,UTC标准时区,时差这些概念。\n", - "\n", - "Python 的日期相关的标准库比较多(略有杂乱),有 datetime, time, calendar。\n", - "\n", - "datetime 库包括 date 日期,time 时间, datetime 日期和时间,tzinfo 时区,timedelta 时间跨度计算 等主要对象。\n", - "\n", - "获取当前日期和时间:`now = datetime.now()`\n", - "\n", - "日期戳和日期的区别,日期戳更加精确,日期只是年月日\n", - "根据需要使用,大多数情况下只需要日期即可\n", - "\n", - "Time 对于时间的处理更加精确,用时间戳的表达方式\n", - "\n", - "时间戳定义为格林威治时间1970年01月01日00时00分00秒起至现在的总秒数,时间戳是惟一的\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2017-07-07 12:38:54.969064\n", - "2017-07-07\n", - "1499402334.9690642\n" - ] - } - ], - "source": [ - "# 显示今天日期\n", - "# 显示今天 datetime 和 time\n", - "\n", - "from datetime import datetime, date\n", - "import time\n", - "\n", - "print(datetime.now())\n", - "print(date.today())\n", - "print(time.time())" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "# 各种日期时间类型的数据类型\n", - "\n", - "print(type(datetime.now()))\n", - "print(type(date.today()))\n", - "print(type(time.time()))" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1499402337.276191\n", - "1499402337.276191\n", - "1499402337.276191\n", - "1499402337.276191\n", - "1499402337.276191\n", - "1499402337.276191\n", - "1499402337.276191\n", - "1499402337.276191\n", - "1499402337.276191\n", - "1499402337.276191\n" - ] - } - ], - "source": [ - "# 连续运行显示时间戳,看看时间戳差了多少毫秒\n", - "\n", - "for i in range(10):\n", - " print(time.time())" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time: 0.014995813369750977\n" - ] - } - ], - "source": [ - "# 用 time() 来计时,算10万次平方,看看哪台电脑速度快\n", - "import time\n", - "a = time.time()\n", - "for i in range(100000):\n", - " j = i * i \n", - "\n", - "b = time.time()\n", - " \n", - "print('time:', b-a)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "#### 日期库-字符串和日期的转换\n", - "\n", - "字符串转化为日期:datetime.strptime()\n", - "\n", - "日期转换为字符串:datetime.strftime()\n", - "\n", - "日期字符串格式,举例\n", - "\n", - "```python\n", - "cday1 = datetime.now().strftime('%a, %b %d %H:%M')\n", - "cday2 = datetime.now().strftime('%A, %b %d %H:%M, %j')\n", - "cday3 = datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n", - "```\n", - "\n", - "#### 日期库 – 日期格式说明\n", - "\n", - "* %a 英文星期的简写 (shorthand of week in English)\n", - "* %A 英文星期的完整拼写 (longhand of week in English)\n", - "* %b 英文月份的简写 (shorthand of month in English)\n", - "* %B 英文月份的完整拼写 (longhand of month in English)\n", - "* %c 本地当前的日期与时间 (current local date and time)\n", - "* %d 日期数, 1-31之间 (date, between 1-31))\n", - "* %H 小时数, 00-23之间 (hour, between 00-23))\n", - "* %I 小时数, 01-12之间 (hour, between 01-12)\n", - "* %m 月份, 01-12之间 (month, between 01-12)\n", - "* %M 分钟数, 01-59之间 (minute, 01-59)\n", - "* %j 本年从第1天开始计数到当天的天数 (total days from 1st day of this year till now)\n", - "* %w 星期数, 0-6之间(0是周日) (day of the week, between 0-6, 0=Sunday)\n", - "* %W 当天属于本年的第几周,周一作为一周的第一天进行计算 (week of the year, starting with Monday )\n", - "* %x 本地的当天日期 (local date)\n", - "* %X 本地的当前时间 (local time)\n", - "* %y 年份,0-99之间 (year, between 0-99)\n", - "* %Y 年份的完整拼写 (longhand of year)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2017-01-02 18:19:59\n", - "\n", - "\n", - "\n", - "2017, 19, 05 11 12:46\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')\n", - "\n", - "# 日期转换为字符串\n", - "\n", - "day1 = datetime.now().strftime('%Y, %W, %m %d %H:%M')\n", - "print(day1)\n", - "print(type(day1))" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sun, Mar 19 11:28\n", - "Sunday, Mar 19 11:28, 078\n", - "2017-03-19 11:28:19\n" - ] - } - ], - "source": [ - "# 日期转换为字符串,各种格式\n", - "\n", - "cday1 = datetime.now().strftime('%a, %b %d %H:%M')\n", - "cday2 = datetime.now().strftime('%A, %b %d %H:%M, %j')\n", - "cday3 = datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n", - "print(cday1)\n", - "print(cday2)\n", - "print(cday3)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time.struct_time(tm_year=2017, tm_mon=5, tm_mday=11, tm_hour=12, tm_min=47, tm_sec=34, tm_wday=3, tm_yday=131, tm_isdst=0)\n", - "time.struct_time(tm_year=2017, tm_mon=5, tm_mday=11, tm_hour=12, tm_min=47, tm_sec=34, tm_wday=3, tm_yday=131, tm_isdst=0)\n", - "\n" - ] - } - ], - "source": [ - "# 格式化时间戳为本地的时间 converts number of seconds to local time\n", - "\n", - "print(time.localtime(time.time()))\n", - "print(time.localtime()) # If secs is not provided or None, the current time as returned by time() is used\n", - "\n", - "print(type(time.localtime(time.time())))" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2017-03-19 11:02:10\n", - "\n" - ] - } - ], - "source": [ - "# 本地时间转换为字符串\n", - "\n", - "t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())\n", - "print(t)\n", - "print(type(t))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "#### 日期计算\n", - "\n", - "对日期和时间进行加减实际上就是把 datetime 往后或往前计算,得到新的 datetime,需要导入 datetime 的 timedelta 类。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2017-05-11 12:48:38.858528\n", - "2017-05-11 02:48:38.858528\n" - ] - } - ], - "source": [ - "# 日期计算\n", - "# timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)\n", - "\n", - "from datetime import timedelta\n", - "\n", - "now = datetime.now()\n", - "now1 = now + timedelta(hours=-10)\n", - "print(now)\n", - "print(now1)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2017-03-22 12:47:45.586054\n", - "2017-03-22 23:07:35.586054\n" - ] - } - ], - "source": [ - "# 日期的各个变量的计算\n", - "\n", - "now = datetime.now()\n", - "now1 = now + timedelta(hours=10, minutes=20, seconds=-10)\n", - "print(now)\n", - "print(now1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 思考 \n", - "\n", - "计算倒计时,现在距离2018元旦距离现在还有多少天" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from datetime import datetime\n", - "\n", - "#日期格式转换\n", - "newyear = datetime.strptime('2018-01-01', '%Y-%m-%d')\n", - "#获取现在的时间\n", - "now = datetime.now()\n", - "#时间差\n", - "timedelta = newyear-now\n", - "print(timedelta.days)\n", - "print(type(newyear))" - ] - } - ], - "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/.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" "b/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" deleted file mode 100644 index 0a74097..0000000 --- "a/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" +++ /dev/null @@ -1,664 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 10\n", - "\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.2, 2020.4 edit by David Yi\n", - "\n", - " \n", - "### 本次内容要点\n", - "\n", - "* 函数不同参数形式\n", - "* 匿名函数\n", - "* 思考" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## 函数不同参数形式\n", - "\n", - "### 位置参数和默认参数\n", - "\n", - "位置参数:必须按照顺序准确传递,如果数量和顺序不对,就会可能造成程序错误;调用函数时候,如果写了参数名称,那么位置就不重要了。 \n", - "默认参数:在参数申明的时候跟一个用于默认值的赋值语句,如果调用函数的时候没有给出值,那么这个赋值语句就执行。\n", - "\n", - "注意:所有必须的参数要在默认参数之前\n", - "\n", - "默认参数的好处:\n", - "* 减少程序复杂度\n", - "* 降低程序错误可能性\n", - "* 更好的兼容性\n", - "\n", - "### 可变长度的参数-元组和字典\n", - "\n", - "可变长度的参数,分为不提供关键字和提供关键字两种模式,分别为元组 tuple 和字典 dict。\n", - "\n", - "可变长度的参数,如果是提供关键字,就是字典 dict,需要提供 key – value。\n", - "\n", - "将字典作为参数传递的时候,可以直接传一个字典变量,也可以在参数列表中写明 key 和 value。\n", - "\n", - "\n", - "函数参数小结\n", - "\n", - "* 位置参数\n", - "* 默认参数\n", - "* 元组参数,一个星号\n", - "* 字典参数,两个星号,需要传递 key 和 value" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "110.0\n", - "120.0\n", - "130.0\n" - ] - } - ], - "source": [ - "# 函数默认参数\n", - "\n", - "def cal_0(money, rate=0.1):\n", - " return money + money * rate \n", - "\n", - "print(cal_0(100))\n", - "print(cal_0(100,0.2))\n", - "print(cal_0(rate=0.3,money=100))" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "61000\n", - "62000\n", - "52000\n" - ] - } - ], - "source": [ - "# 函数默认参数\n", - "\n", - "def cal_1(money, bonus=1000, month=12,a=1,b=2):\n", - " i = money * month + bonus \n", - " return i\n", - "\n", - "print(cal_1(5000))\n", - "print(cal_1(5000, 2000))\n", - "print(cal_1(5000, 2000, 10))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# 画一个三角形 ,n=高度\n", - "'''\n", - " *\n", - " ***\n", - " *****\n", - " *******\n", - " *********\n", - " ***********\n", - " *************\n", - "\n", - "''' " - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " \n", - " *\n", - " ***\n", - " *****\n" - ] - } - ], - "source": [ - "# 函数默认参数\n", - "\n", - "def draw_triangle(n=5):\n", - "\n", - " for i in range(n+1):\n", - " print(' '*(n-i),'*'*(2*i-1))\n", - " \n", - "draw_triangle(3)\n", - "#draw_triangle()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.5\n" - ] - } - ], - "source": [ - "# 函数可变长度的参数 元组\n", - "\n", - "def cal_2(kind, *numbers):\n", - " if kind == 'avg':\n", - " n = 0\n", - " for i in numbers:\n", - " n = n + i\n", - " return n / len(numbers)\n", - "\n", - "print(cal_2('avg', 1,2,3,4))" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.5\n", - "10\n", - "10\n" - ] - } - ], - "source": [ - "# 函数可变长度的参数 元组\n", - "# 输入类别,输入要计算的数字\n", - "\n", - "def cal_3(kind, *numbers):\n", - " \n", - " if kind == 'avg':\n", - " n = 0\n", - " for i in numbers:\n", - " n = n + i\n", - " return n / len(numbers)\n", - " if kind == 'sum':\n", - " n = 0\n", - " for i in numbers:\n", - " n = n + i\n", - " return n\n", - " \n", - "print(cal_3('avg', 1,2,3,4))\n", - "print(cal_3('sum', 1,2,3,4))\n", - "\n", - "# 如果已经有一个list或者tuple,要调用一个可变参数怎么办?\n", - "# 在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:\n", - "print(cal_3('sum',*[1,2,3,4]))" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.5\n", - "10\n" - ] - } - ], - "source": [ - "# 函数可变长度的参数 元组\n", - "# 简化程序逻辑\n", - "\n", - "def cal_4(kind, *numbers):\n", - " \n", - " n = 0\n", - " for i in numbers:\n", - " n = n + i\n", - " \n", - " if kind == 'avg':\n", - " return n / len(numbers)\n", - " if kind == 'sum':\n", - " return n\n", - " \n", - "print(cal_4(kind='avg', 1,2,3,4))\n", - "print(cal_4('sum', 1,2,3,4))" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "10\n" - ] - } - ], - "source": [ - "# 传递元组和字典参数的最合适写法\n", - "\n", - "def cal_5(*numbers, **kw):\n", - " \n", - " # 判断是否有 kind 这个 key\n", - " if 'kind' in kw:\n", - " kind_value = kw.get('kind')\n", - " \n", - " n = 0\n", - " for i in numbers:\n", - " n = n + i\n", - " \n", - " if kind_value == 'avg':\n", - " return n / len(numbers)\n", - " if kind_value == 'sum':\n", - " return n\n", - " \n", - "print(cal_5(1,2,3,4,kind='avg',max='ignore'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "## 匿名函数\n", - "\n", - "Python 允许用 lambda 关键字创造匿名函数。\n", - "lambda 匿名函数不需要常规函数的 def 和 return 关键字,因为匿名函数代码较短,因此适用于一些简单处理运算的场景。" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# 等价的函数一般写法和匿名函数写法\n", - "\n", - "def add(x, y):\n", - " return x + y\n", - "\n", - "lambda x, y: x + y" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = lambda x, y=2 : x + y \n", - "a(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a(3, 5)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "44\n" - ] - } - ], - "source": [ - "a = lambda x : x * x +40\n", - "\n", - "print(a(2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# 举例\n", - "# 猜数,机器猜\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": "markdown", - "metadata": {}, - "source": [ - "思考一下\n", - "\n", - "* " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 题目2: 计算一个正整数的因数" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def func(number):\n", - " b = []\n", - " for i in range(1,number+1):\n", - " if number % i == 0:\n", - " print(i)\n", - " b.append(i)\n", - " return b\n", - " " - ] - }, - { - "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": "markdown", - "metadata": {}, - "source": [ - "## 题目3: 写一个寻找列表中最大数的函数(不用列表排序方法)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "20\n", - "-3\n" - ] - } - ], - "source": [ - "# 找到最大数 #1\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]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 题目4:函数可变参数练习1" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.0\n", - "2.5\n", - "10\n" - ] - } - ], - "source": [ - "# kind 中 增加 max key, \n", - "# max = ingnore, 则忽略最大值\n", - "def cal_6(*numbers, **kind):\n", - " \n", - " if 'kind' in kind:\n", - " kind_value = kind.get('kind')\n", - " \n", - " if 'max' in kind:\n", - " if kind.get('max') == 'ignore':\n", - " numbers = list(numbers)\n", - " numbers.remove(max(numbers))\n", - " \n", - " n = 0\n", - " for i in numbers:\n", - " n = n + i\n", - " \n", - " if kind_value == 'avg':\n", - " return n / len(numbers)\n", - " if kind_value == 'sum':\n", - " return n\n", - " \n", - "print(cal_6(1,2,3,4, kind='avg', max='ignore',min='ignore'))\n", - "print(cal_6(1,2,3,4, kind='avg'))\n", - "print(cal_6(1,2,3,4, kind='sum'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 题目5:函数可变参数练习2" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.75\n", - "2.5\n", - "10\n" - ] - } - ], - "source": [ - "# kind 中 增加 min key,\n", - "# min key = double, 则最小值计算两次\n", - "\n", - "def cal_7(*numbers, **kw):\n", - " \n", - " numbers = list(numbers)\n", - " \n", - " if 'kind' in kw:\n", - " kind_value = kw.get('kind')\n", - " \n", - " if 'max' in kw:\n", - " if kw.get('max') == 'ignore':\n", - " numbers.remove(max(numbers))\n", - "\n", - " if 'min' in kw:\n", - " if kw.get('min') == 'double':\n", - " numbers.append(min(numbers))\n", - " \n", - " n = 0\n", - " for i in numbers:\n", - " n = n + i\n", - " \n", - " if kind_value == 'avg':\n", - " return n / len(numbers)\n", - " if kind_value == 'sum':\n", - " return n\n", - " \n", - "print(cal_7(1,2,3,4, kind='avg', max='ignore', min='double'))\n", - "print(cal_7(1,2,3,4, kind='avg'))\n", - "print(cal_7(1,2,3,4, kind='sum'))" - ] - }, - { - "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": 4 -} diff --git "a/python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections-checkpoint.ipynb" "b/python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections-checkpoint.ipynb" deleted file mode 100644 index df7cfd6..0000000 --- "a/python_study_basic_notebook/draft/.ipynb_checkpoints/Python Basic Lesson 11 - \351\233\206\345\220\210\345\272\223 collections-checkpoint.ipynb" +++ /dev/null @@ -1,1150 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 11\n", - "\n", - "* Python Basic, Lesson 6, v1.0.1, 2017.1 by David.Yi \n", - "* Python Basic, Lesson 6, v1.0.2, 2017.5 modified by Yimeng.Zhang \n", - "* v1.1, 2020.4. edit by David Yi\n", - "\n", - " \n", - "### 本次内容要点\n", - "\n", - "* 集合库 collections 简介\n", - " * namedtuple: 生成可以使用名字来访问元素内容的tuple子类\n", - " * deque: 双端队列,可以快速的从另外一侧追加和推出对象\n", - " * defaultdict: 带有默认值的字典\n", - " * OrderedDict: 有序字典\n", - " * Counter: 计数器\n", - "* 异常错误处理简介\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "### collections\n", - "\n", - "collections 是 Python 内建的一个集合模块,提供了许多有用的集合类。我们来完整的看看 collections 提供了哪些扩展功能。\n", - "\n", - "python 内置了大量的功能函数,但是再多的函数和模块也不可能覆盖实际应用需要的所有功能,怎么扩展程序功能,怎么划分功能模块,python 自己所带的这些模块是最好的参考书!\n", - "\n", - "* namedtuple: 生成可以使用名字来访问元素内容的tuple子类\n", - "* deque: 双端队列,可以快速的从另外一侧追加和推出对象\n", - "* defaultdict: 带有默认值的字典\n", - "* OrderedDict: 有序字典\n", - "* Counter: 计数器" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## namedtuple 有名字的元组\n", - "\n", - "namedtuple 主要用来产生可以使用名称来访问元素的数据对象,通常用来增强代码的可读性,在访问一些 tuple 类型的数据时尤其好用。\n", - "\n", - "namedtuple 是一个函数,它用来创建一个自定义的 tuple 对象,并且规定了 tuple 元素的个数,可以用属性而不是索引来写入或者访问 tuple 的某个元素。\n", - "\n", - "这样一来,我们用 namedtuple 可以很方便地定义一种数据类型,比如 XY 坐标,它具备 tuple 的内容不变性,又可以根据属性来引用,使用十分方便。" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 2\n" - ] - } - ], - "source": [ - "# nametuple 举例\n", - "\n", - "from collections import namedtuple\n", - "\n", - "Point = namedtuple('Point', ['x', 'y'])\n", - "p = Point(1, 2)\n", - "print(p.x, p.y) " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n" - ] - } - ], - "source": [ - "i = p.x + p.y\n", - "print(i)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "web(name='google', type='search', url='www.google.com')\n" - ] - } - ], - "source": [ - "# nametuple 举例\n", - "\n", - "from collections import namedtuple\n", - "\n", - "Web = namedtuple('web', ['name', 'type', 'url'])\n", - "p1 = Web('google', 'search', 'www.google.com')\n", - "p2 = Web('sina', 'portal', 'www.sina.com.cn')\n", - "\n", - "print(p1)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "google www.google.com\n" - ] - } - ], - "source": [ - "print(p1.name, p1.url)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "www.google.com www.sina.com.cn\n" - ] - } - ], - "source": [ - "print(p1.url, p2.url)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sina\n", - "portal\n", - "www.sina.com.cn\n" - ] - } - ], - "source": [ - "# 遍历 nametuple\n", - "\n", - "for i in p2:\n", - " print(i)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[web(name='google', type='search', url='www.google.com'), web(name='sina', type='portal', url='www.sina.com.cn')]\n", - "google\n", - "sina\n" - ] - } - ], - "source": [ - "# 复杂的基于 namedtuple list demo\n", - "from collections import namedtuple\n", - "\n", - "Web = namedtuple('web', ['name', 'type', 'url'])\n", - "\n", - "p = []\n", - "p.append(Web('google', 'search', 'www.google.com'))\n", - "p.append(Web('sina', 'portal', 'www.sina.com.cn'))\n", - "print(p)\n", - "\n", - "for i in p:\n", - " print(i.name)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "('name', 'type', 'url')\n" - ] - } - ], - "source": [ - "# 显示 namedtuple 的字段名称\n", - "\n", - "print(Web._fields)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## deque\n", - "\n", - "使用 list 存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为 list 是线性存储,数据量大的时候,插入和删除效率很低。\n", - "\n", - "deque 是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。\n", - "\n", - "deque 在插入数据时候速度比 list 快很多,当然这个是相对存在大量数据的 list 而言的。如果你的程序中需要对有百万级别的 list 频繁的在各个位置插入删除数据,那么用 deque 是值得的。" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "deque(['y', 'a', 'b', 'c', 'x'])\n" - ] - } - ], - "source": [ - "# deque 举例\n", - "\n", - "from collections import deque\n", - "\n", - "q = deque(['a', 'b', 'c'])\n", - "q.append('x')\n", - "q.appendleft('y')\n", - "\n", - "print(q)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.029897212982177734\n", - "0.00005698\n" - ] - } - ], - "source": [ - "# 对比 list 和 deque 的速度\n", - "\n", - "from collections import deque\n", - "import time\n", - "\n", - "# list\n", - "q0 = [x*x for x in range(10000000)]\n", - "\n", - "# list\n", - "a = time.time()\n", - "q0.insert(0,888)\n", - "# q0.append(999)\n", - "b = time.time()\n", - "print(b-a)\n", - "\n", - "# 生成 deque\n", - "q1= deque(q0)\n", - "\n", - "# deque\n", - "a = time.time()\n", - "q1.appendleft(888)\n", - "# q1.append(999)\n", - "b = time.time()\n", - "print('%2.8f' % (b-a))" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "deque(['a', 'b', 'c', 'd'])\n" - ] - } - ], - "source": [ - "from collections import deque\n", - "\n", - "l = ['a','b','c','d']\n", - "l = deque(l)\n", - "print(l)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "deque(['d', 'e', 'a', 'b', 'c'])\n", - "deque(['a', 'b', 'c', 'd', 'e'])\n" - ] - } - ], - "source": [ - "# deque rotation\n", - "\n", - "l = ['a','b','c','d','e']\n", - "l = deque(l)\n", - "l.rotate(2)\n", - "print(l)\n", - "l.rotate(-2)\n", - "print(l)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "deque(['a', 'b'])\n" - ] - } - ], - "source": [ - "# deque pop() 同样可以区分头尾\n", - "\n", - "l = deque(['a','b','c'])\n", - "l.pop()\n", - "print(l)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "deque(['b', 'c'])\n" - ] - } - ], - "source": [ - "l = deque(['a','b','c'])\n", - "l.popleft()\n", - "print(l)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## defaultdict\n", - "\n", - "我们都知道,在使用Python原生的数据结构dict的时候,如果用 d[key] 这样的方式访问, 当指定的key不存在时,是会抛出KeyError异常的,也就是发生错误。(当然可以用 get 方法来避免这样的错误)\n", - "\n", - "如果使用defaultdict,只要你传入一个默认的方法,那么请求一个不存在的key时, 便会调用这个方法,使用其结果来作为这个key的默认值。" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "David\n" - ] - } - ], - "source": [ - "# 标准的字典用法\n", - "\n", - "i = {'name':'David'}\n", - "print(i['name'])" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'score'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mi\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;34m'name'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;34m'David'\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'score'\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: 'score'" - ] - } - ], - "source": [ - "# 不存在 key,则会报错\n", - "\n", - "i = {'name':'David'}\n", - "print(i['score'])" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "David\n" - ] - } - ], - "source": [ - "# defaultdict 举例\n", - "\n", - "from collections import defaultdict\n", - "\n", - "d = defaultdict(lambda: 100)\n", - "d['name']='David'\n", - "print(d['name'])" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100\n", - "100\n" - ] - } - ], - "source": [ - "# default 返回默认值,不会报错\n", - "\n", - "print(d['score'])\n", - "print(d['best_score'])" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "David\n", - "100\n" - ] - } - ], - "source": [ - "from collections import defaultdict\n", - "\n", - "d = defaultdict(lambda: '100')\n", - "d['name']='David'\n", - "print(d['name'])\n", - "print(d['score'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## OrderedDict\n", - "\n", - "使用 dict 字典时,Key 是无序的。在对 dict 做迭代访问时,我们无法确定 Key 的顺序。\n", - "\n", - "如果要保持 Key 的顺序,可以用 OrderedDict,这是一个 Key 值有序的字典数据类型。\n", - "\n", - "> 2020.4.30 从 Python 3.7 开始,默认的 dict 是有顺序的,而不是之前版本是乱序的,也就是默认的 dict 就是记住插入的顺序的。所以本节内容意义已经不大了。反过来证明有序字典是一个多么重要的功能点,已经从包中的功能被移植到了主功能中。" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'a': 1, 'b': 2, 'c': 3}\n" - ] - } - ], - "source": [ - "# dict 是无序的\n", - "\n", - "d = dict([('a', 1), ('b', 2), ('c', 3)])\n", - "\n", - "print(d)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'a': 1, 'b': 2, 'c': 3}\n", - "{'a': 1, 'b': 2, 'c': 3, 'd': 4}\n" - ] - } - ], - "source": [ - "# 传统dict 追加一对 key value\n", - "\n", - "d = dict([('a', 1), ('b', 2), ('c', 3)])\n", - "\n", - "print(d)\n", - "\n", - "d['d'] = 4\n", - "print(d)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OrderedDict([('a', 1), ('b', 2), ('c', 3)])\n" - ] - } - ], - "source": [ - "# 使用 OrderedDict\n", - "\n", - "from collections import OrderedDict\n", - "\n", - "d = OrderedDict()\n", - "d['a'] = 1\n", - "d['b'] = 2\n", - "d['c'] = 3\n", - "\n", - "print(d)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OrderedDict([('a', 1), ('b', 2), ('c', 3)])\n", - "OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])\n" - ] - } - ], - "source": [ - "# 使用 OrderedDict, 追加一对 key value\n", - "# OrderedDict 的 key 会按照插入的顺序排列,不是 key 本身排序\n", - "\n", - "from collections import OrderedDict\n", - "\n", - "d = OrderedDict()\n", - "d['a'] = 1\n", - "d['b'] = 2\n", - "d['c'] = 3\n", - "\n", - "print(d)\n", - "\n", - "d['d'] = 4\n", - "print(d)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "add: ('a', 1)\n", - "add: ('b', 2)\n", - "add: ('c', 3)\n", - "LastUpdatedOrderedDict([('a', 1), ('b', 2), ('c', 3)])\n" - ] - } - ], - "source": [ - "# OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:\n", - "\n", - "from collections import OrderedDict\n", - "\n", - "class LastUpdatedOrderedDict(OrderedDict):\n", - "\n", - " def __init__(self, capacity):\n", - " super(LastUpdatedOrderedDict, self).__init__()\n", - " self._capacity = capacity\n", - "\n", - " def __setitem__(self, key, value):\n", - " containsKey = 1 if key in self else 0\n", - " if len(self) - containsKey >= self._capacity:\n", - " last = self.popitem(last=False)\n", - " print('remove:', last)\n", - " if containsKey:\n", - " del self[key]\n", - " print('set:', (key, value))\n", - " else:\n", - " print('add:', (key, value))\n", - " OrderedDict.__setitem__(self, key, value)\n", - " \n", - "d = LastUpdatedOrderedDict(4)\n", - "d['a'] = 1\n", - "d['b'] = 2\n", - "d['c'] = 3\n", - "print(d)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "add: ('d', 4)\n", - "remove: ('a', 1)\n", - "add: ('e', 5)\n", - "remove: ('b', 2)\n", - "add: ('f', 6)\n", - "LastUpdatedOrderedDict([('c', 3), ('d', 4), ('e', 5), ('f', 6)])\n" - ] - } - ], - "source": [ - "d['d'] = 4\n", - "d['e'] = 5\n", - "d['f'] = 6\n", - "print(d)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OrderedDict([('a', 1), ('b', 2), ('c', 3)])\n" - ] - }, - { - "data": { - "text/plain": [ - "OrderedDict([('b', 2), ('c', 3), ('new_key', 4)])" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 简化的先进先出Dict\n", - "\n", - "from collections import OrderedDict\n", - "d = OrderedDict()\n", - "d['a'] = 1\n", - "d['b'] = 2\n", - "d['c'] = 3\n", - "print(d)\n", - "\n", - "# 3个参数:原始有序字典,容量限制,待插入的key,待插入的value\n", - "def update_ordereddict(ordered_dict, len_limit ,key, value):\n", - " if len(ordered_dict) >=0 and len(ordered_dict) < len_limit:\n", - " ordered_dict[key]=value\n", - " return ordered_dict\n", - " else:\n", - " ordered_dict.popitem(last=False)\n", - " ordered_dict[key]=value\n", - " return ordered_dict\n", - "\n", - "# 插入一个新key-value\n", - "update_ordereddict(d, 3, 'new_key', 4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Counter\n", - "\n", - "Counter是一个简单的计数器,例如,统计字符出现的个数:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "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" - ] - } - ], - "source": [ - "# Counter类的目的是用来跟踪值出现的次数,以字典的键值对形式存储,其中元素作为key,其计数作为value\n", - "# 下面这个例子就是使用 Counter 模块统计一段句子里面所有字符出现次数\n", - "\n", - "from collections import Counter\n", - "\n", - "s = 'A Counter is a dict subclass. '.lower()\n", - "\n", - "c = Counter(s)\n", - "# 获取出现频率最高的5个字符\n", - "print(c.most_common(5))" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('自', 2), ('远', 2), ('去', 2), ('他', 1), ('会', 1)]\n" - ] - } - ], - "source": [ - "# 是否可以统计中文呢?\n", - "\n", - "s = '他会自己长大远去我们也各自远去'\n", - "\n", - "c = Counter(s)\n", - "\n", - "print(c.most_common(5))" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Please input:whatisyourname\n", - "[('a', 2), ('w', 1), ('h', 1), ('t', 1), ('i', 1)]\n" - ] - } - ], - "source": [ - "# Counter 举例,用户输入内容\n", - "\n", - "from collections import Counter\n", - "\n", - "s = input('Please input:')\n", - "\n", - "s = s.lower()\n", - "\n", - "c = Counter(s)\n", - "# 获取出现频率最高的5个字符\n", - "print(c.most_common(5))" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[' ', 's', 'a', 'c', 'u', 't', 'i', 'o', 'n', 'e', 'r', 'd', 'b', 'l', '.']\n", - "[6, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1]\n" - ] - } - ], - "source": [ - "# 读出 Counter 对象中的key 和value\n", - "\n", - "s = 'A Counter is a dict subclass. '.lower()\n", - "c = Counter(s)\n", - "\n", - "# 用列表生成式获得 counter 中的 key\n", - "list1 = [k for k,v in c.most_common()]\n", - "\n", - "# 用列表生成式获得 counter 中的 value\n", - "list2 = [v for k,v in c.most_common()]\n", - "print(list1)\n", - "print(list2)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# 我们在 notebook 中画个图\n", - "\n", - "import matplotlib.pyplot as plt\n", - " \n", - "plt.bar(range(len(list2)), list2,color='rgb',tick_label=list1)\n", - "plt.show()\n" - ] - }, - { - "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" - ] - }, - { - "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/Python Basic Lesson 12 - \345\210\227\350\241\250\347\224\237\346\210\220\345\274\217-checkpoint.ipynb" "b/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" deleted file mode 100644 index 2fcb230..0000000 --- "a/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" +++ /dev/null @@ -1,252 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 12\n", - "\n", - "* v1.0.0,2016.10 by David.Yi\n", - "* v1.1, 2020.4.30 edit by David Yi\n", - "\n", - "## 本次内容要点\n", - "* 列表生成器用法\n", - "* 思考一下" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "## 列表生成式\n", - "\n", - "\n", - "列表生成式是 Python 内置的非常简单却强大的可以用来创建list的方法。\n", - "\n", - "大家都知道,要生成一个这样的 list:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n", - "\n", - "可以用 `list(range(1, 11))` \n", - "\n", - "那么如果要生成这样的 list:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100],应该怎么办呢?" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]\n" - ] - } - ], - "source": [ - "# 用循环来生成\n", - "\n", - "l = []\n", - "for x in range(1, 11):\n", - " l.append(x * x)\n", - " \n", - "print(l)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]\n" - ] - } - ], - "source": [ - "# 用列表生成式\n", - "# 是不是更加简洁和优雅?\n", - "\n", - "l = [ x * x for x in range(1, 11)]\n", - "print(l)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "##### 列表生成式用法:\n", - "\n", - "写列表生成式时,把要生成的元素 `x * x` 放到前面,后面跟 `for` 循环,就可以把 list 创建出来,十分有用。\n", - "\n", - "在列表生成式后面还可以加上判断,过滤出结果为偶数的结果\n", - "\n", - "[x * x for x in range(1, 11) if x % 2 == 0]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[4, 16, 36, 64, 100]" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 在列表生成式后面加上判断,过滤出结果为偶数的结果\n", - "\n", - "[x * x for x in range(1, 11) if x % 2 == 0 ]" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(2, 0), (3, 1), (4, 2), (5, 3), (6, 4), (7, 5), (8, 6), (9, 7)]\n" - ] - } - ], - "source": [ - "# 可以在列表生成式中使用双重循环\n", - "# 输出一对元组,每个数在10以内,且加在一起等于5\n", - "\n", - "l = [(x, y) for x in range(10) for y in range(10) if x + y == 5 if x > y]\n", - "\n", - "print(l)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['Pictures', 'PrintHood', 'PycharmProjects']\n" - ] - } - ], - "source": [ - "# 改进之前寻找目录下指定字母开头的文件的判断方式\n", - "# 修改为使用列表生成式\n", - "\n", - "import os\n", - "\n", - "# 可以指定路径参数,来列出该目录下所有文件\n", - "# l = os.listdir('/Users/yijun')\n", - "\n", - "# 可以判断各类情况,比如第一个是大写的 P 字母, 用列表生成式的方式,代码精简了很多\n", - "list1 = [l for l in os.listdir('/Users/yijun') if l[0:1] == 'P']\n", - "print(list1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### python 灵活的变量定义" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "2\n", - "3 4 5 6 7 8\n" - ] - } - ], - "source": [ - "# python 有趣灵活的变量定义\n", - "\n", - "first, second, *rest = (1,2,3,4,5,6,7,8)\n", - "print(first)\n", - "print(second)\n", - "print(*rest)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4\n", - "3\n" - ] - } - ], - "source": [ - "# python 交换变量\n", - "\n", - "a, b = 3, 4\n", - "a, b = b, a \n", - "print(a)\n", - "print(b)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git "a/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" "b/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" deleted file mode 100644 index c538575..0000000 --- "a/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" +++ /dev/null @@ -1,597 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Python for Senior Lesson 6\n", - "\n", - "* v1.0.0 2016.11 by David.Yi\n", - "* v1.1 2020.5 edit by David Yi\n", - "\n", - "\n", - "## 本次内容要点\n", - "* for break continue else:完整的 for 语句结构 \n", - "* pprint 高级打印模块使用\n", - "* python 标准库:网站访问 urllib 库介绍" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "## 完整的 for 语句结构\n", - "\n", - "for continue\n", - "for break\n", - "for else\n", - "\n", - "continue 语句跳出本次循环,而 break 跳出整个循环;\n", - "continue 语句用来告诉 Python 跳过当前循环的剩余语句,然后继续进行下一轮循环;\n", - "continue 语句可以用在 while 和 for 循环中;\n", - "\n", - "break 语句用来终止循环语句。\n", - "\n", - "else 语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行。" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "letter: P\n", - "letter: y\n", - "letter: t\n", - "letter: o\n", - "letter: n\n" - ] - } - ], - "source": [ - "# for continue 举例\n", - "\n", - "for l in 'Python':\n", - " if l == 'h':\n", - " continue\n", - " print('letter:', l)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Input:hello\n", - "Output: hll\n" - ] - } - ], - "source": [ - "# for continue 举例\n", - "# 去除输入的内容中的元音字母\n", - "\n", - "list1 = input('Input:')\n", - "\n", - "list2 = []\n", - "\n", - "for s in list1:\n", - " if s in ['a','e','i','o','u']:\n", - " continue\n", - " list2.append(s)\n", - "\n", - "# 将列表转换为字符串\n", - "s2 = ''.join(list2)\n", - "print('Output:', s2)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3 是质数\n", - "4 2 * 2.0\n", - "5 是质数\n", - "6 2 * 3.0\n", - "7 是质数\n", - "8 2 * 4.0\n", - "9 3 * 3.0\n", - "10 2 * 5.0\n", - "11 是质数\n", - "12 2 * 6.0\n", - "13 是质数\n", - "14 2 * 7.0\n", - "15 3 * 5.0\n", - "16 2 * 8.0\n", - "17 是质数\n", - "18 2 * 9.0\n", - "19 是质数\n", - "0.0005238056182861328\n" - ] - } - ], - "source": [ - "# for break else 举例\n", - "# 判断质数\n", - "\n", - "import time\n", - "\n", - "a = time.time()\n", - "\n", - "for num in range(3,20):\n", - " for i in range(2,num): \n", - " if num%i == 0: \n", - " j=num/i \n", - " print(num,i,'*',j)\n", - " break \n", - " else: \n", - " print(num, '是质数')\n", - " \n", - "b = time.time()\n", - "print(b-a)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "##### pprint() 介绍\n", - "\n", - "pprint module提供了可以按照某个格式正确的显示 Python 已知类型数据的一种方法,这种格式很易读。" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['', '/Users/yijun/anaconda/lib/python34.zip', '/Users/yijun/anaconda/lib/python3.4', '/Users/yijun/anaconda/lib/python3.4/plat-darwin', '/Users/yijun/anaconda/lib/python3.4/lib-dynload', '/Users/yijun/anaconda/lib/python3.4/site-packages/Sphinx-1.3.5-py3.4.egg', '/Users/yijun/anaconda/lib/python3.4/site-packages/setuptools-20.3-py3.4.egg', '/Users/yijun/anaconda/lib/python3.4/site-packages', '/Users/yijun/anaconda/lib/python3.4/site-packages/aeosa', '/Users/yijun/anaconda/lib/python3.4/site-packages/IPython/extensions', '/Users/yijun/.ipython']\n" - ] - } - ], - "source": [ - "import sys\n", - "print(sys.path)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['',\n", - " '/Users/yijun/anaconda/lib/python34.zip',\n", - " '/Users/yijun/anaconda/lib/python3.4',\n", - " '/Users/yijun/anaconda/lib/python3.4/plat-darwin',\n", - " '/Users/yijun/anaconda/lib/python3.4/lib-dynload',\n", - " '/Users/yijun/anaconda/lib/python3.4/site-packages/Sphinx-1.3.5-py3.4.egg',\n", - " '/Users/yijun/anaconda/lib/python3.4/site-packages/setuptools-20.3-py3.4.egg',\n", - " '/Users/yijun/anaconda/lib/python3.4/site-packages',\n", - " '/Users/yijun/anaconda/lib/python3.4/site-packages/aeosa',\n", - " '/Users/yijun/anaconda/lib/python3.4/site-packages/IPython/extensions',\n", - " '/Users/yijun/.ipython']\n" - ] - } - ], - "source": [ - "import sys\n", - "import pprint\n", - "pprint.pprint(sys.path)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['',\n", - " '/Users/yijun/anaconda/lib/python34.zip',\n", - " '/Users/yijun/anaconda/lib/python3.4',\n", - " '/Users/yijun/anaconda/lib/python3.4/plat-darwin',\n", - " '/Users/yijun/anaconda/lib/python3.4/lib-dynload',\n", - " '/Users/yijun/anaconda/lib/python3.4/site-packages/Sphinx-1.3.5-py3.4.egg',\n", - " '/Users/yijun/anaconda/lib/python3.4/site-packages/setuptools-20.3-py3.4.egg',\n", - " '/Users/yijun/anaconda/lib/python3.4/site-packages',\n", - " '/Users/yijun/anaconda/lib/python3.4/site-packages/aeosa',\n", - " '/Users/yijun/anaconda/lib/python3.4/site-packages/IPython/extensions',\n", - " '/Users/yijun/.ipython']" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import sys\n", - "sys.path" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[\n", - "' ' ,\n", - "' /Users/yijun/anaconda/lib/python35.zip ' ,\n", - "' /Users/yijun/anaconda/lib/python3.5 ' ,\n", - "' /Users/yijun/anaconda/lib/python3.5/plat-darwin ' ,\n", - "' /Users/yijun/anaconda/lib/python3.5/lib-dynload ' ,\n", - "' /Users/yijun/anaconda/lib/python3.5/site-packages/Sphinx-1.3.5-py3.5.egg ' ,\n", - "' /Users/yijun/anaconda/lib/python3.5/site-packages/setuptools-20.3-py3.5.egg ' ,\n", - "' /Users/yijun/anaconda/lib/python3.5/site-packages ' ,\n", - "' /Users/yijun/anaconda/lib/python3.5/site-packages/aeosa ' ,\n", - "' /Users/yijun/anaconda/lib/python3.5/site-packages/IPython/extensions ' ,\n", - "' /Users/yijun/.ipython ' ,\n" - ] - } - ], - "source": [ - "import sys\n", - "\n", - "print ('[')\n", - "\n", - "for i in sys.path:\n", - " print(\"'\",i,\"'\",\",\")" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "import sys\n", - "print(type(sys.path))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "##### urllib 包\n", - "\n", - "urllib 提供了一系列用于操作 URL 的功能。\n", - "\n", - "urllib 的 `request` 模块可以非常方便地抓取 URL 内容,也就是发送一个`GET`请求到指定的页面,然后返回`HTTP`的响应。" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "b'\\r\\n\\r\\n\\r\\n \\r\\n\\r\\n\\xe6\\x90\\x9c\\xe7\\x8b\\x97\\xe6\\x90\\x9c\\xe7\\xb4\\xa2\\xe5\\xbc\\x95\\xe6\\x93\\x8e - \\xe4\\xb8\\x8a\\xe7\\xbd\\x91\\xe4\\xbb\\x8e\\xe6\\x90\\x9c\\xe7\\x8b\\x97\\xe5\\xbc\\x80\\xe5\\xa7\\x8b\\r\\n\\r\\n\\r\\n\\r\\n \\r\\n\\r\\n\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n'\n" - ] - } - ], - "source": [ - "# 用 urllib 来读取网站源代码\n", - "\n", - "import urllib.request\n", - "\n", - "response = urllib.request.urlopen('http://sogou.com')\n", - "html = response.read()\n", - "print(html)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "b'\\r\\n'\n", - "b'\\t\\r\\n'\n", - "b' \\r\\n'\n", - "b'\\t\\t\\t \\r\\n'\n", - "b'\\t\\r\\n'\n", - "b'\\t\\t\\t \\r\\n'\n", - "b'\\t\\r\\n'\n", - "b'\\t\\t\\t \\r\\n'\n", - "b'\\t\\r\\n'\n", - "b'\\t\\t\\t \\r\\n'\n", - "b'\\t\\t\\t \\r\\n'\n", - "b'\\r\\n'\n", - "b'\\r\\n'\n", - "b'\\r\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\r\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b'\\n'\n", - "b' \\n'\n", - "b' \\n'\n", - "b' \\n'\n", - "b'\\t\\n'\n", - "b' \\n'\n", - "b' \\n'\n", - "b' \\n'\n", - "b' \\n'\n", - "b'\\t\\n'\n", - "b'\\t\\n'\n", - "b'\\t\\n'\n", - "b'\\t\\n'\n" - ] - } - ], - "source": [ - "# 使用 readlines() 方法\n", - "\n", - "import urllib.request\n", - "\n", - "response = urllib.request.urlopen('http://www.baidu.com')\n", - "html = response.readlines()\n", - "\n", - "for i, item in enumerate(html):\n", - " if i>100 and i<150:\n", - " print(item)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Date: Tue, 01 Nov 2016 14:24:17 GMT\n", - "Content-Type: text/html; charset=utf-8\n", - "Transfer-Encoding: chunked\n", - "Connection: Close\n", - "Vary: Accept-Encoding\n", - "Set-Cookie: BAIDUID=C9FC84CDD388490492FE90B3537341E7:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\n", - "Set-Cookie: BIDUPSID=C9FC84CDD388490492FE90B3537341E7; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\n", - "Set-Cookie: PSTM=1478010257; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\n", - "Set-Cookie: BDSVRTM=0; path=/\n", - "Set-Cookie: BD_HOME=0; path=/\n", - "Set-Cookie: H_PS_PSSID=1457_21098_18560_21454_21394_21378_21189; path=/; domain=.baidu.com\n", - "P3P: CP=\" OTI DSP COR IVA OUR IND COM \"\n", - "Cache-Control: private\n", - "Cxy_all: baidu+85949e388d707f7b8522d61e00c1115e\n", - "Expires: Tue, 01 Nov 2016 14:24:03 GMT\n", - "X-Powered-By: HPHP\n", - "Server: BWS/1.1\n", - "X-UA-Compatible: IE=Edge,chrome=1\n", - "BDPAGETYPE: 1\n", - "BDQID: 0x8674d38a000311f7\n", - "BDUSERID: 0\n", - "\n", - "\n" - ] - } - ], - "source": [ - "# 用 urllib 来读取网站信息\n", - "\n", - "import urllib.request\n", - "\n", - "response = urllib.request.urlopen('http://www.baidu.com')\n", - "info = response.info()\n", - "print(info)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "##### requests 包\n", - "\n", - "requests 包是 python 目前最好用的网站内容访问包,设计上比较人性化,可以简化代码" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "b'\\r\\n \\xe7\\x99\\xbe\\xe5\\xba\\xa6\\xe4\\xb8\\x80\\xe4\\xb8\\x8b\\xef\\xbc\\x8c\\xe4\\xbd\\xa0\\xe5\\xb0\\xb1\\xe7\\x9f\\xa5\\xe9\\x81\\x93
\\r\\n'\n" - ] - } - ], - "source": [ - "import requests\n", - "\n", - "r = requests.get('http://www.baidu.com')\n", - "print(r.content)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', 'Pragma': 'no-cache', 'Connection': 'Keep-Alive', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Server': 'bfe/1.0.8.18', 'Date': 'Fri, 04 Nov 2016 15:05:30 GMT', 'Content-Type': 'text/html', 'Last-Modified': 'Mon, 25 Jul 2016 11:12:41 GMT', 'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform'}\n" - ] - } - ], - "source": [ - "print(r.headers)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "##### 下载文件\n", - "\n", - "使用 urllib 和 requets 都可以很方便的获得网站中的图片、文件等。下面只是简单的举例,下载 baidu 的 logo 文件。" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "download ok\n" - ] - } - ], - "source": [ - "# 下载文件 使用 urllib\n", - "# baidu 的 logo 文件: http://home.baidu.com/resource/r/home/img/logo-yy.gif \n", - "\n", - "import urllib\n", - "\n", - "# url = 'http://home.baidu.com/resource/r/home/img/logo-yy.gif'\n", - "\n", - "# url = 'http://fushanedu.cn/images/LOGO_sy.jpg'\n", - "\n", - "url ='http://www.jcsy.pudong-edu.sh.cn/News/images/photo_xz.jpg'\n", - "\n", - "urllib.request.urlretrieve(url, \"logo3.jpg\")\n", - "print('download ok')" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "download ok\n" - ] - } - ], - "source": [ - "# 下载文件 使用 requests\n", - "# baidu 的 logo 文件: http://home.baidu.com/resource/r/home/img/logo-yy.gif \n", - "\n", - "import requests\n", - "\n", - "url = 'http://home.baidu.com/resource/r/home/img/logo-yy.gif'\n", - "\n", - "r = requests.get(url)\n", - "with open(\"logo.gif\", \"wb\") as code:\n", - " code.write(r.content)\n", - " print('download ok')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git "a/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" "b/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" deleted file mode 100644 index b4f1f03..0000000 --- "a/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" +++ /dev/null @@ -1,604 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 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", - "\n", - "\n", - "## 本次内容要点\n", - "* 图片处理模块 PIL \n", - "* 思考一下" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "### PIL (Pillow) 模块介绍\n", - "\n", - "PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。\n", - "\n", - "由于 PIL 仅支持到 Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用 Pillow。\n", - "\n", - "##### 安装 Pillow\n", - "\n", - "Pillow(PIL)的最新版本是 3.4.2,如果安装了 anaconda,已经默认安装了 Pillow 组件。\n", - "\n", - "在 python 3.4 之后,默认带了安装组件包的工具程序 pip,用 `pip install pilllow` 命令即可安装。\n", - "\n", - "需要准备一张用来测试的图片,最好是 jpg 格式,然后命名为 test.jpg,保存在 python 同样目录或者可以比较方面访问到的目录。" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "JPEG (600, 400) RGB\n" - ] - } - ], - "source": [ - "# 读取照片\n", - "\n", - "# 导入 PIL 的 Image 模块\n", - "from PIL import Image\n", - "# 打开一个图片文件\n", - "img = Image.open('test.jpg')\n", - "print(img.format, img.size, img.mode)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAA8ADwAAD/4QL+RXhpZgAATU0AKgAAAAgACQEPAAIAAAAGAAAAegEQAAIA\nAAAVAAAAgAESAAMAAAABAAEAAAEaAAUAAAABAAAAlgEbAAUAAAABAAAAngEoAAMAAAABAAIAAAEx\nAAIAAAAqAAAApgEyAAIAAAAUAAAA0IdpAAQAAAABAAAA5AAAAABDYW5vbgBDYW5vbiBFT1MgNUQg\nTWFyayBJSQAAAAAA8AAAAAEAAADwAAAAAUFkb2JlIFBob3Rvc2hvcCBMaWdodHJvb20gNi43IChN\nYWNpbnRvc2gpADIwMTY6MTA6MDUgMjI6MTU6NDAAAB2CmgAFAAAAAQAAAkaCnQAFAAAAAQAAAk6I\nIgADAAAAAQABAACIJwADAAAAAQBkAACQAAAHAAAABDAyMzCQAwACAAAAFAAAAlaQBAACAAAAFAAA\nAmqSAQAKAAAAAQAAAn6SAgAFAAAAAQAAAoaSBAAKAAAAAQAAAo6SBQAFAAAAAQAAApaSBwADAAAA\nAQAFAACSCQADAAAAAQAQAACSCgAFAAAAAQAAAp6SkQACAAAAAzU0AACSkgACAAAAAzU0AACgAQAD\nAAAAAQABAACgAgAEAAAAAQAAAligAwAEAAAAAQAAAZCiDgAFAAAAAQAAAqaiDwAFAAAAAQAAAq6i\nEAADAAAAAQACAACkAQADAAAAAQAAAACkAgADAAAAAQABAACkAwADAAAAAQAAAACkBgADAAAAAQAA\nAACkMQACAAAACwAAArakMgAFAAAABAAAAsKkNAACAAAAEwAAAuIAAAAAAAAAAQAAA+gAAAAEAAAA\nATIwMTY6MTA6MDUgMTI6Mjc6MDkAMjAxNjoxMDowNSAxMjoyNzowOQAAACNFAAADigAAAAQAAAAB\nAAAAAAAAAAEAAAAEAAAAAQAAABEAAAABAAHwMAAAACEACNNlAAAAlDI0MzE0MDM0NDkAAAAAABEA\nAAABAAAAKAAAAAEAAAAAAAAAAQAAAAAAAAABRUYxNy00MG1tIGYvNEwgVVNNAAD/4Se8aHR0cDov\nL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENl\naGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4\nOnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53\nMy5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFi\nb3V0PSIiIHhtbG5zOmNycz0iaHR0cDovL25zLmFkb2JlLmNvbS9jYW1lcmEtcmF3LXNldHRpbmdz\nLzEuMC8iIHhtbG5zOmF1eD0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC9hdXgvIiB4bWxu\nczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8v\nbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNv\nbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9i\nZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJs\nLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5j\nb20vcGhvdG9zaG9wLzEuMC8iIGNyczpTaGFycGVuRGV0YWlsPSIyNSIgY3JzOlVwcmlnaHRWZXJz\naW9uPSIxNTEzODgxNjAiIGNyczpCbGFja3MyMDEyPSIwIiBjcnM6VXByaWdodFRyYW5zZm9ybV80\nPSIxLjA1MzExNzExNSwwLjAyNDQ4MDE1NiwtMC4wMzkwMjU4NzksLTAuMDU5Mzk0MTQ3LDEuMDUx\nNjIwNTcyLDAuMDAyMjAwMTI3LC0wLjAwMDE1ODUzOSwtMC4wMDMyMTk4MTQsMS4wMDAwMDAwMDAi\nIGNyczpMdW1pbmFuY2VBZGp1c3RtZW50T3JhbmdlPSIwIiBjcnM6SHVlQWRqdXN0bWVudFllbGxv\ndz0iMCIgY3JzOlNhdHVyYXRpb25BZGp1c3RtZW50Qmx1ZT0iMCIgY3JzOlBhcmFtZXRyaWNIaWdo\nbGlnaHRTcGxpdD0iNzUiIGNyczpMZW5zUHJvZmlsZUVuYWJsZT0iMSIgY3JzOkxlbnNQcm9maWxl\nRGlzdG9ydGlvblNjYWxlPSIxMDAiIGNyczpQb3N0Q3JvcFZpZ25ldHRlTWlkcG9pbnQ9IjUwIiBj\ncnM6U3BsaXRUb25pbmdTaGFkb3dTYXR1cmF0aW9uPSIwIiBjcnM6Q3JvcEFuZ2xlPSItMS4wNjQ4\nMSIgY3JzOkNvbnZlcnRUb0dyYXlzY2FsZT0iRmFsc2UiIGNyczpDb250cmFzdDIwMTI9IjAiIGNy\nczpVcHJpZ2h0VHJhbnNmb3JtXzI9IjAuODkyNTY5MDQ4LDAuMDIwODM2MzUyLC0wLjA2MDUwMjEw\nNywtMC4xNDg4OTMyMzQsMC45ODM5OTczMTUsMC4wMTAwOTIwNzYsLTAuMTk4Njg5Mjc4LC0wLjAw\nNzgxMTA4NCwxLjAwMDAwMDAwMCIgY3JzOkhpZ2hsaWdodHMyMDEyPSItNTUiIGNyczpXaGl0ZUJh\nbGFuY2U9IkFzIFNob3QiIGNyczpQb3N0Q3JvcFZpZ25ldHRlSGlnaGxpZ2h0Q29udHJhc3Q9IjAi\nIGNyczpTaGFycG5lc3M9IjQ3IiBjcnM6U3BsaXRUb25pbmdIaWdobGlnaHRIdWU9IjAiIGNyczpT\nYXR1cmF0aW9uQWRqdXN0bWVudEFxdWE9IjAiIGNyczpQZXJzcGVjdGl2ZVNjYWxlPSIxMDAiIGNy\nczpQZXJzcGVjdGl2ZVZlcnRpY2FsPSIwIiBjcnM6UG9zdENyb3BWaWduZXR0ZUZlYXRoZXI9IjUw\nIiBjcnM6VXByaWdodENlbnRlck5vcm1YPSIwLjU3OTcwNCIgY3JzOlVwcmlnaHRUcmFuc2Zvcm1f\nMD0iMS4wMDAwMDAwMDAsMC4wMDAwMDAwMDAsMC4wMDAwMDAwMDAsMC4wMDAwMDAwMDAsMS4wMDAw\nMDAwMDAsMC4wMDAwMDAwMDAsMC4wMDAwMDAwMDAsMC4wMDAwMDAwMDAsMS4wMDAwMDAwMDAiIGNy\nczpVcHJpZ2h0VHJhbnNmb3JtQ291bnQ9IjYiIGNyczpQYXJhbWV0cmljU2hhZG93U3BsaXQ9IjI1\nIiBjcnM6THVtaW5hbmNlQWRqdXN0bWVudEdyZWVuPSIwIiBjcnM6UGVyc3BlY3RpdmVSb3RhdGU9\nIjAuMCIgY3JzOlNwbGl0VG9uaW5nU2hhZG93SHVlPSIwIiBjcnM6THVtaW5hbmNlQWRqdXN0bWVu\ndFllbGxvdz0iMCIgY3JzOlNoYWRvd3MyMDEyPSItOSIgY3JzOkxlbnNQcm9maWxlU2V0dXA9Ikxl\nbnNEZWZhdWx0cyIgY3JzOldoaXRlczIwMTI9IjAiIGNyczpQZXJzcGVjdGl2ZUhvcml6b250YWw9\nIjAiIGNyczpMZW5zUHJvZmlsZUZpbGVuYW1lPSJDYW5vbiBFT1MtMURzIE1hcmsgSUlJIChDYW5v\nbiBFRiAxNy00MG1tIGY0IEwgVVNNKS5sY3AiIGNyczpDYW1lcmFQcm9maWxlPSJFbWJlZGRlZCIg\nY3JzOlNhdHVyYXRpb25BZGp1c3RtZW50WWVsbG93PSIwIiBjcnM6UGFyYW1ldHJpY01pZHRvbmVT\ncGxpdD0iNTAiIGNyczpVcHJpZ2h0RGVwZW5kZW50RGlnZXN0PSJCQkMzQ0RCMjYxMEU2RUQyREE5\nMTk1OEFENUM0QUFCNyIgY3JzOkNyb3BUb3A9IjAuMDI3MTI0IiBjcnM6UGFyYW1ldHJpY0hpZ2hs\naWdodHM9IjAiIGNyczpEZWZyaW5nZUdyZWVuQW1vdW50PSIwIiBjcnM6UGFyYW1ldHJpY0Rhcmtz\nPSIwIiBjcnM6SW5jcmVtZW50YWxUaW50PSIwIiBjcnM6U2hhcnBlblJhZGl1cz0iKzEuMCIgY3Jz\nOlZpYnJhbmNlPSIwIiBjcnM6TGVuc1Byb2ZpbGVWaWduZXR0aW5nU2NhbGU9IjEwMCIgY3JzOlNo\nYWRvd1RpbnQ9IjAiIGNyczpIYXNDcm9wPSJUcnVlIiBjcnM6THVtaW5hbmNlU21vb3RoaW5nPSIw\nIiBjcnM6VG9uZUN1cnZlTmFtZTIwMTI9IkxpbmVhciIgY3JzOlNwbGl0VG9uaW5nSGlnaGxpZ2h0\nU2F0dXJhdGlvbj0iMCIgY3JzOkRlZnJpbmdlUHVycGxlSHVlSGk9IjcwIiBjcnM6VXByaWdodFRy\nYW5zZm9ybV81PSIxLjAwMDAwMDAwMCwwLjAwMDAwMDAwMCwwLjAwMDAwMDAwMCwwLjAwMDAwMDAw\nMCwxLjAwMDAwMDAwMCwwLjAwMDAwMDAwMCwwLjAwMDAwMDAwMCwwLjAwMDAwMDAwMCwxLjAwMDAw\nMDAwMCIgY3JzOlVwcmlnaHRGb3VyU2VnbWVudHNDb3VudD0iMCIgY3JzOlNhdHVyYXRpb25BZGp1\nc3RtZW50T3JhbmdlPSIwIiBjcnM6Q3JvcENvbnN0cmFpblRvV2FycD0iMCIgY3JzOlNoYXJwZW5F\nZGdlTWFza2luZz0iNzkiIGNyczpCbHVlU2F0dXJhdGlvbj0iMCIgY3JzOkh1ZUFkanVzdG1lbnRH\ncmVlbj0iMCIgY3JzOlZpZ25ldHRlQW1vdW50PSIwIiBjcnM6UG9zdENyb3BWaWduZXR0ZVJvdW5k\nbmVzcz0iMCIgY3JzOlJlZFNhdHVyYXRpb249IjAiIGNyczpQYXJhbWV0cmljTGlnaHRzPSIwIiBj\ncnM6UmVkSHVlPSIwIiBjcnM6U3BsaXRUb25pbmdCYWxhbmNlPSIwIiBjcnM6SHVlQWRqdXN0bWVu\ndFB1cnBsZT0iMCIgY3JzOlVwcmlnaHRUcmFuc2Zvcm1fMz0iMS4wNDk3ODQzNTQsMC4wMjM3ODg2\nNTcsLTAuMDM2Nzg2NTA2LC0wLjA1MzUyNDQ3OCwxLjA0OTc4NDM1NCwwLjAwMTg3MDA2MiwwLjAw\nMDAwMDAwMCwwLjAwMDAwMDAwMCwxLjAwMDAwMDAwMCIgY3JzOkRlaGF6ZT0iMCIgY3JzOlRvbmVD\ndXJ2ZU5hbWU9IkxpbmVhciIgY3JzOkV4cG9zdXJlMjAxMj0iMC4wMCIgY3JzOlVwcmlnaHRDZW50\nZXJNb2RlPSIwIiBjcnM6U2F0dXJhdGlvbkFkanVzdG1lbnRHcmVlbj0iMCIgY3JzOlBvc3RDcm9w\nVmlnbmV0dGVTdHlsZT0iMSIgY3JzOkh1ZUFkanVzdG1lbnRCbHVlPSIwIiBjcnM6Q3JvcFJpZ2h0\nPSIwLjk5MjQ2NiIgY3JzOkx1bWluYW5jZUFkanVzdG1lbnRQdXJwbGU9IjAiIGNyczpQZXJzcGVj\ndGl2ZVk9IjAuMDAiIGNyczpQZXJzcGVjdGl2ZUFzcGVjdD0iMCIgY3JzOlBlcnNwZWN0aXZlVXBy\naWdodD0iMSIgY3JzOlBhcmFtZXRyaWNTaGFkb3dzPSIwIiBjcnM6UG9zdENyb3BWaWduZXR0ZUFt\nb3VudD0iLTE1IiBjcnM6Qmx1ZUh1ZT0iMCIgY3JzOkNsYXJpdHkyMDEyPSIrMTYiIGNyczpVcHJp\nZ2h0Q2VudGVyTm9ybVk9IjAuNTAwNjk0IiBjcnM6QXV0b0xhdGVyYWxDQT0iMCIgY3JzOkdyYWlu\nQW1vdW50PSIwIiBjcnM6VXByaWdodEZvY2FsTGVuZ3RoMzVtbT0iMjMuMDkwNiIgY3JzOlVwcmln\naHRUcmFuc2Zvcm1fMT0iMS4wNTUzMDIyNTUsMC4wMjU5NDI2MjEsLTAuMDQxOTM1NTYzLC0wLjA1\nNDk2MjkxNiwxLjA1MTQ2MjgxNCwwLjAwMjE3ODM0MywtMC4wMDI4Nzg3MTksMC4wMDM0MTU5OTEs\nMS4wMDAwMDAwMDAiIGNyczpIdWVBZGp1c3RtZW50QXF1YT0iMCIgY3JzOlByb2Nlc3NWZXJzaW9u\nPSI2LjciIGNyczpMZW5zUHJvZmlsZURpZ2VzdD0iNjNBM0Y3Rjk4RUE2QUJDRDJENTQ4NTZDNkYw\nRDA5MUMiIGNyczpBbHJlYWR5QXBwbGllZD0iVHJ1ZSIgY3JzOlVwcmlnaHRQcmV2aWV3PSJGYWxz\nZSIgY3JzOkF1dG9XaGl0ZVZlcnNpb249IjEzNDM0ODgwMCIgY3JzOkxlbnNQcm9maWxlTmFtZT0i\nQWRvYmUgKENhbm9uIEVGIDE3LTQwbW0gZi80IEwgVVNNKSIgY3JzOkx1bWluYW5jZUFkanVzdG1l\nbnRCbHVlPSIwIiBjcnM6U2F0dXJhdGlvbj0iMCIgY3JzOlRvbmVNYXBTdHJlbmd0aD0iMCIgY3Jz\nOkxlbnNQcm9maWxlQ2hyb21hdGljQWJlcnJhdGlvblNjYWxlPSIxMDAiIGNyczpMdW1pbmFuY2VB\nZGp1c3RtZW50UmVkPSIwIiBjcnM6SW5jcmVtZW50YWxUZW1wZXJhdHVyZT0iMCIgY3JzOkNvbG9y\nTm9pc2VSZWR1Y3Rpb249IjAiIGNyczpHcmVlbkh1ZT0iMCIgY3JzOkh1ZUFkanVzdG1lbnRNYWdl\nbnRhPSIwIiBjcnM6SGFzU2V0dGluZ3M9IlRydWUiIGNyczpTYXR1cmF0aW9uQWRqdXN0bWVudFJl\nZD0iMCIgY3JzOkh1ZUFkanVzdG1lbnRSZWQ9IjAiIGNyczpIdWVBZGp1c3RtZW50T3JhbmdlPSIw\nIiBjcnM6TGVuc01hbnVhbERpc3RvcnRpb25BbW91bnQ9IjAiIGNyczpHcmVlblNhdHVyYXRpb249\nIjAiIGNyczpDcm9wTGVmdD0iMC4wMDc1MzQiIGNyczpEZWZyaW5nZVB1cnBsZUh1ZUxvPSIzMCIg\nY3JzOkRlZnJpbmdlR3JlZW5IdWVIaT0iNjAiIGNyczpTYXR1cmF0aW9uQWRqdXN0bWVudFB1cnBs\nZT0iMCIgY3JzOlNhdHVyYXRpb25BZGp1c3RtZW50TWFnZW50YT0iMCIgY3JzOkx1bWluYW5jZUFk\nanVzdG1lbnRBcXVhPSIwIiBjcnM6VmVyc2lvbj0iOS43IiBjcnM6UGVyc3BlY3RpdmVYPSIwLjAw\nIiBjcnM6RGVmcmluZ2VHcmVlbkh1ZUxvPSI0MCIgY3JzOkRlZnJpbmdlUHVycGxlQW1vdW50PSIw\nIiBjcnM6Q3JvcEJvdHRvbT0iMC45NzI4NzYiIGNyczpMdW1pbmFuY2VBZGp1c3RtZW50TWFnZW50\nYT0iMCIgY3JzOlVwcmlnaHRGb2NhbE1vZGU9IjAiIGF1eDpGbGFzaENvbXBlbnNhdGlvbj0iMC8x\nIiBhdXg6TGVuc0lEPSIyMzEiIGF1eDpMZW5zSW5mbz0iMTcvMSA0MC8xIDAvMCAwLzAiIGF1eDpT\nZXJpYWxOdW1iZXI9IjI0MzE0MDM0NDkiIGF1eDpGaXJtd2FyZT0iMi4xLjEiIGF1eDpBcHByb3hp\nbWF0ZUZvY3VzRGlzdGFuY2U9IjM3Mi8xMDAiIGF1eDpJbWFnZU51bWJlcj0iMCIgYXV4OkxlbnM9\nIkVGMTctNDBtbSBmLzRMIFVTTSIgeG1wOk1vZGlmeURhdGU9IjIwMTYtMTAtMDVUMjI6MTU6NDAr\nMDk6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTYtMTAtMDVUMjI6MTU6NDArMDk6MDAiIHhtcDpD\ncmVhdGVEYXRlPSIyMDE2LTEwLTA1VDEyOjI3OjA5LjU0IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2Jl\nIFBob3Rvc2hvcCBMaWdodHJvb20gNi43IChNYWNpbnRvc2gpIiB4bXA6UmF0aW5nPSIxIiB4bXBN\nTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjM5NzA2ZjJhLTdlZWItNGZkMC05ODg2LTY0M2ZlNmZlNGUy\nZiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozOTcwNmYyYS03ZWViLTRmZDAtOTg4Ni02NDNm\nZTZmZTRlMmYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0iN0RBQ0RGRkYzQUQ2NDgxQjU4QzNE\nNDA4RTY0QTExRTkiIGRjOmZvcm1hdD0iaW1hZ2UvanBlZyIgcGhvdG9zaG9wOkRhdGVDcmVhdGVk\nPSIyMDE2LTEwLTA1VDEyOjI3OjA5LjU0Ij4gPGNyczpUb25lQ3VydmVCbHVlPiA8cmRmOlNlcT4g\nPHJkZjpsaT4wLCAwPC9yZGY6bGk+IDxyZGY6bGk+MjU1LCAyNTU8L3JkZjpsaT4gPC9yZGY6U2Vx\nPiA8L2NyczpUb25lQ3VydmVCbHVlPiA8Y3JzOlRvbmVDdXJ2ZUdyZWVuPiA8cmRmOlNlcT4gPHJk\nZjpsaT4wLCAwPC9yZGY6bGk+IDxyZGY6bGk+MjU1LCAyNTU8L3JkZjpsaT4gPC9yZGY6U2VxPiA8\nL2NyczpUb25lQ3VydmVHcmVlbj4gPGNyczpUb25lQ3VydmVQVjIwMTJSZWQ+IDxyZGY6U2VxPiA8\ncmRmOmxpPjAsIDA8L3JkZjpsaT4gPHJkZjpsaT4yNTUsIDI1NTwvcmRmOmxpPiA8L3JkZjpTZXE+\nIDwvY3JzOlRvbmVDdXJ2ZVBWMjAxMlJlZD4gPGNyczpUb25lQ3VydmVQVjIwMTI+IDxyZGY6U2Vx\nPiA8cmRmOmxpPjAsIDA8L3JkZjpsaT4gPHJkZjpsaT4yNTUsIDI1NTwvcmRmOmxpPiA8L3JkZjpT\nZXE+IDwvY3JzOlRvbmVDdXJ2ZVBWMjAxMj4gPGNyczpUb25lQ3VydmU+IDxyZGY6U2VxPiA8cmRm\nOmxpPjAsIDA8L3JkZjpsaT4gPHJkZjpsaT4yNTUsIDI1NTwvcmRmOmxpPiA8L3JkZjpTZXE+IDwv\nY3JzOlRvbmVDdXJ2ZT4gPGNyczpHcmFkaWVudEJhc2VkQ29ycmVjdGlvbnM+IDxyZGY6U2VxPiA8\ncmRmOmxpPiA8cmRmOkRlc2NyaXB0aW9uIGNyczpMb2NhbERlZnJpbmdlPSIwLjAwMDAwMCIgY3Jz\nOkxvY2FsVG9uaW5nSHVlPSIyMzAuMDAwMDAwIiBjcnM6TG9jYWxDb250cmFzdDIwMTI9IjAuMDAw\nMDAwIiBjcnM6TG9jYWxUaW50PSIwLjAwMDAwMCIgY3JzOkxvY2FsV2hpdGVzMjAxMj0iMC4wMDAw\nMDAiIGNyczpMb2NhbEx1bWluYW5jZU5vaXNlPSIwLjAwMDAwMCIgY3JzOkxvY2FsSGlnaGxpZ2h0\nczIwMTI9IjAuMDAwMDAwIiBjcnM6TG9jYWxCcmlnaHRuZXNzPSIwLjAwMDAwMCIgY3JzOkxvY2Fs\nVG9uaW5nU2F0dXJhdGlvbj0iMS4wMDAwMDAiIGNyczpDb3JyZWN0aW9uQWN0aXZlPSJ0cnVlIiBj\ncnM6TG9jYWxTYXR1cmF0aW9uPSIwLjAwMDAwMCIgY3JzOkxvY2FsRGVoYXplPSIwLjAwMDAwMCIg\nY3JzOkNvcnJlY3Rpb25BbW91bnQ9IjEuMDAwMDAwIiBjcnM6TG9jYWxTaGFycG5lc3M9IjAuMDAw\nMDAwIiBjcnM6TG9jYWxDbGFyaXR5MjAxMj0iMC4yNTM2MjMiIGNyczpMb2NhbE1vaXJlPSIwLjAw\nMDAwMCIgY3JzOkxvY2FsRXhwb3N1cmUyMDEyPSIwLjAwMDAwMCIgY3JzOkxvY2FsU2hhZG93czIw\nMTI9IjAuMDAwMDAwIiBjcnM6V2hhdD0iQ29ycmVjdGlvbiIgY3JzOkxvY2FsQmxhY2tzMjAxMj0i\nMC4wMDAwMDAiIGNyczpMb2NhbFRlbXBlcmF0dXJlPSIwLjAwMDAwMCI+IDxjcnM6Q29ycmVjdGlv\nbk1hc2tzPiA8cmRmOlNlcT4gPHJkZjpsaSBjcnM6WmVyb1g9IjAuNTE5MDcyIiBjcnM6V2hhdD0i\nTWFzay9HcmFkaWVudCIgY3JzOlplcm9ZPSIwLjQ0MzI5NCIgY3JzOkZ1bGxZPSIwLjAyMzk4OSIg\nY3JzOk1hc2tWYWx1ZT0iMS4wMDAwMDAiIGNyczpGdWxsWD0iMC41MjYzNjAiLz4gPC9yZGY6U2Vx\nPiA8L2NyczpDb3JyZWN0aW9uTWFza3M+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpsaT4gPC9y\nZGY6U2VxPiA8L2NyczpHcmFkaWVudEJhc2VkQ29ycmVjdGlvbnM+IDxjcnM6VG9uZUN1cnZlUmVk\nPiA8cmRmOlNlcT4gPHJkZjpsaT4wLCAwPC9yZGY6bGk+IDxyZGY6bGk+MjU1LCAyNTU8L3JkZjps\naT4gPC9yZGY6U2VxPiA8L2NyczpUb25lQ3VydmVSZWQ+IDxjcnM6VG9uZUN1cnZlUFYyMDEyR3Jl\nZW4+IDxyZGY6U2VxPiA8cmRmOmxpPjAsIDA8L3JkZjpsaT4gPHJkZjpsaT4yNTUsIDI1NTwvcmRm\nOmxpPiA8L3JkZjpTZXE+IDwvY3JzOlRvbmVDdXJ2ZVBWMjAxMkdyZWVuPiA8Y3JzOlRvbmVDdXJ2\nZVBWMjAxMkJsdWU+IDxyZGY6U2VxPiA8cmRmOmxpPjAsIDA8L3JkZjpsaT4gPHJkZjpsaT4yNTUs\nIDI1NTwvcmRmOmxpPiA8L3JkZjpTZXE+IDwvY3JzOlRvbmVDdXJ2ZVBWMjAxMkJsdWU+IDx4bXBN\nTTpEZXJpdmVkRnJvbSBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9IjdEQUNERkZGM0FENjQ4MUI1\nOEMzRDQwOEU2NEExMUU5IiBzdFJlZjpkb2N1bWVudElEPSI3REFDREZGRjNBRDY0ODFCNThDM0Q0\nMDhFNjRBMTFFOSIvPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0\naW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJzYXZlZCB0byBuZXcgbG9jYXRpb24iLz4g\nPHJkZjpsaSBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgTGlnaHRyb29tIDYu\nNyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIgc3RFdnQ6d2hlbj0iMjAxNi0xMC0wNVQy\nMjoxNTo0MCswOTowMCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDozOTcwNmYyYS03ZWViLTRm\nZDAtOTg4Ni02NDNmZTZmZTRlMmYiIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiLz4gPC9yZGY6U2VxPiA8\nL3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRh\nPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/\neHBhY2tldCBlbmQ9InciPz4A/+0AeFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAA/HAFaAAMbJUcc\nAgAAAgACHAI/AAYxMjI3MDkcAj4ACDIwMTYxMDA1HAI3AAgyMDE2MTAwNRwCPAAGMTIyNzA5ADhC\nSU0EJQAAAAAAEGnhLJkfwXb+574oOgGfa4P/wAARCAGQAlgDAREAAhEBAxEB/8QAHwAAAQUBAQEB\nAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1Fh\nByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZ\nWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG\nx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAEC\nAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHB\nCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0\ndXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX\n2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9sAQwABAQEBAQECAQECAwICAgMDAwMDAwMEBAQEBAQEBQQE\nBAQEBAUGBQUFBQUGBwcHBwcHCAgICAgICAgICAgICAgI/9sAQwEBAgIEAgQHBAQHCAcHBwgICAgI\nCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI/90ABABL/9oADAMB\nAAIRAxEAPwD+oUIP8/8A66/cD8vJghPJoAlVPSgCUR/5/wAmgCYIT1qeYCRU9KnmAmCev+f1qL3K\nsSBD2pFcpIEAoKsTKhxQUPCAUAShD3/z+tQ5AP8ALGM4zU8wGfdxuSMfyrrptHlVk2ytb2bPJnqD\nW0p2Rywpcx0kEARMYrzW7nuxjZFoRnvUm3KSrH7fnSuVYlEdRzFEoi9qm4Eyxf5NSBMsJPSmA9Ys\n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\n9lzcT+XI8uIy24qcNjrpKVSnya209Olnq/S7t2vc9Kq4yfPGN1prom9HbvfR7dRuleK/g1ZarbaR\nZ+NrfSViuZIb69t9KvQ29lDPawXsqi0ncrsUJOGIxLIBsOytaeFjWlKc3L+WOjjypbys9HdrtpHb\nRlVISlokttfeTV7bWVtu6emzPjDwH4t0fx5bXHiGXWLnRo4orgOYLfzCb6SVgwRBIGnWK3yzxxiN\n1UMke52iFex9XlCKeid09Oy2be97aemnQ5KlVcqce2jd3y2V3ddel7O59XePfiN4c0FL2aKf/hId\nN0+Tw/oflQXMkEF5qkqNLeLcO1xCLo486aSNiHK4jDAgEdioOe+3W+3fWy6/d30OxSburelt0tr9\nNFpb/PQ8l1i68e/2/PrPwN1fTzFZ6bqWmroPh2eQambS4uAL+4Y7xJ5cjwqfJiLyJEqxwb87aeDh\nyxd3Zu+ze3RbXT3svTXQjFcya93mjZb63l38156dbrU1fHf7PWo/C3/iqfEKf2xrMgtZtZsZ/LnG\nl3M0kIjtdTkQiOO4uIZGne2XKQfKkskcjKgJx5lZ7O3Na3M9dmuqs+/po7kKo1rbr7u6VtbtN6Kz\nVtfxe3hfxM1I65oOo6/o8EtlbWSRPM0LqshE7yQxyPGZHUDyZFGYzJ99mYxrjHPh8I6XVyWvxWur\nybW3LtokuyXmzLlkrOTbvpaT69tb79PuOh8MrPbeD28T6VdLD/YFjsktkg8yRm4RfMUlPs5jBEvm\nn5ApUeWGYMPItVxCnCcdnbvGWz+V72fZ3OTD4irVqK94qzj7uyemrvq30toc/wDCf4ky+GJdX12X\nQ7ucaJI/mziSC4kSaf8A0lg8TxIA+zLDGWXjyiNoB9xYV6cqaVrP3ei/Ltpf5GUW03HzV9fwsutn\n8vM+vI7+48FReMfD3h+w1DXr7U7G71LWnEKCKGzv1tLd7Wae3iZmTU1VZ9zFCkqhEVizNXXVb5I3\nsnzWa11V7aKW65Xt0b13Ilh3Slo3o1ZperT8mnqvnt1+G/hn4i8Y+IviysPibUbGyRtQmlvbbU7e\nc2dpOIniIn+wJ9ojaP5YyiuyxEtuyAzD0oYZc2iXW1+/V2/X8Dq9o6d+SS5bK7futq+sU91d63kr\n6Ndj640bwv8AHODxppfhrXvDd9p1pptw0t9caj9kW1+x28wzII1fffWt8zxxRMGMMhchHDpsrz6+\n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\nT0HWtoEydkf/2Q==\n", - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 在 IPython 状态下显示图片 \n", - "# 使用 IDLE 或者其他python 运行环境的可以用电脑自带的程序检查图片\n", - "\n", - "from IPython.display import Image as img\n", - "img(filename='test.jpg') " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "create thumbnail ok\n" - ] - } - ], - "source": [ - "# 生成缩略图\n", - "\n", - "from PIL import Image\n", - "\n", - "# 设定缩略图大小\n", - "size = (100, 100)\n", - "\n", - "try:\n", - " # 打开图片\n", - " img = Image.open('test.jpg')\n", - " # 生成缩略图\n", - " img.thumbnail(size)\n", - " # 保存缩略图图片\n", - " img.save('test_thumbnail.jpg', 'JPEG')\n", - " print('create thumbnail ok')\n", - "except IOError:\n", - " print('cannot create thumbnail for')" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABCAGQDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1ZY6k\nWOpliBPvU6RV0OZjyldYfaplgqysVShKlzKUSkbRG7VKsAAwBVkhUGWOBUDXadEBJpczYWSE8mmt\nGqjnikinmlk2kBR7ioftUv8Aby2ZSIwG380vk7t27H0xT1QaMmMOV4796rLp1tFGVWBDxgkjJP1N\naYwxOMYFRSyxRozswAHehTlshOK3ZymtaJcXaoIxDbwR5IGep+lYru1qgtoJDNM3yhk6nPpXTXuo\npOxVN5ToTjr+FZsFwYbwzLEm5RhS3Qe9etRnNQtJHnVYw5rxZQXQNeYbkVIlPO1nGR9aK1JNSvGc\nkSEj24FFP2lb+79wvZ0u7+86hEwOmfpUowBn9K8p03xZrdlp6CYzTxRc+YgViQOobODj8KhvfiZr\n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\nmAETAH3RRRRQM//Z\n", - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image as img\n", - "img(filename='test_thumbnail.jpg')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "crop image ok\n" - ] - } - ], - "source": [ - "# 裁剪图片\n", - "\n", - "from PIL import Image\n", - "\n", - "# 设定裁剪的大小\n", - "box = (0, 0, 200, 200)\n", - "\n", - "try:\n", - " img = Image.open('test.jpg')\n", - " # 生成裁剪图片\n", - " region = img.crop(box)\n", - " region.save('test_crop.jpg', 'JPEG')\n", - " print('crop image ok')\n", - "except:\n", - " print('something wrong')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADIAMgDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1HFFL\nS4rsOYTFLilxRigBMUtLijFABiilxS0DExRilpcUgEoxS4pcUAJimsDT8UYouJojC81IBxQFpwob\nBITFLilxS4pFCYoxTsUuKAG4pcUuKXFADcUuKdilxSuMhK0VNtzRTuTYo4oxS4pcUwExRinYoxQA\nmKXFLijFACYpcUuKXFIYmKMUuKXFACYpcUuKXFADcUuKdijFIBMUuKXFLigYmKXFKBS4ouA3FLin\nYpcUrgNxS4p+KXFFx2GYpcU/FGKVwG4op+KKLgZuKXFLijFWSJilxS4pcUgExRilxS4ouAmKXFLi\njFFxiYpcUuKUCgBMUuKXFLilcBAKUCnAUuKLjG4pQKdilxSuA0CnYpcUuKLgJilxSgUoFIYmKXFL\nilxQA3FLinYpcUrgNxRT8UUXGZWKXFLilxV3IGZ5wetNEo3Ec/lUuKQRqDnFO6E0+g0SITgEE1Ji\nojaoZNwyPYVOBSdugK/UTFLilxS4pXKEApcUuKUCgBMUuKUCnYpXGNxSgU4ClAoAQClxSgU7FK4x\nuKXFOxRigBMUuKUClxSATFLilxS4oAbilxTsUYoGJiinYoouBlYpcUuKMVRImKXFLilxQAmKXFLi\nlAoATFKBS4pcUrgJinAUoFLigYgFLilxTsUXAbinYpcUuKQCAUuKUClxQMTFLilxS4pAJijFLilx\nQAmKXFGKXFACYpcUuKKQCYopcUUAZeKXFLilqhDRzTsUwvg4xT1INMSaFxS4pcUoFIYmKdigCnYo\nuMQClxSgUuKQCYp2KXFLigBMUuKXFLigBMUuKMUuKQwxRilpcUAJijFLRigAopaKADFFLiigBKKW\nigDNo4NRZYnrUqdKpolO4nljOacEwc07FLilcdkGKUClxSgUgExTsUYpQKBgBS4opaAAClxS4ooA\nMUtJuFG8UAOxRim7qUmgB1FMznvTxQAtFLiikAUUUtACUuKTcO5pjSAUASUVAZ8dKKdmK6KITFSL\n0pQvFJgg073Faw+lApoNPApFBilAoxS0ALik3KDgnmnCojAWfcW/KheYnfoSjmnUAY4oOR060hi0\nhOBSEkDJFNzup2AYzEVEZDVrYDTGtg3fFVdEtMgEpFSpMDTJLVh93mofLdT0NGjFqi+rBqkArOV3\nWpftDAUmiky7S1QF22aDdsTS5WHMi/mmMwAqn9oPrR5hanYOYkkkqHcxp4UsanSAYyaexNmyoQxN\nFX/JXHAopcw+UqUtRwy+ZAjnqygnAxzUoqSgoJA60tIUDdTQBG8uOlR+Ye9WRGo5xT9oIwQD9aq6\nRPKxkTZFS1AUKPkfd9qlVsg0mNMfSd6i83NKMnnINFguSMwUc1WL81ORkYKmonh9BVRsJ3Gxy7W9\nqto6v0NVBHjk1JGdp4okkCZaoIB6im7gMZPWhmGOCKgsjkjUDgc0zyQ3SnkZ781Kq7ad7E2uVjbe\n1RvbEdqv0HHcUczHyozxCT2qRYG9KthR1p1HMLlIY4sdamopM1JQtFFFAHI+F9ctdb+1m0eRoozG\nB5gwT8uCQPTIP5V0CkFmAPI6ivCPCvjKbTxPZQTLbLEzysWi3AruBK5B44GM11PhLxnLc67dC9nx\nFPMUjB4AHO0jPX0pp3B7nqQFLiqFvdi4hEsThlLEZHscUtxqC2kLSzNhFUsTjoB1NPkZPMupfpa4\n29+Imm2lgLyGNruJmCr5LZ3DP3s9OnNdXbXcV1bxzxHMcihlPqDQ4NK4KSehYxUbKQCVoMlKJBjJ\nwF9TRZoehEImNTJEqe5qpe6lBZ20szSKFjXcTnt/n+dMh1DzIlmJUq+zaUOR8xwP6GnqxKxp0hGa\nqy3PkQtNJIqqPU9ahXWLD+0Dpz3kSXoVWERYAtn0H4GptYdyxIU3FVdS2eV3ciljU153p3ma74s1\nO8srsxeTJjeynC44bjqTxjFdxo2s22qI6RE+ZGdrgrjkdf1p3ElfU0SpIqJo2UZqznHWk3A8Ukx2\nII+ozmrI6ZqFkctxxTImE8CyRl8MONwx+hpsETs2BVV5yMgGpPJdx8z8elOW3hTg8k+poVkJ3ZV+\n0MD1qRbraMMRnBwD1OOTgd6nUQBtqhcis7XrUz6XMbaVoJUjk2zRgb4yUYZGfrQ2uwJeZeV5ZI1c\nKSrAMOxwfanK8i8lePemaezG0VWzlfl59qtHkYpXHYj80c+3WioygVjufIPUYop2QHzhBceHpIlk\nuNAvt5GMpfg8A+6AVp2Mnhaa4kuZbXxBbrHhzmaF03E4AAAznv8AgayW1PRXCol0saqoUAwSgDH1\nSrcUNtcwwra3+nuqkuwe4MbGQ8fdZRwF4B75NbSppLYhSbZ158TaXJbxW1p4g1uwijXaEjtI8fUn\nYTn8aiWO41OYwaf43uJLgoWEdzbhmK8BuDjjkZ+tYFpptzDdpKEhmRSDiK5jOfzIrpRdGfVtPjSK\ne1ly+WkCMoTbyeGPfA/GswcE3qVptI8UWdu9lDq9jNA6F/LazEanHqRnHGOa2dP8TeMYoFW60XTr\nu4kQmIx3nlFseqkHAxzwc+1SX1z9htZ5ryVbiExMh8pMEBhg55PqKp6J430yyto7S7aZmUbY1bDZ\nAUD+hqXJLdhGPVHcQ6tFKkYdWjkOA67CQD3AP1rF8U65Nb6esmkMZ7pHHmWylQ5B/wB5gBjg1yWt\n+K5pdQtk05D9mjfLOxwGPU5BPTrxXLfE++WW7ja2uVktXgG4RscKe4I6VPtIvZjNrXLnUL25mjMN\n19kuJ4yqGF/3QOAR8pxjjJ6g13umTXxsYVvEjhEJVlwOW27j0PYccmvnLT7uSOWMwXLQNF82ZXwj\nEdlA/lXW2fifVLeKB4ZFncxSRhnHKg46gHr6UKVmOx2HjvxIzakkNtqIQxxKyhXBBcnjp3H9a871\nnxNf3GuwarcJcQ3SqDG0gKnjIDKcDI64P1qndy6nqMZS4ElzcQKS5AAIQYyxwBkDIyfesTUGlWdI\nnuJJRFGqKGYnYvZFz0A9Peh6gkdFbeLNQi+1uLlx9owXG7GTnOePeu60TxdNFZqul2/kXMxUTyTS\nE+czHgoOw5OSf/r15BFulXYo3FiAAB39K27LUbuwSW0t5fJnZWjlMmCu3+6CehzUoZ9O6L9rj0i3\nF/MGu2XMuJNwDd8HjitESEd68W+GWpXSWNzcalJPLHGpa1WRscjluv6V6LZ+J7d7W2LZeS53OrKe\nAvXk89MgfjWiegmbd5dm1Wa6lkMcMUDFpAOVxyTiksZJxZWivub90N7tjJOOuB6msoX11c6UyLeW\n8d3M4IEig+VGWwV4Iy23OD6kHnpW1FIjAx+dGzL0KsDuHY0BrYnEnqaZNJtjZl5I6ZppBBqOUjyz\nk/xL/MU7CuOjH7+ZmJ6hfyH/ANeo9RdF0+5ZjhBGcnHQVzXiK6unvlhtNTayVImlkK4y259o6+gV\nq4u51bV4fDlrqkuuTNJclCYWCfIhJ3PzzhQM/XigD2a0BXeuO4PA9QP8DVh22KTXhsnjSSG7u1st\na1C9giRXjnTylWQFc9CAeufSuzttRvjbacXuiZbmHefmbggZPGfb9aTRVzsZJCTmisfT0upTMJrq\nUrG2wFTyT65Ofb86Kog80GmfD2Zx5K2e7Hd8Y9+GquPDfg3ULpYLSe0kaQf6oSuSzDqV+asb/hH7\nU2kkEV3dBpV2tI9sH/8AQWx+FP0nSP7L16yvjdpsgYtg27qXypXtnHXNVzy7jUVcl1L4WmS4Lacb\nVYdo4nLMd3fkgnHTvWTd+Fb3SLSSKaVUSOVWmlgR5AoIJH3Rn8eleoJq9rL8rXu0noojK/zBrN0d\nLB5bm6lu8MZSgUuCCFUL3981XtG9GLlOAtltbaNmOv3eTnCSRylD9QTRJa6TNZw79dsYbsMQ0piK\nhhjgAbgQa9GbTNPkjlK3oEmWKDK4PpxXCa6NV+zBXsUt4pAMjKtJjuDjIH4ZqJ8stZIFfoN0jQnv\nGlWPxJYXCJjAOUyfUHca0X8L6nOu2QWVyvcx3HOD16iuWijVTuRVyR1IBq5CrlvlWPPrtA/lWEqN\nOTvaxepq+K/AsETWp0eyMeY23mMs4Z88cZOOM9KxI9Pv9OSNJLKOV92RFOgwTx2JH8614HvImDJL\nMpH92Zx+mSK0o9R1LBVr2Rx/dniWQf0NV7K7vcV2jkguptO1tKlzbRTsI3iMTIHXuMkAEYzkc1Cf\nD6X1/PLDBcvtf5kWMkD2yOPQ9a7h7yW4eM3NjYXWDywd4XHuOoz+NM0uRraGQ2lstrDI28rcybyW\nxjIYHGMAD1496SpNPfQL6aHN2HhieO7CpdCOUlVAHJTj7uCMdaqXXhS6Zi7wzxseu2PqfXABxXeN\nNdqhYvaD3OcVmxaxIkrLJe6c23j7zJn8RVOn5iTZiFJZI7CzaERbB5al0cdT/EcZ71qad4Y16GZl\nvdPuHtxJtXy2DJsVeMd8bj6dq1Y9cz0ls2/3bzH8xVXUtTkliTCRFg2BtuFbrTUUtbju3uVLDV9O\ns/Fj2N/HDGlqnzB3ZUZwAcMPx4rqNHvrC9tH1a2tBaJcQ5RUnLgkk44PC9O30ritQsLfUy0j6Zl8\n8PtUn8wafokceizxGea6VI8gJIpKKG64wOPw702CPYtLmgtPOu7m8MVrFwBI/AzwCfzNea67488S\nm7uprHUI4rQzyLBCbcEhVbCnOeQcZ/GtmfWNP1lbUPdxlYZQ5CuMvj+E7hkdvyqvLoOkyR3DQ6JZ\n7eGhdIwxz/Fn6/1pK4rq+p5/d/ETxE8+ZzYXDL8oaWyVmxk8Zz71JbeOtUlt5JJNO0aRQGJRrAAH\nH4+1eiw+E/Dc1lEX0Ox5XcQYQCCRzXNeINF0iymtLXTdMjiNxnesZIDA8c1Vn3Mqs7R0Na+u9Dt9\nLjn1Pwvps0zWyu5SFV5IztHBNUJL3xLdgSxTW+iw4OFiQSS4PqzZA+gFdjLZaXcWMa3MG7eoHXO0\n47fTFeZaxa6hHqMkd87ynJKsT8rDPYdBQ5WNErlm4tXlkLXvijUpXPX/AEsoPyXAorIG6OQL9lkZ\nT/EmCB+Gc0VPMyrI69NThONyTj/tkaUajbmYMfO2jp+6b/CiindsqxoRapZRq0jSONoJ5if/AAqv\no2q6fFo1s0szeZIvmFRGxJLHJ7e9FFJyYWNX7fp5/wCWqke8bf4VHdDSL6Hy5ipHYqjAg+xxRRT5\nhWOP1PSVtZC8L+bF2k2EY9m4/WsohQcdCO1FFJAKs8sZ+WRl/Gp01C5VT+8ViP7y9aKKYFmLWJRj\nfbxt9GIrQ0/WIFi8ue2kX5jjbg8Z4oop3Yizd6f4f1aMlJPs8+MhmjKgn37fjXIahp01hOqlw0Bb\nbvDZ2nt9R70UVMkNEf2aZZQoVSncs/IqWW2CxZwDz09aKKLDIIIlkXKxlMdR2qrcyOHdVmnQKQvB\nIyfb1ooqWh9TUsWmgQx/aZHK4yHw2SfrW5YStE+5WKHu0ZKH9KKKuKIbOis9TvwuPtCXCZ+5cJzj\n/eXBpbhftM8U0lpcRsrZ/cSLIp/76ANFFVYlk9xqFuogjjiv+MBiYe/rx2qtdLFexPFLb3EiE8Ex\n42+4zRRSaC5y8to9rO0UilWHIyOo9aKKKko//9k=\n", - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image as img\n", - "img(filename='test_crop.jpg')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "rotate image ok\n" - ] - } - ], - "source": [ - "from PIL import Image\n", - "\n", - "img = Image.open('test.jpg')\n", - "img2 = img.rotate(360)\n", - "img2.save('test_rotate.jpg', 'JPEG')\n", - "print('rotate image ok')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAGQAlgDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1HFFL\nS4rsOYTFLilxRigBMUtLijFABiilxS0DExRilpcUgEoxS4pcUAJimsDT8UYouJojC81IBxQFpwob\nBITFLilxS4pFCYoxTsUuKAG4pcUuKXFADcUuKdilxSuMhK1GI8tVrbmjYKakS4lZocioShHar5FR\nmPNUpCcSptzShOanKYpQnNPmJ5RipU6LTkSpAuKhyNEhuKMU/FLipuUMxSYqTFGKLgM20Yp+KMUr\ngMxRin4oxRcBmKMU/FGKLgM20mKkxRimFiPFGKkxRii4EeKMU/FGKLiGYoxT8UmKLgMxRin4oxRc\nBmKDwMnGBT8VXvU3WrqTgEcnOKa1dgeiOd1i/O9lVwMDnFU7LR7zUEMnEafws3erdroUt9OZJ3Vb\n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\nNwVcADJFFFg2P//Z\n", - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image as img\n", - "img(filename='test_rotate.jpg')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "也可以用如下方法,进行图片的旋转等处理\n", - "\n", - "```python\n", - "out = im.transpose(Image.FLIP_LEFT_RIGHT)\n", - "out = im.transpose(Image.FLIP_TOP_BOTTOM)\n", - "out = im.transpose(Image.ROTATE_90)\n", - "out = im.transpose(Image.ROTATE_180)\n", - "out = im.transpose(Image.ROTATE_270)\n", - "```\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "enhance crop image ok\n" - ] - } - ], - "source": [ - "# 增强图片效果\n", - "\n", - "from PIL import Image\n", - "from PIL import ImageEnhance\n", - "\n", - "img = Image.open('test.jpg')\n", - "enh = ImageEnhance.Color(img)\n", - "img2 = enh.enhance(0.1)\n", - "img2.save('test_enhance.jpg', 'JPEG')\n", - "print('enhance crop image ok')" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAGQAlgDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1DFFO\nxRimITFLilxS0AJijFLRigApaMUtACUYpaXFACUUuKXFACYprCpMUmKAIwvNSAcUAU8A0AJilxS4\npcUAJijFLS4oATFLilxS4oAbRjNPxS4oAhZaiCZare3NGwUAVWhyKiMZHarxFMMdAFPbkZpQnNWC\ngoVMGgBqpip0WnInFSBcUANxRin4pcUAR4oxUmKMUAM20Yp+KMUAMxRin4oxQAzFGKfijFADNtJi\npMUYoAjxRipMUYoAjxRin4oxQBHilxT8UmKAGYoxT8UYoAZikPAyccVJiq16m61dTwCOTnFAHO6x\nfneyq4GBziqdlo95qCGTiNP4WbvVu10KW/nMk7qtuDj5erV1McYjjVB0UYFO9hHJzeEHMW4XG6QA\n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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image as img\n", - "img(filename='test_enhance.jpg')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "##### 增强效果方法列表\n", - "\n", - "class PIL.ImageEnhance.Color(image) 调整图片的颜色\n", - "\n", - "该类可以用于以类似于彩色电视机上的控件的方式调整图像的色彩平衡,增强因子为0.0给出黑白图像,因子1.0给出原始图像。\n", - "\n", - "class PIL.ImageEnhance.Contrast(image) 调整图像对比度\n", - "\n", - "这个类可以用于控制图像的对比度,类似于电视机上的对比度控制,增强因子0.0给出实心灰色图像,因子1.0给出原始图像。\n", - "\n", - "class PIL.ImageEnhance.Brightness(image) 调整图像亮度\n", - "Adjust image brightness.\n", - "\n", - "这个类可以用来控制图像的亮度,增强因子0.0给出黑色图像,因子1.0给出原始图像。\n", - "\n", - "class PIL.ImageEnhance.Sharpness(image) 调整图像锐度\n", - "\n", - "此类可用于调整图像的锐度,增强因子0.0给出模糊图像,因子1.0给出原始图像,因子2.0给出锐化图像。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "JPEG (600, 400) RGB\n" - ] - } - ], - "source": [ - "# 读取照片\n", - "\n", - "# 导入 PIL 的 Image 模块\n", - "from PIL import Image\n", - "# 打开一个图片文件\n", - "img = Image.open('test.jpg')\n", - "print(img.format, img.size, img.mode)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "Mode 的解释\n", - "\n", - "图像的模式定义图像中像素的类型和深度,s当前版本支持以下标准模式:\n", - "\n", - "```\n", - "1 (1-bit pixels, black and white, stored with one pixel per byte)\n", - "L (8-bit pixels, black and white)\n", - "P (8-bit pixels, mapped to any other mode using a color palette)\n", - "RGB (3x8-bit pixels, true color)\n", - "RGBA (4x8-bit pixels, true color with transparency mask)\n", - "CMYK (4x8-bit pixels, color separation)\n", - "YCbCr (3x8-bit pixels, color video format)\n", - "Note that this refers to the JPEG, and not the ITU-R BT.2020, standard\n", - "LAB (3x8-bit pixels, the L*a*b color space)\n", - "HSV (3x8-bit pixels, Hue, Saturation, Value color space)\n", - "I (32-bit signed integer pixels)\n", - "F (32-bit floating point pixels)\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'jfif': 257, 'jfif_unit': 0, 'exif': b'Exif\\x00\\x00MM\\x00*\\x00\\x00\\x00\\x08\\x00\\t\\x01\\x0f\\x00\\x02\\x00\\x00\\x00\\x06\\x00\\x00\\x00z\\x01\\x10\\x00\\x02\\x00\\x00\\x00\\x15\\x00\\x00\\x00\\x80\\x01\\x12\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x00\\x01\\x1a\\x00\\x05\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x96\\x01\\x1b\\x00\\x05\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x9e\\x01(\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x02\\x00\\x00\\x011\\x00\\x02\\x00\\x00\\x00*\\x00\\x00\\x00\\xa6\\x012\\x00\\x02\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\xd0\\x87i\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\xe4\\x00\\x00\\x00\\x00Canon\\x00Canon EOS 5D Mark II\\x00\\x00\\x00\\x00\\x00\\xf0\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\xf0\\x00\\x00\\x00\\x01Adobe Photoshop Lightroom 6.7 (Macintosh)\\x002016:10:05 22:15:40\\x00\\x00\\x1d\\x82\\x9a\\x00\\x05\\x00\\x00\\x00\\x01\\x00\\x00\\x02F\\x82\\x9d\\x00\\x05\\x00\\x00\\x00\\x01\\x00\\x00\\x02N\\x88\"\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x00\\x88\\'\\x00\\x03\\x00\\x00\\x00\\x01\\x00d\\x00\\x00\\x90\\x00\\x00\\x07\\x00\\x00\\x00\\x040230\\x90\\x03\\x00\\x02\\x00\\x00\\x00\\x14\\x00\\x00\\x02V\\x90\\x04\\x00\\x02\\x00\\x00\\x00\\x14\\x00\\x00\\x02j\\x92\\x01\\x00\\n\\x00\\x00\\x00\\x01\\x00\\x00\\x02~\\x92\\x02\\x00\\x05\\x00\\x00\\x00\\x01\\x00\\x00\\x02\\x86\\x92\\x04\\x00\\n\\x00\\x00\\x00\\x01\\x00\\x00\\x02\\x8e\\x92\\x05\\x00\\x05\\x00\\x00\\x00\\x01\\x00\\x00\\x02\\x96\\x92\\x07\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x05\\x00\\x00\\x92\\t\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x10\\x00\\x00\\x92\\n\\x00\\x05\\x00\\x00\\x00\\x01\\x00\\x00\\x02\\x9e\\x92\\x91\\x00\\x02\\x00\\x00\\x00\\x0354\\x00\\x00\\x92\\x92\\x00\\x02\\x00\\x00\\x00\\x0354\\x00\\x00\\xa0\\x01\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x00\\xa0\\x02\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x02X\\xa0\\x03\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x01\\x90\\xa2\\x0e\\x00\\x05\\x00\\x00\\x00\\x01\\x00\\x00\\x02\\xa6\\xa2\\x0f\\x00\\x05\\x00\\x00\\x00\\x01\\x00\\x00\\x02\\xae\\xa2\\x10\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x02\\x00\\x00\\xa4\\x01\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\xa4\\x02\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x00\\xa4\\x03\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\xa4\\x06\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\xa41\\x00\\x02\\x00\\x00\\x00\\x0b\\x00\\x00\\x02\\xb6\\xa42\\x00\\x05\\x00\\x00\\x00\\x04\\x00\\x00\\x02\\xc2\\xa44\\x00\\x02\\x00\\x00\\x00\\x13\\x00\\x00\\x02\\xe2\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x03\\xe8\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x012016:10:05 12:27:09\\x002016:10:05 12:27:09\\x00\\x00\\x00#E\\x00\\x00\\x03\\x8a\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x11\\x00\\x00\\x00\\x01\\x00\\x01\\xf00\\x00\\x00\\x00!\\x00\\x08\\xd3e\\x00\\x00\\x00\\x942431403449\\x00\\x00\\x00\\x00\\x00\\x11\\x00\\x00\\x00\\x01\\x00\\x00\\x00(\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01EF17-40mm f/4L USM\\x00\\x00', 'jfif_version': (1, 1), 'jfif_density': (240, 240)}\n" - ] - } - ], - "source": [ - "# 读取照片\n", - "\n", - "# 导入 PIL 的 Image 模块\n", - "from PIL import Image\n", - "# 打开一个图片文件\n", - "img = Image.open('test.jpg')\n", - "\n", - "# 显示照片的信息,存在一个字典变量中\n", - "print(img.info)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "draw image ok\n" - ] - } - ], - "source": [ - "# 在图片上画线\n", - "\n", - "from PIL import Image, ImageDraw\n", - "\n", - "img = Image.open(\"test.jpg\")\n", - "\n", - "draw = ImageDraw.Draw(img)\n", - "draw.line((0, 0) + img.size, fill=128)\n", - "draw.line((0, img.size[1], img.size[0], 0), fill=128)\n", - "del draw\n", - "\n", - "# write to stdout\n", - "img.save('test_draw.jpg', 'JPEG')\n", - "print('draw image ok')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAGQAlgDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDu/sFx\npfz6X89sOXsXJP4QsWxHx0U/J8oA2ZLVcstQt77ekbbbiLAmt3I8yEnoGAPHQ4PQjkEjBq3VW906\nG+2MzSxTxZ8qeFyjpn9CMgEqwKnAyDiuq1tjLmUvj+//AD7/AJ+paxS4rK/tKbTfl1nykiH/AC/o\nBHAc9AwLExnqOSVPHzZYKNbFNSTJlBxExS0uKMUyQxRS4paBiYoxS0uKQCUYpcUuKAExTWBp+KMU\nXE0RheakA4oC04UNgkJilxS4pcUihMUYp2KXFADcUuKXFLigBuKXFOxS4pXGQlajEeWq1tzRsFNS\nJcSs0ORUJQjtV8iozHmqUhOJU25pQnNTlMUoTmnzE8oxUqdFpyJUgXFQ5GiQ3FGKfilxU3KGYpMV\n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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image as img\n", - "img(filename='test_draw.jpg')" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "blur image ok\n" - ] - } - ], - "source": [ - "# 图片滤镜效果,模糊\n", - "\n", - "from PIL import Image, ImageFilter\n", - "\n", - "img = Image.open(\"test.jpg\")\n", - "\n", - "img2 = img.filter(ImageFilter.BLUR)\n", - "\n", - "img2.save('test_blur.jpg', 'JPEG')\n", - "print('blur image ok')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAGQAlgDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1DFLS\n4oxXYcwUUuKXFACUtFLigBKWjFLQMSlpcUYpAJS0uKMUAJimtUmKQrRcTRGFqUCkAp4FDYJCUuKX\nFGKRQlLilxS4oATFGKdilxQA3FGKdilxSuMiZeKj2ZNWtuaTZTUiXErNFkVEUxV4rTDHVKQnEqbc\n0BOasFKAnNPmJ5RqpU6LTkSpAuKhyNEhmKXFPxRipuUMxRipMUYouFiPFLin4oxSuFhmKMU/FGKL\ngMxSYqTFGKLgR7aMU/FGKYWGYoxT8UYouAzFJipMUYouBHijFPxRii4hmKMU/FJigBuKa7BFyakx\nVa9z5JweaqOrsJ6IwNUvmZiqk8nFU7bTJbrDEH8KvQaW89xvbJ5zzXQwQLBGFUYrtlWVKPLDc440\n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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image as img\n", - "img(filename='test_blur.jpg')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "Filters\n", - "滤镜的效果有下面这些\n", - "\n", - "```\n", - "BLUR\n", - "CONTOUR\n", - "DETAIL\n", - "EDGE_ENHANCE\n", - "EDGE_ENHANCE_MORE\n", - "EMBOSS\n", - "FIND_EDGES\n", - "SMOOTH\n", - "SMOOTH_MORE\n", - "SHARPEN\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "edge image ok\n" - ] - } - ], - "source": [ - "# 图片滤镜效果,边缘强化\n", - "\n", - "from PIL import Image, ImageFilter\n", - "\n", - "img = Image.open(\"test.jpg\")\n", - "\n", - "img2 = img.filter(ImageFilter.FIND_EDGES)\n", - "\n", - "img2.save('test_edge.jpg', 'JPEG')\n", - "print('edge image ok')" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAGQAlgDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzLxT4\np8QW/i/W4INf1SKKO/nRI0vJFVVEjAADdwBWP/wmHif/AKGPV/8AwOl/+Ko8Y/8AI76/2/4mNx/6\nMasXj61TbuJJWNr/AITDxP8A9DHq/wD4HS//ABVP/wCEv8S/9DHq/wD4HSf/ABVY3Ht+f/16jzSu\nwsja/wCEw8T/APQyav8A+B0v/wAVR/wmHift4j1j/wADpP8A4qsWii7CyN3/AITDxMf+Zk1f/wAD\npP8A4qmf8Jj4n/6GPWP/AAOk/wDiqxfpTvlP+f8A69F2OyNj/hMvE/8A0Mesf+B0v/xVH/CY+KP+\nhk1j/wADpf8A4qsX9KdhT3/z+dF2KyNj/hMvFH/Qyax/4HS//FU//hMvE3/Qyax/4HS//FVi5GeD\n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\nf//Z\n", - "text/plain": [ - "" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image as img\n", - "img(filename='test_edge.jpg')" - ] - } - ], - "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-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" deleted file mode 100644 index a1854f6..0000000 --- "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" +++ /dev/null @@ -1,325 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 10\n", - "\n", - "* Python Senior, Lesson 10, v1.0.0, 2016.11 by David.Yi\n", - "* v1.1, 2020.5.4 edit by David Yi\n", - "\n", - "\n", - "## 本次内容要点\n", - "\n", - "* 面向对象的编程之一\n", - " * 类与实例\n", - " * 类的属性\n", - " * 类的方法\n", - "* 思考一下" - ] - }, - { - "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": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "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": 9, - "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" - ] - } - ], - "source": [ - "# 类直接调用没有意义,报错\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": "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, - "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": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.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\345\233\233-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\344\271\213\345\233\233-checkpoint.ipynb" deleted file mode 100644 index 7b8339a..0000000 --- "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\345\233\233-checkpoint.ipynb" +++ /dev/null @@ -1,692 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 13\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", - "\n", - "## 本次内容要点\n", - "\n", - "* 面向对象的编程之四\n", - " * 类属性\n", - " * 类属性安全的访问方法\n", - "* 字符串应用\n", - "* 复习" - ] - }, - { - "cell_type": "code", - "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": "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": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/logo.gif b/python_study_basic_notebook/draft/python_basic_2/imgs/logo.gif deleted file mode 100644 index 639f863..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/logo.gif and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/logo2.jpg b/python_study_basic_notebook/draft/python_basic_2/imgs/logo2.jpg deleted file mode 100644 index 1cc66b6..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/logo2.jpg and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/logo3.jpg b/python_study_basic_notebook/draft/python_basic_2/imgs/logo3.jpg deleted file mode 100644 index 53bc613..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/logo3.jpg and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/map.png b/python_study_basic_notebook/draft/python_basic_2/imgs/map.png deleted file mode 100644 index ce35a7f..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/map.png and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/test.jpg b/python_study_basic_notebook/draft/python_basic_2/imgs/test.jpg deleted file mode 100644 index 05ad7ba..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/test.jpg and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/test_blur.jpg b/python_study_basic_notebook/draft/python_basic_2/imgs/test_blur.jpg deleted file mode 100644 index 2cee95e..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/test_blur.jpg and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/test_crop.jpg b/python_study_basic_notebook/draft/python_basic_2/imgs/test_crop.jpg deleted file mode 100644 index 1885f9b..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/test_crop.jpg and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/test_draw.jpg b/python_study_basic_notebook/draft/python_basic_2/imgs/test_draw.jpg deleted file mode 100644 index d028f3f..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/test_draw.jpg and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/test_edge.jpg b/python_study_basic_notebook/draft/python_basic_2/imgs/test_edge.jpg deleted file mode 100644 index 8473654..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/test_edge.jpg and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/test_enhance.jpg b/python_study_basic_notebook/draft/python_basic_2/imgs/test_enhance.jpg deleted file mode 100644 index 89678e9..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/test_enhance.jpg and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/test_rotate.jpg b/python_study_basic_notebook/draft/python_basic_2/imgs/test_rotate.jpg deleted file mode 100644 index a425dab..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/test_rotate.jpg and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/imgs/test_thumbnail.jpg b/python_study_basic_notebook/draft/python_basic_2/imgs/test_thumbnail.jpg deleted file mode 100644 index 4b74661..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/imgs/test_thumbnail.jpg and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/lesson 01/.ipynb_checkpoints/Basic Exercise A-checkpoint.ipynb b/python_study_basic_notebook/draft/python_basic_2/lesson 01/.ipynb_checkpoints/Basic Exercise A-checkpoint.ipynb deleted file mode 100644 index bc6a894..0000000 --- a/python_study_basic_notebook/draft/python_basic_2/lesson 01/.ipynb_checkpoints/Basic Exercise A-checkpoint.ipynb +++ /dev/null @@ -1,457 +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": 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/lesson 01/Basic Exercise A.ipynb b/python_study_basic_notebook/draft/python_basic_2/lesson 01/Basic Exercise A.ipynb deleted file mode 100644 index 5890cda..0000000 --- a/python_study_basic_notebook/draft/python_basic_2/lesson 01/Basic Exercise A.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 -} diff --git a/python_study_basic_notebook/draft/python_basic_2/lesson 01/python_senior_slides_python_senior_L1_v1.pptx b/python_study_basic_notebook/draft/python_basic_2/lesson 01/python_senior_slides_python_senior_L1_v1.pptx deleted file mode 100644 index 2764066..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/lesson 01/python_senior_slides_python_senior_L1_v1.pptx and /dev/null differ diff --git "a/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" "b/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" deleted file mode 100644 index a065188..0000000 --- "a/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" +++ /dev/null @@ -1,137 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import tkinter\n", - "\n", - "top = tkinter.Tk()\n", - "top.mainloop()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import tkinter\n", - "\n", - "label = tkinter.Label(text='Hello World!')\n", - "label.pack()\n", - "tkinter.mainloop()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import tkinter\n", - "\n", - "btnHello = tkinter.Button(text='Hello World!')\n", - "btnHello.pack()\n", - "tkinter.mainloop()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from tkinter import * \n", - "root = Tk() \n", - " \n", - "list1 = ['java','python','php','js']\n", - "list2 = ['mobile','desktop','web']\n", - "\n", - "# 创建两个列表组件\n", - "listProgram = Listbox(root) \n", - "listPlatform = Listbox(root)\n", - "\n", - "# 第一个小部件插入数据\n", - "for item in list1: \n", - " listProgram.insert(0,item)\n", - "\n", - "# 第二个小部件插入数据\n", - "for item in list2: \n", - " listPlatform.insert(0,item)\n", - "\n", - "# 将小部件放置到主窗口中\n", - "listProgram.pack() \n", - "listPlatform.pack()\n", - "\n", - "# 进入消息循环\n", - "root.mainloop() " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello, I am computer\n" - ] - } - ], - "source": [ - "from tkinter import *\n", - "\n", - "root = Tk() \n", - "\n", - "def say():\n", - " print('Hello, I am computer')\n", - "\n", - "btnHello = Button(None, text='Hello', command=say)\n", - "btnHello.pack()\n", - "root.mainloop()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/python_study_basic_notebook/draft/python_basic_2/lesson 03/python_senior_slides_python_senior_L3_v1.pptx b/python_study_basic_notebook/draft/python_basic_2/lesson 03/python_senior_slides_python_senior_L3_v1.pptx deleted file mode 100644 index 5d024b8..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/lesson 03/python_senior_slides_python_senior_L3_v1.pptx and /dev/null differ diff --git a/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_lesson07.ipynb b/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_lesson07.ipynb deleted file mode 100644 index 310430f..0000000 --- a/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_lesson07.ipynb +++ /dev/null @@ -1,343 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Python for Senior Lesson 7\n", - "\n", - "v1.0.0\n", - "\n", - "2016.11 by David.Yi\n", - "\n", - "\n", - "## 本次内容要点\n", - "\n", - "* 测验\n", - "* 测验题目讲解" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_lesson14.ipynb b/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_lesson14.ipynb deleted file mode 100644 index e55daa7..0000000 --- a/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_lesson14.ipynb +++ /dev/null @@ -1,322 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "exam" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": { - "collapsed": false - }, - "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": [] - } - ], - "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.5.2" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_outline_v1.docx b/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_outline_v1.docx deleted file mode 100644 index 53f3294..0000000 Binary files a/python_study_basic_notebook/draft/python_basic_2/python_basic_L2_outline_v1.docx and /dev/null differ 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" deleted file mode 100644 index a1854f6..0000000 --- "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" +++ /dev/null @@ -1,325 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 10\n", - "\n", - "* Python Senior, Lesson 10, v1.0.0, 2016.11 by David.Yi\n", - "* v1.1, 2020.5.4 edit by David Yi\n", - "\n", - "\n", - "## 本次内容要点\n", - "\n", - "* 面向对象的编程之一\n", - " * 类与实例\n", - " * 类的属性\n", - " * 类的方法\n", - "* 思考一下" - ] - }, - { - "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": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "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": 9, - "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" - ] - } - ], - "source": [ - "# 类直接调用没有意义,报错\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": "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, - "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": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} 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\345\233\233.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\344\271\213\345\233\233.ipynb" deleted file mode 100644 index 7b8339a..0000000 --- "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\345\233\233.ipynb" +++ /dev/null @@ -1,692 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 13\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", - "\n", - "## 本次内容要点\n", - "\n", - "* 面向对象的编程之四\n", - " * 类属性\n", - " * 类属性安全的访问方法\n", - "* 字符串应用\n", - "* 复习" - ] - }, - { - "cell_type": "code", - "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": "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": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/python_study_basic_notebook/files/test2.txt b/python_study_basic_notebook/files/test2.txt deleted file mode 100644 index e69de29..0000000 diff --git a/python_study_basic_notebook/test_thumbnail.jpg b/python_study_basic_notebook/test_thumbnail.jpg deleted file mode 100644 index 50600fb..0000000 Binary files a/python_study_basic_notebook/test_thumbnail.jpg and /dev/null differ