python中如何使用numpy创建数组_Numpy创建数组(array)基础教程

NumPy提供多种创建数组的方法,包括从列表转换、生成特定值数组及指定形状和数据类型。1. 使用np.array()将列表或元组转为数组,并可指定dtype;2. np.zeros()和np.ones()创建全0或全1数组;3. np.empty()创建未初始化的空数组以提升性能;4. np.arange()生成等步长数组,np.linspace()生成等间隔数值;5. np.full()用指定值填充数组;6. 多维数组可通过嵌套列表或reshape()构建;7. 高级方法如np.eye()创建单位矩阵,适用于线性代数运算。选择合适方法能优化内存与计算效率。

python中如何使用numpy创建数组_numpy创建数组(array)基础教程

在Python中,使用NumPy创建数组是进行科学计算和数据分析的基础,它提供了多种高效的方法来初始化和构建数组。最直接的方式是利用

numpy.array()

函数将Python列表或元组转换为NumPy数组,此外,还可以通过

numpy.zeros()

numpy.ones()

numpy.arange()

numpy.linspace()

等函数根据特定的形状和值快速生成数组,从而满足不同的数据初始化需求。

解决方案

NumPy作为Python科学计算的核心库,其数组(

ndarray

)是处理大量数值数据的基石。创建这些数组的方式多种多样,每种都适用于不同的场景。

1. 从Python列表或元组创建数组:

np.array()

这是最常用也最直观的方法。你可以将一个普通的Python列表(或嵌套列表)传递给

np.array()

来创建一个NumPy数组。

import numpy as np# 创建一维数组list_1d = [1, 2, 3, 4, 5]arr_1d = np.array(list_1d)print("一维数组:", arr_1d)print("类型:", type(arr_1d))# 创建二维数组 (从嵌套列表)list_2d = [[1, 2, 3], [4, 5, 6]]arr_2d = np.array(list_2d)print("n二维数组:n", arr_2d)# 指定数据类型 (dtype)arr_float = np.array([1, 2, 3], dtype=float)print("n指定float类型的数组:", arr_float)arr_int8 = np.array([100, 200, 50], dtype=np.int8)print("指定int8类型的数组:", arr_int8)

这里有个小细节,如果你不指定

dtype

,NumPy会根据输入数据自动推断一个最合适的数据类型。但有时候,为了内存效率或者确保精度,手动指定

dtype

是非常有必要的。

2. 创建全零数组:

np.zeros()

当你需要一个特定形状的数组,并希望所有元素都初始化为零时,

np.zeros()

是你的首选。

# 创建一个3x4的全零数组zeros_arr = np.zeros((3, 4))print("n全零数组 (3x4):n", zeros_arr)# 创建一个一维的全零数组,并指定数据类型zeros_int = np.zeros(5, dtype=int)print("全零整数数组 (1x5):", zeros_int)

3. 创建全壹数组:

np.ones()

np.zeros()

类似,

np.ones()

用于创建所有元素都是1的数组。

# 创建一个2x3的全壹数组ones_arr = np.ones((2, 3))print("n全壹数组 (2x3):n", ones_arr)# 创建一个三维全壹数组ones_3d = np.ones((2, 2, 2), dtype=np.float32)print("三维全壹数组:n", ones_3d)

4. 创建空数组:

np.empty()

np.empty()

会创建一个给定形状和数据类型的新数组,但不初始化其元素。这意味着数组中的值是内存中当前存在的任意值,可能看起来是随机的。这种方法比

np.zeros()

np.ones()

稍快,因为它不需要填充值。

立即学习“Python免费学习笔记(深入)”;

# 创建一个2x2的空数组empty_arr = np.empty((2, 2))print("n空数组 (2x2):n", empty_arr) # 注意:输出的值是未初始化的,每次运行可能不同

在我看来,

np.empty()

在需要一个占位符,然后立即用其他计算结果填充数组的场景下特别有用,可以避免不必要的初始化开销。

5. 创建指定范围的数组:

np.arange()

np.arange()

类似于Python内置的

range()

函数,但它返回的是一个NumPy数组。

# 从0到9的数组arr_range = np.arange(10)print("narange(10):", arr_range)# 从5到15,步长为2的数组arr_step = np.arange(5, 16, 2)print("arange(5, 16, 2):", arr_step)

