第二周总结
- python基本数据类型
- 基础运算符
- 垃圾回收机制和流程控制
- while for 循环
- 基本数据类型内置方法
- python学习之数据类型
bool 布尔值
| 1.用来判断事物的对错 是否可行 主要用于流程控制 |
| 2.只有两种判断 |
| True 对的 可行的 真的 |
| False 错的 不可行 假的 |
| 3.python中所有的数据都自带布尔值 |
| 布尔值有False的数据: |
| 0 None ''[] {} |
| 布尔值为True的数据: |
| 除了上面 都是True |
| 4.储存布尔值的变量名有一般推荐使用is_开头 |
| is_delete = False |
| is_alive = True |
tuple元组
| 1.'不可变'的列表 |
| 元组内索引的内存地址不可以修改 |
| 2.小括号括起来 内部可以存放多个数据值 |
| 数据值之间逗号隔开 数据值可以是任何数据类型 |
| 3.代码实现 |
| t1 = (11, 22, 'jason') |
| 4.元组和列表的区别 |
| l1 = [11, 22, 33] |
| print(l1[2]) |
| l1[2] = 666 |
| print(l1[2]) |
| |
| |
| |
| |
| |
| 5.元组内如果只有一个数据值 |
| t1 = (1) |
| t2 = (11.11) |
| t3 = ('jason') |
| print(type(t1), type(t2), type(t3)) |
| t1 = (1,) |
| t2 = (11.11,) |
| t3 = ('jason',) |
| print(type(t1), type(t2), type(t3)) |
| |
| ''' |
| 可以存放多个数据值的同时 如果里面暂且只有一个数据值 那么建议加上逗号 |
| ''' |
set集合数据类型
| 1.集合只能用于去重和关系运算 |
| 2.集合内数据只能是不可变类型 |
| 3.大括号括起来 内部存放多个数据值 数据值与数据值之间逗号隔开 数据值不是k:v键值对 |
| 4.代码实现 |
| s1 = {1, 2, 3, 4, 5, 6} |
| 5.定义空集合与空字典 |
| {} 默认是字典 |
| set() 定义空集合 |
用户交互
| 1.获取用户输入 input |
| input获取到的数据值都会同意处理成字符串类型 |
| 2.输出内部信息 print |
| 1.括号内既可以放数据值也可以放变量名 并且支持多个 逗号隔开即可 |
| 2.print自带换行符 |
| 换行符:\r\n \n(斜杠与字母组合到一起可能会产生特殊的含义) |
| 3.print也可以切换结束符 |
| print(数据,end='默认是\n') |
| 扩展:python2与python3中两个关键字的区别 |
| python2中 |
| input方法需要用户自己提前指定数据类型 写什么类型就是什么类型 |
| raw_input方法与python3中input一致 输入的统一处理成字符串 |
| python2中 |
| print方法有两种使用方式 |
| print 数据值 |
| print(数据值) |
格式化输出
| 提前定义一些内容 使用的时候可以局部修改 |
| 奖状 录取通知书 合同 |
| 代码实现: |
| 现实生活中大部分使用下划线提示别人填写内容 |
| 在程序中需要使用占位符 %s %d |
| info = '%s同志你好' |
| '''单个占位符''' |
| |
| |
| |
| |
| '''多个占位符''' |
| |
| |
| |
| '''注意事项:有几个占位符就需要几个数据值''' |
| |
| |
| '''不同占位符的区别''' |
| |
| |
| |
| |
| |
| print('%08d'% 123) |
| print('%08d'% 1234324324) |
基本运算符
| 1.数学运算符 |
| + - * / % // ** |
| 简化写法 |
| n = 10 |
| n += 1 |
| n -= 1 |
| n *= 1 |
| n /= 1 |
| n %= 1 |
| n //= 1 |
| n **= 1 |
| 2.比较运算符 |
| < > <= >= ==(代码中两个等于号才是等于) !=(不等于) |
| 1.链式赋值 |
| name = 'jason' |
| name1 = name |
| name2 = name1 |
| name = name1 = name2 = 'jason' |
| 2.交叉赋值 |
| m = 100 |
| n = 999 |
| '''方式一:采取中间变量''' |
| temp = n |
| m = n |
| n = temp |
| print(m, n) |
| '''方式二 交叉赋值语法''' |
| m, n = n, m |
| print(m, n) |
| 3.解压赋值 |
| name_list = ['jason', 'kevin', 'tony', 'oscar'] |
| name1, name2, name3, name4 = name_list |
| '''解压赋值在使用的时候 正常情况下需要保证左边的变量名与右边的数据值个数一致''' |
| |
| '''当需要解压的数据个数特别多 并且我们只需要使用其中的几个 那么可以打破上述的规则''' |
| |
| |
| |
逻辑运算符
| '''主要配合条件一起使用''' |
| and 与 |
| and 连接的多个条件必须全部成立 结果才能成立 |
| |
| print(1 < 10 and 666) |
| print(1 < 10 and 2 < 8) |
| print(111 and 222) |
| 如果需要你准确的说出具体的结果值 那么需要按照下列方式 |
| 如果and左边的条件是成立的 那么就完全取决于右边的条件 |
| 右边如果直接是数据值 那么结果就是该数据值 如果是含有表达式 则为布尔值 |
| |
| or 或 |
| |
| 如果条件中全部由or组成那么判断起来非常的简单 只要发现一个成立 结果就成立 |
| |
| |
| print(0 or False) |
| print(0 or 111) |
| |
| not 非 |
| 取反 |
| 类似于说反话 |
| |
| """ |
| 三者混合使用的时候有优先级之分 但是我们不需要记忆优先级 应该通过代码的形式提前规定好优先级 |
| eg: 先乘除有加减 但是可以使用括号来改变优先级 |
| (3>4 and 4>3) or ((1==3 and 'x' == 'x') or 3 >3) # False |
| """ |
垃圾回收机制
| """ |
| 有一些语言 内存空间的申请和释放都需要程序员自己写代码才可以完成 |
| 但是python却不需要 通过垃圾回收机制自动管理 |
| """ |
一.引用计数器

