序列协议 — Python 文档
来自菜鸟教程
Python/docs/3.7/c-api/sequence
序列协议
- int PySequence_Check(PyObject *o)
- 如果对象提供序列协议,则返回
1
,否则返回0
。 请注意,它为具有__getitem__()
方法的 Python 类返回1
,除非它们是 dict 子类,因为在一般情况下无法确定它支持的键类型。 此功能总是成功。
- Py_ssize_t PySequence_Size(PyObject *o)
Py_ssize_t PySequence_Length(PyObject *o)
- 成功时按顺序返回对象数 o,失败时返回
-1
。 这相当于 Python 表达式len(o)
。
- 成功时返回 o1 和 o2 的连接,失败时返回
NULL
。 这相当于 Python 表达式o1 + o2
。
- 返回重复序列对象 o count 次或失败时
NULL
的结果。 这相当于 Python 表达式o * count
。
- 成功时返回 o1 和 o2 的连接,失败时返回
NULL
。 当 o1 支持时,操作在 就地 完成。 这相当于 Python 表达式o1 += o2
。
- 返回重复序列对象 o count 次或失败时
NULL
的结果。 当 o 支持时,操作在 就地 完成。 这相当于 Python 表达式o *= count
。
- 失败时返回 o 或
NULL
的第 i 个元素。 这相当于 Python 表达式o[i]
。
- 在失败时返回 i1 和 i2 之间的序列对象 o 的切片,或
NULL
。 这相当于 Python 表达式o[i1:i2]
。
- int PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v)
将对象 v 分配给 o 的第 i 个元素。 引发异常并在失败时返回
-1
; 成功返回0
。 这相当于 Python 语句o[i] = v
。 这个函数不会窃取对v的引用。如果 v 是
NULL
,则删除该元素,但不推荐使用此功能以支持使用 PySequence_DelItem()。
- int PySequence_DelItem(PyObject *o, Py_ssize_t i)
- 删除对象 o 的第 i 个元素。 失败时返回
-1
。 这相当于 Python 语句del o[i]
。
- 将序列对象 v 分配给序列对象 o 中从 i1 到 i2 的切片。 这相当于 Python 语句
o[i1:i2] = v
。
- int PySequence_DelSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
- 删除序列对象 o 中从 i1 到 i2 的切片。 失败时返回
-1
。 这相当于 Python 语句del o[i1:i2]
。
- 返回o中value的出现次数,即返回
o[key] == value
对应的key的个数。 失败时,返回-1
。 这相当于 Python 表达式o.count(value)
。
- 确定 o 是否包含 value。 如果 o 中的一项等于 value,则返回
1
,否则返回0
。 出错时,返回-1
。 这相当于 Python 表达式value in o
。
- 返回第一个索引 i 其中
o[i] == value
。 出错时,返回-1
。 这相当于 Python 表达式o.index(value)
。
- 在失败时返回与序列或可迭代 [X72X]o 或
NULL
具有相同内容的列表对象。 返回的列表保证是新的。 这相当于 Python 表达式list(o)
。
- 失败时返回与序列或可迭代 [X73X]o 或
NULL
具有相同内容的元组对象。 如果 o 是一个元组,则将返回一个新的引用,否则将使用适当的内容构造一个元组。 这相当于 Python 表达式tuple(o)
。
- PyObject *PySequence_Fast(PyObject *o, const char *m)
返回序列或可迭代 o 作为其他
PySequence_Fast*
系列函数可用的对象。 如果对象不是序列或可迭代对象,则以 m 作为消息文本引发 TypeError。 失败时返回NULL
。PySequence_Fast*
函数之所以如此命名是因为它们假定 o 是 PyTupleObject 或 PyListObject 并访问 o[ X160X] 直接。作为 CPython 的实现细节,如果 o 已经是一个序列或列表,它将被返回。
- Py_ssize_t PySequence_Fast_GET_SIZE(PyObject *o)
- 返回 o 的长度,假设 o 由 PySequence_Fast() 返回,并且 o 不是
NULL
. 大小也可以通过在 o 上调用 PySequence_Size() 来获得,但是 PySequence_Fast_GET_SIZE() 更快,因为它可以假设 o 是一个列表或元组。
- 返回o的第i个元素,假设o由PySequence_Fast()返回,o为不是
NULL
,并且 i 在范围内。
- PyObject **PySequence_Fast_ITEMS(PyObject *o)
返回底层的 PyObject 指针数组。 假设 o 由 PySequence_Fast() 返回,而 o 不是
NULL
。请注意,如果列表被调整大小,重新分配可能会重新定位项目数组。 因此,仅在序列无法更改的上下文中使用底层数组指针。
- 失败时返回 o 或
NULL
的第 i 个元素。 PySequence_GetItem() 的更快形式,但没有检查 o 上的 PySequence_Check() 是否为真,也没有对负索引进行调整。