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

By jerryxjr1220 at 20 天前 • 0人收藏 • 478人看过

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));
	}
	
}


16 个回复 | 最后更新于 15 天前
20 天前   #1

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

20 天前   #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));
	}
	
	
}


19 天前   #3

调用Python 函数本就可以直接传入 aardio 对象作为参数,
为什么要用字符串再去转换一遍呢? 

例如:

import console;
import py3;

var pyCode = /**
def permutations(items): 
	from itertools import permutations
	return list(permutations(items))
**/

py3.exec( pyCode )

var pyList = py3.main.permutations({"a","b","c"});
console.log( pyList )

console.dump( pyList.parseValue() )
console.pause()


返回的 pyList 还是 Python 对象 —— 这样你才能在 aardio 中使用这个 Python 对象 。如果你需要转换为纯 aardio 对象,调用  pyList.parseValue()  就可以了。

实际上大多时候可以不用转换,
这些 Python 对象在 aardio 里可以像普通对象一样使用,例如:

//直接操作 Python 对象
for( pyItem in pyList.each() ){
	console.print("");
	
	for( pyStr in pyItem.each() ){
		console.writeText(tostring(pyStr)," ")
	} 
}

我们嵌入 Python 大多时候目的是获得对 pyObject 的控制权,所以不能将其默认转换为字符串。






19 天前   #4

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

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()


19 天前   #5

回复#3 @jacen :

学习了,感谢!

18 天前   #6

回复#4 @nlysh007 :

int()是成功的关键

18 天前   #7

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);


17 天前   #8

回复#7 @nlysh007 :

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

17 天前   #9
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的输出结果,而不是科学记数法的结果?

17 天前   #10

回复#9 @mouse :

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

17 天前   #11

回复#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();


17 天前   #12

回复#11 @nlysh007 :

厉害, 学习了

17 天前   #13

回复#10 @admin :

这样吗? 

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

试了结果输出为负的

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

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

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


15 天前   #14

新版 py,py2,py3 等扩展库( 这几个库的接口会同步升级 )又做了大幅改进,
现在直接输出 Python 对象就可以了,跟 aardio 对象一样地使用:

import console; 
import py3;

var pyMath = py3.import("math")
var pyInt = pyMath.factorial(30);
console.log( pyInt );
 
console.pause(true);

或者:

console.log( tostring(pyInt) );

还可以使用运算符: 

var pyInt = py3.int("123") + py3.int("123456789012345678901234567890")

使用更多运算符:

import console; 
import py3;

var n = py3.float(12);
n = n + 0.23;
console.log( n.type() );
console.log( tonumber(n) );

var n = py3.int("1234567890123456789")
n = n / 0xFFFFFF;
console.log( n.type() );
console.log( tonumber(n) );

console.pause(true);

不仅仅是这些转换,Python 扩展库又做了很多精细的调整优化,aardio 与 Python 的交互将会更加方便。

另外也增加了 py3.float,py3.str,py3.set …… 等函数。
其实原来也可以通过 py3.builtin 调用 Python 内置函数,例如: py3.builtin.str() 
 
 

15 天前   #15

回复#14 @jacen :

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

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

15 天前   #16

回复#14 @jacen :

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

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
加入本站专享群:783804676
AARDIO语言QQ大群:70517368
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
C大Aardio论坛:Aar爱好者论坛
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
赞助商:才仁机械




Loading...