返回顶部
首页 > 资讯 > 后端开发 > Python >Python C API 使用详解(二)
  • 513
分享到

Python C API 使用详解(二)

详解PythonAPI 2023-01-31 05:01:12 513人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

简介 介绍python C api中的列表、元组、字典的使用,详细的进行了API中方法的介绍。 Python List API List API 简单介绍 int PyList_Check(PyObject *p) 判断是否是一个Py

简介

介绍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);   // 将Python整型对象追加到Python列表对象中

    PyObject* pyName = Py_BuildValue("s", "lanyulei");   // 创建一个字符串python对象
    PyList_Append(pyList, pyName);   // 追加到Python列表对象里面去

    PyObject* pyFloat = Py_BuildValue("f", 23.98f);   // 创建一个浮点类型的Python对象
    PyList_Append(pyList, pyFloat);   // 将其追加到Python列表对象中

    print_pyobject(pyList);

    PyObject* py_data = PyList_GetItem(pyList, 0);   // 获取下标为0的数据
    print_pyobject(py_data);
}

Python Tuple API

Tuple API 简单介绍

int PyTuple_Check(PyObject *p) 判断是否是一个元组对象

PyObject* PyTuple_New(Py_ssize_t len) 创建一个Python元组对象,注意元组创建是必须设置长度的,如果设置长度为0,则这个元组对象是一个空的元组

Py_ssize_t PyTuple_Size(PyObject *p) 获取元组的长度,即元组的大小

Py_ssize_t PyTuple_GET_SIZE(PyObject *p) 和PyTuple_Size一样,只不过这个方法没有错误检查的机制

PyObject PyTuple_GetItem(PyObject p, Py_ssize_t pos) 获取元组内指定下标的值

PyObject PyTuple_GET_ITEM(PyObject p, Py_ssize_t pos) 和PyTuple_GetItem一样,只不过这个方法没有错误检查的机制

PyObject PyTuple_GetSlice(PyObject p, Py_ssize_t low, Py_ssize_t high) 获取分片数据 p[lwo, higt]

int PyTuple_SetItem(PyObject p, Py_ssize_t pos, PyObject o) 设置元组指定下标的值

void PyTuple_SET_ITEM(PyObject p, Py_ssize_t pos, PyObject o) 和PyTuple_SetItem一样,只不过这个方法没有错误检查的机制

int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize) 改变元组的大小

实例

头文件

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

#ifndef PRINT_DEMO1_PYTUPLE_H
#define PRINT_DEMO1_PYTUPLE_H

#include <Python.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "print.h"

// 元组的使用
void test_tuple();

#endif //PRINT_DEMO1_PYTUPLE_H

源文件

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

#include "pyTuple.h"

void test_tuple(){
    PyObject* pyTuple = PyTuple_New(3);   // 创建一个元组

    PyObject* pyId = Py_BuildValue("i", 1);   // 创建一个Python整型对象
    PyTuple_SetItem(pyTuple, 0, pyId);   // 向指定的下标传递数据

    PyObject* pyString = Py_BuildValue("s", "lanyulei");   // 创建一个Python字符串对象
    PyTuple_SetItem(pyTuple, 1, pyString);

    PyObject* pyFloat = Py_BuildValue("f", 165.46f);    // 创建一个Python浮点对象
    PyTuple_SetItem(pyTuple, 2, pyFloat);

    int tupleLength = PyTuple_Size(pyTuple);
    printf("pyTuple size: %d\n", tupleLength);
    print_pyobject(pyTuple);

    printf("----------------------PyTuple_GetItem--------------------------\n");
    PyObject* pyData = PyTuple_GetItem(pyTuple, 0);   // 获取元组指定下标的数据
    print_pyobject(pyData);

    printf("------------------------遍历元组--------------------------\n");
    // 遍历元组数据
    for (int i = 0; i < PyTuple_Size(pyTuple); i++){
        PyObject* pyData = PyTuple_GetItem(pyTuple, i);
        print_pyobject(pyData);
    }

    printf("------------------------获取分片数据--------------------------\n");
    PyObject* pySlice = PyTuple_GetSlice(pyTuple, 1, PyTuple_Size(pyTuple));   // 获取切片数据
    print_pyobject(pySlice);

    printf("------------------------修改元组长度--------------------------\n");
    printf("原始长度: %d\n", tupleLength);
    _PyTuple_Resize(&pyTuple, 5);   // 修改元组长度,第一个参数是一个指针
    printf("resize tuple length: %ld\n", PyTuple_Size(pyTuple));
}

