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 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..972b4c4a3 --- /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,20 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "time 模块\n", + "print()\n", + "str()" + ] + } + ], + "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..e6b81e479 --- /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,1347 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "59f1ad7d", + "metadata": {}, + "source": [ + "> **记笔记的目的**: \n", + "> \n", + "> ★笔记不是“完整教程”,而是理解+易错点+示例+练习 \n", + "> \n", + "> 每一节:\n", + "> - “一句话总结(核心)”\n", + "> - “示例(能运行、最简单)”\n", + "> - “易错点(踩过的坑)”\n", + "> - “应用场景(什么时候用)”" + ] + }, + { + "cell_type": "markdown", + "id": "8a126022", + "metadata": {}, + "source": [ + "> 什么是“一句话总结”: \n", + "> - 它是什么\n", + "> - 为什么存在(解决什么问题?)\n", + "> - 什么时候用" + ] + }, + { + "cell_type": "markdown", + "id": "08c8aa7f", + "metadata": {}, + "source": [ + "> Python基础知识结构划分: \n", + "> - Python的特点\n", + "> - 环境搭建\n", + "> - 基础语法 \n", + "> - 变量 \n", + "> - 基本数据类型(数据结构) \n", + "> - 分支、循环结构\n", + "> - 函数和模块\n", + "> - 面向对象编程" + ] + }, + { + "cell_type": "markdown", + "id": "7b990156", + "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", + "为了能够在机器上运行Python,要处理的问题:\n", + "- 环境变量的问题 \n", + "- 二进制、八进制、十进制、十六进制\n", + "- ASCII码、Unicode码\n", + " \n", + "#### 命令行参数" + ] + }, + { + "cell_type": "markdown", + "id": "d9525ae6", + "metadata": {}, + "source": [ + "### 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", + "#### 行与缩进\n", + "Python中用缩进表示代码块,而不是大括号`{}`。 \n", + "Python中一条语句很长,可以用反斜杠`\\`来实现换行。\n", + "```\n", + "total = item_one + \\\n", + " 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", + "\n", + "2.一般说的变量类型指的是“变量当前指向的对象的类型”。\n", + "\n", + "3.衍生问题: \n", + "(1)如果变量存的是内存的地址,那么为什么print(变量)会返回对象的值? \n", + "print()调用的是变量所指向对象的`__str__()、__repr__()`方法,而不是打印地址。 \n", + "如果要打印地址,可以用print(id(a))返回变量a在内存中的地址id。 \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", + "不可变对象不允许修改内部值,修改只能创新新对象,旧对象如果无人引用则会被自动回收。 或者用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)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", + "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", + "不可变数据类型: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", + "`==` 是比较两个对象的“值”是否相等,不推荐,原因在==依赖类的`__eq__`,不是很严格;\n", + "`is` 是判断两个对象是否是“同一个对象”(id一致),推荐。\n", + "补充说明:int在Python中也是一个对象(类对象)\n", + "- `type(A)`返回的是啥?\n", + "返回type,类也是对象,Python中所有类的类型都是type\n", + "- `isinstance(B,A)`为啥是False?\n", + "`isinstance()`是用于判断实例是否属于某个类或者某个父类。\n", + "如果要判断两个类的继承关系,可以用`issubclass()`\n", + "\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", + "not是小写。\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", + "区域是左闭右开,从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", + "| ----------- | ---------- | ------------| ---- |\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", + "(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": 28, + "id": "040e17dd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'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": [ + "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 中不同时存在的元素" + ] + }, + { + "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", + "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变为一个普通的对象,故报错不可调用。" + ] + }, + { + "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", + " 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", + " - 逻辑预算符:and or not\n", + " - 数学运算符: + - * / % // **" + ] + }, + { + "cell_type": "markdown", + "id": "1779142d", + "metadata": {}, + "source": [ + "> 字符串属于数据还是数据结构 \n", + "> 数字属于数据还是数据结构 \n", + "> 数据和数据结构有什么关系" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1181ca0f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello\n" + ] + } + ], + "source": [ + "a =10\n", + "a = 'hello'\n", + "print(a)" + ] + }, + { + "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", + "第二步:创建对象 \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": [ + "#### 面向对象案例" + ] + }, + { + "cell_type": "markdown", + "id": "b339fc8b", + "metadata": {}, + "source": [ + "##### 例子1:时钟\n", + "> 要求:定义一个类描述数字时钟,提供走字和显示时间的功能。" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4922cdf1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "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: " + ] + } + ], + "source": [ + "import time\n", + "\n", + "class Clock: # 定义时钟类\n", + " def __init__(self,hour=0,minute=0,second=0):\n", + " self.hour = hour\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": "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", + "> 玩家:属性包括手里牌的张数;方法包括抓牌、排序\n", + "\n", + "5 行话理解如何设计类(非常关键) \n", + "① 圈名词 → 找类、属性 \n", + "不是所有名词都是类,现实中独立存在的实体、有自己的状态和行为、在系统中是会变化的(这种变化应该是相对复杂的,用类可以保存状态并提供操作状态的方法,这种状态的变化不是单一变量可以处理的)、会在系统中被多个对象使用(需要复用)的才可能成为类\n", + "② 圈动词 → 找方法 \n", + "③ 基于“现实世界职责”分给合适的类 \n", + "④ 让每个类只负责“它自己能做的事” \n", + "⑤ 用组合(has-a)连接类,用方法调用(use-a)产生交互\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "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", + "东邪:[♠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" + ] + } + ], + "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", + "# 牌类初始化时,牌一定是有指定的花色和大小\n", + "\n", + "class Card:\n", + " \"\"\"牌\"\"\"\n", + "\n", + " def __init__(self,suite,face):\n", + " self.suite = suite\n", + " self.face = face\n", + " \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", + " 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)\n", + "\n", + "# 定义扑克类\n", + "# 扑克类初始化时一定是指定的52张牌,\n", + "# 另外还有洗牌、发牌的方法,有还剩多少张牌的属性\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 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", + " \n", + "# 定义玩家类\n", + "# 玩家类有摸牌、整理手牌的方法\n", + "class Player:\n", + " \"\"\"玩家\"\"\"\n", + "\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", + "# 创建四个玩家,并发牌到玩家手上\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": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.0" + } + }, + "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" new file mode 100644 index 000000000..a16b892f3 --- /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,60 @@ +## Git 工作流程 +本章节我们将为大家介绍 Git 的工作流程。 + +下图展示了 Git 的工作流程: +![Git 的工作流程](image.png) + +### 1、克隆仓库 +如果你要参与一个已有的项目,首先需要将远程仓库克隆到本地: +``` +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` +即使执行`git commit`,也是将文件在本地做了提交,需要再执行`git push origin master`才可以将本地的提交,提交到远程仓库 + +### 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` + +### 如果需要从github往本地下载文件怎么办, +只下载部分文件而且这些文件已经在本地了, \ 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 000000000..768579417 Binary files /dev/null and "b/\345\255\246\344\271\240\347\254\224\350\256\260/image.png" differ 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/\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?→ 遵守上下文协议 +- 能被调用?→ 遵守可调用协议 + +所有新东西都“有位置”,不会让你困惑。 + +---