《嵌入式AI筑基笔记02:Python数据类型02,从C的“硬核”到Python的“包容”》

Python嵌入式开发实战:从MicroPython到嵌入式Linux的完整生态解析 Python语言凭借其简洁语法与丰富的库生态,正在嵌入式领域开辟出独特路径。在MCU级别,MicroPython实现了Python的子集运行,让开发者用解释型语言直接控制GPIO、I2C等外设;在嵌入式Linux平台,Python则与C/C++协同,负责业务逻辑与通信协议。理解其适用边界与性能特征,有助于在硬件原型验证、测试自动化、边缘计算等场景中快速落地。系统梳理了工具链配置、实战案例与常见坑点,为开发者提供一条从入门到工程实践的清晰路径。 阅读详情

《嵌入式AI筑基笔记02:Python数据类型02,从C的“硬核”到Python的“包容”》

前言

数据类型是编程的基石。Python的数据类型虽灵活,但遵循着可变/不可变、有序/无序两大核心规则。理解它们,就能掌握字符串、列表、元组、字典、集合的精髓。

接上回,本文介绍复合类型。关于标量类型的介绍,请参看《嵌入式AI筑基笔记02:Python数据类型01,从C的“硬核”到Python的“包容”》。

Python 的数据类型可以分为两大类,核心逻辑是:可变 / 不可变、有序 / 无序:

基本数据类型(标量类型):单个值的类型,不可再分

    • 数值型:整数 (int)、浮点数 (float)、复数 (complex)

    • 布尔型:bool(只有 True/False 两个值)

    • 字符串:str(字符的序列)

容器数据类型(复合类型):可以存储多个值的类型

    • 有序容器:列表 (list)、元组 (tuple)、字符串 (str)(字符串本质是字符的有序序列)

    • 无序容器:集合 (set)、字典 (dict)

列表(list)

特点

• 可变性:创建后可直接修改、添加、删除元素(区别于字符串的不可变);

• 有序性:元素按插入顺序存储,支持索引和切片;

• 包容性:可存储任意类型数据(数字、字符串、列表、字典等),甚至混合类型;

• 可迭代性:支持遍历、推导式等迭代操作。

注意:列表是 Python 中最核心的可变有序容器

基本操作

• 索引

        • 功能:获取单个元素

        • 语法:列表[索引值]

        • 规则:正向索引从 0 开始,反向索引从 -1 开始(最后一个字符为 -1),支持直接修改索引对应元素(可变特性)。

        • 示例代码

# 索引:获取单个字符
# 正向索引从0开始,反向索引从-1开始
# 支持直接修改索引对应元素(可变特性)
lst = [10, "Python", 3.14, [1,2]]
print(lst[1], lst[-1])   # 索引取值 Python [1, 2]
lst[0] = 100    # 直接修改元素
print(lst)      # [100, 'Python', 3.14, [1,2]]

• 长度

        • 功能:获取列表长度

        • 语法:len(列表)

        • 示例代码

# 长度 len()
lst = [10, "Python", 3.14, [1,2]]
print(len(lst), lst)   # 获取列表长度 4 [10, 'Python', 3.14, [1, 2]]

• 成员

        • 功能:判断指定元素是否是列表的成员

        • 语法:元素 in 列表、元素 not in 列表

        • 示例代码

# 成员 in/not in
lst = [10, "Python", 3.14, [1,2]]
print(10 in lst)        # 10 是 lst 的成员       True
print(10 not in lst)    # 10 是 lst 的成员       False
print('Python' in lst)  # 'Python' 是 lst 的成员 True

• 遍历

        • 功能:逐个处理元素

        • 直接遍历元素

                • 语法:for char in 字符串:

                • 特点:最简洁,最基础

        • 通过索引遍历

                • 语法:for idx in range(len(字符串)): + 字符串[idx]

                • 特点:手动控制索引和步长,灵活度高。

         • 使用 enumerate () 遍历

                • 语法:for idx, char in enumerate(字符串, start=起始索引):

                         • enumerate() 会返回一个迭代器,每个元素是 (索引, 字符) 的元组;

                         • start 参数可选,默认从 0 开始,可指定起始索引(如 start=1)。

                • 特点:推荐!索引 + 字符一键获取。

        • 示例代码

# 直接遍历
# 特点:最简洁,最基础
lst = [10, "Python", 3.14, [1,2]]
for l in lst:
    print(l, end=' ')       # 10 Python 3.14 [1, 2]
print()

# 通过索引遍历
# 手动控制索引和步长,灵活度高
for i in range(len(lst)):
    print(lst[i], end=' ')  # 10 Python 3.14 [1, 2]
print()

# 使用 enumerate () 遍历
# 推荐!索引 + 字符一键获取
for i, l in enumerate(lst):
    print(i, l, end='|')  # 0 10|1 Python|2 3.14|3 [1, 2]|
