標籤:

Python 3新特性匯總(一)

這篇文章靈感來源於一個新項目A short guide on features of Python 3 for data scientists,這個項目列出來了作者使用Python 3用到的一些特性。正巧我最近也想寫一篇介紹Python 3(特指Python 3.6+)特色用法的文章。開始吧!

pathlib模塊

pathlib模塊是Python 3新增的模塊,讓你更方便的處理路徑相關的工作。

In : from pathlib import PathnIn : Path.home()nOut: PosixPath(/Users/dongweiming) # 用戶目錄nIn : path = Path(/user)nIn : path / local # 非常直觀nOut: PosixPath(/user/local)nIn : str(path / local / bin)nOut: /user/local/binnIn : f = Path(example.txt)nIn : f.write_bytes(This is the content.encode(utf-8))nOut[16]: 19nIn : with f.open(r, encoding=utf-8) as handle: # open現在是方法了n....: print(read from open(): {!r}.format(handle.read()))n....:nread from open(): This is the contentnIn : p = Path(touched)nIn : p.exists() # 集成了多個常用方法nOut: FalsenIn : p.touch()nIn : p.exists()nOut: TruenIn : p.with_suffix(.jpg)nOut: PosixPath(touched.jpg)nIn : p.is_dir()nOut: FalsenIn : p.joinpath(a, b)nOut: PosixPath(touched/a/b) n

可迭代對象的解包

In : a, b, *rest = range(10) # 學過lisp就很好懂了,相當於一個「everything else」nIn : anOut: 0nIn : bnOut: 1nIn : restnOut: [2, 3, 4, 5, 6, 7, 8, 9]nIn : *prev, next_to_last, last = range(10)nIn : prev, next_to_last, lastnOut: ([0, 1, 2, 3, 4, 5, 6, 7], 8, 9)n

強制關鍵字參數

使用強制關鍵字參數會比使用位置參數表意更加清晰,程序也更加具有可讀性,那麼可以讓這些參數強制使用關鍵字參數傳遞,可以將強制關鍵字參數放到某個參數或者單個後面就能達到這種效果:

In : def recv(maxsize, *, block):n....:n....: passn....:nIn : recv(1024, True)n---------------------------------------------------------------------------nTypeError Traceback (most recent call last)n<ipython-input-49-8e61db2ef94b> in <module>()n----> 1 recv(1024, True)nTypeError: recv() takes 1 positional argument but 2 were givennIn : recv(1024, block=True)n

通配符**

我們都知道在Python 2時不能直接通配遞歸的目錄,需要這樣:

found_images = n glob.glob(/path/*.jpg) n + glob.glob(/path/*/*.jpg) n + glob.glob(/path/*/*/*.jpg) n + glob.glob(/path/*/*/*/*.jpg) n + glob.glob(/path/*/*/*/*/*.jpg)n

Python3的寫法要清爽的多:

found_images = glob.glob(/path/**/*.jpg, recursive=True)n

事實上更好的用法是使用pathlib:

found_images = pathlib.Path(/path/).glob(**/*.jpg)n

print

Python 3之後print成為了函數,有了更多的擴展能力:

In : print(*[1, 2, 3], sep=t)n1t2t3nIn : [x if x % 3 else print(, x) for x in range(10)]n 0n 3n 6n 9nOut: [None, 1, 2, None, 4, 5, None, 7, 8, None]n

格式化字元串變數

In : name = FrednIn : fMy name is {name}nOut: My name is FrednIn : from datetime import *nIn : date = datetime.now().date()nIn : f{date} was on a {date:%A}nOut: 2018-01-17 was on a WednesdaynIn : def foo():n....: return 20n....:nIn : fresult={foo()}nOut: result=20n

更嚴格的對比規範

下面這幾種類型的用法在Python 3都是非法的:

3 < 3n2 < Nonen(3, 4) < (3, None)n(4, 5) < [4, 5]nsorted([2, 1, 3])n

統一unicode的使用

這是很多人黑Python 2的一點,舉個例子。在Python 2裡面下面的結果很奇怪:

In : s = 您好nIn : print(len(s))n6nIn : print(s[:2])n?n

Python 3就方便了:

In : s = 您好nIn : print(len(s))n2nIn : print(s[:2])n您好n

合併字典

In : x = dict(a=1, b=2)nIn : y = dict(b=3, d=4)nIn : z = {**x, **y}nIn : znOut: {a: 1, b: 3, d: 4}n

字典可保證插入順序

Python 3不再需要直接使用OrderedDict:

In : {str(i):i for i in range(5)}nOut: {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}n

weixin.qq.com/r/D0zH35L (二維碼自動識別)

推薦閱讀:

TAG:Python | Python3x |