Python Dict API

Dict API 简单介绍

int PyDict_Check(PyObject *p) 判断对象是不是一个字典

PyObject* PyDict_New() 创建一个Python对象

void PyDict_Clear(PyObject *p) 清空Python对象的数据

int PyDict_Contains(PyObject p, PyObject key) 判断字典内是否存在一个键值数据

PyObject PyDict_Copy(PyObject p) 拷贝一个字典的数据,产生一个新的Python字典对象

int PyDict_SetItem(PyObject p, PyObject key, PyObject *val) 给Python字典对象设置新的键值数据

int PyDict_SetItemString(PyObject p, const char key, PyObject *val) 和PyDict_SetItem类似,只不过键是C语言char数据类型的数据

int PyDict_DelItem(PyObject p, PyObject key) 删除Python键值数据

int PyDict_DelItemString(PyObject p, const char key) 和PyDict_DelItem类似,只不过键是C语言char数据类型的数据

PyObject PyDict_GetItem(PyObject p, PyObject *key) 获取Python字典对象的键的值

PyObject PyDict_GetItemWithError(PyObject p, PyObject *key) 和PyDict_GetItem一样,只不过返回上下文的错误信息

PyObject PyDict_GetItemString(PyObject p, const char *key) 和PyDict_GetItem一样,只不过键值C语言中char数据类型的数据

PyObject PyDict_SetDefault(PyObject p, PyObject key, PyObject default) 设置Python字典对象的默认值,当获取的Key不存在的时候则返回当前的默认数据 dict.setdefault()

PyObject PyDict_Items(PyObject p) 返回一个Python字典对象所有数据的PyListObject, dict.items()

PyObject PyDict_Keys(PyObject p) 返回一个Python字典对象的所有的Key数据 dict.keys()

PyObject PyDict_Values(PyObject p) 返回一个Python字典对象的所有Value数据 dict.values()

Py_ssize_t PyDict_Size(PyObject *p) 获取Python字典的大小 len(dict)

int PyDict_Next(PyObject p, Py_ssize_t ppos, PyObject pkey, PyObject pvalue) 遍历获取Python字典对象的所有数据, 下面是官方提供的例子

PyObject *key, *value;
Py_ssize_t pos = 0;   // 初始值必须为0, 表示遍历所有Python字典对象数据

while (PyDict_Next(self->dict, &pos, &key, &value)) {
    
    ...
}

PyObject *key, *value;
Py_ssize_t pos = 0;

while (PyDict_Next(self->dict, &pos, &key, &value)) {
    long i = PyLong_AsLong(value);
    if (i == -1 && PyErr_Occurred()) {
        return -1;
    }
    PyObject *o = PyLong_FromLong(i + 1);
    if (o == NULL)
        return -1;
    if (PyDict_SetItem(self->dict, key, o) < 0) {
        Py_DECREF(o);
        return -1;
    }
    Py_DECREF(o);
}

int PyDict_Merge(PyObject a, PyObject b, int override) 将b字典内的数据,加入到a字典中去,override表示是否覆盖数据,如果override为true则覆盖数据,反之亦然

int PyDict_Update(PyObject a, PyObject b) 把b字典中的数据加入到a字典中,如果a和b出现相同的key,则b直接更新a中key对应的值

实例

头文件

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

