Funzione python in java

di il
6 risposte

Funzione python in java

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...

6 Risposte

  • Re: Funzione python in java

    Anche se si puo' fare (ci sono diversi modi per farlo) lascia perdere!

    I benefici sono insignificanti
    Le rogne innumerevoli

    Python ha una sintassi strana, ma e' solo questione di abitudine. Dopo un po' non sembra poi cosi' strana.

    Scegli un linguaggio e continua con quello.
  • Re: Funzione python in java

    Quindi il tuo suggerimento è: apprendi per bene Python così da non dover mescolare questi due linguaggi?
    ...E lo so, vorrei fare tante cose, ma la verità è che non sono Flash...

    Comunque grazie per la risposta.
  • Re: Funzione python in java

  • Re: Funzione python in java

  • Re: Funzione python in java

    andbin ha scritto:


    Mah ... diciamo che se parti con una stringa con numeri separati da virgola, in Java non ci vuole moltissimo ad ottenere una mappa delle frequenze. Tra l'altro se puoi/vuoi usare la nuova Stream API di Java 8 ... ancora più semplice.

    Mentre finora vedo che hai solo perso righe (svariate) solo per usare Jython (che lo dico onestamente, non lo conosco neanche). Sì, ed è quello che già faccio, in base al periodo scelto “leggo dei file da un server con estensione csv”, poi mi avvalgo sostanzialmente di un comparator a cui do in pasto la lista dei numeri.
    private HashMap sortByValues(Map<String, Integer> listaOrdinata2) {
            List list = new LinkedList(listaOrdinata2.entrySet());
            // Definisco il Comparator personalizzato
            Collections.sort(list, new Comparator() {
                @Override
                public int compare(Object o1, Object o2) {
                    return ((Comparable) ((Map.Entry) (o1)).getValue()).compareTo(((Map.Entry) (o2)).getValue());
                }
            });
    
            // Qui sto copiando la lista ordinata in HashMap
            // utilizzo LinkedHashMap per conservare l'ordine di inserimento
            HashMap sHashMap = new LinkedHashMap();
            for (Object aList : list) {
                Map.Entry entry = (Map.Entry) aList;
                sHashMap.put(entry.getKey(), entry.getValue());
            }
    
            return sHashMap;
        }
    Ho fatto quell’esempio perché mi intrigava la cosa, ovvero riuscire ad implementare alcune funzioni python in java. Solo ed esclusivamente per l’utilizzo di alcune librerie di python.

    Sono in grado di integrare un ciclo o una stringa scritta in python, in java ma a me interessava una cosa un pochino più complessa.

    Per questo ho chiesto esplicitamente “come faccio a leggere quei dati in java? Ma soprattutto, perché mi restituisce quell’errore?”.
  • Re: Funzione python in java

    TechRevo ha scritto:


    Ciao, mi dispiace ma non so dirti come implementare Python in Java, in quanto con quest’ultimo linguaggio sono ancora alle prime armi. Tuttavia permettimi di darti un consiglio. Quando mi sono approcciato alla programmazione per la prima volta, due anni fa, volevo diventare un programmatore esperto in poco tempo, ma non è risultato facile. Ho iniziato piano piano e ho scelto un linguaggio molto semplice da imparare: Python. Dopo poco è diventato il mio linguaggio preferito per via della sua sintassi così chiara, elegante e concisa. Solo adesso mi sono deciso ad acquistare un manuale di Java e, per quanto sia un linguaggio fantastico, continuo a preferire Python. Naturalmente Python ha i suoi limiti, che risiedono principalmente nelle perfomance e negli ambiti di utilizzo, ma ha la caratteristica di essere facile da imparare. Perciò, se vuoi iniziare a programmare come si deve, visto che non hai anche tanto tempo a disposizione, ti consiglio di concentrarti su Python. Quando ti sentirai pronto potrai approfondire Java. Inoltre ti sconsiglio di imparare un linguaggio da internet ma di prendere dei libri: è il miglior approccio. Se vuoi imparare Python ti suggerisco un libro disponibile gratuitamente su internet: Diveintopython3 (spero di non violare le regole del forum scrivendolo).

    Fammi sapere che ne pensi. Se vuoi ti passo io qualche libro su Python ne ho un sacco, a parte gli scherzi, ti ringrazio per l'interesse, comunque non sto messo poi così male, qualcosina riesco a fare.
Devi accedere o registrarti per scrivere nel forum
6 risposte