microPython的源码解析之 sequence.c

MicroPython 是一种适用于微控制器和其他受限环境的 Python 编程语言的实现。它旨在提供与 Python 3 语言的紧密兼容,同时考虑到内存和计算资源的限制。MicroPython 库是这门语言的核心组成部分,提供了一系列的模块和函数,使得开发者能够在硬件上执行各种任务。
下面将通过系列文章,逐一解读microPython,以便让读者了解掌握microPython的整个核心逻辑.,以便读者可以透过这个Python的最小内核,掌握Python解析器的核心实现逻辑,学习世界上最优秀的源码设计之一.


microPython Python最小内核源码解析
NI-motion运动控制c语言示例代码解析
python编程示例系列 python编程示例系列二
python的Web神器Streamlit


代码是一个C语言编写的序列处理库的一部分,它包含了对序列进行乘法操作、切片、比较和搜索等操作的函数。这些函数可以用于处理类似Python中的列表(list)或元组(tuple)这样的序列类型。代码中的注释已经翻译成中文,并且补充了一些额外的注释来帮助理解每个函数的工作原理和使用场景。

#include <string.h>

#include "py/runtime.h"

// 序列类型的辅助函数

#define SWAP(type, var1, var2) {
      type t = var2; var2 = var1; var1 = t; }

// 实现序列 * 整数操作的后端。假设序列中的元素在内存中是相邻的。
void mp_seq_multiply(const void *items, size_t item_sz, size_t len, size_t times, void *dest) {
   
    for (size_t i = 0; i < times; i++) {
   
        size_t copy_sz = item_sz * len; // 计算每次复制的字节大小
        memcpy(dest, items, copy_sz); // 复制序列到目标地址
        dest = (char *)dest + copy_sz; // 更新目标地址指针
    }
}

#if MICROPY_PY_BUILTINS_SLICE

// 获取快速切片索引,用于序列类型的切片操作。
bool mp_seq_get_fast_slice_indexes(mp_uint_t len, mp_obj_t slice, mp_bound_slice_t *indexes) {
   
    mp_obj_slice_indices(slice, len, indexes);

    // 如果索引是负数,则停止点指的是最后一个元素,而不是它的后面
    if (indexes->step < 0) {
   
        indexes->stop++;
    }

    // 如果步长为正,但起始索引大于停止索引,则将停止索引设置为起始索引
    if (indexes->step > 0 && indexes->start > indexes->stop) {
   
        indexes->stop = indexes->start;
    } else if (indexes->step < 0 && indexes->start < indexes->stop) {
   
        // 如果步长为负,但起始索引小于停止索引,则将停止索引设置为起始索引加1
        indexes->stop = indexes->start + 1;
    }

    // 如果步长为1,则返回true
    return indexes->step == 1;
}

#endif

// 根据切片索引提取序列的一个子序列
mp_obj_t mp_seq_extract_slice(size_t len, const mp_obj_t *seq, mp_bound_slice_t *indexes) {
   
    (void)len; // TODO 我们能否从参数列表中移除len?

    mp_int_t start = indexes->start, stop = indexes->stop;
    mp_int_t step = indexes->step;

    mp_obj_t res = mp_obj_new_list(0, NULL); // 创建一个新的列表对象用于存储结果

    if (step < 0) {
   
        // 如果步长为负,则从序列的末尾开始提取元素
        while (start >= stop) {
   
            mp_obj_list_append(res, seq[start]);
            start += step;
        }
    } else {
   
        // 如果步长为正,则从序列的开头开始提取元素
        while (start < stop) {
   
            mp_obj_list_append(res
  • 31
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

openwin_top

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值