隨手扎
Python在3.6後幾個便利的新變化
前言
這幾天又看了/試了不少東西喔。雖然也開始往下一個階段進行, 但興趣的事情,還是添加不少東西能來寫下隨筆。
這次的話題與前幾篇–JShell?-程式語言越來越像Lisp有關。 在那篇我留下了不少以後可能回來談談的話題,包含:
- JAVA版本之謎。
- 為什麼不使用LISP?
關於第一點,我打算去編譯看看幾個我挺喜歡的軟體再來說說感想, 但幾日前在Medium看到一篇文章。裡面有張圖片這麼形容JAVA:
JAVA騎士要去救城堡裏的公主,他很快的完成裝備前往救援,但是 他發現竟然有兩個 不同版本的城堡,重點是裡面沒有公主 。
Python 3.6之後LAG覺得有用的幾個新特性
已經忘記原因了齁,但數天前又LAG跑去看Python Whtat's news。 今天來分享幾個又LAG覺得非常有用的新特性。
不過很可惜的,又LAG主要的電腦還停留在 Python 3.5.2
。要更新到新版本需要自行編譯,還好目前沒有這樣特別的需求,
並且筆電與虛擬機都是使用 3.6
或之後的版本,可以說如果你是安裝
Ubuntu 16.04
之後或其衍生版,應該內建的都是 3.6
之後的版本了。
至於Windows的用戶應該可以直接在官網下載安裝包。
PEP 498, 格式化的字符串文字
在過去我們知道Python早期有 %
格式化字串的寫法。這個寫法非常相似於
傳統C語言在寫 printf
,使用的標示符號也幾乎一樣。
i = 1
print("i = %d"%(i))
不過在 Python3
之後,字串多加了format的方法。這個方法可以一順序取值,
也可以指定 keyword
。
i1 = 1
i2 = 2
i3 = 3
print("i1 = {}; i2 = {}; i3 = {}".format(i1,i2,i3))
print("i1 = {i1}; i2 = {i2}; i3 = {i3}".format(i1=i1, i2=i2, i3=i3))
在3.6之後更可以簡化到這麼寫:
i1 = 1
i2 = 2
i3 = 3
print(f"i1 = {i1}; i2 = {i2}; i3 = {i3}")
Amazing ,這有點像是 ECMAScript 6
(ES6/JavaScript/JS)裡面這麼寫:
var i1 = 1
var i2 = 2
var i3 = 3
console.log(`i1 = ${i1}; i2 = ${i2}; i3 = ${i3}`)
想當初在和別人合作寫 Node.js
時是多麼羨慕這樣簡單的寫法,而那時還特別去查查
Python有沒有類似寫法,當時還只是提案(印象中我有參與極短時間的討論0.0)。而如今Python也有了。
其他類是 f""
的語法還有 r""
、 u""
和 b""
。分別代表 raw
、 unicode
和 byte
。在 raw
中 \
會原原本本的輸出,u和b分別接受unicode字串和ascii字串。
print(r"no new line \n not new line")
舉例來說上面程式會原始的輸出字串。
no new line \n not new line
PEP 526 , 變量注释的語法。
2020/02/25 補充
正式支援Type Hint後,除了IDE檢查支援外,也有像是mypy這類專案去檢查程式碼,然後才執行。(檢查不過的話就可能報錯。某種程度強迫你寫出更健全的程式碼)
註釋,終究是註釋!
在Python3.6允許這麼寫:
x:int
y:int = 2
def add(a:int, b:int) -> int:
return a+b
變數:形態
或是def 函數(參數:形態)->回傳形態:
,其中形態是對於變數的注記。
其實我原本看到以爲,這更像Lisp的(declare (type))
宣告型別,其目的之一是為了加速與編譯安全檢查。不過Python終究是動態語言,
實際上如此寫法只是註釋。像是上面函數如果這麼呼叫:
add("a", "b") # -> "ab"
上面同樣能夠呼叫成功,沒有出現任何錯誤訊息。
所以這樣寫有什麼好處呢?LAG後來查了一下,這麼寫對於Python解釋器會直接當成變數註解,但是如果IDE支援,IDE可以提供更精確的輔助工具。
此外,如過與其他軟體工程師互動,能夠更快明白函式API如何使用,而無需寫寫進函式註解。我想,這可能對於pydoc
也有用。
不過,如果是給自己或內部使用,LAG覺得同樣有點多餘… 不太有美感。
async 和 await
Python 3.7正式將async
和await
納入關鍵字。後來看了下,與ES6的異步還是有所不同。其主要作用是函式庫asyncio
的語法糖,最終呼叫還是要用asyncio
(asyncio.run()
)的方式。不過看起來該函式庫還很常變動,使用時應該多加注意。(這種用法有點像Lua 5.3的coroutine
)
題外話:所以說PHP呢?
今早,LAG朋友貼了一個連結給LAG。沒錯,PHP也可以對函數給與的參數變數宣告類型了….