Python 3新特性汇总
pathlib模块
pathlib模块是Python 3新增的模块,让你更方便的处理路径相关的工作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | In : from pathlib import Path In : Path.home() Out: PosixPath( '/Users/dongweiming' ) # 用户目录 In : path = Path( '/user' ) In : path / 'local' # 非常直观 Out: PosixPath( '/user/local' ) In : str (path / 'local' / 'bin' ) Out: '/user/local/bin' In : f = Path( 'example.txt' ) In : f.write_bytes( 'This is the content' .encode( 'utf-8' )) Out[ 16 ]: 19 In : with f. open ( 'r' , encoding = 'utf-8' ) as handle: # open现在是方法了 ....: print ( 'read from open(): {!r}' . format (handle.read())) ....: read from open (): 'This is the content' In : p = Path( 'touched' ) In : p.exists() # 集成了多个常用方法 Out: False In : p.touch() In : p.exists() Out: True In : p.with_suffix( '.jpg' ) Out: PosixPath( 'touched.jpg' ) In : p.is_dir() Out: False In : p.joinpath( 'a' , 'b' ) Out: PosixPath( 'touched/a/b' ) |
可迭代对象的解包
1 2 3 4 5 6 7 8 9 10 | In : a, b, * rest = range ( 10 ) # 学过lisp就很好懂了,相当于一个「everything else」 In : a Out: 0 In : b Out: 1 In : rest Out: [ 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] In : * prev, next_to_last, last = range ( 10 ) In : prev, next_to_last, last Out: ([ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ], 8 , 9 ) |
强制关键字参数
使用强制关键字参数会比使用位置参数表意更加清晰,程序也更加具有可读性,那么可以让这些参数强制使用关键字参数传递,可以将强制关键字参数放到某个参数或者单个后面就能达到这种效果:
1 2 3 4 5 6 7 8 9 10 11 | In : def recv(maxsize, * , block): ....: ....: pass ....: In : recv( 1024 , True ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TypeError Traceback (most recent call last) <ipython - input - 49 - 8e61db2ef94b > in <module>() - - - - > 1 recv( 1024 , True ) TypeError: recv() takes 1 positional argument but 2 were given In : recv( 1024 , block = True ) |
通配符**
我们都知道在Python 2时不能直接通配递归的目录,需要这样:
1 2 3 4 5 6 | found_images = \ glob.glob( '/path/*.jpg' ) \ + glob.glob( '/path/*/*.jpg' ) \ + glob.glob( '/path/*/*/*.jpg' ) \ + glob.glob( '/path/*/*/*/*.jpg' ) \ + glob.glob( '/path/*/*/*/*/*.jpg' ) |
Python3的写法要清爽的多:
1 | found_images = glob.glob( '/path/**/*.jpg' , recursive = True ) |
事实上更好的用法是使用pathlib:
1 | found_images = pathlib.Path( '/path/' ).glob( '**/*.jpg' ) |
Python 3之后print成为了函数,有了更多的扩展能力:
1 2 3 4 5 6 7 8 | In : print ( * [ 1 , 2 , 3 ], sep = '\t' ) 1 2 3 In : [x if x % 3 else print ('', x) for x in range ( 10 )] 0 3 6 9 Out: [ None , 1 , 2 , None , 4 , 5 , None , 7 , 8 , None ] |
格式化字符串变量
1 2 3 4 5 6 7 8 9 10 11 12 | In : name = 'Fred' In : f 'My name is {name}' Out: 'My name is Fred' In : from datetime import * In : date = datetime.now().date() In : f '{date} was on a {date:%A}' Out: '2018-01-17 was on a Wednesday' In : def foo(): ....: return 20 ....: In : f 'result={foo()}' Out: 'result=20' |
更严格的对比规范
下面这几种类型的用法在Python 3都是非法的:
1 2 3 4 5 | 3 < '3' 2 < None ( 3 , 4 ) < ( 3 , None ) ( 4 , 5 ) < [ 4 , 5 ] sorted ([ 2 , '1' , 3 ]) |
统一unicode的使用
这是很多人黑Python 2的一点,举个例子。在Python 2里面下面的结果很奇怪:
1 2 3 4 5 | In : s = '您好' In : print ( len (s)) 6 In : print (s[: 2 ]) ? |
Python 3就方便了:
1 2 3 4 5 | In : s = '您好' In : print ( len (s)) 2 In : print (s[: 2 ]) 您好 |
合并字典
1 2 3 4 5 | In : x = dict (a = 1 , b = 2 ) In : y = dict (b = 3 , d = 4 ) In : z = { * * x, * * y} In : z Out: { 'a' : 1 , 'b' : 3 , 'd' : 4 } |
字典可保证插入顺序
Python 3不再需要直接使用OrderedDict:
1 2 | In : { str (i):i for i in range ( 5 )} Out: { '0' : 0 , '1' : 1 , '2' : 2 , '3' : 3 , '4' : 4 } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?