日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python3.8剛剛發(fā)布!一分鐘了解新版本的強(qiáng)大功能!

 

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個(gè)不僅審美在線,而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對(duì)網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無止境。

今天Python3.8發(fā)布啦,新版本添加了很多全新功能,也表明Python的版本之路前進(jìn)了一大步,小編整理了新版本的幾個(gè)主要更新,為大家做詳細(xì)解讀!

順便一提,導(dǎo)致Python之父龜叔憤然離職的賦值表達(dá)式功能還是上線了~

新增賦值表達(dá)式

PEP 572的標(biāo)題是賦值表達(dá)式,也叫做「命名表達(dá)式」,不過它現(xiàn)在被廣泛的別名是「海象運(yùn)算符」(The Walrus Operator)。因?yàn)?=很像海象「眼睛小,長著兩枚長長的牙」這個(gè)特點(diǎn)^_^。

在這里給大家展示個(gè)通過用PEP 572改寫的一行實(shí)現(xiàn)斐波那契數(shù)列的例子: 

 
 
 
 
  1. 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   
  2.      ...: (f, t, i + 1, b, a + b))   
  3.   Input: 10   
  4.   fib(1) = 1  
  5.   fib(2) = 1  
  6.   fib(3) = 2  
  7.   fib(4) = 3  
  8.   fib(5) = 5  
  9.   fib(6) = 8  
  10.   fib(7) = 13  
  11.   fib(8) = 21  
  12.   fib(9) = 34  
  13.   fib(10) = 55  
  14.   Out: True 

基于Raymond Hettinger版本改寫: 

 
 
 
 
  1. In : [(t:=(t[1], sum(t)) if i else (0,1))[1] for i in range(10)]  
  2.   Out: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 

強(qiáng)制使用位置參數(shù)

PEP 570說白了就是強(qiáng)制使用者用位置參數(shù)

溫馨提示:Python3.8版本下,見到以下報(bào)錯(cuò): 

 
 
 
 
  1. TypeError: divmod() takes no keyword arguments 

就是這個(gè)原因啦!

運(yùn)行時(shí)添加審計(jì)hooks

現(xiàn)在可以給Python運(yùn)行時(shí)添加審計(jì)鉤子:  

 
 
 
 
  1. In : import sys  
  2.    ...: import urllib.request  
  3.    ...:  
  4.    ...:  
  5.    ...: def audit_hook(event, args):  
  6.    ...:     if event in ['urllib.Request']:  
  7.    ...:         print(f'Network {event=} {args=}')  
  8.    ...:  
  9.    ...: sys.addaudithook(audit_hook)  
  10.    In : urllib.request.urlopen('https://httpbin.org/get?a=1')  
  11.    Network event='urllib.Request' args=('https://httpbin.org/get?a=1', None, {}, 'GET')  
  12.    Out:  

目前支持審計(jì)的事件名字和API可以看PEP文檔(延伸閱讀鏈接2), urllib.Request是其中之一。另外還可以自定義事件: 

 
 
 
 
  1. In : def audit_hook(event, args):  
  2.  ...:     if event in ['make_request']:  
  3.  ...:         print(f'Network {event=} {args=}')  
  4.  ...:  
  5.  In : sys.addaudithook(audit_hook)  
  6.  In : sys.audit('make_request', 'https://baidu.com')  
  7.  Network event='make_request' args=('https://baidu.com',)  
  8.  In : sys.audit('make_request', 'https://douban.com')  
  9.  Network event='make_request' args=('https://douban.com',) 

跨進(jìn)程內(nèi)存共享

可以跨進(jìn)程直接訪問同一內(nèi)存(共享):  

 
 
 
 
  1. # IPython進(jìn)程A  
  2.    In : from multiprocessing import shared_memory  
  3.    In : a = shared_memory.ShareableList([1, 'a', 0.1])  
  4.    In : a  
  5.    Out: ShareableList([1, 'a', 0.1], name='psm_d5d6ba1b') # 注意name  
  6.    # IPython進(jìn)程B(另外一個(gè)終端進(jìn)入IPython)  
  7.    In : from multiprocessing import shared_memory  
  8.    In : b = shared_memory.ShareableList(name='psm_d5d6ba1b')  # 使用name就可以共享內(nèi)存  
  9.    In : b  
  10.    Out: ShareableList([1, 'a', 0.1], name='psm_d5d6ba1b') 

全新第三方包讀取模塊

使用新的 importlib.metadata模塊可以直接讀取第三方包的元數(shù)據(jù):   

 
 
 
 
  1. In : from importlib.metadata import version, files, requires, distribution  
  2.    In : version('flask')  
  3.    Out: '1.1.1'  
  4.    In : requires('requests')  
  5.    Out:  
  6.    ['chardet (<3.1.0,>=3.0.2)',  
  7.     'idna (<2.9,>=2.5)',  
  8.     'urllib3 (!=1.25.0,!=1.25.1,<1.26,>=1.21.1)',  
  9.     'certifi (>=2017.4.17)',  
  10.     "pyOpenSSL (>=0.14) ; extra == 'security'",  
  11.     "cryptography (>=1.3.4) ; extra == 'security'",  
  12.     "idna (>=2.0.0) ; extra == 'security'",  
  13.     "PySocks (!=1.5.7,>=1.5.6) ; extra == 'socks'",  
  14.     'win-inet-pton ; (sys_platform == "win32" and python_version == "2.7") and extra == \'socks\'']  
  15.    In : dist = distribution('celery')  
  16.    In : dist.version  
  17.    Out: '4.3.0'  
  18.    In : dist.metadata['Requires-Python']  
  19.    Out: '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*'  
  20.    In : dist.metadata['License']  
  21.    In : dist.entry_points  
  22.    Out:  
  23.    [EntryPoint(name='celery', value='celery.__main__:main', group='console_scripts'),  
  24.     EntryPoint(name='celery', value='celery.contrib.pytest', group='pytest11')]  
  25.    In : files('celery')[8]  
  26.    Out: PackagePath('celery/__init__.py')  
  27.    In : dist.locate_file(files('celery')[8])  
  28.    Out: PosixPath('/Users/dongweiming/test/venv/lib/python3.8/site-packages/celery/__init__.py') 

新增緩存屬性

緩存屬性 (cached_property) 是一個(gè)非常常用的功能,很多知名 Python 項(xiàng)目都自己實(shí)現(xiàn)過它,現(xiàn)在終于進(jìn)入版本庫了。

functools.lru_cache作為裝飾器時(shí)可以不加參數(shù)

lru_cache裝飾器支持 max_size和 typed2個(gè)參數(shù),如果對(duì)默認(rèn)參數(shù)不敏感,過去只能這么用(需要空括號(hào)):  

 
 
 
 
  1. In : @lru_cache()  
  2.    ...: def add(a, b):  
  3.    ...:     return a + b  
  4.    ...: 

從3.8開始可以直接作為裝飾器,而不是作為返回裝飾器的函數(shù)(不加括號(hào)):   

 
 
 
 
  1. In : @lru_cache  
  2.    ...: def add(a, b): 
  3.    ...:     return a + b  
  4.    ...: 

就像 dataclasses.dataclass,絕大部分場(chǎng)景都是這么用:   

 
 
 
 
  1. @dataclass  
  2.     class InventoryItem:  
  3.         ... 

其實(shí) dataclass支持多個(gè)參數(shù):   

 
 
 
 
  1. def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False,  
  2.                   unsafe_hash=False, frozen=False): 

所以這種使用全部缺省值的裝飾器工廠用法中,括號(hào)反而顯得多余了。

Asyncio REPL

REPL對(duì)于學(xué)習(xí)一門新的編程語言非常有幫助,你可以再這個(gè)交互環(huán)境里面通過輸出快速驗(yàn)證你的理解是不是正確。

官方全新增加了一個(gè)Asyncio REPL功能,使用更加方便!

F-strings DEBUG

一個(gè)新增的調(diào)試功能,當(dāng)然一貫的,對(duì)調(diào)試毫無幫助。

Async Mock

單元測(cè)試模塊unittest添加了mock異步代碼的類: 

 
 
 
 
  1. In : import asyncio  
  2.   In : from unittest.mock import AsyncMock, MagicMock  
  3.   In : mock = AsyncMock(return_value={'json': 123})  
  4.   In : await mock()  
  5.   Out: {'json': 123}  
  6.   In : asyncio.run(mock())  
  7.   Out: {'json': 123}  
  8.   In : async def main(*args, **kwargs):  
  9.   ...:     return await mock(*args, **kwargs)  
  10.   ...:  
  11.   In : asyncio.run(main())  
  12.   Out: {'json': 123}  
  13.   In : mock = MagicMock()  # AsyncMock也可以  
  14.   In : mock.__aiter__.return_value = [1, 2, 3]  
  15.   In : async def main():  
  16.   ...:     return [i async for i in mock]  
  17.   ...:  
  18.   In : asyncio.run(main())  
  19.   Out: [1, 2, 3] 

可迭代解包

這個(gè)主要是問題修復(fù)。

好啦,現(xiàn)在你知道 Python 3.8 的最新功能了嗎?


網(wǎng)頁名稱:Python3.8剛剛發(fā)布!一分鐘了解新版本的強(qiáng)大功能!
本文網(wǎng)址:http://www.dlmjj.cn/article/dhsocpo.html