6. 创建等间隔数组:

np.linspace()

np.linspace()

用于在指定区间内创建指定数量的均匀分布的数值。

# 在0到10之间生成5个等间隔的数arr_linspace = np.linspace(0, 10, 5)print("nlinspace(0, 10, 5):", arr_linspace)# 默认包含终点,可以通过endpoint=False排除arr_linspace_no_end = np.linspace(0, 10, 5, endpoint=False)print("linspace(0, 10, 5, endpoint=False):", arr_linspace_no_end)
linspace

在绘制函数图像、模拟物理过程时非常方便,因为它能保证数据的均匀分布。

7. 创建填充指定值的数组:

np.full()

如果你想用一个特定的常数值填充整个数组,

np.full()

是最佳选择。

# 创建一个3x3的数组,所有元素都为7full_arr = np.full((3, 3), 7)print("n全7数组 (3x3):n", full_arr)# 创建一个一维数组,所有元素都为Truefull_bool = np.full(4, True, dtype=bool)print("全True布尔数组:", full_bool)

NumPy数组与Python列表有何本质区别,为何选择NumPy?

我刚开始用Python处理数据时,也觉得列表挺好用,直到数据量一大,才体会到NumPy的“真香”定律。NumPy数组和Python列表在表面上看起来都能存储一系列数据,但它们在底层实现、性能、内存使用以及功能上有着天壤之别。

本质区别:

数据类型统一性: NumPy数组要求所有元素都是同一数据类型(例如,全部是整数,或全部是浮点数)。这使得NumPy在内存中能以连续、紧凑的方式存储数据,从而实现高效的存取和计算。而Python列表可以存储不同类型的对象,它实际上存储的是指向这些对象的指针,而不是对象本身。内存连续性: NumPy数组在内存中是连续存储的,这对于CPU缓存优化和矢量化操作至关重要。Python列表的元素则可能分散在内存各处。性能: NumPy的底层是用C语言实现的,针对数值计算进行了高度优化。它支持矢量化操作,这意味着你可以在整个数组上执行操作,而无需编写显式的Python循环。Python列表的循环操作则是在解释器层面执行,效率远低于NumPy。功能性: NumPy提供了大量的数学函数和线性代数操作,这些都是针对数组设计的,可以直接应用于整个数组,而无需手动遍历。Python列表虽然也有一些方法,但远不及NumPy在数值计算方面的丰富和高效。

为何选择NumPy:

效率与速度: 当你处理百万甚至上亿级别的数据时,NumPy的矢量化操作和C语言底层实现能带来数量级的性能提升。我记得有一次需要对一个大矩阵进行元素级乘法,用Python列表循环了几分钟,换成NumPy一行代码瞬间完成,那感觉真是震撼。内存优化: 统一的数据类型和连续的内存布局使得NumPy数组比同等数据量的Python列表占用更少的内存。这对于内存受限的环境尤其重要。强大的数学工具 NumPy是科学计算的基石,它提供了丰富的数学函数、傅里叶变换、随机数生成、线性代数等功能。这些功能让数据分析、机器学习和科学建模变得更加简单高效。生态系统集成: 几乎所有Python数据科学库(如Pandas、SciPy、Matplotlib、Scikit-learn)都以NumPy数组作为其核心数据结构,学习NumPy是进入这些领域的必经之路。

简单来说,如果你只是需要一个通用容器来存储不同类型的少量数据,Python列表足够了。但一旦涉及到数值计算、大数据处理或者需要高性能的场景,NumPy数组几乎是唯一的、也是最佳的选择。

创建不同维度(一维、二维、三维)的NumPy数组有哪些实用技巧?

刚接触多维数组时,脑子里总有点打结,但多练几次,就会发现其实就是列表的嵌套。NumPy数组的维度(

ndim

)和形状(

shape

)是理解其结构的关键。

1. 创建一维数组:一维数组是最简单的形式,可以看作是数学中的向量。

从Python列表: 直接传入一个非嵌套的列表。

import numpy as npvec = np.array([10, 20, 30, 40])print("一维数组:n", vec)print("维度 (ndim):", vec.ndim) # 输出: 1print("形状 (shape):", vec.shape) # 输出: (4,)

