尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python列表高频方法全解析:从append到列表推导式实战指南
从入门到实战聊聊Python列表List那些高频方法Python的列表List是我日常写脚本、做数据处理时用得最多的内置数据结构没有之一。不管你是刚开始学Python还是已经写了一段时间但总感觉对列表的掌握还差点意思这篇内容应该都能帮到你。我尽量不绕弯子直接讲清楚列表常用方法的用法、底层逻辑和最容易踩的坑同时结合平时处理数据、写爬虫、做量化策略时的真实场景来展开保证你看完能直接用起来。列表这个数据结构说白了就是一个有序的、可以随时增删改查的容器元素类型可以混着放比如整数、字符串、甚至嵌套另一个列表。这种灵活性让它成了Python里最“万能”的存储方式之一但也正因为太灵活很多人在使用方法时容易忽略细节比如append和extend的区别、切片复制和copy()的区别、sort和sorted的返回值陷阱这些坑我早年都踩过后面会一一拆开讲。这篇文章适合的读者很明确刚学完基础语法想进阶的人、工作中需要频繁操作列表但经常查文档的人、以及准备面试想系统梳理列表常用方法的人。我会按“创建 - 增删改查 - 排序复制 - 推导式 - 实战案例 - 常见问题排查”这条线来讲每个方法都有示例代码和说明属于那种可以一边看一边抄作业的教程。1. 列表基础操作创建、索引与切片1.1 创建列表的几种方式和常见误区Python创建列表的方式很直白最常见的就是用方括号# 创建空列表 empty_list [] # 创建带初始值的列表 fruits [apple, banana, cherry] # 用 list() 构造函数 numbers list((1, 2, 3)) # 字符串转列表 chars list(hello) print(chars) # [h, e, l, l, o]这里有一个很容易被忽略的点list(hello)会把字符串拆成一个个字符。如果你想把字符串按单词切分应该用split()而不是list()。很多刚开始写代码的朋友在这里栽过跟头拿着list(hello world)想要[hello, world]结果得到了一堆单独字符然后一脸懵。还有一个创建列表的经典坑就是用乘法复制嵌套列表# 看起来像是在创建二维列表 matrix [[0] * 3] * 3 print(matrix) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]] # 修改一个元素 matrix[0][0] 1 print(matrix) # [[1, 0, 0], [1, 0, 0], [1, 0, 0]]看到了吗我只改了一行结果三行全变了。原因在于[[0] * 3] * 3先把[0, 0, 0]这个列表创建了一份然后乘3次只是复制了“引用”也就是说三个子列表其实指向的是同一个内存对象。正确的做法是用列表推导式matrix [[0] * 3 for _ in range(3)]这里也顺带引出一个基础概念Python变量名存的是对象的引用而不是对象本身。理解了这一点后面讲浅拷贝、深拷贝就会轻松很多。1.2 索引和切片不只是简单的取元素列表的索引从0开始支持正数索引和负数索引。负数索引从-1开始对应最后一个元素。这一点很好记list[-1]永远是最后一个元素list[-2]是倒数第二个。nums [10, 20, 30, 40, 50] print(nums[0]) # 10 print(nums[-1]) # 50 print(nums[-3]) # 30切片是列表操作里最灵活、也最有意思的部分语法是list[start:stop:step]。注意切片是“左闭右开”也就是包含start对应的元素但不包含stop对应的元素。这一点必须刻在脑子里不然写切片时总是差一个元素。nums [10, 20, 30, 40, 50] # 取前三个 print(nums[:3]) # [10, 20, 30] # 取后两个 print(nums[-2:]) # [40, 50] # 隔一个取一个 print(nums[::2]) # [10, 30, 50] # 反转列表的切片写法 print(nums[::-1]) # [50, 40, 30, 20, 10]切片还有一个隐藏能力可以赋值用来替换或插入元素。nums [10, 20, 30, 40, 50] nums[1:3] [99, 98, 97] print(nums) # [10, 99, 98, 97, 40, 50]这里要补充一下切片返回的是一个新的列表浅拷贝所以用切片复制列表在某种程度上是安全的。但它只是浅拷贝如果列表内部还有嵌套列表那嵌套列表依然共享引用这一点后面在讲到复制陷阱时还会再强调。2. 列表的增删改查高频方法逐个拆解2.1 增加元素append、extend、insert的区别列表增加元素的方法有append、extend、insert三个很多人搞不清前两个的区别其实一句话就能说透append把参数当作“一个整体”添加到末尾extend把参数“拆开”逐个添加到末尾。a [1, 2, 3] a.append([4, 5]) print(a) # [1, 2, 3, [4, 5]] b [1, 2, 3] b.extend([4, 5]) print(b) # [1, 2, 3, 4, 5]append可以添加任何类型的对象包括列表、字典、元组。extend通常用于添加可迭代对象比如列表、元组、字符串、集合。如果extend一个字符串它会按字符拆分c [1, 2] c.extend(ab) print(c) # [1, 2, a, b]insert有两个参数第一个是插入位置第二个是插入元素d [1, 2, 3] d.insert(1, x) print(d) # [1, x, 2, 3]我的实操经验是insert在列表头部插入元素时效率比较低因为涉及到所有元素的移位。如果需要频繁从头部插入优先考虑collections.deque它的appendleft是 O(1) 的。这个细节在数据量小的时候无所谓但处理几万条以上数据时就会明显感觉到差别。2.2 删除元素remove、pop、del、clear各有用处remove按值删除第一个匹配的元素如果值不存在会抛出ValueErrornums [1, 2, 3, 2, 4] nums.remove(2) print(nums) # [1, 3, 2, 4]注意remove只删除第一个匹配的2后面的2还留着。如果要删除所有匹配元素可以用循环或列表推导式。pop按索引删除并返回被删除的元素如果不传索引默认删除最后一个nums [1, 2, 3] last nums.pop() print(last) # 3 print(nums) # [1, 2] first nums.pop(0) print(first) # 1pop(0)和remove一样时间复杂度是 O(n)因为删除后所有后续元素都要往前移动。如果频繁删除头部元素同样建议用deque。del是Python的通用删除语句可以按索引删除、按切片删除甚至直接删除整个列表nums [1, 2, 3, 4, 5] del nums[0] print(nums) # [2, 3, 4, 5] del nums[1:3] print(nums) # [2, 5] del nums # 整个列表被删除clear方法更简单直接清空列表所有元素但列表对象本身还在nums [1, 2, 3] nums.clear() print(nums) # []2.3 查找与计数index、count、in 的组合用法index返回元素第一次出现的索引如果元素不存在会抛ValueError。所以用的时候最好先判断或者捕获异常这一点实际写代码时很关键nums [10, 20, 30, 20, 40] nums.index(20) # 1 nums.index(20, 2) # 从索引2开始找结果是3 # 安全写法 if 20 in nums: print(nums.index(20))count统计元素出现的次数nums [1, 2, 2, 3, 2] print(nums.count(2)) # 3in和not in用来判断元素是否存在。很多人会忽略的一点是列表的in判断是线性扫描时间复杂度 O(n)。如果数据量很大且需要频繁做存在性判断最好把列表转成集合再判断集合的in是 O(1)。我处理去重类需求时经常这么做效果立竿见影。3. 排序与反转sort、sorted、reverse的细节和陷阱3.1 sort方法和sorted函数到底怎么选这是我在面试别人时特别喜欢问的一个点也是实际工作中很容易用混的地方。简单来说list.sort()是列表的方法原地排序不返回新列表返回None。sorted(iterable)是内置函数排序后返回新列表原列表不变。nums [3, 1, 2] nums.sort() print(nums) # [1, 2, 3]原列表被修改nums [3, 1, 2] new_nums sorted(nums) print(nums) # [3, 1, 2]原列表不变 print(new_nums) # [1, 2, 3]返回新列表很多新手在这里写了nums nums.sort()然后发现nums变成了None这就是没记住sort是原地操作、返回None导致的。反过来如果写nums sorted(nums)那就没问题因为sorted返回了新列表。两个方法都支持key参数用来指定排序依据这是最常用的高级用法words [banana, apple, cherry, date] words.sort(keylen) print(words) # [date, apple, banana, cherry]按长度排序key还可以配合lambda、函数、甚至内置方法比如按字符串最后一个字母排序words [banana, apple, cherry] words.sort(keylambda s: s[-1]) print(words) # [banana, apple, cherry]3.2 复杂对象排序用key参数实现按字典、按元组元素排序key参数最大的价值在于能对复杂数据排序。假设你有一个包含字典的列表每个字典代表一个商品包含名称和价格想按价格从低到高排序products [ {name: apple, price: 5}, {name: banana, price: 3}, {name: cherry, price: 8}, ] products.sort(keylambda p: p[price]) print(products) # [{name: banana, price: 3}, {name: apple, price: 5}, {name: cherry, price: 8}]这个写法的效率很高因为key函数只会对每个元素调用一次然后Python基于这些 key 值做排序。类似地如果你有一个元组列表想按元组的第二个元素排序pairs [(b, 2), (a, 3), (c, 1)] pairs.sort(keylambda x: x[1]) print(pairs) # [(c, 1), (b, 2), (a, 3)]还有一种更取巧的写法利用operator.itemgetter性能和可读性都不错from operator import itemgetter pairs.sort(keyitemgetter(1))itemgetter比lambda快一些尤其在数据量大的时候更明显。它还可以接收多个参数实现先按第一个字段排、再按第二个字段排的效果。3.3 reverse和反转的两种方式reverse()是原地反转返回None注意和[::-1]的区别[::-1]是生成一个新列表原列表不变。nums [1, 2, 3] nums.reverse() print(nums) # [3, 2, 1]配合sort反向排序可以直接用reverseTrue参数而不是排序后再reverse效率上更优nums [3, 1, 2] nums.sort(reverseTrue) print(nums) # [3, 2, 1]4. 列表推导式与遍历技巧少写循环的写法4.1 列表推导式的基本语法和进阶写法列表推导式是Python里我最喜欢的一个特性没有之一。它用一行代码代替多行循环既能生成新列表也能做筛选和变换。基本语法是[表达式 for 变量 in 可迭代对象 if 条件]。最简单的例子生成1到10的平方squares [x ** 2 for x in range(1, 11)] print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]筛选偶数evens [x for x in range(1, 11) if x % 2 0] print(evens) # [2, 4, 6, 8, 10]嵌套循环也可以用推导式实现。比如生成一个坐标点列表points [(x, y) for x in range(3) for y in range(3)] print(points) # [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]一般经验是如果推导式嵌套超过两层可读性会明显下降这时候老老实实写循环反而更好维护。技术是为了做事不是为了炫技。4.2 列表推导式与map、filter的对比Python内置了map和filter它们也可以用来对列表做变换和筛选但在大部分场景下列表推导式是更直观的选择。对比例子nums [1, 2, 3, 4] # 用 map squares_map list(map(lambda x: x ** 2, nums)) # 用列表推导式 squares_comp [x ** 2 for x in nums]map生成的是迭代器对象所以要用list()转成列表。map的优点是延迟计算处理超大集合时节省内存但如果你只是构建一个小列表直接用推导式更清晰。filter的用法和map类似nums [1, 2, 3, 4] # 用 filter evens_filter list(filter(lambda x: x % 2 0, nums)) # 用列表推导式 evens_comp [x for x in nums if x % 2 0]结论是map和filter在配合函数式编程风格时有用但日常开发用列表推导式就够了。我个人的习惯是除非性能测试明确说明map和filter有优势否则一律用推导式代码的可读性决定了后期的维护成本。4.3 enumerate和zip遍历时同时拿索引和多个列表enumerate是我遍历列表时最常用的函数它可以同时返回索引和元素避免手动维护一个计数变量fruits [apple, banana, cherry] for index, fruit in enumerate(fruits): print(index, fruit) # 0 apple # 1 banana # 2 cherryenumerate还支持第二个参数定义起始索引for index, fruit in enumerate(fruits, start1): print(index, fruit) # 1 apple # 2 banana # 3 cherryzip用于同时遍历多个列表把对应位置的元素打包成元组names [Alice, Bob, Charlie] scores [85, 92, 78] for name, score in zip(names, scores): print(f{name}: {score}) # Alice: 85 # Bob: 92 # Charlie: 78zip在数据对齐时非常高效。注意如果两个列表长度不一致zip默认以短的为准。如果想以长的为准并用默认值填充需要用到itertools.zip_longest这个在数据分析场景中偶尔会用到。4.4 遍历时能不能修改列表这是经典陷阱在遍历列表的同时删除元素会导致索引错位漏掉一些元素。nums [1, 2, 3, 4, 5] for num in nums: if num % 2 0: nums.remove(num) print(nums) # [1, 3, 5]看似结果正确但如果换个例子就会出问题nums [2, 4, 5, 6] for num in nums: if num % 2 0: nums.remove(num) print(nums) # [4, 5]为什么会漏掉4因为删除2后4往前移了一位循环内部索引自动加1导致4被跳过了。这是面试题里非常经典的一个坑。正确的做法是遍历列表的副本或者用列表推导式直接生成新列表nums [2, 4, 5, 6] nums [num for num in nums if num % 2 ! 0] print(nums) # [5]还有一个笨但可靠的方法是倒序遍历nums [2, 4, 5, 6] for i in range(len(nums) - 1, -1, -1): if nums[i] % 2 0: nums.pop(i) print(nums) # [5]倒序删除不会影响前面元素的索引所以不会漏元素。我个人最推荐列表推导式因为它简洁、快、不易出错。5. 复制与浅拷贝深拷贝copy方法背后的内存逻辑5.1 直接赋值、切片复制、copy() 的区别在Python里list2 list1并不是复制列表而是让list2和list1指向同一个列表对象。修改任何一个另一个也会变a [1, 2, 3] b a b.append(4) print(a) # [1, 2, 3, 4] a也变了如果你只想复制内容而不是共享引用有三种常见方式a [1, 2, 3] # 方式1切片 b a[:] # 方式2copy方法 c a.copy() # 方式3list构造函数 d list(a) b.append(4) print(a) # [1, 2, 3] a不变 print(b) # [1, 2, 3, 4]这三种都是浅拷贝对于一层列表来说够用了。但列表里如果还有嵌套列表浅拷贝只会复制外层列表内层列表还是共享同一个对象。a [[1, 2], [3, 4]] b a.copy() b[0][0] 99 print(a) # [[99, 2], [3, 4]] a的内部列表也被改了5.2 什么时候必须用copy模块的deepcopy如果列表是多层嵌套且需要完全独立复制必须用copy.deepcopy()import copy a [[1, 2], [3, 4]] b copy.deepcopy(a) b[0][0] 99 print(a) # [[1, 2], [3, 4]] a完全不受影响 print(b) # [[99, 2], [3, 4]]deepcopy会递归复制所有层级代价是速度慢、内存占用高。所以在使用时想清楚如果列表只有一层用copy()就够了没必要用deepcopy。如果列表嵌套层级很深但不需要完全独立比如你只读不改也别用deepcopy那是性能杀手。6. 实战案例从去重、词频统计到复杂数据排序6.1 列表去重的几种写法哪种最高效列表去重是面试高频题也是日常开发常遇到的需求。最简单的写法是用集合nums [1, 2, 2, 3, 3, 3] unique list(set(nums)) print(unique) # [1, 2, 3]但这种方法会改变元素顺序集合是无序的。如果需要保留原始顺序可以用循环配合辅助集合nums [3, 1, 2, 3, 2, 1] seen set() unique [] for num in nums: if num not in seen: seen.add(num) unique.append(num) print(unique) # [3, 1, 2]Python 3.7 中dict保持插入顺序所以还有一种更简洁的写法nums [3, 1, 2, 3, 2, 1] unique list(dict.fromkeys(nums)) print(unique) # [3, 1, 2]如果列表元素是字典等不可哈希对象集合方式就不能用了需要自己写判断逻辑。实战中我用dict.fromkeys比较多因为它保留了顺序而且性能很好。6.2 词频统计列表、字典和collections.Counter词频统计是文本处理中的经典场景。先看基础版用字典手动统计words [apple, banana, apple, orange, banana, apple] word_count {} for word in words: word_count[word] word_count.get(word, 0) 1 print(word_count) # {apple: 3, banana: 2, orange: 1}dict.get(word, 0)的写法比if word in word_count更简洁也是Python社区常见的风格。不过更推荐直接用collections.Counter它本身就是专为计数设计的from collections import Counter words [apple, banana, apple, orange, banana, apple] word_count Counter(words) print(word_count) # Counter({apple: 3, banana: 2, orange: 1}) # 取出现次数最多的前2个 print(word_count.most_common(2)) # [(apple, 3), (banana, 2)]Counter还有update、subtract、elements等方法功能很全。如果你要统计的数据量很大写成Counter(words)一行就能搞定比手写循环省事很多。6.3 按优先级排序多个字段实际开发里经常遇到按多个字段排序的需求。比如一个学生列表每个学生有语文、数学、英语三门成绩想按总分降序总分相同按数学成绩降序排序students [ {name: Alice, chinese: 90, math: 85, english: 78}, {name: Bob, chinese: 85, math: 90, english: 88}, {name: Charlie, chinese: 90, math: 92, english: 70}, ] # 先按数学成绩降序再按总分降序 students.sort( keylambda s: (s[chinese] s[math] s[english], s[math]), reverseTrue )这里有个容易出错的地方如果多个排序字段的方向不一致比如总分升序但数学降序直接传reverseTrue会让所有字段都反向。这种情况下有两种解决办法一是把数字取负二是用functools.cmp_to_key写自定义比较函数。# 总分升序数学降序 students.sort(keylambda s: (s[chinese] s[math] s[english], -s[math]))用负数取反是很Pythonic的写法前提是字段是数字。如果是字符串字段就需要用更复杂的方案了。我处理这类需求时优先把排序逻辑拆清楚避免在一个lambda里堆太多逻辑那样后面维护时会很痛苦。6.4 列表分组与结构化处理把一个大列表按某种规则分组也是高频需求。比如有一批订单记录想按商品名称分组把相同商品的订单汇总到一个列表里orders [ {product: apple, amount: 5}, {product: banana, amount: 3}, {product: apple, amount: 8}, {product: cherry, amount: 2}, ] grouped {} for order in orders: product order[product] grouped.setdefault(product, []).append(order) # 或者用 defaultdict from collections import defaultdict grouped defaultdict(list) for order in orders: grouped[order[product]].append(order) for product, items in grouped.items(): total sum(item[amount] for item in items) print(product, total) # apple 13 # banana 3 # cherry 2setdefault和defaultdict都需要掌握。defaultdict(list)的写法在遍历时更自然不会因为键不存在而报错。如果你需要的是按条件把列表拆成多个子列表比如把大于10和小于等于10的分开列表推导式可以做但多次遍历效率不高。数据量不大时无所谓数据量大时可以考虑用单次遍历分组nums [3, 15, 7, 22, 9, 30] big, small [], [] for num in nums: if num 10: big.append(num) else: small.append(num)7. 常见问题排查遇到这些情况应该怎么排查和解决7.1 修改了列表但其他变量也变了如果你用b a这种方式复制列表修改b时a也会变。这不是Bug是Python变量引用模型导致的。解决方法是使用a.copy()或a[:]。我发现很多人第一次遇到这个现象时特别困惑一句话解释就是变量名是标签不是盒子。b a的意思是给同一个列表对象贴了第二张标签不是创建了一个新盒子。7.2 列表删除元素时漏删前面已经讲过遍历时用remove会漏元素。解决方案是遍历副本、用推导式、倒序遍历。这是一个非常高频的排查点面试中考这个问题的频率也特别高。如果你在牛客、LeetCode上刷题遇到“删除列表中的指定元素”这类题目一定要记得这个坑。7.3 检查元素是否存在的性能问题当列表很大且需要频繁判断元素是否在列表中时用in是O(n)的会导致程序明显变慢。解决办法是把列表转成set把判断变成O(1)。但前提是元素是可哈希的。这个优化在爬虫去重场景里我几乎天天用比如维护一个已处理URL的集合如果URL很多用列表存和用集合存性能差距是数量级的。7.4 列表排序后数据错乱或顺序不是预期排序结果和自己设想的不一样通常是没有理解sort是原地修改或者在key函数里写了错误的逻辑。排查方式很简单先用小数据列表打印每一步结果确认key函数返回的值是否符合预期。在lambda里加打印是一种直接粗暴但有效的排查方式。7.5 列表索引越界访问不存在的索引会报IndexError。如果你不确定索引是否有效可以先判断长度或者用try...except捕获异常。另外pop()在空列表上调用也会报IndexError所以在删除前要确认列表不为空。7.6 列表、元组、集合、字典怎么选最后补充一个高频问题list和tuple、set、dict到底应该怎么选。简单区分标准需要有序、可修改、允许重复用list需要有序、只读、可哈希用tuple需要去重、无序、快速判断存在用set需要键值映射、快速查找用dict这个选型标准在绝大多数场景下都够用。我处理量化交易策略数据时日线、分钟线数据用list或DataFrame去重和集合判断用set指标映射用dict。每种数据结构都有它的定位混着用反而容易出问题。我个人在实际操作中的一个体会是列表方法本身并不复杂难点在于理解Python的引用模型、可变对象的机制以及不同方法在不同场景下的性能差异。把这些底层逻辑搞清楚了列表用法基本就融会贯通了。还有一个小技巧想分享给大家在写代码之前先想清楚我是要“原地修改”还是“生成新列表”这两个方向决定了应该用哪一类方法也能帮你避免很多莫名的Bug。希望这篇内容能让你对Python列表有一个系统且扎实的理解日常写代码时少踩点坑。
RELATED

