百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

【Python基础】Python「异常处理」:程序出错了?不慌

toyiye 2024-08-25 15:42 5 浏览 0 评论

第1章 异常处理的重要性与背景

1.1 程序错误与异常的概念

在编程实践中,我们常常会遇到各种预料之外的情况,比如文件找不到、网络连接中断或者数据类型不匹配等。这些状况在编程术语中被称为“错误”(Errors)或“异常”(Exceptions)。异常就好比是现实生活中的“红灯”,它标志着某处出现了问题,需要我们采取行动来应对。在Python中 ,每当这类问题发生时 ,程序会停止正常流程并抛出一个异常对象,提醒开发者及时处理。

# 示例:尝试打开一个不存在的文件
try:
    with open("non_existent_file.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("哎呀,文件没找到呢!")

1.2 异常处理在软件开发中的角色

想象一下你在做一顿美食,如果发现食材不够或者调料过期了 ,你会怎么办?同样,在编写代码时,当遇到可能导致程序崩溃的“意外情况”,聪明的厨师——程序员就会利用异常处理机制来“挽救”这道菜——程序的运行。通过预设可能发生的错误情境,并为其编写特定的处理逻辑,我们能够确保即使出现问题,程序也能优雅地恢复或终止,而不是突如其来的崩溃。

例如,银行转账业务中,我们需要检查账户余额是否足够。若余额不足 ,不妥善处理可能会导致数据不一致,这时异常处理就如同安全阀门,确保在扣款失败时释放锁,回滚事务,告知用户转账失败。

class InsufficientBalanceError(Exception):
    pass

def transfer_money(src_account, dst_account, amount):
    if src_account.balance < amount:
        raise InsufficientBalanceError("余额不足")

    # 执行转账操作...

1.3 Python语言中的异常体系概览

在Python的世界观里,异常被组织成了一棵类别层次结构。最顶层的是BaseException ,它是所有异常类型的基类。常见的内置异常如ValueErrorTypeErrorFileNotFoundError等都继承自Exception类,而更严重的系统退出异常SystemExit、键盘中断异常KeyboardInterrupt则直接继承自BaseException

理解并熟练掌握Python异常体系 ,有助于我们针对不同的异常类型编写针对性强、逻辑清晰的异常处理代码,从而构建出更加稳定健壮的应用程序。

第2章 Python异常基础知识

2.1 异常分类与常见异常类型

2.1.1 标准内置异常

Python自带了一系列丰富的内置异常类型,涵盖了从语法错误到运行时异常的各种情况。这些异常就像编程世界的“急救箱”,帮助我们快速识别并处理问题。以下是一些常用的内置异常:

  • SyntaxError :代码语法错误,如缺少括号、拼写错误等。
  • TypeError :不同类型间的非法操作,如对字符串执行数学运算。
  • ValueError :合法操作但参数值无效,如int()函数接收到非数字字符串。
  • ZeroDivisionError :除数为零的数学运算。
  • FileNotFoundError :尝试打开不存在的文件。
  • KeyError :访问字典中不存在的键。
  • IndexError :索引超出序列范围。
  • AttributeError :尝试访问对象不存在的属性或方法。
# 示例:引发不同类型异常
print("Hello, " + 123)  # TypeError: can only concatenate str (not "int") to str
x = 1 / 0                # ZeroDivisionError: division by zero
d = {}
d['nonexistent_key']     # KeyError: 'nonexistent_key'
numbers = [1, 2, 3]
print(numbers[3])         # IndexError: list index out of range

2.1.2 自定义异常类

除了使用内置异常,我们还可以根据项目需求创建自定义异常类。这样做有助于提高代码可读性和异常处理的针对性。自定义异常通常继承自Exception类或其他合适的内置异常。

class CustomError(Exception):
    def __init__(self, message):
        self.message = message
        super().__init__(message)

try:
    raise CustomError("发生了一个定制的错误!")
except CustomError as e:
    print(e)  # 输出:发生了一个定制的错误!

class UserNotFoundException(CustomError):
    pass

try:
    raise UserNotFoundException("指定用户未找到!")
except UserNotFoundException as e:
    print(e)  # 输出:指定用户未找到!

2.2try-except基本结构与工作原理

2.2.1try块中的代码执行逻辑

try语句块用于包裹可能出现异常的代码。当try块中的代码正常执行完毕时,程序会跳过后续的except子句直接继续执行。反之 ,一旦出现异常,Python将立即停止执行try块剩余部分 ,并寻找匹配的except子句进行处理。

try:
    # 可能引发异常的代码
except ExceptionType:
    # 处理异常的代码

2.2.2except子句捕获异常

except子句紧跟在try块后,用于捕获特定类型的异常。当try块中抛出的异常与except子句指定的异常类型相匹配时 ,该子句中的代码会被执行。

try:
    divide(10, 0)  # 假设divide函数会抛出ZeroDivisionError
except ZeroDivisionError:
    print("除数不能为零哦!")

2.3except子句的细化与匹配规则

2.3.1 单一异常类型捕获

可以指定单个异常类型精确捕获特定异常。

try:
    # 可能引发异常的代码
except ValueError:
    # 处理ValueError异常

2.3.2 多重异常类型同时捕获

使用逗号分隔多个异常类型 ,可一次性捕获多种异常。

try:
    # 可能引发异常的代码
except (TypeError, ValueError):
    # 处理TypeError或ValueError异常

2.3.3 通用异常捕获

使用Exception类作为except子句的异常类型,可以捕获所有非系统退出和中断的异常。

try:
    # 可能引发异常的代码
except Exception:
    # 处理所有非系统退出和中断的异常

2.4 except子句中的as关键字与异常对象

2.4.1 使用as获取异常实例

except子句中添加as关键字 ,可以将捕获的异常实例赋值给一个变量 ,便于进一步分析异常信息。

try:
    # 可能引发异常的代码
except ValueError as e:
    print(f"发生了一个ValueError异常:{e}")

2.4.2 异常对象属性与方法

异常对象通常包含以下属性和方法:

  • args :异常携带的数据,通常是一个元组。
  • with_traceback(tb) :返回一个新的异常实例 ,其__traceback__属性设置为tb
try:
    # 可能引发异常的代码
except Exception as e:
    print(f"异常类型:{type(e).__name__}")
    print(f"异常消息:{e.args[0]}")
    print(e.__traceback__)

2.5finally子句与资源清理

2.5.1finally块的执行保证

无论try块是否发生异常,也不论是否有匹配的except子句 ,finally块中的代码都会被执行。这使得finally非常适合用于资源清理,如关闭文件、释放锁等。

try:
    # 可能引发异常的代码
finally:
    # 一定会执行的清理代码

2.5.2 结合try-except实现可靠清理

结合try-exceptfinally,既能处理异常,又能确保资源得到正确清理。

try:
    f = open("example.txt", "r")
    # 读取文件操作
except FileNotFoundError:
    print("文件未找到!")
finally:
    f.close()  # 无论是否发生异常,文件都会被正确关闭

第3章 进阶异常处理技巧

3.1else子句:无异常时的额外操作

3.1.1else块的触发条件

在Python异常处理结构中,else子句是一种特殊的存在,它的执行依赖于try块内的代码是否成功完成且未抛出任何异常。换句话说,只有当try块“一切顺利”时,else块才会被执行。

try:
    risky_operation()
except SomeException:
    handle_error()
else:
    print("一切正常,执行成功后的额外操作...")

3.1.2 与try-except的配合使用

通过结合else子句 ,我们可以把成功的处理逻辑与异常处理逻辑区分开,使代码更具结构性,易于理解和维护。

def read_and_validate_file(file_path):
    try:
        with open(file_path, 'r') as file:
            data = validate_data(file.read())
    except FileNotFoundError:
        print(f"文件 {file_path} 未找到!")
    except InvalidDataError:
        print(f"文件 {file_path} 中的数据格式有误!")
    else:
        process_valid_data(data)
        print(f"文件 {file_path} 的数据已成功读取并验证。")

3.2raise语句:主动抛出异常

3.2.1 抛出内置异常

当检测到不符合程序逻辑的情况时 ,可以主动抛出异常 ,强制程序进入异常处理流程。

def divide_numbers(a, b):
    if b == 0:
        raise ValueError("除数不能为零!")
    return a / b

try:
    result = divide_numbers(10, 0)
except ValueError as ve:
    print(ve)

3.2.2 抛出自定义异常实例

为了更好地表达业务含义,我们也可以定义自己的异常类并抛出。

class NotEnoughFuelError(Exception):
    pass

def drive_car(miles_to_drive, fuel_level):
    required_fuel = miles_to_drive * FUEL_CONSUMPTION_RATE
    if fuel_level < required_fuel:
        raise NotEnoughFuelError(f"油量不足以行驶{miles_to_drive}英里!")

try:
    drive_car(200, 50)
except NotEnoughFuelError as nfe:
    print(nfe)

3.3 上下文管理器与with语句

3.3.1with语句的异常控制特性

with语句不仅简化了资源的获取和释放过程,还能在处理异常时自动调用__exit__方法进行清理。

class ManagedResource:
    def __enter__(self):
        self.resource = acquire_resource()
        return self.resource

    def __exit__(self, exc_type, exc_val, exc_tb):
        release_resource(self.resource)

with ManagedResource() as resource:
    work_with(resource)
    # 如果此处产生异常 ,__exit__ 方法会在异常处理完成后被调用

3.3.2 实现上下文管理协议

通过实现__enter____exit__方法,自定义类也可成为上下文管理器,支持with语句。

class DatabaseConnection:
    def __enter__(self):
        self.conn = connect_to_database()
        return self.conn.cursor()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.conn.commit()
        self.conn.close()

with DatabaseConnection() as db_cursor:
    db_cursor.execute(sql_query)
    # 在此范围内无论是否出现异常,数据库连接都能被妥善关闭

3.4 链式异常处理与finally的替代方案

3.4.1 使用except重新引发异常

有时 ,我们在处理异常的同时 ,还需要保留原始异常信息。可以通过在except块内再次抛出异常实现。

try:
    risky_operation()
except SomeException as original_error:
    log_exception(original_error)
    raise  # 重新抛出原始异常 ,以便上层处理

3.4.2 使用raise from保留原始堆栈跟踪

Python 3 引入了raise from语法,允许在抛出新异常时引用原始异常,保留完整的堆栈跟踪。

try:
    risky_operation()
except SomeException as original_error:
    new_error = NewError("基于原有异常的新描述")
    raise new_error from original_error

第4章 异常处理的最佳实践

4.1 精确捕获与宽泛捕获的权衡

4.1.1 避免过度捕获导致信息丢失

在处理异常时,既要确保程序的稳定性 ,也要保留足够的异常信息以助于后续排查问题。过度使用通用异常捕获(如只捕获Exception) ,虽然可以防止程序崩溃,但可能导致关键的异常细节被掩盖。

try:
    divide(10, 0)  # 假设divide函数会抛出ZeroDivisionError
except Exception:
    print("发生了一个异常!")  # 过度捕获 ,信息不足

正确的做法是尽量精确捕获预期的异常类型 ,保留详细的异常消息和堆栈跟踪。

try:
    divide(10, 0)
except ZeroDivisionError as e:
    print(f"除数不能为零:{e}")

4.1.2 合理使用通用异常避免代码冗余

尽管提倡精确捕获,但在处理一组相似异常时 ,为避免代码冗余 ,可以适当使用通用异常捕获。此时,应在except子句中检查并记录具体的异常类型。

try:
    risky_operation()
except (TypeError, ValueError) as e:
    log_exception(e)
    # 共享的错误处理逻辑

4.2 异常信息的记录与报告

4.2.1 日志记录异常详情

在生产环境中,异常信息应被记录到日志中,以便运维人员随时查看和分析。使用Python标准库logging模块 ,确保异常类型、消息、堆栈跟踪等重要信息都被记录。

import logging

logger = logging.getLogger(__name__)

try:
    risky_operation()
except Exception as e:
    logger.error("发生异常", exc_info=e)

4.2.2 异常通知与监控

除了本地日志记录,还可以通过集成第三方服务(如Sentry、Loggly等)实现异常实时通知与监控。这样,开发团队能在第一时间得知线上问题,提高响应速度。

import sentry_sdk

sentry_sdk.init(dsn="your_dsn_here")

try:
    risky_operation()
except Exception as e:
    sentry_sdk.capture_exception(e)

4.3 异常处理与函数设计

4.3.1 返回值与异常的组合使用

在函数设计时,合理搭配返回值与异常,可以使API更易于理解和使用。通常,成功结果通过返回值传递,错误状态通过异常表示。

def fetch_user(id: int) -> Optional[User]:
    try:
        user = database.fetch_user(id)
        if user is None:
            raise UserNotFoundError(f"用户ID {id} 未找到")
        return user
    except DatabaseError as de:
        raise FetchUserError(f"获取用户ID {id} 时发生数据库错误:{de}")

4.3.2 使用typing模块增强异常类型提示

借助typing模块的TypeVarUnion,可以在函数签名中明确指出可能抛出的异常类型 ,提高代码的可读性和IDE的智能提示效果。

from typing import TypeVar, Union

E = TypeVar("E", bound=Exception)

def safe_divide(a: float, b: float) -> float:
    try:
        return a / b
    except ZeroDivisionError as zde:
        raise SafeDivideError("除数不能为零", original=zde) from zde

def risky_operation() -> None:
    try:
        # ...
    except (IOError, ValueError) as e:
        raise RiskyOperationError("操作过程中发生错误") from e

T = TypeVar("T")
RiskyReturnType = Union[T, RiskyOperationError]

def do_risky_thing() -> RiskyReturnType[str]:
    try:
        # ...
        return "Success"
    except Exception as e:
        raise RiskyOperationError("操作过程中发生错误") from e

4.4 异常处理在不同编程场景的应用

4.4.1 Web开发中的异常中间件

在Web框架(如Flask、Django等)中,异常中间件可用于全局捕获并统一处理HTTP请求中的异常,提供友好的错误响应或重定向。

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.errorhandler(Exception)
def handle_exception(e):
    code = 500 if isinstance(e, Exception) else e.code
    return jsonify(error=str(e)), code

@app.route("/api/risky")
def risky_api():
    try:
        # ...
    except SomeError as se:
        raise ApiException(se.message, status_code=400)

4.4.2 数据库操作的异常处理策略

与数据库交互时,应针对特定数据库库(如SQLAlchemy、Peewee等)提供的异常进行处理,确保事务正确回滚,避免数据不一致。

from sqlalchemy.exc import IntegrityError

session = Session()

try:
    user = User(name="Alice")
    session.add(user)
    session.commit()
except IntegrityError:
    session.rollback()
    raise UserCreationError("用户名已存在")
finally:
    session.close()

4.4.3 并发编程中的异常传播与同步原语

在多线程、多进程或异步编程中 ,异常通常会在主线程/进程或回调中被捕获。使用适当的同步原语(如ThreadPoolExecutorconcurrent.futures.Future等)确保异常得到妥善处理和传播。

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=5) as executor:
    future = executor.submit(risky_task)
    try:
        result = future.result()
    except Exception as e:
        print(f"任务执行失败:{e}")

