python3.8版本已經更新,數據分析師和數據開發者看過來

新版本python3.8已經發布

作為一個放棄java轉投python很多年的數據開發者,已經好久沒有更新python了,也很久沒有關注python的一些新功能新特性了,去年把自己做的幾個小項目更新到了python3.6,然後就一直沒把精力放到這一塊了。

今天因為安裝一個第三方庫失敗,打算去官網看下python的更新情況,發現已經更新至python3.8.2了,那麼就當機立斷下載安裝,順便學習一下python3.8的新特性吧。

python3.8版本已經更新,數據分析師和數據開發者看過來

安裝python3.8.2

  • windows下的安裝很簡單,直接下載msi安裝文件雙擊就可以了,然後稍微配置一下環境變量。
  • Linux下稍微複雜一點,主要是因為沒有合適的yum安裝包,具體步驟如下:
<code># 下載源碼
wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz
# 解壓
tar zxf Python-3.8.2.tgz Python-3.8.2/
# 進入文件夾
cd Python-3.8.2/
# 編譯前準備
yum update -y
yum groupinstall -y 'Development Tools'
yum install -y gcc openssl-devel bzip2-devel libffi-devel
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make

# 編譯安裝
./configure prefix=/usr/local/python3.8 --enable-optimizations
make && make install
# 添加環境變量
export PATH=$PATH:/usr/local/python3.8/bin//<code>


主要的新特性

Assignment expressions 海象運算符

Python 3.8.0 有一個新的語法:=,它將值賦給一個更大的表達式中的變量。它被親切地稱為“海象運算符”(walrus operator)

,因為它長得像海象的眼睛和象牙。

之前學了一直很自GOLANG,感覺python這次在想GOLANG學習,就像JAVA在學習python一樣。

python3.8版本已經更新,數據分析師和數據開發者看過來

現在讓我們看看下面的代碼段:

<code>a = range(15)
if (len(a)) > 10:
   print(f"List is too long ({len(a)} elements, expected <= 10)")/<code>

在這個代碼段中,我們將調用函數 len()兩次。有什麼方法可以避免重新調用以提高可讀性嗎?是的,在改進代碼之後,我們得到了以下結果:

<code>a = range(15)
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")/<code>

請儘量將海象運算符的使用限制在清晰的場合中,以降低複雜性並提升可讀性。

Positional-only parameters 僅限位置形參

新增了一個函數形參語法 / 用來指明某些函數形參必須使用僅限位置而非關鍵字參數的形式。 這種標記語法與通過 help() 所顯示的使用 Larry Hastings 的 Argument Clinic 工具標記的 C 函數相同。。

<code># 在下面的例子中,形參 a 和 b 為僅限位置形參,c 或 d 可以是位置形參或關鍵字形參,而 e 或 f 要求為關鍵字形參:
def f(a, b, /, c, d, *, e, f):
   print(a, b, c, d, e, f)
 
# 合法的
f(10, 20, 30, d=40, e=50, f=60)

# 不合法的
f(10, b=20, c=30, d=40, e=50, f=60)  # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)  # e must be a keyword argument/<code>

這種標記形式的一個用例是它允許純 Python 函數完整模擬現有的用 C 代碼編寫的函數的行為。 例如,內置的 divmod() 函數不接受關鍵字參數:

<code>def divmod(a, b, /):
   "Emulate the built in divmod() function"
   return (a // b, a % b)/<code>


Python 初始化配置(改進的嵌入)

新增的 PYTHONPYCACHEPREFIX 設置 (也可使用 -X pycache_prefix) 可將隱式的字節碼緩存配置為使用單獨的並行文件系統樹,而不是默認的每個源代碼目錄下的 pycache 子目錄。

緩存的位置會在 sys.pycache_prefix 中報告 (None 表示默認位置即 pycache 子目錄)。

f - 字符串支持 = 用於自動記錄表達式和調試文檔

增加 = 說明符用於 f-string。 形式為 f'{expr=}' 的 f - 字符串將擴展表示為表達式文本,加一個等於號,再加表達式的求值結果。 例如:

<code>>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)

>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"/<code>

通常的 f 字符串格式說明符 允許更細緻地控制所要顯示的表達式結果:

<code>>>> delta = date.today() - member_since
>>> f'{user=!s} {delta.days=:,d}'
'user=eric_idle delta.days=16,075'/<code>

= 說明符將輸出整個表達式,以便詳細演示計算過程:

<code>>>> print(f'{theta=}  {cos(radians(theta))=:.3f}')
theta=30 cos(radians(theta))=0.866/<code>

其他新特性

  1. 正則表達式添加對 \\N{name} 專業詞彙的支持
<code>>>> notice = 'Copyright © 2019'
>>> copyright_year_pattern = re.compile(r'\\N{copyright sign}\\s(\\d{4})')
>>> int(copyright_year_pattern.search(notice).group(1))/<code>
  1. Dict and dictviews are now iterable in reversed insertion order using reversed()
  1. 剩下的特性就比較偏僻了,就不一一介紹了,感興趣的同學可以直接參考官方文檔,python3.8更新內容。


分享到:


相關文章: