<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Python</title>
        <link>http://blogs.ugidotnet.org/angellaa/category/Python.aspx</link>
        <description>Python</description>
        <language>it-IT</language>
        <copyright>Andrea Angella</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Anch'io finalmente conosco il linguaggio Python !</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2007/09/10/88229.aspx</link>
            <description>&lt;p&gt;&lt;br /&gt;E' da diverso tempo che sento parlare spesso di Python e finalmente mi sono deciso di acquistare un libro introduttivo per conoscere questo linguaggio.&lt;br /&gt;Il libro è Python della serie Pocket di Apogeo (i migliori per iniziare a mio parere) e l'ho letto tutto di un fiato con il computer davanti per provare il codice !!&lt;br /&gt;Il primo impatto con questo linguaggio devo dire che è stato grande, sembra davvero interessante. Poi darò un'occhiata allo stato del porting in .NET.&lt;/p&gt; &lt;p&gt;Ecco le caratteristiche che lo rendono appetibile:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Orientato agli oggetti&lt;/li&gt; &lt;li&gt;Veramente semplice da imparare ( io ci ho messo 5 ore per familiarizzare con la sintassi, i costrutti e i tipi di dati )&lt;/li&gt; &lt;li&gt;Utilizza la tipizzazione dinamica ma è fortemente tipizzato&lt;/li&gt; &lt;li&gt;Tipi di dati potenti e facili da usare come liste, insiemi e dizionari&lt;/li&gt; &lt;li&gt;Estensibile in C e in C++&lt;/li&gt; &lt;li&gt;Possibilità di includere l'interprete Python nei nostri programmi&lt;/li&gt; &lt;li&gt;Portabile (se non si utilizzano moduli dedicati a uno specifico sistema operativo come PyWin32 )&lt;/li&gt; &lt;li&gt;Semplicissimo da installare&lt;/li&gt; &lt;li&gt;Particolare e potente metodo di accesso a uno o più elementi su tipi di dati sequenziali come liste e stringhe (&lt;strong&gt;Slicing&lt;/strong&gt;)&lt;/li&gt; &lt;li&gt;Disponibilità di migliaia di moduli già realizzati e facili da utilizzare, compresi quelli per la realizzazione di interfacce grafiche multipiattaforma&lt;/li&gt; &lt;li&gt;Permette l'overloading degli operatori&lt;/li&gt; &lt;li&gt;Semplicità di creazione di pacchetti per il deployment anche su macchine senza interprete Python (modulo Inno Setup)&lt;/li&gt; &lt;li&gt;Gratuito&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Alcune cose che mi hanno fatto un pò storcere il naso sono:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Indentazione obbligatoria&lt;/strong&gt; e assenza di parentesi nei costrutti if, for ecc&lt;br /&gt;Si avete capito bene. L'interprete Python richiede in modo obbligatorio l'indentazione e si basa su quella per determinare i blocchi di codice.&lt;br /&gt;Lo scopo è quello di migliorare la leggibilità dei programmi semplicemente impedendo di scrivere in modo disordinato.&lt;br /&gt;Non ho esperienza con questo linguaggio quindi non saprei se alla fine questo si traduce in un reale vantaggio.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Non si hanno parole chiave per rendere privato un membro di una classe&lt;/strong&gt;. Per fare questo si deve anteporre al nome del membro due caratteri underscore.&lt;br /&gt;Questa scelta mi porterà senz'altro a non utilizzare mai membri privati in Python anche se ciò è contro il fondamentale principio dell' information hiding.&lt;br /&gt;Inoltre anche se utilizziamo questa convenzioni il Python permette ancora di accedere al membro definito ma con una sintassi differente  ( uhmmmm )&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Alcuni pezzi di codice divertenti e curiosi:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Assegnare un valore all'ultimo elemento di una lista&lt;/strong&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;elenco = [ 'a', 'b', 'c', 1, 2]&lt;br /&gt;elenco[-1] = 3&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Estrarre una sottostringa&lt;/strong&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;stringa = "Angella Andrea is my name"&lt;br /&gt;nome = stringa[8:14]&lt;br /&gt;print nome                      # visualizza 'Andrea'&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Moltriplicazione di stringhe&lt;/strong&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;stringa = "ciao " * 5&lt;br /&gt;print stringa                # visualizza 'ciao ciao ciao ciao ciao'&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Non c'è limite alle dimensioni di un numero intero:&lt;/strong&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;print 2 ** 10000       # visualizza tutte le cifre intere di 2 elevato a 10000 (e sono tante)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Il linguaggio supporta anche i numeri complessi&lt;/strong&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;a = 3 + 2j&lt;br /&gt;b = 2 - 4j&lt;br /&gt;print a + b&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Unico ciclo su liste distinte&lt;/strong&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;nomi = ["Andrea", "Stefano", "Alessandro"]&lt;br /&gt;cognomi = ["Cognome1", "Cognome2", "Cognome3"]&lt;br /&gt;anni = [23, 23, 26]&lt;br /&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;for nome, cognome, eta in zip(nomi, cognomi, anni):&lt;br /&gt;    print "%s %s ha %s anni" % (nome, cognome, eta)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Esiste anche la clausola else nel costrutto for. &lt;br /&gt;Le istruzioni vengono eseguite sempre alla fine del ciclo a meno che non si termina con break:&lt;/strong&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;for num in range(100):&lt;br /&gt;    for fat in range(2, num):&lt;br /&gt;        if num % fat == 0:&lt;br /&gt;            print num, "è ", fat, "*", num/fat&lt;br /&gt;            break&lt;br /&gt;    else:&lt;br /&gt;        print num, "è un numero primo"&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Scaricare una pagina web e salvarla su un file.&lt;br /&gt;Siccome non esistono parentesi per delimitare i blocchi è necessario avere a disposizione un modo per indicare un blocco vuoto (pass).&lt;br /&gt;E' possibile utilizzare la clausola else anche per la gestione delle eccezioni&lt;/strong&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;import urllib&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;    urllib.urlretrieve("&lt;/font&gt;&lt;a href="http://www.google.it&amp;quot;"&gt;&lt;font face="Courier New"&gt;http://www.google.it"&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New"&gt;, "c:\pagina.html")&lt;br /&gt;except:&lt;br /&gt;    pass&lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;finally:&lt;br /&gt;    print "Codice sempre eseguito"&lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;else:&lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;    print "Codice sempre eseguito se non sono state sollevate eccezioni"&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;br /&gt;&lt;strong&gt;Funzioni che restituiscono più di un valore&lt;/strong&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;def funzione(n):&lt;br /&gt;    return 2*n, n*n&lt;br /&gt;&lt;br /&gt;doppio, quadrato = funzione(5)          # restituisce 10 e 25&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Una funzione è un oggetto a tutti gli effetti e può essere passato come argomento di funzioni:&lt;/strong&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;def stampa(arg):&lt;br /&gt;    print arg &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;def esegui(funz, arg):&lt;br /&gt;    funz(arg) &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;esegui(stampa, "Ciao")        # stampa a video "Ciao"&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Semplicità di serializzare e deserializzare gli oggetti e quindi creare un semplice database basato su file (modulo shelve)&lt;/strong&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;import shelve &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;class Studente:&lt;br /&gt;    def __init__(this, matricola, nome):&lt;br /&gt;        this.matricola = matricola&lt;br /&gt;        this.nome = nome&lt;br /&gt;    def __str__(this):&lt;br /&gt;        return "Studente " + this.nome + " matricola " + str(this.matricola) &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;s1 = Studente(111111, "Andrea")&lt;br /&gt;s2 = Studente(222222, "Stefano") &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;# Serializzo gli oggetti su un file &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;db = shelve.open("db")&lt;br /&gt;db["studente1"] = s1      # serializza lo studente su file&lt;br /&gt;db["studente2"] = s2      # serializza lo studente su file &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;db.close(); &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;# Leggo gli oggetti deserializzando il file &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;db = shelve.open("db") &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;s1 = db["studente1"]&lt;br /&gt;s2 = db["studente2"] &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;print s1     # Visualizza 'Studente Andrea matricola 111111'&lt;br /&gt;print s2     # Visualizza 'Studente Stefano matricola 222222'&lt;/font&gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Certamente la piattaforma .NET rimane sempre la mia preferita accompagnata ovviamente dal potentissimo editor Visual Studio con il fantastico Intellisense !&lt;/p&gt; &lt;p&gt;Se ho stimolato la curiosità di qualcuno l'indirizzo da cui scaricare l'interprete Python o anche i sorgenti è &lt;a title="http://www.python.org/" href="http://www.python.org/"&gt;http://www.python.org/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/88229.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2007/09/10/88229.aspx</guid>
            <pubDate>Mon, 10 Sep 2007 22:41:29 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2007/09/10/88229.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/88229.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/88229.aspx</trackback:ping>
        </item>
    </channel>
</rss>