Python

« Older   Newer »
  Share  
Elemento 38
view post Posted on 25/4/2018, 11:57




Cut da un altro thread:
QUOTE
Com'è l'ambiente grafico di Python? Non l'ho mai visto (oppure l'ho visto ma l'ho confuso con quello di un'altro linguaggio).

Sinceramente vorrei svecchiare il mio modo di programmare lato PC, ma non vorrei buttarmi su qualcosa che dopo 3 mesi si rivela inutile per quello che devo fare io.....
.....Qui però stiamo andando in OT, forse sarebbe meglio aprire un'altra discussione.

Non ha un proprio ambiente grafico come Visual Basic/C++, ma sfrutta altre librerie grafiche. Ci sono molti tutorial su Qt o Tk online.
Se devo solo scrivere uno script veloce, solitamente uso emacs o vim, se devo debuggare cose un po' piu' complicate uso Pycharm che e' veramente un ottimo IDE.
 
Top
view post Posted on 25/4/2018, 17:58
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Forse per i microcontrllori il python non e' il massimo. Calcola che gira 20-30 volte piu' lento del C.
E come sai meglio di me gia' a volte il C zoppica rispetto all' asm.
Ma lato pc penso sia utile, oserei dire il futuro.
Pensa per esempio alle hash table, in python hai gia' i dizionari. Gestisce automaticamente le collisioni, fa lui l'algoritmo che converte la stringa in chiave. E con ogni probabilita' ottimizzati a rotta di collo. In C e' lunga la cosa. Io ho scritto dei programmi per le tabelle di hash, ma insomma un po' una faticaccia.
Poi ovvio, se inizi in python, sai che esistono i dizionari, ma non sai nulla delle collisioni, dei metodi per gestirle ecc..anche per la grafica, credo sia enormemente piu' semplice.
Io in C avevo abbordato gtk, ma ho rinunciato. T'immagini ? Puntatori a funzione, magari puntatori a puntatori di funzioni...
Col C purtroppo si rischia di diventare pazzi nell'implementazione, perdendo di vista la logica del programma...senza calcolare i tempi di progettazione.
Io rimando con il python, ma a mio avviso e' d'obbligo.
Poi ragazzi, io non ci lavoro con la programmazione, quindi potrei fregarmene, ma non credo chi ci lavora.
 
Top
Elemento 38
view post Posted on 25/4/2018, 18:36




