aardio扩展库:调用Python函数(例如itertools.permutations和itertools.combinations)

By jerryxjr1220 at 2021-10-05 • 0人收藏 • 889人看过

Python中有非常多比较好用的函数,比如排列函数itertools.permutations和itertools.combinations,对应高数中的P(m,n)和C(m,n)。

但是,由于python输出到aardio中的都是pyObject对象,无法直接被调用,因此做了一个扩展库,用web.json来解析(json中的列表和python的列表语法一致)

调用openpyxl直接读取excel(不用安装office),见2楼。

import console;
console.open();
import python;

console.dumpTable(python.permutations({"我","爱","你"},2))

console.dumpTable(python.combinations({"我","爱","你"},2))

console.pause();

捕获.PNG

//Python函数调用库
namespace python{
	permutations = function(list, n){
		import string.template;
		import web.json;
		import py3;
		strlist = web.json.stringifyArray(list);
		if !n {n=#list};
		pycode = string.template();
		pycode.template = /***
import itertools
p = list(itertools.permutations(${list}, ${n}))
		***/
		pycode = pycode.format({list=strlist, n=tostring(n)});
		py3.exec(pycode);
		return web.json.parse(tostring(py3.main.p));
	};
	combinations = function(list, n){
		import string.template;
		import web.json;
		import py3;
		strlist = web.json.stringifyArray(list);
		if !n {n=#list};
		pycode = string.template();
		pycode.template = /***
import itertools
c = list(itertools.combinations(${list}, ${n}))
		***/
		pycode = pycode.format({list=strlist, n=tostring(n)});
		py3.exec(pycode);
		return web.json.parse(tostring(py3.main.c));
	}
	
}


14 个回复 | 最后更新于 2021-10-10
2021-10-05   #1

抛砖引玉,其实可以用这个方法调用非常多的python函数,只要是python的输出字符串,数字,列表和字典,先全部转字符串,然后在aardio中用web.json就能解析过来。

2021-10-05   #2
//调用openpyxl直接读取excel,不用安装office
console.dump(python.readxls("C:\\Users\\Administrator\\Desktop\\aardio\\project\\test\\res\\test.xlsx"))

捕获.PNG

//Python函数调用库
namespace python{
	permutations = function(list, n){
		import string.template;
		import web.json;
		import py3;
		strlist = web.json.stringifyArray(list);
		if !n {n=#list};
		pycode = string.template();
		pycode.template = /***
import itertools
p = list(itertools.permutations(${list}, ${n}))
		***/
		pycode = pycode.format({list=strlist, n=tostring(n)});
		py3.exec(pycode);
		return web.json.parse(tostring(py3.main.p));
	};
	combinations = function(list, n){
		import string.template;
		import web.json;
		import py3;
		strlist = web.json.stringifyArray(list);
		if !n {n=#list};
		pycode = string.template();
		pycode.template = /***
import itertools
c = list(itertools.combinations(${list}, ${n}))
		***/
		pycode = pycode.format({list=strlist, n=tostring(n)});
		py3.exec(pycode);
		return web.json.parse(tostring(py3.main.c));
	}
	readxls = function(path, sheet_no=0){
		import py3;
		import web.json;
		import string.template;
		//这里的路径改成你实际的openpyxl包的路径
		py3.appendPath("C:\Users\Administrator\anaconda3\Lib\site-packages");
		pycode = string.template();
		pycode.template = /***
import openpyxl
wb = openpyxl.open('${path}')
ws = wb.worksheets[${sheet_no}]
values = list(ws.values)
		***/
		pycode = pycode.format(
			path = path;
			sheet_no = tostring(sheet_no)
		)
		py3.exec(pycode);
		return web.json.parse(tostring(py3.main.values));
	}
	
	
}


2021-10-06   #3

直接用就行吧,注意下参数类型就行

import console;
import py3;
 
var pyCode = /**
def permutations(iterable,r=""): 
    from itertools import permutations    
    if r!="":
    	return list(permutations(iterable,int(r)))
    else:
    	return list(permutations(iterable))
**/
 
py3.exec( pyCode )
 
var pyList = py3.main.permutations("甲乙丙");
console.dump(pyList.parseValue())

pyList = py3.main.permutations("甲乙丙",2);
console.dump(pyList.parseValue())

pyList = py3.main.permutations({"甲","乙","丙"});
console.dump(pyList.parseValue())

pyList = py3.main.permutations({"甲","乙","丙"},2);
console.dump(pyList.parseValue())
console.pause()


2021-10-06   #4

回复#3 @jacen :

学习了,感谢!

2021-10-06   #5

回复#4 @nlysh007 :

int()是成功的关键

2021-10-07   #6

v33.15.4 更新后更加简单了,直接在aardio调用就行了

import console; 
import py3;
var itertools = py3.import("itertools");

var permutations = function(iterable,r){
        r = r ? py3.int(r) : r;
        return itertools.permutations(iterable,r); 
     }

/* 转为list */
var list = py3.list(permutations("abc")); 
console.dump(list.parseValue())

/* 直接遍历 */
for( item in permutations("abc",2).each() ){
	console.dump(item.parseValue())
}
	
console.pause(true);


2021-10-07   #7

回复#7 @nlysh007 :

确实,老大这几天对py3扩展库做了很多更新,aardio对python的支持更好了

2021-10-08   #8
import console
console.open()
import py3
var n = 30;
py3.execf(`
import math
print(math.factorial(%d))
`, n) 
console.log(py3.main.math.factorial(n).parseValue())
console.pause();



输出为

265252859812191058636308480000000
2.6525285981219e+032
请按任意键继续 ...

请教下, 有没有办法在 aardio 里面取得py的输出结果,而不是科学记数法的结果?

2021-10-08   #9

回复#9 @mouse :

格式化一下就可以了,string.format("%.5d",data)

2021-10-08   #10

回复#9 @mouse :


在 \lib\py3\_.aardio 269行 int = builtin.int; 之后加个 str = builtin.str;


然后调用py3.str把返回值转str类型在输出就行了

import console
console.open()
import py3
var n = 30;
py3.execf(`
import math
print(math.factorial(%d))
`, n)

console.dump(py3.str(py3.main.math.factorial(n)).parseValue())
console.pause();


2021-10-08   #11

回复#11 @nlysh007 :

厉害, 学习了

2021-10-08   #12

回复#10 @admin :

这样吗? 

console.log(string.format("%.5d", py3.main.math.factorial(n).parseValue()))

试了结果输出为负的

265252859812191058636308480000000
-2147483648
请按任意键继续 ...

我改成 %.0f 长度及前面部分对了,后面全变成0

265252859812191058636308480000000
265252859812191070000000000000000
请按任意键继续 ...


2021-10-10   #13

回复#14 @jacen :

太棒了,现在在aardio中嵌套python太方便了。

老大凌晨还在升级库,辛苦了!

2021-10-10   #14

回复#14 @jacen :

谢谢老大! 仿佛打开了新天地.

登录后方可回帖

登 录
信息栏
公告:
个人博客
专注分享
谢谢合作!

本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...