使用

np.arange()

np.linspace()

这些函数默认创建的就是一维数组。

vec_range = np.arange(5)print("narange创建的一维数组:", vec_range)

2. 创建二维数组:二维数组可以理解为数学中的矩阵,它是由行和列组成的。

从嵌套列表: 传入一个包含等长列表的列表。每个内部列表代表矩阵的一行。

matrix = np.array([[1, 2, 3],                   [4, 5, 6],                   [7, 8, 9]])print("n二维数组 (矩阵):n", matrix)print("维度 (ndim):", matrix.ndim) # 输出: 2print("形状 (shape):", matrix.shape) # 输出: (3, 3)

这里,

shape

(3, 3)

,表示3行3列。

使用

np.zeros()

,

np.ones()

,

np.full()

等: 传入一个表示形状的元组,如

(rows, cols)

zeros_2d = np.zeros((2, 5)) # 2行5列的全零矩阵print("n2x5全零数组:n", zeros_2d)

reshape()

函数: 可以将一维数组重新塑形为二维数组。这是一个非常灵活的技巧。

arr_1d_large = np.arange(12) # 0到11的一维数组arr_2d_reshaped = arr_1d_large.reshape(3, 4) # 重新塑形为3行4列print("n通过reshape创建的二维数组:n", arr_2d_reshaped)
reshape

操作非常强大,只要总元素数量匹配,你就可以随意改变数组的形状。使用

-1

作为

reshape

的一个维度参数,NumPy会自动计算该维度的大小,这在处理不确定行数或列数时非常方便。比如

arr.reshape(-1, 4)

表示“让它有4列,行数你来算”。

3. 创建三维数组:三维数组可以想象成多个二维矩阵堆叠在一起,或者是一个立方体,每个维度代表一个轴(深度、行、列)。

从嵌套列表: 传入一个包含嵌套列表的列表,最外层列表包含多个二维数组结构。

tensor = np.array([[[1, 2], [3, 4]],                   [[5, 6], [7, 8]],                   [[9, 10], [11, 12]]])print("n三维数组 (张量):n", tensor)print("维度 (ndim):", tensor.ndim) # 输出: 3print("形状 (shape):", tensor.shape) # 输出: (3, 2, 2)

这里的

shape

(3, 2, 2)

,表示有3个“层”(或深度),每层是2行2列的矩阵。

使用

np.zeros()

,

np.ones()

,

np.full()

等: 传入一个三元组作为形状参数,如

(depth, rows, cols)

ones_3d = np.ones((2, 3, 4)) # 2个3行4列的矩阵print("n2x3x4全壹三维数组:n", ones_3d)

reshape()

函数: 同样可以将一维或二维数组重新塑形为三维。

arr_1d_large_24 = np.arange(24) # 0到23的一维数组arr_3d_reshaped = arr_1d_large_24.reshape(2, 3, 4) # 重新塑形为2个3行4列的矩阵print("n通过reshape创建的三维数组:n", arr_3d_reshaped)

掌握这些技巧后,无论数据以何种形式呈现,你都能灵活地将其组织成NumPy数组,为后续的计算和分析打下坚实基础。

如何在创建NumPy数组时指定数据类型(dtype)?这对性能和内存有何影响?

数据类型这东西,一开始可能觉得没那么重要,但当你处理大量图像像素或者金融数据时,一个合适的

dtype

能帮你省下不少麻烦,无论是内存还是计算精度。在创建NumPy数组时,通过

dtype

参数明确指定数据类型是一个非常好的习惯。

如何指定数据类型:几乎所有的数组创建函数,如

np.array()

,

np.zeros()

,

np.ones()

,

np.empty()

,

np.full()

等,都接受一个

dtype

参数。你可以传入Python内置类型(如

int

,

float

,

bool

)或者NumPy特有的数据类型对象(如

np.int8

,

np.float32

,

np.complex64

)。

