inicio mail me! sindicaci;ón

Qualità dei tutorial Python

Ho letto recentemente un articolo sulla presenza di materiale di qualità online e mi sono domandato come stesse il mondo Python italiano in quanto a qualità. Ammetto che personalmente il 99.9% di tutto quello che ho letto per imparare e migliorarmi in Python è scritto da stranieri di consolidata fama (o comunque noti nell’ambiente). Siccome l’Italia ha lo stesso diritto di esistere mi son guardato in giro su cosa potesse offrirmi il panorama e sono capitato casualmente (sto mentendo spudoratamente :-) sul tutorial di un noto professionista italiano che mira ad insegnare Python ai newbie. Siccome un newbie ritengo di non esserlo più ho sviluppato nel tempo una coscienza critica su ciò che viene scritto e ciò che viene deputato essere “giusto” per chi si avvicina a questo fantastico linguaggio.

Detto questo procediamo all’analisi (approfondita) passo per passo di questo tutorial. Faccio notare che non sono riuscito da nessuna parte a trovare la data del documento. Il documento è diviso in sezioni (gli errori nelle parti quotate non sono miei) e quindi cercherò di commentarlo sezione per sezione concludendo con una breve analisi del tutorial nel suo complesso.

  1. Homepage:
    Benvenuto al corso Python. Python è un linguaggio di scripting Open Source [...] Python è un linguaggio interattivo e interpretato [...] Viene usato per programmi solitamente più complessi di quelli sviluppati in Perl, e maggiormente per applicazioni di tipo GUI (a differenza di PHP).
    Presentare Python ad un newbie come un mero linguaggio di scripting credo sia sbagliato perché è quasi un effetto collaterale. Inoltre l’autore usa il termine interattivo impropriamente. Le ultime due asserzioni sul fatto che venga usato per programmi più complessi della controparte Perl e che sia maggiormente impiegato in programmi GUI only sono rispettivamente sommaria la prima e sbagliata la seconda (fatico a comprendere il senso di “applicazioni di tipo GUI (a differenza di PHP)”.
  2. Python: le espressioni:
    Python è un linguaggio cosiddetto di tipo imperativo, il che significa che l’esecuzione è composta di una serie di comandi, [...]
    Comandi uguale a istruzioni? E` brutto usare istruzioni?
    Questo concetto di struttura dati distingue i linguaggi di programmazione in maniera più forte della sintassi. Mentre a volte si caratterizza un linguaggio per le peculiarità della sintassi, di fatto, ciò che fa veramente la differenza sono le strutture dati manipolate dalle espressione del linguaggio.
    Quindi tutta la teoria sui paradigmi di programmazione che viene propinata negli istituti tecnici e nelle università è fuffa? I linguaggi di programmazione non sono più classificati per paradigmi ma per il tipo di strutture dati che hanno? Ok quindi… LISP = List Processing, ma anche Python ha le liste quindi Python e` come il Lisp, ma anche C++ ha le liste quindi son tutti uguali i linguaggi! Che stupidi gli scienziati che si son sbattuti a formalizzare i linguaggi di programmazione. Mi domando cosa servono i corsi di teoria dei linguaggi :-)
    Per esempio i linguaggi Java e C++ sono abbastanza simile al punto di vista sintattico, ma basta osservare le struttura dati per rendersi conto che si tratta di linguaggi diversissimi.
    Pensavo che le differenze di C++ da Java stessero nell’uso esplicito dei puntatori (che guarda caso non sono una struttura dati), nel determinismo della distruzione delle risorse, nella diversa implementazione dell’object orientation e tante altre cose. Le strutture dati son sempre le stesse (come chiunque fa un corso di Algoritmi sa), è diversa l’implementazione in base agli strumenti messi a disposizione.
  3. L’interprete:Grazie a questa sezione finalmente ho scoperto la data del documento. Siccome usa Python 2.2.3 (che ho accuratamente installato per provare gli esempi) per spiegarsi suppongo che sia intorno al 2003, nemmeno troppo vecchio dunque…
    Per fortuna Python ha una modalità interattiva che permette di provare direttamente le espressioni che via via scriveremo.
    Quindi Python non è interattivo ma è l’interprete ad avere una modalità interattiva, ora ho scoperto l’arcano.
    In ambiente UNIX è sufficiente scrivere uno script e poi utilizzare la classica sintassi #!/usr/bin/python. Ponendolo all’inizio di un file che contiene un programma in Python, e impostando il bit x, il file che lo contiene diventa eseguibile.
    Spero che il newbie in Python non sia anche un newbie “UNIX” altrimenti qui si che si incasina. Devo mettere una sintassi all’inizio di un file, impostare il bit x e il file diventa eseguibile (Potete immaginarvi la mia faccia impegnata in un simpatico “EEEEEEEEEEEEEHHHHHHHH???”) :-P
    Niente di strano: abbiamo però scoperto che python usa una sintassi aritmetica tradizionale cosiddetta “infissa”. Con un altro linguaggio di programmazione avremmo potuto avere 2 2 + (forth, postfissa) oppure (+ 2 2) (lisp, prefissa).
    Mi domando cosa interessi al nostro amico newbie il fatto che Python usa una notazione infissa (che qualsiasi persona si aspetta di trovare nel nostro caso) ma proseguiamo…
    Una cosa importantissima e caratteristica di Python: le variabili non hanno tipo. Sono come scatole nelle quali si può mettere qualunque cosa: un numero come una stringa come una lista, come pure un oggetto come vedremo più avanti.
    Le variabili hanno tipo eccome, altrimenti non esisterebbero. Non esistono variabili non tipizzate in Python. Le variabili non sono come scatole, al massimo sono etichette. Una variabile ha sempre un tipo, senza contare il fatto che Python è strongly typed a runtime cosa che l’autore omette, quindi fa pensare che le variabili Python siano come i Variant in VB6 (cit. “The Variant data type is the data type for all variables that are not explicitly declared as some other type (using statements such as Dim, Private, Public, or Static). The Variant data type has no type-declaration character.”). La verità è che le variabili in Python hanno tipo (sono oggetti) ma facciamo finta di niente. Solo per questa frase un newbie avrebbe intesa un sacco di convinzioni errate. Inoltre l’autore dice che ci si possono infilare dentro numeri, stringhe, liste e oggetti implicitamente asserendo che nessuno di questi sia un oggetto, cosa palesemente falsa (anche in Python 2.2 :-). Consiglio di leggere questo: http://docs.python.org/ref/objects.html
  4. Conversioni:
    Quello che posso fare è estrarne la parte immaginaria (z.imag), la parte reale (z.real) oppure calcolarne la lunghezza (abs()), cose che invece si possono fare.
    Lunghezza = valore assoluto? Vabbè…
  5. Indici stringhe:
    Ovvero è possibile estrarre per esempio il quarto carattere in essa contenuto, semplicemente con la sintassi: s[4]. Notare che questo non cambia la immutabilità delle stringhe. Accedere ad un carattere non significa poter modificare.
    s[4] ritorna il quinto e non il quarto. L’autore si sarà preso la briga di rileggere? L’articolo è pieno di errori concettuali e di errori linguistici. Cosa che non fanno altro che confondere i new-comers che in teoria sono le menti da plasmare nel modo migliore.
    Quindi se abbiamo s=”ciao”, primo carattere, c, è s[0] (il primo indice è sempre 0). Invece l’ultimo carattere e ottenuto con @@s[-1].
    Qui si corregge, per fortuna, ma non mi risulta che @@s[-1] sia una sintassi valida. Speriamo sia un doppio errore di battitura perchè altrimenti non saprei spiegarmi quale versione di Python stia usando.
    Si tratta semplicemente della sintassi s[2:3]. In questo modo otteniamo una sotto sequenza che contiene tutti i caratteri dal secondo incluso al terzo escluso.
    Riscriviamo per i newbie in ascolto: lo slicing nelle sequenze ritorna gli elementi da quello di indice specificato prima dei due punti (incluso) a quello specificato dopo i due punti. Quindi tradotto nel linguaggio dell’autore si ottiene una sotto-sequenza che contiene i caratteri dal terzo incluso al quarto escluso. Quindi il terzo e basta. Cioè s[2], quindi lo slicing è inutile per quell’esempio (fortuna che i newbie devono capire dagli esempi).
    Della sintassi per una slice, è possibile omettere l’inizio o alla fine. In questo caso il valore non espresso coincide con i l’inizio o la fine della sequenza.
    In quanto ex-newbie non ho capito una mazza.
  6. Liste:
    In altri linguaggi come il pascal o il Java, le liste non sono tipi primitivi. In Python si. E come tali che possono esprimere con delle costanti.
    Cioè? Non ho capito. Supponiamo che la frase sia “E come tali si possono esprimere con delle costanti”. Quindi il fatto che un tipo sia primitivo in un linguaggio significa che sia esprimibile attraverso una costante? Ripeto: cioè??? Allora inizio a pensare che le liste siano costanti, che me ne faccio? Sono immutabili come le stringhe? Ma no… allora alla fine di sto ragionamento continuo a non capirci una mazza. Senza contare che in tutto l’articolo l’autore usa la parola sintassi interscambiabilmente con istruzione (!!)
    Fare attenzione al fatto che gli indici di una sequenza iniziano da zero, e quindi per estrarre secondo elemento occorre utilizzare l’indice 1.
    Quindi lo sa che sono 0-based le sequenze in Python, ma come?? Prima diceva che s[2:3] era l’estrazione del secondo?? Quale sarà la verità per il nostro newbie?? Forse è il caso che pianti sto tutorial qui e vada a leggere qualcosa di meno contorto. Pero` siccome mi sto divertendo continuiamo :)
    Allo stesso modo possiamo tenere lunghezza della lista utilizzandola funzione len().
    Per fortuna era un tutorial per persone di lingua italiana.
  7. Dizionari:
    In buona sostanza si tratta di una tabella
    Si tratta di una implementazione efficiente di una hash table, che non è la stessa cosa di una tabella (a me viene in mente excel e il concetto di tabella nella teoria relazionale)
    Per eliminare un elemento da un dizionario esiste invece un’operazione specifica: del. Per la precisione si seleziona un elemento da eliminare, lo si pone come argomento di del
    del è uno statement, non una operazione. Il resto della frase è pressochè incomprensibile. Porre qualcosa come argomento? Quindi del è una funzione? Qui - http://docs.python.org/ref/del.html - non dice cosi. Giuro che faccio fatica a leggere questa pagina del tutorial, è piena di frasi incomprensibili.
  8. Comandi:
    Ci sono delle istruzioni di controllo per modulare il flusso dell’esecuzione.
    Non ho mica capito che cosa vuol dire “modulare”. Vediamo che dice il vocabolario… Il Garzanti nella sua ignoranza asserisce che il verbo transitivo “modulare” ha questa definizione: costruire, organizzare secondo uno schema flessibile, suscettibile di modificazioni: modulare un progetto, un programma. Vuoi vedere che l’autore intendeva dire “modificare” ? Buona fortuna newbie, pregherò per te.
  9. Indentazione (non ho capito cosa ci fa questa sezione nella parte sui famigerati “comandi”):
    In principio c’era il GOTO, il comando di controllo del flusso esplicito, che tendeva a trasformare i programmi in un ammasso di spaghetti. Da molto tempo è stato abolito nella programmazione, sostituito dalla programmazione strutturata. Questo significa che i programmi vengono strutturati a blocchi. Ovvero, se ho una istruzione che effettua un calcolo, e voglio seguire questo calcolo 10 volte, inserisco il blocco di istruzioni che effettuano il calcolo in un blocco controllato da una istruzione esterna che controlla il blocco.
    WHAT THE HELL THE AUTHOR IS TRYING TO SAY!? Non ho parole.
    Notare che dopo il while e l’if (che sono comandi strutturati, come vedremo in dettaglio più avanti) c’è una condizione.
    Forse perchè sono istruzioni condizionali? Ah no sono “comandi strutturati che dopo hanno una condizione”. Sono newbie in Python, non deficienti, caro autore. Proseguendo vedo questo:
    i :=1 ; while i< =10 do begin if(mod(i,2)=1) then writeln(i) end; i:= i+1; end So benissimo che la maggior parte di voi che conoscono programmazione avranno visto inorriditi come non ho assolutamente rispettato le usuali regole di annidamento; regole che servono a rendere un programma leggibile; infatti l’ho fatto apposta
    Perchè quando ho iniziato a programmare in Pascal anni fa non ho mai sentito parlare di regole di annidamento??
    Ma io per esempio trovo quasi impossibile scrivere programmi Python usando vi.
    Preciso che io uso emacs e non vi, pero` non ho mai sentito Guido Van Rossum fare questo tipo di sparate, eppure lui è uno che di Python ne capisce “poco”. Ok ok son gusti personali. Basta che funzioni ;-) Consiglio ai lettori di leggere la PEP 008 e non dare ascolto a tutta la fuffa scritta in sta sezione. Comincio a convincermi che lo sforzo di imparare almeno l’inglese tecnico ne valga la candela se questa è la qualità del materiale che c’è in giro. Andiamo avanti per inerzia:
    C’è una eccezione alla regola dell’annidamento: quando viene aperta una parentesi (tipicamente quando si scrivono strutture dati come liste o tuple nel corpo del codice), l’annidamento viene disattivato fino a che non viene chiusa la parentesi.
    Cioè?! Io sono un newbie ok, ma conosco la lingua italiana. Dunque, cosa diavolo vuol dire quella frase? L’annidamento viene disattivato fino alla parentesi seguente? Boh, mica capito cosa cerca di dirmi l’autore (magari è pure giusto :P)
    Per ogni struttura dati, esiste un valore che viene considerato falso altrimenti l’espressione viene considerata vera. In particolare il valore numerico 0 viene considerato falso, mentre un valore non zero viene considerato vero.
    Da quando in qua i numeri sono una struttura dati?
  10. While:
    Il comando while serve a interare un blocco di codice finché non è vera la condizione di controllo
    Interare? Nemmeno il mio informatichese geek più spinto è riuscito a farmi capire il significato di interare.
  11. For:
    I comandi che abbiamo visto prima sono tipici di altri linguaggi di programmazione. L’unica cosa particolare è la sintassi specifica di Python. È del tutto specifico di Python il ciclo for.
    Quindi il for che ho studiato in C che cavolo era? Ah no si corregge subito dopo (almeno credo, fatico a comprendere il testo)
    Questo particolare costrutto tende a variare dal linguaggio a linguaggio, a seconda delle strutture dati utilizzate in esso.
    Ok quindi il mio cervello da niubbo ha capito che ora ho un comando for, tipico solo di Python ma che varia da linguaggio a linguaggio e che dipende dalle strutture dati che uso nel comando. Procediamo.
    Comunque abbiamo un’altra opzione, che è quella di generare una lista dei numeri da 1 a 10, e di iterare su di essa. Questo si ottiene con la funzione range: for i in range(1O): print i
    range(10) ritorna una lista di numeri da 0 a 9, non da 1 a 10. Subito dopo però l’autore specifica che per creare una lista da a 1 a 10 si deve usare range(1, 11), quindi mi domando… perché due righe prima dice una cosa e due righe dopo ne dice un’altra? Mistero della fede.
    Quando vogliamo possiamo iterare non solo su liste ma anche su tabelle: ovvero le hash map. Però occorre selezionare le chiavi, e accedere a ciascun elemento usandola chiave, come segue (spiegheremo il “%” in seguito): for i in tel.keys(): print “%s=%d” % (i,tel[i])
    Quindi posso iterare sui dizionari? Ah no ma sto iterando sulle chiavi, cioè su una lista. Mi son perso.
  12. Particolarità:
    Una prima particolarità che vogliamo ricordare è il comando nullo: pass. Si tratta semplicemente di un comando non fa nulla. È utile in circostanze in cui è quello che si vuole attendere, oppure quando viene per esempio commentato un blocco di codice e si vuole mantenere la struttura di supporto. Per esempio # attende l’input da tastiera while 1: pass # fa_qualcosaltro() è disattivato if a>1: fa_qualcosa() else: #fa_qualcosaltro() pass
    while 1: pass è un ciclo infinito, non attende alcun input da tastiera (mica stiamo usando raw_input()). Pessimo esempio.
    La funzione repr() è molto simile a str ma ha una importante differenza: tenta di produrre output adatto non tanto alla leggibilità per l’uomo quanto per l’interprete. In pratica è più utile quando si scrivono dati in un file che poi dovranno venire riletti.
    Secondo la documentazione la differenza tra str() e repr() è che la prima non sempre tenta di ritornare una stringa accettabile da eval(). Ora che so cosa le differenzia attraverso una serie di ragionamenti che non sto qui a scrivervi capisco cosa intendeva l’autore ma è tutto poco chiaro. Nel resto del testo l’autore usa la parola dichiaratore al posto di specificatore e usa esempi che sono palesemente copiati da quelli del tutorial ufficiale di Python :-D
  13. Funzioni:Passiamo alle funzioni, la prossima sezione del tutorial, nella cui introduzione dice:
    Abbiamo imparato i fondamenti: siamo in grado di fare calcoli e di comporre comandi in un flusso di esecuzione. Ma la programmazione è fatta anche di una certa struttura: si tratta di raccogliere i comandi in funzioni.
    A costo di venire bollato come pignolo e cavilloso io trovo questa frase davvero incasinata, difatti nel resto della sezione si evince che l’autore non abbia chiaro il concetto di funzione (o forse semplicemente non sia in grado di spiegarlo ad un newbie)
    In pratica c’è di più perché una funzione, potendo chiamare se stessa, crea un metodo di calcolo che non si può realizzare in altro modo. Queste tecnica si chiama “ricorsione”, ma non è questa la sede per approfondirlo.
    A parte l’annaspata definizione di ricorsione mi domando come mai subito dopo l’autore dopo aver detto che non è la sede per approfondire la ricorsione fa appunto un esempio di funzione ricorsiva, bah!
  14. Argomenti modello:In questa sezione l’autore spiega l’uso di *args e **kwds, che vuol dire modello?
  15. Unpacking di parametri:Soprassediamo al termine disimpaccare 8-)
  16. Lambda:
    Abbiamo visto come definire una funzione in maniera per così dire ufficiale. È tuttavia possibile definire una funzione “al volo” e addirittura passarla come parametro ad una chiamata di funzione o procedura. Vediamo come.
    Quindi le funzioni lambda non sono ufficiali, pareva brutto dire “funzioni anonime” ?
    L’espressione “lambda x: x+1″ produce una funzione esattamente come “def f”, con la differenza che quest’ultima assegna la line e un hanno funzione a un nome, mentre lambda produce un “valore funzionale” che può essere assegnata una qualsiasi variabile, per trasformarla in una funzione.
    A parte i soliti problemi di comprensione, cosa è un valore funzionale?
  17. Ordinamento:Probabilmente ora parlerà di tecniche di ordinamento…. eh no! In pratica questa sezione spiega l’uso di lambda nella funzione cmp() di Python, cosa che non si capiva dal titolo…
  18. Moduli ed eccezioni:L’autore ora passa ad una sezione chiamata “Moduli ed eccezioni” (che ci fanno insieme?) che il nostro fido rompiballe (che sarei io) proseguirà ad analizzare :-P
    In questa puntata vedremo innanzitutto i moduli. Si tratta del costrutto Python che consente di raggruppare funzioni e classi all’interno di un file.
    I moduli NON sono un costrutto. Prego leggere il tutorial di Python prima di scriverne uno in italiano.
  19. Moduli:
    In generale Python non ha costrutti che limitano la visibilità (come per esempio in Java): il “non accesso a parti riservate” viene lasciato alla “buona educazione del programmatore”. Comunque esistono delle convenzioni che, quanto meno, guidano programmatore a distinguere le parti riservate da quelle pubbliche. La principale convenzione è appunto che in nomi che cominciano con “_” e “__” sono da considerare, rispettivamente, “riservati” o “molto riservati”. A seconda dei casi, queste convenzioni vengono anche prese in considerazione da alcuni costrutti del linguaggio.
    Ora, non che ci sia nulla di errato in quello che l’autore dice in questa parte ma che cavoli ci fa nella sezione sui moduli? Cioè si stavano spiegando i moduli e per farlo si è passati a spiegare come gestisce l’incapsulamento Python? Mi sono perso di nuovo.
  20. Estendere il path:Qui si asserisce che dir è un costrutto…. mah!
  21. Packages:
    Ma l’analogia non è completa: non è possibile fare “from sub import *”. Infatti questo significherebbe importare tutti i moduli presenti in una package. Il problema è che Linux è case sensitive, Python è case sensitive, ma per esempio Windows non lo è. E quindi, consentendo un costrutto come quello indicato, si otterrebbe un gran pasticcio: si tratterebbe di importare “Echo, “ECHO” o “echo”? In pratica, non si riesce a stabilire il nome del modulo (che è sensibile al maiuscolo e il minuscolo) dal nome del file (che in generale NON LO È)! Quindi, in generale, si deve specificare esplicitamente almeno il modulo da importare, dal quale estrarre poi le funzioni e le classi in esso contenute.
    Dopo aver riletto un paio di volte credo di aver capito che si sta usando la scusa della case-sensitiveness di Linux e Python per giustificare il fatto che “from foo import *” potrebbe ritornarti il nome di un modulo a caso… che potrebbe essere “Pippo”, “pippo” o “PIPPO”. Non ho capito cosa c’entra… inoltre non basta fare un ls sulla directory o semplicemente guardare la documentazione? Boh. Cavoli! Ora ho capito, l’autore è riuscito a copiare pari pari un esempio del tutorial peggiorando la spiegazione riguardo al problema dei sistemi operativi non case sensitive. Non era meglio tradurre il tutorial di Python o scrivere di proprio pugno una volta capiti i concetti? Passiamo alle eccezioni.
  22. Catturare eccezioni:
    La cosa interessante è che le misure di gestione possono essere “a grana grossa” (ovvero: in caso di QUALUNQUE ERRORE fai così) o a grana fine (se è un errore di I/O fai così, se è un errore di calcolo fai in quest’altro modo…). Le eccezioni vengono poi catturate, utilizzando un sistema a filtro e distinguendole per tipo. Un filtro che può essere raffinato quando si vuole, ma non si costringe a controllare l’istruzione per istruzione quello che succede.
    E` un tutorial o un ricettario? Grana grossa? perché poi usa l’else (che non usa praticamente nessuno) per fare un semplice esempio che potrebbe contenere la print nel try? Boh.
  23. Approfondimento:
    Le eccezioni vengono generate quando l’istruzione “raise” le solleva. Il parametro di raise è un oggetto di tipo eccezione. L’unica caratteristica è quella di essere deritati, direttamente o indirettamente, dalla classe Exception. Cosa significhi questo lo vedremo quando approfondiremo la programmazione a oggetti.
    Quindi il raise “prova” non esisterebbe secondo l’autore, che per quanto deprecato è legale. Le stringhe non derivano da Exception (nemmeno tutte le eccezioni sono esattamente strutturate in una gerarchia che deriva da Exception ma ok). Passiamo alle classi.
  24. Classi e Oggetti:
    Python è un linguaggio di scripting, come il PHP e il Perl. La caratteristica dei linguaggio di scripting è quella di non necessitare di compilazione: i programmi possono essere eseguiti così come sono. Ma la flessibilità dei linguaggi di scripting spesso è in contrasto con la strutturazione del linguaggio stesso. Nei linguaggi di scripting, che pure spesso supportano la programmazione ad oggetti, di solito non la gestiscono in maniera particolarmente avanzata.
    Inutile ripetere che anche qui come all’inizio sono presenti imprecisioni. La cosa più evidente è che secondo un ragionamento deduttivo dell’autore i linguaggi di scripting non necessitano di compilazione e quindi sono eseguiti come sono. A che servono gli interpreti?
    Python si differenzia da questo panorama perché pur essendo un linguaggio estremamente interattivo, di fatto ha un ottimo supporto per la programmazione ad oggetti, tanto da farlo definire uno “object oriented scripting language”; ma in verità anche JavaScript, PHP e Perl hanno i costrutti di programmazione ad oggetti.
    Python è un linguaggio multi-paradigma general purpose non un “oo scripter”. Dopo tutta sta considerazione l’autore aggiunge che anche Javascript, PHP e Perl hanno tali costrutti. Quindi Python che differenza ha dagli altri? Ennesima contraddizione e controsenso. Detto questo l’autore inizia a spiegare la teoria degli oggetti partendo dagli ADT, blah blah. Oddio cosa sto leggendo?! Ha detto che gli interi sono un tipo di dato? Wow wow wow!! Ma non aveva detto che erano una struttura dati? Mi sono di nuovo perso. Ovviamente pretende di essere introduttivo con una frase cosi:
    In generale la programmazione ad oggetti nasce dall’idea di definire un “tipo di dati astratto”. Vuol dire che come esistono gli interi (un tipo di dato), che possono essere sommati e moltiplicati (operazioni sul tipo di dato), è possibile creare le Auto (che una classe), che possono essere messe in moto e fatte muovere (metodi)
    Ehhhhhhhhhhh?
    Quindi in pratica possiamo definire delle classi. Una volta definita la classe (un nuovo tipo di dato); possiamo poi creare istanze di questa classe, e invocare i metodi su questa classe.
    Semmai sulle istanze. Ad ogni modo io non ho capito nulla dell’OOP da queste frasi.
  25. Caratteristiche:
    Altri elementi da notare è che c’è una distinzione tra tipi primitivi (o “builtin”) e oggetti. Anzi la quantità di builtin è abbastanza ampia: come abbiamo visto ci sono liste e tabelle, oltreché stringhe e file, e molto altro.
    Questa è una delle cose più false che ho letto fino ad ora. L’autore pretende di dire che c’è distinzione tra builtin e oggetti (sta forse parlando di Java?) quando chiunque sa che in Python tutto è un oggetto. Numeri, tipi, funzioni, liste, blah blah e ancora blah. Poi arbitrariamente decide di non parlare di operator overloading perché ritenuta una caratteristica non importante in quanto non indispensabile (io pensavo che non se ne parlasse perché forse troppo avanzata in un tutorial, anche se pure questo è discutibile).
  26. Namespace:Dopo tonnellate di fuffa e pagine scritte i namespace saltano fuori solo ora? perché non sono stati spiegati nei moduli? Boh. La cosa assurda è che l’autore con queste due frasi:
    Per accedere alle variabili in un namespace, si può utilizzare la sintassi variabile.attributo. In questo modo quindi si accede per esempio a sys.argv Quanto detto (o meglio, chiarificato) è sufficiente a capire le classi, in quanto sostanziamente introducono un nuovo namespace, che come vedremo si trova tra quello locale e quello globale.
    Liquida l’argomento classi… le classi sostanzialmente introducono un nuovo namespace!? Povero newbie…
  27. Classi:
    Una classe può essere pensata come una estensione del concetto di modulo.
    Quindi tutta la magica OOP si conclude in questa mistica frase? Le classi sono una estensione di un modulo? Che fesso che son stato in questi anni a pensare altro. Tra tutte la sezione sulle classi è la _peggiore_ di questo pessimo tutorial, ora vi dimostro come:
    Una classe invece invece inizializzata più volte, creando appunto una istanza, che contiene dei dati diversi per ogni istanza. Diventa quindi un oggetto. Ed ha anche la capacità di avere eredi, e di ridefinire metodi.
    Mi rifiuto di commentare.
  28. Ereditarietà:In un esempio deputato ad un newbie si fa ereditare un punto da un numero… bello…

Il tutorial è (finalmente) finito ma per curiosare mi sono letto anche le conclusioni e sinceramente ho chiuso il browser con un bel sorriso sulle labbra. Vediamo perché:

Ma la vera bibbia è la guida di riferimento delle librerie, che è “da tenere sotto le pillole”.

Citando a memoria la documentazione che dice “under your pillows” mi ricordo che pillow significa cuscino e non pillola.

Le mie conclusioni: il tutorial è pessimo, pieno di imprecisioni e addirittura a volte incorrettezze. Soprassedendo sugli errori linguistici penso che non sia affatto una buona lettura per uno che si accinge allo studio di un linguaggio che tanto amo (e di cui voglio fare l’advocate in questa sede). Per cui se volete apprendere il Python usando testi in italiano e siete newbie della programmazione lasciate perdere questo tutorial e leggete ciò che c’è scritto nella sezione Newbie del sito italiano di Python o fate un favore a voi stessi, imparate l’inglese che torna utile ;-)

Ah… non dimenticatevi di Python.org

Alla prossima :-)

– Sabato 5 Novembre, 2005

Update: l’autore ha comunicato in homepage di aver risolto buona parte degli errori quindi questa critica è sicuramente obsoleta. Appena ho un pò di tempo vedrò di sistemare questa pagina aggiornandola con la nuova versione del tutorial.

Gravatar

A song for the lovers » Blog Archive » Come non scrivere un tutorial said,

November 5, 2005 @ 4:56 pm

[...] Ho scritto un articolo su come non scrivere un tutorial basandomi su un tutorial che personalmente trovo pessimo, questo è il link: Qualità dei tutorial in Python [...]

Gravatar

PDI^2 :: Fatevi i fattacci vostri :: November :: 2005 said,

November 27, 2005 @ 8:00 pm

[...] D’altro canto, non mischiatevi mai neanche in discussioni sulla qualità, perchè come insegna lo zen e l’arte della manutenzione della motocicletta, è un argomento troppo complicato (ma sinceramente, secondo voi, uno che scrive di python può ignorare la differenza tra espressione, statement e funzione ?) [...]

Gravatar

Luca said,

November 11, 2006 @ 4:41 am

Che dire, mi trovo pienamente d’accordo con la’utore di questo simpaticissimo articolo anche se a dirla tutta molte cose sono state corrette nel tempo.

Uso principalmente Python/c++ per POS (part of speech) tagging, una cosa che sconsiglio ai piu’ se non si vuole impazzire. Scherzi a parte, automatic speech recognition e’ una materia bellissima da studiare, almeno per il sottoscritto, ma si deve tenere in conto di una multitudine di variabili non indifferenti quando si cerca di applicare il linguaggio naturale ad un sistema informatico. Usiamo gli n-grams (piu’ precisamente trigrams come ad esempio TnT) e gli HMM (Hidden Markov Models)…qualcuno e’ interessato all’argomento?

Un saluto a tutti da Edimburgo (Scozia)

Luca

Gravatar

Lawrence said,

November 11, 2006 @ 12:06 pm

Io purtroppo no, tra l’altro in questo periodo l’università continua a interferire con i miei piani di conquista del mondo :-)

RSS feed for comments on this post · TrackBack URI

Leave a Comment