Tanto tempo fa lessi un libro su Python, in realtà avrei voluto approfondire perché so che questo linguaggio è stracolmo di librerie molto utili, ma la verità è che mi manca il tempo, poi ha una sintassi (mia opinione) molto disordinata rispetto a Java.
Comunque leggendo questo libro ho trovato diversi suggerimenti e ricordo di aver leggermente modificato una funzione per riuscire ad ottenere sostanzialmente una lista con la frequenza di numeri.
Ovviamente
è una porcheria, ho semplicemente scritto una funzione importando una libreria perché non mi serviva altro, stavo solamente testando.
Morale della storia, vorrei sapere come posso utilizzare una funzione scritta in Python con Java.
Ho provato ad integrare Jython (l’ultimo aggiornamento sembra risalire al 2015) ma non avendo alcuna esperienza non mi riesce di far funzionare questa benedetta funzione (insomma la funzione non funziona).
Questa è la funzione Python, ve la scrivo perché tanto non è nulla di eccezionale, ed è abbastanza semplice da comprendere:
from collections import Counter
def frequenzaN():
#t = open("frequentiMday.txt", "w", encoding="UTF-8") // non mi interessa per Java
#23 giugno
millionday ="5,19,31,32,39,20,34,35,51,52,15,19,33,47,53,2,3,19,41,51,10,27,47,49,50,11,21,33,43,54,9,17,33,40,52,4,16,17,28,32,5,7,11,28,55,18,19,39,40,46,10,14,20,32,39,15,28,44,49,50,22,25,35,36,52,1,25,26,30,52,8,19,20,53,55,6,18,27,34,40,5,11,16,37,41,1,5,7,18,24,15,16,27,29,31,2,35,39,40,44,2,12,19,25,51,4,11,15,24,47,11,20,29,40,47,13,18,24,28,32,3,4,10,35,39,4,23,24,30,50,1,3,4,31,43,7,12,42,48,55,3,9,14,39,53,13,28,31,38,43,2,13,19,28,37,4,25,31,36,55,5,8,15,16,19,15,28,30,36,40,1,7,27,52,54,9,21,31,37,44,10,13,16,30,43,6,11,21,34,36,4,5,42,51,54,6,14,42,45,54,6,11,24,49,53,3,15,40,41,51,7,32,35,43,53,20,40,42,49,53,3,5,25,34,36,2,4,29,35,42,2,3,7,37,41,5,8,19,33,53,9,14,18,19,54,1,13,20,25,27,12,16,18,19,47,24,30,31,35,53,3,18,34,43,46,7,11,12,37,53,6,19,22,41,44,5,6,8,9,20,9,12,22,38,55,10,16,23,35,43,1,14,16,20,34,3,7,14,34,37,24,28,42,44,49,13,14,22,48,55,5,6,7,26,49,3,14,28,35,53,6,12,14,30,39,13,19,22,32,50,13,25,28,32,47,1,12,16,34,55,18,19,37,42,45,10,24,27,48,51,13,18,33,35,46,3,18,37,39,47,6,10,12,18,25,4,8,37,40,46,26,28,39,41,44,7,18,24,29,42,12,15,19,29,31,2,5,17,21,53,19,28,34,49,53,2,12,19,27,37,1,19,50,53,54,18,32,33,35,41,6,19,20,35,43,23,24,32,40,53,37,40,43,52,54,1,14,20,27,38,3,8,32,38,48,22,30,36,44,47,3,9,10,16,40,10,11,16,21,38,15,19,26,35,54,20,24,26,53,54,16,22,23,31,39,10,12,14,40,42,6,23,37,38,46,7,22,25,41,43,7,19,41,49,52,3,11,33,34,52,14,19,36,43,49,17,25,27,28,42,2,8,27,34,39,26,29,34,47,54,9,16,19,31,53,13,30,43,45,54,10,19,25,29,46,1,9,32,35,42,11,22,29,36,49,8,13,33,46,47,1,19,24,43,49,11,21,22,49,52,16,28,32,40,54,3,9,15,34,55,5,14,28,43,46,8,18,23,32,34,1,20,47,48,52,2,25,26,31,52,11,16,43,46,47,4,25,34,37,48,6,10,14,29,35,12,15,20,23,46,7,16,17,35,48,5,19,21,29,37,6,16,23,29,31,10,35,37,42,54,1,6,25,29,44,13,20,29,42,51,10,15,18,52,55,40,41,44,46,48,1,12,19,32,47,15,18,40,53,54,3,34,43,46,50,5,21,26,41,53,5,33,39,40,46,28,44,46,47,49,2,13,31,43,45,15,26,27,38,53,7,16,43,44,51"
faiConta = Counter(millionday.split(","))
numeri = faiConta.most_common()
cnDiz = dict(faiConta.most_common())
for item in numeri:
#print(item, file=t) //così li salvo in frequentiMday.txt
print(item, end=' - ') //a me però interessa stamparli a schermo
#t.close()
Il problema è che provando ad inserire la funzione (funzione.py) dentro il progetto di prova in Eclipse, mi da questo errore:
Exception in thread "main" SyntaxError: ("no viable alternative at input '='", ('Frequenti.py', 16, 23, " print(item, end=' - ')\n"))
Questo è il codice che (sono sincero) ho copiato da un esempio trovato su un forum:
import org.python.core.PyInstance;
import org.python.util.PythonInterpreter;
public class ClasseMain {
PythonInterpreter interpreter = null;
private final static PythonInterpreter inter = new PythonInterpreter();
public ClasseMain() {
PythonInterpreter.initialize(System.getProperties(), System.getProperties(), new String[0]);
this.interpreter = new PythonInterpreter();
}
void execfile( final String fileName )
{
this.interpreter.execfile(fileName);
}
PyInstance createClass( final String className, final String opts )
{
return (PyInstance) this.interpreter.eval(className + "(" + opts + ")");
}
public static void main(String[] args) {
ClasseMain ie = new ClasseMain();
ie.execfile("Frequenti.py");
//FrequenzaN() è il nome della funzione
PyInstance hello = ie.createClass("FrequenzaN()", "None");
hello.invoke("run");
}
}
Ho anche provato a semplificare il codice utilizzando solamente
private final static PythonInterpreter inter = new PythonInterpreter();
e poi nel main ? inter.execfile("Frequenti.py");
ma niente non funziona.
Chi è così gentile da illustrarmi come posso richiamare quella funzione, così da poter stampare la lista dei numeri?
Vorrei ottenere una cosa simile, così da poterla poi adattare alle mie esigenze.
>>> frequenzaN()
('19', 27) - ('53', 19) - ('43', 18) - ('16', 18) - ('40', 17) - ('35', 17) - ('18', 16) - ('28', 16) - ('3', 16) - ('34', 16) - ('5', 15) - ('37', 15) - ('20', 14) - ('25', 14) - ('14', 14) - ('47', 14) - ('46', 14) - ('6', 14) - ('32', 14) - ('7', 14) - ('1', 14) - ('15', 14) - ('54', 14) - ('10', 14) - ('31', 13) - ('13', 13) - ('11', 13) - ('12', 13) - ('49', 13) - ('42', 13) - ('29', 13) - ('39', 12) - ('24', 12) - ('52', 12) - ('27', 11) - ('44', 11) - ('41', 11) - ('2', 11) - ('22', 10) - ('4', 10) - ('9', 10) - ('8', 9) - ('33', 9) - ('26', 9) - ('55', 9) - ('23', 8 ) - ('30', 8 ) - ('21', 8 ) - ('51', 8 ) - ('48', 8 ) - ('36', 8 ) - ('38', 7) - ('50', 6) - ('17', 5) - ('45', 4)
Il fatto è che in Java devo scrivere sempre un sacco di codice (fino ad ora ho sempre fatto così) però se riesco a risparmiarmi del lavoro con delle funzioni scritte in Python perché no? Se mi riesce questa cosa potrebbe tornarmi sicuramente utile in futuro.
Buona domenica...