python3.8 新的特性介紹

python3.8 新的特性介紹


python3.8 已經發布有一段時間,最近一段時間 纔看這個版本的特性, 有一些優化,

增加了一下 東西,覺得挺好的。

  1. 海象運算符 :=

  2. fstring 增強版

  3. def 函數 指定 位置,關鍵字參數

  4. 模塊細節調整

海象運算符

這個都用這個翻譯 := 這個符號,可能這個符號看起來像海象吧。 這個作用可以把等號右面表達式的值 賦值給 這個符號 前面的變量。

舉個例子 就明白了。

列表長度判斷

比如 我希望 判斷一個 list 長度 如果小於等於5 ,我就打印一下,如果大於5 我只輸出前5 個元素

nums = list(range(10))

length = len(nums)
if length <= 5:
    print(nums)
else:
    print(nums[0:5])

這樣 你要定義變量 length ,並且這個變量可能 之後 就不會再用了, 這樣當然沒有什麼 問題,其實不夠簡潔。

nums = list(range(10))

# length = len(nums)
if (length:=len(nums)) <= 5:
    print(nums)
else:
    print(nums[0:5])

這樣看起來 是不是比較優雅一點啊。

讀取文件,判斷文件 有沒有讀完,每次讀取一行, 最後 看有沒有讀完

# 僞代碼 

def process(block):
    print(f"{block=}")


with open('names.txt', 'r') as f:
    while (block := f.readline()) != '':
        process(block)

fstring 增強

在python3.7 裏面 已經可以支持fstring 這種寫法,{name} 這樣就會解析這個變量了。

name = 'frank'
hobby = 'swiming'
print(f"name={name},hobby={hobby}")
print(f"name={name!r},hobby={hobby!r}")

"""結果如下
name=frank,hobby=swiming
name='frank',hobby='swiming'
"""

上面的print 發現有一個 name= 和裏面的大括號裏面的name 是重複的。 在python3.8 中 ,在 大括號裏面 加一個 = 就可以了,是不是很完美,這種打印 是原生字符串會把引號 打印出來, 當然 可以指定格式打印了 。python 3.7 方法 一樣可以指定格式,格式寫在=號的後面。

name = 'frank'
hobby = 'swiming'
print(f"{name=},{hobby=}")

"""結果如下
name='frank',hobby='swiming'

"""

像下面 可以指定具體的格式, 是不是很好啊。

print(f"name={name!s},hobby={hobby!s}")
print(f"name={name!r},hobby={hobby!r}")

函數增強

​ 這個功能 其實一直都有,只是在這之前沒有正式做feature, 就是 可以指定一些參數只能傳 位置參數,一些參數 只能傳入關鍵字參數, 這樣 有一定好處,強行 讓調用者 安裝 規則調用 函數,這樣比較清晰一點。

以下面的fun函數 爲例 , 有一個/ 這裏之前的變量 只能傳入位置參數* 之後的變量只能用關鍵字傳入進來,

/* 之間的變量 ,可以選擇 用 位置 或者關鍵字傳入參數 , 這裏不要求 全部都是使用這個函數聲明,有的話,就按照這種約定來。

def fun(a, b, /, c, d, *, e, f):
    print(f"{a=},{b=},{c=},{d=},{e=},{f=}")

    

fun(1, 2, 3, 4, e=5, f=6) # ok 
fun(1, 2, c=3, d=4, e=5, f=6) #ok 
fun(1, 2, 3, d=4, e=5, f=6) # ok 


fun(1, 2, c=3, 4, e=5, f=6) # error 1 
fun(a=1,b=2,3,4,e=5,f=6) # error 2
fun(1,2,3,4,5,f=6)  # error 3
fun(1,b=2,3,4,e=5,f=6) # error 4

第一種錯誤, 因爲 c 傳入關鍵字參數 ,d 是位置參數 。因爲 python 中位置參數 是在 關鍵字參數後面的。

Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
>>> 
... def fun(a, b, /, c, d, *, e, f):
...     print(f"{a=},{b=},{c=},{d=},{e=},{f=}")
...     
>>> fun(1, 2, c=3, 4, e=5, f=6)
  File "<input>", line 1
SyntaxError: positional argument follows keyword argument

第二種錯誤, a,b 只能是位置參數, 傳入關鍵字 肯定不對啊。

>>> fun(a=1,b=2,3,4,e=5,f=6)
  File "<input>", line 1
SyntaxError: positional argument follows keyword argument

第三種錯誤,e,f 只能是關鍵字 參數, e 傳入的是位置參數。

>>> fun(1,2,3,4,5,f=6)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: fun() takes 4 positional arguments but 5 positional arguments (and 1 keyword-only argument) were given

第四種錯誤, a,b 只能是位置參數, 傳入關鍵字 肯定不對啊。

>>> fun(1,b=2,3,4,e=5,f=6)
  File "<input>", line 1
SyntaxError: positional argument follows keyword argument

新的模塊 metadata

這個模塊 importlib.metadata 可以查看 第三方package 一些元信息,依賴等

from importlib.metadata import version, requires, files

首先 本機要安裝 flask 才能看,不能直接 去pypi 看版本,這個只是看你本地按照的環境的信息

>>> from importlib.metadata import  requires,version,files
... 
>>> version('flask')
'1.1.1'
>>> version('Flask')
'1.1.1'
>>> requires('flask')
>>> list(files('flask'))[:2]
[PackagePath('../../Scripts/flask.exe'), PackagePath('Flask-1.1.1.dist-info/INSTALLER')]

functools.lru_cache 調用方式的改進

@functools.lru_cache() 這裏要有一個括號,現在 兩種方式都可以兼容 了。

import functools

@functools.lru_cache()
def fun():
    pass


@functools.lru_cache
def fun2():
    pass


總結

​ 當然還有一些 模塊細節調整,asynicio 模塊的穩定版, 一些細節優化,具體 看下 下面的參考鏈接,這裏之列了一些 我感覺比較常用的一些改變。

參考文檔

pep-0572

new-feature

分享快樂,留住感動. 2020-03-27 18:50:19 --frank
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章