Flowpython針對lambda的一個修正
之前where子句的作用其實很naive的。
就是把where里的語句給先執行了再執行前面的表達式。於是乎,連續的lambda表達起來不太好看的。
比如昨天的代碼需要這樣做:
t=.a,b,c -> .d,e,f -> .g,h,i -> tmp(a,b,c,d,e,f,g,h,i) where:n def tmp(a,b,c,d,e,f,g,h,i):n middle_value1 = a*e*i + b*f*g + c*d*hn middle_value2 = g*e*c + h*f*a + i*d*bn return middle_value1 - middle_value2 n
這個呢,感覺不太好看。
今天專門處理了一下where前表達式是lambda的情況,上面的代碼這麼寫就好了:
t=.a,b,c -> .d,e,f -> .g,h,i -> ret_value where:n middle_value1 = a*e*i + b*f*g + c*d*hn middle_value2 = g*e*c + h*f*a + i*d*bn ret_value = middle_value1 - middle_value2 n
就是這樣了。什麼意思呢? where的作用域限制在最後一個lambda的閉包內。
這樣就可以寫稍微優雅點的currying了。
最後說一下,為什麼我要兼容三種表達式呢?
1. as-with f1_args def as f2_args def as f3_args def <表達式>[where子句]n2. .f1_args->.f2_args->.f3_args-> <表達式> [where子句]n3. lambda f1_args: lambda f2_args: lambda f3_args : <表達式> [where子句] n
前兩者除了外形,功能一致,第三種是標準的,我真的覺得不好看(求不洗)。前兩者支持參數annotation, 比如
.x:int->x+1n
標準的lambda不支持這個,可讀性不好(2333
第一種lambda我的意思是Pythonic風格,自然語言,雖然似乎有點繞。。。但放到代碼高亮里,迷之能讓我想起一年前學Python的回憶...
第二種lambda呢,是一門正常語言應該有的。。
最後是關於獲得flowpython的方法,我這邊有linux下的built-in版本,windows的話等會我去虛擬機弄一個。如果你不想自己編譯的可以找我。
但是這個編譯真的超簡單啊。。我來跟你說。。
要是你有一個c++編譯器...
然後你先去官網下一個python3.6.2的source
Python Source Releases for Source release
然後到我的gayhub上把flowpython下下來解壓。
thautwarm/flowpython
在解壓目錄里建一個文件夾叫PythonDist,把CPython3.6.2解壓到裡面。
目錄結構這樣的。。
然後你要是裝有原生python的話就超級好辦了,在flowpython目錄打開shell/cmd,
然後輸入
./conf commit -v try_flowpyn
額,如果不行可能得
python config.py commit -v try_flowpyn
然後會生成一個temp_version 文件夾,裡面有一個try_flowpy的文件里,裡面就是當前flowpy版本的暫存...額,這句話你忘了吧,是給潛在的開發者說的...
總之這個時候再輸入一行命令
./conf make -m allnpython config.py make -m alln
啊,對了,你還得有一個make工具,這個很好裝的。。linux自帶,windows戳Index of /gnu/make/
嘛,然後編譯完,就可以在PythonDist目錄輸入
./pythonn
打開flowpython了
不會影響到你本地的python的。。
要是本地沒有python(但是估計看我這文章的應該大多數本地都有python吧?
還是要個make,先把CPython的對應文件替換flowpy文件夾下的,子路徑一致的。然後直接進/PythonDist目錄,
./configure CC=<your C/C++ compiler>nmake regen-gramamrnmake regen-astnmaken./pythonn
嗯... 順便在這裡說了一通怎麼編譯python...
以上...
推薦閱讀:
※linux下pip模塊安裝路徑?
※python下使用selenium怎麼才能控制瀏覽器載入某個元素?
※python里函數作為返回值如何進行比較?
※Python有哪些黑魔法?