当前位置: 首页 > news >正文

从入门到专业:探索Python中的判断与循环技巧!

文章目录

  • 判断语句
    • 布尔类型和比较运算符
    • if语句的基本格式
    • 练习案例:成年人判断
    • if else语句
    • if elif else语句
    • 判断语句的嵌套
    • 案例:猜数字
  • 循环语句
    • while循环的基础语法
    • while循环的基础案例
    • while循环的嵌套应用
    • 补充:print输出不换行&\t
    • for循环的基础语法
    • range()函数
    • for循环变量的作用域
    • for循环的嵌套应用
    • 循环中断 : break和continue
    • 综合案例:发工资

判断语句

在这里插入图片描述

布尔类型和比较运算符

布尔类型的字面量:

  • True 表示真(是、肯定)
  • False 表示假 (否、否定)
    定义变量存储布尔类型数据:
变量名称 = 布尔类型字面量
# 定义变量存储布尔类型的数据
bool_1 = True
bool_2 = False
print(f"bool_1变量的内容是:{bool_1}, 类型是:{type(bool_1)}") # bool_1变量的内容是:True, 类型是:<class 'bool'>
print(f"bool_2变量的内容是:{bool_2}, 类型是:{type(bool_2)}") # bool_2变量的内容是:False, 类型是:<class 'bool'>
  • 布尔类型不仅可以自行定义,同时也可以通过计算的来。

  • 布尔类型的数据,不仅可以通过定义得到,也可以通过比较运算符进行内容比较得到。
num1 = 10
num2 = 10
print(f"10 == 10的结果是:{num1 == num2}") # Truenum1 = 10
num2 = 15
print(f"10 != 15的结果是:{num1 != num2}")# Falsename1 = "itcast"
name2 = "itheima"
print(f"itcast == itheima 结果是:{name1 == name2}") # Falsenum1 = 10
num2 = 5
print(f"10 > 5结果是:{num1 > num2}")  # True
print(f"10 < 5的结果是:{num1 < num2}")# Falsenum1 = 10
num2 = 11
print(f"10 >= 11的结果是:{num1 >= num2}") # False
print(f"10 <= 11的结果是:{num1 <= num2}") # True

在这里插入图片描述

if语句的基本格式

在这里插入图片描述

