Python 3特色用法:新特性匯總
這篇文章靈感來(lái)源于一個(gè)新項(xiàng)目 A short guide on features of Python 3 for data scientists,這個(gè)項(xiàng)目列出來(lái)了作者使用Python 3用到的一些特性。正巧我最近也想寫一篇介紹Python 3(特指Python 3.6+)特色用法的文章。開(kāi)始吧!
pathlib模塊
pathlib模塊是Python 3新增的模塊,讓你更方便的處理路徑相關(guān)的工作。
- 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現(xiàn)在是方法了
- ....: print('read from open(): {!r}'.format(handle.read()))
- ....:
- read from open(): 'This is the content'
- In : p = Path('touched')
- In : p.exists() # 集成了多個(gè)常用方法
- 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')
可迭代對(duì)象的解包
- In : a, b, *rest = range(10) # 學(xué)過(guò)lisp就很好懂了,相當(dāng)于一個(gè)「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)
強(qiáng)制關(guān)鍵字參數(shù)
使用強(qiáng)制關(guān)鍵字參數(shù)會(huì)比使用位置參數(shù)表意更加清晰,程序也更加具有可讀性,那么可以讓這些參數(shù)強(qiáng)制使用關(guān)鍵字參數(shù)傳遞,可以將強(qiáng)制關(guān)鍵字參數(shù)放到某個(gè) 參數(shù)或者單個(gè) 后面就能達(dá)到這種效果:
- 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時(shí)不能直接通配遞歸的目錄,需要這樣:
- found_images = \
- glob.glob('/path/*.jpg') \
- + glob.glob('/path/*/*.jpg') \
- + glob.glob('/path/*/*/*.jpg') \
- + glob.glob('/path/*/*/*/*.jpg') \
- + glob.glob('/path/*/*/*/*/*.jpg')
Python3的寫法要清爽的多:
- found_images = glob.glob('/path/**/*.jpg', recursive=True)
事實(shí)上更好的用法是使用pathlib:
- found_images = pathlib.Path('/path/').glob('**/*.jpg')
Python 3之后print成為了函數(shù),有了更多的擴(kuò)展能力:
- 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]
格式化字符串變量
- 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'
更嚴(yán)格的對(duì)比規(guī)范
下面這幾種類型的用法在Python 3都是非法的:
- 3 < '3'
- 2 < None
- (3, 4) < (3, None)
- (4, 5) < [4, 5]
- sorted([2, '1', 3])
統(tǒng)一unicode的使用
這是很多人黑Python 2的一點(diǎn),舉個(gè)例子。在Python 2里面下面的結(jié)果很奇怪:
- In : s = '您好'
- In : print(len(s))
- 6
- In : print(s[:2])
- ?
Python 3就方便了:
- In : s = '您好'
- In : print(len(s))
- 2
- In : print(s[:2])
- 您好
合并字典
- 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:
- In : {str(i):i for i in range(5)}
- Out: {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}