import numpy as np# 使用Python内置类型arr_int = np.array([1, 2, 3], dtype=int)arr_float = np.array([1.0, 2.5, 3.7], dtype=float)arr_bool = np.array([0, 1, 0], dtype=bool) # 0会被转为False,非0转为Trueprint("int数组:", arr_int, arr_int.dtype)print("float数组:", arr_float, arr_float.dtype)print("bool数组:", arr_bool, arr_bool.dtype)# 使用NumPy特有类型arr_int8 = np.array([10, 20, 30], dtype=np.int8) # 8位带符号整数,范围-128到127arr_uint16 = np.zeros(5, dtype=np.uint16) # 16位无符号整数,范围0到65535arr_float32 = np.ones((2,2), dtype=np.float32) # 32位浮点数arr_complex = np.array([1+2j, 3+4j], dtype=np.complex64) # 64位复数 (32位实部+32位虚部)print("nint8数组:", arr_int8, arr_int8.dtype)print("uint16数组:", arr_uint16, arr_uint16.dtype)print("float32数组:n", arr_float32, arr_float32.dtype)print("complex64数组:", arr_complex, arr_complex.dtype)

NumPy提供了非常丰富的数据类型,从布尔值到各种位宽的整数(

int8

,

int16

,

int32

,

int64

,

uint8

等)、浮点数(

float16

,

float32

,

float64

,

float128

)、复数(

complex64

,

complex128

),甚至还有字符串和自定义结构体。

对性能和内存的影响:

内存使用:

显著影响: 这是

dtype

最直接的影响。一个

np.int8

类型的数组,每个元素只占用1字节内存;而

np.int64

则占用8字节。对于包含数百万甚至数十亿元素的数组,这种差异会带来巨大的内存消耗差距。例子: 假设你有一个包含1亿个整数的数组,如果所有整数都在0-255之间,使用

np.uint8

只需要100MB内存。但如果默认使用

np.int64

(在64位系统上通常是Python整数的默认转换),则需要800MB内存。这对于内存受限的系统或者需要处理超大数据集时,是决定性的。避免浪费: 明确指定最小且足够的数据类型可以有效减少内存占用,这在嵌入式系统、移动设备或云服务器上都是非常重要的优化手段。

计算性能:

处理器效率: 现代CPU通常对特定位宽的数据类型(如32位或64位整数/浮点数)有优化指令集。使用与CPU架构匹配的数据类型,可以加速计算。缓存命中率: 内存占用越小,相同大小的缓存能容纳更多的数据。这意味着CPU在进行计算时,更有可能从高速缓存中获取数据,而不是从较慢的主内存中读取,从而提高计算速度。精度与溢出:精度: 浮点数的精度(

float32

vs

float64

)会影响计算结果的准确性。

float64

提供更高的精度,但占用更多内存和计算资源。在科学计算中,通常默认使用

float64

以保证精度,但在深度学习等领域,

float32

甚至

float16

已足够,且能大幅提升训练速度。溢出: 整数类型有其最大最小值。如果计算结果超出了数据类型能表示的范围,就会发生溢出。例如,

np.int8

的最大值是127,如果你将100+30存储到一个

np.int8

数组中,结果可能会“溢出”变成-126(取决于具体实现,通常是循环)。明确

dtype

可以帮助你预判并避免这类错误。

在我看来,选择合适的

dtype

是NumPy编程中一个不可忽视的优化点。它不仅关乎程序的健壮性,更是大数据时代提升效率、降低成本的关键所在。在不确定时,

np.float64

np.int64

通常是安全的默认选择,但一旦数据量变大或对资源有严格要求,就应该仔细考虑更精细的

dtype

管理。

除了基本创建,NumPy还有哪些高级的数组生成方式?

有时候,我们需要的数组并不是那么规整,比如单位矩阵,或者需要一些随机数来模拟实验,NumPy也都有很方便的接口。除了前面提到的那些基础方法,NumPy还提供了一些针对特定场景的高级数组生成方式,它们能帮助我们更高效地构建复杂的数组结构。

1. 创建单位矩阵:

np.eye()

单位矩阵是一个对角线元素为1,其余元素为0的方阵。在线性代数中,它扮演着非常重要的角色。

# 创建一个3x3的单位

以上就是python中如何使用numpy创建数组_Numpy创建数组(array)基础教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1371999.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 11:56:56
下一篇 2025年12月14日 11:57:06