# 定义变量
age = 30
# 进行判断
if age >= 18:  print("我已经成年了"

if语句的注意事项:

  • 判断条件的结果一定要是布尔类型
  • 不要忘记判断条件后的: 引号
  • 归属于if语句的代码块,需在前方填充4个空格缩进

练习案例:成年人判断

结合前面学习的input输入语句,完成如下案例:

  1. 通过input语句,获取键盘输入,为变量age赋值。(注意转换成数字类型)
  2. 通过if判断是否是成年人,满足条件则输出提示信息,如下:
    在这里插入图片描述
# 获取键盘输入
age = int(input("请输入你的年龄:"))# 通过if判断是否是成年人
if age >= 18:print("您已成年,游玩需要买票,10元.")print("祝您游玩愉快")

if else语句

在这里插入图片描述

  • 注意:
  1. else后,不需要判断条件
  2. 和if的代码块一样,else的代码块同样需要4个空格作为缩进
age = int(input("请输入你的年龄:"))if age >= 18:print("您已成年,需要买票10元。")
else:print("您未成年,可以免费游玩。")

if elif else语句

在这里插入图片描述
在这里插入图片描述

# 定义一个变量数字
num = 5# 通过键盘输入获取猜想的数字,通过多次if 和 elif的组合进行猜想比较
if int(input("请猜一个数字:")) == num:print("恭喜第一次就猜对了呢")
elif int(input("猜错了,再猜一次:")) == num:print("猜对了")
elif int(input("猜错了,再猜一次:")) == num:print("恭喜,最后一次机会,你猜对了")
else:print("Sorry 猜错了")

判断语句的嵌套

在这里插入图片描述

  • 基本语法格式
    在这里插入图片描述

自由组合嵌套,需求如下:
公司要发礼物,条件是:

  1. 必须是大于等于18岁小于30岁的成年人
  2. 同时入职时间需满足大于两年,或者级别大于3才可领取
age = 11
year = 1
level = 1
if age >= 18:print("你是成年人")if age < 30:print("你的年龄达标了")if year > 2:print("恭喜你,年龄和入职时间都达标,可以领取礼物")elif level > 3:print("恭喜你,年龄和级别达标,可以领取礼物")else:print("不好意思,尽管年龄达标,但是入职时间和级别都不达标。")else:print("不好意思,年龄太大了")else:print("不好意思,小朋友不可以领取。")

  • 总结
  1. 嵌套判断语句可以用于多条件、多层次的逻辑判断
  2. 嵌套判断语句可以根据需求,自由组合if elif else来构建多层次判断
  3. 嵌套判断语句,一定要注意空格缩进,Python通过空格缩进来决定层次关系

案例:猜数字

案例需求: 定义一个数字(1~10,随机产生),通过3次判断来猜出来数字
案例要求:

  1. 数字随机产生,范围1-10
  2. 有3次机会猜测数字,通过3层嵌套判断实现
  3. 每次猜不中,会提示大了或小了
# 1. 构建一个随机的数字变量
import random
num = random.randint(1, 10)guess_num = int(input("输入你要猜测的数字:"))# 2. 通过if判断语句进行数字的猜测
if guess_num == num:print("恭喜,第一次就猜中了")
else:if guess_num > num:print("你猜测的数字大了")else:print("你猜测的数字小了")guess_num = int(input("再次输入你要猜测的数字:"))if guess_num == num:print("恭喜,第二次猜中了")else:if guess_num > num:print("你猜测的数字大了")else:print("你猜测的数字小了")guess_num = int(input("第三次输入你要猜测的数字:"))if guess_num == num:print("第三次猜中了")else:print("三次机会用完了,没有猜中。")

循环语句

在这里插入图片描述

while循环的基础语法

在这里插入图片描述
while循环的注意事项

  1. 条件需提供布尔类型结果,True继续,False停止
  2. 空格缩进不能忘
  3. 请规划好循环终止条件,否则将无限循环
sum = 0
i = 1
while i<=100:sum += ii += 1print(f"1-100累加的和是:{sum}")

while循环的基础案例

设置一个范围1-100的随机整数变量,通过while循环,配合input语句,判断输入的数字是否等于随机数

  • 无限次机会,直到猜中为止
  • 每一次猜不中,会提示大了或小了
  • 猜完数字后,提示猜了几次
    在这里插入图片描述
# 获取范围在1-100的随机数字
import random
num = random.randint(1, 100)
# 定义一个变量,记录总共猜测了多少次
count = 0# 通过一个布尔类型的变量,做循环是否继续的标记
flag = True
while flag:guess_num = int(input("请输入你猜测的数字:"))count += 1if guess_num == num:print("猜中了")# 设置为False就是终止循环的条件flag = Falseelse:if guess_num > num:print("你猜的大了")else:print("你猜的小了")print(f"你总共猜测了{count}次")

while循环的嵌套应用

在这里插入图片描述

  • 同判断语句的嵌套一样,循环语句的嵌套,要注意空格缩进。

    • 基于空格缩进来决定层次关系
  • 注意条件的设置,避免出现无限循环(除非真的需要无限循环)

  • 打印输出九九乘法表

# 定义外层循环的控制变量
i = 1
while i <= 9:# 定义内层循环的控制变量j = 1while j <= i:# 内层循环的print语句,不要换行,通过\t制表符进行对齐print(f"{j} * {i} = {j * i}\t", end='')j += 1i += 1print()     # print空内容,就是输出一个换行

补充:print输出不换行&\t

  • 在Python中,默认情况下,每次调用print()函数都会在输出内容的末尾添加一个换行符(\n),导致下一次输出在新的一行显示。但是,在print语句中避免换行,可以将end参数设置为空字符串"",以表示在输出结束时不添加换行符。
  • 以下是一个示例:
print("Hello", end="")
print("World", end="")
  • 还可以将end参数设置为除换行符之外的任何字符或字符串,用于在输出结束时添加指定的字符或字符串。
    例如,通过将end参数设置为一个空格,你可以在输出结束时添加一个空格:
print("Hello", end=" ")
print("World")
# Hello World
  • 注意,修改end参数的方法仅适用于Python 3.x 版本。在Python 2.x 中,你需要使用print语句而不是print()函数,或者导入print_function,以获得类似的行为。

  • 制表符 “\t” 是一种特殊字符,在字符串中使用它可以创建水平制表位(tab)的效果。它在打印输出或字符串中的对齐时非常有用。
  • 当在字符串中使用制表符 \t,它会在当前位置插入一个制表符,并移动到下一个制表位。制表位的宽度通常是距离前一个制表位的一定间隔,类似于键盘上的 Tab 键所做的效果。
print("Name:\tJohn")
print("Age:\t25")
print("Country:\tUSA")

输出如下:

Name:   John
Age:    25
Country:        USA

for循环的基础语法

  • for循环是一种”轮询”机制,是对一批内容进行”逐个处理”
    在这里插入图片描述
for 临时变量 in 待处理数据集: 循环满足条件时执行的代码
# 统计如下字符串中,有多少个字母a
name = "itheima is a brand of itcast"# 定义一个变量,用来统计有多少个a
count = 0# for 循环统计
# for 临时变量 in 被统计的数据:
for x in name:if x == "a":count += 1print(f"被统计的字符串中有{count}个a")

range()函数

  • range()是一个内置函数,用于生成一系列的整数。range()函数可以接受一个或多个参数,返回一个表示整数序列的可迭代对象。
    range()函数的语法格式为:
range(stop)            # 生成从0到stop-1的整数序列
range(start, stop)     # 生成从start到stop-1的整数序列
range(start, stop, step)  # 生成从start到stop-1的整数序列,步长为step

参数说明:

  1. start:可选,表示序列的起始值,默认为0。
  2. stop:表示序列的终止值(不包含在序列内)。
  3. step:可选,表示序列中的元素之间的步长,默认为1。
    range()函数通常用于循环结构,例如for循环:
# 打印输出0到4的整数 
for i in range(5):print(i)
  • range()函数的结果转换为列表,以便查看生成的整数序列:
# 生成一个步长为2的整数序列 [1, 3, 5] 并将其转换为列表后打印
numbers = list(range(1, 6, 2))
print(numbers)
  • 注意,range()函数返回的是一个可迭代对象,而不是实际的列表。如果需要获取完整列表,可以使用list()函数将其转换为列表。
    range()函数在循环迭代和生成整数序列时非常有用,特别是当你需要指定起始值和步长时。

for循环变量的作用域

  1. for循环中的临时变量,其作用域限定为:循环内
  2. 这种限定:
    • 编程规范的限定,而非强制限定
    • 不遵守也能正常运行,但是不建议这样做
    • 如需访问临时变量,可以预先在循环外定义它

name = "Alice"for i in range(3):print(name)  # 可以访问循环体外部定义的变量message = "Hello"print(message)  # 可以访问循环体内部定义的变量print(name)  # 仍然可以访问循环体外部定义的变量

for循环的嵌套应用

  • 练习案例-for循环打印九九乘法表
# 通过外层循环控制行数
for i in range(1, 10):# 通过内层循环控制每一行的数据for j in range(1, i + 1):# 在内层循环中输出每一行的内容print(f"{j} * {i} = {j * i}\t", end=' ')# 外层循环可以通过print输出一个回车符print()

循环中断 : break和continue

  • break和continue是用于控制循环流程的关键字。
    1. break用于终止整个循环,跳出循环结构。
    2. continue用于跳过当前迭代,继续执行下一次迭代。
  1. break关键字用于中断当前循环,提前跳出循环体,执行循环之后的代码。当程序执行到break语句时,循环立即终止,不再执行循环体中剩余的语句,而是跳出整个循环结构。
for i in range(1, 6):if i == 3:break  # 当i等于3时跳出循环print(i)

输出:

1
2
  • 当i等于3时,执行了break语句,因此循环被中断,print(i)语句不再执行。
  1. continue关键字用于跳过当前迭代,继续执行下一次循环迭代。当程序执行到continue语句时,当前迭代中continue之后的代码不再执行,直接进入下一次迭代。
for i in range(1, 6):if i == 3:continue  # 当i等于3时跳过当前迭代print(i)

输出:

1
2
4
5
  • 当i等于3时,执行了continue语句,因此当前迭代中的print(i)语句被跳过,直接进入下一次迭代。

综合案例:发工资

  • 某公司,账户余额有1W元,给20名员工发工资。
    • 员工编号从1到20,从编号1开始,依次领取工资,每人可领取1000元
    • 领工资时,财务判断员工的绩效分(1-10)(随机生成),如果低于5,不发工资,换下一位
    • 如果工资发完了,结束发工资。
money = 10000
for i in range(1, 21):import randomscore = random.randint(1, 10)if score < 5:print(f"员工{i},绩效分{score},低于5,不发工资,下一位。")continueelse:money -= 1000print(f"向员工{i}发放工资1000元,账户余额还剩余{money}元")if money == 0:print("工资发完了,下个月领取吧。")break

相关文章:

从入门到专业:探索Python中的判断与循环技巧!

文章目录 判断语句布尔类型和比较运算符if语句的基本格式练习案例&#xff1a;成年人判断if else语句if elif else语句判断语句的嵌套案例&#xff1a;猜数字 循环语句while循环的基础语法while循环的基础案例while循环的嵌套应用补充&#xff1a;print输出不换行&\tfor循环…...

mqtt、tcp、http的区别

文章目录 一、MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;1、类型2、用途 二、TCP&#xff08;Transmission Control Protocol&#xff09;1、类型2、用途 三、HTTP&#xff08;Hypertext Transfer Protocol&#xff09;1、类型2、用途 四、主要区别1、类…...

边写代码边学习之RNN

1. 什么是 RNN 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种以序列数据为输入来进行建模的深度学习模型&#xff0c;它是 NLP 中最常用的模型。其结构如下图&#xff1a; x是输入&#xff0c;h是隐层单元&#xff0c;o为输出&#xff…...

在linux调试进程PID的方法

当我们谈论调试 PID&#xff08;进程标识符&#xff09;时&#xff0c;我们通常是指诊断和解决与操作系统中的特定进程相关的问题。有许多工具和方法可用于调试 PID&#xff0c;以下是一些常见的方法&#xff1a; 1. 使用ps命令 ps命令是最基本的调试工具&#xff0c;用于查看…...

【并发编程】线程安全的栈容器

std::stack容器的接口包括 empty(), size(), top(), push(), pop()等。 问题 其原接口在多线程的情况下&#xff0c;会持续很多问题。 例如&#xff0c;在std::stack容器的接口中&#xff0c;在多线程下应用时&#xff0c;empty()和size()的结果是不可信的。因为尽管在某线程…...

ES嵌套查询和普通查询的高亮显示区别

在 Elasticsearch 中&#xff0c;高亮显示是一种强大的搜索结果可视化工具&#xff0c;它可以帮助我们快速识别匹配的关键字或短语。在ES中&#xff0c;我们可以使用两种不同的查询方式来实现高亮显示&#xff1a;嵌套查询和普通查询。本文探讨这两种查询方式的高亮显示区别以及…...

Greenplum集群部署

一,安装说明 1.1环境说明 *名称**版本*操作系统CentOS 7.6 64bitgreenplumgreenplum-db-6.10.1-rhel7-x86_64.rpm1.2集群介绍 IPhostname集群节点10.240.3.244gpmastermaster10.240.3.245gpsegment1segment10.240.3.246gpsegment2segment二,安装环境准备 2.1 修改各节点名称…...

电教智能云数据可视化平台开发电能优化日志实录

电教智能云数据可视化平台开发电脑优化日志实录 一、2K和4K弹窗判断二、电能API对接1.电脑爬虫2.电能分组过滤3.数据可视化渲染4.弹窗 三.数组按顺序输出 一、2K和4K弹窗判断 {* 判断2k和4k弹窗 *}{if $dataScene[scene_standard] eq 0}<a class"menuBtn subMenu"…...

JSX语法基础总结

题记&#xff1a;首先我们要了解一下jsx是什么&#xff0c;跟js有什么区别&#xff0c;其实就是js的语法糖&#xff0c;加上了xml的语法&#xff0c;使得产生虚拟dom更加的方便&#xff0c;简单说一下&#xff0c;xml就是存储数据的格式&#xff0c;想了解xml的话&#xff0c;可…...

socker套接字

1.打印错误信息 2.socketaddr_in结构体 结构体&#xff1a; &#xff08;部分库代码&#xff09; (宏中的##) 3.manual TCP: SOCK_STREAM &#xff1a; 提供有序地&#xff0c;可靠的&#xff0c;全双工的&#xff0c;基于连接的流式服务 UDP: 面向数据报...

No111.精选前端面试题,享受每天的挑战和学习

文章目录 map和foreach的区别在组件中如何获取vuex的action对象中的属性怎么去获取封装在vuex的某个接口数据有没有抓包过&#xff1f;你如何跟踪某一个特定的请求&#xff1f;比如一个特定的URL&#xff0c;你如何把有关这部分的url数据提取出来&#xff1f;1. 使用网络抓包工…...

【Apollo学习笔记】—— 相机仿真

文章目录 前言相关代码整理 测试实践文件目录包管理BUILD文件以及cyberfile.xml文件源程序BUILD运行结果其他参考CameraOutput channels启动camera驱动启动camera video compression驱动 前言 本文是对Cyber RT的学习记录,文章可能存在不严谨、不完善、有缺漏的部分&#xff0…...

【数据结构】——线性表的相关习题

目录 题型一&#xff08;线性表的存储结构&#xff09;题型二&#xff08;链表的判空&#xff09;题型三&#xff08;单链表的建立&#xff09;题型四&#xff08;顺序表、单链表的插入删除操作&#xff09;题型五&#xff08;双链表的插入删除操作&#xff09;题型六&#xff…...

SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用)

