{"id":22283765,"url":"https://github.com/veaba/learn-python","last_synced_at":"2025-10-11T08:12:31.492Z","repository":{"id":104582196,"uuid":"168274956","full_name":"veaba/learn-python","owner":"veaba","description":"learn python language，more demos.","archived":false,"fork":false,"pushed_at":"2021-11-06T07:18:42.000Z","size":426,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-25T19:53:26.135Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/veaba.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2019-01-30T03:46:27.000Z","updated_at":"2021-11-13T16:53:59.000Z","dependencies_parsed_at":null,"dependency_job_id":"156f7d53-7954-4bf8-ae8e-22927af4cc46","html_url":"https://github.com/veaba/learn-python","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/veaba/learn-python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Flearn-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Flearn-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Flearn-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Flearn-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/veaba","download_url":"https://codeload.github.com/veaba/learn-python/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Flearn-python/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279006756,"owners_count":26084148,"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","status":"online","status_checked_at":"2025-10-11T02:00:06.511Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2024-12-03T16:42:05.396Z","updated_at":"2025-10-11T08:12:31.428Z","avatar_url":"https://github.com/veaba.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## learn python\n\n## Sponsors\n\n提示：本项目开发所使用的开发工具（PyCharm Professional）受JetBrans的免费赞助，再次非常感谢JetBrans 为开源项目免费提供开发工具的项目（[JetBrans Free Open Source Licenses](https://www.jetbrains.com/community/opensource/)）\n\n\n\u003ch2 align=\"center\"\u003eSPONSORS\u003c/h2\u003e\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://www.jetbrains.com/?from=learn-python\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\u003cimg width=\"100\" src=\"./images/sponsors-logos/jetbrains-variant-3.png\" alt=\"Jetbrans logo\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch4 align=\"center\"\u003e\n    Thanks JetBrans Open Source Support Program\n\u003c/h4\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"./images/sponsors-logos/py-license.png\"\u003e\n\n\u003c/p\u003e\n\n\n## 链接/文档/指引\n- Python官方的一些QA https://docs.python.org/zh-cn/3/faq/programming.html#performance\n\n## 疑问\n\n1. python 变量不会提升\n```python\n# 顺序不能反着\na=99\nprint(a)\n```\n2. 二进制符号转十进制\n\n```python\nbin(10) #0b1010\n```\n\n3. 十进制如何转二进制\n\n```python\nint(0b1010) #10\n```\n\n4. 随机数，报错，需要在声明时：文件名、变量名都尽可能的避开关键字\n\u003e 随机数，`.py`的文件名不能是`random`，否则无法引入module，从而报错\n```python\nimport random\nprint(random.random())\n\n```\n5. 数字1 如何转为字符1\n\n```python\nstr(1) =\u003e '1'\n```\n\n6. 月份或者秒数，未满10如何快速补零，在转为时间格式的时候\n\n7. 如何读取任意的一行？\n8. 如果写入中文汉字？\n```python\nwith open('a.text','w',encoding=\"utf-8\") as f:\n    f.write('中文在此')\n\n```\n\n9. raise关键字，抛出异常\n```python\na=11\n\nif a\u003e10:\n    print (\"What?\")\n    raise RuntimeError(\"ahaha\")\n\nprint(\"放开我，我没错\")\n```\n10. 运行python文件，打印了一堆以前的日志\n    - 和缓存有关系？？尝试在运行的路径下删除__pycache__ 目录\n11. 交换变量\n```python\na=1\nb=2\na,b=b,a\n```\n12. 判断是否是数字？\n```python\ni=9\nif not isinstance(i,int) # 不是数字\nif isinstance(i,int) # 是数字\n```\n13. 如何可选参数？\n```python\ndef xx(x=None):\n    print(x)\nxx()\n```\n14. list 转字符\n\n```python\n\nlist1=[12,123,56,99]\nlist2=[str(1) for i in list1]\nprint(' '.join(list2))\n\n```\n15. 默认下，字典，写成json是 单引号的key，如何转为双引号\n16. pass 关键字是做什么的\n- 空执行，什么都不做的意思\n```python\npass\n\n# 一般if 语句下面要有其他执行语句，但可以使用pass 这个关键字，什么都不做\n```\n\n17. 文件暴露变量给其他用\n\n    - 此处和python module 一起的\n\na.py\n\n```python\nxx=[11,22,33]\n```\n\nb.py\n\n```python\nfrom a import xx\n\nprint(a)\n```\n18. python 异步编程怎么搞？\n- 内置库：asynacio\n- 线程池\n19. python for 循环里面的任务过于长，怎么多线程处理？\n\n20. python 如何查看某个module或者class的方法和属：dir(xx)\n\n21. python 自增\n\npython 不支持i++ 的自增运算符\n可以用 i+=1 来替代\n\n\n22. python bytes 转 str\nb=b'aaa'\nstr(b,encoding=\"utf-8\")\n\n23. python str 转bytes\ns='啊哈313adv'\nbytes(s,encoding='utf-8')\n24. 打印行数\n```python\nimport sys\nsys._getframe().f_lineno\n```\n\n25. python 实现类定时器功能\n```python\nimport time\nwhile True:\n    time.sleep(1)\n    print(time.time(),111)\n```\n--------------------\n## 举一反三：来自本人demo\n### 给Python 提交了一个反斜杠替换符不允许超过100的issues\n地址：https://bugs.python.org/issue38582%3E\n\n开发者回复更简单的例子实现：\n\n```python\nimport re\n\nNUM = 99\n\n# items = [ '(001)', '(002)', '(003)', ..., '(NUM)']\nitems = [r'(%03d)' % i for i in range(1, 1+NUM)]\npattern = '|'.join(items)\n\n# repl = '\\1\\2\\3...\\NUM'\ntemp = ('\\\\' + str(i) for i in range(1, 1+NUM))\nrepl = ''.join(temp)\n\ntext = re.sub(pattern, repl, '(001)')\nprint(text)\n\n# if NUM == 99\n# output: (001)\n# if NUM == 100\n# output: (001@)\n# if NUM == 101\n# output: (001@A)\n```\n\n以及源码地址：https://github.com/python/cpython/blob/v3.8.0/Lib/sre_parse.py#L1022-L1036\n\n\n![](images/re-overflow.png)\n\n### python 存储实例到数组下次再调用（TODO）\n1. new 一个实例出来耗时1-10s不等\n2. a 实例完成工作时候先不销毁，将实例存储到一个数组array里面\n3. 下一个任务，直接从数组array里面拿实例a过来使用，减少重复创建实例的时间\n\n优化前\n```python\n# 存储实例测试\nimport time\ninstanceList=[]\n\nclass A:\n    def __init__(self):\n        instanceList.append(self)\n        time.sleep(1)\n    def go(self,i):\n        # time.sleep(1)\n        print(i,'我被实例化拉！',time.time())\n\n\nstart=time.time()\nfor i in range(10):\n    a=A()\n    a.go(i)\ninstanceList=[] #销毁\nend=time.time()\nprint(instanceList)\nprint('消耗时间：',end-start) # 消耗时间： 1.0\n\n```\n优化后：\n```python\n# 存储实例测试\nimport time\ninstanceList=[]\n\nclass A:\n    def __init__(self):\n        instanceList.append(self)\n        time.sleep(1)\n    def go(self,i):\n        # time.sleep(1)\n        print(i,'我被实例化拉！',time.time())\n\n\nstart=time.time()\nfor i in range(10):\n    if len(instanceList):\n        instanceList[0].go(i)\n    else:\n        a=A()\n        a.go(i)\n\ninstanceList=[] #销毁\nend=time.time()\nprint(instanceList)\nprint('消耗时间：',end-start) # 消耗时间： 1.0\n\n```\n\n### 截断式及嵌套式编程（瞎起名词~~）\n根据文件[ifreturn.py](ifreturn.py)文件测试，发现：\n\n截断式（先判断再执行下一层函数）比嵌套式（先进入函数再在函数内部多判断）执行时间还小！\n所以，最好先判断再进入函数，避免无辜的时间损耗！\n```python\n# 方式一：函数嵌套的组合即：多传球 \n# 耗时： 0.01699995994567871\n# 耗时1： 0.20300006866455078 100w 打印\n# 耗时1： 0.16100001335144043 100w 无打印\n\n\n\n# 方式二：截断式\n# 耗时： 0.016000032424926758\n# 耗时2： 0.16000008583068848 100w 打印\n# 耗时2： 0.11500000953674316 100w 无打印\n```\n\n\n## 数据类型\n- Number数字 ——`不可变数据`\n\t- int\n\t- float\n\t- bool\n\t- complex 复数\n- String 字符串 ——`不可变数据`\n- Tuple 元组 `不可变数据`\n\n- List 列表 ——`可变数据`\n- Set 集合 ——`可变数据`\n- Dictionary 字典 ——`可变数据`\n\n## 列表\n\n### 快速创建列表\n\n```python\nalist=range(5)\nprint(list(alist))\n\n```\n\n## 字典（js中的对象）\n\n\n### 字典排序等\n```python\ndef dirt_sort():\n    obj = {\n        \"127.0.0.1\": 54,\n        \"115.192.59.226\": 33,\n        \"124.160.26.190\": 192,\n        \"74.82.47.4\": 6,\n        \"140.205.225.204\": 100,\n        \"120.55.13.109\": 69,\n        \"47.52.210.105\": 25,\n        \"93.174.95.106\": 1,\n        \"140.205.225.190\": 75,\n        \"196.52.43.53\": 2,\n        \"47.94.52.138\": 56,\n        \"47.52.210.90\": 21,\n        \"74.82.47.3\": 12,\n        \"121.42.203.142\": 37,\n        \"119.23.138.247\": 72}\n    print(obj.values())\n    print(obj.keys())  \n    # list_obj_value = list(obj.values())\n    # list_obj_key = list(obj.keys())\n\n    # print(list_obj_value)\n    # print(list_obj_key)\n    # 默认对obj的键从小到大排序\n    # print(\"排序:\", sorted(obj))\n    # 默认对obj的键从小到大排序，取得元组的排序\n    print(\"排序:\", sorted(obj.items()))\n\n    # 结果\n    print(\"对值排序：\", sorted(obj.items(), key=lambda x: x[1]))\n   \n    print(\"对值逆序：\", sorted(obj.items(), key=lambda x: x[1], reverse=True))\n    \n    # 需要转回字典\n    print(\"对值逆序：\", dict(sorted(obj.items(), key=lambda x: x[1], reverse=True))) \n\n```\n### 字段转字符\n\n```python\ndict_keys(['tf.train'])\n\n#\n\nprint(''.join(obj.keys()))\n\n```\n### list 转为字典\n\n```python\n\ndef list_to_dict():\n    a_list = [\"127.0.0.1\", \"99,99,9,99\"]\n\n    print(dict.fromkeys(a_list))\n\n\nlist_to_dict() # {'127.0.0.1': None, '99,99,9,99': None}\n\n```\n### list key、index，用enumerate返回list\n```python\nfor index,key in enumerate(f.readlines()):\n    print(index,key)\n\n```\n\n### 元组转为字典\n\n```python\na_tup=[('127.0.0.1', 192)]\nprint(dict(a_tup)) #{'127.0.0.1': 192}\n\n```\n\n### 字典相减，目的为了移除部分\n```python\nfrom collections import Counter\ndef dict_subtract():\n    parent_dict = {\"a\": 999, \"b\": 888, \"c\": 777, \"d\": 666}\n    child_dict = {\"d\": 666}\n\n    print(dict(Counter(parent_dict)-Counter(child_dict)))\n\n\ndict_subtract()\n```\n\n### 字典相加，目的，为了融合，对象合并，字典合并,而且是对于ini类型的值\n```python\nfrom collections import Counter\ndef dict_subtract():\n    parent_dict = {\"a\": 999, \"b\": 888, \"c\": 777, \"d\": 666}\n    child_dict = {\"d\": 666}\n\n    print(dict(Counter(parent_dict)+Counter(child_dict)))\n\n\ndict_subtract()\n```\n\n### 字典合并为新字典\n\n```python\n    parent_dict = {\"a\": 999, \"b\": 888, \"c\": 777, \"d\": 666}\n    child_dict = {\"d\": 666}\n    new_dict={**parent_dict,**child_dict}\n```\n\n### 字典导入到另外一个字典\n```python\n    parent_dict = {\"a\": 999, \"b\": 888, \"c\": 777, \"d\": 666}\n    child_dict = {\"d\": 666}\n    new_dict=parent_dict.update(child_dict)\n```\n\n## 元组\n\n### 快速创建元组\n```python\natup=range(5)\nprint(tuple(atup))\n```\n\n### 元组生成字典\n\n```python\ntup1 = (1, 3, 5)\nobj4 = dict.fromkeys(tup1) \nobj5 = dict.fromkeys(tup1, \"hello\")\nprint(obj4)\nprint(obj5)\n\n```\n\n### 元组取值 和list 取值一样\n\ntup1[1]\n\n### 列表统计次数转为字段\n\n```python\n\n# list\ndef go_list():\n    a_list = [1, 1, 1, 1, 2, 3, 4, 6, 6, 9]\n\n    obj = {}\n    for item in a_list:\n        obj[item] = str(a_list.count(item))+'次'\n    print(obj)  # {1: '4次', 2: '1次', 3: '1次', 4: '1次', 6: '2次', 9: '1次'}\n\n\ngo_list()\n\n\n```\n\n## 变量\n\n- 大小写英文、数字或者`_`的组合，且不能数字开头\n- 没有关键字声明，没有类型\n\n\n## 关键字\n\n- end，结果输出到同一行，在末尾添加字符\n- print\n- input\n- chr\n- raise\n- ord\n- `b'ABC'`\n- `r''` 表示 `''`内部字符串默认不转译\n- `del x `删除某个变量\n\n## 运算符\n\n- `=` 赋值\n- `/` 除法\n- `//`地板除,取整\n\n### 算数运算符 TODO\n\n|算术运算符|描述|例子|\n|---------|---|----|\n|+|加法||\n|-|减法||\n|/|除法||\n|*|乘法||\n|%|取模，返回除法的余数||\n|**|幂，返回x的y次幂||\n|//|取整除，向下取接近除数的整数||\n||||\n\n### 比较运算符 TODO\n\n|比较运算符|描述|例子|\n|---------|---|----|\n|\u003e|大于比较符||\n|\u003c|小于比较符||\n|\u003e=|大于等于比较符||\n|\u003c=|小于等于比较符||\n|==|等于比较符||\n|!=|不等于比较符||\n\n### 赋值运算符 TODO\n\n|赋值运算符|描述|例子|\n|---------|---|----|\n|=|简单的赋值运算符|c=a+b结果给c|\n|+=|加法赋值运算符||\n|-=|减法赋值运算符||\n|*=|乘法赋值运算符||\n|/=|除法赋值运算符||\n|%=|取模赋值运算符||\n|**=|幂赋值运算符||\n|//=|取整除赋值运算符||\n||||\n### 位运算符 TODO\n|位运算符|描述|例子|\n|---------|---|----|\n|\u0026|与运算||\n|▏|或运算||\n|^||异或运算|\n|~|位取反运算||\n|\u003c\u003c|||\n|\u003e\u003e|||\n||||\n### 逻辑运算符 TODO\n|逻辑运算符|逻辑表达式|描述|例子|\n|---------|---|---|----|\n|and|x and y| 布尔与|(a and b)|\n|or |x or y|布尔或|(a or b)|\n|not|not x|布尔非|not(a and b)|\n|||||\n### 成员运算符 TODO\n|成员运算符|描述|例子|\n|---------|---|----|\n|in| 指定序列找到某值||\n|not int|执行序列没有找到某值||\n||||\n### 身份运算符 TODO\n|身份运算符|描述|例子|\n|---------|---|----|\n|is|判断是不是引用自一个对象||\n|is not|判断是不是引用自不同对象||\n### 运算优先级 TODO\n|优先级运算符|描述|\n|---------|---|\n|`**`|指数||\n|`~`、`+`、`-`|安位翻转，一元加号、一元减号|\n|`*`、`/`、`%`、`//`||\n|`+`、`-`||\n|`\u003e\u003e`、`\u003c\u003c`|位操作|\n|`\u0026`||\n|`^`、` ▏`||\n|`\u003c=`、`\u003c`、`\u003e`、`\u003e=`||\n|`\u003c`、`\u003e`、`==`、`!=`||\n|`=`、`%=`、`/=`、`//=`、`-=`、`+=`、`%*=`、`**=`、|赋值运算符|\n|`is`、`is not`||\n|`in`、`not in`||\n|`and`、`and or not`||\n|||\n\n## 语法\n\n- 注释 \nprint('xx')\n\n## python 异步编程怎么搞？\n\n\u003e 循环下异步的任务回来。\n\n## 注释\n- `#` 单行\n- `'''` 单引号多行注释\n- `\"\"\" ` 双引号多行注释，推荐,编辑器推荐\n\n## 数据结构\n###\n### 布尔值\n\u003e 大写开头\n```python\nprint(True and True)\n# 类似 JavaScript 1\u0026\u00262\n\n```\n- True\n- False \n## 语句\n### 逻辑语句\n- and\n```python\nprint(True and True)\nprint(True and False)\n```\n- not\n\t- 类似JavaScript 中的 ! 操作符\n\t- not 以下都是True `0 ` 、` False`、`None `、`''`\n```python\nprint(not True)\nprint(not False)\n```\n### if\n- 需要在语句结束后，加冒号\n- 且需要前置tab 换行，否则出错\n- 可以是4个，但建议是8个空格\n```python\nname = 100\nif name \u003e= 0:\n    print(name)\nelse:\n    print(-name)\n\n```\n\n### and\n```python\nprint (True and True)\n```\n## 字符串\n- 字符串，单引号或者双引号创建，这一点和JavaScript一样\n- 字符串链接也和JS一样,使用 `+`加号来实现\n```python\nprint('''\nx\no\n''')\n\n```\n\n### Python 转义符\n\n|转义字符|描述|\n|-------|----|\n|`\\`（在行尾时）|续行符|\n|`\\\\`|反斜杠符号|\n|`\\'`|单引号|\n|`\\\"`|双引号|\n|`\\a`|响铃|\n|`\\b`|退格(backspace)|\n|`\\000`|空|\n|`\\n`|换行符|\n|`\\v`|纵向字符表|\n|`\\t`|横向字符表|\n|`\\r`|回车|\n|`\\f`|换页|\n|`\\oyy`|八进制，yy代表字符，\\o12代表换行|\n|`\\xyy`|十六进制，yy代表字符，\\x0a代表换行|\n|`\\other`|其他字符以普通格式输出|\n|||\n\n### 占位符/字符串格式化\n\n|占位符|替换内容|\n|----|---|\n|`%c`||\n|`%d`|整数 double|\n|`%f`|浮点 float|\n|`%s`|字符串 string|\n|`%x`|格式化十六进制 hex|\n|`%X`|格式化十六进制（大写） hex|\n|`%u`|格式化无符号整形，什么叫无符号整形|\n|`%o`|格式化无符号八进制|\n|`%e`|科学计数法格式化浮点数|\n|`%E`|同%e|\n|`%g`|%f 和 %e的简写|\n|`%G`|%f 和 %E简写|\n|`%p`|用十六进制格式化变量的地址|\n|||\n```python\nprint('Hi, %s, you have $%d.dd %xd %f ' % ('Michael', 1000000,0xab,0.33))\n```\n### Python字符串运算符\n|操作符|描述|\n|-----|----|\n|`+`||\n|`*`||\n|`[]`||\n|`[:]`||\n|`in`||\n|`not in`||\n|`r/R`||\n|`%`|格式化字符|\n|||\n\n### 三引号\n\u003e 可以使用特殊字符和引号，比如html代码等\n\n### Unicode字符串/Python字符串内建函数\n- capitalize()第一个字符串转大写\n\u003e \n- center(width,fillChar) 指定宽度填充字符\n\u003e \n- count(str,beg=0,end=len(string)) 返回str在string里面出现的次数，\n- bytes.decode(encoding=\"utf-8\",error=\"strict\")\n\u003e \n- encode(encoding=\"UTF-8\",errors=\"strict\")\n- endswith(suffix,beg=0,end=len(string))\n- expandtabs(tabsize=0)\n- expandtabs(tabsize=0)\n- find(str,beg=0,end=len(string))\n- index(str,beg=0,end=len(string))\n- isalnum()\n- isalpha()\n- isdigit() 判断是否是数字组成的\n- islower()\n- isnumeric()\n- isspace()\n- istitle()\n- isupper()\n- join(seq)\n- len(string)\n- ljust(width[.fillchar])\n- lower()\n- maketrans()\n- max(str)\n- min(str)\n- replace(old,new[,max])\n- rfind(str,beg=0,end=len(string))\n- rindex(str,beg=0,end=len(string))\n- rjust(width,[,fillchar])\n- rstrip()\n- split(str=\"\",num=string.count(str))\n- splitline([keepends])\n- startswith(substr,beg=0,end=len(string))\n- strip([chars]) 雷同js中的trim()，移除首位空格\n- swapcase()\n- title()\n- translate(table,deletechars=\"\")\n- upper()\n- zfill(widht)\n- isdecimal()\n- \n\n## 异步编程：asyncio\n\u003e python 由于GIL（全局锁：啥玩意？？），无法发挥多核优势\n\n[_asyncio](_asyncio.py)\n\n- 同步：先完成这个，等待，阻塞\n- 异步：完成一系列任务，取最长的时间的那个任务为总任务时间，任务之间，通过状态、通知、回调来处理调用处理结果\n\n\n### 每秒输出一行字符\n\n```python\nimport time\n\n\ndef hello():\n    time.sleep(1)\n\ndef run():\n    for i in range(10):\n        hello()\n        print(\"哇哈哈：%s\" % time.time())\n\nrun()\n\n\n\n```\n\n\n## 方法/函数\n- 区别：\n\t- 函数手动self，方法不要传\n\t- 函数，需要类名去调用，方法，用对象去调用\n- 如何可选参数?\n\n### 函数参数\n    - 必须参数\n    - 关键字参数\n    - 默认参数\n    - 不定长参数\n### ord() 获取字符串的整数表述\n### chr()编码转为对应字符\n### input()  读键盘输入\n### encode()\n### decode()\n### range函数\n### print() 打印函数\n### enumerate()函数,遍历得到索引值和值\n### type 查看数据类型\n\n```python\na=111\nprint(type(a))\n\n\nprint(type(obj) == dict)# dict\nprint(type(obj)==str) #string\n\n```\n### isinstance\n```python\na=652\nisinstance(a,int)\n```\n### items()方法\n### zip函数\n### reversed函数，逆序\n### sorted函数排序 \n### dir()函数,导入模块定义的其他名称\n### str()函数：用户易读，数字转为字符串\n### repr()函数：产生一个解释器易读的表达式形式\n### format() 字符串填充的方法，\n\u003e print('{}xx:,{}oo'.format(\"hello\",\"world\"))\n\u003e print(\"{0:.3f}\",format(math.pi)) # Pi保留小数点后三位\n\n\u003e 表格格式化\n```python\ntable = {'Google': 1, 'Runoob': 2, 'Taobao': 3};\nfor name,number in table.items():\n\tprint(\"{0:10} ==\u003e {1:10d}\".format(name,number))\n\n```\n\n### open(filename,mode) \n\n## 循环迭代\n\n### for\n\n```python\ntest = [541564, 5, 654, 656, 5]\narray = [\"维\", \"护\", \"世\", \"界\", \"和\", \"平\"]\nfor x in test + array:\n    print(x)\n\n```\n### while\n\n- 只有一行时候可以写成为一行\n### while else语句\n\n### break可以跳出for的循环体\n\n### range函数，遍历数字序列\n## 判断\n- python 没有switch-case语句\n- 0 为false\n### if\n### elif\n### else\n\n## 外部脚本\n```python\n# 键盘输入\nage=int(input(\"请输入xxx:\"))\n\n# 回车执行\ninput(\"click enter out\")\n\n```\n\n\n## 作用域\n- 只有module、class、函数(def、lambda)才会引入新的作用域\n- if/elif/esle、try/except、for/while 定义的变量，外部可以访问\n### 本地作用域\n### 闭包函数外函数作用域\n### 全局作用域\n### 内置作用域\n```python\n#import builtins\n#import __builtin__\n#import __builtin__\n# dir(builtins)\n#print(dir(builtins))\n\n```\n- ArithmeticError\n- AssertionError\n- AttributeError\n- BaseException\n- BlockingIOError\n- BrokenPipeError\n- BufferError\n- BytesWarning\n- ChildProcessError\n- ConnectionAbortedError\n- ConnectionError\n- ConnectionRefusedError\n- ConnectionResetError\n- DeprecationWarning\n- EOFError\n- Ellipsis\n- EnvironmentError\n- Exception\n- False\n- FileExistsError\n- FileNotFoundError\n- FloatingPointError\n- FutureWarning\n- GeneratorExit\n- IOError\n- ImportError\n- ImportWarning\n- IndentationError\n- IndexError\n- InterruptedError\n- IsADirectoryError\n- KeyError\n- KeyboardInterrupt\n- LookupError\n- MemoryError\n- ModuleNotFoundError\n- NameError\n- None\n- NotADirectoryError\n- NotImplemented\n- NotImplementedError\n- OSError\n- OverflowError\n- PendingDeprecationWarning\n- PermissionError\n- ProcessLookupError\n- RecursionError\n- ReferenceError\n- ResourceWarning\n- RuntimeError\n- RuntimeWarning\n- StopAsyncIteration\n- StopIteration\n- SyntaxError\n- SyntaxWarning\n- SystemError\n- SystemExit\n- TabError\n- TimeoutError\n- True\n- TypeError\n- UnboundLocalError\n- UnicodeDecodeError\n- UnicodeEncodeError\n- UnicodeError\n- UnicodeTranslateError\n- UnicodeWarning\n- UserWarning\n- ValueError\n- Warning\n- WindowsError\n- ZeroDivisionError\n- __build_class__\n- __debug__\n- __doc__\n- __import__\n- __loader__\n- __name__\n- __package__\n- __spec__\n- abs\n- all\n- any\n- ascii\n- bin\n- bool\n- breakpoint\n- bytearray\n- bytes\n- callable\n- chr\n- classmethod\n- compile\n- complex\n- copyright\n- credits\n- delattr\n- dict\n- dir\n- divmod\n- enumerate\n- eval\n- exec\n- exit\n- filter\n- float\n- format\n- frozenset\n- getattr\n- globals\n- hasattr\n- hash\n- help\n- hex\n- id\n- input\n- int\n- isinstance\n- issubclass\n- iter\n- len\n- license\n- list\n- locals\n- map\n- max\n- memoryview\n- min\n- next\n- object\n- oct\n- open\n- ord\n- pow\n- print\n- property\n- quit\n- range\n- repr\n- reversed\n- round\n- set\n- setattr\n- slice\n- sorted\n- staticmethod\n- str\n- sum\n- super\n- tuple\n- type\n- vars\n- zip\n### global 和monlocal关键字\n\n\n## module\n\n### import sys \n```text\n\u003e\u003e\u003e import sys\n\u003e\u003e\u003e sys.ps1='爱\u003e'\n爱\u003e\n```\n### import your_module\n### form xxx import oo\nPython 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中\n\n### from...import * \n- 把一个模块的所有内容全都导入到当前的命名空间也是可行的\n- 那些下划线_ 开头的名字无法导入,而是作为私有的属性\n\n### __name__属性，如果是__main__自己的本身运行，否则是别人在引用\n\n\n### 包package，点模块名称\n\n### 从一个包中导入*\n- 包定义文件 `__init__.py` 中包含一个叫`__all__`的列表变量 \n\n## 文件\n\n### f.write 写一个文件内容，并返回写入的长度\n\n### f.close()\n### f.flush()\n### f.fileno()\n### f.isatty()\n### f.read()\n### f.readline([size])\n### f.readline([sizeint]) \n若给定sizeint\u003e0，返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。\n### f.seek(offset[whence])\n### f.tell()\n### f.truncate([size]) 从size开始阶段，无size则从当前位置。阶段后面被删除\n### f.write(str)\n### f.writelines(squence) 写入一个序列字符串列表\n\n\n## os(62个)\n### os.access(path,mode)\n### os.chdir(path)\n### os.chflags(path,flogs)\n### os.chmod(path,mode)\n### os.chown(path,uid,gid)\n### os.chroot(path)\n### os.close(fd)\n### os.closerange(fd_low,fd_high)\n### os.dup(fd)\n### os.dup2(fd,fd2)\n### os.fchdir(fd)\n### os.fchmod(fd,mode)\n### os.fchown(fd,uid,gid)\n### os.fdatasync(fd)\n### os.fdopen(fd[,mode[,bufzie]])\n### os.fpathconf(fd,name)\n### os.fstat(fd)\n### os.fstatvfs(fd)\n### os.fsync(fd)\n### os.ftruncate(fd,length)\n### os.getcwd() 获取当前目录\n### os.getcwdu()\n### os.istty(fd)\n### os.lchflags(path,flags)\n### os.lchmod(path,mode)\n### os.lchown(path,uid,gid)\n### os.link(src,dst) \n### os.listdir(path)\n### os.lseek(fd,pos,how)\n### os.lstat(path)\n### os.major(device)\n### os.makedev(major,minor)\n### os.makedirs(path[,mode])\n### os.minor(device)\n### os.mkdir(path,[,mode])\n### os.mkfifo(path,[,mode])\n### os.mknod(filename[,mode=0600,device])\n### os.open(file,flags[,mode])\n### os.openpty()\n### os.pathconf(path,name)\n### os.pip()\n### os.popen(command[,mode[,bufsize]])\n### os.read(fd,n)\n### os.readlink(path)\n### os.remove(path)\n### os.removedirs(path)\n### os.rename(src,dst)\n### os.renames(old,new)\n### os.rmdir(path)\n### os.stat(path)\n### os.stat_float_times([newvalue])\n### os.statvfs(path)\n### os.symlink(src,dst)\n### os.tcgetpgrp(fd)\n### os.tcsetpgrp(fd,pg)\n### os.ttyname(fd)\n### os.unlink()\n### os.utime(path,time)\n### os.walk(top[.topdown=True,onerror=None[,followlinks=False]])\n### os.write(fd,str)\n### os.path模块\n\n\n## 错误和异常\n\n### 语法错误\n\n### 异常\n\n### 异常处理\n- `except OSError as err:`\n- `except ValueError:`\n- `except IOError:`\n- `except ZeroDivisionError as err:`\n- `except FileNotFoundError as err:`\n- `except UnicodeDecodeError as err:`\n\n```python\nwhile True:\n\ttry:\n\t\tx= int (input(\"输入个数字\"))\n\t\tbreak\n\texcept ValueError:\n\t\tprint(\"不对，请重输入\")\n\n```\n\n### 编译错误\n\n\u003e TypeError: 'str' object is not callable\n\n\u003e TypeError: can only concatenate str (not \"dict\") to str\n\n\u003e UnicodeEncodeError: 'utf-8' codec can't encode character '\\ud800' in position 319: surrogates not allowed\n\n\u003e TypeError: 'int' object is not subscriptable\n### 抛出异常\n-\n### 预定义的清理行为\n\n确保文件f总总是被关闭的\n```python\nwith open(\"xx.txt\") as f:\n\tfor line in f:\n\t\tprint(line)\n\n```\n\n\n## 面向对象\n\n### class 类。\n\n属性和方法的集合。每个对象共用的方法和属性，对象是类的实例\n\n\n- `_xxx` 无法被from module import ，只能被类和实例访问\n- `__xxx` 私有，只有类能自己访问，实例无法访问\n- `__xxx__` 一般是系统的。\n\n### method 方法。\n\n类中定义的函数\n\n### 类变量。\n\n整个实例化对象中是共用的，类变量定义在类中且在函数体之外，类变量通常不作为实例变量使用\n\n### 数据成员。\n\n类变量或者实例变量用于处理类 及其实例对象的相关数据\n\n### 方法重写。\n\n从父类继承的方法不能满足子类的需求，需要对齐进行改写，这个方法叫覆盖(override)，也叫方法的重写\n\n### 局部变量。\n\n方法中的变量，只作用于当前实例的类\n\n### 实例变量。\n\n在类中的声明中，属性是用变量来表示的，这种变量叫实例变量，类声明的内部，但在类的其他成员的方法之外。属于单独的类型的属性变量\n### 继承。\n\n派生类derived class 继承基类base class的字段(属性)和方法，\n继承允许把一个派生类的对象作为基类对象对待。\n派生类会覆盖基类的任何方法\n方法中可以调用基类的同名方法\n\n### 实例化。\n\n创建一个类型的实例，类的具体对象，一个过程.\n\n### 对象\n\n通过类定义的数据结构实例，对象包括两个数据成员（类变量、实例变量）的方法\n\n\n### 构造方法 __init__ 调用类的时候会自动去调用\n\n### self代表类的实例，而非类\n\n\n### class 的方法\n\n### 多继承,尚未掌握\n\n### 方法重写\n\n### 类的私有属性,__ 两个下划线开头\n\n### 类的方法\n\n### 私有方法\n- `__init__`      构造函数，在生成对象时候调用\n- `__del__`       析构函数，释放对象时使用\n- `__repr__`      打印，转换\n- `__setitem__`   按照索引赋值\n- `__getitem__`   按照索引获取值\n- `__cmp__`       获取长度\n- `__call__`      比较运算\n- `__add__`       加运算\n- `__sub__`       减运算\n- `__mul__`       乘运算\n- `__truediv__`   除运算\n- `__mod__`       求余、取模预算\n- `__pow__`       乘方\n\n### 实例\n\n### 类的专用方法\n\n### 运算符重载\n\n```python\n# 运算符重载\n\nclass Vector:\n    def __init__(self, a, b):\n        self.a = a\n        self.b = b\n\n    # TODO?\n    def __str__(self):\n        # print(\"__str__:\", self)\n        return \"Vector (%d, %d)\" % (self.a, self.b)\n\n    # 此处的other\n    def __add__(self, other):\n        # print(\"self:\", self)\n        # print(\"other:\", other)\n        return Vector(self.a + other.a, self.b + other.b)\n\n\nv1 = Vector(6, 9)\nv2 = Vector(8, 12)\nprint(v1, v2)\nprint(v1 + v2)\n\n```\n\n## 标准库\n\n### 操作系统 os模块\n### 文件通配符 glob模块\n- glob.glob(\"*.py\") 返回当前目录的文件名，数组的形式返回\n### 命令行参数 sys模块\n- sys.argv\n### 标准输入输出错误 sys模块\n- sys.stdin\n- sys.stdout\n- sys.stderr\n### 错误输出重定向和程序终止 sys模块\n- sys.exit()\n### 字符串正则匹配 re模块\n- re模块\n\n### url接受数据的urllib.request\n### 发送电子邮件的smtplib\n\n### 性能度量\n\n### 测试模块\n\n## 正则\n\n### 处理marddown 用到的一段代码\n\n```python\nimport re\ndef list_to_str(str_list,code=\"\"):\n    if isinstance(str_list, list):\n        return code.join(str_list)\n    else:\n        return EOFError\na_list=['aa','bb']\nst= 'while_loop(...): Repeat body while the condition cond is true.aa,擦擦,oooaAddsa.ssbb'\n\na_str=list_to_str(a_list,\"|\")\npa= re.compile(r'('+a_str+')')\n\nxx =re.sub(pa,\"`\"+\"\\\\1\"+\"`\",st)\n\nprint(xx)\n# 问题。把 aa和 bb换成 `aa` `bb`\n```\n## socket编程\n\n### socket对象-服务器端套接字\n- `s.bind()` (host,port)\n- `s.listen()` TCP监听，backlog指定在拒绝连接之前，至少1，一般设置为5即可\n- `s.accept()` 被动接受TCP客户端连接\n### socket对象-客户端套接字\n- `s.connect()`\n- `s.connect_ex()`\n### socket对象-公共用用途的套接字函数\n- `s.recv()`\n- `s.send()`\n- `s.sendall()`\n- `s.recvfrom()`\n- `sendto()`\n- `s.close()`\n- `s.getpeername()`\n- `s.getsockname()`\n- `s.setsockopt(level,optname,value)` 设置socket超时，浮点单位s，\n- `s.getsocketopt(leve,optname[,buflen])`\n- `s.settimeout(timeout)`\n- `s.gettimetout()`\n- `s.fileno()`\n- `s.setblocking(flag)`\n- `s.makefile()`\n\n## Python 如何实现HTTP服务- 网页服务\n- httplib\n- urllib\n- xmlrpclib\n## Python 如何实现NNTP服务- 帖子\n- nntplib\n## Python 如何实现FTP服务- 文件传输\n- ftplib\n- urllib\n## Python 如何实现SMTP服务- 发送邮件\n- smtplib\n## Python 如何实现POP3服务- 接收邮件\n- poplib\n## Python 如何实现IMAP4服务- 获取邮件\n- imaplib\n## Python 如何实现Telnet服务-命令行\n- telnetlib\n## Python 如何实现Gopher服务-信息查找\n- gopherlib\n- urllib\n\n## 多线程 (TODO后续再学习)\n\n【优点】：\n- 可以把占据长时间中的任务放到后台去处理\n- 程序的运行速度可能加快\n- 对于用户输入、读写、网络收发，可以释放内存占用等资源\n\n【特点】：\n- 线程可以被抢占（中断）\n- 在其他线程运行时，线程可以暂时被搁置（睡眠）——线程的退让\n\n【线程分类】：\n- 内核线程：又操作系统内核创建和撤销\n- 用户线程：不需要内核支持而在用户程序中实现的线程\n\n【Python线程模块】：\n- _thread\n- threading(推荐)\n\n### 线程模块 \n### threading 模块创建线程\n### 线程同步\n### 线程优先级队列（Queue）\n\n## XML解析\n## JSON\n### json.dumps()编码\n|Python|JSON|\n|---   |----|\n|dict|object|\n|list,tuple|array|\n|str|string|\n|int,float,int-\u0026 float-derived enums|number|\n|True|true|\n|False|false|\n|None|null|\n|||\n### json.loads()解码\n|JSON|Python|\n|----|------|\n|object|dict|\n|array|list|\n|string|str|\n|number(int)|int|\n|number(real)|float|\n|true|True|\n|false|False|\n|null|None|\n|||\n## Mongodb\n- https://pypi.org/project/pymongo/\n\n\n## 时间\n```python\nfrom datetime import  datetime\nprint(datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")) # 2019-07-14 20:09:45\n```\n- %a 本地简化星期名称 比如sun\n- %A 本地完成星期名称 Sunday\n- %b 本地简化月份的名称 Jul\n- %B 本地完成月份名称 July\n- %c 本地响应的日期表示和时间表示 'Sun Jul 14 20:24:02 2019'\n- %j 年内的一天(001-366) 195\n- %w 星期(0-6)，星期天为一个星期的开始\n- %W 一年中的星期数（00-53）星期一位星期的开始 27\n- %Y 年份 四位年份表示(0000-9999)\n- %m 月份 (0-12)\n- %d 天 (0-31)\n- %H 时 24小时制(0-23)\n- %l 12小时制(0-12)\n- %M 分(00-59)\n- %p 本地A.M 和P.M PM\n- %S 秒(00-59)\n- %U 一年中的星期数(00-53)，第几个星期，星期天位星期的开始\n- %y 两位数的年份表示(00-99)\n- %x 本地相应的日期表示 07/14/19\n- %X 本地相应的时间表示 20:30:16\n- %Z 当前时区的名称，空字符：''\n- %% %号本身\n\n## 内置函数\n- abs()\n- all()\n- any()\n- dict()\n- dir()\n- help()\n- hex()\n- min()\n- next()\n\n- slice()\n- divmod()\n- id()\n- object()\n- sorted()\n- ascii()\n- enumerate()\n- input()\n- oct()\n- staticmethod()\n- bin()\n- eval()\n- int()\n- open()\n- str()\n- bool()\n- exec()\n- isinstance()\n- ord()\n- sum()\n- bytearray()\n- filter()\n- issubclass()\n- pow()\n- super()\n- bytes()\n- float()\n- iter()\n- print()\n- tuple()\n- callable()\n- format()\n- len()\n- property()\n- type()\n- chr()\n- frozenset()\n- list()\n- range()\n- vars()\n- classmethod()\n- getattr()\n- delattr()\n- setattr()\n- locals()\n- repr()\n- zip()\n- compile()\n- globals()\n- map()\n- reversed()\n- __import__()\n- complex()\n- hasattr()\n- max()\n- round()\n- hash()\n- memoryview()\n- set()\n\n## redis\n-  https://pypi.org/project/redis/\n\n### pip安装\n\u003e pip install redis\n\n### python 使用redis\n```python\ndef redis_get_keys():\n    import redis\n    host = \"xxxx\"\n    port = 6379\n    r = redis.Redis(host, port, db=1, password=\"password\")\n    keys = r.keys('*')\n    return keys\n\n\nredis_get_keys()\n\n```\n\n## python 设置和获取windows的环境变量\n\n### 永久改变\n- https://blog.csdn.net/doots/article/details/86705182\n\n### 添加到系统变量\n    os.system(\"setx BAIDU_REDIS_PASSWORD xxx\")\n    os.system(\"setx ALIYUN_HOST ooo\")\n### 只是临时改变\n```python\nimport os\nprint(os.environ)\n# 设置\nos.environ[\"xx\"]=\"xxx\"\nprint(os.environ[\"xx\"])\n\n```\n\n### setx 永久方式，但需要重启机器\n```cmd\n// 设置到用户变量里面\nsetx xx ooo\n\n// 设置到环境变量里面\nsetx /M oo xx\n\n// 在新的cmd下，会出来\necho %xx%\n\n// 但在idea下没办法出来，需要重启机器吧\nprint(os.environ[\"BAIDU_HOST\"])\nprint(os.environ[\"BAIDU_REDIS_PASSWORD\"])\nprint(os.environ[\"ALIYUN_HOST\"])\n\n// 或者 os.system，需要重启   \nprint(os.system(\"echo %xx%\"))    \nprint(os.system(\"echo %BAIDU_HOST%\"))    \nprint(os.system(\"echo %BAIDU_REDIS_PASSWORD%\"))    \nprint(os.system(\"echo %ALIYUN_HOST%\"))    \n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveaba%2Flearn-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fveaba%2Flearn-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveaba%2Flearn-python/lists"}