第5章 异常处理与程序调试

5.1 利用异常信息定位问题

5.1.1 分析异常类型与消息

在Python中,异常类型和异常消息是定位问题的关键线索。当你遇到程序突然停止或行为异常时,首先查看的是异常类型和伴随的消息。例如,当你试图访问列表越界的位置时 ,Python会抛出IndexError并附带具体信息。

my_list = [1, 2, 3]
try:
    print(my_list[5])
except IndexError as e:
    print(f"发生了错误: {e}")  # 输出:"发生了错误: list index out of range"

5.1.2 查看异常堆栈跟踪

此外,异常堆栈跟踪更是追踪问题源头的重要工具。它记录了从异常发生至当前堆栈层级的所有函数调用顺序及行号,帮助你快速定位到引起异常的具体代码行。

try:
    nested_function_call()
except Exception as e:
    import traceback
    print(traceback.format_exc())  # 输出完整的堆栈跟踪信息

5.2 调试工具与异常交互

5.2.1 IDE中的异常断点与交互式调试

现代IDE如PyCharm、VSCode等提供了强大的调试功能,你可以设置异常断点,在程序遇到特定异常时暂停执行,然后逐步执行、查看变量值等。比如在PyCharm中,只需右键点击代码行选择"Add Exception Breakpoint"即可。