相关推荐

分布式存储架构深度解析:从数据切分到容灾机制,构建PB级可靠存储底座

分布式存储架构深度解析:从数据切分到容灾机制,构建PB级可靠存储底座

1. 内容整体设计与思路拆解1.1 “海纳数据”背后的存储困境拿到“霄云碧海分布式存储”这个名字的时候,我第一反应是这家团队对存储的理解确实有点东西。“霄云”对应的是云上资源,强调的是存储系统在云环境中的适应能力;“碧海”对应的是数据…

📅 2026/9/9 17:57:42
Flutter动画体系全解:从核心概念到性能优化实战

Flutter动画体系全解:从核心概念到性能优化实战

做 Flutter 开发有一段时间的朋友,多半会碰到一个坎儿:动画。数据渲染、状态管理都趟过来了,一到动画这块儿总觉得差点意思。要么卡顿,要么不跟手,要么代码越写越乱。其实 Flutter 的动画体系在跨端框架里算是最完整的…

📅 2026/9/9 17:57:42
Docker+Nginx部署Python Web应用:从开发环境到服务器的完整指南

Docker+Nginx部署Python Web应用:从开发环境到服务器的完整指南

把Python Web应用从开发环境搬到服务器,是很多初学者迈不过去的一道坎。开发的时候用Flask自带服务器跑得飞起,真到了上线这天,什么Python版本不一致、依赖装不上、端口被占用、进程一关服务就挂……各种问题全冒出来了。这篇文章要解决的问题…

