Python的else子句7个妙用,原来还能这样用,整挺好!

在这里插入图片描述## 1、条件语句else基础 🔄

1.1 简单else的常规操作

在Python中,else子句通常跟在if或一系列if-elif之后,提供一个“否则”的情况处理路径。如果前面的所有条件都不满足 ,程序就会执行这里的代码块。例如 ,检查一个数是否为正数、负数或零:

number = int(input("Enter a number: "))
if number > 0:
    print("Positive")
elif number < 0:
    print("Negative")
else:
    print("Zero")

假设用户输入了0 ,输出将是Zero

1.2 elif的多路分支技巧

利用elif(else if的缩写),可以构建更复杂的逻辑判断结构 ,处理多种可能的情况。比如 ,根据成绩给学生评级:

score = float(input("请输入分数: "))
if score >= 90:
    grade = 'A'
elif score >= 80:
    grade = 'B'
elif score >= 70:
    grade = 'C'
elif score >= 60:
    grade = 'D'
else:
    grade = 'F'
print("你的等级是:", grade)

如果输入85,则输出为你的等级是: B

1.3 嵌套else的逻辑深入

通过在ifelifelse内部再嵌套相同结构 ,可以处理层级更深的逻辑判断。例如 ,判断年份是否为闰年,同时区分平年和世纪闰年:

year = int(input("请输入年份: "))
if year % 4 == 0:
    if year % 100 == 0:
        if year % 400 == 0:
            print(year, "是世纪闰年")
        else:
            print(year, "是平年")
    else:
        print(year, "是普通闰年")
else:
    print(year, "是平年")

输入1900 ,输出为1900 是平年

通过这些例子,可以看到else子句在Python中的多样性和灵活性 ,它不仅限于基本的条件判断 ,还能与循环结构巧妙结合,实现更复杂的逻辑控制。

2、for-else结构:迭代搜索的秘密武器 🔍

2.1 列表遍历查找优化

在Python中,for-else结构提供了一种高效且简洁的方式来表达“遍历查找直至找到目标或遍历结束”的逻辑。当循环正常结束(即没有被break打断)时,执行else块中的代码。

numbers = [1, 3, 5, 7, 9]
target = 7

for number in numbers:
    if number == target:
        print(f"找到了目标数字:{number}")
        break
else:
    print("未在列表中找到目标数字。")

输出结果为:“找到了目标数字:7”。如果target是其它不在列表中的值,则输出“未在列表中找到目标数字。”,体现了查找逻辑的完整性。

2.2 在生成器中的高级应用

for-else同样适用于基于生成器的迭代,这对于处理大量数据流或无限序列时尤其有效 ,能够优雅地处理“是否找到匹配项”的情况。

def fibonacci(maximum):
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
        if a > maximum:
            break

search_for = 13
found = False
for number in fibonacci(search_for * 2):  # 查找范围扩大以防提前中断
    if number == search_for:
        print(f"斐波那契数列中找到数字:{search_for}")
        found = True
        break
else:
    print(f"斐波那契数列中未找到数字:{search_for}")

# 注意:此处实际斐波那契数列生成至search_for * 2以确保能找到search_for或确定未找到

这个例子中,我们通过生成器函数fibonacci生成斐波那契数列,并使用for-else结构寻找特定值。如果找到目标数字,提前终止循环并打印消息;否则,在循环自然结束后,else部分执行,说明未找到目标数字。这种结构让代码逻辑清晰 ,易于理解。

3、while-else的奇技淫巧 ⏱

3.1 循环控制的灵活性

while-else结构在循环控制上展现出独特的灵活性,else部分仅在循环自然结束(非break跳出)时执行,这对于设计带有特定终止条件的循环非常有用。

count = 0
while count < 5:
    print(f"计数:{count}")
    count += 1
else:
    print("计数完成,未遇到提前终止条件。")

这段代码每循环一次打印一个计数值,当计数达到5时 ,循环自然结束,随后执行else块中的消息打印。这种方式使循环逻辑更加清晰 ,易于维护。

