{"id":21944099,"url":"https://github.com/wangxiaoyugg/python-journey","last_synced_at":"2025-09-10T10:40:33.062Z","repository":{"id":113232616,"uuid":"112920727","full_name":"WangXiaoyugg/python-journey","owner":"WangXiaoyugg","description":null,"archived":false,"fork":false,"pushed_at":"2018-03-28T01:35:02.000Z","size":33,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-27T16:48:17.015Z","etag":null,"topics":["notes","python3","tutorial"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WangXiaoyugg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-12-03T11:03:32.000Z","updated_at":"2019-12-09T02:07:50.000Z","dependencies_parsed_at":"2023-05-06T06:17:33.145Z","dependency_job_id":null,"html_url":"https://github.com/WangXiaoyugg/python-journey","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangXiaoyugg%2Fpython-journey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangXiaoyugg%2Fpython-journey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangXiaoyugg%2Fpython-journey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangXiaoyugg%2Fpython-journey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WangXiaoyugg","download_url":"https://codeload.github.com/WangXiaoyugg/python-journey/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244982060,"owners_count":20542300,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["notes","python3","tutorial"],"created_at":"2024-11-29T04:13:26.726Z","updated_at":"2025-03-22T16:13:21.143Z","avatar_url":"https://github.com/WangXiaoyugg.png","language":"Python","readme":"# python-journey\n\n## 开始学习pyhton 之旅\n\n### 第一天\n\n1. 安装python很简单，[下载地址](https://www.python.org/downloads/)\n   windows点击安装包，默认下一步下一步结束\n2. python [官方文档](https://docs.python.org/3/)\n3. IDLE 交互练习，mac在终端输入 python 按 回车, 打印hello world\n`print('hello,world')` \n\n4. 代码是什么，怎么写代码\n- 代码是实际世界的事物的映射\n- 写代码用计算机语言来描述现实世界的🍜\n- 计算机语言，基本数据类型\n\n5. 数字 Number\n- 整数 int\n- 其他语言整数 short, int,long\n- 浮点数 float ,python 默认 双精度\n- 其他语言浮点数单精度 float, 双精度 double   \n```\ntype(1)\ntype(1.1)\ntype(1.1111111)\ntype(1 + 0.1)\ntype(1+1)\n\ntype(1 + 1.0) float\ntype(1 * 1) \ntype(1 * 1.0) \ntype(2/2) float 重点 在 python2.7 版本里是 int\ntype(2//2) int\n2/2 = 1.0\n2//2 = 1\n1//2 = 0  保留整数部分\n```\n- 10，2，8，16进制\n满 10 进 1 ， 满 2 进 1 ， 满 8 进 1 ， 满 16 进 1\n[0 - 9]       [0-1]      [0-7]       [0-9A-F]\n- 各种进制的表示\n```\n0b10  二进制\n0o10  八进制\n0x1F  十六进制\n```\n- 各种进制转换\n```\nbin(10) =\u003e 0b1010\nbin(0o7) =\u003e 0b111\nbin(0xE) =\u003e 0b110\nint(0b11) =\u003e 3\nint(0o77) =\u003e 77\nhex(10) =\u003e  0xa\nhex(0o777) =\u003e 0x1ff\noct(0b111) =\u003e 0o7\noct(0x777) =\u003e 0o3567\n```\n- bool类型，true,false\n- complex 复数\n```\nTrue   大写\nFalse  大写\ntype(True)\ntype(False)\nint(True)  1\nint(False) 0\nbool(1)  True\nbool(0)  False\nbool(2) True\nbool(2.2) True\nbool(-1.1) True  非 0 都是 布尔真，0表示 布尔假\nbool('abc') True\nbool('') False\nbool([1,2,3]) True\nbool([]) False\nbool({1,1,1}) True\nbool({}) False\nbool(None) False\n非空一般被认为 True, 空值被认为 False \n\n2j 表示复数\n```\n6. 字符串\n- 单引号 ''\n- 双引号 \"\"\n```\n\"let's go\"\n'let\"s go'\n'let\\'s go' 转义字符 \\ \n```\n- 引号要成对出现\n- 多行字符串 \u003e79个字符要换行  ''' '''\n```\n''' hello\nhello\nhello\n'''\n\\n  回车\n\"\"\" hello world \\n hello world \\nhello world \\n\"\"\" IDLE不会换行\nprint(\"\"\" hello world \\n hello world \\nhello world \\n\"\"\") 会换行\n```\n- 转义字符\n```\n\\n 换行\n\\' 单引号\n\\t 横向制表符\n\\r 回车\n\nprint(\"hello \\n world\") \\n 不消失\nprint(\"hello \\\\n world\")\nprint('c:\\my\\project') 不换行\nprint('c:\\\\my\\\\project')\nprint(r'c:\\my\\project') 原始字符串加 r\n```\n- 字符串操作运算\n```\n'hello' + 'world' 拼接字符串\n‘hello’ * 3  =\u003e  'hellohellohello'\n'hello world'[0] =\u003e h\n'hello world'[3] =\u003e l\n'hello world'[-1] =\u003e d\n'hello world'[-3] =\u003e r 下标正数顺序，负数倒序\n'hello world'[0:4] =\u003e 'hell'\n'hello world'[0:5] =\u003e 'hello' 最后截取的下一位\n'hello world'[0:-1] =\u003e 'hello worl'\n'hello world'[0:-3] =\u003e 'hello wo'\n'hello world'[6:] =\u003e 'hello'\n'hello python java c# javascript php ruby'[-4:] =\u003e ruby\n'hello python java c# javascript php ruby'[:-4] =\u003e 'hello python java c# javascript php '\nR'C:Windows' =\u003e 'C:Windows'\n```\n### 第二天\n\n#### 基本类型-组\n1. 列表,内部数据类型任意\n`type([1,2,3,4,5,6]) list`\n`['hello',True,1]`\n`[[1,2],[2,3],[True,False]] 嵌套列表`\n2. 列表操作\n```\n//get\n['汽车','火车','飞机','轮船'][0] string\n['汽车','火车','飞机','轮船'][3] string\n['汽车','火车','飞机','轮船'][0:2] list[]\n['汽车','火车','飞机','轮船'][-1:] list[]\n\n//add\n['汽车','火车','飞机','轮船'] + ['火箭','飞船'] =\u003e ['汽车','火车','飞机','轮船','火箭','飞船']\n['火箭','飞船'] * 3  =\u003e ['火箭','飞船','火箭','飞船','火箭','飞船']\n\n[['巴西','克罗地亚','美国','英国'],[],[],[],[],[],[],[],[]]\n```\n3. 元组\n```\n(1,2,3,4,5)\n(1,'1',True)\n(1,2,3,4,5)[0]\n(1,2,3,4,5)[0:2]\n(1,2,3) + (4,5,6)\n(1,2,3) * 3\n\ntype((1,2,3)) tuple\ntype([1,2,3]) list\ntype('hello') str\ntype(1)       int\n\ntype((1))     int\ntype(('hello')) str\ntype((1)) =\u003e type(1) =\u003e int\n\n只有一个元素的元组\ntype((1,))\n\n空元组\ntype(())\n```\n4. 序列\n- str , list, tuple\n- [下标]获取元素，每个序列的元素有下标序号\n- [0:3]切片 `'hello world'[0:8:2]`\n- 序列可以 + *\n```\n3 in [1,2,3,4,5,6] True\n3 not in [1,2,3,4,5,6] False\nlen([1,2,3,4,5,6]) =\u003e 6\nlen('hello') =\u003e 5\nmax([1,2,3,4,5]) =\u003e 5\nmin([1,2,3,4,5]) =\u003e 1\n\n//字母按 按 acsll 码 排序\nmax('hello world') =\u003e w  \nmin('helloworld') =\u003e d\nord('w') 119\nord('d') 100\nord(' ') 32\n\n```\n5. 集合\n```\ntype({1,2,3,4,5,6}) set\n//无序没有索引\n{1,2,3,4}[0] 报错\n{1,2,3}[0:1] 报错\n\n//自动去除重复元素\n{1,1,2,2,3,3} =\u003e {1,2,3}\n\n1 in {1,2,3,4} True\n1 not in {1,2,3} False\nlen({1,2,3}) 3 \n\n// 减号求两个集合的差值\n{1,2,3,4,5,6} - {3,4} =\u003e {1,2,5,6} \n\n// \u0026 两个集合的交集\n{1,2,3,4,5,6} \u0026 {3,4} =\u003e {3,4}\n\n// | 两个集合的并集\n{1,2,3,4,5,6} | {4,5,6,7,8} =\u003e {1,2,3,4,5,6,7,8}\n\n//空集合\ntype({}) dict\ntype(set()) set\nlen(set()) 0   \n```\n6. 字典\n- key : value\n- 字典可以有很多的value 和 key, 是集合的一种\n```\ntype({key1:val1,key2:val2}) set\ntype({1:1,2:2,3:3}) dict\n{\n    'q':'新月打击',\n    'w':'苍白之瀑',\n    'e':'月之降临',\n    'r':'月神冲刺'\n}\n```\n- 通过key 访问 value\n```\n//字典不能有重复的key\n{\n    'q':'新月打击',\n    'w':'苍白之瀑',\n    'e':'月之降临',\n    'r':'月神冲刺'\n}[q]\n{\n    'q':'新月打击',\n    'q':'苍白之瀑',\n    'e':'月之降临',\n    'r':'月神冲刺'\n}[q] =\u003e '苍白之瀑'\n\n//key 可以是数字,字符串,元组 ,必须是不可变的数据类型 ，value: str int list set dict\n\n//空的字典 怎么定义\ntype({}) dict\n\n```\n7. 小结\n- 数字(int,float, bool,complex)\n- 组  \n  1. 序列(str,list,tuple) 有序，可以用下标索引来访问，支持切片操作，不可变\n  2. 集合(set) 无序，无索引，不能切片\n  3. 字典(dict) key:value 键值对\n\n### 第三天\n\n#### 变量和运算符\n1. 什么是变量？一组数据的名字\n```\na = [1,2,3,5,6]\nprint(a)\nb = [1,2,3]\na*3 + b + a\n\n//变量名必须有意义\nskill = ['eat','drink']\n\n```\n2. 变量命名规则\n- 字母，数字，下划线，且不能以数字开头\n- 系统保留关键字不能用在变量名中\n- 变量名事区分大小写\n- 变量没有类型限制\n\n3. 值类型和引用类型\n```\n//值类型(不可改变) int str tuple\na = 1\nb = a\na = 3\n\n//引用类型（可变） list set dict\na = [1,2,3]\nb = a\na[0] = '1'\n\n//生成新的变量，内存地址不同\na = 'hello'\nid(a)\na = a+ 'world'\nid(a) \n\n```\n4. 列表的可变和元组的不可变\n```\n代码稳定性 =\u003e 元组\na = (1,2,3,[1,2,[a,b,c]])\na[3][2][1] =\u003e b\n\na = (1,2,3,[1,2,4])\na[3][2] = '4'  改变的是元组\n\n```\n5. 运算符号\n```\n+ - * / //\n%  \n2**2  =\u003e 4\n2**3  =\u003e 8\n\n赋值运算符\n= —= += /= %= //= *= **=\nc = 1\nc = c + 1  =\u003e c += 1 =\u003e c++ 报错 python 不支持\n\n关系运算符 返回值是布尔值\n==  != \u003e \u003c \u003e=  \u003c=\n1 == 1 True\n1 \u003e 1 False\n1 \u003e= True\n1 != 2 True\n\nb = 1\nb += b\u003e=1 =\u003e b = b+ True =\u003e b = b+1 =\u003e b = 2\n'a' \u003e 'b' False  比较的 ascii 码的大小\n'abc' \u003c 'abd' True\n[1,2,3] \u003c [1,2,4] True\n(1,2,3) \u003c (1,3,2) True\n\n\n逻辑运算符 =\u003e 操作类型和返回类型都是布尔类型\nand or not\nand 且\nor 或\nnot 取反，操作一个变量\n\n1 and 1  =\u003e 1\n'a' and 'b' =\u003e b\n'a' or 'b' =\u003e a\nnot 'a' =\u003e False\n\nint float  0 被认为是False, 非 0 表示 True\nnot 0.1 False\n\nstr  空字符串 False,其他的是 True\nnot '' True\n\nlist [] False, 其他的是 True\n元组同 list\n\n[1] or []  =\u003e [1]\n[] or [1] =\u003e [1]\n\n'a' and 'b' =\u003e 'b'\n'' and 'b' =\u003e ''\n \n1 and 2  =\u003e 2\n1 or 2  =\u003e 1\n0 and 1  =\u003e 0\n1 and 0 =\u003e 0\n0 or 1 =\u003e 1\n1 or 1 =\u003e 1\n\n \n成员运算符 一个元素是否在另一个元素里，返回的是布尔值\nin not in\na = 1\na in [1,2,3,4,5] True\na not in [1,2,3] False\nb = 6\nb in [1,2,3,4,5]\n\nb = 'a'\nb in {'c':1} False\nb = 1\nb in {'c':1} False\nb = 'c'\nb in {'c':1} True\n\n身份运算符 返回的是布尔值\nis is not\n\na = 1\nb = 2\na is b False\na = 1\nb = 1.0\na == b  True\na is b  False \nis 比较两个变量的内存地址是否相等\nnot is 比较两个变量的内存地址是否不相等\n\na = {1,2,3}\nb = {2,1,3}\na == b True\na is b False\n\nc = (1,2,3)\nd = (2,1,3)\nc == d False\nc is d False\n\na == b 值判断\na is b  身份判断\ntype a  类型判断\n\na = 'hello'\ntype(a) == int\ntype(a) == str\n\n//判断变量类型,推荐使用，可以判断对象的子类，而type不可以\nisinstance(a,str) =\u003e True\nisinstance(a,(int,str,float)) =\u003e True\nisinstance(a,(int,float)) =\u003e False\n\n对象有三个特征 id,value,type\n\n位运算符\n\u0026 | ^ ~ \u003c\u003c \u003e\u003e 把数字当作二进制数字处理\n\u0026 按位与\n| 按位或\n~ 按位异或\n\u003c\u003c 左移动\n\u003e\u003e 右移动\n\n10  \n\u0026    =\u003e  1 0  =\u003e 2\n11\n\n10\n|  =\u003e   11 =\u003e 3\n11\n\n\n```\n\n### 第四天\n\n#### 表达式\n1. 表达式是运算符和操作数所构成的序列\n```\nc = int('1') + 2\n\na = 1 \nb = 2\nc = 3\na + b * c =\u003e 7\na or b and c  =\u003e  a or (b and c) =\u003e 1\n```\n2. 运算符的优先级\n- 同级的从左到右  =\u003e 左结合\n- () 的优先级最高\n- 赋值运算符 =  从右到左 =\u003e 右结合\n```\na = 1\nb = 2\nc = 2\n\nnot \u003e and \u003e or\nnot a or b + 2 == c\n(not a) or  ((b+2) == c))\n```\n3. 在文件编写代码\n- 编码工具 IDE pycharm\n- 编辑器  vscode sublime\n- 编写代码保存为 xxx.py\n- 在终端里找到对应的目录 使用命令 python xxx.py\n\n4. vscode 开发环境和python 插件安装\n- 插件 python termial vim veiw in browser vscode-icons\n- 编辑器具备的三个功能：智能感知，调试，语法检测\n\n5. 流程控制语句\n- 缩进表示代码块\n- if else for while\n- 注释 # 单行 ， 多行注释 ''' '''\n- python 不可以混淆和压缩，因为缩进语法 \n- 变量名用 _ 分隔\n- 使用 pylint 检查 代码\n```\ntodo \n1. 切换系统默认的python版本 为 3.6.2 而不是 2.7.1\n2. pylint 的版本 切换为 3.6.2, 而不是 2.7.1\n```\n6. snippet ,嵌套分支，代码块\n- snipppet 代码块\n- pass 占位\n- 代码块\n- if else 嵌套，把内层的if- else 封装函数，减少嵌套\n- elif 减少判断\n- python 中为什么没有 switch case [文档地址](https://docs.python.org/2/faq/design.html#why-isn-t-there-a-switch-or-case-statement-in-python)\n```\npython 官方认为 switch case 你可以用 if elif else 代替\n但是python switch case 还没有一致认同的方案以及怎么进行范围测试\n官方例子：\n假若你要从非常多的数字中选择符合条件的，你可以创建一个字典，然后使map字典的值去调用\ndef function_1(...):\n    ...\n\nfunctions = {'a': function_1,\n             'b': function_2,\n             'c': self.method_1, ...}\n\nfunc = functions[value]\nfunc()\n\n除了 使用对象的方法进行调用，你也可以简单使用pyhton内部方法getattr()去调用特定名字的方法\ndef visit_a(self, ...):\n    ...\n...\n\ndef dispatch(self, value):\n    method_name = 'visit_' + str(value)\n    method = getattr(self, method_name)\n    method()\npython 官方建议给方法名添加后缀 ，如 visit_, 没有这样的后缀_，假若值来自一个不可靠的数据源\n攻击者可以轻松调用 你的对象的任意方法    \n```\n- 不报错代码结果不符合预期，注意变量的数据类型是否改变\n```\n# a b 不能同时为False\nif（ a != False or b !== False)\n    print('xxx')\n可以简写成  a or b    \n```\n\n### 第五天\n\n#### 循环\n1. while else 知道一个目标，达到目标就退出\n2. for 主要用来遍历 序列，集合，字典 break,continue\n3. range(0,10) =\u003e  0 - 9  rang(10,0,-2)\n4. 会写代码，很容易，写出高性能，封装性(可复用)代码很难\n5. 写代码考验抽象能力\n6. 代码优美,高性能，封装性(可复用)\n\n### 第六天\n\n#### 包，模块，类\n1. 包(文件夹) \u003e 模块(xxx.py) \u003e 类(写在xxx.py里面) \u003e 函数/变量\n2. 包和模块的名字\n```\n相同的模块不同的包，加上包的名字，命名空间\n包可以有子包\n包文件夹下面必须有 __init__.py  =\u003e 模块名就是 包的名字\n```\n3. import 必须先定义，才能使用，导入的是一个模块，包的嵌套时必须加上 命名空间\n```\nimport xxx.xx.xx as x\nprint(x.m);\n\n导入具体变量，函数，不需要命名空间\nfrom t.c7 import a\nprint(a)\nfrom t.ct import *\n\n# * 导出所需的变量，函数,__all__ 内置模块\n__all__ = ['a','c'] \n\n__pycache__ 文件夹是python 编译的二进制文件的缓存，\n```\n4. __init__.py 的用法\n- vscode设置 files.exclude ,__pycache__ true\n- 导入多个模块\n```\nfrom c9 import a,b,c\n\n导入的模块特别多,需要换行\nfrom c9 import a,b,\\\nc\nfrom c9 import (a,b,\nc)\n\nprint(a)\n\n```\n- 当一个包被导入的时候，包的 __init__.py 会被首先执行\n- __init__.py 的使用场景\n```\nxxx包\n__init__.py 文件\n\n决定哪些模块被导入，决定包可以使用哪些模块\n__all__ = [a,b,c]\n\n公共使用的内置模块，sys,io,date\n在__init__.py 中引入\nimport sys\nimport io\nimport date\n\n在其他模块中使用内置的模块\nimpory xxx.sys\n\n```\n- 包和模块不会被重复导入\n- 避免循环导入,避免多个文件的循环引用\n```\np1.py\nfrom p2 import p2\nprint(p2)\n\np2.py\nfrom p1 import p1\nprint(p1)\n```\n- 一旦导入模块，会执行模块的代码\n- 应用程序只有一个入口文件\n\n5. 模块的内置变量\n```\nprint(dir())\n```\n6. 入口文件\n- __package__ 为 NoneType\n- __name__ 为 __main__\n- __file__ 为 文件名\n\n7. __name__ 的使用场景\n```\nimport sys\ninfos = dir(sys)\nprint(info)\n\nif __name__ == '__main__':\n    print('This is app')\nprint('This is module')\n\n//doc 文档自动生成工具\n遍历 每个文件 __doc__\n\n//成为模块必须在包目录下面\npython -m demo.dir.py    \n```\n8. 相对导入和绝对导入\n```\n目录结构\nDEMO\n- package1\n- package2\n- package3\n- main.py 决定顶级包的位置\n\n绝对导入必须从顶级包开始\n\n相对导入\nfrom ..m4 import m\nfrom .m1 import n\n\nfrom ...m5 import n\nvalueerror,试图去引入超过顶级包的模块?\n把m5放入 package2 内\n\nmain.py 是入口文件 ，是不能使用相对导入\n\n如果非要把 main.py 当模块使用, 使用相对导入\n\n执行换到上一级目录\npython -m demo.main\n\n```\n\n### 第七天\n\n#### 函数\n\n1. 函数\n```\nprint()\na = 1.2386\nprint(round(a,2))\n```\n- 功能性\n- 封装性\n- 复用性\n- 组织代码\n\n2. 函数定义和运行特点\n```\ndef xxx():\n    xxx = 'xxx'\n    return xxx:\n\ndef xxxx():\n    print('xxxx')    \n```\n3. 函数返回多个值，遇到return 就终止了\n4. 序列解包,两边元素要相等\n```\na = 1\nb = 2\nc = 3\n\na,b,c = 1,2,3\n\nd = 1,2,3\nprint(type(d)) tuple\n\na,b,c = d\n\na = 1\nb = 1\nc = 1\n\na = b = c = 1\na,b,c = 1,1,1\n\n```\n5. 必须参数和关键字参数\n- 必须参数必须传入，不传入报错\n- 形参和实参\n- 关键字参数，不考虑参数的顺序,在传递实参的时候\n\n6. 默认参数\n```\ndef add(a,b=1,c=2):\n    return a+b+c\n\nadd(1)\nadd(1,2)\nadd(1)\n一般要遵守顺序\n使用关键参数可以不遵守顺序\nadd(1,c=10)\n\n\n```\n7. 可变参数\n```\ndef demo(*param):\n    print(param)\n    print(type(param)) // tuple\n\ndemo(1,2,3,4,5,6)    \ndemo((1,2,3,5,6)) //((1,2,3,4,5))\n\na = (1,2,3,4,5,6)\ndemo(*a) //(1,2,3,4,5,6)\n\ndef demo(param1,param2=2,*param):\n    print(param1)\n    print(param2)\n    print(param)\n\ndemo('a',1,2,3 ) // a 1 (2,3)\n\ndef demo(param1,*param,param2=2):\n    print(param1)\n    print(param2)\n    print(param)\n\ndemo('a',1,2,3,'param')\n// a (1,2,3,'param') 2\n\ndemo('a',1,2,3,param2='param')\n// a (1,2,3) 'param'\n\n```\n- 保证函数参数类型的简单\n\n8. 关键字可变参数 \n```\ndef sum(*param):\n    sum = 0\n    for i in param\n        sum += i * i\n    print(sum)\n\nsum(1,2,3,4,5,6)\n\ndef city_temp(**param):\n    for key,value in param.items():\n        print(key,':',value)\n\ncity_temp(bj='32',xh='23c',sh='32c') //dict 类型       \n\na = {'bj':'32','xh':'23c' ,sh:'32c'}\ncity_temp(**a)\n```\n9. 变量的作用域\n```\nc = 50  // 全局变量\n\ndef add(x,y):\n    c = x + y  //局部变量\n    print(c)\n\nadd(1,2)  // 3\nprint(c) //50\n\n# 没有块级作用域，for 循环的变量和函数的变量是同一层级\n\n# 作用域链，层级寻找\nc = 1\ndef func1():\n    c = 2\n    def func2():\n        c = 3\n        print(c)\n    func2()\n\nfunc1()        \n```\n10. global 关键字,成为全局变量\n```\ndef demo():\n    global c \n    c = 2\n\ndemo()\nprint(c)    \n```\n11. 练习题\n```\n游戏的经济系统\n五行石的合成  1 - 8 级\n来源 自己合成 ，其他玩家购买\n市场货币:金币\n五行石 合成 金币，钻石，体力\n\n目标得到 6级五行石\n1. 1级 五行石 消耗金币和钻石\n2. 1级 =\u003e 3级 五行石 12个1级， \n\n```\n### 第八天\n\n#### 类和面向对象\n1. 类和 实例化\n```\nclass Student():\n    name = ''\n    age = 0\n\n    def print_file(self):\n        print('name: '+ self.name)\n        print('age: '+ str(self.age))\n\nstudent = Student()\nstudent.print_file()\n```\n2. 类的基本作用:封装\n3. 模块功能单一，要么定义类，要么执行类\n4. 方法和函数的区别\n- c, C++ 叫函数，面向过程的概念，不定义在类里\n- java ,C# 叫方法，面向对象的概念，设计层面，定义类里，\n- 变量在类里叫数据成员，不在类里叫变量\n5. 类和对象\n- 类定义特征和行为\n- 类实例化就是对象\n6. 构造函数\n7. 局部模块中的变量和类中的变量\n8. 实例变量和类变量(类共有的变量)\n9. 类与对象的变量查找顺序\n10. self 和 实例方法\n- self 类似 this ,self 可以改为 this\n- 强制要求在方法定制第一个参数为 self\n- self就是当前调用方法的实例\n11. 实例方法访问实例变量和类变量\n```\npython 类\n    - 变量\n        - 类变量\n        - 实例变量\n    - 方法\n        - 实例方法\n        - 类方法\n        - 静态方法\n    - 构造函数\n    - 成员的可见性\n        - 公开\n        - 私有\n    - 面向对象的3大特性\n        - 封装性\n        - 继承性(最难)\n        - 多态性    \n```\n```\nprint(Student.sum1)\nprint(self.__class__.sum1)\n\n@classmethod\ndef plus_sum(cls):\n    cls.sum += 1\n    print(cls.sum)\n\n@staticmethod\n    def add(x,y):\n        print('This is a static method')   \n\n\nStudent.plus_sum()\n\n# 其他语言\npublic name\nprivate sum\n\npython\n方法和变量以 __ 开头，构造函数除外 __init__\nstudent1.__score = -1  # 不是不报错，而是新增了一个属性  \nprint(student1.__score)\n\nprint(student2._Student__score)\n```\n12. 静态方法尽量可以类方法代替\n13. 对类的成员的变量赋值通过方法，可以做校验，不要直接赋值\n14. python的私有变量 __score 更换为 _Student__score\n15. 继承， 学生的类 继承 人的类\n- python 可以单继承和多继承\n16. 子类调用父类的方法\n```\nPeople.__init__(self,name,age)\n# 关键字super 调用父类\nsuper(Student,self).__init__(name,age)\nsuper(Student,self).do_homeword()\n```\n- 开闭原则，对类的更改的是封闭的\n\n### 第九天\n\n#### 正则表达式\n\n1. 正则表达式定义\n- 正则表达式是一个特殊的字符序列，一个字符串是否与我们所设定的这样的字符序列是否匹配\n- 实现文本检索，文本替换\n```\nimport re\n\na = 'C|C++|C#|Python|Java|Javascript'\nr = re.findAll('python',a)\nprint(r);\n```\n- 正则表达式的灵魂是规则\n2. 元字符和普通字符\n```\n普通字符\n'Python'\n\n元字符 重点\n\\d  匹配数字字符 [0-9]\n\n\n\n```\n3. 概括字符集\n4. 数量词\n- * 0次或多次\n- + {1,}\n- ? {0,1}\n5. 贪婪和非贪婪\n- 贪婪就是尽可能匹配更多，默认的\n- 非贪婪，在数量词后面加 ？\n6. 边界匹配 ^ $\n7. 组 ()\n8. 匹配模式 re.I re.S\n9. re.sub 正则替换\n- 把函数作为参数传递\n10. re.match\n11. re.search\n12. group 分组\n13. python 主要应用场景 爬虫，数据分析和处理\n- 电话号码校验\n- qq校验\n- 工作上使用别人写好的表达式，效率高\n- 学习上多使用正则表达式\n\n### 第十天\n\n#### JSON\n1. 什么事JSON\n- JSON - Javascript Object Notation\n- 轻量级的数据交换格式\n- JSON字符串符合JSON的数据格式\n- XML 也是数据交换格式\n\n2. 优点\n- 易于阅读\n- 跨语言交换数据\n- 易于解析\n- 网络传输效率高\n\n3. 使用场景\n- 网站后台 =\u003e JSON  =\u003e 浏览器\n- 不同语言服务的JSON 数据交换\n4. python中使用JSON\n5. 反序列化，把json字符串转化成对应的数据结构\n6. 序列化 \n7. JSON 对象,JSON,JSON字符串\n- JSON 是 基于 ECMA规范生成的 ，不是javascript的附属品\n- JSON 有自己的数据类型\n- 中间语言的数据交换格式\n- REST服务使用json\n\n### 第十天\n\n#### 枚举\n- Enum 枚举\n- Enum 类 和普通的类区别\n```\n//都是可变的\n//没有防止相同标签的功能\nyellow = 1\ngreen = 2\n{'yellow':1,'green':2}\n\n\nclass TypeDiamond():\n    yellow = 1\n    green = 2\n\nfrom enum import Enum\n\nclass VIP(Enum):\n    YELLOW = 1\n    GREEN = 2\n    BLACK = 3\n    RED = 4\n\n\n# 枚举的意义重在标签，而不是数值\nprint(VIP.YELLOW) \n\n// 枚举不可变，       \n```\n- 枚举的比较,只能在枚举类型之间比较，is ==\n- 枚举转换\n```\n数据库里用数字代替枚举类\n//可读性差\nif a == 1:\n    print()\nelse if a== 2: \n    print()  \n\nif a == VIP.YELLOW:\n    print()\nelse if b == VIP.BLACK:\n    print()   \n\n```\n- Enum ,IntEnum ,unqiue\n- 枚举类型是单例模式实现的\n\n### 第十一天\n\n#### 对象和闭包\n1. 用函数式的编程思维解决问题\n2. 闭包\n- 函数只是一段可执行的代码，不是对象，不能实例化\n- python 一切皆对象\n- 函数当作参数，传递到另外一个参数\n- 函数当作函数的返回值\n- 一个函数和它的环境变量构成\n```\nprint(f.__closure__)\nprint(f.__closure[0].cell_contents)\n```\n- 闭包保存的是一个环境，意义重大\n- 闭包解决问题\n- 闭包间接实现在函数外部调用函数内部的变量\n- 闭包容易造成内存泄露\n\n### 第十二天\n\n#### 函数式编程\n1. lambda\n2. 三元表达式 x if x \u003e y else y\n3. map\n4. map 结合 lambda\n5. reduce\n6. filter\n7. 命令式编程和函数式编程\n```\n命令式\ndef if else for\n\n函数式\nmap reduce filter\nlambda \n```\n8. 装饰器 可变参数，关键字参数\n- 满足复用性\n- 符合开闭原则\n9. AOP 面向切片编程\n\n### 第十三天\n\n#### 杂记\n1. 字典代替switch case\n2. 列表推导式\n3. 字典编写推导式\n4. None\n5. 对象存在不一定是True\n6. 装饰器的副作用\n- fn.__name__ 被改变，无法预知的错误\n```\nfrom functools import wraps\n@wraps(func)\ndef wrapper():\n\n```\n### 第十四天\n\n#### 简单的爬虫\n1. 爬虫的目的，熊猫TV直播的某一类主播的人气排行(英雄联盟)\n2. 必须充分了解网站的页面结构\n- 以 观看人数来标识主播人气\n3. 实现思路\n- 查看页面的html结构\n- 找到需要的数据，主播名字-观看人数\n- 对html 页面分析，提取信息\n- 使用正则表达式匹配相应的标签位置\n- 模拟http请求，想服务器发送请求，服务器放回整个html页面\n- 用正则表达式提取我们要的数据(名字,人气)\n- 标签的目的是定位\n- 数据提取层级分层，找符合定位标签的容器标签，二期是闭合的\n```\nvideo-info \n    video-nickname\n    video-number\n```\n4. 断点调试\n5. 定义入口函数\n6. 入口函数避免嵌套函数，使函数平级\n7. 避免一个函数代码过多，体积越小越灵活，行数[5,20]之间\n8. 爬虫框架:BeautifulSoup,Scrapy\n9. 爬虫 =\u003e 反爬虫 =\u003e 反反爬虫\n10. 小心ip被封，寻找代理ip库\n\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwangxiaoyugg%2Fpython-journey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwangxiaoyugg%2Fpython-journey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwangxiaoyugg%2Fpython-journey/lists"}