📅 2026/9/9 17:57:42
MORE NEWS

更多资讯

📰

VC++实战:基于POP3的邮件监视系统与仿360界面实现

简介:一份基于VC的POP3邮件系统完整项目源码,面向C网络编程及界面开发学习者。项目实现了标准的POP3协议收信、后台线程定时监视邮箱、提取新邮件数量/发件人/主题等信息,并仿照360安全卫士设计交互界面,演示了通知栏图标、弹窗提…

📰

基于蛇优化算法的三维SD-MTSP求解与MATLAB实现

1. 三维SD-MTSP到底在求解什么1.1 从二维到三维:不是“加一个坐标”那么简单先交代一下问题背景。我最近在做一个多飞行器协同巡检的路径规划任务,场景大致是:地面上有一个固定仓库,仓库外散布着几十个需要巡检的塔吊点&#xff0…

📰

C++模板双向链表实战:手写STL list

我去年整理代码时翻到一个老项目——手写的 C 模板双向链表。当时我在做一个需要频繁在中间位置插入删除任务的小模块,本来可以直接用std::list,但我想弄清楚 list 内部到底怎么管理节点、迭代器是怎么工作的,干脆按标准库的接口自己实现了一…

📰

ShareX 免费截屏指南:一次按键出图,打码、长截图、自动上传都省时间

ShareX 免费截屏指南:一次按键出图,打码、长截图、自动上传都省时间 【免费下载链接】ShareX ShareX is a free and open-source application that enables users to capture or record any area of their screen with a single keystroke. It also supp…

📰

STM32Cube_FW_F1 V1.8.0固件包详解:下载安装与工程配置指南

简介:STM32Cube_FW_F1_V1.8.0.zip是意法半导体官方发布的STM32F1系列HAL库固件包,面向嵌入式开发者,提供硬件抽象层API,可显著提升应用开发效率并简化底层驱动编写。压缩包共10641个文件,包含丰富的C/H源码、工程文件&…

📰

OpenCore Legacy Patcher 手把手:3 步在老 Mac 上装最新 macOS

OpenCore Legacy Patcher 手把手:3 步在老 Mac 上装最新 macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你有一台 2015 年的 MacBook,硬件还够用,却只能…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