#ifndef PRINT_DEMO1_PYDCIT_H
#define PRINT_DEMO1_PYDCIT_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Python.h>
#include "print.h"

// 字典练习
void test_dict();

#endif //PRINT_DEMO1_PYDCIT_H

源文件

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

#include "pyDcit.h"

void test_dict()
{
    //创建dict
    PyObject* py_dict_1 = PyDict_New();

    //检查PyObject是不是一个字典
    int ret = PyDict_Check(py_dict_1);
    if (ret)
    {
        printf("is dict\n");
    }
    else
    {
        printf("is not dict\n");
    }

    PyObject *py_key_account_id = Py_BuildValue("s", "account_id");
    PyObject *py_value_account_id = Py_BuildValue("i", 1238);
    //向dict添加一个key-value
    PyDict_SetItem(py_dict_1, py_key_account_id, py_value_account_id);

    PyObject *py_value_account_name = Py_BuildValue("s", "mono");
    PyDict_SetItemString(py_dict_1, "account_name", py_value_account_name);

    PyObject *py_key1 = Py_BuildValue("i", 1);
    PyObject *py_key1_value = Py_BuildValue("i", 2399);
    PyDict_SetItem(py_dict_1, py_key1, py_key1_value);

    //获取字典的大小
    int dict_len = PyDict_Size(py_dict_1);
    printf("dict_len=%d\n", dict_len);

    print_pyobject(py_dict_1);

    //从字典删除一个key
    PyDict_DelItem(py_dict_1, py_key_account_id);

    printf("del item: py_key_account_id--------------------------\n");
    print_pyobject(py_dict_1);

    //删除一个不存在的key
    PyObject *py_not_existing_key = Py_BuildValue("s", "name");
    PyDict_DelItem(py_dict_1, py_not_existing_key);

    printf("del item: py_not_existing_key------------------\n");
    print_pyobject(py_dict_1);

    //-------------------------------------------------------
    //PyDict_DelItemString(py_dict_1, "account_name");

    //printf("del item: account_name -----------------\n");
    //print_pyobject(py_dict_1);

    PyObject *py_key_account_name = Py_BuildValue("s", "account_name");
    //从字典中获取一个key-value
    PyObject *py_value1 = PyDict_GetItem(py_dict_1, py_key_account_name);
    printf("get item: account_name-----------------------\n");
    print_pyobject(py_value1);

    printf("\n");
    //从字典中获取一个key-value
    PyObject *py_value2 = PyDict_GetItemString(py_dict_1, "account_name");
    printf("get item string: account_name -------------------\n");
    print_pyobject(py_value2);
    printf("\n");

    //-----------------------------------------------------------
    //从字典中获取所有key-value对
    PyObject *py_items = PyDict_Items(py_dict_1);
    printf("get items --------------------------\n");
    print_pyobject(py_items);
    printf("\n");

    //--------------------------------------
    //从字典中获取所有key
    PyObject *py_keys = PyDict_Keys(py_dict_1);
    printf("get keys -------------------------\n");
    print_pyobject(py_keys);
    printf("\n");

    //------------------------------------------------
    //从字典获取所有值
    PyObject *py_values = PyDict_Values(py_dict_1);
    printf("get values -----------------------\n");
    print_pyobject(py_values);
    printf("\n");

    //------------------------------------------------------
    //遍历字典
    PyObject *key, *value;
    Py_ssize_t pos = 0;

    printf("dict next -------------------\n");
    while (PyDict_Next(py_dict_1, &pos, &key, &value))
    {
        print_pyobject(key);
        printf("=");
        print_pyobject(value);
        printf("\n");
    }

    //---------------------------------------------
    PyObject *py_dict_2 = PyDict_New();

    PyObject *py_key21 = Py_BuildValue("i", 101);
    PyObject *py_key21_value = Py_BuildValue("i", 60000);
    PyDict_SetItem(py_dict_2, py_key21, py_key21_value);

    PyObject *py_value_level = Py_BuildValue("i", 30);
    PyDict_SetItemString(py_dict_2, "account_level", py_value_level);

    PyObject *py_value_account_name2 = Py_BuildValue("s", "myname");
    PyDict_SetItemString(py_dict_2, "account_name", py_value_account_name2);

    printf("dict_2 items --------------------\n");
    print_pyobject(py_dict_2);

    //把py_dict_2的所有数据添加到py_dict_1
    PyDict_Merge(py_dict_1, py_dict_2, 0);

    printf("dict merge: override=0, -----------------\n");
    print_pyobject(py_dict_1);

    //----------------------------------------
    PyObject *py_dict_3 = PyDict_New();

    PyObject *py_value_score = Py_BuildValue("i", 10000);
    PyDict_SetItemString(py_dict_3, "account_score", py_value_score);

    PyObject *py_value_account_name3 = Py_BuildValue("s", "sujin");
    PyDict_SetItemString(py_dict_3, "account_name", py_value_account_name3);

    //将py_dict_3的所有数据添加到py_dict_1, 这个api相当于PyDict_Merge第三个参数为1的情况.
    PyDict_Update(py_dict_1, py_dict_3);
    printf("dict update ----------------------\n");
    print_pyobject(py_dict_1);

    //---------------------------------------------
    const char *check_key = "account_name";
    PyObject *py_check_key = Py_BuildValue("s", check_key);

    //在字典中检查是否存在这个key
    ret = PyDict_Contains(py_dict_3, py_check_key);
    if (ret)
    {
        printf("has key: %s\n", check_key);
    }
    else
    {
        printf("no key: %s\n", check_key);
    }

    //-------------------------------------------------
    //清空字典的所有数据
    PyDict_Clear(py_dict_3);

    printf("dict clear ---------------------\n");
    print_pyobject(py_dict_3);
}

