python deque索引超出范围_Py(117)Python/C API 参考手册:切片对象

切片对象

  • PyTypeObject PySlice_Type
  • 切片对象的类型对象。它与 Python 层面的 slice 是相同的对象。
  • int PySlice_Check(PyObject *ob)
  • 如果 ob 是一个 slice 对象则返回真值;ob 必须不为 NULL
  • PyObject* PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
  • Return value: New reference.返回一个具有给定值的新 slice 对象。 startstop 和 step 形参会被用作 slice 对象相应名称的属性的值。这些值中的任何一个都可以为 NULL,在这种情况下将使用 None 作为对应属性的值。如果新对象无法被分配则返回 NULL
  • int PySlice_GetIndices(PyObject *slice, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
  • 从 slice 对象 slice 提取 start, stop 和 step 索引号,将序列长度视为 length。大于 length 的序列号将被当作错误。成功时返回 0,出错时返回 -1 并且不设置异常(除非某个序列号不为 None 且无法被转换为整数,在这种情况下会返回 -1 并且设置一个异常)。你可能不会打算使用此函数。在 3.2 版更改: 之前 slice 形参的形参类型是 PySliceObject*
  • int PySlice_GetIndicesEx(PyObject *slice, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength)
  • PySlice_GetIndices() 的可用替代。从 slice 对象 slice 提取 start, stop 和 step 索引号,将序列长度视为 length,并将切片的长度保存在 slicelength 中,超出范围的索引号会以与普通切片一致的方式进行剪切。成功时返回 0,出错时返回 -1 并且不设置异常。注解 此函数对于可变大小序列来说是不安全的。对它的调用应被替换为 PySlice_Unpack() 和 PySlice_AdjustIndices() 的组合,其中
    if (PySlice_GetIndicesEx(slice, length, &start, &stop, &step, &slicelength) < 0) {// return error
    }
    会被替换为
    if (PySlice_Unpack(slice, &start, &stop, &step) < 0) {// return error
    }
    slicelength = PySlice_AdjustIndices(length, &start, &stop, step);
    在 3.2 版更改: 之前 slice 形参的形参类型是 PySliceObject*。在 3.6.1 版更改: 如果 Py_LIMITED_API 未设置或设置为 0x03050400 与 0x03060000 之前的值(不包含边界)或 0x03060100 或更大则 PySlice_GetIndicesEx() 会被实现为一个使用 PySlice_Unpack() 和 PySlice_AdjustIndices() 的宏。参数 startstop 和 step 会被多被求值。3.6.1 版后已移除: 如果 Py_LIMITED_API 设置为小于 0x03050400 或 0x03060000 与 0x03060100 之间的值(不包括边界)则 PySlice_GetIndicesEx() 为已弃用的函数。
  • int PySlice_Unpack(PyObject *slice, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
  • 从切片对象中将 start, stop 和 step 数据成员提取为 C 整数。会静默地将大于 PY_SSIZE_T_MAX 的值减小为 PY_SSIZE_T_MAX,静默地将小于 PY_SSIZE_T_MIN 的 start 和 stop 值增大为 PY_SSIZE_T_MIN,并静默地将小于 -PY_SSIZE_T_MAX 的 step 值增大为 -PY_SSIZE_T_MAX。出错时返回 -1,成功时返回 0。3.6.1 新版功能.
  • Py_ssize_t PySlice_AdjustIndices(Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step)
  • 将 start/end 切片索引号根据指定的序列长度进行调整。超出范围的索引号会以与普通切片一致的方式进行剪切。返回切片的长度。此操作总是会成功。不会调用 Python 代码。3.6.1 新版功能.

bcfdbfe7799192156b851120cca476be.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用数组实现双头队列的代码示例: ``` #include <stdio.h> #include <stdlib.h> #define Type int // 定义元素类型 typedef struct Deque{ Type *array; // 数组 int ihead; // 头索引 int itail; // 尾索引 int entry_count; // 现存数据数量 int array_capacity; // 容量大小 }Deque, *Deque_link; // 初始化双头队列 void init_deque(Deque_link deque, int capacity) { deque->array = (Type*)malloc(sizeof(Type) * capacity); deque->ihead = 0; deque->itail = capacity - 1; deque->entry_count = 0; deque->array_capacity = capacity; } // 判断队列是否为空 int is_empty(Deque_link deque) { return deque->entry_count == 0; } // 判断队列是否已满 int is_full(Deque_link deque) { return deque->entry_count == deque->array_capacity; } // 获取队列长度 int size(Deque_link deque) { return deque->entry_count; } // 从队头入队 void push_front(Deque_link deque, Type value) { if (is_full(deque)) { printf("Deque is full, cannot push_front!\n"); return; } deque->array[deque->ihead] = value; deque->ihead = (deque->ihead + 1) % deque->array_capacity; deque->entry_count++; } // 从队尾入队 void push_back(Deque_link deque, Type value) { if (is_full(deque)) { printf("Deque is full, cannot push_back!\n"); return; } deque->array[deque->itail] = value; deque->itail = (deque->itail - 1 + deque->array_capacity) % deque->array_capacity; deque->entry_count++; } // 从队头出队 Type pop_front(Deque_link deque) { if (is_empty(deque)) { printf("Deque is empty, cannot pop_front!\n"); return -1; } Type value = deque->array[(deque->ihead - 1 + deque->array_capacity) % deque->array_capacity]; deque->ihead = (deque->ihead - 1 + deque->array_capacity) % deque->array_capacity; deque->entry_count--; return value; } // 从队尾出队 Type pop_back(Deque_link deque) { if (is_empty(deque)) { printf("Deque is empty, cannot pop_back!\n"); return -1; } Type value = deque->array[(deque->itail + 1) % deque->array_capacity]; deque->itail = (deque->itail + 1) % deque->array_capacity; deque->entry_count--; return value; } int main() { Deque deque; int capacity = 10; init_deque(&deque, capacity); // 从队头入队 for (int i = 0; i < 5; i++) { push_front(&deque, i); } // 从队尾入队 for (int i = 5; i < 10; i++) { push_back(&deque, i); } // 从队头出队 while (!is_empty(&deque)) { printf("%d ", pop_front(&deque)); } printf("\n"); // 从队尾出队 for (int i = 0; i < 5; i++) { push_front(&deque, i); } while (!is_empty(&deque)) { printf("%d ", pop_back(&deque)); } printf("\n"); return 0; } ``` 在上面的代码中,我们使用了一个数组来存储双头队列中的元素。`ihead` 表示队头的位置,`itail` 表示队尾的位置,`entry_count` 表示队列中现存的元素数量,`array_capacity` 表示数组的容量大小。在初始化双头队列时,我们先动态分配一个数组,并将队头和队尾的位置分别初始化为 0 和 `capacity - 1`。当队列满时,我们无法继续插入元素,当队列为空时,我们无法出队元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值