5.2.2 使用pdb模块进行源码级调试

Python内置的pdb模块也十分有用,尤其在命令行环境下。通过在代码中插入import pdb; pdb.set_trace(),程序会在执行到这一行时暂停 ,并进入pdb的交互模式,让你逐行执行代码,观察变量变化。

def calculate_average(lst):
    import pdb; pdb.set_trace()  # 设置调试断点
    total = sum(lst)
    count = len(lst)
    avg = total / count
    return avg

lst = [1, 2, 3, 'a']  # 此处故意放入一个字符串,将引发TypeError
calculate_average(lst)

5.3 异常处理在测试驱动开发中的作用

5.3.1 单元测试中的预期异常捕获

在单元测试中,预期异常的捕获至关重要。unittest等测试框架允许你声明某个测试方法应该抛出某种异常。当预期异常未抛出或抛出异常类型不符时 ,测试将失败。

import unittest

class TestMyFunction(unittest.TestCase):
    def test_division_by_zero(self):
        with self.assertRaises(ZeroDivisionError):
            my_function_that_may_throw_zero_division_error()

5.3.2 使用pytest等框架管理异常测试

pytest框架提供了更灵活的异常处理方式,可通过pytest.raises()上下文管理器验证函数是否抛出了预期异常。

import pytest