print()

    • 切片

            • 语法:列表[起始索引:结束索引:步长]

                     • 左闭右开:包含起始索引,不包含结束索引;

                     • 步长默认 1,步长为负数表示反向切片;

                     • 起始 / 结束索引可省略(省略起始 = 从开头,省略结束 = 到末尾);

            • 列表切片返回新列表;

            • 支持通过切片批量修改元素。

            • 示例代码

    # 切片
    lst = [1, 2, 3, 4, 5, 6]
    print(lst[1:5])     # 取[1,5)的元素      [2,3,4,5]
    print(lst[:2])      # 取[0,2)的元素      [1, 2]
    print(lst[::-1])    # 反向切片:反转列表  [6,5,4,3,2,1]
    lst[2:4] = [30,40]  # 切片批量修改 修改元素2、3的值
    print(lst)          # [1,2,30,40,5,6]
    lst[2:4] = []       # 切片删除元素(赋值为空列表)
    print(lst)          # [1,2,5,6]

    • 拼接与重复

            • 拼接:+ 连接两个列表(生成新列表);

            • 重复:* 让列表元素重复指定次数(生成新列表);

            • 注意:+= 是原地修改列表(区别于 +)。

            • 示例代码

    # 拼接与重复 + * +=
    lst1 = [1,2,3]
    lst2 = [4,5,6]
    print(lst1 + lst2)     # 拼接(生成新列表) [1,2,3,4,5,6]
    print(lst1 * 2)        # 重复 [1,2,3,1,2,3]
    lst1 += lst2           # 原地拼接(修改原列表)
    print(lst1)            # [1,2,3,4,5,6]

    增加操作

    • 添加元素

            • 语法:列表.append(元素)

            • 功能:在列表末尾添加单个元素,最常用

    • 批量添加

            • 语法:列表.extend(可迭代对象)

            • 功能:在列表末尾批量添加元素(可迭代对象:列表 / 字符串 / 元组等)

    • 插入元素

            • 语法:列表.insert(索引, 元素)

            • 功能:在指定索引位置插入单个元素,插入后后续元素后移

    • 示例代码

    # 增加元素
    # append()
    lst = [1,2,3]
    lst.append(4)       # append:末尾加单个元素
    print(lst)          # [1,2,3,4]
    lst.append([5,6])   # 注意:append会把列表作为单个元素添加
    print(lst)          # [1,2,3,4,[5,6]]
    
    # extend()
    lst = [1,2,3]
    lst.extend([4,5])   # extend:批量添加(拆分可迭代对象)
    print(lst)          # [1,2,3,4,5]
    lst.extend("67")    # 字符串会拆分为单个字符
    print(lst)          # [1,2,3,4,5,'6','7']
    
    # insert:指定位置插入
    lst = [1,2,3]
    lst.insert(1, 10)  # 索引1位置插入10
    print(lst)          # [1,10,2,3]

    删除操作

    • 移除元素

            • 语法:列表.remove(元素)

            • 功能:删除第一个匹配的指定元素,无该元素会报错。

    • 弹出元素

            • 语法:列表.pop(索引)

            • 功能:删除指定索引的元素,返回被删除的元素(默认删除最后一个),最灵活。

    • 删除元素

            • 语法:del 列表[索引/切片]

            • 功能:删除指定索引 / 切片的元素(无返回值),直接删除,不可逆。

    • 清空列表

            • 语法:列表.clear()

            • 功能:清空列表所有元素(保留空列表)。

    • 批量删除

            • 语法:列表切片赋值为空

            • 功能:批量删除(如 lst[1:3] = [])。

    • 示例代码

    # 删除
    lst = [1,2,3,2,4]
    lst.remove(2)    # remove:删除第一个匹配的2
    print(lst)       # [1,3,2,4]
    # lst.remove(5)  # # 报错:ValueError: list.remove(x): x not in list
    
    # pop()
    deleted = lst.pop(1)    # pop:删除索引1的元素,返回3
    print(lst, deleted)     # [1,2,4] 3
    lst.pop()               # 默认删除最后一个元素
    print(lst)              # [1,2]
    
    # del
    lst = [1,2,3]
    del lst[0]              # del:删除索引0的元素
    print(lst)              # [2,3]
    del lst[1:]             # 删除切片(索引1到末尾)
    print(lst)              # [2]
    
    # clear:清空列表
    lst = [1,2,3,4]
    lst[:2] = []            # 批量删除前两个
    print(lst)              # [3, 4]
    lst.clear()             # clear:清空列表
    print(lst)              # []

    查询统计

    • 统计次数

            • 语法:列表.count(元素)

            • 功能:统计指定元素出现的次数

    • 查找元素

            • 语法:列表.index(元素, 起始, 结束)

            • 查找元素首次出现的索引(可指定范围),无该元素报错

    • 是否存在

            • 语法:元素 in 列表

            • 判断元素是否存在(返回 bool)

    • 示例代码

    # 查询操作
    lst = [1,2,3,2,4,2]
    print(lst.count(2))  # count:统计2出现的次数 3
    
    print(lst.index(3))  # index:查找3的索引 2
    # 查找2在索引2到5范围内首次出现的索引
    print(lst.index(2, 2, 5))  # 3
    
    # in:判断元素是否存在
    print(4 in lst)  # True
    print(5 in lst)  # False

    排序反转

    • 排序

            • 语法:列表.sort(reverse=False)

                    • 功能:原地排序(修改原列表),默认升序排序,reverse=True 降序

            • 语法:sorted(列表, reverse=False)

                    • 功能:生成新的排序后列表(原列表不变)默认升序排列,reverse=True 降序

    • 反转

            • 语法:列表.reverse()

                    • 功能:倒序,逆序, 直接修改原列表

            • 语法:reversed(列表, reverse=False)

                    • 功能:倒序,逆序, 不改变原列表

    • 示例代码

    # 排序操作
    lst = [3,1,4,2,5]
    lst.sort()  # sort:原地升序排序
    print(lst)  # [1, 2, 3, 4, 5]
    lst.sort(reverse=True)  # sort:原地降序排序
    print(lst)  # [5, 4, 3, 2, 1]
    
    # sorted:生成新列表,原列表不变
    lst = [3,1,4,2,5]
    new_lst = sorted(lst)
    print(lst, new_lst)  # [3, 1, 4, 2, 5] [1, 2, 3, 4, 5]
    
    # reverse:原地反转
    lst.reverse()
    print(lst)           # [5, 2, 4, 1, 3]
    
    # sorted:生成新列表,原列表不变
    new_lst = list(reversed(lst))
    print(lst, new_lst)  # [5, 2, 4, 1, 3] [3, 1, 4, 2, 5]
    # 切片反转(生成新列表,原列表不变)
    print(lst[::-1])     # [3, 1, 4, 2, 5]

    其它操作

    • 浅拷贝

            • 语法:列表.copy()

            • 功能:浅拷贝列表(生成新列表,区别于赋值),避免修改原列表

    • 安全查找

            • 语法:列表.index() 异常处理

            • 结合 in 判断,避免查找不存在元素报错

    • 列表推导式

            • 语法:[表达式 for 元素 in 可迭代对象 if 条件]

            • 功能:批量生成 / 处理列表,代码简洁、执行效率高,替代繁琐的循环 + append。

    • 示例代码

    # copy:浅拷贝
    lst1 = [1,2,3]
    lst2 = lst1.copy()  # 新列表
    lst2[0] = 100
    print(lst1, lst2)   # [1, 2, 3] [100, 2, 3]
    
    # 安全查找元素索引
    lst = [1,2,3]
    target = 4
    if target in lst:
        print(lst.index(target))
    else:
        print(f"{target} 不存在")  # 4 不存在
    
    # # 列表推导式:用一行代码快速生成新列表
    # i 表示列表元素取值,for表示i推导公式 if做筛选
    print([i  for i in range(1, 6)])    # [1, 2, 3, 4, 5]
    print([i*2 for i in range(1, 6)])   # [2, 4, 6, 8, 10]
    print([i  for i in range(1, 10) if i%2])  # 奇数列表 [1, 3, 5, 7, 9]
    print([i  for i in range(1, 10) if i%2 and i%3==0]) # [3, 9]
    print([i  for i in range(1, 10) if i%2 if i%3==0])  # [3, 9]
    
    # ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
    print([i+j  for i in "ABC" for j in "123"])  # 循环嵌套

      元组(tuple)

      特点

      • 不可变性:创建后无法修改、添加、删除元素(区别于列表),但可包含可变元素(如列表);

      • 有序性:支持索引、切片(和字符串 / 列表逻辑一致);

      • 轻量性:内存占用比列表小,访问速度更快;

      • 语法:用 () 定义,单个元素需加逗号(如 (5,)),空元组 ()

      基本操作

      • 创建

              • 创建一个元组()

              • 创建一个数元组,记得加,

      • 长度

              • 使用 len(元组)

      • 索引

              • 同列表,使用元组.[索引]访问

      • 成员

              • 同列表,使用 in/not in

      • 切片

              • 同列表,元组[起始索引:结束索引:步长]

      • 拼接

              • 同列表,+ 连接两个元组(生成新元组)

      • 重复

              • 同列表,* 让元组元素重复指定次数(生成新元组)

      • 遍历

              • 同列表,支持直接遍历元素、通过索引遍历、使用 enumerate () 遍历

      • 示例代码

      # 创建元组
      t1 = (1, 2, "Python", [3,4])  # 包含可变元素(列表)
      t2 = (5)   # 括号当做运算符处理,所以 t2 为整数
      t3 = (5,)  # 单个元素必须加逗号,否则视为普通括号
      print(t1, type(t1)) # (1, 2, 'Python', [3, 4]) <class 'tuple'>
      print(t2, type(t2)) # 5 <class 'int'>
      print(t3, type(t3)) # (5,) <class 'tuple'>
      
      print(len(t1), t1)  # len获取长度 4 (1, 2, 'Python', [3, 4])
      
      # 索引/切片(仅取值,不可修改)
      print(t1[2], t1[1:3])       # Python    (2, 'Python')
      # t1[0] = 100  # 报错:TypeError(不可变)
      t1[3][0] = 30       # 但元组内的可变元素可修改
      print(t1)           # (1, 2, 'Python', [30, 4])
      
      # 遍历同列表
      # 直接遍历
      t1 = (1, 2, "Python", [3,4])
      for t in t1:
          print(t, end=" ")       # 1 2 Python [3, 4]
      print()
      
      # 通过索引遍历
      # 手动控制索引和步长,灵活度高
      for i in range(len(t1)):
          print(t1[i], end=' ')  # 1 2 Python [3, 4]
      print()
      
      # 使用 enumerate () 遍历
      # t1[0] = 1    t1[1] = 2    t1[2] = Python    t1[3] = [3, 4]
      for i, t in enumerate(t1):
          print(f't1[{i}] = {t}', end="\t")
      print()
      
      # 拼接/重复(生成新元组)
      t4 = (1,2) + (3,4)
      print(t4)          # (1, 2, 3, 4)
      print(t4 * 2)      # (1, 2, 3, 4, 1, 2, 3, 4)
      
      # 成员列表 in/not in
      t1 = (1, 2, "Python", [3,4])  # 包含可变元素(列表)
      print(1 in t1)  # True
      print(5 in t1)  # False

      核心操作

      • 统计次数

              • 语法:元组.count(元素)

              • 功能:统计指定元素出现次数

      • 查找元素

              • 语法:元组.index(元素)

              • 功能:查找元素首次出现的索引,不存在则报错

      • 转换成列表

              • 语法:list(元组)

              • 功能:转换成列表,调用列表各种操作进行数据处理

      • 排序

              • 语法:sorted(元组)

              • 功能:先隐形转为列表,再进行排序

      • 快速取值

              • 语法:变量1,变量2,... = (元素1, 元素2,...)

              • 功能:高频用法, 快速将元组解包,获取元素值

      • 示例代码

      t = (1, 3, 5, 6, 3, 3)
      print(t.count(3))   # 统计 3 出现的次数  3
      print(t.index(3))   # 元素 3 首次出现的索引  1
      
      print(list(t))      # 转换成列表 [1, 3, 5, 6, 3, 3]
      t = (1, 3, 5, 6, 3, 3)
      print(sorted(t))    # 先隐形转为列表,再进行排序 [1, 3, 3, 3, 5, 6]
      
      a, b, c = (1, 3, 7)
      print(a, b, c)      # 将元组解包 1 3 7
      _, a = (3, 6)       # _为变量名,有时候我们不想要某个参数,可以用_占位
      print(a)            # 取第 2 个值   6
      a, _ = (12, 3.6)
      print(a)            # 取第 1 个值   12

      集合(set)

      特点

      • 可变性:可增删元素;

      • 无序性:无索引,不支持切片;

      • 唯一性:自动去重,元素不可重复;

      • 元素要求:必须是不可变类型(str/int/tuple,列表 / 字典不能作为集合元素);

      • 语法:用 {}定义(空集合需用 set(),而非 {})。

      基本操作

      • 创建

              • 创建一个集合,{}

              • 创建一个空集合 set()

              • 集合无序,且自动去重

      • 长度

              • 语法:len(集合)        

              • 功能:同列表,获取集合长度(元素个数)

      • 遍历

              • 只能直接遍历

              • 无序性,不能使用索引的方式遍历

      • 成员

              • 语法:元素 in/not in 集合

              • 功能:判断元素是否在集合内

      • 添加

              • 语法:集合.add(元素)

              • 功能:增加一个元素到集合

              • 注意:当元素不存在,才会增加元素

      • 批量添加

              • 语法: 集合.update([列表])

              • 功能:批量添加元素

      • 删除

              • 语法:集合.discard(元素)

              • 功能:删除指定元素,不存在不报错

      • 移除

              • 语法:集合.remove(元素)

              • 功能:删除指定元素,不存在报错

      • 弹出

              • 语法:集合.pop(元素)

              • 功能:随机删除一个元素(无序)

      • 清空

              • 语法:集合.clear()

              • 功能:清空集合

      • 示例代码

      # 定义集合(自动去重)
      s1 = {1, 2, 2, 3, "apple"}
      print(s1, type(s1)) # {'apple', 1, 2, 3} <class 'set'>
      s2 = set([1,2,3,3]) # 列表转集合(去重)
      print(s2)           # {1, 2, 3}
      
      # 空集合和空字典
      s = {}              # 默认空字典
      print(s, type(s))   # {} <class 'dict'>
      s1 = set()          # 空集合
      print(s1, type(s1)) # set() <class 'set'>
      
      s1 = {1, 2, 2, 3, "apple"}
      print("apple" in s1, 2 not in s1)   # True False
      
      # 添加元素
      s1.add(4)           # 添加单个元素
      s1.update([5,6])    # 批量添加
      print(s1)           # {1, 2, 3, 4, 5, 6, 'apple'}
      
      # 删除元素
      s1.remove(2)        # 删除指定元素,不存在报错
      s1.discard(10)      # 删除指定元素,不存在不报错
      deleted = s1.pop()  # 随机删除一个元素(无序)
      print(s1, deleted)  # {3, 4, 5, 6, 'apple'} 1
      
      s1.clear()          # 清空集合
      print(s1)           # set()

      核心操作

      • 交集

              • 语法:s1 & s2/s1.intersection(s2)

              • 功能:交集(共同元素)

      • 并集

              • 语法:s1 | s2

              • 功能:并集,两个集合所有元素

      • 差集

              • 语法: s1 - s2/s1.difference(s2)

              • 功能:差集(s1 有 s2 无)

      • 对称差集

              • 语法:s1 ^ s2/s1.symmetric_difference(s2)

              • 功能:对称差集(互不相同)

      • 子集

              • 语法:s1.issubset(s2)

              • 功能:判断 s1 是否是 s2 子集

      • 示例代码

      # 集合的操作
      s1 = {1, 3, 5}
      s2 = {1, 2 ,4}
      print(s1 & s2)  # 交集 {1}
      print(s1.intersection(s2))  # 交集 {1}
      print(s1 | s2)  # 并集 {1, 2, 3, 4, 5}
      print(s1 - s2)  # 差集 {3, 5}
      print(s1.difference(s2))    # 差集 {3, 5}
      print(s1.symmetric_difference(s2))  # 对称差集 {2, 3, 4, 5}
      print(s1 ^ s2)  # 对称差集,只在一个集合不同时在两个集合的元素 {2, 3, 4, 5}
      print(s1 >= s2) # 包含关系,S1包含S2下为True False
      print({1,4}.issubset(s2)) # 子集 True

      字典(dict)

      特点

      • 可变性:可增删改键值对;

      • 无序性:Python 3.7 前无序,3.7+ 按插入顺序保存;

      • 键值对结构:key: value,键唯一且不可变(str/int/tuple),值可任意类型;

      • 语法:用 {key:value}定义,空字典 {}或 dict()。

      基础操作

      • 创建

              • 包含 key:value ,使用{}

      • 索引

              • 使用 key 索引,字典[key],键不存在报错

              • 使用 get 方法,字典.get(key),键不存在返回 None

      • 长度

              • 同列表,使用len(字典)

      • 修改

              • 修改元素,只能修改value,不能修改key

              • 如果要修改key,只能删掉,重新添加

              • 使用语法字典[key] = value ,key存在时进行修改,不存在时添加

      • 成员

              • 语法:key in/not in 字典

              • 功能:判断元素是否在字典内

      • 添加

              • 语法:字典[key] = value

              • 功能:增加一个元素到字典

              • 注意:当元素不存在,才会增加元素

      • 删除

              • 字典.pop(key)删除指定 key 元素

              • 字典.clear()清空整个字典

              • del 字典[key] 删除指定 key 元素

      • 示例代码

      # 定义字典 key:value
      user = dict(name="李四", age=21)  # 关键字参数创建
      print(user) # {'name': '李四', 'age': 21}
      
      # 访问值(两种方式)
      print(user["name"])     # 李四(键不存在报错)
      print(user.get("age"))  # 21(推荐,键不存在返回None)
      print(user.get("phone", "13800138000"))  # 不存在返回默认值 13800138000
      
      print(len(user))        # 获取字典长度 2
      
      # 修改/添加键值对
      user["age"] = 18                # key存在 修改已有键
      user["phone"] = "13800138000"   # key不存在 添加新键值对
      print(user)     # {'name': '李四', 'age': 18, 'phone': '13800138000'}
      
      # 成员 in/not in
      print("name" in user, "phone" not in user)  # True False
      
      # 删除键值对
      del user["phone"]          # 删除指定键
      deleted = user.pop("age")  # 删除并返回值
      print(user, deleted)       # {'name': '李四'} 18
      user.clear()               # 清空字典
      print(user)                # {}

      核心操作

      • 获取子项

              • dict.keys(),获取所有键

              • dict.values(),获取所有值

              • dict.items(),获取所有键值对((k,v) 元组)

      • 批量添加

              • 语法:dict.update(字典)

              • 功能:批量添加 / 修改键值对

      • 删除

              • 语法:dict.popitem()

              • 功能:删除最后一个键值对(3.7+)

      • 示例代码

      # 获取子项
      user = {"name": "张三", "age": 20}
      print(user.keys())          # 获取所有的key  dict_keys(['name', 'age'])
      print(list(user.keys()))    # ['name', 'age']
      print(user.values())        # 获取所有的value dict_values(['张三', 20])
      print(list(user.values()))  # ['张三', 20]
      print(user.items())         # 获取所有的item  dict_items([('name', '张三'), ('age', 20)])
      print(list(user.items()))   # ['张三', 20]
      
      # 遍历键值对(最常用)
      for k, v in user.items():
          print(f"{k}: {v}", end='\t')    # name: 张三    age: 20
      print()
      
      # 批量更新
      user.update({"age": 21, "city": "上海"})
      print(user)  # {'name': '张三', 'age': 21, 'city': '上海'}
      
      # 删除
      user.popitem()  # 删除最后一个键值对(3.7+)
      print(user)     # {'name': '张三', 'age': 21}

      结束语

      从C到Python,最大的变化不是语法,而是思维,python世界里内存自动管理,数据结构开箱即用,代码行数大幅减少。但自由的背后是规则——理解可变与不可变、有序与无序,才能真正用好Python的数据结构。下一篇流程控制,继续探索Python的简洁之美。

      接下来学什么

      按照计划,后面还有:

      第一篇:语法规则(与 C 的对比) ✅ 已完成
      第二篇:数据结构:列表、元组、字典、集合 ✅ 已完成
      第三篇:流程控制:条件、循环、推导式 ⏳ 准备中
      第四篇:函数与模块:定义、参数、作用域 ⏳
      第五篇:对象和类:Class ⏳
      第六篇:文件操作与异常处理 ⏳
      第七篇:NumPy 入门:像操作内存一样操作数据 ⏳
      第八篇:Pandas 基础:给数据“做表格” ⏳

      一步一步来,不急。

      完整代码

      '''
       * @Filename : python_data_struct.py
       * @Revision : $Revision: 1.00 $
       * @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)
       * @Description : python 数据结构:列表、元组、字典、集合
      '''
      
      # ###################### 基本数据类型 ###################### #
      # 整数 可正可负,无位数限制a = 4b = -1000000000000000000000
      print(a, type(a))   # 4 <class 'int'>
      print(b, type(b))   # -1000000000000000000000 <class 'int'>
      
      # 浮点数 带小数部分,可能有精度限制f1 = 3.1415926f2 = -2.3e-3
      print(f1, type(f1)) # 3.1415926 <class 'float'>
      print(f2, type(f2)) # -0.0023 <class 'float'>
      
      # 复数 (complex)
      # 形如 `a + bj` 的数(a 是实部,b 是虚部)
      # 主要用于科学计算comp = 3 + 4j
      print(comp, type(comp)) # (3+4j) <class 'complex'>
      print(comp.real, type(comp.real))   # 实部 3.0 <class 'float'>
      print(comp.imag, type(comp.imag))   # 虚部 4.0 <class 'float'>
      
      # 布尔型 (bool)
      # 只有两个值:`True`(真,等价于 1)、`False`(假,等价于 0)
      # 主要用于条件判断
      # Python 中除了 `0`、`""`、`[]`、`{}`、`None` 等空值,其他值都被视为 `True`b = True
      print(b, type(b))   # True <class 'bool'>
      print(b and False, b or False, not b)   # False True False
      print(bool([]), bool(None), bool(""))   # False False False
      
      # ###################### 字符串 ###################### #
      # 字符串 (str)
      # 字符的有序序列
      # 不可变(一旦创建,内容无法修改)
      # 用单引号 / 双引号 / 三引号包裹
      # 基本操作
      
      # 创建
      # 使用单引号或双引号括起来s = "hello"f = 'seven'
      print(s, f, type(s))    # hello seven <class 'str'>
      
      # 索引
      # 使用下标索引s = "hello"
      print(s[1], s[-1])  # 第二个元素和最后一个元素 e o
      
      # 长度
      # 使用len()s = "hello"
      print(s, len(s)) # hello 5
      
      # 成员s = "hello"
      print('1' in s)     # 1 不是 s 的成员    False
      print('1' not in s) # 1 不是 s 的成员    True
      print('o' in s)     # o 是 s 的成员      True
      
      # 遍历
      # 直接遍历字符
      #特点:最简洁,最基础s = "hello"
      for char in s:
          print(char, end='') # hello
      print()
      
      # 通过索引遍历
      # 手动控制索引和步长,灵活度高
      for i in range(len(s)):
          print(s[i], end='') # hello
      print()
      
      # 使用 enumerate () 遍历
      # 推荐!索引 + 字符一键获取
      for i, char in enumerate(s):
          print(i, char, end='|')  # 0 h|1 e|2 l|3 l|4 o|
      print()
      
      # 切片
      # 获取子串s = "hello"
      print(s[1:3])   # 取[1,3)的字符 el
      print(s[:2])    # 取[0,2)的字符 he
      print(s[2:])    # 取[2,4]的字符 llo
      print(s[::2])   # 隔2位取所有字符 hlo
      print(s[-4:-2]) # 取[-4,-2)的字符 el
      print(s[::-1])  # 反向取所有字符 olleh
      
      # 拼接和重复s = "hello"s1 = ',feng!'
      print(s+s1)     # 拼接 hello,feng!
      print(s*2)      # 重复 hellohello
      
      # 判断操作
      print("hello".isupper(), "HELLO".isupper()) # 判断全为大写      False True
      print("HELLO".islower(), "hello".islower()) # 判断全为小写      False True
      print("HE12O".isalpha(), "hello".isalpha()) # 判断全为字母      False True
      print("hello".isdigit(), "12345".isdigit()) # 判断全为数字      False True
      print("HELLO".isspace(), " ".isspace())     # 判断为空格字符串   False True
      print("he_lo".isalnum(), "HE12O".isalnum()) # 判断全为字母或数字 False True
      print("hello".istitle(), "Hello".istitle()) # 判断首字母大写    False True
      print("hello".startswith("ll"), "HELLO".startswith("HE")) # 判断前缀    False True
      print("hello".endswith("ll"), "HELLO".endswith("LO")) # 判断后缀        False True
      
      # 转换操作
      print("hello".upper(), "H12LO".upper()) # 转为大写  HELLO H12LO
      print("HELLO".lower(), "hELlo".lower()) # 转为小写  hello hello
      print(int("+12343323"), int("-15324"))  # 转为整数  12343323 -15324
      print(float("3.141592"),float("-12.3")) # 转为浮点数 3.141592 -12.3
      print("HELLO".title(), "heLLo".title()) # 首字母大写 Hello Hello
      print("hLo".swapcase(), "HL12O".swapcase()) # 大小写反转 HlO hl12o
      
      
      # 对齐操作s = "hello"
      print(s.center(10)) # 居中对齐 "  hello   "
      print(s.ljust(10))  # 左对齐   "hello     "
      print(s.rjust(10))  # 右对齐   "     hello"
      print(s.zfill(10))  # 靠右补0  "00000hello"
      
      # 拆分操作
      #  split() : 拆分s = "hello    seven world"
      print(s.split())        # 默认使用空格拆分,多空格合并 ['hello', 'seven', 'world']
      print(s.split(' '))     # 指定使用空格拆分, 多空格不合并 ['hello', '', '', '', 'seven', 'world']
      print(s.split('lo'))    # 指定使用”lo"拆分 ['hel', '    seven world']
      print(s.split('123'))   # 指定使用”123"拆分,未找到,不分割 ['hello    seven world']
      
      print(s.rsplit(maxsplit=1)) # 从右开始按空格拆分1次, ['hello    seven', 'world']
      
      # splitlines(): 按行拆分s ='''hello  
      seven
      world'''
      print(s.splitlines())   # 按行拆分,多空格不合并 ['hello  ', 'seven', 'world']
      print(s.split('\n'))    # 按行拆分,多空格不合并 ['hello  ', 'seven', 'world']
      
      # 合并: join : 会得到字符串类型
      # join 将列表中的字符串拼接s = ['hello', 'world', 'seven']
      print('\n'.join(s)) # 以换行符合并字符串 hello\nworld\nseven
      print('\t'.join(s)) # 以制表符合并字符串 hello    world    seven
      print(''.join(s))   # 直接合并字符串 helloworldseven
      
      
      # 查找和替换
      # count(): 统计字符出现个数s = "hello hello"
      print(s.count('l'))     # 'l' 出现次数 4
      print(s.count('e'))     # 'e' 出现次数 2
      print(s.count('ll'))    # 'll' 出现次数 2
      print(s.count('e', 5, 10) ) # [5, 10)中'e'出现次数   1
      
      # find()/rfind(): 查找指定子串第一次出现的下标位置,如果不存在则返回-1s = "124 hello world hello 1234"
      print(s.find('hello'))  # 4
      print(s.rfind('l'))     # 从右向左查找 19
      print(s.rfind('x'))     # 不存在 -1
      
      # index(): 查找子串首次出现的索引,找不到报错(区别于 find)s = "124 hello world hello 1234"
      print(s.index('hello'))  # 4
      
      # 替换: replace() : 默认替换所有匹配的字符s = 'hello world seven'
      print(s.replace('l', 'm'))  # 将’l‘替换成'm'        hemmo wormd seven
      print(s.replace('l', 'nn')) # 将’l‘替换成'nn'       hennnno wornnd seven
      print(s.replace('x', '2'))  # 将’x‘替换成'2',未找到  hello world seven
      
      # strip() : 去除两边的指定字符(默认去除空格) (了解)s = ' --hello   feng--   seven--  '
      print(s.strip())        # 去掉两边空格    "--hello   feng--   seven--"
      print(s.strip(' -'))    # 去掉两边空格和- "hello   feng--   seven"
      print(s.lstrip())       # 去掉左边空格    "--hello   feng--   seven--  "
      print(s.rstrip())       # 去掉右边空格    " --hello   feng--   seven--"
      
      # 编码解码
      #  编码: encode() 将 字符串 => 二进制
      #  解码: decode() 将 二进制 => 字符串s = "hello 你好"b = s.encode("utf-8")  # 编码,使用“utf-8”  b'hello \xe4\xbd\xa0\xe5\xa5\xbd'b1 = s.encode("gbk")   # 编码,使用“gbk”    b'hello \xc4\xe3\xba\xc3'
      print(b)
      print(b1)x = b.decode("utf-8")  # 解码,使用“utf-8”  hello 你好x1 = b1.decode("gbk")  # 解码,使用“gbk”    hello 你好
      print(x)
      print(x1)
      
      # ###################### 列表 ###################### #
      # 列表 list[]
      # 索引:获取单个字符
      # 正向索引从0开始,反向索引从-1开始
      # 支持直接修改索引对应元素(可变特性)lst = [10, "Python", 3.14, [1,2]]
      print(lst[1], lst[-1])   # 索引取值 Python [1, 2]lst[0] = 100    # 直接修改元素
      print(lst)      # [100, 'Python', 3.14, [1,2]]
      
      # 长度 len()lst = [10, "Python", 3.14, [1,2]]
      print(len(lst), lst)   # 获取列表长度 4 [10, 'Python', 3.14, [1, 2]]
      
      # 成员 in/not inlst = [10, "Python", 3.14, [1,2]]
      print(10 in lst)        # 10 是 lst 的成员       True
      print(10 not in lst)    # 10 是 lst 的成员       False
      print('Python' in lst)  # 'Python' 是 lst 的成员 True
      
      # 遍历
      # 直接遍历
      # 特点:最简洁,最基础lst = [10, "Python", 3.14, [1,2]]
      for l in lst:
          print(l, end=' ')       # 10 Python 3.14 [1, 2]
      print()
      
      # 通过索引遍历
      # 手动控制索引和步长,灵活度高
      for i in range(len(lst)):
          print(lst[i], end=' ')  # 10 Python 3.14 [1, 2]
      print()
      
      # 使用 enumerate () 遍历
      # 推荐!索引 + 字符一键获取
      for i, l in enumerate(lst):
          print(i, l, end='|')  # 0 10|1 Python|2 3.14|3 [1, 2]|
      print()
      
      # 切片lst = [1, 2, 3, 4, 5, 6]
      print(lst[1:5])     # 取[1,5)的元素     [2,3,4,5]
      print(lst[:2])      # 取[0,2)的元素     [1, 2]
      print(lst[::-1])    # 反向切片:反转列表  [6,5,4,3,2,1]lst[2:4] = [30,40]  # 切片批量修改 修改元素2、3的值
      print(lst)          # [1,2,30,40,5,6]lst[2:4] = []       # 切片删除元素(赋值为空列表)
      print(lst)          # [1,2,5,6]
      
      # 拼接与重复 + * +=lst1 = [1,2,3]lst2 = [4,5,6]
      print(lst1 + lst2)     # 拼接(生成新列表) [1,2,3,4,5,6]
      print(lst1 * 2)        # 重复 [1,2,3,1,2,3]lst1 += lst2           # 原地拼接(修改原列表)
      print(lst1)            # [1,2,3,4,5,6]
      
      # 增加元素
      # append()lst = [1,2,3]lst.append(4)       # append:末尾加单个元素
      print(lst)          # [1,2,3,4]lst.append([5,6])   # 注意:append会把列表作为单个元素添加
      print(lst)          # [1,2,3,4,[5,6]]
      
      # extend()lst = [1,2,3]lst.extend([4,5])   # extend:批量添加(拆分可迭代对象)
      print(lst)          # [1,2,3,4,5]lst.extend("67")    # 字符串会拆分为单个字符
      print(lst)          # [1,2,3,4,5,'6','7']
      
      # insert:指定位置插入lst = [1,2,3]lst.insert(1, 10)  # 索引1位置插入10
      print(lst)          # [1,10,2,3]
      
      # 删除lst = [1,2,3,2,4]lst.remove(2)    # remove:删除第一个匹配的2
      print(lst)       # [1,3,2,4]
      # lst.remove(5)  # # 报错:ValueError: list.remove(x): x not in list
      
      # pop()deleted = lst.pop(1)    # pop:删除索引1的元素,返回3
      print(lst, deleted)     # [1,2,4] 3lst.pop()               # 默认删除最后一个元素
      print(lst)              # [1,2]
      
      # dellst = [1,2,3]
      del lst[0]              # del:删除索引0的元素
      print(lst)              # [2,3]
      del lst[1:]             # 删除切片(索引1到末尾)
      print(lst)              # [2]
      
      # clear:清空列表lst = [1,2,3,4]lst[:2] = []            # 批量删除前两个
      print(lst)              # [3, 4]lst.clear()             # clear:清空列表
      print(lst)              # []
      
      # 查询操作lst = [1,2,3,2,4,2]
      print(lst.count(2))  # count:统计2出现的次数 3
      
      print(lst.index(3))  # index:查找3的索引 2
      # 查找2在索引2到5范围内首次出现的索引
      print(lst.index(2, 2, 5))  # 3
      
      # in:判断元素是否存在
      print(4 in lst)  # True
      print(5 in lst)  # False
      
      # 排序操作lst = [3,1,4,2,5]lst.sort()  # sort:原地升序排序
      print(lst)  # [1, 2, 3, 4, 5]lst.sort(reverse=True)  # sort:原地降序排序
      print(lst)  # [5, 4, 3, 2, 1]
      
      # sorted:生成新列表,原列表不变lst = [3,1,4,2,5]new_lst = sorted(lst)
      print(lst, new_lst)  # [3, 1, 4, 2, 5] [1, 2, 3, 4, 5]
      
      # reverse:原地反转lst.reverse()
      print(lst)           # [5, 2, 4, 1, 3]
      
      # sorted:生成新列表,原列表不变new_lst = list(reversed(lst))
      print(lst, new_lst)  # [5, 2, 4, 1, 3] [3, 1, 4, 2, 5]
      # 切片反转(生成新列表,原列表不变)
      print(lst[::-1])     # [3, 1, 4, 2, 5]
      
      # copy:浅拷贝lst1 = [1,2,3]lst2 = lst1.copy()  # 新列表lst2[0] = 100
      print(lst1, lst2)   # [1, 2, 3] [100, 2, 3]
      
      # 安全查找元素索引lst = [1,2,3]target = 4
      if target in lst:
          print(lst.index(target))
      else:
          print(f"{target} 不存在")  # 4 不存在
      
      # # 列表推导式:用一行代码快速生成新列表
      # i 表示列表元素取值,for表示i推导公式 if做筛选
      print([i  for i in range(1, 6)])    # [1, 2, 3, 4, 5]
      print([i*2 for i in range(1, 6)])   # [2, 4, 6, 8, 10]
      print([i  for i in range(1, 10) if i%2])  # 奇数列表 [1, 3, 5, 7, 9]
      print([i  for i in range(1, 10) if i%2 and i%3==0]) # [3, 9]
      print([i  for i in range(1, 10) if i%2 if i%3==0])  # [3, 9]
      
      # ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
      print([i+j  for i in "ABC" for j in "123"])  # 循环嵌套
      
      # ###################### 元组 ###################### #
      # 创建元组t1 = (1, 2, "Python", [3,4])  # 包含可变元素(列表)t2 = (5)   # 括号当做运算符处理,所以 t2 为整数t3 = (5,)  # 单个元素必须加逗号,否则视为普通括号
      print(t1, type(t1)) # (1, 2, 'Python', [3, 4]) <class 'tuple'>
      print(t2, type(t2)) # 5 <class 'int'>
      print(t3, type(t3)) # (5,) <class 'tuple'>
      
      print(len(t1), t1)  # len获取长度 4 (1, 2, 'Python', [3, 4])
      
      # 索引/切片(仅取值,不可修改)
      print(t1[2], t1[1:3])       # Python    (2, 'Python')
      # t1[0] = 100  # 报错:TypeError(不可变)t1[3][0] = 30       # 但元组内的可变元素可修改
      print(t1)          # (1, 2, 'Python', [30, 4])
      
      # 拼接/重复(生成新元组)t4 = (1,2) + (3,4)
      print(t4)          # (1, 2, 3, 4)
      print(t4 * 2)      # (1, 2, 3, 4, 1, 2, 3, 4)
      
      # 成员列表 in/not int1 = (1, 2, "Python", [3,4])  # 包含可变元素(列表)
      print(1 in t1)  # True
      print(5 in t1)  # False
      
      # 遍历同列表
      # 直接遍历t1 = (1, 2, "Python", [3,4])
      for t in t1:
          print(t, end=" ")       # 1 2 Python [3, 4]
      print()
      
      # 通过索引遍历
      # 手动控制索引和步长,灵活度高
      for i in range(len(t1)):
          print(t1[i], end=' ')  # 1 2 Python [3, 4]
      print()
      
      # 使用 enumerate () 遍历
      # t1[0] = 1    t1[1] = 2    t1[2] = Python    t1[3] = [3, 4]
      for i, t in enumerate(t1):
          print(f't1[{i}] = {t}', end="\t")
      print()t = (1, 3, 5, 6, 3, 3)
      print(t.count(3))   # 统计 3 出现的次数  3
      print(t.index(3))   # 元素 3 首次出现的索引  1
      
      print(list(t))      # 转换成列表 [1, 3, 5, 6, 3, 3]t = (1, 3, 5, 6, 3, 3)
      print(sorted(t))    # 先隐形转为列表,再进行排序 [1, 3, 3, 3, 5, 6]a, b, c = (1, 3, 7)
      print(a, b, c)      # 将元组解包 1 3 7_, a = (3, 6)       # _为变量名,有时候我们不想要某个参数,可以用_占位
      print(a)            # 取第 2 个值   6a, _ = (12, 3.6)
      print(a)            # 取第 1 个值   12
      
      # ###################### 集合 ###################### #
      # 定义集合(自动去重)s1 = {1, 2, 2, 3, "apple"}
      print(s1, type(s1)) # {'apple', 1, 2, 3} <class 'set'>s2 = set([1,2,3,3]) # 列表转集合(去重)
      print(s2)           # {1, 2, 3}
      
      # 空集合和空字典s = {}              # 默认空字典
      print(s, type(s))   # {} <class 'dict'>s1 = set()          # 空集合
      print(s1, type(s1)) # set() <class 'set'>s1 = {1, 2, 2, 3, "apple"}
      print("apple" in s1, 2 not in s1)   # True False
      
      # 添加元素s1.add(4)           # 添加单个元素s1.update([5,6])    # 批量添加
      print(s1)           # {1, 2, 3, 4, 5, 6, 'apple'}
      
      # 删除元素s1.remove(2)        # 删除指定元素,不存在报错s1.discard(10)      # 删除指定元素,不存在不报错deleted = s1.pop()  # 随机删除一个元素(无序)
      print(s1, deleted)  # {3, 4, 5, 6, 'apple'} 1s1.clear()          # 清空集合
      print(s1)           # set()
      
      # 集合的操作s1 = {1, 3, 5}s2 = {1, 2 ,4}
      print(s1 & s2)  # 交集 {1}
      print(s1.intersection(s2))  # 交集 {1}
      print(s1 | s2)  # 并集 {1, 2, 3, 4, 5}
      print(s1 - s2)  # 差集 {3, 5}
      print(s1.difference(s2))    # 差集 {3, 5}
      print(s1.symmetric_difference(s2))  # 对称差集 {2, 3, 4, 5}
      print(s1 ^ s2)  # 对称差集,只在一个集合不同时在两个集合的元素 {2, 3, 4, 5}
      print(s1 >= s2) # 包含关系,S1包含S2下为True False
      print({1,4}.issubset(s2)) # 子集 True
      
      # ###################### 字典 ###################### #
      # 定义字典 key:valueuser = dict(name="李四", age=21)  # 关键字参数创建
      print(user, type(user)) # {'name': '李四', 'age': 21}
      
      # 访问值(两种方式)
      print(user["name"])     # 李四(键不存在报错)
      print(user.get("age"))  # 21(推荐,键不存在返回None)
      print(user.get("phone", "13800138000"))  # 不存在返回默认值 13800138000
      
      print(len(user))        # 获取字典长度 2
      
      # 修改/添加键值对user["age"] = 18                # key存在 修改已有键user["phone"] = "13800138000"   # key不存在 添加新键值对
      print(user)     # {'name': '李四', 'age': 18, 'phone': '13800138000'}
      
      # 成员 in/not in
      print("name" in user, "phone" not in user)  # True False
      
      # 删除键值对
      del user["phone"]          # 删除指定键deleted = user.pop("age")  # 删除并返回值
      print(user, deleted)       # {'name': '李四'} 18user.clear()               # 清空字典
      print(user)                # {}
      
      
      # 获取子项user = {"name": "张三", "age": 20}
      print(user.keys())          # 获取所有的key  dict_keys(['name', 'age'])
      print(list(user.keys()))    # ['name', 'age']
      print(user.values())        # 获取所有的value dict_values(['张三', 20])
      print(list(user.values()))  # ['张三', 20]
      print(user.items())         # 获取所有的item  dict_items([('name', '张三'), ('age', 20)])
      print(list(user.items()))   # ['张三', 20]
      
      # 遍历键值对(最常用)
      for k, v in user.items():
          print(f"{k}: {v}", end='\t')    # name: 张三    age: 20
      print()
      
      # 批量更新user.update({"age": 21, "city": "上海"})
      print(user)  # {'name': '张三', 'age': 21, 'city': '上海'}
      
      # 删除user.popitem()  # 删除最后一个键值对(3.7+)
      print(user)     # {'name': '张三', 'age': 21}
      Python嵌入式开发入门指南:从MicroPython到ESP32实战 嵌入式开发长期由C语言主导,但随着物联网与AIoT场景的爆发,Python正以另一种姿态切入这一领域。其核心原理在于通过MicroPython固件将解释器压缩进MCU,或以嵌入式Linux应用层方式运行在更高性能的处理器上,与底层C代码形成互补分工。这种模式的价值在于大幅降低硬件编程门槛,让开发者用熟悉的Python语法快速驱动GPIO、I2C、PWM等外设,加速原型验证与产品迭代。典型应用包括智能家居终端、传感器节点、边缘AI设备、自动化测试工具链等。从ESP32开发板点亮第一颗LED,到树莓派上部署业务 阅读详情

      相关推荐

      Mellanox CX7网卡搭配400G光模块实战:从选型到部署的完整指南

      本文详细解析了Mellanox CX7网卡与400G光模块的选型策略与部署实践,涵盖硬件对比、兼容性验证及性能调优。重点介绍了OSFP光模块的选择要点和常见问题排查方法,帮助用户构建高性能网络基础设施,适用于AI训练、金融交易等场景。

      efc1234567的博客 1289

      《嵌入式AI筑基笔记02:Python数据类型01,从C的“硬核”到Python的“包容”》

      从C到Python,最大的变化不是语法,而是思维,python世界里内存自动管理,数据结构开箱即用,代码行数大幅减少。但自由的背后是规则——理解可变与不可变、有序与无序,才能真正用好Python的数据结构。

      不只会拍照的程序猿 429

      从零开始使用CubeMX配置STM32使用lwip实现httpd服务器以及使用vscode编辑阅读keil代码(三)

      使用stm32搭载lwip实现HTTPd服务器

      qq_30623327的博客 5932

      嵌入式AI筑基:从C语言视角理解Python数据类型

      数据类型是编程语言的核心基础,也是从嵌入式C转向Python开发时首先要跨越的门槛。C语言通过固定字节长度和强类型规则直接管理内存,而Python采用动态类型和对象机制,变量只是对象的引用,支持任意精度整数与自动扩容。理解这种差异,不仅有助于避免类型转换、可变对象引用传递等常见陷阱,还能在嵌入式AI项目中更高效地处理传感器数据、配置模型参数以及设计数据预处理流程。无论是用numpy承载类C数组,还是用list、dict组织业务数据,掌握Python数据类型的设计逻辑,都是连接底层硬件与上层算法的重要能力。本

      weixin_29597551的博客 193

      高效敏感词检测API平台对比与选型指南

      本文为开发者提供了高效敏感词检测API平台的选型指南。文章对比了专业API平台、头部云厂商、新兴AI服务商及开源方案,从检测能力、集成易用性、成本、稳定性及扩展性五大维度进行分析,并给出实战选型建议,帮助团队根据业务场景快速选择最合适的敏感词检测服务。

      weixin_29325955的博客 341

      SimpleFOC STM32实战:基于F103与HAL库,剖析速度环与电流环的协同控制

      本文详细介绍了基于STM32F103与HAL库的SimpleFOC实战应用,重点剖析速度闭环控制与电流环的协同工作原理。通过开发环境搭建、参数调试技巧及性能优化方案,帮助开发者高效实现无刷电机精准控制,适用于机器人、无人机等高精度应用场景。

      weixin_29170327的博客 475

      嵌入式AI筑基:Python数据类型与C语言思维对比

      Python以其动态类型和对象体系颠覆了C语言中“变量即内存容器”的直觉,尤其当嵌入式工程师转向AI开发时,理解int、float、list等类型背后的对象模型、可变与不可变语义以及引用计数的内存管理机制,成为跨越思维门槛的关键。从传感器数据采集到的原始整数,到数据预处理中的字符串清洗与类型转换,再到模型推理前的float32/uint8格式约束,Python数据类型在嵌入式AI全链路中扮演着数据骨架的角色。C语言中数组只能存同类型元素,而Python的list、dict、set能够以更高抽象封装复杂配置与

      weixin_28717807的博客 276

      数据分析——员工离职预测

      员工离职预测一. 题目描述二. 数据说明三. 步骤实现1.导入并查看2.数据探索性分析3.数据处理4.模型分析5.结果分析(1) 可视化的结果分析(2)特征选择结果分析(3)多模型交叉验证结果分析 一. 题目描述 员工是否准备离职是困扰用人单位的问题,其关系到单位业务的开展及新人员的招聘,及时的分析出有离职倾向的员工成为关键的因素。数据主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、是否升职、工资提升比例等)以及员工是否已经离职的对应记录。 二. 数据说明 数据分为训练数据

      weixin_43925467的博客 1万+

      C语言,永远滴神!

      YYDS~

      CodeSheep 2万+

      Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇

      Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇 文章目录Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇前言一、数据库的安装前准备,前提是没有安装过!!!二、仅安装数据库软件(数据库运行环境)三、添加数据库实例四、设置监听程序,让数据库可以通过网络访问五、为目标数据库设置网名总结 前言 如果需要安装包:联系我看到会给你链接,因为现在官网已经不提供10g,11g的安装包了,在网盘保存望悉知(回复不会很及时,下班看到会回复敬请谅解)。 提示:以下

      zhx__的博客 5630

      STM32 FATFS文件系统按行读取SD卡数据

      STM32 SD数据实现按行读取

      qq_32216815的博客 7824

      2025 年,C++ 还能“硬核”多久?

      2025 年,C++ 还能“硬核”多久?编程语言江湖:谁主沉浮?JavaScript 稳坐王座,Python 无处不在TypeScript 和 Rust:新星闪耀C++:低调的“硬核大哥”现代 C++:从“老古董”到“新宠儿”C++ vs 新兴语言:谁更胜一筹?2025 年就业风向:C++ 的“硬核”舞台AI 浪潮下的 C++:硬核助力还是边缘化?2025 年,C++ 还值得学吗?如何“硬核”地学...

      Francis的博客 1859

      【STK】手把手教你利用STK进行导弹和反导仿真04 - STK/MMT模块03 导弹飞行工具应用案例

      飞行设置的工具栏就在附加窗口的中间,首先点击左边的General,修改这个项目的名字。然后在下拉的System中选择导弹的类型,这里我们选择远程。(4)输出数据文件到STK,任务窗口里选择Export Manager项,飞行数据输出到STK。项目可以命名为Test;(1)首先建立新项目,点击Flight菜单中的New Flight选项,见下图。首先看世界地图中间的红圈,是一个导弹形状的图标,这个图标表示的是导弹的发射点。选择下面的Export Manager,依次勾选红框的选项。我们拖动这个导弹的图标,

      weixin_44184852的博客 1630

      【硬核干货】从单片机到AI智能体:嵌入式AI开发实战技巧与趋势深度解读

      嵌入式AI智能体开发:技术趋势与实战指南 随着大语言模型(LLM)和边缘计算的兴起,嵌入式开发正从传统的硬件驱动转向构建具备感知与决策能力的智能体。嵌入式AI智能体凭借低延迟(端侧推理<10ms)、数据隐私(端侧处理)、低功耗(mW级)和成本优势(端云协同),成为物联网和智能硬件的关键技术。 核心开发技术包括: TinyML部署:通过模型量化(如INT8)和内存优化,将AI模型压缩至KB级MCU(如STM32/ESP32)。 MCP协议:实现LLM与硬件的双向交互,自动完成代码生成、编译烧录等流程,提

      weixin_59226965的博客 383

      SAP B1中文培訓教材_SDK

      公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

      汉书HE8,好用的汇编代码编写工具

      汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

      Python嵌入式开发实战:从MicroPython到嵌入式Linux的选型与避坑指南

      Python能否用于嵌入式开发?答案是分层而论的。从MCU裸机、RTOS到嵌入式Linux,Python在不同硬件层级中扮演的角色与资源门槛差异显著。理解解释器内存管理、实时性与GC机制,是评估其技术价值的前提。Python凭借开发效率高、AI辅助友好等优势,已在边缘计算、IoT数据采集、设备授权管理等场景中得到广泛应用。本文从硬件选型图谱出发,结合ESP32、RK3588等典型平台,梳理从固件烧录到业务部署的完整路径,并剖析内存碎片、驱动生态等实践陷阱,为你厘清Python与C的职责边界,找到最适合的混合

      weixin_34111790的博客 388

      蓝牙模块HM-10手册

      蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

      嵌入式物联网工程课:Linux+C+C+++MQTT+边缘AI实战

      嵌入式系统是软硬协同的底层技术体系,其核心在于Linux操作系统调度、C语言内存精准操控、C++面向对象设备管理、物联网协议栈贯通(尤其是MQTT与Modbus)、以及轻量级人工智能在边缘侧的落地部署。这些能力共同构成工业现场‘能调通、能上线、能运维’的工程闭环。掌握Linux终端操作、GPIO寄存器映射、串口协议解析、MQTT QoS分级应用及TensorFlow Lite模型量化部署,是成为合格嵌入式物联网工程师的关键路径。本文聚焦真实产线级项目——智能仓储环境监测系统,详解从传感器驱动开发到云端安全对

      weixin_34221276的博客 338

      IDEA的使用指南

      IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

      嵌入式开发者看Python:从C语言视角理解数据类型体系

      数据类型是编程语言的核心基础,C语言以静态类型和精确内存控制著称,而Python则通过动态类型和对象引用机制提供了极大的灵活性,二者在原理和工程实践上差异显著。理解Python的动态类型、整数与浮点表示、字符串与字节串、可变与不可变对象等概念,是嵌入式AI工程师高效编写数据处理、模型推理和上位机脚本的关键。在大模型与边缘计算融合的趋势下,Python负责数据准备与算法验证,C/C++负责实时推理与资源受限场景的落地,跨语言协作已成为常态。掌握Python数据类型不仅有助于规避0.1+0.2精度丢失、默认参数

      weixin_31236101的博客 234

      先学C语言还是Python?零基础最正确选择

      这是所有人学计算机的第一道纠结题。我不说模棱两可的话,直接按你的目标、基础、未来出路给出精准结论,彻底终结纠结。先给核心定论:想就业赚钱、快速入行、零基础自学

      qq_25196865的博客 178

      【AI工具深度横评】嵌入式工程师 × 技术自媒体:2026年八大AI助手全景指南!

      本文为嵌入式开发工程师和技术自媒体创作者精选了多款AI工具,针对不同场景提供高效解决方案。Gemini适合硬件开发和文档解析,Claude擅长技术写作和项目复盘,ChatGPT在创意运营和快速问答上表现突出。国产工具如DeepSeek、豆包和通义千问针对中文用户优化,分别适用于代码辅助、内容润色和阿里云项目开发。Perplexity AI和Notion AI则分别专注于实时调研和知识管理。文章还提供了场景速查表,帮助读者快速匹配最佳工具。随着AI技术发展,建议工程师根据具体需求组合使用不同工具,而非依赖单一

      "謓泽"正在路上朝着"攻城狮"方向"前进四"! 2197

      嵌入式Linux+C语言进阶:从系统编程到驱动开发的硬核实战指南

      在嵌入式系统开发领域,Linux操作系统与C语言构成了核心的技术基石。其原理在于,C语言凭借其直接操作硬件和内存的能力,为系统级编程提供了高效且可控的底层接口;而Linux内核则提供了强大的进程管理、内存管理、文件系统和设备驱动框架。这一组合的技术价值在于能够构建出稳定、高效且资源可控的嵌入式产品,广泛应用于智能硬件、工业控制、汽车电子等对实时性和可靠性要求极高的场景。要掌握这项硬核技能,开发者必须跨越从应用层到底层驱动的鸿沟,深入理解交叉编译、内核移植、驱动开发及多线程编程等关键技术。本指南聚焦于嵌入式L

      weixin_33847182的博客 318

      Nano Banana嵌入式开发7个硬核调试技巧

      单板计算机(SBC)是嵌入式系统与边缘AI开发的核心载体,其启动调试、外设驱动、电源管理及硬件加速等环节常因芯片级细节缺失而卡点频发。全志H616平台凭借ARM Cortex-A53架构与Mali-G31 GPU,在低功耗(<5W)下实现接近树莓派4B的性能密度,但官方文档对串口线序、eMMC启动链、Wi-Fi 6信道策略、GPIO时钟门控等底层机制覆盖严重不足。本文聚焦真实工程断点,从物理层串口自救、存储启动修复、射频信道解锁,到OS级外设时钟使能、HDMI CEC直通、Docker热迁移,最终延伸至Op

      weixin_30621959的博客 630

      打破编程“鄙视链”:探寻编程语言背后的真相

      在 “鄙视链” 的阴霾笼罩下,技术创新的脚步正面临重重羁绊。许多程序员受困于熟悉语言的舒适区,对新兴语言或跨领域技术嗤之以鼻。就拿机器学习领域来说,Python 凭借其丰富的库(如 TensorFlow、PyTorch)已然成为主流选择,不少开发者因此对其他潜在的新兴语言工具视而不见。然而,像 Julia 语言,专为科学计算与数值分析设计,在某些复杂算法的处理效率上远超 Python,其简洁高效的语法、对并行计算的原生支持,本可为机器学习带来全新突破,却因 “鄙视链” 作祟,难以在更广泛的范围内得到尝试与应

      宝码香车的博客 1696

      嵌入式工程师的边缘AI实战:Jetson与Rockchip硬核落地指南

      边缘AI是将人工智能模型部署到终端设备(如摄像头、传感器、工业网关)的关键技术,其核心在于硬件适配、轻量推理与实时系统协同。它依赖TensorRT、RKNN等AI加速框架,更深度耦合Linux内核驱动、Yocto构建系统与设备树配置。技术价值体现在低延迟响应、数据本地化处理与离线可靠性,广泛应用于智能质检、AGV导航、电力巡检等严苛工业场景。本文聚焦嵌入式工程师如何跨越‘能跑通’到‘能量产’的鸿沟,结合Jetson与Rockchip平台真实工程经验,详解Runtime重构、硬件选型权衡、Yocto定制及量产

      weixin_29168675的博客 216

      从C到C++再到Python?编程语言学习顺序之争,这篇说透了

      刚入门编程的朋友,几乎都会被一个问题困住:C、C++、Python这三种热门语言,到底该按啥顺序学?今天用大白话拆解清楚,看完保准不纠结。

      2403_88350010的博客 351

      机器人嵌入式四大硬核缺口:电机控制/RTOS/边缘AI/系统集成

      嵌入式系统是机器人实时性与可靠性的底层基石,其核心在于硬件驱动、确定性调度、低功耗AI部署与跨层故障诊断的深度协同。从裸机寄存器操作到RTOS微秒级调度,从INT8模型量化部署到EMC级信号完整性分析,技术价值体现在对物理层约束(如PWM抖动±1.2ns、中断延迟≤3.8μs)的精准掌控。典型应用场景覆盖工业协作臂运动控制、AGV多任务硬实时调度、巡检机器人宽温边缘推理及量产设备批量故障归因。本文聚焦2026年机器人产业真实需求,拆解电机驱动、实时操作系统、低功耗边缘AI和系统集成四类高壁垒能力——它们共同

      weixin_34310369的博客 318
      上一篇: 《嵌入式AI筑基笔记01:Python语法,一个C视角的翻译》
      下一篇: 《嵌入式AI筑基笔记03:Python流程控制,从C的严谨到Python的简洁》
      评论
      成就一亿技术人!
      拼手气红包6.0元
      还能输入1000个字符
       
       条评论被折叠 查看
      添加红包

      请填写红包祝福语或标题

      个

      红包个数最小为10个

      元

      红包金额最低5元

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

      打赏作者

      不只会拍照的程序猿

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

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

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

      打赏作者

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

      抵扣说明:

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

      余额充值