根据数据类型打印数据的方法

头文件

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

#ifndef PRINT_DEMO1_PRINT_H
#define PRINT_DEMO1_PRINT_H

#include <Python.h>

void print_pyobject(PyObject *py_obj);

#endif //PRINT_DEMO1_PRINT_H

源文件

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

#include "print.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// Python 中的浮点类型, 都是double

void print_pyobject(PyObject *py_obj){

    if (py_obj == NULL){
        printf("NULL");
        return;
    }

    if (PyInt_Check(py_obj)){
        // int
        int ival = PyInt_AsLong(py_obj);
        printf("我是整型,ival = %d\n", ival);
    } else if (PyLong_Check(py_obj)){
        // long
        long long lval = PyLong_AsLongLong(py_obj);
        printf("我是长整型,lval = %lld\n", lval);
    } else if (PyFloat_Check(py_obj)){
        // float/double
        double fval = PyFloat_AS_DOUBLE(py_obj);
        printf("我是浮点类型,fval = %lf\n", fval);
    } else if (PyBool_Check(py_obj)){
        // bool
        int bval = PyInt_AsLong(py_obj);
        if (bval == 1){
            printf("我是布尔类型,bval = true\n");
        }else {
            printf("我是布尔类型,bval = false\n");
        }
    } else if (PyString_Check(py_obj)){
        // 不包含中文的字符串
        char *str = PyString_AsString(py_obj);
        printf("我是不包含中文的字符串,str = %s\n", str);
    } else if (PyUnicode_Check(py_obj)){
        // unicode 含有中文的字符串
        // 首先将unicode转成utf-8
        PyObject *py_utf8 = PyUnicode_AsUTF8String(py_obj);
        char *ustr = PyString_AsString(py_utf8);
        printf("我是unicode,ustr = %s\n", ustr);
    } else if (PyList_Check(py_obj)){
        // Python list
        printf("我是列表,");
        printf("[\n");
        for (int i = 0;i < PyList_Size(py_obj); i++){
            PyObject *py_data = PyList_GetItem(py_obj, i);
            print_pyobject(py_data);
        }
        printf("]\n");
    } else if (PyTuple_Check(py_obj)){
        // Python tuple
        printf("我是元组,");
        printf("(\n");
        for (int i = 0;i < PyTuple_Size(py_obj); i++){
            PyObject *py_data = PyTuple_GetItem(py_obj, i);
            print_pyobject(py_data);
        }
        printf(")\n");
    } else if (PyDict_Check(py_obj)){
        // Python dict
        PyObject *key, *value;
        Py_ssize_t pos = 0;

        printf("我是字典,");
        printf("{\n");
        while (PyDict_Next(py_obj, &pos, &key, &value)) {
            print_pyobject(key);
            printf("=");
            print_pyobject(value);
        }
        printf("}\n");
    }
}

