一、推导式简洁生成容器Pythonic 首选支持列表、字典、集合、元组推导替代循环赋值代码更简洁。1. 列表推导式语法[表达式 for 变量 in 可迭代对象 if 条件]# 普通循环lst[]foriinrange(10):ifi%20:lst.append(i)# 列表推导式lst[iforiinrange(10)ifi%20]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__()返回下一个元素无元素时抛StopIterationclassMyIterator:def__init__(self,n):self.nn self.cur0def__iter__(self):returnselfdef__next__(self):ifself.curself.n:valself.cur self.cur1returnvalraiseStopIteration# 遍历结束itMyIterator(3)foriinit:print(i)# 0 1 22. 生成器 Generator迭代器的语法糖惰性生成数据大数据场景必备两种写法1生成器函数yield函数遇到yield暂停下次迭代从暂停处继续defgen(n):foriinrange(n):yieldi*2ggen(4)print(next(g))# 0print(next(g))# 2fornuming:print(num)# 4 62生成器表达式写法类似列表推导式把[]换成()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 starttime.time()resfunc(*args,**kwargs)print(f耗时:{time.time()-start:.2f}s)returnresreturninnertimerdefadd(a,b):returnabprint(add(1,2))3. 带参数的装饰器外层多一层函数用来接收装饰器参数defauth(role):defdecorator(func):definner():ifroleadmin:func()else:print(权限不足)returninnerreturndecoratorauth(roleadmin)defedit():print(编辑内容)edit()4. 保留原函数元信息装饰器会覆盖原函数名称/文档用functools.wraps修复fromfunctoolsimportwrapsdefouter(func):wraps(func)definner():func()returninner四、高阶函数 匿名函数1. 匿名函数lambda语法lambda 参数: 表达式只能写单行表达式flambdax,y:xyprint(f(1,3))# 42. 三大内置高阶函数map对序列每个元素执行函数lst[1,2,3]reslist(map(lambdax:x*2,lst))print(res)# [2,4,6]filter过滤序列保留结果为 True 的元素lst[1,2,3,4]reslist(filter(lambdax:x%20,lst))print(res)# [2,4]reduce累积运算需导入fromfunctoolsimportreducelst[1,2,3,4]# 累加((12)3)4resreduce(lambdaa,b:ab,lst)print(res)# 10五、上下文管理器with自动申请/释放资源文件、锁、数据库连接避免漏关闭。1. 基础用法系统内置# 自动关闭文件不用手动 f.close()withopen(test.txt,r,encodingutf-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用装饰器快速生成上下文管理器fromcontextlibimportcontextmanagercontextmanagerdeftag(name):print(f{name})yieldprint(f/{name})withtag(h1):print(标题内容)六、变量作用域 关键字nonlocal / global1.global修改全局变量a10deffunc():globala a20func()print(a)# 202.nonlocal修改外层嵌套函数变量非全局defouter():x10definner():nonlocalx x20inner()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] 52. 函数参数*args接收位置参数打包成元组**kwargs接收关键字参数打包成字典deffunc(*args,**kwargs):print(args)# (1,2)print(kwargs)# {name:Tom}func(1,2,nameTom)3. 拆包传参lst[10,20]d{a:1,b:2}defadd(x,y):returnxyprint(add(*lst))# 30八、魔术方法内置方法双下划线控制对象的运算、访问、打印等行为列举高频常用classPerson:def__init__(self,name):self.namename# 打印/str() 调用def__str__(self):returnf姓名{self.name}# 下标取值obj[0]def__getitem__(self,idx):returnself.name[idx]# 对象当作函数调用obj()def__call__(self):print(f我是{self.name})pPerson(Alice)print(p)# 姓名Aliceprint(p[0])# Ap()# 我是 Alice学习顺序建议先练推导式、lambda、高阶函数日常编码高频再学迭代器 生成器处理大数据、流数据然后装饰器日志、权限、缓存通用方案接着with 上下文管理器资源管理最后吃透作用域、解包、魔术方法面向对象进阶基础
高级语法与特性
一、推导式简洁生成容器Pythonic 首选支持列表、字典、集合、元组推导替代循环赋值代码更简洁。1. 列表推导式语法[表达式 for 变量 in 可迭代对象 if 条件]# 普通循环lst[]foriinrange(10):ifi%20:lst.append(i)# 列表推导式lst[iforiinrange(10)ifi%20]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__()返回下一个元素无元素时抛StopIterationclassMyIterator:def__init__(self,n):self.nn self.cur0def__iter__(self):returnselfdef__next__(self):ifself.curself.n:valself.cur self.cur1returnvalraiseStopIteration# 遍历结束itMyIterator(3)foriinit:print(i)# 0 1 22. 生成器 Generator迭代器的语法糖惰性生成数据大数据场景必备两种写法1生成器函数yield函数遇到yield暂停下次迭代从暂停处继续defgen(n):foriinrange(n):yieldi*2ggen(4)print(next(g))# 0print(next(g))# 2fornuming:print(num)# 4 62生成器表达式写法类似列表推导式把[]换成()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 starttime.time()resfunc(*args,**kwargs)print(f耗时:{time.time()-start:.2f}s)returnresreturninnertimerdefadd(a,b):returnabprint(add(1,2))3. 带参数的装饰器外层多一层函数用来接收装饰器参数defauth(role):defdecorator(func):definner():ifroleadmin:func()else:print(权限不足)returninnerreturndecoratorauth(roleadmin)defedit():print(编辑内容)edit()4. 保留原函数元信息装饰器会覆盖原函数名称/文档用functools.wraps修复fromfunctoolsimportwrapsdefouter(func):wraps(func)definner():func()returninner四、高阶函数 匿名函数1. 匿名函数lambda语法lambda 参数: 表达式只能写单行表达式flambdax,y:xyprint(f(1,3))# 42. 三大内置高阶函数map对序列每个元素执行函数lst[1,2,3]reslist(map(lambdax:x*2,lst))print(res)# [2,4,6]filter过滤序列保留结果为 True 的元素lst[1,2,3,4]reslist(filter(lambdax:x%20,lst))print(res)# [2,4]reduce累积运算需导入fromfunctoolsimportreducelst[1,2,3,4]# 累加((12)3)4resreduce(lambdaa,b:ab,lst)print(res)# 10五、上下文管理器with自动申请/释放资源文件、锁、数据库连接避免漏关闭。1. 基础用法系统内置# 自动关闭文件不用手动 f.close()withopen(test.txt,r,encodingutf-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用装饰器快速生成上下文管理器fromcontextlibimportcontextmanagercontextmanagerdeftag(name):print(f{name})yieldprint(f/{name})withtag(h1):print(标题内容)六、变量作用域 关键字nonlocal / global1.global修改全局变量a10deffunc():globala a20func()print(a)# 202.nonlocal修改外层嵌套函数变量非全局defouter():x10definner():nonlocalx x20inner()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] 52. 函数参数*args接收位置参数打包成元组**kwargs接收关键字参数打包成字典deffunc(*args,**kwargs):print(args)# (1,2)print(kwargs)# {name:Tom}func(1,2,nameTom)3. 拆包传参lst[10,20]d{a:1,b:2}defadd(x,y):returnxyprint(add(*lst))# 30八、魔术方法内置方法双下划线控制对象的运算、访问、打印等行为列举高频常用classPerson:def__init__(self,name):self.namename# 打印/str() 调用def__str__(self):returnf姓名{self.name}# 下标取值obj[0]def__getitem__(self,idx):returnself.name[idx]# 对象当作函数调用obj()def__call__(self):print(f我是{self.name})pPerson(Alice)print(p)# 姓名Aliceprint(p[0])# Ap()# 我是 Alice学习顺序建议先练推导式、lambda、高阶函数日常编码高频再学迭代器 生成器处理大数据、流数据然后装饰器日志、权限、缓存通用方案接着with 上下文管理器资源管理最后吃透作用域、解包、魔术方法面向对象进阶基础