Python C API 使用详解(二)
LanYuLei0人评论347人阅读2018-09-05 23:50:26
简介
介绍Python C API中的列表、元组、字典的使用,详细的进行了API中方法的介绍。
Python List API
List API 简单介绍
int PyList_Check(PyObject *p) 判断是否是一个Python List(列表)
PyObject* PyList_New(Py_ssize_t len) 创建一个列表
Py_ssize_t PyList_Size(PyObject *list) 获取列表元素的个数 len(list)
Py_ssize_t PyList_GET_SIZE(PyObject *list) 和PyList_Size 一样,但是就是没有错误检查
PyObject PyList_GetItem(PyObject list, Py_ssize_t index) 从列表里面获取一个元素,计数器不会加1
PyObject PyList_GET_ITEM(PyObject list, Py_ssize_t i) 和PyList_GetItem一样,但是就是没有错误检查
int PyList_SetItem(PyObject list, Py_ssize_t index, PyObject item) 设置别表指定位置的值,下标的所在的位置必须是有值的,并且是有效的
void PyList_SET_ITEM(PyObject list, Py_ssize_t i, PyObject o) 和PyList_SetItem一样,但是就是没有错误检查
int PyList_Insert(PyObject list, Py_ssize_t index, PyObject item) 在列表指定位置插入值 list.insert(index, item)
int PyList_Append(PyObject list, PyObject item) 在列表尾部追加值 list.append(item)
PyObject PyList_GetSlice(PyObject list, Py_ssize_t low, Py_ssize_t high) 获取列表里面一段切片数据,一段指定范围的数据 list[low:higt]
int PyList_SetSlice(PyObject list, Py_ssize_t low, Py_ssize_t high, PyObject itemlist) 设置列表分片数据,指定列表范围的数据 list[low:higt] = itemlist
int PyList_Sort(PyObject *list) 对列表数据进行排序 list.sort()
int PyList_Reverse(PyObject *list) 把列表里面的所有数据反转 list.reverse()
PyObject PyList_AsTuple(PyObject list) 将Python列表转为Python元组 tuple(list)
实例
注意事项: 不限制大小的Python列表对象,应该用Append初始化数据
设置大小的Python列表对象,应该用SetItem初始化数据, 如果用Append的话,会出现” 段错误 (核心已转储) “的情况
头文件
/
// Created by lanyulei on 18-9-3.
//
ifndef PRINT_DEMO1_PYLIST_H
define PRINT_DEMO1_PYLIST_H
include
include “print.h”
// 创建一个固定大小的列表
void ListNumber();
// 创建一个可以无限扩展的列表
void ListExpansion();
endif //PRINT_DEMO1_PYLIST_H
源文件
//
// Created by lanyulei on 18-9-3.
//
include
include
include
include “pyList.h”
// 有长短限制的列表
void ListNumber() {
PyObject* pyList = PyList_New(3); // 创建一个大小为3的列表
PyObject* pyId = Py_BuildValue("i", 123); // 创建Python 整型对象
PyList_SetItem(pyList, 0, pyId); // 将Python整型对象插入到Python列表对象中
PyObject* pyName = Py_BuildValue("s", "lanyulei"); // 创建一个字符串python对象
PyList_SetItem(pyList, 1, pyName); // 插入到Python列表对象里面去
PyObject* pyFloat = Py_BuildValue("f", 23.98f); // 创建一个浮点类型的Python对象
PyList_SetItem(pyList, 2, pyFloat); // 将其插入到Python列表对象中
int listLength = PyList_Size(pyList); // 获取列表的长度
printf("列表长度: %d\n", listLength);
print_pyobject(pyList); // 打印列表数据
PyObject* pyName2 = Py_BuildValue("s", "LanYuLei"); // 创建一个字符串python对象
PyList_Insert(pyList, 1, pyName2); // 在下标为1的位置插入一条数据
print_pyobject(pyList); // 打印列