From 58d4821a47783c0377da031075708722a91b5887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?WKZ=E5=8A=9E=E5=85=AC=E7=94=B5=E8=84=91?= <13427527534@163.com> Date: Thu, 6 Nov 2025 08:50:05 +0800 Subject: [PATCH 01/14] test202511060850 --- new-test-20251106.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 new-test-20251106.txt diff --git a/new-test-20251106.txt b/new-test-20251106.txt new file mode 100644 index 000000000..2b7e60900 --- /dev/null +++ b/new-test-20251106.txt @@ -0,0 +1 @@ +1232 \ No newline at end of file From 6a2aa462c5f07b5643192322151938aa3b98d30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=8B=E7=AB=A0?= <13427527534@163.com> Date: Tue, 18 Nov 2025 22:18:51 +0800 Subject: [PATCH 02/14] test-20251118 --- .../markdown\350\257\255\346\263\225.ipynb" | 68 +++++++++++++++++++ ...344\271\240\347\254\224\350\256\260.ipynb" | 39 +++++++++++ 2 files changed, 107 insertions(+) create mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/markdown\350\257\255\346\263\225.ipynb" create mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260.ipynb" diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/markdown\350\257\255\346\263\225.ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/markdown\350\257\255\346\263\225.ipynb" new file mode 100644 index 000000000..6763da46d --- /dev/null +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/markdown\350\257\255\346\263\225.ipynb" @@ -0,0 +1,68 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "44897e58", + "metadata": {}, + "source": [ + "## 一、标题(#)\n", + "### 三级标题\n", + "#### 四级标题\n", + "\n", + "## 二、段落与换行\n", + "这是第一段。(空一行=新段落)\n", + "\n", + "这是第二段(行末两个空格=换行) \n", + "换行后的内容\n", + "## 三、粗体\n", + "**粗体** \n", + "*斜体* \n", + "~~删除线~~ \n", + "也可以组合 **加粗*内部斜体*组合**\n", + "## 四、列表\n", + "无序列表: \n", + "- 项目1 \n", + "- 项目2 \n", + " -项目2.1 \n", + "\n", + "有序列表: \n", + "1. 项目1 \n", + "2. 项目2 \n", + "2.1 项目2.1 \n", + "2.2 项目2.2 \n", + "## 五、引用(>)\n", + "> 这是引用 \n", + "> 可以多行\n", + "## 六、代码\n", + "请执行 `print('Hello World')`\n", + "代码块: \n", + "```python\n", + "ded add(a,b):\n", + " return a + b\n", + "```\n", + "## 七、表格\n", + "|姓名|年龄|城市|\n", + "|------|------|------|\n", + "|张三|20|北京|\n", + "|李四|25|上海|\n", + "## 八、链接与图片\n", + "[超链接名称](http://www/baidu.com) \n", + "![超链接名称](https://www.baidu.com/img/flexible/logo/pc/result.png) \n", + "或者使用本地图片也可以\n", + "## 九、分割线(---或者***)\n", + "---\n", + "---\n", + "## 十、任务列表\n", + "- [x] 已完成任务 \n", + "- [ ] 待办任务\n" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260.ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260.ipynb" new file mode 100644 index 000000000..a884a2ce5 --- /dev/null +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260.ipynb" @@ -0,0 +1,39 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b3779ea9", + "metadata": {}, + "source": [ + "> 需要认真梳理Python基础知识! \n", + "> 结构划分 \n", + " - 环境准备相关\n", + " - 基础语法 \n", + " - 变量 \n", + " - 基本数据类型(数据结构) \n", + " - 分支、循环结构\n", + " \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "08c8aa7f", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.13.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 8c3e21796443ac8e589aea4a7773df0b03e25205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=8B=E7=AB=A0?= <13427527534@163.com> Date: Tue, 18 Nov 2025 22:28:55 +0800 Subject: [PATCH 03/14] 202511282228 --- ...\271\240\347\254\224\350\256\260(1).ipynb" | 208 ++++++++++++++++++ ...344\271\240\347\254\224\350\256\260.ipynb" | 39 ---- 2 files changed, 208 insertions(+), 39 deletions(-) create mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260(1).ipynb" delete mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260.ipynb" diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260(1).ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260(1).ipynb" new file mode 100644 index 000000000..5da38a643 --- /dev/null +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260(1).ipynb" @@ -0,0 +1,208 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b3779ea9", + "metadata": {}, + "source": [ + "## 前言" + ] + }, + { + "cell_type": "markdown", + "id": "08c8aa7f", + "metadata": {}, + "source": [ + "> Python基础知识结构划分: \n", + "> - 环境准备相关\n", + "> - 基础语法 \n", + "> - 变量 \n", + "> - 基本数据类型(数据结构) \n", + "> - 分支、循环结构\n", + "> - 函数和模块\n", + "> - 面向对象编程" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 环境准备相关\n", + "- 环境变量的问题 \n", + "\n", + "- Python编码的运行界面\n", + " - cmd\n", + " - IDE\n", + "\n", + "- 二进制、八进制、十进制、十六进制\n", + "\n", + "- ASCII码、Unicode码" + ] + }, + { + "cell_type": "markdown", + "id": "d9525ae6", + "metadata": {}, + "source": [ + "### 基础语法\n", + "- 注释\n", + "- 换行问题\n", + "- 缩进\n", + " - 必须缩进4个空格\n", + "- 关键字\n", + "- print格式化输出\n", + "- 运算符(优先级从高到低)\n", + " - 比较运算符:> >= < <= == !=\n", + " - 赋值运算符:= += *=\n", + " - 逻辑预算符:and or not\n", + " - 数学运算符: + - * / % // **" + ] + }, + { + "cell_type": "markdown", + "id": "b30f7a39", + "metadata": {}, + "source": [ + "### 变量\n", + "- 变量含义\n", + " Python中的变量代表内存中的一个位置?\n", + "- 变量命名规则 \n", + " - Python变量允许以数字+字符(理解为英文字母)+符号,如涉及多个单词之间建议用下划线 \n", + " - 常量为大写\n", + "- 变量类型(需要整合为表格)\n", + " - 可变类型\n", + " - 整数(int)\n", + " - 浮点数(float)\n", + " - 列表(list)\n", + " - \n", + " - 不可变类型\n", + " - 字符串(str)\n", + " - 元组(tuple)\n", + " - 字典(dict)\n", + " - 变量类型的转换\n", + " - 类型转换函数(应该是区分了强制转换和自动转换?)\n", + " - 转换为整数 `int(x)`,转换时可带进制\n", + " - 转换为浮点数`float(x)`\n", + " - 转换为字符串`str(x)`\n", + " - 转换为列表`list(x)`\n", + " - 转换为元组`tuple(x)`\n", + " - 转换为字典?\n", + " - 自动转换\n", + " - 带有浮点数的数学运算的结果,均为float类型 2/1 = 2.0\n", + " - \n", + "- 变量的声明\n", + " - 元组的声明,`tup1 = (1,)`,必须带括号,否则仅为仅为用于确定运算顺序的括号\n", + " - 字典的声明,\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "ec409422", + "metadata": {}, + "source": [ + "### 基本数据类型\n", + "数据类型对应的方法\n", + "string.split()?" + ] + }, + { + "cell_type": "markdown", + "id": "bcbe2001", + "metadata": {}, + "source": [ + "### 分支循环结构\n", + "- 分支结构 \n", + " if elif else" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c7644079", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "成绩优秀\n" + ] + } + ], + "source": [ + "a = 100\n", + "if a>90:\n", + " print('成绩优秀')\n", + "elif a>60:\n", + " print('成绩合格')\n", + "else:\n", + " print('成绩不合格')" + ] + }, + { + "cell_type": "markdown", + "id": "202e48e0", + "metadata": {}, + "source": [ + "- 循环结构 \n", + " while循环\n", + " for循环\n", + " range函数的问题" + ] + }, + { + "cell_type": "markdown", + "id": "a573f908", + "metadata": {}, + "source": [ + "### 函数\n", + "- 函数的定义\n", + " Python内的函数为\n", + "- 内置函数\n", + "- 装饰器\n", + "- 递归调用" + ] + }, + { + "cell_type": "markdown", + "id": "ff4a1328", + "metadata": {}, + "source": [ + "### 模块\n", + "- 标准库?" + ] + }, + { + "cell_type": "markdown", + "id": "6392017b", + "metadata": {}, + "source": [ + "### 面向对象\n", + "- 类的定义\n", + "- 类的属性、方法" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260.ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260.ipynb" deleted file mode 100644 index a884a2ce5..000000000 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260.ipynb" +++ /dev/null @@ -1,39 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "b3779ea9", - "metadata": {}, - "source": [ - "> 需要认真梳理Python基础知识! \n", - "> 结构划分 \n", - " - 环境准备相关\n", - " - 基础语法 \n", - " - 变量 \n", - " - 基本数据类型(数据结构) \n", - " - 分支、循环结构\n", - " \n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "08c8aa7f", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.13.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 653a2a440bdb538315220c6e3009a6271614cd25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=8B=E7=AB=A0?= <13427527534@163.com> Date: Tue, 18 Nov 2025 23:04:05 +0800 Subject: [PATCH 04/14] =?UTF-8?q?git=E5=B7=A5=E4=BD=9C=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\344\275\234\346\265\201\347\250\213.md" | 47 +++++++++++++++ .../image.png" | Bin 0 -> 53258 bytes .../markdown.md" | 54 ++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" create mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/image.png" create mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/markdown.md" diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" new file mode 100644 index 000000000..9117efdac --- /dev/null +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" @@ -0,0 +1,47 @@ +## Git 工作流程 +本章节我们将为大家介绍 Git 的工作流程。 + +下图展示了 Git 的工作流程: +![Git 的工作流程](image.png) + +### 1、克隆仓库 +如果你要参与一个已有的项目,首先需要将远程仓库克隆到本地: +``` +git clone https://github.com/username/repo.git +cd repo +``` +### 2、创建新分支 +为了避免直接在 main 或 master 分支上进行开发,通常会创建一个新的分支: +`git checkout -b new-feature` +### 3、工作目录 +在工作目录中进行代码编辑、添加新文件或删除不需要的文件。 +### 4、暂存文件 +将修改过的文件添加到暂存区,以便进行下一步的提交操作: +`git add filename` +或者添加所有修改的文件 +`git add .` +### 5、提交更改 +将暂存区的更改提交到本地仓库,并添加提交信息: +`git commit -m "Add new feature"` +### 6、拉取最新更改 +在推送本地更改之前,最好从远程仓库拉取最新的更改,以避免冲突: +`git pull origin main` +或者如果在新的分支上工作 +`git pull origin new-feature` +### 7、推送更改 +将本地的提交推送到远程仓库: +`git push origin new-feature` +### 8、创建 Pull Request(PR) +在 GitHub 或其他托管平台上创建 Pull Request,邀请团队成员进行代码审查。PR 合并后,你的更改就会合并到主分支。 +### 9、合并更改 +在 PR 审核通过并合并后,可以将远程仓库的主分支合并到本地分支: +``` +git checkout main +git pull origin main +git merge new-feature +``` +### 10、删除分支 +如果不再需要新功能分支,可以将其删除: +`git branch -d new-feature` +或者从远程仓库删除分支: +`git push origin --delete new-feature` \ No newline at end of file diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/image.png" "b/\345\255\246\344\271\240\347\254\224\350\256\260/image.png" new file mode 100644 index 0000000000000000000000000000000000000000..768579417cad153aef9ad1a8bf2a8e28b663e830 GIT binary patch literal 53258 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

Zy^P=p{HA6C>B<6ZW2X24r70=nw zTrnDv)eF&v)|0Bn^*E73NoMuiv2WA1p|Gml6P;_kz@^Ss_l^LoY3In%lY1s1jVg!R z_QlWq#n){VB7_Y&wCfxQ8I@lV40WY=T?CR!I_FY7eE5*CG+as>cI`*~{}3og57rk& zy4KehCz}6diS>c-Ww_=isUruAAMVs3Y%*v?Op};=3)LaOO6rYf zA}R~8z5q4Q=>`IYEL0BQrx#8m9ODUe&^i8K`AI?G`hdExi<8sjrr>jB3H2DE ztHMYZh>^~8pIFkvOzmgw!Xf9!bcx2A28EY$%A*w+a2xJ%Zj7z{3K*AW^ca-;L-wNa zGkDVnVZK|n)dQyi!p?<_vq55+MR13)MDwM#rE7>)40wt3;2m_KZ2@m?2K!P}N}i~; z)k#I%$_axu>B1QD;G2@qPCeFcki@P3 z{4YRnS*o0_!%9#reUnn)D8eCr?KwU%@=k%tb622$_d)0HI4YG$_NU3t$cSMG=e8%W zvI~0F26sbaVVUEUk#+tehWSLmH0gT|DDR6g=BV;be04UP)Hp)eur|mqdqK~yp6-^f zPgR=Naz20lMQA^=oW&&6r&^#;3Yq%rJu8;Y=m!1i)HP4?;&GKSx!kDL-k2B@MR8t@ z4RM7FrOca{TRi^1p-&VDcUjpR^;o z8!K{D*dT{~7Ji(r)$co=f&{jAk0B`juA}fqA*iXd&5!#ng|_hI9vWroSsU%oX4DT^ zT-^zx+HMY=-`B7`ju!f?P)t0^>V^^=*{XOjn%4Qw){b*Q7Ao4zJtMRfjqgWch z-CD7_FTK^ekmPzUyLh}nhjDLta#&+{?bCtAk3$pJN~b_vim~~#S$Exvyd-wV_lB{! z#3-#!7m*pCrSXJjHYbNCX!mAgtIVd15Ilv97?)zkc6HsFs1b$=QKKJ|`a@%klD=&R zXGgi)GCnqxRiVuPGw<++qPoR0(pC^u1k(|Ln-`1l0F*gzy1t+fYRVZSM-nXxsB+jh z8T+y+^4K@N=S{aV(T?*?^NmJ@o#ok&hkj~)2phHyh@jPLSZ5;CI&sXOtCHfBSKXV> z2y_oJ=FL;&GRVu6${I}w_RLS3BuwMT9~Q{v*yw6!n=wg%t(Ra_kCn)zky;>%jtsL9 z@VZ#1jA-s+^{idd0@^27+0m;zPMHJrM;=+Cp4H3#5)doF`@%ppY8Je$E z?-a^jkCm`klPyuTA<4ln9=U;`r!AK~X3vh{EC&~8808%s)&~JZ&&Vm?Xo60o(C|Am z%?cNkw>(>Rjc?FH&X23Rju3Q~3v(nSwS6C9zT-F!@hf@LNkF|F2cpQ=JK;)fxxbg%b_DV@*`nT%O7!%AWd+7bTBoDcM4Fn`uL7{3u| zQ&YmdPeJ*~e9O$TMR(EnW+bS}Fw5l7rJSxU$5IW*V0k&wFOc3?&k58ww;9 z1VdFO;*4zSs*FBlYp-()sjYiyY!h%`TXT+9K}`q}Z$P-#EW^zINE<{n9%x-IXr=bN zp8L+8wGsxF0ApVsZV2ks?1A)M z%61V5jANrPeuK$rnA{h`&uPClz)0;VLptM(W@=o`@QJdNUG5U-w%L~l(F&m|Thjo6 zwNcGsutb5QzR0XJQ5sL1q)$c$vXG>G-8f}m-K{$k&{m@ zJA_dG9UH$ieKh^})ntKabK_-8^MuU5sZN|}5$F`NqX+a~1DNgiB|@0T*7oh>FFGqZ zF#>77Fd*>IJCvV+9wJiue(#nEjXdxMmI7&$<@M?N0@T@gjl2HUKSO=;;Y9aSXl<5` zYu)y|evRN5<8|yrLN!Q@E9+pm`s#oBp`^ydaF(fPRpTUwQdZdb{dS4wA6@mB(+*&m&>Lfp@c@#rB+-nu-pBZ1|V!cEChQr<8#-u&EGkcyBnat z)qJ+}m=@pBFnC;gHw0IH<>)mYO-%;BZ`9GtaK6rVM+{VoAoL(ir3+6+dttLdX0GD!Xocu7OtlμafSO4?HbXNAy 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 _l5$rslBRhEZ<)+J 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 niRsUu+Qo;b@B Date: Tue, 18 Nov 2025 23:05:42 +0800 Subject: [PATCH 05/14] =?UTF-8?q?git=E5=B7=A5=E4=BD=9C=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../markdown.md" | 54 ------------------- 1 file changed, 54 deletions(-) delete mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/markdown.md" diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/markdown.md" "b/\345\255\246\344\271\240\347\254\224\350\256\260/markdown.md" deleted file mode 100644 index 16376b0e0..000000000 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/markdown.md" +++ /dev/null @@ -1,54 +0,0 @@ -Git 工作流程 -本章节我们将为大家介绍 Git 的工作流程。 - -下图展示了 Git 的工作流程: - - -1、克隆仓库 -如果你要参与一个已有的项目,首先需要将远程仓库克隆到本地: - -git clone https://github.com/username/repo.git -cd repo -2、创建新分支 -为了避免直接在 main 或 master 分支上进行开发,通常会创建一个新的分支: - -git checkout -b new-feature -3、工作目录 -在工作目录中进行代码编辑、添加新文件或删除不需要的文件。 - -4、暂存文件 -将修改过的文件添加到暂存区,以便进行下一步的提交操作: - -git add filename -# 或者添加所有修改的文件 -git add . -5、提交更改 -将暂存区的更改提交到本地仓库,并添加提交信息: - -git commit -m "Add new feature" -6、拉取最新更改 -在推送本地更改之前,最好从远程仓库拉取最新的更改,以避免冲突: - -git pull origin main -# 或者如果在新的分支上工作 -git pull origin new-feature -7、推送更改 -将本地的提交推送到远程仓库: - -git push origin new-feature -8、创建 Pull Request(PR) -在 GitHub 或其他托管平台上创建 Pull Request,邀请团队成员进行代码审查。PR 合并后,你的更改就会合并到主分支。 - -9、合并更改 -在 PR 审核通过并合并后,可以将远程仓库的主分支合并到本地分支: - -git checkout main -git pull origin main -git merge new-feature -10、删除分支 -如果不再需要新功能分支,可以将其删除: - -git branch -d new-feature -或者从远程仓库删除分支: - -git push origin --delete new-feature \ No newline at end of file From 912d96d15b8e9350038d8091dfde10430a02d4bd Mon Sep 17 00:00:00 2001 From: AllenWang1342752 <97282381+AllenWang1342752@users.noreply.github.com> Date: Wed, 19 Nov 2025 07:57:55 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20git=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../git\345\267\245\344\275\234\346\265\201\347\250\213.md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" index 9117efdac..ec137c709 100644 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" @@ -44,4 +44,7 @@ git merge new-feature 如果不再需要新功能分支,可以将其删除: `git branch -d new-feature` 或者从远程仓库删除分支: -`git push origin --delete new-feature` \ No newline at end of file +`git push origin --delete new-feature` + +### 如果需要从github往本地下载文件怎么办, +只下载部分文件而且这些文件已经在本地了, \ No newline at end of file From ab056bada7e6e4db70a6875da4e9059be2b16ef4 Mon Sep 17 00:00:00 2001 From: AllenWang1342752 <97282381+AllenWang1342752@users.noreply.github.com> Date: Wed, 19 Nov 2025 07:59:15 +0800 Subject: [PATCH 07/14] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20git=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../git\345\267\245\344\275\234\346\265\201\347\250\213.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" index ec137c709..7cb3f1463 100644 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" @@ -10,6 +10,10 @@ git clone https://github.com/username/repo.git cd repo ``` +> 只能全部克隆吗,还是可以只下载部分, +> 远程仓库的修改是否可以覆盖本地的文件 + + ### 2、创建新分支 为了避免直接在 main 或 master 分支上进行开发,通常会创建一个新的分支: `git checkout -b new-feature` From c80bdc279759dd280df2140a30391edb36695d94 Mon Sep 17 00:00:00 2001 From: AllenWang1342752 <97282381+AllenWang1342752@users.noreply.github.com> Date: Wed, 19 Nov 2025 08:28:51 +0800 Subject: [PATCH 08/14] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20git=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../git\345\267\245\344\275\234\346\265\201\347\250\213.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" index 7cb3f1463..349a711af 100644 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" @@ -32,6 +32,7 @@ cd repo `git pull origin main` 或者如果在新的分支上工作 `git pull origin new-feature` +> 最新的更改,指的是最新远程仓库上面的信息吗? ### 7、推送更改 将本地的提交推送到远程仓库: `git push origin new-feature` From 7cdea977e2d3c0557cfa61a884e11b6727b4654d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?WKZ=E5=8A=9E=E5=85=AC=E7=94=B5=E8=84=91?= <13427527534@163.com> Date: Wed, 19 Nov 2025 12:35:54 +0800 Subject: [PATCH 09/14] =?UTF-8?q?=E4=BF=AE=E6=94=B9git=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E4=BB=93=E5=BA=93=E6=96=87=E4=BB=B6=E5=88=B0?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E7=9A=84=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...it\345\267\245\344\275\234\346\265\201\347\250\213.md" | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" index 349a711af..72f42492f 100644 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" @@ -10,9 +10,13 @@ git clone https://github.com/username/repo.git cd repo ``` -> 只能全部克隆吗,还是可以只下载部分, -> 远程仓库的修改是否可以覆盖本地的文件 +> 问题1:如何只下载某个文件,不是克隆整个仓库 +#### 如果确定远程为准,直接覆盖掉本地文件 +`git status`可以看未提交的修改(工作区+暂存区) +`nothing to commit,working tree clean`则为干干净净,表示无任何修改 +`git pull`只看提交记录是否一致,不管本地是否修改了文件。 +`git pull = git fetch + git merge`,git会比较本地当前分支的commit ID和远程当前分支的commit ID,如果两个ID一样,就会认为是`already up to date` ### 2、创建新分支 为了避免直接在 main 或 master 分支上进行开发,通常会创建一个新的分支: From 902a5c82c03df1e753dfe8a6be5bb053adab7885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?WKZ=E5=8A=9E=E5=85=AC=E7=94=B5=E8=84=91?= <13427527534@163.com> Date: Thu, 20 Nov 2025 12:32:36 +0800 Subject: [PATCH 10/14] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3-2025?= =?UTF-8?q?1120?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\217\212\345\207\275\346\225\260.ipynb" | 10 + ...347\241\200\347\237\245\350\257\206.ipynb" | 350 ++++++++++++++++++ ...45\344\275\234\346\265\201\347\250\213.md" | 3 +- ...\271\240\347\254\224\350\256\260(1).ipynb" | 208 ----------- 4 files changed, 362 insertions(+), 209 deletions(-) create mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/Pyhton\345\270\270\347\224\250\346\250\241\345\235\227\345\217\212\345\207\275\346\225\260.ipynb" create mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" delete mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260(1).ipynb" diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/Pyhton\345\270\270\347\224\250\346\250\241\345\235\227\345\217\212\345\207\275\346\225\260.ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/Pyhton\345\270\270\347\224\250\346\250\241\345\235\227\345\217\212\345\207\275\346\225\260.ipynb" new file mode 100644 index 000000000..c55a2876b --- /dev/null +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/Pyhton\345\270\270\347\224\250\346\250\241\345\235\227\345\217\212\345\207\275\346\225\260.ipynb" @@ -0,0 +1,10 @@ +{ + "cells": [], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" new file mode 100644 index 000000000..f4531c4f4 --- /dev/null +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" @@ -0,0 +1,350 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b3779ea9", + "metadata": {}, + "source": [ + "## 前言" + ] + }, + { + "cell_type": "markdown", + "id": "08c8aa7f", + "metadata": {}, + "source": [ + "> Python基础知识结构划分: \n", + "> - 环境准备相关\n", + "> - 基础语法 \n", + "> - 变量 \n", + "> - 基本数据类型(数据结构) \n", + "> - 分支、循环结构\n", + "> - 函数和模块\n", + "> - 面向对象编程" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 环境准备相关\n", + "- 环境变量的问题 \n", + "\n", + "- Python编码的运行界面\n", + " - cmd\n", + " - IDE\n", + "\n", + "- 二进制、八进制、十进制、十六进制\n", + "\n", + "- ASCII码、Unicode码" + ] + }, + { + "cell_type": "markdown", + "id": "d9525ae6", + "metadata": {}, + "source": [ + "### 基础语法\n", + "- 注释\n", + "- 换行问题\n", + "- 缩进\n", + " - 必须缩进4个空格\n", + "- 关键字\n", + "- print格式化输出\n", + "- 运算符(优先级从高到低)\n", + " - 比较运算符:> >= < <= == !=\n", + " - 赋值运算符:= += *=\n", + " - 逻辑预算符:and or not\n", + " - 数学运算符: + - * / % // **" + ] + }, + { + "cell_type": "markdown", + "id": "b30f7a39", + "metadata": {}, + "source": [ + "### 变量\n", + "- 变量含义\n", + " Python中的变量代表内存中的一个位置?\n", + "- 变量命名规则 \n", + " - Python变量允许以数字+字符(理解为英文字母)+符号,如涉及多个单词之间建议用下划线 \n", + " - 常量为大写\n", + "- 变量类型(需要整合为表格)\n", + " - 可变类型\n", + " - 整数(int)\n", + " - 浮点数(float)\n", + " - 列表(list)\n", + " - \n", + " - 不可变类型\n", + " - 字符串(str)\n", + " - 元组(tuple)\n", + " - 字典(dict)\n", + " - 变量类型的转换\n", + " - 类型转换函数(应该是区分了强制转换和自动转换?)\n", + " - 转换为整数 `int(x)`,转换时可带进制\n", + " - 转换为浮点数`float(x)`\n", + " - 转换为字符串`str(x)`\n", + " - 转换为列表`list(x)`\n", + " - 转换为元组`tuple(x)`\n", + " - 转换为字典?\n", + " - 自动转换\n", + " - 带有浮点数的数学运算的结果,均为float类型 2/1 = 2.0\n", + " - \n", + "- 变量的声明\n", + " - 元组的声明,`tup1 = (1,)`,必须带括号,否则仅为仅为用于确定运算顺序的括号\n", + " - 字典的声明,\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "ec409422", + "metadata": {}, + "source": [ + "### 基本数据类型\n", + "数据类型对应的方法\n", + "string.split()?" + ] + }, + { + "cell_type": "markdown", + "id": "bcbe2001", + "metadata": {}, + "source": [ + "### 分支循环结构\n", + "- 分支结构 \n", + " if elif else" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c7644079", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "成绩优秀\n" + ] + } + ], + "source": [ + "a = 100\n", + "if a>90:\n", + " print('成绩优秀')\n", + "elif a>60:\n", + " print('成绩合格')\n", + "else:\n", + " print('成绩不合格')" + ] + }, + { + "cell_type": "markdown", + "id": "202e48e0", + "metadata": {}, + "source": [ + "- 循环结构 \n", + " while循环\n", + " for循环\n", + " range函数的问题" + ] + }, + { + "cell_type": "markdown", + "id": "a573f908", + "metadata": {}, + "source": [ + "### 函数\n", + "- 函数的定义\n", + " Python内的函数为\n", + "- 内置函数\n", + "- 装饰器\n", + "- 递归调用" + ] + }, + { + "cell_type": "markdown", + "id": "ff4a1328", + "metadata": {}, + "source": [ + "### 模块\n", + "- 标准库?" + ] + }, + { + "cell_type": "markdown", + "id": "6392017b", + "metadata": {}, + "source": [ + "### 面向对象\n", + "#### 面向对象的含义 \n", + "面向对象编程是一种编程范式(即程序设计的方法论)。\n", + "在面向对象编程的世界里,程序中的**数据和操作数据的函数是一个逻辑上的整体**,称之为**对象**。 \n", + "\n", + "对象可以接受消息,解决问题的方法就是创建对象并向对象发出各种各样的消息;通过消息传递,程序中的多个对象可以协同工作,这样就能构造出复杂的系统并解决现实中的问题。\n", + "> 面向对象编程:把一组数据和处理数据的方法组成**对象**,把行为相同的对象归纳为**类**,通过**封装**隐藏对象的内部细节,通过**继承**实现类的特化和泛化,通过**多态**实现基于对象类型的动态分派。\n", + "> - 封装:隐藏内部实现细节,往外暴露简单调用接口。例如在类中定义对象的方法就是封装,给对象发一个消息(即不用明确具体实现)就可以执行方法中的代码。\n", + "#### 面向对象编程三步走\n", + "第一步:定义类 \n", + "第二步:创建对象 \n", + "第三步:给对象发消息\n", + "Python内置的list、set、dict都是提前定义好的类,可以跳过第一步; \n", + "如果第一步、第二部都提前走了,就是某些内置对象,可以“开箱即用”。" + ] + }, + { + "cell_type": "markdown", + "id": "cd6c2b68", + "metadata": {}, + "source": [ + "#### 类和对象\n", + "含义:类是对象的蓝图和模板(例如人类),对象是类的实例(例如具体的人),是可以接受消息的实体。 \n", + "> 一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类。 \n", + "> 接收消息是什么意思?\n", + "\n", + "属性:属性是对象的静态特征,行为(方法)是对象的动态特征。具有共同特征的对象和属性和行为抽取出来就可以定义一个类。" + ] + }, + { + "cell_type": "markdown", + "id": "cb0d8728", + "metadata": {}, + "source": [ + "类的定义和使用:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "04fdc6f2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<__main__.Student object at 0x0000024596C1A2D0>\n", + "<__main__.Student object at 0x00000245968E7D40>\n", + "0x24596c1a2d0 0x245968e7d40\n", + "王克章正在学习Python程序设计.\n", + "王大锤学生正在玩游戏.\n", + "王克章正在学习Python程序设计.\n", + "王大锤学生正在玩游戏.\n" + ] + } + ], + "source": [ + "### 类的创建 ###\n", + "class Student:\n", + "\n", + " def __init__(self,name,age): # 初始化方法,即常见对象时,\n", + " #首先会在内存中获取对象的所需的内存空间,然后会自动执行该方法,完成对内存的初始化操作\n", + " self.name = name # 对象属性赋初始化值\n", + " self.age = age # = 右侧的age是传入的参数\n", + "\n", + " def study(self,course_name):\n", + " print(f'{self.name}正在学习{course_name}.')\n", + "\n", + " def play(self):\n", + " print(f'{self.name}学生正在玩游戏.')\n", + "\n", + "### 类的使用 ### \n", + "stu1 = Student('王克章',28) # 构造器语法创建类的对象,此时会传入类的初始化参数\n", + "stu2 = Student('王大锤',25)\n", + "print(stu1) \n", + "# 输出 <__main__.Student object at 0x000002459692B2C0>\n", + "# 上面这个输出代表是一个Student类的对象,以及这个对象的以十六进制表示的内存地址\n", + "# __main__表示Student类定义在主模块中(当前脚本)\n", + "print(stu2) \n", + "# 输出 <__main__.Student object at 0x000002459692B2C0>\n", + "print(hex(id(stu1)),hex(id(stu2)))\n", + "# 函数hex()将整数转为十六进制字符串\n", + "# 函数id()返回对象在内存中的唯一标识(一般是内存地址),该标识在对象的全生命周期内保持一致\n", + "stu3 = stu2 # 并没有创建新的对象\n", + "# 变量存的是一个对象在内存中的逻辑地址(位置)\n", + "\n", + "### 调用对象的方法 ###\n", + "Student.study(stu1,'Python程序设计')# 类.方法(接收消息的对象,方法入参) 来调用\n", + "Student.play(stu2)\n", + "stu1.study('Python程序设计')# 对象.方法(仅为方法入参)来调用\n", + "stu2.play()" + ] + }, + { + "cell_type": "markdown", + "id": "52825732", + "metadata": {}, + "source": [ + "> 写在类里面的函数我们通常称之为方法,方法就是对象的行为,也就是对象可以接收的消息。方法的第一个参数通常都是self,它代表了接收这个消息的对象本身。 \n", + "> 这个self怎么理解?\n", + "> 是不是类中定义的所有函数的第一个参数都要是self?" + ] + }, + { + "cell_type": "markdown", + "id": "aa224ddb", + "metadata": {}, + "source": [ + "### 面向对象案例\n", + "例子1:时钟\n", + "> 要求:定义一个类描述数字时钟,提供走字和显示时间的功能。" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "4922cdf1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1763612929.0186808\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "class Clock: # 定义时钟类\n", + " def __init__(self,hour,minute):\n", + " self.hour = hour\n", + " self.miute = minute\n", + " \n", + " def display_time(self): # 显示当前时间函数\n", + " print(time.time())\n", + " \n", + " #def add_time(self,hour,minute): # 调整当前时间\n", + "\n", + "clock1 = Clock(12,26)\n", + "clock1.display_time()\n", + "\n", + " " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" index 72f42492f..a16b892f3 100644 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/git\345\267\245\344\275\234\346\265\201\347\250\213.md" @@ -16,7 +16,8 @@ cd repo `git status`可以看未提交的修改(工作区+暂存区) `nothing to commit,working tree clean`则为干干净净,表示无任何修改 `git pull`只看提交记录是否一致,不管本地是否修改了文件。 -`git pull = git fetch + git merge`,git会比较本地当前分支的commit ID和远程当前分支的commit ID,如果两个ID一样,就会认为是`already up to date` +`git pull = git fetch + git merge`,git会比较本地当前分支的commit ID和远程当前分支的commit ID,如果两个ID一样,就会认为是`already up to date` +即使执行`git commit`,也是将文件在本地做了提交,需要再执行`git push origin master`才可以将本地的提交,提交到远程仓库 ### 2、创建新分支 为了避免直接在 main 或 master 分支上进行开发,通常会创建一个新的分支: diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260(1).ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260(1).ipynb" deleted file mode 100644 index 5da38a643..000000000 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/python\345\255\246\344\271\240\347\254\224\350\256\260(1).ipynb" +++ /dev/null @@ -1,208 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "b3779ea9", - "metadata": {}, - "source": [ - "## 前言" - ] - }, - { - "cell_type": "markdown", - "id": "08c8aa7f", - "metadata": {}, - "source": [ - "> Python基础知识结构划分: \n", - "> - 环境准备相关\n", - "> - 基础语法 \n", - "> - 变量 \n", - "> - 基本数据类型(数据结构) \n", - "> - 分支、循环结构\n", - "> - 函数和模块\n", - "> - 面向对象编程" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 环境准备相关\n", - "- 环境变量的问题 \n", - "\n", - "- Python编码的运行界面\n", - " - cmd\n", - " - IDE\n", - "\n", - "- 二进制、八进制、十进制、十六进制\n", - "\n", - "- ASCII码、Unicode码" - ] - }, - { - "cell_type": "markdown", - "id": "d9525ae6", - "metadata": {}, - "source": [ - "### 基础语法\n", - "- 注释\n", - "- 换行问题\n", - "- 缩进\n", - " - 必须缩进4个空格\n", - "- 关键字\n", - "- print格式化输出\n", - "- 运算符(优先级从高到低)\n", - " - 比较运算符:> >= < <= == !=\n", - " - 赋值运算符:= += *=\n", - " - 逻辑预算符:and or not\n", - " - 数学运算符: + - * / % // **" - ] - }, - { - "cell_type": "markdown", - "id": "b30f7a39", - "metadata": {}, - "source": [ - "### 变量\n", - "- 变量含义\n", - " Python中的变量代表内存中的一个位置?\n", - "- 变量命名规则 \n", - " - Python变量允许以数字+字符(理解为英文字母)+符号,如涉及多个单词之间建议用下划线 \n", - " - 常量为大写\n", - "- 变量类型(需要整合为表格)\n", - " - 可变类型\n", - " - 整数(int)\n", - " - 浮点数(float)\n", - " - 列表(list)\n", - " - \n", - " - 不可变类型\n", - " - 字符串(str)\n", - " - 元组(tuple)\n", - " - 字典(dict)\n", - " - 变量类型的转换\n", - " - 类型转换函数(应该是区分了强制转换和自动转换?)\n", - " - 转换为整数 `int(x)`,转换时可带进制\n", - " - 转换为浮点数`float(x)`\n", - " - 转换为字符串`str(x)`\n", - " - 转换为列表`list(x)`\n", - " - 转换为元组`tuple(x)`\n", - " - 转换为字典?\n", - " - 自动转换\n", - " - 带有浮点数的数学运算的结果,均为float类型 2/1 = 2.0\n", - " - \n", - "- 变量的声明\n", - " - 元组的声明,`tup1 = (1,)`,必须带括号,否则仅为仅为用于确定运算顺序的括号\n", - " - 字典的声明,\n", - " " - ] - }, - { - "cell_type": "markdown", - "id": "ec409422", - "metadata": {}, - "source": [ - "### 基本数据类型\n", - "数据类型对应的方法\n", - "string.split()?" - ] - }, - { - "cell_type": "markdown", - "id": "bcbe2001", - "metadata": {}, - "source": [ - "### 分支循环结构\n", - "- 分支结构 \n", - " if elif else" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "c7644079", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "成绩优秀\n" - ] - } - ], - "source": [ - "a = 100\n", - "if a>90:\n", - " print('成绩优秀')\n", - "elif a>60:\n", - " print('成绩合格')\n", - "else:\n", - " print('成绩不合格')" - ] - }, - { - "cell_type": "markdown", - "id": "202e48e0", - "metadata": {}, - "source": [ - "- 循环结构 \n", - " while循环\n", - " for循环\n", - " range函数的问题" - ] - }, - { - "cell_type": "markdown", - "id": "a573f908", - "metadata": {}, - "source": [ - "### 函数\n", - "- 函数的定义\n", - " Python内的函数为\n", - "- 内置函数\n", - "- 装饰器\n", - "- 递归调用" - ] - }, - { - "cell_type": "markdown", - "id": "ff4a1328", - "metadata": {}, - "source": [ - "### 模块\n", - "- 标准库?" - ] - }, - { - "cell_type": "markdown", - "id": "6392017b", - "metadata": {}, - "source": [ - "### 面向对象\n", - "- 类的定义\n", - "- 类的属性、方法" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "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.12.7" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From b6f2f7e9b8fa28cbc81a62ec900e044390c748a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?WKZ=E5=8A=9E=E5=85=AC=E7=94=B5=E8=84=91?= <13427527534@163.com> Date: Tue, 25 Nov 2025 20:52:12 +0800 Subject: [PATCH 11/14] 20251125 --- ...345\217\212\345\207\275\346\225\260.ipynb" | 12 +- ...347\241\200\347\237\245\350\257\206.ipynb" | 387 +++++++++++++++++- 2 files changed, 385 insertions(+), 14 deletions(-) diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/Pyhton\345\270\270\347\224\250\346\250\241\345\235\227\345\217\212\345\207\275\346\225\260.ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/Pyhton\345\270\270\347\224\250\346\250\241\345\235\227\345\217\212\345\207\275\346\225\260.ipynb" index c55a2876b..972b4c4a3 100644 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/Pyhton\345\270\270\347\224\250\346\250\241\345\235\227\345\217\212\345\207\275\346\225\260.ipynb" +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/Pyhton\345\270\270\347\224\250\346\250\241\345\235\227\345\217\212\345\207\275\346\225\260.ipynb" @@ -1,5 +1,15 @@ { - "cells": [], + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "time 模块\n", + "print()\n", + "str()" + ] + } + ], "metadata": { "language_info": { "name": "python" diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" index f4531c4f4..5ab2158ce 100644 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" @@ -182,14 +182,16 @@ "#### 面向对象的含义 \n", "面向对象编程是一种编程范式(即程序设计的方法论)。\n", "在面向对象编程的世界里,程序中的**数据和操作数据的函数是一个逻辑上的整体**,称之为**对象**。 \n", + "> 还有指令式变成、函数式编程等编程范式。\n", "\n", "对象可以接受消息,解决问题的方法就是创建对象并向对象发出各种各样的消息;通过消息传递,程序中的多个对象可以协同工作,这样就能构造出复杂的系统并解决现实中的问题。\n", "> 面向对象编程:把一组数据和处理数据的方法组成**对象**,把行为相同的对象归纳为**类**,通过**封装**隐藏对象的内部细节,通过**继承**实现类的特化和泛化,通过**多态**实现基于对象类型的动态分派。\n", "> - 封装:隐藏内部实现细节,往外暴露简单调用接口。例如在类中定义对象的方法就是封装,给对象发一个消息(即不用明确具体实现)就可以执行方法中的代码。\n", "#### 面向对象编程三步走\n", "第一步:定义类 \n", + "定义类就是要找到对象的公共属性或者方法 \n", "第二步:创建对象 \n", - "第三步:给对象发消息\n", + "第三步:给对象发消息 \n", "Python内置的list、set、dict都是提前定义好的类,可以跳过第一步; \n", "如果第一步、第二部都提前走了,就是某些内置对象,可以“开箱即用”。" ] @@ -287,14 +289,21 @@ "id": "aa224ddb", "metadata": {}, "source": [ - "### 面向对象案例\n", - "例子1:时钟\n", + "#### 面向对象案例" + ] + }, + { + "cell_type": "markdown", + "id": "b339fc8b", + "metadata": {}, + "source": [ + "##### 例子1:时钟\n", "> 要求:定义一个类描述数字时钟,提供走字和显示时间的功能。" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 5, "id": "4922cdf1", "metadata": {}, "outputs": [ @@ -302,7 +311,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "1763612929.0186808\n" + "12:26:34\n", + "12:26:35\n", + "12:26:36\n", + "12:26:37\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[5], line 25\u001b[0m\n\u001b[0;32m 23\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m 24\u001b[0m \u001b[38;5;28mprint\u001b[39m(clock1\u001b[38;5;241m.\u001b[39mshow())\n\u001b[1;32m---> 25\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m 26\u001b[0m clock1\u001b[38;5;241m.\u001b[39mrun()\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], @@ -310,19 +333,357 @@ "import time\n", "\n", "class Clock: # 定义时钟类\n", - " def __init__(self,hour,minute):\n", + " def __init__(self,hour=0,minute=0,second=0):\n", " self.hour = hour\n", - " self.miute = minute\n", + " self.min = minute\n", + " self.sec = second\n", + " \n", + " def run(self): # 走字\n", + " self.sec += 1\n", + " if self.sec == 60:\n", + " self.sec = 0\n", + " self.min += 1\n", + " if self.min == 60:\n", + " self.min = 0\n", + " self.hour += 1\n", + " if self.hour == 24:\n", + " self.hour = 0\n", + " def show(self):\n", + " return f'{self.hour:>2d}:{self.min:0>2d}:{self.sec:>02d}'\n", + "\n", + "clock1 = Clock(12,26) # 创建时钟对象\n", + "while True:\n", + " print(clock1.show())\n", + " time.sleep(1)\n", + " clock1.run() " + ] + }, + { + "cell_type": "markdown", + "id": "c22975b2", + "metadata": {}, + "source": [ + "##### 例2:平面上的点\n", + "> 要求:定义一个类描述平面上的点,提供计算到另一个点距离的方法。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dca8b607", + "metadata": {}, + "outputs": [], + "source": [ + "class Point:\n", + " \"\"\"平面上的点\"\"\"\n", + "\n", + " def __init__(self,x=0,y=0):\n", + " self.x,self.y = x,y\n", + " \n", + " def distance_to(self,other):# other表示另一个对象\n", + " dx = self.x - other.x\n", + " dy = self.y - other.y\n", + " return (dx*dx + dy*dy)**0.5\n", + " \n", + " def __str__(self): # 这个是什么意思?\n", + " # 可以理解为对象的字符串表示形式,就是调整print(对象)显示的内容\n", + " return f'({self.x},{self.y})'\n", + "\n", + "p1 = Point(3,5)\n", + "p2 = Point(6,9)\n", + "print(p1)\n", + "print(p2)\n", + "print(p1.distance_to(p2))\n" + ] + }, + { + "cell_type": "markdown", + "id": "c5cdb3b0", + "metadata": {}, + "source": [ + "#### 可见性和属性装饰器" + ] + }, + { + "cell_type": "markdown", + "id": "207cad3b", + "metadata": {}, + "source": [ + "对象的属性被设置成私有(private,属性前加__)或受保护(protected,属性前加_),以避免外界直接访问这些属性。\n", + "> 为什么要不允许外界直接访问?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a32d115d", + "metadata": {}, + "outputs": [], + "source": [ + "class Student:\n", + " __slots__ = ('name','age')\n", + " def __init__(self,name,age):\n", + " self.__name = name\n", + " self.__age = age\n", + " def study(self,course_name):\n", + " print(f'{self.__name}正在学习{course_name}.')\n", + "stu = Student('王大锤',20)\n", + "stu.sex = '男' # 给stu这个对象动态添加sex属性\n", + "print(stu.sex)\n", + "stu.study('Python程序设计') # 可以间接访问,不能直接访问\n", + "print(stu.__name) # 报错'Student' object has no attribute '__name'" + ] + }, + { + "cell_type": "markdown", + "id": "82abe644", + "metadata": {}, + "source": [ + "#### 动态属性\n", + "Python在运行时可以改变其结构,属于动态语言。\n", + "可以动态为对象添加属性(有点类似于可变类型数据)" + ] + }, + { + "cell_type": "markdown", + "id": "cec875c5", + "metadata": {}, + "source": [ + "> 名称改写机制(Name Mangling)是 Python 中的一种机制,用于避免子类覆盖父类的私有属性或方法。它会将以双下划线 __ 开头但不以双下划线结尾的属性或方法名,自动改写为 _类名__属性名 的形式。 \n", + "> 名称改写的主要目的是为了实现类的封装,避免子类意外覆盖父类的私有属性或方法。\n" + ] + }, + { + "cell_type": "markdown", + "id": "b944aefb", + "metadata": {}, + "source": [ + "class Triangle(object): 这里面加不加object有什么区别 " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "391876e3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "print(Student)" + ] + }, + { + "cell_type": "markdown", + "id": "2093e7f3", + "metadata": {}, + "source": [ + "#### 继承和多态\n", + "例如Teacher类继承自Person类" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "158e54f0", + "metadata": {}, + "outputs": [], + "source": [ + "class Person:\n", + " def __init__(self,name,age):\n", + " self.name = name\n", + " self.age = age\n", + " def eat(self):\n", + " print(f'{self.name}正在吃饭。')\n", + " def sleep(self):\n", + " print(f'{self.name}正在睡觉。')\n", + "\n", + "class Teacher(Person): # Teacher类继承自Person类\n", + " def __init__(self,name,age,title): \n", + " super().__init__(name,age) \n", + " # 子类中通过super().__init__()来调用父类初始化方法\n", + " self.title = title\n", + " # 子类定义自己特有的属性和方法\n", + " def teach(self,course_name):\n", + " print(f'{self.name}{self.titel}正在讲授{course_name}.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "a6374de7", + "metadata": {}, + "source": [ + "#### 面向对象编程举例" + ] + }, + { + "cell_type": "markdown", + "id": "75cb9380", + "metadata": {}, + "source": [ + "##### 例子1:扑克牌游戏\n", + "说明:简单起见,我们的扑克只有52张牌(没有大小王),游戏需要将 52 张牌发到 4 个玩家的手上,每个玩家手上有 13 张牌,按照黑桃、红心、草花、方块的顺序和点数从小到大排列,暂时不实现其他的功能。" + ] + }, + { + "cell_type": "markdown", + "id": "06eda9d8", + "metadata": {}, + "source": [ + "问题分析:\n", + "一、找对象并抽象出对应的类\n", + "名词常为对象或者对象的属性,动词通常是对象的行为。 \n", + "名词有扑克、牌、玩家。 \n", + "动词有发牌、排序。" + ] + }, + { + "cell_type": "markdown", + "id": "cc705878", + "metadata": {}, + "source": [ + "> 发现不止一个对象或者类,要考虑类之间的关系: \n", + "> - is-a(继承)\n", + "> - has-a(关联)\n", + "> - use-a(依赖) \n", + "> 以以上例子为例,因为一副扑克有(has-a)52张牌,所以扑克和牌是has-a关系(关联);因为玩家手上有(has-a)牌,而且玩家使用了(use-a)牌,所以玩家和牌之间不仅有关联关系,还有依赖关系。\n", + ">\n", + "> 疑问:分这三类有什么具体用处?\n", + ">\n", + "> 类的属性和方法: \n", + "> 牌:属性包括花色和点数\n", + "> 扑克:属性包括牌剩余牌数;方法包括被抓牌然后减少牌数\n", + "> 玩家:属性包括手里牌的张数;方法包括抓牌、排序" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5d5d6ca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Suite.SPADE:0\n", + "Suite.HEART:1\n", + "Suite.CLUB:2\n", + "Suite.DIAMOND:3\n", + "♠5\n", + "♥K\n" + ] + } + ], + "source": [ + "from enum import Enum # Python中创建枚举值要引入enum模块\n", + "\n", + "class Suite(Enum): # 新建一个Suite类来继承Enum类\n", + " \"\"\"牌花色的枚举值\"\"\"\n", + " SPADE,HEART,CLUB,DIAMOND = range(4)\n", + "\n", + "for suite in Suite: # Python中的枚举值可以迭代\n", + " print(f'{suite}:{suite.value}')\n", + "\n", + "# 定义牌这个类\n", + "class Card:\n", + " \"\"\"牌\"\"\"\n", + "\n", + " def __init__(self,suite,face):\n", + " self.suite = suite\n", + " self.face = face\n", " \n", - " def display_time(self): # 显示当前时间函数\n", - " print(time.time())\n", + " # __repr__(self):定义对象的开发者友好字符串表示,\n", + " # repr(obj) 或直接在交互式环境中输入对象时会调用。\n", + " def __repr__(self):\n", + " suites = '♠♥♣♦'\n", + " faces = ['','A','2','3','4','5','6',\n", + " '7','8','9','10','J','Q','K']\n", + " return f'{suites[self.suite.value]}{faces[self.face]}'\n", + " # 返回牌的花色和点数\n", + "\n", + "card1 = Card(Suite.SPADE,5)\n", + "card2 = Card(Suite.HEART,13)\n", + "print(card1)\n", + "print(card2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf1a5178", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[♠A, ♠2, ♠3, ♠4, ♠5, ♠6, ♠7, ♠8, ♠9, ♠10, ♠J, ♠Q, ♠K, ♥A, ♥2, ♥3, ♥4, ♥5, ♥6, ♥7, ♥8, ♥9, ♥10, ♥J, ♥Q, ♥K, ♣A, ♣2, ♣3, ♣4, ♣5, ♣6, ♣7, ♣8, ♣9, ♣10, ♣J, ♣Q, ♣K, ♦A, ♦2, ♦3, ♦4, ♦5, ♦6, ♦7, ♦8, ♦9, ♦10, ♦J, ♦Q, ♦K]\n", + "[♦6, ♠6, ♣4, ♣3, ♥2, ♠3, ♥4, ♠5, ♦10, ♣6, ♦Q, ♥10, ♥9, ♣8, ♥5, ♣9, ♠10, ♦2, ♠A, ♥6, ♥7, ♥Q, ♣10, ♦K, ♠7, ♣K, ♣2, ♠Q, ♦9, ♣A, ♥3, ♣J, ♠K, ♣5, ♠4, ♦7, ♥K, ♥8, ♦3, ♣Q, ♠2, ♦4, ♠8, ♣7, ♠9, ♦5, ♦A, ♦8, ♥A, ♦J, ♥J, ♠J]\n" + ] + } + ], + "source": [ + "# 定义扑克类\n", + "import random\n", + "\n", + "class Poker:\n", + " \"\"\"扑克\"\"\"\n", + "\n", + " def __init__(self):# 52张牌构成的列表\n", + " self.cards = [Card(suite,face)\n", + " for suite in Suite\n", + " for face in range(1,14)]\n", + " self.current = 0 # 记录发票位置的属性\n", + "\n", + " def shuffle(self):\n", + " \"\"\"洗牌\"\"\"\n", + " self.current = 0\n", + " random.shuffle(self.cards)\n", + " # 通过random模块的shuffle函数实现随机乱序\n", " \n", - " #def add_time(self,hour,minute): # 调整当前时间\n", + " def deal(self):\n", + " \"\"\"发牌\"\"\"\n", + " card = self.cards[self.current]\n", + " self.current += 1\n", + " return card\n", + " \n", + " @property\n", + " def has_nex(self):\n", + " \"\"\"还有没有牌可以发\"\"\"\n", + " return self.current < len(self.cards)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ed22905f", + "metadata": {}, + "outputs": [], + "source": [ + "# 定义玩家类\n", + "class Player:\n", + " \"\"\"玩家\"\"\"\n", "\n", - "clock1 = Clock(12,26)\n", - "clock1.display_time()\n", + " def __init__(self,name):\n", + " self.name = name\n", + " self.cards = [] # 玩家手里的牌\n", "\n", - " " + " def get_one(self,card):\n", + " \"\"\"摸牌\"\"\"\n", + " self.cards.append(card)\n", + " \n", + " def arrange(self):\n", + " \"\"\"整理手上的牌\"\"\"\n", + " self.cards.sort()\n", + " \n", + "# 创建四个玩家,并发牌到玩家手上" ] } ], From f5aaa85eb34d2b8809d3a17dc325ecf7f2e403b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=8B=E7=AB=A0?= <13427527534@163.com> Date: Tue, 25 Nov 2025 23:36:12 +0800 Subject: [PATCH 12/14] 202511252336 --- ...347\241\200\347\237\245\350\257\206.ipynb" | 190 ++++++++---- ...71\346\263\225\351\227\256\351\242\230.md" | 270 ++++++++++++++++++ 2 files changed, 402 insertions(+), 58 deletions(-) create mode 100644 "\345\255\246\344\271\240\347\254\224\350\256\260/\345\255\246\344\271\240\346\226\271\346\263\225\351\227\256\351\242\230.md" diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" index 5ab2158ce..499a968cb 100644 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" @@ -2,10 +2,29 @@ "cells": [ { "cell_type": "markdown", - "id": "b3779ea9", + "id": "59f1ad7d", "metadata": {}, "source": [ - "## 前言" + "> **记笔记的目的**: \n", + "> \n", + "> ★笔记不是“完整教程”,而是理解+易错点+示例+练习 \n", + "> \n", + "> 每一节:\n", + "> - “一句话总结(核心)”\n", + "> - “示例(能运行、最简单)”\n", + "> - “易错点(踩过的坑)”\n", + "> - “应用场景(什么时候用)”" + ] + }, + { + "cell_type": "markdown", + "id": "8a126022", + "metadata": {}, + "source": [ + "> 什么是“一句话总结”: \n", + "> - 它是什么\n", + "> - 为什么存在(解决什么问题?)\n", + "> - 什么时候用" ] }, { @@ -14,7 +33,8 @@ "metadata": {}, "source": [ "> Python基础知识结构划分: \n", - "> - 环境准备相关\n", + "> - Python的特点\n", + "> - 环境搭建\n", "> - 基础语法 \n", "> - 变量 \n", "> - 基本数据类型(数据结构) \n", @@ -25,9 +45,20 @@ }, { "cell_type": "markdown", + "id": "7b990156", "metadata": {}, "source": [ - "### 环境准备相关\n", + "### Python的特点\n", + "大小写敏感。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 环境搭建\n", + "为了能够在机器上运行Python,要处理的问题:\n", + "\n", "- 环境变量的问题 \n", "\n", "- Python编码的运行界面\n", @@ -44,12 +75,38 @@ "id": "d9525ae6", "metadata": {}, "source": [ - "### 基础语法\n", - "- 注释\n", - "- 换行问题\n", - "- 缩进\n", - " - 必须缩进4个空格\n", - "- 关键字\n", + "### Python基础语法\n", + "即为书写Python必须遵循的规则。\n", + "#### 标识符\n", + "标识符即为变量的命名,第一个字符必须以字母(a-z, A-Z)或下划线 _ ,其他部分由字母、数字和下划线组成。 \n", + "注意:标识符不能包含特殊字符(如 - ¥ $),不能使用数字开头,不能使用关键字。\n", + "##### 保留关键字\n", + "保留关键字在Python中有特定用处,不能作为标识符使用。\n", + "#### 注释\n", + "```\n", + "# 第一个注释\n", + "# 第二个注释\n", + "\n", + "'''\n", + "第三行注释\n", + "第四行注释\n", + "'''\n", + "\n", + "\"\"\"\n", + "第五行注释\n", + "第六行注释\n", + "\"\"\"\n", + "```\n", + "#### 行与缩进\n", + "Python中用缩进表示代码块,而不是大括号`{}`。 \n", + "Python中一条语句很长,可以用反斜杠`\\`来实现换行。\n", + "```\n", + "total = item_one + \\\n", + " item_two + \\\n", + " item_three\n", + "``` \n", + "在类或函数之间一般会留一个空行,便于日后的维护和重构。\n", + "\n", "- print格式化输出\n", "- 运算符(优先级从高到低)\n", " - 比较运算符:> >= < <= == !=\n", @@ -58,6 +115,25 @@ " - 数学运算符: + - * / % // **" ] }, + { + "cell_type": "code", + "execution_count": 10, + "id": "1181ca0f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']\n" + ] + } + ], + "source": [ + "import keyword\n", + "print(keyword.kwlist)" + ] + }, { "cell_type": "markdown", "id": "b30f7a39", @@ -531,18 +607,6 @@ "说明:简单起见,我们的扑克只有52张牌(没有大小王),游戏需要将 52 张牌发到 4 个玩家的手上,每个玩家手上有 13 张牌,按照黑桃、红心、草花、方块的顺序和点数从小到大排列,暂时不实现其他的功能。" ] }, - { - "cell_type": "markdown", - "id": "06eda9d8", - "metadata": {}, - "source": [ - "问题分析:\n", - "一、找对象并抽象出对应的类\n", - "名词常为对象或者对象的属性,动词通常是对象的行为。 \n", - "名词有扑克、牌、玩家。 \n", - "动词有发牌、排序。" - ] - }, { "cell_type": "markdown", "id": "cc705878", @@ -559,12 +623,20 @@ "> 类的属性和方法: \n", "> 牌:属性包括花色和点数\n", "> 扑克:属性包括牌剩余牌数;方法包括被抓牌然后减少牌数\n", - "> 玩家:属性包括手里牌的张数;方法包括抓牌、排序" + "> 玩家:属性包括手里牌的张数;方法包括抓牌、排序\n", + "\n", + "5 行话理解如何设计类(非常关键) \n", + "① 圈名词 → 找类、属性 \n", + "不是所有名词都是类,现实中独立存在的实体、有自己的状态和行为、在系统中是会变化的(这种变化应该是相对复杂的,用类可以保存状态并提供操作状态的方法,这种状态的变化不是单一变量可以处理的)、会在系统中被多个对象使用(需要复用)的才可能成为类\n", + "② 圈动词 → 找方法 \n", + "③ 基于“现实世界职责”分给合适的类 \n", + "④ 让每个类只负责“它自己能做的事” \n", + "⑤ 用组合(has-a)连接类,用方法调用(use-a)产生交互\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "d5d5d6ca", "metadata": {}, "outputs": [ @@ -577,7 +649,11 @@ "Suite.CLUB:2\n", "Suite.DIAMOND:3\n", "♠5\n", - "♥K\n" + "♥K\n", + "东邪:[♠2, ♠3, ♠7, ♠8, ♠10, ♠J, ♠Q, ♥9, ♣A, ♣2, ♣5, ♣6, ♦K]\n", + "西毒:[♠9, ♥A, ♥5, ♥7, ♥8, ♥Q, ♣3, ♣9, ♣Q, ♦2, ♦4, ♦7, ♦9]\n", + "南帝:[♠5, ♠6, ♠K, ♥2, ♥3, ♥10, ♥J, ♦A, ♦3, ♦5, ♦8, ♦10, ♦J]\n", + "北丐:[♠A, ♠4, ♥4, ♥6, ♥K, ♣4, ♣7, ♣8, ♣10, ♣J, ♣K, ♦6, ♦Q]\n" ] } ], @@ -592,6 +668,8 @@ " print(f'{suite}:{suite.value}')\n", "\n", "# 定义牌这个类\n", + "# 牌类初始化时,牌一定是有指定的花色和大小\n", + "\n", "class Card:\n", " \"\"\"牌\"\"\"\n", "\n", @@ -607,30 +685,20 @@ " '7','8','9','10','J','Q','K']\n", " return f'{suites[self.suite.value]}{faces[self.face]}'\n", " # 返回牌的花色和点数\n", + " \n", + " def __lt__(self,other):\n", + " if self.suite == other.suite:\n", + " return self.face < other.face # 花色相同比较点数大小\n", + " return self.suite.value < other.suite.value # 花色不同比较花色对应值\n", "\n", "card1 = Card(Suite.SPADE,5)\n", "card2 = Card(Suite.HEART,13)\n", "print(card1)\n", - "print(card2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bf1a5178", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[♠A, ♠2, ♠3, ♠4, ♠5, ♠6, ♠7, ♠8, ♠9, ♠10, ♠J, ♠Q, ♠K, ♥A, ♥2, ♥3, ♥4, ♥5, ♥6, ♥7, ♥8, ♥9, ♥10, ♥J, ♥Q, ♥K, ♣A, ♣2, ♣3, ♣4, ♣5, ♣6, ♣7, ♣8, ♣9, ♣10, ♣J, ♣Q, ♣K, ♦A, ♦2, ♦3, ♦4, ♦5, ♦6, ♦7, ♦8, ♦9, ♦10, ♦J, ♦Q, ♦K]\n", - "[♦6, ♠6, ♣4, ♣3, ♥2, ♠3, ♥4, ♠5, ♦10, ♣6, ♦Q, ♥10, ♥9, ♣8, ♥5, ♣9, ♠10, ♦2, ♠A, ♥6, ♥7, ♥Q, ♣10, ♦K, ♠7, ♣K, ♣2, ♠Q, ♦9, ♣A, ♥3, ♣J, ♠K, ♣5, ♠4, ♦7, ♥K, ♥8, ♦3, ♣Q, ♠2, ♦4, ♠8, ♣7, ♠9, ♦5, ♦A, ♦8, ♥A, ♦J, ♥J, ♠J]\n" - ] - } - ], - "source": [ + "print(card2)\n", + "\n", "# 定义扑克类\n", + "# 扑克类初始化时一定是指定的52张牌,\n", + "# 另外还有洗牌、发牌的方法,有还剩多少张牌的属性\n", "import random\n", "\n", "class Poker:\n", @@ -640,7 +708,7 @@ " self.cards = [Card(suite,face)\n", " for suite in Suite\n", " for face in range(1,14)]\n", - " self.current = 0 # 记录发票位置的属性\n", + " self.current = 0 # 记录发牌位置的属性\n", "\n", " def shuffle(self):\n", " \"\"\"洗牌\"\"\"\n", @@ -657,17 +725,10 @@ " @property\n", " def has_nex(self):\n", " \"\"\"还有没有牌可以发\"\"\"\n", - " return self.current < len(self.cards)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ed22905f", - "metadata": {}, - "outputs": [], - "source": [ + " return self.current < len(self.cards)\n", + " \n", "# 定义玩家类\n", + "# 玩家类有摸牌、整理手牌的方法\n", "class Player:\n", " \"\"\"玩家\"\"\"\n", "\n", @@ -683,13 +744,26 @@ " \"\"\"整理手上的牌\"\"\"\n", " self.cards.sort()\n", " \n", - "# 创建四个玩家,并发牌到玩家手上" + "# 创建四个玩家,并发牌到玩家手上\n", + "poker = Poker()\n", + "poker.shuffle()\n", + "players = [Player('东邪'),Player('西毒'),Player('南帝'),Player('北丐')]\n", + "# 将牌轮流发到每个玩家手上每人13张牌\n", + "for _ in range(13):\n", + " for player in players:\n", + " player.get_one(poker.deal())\n", + "# 玩家整理手上的牌输出名字和手牌\n", + "for player in players:\n", + " player.arrange()\n", + " print(f'{player.name}:',end='')\n", + " print(player.cards)\n", + "\n" ] } ], "metadata": { "kernelspec": { - "display_name": "base", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -703,7 +777,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.7" + "version": "3.13.0" } }, "nbformat": 4, diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/\345\255\246\344\271\240\346\226\271\346\263\225\351\227\256\351\242\230.md" "b/\345\255\246\344\271\240\347\254\224\350\256\260/\345\255\246\344\271\240\346\226\271\346\263\225\351\227\256\351\242\230.md" new file mode 100644 index 000000000..e7528c2cd --- /dev/null +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/\345\255\246\344\271\240\346\226\271\346\263\225\351\227\256\351\242\230.md" @@ -0,0 +1,270 @@ + # 什么是“一句话总结”: + - 它是什么 + - 为什么存在(解决什么问题?) + - 什么时候用 + + +# 我的Python越学越乱的原因: +- 记得是“细节”,而不是“框架” +- 我学到的每一个知识点在脑中没有一个“抽象层级” +- 我不知道这个知识点解决什么问题 +- 新出现的类型、新的语法,对我来说都是孤立的 + + +# 核心观念:Python 的所有东西,都可以归为三类 +① 数据 +② 行为(函数) +③ 容器 + 协议(数据如何被操作) + +我看到的所有“新类型”“新用法”其实都只是: +- 一种新的数据结构 +- 一个函数/方法 +- 一种操作规则(协议,如迭代、上下文、可哈希、序列类型) +- 一个标准库里封装好的工具 + +# Python 三大核心概念:数据、行为、协议 + +本文件系统性地解释 Python 世界中所有“看似无穷无尽的知识点”背后的统一抽象模型。 +帮助你用底层原理建立“不会乱、不怕新知识”的学习体系。 + +--- + +# 📍 第一类:数据(Data) +Python 的一切基础都是“数据”。 +你看到的所有类型,本质上都是 **数据结构**。 + +## 🧩 常见基础数据类型(一句话总结) +| 数据类型 | 一句话总结 | +|---------|------------| +| **int** | 一个整数值 | +| **float** | 一个小数 | +| **str** | 一段文本(不可变) | +| **list** | 可变序列 | +| **tuple** | 不可变序列 | +| **dict** | 哈希表,用 key 查 value | +| **set** | 去重 + 集合运算 | +| **bytes** | 二进制序列 | +| **bool** | True / False | +| **class** | 用户自定义的数据结构 | + +--- + +## 🧩 你未来会看到的“新类型”(其实也是数据) +例如: + +- datetime +- Fraction +- Decimal +- pathlib.Path +- re.Match +- MySQLCursor +- Response(requests) +- BeautifulSoup +- numpy.ndarray +- pandas.DataFrame + +它们都不是“新奇怪物”,它们都是: + +> Python 内置或第三方库定义的 **新的数据结构(结构不同,本质相同)** + +### ✔ 结论 +**所有“新数据类型”都是“数据”,不是新概念,只是新结构。** + +--- + +# 📍 第二类:行为(Function) +数据能做什么,由“行为”决定。 + +行为的统一定义: + +## ⭐ 行为 = 函数 + 方法(绑定到对象的函数) + +--- + +## 🎯 示例(你看到的一切操作,都是行为) +| 代码 | 类型 | 说明 | +|------|------|-------| +| `len(a)` | 函数 | 获取长度 | +| `a.append(3)` | 方法 | list 的行为 | +| `d.get("name")` | 方法 | dict 的行为 | +| `re.match()` | 函数 | 正则匹配 | +| `random.randint()` | 函数 | 取随机数 | + +本质上它们都是: + +> 输入数据 → 行为处理 → 输出结果 +> (方法还会改变对象内部状态) + +--- + +## ✔ 为什么这能消除你的焦虑? +当你知道: + +- list 的操作是 list 定义的行为 +- dict 的操作是 dict 定义的行为 +- 库里的方法是库的作者定义的行为 + +你看到“新方法、新函数、新 API” +就不会觉得那是“新知识点”,它只是“行为”。 + +--- + +# 📍 第三类:容器 + 协议(规则) +这是 Python 最强大也最容易让初学者困惑的部分。 + +--- + +# 1️⃣ 什么是容器? +容器就是“能装数据的结构”。 + +常见容器: + +- list +- tuple +- dict +- set +- generator +- iterator +- file +- pandas.DataFrame +- numpy.ndarray + +它们结构不同,但本质相同: +**装数据 + 对外提供统一操作行为(协议)** + +--- + +# 2️⃣ 什么是协议? +协议 ≠ 网络协议 +协议 = **规定对象必须具备的能力(钩子方法)** + +只要该能力被实现,对象就能表现出某种“行为”。 + +--- + +# 🔥 Python 常见协议(必须掌握) + +## ① 可迭代协议(Iterable) +只要对象实现: + +``` +__iter__() +``` + +它就能: + +- 被 for 循环 +- 被 list() 转换 +- 被展开:`*obj` +- 被 sum()、max() 等函数使用 + +### 🔥 所有这些都能 for,因为它们实现了 iterable: +- list +- tuple +- dict +- str +- range +- pandas.Series +- generator + +它们长得不一样,但行为一样,是因为遵守了 **同一个协议**。 + +--- + +## ② 上下文管理协议(Context Manager) +只要对象实现: + +``` +__enter__() +__exit__() +``` + +它就能被 `with` 使用。 + +### 这些都能用 with: +- 文件对象 +- 数据库连接 +- 锁 +- Selenium 浏览器 +- Requests Session +- TensorFlow Session +- contextlib 生成的对象 + +它们毫不相关,却都能: + +```python +with obj: + ... +``` + +因为它们遵守同一个协议。 + +--- + +## ③ 可调用协议(Callable) +如果一个对象实现: + +``` +__call__() +``` + +那么它就可以作为函数调用: + +```python +obj() +``` + +Python 的装饰器、回调机制、类实例当函数,都是用这个协议。 + +--- + +## ④ 数字协议(算术运算) +对象实现这些方法后,就能进行数学运算: + +``` +__add__() → + +__sub__() → - +__mul__() → * +``` + +numpy / pandas 的底层,就是依靠这些协议。 + +--- + +## ⑤ 序列协议(像数组一样) +只要实现: + +``` +__getitem__() +__len__() +``` + +它就能: + +- 被索引:`obj[0]` +- 被切片:`obj[1:3]` +- 被遍历 + +--- + +# 📌 最终总结(非常关键) + +## ⭐ Python 所有看似复杂的东西,都能归类为三件事: + +### **① 数据(Data)—— 类型本质是数据结构** +### **② 行为(Function/Method)—— 数据能做什么** +### **③ 协议(Protocol)—— 对象具备哪些能力** + +--- + +# ✔ 这意味着: + +- 新类型?→ 属于“数据” +- 新方法?→ 属于“行为” +- 能被 for?→ 遵守迭代协议 +- 能被 with?→ 遵守上下文协议 +- 能被调用?→ 遵守可调用协议 + +所有新东西都“有位置”,不会让你困惑。 + +--- From e95ffc4aa430d52e34dbe304b06271376d91da7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?WKZ=E5=8A=9E=E5=85=AC=E7=94=B5=E8=84=91?= <13427527534@163.com> Date: Thu, 27 Nov 2025 21:48:19 +0800 Subject: [PATCH 13/14] 20251127 --- ...347\241\200\347\237\245\350\257\206.ipynb" | 321 +++++++++++++++++- 1 file changed, 306 insertions(+), 15 deletions(-) diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" index 499a968cb..2e16137a1 100644 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" @@ -58,16 +58,11 @@ "source": [ "### 环境搭建\n", "为了能够在机器上运行Python,要处理的问题:\n", - "\n", "- 环境变量的问题 \n", - "\n", - "- Python编码的运行界面\n", - " - cmd\n", - " - IDE\n", - "\n", "- 二进制、八进制、十进制、十六进制\n", - "\n", - "- ASCII码、Unicode码" + "- ASCII码、Unicode码\n", + " \n", + "#### 命令行参数" ] }, { @@ -105,9 +100,294 @@ " item_two + \\\n", " item_three\n", "``` \n", + "Python中同一行也可以有多个语句,用分号;分隔。\n", "在类或函数之间一般会留一个空行,便于日后的维护和重构。\n", + "当写示例时,可以使用pass这个占位语句,表示什么都不做,以避免语法错误。\n", + "\n", + "#### 常用基本功能\n", + "1.接收用户用户输入,`str1=input()` \n", + "接收到的str1类型为string,还是``? \n", + "2.导入模块,用import与from...import \n", + "导入模块后,Python要知道使用的函数、类、变量来自哪个模块。 \n", + "`from...import`直接引入目标名称,调用更短,但是容易发生命名冲突。 \n", + "3.print格式化输出 \n", + "print()默认输出是带换行符的,即其中参数end默认值为'\\n'。\n", + "\n", + "#### 变量\n", + "1.Python中所有变量都是“名字→对象”的引用(变量存的是对象的地 址。),变量没有类型,只有对象有类型。变量本质上等同于“自动管理内存的安全指针”。 \n", + "\n", + "2.一般说的变量类型指的是“变量当前指向的对象的类型”, \n", + "\n", + "3.衍生问题: \n", + "(1)如果变量存的是内存的地址,那么为什么print(变量)会返回对象的值? \n", + "print()调用的是变量所指向对象的`__str__()、__repr__()`,而不是打印地址。 \n", + "如果要打印地址,可以用print(id(a))返回变量a在内存中的地址id。 \n", + "(2)`a=1`中,变量a是地址,那为什么可以计算a+1? \n", + "先找到变量a指向的对象(1),调用改对象的__add__()方法(a.__add__(1))生成一个新的对象(2),然后把这个新的对象返回。原先的a和1都不会被修改。 \n", + "如果是`a=a+1`呢,这时候a引用的对象会变成2。 \n", + "(3)不可变对象(int,str,tuple)不能改,只能换对象; \n", + "可变对象(list,dict,set)能改,引用不变。 \n", + "不可变对象不允许修改内部值,修改只能创新新对象,旧对象如果无人引用则会被自动回收。 或者用del语句删除? \n", + "```python\n", + "a = 10 # int类型不可变\n", + "b = a\n", + "a = 20 # 修改a的值,不会影响b的值,10,20是两个独立的对象\n", + "# b 指的还是原先的整数10对象\n", + "\n", + "c = [1,2,3] # list类型可变\n", + "d = c\n", + "d.append(4) # 修改d的值,c的值也会变化,c和d是同个引用\n", + "```\n", + "(4)为什么list1=list2会联动?\n", + "```python\n", + "a = [1,2]\n", + "b = a # b和a的内存地址是一样的,即为两个变量名指向同一个对象\n", + "b.append(3)\n", + "print(a) # [1,2,3]\n", + "```\n", + "(5)type(变量a)的时候,将变量a引用的对象作为参数传入内置函数type(),由type()查看该对象内部的`__class__属性`\n", + "\n", + "4.多变量赋值的问题:\n", + "`a=b=c=1`\n", + "`a,b,c=1,2,'runoob'`\n", + "\n", + "5.调换两个变量的值\n", + "`a,b=b,a`" + ] + }, + { + "cell_type": "markdown", + "id": "828e1f34", + "metadata": {}, + "source": [ + "### 数据类型\n", + "#### 数据类型简介\n", + "数据类型和数据的关系:\n", + "1.常见数据类型:\n", + "- Number(数字、数值):包含int、float、bool、complex(复数,例如4+3j)\n", + "- String(字符串)\n", + "- bool(布尔类型)\n", + "- List(列表)\n", + "- Tuple(元组)\n", + "- Set(集合)\n", + "- Dictionary(字典) \n", + "\n", + "2.数据类型分类\n", + "是否可变:\n", + "不可变数据类型:Number、String、Tuple \n", + "可变数据类型:List、Dictionary、Set\n", + "\n", + "3.判断数据类型\n", + "(1)type(obj)用来查对象的实际类型(class),例如`type(a)`,isinstance()用来判断对象(实例)是不是某个类型(或其子类)的实例,例如`isinstance(a,int)`\n", + "(2)区别:type()严格匹配类型,不考虑继承;isinstance()会考虑继承关系。\n", + "```python\n", + "class A:pass # pass占位语句\n", + "class B(A):pass\n", + "\n", + "b = B()\n", + "print(type(b) is B) # True\n", + "print(type(b) is A) # False\n", + "print(isinstance(b,B)) # True\n", + "print(isinstance(b,A)) # True\n", + "print(issubclass(B,A)) # 判断类的继承关系,True\n", + "```\n", + "(3)特殊情况:\n", + "- `type(a) == int`和`type(a) is int`有什么区别?\n", + "`==` 是比较两个对象的“值”是否相等,不推荐;\n", + "`is` 是判断两个对象是否是“同一个对象”(id一致),推荐。\n", + "- `type(A)`返回的是啥?\n", + "返回type,类也是对象,Python中所有类的类型都是type\n", + "- `isinstance(B,A)`为啥是False?\n", + "`isinstance()`是用于实例是否属于某个类或者某个父类。\n", + "如果要判断两个类的继承关系,可以用`issubclass`\n", + "- bool是int的子类,`True==1,False==0,issubclass(bool,int)`都返回True\n", + "\n", + "#### 各个数据类型介绍与使用\n", + "##### 数值\n", + "1.数值运算\n", + "常规运算(加减乘除),除法或者混合运算时(包含浮点数和整数)运算结果一定为浮点数\n", + "特殊运算:取余(%)、整除(//)、乘方(**)\n", + "`10%3`返回余数1\n", + "`10//3`返回整数3,即10按照3来分,可以分成3个整份\n", + "`10**3`返回1000 `4**0.5`返回2.0\n", + "\n", + "扩展:Python中的运算符(优先级从上到下是从高到低)\n", + "| 运算符 | 描述 |\n", + "| ---------------------------- | -------------------- |\n", + "| `[]`、`[:]` | 索引、切片 |\n", + "| `**` | 幂 |\n", + "| `~`、`+`、`-` | 按位取反、正号、负号 |\n", + "| `*`、`/`、`%`、`//` | 乘、除、模、整除 |\n", + "| `+`、`-` | 加、减 |\n", + "| `>>`、`<<` | 右移、左移 |\n", + "| `&` | 按位与 |\n", + "| `^`、`|` | 按位异或、按位或 |\n", + "| `<=`、`<`、`>`、`>=` | 小于等于、小于、大于、大于等于 |\n", + "| `==`、`!=` | 等于、不等于 |\n", + "| `is`、`is not` | 身份运算符 |\n", + "| `in`、`not in` | 成员运算符 |\n", + "| `not`、`or`、`and` | 逻辑运算符 |\n", + "| `=`、`+=`、`-=`、`*=`、`/=`、`%=`、`//=`、`**=`、`&=`、`\\|=`、`^=`、`>>=`、`<<=` | 赋值运算符 |\n", + "\n", + "2.数值不同表示形式\n", + "(1)整数:十进制、二进制、八进制、十六进制 \n", + "```python\n", + "print(0o12) #八进制,0o或者0O\n", + "print(0b1010) #二进制,0b或者0B\n", + "print(0xA) #十六进制,0x或者0X\n", + "#十六进制的数A B C D E F 分别表示十进制中的 10 11 12 13 14 15\n", + "\n", + "# print()默认输出数值是转换为十进制显示。\n", + "print(oct(97)) #oct()十进制转为八进制字符串,输出0o141\n", + "print(hex(97)) #hex()十进制转为十六进制字符串,输出0x61\n", + "print(bin(97)) #bin()十进制转为二进制字符串,输出0b1100001\n", + "```\n", + "(2)浮点数:主要是显示格式(小数点后几位)的问题\n", + "见字符串部分输出格式表\n", + "(3)复数:复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b) 表示,复数的实部a和虚部b都是浮点型。如`3e+26j`\n", + "\n", + "##### 字符串\n", + "1.字符串表示相关问题\n", + "(1)反斜杠`\\`转义特殊字符,可以在字符串前面加一个`r`表示原始字符。\n", + "\n", + "(2)字符串的索引和截取:\n", + "\n", + "(3)字符串也适用于运算符(+实现连接,*实现重复)\n", + "\n", + "(4)格式化输出:\n", + "| 变量值 | 占位符 | 格式化结果 | 说明 |\n", + "| ----------- | ---------- | ------------| ---- |\n", + "| `3.1415926` | `{:.2f}` | `'3.14'` | 保留小数点后两位 |\n", + "| `3.1415926` | `{:+.2f}` | `'+3.14'` | 带符号保留小数点后两位 |\n", + "| `-1` | `{:+.2f}` | `'-1.00'` | 带符号保留小数点后两位 |\n", + "| `3.1415926` | `{:.0f}` | `'3'` | 不带小数 |\n", + "| `123` | `{:0>10d}` | `'0000000123'` | 左边补`0`,补够10位 |\n", + "| `123` | `{:x<10d}` | `'123xxxxxxx'` | 右边补`x` ,补够10位 |\n", + "| `123` | `{:>10d}` | `' 123'` | 左边补空格,补够10位 |\n", + "| `123` | `{:<10d}` | `'123 '` | 右边补空格,补够10位 |\n", + "| `123456789` | `{:,}` | `'123,456,789'` | 逗号分隔格式 |\n", + "| `0.123` | `{:.2%}` | `'12.30%'` | 百分比格式 |\n", + "| `123456789` | `{:.2e}` | `'1.23e+08'` | 科学计数法格式 |\n", + "\n", + "##### 列表" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "040e17dd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0b1100001\n" + ] + } + ], + "source": [ + "print(bin(97))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bc91bb2b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "True\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "class A:pass\n", + "class B(A):pass\n", + "\n", + "b = B()\n", + "print(type(b) is B) # True\n", + "print(type(b) is A) # False\n", + "print(isinstance(b,B)) # True\n", + "print(isinstance(b,A)) # True\n", + "print(issubclass(B,A)) # True" + ] + }, + { + "cell_type": "markdown", + "id": "73c336d4", + "metadata": {}, + "source": [ + "### Python错误和警告\n", + "`print(1 is True)`会有警告:\n", + "SyntaxWarning:\"is\" with 'int' literal. Did you mean \"==\"?" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "0ae936f2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "人会说话\n", + "Allen is learnning 英语\n", + "\n", + "\n", + "False\n", + "True\n", + "True\n", + "False\n", + "False\n" + ] + } + ], + "source": [ + "class Person:\n", + "\n", + " def __init__(self,name,age):\n", + " self.name = name\n", + " self.age = age\n", + " \n", + " def speak(self):\n", + " print(\"人会说话\")\n", + "\n", + "class Student(Person):\n", "\n", - "- print格式化输出\n", + " def __init__(self,name,age):\n", + " super().__init__(name,age)\n", + " \n", + " def learn(self,course):\n", + " print(f'{self.name} is learnning {course}')\n", + "\n", + "stu1 = Student('Allen',26)\n", + "stu1.speak()\n", + "stu1.learn('英语')\n", + "\n", + "print(type(stu1))\n", + "print(type(Student))\n", + "print(type(stu1) is Person)\n", + "print(isinstance(stu1,Person))\n", + "print(isinstance(stu1,Student))\n", + "print(isinstance(Student,Person))\n", + "print(isinstance(bool,int))" + ] + }, + { + "cell_type": "markdown", + "id": "bc2e5920", + "metadata": {}, + "source": [ "- 运算符(优先级从高到低)\n", " - 比较运算符:> >= < <= == !=\n", " - 赋值运算符:= += *=\n", @@ -115,9 +395,19 @@ " - 数学运算符: + - * / % // **" ] }, + { + "cell_type": "markdown", + "id": "1779142d", + "metadata": {}, + "source": [ + "> 字符串属于数据还是数据结构 \n", + "> 数字属于数据还是数据结构 \n", + "> 数据和数据结构有什么关系" + ] + }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "id": "1181ca0f", "metadata": {}, "outputs": [ @@ -125,13 +415,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']\n" + "hello\n" ] } ], "source": [ - "import keyword\n", - "print(keyword.kwlist)" + "a =10\n", + "a = 'hello'\n", + "print(a)" ] }, { @@ -763,7 +1054,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "base", "language": "python", "name": "python3" }, @@ -777,7 +1068,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.0" + "version": "3.12.7" } }, "nbformat": 4, From ceb6c83615a2619e12726e7cf8779dd20ab787c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=8B=E7=AB=A0?= <13427527534@163.com> Date: Thu, 27 Nov 2025 23:33:55 +0800 Subject: [PATCH 14/14] 202511272333 --- ...347\241\200\347\237\245\350\257\206.ipynb" | 355 +++++++++++++++--- 1 file changed, 313 insertions(+), 42 deletions(-) diff --git "a/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" "b/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" index 2e16137a1..e6b81e479 100644 --- "a/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" +++ "b/\345\255\246\344\271\240\347\254\224\350\256\260/Python\345\237\272\347\241\200\347\237\245\350\257\206.ipynb" @@ -49,11 +49,18 @@ "metadata": {}, "source": [ "### Python的特点\n", - "大小写敏感。" + "1.大小写敏感。\n", + "2.对象(Object)、类(Class)、实例(Instance)三者的区别和联系\n", + "|名词|Python中的角色|举例|\n", + "|----|-----|----|\n", + "|对象(Object)|一切都是对象,包括数字、字符串、函数、类、模块|1、\"ABC\"、len、int|\n", + "|类(Class)|描述对象结构的模板,本质也是对象|int、list、dict|\n", + "|实例(Instance)|由类创建出来的对象|1 是 int 的实例|" ] }, { "cell_type": "markdown", + "id": "e43860bf", "metadata": {}, "source": [ "### 环境搭建\n", @@ -77,6 +84,7 @@ "注意:标识符不能包含特殊字符(如 - ¥ $),不能使用数字开头,不能使用关键字。\n", "##### 保留关键字\n", "保留关键字在Python中有特定用处,不能作为标识符使用。\n", + "一旦用了,就会报错。\n", "#### 注释\n", "```\n", "# 第一个注释\n", @@ -100,13 +108,13 @@ " item_two + \\\n", " item_three\n", "``` \n", - "Python中同一行也可以有多个语句,用分号;分隔。\n", - "在类或函数之间一般会留一个空行,便于日后的维护和重构。\n", + "Python中同一行也可以有多个语句,用分号;分隔。 \n", + "在类或函数之间一般会留一个空行,便于日后的维护和重构。 \n", "当写示例时,可以使用pass这个占位语句,表示什么都不做,以避免语法错误。\n", "\n", "#### 常用基本功能\n", "1.接收用户用户输入,`str1=input()` \n", - "接收到的str1类型为string,还是``? \n", + "接收到的str1类型为string,还是`` \n", "2.导入模块,用import与from...import \n", "导入模块后,Python要知道使用的函数、类、变量来自哪个模块。 \n", "`from...import`直接引入目标名称,调用更短,但是容易发生命名冲突。 \n", @@ -114,16 +122,17 @@ "print()默认输出是带换行符的,即其中参数end默认值为'\\n'。\n", "\n", "#### 变量\n", - "1.Python中所有变量都是“名字→对象”的引用(变量存的是对象的地 址。),变量没有类型,只有对象有类型。变量本质上等同于“自动管理内存的安全指针”。 \n", + "1.Python中所有变量都是“名字→对象”的引用(变量存的是对象的地址)。 \n", + "变量没有类型,只有对象有类型。变量本质上等同于“自动管理内存的安全指针”。 \n", "\n", - "2.一般说的变量类型指的是“变量当前指向的对象的类型”, \n", + "2.一般说的变量类型指的是“变量当前指向的对象的类型”。\n", "\n", "3.衍生问题: \n", "(1)如果变量存的是内存的地址,那么为什么print(变量)会返回对象的值? \n", - "print()调用的是变量所指向对象的`__str__()、__repr__()`,而不是打印地址。 \n", + "print()调用的是变量所指向对象的`__str__()、__repr__()`方法,而不是打印地址。 \n", "如果要打印地址,可以用print(id(a))返回变量a在内存中的地址id。 \n", - "(2)`a=1`中,变量a是地址,那为什么可以计算a+1? \n", - "先找到变量a指向的对象(1),调用改对象的__add__()方法(a.__add__(1))生成一个新的对象(2),然后把这个新的对象返回。原先的a和1都不会被修改。 \n", + "(2)`a=1`和`a+1`中,变量a是地址,那为什么可以计算a+1? \n", + "先找到变量a指向的对象(1),调用该对象的__add__()方法(a.__add__(1))生成一个新的对象(2),然后把这个新的对象返回。原先的a和1都不会被修改。 \n", "如果是`a=a+1`呢,这时候a引用的对象会变成2。 \n", "(3)不可变对象(int,str,tuple)不能改,只能换对象; \n", "可变对象(list,dict,set)能改,引用不变。 \n", @@ -138,14 +147,7 @@ "d = c\n", "d.append(4) # 修改d的值,c的值也会变化,c和d是同个引用\n", "```\n", - "(4)为什么list1=list2会联动?\n", - "```python\n", - "a = [1,2]\n", - "b = a # b和a的内存地址是一样的,即为两个变量名指向同一个对象\n", - "b.append(3)\n", - "print(a) # [1,2,3]\n", - "```\n", - "(5)type(变量a)的时候,将变量a引用的对象作为参数传入内置函数type(),由type()查看该对象内部的`__class__属性`\n", + "(4)type(变量a)的时候,将变量a引用的对象作为参数传入内置函数type(),由type()查看该对象内部的`__class__属性`\n", "\n", "4.多变量赋值的问题:\n", "`a=b=c=1`\n", @@ -162,7 +164,6 @@ "source": [ "### 数据类型\n", "#### 数据类型简介\n", - "数据类型和数据的关系:\n", "1.常见数据类型:\n", "- Number(数字、数值):包含int、float、bool、complex(复数,例如4+3j)\n", "- String(字符串)\n", @@ -172,8 +173,7 @@ "- Set(集合)\n", "- Dictionary(字典) \n", "\n", - "2.数据类型分类\n", - "是否可变:\n", + "2.数据类型分类可以按照是否可变,划分为: \n", "不可变数据类型:Number、String、Tuple \n", "可变数据类型:List、Dictionary、Set\n", "\n", @@ -193,14 +193,15 @@ "```\n", "(3)特殊情况:\n", "- `type(a) == int`和`type(a) is int`有什么区别?\n", - "`==` 是比较两个对象的“值”是否相等,不推荐;\n", + "`==` 是比较两个对象的“值”是否相等,不推荐,原因在==依赖类的`__eq__`,不是很严格;\n", "`is` 是判断两个对象是否是“同一个对象”(id一致),推荐。\n", + "补充说明:int在Python中也是一个对象(类对象)\n", "- `type(A)`返回的是啥?\n", "返回type,类也是对象,Python中所有类的类型都是type\n", "- `isinstance(B,A)`为啥是False?\n", - "`isinstance()`是用于实例是否属于某个类或者某个父类。\n", - "如果要判断两个类的继承关系,可以用`issubclass`\n", - "- bool是int的子类,`True==1,False==0,issubclass(bool,int)`都返回True\n", + "`isinstance()`是用于判断实例是否属于某个类或者某个父类。\n", + "如果要判断两个类的继承关系,可以用`issubclass()`\n", + "\n", "\n", "#### 各个数据类型介绍与使用\n", "##### 数值\n", @@ -213,7 +214,7 @@ "\n", "扩展:Python中的运算符(优先级从上到下是从高到低)\n", "| 运算符 | 描述 |\n", - "| ---------------------------- | -------------------- |\n", + "| ---------------------------| -------------------- |\n", "| `[]`、`[:]` | 索引、切片 |\n", "| `**` | 幂 |\n", "| `~`、`+`、`-` | 按位取反、正号、负号 |\n", @@ -227,10 +228,13 @@ "| `is`、`is not` | 身份运算符 |\n", "| `in`、`not in` | 成员运算符 |\n", "| `not`、`or`、`and` | 逻辑运算符 |\n", - "| `=`、`+=`、`-=`、`*=`、`/=`、`%=`、`//=`、`**=`、`&=`、`\\|=`、`^=`、`>>=`、`<<=` | 赋值运算符 |\n", + "| `=`、`+=`、`-=`、`*=`、`/=`、`%=`、`//=`、`**=`、`&=`、`\\|=`、`^=`、`>>=`、`<<=` | 赋值运算符|\n", + "补充说明:\n", + "not是小写。\n", + "逻辑运算符有阻断。\n", "\n", "2.数值不同表示形式\n", - "(1)整数:十进制、二进制、八进制、十六进制 \n", + "(1)整数:十进制、二进制、八进制、十六进制 \n", "```python\n", "print(0o12) #八进制,0o或者0O\n", "print(0b1010) #二进制,0b或者0B\n", @@ -242,19 +246,29 @@ "print(hex(97)) #hex()十进制转为十六进制字符串,输出0x61\n", "print(bin(97)) #bin()十进制转为二进制字符串,输出0b1100001\n", "```\n", - "(2)浮点数:主要是显示格式(小数点后几位)的问题\n", - "见字符串部分输出格式表\n", - "(3)复数:复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b) 表示,复数的实部a和虚部b都是浮点型。如`3e+26j`\n", + "(2)浮点数:主要是显示格式(小数点后几位)的问题 \n", + "见字符串部分输出格式表 \n", + "(3)复数:复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b) 表示,复数的实部a和虚部b都是浮点型。如`3e+26j` \n", "\n", "##### 字符串\n", - "1.字符串表示相关问题\n", + "1.字符串表示相关问题 \n", "(1)反斜杠`\\`转义特殊字符,可以在字符串前面加一个`r`表示原始字符。\n", "\n", "(2)字符串的索引和截取:\n", + "区域是左闭右开,从0开始,-1为从末尾开始的位置。 \n", + "```python\n", + "str = 'Runoob'\n", + "print(str[0:-1]) # 'Runoob'\n", + "print(str[0]) # 'R'\n", + "print(str[2:5]) # 'noo'\n", + "print(str[2:]) # 'noob'\n", + "print(str[:2]) # 'Ru'\n", + "print(str[::-1]) # 'boonuR',默认步长为1,步长为-1时会反转\n", + "print(str * 2) # 'RunoobRunoob',*实现重复\n", + "print(str+'abc') # 'Runoobabc',+实现多个字符串连接\n", + "```\n", "\n", - "(3)字符串也适用于运算符(+实现连接,*实现重复)\n", - "\n", - "(4)格式化输出:\n", + "(3)格式化输出:\n", "| 变量值 | 占位符 | 格式化结果 | 说明 |\n", "| ----------- | ---------- | ------------| ---- |\n", "| `3.1415926` | `{:.2f}` | `'3.14'` | 保留小数点后两位 |\n", @@ -269,12 +283,244 @@ "| `0.123` | `{:.2%}` | `'12.30%'` | 百分比格式 |\n", "| `123456789` | `{:.2e}` | `'1.23e+08'` | 科学计数法格式 |\n", "\n", - "##### 列表" + "(4)字符串不是特殊的列表,也不是特殊的元组;它是 Python 里独立的一种不可变序列类型(str),专门为文本处理而优化。\n", + "\n", + "2.字符串内置的方法\n", + "\n", + "\n", + "##### 列表([])\n", + "1.列表也可以被索引和截取,截取后返回一个新列表,也可以用+、*运算。\n", + "2.列表中的元素可以改变,字符串中的元素不可以改变。\n", + "3.字符串和元组都属于序列(Sequence)类型,如下图所示:\n", + "```python\n", + "object\n", + " └── collections.abc.Iterable\n", + " └── collections.abc.Sequence\n", + " ├── list(可变序列)\n", + " ├── tuple(不可变序列)\n", + " └── str(不可变序列,但元素必须是字符)\n", + "\n", + "```\n", + "4.列表内置的方法\n", + "append()\n", + "pop()\n", + "\n", + "\n", + "##### bool(布尔类型)\n", + "bool是int的子类,`True==1,False==0,issubclass(bool,int)`都返回True。 \n", + "布尔值可以被看作整数来使用,True等价于1,False等价于0。\n", + "`bool()`函数可以将其他类型的值转为布尔值,下面的值会被转为False:\n", + "None、False、零 (0、0.0、0j)、空序列(如 ''、()、[])和空映射(如 {})。其余均为True。 \n", + "常用示例:\n", + "```python\n", + "print(True and False) # False\n", + "print(True or False) # True\n", + "print(not True) # False\n", + "print(not False) # True\n", + "\n", + "x = 10\n", + "if x:\n", + " print(\"x is non-zero and thus True in a boolean context\")\n", + "```\n", + "\n", + "##### 元组(())\n", + "1.元组不能修改,元组内的元素类型可以不同。元组支持切片和索引。\n", + "2.元组可以包含list列表这种可变的对象。\n", + "3.特殊表示\n", + "`tup1 = () # 空元组`\n", + "`tup2 = (20,) # 一个元素,需要在元素后添加逗号,否则就会成为数学运算中的括号`\n", + "\n", + "##### 集合({})\n", + "1.集合(Set)是一种无序、可变的数据类型,用于存储唯一的元素。\n", + "2.集合可以进行集合操作(交集、并集、差集)\n", + "3.创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。\n", + "```python\n", + "sites = {'Google', 'Taobao', 'Runoob', 'Facebook', 'Zhihu', 'Baidu'}\n", + "print(sites) # 输出集合,重复的元素被自动去掉\n", + "\n", + "# 成员测试\n", + "if 'Runoob' in sites :\n", + " print('Runoob 在集合中')\n", + "else :\n", + " print('Runoob 不在集合中')\n", + "\n", + "# set可以将其他类型转换为集合\n", + "a = set('abracadabra')\n", + "b = set('alacazam')\n", + "\n", + "print(a) # 重复元素会被去掉,{'b', 'c', 'r', 'a', 'd'}\n", + "print(a - b) # a 和 b 的差集,{'r', 'b', 'd'}\n", + "print(a | b) # a 和 b 的并集,{'b', 'c', 'a', 'z', 'm', 'r', 'l', 'd'}\n", + "print(a & b) # a 和 b 的交集,{'c', 'a'}\n", + "print(a ^ b) # a 和 b 中不同时存在的元素,{'z', 'b', 'm', 'r', 'l', 'd'}\n", + "```\n", + "\n", + "##### 字典({})\n", + "1.列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。\n", + "2.字典是一种映射类型,是一个无序的键(唯一key) : 值(value) 的集合。\n", + "```python\n", + "dict1 = {}\n", + "dict1['one'] = \"1 - 菜鸟教程\"\n", + "dict1[2] = \"2 - 菜鸟工具\"\n", + "\n", + "tinydict = {'name': 'runoob','code':1, 'site': 'www.runoob.com'}\n", + "\n", + "print (dict['one']) # 输出键为 'one' 的值,'1 - 菜鸟教程'\n", + "print (dict[2]) # 输出键为 2 的值,'2 - 菜鸟工具'\n", + "print (tinydict) # 输出完整的字典,'{'name': 'runoob', 'code': 1, 'site': 'www.runoob.com'}'\n", + "print (tinydict.keys()) # 输出所有键,'dict_keys(['name', 'code', 'site'])'\n", + "print (tinydict.values()) # 输出所有值,'dict_values(['runoob', 1, 'www.runoob.com'])'\n", + "```\n", + "3.字典的构造函数dict()\n", + "```python\n", + "dict([('Runoob', 1), ('Google', 2), ('Taobao', 3)]) # 列表形式\n", + "{'Runoob': 1, 'Google': 2, 'Taobao': 3}\n", + ">>> {x: x**2 for x in (2, 4, 6)} # 字典推导式形式\n", + "{2: 4, 4: 16, 6: 36}\n", + ">>> dict(Runoob=1, Google=2, Taobao=3) # a=1形式\n", + "{'Runoob': 1, 'Google': 2, 'Taobao': 3}\n", + "```\n", + "4.字典内置函数?内置方法?" + ] + }, + { + "cell_type": "markdown", + "id": "32f5df29", + "metadata": {}, + "source": [ + "### 其他知识点\n", + "1.在 Jupyter Notebook 中执行过的变量会一直保留在当前 Kernel 的内存里 \n", + "可以运行`%whos`(显示变量名、类型、值)、`%who`(只显示变量名)、`dir()`(会把魔法变量也列出来)。 \n", + "可以用`del`语句,删除不想要的变量;或者重启Jupyter Kernel(最彻底)。 \n", + "原因:因为 Jupyter Notebook 的执行模式是 stateful(有状态): \n", + "前面 cell 定义的变量,后面 cell 可以继续用,就算你删除 cell,变量仍然保留,只有重启 Kernel 才会清掉所有变量。" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "0bd8ee68", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['In',\n", + " 'Out',\n", + " '_',\n", + " '__',\n", + " '___',\n", + " '__builtin__',\n", + " '__builtins__',\n", + " '__doc__',\n", + " '__loader__',\n", + " '__name__',\n", + " '__package__',\n", + " '__spec__',\n", + " '__vsc_ipynb_file__',\n", + " '_dh',\n", + " '_i',\n", + " '_i1',\n", + " '_i10',\n", + " '_i11',\n", + " '_i12',\n", + " '_i13',\n", + " '_i14',\n", + " '_i15',\n", + " '_i16',\n", + " '_i17',\n", + " '_i18',\n", + " '_i19',\n", + " '_i2',\n", + " '_i20',\n", + " '_i21',\n", + " '_i22',\n", + " '_i23',\n", + " '_i24',\n", + " '_i25',\n", + " '_i26',\n", + " '_i27',\n", + " '_i28',\n", + " '_i29',\n", + " '_i3',\n", + " '_i30',\n", + " '_i31',\n", + " '_i32',\n", + " '_i33',\n", + " '_i34',\n", + " '_i35',\n", + " '_i36',\n", + " '_i37',\n", + " '_i38',\n", + " '_i4',\n", + " '_i5',\n", + " '_i6',\n", + " '_i7',\n", + " '_i8',\n", + " '_i9',\n", + " '_ih',\n", + " '_ii',\n", + " '_iii',\n", + " '_oh',\n", + " 'a',\n", + " 'b',\n", + " 'bool1',\n", + " 'dict1',\n", + " 'dict2',\n", + " 'dict3',\n", + " 'exit',\n", + " 'f1',\n", + " 'get_ipython',\n", + " 'i1',\n", + " 'i2',\n", + " 'open',\n", + " 'quit',\n", + " 'sites',\n", + " 'str',\n", + " 'str1',\n", + " 't1',\n", + " 'tinydict']" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ecd9167", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Runoob': 1, 'Google': 2, 'Taobao': 3}\n", + "{2: 4, 4: 16, 6: 36}\n", + "{'Runoob': 1, 'Google': 2, 'Taobao': 3}\n" + ] + } + ], + "source": [ + "del dict\n", + "\n", + "dict1 = dict([('Runoob', 1), ('Google', 2), ('Taobao', 3)])\n", + "print(dict1) # {'Runoob': 1, 'Google': 2, 'Taobao': 3}\n", + "dict2 = {x: x**2 for x in (2, 4, 6)}\n", + "print(dict2)# {2: 4, 4: 16, 6: 36}\n", + "dict3 = dict(Runoob=1, Google=2, Taobao=3)\n", + "print(dict3) # {'Runoob': 1, 'Google': 2, 'Taobao': 3}" ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 28, "id": "040e17dd", "metadata": {}, "outputs": [ @@ -282,12 +528,35 @@ "name": "stdout", "output_type": "stream", "text": [ - "0b1100001\n" + "{'Zhihu', 'Facebook', 'Runoob', 'Taobao', 'Baidu', 'Google'}\n", + "Runoob 在集合中\n", + "{'b', 'c', 'r', 'a', 'd'}\n", + "{'b', 'd', 'r'}\n", + "{'m', 'b', 'c', 'r', 'a', 'd', 'z', 'l'}\n", + "{'a', 'c'}\n", + "{'m', 'b', 'z', 'l', 'r', 'd'}\n" ] } ], "source": [ - "print(bin(97))" + "sites = {'Google', 'Taobao', 'Runoob', 'Facebook', 'Zhihu', 'Baidu'}\n", + "print(sites) # 输出集合,重复的元素被自动去掉\n", + "\n", + "# 成员测试\n", + "if 'Runoob' in sites :\n", + " print('Runoob 在集合中')\n", + "else :\n", + " print('Runoob 不在集合中')\n", + "\n", + "# set可以进行集合运算\n", + "a = set('abracadabra')\n", + "b = set('alacazam')\n", + "\n", + "print(a)\n", + "print(a - b) # a 和 b 的差集\n", + "print(a | b) # a 和 b 的并集\n", + "print(a & b) # a 和 b 的交集\n", + "print(a ^ b) # a 和 b 中不同时存在的元素" ] }, { @@ -326,8 +595,10 @@ "metadata": {}, "source": [ "### Python错误和警告\n", - "`print(1 is True)`会有警告:\n", - "SyntaxWarning:\"is\" with 'int' literal. Did you mean \"==\"?" + "1.`print(1 is True)`会有警告:\n", + "SyntaxWarning:\"is\" with 'int' literal. Did you mean \"==\"?\n", + "2.TypeError: 'dict' object is not callable\n", + "是因为先前的代码把dict类型覆盖成了一个字典对象,导致dict变为一个普通的对象,故报错不可调用。" ] }, { @@ -1054,7 +1325,7 @@ ], "metadata": { "kernelspec": { - "display_name": "base", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -1068,7 +1339,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.7" + "version": "3.13.0" } }, "nbformat": 4,