3.2 实时监控与条件终止

在实时监控或等待特定条件出现的应用场景中,while-else结构能有效地表达“持续监控直至条件满足或超时”的逻辑。

import time

timeout = 10  # 监控超时时间(秒)
start_time = time.time()

while (time.time() - start_time) < timeout:
    # 假设这里进行某种监控操作
    if some_condition():  # 假定some_condition()为监控的条件函数
        print("监控到目标条件,循环终止。")
        break
else:
    print(f"监控超时,未满足条件。(已过{timeout}秒)")

此例模拟了一个监控过程,若在指定时间内some_condition()变为True,则通过break退出循环并打印消息;否则,当监控时间达到超时时,执行else部分,告知用户监控超时的情况。这样的设计使得程序行为意图明确,逻辑紧凑。

4、异常处理的艺术 🎭

4.1 try-except的else妙用

else子句在try-except结构中的作用常被忽视。它紧随except之后,在try块没有引发异常时执行 ,为正常流程提供代码路径。例如,当尝试读取文件并仅在成功时处理其内容:

try:
    file = open("example.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("文件未找到")
else:
    print("文件内容:", content)
finally:
    file.close()

如果example.txt存在 ,输出将是文件内容;若不存在,则打印“文件未找到”。

4.2 finally的不可或缺

无论try块内是否发生异常,也不管是否有exceptelse部分,finally块都会被执行,用于清理资源,如关闭文件或释放网络连接:

try:
    resource = acquire_resource()
    # 使用resource
except SomeException:
    handle_exception()
finally:
    release_resource(resource)

此模式确保即使有异常抛出,资源也能被正确释放。

4.3 自定义异常的else捕获

通过定义自定义异常类,可以在特定条件下触发并捕获更精确的错误信息。在异常处理链中 ,else可用来区分是否捕获到了自定义异常:

class MyCustomError(Exception):
    pass

def process_data(data):
    if not data:
        raise MyCustomError("数据为空")
    # 处理数据...

try:
    process_data([])
except MyCustomError as e:
    print("捕获到自定义异常:", e)
else:
    print("数据处理成功 ,无异常")

当传入空列表时,会触发并捕获MyCustomError

4.4 并发编程中的异常else策略

在并发编程场景下,如使用线程或多进程,异常处理需格外小心。虽然直接在并发任务中使用else可能不直观,但可以通过共享状态或队列传递异常信息,间接实现类似逻辑控制。例如,使用concurrent.futures模块时,可以在回调函数中检查任务状态,模拟异常处理的else行为:

from concurrent.futures import ThreadPoolExecutor

def task():
    # 可能会抛出异常的代码

with ThreadPoolExecutor() as executor:
    future = executor.submit(task)
    try:
        result = future.result()
    except Exception as e:
        print("任务抛出异常:", e)
    else:
        print("任务成功完成 ,结果是:", result)

这里 ,else部分在future.result()未引发异常时执行,表明任务顺利完成。

掌握这些异常处理的艺术 ,可以让代码更加健壮 ,提高程序在面对错误情况时的恢复能力。

5、with语句的else魅力 🛡️

5.1 文件操作的安全else

在文件处理中,with语句确保文件在操作后正确关闭,即便遇到异常也是如此。else部分可在无异常时执行额外操作:

with open("example.txt", "w") as file:
    file.write("Hello, World!")
    # 如果写入成功 ,执行else内的代码
else:
    print("文件写入成功,无异常")

这段代码在文件写入后打印确认消息,前提是过程未遇到异常。

5.2 网络资源获取中的else

with-else结构不仅限于文件操作,它适用于任何需要精确控制资源生命周期的场景 ,比如数据库连接、网络套接字等。这有助于编写更健壮、易维护的代码。

from contextlib import closing
from urllib.request import urlopen

# 使用with管理网络请求资源
with closing(urlopen('https://www.example.com')) as page:
    content = page.read()
    # 若请求成功,进入else块
else:
    print("网页内容获取成功。")
# 确保网络连接在操作完成后被妥善关闭

此例展示了如何利用withclosing上下文管理器确保网络资源的正确释放 ,而else部分仅在请求未引发异常时执行,提升了代码的健壮性及资源管理的效率。

5.3 资源管理的自动清理

with不仅限于文件 ,任何实现了__enter____exit__方法的对象都可用。利用else ,资源使用后的清理逻辑更为精细:

from contextlib import closing, contextmanager

@contextmanager
def connect_database(url):
    conn = establish_connection(url)
    try:
        yield conn
    except Exception:
        log_error()
    else:
        perform_cleanup(conn)  # 无异常时执行清理
    finally:
        conn.close()

with connect_database("db_url") as conn:
    query_db(conn)

这个例子展示了如何在数据库连接操作完成后,仅在无异常时执行特定清理步骤。

5.4 数据库连接的else优雅关闭

数据库操作中 ,通过with管理连接,else可以用来执行事务提交等操作,保证在一切顺利时的优雅处理:

import sqlite3

with sqlite3.connect(":memory:") as conn:
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)")
    cursor.execute("INSERT INTO test VALUES (?, ?)", (1, "Alice"))
    
    # 若之前的SQL操作均成功 ,进入else
    else:
        conn.commit()
        print("数据已成功提交")
    # 这里省略了异常处理 ,实际应用中应加入

