Python C API 使用详解(二)

简介

介绍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 <Python.h>
#include "print.h"

// 创建一个固定大小的列表
void ListNumber();

// 创建一个可以无限扩展的列表
void ListExpansion();

#endif //PRINT_DEMO1_PYLIST_H

源文件

//
// Created by lanyulei on 18-9-3.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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);    // 打印列表数据

    printf("------------sort-------------\n");
    PyList_Sort(pyList);    // 对列表进行排序
    print_pyobject(pyList);    // 打印列表数据

    printf("---------------reverse--------------\n");
    PyList_Reverse(pyList);    // 反转列表数据
    print_pyobject(pyList);    // 打印列表数据

    printf("----------------slice----------------\n");
    PyObject* pySlice = PyList_GetSlice(pyList, 1, 3);   // 获取分片数据
    print_pyobject(pySlice);    // 打印分片数据

}

// 没有大小限制的列表
void ListExpansion(){
    PyObject* pyList = PyList_New(0);    // 创建一个没有大小限制的列表,所以参数为 0

    PyObject* pyId = Py_BuildValue("i", 123);   // 创建Python 整型对象
    PyList_Append(pyList, pyId);   
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值