隨手扎
Python-3.8後的f-String
近況
最近在翻itertools
、collections
,和已經很常在用,但想看看還有啥的functools
。這裡頭的東西並非必須,大部分我都有能力自幹。但沒必要再造輪子,甚至可以從此獲得一些啟發。譬如,itertools.groupby
,我看到第一個想法就是:「這不就可以更簡單實現Hadoop裡,Map-Reduce分組的功能?」。於是乎就寫了下面一段程式:
from itertools import groupby
from functools import reduce
a = [1,2,3,4,5,6,7,8,9,]
def pipe(data, *process):
result = data
for proce in process:
result = proce(result)
return result
p = pipe(a, lambda x: map(lambda y:y**2, x),
lambda x: sorted(x, key=lambda y: y%2),
lambda x: groupby(x, key=lambda y: y%2),)
for g, d in p:
l = list(d)
s = sum(l)
print("{g}: {d}, sum:{s}".format(g=g, d=l, s=s))
不知道python有沒有
pipe
的內部實現?
這段程式碼是將list a
裡的奇數和偶數分組取平方加總。比較麻煩的是groupby依照官方文件寫法,相當於以下程式碼:
class groupby:
# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
def __init__(self, iterable, key=None):
if key is None:
key = lambda x: x
self.keyfunc = key
self.it = iter(iterable)
self.tgtkey = self.currkey = self.currvalue = object()
def __iter__(self):
return self
def __next__(self):
self.id = object()
while self.currkey == self.tgtkey:
self.currvalue = next(self.it) # Exit on StopIteration
self.currkey = self.keyfunc(self.currvalue)
self.tgtkey = self.currkey
return (self.currkey, self._grouper(self.tgtkey, self.id))
def _grouper(self, tgtkey, id):
while self.id is id and self.currkey == tgtkey:
yield self.currvalue
try:
self.currvalue = next(self.it)
except StopIteration:
return
self.currkey = self.keyfunc(self.currvalue)
這總作法不會記憶遇到過得組別,就…短期記憶?所以得先做排序,好讓分組成功。之後reduce
的部份,要用lambda
寫在pipe
有點困難,索性而外做了(並且直接拿了sum
來當作執行reduce
😏)。
Python 3.8 後的f-string新能力
還記得之前寫過Python在3.6後幾個便利的新變化。當中提到根據PEP 498在Python3.6增加了f-string,讓字串format可以更簡單,像是:
i1 = 1
i2 = 2
i3 = 3
print(f"i1 = {i1}; i2 = {i2}; i3 = {i3}")
而在Python 3.8之後, f-Strings又多了一項能力,上面的程式現在可以在進一步簡化:
i1 = 1
i2 = 2
i3 = 3
print(f"{i1=}; {i2=}; i3 = {i3=}")
兩者幾乎是完全等價的。後者甚至可以進一步指定打印型態,像是print(f"{i1=}; {i2=}; i3 = {i3=:.3f}")
。
不過實際上3.6就有指定型態的能力了。詳見文件。
只可惜我個人的還是3.6,所裝的Anaconda也還是3.7,Repl.it也是3.7,所以只能另外找個3.8的來小玩一下:
f-Strings是最吸引我的特性,但3.8實際還多了許多,可能等等在寫個分享吧!光f-Strings內容夠多了😼。
LINE Pay贊助 信用卡小額贊助