这段代码演示了如何在SQL操作无误时提交事务。

5.5 复杂资源上下文的else处理

对于涉及多个资源或复杂逻辑的场景,else可以配合contextlib.ExitStack来管理多个上下文,确保资源的精确控制:

from contextlib import ExitStack

def process_resources():
    with ExitStack() as stack:
        file1 = stack.enter_context(open("file1.txt", "r"))
        file2 = stack.enter_context(open("file2.txt", "w"))
        
        # 假设一些操作...
        
        # 如果前面的操作都成功
        else:
            # 执行需要在所有资源成功初始化且操作无异常后进行的操作
            content = file1.read()
            file2.write(content.upper())
            
            print("资源处理完毕,无异常")

此例中,两个文件操作无误后,将file1的内容大写后写入file2

with语句的else部分 ,为资源管理和错误处理提供了一种优雅且高效的手段 ,确保了代码的健壮性和易维护性。

6、生成器与else的高级玩法 🌀

6.1 yield与else的协作

生成器函数通过yield语句暂停执行,允许迭代。尽管else不能直接与yield搭配 ,但在某些模式中,它可以增强生成器逻辑的表达力。例如 ,创建一个生成器来检查质数 ,并在完成遍历后通过else通知:

def primes_up_to(n):
    for candidate in range(2, n + 1):
        for factor in range(2, candidate):
            if candidate % factor == 0:
                break
        else:  # 当for循环没有break,即candidate是质数时执行
            yield candidate

for prime in primes_up_to(30):
    print(prime, end=" ")

输出为:2 3 5 7 11 13 17 19 23 29 ,末尾没有额外的逻辑处理 ,但通过else保证了质数的正确产出。

6.2 无限序列的智能控制

结合生成器和else,可以设计出智能控制无限序列生成的逻辑。例如,生成斐波那契数列,但在达到指定项数后优雅地结束:

def fibonacci(max_items):
    a, b = 0, 1
    count = 0
    while True:
        if count >= max_items:
            break
        yield a
        a, b = b, a + b
        count += 1
    else:  # 实际上不会执行 ,因为有break提前退出循环
        print("生成序列完成")

for num in fibonacci(10):
    print(num, end=" ")

输出前10个斐波那契数,由于while循环中使用了显式break,这里的else块虽不执行,但展示了控制流的另一种可能性。

6.3 else在协程中的特殊角色

虽然Python的asyncio和协程不直接支持elseyield fromawait的直接组合,但可以巧妙设计生成器或协程逻辑 ,利用外部状态或条件判断模仿类似效果。例如,使用事件循环和协程控制异步任务,通过外部变量判断是否完成任务集:

import asyncio

