跳至主要内容

Python 的 := 符號 (Assignment expressions)

· 閱讀時間約 2 分鐘

別名海象符號

What’s New In Python 3.8: Assignment expressions

PEP 572 – Assignment Expressions

3.8 加入的這個海象符號當年有注意到但沒看懂,也就被我淡忘掉了。

本來就很受不了多做一次不必要運算的行為,可是為了省那一次又多寫一個 assignment 也頗令人煩躁不舒爽,近期開始養成每天寫上一、兩題的習慣後特別有感。

讀到這則 Fastest Way to Read Excel in Python | Haki Benita 裡頭有用到才讓我回想起其存在並去找出究竟是什麼意思。

不算很常見,初見也不直覺,但用得上的時候真的能簡潔不少。

直接偷 release note 裡的例子來說明。

沒有 walrus operator 的情況下,一段程式懶惰的寫法如下:

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

前述的減少不必要運算的不偷懶寫法則可能變成:

n = len(a)

if n > 10:

print(f"List is too long ({n} elements, expected <= 10)")

用上這個新符號的化就能夠簡化成:

if (n := len(a)) > 10:

print(f"List is too long ({n} elements, expected <= 10)")

拿這個例子來看就很容易理解,也就是顧名思義 assign 的同時亦是一個 expression,所以才能用在 if 的後頭。

另一個顯然很好用的情況就是在 while loop 裡:

# Loop over fixed length blocks

while (block := f.read(256)) != '':

process(block)

傳統的寫法多半會變成:

block = f.read(256)

while block != '':

process(block)

block = f.read(256)

Java Text Blocks (文字區塊)的運用要點

· 閱讀時間約 2 分鐘

最近開始拾起一些在 Java 裡屬相對較新的功能,例如本次想要稍微提下的 Text Blocks,這也是我個人期盼已久的功能。

自 Java 15 起 Text Blocks 脫離預覽成為標準功能,然而我的理解只停留在類似 Python 用 3 個引號括起來就可以寫下多行內容的程度。

至於縮排是怎麼認定的?尾巴的空白會保留還是被去掉?等問題由於過往的輕度使用大概都是在 SQL 語句上,便不是那麼在乎實際字串組成後的排版會長成什麼模樣,只要在原始碼裡面看起來順眼就行。

這回我下定決心要有足夠的理解便找到了這則官方教學 Programmer's Guide to Text Blocks,內容相當完善,相信已經涵蓋絕大部份使用上需注意的要點,亦有充足易懂的範例,強烈建議讀過原文,看似有相當長度實際上非常好理解且有不少示範,所以閱讀起來並不花費太多時間,以下取出一些摘要:

  • 基本語法
  • 解釋成品字串縮排空白計算的原則
  • 結尾的 3 個引號是否單獨成行會影響組成字串最後是否有個換行符號
  • 保留尾巴空白的技巧
  • 混用空白字元(空白跟 tab 等)縮排可能造成的問題
  • 如何使用跳脫連成同一行
  • 推薦/避免使用 Text Blocks 的時機
  • 應運而生的一些 instance method

以上要點大部份都是我原先沒想過要知道的事情,著是獲益匪淺,若干年前老覺得 Java 各種沒人性,近年許多實用功能補上來變成正式版,對於 Java 反而變得頗有好感了。

撿到一篇講古文:離線交易儲值卡的興衰史

· 閱讀時間約 1 分鐘

你所不知的塑膠貨幣歷史

2023-09-03 plastic money on Computers Are Bad

上面是一篇在 Hacker News Daily 看到專門講述 stored value cards,也就是一種餘額實際存在卡片內,離線進行交易的應用之興衰史。

裡頭從緣起、規範制定開發及相關技術、成功試驗案例乃至如今仍在營運中的大規模應用皆有涵蓋,相當詳盡。

令人感慨的是網路連線已經相當普及可靠,使得該技術在現代條件下沒有太多選用的理由,即便他有較線上交易簡便之處,當然也有其更複雜之處。

很喜歡這種講古的文章,這則又帶有一股哀傷的情緒…