在python使用类似于scala的链式编程方法
1.实现函数装饰器(随便copy了一个)
-
T = TypeVar('T')
-
-
-
class PyObject(ctypes.Structure):
-
class PyType(ctypes.Structure):
-
pass
-
-
ssize = ctypes.c_int64 if ctypes.sizeof(
-
ctypes.c_void_p) == 8 else ctypes.c_int32
-
_fields_ = [
-
('ob_refcnt', ssize),
-
('ob_type', ctypes.POINTER(PyType)),
-
]
-
-
-
def sign(clazz, funcName): # * 功能注册装饰器,加在函数上,可以将函数注册到特定类
-
"""
-
? clazz class类名
-
? funcName 注册的函数名称
-
"""
-
def _(function):
-
class SlotsProxy(PyObject):
-
_fields_ = [('dict', ctypes.POINTER(PyObject))]
-
-
name, target = clazz.__name__, clazz.__dict__
-
proxy_dict = SlotsProxy.from_address(id(target))
-
namespace = {}
-
ctypes.pythonapi.PyDict_SetItem(
-
ctypes.py_object(namespace),
-
ctypes.py_object(name),
-
proxy_dict.dict,
-
)
-
namespace[name][funcName] = function
-
-
return _
2.注册函数方法
dict:
-
-
# * dict
-
-
-
-
def vs(self: dict) -> list:
-
return list(self.values())
-
-
-
-
def ks(self: dict) -> list:
-
return list(self.keys())
-
-
-
-
def kvs(self: dict) -> list:
-
re = []
-
for k, v in self.items():
-
re.append((k, v))
-
return re
-
-
-
-
def dictToStr(self) -> str:
-
return json.dumps(self, ensure_ascii=False)
list:
-
-
-
-
def mapWith(self, __func: Callable[[Any], Any]):
-
return list(map(__func, self))
-
-
# * list
-
-
-
-
def flatMapWith(self, __func: Callable[[Any], List[Any]]):
-
res = []
-
for ts in map(__func, self):
-
if ts:
-
for t in ts:
-
res.append(t)
-
return res
-
-
-
-
def appendAll(self, vs: List[T]) -> List[T]:
-
for v in vs:
-
self.append(v)
-
return self
-
-
-
-
def toSet(self):
-
return set(self)
-
-
-
-
def filterWith(self, __func: Callable[[Any], bool]):
-
return list(filter(__func, self))
-
-
-
-
def distinct(self):
-
return list(set(self))
-
-
-
-
def groupByKey(self: List[Tuple[str, T]]) -> Dict[str, List[T]]: # ? 聚合函数
-
tmpMap = dict()
-
for data in self:
-
key = data[0]
-
value = data[1]
-
valueList = []
-
if key in tmpMap:
-
valueList = tmpMap[key]
-
valueList.append(value)
-
tmpMap[key] = valueList
-
-
return tmpMap
-
-
-
-
def tupleToDict(self: List[Tuple[str, T]]) -> Dict[str, T]:
-
re = dict()
-
for t in self:
-
re[t[0]] = t[1]
-
-
return re
-
-
-
-
def reduceWith(self, __func):
-
return reduce(__func, self)
-
-
-
-
def sumWith(self: List):
-
return sum(self)
-
-
-
-
def reduceByKey(self: List[Tuple[str, T]], __func: Callable[[T], T]) -> Dict[str, T]:
-
re = self.groupByKey()\
-
.kvs()\
-
.map(lambda t: (t[0], t[1].reduce(__func)))\
-
.toDict()
-
return re
-
-
-
-
def foreach(self, __func):
-
for t in self:
-
__func(t)
-
return self
-
-
-
-
def listToStr(self) -> str:
-
return json.dumps(self, ensure_ascii=False)
-
-
-
-
def listIsEmpty(self: List) -> bool:
-
return len(self) == 0
-
set:
-
# * set
-
-
-
-
def toList(self):
-
return list(self)
str:
-
-
# * str
-
-
-
-
def startsIn(self: str, *keys):
-
for s in keys:
-
if self.startswith(s):
-
return True
-
return False
-
-
-
-
def endsIn(self: str, *keys):
-
for s in keys:
-
if self.endswith(s):
-
return True
-
return False
-
-
-
-
def appendStr(self: str, s: str):
-
return self str(s)
3.使用示例
-
-
data=[("a",1),("b",2),("a",3),("b",4),("c",5)]
-
-
re=data.map(lambda t: (t[0],t[1] 1))\
-
.groupByKey()\
-
.vs()\
-
.map(lambda l:l.sum())\
-
.reduce(lambda a,b:a b)
-
-
print(re)
-
-
"""
-
step 1: [("a",2),("b",3),("a",4),("b",5),("c",6)]
-
step 2: {"a":[2,4],"b":[3,5],"c":[6]}
-
step 3: [[2,4],[3,5],[6]]
-
step 4: [6,8,6]
-
step 5: 20
-
"""
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfhkbji
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13