async def task_coroutine(task_id):
    # 模拟异步任务
    await asyncio.sleep(1)
    print(f"Task {task_id} completed")

async def main():
    tasks = [task_coroutine(i) for i in range(3)]
    done, pending = await asyncio.wait(tasks)
    if not pending:  # 类似else逻辑,所有任务完成
        print("所有任务已完成")

asyncio.run(main())

这段代码展示了异步任务管理,所有任务完成后,通过条件判断输出消息 ,体现了与else类似的控制逻辑。

6.4 利用else优化迭代效率

虽然标准的for-else结构不直接提升迭代效率,但通过精心设计生成器逻辑,可以在特定场景下避免不必要的迭代 ,从而间接提升效率。例如 ,查找列表中第一个满足条件的元素时,一旦找到即可结束循环:

def find_first(predicate, iterable):
    for item in iterable:
        if predicate(item):
            break
    else:  # 如果没找到满足条件的元素
        return None
    return item

numbers = [1, 3, 5, 7, 8, 10]
result = find_first(lambda x: x % 2 == 0, numbers)
print(result)  # 输出8,首个偶数

通过这种设计,迭代在找到第一个匹配项时立即停止 ,提升了在大数据集上的搜索效率。

通过这些高级应用 ,我们可以看到else在生成器和协程中虽不常用,却能巧妙地增强代码的逻辑表达和控制流管理,提升程序的性能与灵活性。

7、性能考量与代码风格指南 📊

7.1 何时该用else提升代码可读性

合理使用else子句可以显著提升代码的可读性和逻辑清晰度,特别是在以下情形:

  • 简化条件逻辑:当存在明确的二分情况,且其中一个分支为默认或异常处理时 ,使用else可以减少嵌套,使逻辑一目了然。
if user.is_authenticated:
    print("欢迎回来,您已登录。")
else:
    print("请先登录。")
  • 避免重复判断:在一系列条件检查后 ,利用else来执行剩余的通用逻辑,避免了对已知条件的重复测试。
if language == 'Python':
    course = 'Python 101'
elif language == 'Java':
    course = 'Java Basics'
else:
    course = 'Unknown Language Course'

通过上述示例 ,else清晰地指出了当所有特定条件都不满足时的默认处理路径。

7.2 避免else导致的潜在陷阱

尽管else提高了代码的可读性,但不当使用也可能引入问题:

  • 过度嵌套:过多的if-else可能导致代码层次过深,难以阅读和维护。考虑使用卫语句、策略模式或提前返回来扁平化逻辑。
# 不推荐
if condition1:
    # ...
else:
    if condition2:
        # ...
    else:
        # ...
        
# 推荐
if not condition1:
    return
if condition2:
    # ...
else:
    # ...
  • 忽视异常处理:在异常处理时,误用else代替finally可能导致资源泄露。确保使用try-except-finally结构正确管理资源。
# 错误示例
try:
    open_file = open('file.txt')
    # 操作文件
except FileNotFoundError:
    print("文件未找到。")
else:
    open_file.close()  # 正确 ,但不如使用finally普遍适用

# 更佳实践
try:
    open_file = open('file.txt')
    # 操作文件
finally:
    open_file.close()

综上所述 ,else是提高代码可读性的有力工具,但也需谨慎使用 ,以免造成不必要的复杂度或忽略异常处理,影响代码的健壮性。

8、总结与展望 🚀

探索Python中else子句的多元化运用,揭示了其在条件控制、异常管理、资源上下文及生成器设计中的深刻影响。从基础到进阶,文章逐一剖析了如何利用else提升代码逻辑的严谨性与效率,如在循环中精准执行无异常后的操作、资源的自动清理与优雅关闭、并发编程中的精细控制,以及在生成器逻辑中的创新应用。通过实战案例,展现了else在提升程序健壮性与表达力方面的独特价值 ,为开发者提供了优化代码结构、增强程序可靠性的新视角。面向未来,深入理解并灵活应用这些技巧 ,将促进编写更加高效、维护友好的Python解决方案。
在这里插入图片描述
在这里插入图片描述