Python non è pensato per essere usato su microcontrollori, anche se esiste una versione più snella che può essere usata su CortexM/Arduino/simili (https://micropython.org/)

Anche se per le applicazioni medie la velociztà è più che sufficiente, è comunque possibile compilare uno script Python in una versione C per renderlo più performante (https://en.m.wikipedia.org/wiki/Cython).
 
Top
view post Posted on 25/4/2018, 18:42
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Si ho letto che ci sono tool per velocizzare python. Si puo' anche integrare il C nei punti critici o importare librerie matematche specifiche molto prestanti. Non so dirti i nomi, non ricordo, ho letto un po' sul manuale.
Io parlavo di python nudo e crudo.
Su alcune cose risulta parecchio lento.
Insomma, un pochino la comodita' la paghi.
Certo su certe cose te ne puoi fregare...su altre no

EDIT:
questo è un esempio di grafica in Python. Il programma non è mio, ma essendo pubblico su un sito lo posto come esempio.
Esegue una simulazione di un neurone di una rete neurale in base ai pesi di input e il bias.
Notare come sia relativamente corto il programma. Credo che in C sia un suicidio.
CODICE
#------------------------------------------------------------------------------
#              Simulazione singolo neurone con doppio ingresso.
#                          
#------------------------------------------------------------------------------
try:
   import Tkinter as tk
except ImportError:
   import tkinter as tk
from math import exp
#---------------------------------------------------------------------
PUNTI = 18
BIMG = ('R0lGODdh4ABJAOfRAAYGBggICAkJCQoKCgsLCwwMDA4ODg8PDxAQEBERERISE'
       'hMTExUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB4eHh8fHyAgICEhISIiIiMjIy'
       'QkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC4uLjAwMDIyMjMzMzQ0NDU1NTY'
       '2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkREREVFRUZG'
       'RkdHR0hISEpKSkxMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFZWVldXV1hYW'
       'FlZWVpaWltbW1xcXF1dXV5eXmBgYGFhYWJiYmNjY2VlZWZmZmdnZ2lpaWtra2'
       '1tbW5ubm9vb3BwcHFxcXNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e319fX9'
       '/f4GBgYODg4SEhIWFhYaGhoeHh4mJiYqKiouLi4yMjI2NjY6Ojo+Pj5GRkZOT'
       'k5SUlJWVlZaWlpeXl5mZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaOjo6Wlp'
       'aampqenp6ioqKmpqaqqqqurq62tra+vr7CwsLGxsbOzs7W1tba2tre3t7i4uL'
       'm5ubq6uru7u729vb+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycv'
       'Ly83Nzc/Pz9DQ0NHR0dPT09XV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e'
       '3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6evr6+zs7O7u7u/v7'
       '/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v'
       '/////////////////////////////////////////////////////////////'
       '/////////////////////////////////////////////////////////////'
       '/////////////////////////////////////////////////////////////'
       '////ywAAAAA4ABJAAAI/gCjCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzat'
       'zIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPnwyP6Xg'
       'l0BKSZ8HI4EACtKlTiX5ePCNWAVO0XW3WgHjKtatCHXOkWCF4aavXs2hvNchg'
       'jKxZtBSPvcpU6M2bQpleHYNbEtYBFs/cLkyTwsujYHyhhQrjIQAGGEi6dEECA'
       '0OADmBAQeP78RmMOzvkCFZYjBKZFwJIZFnkiyuuKxA4fPm0+SC0T184QLiCiz'
       'PHOTWg3YJAVGDZh8kwnalBAEQVQ7l8DhuTgIsqiKq4JBgzzDdGVw1m/gnsAwM'
       'aNCM0DBjxE5GZJzY6DGiIIohWzjsNmNSiWItJgzveWSRLKgRt0hYmCGLiSkXO'
       'jBKHDwpQsAQfrcyUzBEnmIKRKSYckUyAOkFzSh1EOPBAEXegUttKuqCgxIcZJ'
       'aMECrqA2NMqeiQxwQJAzEFKYCedQsEbHr1BwSk2/hQLIE9gcMAObYDSzEi6UO'
       'AISI5QUGOSQN1CCBUeEGADGpoo41EyKBAZ0hsowMhlU70ocsUIAsRQhiV7ZXS'
       'EEiQpccSbXgHjCBcnBLACGJB0R9EdJrgZUjImAAjoWcRIIkYLApSwBSO/QDRM'
       'AxqWZEoDik6KFjKXmDHDACJYgcgu/gyNwQRKTIxhqnfLcKIGDgVwIMUgthyES'
       'wL7nVRLAr3dGmAzorzBAwIWNOFHcdFcwYVKXFyhLJfPlEKHEAxEcAQyEFyXki'
       'oQrLgtl6kAAgoHLHEAyrqmgvEFS1+AQe+kHXzC0icd7PvmMQGoixI0AeQpMIi'
       'vYOASBtSu1EwaK3zARLAIfeLJwhFlAoNLMGTiEhE92GJMHg7wglAaaHAMUSF/'
       'toREIS2FogAxAz2RRTR2KCJQIISgcoEFMuDhckNvdOFSFzeY4fTTUEct9dRUP'
       '22QHT0QVIgL0WwhWjRnrBENy0c7lPTSTVet9tpUG5TGEgRBEkLXX4c9dstlMw'
       'Sz/kszt2SICQTB4QPdApEhNtl5L+QxyCKzJAwDkwhEzAaLRPOHFAKpIHYeSie'
       'uUMMPR6xSJRNA4QUHXgikywRU0LCC2LJgMEUjniNEsMEnIawwS8FMckjExyyi'
       'Ci3FMiMKLLUj1O+/ASePlr346uv8U8VIAoYKVMC7krzT/1T99QGoAIYkxJSrE'
       'rq4d0/T9yqEP34xBFmLrbbq18S++5LALyyxKB2bbP0vuZ/48tcQWdHKVgBkiQ'
       'DfF5FPhYokoypVAkuyQAJWhFGOAgmkJDVBkVRQf3ri00j81EGQfPAjaFITSNi'
       'UwRJa5IRUshKWtOTCi8AwSEMq0pFqOJEbsshF7i2kiIxoxMOH+PAlF8rQhjoU'
       'xHUpgweoEEgnhMCsH2QgCImQyBFpgh/98Mc/HDzaIUzQDGRsABLRiMRhNpEAW'
       'TRkiziZTnXM5ZDsbEeCZRtCGrTgBIMQgQ4JgWNPXhOb2aQvGrfJzW7+57leRI'
       'ACwijILyTwQLcNEIRnUQxjHAMZyVDGMpjRTPdusQASTGkgyajBGQQmF7rYBS9'
       '6SWAO3EAEvEWDGTzAQhFdtocVPMORUWxGEKawS47VogGsEIghTuAMNgCgCEYw'
       'giCKSS9aRHEgnRiGLBKECdFR85vgDKc4x0nOcprznOhMpzrDGRAAOw==')
#---------------------------------------------------------------------
class CUBE3D(object):

   def __init__(self, canvas, x, y, wid, zmin, zmax):
       self.canvas = canvas
       self.x = x
       self.y = y
       self.wid = wid
       self.zmin = zmin
       self.zmax = zmax
       self.gitm = []


   def _rear_box(self):
       x, y, wid, dw = self.x, self.y, self.wid, self.wid // 2
       self.gitm.append(self.canvas.create_line(
           x+dw, y-dw, x+dw+wid-1, y-dw, fill='#00aa00', dash=4))    # diet bas
       self.gitm.append(self.canvas.create_line(
           x, y, x+dw, y-dw, fill='blue', arrow='last'))          # diag bas sx
       self.gitm.append(self.canvas.create_line(
           x+dw, y-dw, x+dw, y-dw-wid+1, fill='#00aa00', dash=4))     # diet sx


   def _front_box(self):
       x, y, wid, dw = self.x, self.y, self.wid, self.wid // 2
       self.gitm.append(self.canvas.create_line(
           x+dw+wid-1, y-dw-wid+1, x+dw+wid-1, y-dw,
           fill='#00aa00', dash=4))                                   # diet dx
       self.gitm.append(self.canvas.create_line(
           x+wid-1, y-wid+1, x, y-wid+1, fill='#00aa00', dash=4))
       self.gitm.append(self.canvas.create_line(
           x+wid-1, y-wid+1, x+dw+wid-1, y-dw-wid+1, fill='#00aa00', dash=4))
       self.gitm.append(self.canvas.create_line(
           x+wid-1, y-wid+1, x+wid-1, y, fill='#00aa00', dash=4))
       self.gitm.append(self.canvas.create_line(
           x+dw+wid-1, y-dw-wid+1, x+dw, y-dw-wid+1,
           fill='#00aa00', dash=4))                                   #diet alt
       self.gitm.append(self.canvas.create_line(
           x, y-wid+1, x+dw, y-dw-wid+1, fill='#00aa00', dash=4))  #diag alt sx
       self.gitm.append(self.canvas.create_line(
           x+wid-1, y, x+dw+wid-1, y-dw, fill='#00aa00', dash=4))  #diag bas dx
       self.gitm.append(self.canvas.create_line(
           x, y, x+wid-1, y, fill='blue', arrow='last'))              # dav bas
       self.gitm.append(self.canvas.create_line(
           x, y, x, y-wid+1, fill='blue', arrow='last'))               # dav sx


   def _translate(self, z):
       return self.y + z / (self.zmax-self.zmin) * (-self.wid + 1.0)


   def draw(self, data):
       for itm in self.gitm:
           self.canvas.delete(itm)
       self.gitm = []
       self._rear_box()
       nrow = len(data)
       ncol = len(data[0])
       dw = self.wid // 2
       for y in range(nrow-1, 0, -1):
           for x in range(ncol-1):
               ddw = dw * y / (ncol - 1.0)
               x1 = int(self.x + self.wid * x / (ncol - 1) - 1.0) + ddw
               y1 = int(self._translate(data[y][x])) - ddw
               x2 = int(self.x + self.wid * (x+1) / (ncol - 1) - 1.0) + ddw
               y2 = int(self._translate(data[y][x+1])) - ddw
               ddw = dw * (y-1) / (ncol - 1.0)
               x3 = int(self.x + self.wid * (x+1) / (ncol - 1) - 1.0) + ddw
               y3 = int(self._translate(data[y-1][x+1])) - ddw
               x4 = int(self.x + self.wid * x / (ncol - 1) - 1.0) + ddw
               y4 = int(self._translate(data[y-1][x])) - ddw
               self.gitm.append(self.canvas.create_polygon(
                   x1, y1, x2, y2, x3, y3, x4, y4,
                   fill='red', outline='#cfcf00'))
       self._front_box()
#---------------------------------------------------------------------
class GUI(object):

   def __init__(self):
       self.root = tk.Tk()
       self.root.resizable(0, 0)
       self.root.title('Two input neuron - By C.Fin 2016')
       self.canvas = tk.Canvas(self.root, width=278, height=378,
                               relief="sunken", border=1,
                               bg='white', highlightthickness=0)
       self.canvas.pack(side='left', padx=8, pady=8)
       self.img = tk.PhotoImage(data=BIMG)
       self.canvas.create_image(140, 328, image=self.img, anchor='center')

       self.frameDestra = tk.Frame(self.root)
       self.frameDestra.pack(side='left', fill='y', expand=1, pady=8, padx=8)
       tk.Label(self.frameDestra, text="Peso\nwx1").grid(row=0, column=0)
       tk.Label(self.frameDestra, text="Peso\nwx2").grid(row=0, column=1)
       tk.Label(self.frameDestra, text="Peso\nbias").grid(row=0,column=2)
       self.wx1Scale = tk.Scale(
           self.frameDestra, from_=20., to=-20.,
           orient="vertical", showvalue=0, length=180, resolution=0.01)
       self.wx1Scale.grid(row=1, column=0)
       self.wx2Scale = tk.Scale(
           self.frameDestra, from_=20., to=-20.,
           orient="vertical", showvalue=0, length=180, resolution=0.01)
       self.wx2Scale.grid(row=1, column=1)
       self.biasScale = tk.Scale(
           self.frameDestra, from_=20., to=-20.,
           orient="vertical", showvalue=0, length=180, resolution=0.01)
       self.biasScale.grid(row=1, column=2)
       self.labelwx1 = tk.Label(self.frameDestra, width=6)
       self.labelwx1.grid(row=2, column=0)
       self.labelwx2 = tk.Label(self.frameDestra, width=6)
       self.labelwx2.grid(row=2, column=1)
       self.labelBias = tk.Label(self.frameDestra, width=6)
       self.labelBias.grid(row=2, column=2)
       self.buttonReset = tk.Button(
           self.frameDestra, text="Reset", width=10)
       self.buttonReset.grid(row=3, column=0, columnspan=3, pady=48)
#---------------------------------------------------------------------
class App(object):

   def __init__(self):
       self.gui = GUI()
       self.c3d = CUBE3D(self.gui.canvas, 6, 273, 180, 0.0, 1.0)
       self.gui.biasScale.configure(command=self.draw)
       self.gui.wx1Scale.configure(command=self.draw)
       self.gui.wx2Scale.configure(command=self.draw)
       self.gui.buttonReset.configure(command=self.reset)
       self.data = [[0] * PUNTI for _ in range(PUNTI)]


   def reset(self):
       self.gui.wx1Scale.set(0)
       self.gui.wx2Scale.set(0)
       self.gui.biasScale.set(0)


   def draw(self, ev=None):
       self.gui.labelwx1.configure(text="%5.2f" % self.gui.wx1Scale.get())
       self.gui.labelwx2.configure(text="%5.2f" % self.gui.wx2Scale.get())
       self.gui.labelBias.configure(text="%5.2f" % self.gui.biasScale.get())
       step = 1.0 / (PUNTI - 1)
       for y in range(PUNTI):
           for x in range(PUNTI):
               a = (self.gui.wx1Scale.get() * x*step +
                    self.gui.wx2Scale.get() * y*step +
                    self.gui.biasScale.get())
               self.data[y][x] = 1.0 / ( 1.0 + exp(-a) )
       self.c3d.draw(self.data)

   def start(self):
       self.gui.root.mainloop()
#---------------------------------------------------------------------
app = App()
app.start()


Suppongo sia inutile dirlo: salvare su un file con estensione .py
lanciare da terminale python prog.py (almeno su Ubuntu)
C'è da dire che l'autore (io so chi è) è un tipo che a dire che è tosto è dire poco.

Edited by GILA75 - 26/4/2018, 16:08
 
Top
Elemento 38
view post Posted on 26/4/2018, 21:32




QUOTE
Io parlavo di python nudo e crudo.
Su alcune cose risulta parecchio lento.
Insomma, un pochino la comodita' la paghi.

All’inizio la è salvo anche io come te, ma dopo averci lavorato per un po’ devo ammettere che non ne ho mai realmente avvertito la lentezza. Il 90% degli utenti sa che Python può essere più lento di altri linguaggi, ma probabilmente per quello che deve fare la velocità è più che accettabile.
Per programmi dove bisogna *veramente* processare dati velocemente, ho visto gente lamentarsi di C/C++ e usare FORTRAN.. :rolleyes: :lol:
 
Top
view post Posted on 30/4/2018, 22:36
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Io sto leggendo "imparare Python".
Non so perche', ma non riesco ad appassionarmi al 100%. Sono solo agli inizi e vado un po' a rilento. Ma con il C avevo piu' entusiasmo ( e forse anche piu' tempo)
Pero' bho, alcuni concetti li trovo strani : stringhe immutabili...
Devi renderla una lista, poi modificarla, poi riconvertirla in stringa.
Mi sembra macchinoso.
Non so, sono convinto che sia potente e ben fatto.
Calcolando che l'inventore e' un matematico, credo sia ben strutturato
Cerco di andare avanti, anche perche' lo sviluppo rispetto al C in termini di tempo e' a dir poco vantaggioso.
Non so, penso alle liste in C , a occhio e croce, 30/50 righe di codice ??
Malloc, puntatori, free, e che dio te la mandi buona che un caso su 1000 ti fa un bel 'core dump' !!!
E alle liste python (1 riga !!!! )
 
Top
Elemento 38
view post Posted on 30/4/2018, 22:43




Il sito ufficiale di Python consiglia il PDF scaricabile qua: https://github.com/AllenDowney/ThinkPythonItalian
Ho visto che contiene esempi e soprattutto esercizi, fondamentali per imparare.

Non tutti i concetti sono fondamentali all’inizio. Se qualcosa sembra troppo strano o non ne vedi un possibile utilizzo, a volte è meglio passare oltre e magari ritornarci con un po’ più di esperienza.
 
Top
view post Posted on 30/4/2018, 22:50
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Grazie, l'avevo visto tempo fa.
In teoria il manuale che ho comprato dovrebbe essere ottimo ( a dire il vero non mi piace come e' strutturato ).
Pazienza, me lo tengo.
Per ora sono agli inizi
Liste, str, dizionari...tuple ecc
Un po' barboso fino adesso.
 
Top
7 replies since 25/4/2018, 11:57   86 views
  Share