def test_division_by_zero():
    with pytest.raises(ZeroDivisionError):
        divide_something(10, 0)

通过精心设计的异常处理与调试手段,开发者可以迅速找出问题所在 ,高效修复bug ,进一步提升代码质量与程序稳定性。

第6章 异常处理的高级议题

6.1 异常栈展开与异步编程中的异常处理

6.1.1 异步任务中的异常传播与捕获

在异步编程中,异常的传播与同步代码有所不同。当一个异步任务(如协程或异步函数)抛出异常时,该异常不会立即终止程序,而是被挂起并等待上层调用者处理。以下是一个使用asyncio库的示例:

import asyncio

async def risky_coroutine():
    await asyncio.sleep(1)
    raise ValueError("Something went wrong!")

async def main():
    try:
        await risky_coroutine()
    except ValueError as ve:
        print(f"Caught an exception: {ve}")

asyncio.run(main())

6.1.2 使用协程与异步库处理异常

许多异步库(如aiohttpaioredis等)遵循类似的异常处理模式。例如 ,在aiohttp中处理HTTP请求异常:

import aiohttp

async def fetch_url(url):
    async with aiohttp.ClientSession() as session:
        try:
            async with session.get(url) as response:
                if response.status != 200:
                    raise aiohttp.ClientResponseError(
                        response.request_info,
                        response.history,
                        status=response.status,
                        message=f"Received non-200 status: {response.status}",
                    )
                return await response.text()
        except aiohttp.ClientError as ce:
            print(f"Failed to fetch URL: {ce}")