往期精彩文章

  1. 好家伙,Python自定义接口,玩得这么花

  2. 哎呀我去,Python多重继承还能这么玩?

  3. 太秀了!Python魔法方法__call__,你试过吗?

  4. Python函数重载6种实现方式,从此告别手写if-else!

  5. 嗷嗷,Python动态创建函数和类,是这么玩的啊

  6. Python混入类Mixin,远比你想象的更强大!

  7. Python -c原来还能这么用,学到了!

  8. Python模块导入,别out了,看看这些高级玩法!

  9. Python定时任务8种实现方式,你喜欢哪种!

  10. python文件:.py,.ipynb, pyi, pyc, pyd, pyo都是什么文件?

  11. Python也能"零延迟"通信吗?ZeroMQ带你开启高速模式!

  12. 掌握Python 这10个OOP技术,代码想写不好都难!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/696789.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】GPIO输出(江科大)

一、GPIO简介 1.GPIO&#xff1a;通用输入输出口 2.可配置为8种输入输出模式 3.引脚电平&#xff1a;0-3.3V&#xff08;输出最大3.3V&#xff09;&#xff0c;部分引脚可容忍5V&#xff08;输入&#xff0c;有FT&#xff09; 4.输出模式下&#xff0c;可控制端口输出高低电平…

详解FedProx:FedAvg的改进版 Federated optimization in heterogeneous networks

FedProx&#xff1a;2020 FedAvg的改进 论文&#xff1a;《Federated Optimization in Heterogeneous Networks》 引用量&#xff1a;4445 源码地址&#xff1a; 官方实现&#xff08;tensorflow&#xff09;https://github.com/litian96/FedProx 几个pytorch实现&#xff1a;…

十二、【源码】配置注解执行SQL

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/12-annotation 配置注解执行SQL 简化一下流程&#xff0c;主要可以分为下面几步&#xff1a; 1.解析配置&#xff0c;写入配置项 2.执行…

问题排查: Goalng Defer 带来的性能损耗

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言问题背景结论 引言 性能优化之路道阻且长&#xff0c;因为脱敏规定&#xff0c;…

Nginx 精解:正则表达式、location 匹配与 rewrite 重写

一、常见的 Nginx 正则表达式 在 Nginx 配置中&#xff0c;正则表达式用于匹配和重写 URL 请求。以下是一些常见的 Nginx 正则表达式示例&#xff1a; 当涉及正则表达式时&#xff0c;理解各个特殊字符的含义是非常重要的。以下是每个特殊字符的例子&#xff1a; ^&#xff1…

讯飞星火大模型个人API账号免费使用申请教程

文章目录 1.登录讯飞星火大模型官网 https://www.xfyun.cn/ 2.下滑找到Spark Lite&#xff0c;点击立即调用 3.星火大模型需要和具体的应用绑定&#xff0c;我们需要先创建一个新应用 https://console.xfyun.cn/app/myapp&#xff0c;应用名称可以按照自己的意愿起。 4.填写应用…

打造智慧工厂核心:ARMxy工业PC与Linux系统

智能制造正以前所未有的速度重塑全球工业格局&#xff0c;而位于这场革命核心的&#xff0c;正是那些能够精准响应复杂生产需求、高效驱动自动化流程的先进设备。钡铼技术ARMxy工业计算机&#xff0c;以其独特的设计哲学与卓越的技术性能&#xff0c;正成为众多现代化生产线背后…

ViT:2 理解CLIP

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

vuInhub靶场实战系列--Kioptrix Level #3

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 arp-scan主机扫描 2.2 端口扫描2.3 指纹识别2.4 目…

快速测试 Mybatis 复杂SQL,无需启动 Spring

快速测试mybatis的sql 当我们写完sql后&#xff0c;我们需要测试下sql是否符合预期&#xff0c;在填入各种参数后能否正常工作&#xff0c;尤其是对于复杂的sql。 一般我们测试可能是如下的代码: 由于需要启动spring&#xff0c;当项目较大的时候启动速度很慢&#xff0c;有些…

