flowpy語法特性總覽和二進位包
Flowpy 對CPython添加的語法
所有的語法可以在項目wiki
thautwarm/flowpython
看個大概。
不過關於模式匹配,建議閱讀一下test文件,個人感覺這裡面的例子體現得還比較全。
https://github.com/thautwarm/flowpython/blob/master/test/test_patm.py
獲取Flowpy
地址如下
https://github.com/thautwarm/flowpython/blob/master/flowpy/0.2/flowpy.tar.gz
這個預編譯包只能讓windows上的python直接轉成flowpy,其實就是替換4個和Python解釋器有關的文件。
解壓了flowpy.tar.gz後,在flowpy/bin(64位)下有四個文件,在flowpy/x32(32位)下有相同名稱的四個文件,按照你的python選擇合適的文件替換就好了。windows的cpython(包括Anaconda發行版)直接在flowpy下使用以下cmd命令安裝flowpy。
python __main__.py
對於linux系統,我是deepin64位,debian64位的應該是都能用。
解壓flowpy.tar.gz後把linux/python3.6拿出來,替換自己python的 python3.6 文件。
也可以試試windows的安裝命令,但是Anaconda發行版沒法用。如果你的Python執行文件在環境變數里,那麼可以直接運行__main__.py 安裝。
其他
關於模式匹配其實要說的還挺多的,爆肝爆得比較累了,今天就隨便說一點。
flowpy的模式匹配的主題大概就是四點,美觀、功能強大、高效率和簡潔。
美觀
tomap = .f -> .var -> ret where: ret = list(map(f,var)) condic[] [1,2,3]: +(type) case (*a,b):(int,int,int) => assert [*a,b] == x and tomap(type)(x) == [int,int,int] where: x = [1,2,3] condic[] list(range(0,100)): +[] case (a,*b,c) => assert a==0 and b == list(range(1,99)) and c == 99 condic 1: [>] case 0 => assert 1 > 0 condic 1: [is not] case 1 => assert 1 is not 1 case 1 => assert 1 == 1 otherwise => True
不喜勿噴,反正我看見這代碼就高潮。
高效率(偽)
我不知道,不過肯定比你寫if語句快一 (丁) 點,因為我這裡從ast到位元組碼是C級別實現的,稍微跳過了幾層判斷表達式種類的過程。但是位元組碼執行速度並不會變快,所以差別不大。
功能強大
# 有什麼不能match? 或者代碼能比你用 if-elif-else + try-except-else-finally 長?# type = .x-> x.__class__condic[>] expr: # 默認 使用[>] 模式 +(type) case a:str => print(f"type _ == str, and its {a}") case (a,b):(int,None) => print("first of which is an interger and ends with a None ") print(f" the integer is {a}") case 100 => print("_ > 100") (type) case float => print("_ <= 100 and type _ == float") case 50 => print("type _ is not float and 50< _ <=100") +(.x->x%10) case a:2 => print("_%10 == 2 and _ <= 50") print(" _//10 == f{a//10}") [>=] case 10 => print("_%10 !=2 and 10<= _ <=50 ") otherwise => print("if type _ is int, _ < 10")
來,胡亂舉了個例子,你用原生cpython試試。
簡潔
省代碼,可以少一點賦值(見pep 379 舉的例子)。
https://github.com/python/peps/blob/master/pep-0379.txt
最後,正式的安裝程序(可以pip安裝)得等最後幾個重要特性更新好再說。
草案如下
expr ..key_name1: func(key_name2 = x) <=>map(key_name1 = expr, key_name2 = x)expr ..func(x) <=>func(expr,x)expr :: f<=>f(expr)
相當於成員函數一般。
因為linq那種寫法,Python當然是應該有的。
推薦閱讀:
※用python寫一個加密工具
※CNTK優先支持Python被懟,Github上要求.Net/C#為一等公民
※Python數據分析及可視化實例之CentOS7.2+Python3x+Flask部署標準化配置流程
※參加數學建模有沒有必要學python?
TAG:Python |