相关推荐

  • python决策树算法的实现步骤

    答案是实现决策树需依次完成数据预处理、训练集划分、模型构建与训练、预测评估四步,使用scikit-learn库可高效完成,关键在于数据清洗、特征编码、参数设置及结果可视化,全过程强调逻辑清晰与细节把控。 实现Python中的决策树算法并不复杂,关键在于理解每一步的逻辑和操作。以下是基于scikit-…

    2025年12月14日
    000
  • python按行读取文件的方法比较

    readlines()适合小文件且需索引访问;2. for line in f最推荐,内存高效;3. readline()可精确控制但代码繁琐;4. 生成器适合超大文件。日常优先用for循环读取,避免内存浪费。 Python中按行读取文件有多种方法,每种方式在内存使用、速度和适用场景上有所不同。下面…

    2025年12月14日
    000
  • Python特殊传参如何实现

    Python中通过args和kwargs实现灵活传参,args将位置参数打包为元组,kwargs将关键字参数打包为字典,二者可组合使用并遵循普通→默认→args→kwargs的顺序,调用时可用和拆包序列或字典传递参数,广泛应用于装饰器、封装及通用接口设计。 Python中的特殊传参机制让函数调用更灵…

    2025年12月14日
    000
  • python中popitem如何使用

    popitem()方法从字典末尾移除并返回键值对,适用于清空字典场景。示例:my_dict = {‘a’: 1, ‘b’: 2, ‘c’: 3};item = my_dict.popitem()返回(‘c&#8217…

    2025年12月14日
    000
  • python命名关键字参数的使用注意

    命名关键字参数必须通过关键字传递,使用星号*分隔位置参数与关键字参数,确保调用时显式传参,提升函数接口清晰度和安全性。 在Python中,命名关键字参数(keyword-only arguments)是指必须通过关键字传递的参数,不能通过位置传递。这种参数定义方式增强了函数调用的清晰性和安全性。正确…

    2025年12月14日
    000
  • python中mock的断言使用

    答案:Python中使用unittest.mock的断言方法验证模拟对象调用情况,如assert_called_once_with检查调用次数和参数。通过@mock.patch替换目标方法,结合call_count和assert_any_call可验证多次调用的参数,确保函数行为正确。 在Pytho…

    2025年12月14日 好文分享
    000
  • splitlines在python中返回列表

    splitlines()方法按行分割字符串并返回列表,能识别n、rn、r等换行符,默认不保留换行符,传入keepends=True可保留;常用于读取文件、处理用户输入或多行文本解析,与split(‘n’)不同,末尾换行不会产生空字符串,适用于跨平台场景。 在 Python 中…

    2025年12月14日
    000
  • Langserve中实现动态RAG应用:Langchain链式输入处理教程

    本教程详细阐述如何在langserve中构建支持动态输入的rag(检索增强生成)应用。文章通过langchain的runnable接口,展示如何将用户查询和目标语言作为动态参数传递给检索器和llm提示模板,从而实现灵活、可配置的交互式ai服务。内容涵盖链式组件的构建、langserve路由配置及示例…

    2025年12月14日
    000
  • 正则表达式中特殊字符|的匹配陷阱与解决方案

    在正则表达式中,竖线符号`|`被视为逻辑“或”运算符,而非普通字符。当需要匹配字符串中的字面竖线时,必须使用反斜杠“进行转义,即`|`。本文将深入探讨这一常见误区,并通过python `re`模块的示例代码,演示如何正确处理`|`等特殊字符,确保正则表达式的行为符合预期。 理解正则表达式…

    2025年12月14日
    000
  • Python实现Excel文件整文件密码保护的专业指南

    本教程旨在解决python开发中,使用`pandas`生成excel文件后,实现整文件密码保护的难题。针对`openpyxl`和`xlsxwriter`等库仅支持工作表加密的局限,本文推荐并详细讲解如何结合外部工具`msoffice-crypt`,通过python的`subprocess`模块实现跨…

    2025年12月14日
    000
  • Python库安装故障排除:解决pywinpty和sklearn警告与正确实践

    在Python开发中,通过pip安装库时常会遇到警告信息,即使最终显示“所有需求已满足”,也可能存在潜在问题。本文将深入探讨如何诊断并解决常见的安装警告,特别是针对`pywinpty`的编译依赖问题和`sklearn`的包名弃用警告,并提供一套通用的故障排除流程,确保您的Python环境稳定且库正确…

    2025年12月14日
    000
  • 解决Mypy在cached_property派生类中类型推断不一致的问题

    本文探讨了在使用`functools.cached_property`的派生类时,mypy类型检查器行为不一致的问题。当直接使用`cached_property`时,mypy能正确推断类型错误,但继承后则可能失效。核心原因在于mypy对内置装饰器与自定义装饰器的类型推断机制差异。解决方案是通过将派生…

    2025年12月14日
    000
  • Tkinter 文件与文件夹选择:实现灵活的文件系统路径输入

    tkinter的`filedialog`模块通常将文件和文件夹选择功能分开。本文将介绍一种实用的方法,通过组合`askopenfilename`和`askdirectory`函数,实现一个统一的对话框,允许用户灵活选择文件或文件夹,从而优化用户体验并简化路径输入流程。 引言:Tkinter 文件系统…

    2025年12月14日
    000
  • 在 macOS 上使用 PyObjC 实现 MPEG-4 音频文件的拖放功能

    本文详细介绍了如何在 macos 环境下,利用 pyobjc 框架实现应用程序的拖放功能,特别是针对 mpeg-4 音频文件的处理。文章阐述了正确注册拖放类型(如 `public.audio`、`public.mpeg-4-audio` 及 url/文件 url 类型)的重要性,并提供了从拖放操作中…

    2025年12月14日
    000
  • 使用 Ruff 在指定目录中忽略特定规则

    本文介绍了如何使用 Ruff 工具在 Python 项目中,针对特定目录或文件,忽略指定的规则。通过 pyproject.toml 配置文件中的 per-file-ignores 设置,可以灵活地控制 Ruff 的检查行为,例如忽略测试目录下的文档字符串规范检查。 Ruff 是一款快速的 Pytho…

    2025年12月14日
    000
  • 使用 Python 实现矩阵的行阶梯形变换

    本文详细介绍了如何使用 Python 实现矩阵的行阶梯形变换,重点在于避免使用任何内置函数,并提供详细的代码示例和步骤说明,帮助读者理解算法原理并掌握实现方法。文章还包含了关于部分主元法和数值稳定性的讨论,以及最终代码的输出示例。 矩阵行阶梯形变换的原理 矩阵的行阶梯形(Row Echelon Fo…

    2025年12月14日
    000
  • 在Pandas DataFrame中高效生成重复序列与组合数据

    本教程详细介绍了如何在Pandas DataFrame中高效生成具有重复值和递增序列的列。文章通过构建列表再转换为DataFrame的方法,解决了在循环中创建DataFrame的低效问题,并探讨了使用`itertools.product`等更Pandas风格的解决方案,旨在帮助用户掌握数据框列的灵活…

    2025年12月14日
    000
  • Dash Python:实现多标签页应用中的内部链接导航

    本教程详细介绍了如何在dash多标签页应用中,通过点击页面内的超链接来激活不同的标签页。核心方法是利用`dcc.location`组件管理uri片段(hash),并结合回调函数同步`dcc.location`的`hash`属性与`dbc.tabs`的`active_tab`属性,从而实现基于url状…

    2025年12月14日
    000
  • Python中临时音频文件删除策略:利用内存文件对象解决文件占用问题

    本文旨在解决python中删除临时音频文件时因文件占用导致`os.remove()`失败的问题,尤其是在windows环境下。核心方案是利用`io.bytesio`创建内存文件对象,将音频数据加载到内存而非磁盘,从而避免文件被锁定,确保临时文件能够顺利删除。教程将提供详细的实现步骤和代码示例,并探讨…

    2025年12月14日
    000
  • Python字符串分割与索引操作:实现交替单词大写

    本文介绍了如何使用Python对字符串进行分割,并通过索引操作来处理分割后的单词列表,最终实现将字符串中交替出现的单词转换为大写的功能。文章提供了两种实现方法:一种是使用传统的for循环,另一种是使用Python的列表推导式,并附带代码示例,帮助读者理解和掌握相关技巧。 字符串分割与单词操作 在Py…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信