SpringBoot集成Elasticsearch8.x&#xff08;8&#xff09;|&#xff08;新版本Java API Client的Painless语言脚本script使用&#xff09; 文章目录 SpringBoot集成Elasticsearch8.x&#xff08;8&#xff09;|&#xff08;新版本Java API Client的Painless语言脚本script使用…...

SpringBoot复习:(19)Condition接口和@Conditional注解

Condition接口代码如下&#xff1a; public interface Condition {boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);}它是一个函数式接口&#xff0c;只有一个方法matches用来表示条件是否满足。matches方法中的ConditionContext类对象context可以…...

K8s中的Controller

Controller的作用 &#xff08;1&#xff09;确保预期的pod副本数量 &#xff08;2&#xff09;无状态应用部署 &#xff08;3&#xff09;有状态应用部署 &#xff08;4&#xff09;确保所有的node运行同一个pod&#xff0c;一次性任务和定时任务 1.无状态和有状态 无状态&…...

【MFC】03.常用复杂控件的使用-笔记

热键&#xff1a; 对话框-类向导&#xff1a;初始化函数中&#xff0c;热键需要在最开始的时候就注册进去&#xff1a; 注册热键&#xff1a; 在这之前&#xff0c;先去定义一个宏&#xff0c;代表你这个快捷键。 参数&#xff1a;窗口句柄&#xff0c;热键编号&#xff08;热…...

Autosar诊断实战系列14-NRC优先级解析

本文框架 前言1. NRC分类2. NRC优先级判断2.1. NRC优先级判断逻辑介绍2.2 NRC测试注意事项前言 在本系列笔者将结合工作中对诊断实战部分的应用经验进一步介绍常用UDS服务的进一步探讨及开发中注意事项, Dem/Dcm/CanTp/Fim模块配置开发及注意事项,诊断与BswM/NvM关联模块的应…...

《向量数据库指南》——腾讯云向量数据库Tencent Cloud VectorDB产品特性,架构和应用场景

腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持 10 亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提…...

xcode 的app工程与ffmpeg 4.4版本的静态库联调,ffmpeg内下的断点无法暂停。

先阐述一下我的业务场景&#xff0c;我有一个iOS的app sdk项目&#xff0c;下面简称 A &#xff0c;以及运行 A 的 app 项目&#xff0c;简称 A demo 。 引用关系为 A demo 引用了 A &#xff0c;而 A 引用了 ffmpeg 的静态库&#xff08;.a文件&#xff09;。此时业务出现了 b…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...