在python程序中创建的任何对象都会放在refchain链表中。
也就是说如果你得到了refchain,也就得到了python程序中的所有对象。
| name = 'gaoyan' |
| name1 = name |
| del name1 |
| 当数据值身上的引用计数为0的时候 就会被垃圾回收机制当做垃圾回收掉 |
| 当数据值身上的引用计数不为0的时候 永远不会被垃圾回收机制回收 |
二.标记清除
| 主要针对循环引用问题 |
| l1 = [11, 22] |
| l2 = [33, 44] |
| l1.append(l2) |
| l2.append(l1) |
| del l1 |
| del l2 |
| 当内存占用达到临界值的时候 程序会自动停止 然后扫描程序中所有的数据 |
| 并给只产生循环引用的数据打上标记 之后一次性清除 |
三. 分代回收
圾回收机制的频繁运行也会损耗各项资源
新生代、青春代、老年代(越往下检测频率越低)
流程控制理论
| 流程控制>>>:控制事物的执行流程 |
| 事物执行流程总共可以分为三种 |
| 1.顺序结构 |
| 从上往下依次执行 我们之前所编写的代码都属于该结构 |
| 2.分支结构 |
| 事物的执行会根据条件的不同做出不同的执行策略 |
| 3.循环结构 |
| 事物的执行会根据某个条件出现重复 |
| ps:在代码的世界里 很多时候可能会出现三者混合 |
流程控制之分支理论
- python中使用代码的缩进来表示代码的从属关系
从属关系:缩进的代码(子代码)是否执行取决于上面没有缩进的
- 并不是所有的代码都可以拥有缩进的代码(子代码)
if关键字
- 如果有多行子代码属于同一个父代码 那么这些子代码需要保证相同的缩进量
- python中针对缩进量没有具体的要求 但是推荐使用四个空格(windows中tab键)
- 当某一行代码需要编写子代码的时候 那么这一行代码的结尾肯定需要冒号
- 相同缩进量的代码彼此之间平起平坐 按照顺序结构依次执行
流程控制之循环结构
| 1. 单if分支结构 |
| if 条件: |
| 条件成立之后才会执行代码块 |
| username = input('username>>>:') |
| if username == 'Danielwei'; |
| print ('老师好') |
| |
| |
| 2.if...else...分支结构 |
| if 条件: |
| 条件成立之后执行的子代码 |
| else: |
| 条件不成立执行的子代码 |
| username = input('username>>>:') |
| if username == '吴彦祖': |
| print('老师好') |
| else: |
| print('fuck off') |
| |
| |
| 3.if...elif...else分支结构 |
| if 条件1: |
| 条件1成立之后执行的子代码 |
| elif 条件2: |
| 条件1不成立 条件2成立执行的子代码 |
| elif 条件3: |
| 条件1和2都不成立 条件3成立执行的子代码 |
| else: |
| 上述条件都不成立 执行的子代码 |
| ps:中间的elif可以写多个、上述子代码永远只会走一个 |
| score = input('请输入学生成绩>>>:') |
| score = int(score) |
| if score >= 90: |
| print('优秀') |
| elif score >= 80: |
| print('良好') |
| elif score >= 70: |
| print('一般') |
| elif score >= 60: |
| print('及格') |
| else: |
| print('挂科 交钱重修') |
| |
| 4.if的嵌套使用(有点难) |
| age = 28 |
| height = 170 |
| weight = 110 |
| is_beautiful = True |
| is_success = False |
| username = 'tony' |
| if username == 'tony': |
| print('tony发现目标') |
| if age < 30 and height > 160 and weight < 150 and is_beautiful: |
| print('大妹纸 手机掏出来 让我加微信') |
| if is_success: |
| print('吃饭 看电影 天黑了...') |
| else: |
| print('去你妹的 流氓!!!') |
| else: |
| print('不好意思 算了...关了灯都一样') |
| else: |
| print('不是本少爷') |
while for 循环补充
| 就是想让一些代码反复的执行 |
| while 条件: |
| 条件成立之后执行的子代码(循环体代码) |
| 1.先判断条件是否成立 |
| 2.如果成立则执行循环体代码 |
| 3.循环体代码执行完毕后再次回到条件判断处 判断条件是否成立 |
| 4.如果成立 则继续执行循环体代码 |
| 5.按照上述规律依次执行 直到条件不成立才会结束循环体代码的执行 |
| |
| |
| |
| |
| |
| |
| |
| break |
| while循环体代码一旦执行到break会直接结束循环 |
| continue |
| while循环体代码一旦执行到continue会结束本次循环 开始下一次循环 |
| |
| |
| while 条件: |
| 循环体代码 |
| else: |
| 循环体代码没有被强制结束的情况下 执行完毕就会执行else子代码 |
基本数据类型内置方法
| 我们之前学习的每一种数据类型本身都含有一系列的操作方法,内置方法是其中最多的(自带的功能) |
| 在python中数据类型调用内置方法的统一句式为>>>:句点符 |
| 'jason'.字符串内置方法 |
| 绑定字符串的变量名.字符串内置方法 |
| str.字符串内置方法 |
ps:数据类型的内置方法比较的多 想要掌握,不可以靠死记硬背 更多时候靠的是孰能生巧.
int整形相关操作
| 1.类型转换(将其他类型数据转换成整形) |
| int(其他数据类型) |
| 2.进制数转换 |
| 十进制转换其他进制 |
| 0b二进制缩写 print(bin(100)) |
| 0x八进制缩写 print(oct(100)) |
| 0x十六进制缩写 print(hex(100)) |
| ps:浮点型可以直接转 字符串必须满足内部是纯数字才可以 |
| ''' |
| 数字的开头如果是0b则为二进制 0o则为八进制 0x则为十六进制 |
| ''' |
| 其他进制转十进制 |
| print(int(0b1100100)) |
| print(int(0o144)) |
| print(int(0x64)) |
| |
| print(int("0b1100100", 2)) |
| print(int("0o144", 8)) |
| print(int("0x64", 16)) |
| 3.python自身对数字的敏感度较低(精确度低) |
| python这门语言其实不厉害 主要是背后有大佬 |
| 如果需要进准的计算需要借助于模块numpy..... |
float浮点型相关操作
| 1.类型转换 |
| float(其他数据类型) |
| 字符串里面可以允许出现一个小数点 其他必须是纯数字 |
| 2.python自身对数字的敏感度较低(精确度低) |
str字符串相关操作
| 1.类型转换 |
| str(其他类型数据) |
| ps:可以转换任意数据类型(只需要在后面加引号即可) |
| 2.必须要掌握的方法 |
| 2.1.索引取值(其实位置0开始 超出范围直接报错) |
| s1 = ('hello world!') |
| print(s1[0]) |
| print(s1[-1]) |
| |
| 2.2.切片操作 |
| print(s1[1:5]) |
| print(s1[-1:-5]) |
| print(s1[-5:-1]) |
| |
| 2.3 修改切片方向 |
| print(s1[1:5:1]) |
| print(s1[1:5:2]) |
| print(s1[-1:-5:-1]) |
| print(s1[:]) |
| print(s1[2:]) |
| print(s1[:5]) |
| print(s1[::2]) |
| |
| 2.4.统计字符串中字符的个数 |
| print(len(s1)) |
| |
| 2.5.移除字符串首尾指定的字符 |
| username = input('username>>>:').strip() |
| res1 = '$$wei$$' |
| print(res1.strip('$')) |
| print(res1.lstrip('$')) |
| print(res1.rstrip('$')) |
| |
| 2.6.切割字符串中指定的字符 |
| res = 'jason|123|read' |
| print(res.split('|')) |
| |
| name, password, hobby = res.split('|') |
| print(res.split('|', maxsplit=1)) |
| |
| print(res.rsplit('|',maxsplit=1)) |
| |
| resplit:从右到左 |
| |
| 2.7.字符串格式化输出 |
| format玩法1:等价于占位符 |
| res = 'my name is {} my age is {}'.format('wei', 123) |
| print(res |
| format玩法2:索引取值并支持反复使用 |
| res = 'my name is {0} my age is {1} {0} {0} {1}'.format('jason', 123) |
| print(res) |
| format玩法3:占位符见名知意 |
| res = 'my name is {name1} my age is {age1}'.format(name1='jason', age1=123) |
| print(res) |
| format玩法4:推荐使用(******* 给鸡哥拉满!!!!!!) |
| |
| 3.字符串 |
| 1.大小写相关 |
| res = 'hElLO WorlD 666' |
| print(res.upper()) |
| print(res.lower()) |
| |
| ''' |
| 图片验证码:生成没有大小写统一的验证码 展示给用户看 |
| 获取用户输入的验证码 将用户输入的验证码和当初产生的验证码统一转大写或者小写再比对 |
| ''' |
| code = 'zBcqD1' |
| print('请输入图中的验证码的内容',code) |
| cs_code = input('请输入验证码>>>:').strip() |
| if cs_code.upper() == code.upper(): |
| print('验证码正确') |
| 3.1 判断字符串中的大小写 |
| res = 'hello world' |
| print(res.isupper()) |
| print(res.islower()) |
| 3.2 判断字符串是否是纯数字 |
| res = '' |
| print(res.isdigit()) |
| guess_age = input('guess_age>>>:').strip() |
| if guess_age.isdigit(): |
| guess_age = int(guess_age) |
| print('年龄', guess_age) |
| else: |
| print('代笔!年龄都不知道怎么输入啊??')) |
| |
| 3.3替换字符串中指定的内容 |
| res = 'my name is jason jason jason jason jason' |
| print(res.replace('jason', '你想要输入的')) |
| |
| print(res.replace('jason', 'tonySB', 1)) |
| |
| |
| 3.4.字符串的拼接 |
| ss1 = 'hello' |
| ss2 = 'world' |
| print(ss1 + '$$$' + ss2) |
| print(ss1 * 10) |
| |
| print('|'.join(['jason', '123', 'read', 'JDB'])) |
| print('|'.join(['jason', 123])) |
| |
| 3.5 统计指定字符出现的次数 |
| res = 'hello world' |
| print(res.count('l')) |
| |
| 3.6 判断字符串的开头或者结尾 |
| res = 'jason say hello' |
| res = 'jason say hello' |
| print(res.startswith('jason')) |
| print(res.startswith('j')) |
| print(res.startswith('jas')) |
| print(res.startswith('a')) |
| print(res.startswith('son')) |
| print(res.startswith('say')) |
| print(res.endswith('o')) |
| print(res.endswith('llo')) |
| print(res.endswith('hello')) |
| 3.7.其他方法补充 |
| res = 'helLO wORld hELlo worLD' |
| print(res.title()) |
| print(res.capitalize()) |
| print(res.swapcase()) |
| print(res.index('O')) |
| print(res.find('O') |
| print(res.index('c')) |
| print(res.find('c')) |
| print(res.find('LO')) |
list列表相关操作
| 1. 类型转换 |
| list(其他数据类型) |
| ps:能够被for循环的数据类型都可以转成列表 |
| print(list('hello world')) |
| |
| print(list({'name': 'jason', 'pwd': 123})) |
| |
| print(list((1, 2, 3, 4))) |
| print(list({1, 2, 3, 4, 5})) |
| |
| 2.需要掌握的方法 |
| l1 = [111, 222, 333, 444, 555, 666, 777, 888] |
| 1.索引取值(正负数) |
| print(l1[0]) |
| print(l1[-1]) |
| 2.切片操作 与字符串讲解操作一致 |
| print(l1[0:5]) |
| print(l1[:]) |
| 3.间隔数 方向 与字符串讲解操作一致 |
| print(l1[::-1]) |
| 4.统计列表中数据值的个数 |
| print(len(l1)) |
| 5.数据值修改 |
| l1[0] = 123 |
| print(l1) |
| 6.列表添加数据值 |
| 方式1:尾部追加数据值 |
| l1.append('干饭') |
| print(l1) |
| l1.append(['jason', 'kevin', 'jerry']) |
| print(l1) |
| 方式2:任意位置插入数据值 |
| l1.insert(0, 'jason') |
| print(l1) |
| l1.insert(1, [11, 22, 33, 44]) 在1位牵引值添加列表 |
| print(l1) |
| 方式3:扩展列表 合并列表 |
| ll1 = [11, 22, 33] |
| ll2 = [44, 55, 66] |
| print(ll1 + ll2) |
| ll1.extend(ll2) |
| |
| print(ll1) |
| for i in ll2: |
| ll1.append(i) |
| print(ll1) |
| |
| 7.删除列表数据 |
| 方式1:通用的删除关键字del |
| del l1[0] |
| print(l1) |
| 方式2:remove |
| l1.remove(444) |
| print(l1) |
| 方式3:pop |
| ll1 = [111, 222, 333, 444, 555, 666] |
| ll1.pop(3) |
| print(ll1) |
| ll1.pop() |
| print(ll1) |
| res = ll1.pop(3) |
| print(res) |
| res = ll1.remove(444) |
| print(res1) |
| 8.排序 |
| ss = [54, 99, 55, 76, 12, 43, 76, 88, 99, 100, 33] |
| ss.sort() |
| print(ss) |
| ss.sort(reverse=True) |
| |
| print(ss) |
| |
| 9.统计列表中某个数据值出现的次数 |
| print(l1.count(111)) |
| 10.颠倒列表顺序 |
| ss.reverse() |
| print(ss) |
可变类型与不可变类型
| s1 = '$$jason$$' |
| l1 = [11, 22, 33 ] |
| res = s1.strip('$') |
| print(s1) |
| '''字符串在调用内置方法之后并不会修改自己 而是产生了一个新的结果 |
| 如何查看调用方法之后有没有新的结果 可以在调用该方法的代码左侧添加变量名和赋值符号 |
| res = s1.strip('$') |
| ''' |
| print(s1.strip('$')) |
| |
| ret = l1.append(44) |
| print(l1) |
| print(ret) |
| '''列表在调用内置方法之后修改的就是自身 并没有产生一个新的结果''' |
| |
| 可变类型:值改变 内存地址不变 |
| l1 = [11, 22, 33] |
| print(l1) |
| print(id(l1)) |
| l1.append(44) |
| print(l1) |
| print(id(l1)) |
| |
| 不可变类型:值改变 内存地址肯定变 |
| res = '$$hello world$$' |
| print(res) |
| print(id(res)) |
| res1 = res.strip('$') |
| print(res1) |
| print(id(res1)) |
dict字典相关操作
| 1.类型转换 |
| dict() |
| 字典的转换一般不使用关键字 而是靠自己手动转 |
| 2.必须要学的操作 |
| u_dict = { |
| 'name':'wei', |
| 'password':3472, |
| 'hobby':['baskertball','swimming'] |
| } |
| 2.1.按k取值(不推荐使用) |
| print(u_dict['username']) |
| print(u_dict['phone']) |
| 2.2 按内置方法get取值(推荐使用) |
| print(u_dict.get('username')) |
| print(u_dict.get('age')) |
| print(u_dict.get('name', '没有哟 嘿嘿嘿')) |
| |
| print(u_dict.get('phone', '没有哟 嘿嘿嘿')) |
| |
| 2.3 修改数据值 |
| print(id(u_dict)) |
| u_dict['name'] = 'tony' |
| print(id(u_dict)) |
| print(u_dict) |
| |
| 2.4 新增键对值 |
| u_dict['age'] = 18 |
| print(u_dict) |
| 2.5 删除数据 |
| del u_dict['name'] |
| print(u_dict) |
| |
| res = u_dict.pop('password') |
| print(u_dict) |
| print(res) |
| 2.6 统计字典中键值对的个数 |
| print(len(u_dict)) |
| 2.7 字典三剑客 |
| print(u_dict.keys()) |
| |
| print(u_dict.values()) |
| |
| print(u_dict.items()) |
| |
| for i in u_dict.items(): |
| k,v = i |
| print(k, v) |
| 2.8 补充 |
| print(dict.fromkeys(['name', 'pwd', 'hobby'], 123)) |
| |
| |
| res = dict.fromkeys(['name', 'pwd', 'hobby'], []) |
| print(res) |
| res['name'].append('jason') |
| res['pwd'].append(123) |
| res['hobby'].append('study') |
| print(res) |
| '''当第二个公共值是可变类型的时候 一定要注意 通过任何一个键修改都会影响所有''' |
| |
| |
| |
| |
| user_dict.popitem() |
tuple元组相关操作
| 1.类型转换 |
| tuple() |
| ps:支持for循环的数据类型都可以转成元组 |
| 2.元组必须掌握的方法 |
| t1 = (11, 22, 33, 44, 55, 66) |
| |
| print(t1[0]) |
| |
| print(t1[:]) |
| print(t1[0:4]) |
| print(t1[:-4]) |
| |
| print(t1[0:6:2]) |
| print(t1[::-2]) |
| |
| print(len(t1)) |
| |
| print(t1.count(11)) |
| |
| print(t1.index(22)) |
| |
| |
| |
set集合相关操作
| 1.类型转换 |
| set() |
| 集合内数据必须是不可变类型(整型 浮点型 字符串 元组) |
| 集合内数据也是无序的 没有索引的概念 |
| 2.集合需要掌握的方法 |
| 去重 |
| 关系运算 |
| ps:只有遇到上述两种需求的时候才应该考虑使用集合 |
| 3.去重 |
| s1 = {11, 22, 11, 22, 22, 11, 222, 11, 22, 33, 22} |
| l1 = [11, 22, 33, 22, 11, 22, 33, 22, 11, 22, 33, 22] |
| s1 = set(l1) |
| l1 = list(s1) |
| print(l1) |
| '''集合的去重无法保留原先数据的排列顺序''' |
| 4.关系运算 |
| 群体之间做差异化校验 |
| 两个微信账户之间 有不同的好友 有相同的好友 |
| f1 = {'jason', 'tony', 'jerry', 'oscar'} |
| f2 = {'jack', 'jason', 'tom', 'tony'} |
| |
| print(f1 & f2) |
| |
| print(f1 - f2) |
| |
| print(f1 | f2) |
| |
| print(f1 ^ f2) |
| |
| print(f1 > f2) |
| print(f1 < f2) |
字符编码(理论)
| 1.针对乱码不要慌 切换编码慢慢试即可 |
| 2.编码与解码 |
| 编码:将人类的字符按照指定的编码编码成计算机能够读懂的数据 |
| 字符串.encode() |
| 解码:将计算机能够读懂的数据按照指定的编码解码成人能够读懂 |
| bytes类型数据.decode() |
| 3.python2与python3差异 |
| python2默认的编码是ASCII |
| 1.文件头 |
| |
| 2.字符串前面加u |
| u'你好啊' |
| python3默认的编码是utf系列(unicode) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?