main函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

    // 初始化Python虚拟机
    Py_Initialize();
    // 判断Python虚拟机是否成功
    if (Py_IsInitialized() == 0){
        printf("fal to initialize Python\n");
        return -1;
    }

    printf("server start\n");

    // 退出Python虚拟机
    Py_Finalize();
    return 0;
}

--结束END--

本文标题: Python C API 使用详解(二)

本文链接: https://lsjlt.com/news/188495.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python C API 使用详解(二)
    简介 介绍Python C API中的列表、元组、字典的使用,详细的进行了API中方法的介绍。 Python List API List API 简单介绍 int PyList_Check(PyObject *p) 判断是否是一个Py...
    99+
    2023-01-31
    详解 Python API
  • Python C API的使用详解(一)
    简介 介绍一下Python虚拟机的初始化及退出,Python基本数据类型的对象创建以及C和Python之间的数据类型互相转换。 Python虚拟机的初始化及退出 初始化Python虚拟机需要调用Py_Initialize()来实现。 Py_...
    99+
    2023-01-31
    详解 Python API
  • C++二叉搜索树BSTree使用详解
    目录一、概念二、基础操作1.查找find2.插入Insert3.中序遍历InOrder4.删除erase三、递归写法1.递归查找2.递归插入3.递归删除四、应用五、题目练习一、概念 ...
    99+
    2023-03-09
    C++二叉搜索树BSTree C++二叉搜索树 C++ BSTree
  • 使用Python进行数独求解详解(二)
    目录1.引言2.前文回顾3.减少非比要的迭代次数3.1生成候选值字典3.2生成候选值列表3.3函数调用4.总结1. 引言 本文是数独游戏问题求解的第二篇,在前文中我们使用回溯算法实现...
    99+
    2024-04-02
  • Java使用ChatGPT的API详解
    目录介绍验证发出请求创建聊天PostMan实例介绍 OpenAI API 几乎可以应用于任何涉及理解或生成自然语言或代码的任务。我们提供一系列具有不同功率级别的模型,适用于不同的任务...
    99+
    2023-05-18
    Java使用ChatGPT的API Java ChatGPT的API
  • ResizeObserver API使用示例详解
    目录API介绍浏览器兼容性用法总结API介绍 当我们需要知道一个元素的大小变化或者屏幕横竖屏时,我们需要监听window.resize事件或者window.orientationch...
    99+
    2024-04-02
  • Python 二分查找之bisect库的使用详解
    目录简介bisect 库的使用bisect_leftbisect_rightinsort_leftinsort_right二分查找基础实现简介 bisect 库是 Python 标准...
    99+
    2023-03-11
    Python bisect库使用 Python bisect
  • C/C++详解实现二层转发
    目录OSI第2层什么是MAC地址表二层转发C/C++代码实现总结OSI第2层 前两个字段分别是目的地址和源地址字段。第3个字段是2字节的类型字段,用来标识上一层是什么协议。 数据...
    99+
    2024-04-02
  • 如何在 Windows 上使用 Python API 生成二维码?
    二维码(QR Code)是一种二维编码,可以将信息编码成黑白图案,用于快速识别。在现代社会中,二维码已经广泛应用于支付、物流、票务等领域。Python 是一种广泛使用的编程语言,它有丰富的库和 API,可以轻松生成二维码。本文将介绍如何在...
    99+
    2023-05-26
  • C/C++ 使用 MySQL API 操作 数据库 (API讲解 、案例分享)
    C/C++ 对 MySQL API 的使用 简介 文章目录 C/C++ 对 MySQL API 的使用简介1. C/C++ 使用 API介绍2. C/C++ 环境配置和操作示例代码2.1 My...
    99+
    2023-09-11
    mysql c++ visual studio
  • libmp3lame及API介绍和使用详解
    目录API介绍简单使用API介绍 API地址是对libmp3lame.so的编码部分最基础接口的介绍,本库特包含了增加id3标签和mp3的解码的支持。这里并不是完整的文档,但是你可以...
    99+
    2023-05-18
    libmp3lame API使用 libmp3lame API
  • 二维码生成器:使用 Python API 在 Windows 上实现。
    二维码生成器:使用 Python API 在 Windows 上实现 二维码(QR Code)是一种二维条码,可以存储大量信息。它由黑白交错的小方块组成,可以被扫描器扫描,将信息转换成可读的文本或链接。二维码已经被广泛应用于商业和日常生活中...
    99+
    2023-05-26
  • 使用python调用zxing库生成二维码图片详解
    (1)安装Jpype 用Python调用jar包需要安装jpype扩展,在Ubuntu上可以直接使用apt-get安装jpype扩展 $ sudo apt-get install python-jp...
    99+
    2022-06-04
    详解 图片 二维码
  • Python Gitlab Api 使用
    简述 公司使用gitlab 来托管代码,日常代码merge request 以及其他管理是交给测试,鉴于操作需经常打开网页,重复且繁琐,所以交给Python 管理。 官方文档 安装 pip install pyth...
    99+
    2023-01-31
    Python Gitlab Api
  • python中API调用的详解与示例
    本篇文章给大家带来了关于python的相关知识,其中主要介绍了关于API调用的相关问题,包括了API的调用和数据接口的调用、请求方法、几种常见API调用实例等等内容,下面一起来看一下,希望对大家有帮助。在日常工作中,可能需要结合网上现在的一...
    99+
    2022-06-16
    python
  • python如何实现API的调用详解
    目录前言API数据接口API的调用和数据接口的调用调用的基础-请求方法几种常见API调用实例百度AI相关API百度地图API有道APIuuidsign常用API分享总结前言 在日常工...
    99+
    2024-04-02
  • python 使用ctypes调用C/C++ dll详情
    python和C/C++混合编程,推荐使用python的内置模块ctypes,从名字上可以看出是c,可见对C++的支持并不太好。 一般的步骤: 1、导入ctypes模块,加载C/C+...
    99+
    2024-04-02
  • 关于C++中二分法详解
    目录一、整数二分1.整数二分模板2.求解二分问题的思路3.练习二、浮点数二分1.浮点数二分模板2.练习三、总结一、整数二分 单调性与二分的关系:有单调性一定可以二分,用二分不一定是单...
    99+
    2024-04-02
  • C++中二叉堆排序详解
    目录1. 前言什么是二叉堆?2 堆的数据结构2.1 二叉堆的抽象数据结构2.2 基础 API 实现2.3 上沉算法2.4 下沉算法3. 堆排序4. 后记1. 前言 什么是二叉堆? 二...
    99+
    2023-01-07
    二叉堆排序c++ c语言二叉树堆排序
  • 【新知】chatGPT 使用笔记(二)——chatGPT API的使用
    文章目录 使用步骤openai 功能举例1. 训练AI模型2. 使用AI模型进行文本生成3. 计算机视觉 openai 包里含有的modelGPT-3 模型 在IDE中使用chatGP...
    99+
    2023-09-03
    python 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作