当前位置: 首页 > news >正文

高级语法与特性

一、推导式(简洁生成容器,Pythonic 首选)

支持列表、字典、集合、元组推导,替代循环赋值,代码更简洁。

1. 列表推导式

语法:[表达式 for 变量 in 可迭代对象 if 条件]

# 普通循环lst=[]foriinrange(10):ifi%2==0:lst.append(i)# 列表推导式lst=[iforiinrange(10)ifi%2==0]print(lst)# [0, 2, 4, 6, 8]# 嵌套循环res=[(x,y)forxinrange(2)foryinrange(3)]print(res)# [(0,0),(0,1),(0,2),(1,0),(1,1),(1,2)]

2. 字典推导式

# 键值互换d={"a":1,"b":2}new_d={v:kfork,vind.items()}print(new_d)# {1: 'a', 2: 'b'}

3. 集合推导式

自动去重,用法和列表一致:

s={x%3forxinrange(10)}print(s)# {0, 1, 2}

注意:没有元组推导式(x for x in ...)生成器表达式


二、迭代器 & 生成器(惰性求值,省内存)

1. 迭代器 Iterator

可被for遍历的对象,必须实现两个魔法方法:

  • __iter__():返回迭代器自身
  • __next__():返回下一个元素,无元素时抛StopIteration
classMyIterator:def__init__(self,n):self.n=n self.cur=0def__iter__(self):returnselfdef__next__(self):ifself.cur<self.n:val=self.cur self.cur+=1returnvalraiseStopIteration# 遍历结束it=MyIterator(3)foriinit:print(i)# 0 1 2

2. 生成器 Generator

迭代器的语法糖,惰性生成数据,大数据场景必备,两种写法:

(1)生成器函数(yield

函数遇到yield暂停,下次迭代从暂停处继续:

defgen(n):foriinrange(n):yieldi*2g=gen(4)print(next(g))# 0print(next(g))# 2fornuming:print(num)# 4 6

(2)生成器表达式

写法类似列表推导式,把[]换成()

g=(x**2forxinrange(5))print(next(g))# 0

核心优势:不一次性加载所有数据,海量数据不会内存溢出。


三、装饰器 Decorator

不修改原函数代码,动态扩展功能,底层是「函数接收函数、返回函数」。

1. 基础装饰器

defouter(func):# 内层函数包装原逻辑definner():print("执行前...")func()print("执行后...")returninner# 语法糖 @@outerdefhello():print("Hello Python")hello()

2. 装饰带参数的函数

*args, **kwargs兼容任意参数:

deftimer(func):definner(*args,**kwargs):importtime start=time.time()res=func(*args,**kwargs)print(f"耗时:{time.time()-start:.2f}s")returnresreturninner@timerdefadd(a,b):returna+bprint(add(1,2))

3. 带参数的装饰器

外层多一层函数,用来接收装饰器参数:

defauth(role):defdecorator(func):definner():ifrole=="admin":func()else:print("权限不足")returninnerreturndecorator@auth(role="admin")defedit():print("编辑内容")edit()

4. 保留原函数元信息

装饰器会覆盖原函数名称/文档,用functools.wraps修复:

fromfunctoolsimportwrapsdefouter(func):@wraps(func)definner():func()returninner

四、高阶函数 & 匿名函数

1. 匿名函数lambda

语法:lambda 参数: 表达式,只能写单行表达式:

f=lambdax,y:x+yprint(f(1,3))# 4

2. 三大内置高阶函数

map:对序列每个元素执行函数

lst=[1,2,3]res=list(map(lambdax:x*2,lst))print(res)# [2,4,6]

filter:过滤序列,保留结果为 True 的元素

lst=[1,2,3,4]res=list(filter(lambdax:x%2==0,lst))print(res)# [2,4]

reduce:累积运算(需导入)

fromfunctoolsimportreducelst=[1,2,3,4]# 累加:((1+2)+3)+4res=reduce(lambdaa,b:a+b,lst)print(res)# 10

五、上下文管理器with

自动申请/释放资源(文件、锁、数据库连接),避免漏关闭。

1. 基础用法(系统内置)

# 自动关闭文件,不用手动 f.close()withopen("test.txt","r",encoding="utf-8")asf:print(f.read())

2. 自定义上下文管理器

实现__enter____exit__两个魔法方法:

classMyContext:def__enter__(self):print("进入上下文")returnself# as 接收的对象def__exit__(self,exc_type,exc_val,exc_tb):print("退出上下文")# 返回 True 表示吞掉异常returnFalsewithMyContext()asctx:print("业务逻辑")

3. 快捷写法:@contextmanager

用装饰器快速生成上下文管理器:

fromcontextlibimportcontextmanager@contextmanagerdeftag(name):print(f"<{name}>")yieldprint(f"</{name}>")withtag("h1"):print("标题内容")

六、变量作用域 & 关键字(nonlocal / global)

1.global:修改全局变量

a=10deffunc():globala a=20func()print(a)# 20

2.nonlocal:修改外层嵌套函数变量(非全局)

defouter():x=10definner():nonlocalx x=20inner()print(x)outer()# 20

七、解包与星号用法(* / **)

1. 序列解包

a,b,c=[1,2,3]# 星号收集多个元素first,*mid,last=[1,2,3,4,5]print(first,mid,last)# 1 [2,3,4] 5

2. 函数参数

  • *args:接收位置参数,打包成元组
  • **kwargs:接收关键字参数,打包成字典
deffunc(*args,**kwargs):print(args)# (1,2)print(kwargs)# {"name":"Tom"}func(1,2,name="Tom")

3. 拆包传参

lst=[10,20]d={"a":1,"b":2}defadd(x,y):returnx+yprint(add(*lst))# 30

八、魔术方法(内置方法,双下划线)

控制对象的运算、访问、打印等行为,列举高频常用:

classPerson:def__init__(self,name):self.name=name# 打印/str() 调用def__str__(self):returnf"姓名:{self.name}"# 下标取值:obj[0]def__getitem__(self,idx):returnself.name[idx]# 对象当作函数调用:obj()def__call__(self):print(f"我是{self.name}")p=Person("Alice")print(p)# 姓名:Aliceprint(p[0])# Ap()# 我是 Alice

学习顺序建议

  1. 先练推导式、lambda、高阶函数(日常编码高频)
  2. 再学迭代器 + 生成器(处理大数据、流数据)
  3. 然后装饰器(日志、权限、缓存通用方案)
  4. 接着with 上下文管理器(资源管理)
  5. 最后吃透作用域、解包、魔术方法(面向对象进阶基础)
http://www.gsyq.cn/news/1483526.html

相关文章:

  • 图嵌入与谱半径极值问题研究
  • 华为服务器Windows端iBMC远程KVM控制工具(含Java运行环境)
  • Adobe InDesign 2025 【ID 2025】软件下载及安装教程
  • 【分享】[特殊字符][特殊字符]游戏挂机,自动点击,支持文字和图片识别!
  • 手把手教你用逻辑分析仪调试GMAC的MDIO接口(以88E1512 PHY为例)
  • Flask项目部署到服务器,如何彻底告别那个烦人的‘开发服务器‘警告?
  • ToDesk一直开机自启动,并且在资源管理器中关闭后还自动重启
  • Rust 日期时间处理库 Chrono,3855 Star 背后的设计取舍
  • 法国海外仓对卖家存放货物隐私保护的重要性:别让同行看到你卖什么货
  • 从“不可控整流”到稳定工作:手把手调整GaN Boost PFC在高压输入下的驱动策略
  • 面试题完结 | 投票题 + 到岗时间 + 压力缓解
  • chroot-debian一键部署
  • 2026年佛山知识产权律师推荐怎么选?看这五个关键点 - 本地品牌推荐
  • 从ZLToolKit线程模块看C++高性能网络库设计:任务队列、线程池与负载均衡的实战拆解
  • 2026年济南医疗纠纷律师哪家好?5位双背景专业律师推荐 - 本地品牌推荐
  • 躲避巨石游戏 · Python版
  • 从MATLAB到C语言:手把手教你实现db4小波四层分解与重构(附完整代码)
  • 2026年广州知识产权诉讼律师推荐 钟泽江双资质专业护航 - 本地品牌推荐
  • 从停等协议到ARQ:手把手图解RDT协议如何一步步实现可靠数据传输(附状态机详解)
  • ESP32 I2C驱动OLED屏幕实战:从硬件接线到显示‘Hello World‘的完整流程
  • 从‘黑盒’到‘白盒’:在金融风控和医疗诊断中,我们为什么必须给AI模型一个解释?
  • 2026年武汉离婚律师推荐榜单:5位资深律师实战经验丰富 - 本地品牌推荐
  • 告别杂乱报表!手把手教你用若依框架定制个性化Excel导出(合并行实战)
  • 从图像处理到推荐系统:聊聊‘外积’这个操作在AI里到底有多实用
  • 拆解5G基站RRU:FPGA里那些不为人知的数字信号处理模块(DUC/CFR/DPD)到底在忙啥?
  • Windows系统激活解决方案:KMS_VL_ALL_AIO智能脚本完全指南
  • C语言企业项目实战(四)
  • 别再手动改语言包了!Vue项目如何从后端接口动态更新i18n(附完整代码)
  • 告别命令行恐惧:GetShell后,用图形化远程桌面在CTF靶场里‘捡’Flag的保姆级指南
  • Linux内核里NandFlash ECC校验的查表优化:从256次循环到一次查表,性能提升的秘密