基础语法你会了但离 写优雅的 Python 还差几个高级武器。老哥这篇把拷贝、迭代器、生成器、闭包、装饰器一次补齐。一、浅拷贝 vs 深拷贝先分清三种 复制直接赋值只是引用的别名不产生拷贝浅拷贝拷贝父对象但内部子对象还是共享只有第一层独立深拷贝父对象和子对象全都独立拷贝。浅拷贝的三种方式切片[:]、工厂函数list()/set()、copy.copy()。用内存地址看深浅拷贝的区别核心可变类型的子对象是否独立import copy list1 [1, 2, 3, [100, 200, 300]] list2 copy.copy(list1) # 浅拷贝 print(id(list2[3]) id(list1[3])) # True 子列表还是同一个 list1[3].append(400) # 改子列表 print(list2) # [1, 2, 3, [100, 200, 300, 400]] 浅拷贝也被改了 list3 copy.deepcopy(list1) # 深拷贝 print(id(list3[3]) id(list1[3])) # False 子列表独立了 list1[3].append(500) print(list3) # 深拷贝不受影响特殊情况数字、字符串等 原子类型 无法拷贝copy 后地址不变只含原子类型的元组深拷贝也不会变地址不变。二、迭代器记住位置、往前遍历迭代器是一个能记住遍历位置的对象只能往前不会后退。字符串、列表、元组都能创建迭代器。用iter()创建、next()取下一个取完抛StopIterationlst [1, 2, 3] it iter(lst) print(next(it)) # 1 print(next(it)) # 2 print(next(it)) # 3 print(next(it)) # StopIteration判断可迭代 / 迭代器from collections.abc import Iterable, Iterator print(isinstance([], Iterable)) # True 列表可迭代 print(isinstance([], Iterator)) # False 但本身不是迭代器 print(isinstance((x for x in range(10)), Iterator)) # True 生成器是迭代器自定义迭代器实现__iter__()返回自己和__next__()取元素取完抛StopIterationclass Reverse: def __init__(self, data): self.data data self.index len(data) def __iter__(self): return self def __next__(self): if self.index 0: raise StopIteration self.index - 1 return self.data[self.index] for char in Reverse([2, 3, 5, 7]): print(char) # 7 5 3 2三、生成器按需产生值省内存生成器generator是创建迭代器的简单工具用yield替代return。每次遇到yield暂停、保存状态下次从暂停处继续。最大优势按需生成避免一次性占用大量内存。两种创建方式# 方式一推导式注意是圆括号 gen (x for x in range(5)) print(gen) # generator object ... for x in gen: print(x) # 方式二yield 函数 def fibo(): # 斐波那契 a, b 0, 1 while True: yield b a, b b, a b f fibo() print(next(f)) # 1 print(next(f)) # 1 print(next(f)) # 2send()向生成器 发送 值实现两个任务交替执行def gen(): task_id 0 int_value 0 char_value A while True: match task_id: case 0: task_id yield int_value # 返回并接收 send 的值 int_value 1 case 1: task_id yield char_value char_value chr(ord(char_value) 1) case _: task_id yield g gen() print(next(g)) # 0 print(g.send(1)) # A print(g.send(0)) # 1 print(g.send(1)) # B注意第一次启动生成器要用send(None)此时没有 yield 可接收值。四、闭包函数 记住 外层变量函数执行完内部变量本应销毁。但闭包能让外层函数的变量被保存、重复使用同时避免全局变量污染。构建闭包三条件外层函数定义内层函数、内层用到外层变量、外层把内层返回。def linear(a, b): # 外层 def inner(x): # 内层 return a * x b # 用到外层变量 a、b return inner # 返回内层 y1 linear(1, 1) print(y1(5)) # 6 虽然 linear 已结束但 a、b 还在 # 查看闭包保存的值 print(y1.__closure__[0].cell_contents) # 1 print(y1.__closure__[1].cell_contents) # 1五、装饰器不改原函数动态加功能装饰器接收一个函数返回一个包装后的新函数从而不修改原代码就给函数加功能。最基础的装饰器让sqrt先求绝对值负数也能开根号from math import sqrt def decorator(f): def inner(x): x abs(x) # 加功能先取绝对值 return f(x) return inner decorator # 等价于 func decorator(func) def func(x): return sqrt(x) print(func(-4)) # 2.0多层装饰器离函数最近的先装饰从内到外get_integer get_absolute def func(x): return sqrt(x)带参数的装饰器如 开 n 次方def times(n): def get_absolute(f): def inner(x): x abs(x) for i in range(n): x f(x) return x return inner return get_absolute times(2) # 开两次方 def func(x): return sqrt(x) print(func(-16)) # 2.0类装饰器实现__call__()的类也能当装饰器class DecoratorClass: def __init__(self, f): self.f f def __call__(self, x): x abs(x) return self.f(x) DecoratorClass def func(x): return sqrt(x) print(func(-4)) # 2.0老哥收尾一句话总结这批 进阶神器浅拷贝共享子对象、深拷贝全独立迭代器记住位置只能往前生成器用 yield 按需生成省内存闭包记住外层变量装饰器不改原函数就能加功能。下一篇讲进程与线程—— 让程序 多任务并行。有问题随时回来找老哥。
企业数字化 ERP 产品动态
相关推荐
让程序 “联网“!TCP、UDP、HTTP 一次讲透,手写聊天程序和爬虫接口 前面写的程序都是 "自己跟自己玩"。真实的应用要联网—— 浏览器请求网页、聊天软件收发消息、爬虫抓数据。这篇老哥带你打通网络编程。一、网络编程三要素进程之间要通信,靠三个东西:协议:定义通信规则(数据格式、传输… · 2026/11/5 1:56:41
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战 📌 核心结论(TL;DR)LCEL 灵魂:LangChain 表达式语言(LCEL)通过重载管道符 |,将实现了 Runnable 协议的组件(模型、解析器等)像积木一样串联,实现优雅的链式编… · 2026/11/5 1:56:41
多模块架构演进:横向分层 vs 纵向领域,13个真实项目的 Maven 切分对照 老炮淘金:13 个真实企业项目的架构高光 S01 基于 13 个真实工程的目录结构与 pom 实测 关键词:多模块 Maven 技术分层 业务域切分 发布边界 依赖方向 👋 欢迎阅读
🏠个人主页: 知守观 📘我的专栏: 老炮淘金:13个真实企业项目的架构高光 💻当前内容: 模块切… · 2026/11/5 1:56:41
Blender渲染参数与出图流程:引擎、采样、光程、降噪与提速 1. 先把“渲染”这件事拆成三层来看很多人第一次点开 Blender 的渲染面板,会被密密麻麻的折叠菜单劝退,其实真正影响一张简单静物图成色的,就那么十来个参数。渲染在 Blender 里不是“一个按钮”,而是三层不同性质的东西叠在一起&… · 2026/11/5 2:40:02
MySQL 5.7到8.0语法兼容性实战指南 1. 项目背景与核心需求最近在接手一个遗留系统迁移项目时,遇到了一个典型的技术兼容性问题:新服务器默认安装的MySQL 8.0版本无法直接运行旧系统为MySQL 5.7设计的SQL语句。这让我不得不深入研究高版本MySQL向低版本兼容的具体方案。MySQL从5.7升级到8.0… · 2026/11/5 2:40:02
打印机无法扫描的四大根因与实战排查指南 1. 项目概述:为什么“打印机无法扫描”是高频痛点,而不是小故障“打印机无法扫描”这六个字,每天在各大技术论坛、客服后台、社区群组里出现的频次,远超多数人的想象。它不像“打印卡纸”那样有明确的物理反馈,也不像“… · 2026/11/5 2:40:02
汽车产业数字化转型:从研发到生产的全链路重构 1. 汽车产业数字化转型全景图最近三年走访了17家主机厂和34家零部件供应商后,我清晰地看到生产线上的机械臂正在被数据流重新定义。某德系豪华品牌工厂里,焊装车间的设备综合效率(OEE)通过数字孪生技术提升了23%,这个案… · 2026/11/5 2:40:02
Blender简单渲染全流程:引擎选型、灯光构图与噪点排查 很多人学 Blender 的第一道坎不是建模,是渲染。模型搭完了,材质随手一贴,按下 F12,结果出来一张灰蒙蒙、噪点满屏、构图还歪着的图,于是开始怀疑自己是不是不适合干这行。我第一次渲染的时候更惨,画面黑得只… · 2026/11/5 2:40:02
PhaaS钓鱼即服务产业链解析与防御策略 1. 事件背景与行业影响2023年第三季度,一场针对跨国短信钓鱼团伙的全球打击行动引发安全行业震动。这个被安全研究人员称为"PhaaS三人组"(Phishing-as-a-Service)的犯罪集团,在过去18个月内构建了完整的钓鱼即服务产业链… · 2026/11/5 2:39:01
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38