6.2 异常透明度与异常转换

6.2.1 封装库或框架中的异常转换

在封装库或框架时 ,为了提供更清晰、更友好的异常接口,通常会对内部抛出的异常进行转换。例如,将底层数据库驱动的异常转换为库专用的异常类型:

class MyDatabaseError(Exception):
    pass

class MyDatabaseConnectionError(MyDatabaseError):
    pass

def execute_query(query):
    try:
        # Low-level database operation that may raise exceptions
        ...
    except sqlite3.Error as se:
        raise MyDatabaseConnectionError("Failed to connect to the database") from se

6.2.2 提供用户友好的异常信息

除了转换异常类型,还应确保异常消息清晰、具体 ,有助于用户快速定位问题。在自定义异常类中,可以添加详细的错误描述和建议:

class MyValidationError(ValueError):
    def __init__(self, field_name, message, *, suggested_fix=None):
        super().__init__(f"Validation error in '{field_name}': {message}")
        self.suggested_fix = suggested_fix

raise MyValidationError("email", "Invalid email format", suggested_fix="Use a valid email address")

6.3 异常处理在软件架构中的位置

6.3.1 面向服务架构中的异常边界处理

在面向服务架构(SOA)中,服务间通信可能涉及多种异常情况。服务消费者应捕获并适当地处理来自服务提供者的异常,如重试、降级或返回统一的错误响应:

from requests.exceptions import RequestException

def call_external_service():
    try:
        response = requests.get("https://external-service.com/api")
        response.raise_for_status()
    except RequestException as re:
        log_error(re)
        return {"error": "External service unavailable"}
    else:
        return response.json()

6.3.2 微服务与云原生环境中的异常管理

在微服务和云原生环境中,异常处理应考虑服务的高可用性、容错性和可观察性。使用服务网格(如Istio)、断路器(如Hystrix)、分布式追踪(如Jaeger)等工具辅助异常管理和监控:

from hystrix import Command

class ExternalServiceCommand(Command):
    def run(self):
        return requests.get("https://external-service.com/api").json()

    def fallback(self):
        return {"error": "External service temporarily unavailable"}

result = ExternalServiceCommand().execute()

通过深入探讨异常处理在异步编程、库封装、软件架构等领域的应用,我们能够更好地驾驭Python异常 ,构建健壮、易维护且用户友好的应用程序。

第7章 总结

异常处理是Python编程艺术中不可或缺的一环,它既是保障程序稳定性的基石,也是提升代码健壮性的关键策略。本文系统介绍了Python异常处理的基础知识 ,包括异常分类、try-except-finally结构的工作原理以及进阶技巧,如else子句的巧妙运用、主动抛出异常的方法、上下文管理器对于异常控制的意义,以及链式异常处理的灵活性。

在最佳实践中,强调了精确捕获异常以避免信息丢失的重要性 ,同时也提倡适度使用通用异常以简化代码。异常信息的记录与报告是软件开发中必不可少的一环,特别是在日志记录和异常监控方面。同时,异常处理与函数设计紧密相连 ,利用typing模块可强化异常类型提示,而在Web开发、数据库操作和并发编程等不同场景中,恰当的异常处理策略至关重要。

异常处理亦是调试和测试中的有效工具,通过分析异常类型和消息,结合IDE和pdb等调试工具 ,可以精准定位问题。在异步编程领域,理解异常栈的展开以及使用协程和异步库处理异常尤为关键。此外,对于库和框架的设计者来说,异常透明度与转换有利于提供用户友好的反馈 ,而在服务架构层面,合理的异常边界处理则关乎系统的整体稳健性。

总之,异常处理不仅是应对程序错误的有效机制,更是软件工程中一项重要的最佳实践。随着技术演进 ,开发者应持续关注并掌握新的异常处理趋势与技巧,从而在实际项目中构建更为强大且易于维护的代码库。

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码