④-2单细胞学习-cellchat单数据代码补充版(通讯网络)

目录 通讯网络系统分析 ①社会网络分析 1&#xff0c;计算每个细胞群的网络中心性指标 2&#xff0c;识别细胞的信号流模式 ②非负矩阵分解&#xff08;NMF&#xff09;识别细胞的通讯模式 1&#xff0c;信号输出细胞的模式识别 2&#xff0c;信号输入细胞的模式识别 信…

RocketMq源码解析六:消息存储

一、消息存储核心类 rocketmq消息存储的功能主要在store这个模块下。 核心类就是DefaultMessageStore。我们看下其属性 // 配置文件 private final MessageStoreConfig messageStoreConfig; // CommitLog 文件存储实现类 private final CommitLog commitLog; …

【研发日记】Matlab/Simulink软件优化(三)——利用NaNFlag为数据处理算法降阶

文章目录 前言 背景介绍 初始算法 优化算法 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 见《【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法》 背景介绍 在一个嵌入式软件开发项目中&#xff0c;需要开…

FedAvg论文

论文&#xff1a;Communication-Efficient Learning of Deep Networks from Decentralized Data 原code Reproducing 通过阅读帖子进行的了解。 联邦平均算法就是最典型的平均算法之一。将每个客户端上的本地随机梯度下降和执行模型的平均服务器结合在一起。 联邦优化问题 数…

开发小Tips:切换淘宝,腾讯,官方,yarn,cnpm镜像源,nrm包管理工具的具体使用方式(方便切换镜像源)

由于开发中经常要下载一些软件或者依赖&#xff0c;且大多数的官方源的服务器都在国外&#xff0c;网速比较慢&#xff0c;国内为了方便&#xff0c;国内一些大厂就建立一些镜像&#xff0c;加快下载速度。 1.各大镜像源的切换&#xff1a; 切换淘宝镜像源&#xff1a; npm …

Bio-Info每日一题:Rosalind-06-Counting Point Mutations

&#x1f389; 进入生物信息学的世界&#xff0c;与Rosalind一起探索吧&#xff01;&#x1f9ec; Rosalind是一个在线平台&#xff0c;专为学习和实践生物信息学而设计。该平台提供了一系列循序渐进的编程挑战&#xff0c;帮助用户从基础到高级掌握生物信息学知识。无论你是初…

数据结构笔记 线性表的查找 顺序,折半,分块查找

顺序查找&#xff1a;从头找到尾&#xff0c;或者从尾找到头 顺序查找的性能&#xff1a; 其中&#xff0c;辅助空间的O&#xff08;1&#xff09;用于存放哨兵的 折半查找&#xff1a;向下取整&#xff1a;指当计算的结果不为整数时取小于计算结果的整数。 折半查找的性能&am…

类和对象的学习总结(一)

面向对象和面向过程编程初步认识 C语言是面向过程的&#xff0c;关注过程&#xff08;分析求解问题的步骤&#xff09; 例如&#xff1a;外卖&#xff0c;关注点菜&#xff0c;接单&#xff0c;送单等 C是面向对象的&#xff0c;关注对象&#xff0c;把一件事拆分成不同的对象&…

十大排序

本文将以「 通俗易懂」的方式来描述排序的基本实现。 &#x1f9d1;‍&#x1f4bb;阅读本文前&#xff0c;需要一点点编程基础和一点点数据结构知识 本文的所有代码以cpp实现 文章目录 排序的定义 插入排序 ⭐ &#x1f9d0;算法描述 &#x1f496;具体实现 &#x1f…

记一次Linux下Docker镜像服务器磁盘空间清理

我们开发环境Jenkins构建项目时报服务器磁盘空间不足&#xff0c;导致项目自动化构建部署失败&#xff0c; Docker镜像服务器磁盘空间清理我们做了多次了&#xff0c;之前在清理Docker镜像服务器时走了不少弯路&#xff0c;查了不少Docker镜像服务器空间清理&#xff0c;都大同…