十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
本篇內(nèi)容主要講解“Python 3.8功能有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python 3.8功能有哪些”吧!

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比大化網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式大化網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋大化地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
新增賦值表達(dá)式
PEP 572的標(biāo)題是賦值表達(dá)式,也叫做「命名表達(dá)式」,不過(guò)它現(xiàn)在被廣泛的別名是「海象運(yùn)算符」(The Walrus Operator)。因?yàn)?=很像海象「眼睛小,長(zhǎng)著兩枚長(zhǎng)長(zhǎng)的牙」這個(gè)特點(diǎn)^_^。
在這里給大家展示個(gè)通過(guò)用PEP 572改寫的一行實(shí)現(xiàn)斐波那契數(shù)列的例子:
In : (lambda f: f(f, int(input('Input: ')), 1, 0, 1))(lambda f, t, i, a, b: print(f'fib({i}) = ') or t == i or f ...: (f, t, i + 1, b, a + b)) Input: 10 fib(1) = 1 fib(2) = 1 fib(3) = 2 fib(4) = 3 fib(5) = 5 fib(6) = 8 fib(7) = 13 fib(8) = 21 fib(9) = 34 fib(10) = 55 Out: True基于Raymond Hettinger版本改寫:
In : [(t:=(t[1], sum(t)) if i else (0,1))[1] for i in range(10)] Out: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
強(qiáng)制使用位置參數(shù)
PEP 570說(shuō)白了就是強(qiáng)制使用者用位置參數(shù)
溫馨提示:Python3.8版本下,見(jiàn)到以下報(bào)錯(cuò):
TypeError: divmod() takes no keyword arguments
就是這個(gè)原因啦!
運(yùn)行時(shí)添加審計(jì)hooks
現(xiàn)在可以給Python運(yùn)行時(shí)添加審計(jì)鉤子:
In : import sys ...: import urllib.request ...: ...: ...: def audit_hook(event, args): ...: if event in ['urllib.Request']: ...: print(f'Network {event=} {args=}') ...: ...: sys.addaudithook(audit_hook) In : urllib.request.urlopen('https://httpbin.org/get?a=1') Network event='urllib.Request' args=('https://httpbin.org/get?a=1', None, {}, 'GET') Out: 目前支持審計(jì)的事件名字和API可以看PEP文檔(延伸閱讀鏈接2), urllib.Request是其中之一。另外還可以自定義事件:
In : def audit_hook(event, args): ...: if event in ['make_request']: ...: print(f'Network {event=} {args=}') ...: In : sys.addaudithook(audit_hook) In : sys.audit('make_request', 'https://baidu.com') Network event='make_request' args=('https://baidu.com',) In : sys.audit('make_request', 'https://douban.com') Network event='make_request' args=('https://douban.com',)跨進(jìn)程內(nèi)存共享
可以跨進(jìn)程直接訪問(wèn)同一內(nèi)存(共享):
# IPython進(jìn)程A In : from multiprocessing import shared_memory In : a = shared_memory.ShareableList([1, 'a', 0.1]) In : a Out: ShareableList([1, 'a', 0.1], name='psm_d5d6ba1b') # 注意name # IPython進(jìn)程B(另外一個(gè)終端進(jìn)入IPython) In : from multiprocessing import shared_memory In : b = shared_memory.ShareableList(name='psm_d5d6ba1b') # 使用name就可以共享內(nèi)存 In : b Out: ShareableList([1, 'a', 0.1], name='psm_d5d6ba1b')
全新第三方包讀取模塊
使用新的 importlib.metadata模塊可以直接讀取第三方包的元數(shù)據(jù):
In : from importlib.metadata import version, files, requires, distribution In : version('flask') Out: '1.1.1' In : requires('requests') Out: ['chardet (<3.1.0,>=3.0.2)', 'idna (<2.9,>=2.5)', 'urllib3 (!=1.25.0,!=1.25.1,<1.26,>=1.21.1)', 'certifi (>=2017.4.17)', "pyOpenSSL (>=0.14) ; extra == 'security'", "cryptography (>=1.3.4) ; extra == 'security'", "idna (>=2.0.0) ; extra == 'security'", "PySocks (!=1.5.7,>=1.5.6) ; extra == 'socks'", 'win-inet-pton ; (sys_platform == "win32" and python_version == "2.7") and extra == \'socks\''] In : dist = distribution('celery') In : dist.version Out: '4.3.0' In : dist.metadata['Requires-Python'] Out: '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' In : dist.metadata['License'] In : dist.entry_points Out: [EntryPoint(name='celery', value='celery.__main__:main', group='console_scripts'), EntryPoint(name='celery', value='celery.contrib.pytest', group='pytest11')] In : files('celery')[8] Out: PackagePath('celery/__init__.py') In : dist.locate_file(files('celery')[8]) Out: PosixPath('/Users/dongweiming/test/venv/lib/python3.8/site-packages/celery/__init__.py')新增緩存屬性
緩存屬性 (cached_property) 是一個(gè)非常常用的功能,很多知名 Python 項(xiàng)目都自己實(shí)現(xiàn)過(guò)它,現(xiàn)在終于進(jìn)入版本庫(kù)了。
functools.lru_cache作為裝飾器時(shí)可以不加參數(shù)
lru_cache裝飾器支持 max_size和 typed2個(gè)參數(shù),如果對(duì)默認(rèn)參數(shù)不敏感,過(guò)去只能這么用(需要空括號(hào)):
In : @lru_cache() ...: def add(a, b): ...: return a + b ...:
從3.8開始可以直接作為裝飾器,而不是作為返回裝飾器的函數(shù)(不加括號(hào)):
In : @lru_cache ...: def add(a, b): ...: return a + b ...:
就像 dataclasses.dataclass,絕大部分場(chǎng)景都是這么用:
@dataclass class InventoryItem: ...
其實(shí) dataclass支持多個(gè)參數(shù):
def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False):
所以這種使用全部缺省值的裝飾器工廠用法中,括號(hào)反而顯得多余了。
Asyncio REPL
REPL對(duì)于學(xué)習(xí)一門新的編程語(yǔ)言非常有幫助,你可以再這個(gè)交互環(huán)境里面通過(guò)輸出快速驗(yàn)證你的理解是不是正確。
官方全新增加了一個(gè)Asyncio REPL功能,使用更加方便!
F-strings DEBUG
一個(gè)新增的調(diào)試功能,當(dāng)然一貫的,對(duì)調(diào)試毫無(wú)幫助。
Async Mock
單元測(cè)試模塊unittest添加了mock異步代碼的類:
In : import asyncio In : from unittest.mock import AsyncMock, MagicMock In : mock = AsyncMock(return_value={'json': 123}) In : await mock() Out: {'json': 123} In : asyncio.run(mock()) Out: {'json': 123} In : async def main(*args, **kwargs): ...: return await mock(*args, **kwargs) ...: In : asyncio.run(main()) Out: {'json': 123} In : mock = MagicMock() # AsyncMock也可以 In : mock.__aiter__.return_value = [1, 2, 3] In : async def main(): ...: return [i async for i in mock] ...: In : asyncio.run(main()) Out: [1, 2, 3]可迭代解包
這個(gè)主要是問(wèn)題修復(fù)。
到此,相信大家對(duì)“Python 3.8功能有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!