SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
SPyppolare o non sPyppolare?

                   a script by
           Federico Di Gregorio

  Pycon Italia Qu4ttro – Firenze 8,9 maggio 2010
A                                                   A
SPyppolare o non sPyppolare?

                    a script by
            Federico Di Gregorio

   Pycon Italia Qu4ttro - Firenze 8,9 maggio 2010
A                                       H
Nella bella Firenze,
dove noi collochiam la nostra scena,
molti linguaggi di pari nobiltà;
ferocemente gli uni agli altri oppone
da vecchia ruggine nuova contesa,
onde codice sublime va macchiando
chiarissimi fosfori.                    i
Molti Linguaggi
●
    Perché la azienda (per la quale, ovviamente,
    lavoriamo) ce lo impone.
●
    Perché non tutti i problemi sono chiodi.
●
    Perché non tutti i chiodi sono problemi.
●
    Perché “Erlang fa ma se vuoi fare questo e quello
    allora non puoi farne a meno...”
Relax Programming
Dramatis Personae - Basso Livello




                            C
Dramatis Personae – Java XP
Dramatis Personae – ???
Dramatis Personae – Sigh!
Programmare “Enterprise”
Programmare “Enter-Pool”
PyPremessa
Quelle parti del linguaggio che già sono Pythoniche
non ci interessano più di tanto.


[x * x for x in get_all_xs()]


from x in get_all_xs() select x * x;


                                              L
PyVantaggi
Andiamo ad elencare i vantaggi del Python...
●
    Compatto e leggibile
●
    Mix imperativo e funzionale
●
    Dooolce! (nel senso di zucchero sintattico)
●
    Se non puoi risolvere un problema: aggiralo!
    ●
        “Sei il GIL non si scrosta, scrostiamo i thread.”
PyEsempi
Tre esempi che a me piacciono molto:
●
    nevow stan, per la generazione di HTML
●
    Stackless Python
●
    multiprocessing, per parallelizzare
    execnet (solo perché l'ho visto ieri...)


                                               Q
●
Dominare il DOM
head = document.createElement(“head”)
title = document.createElement(“title”)
title.innerHTML = “Questo NON è stile!”
head.appendChild(title)
document.rootElement.appendChild(head)
body = document.createElement(“body”)
document.rootElement.appendChild(body)
...
PyStile
from nevow import flat, tags as T
html = T.html[
  T.head[“Questo è Stile!”],
  T.body[T.p(class=”red”)[
     “E questo è un paragrafo rosso e stiloso...”,
     lambda ctx, data: “...e funzionale!” ]]]
print flat.flatten(html)
“<html><head>Questo è stile!</head><body>...”
PyStile#
using Tesseract.Html;
var T = new HtmlTemplate(); var html =
  T.head()[“Questo è Stile#!”],
  T.body()[T.p(“class”, ”red”)[
    “E questo è un paragrafo rosso e stiloso...”,
    (ctx, data) => “...e funzionale!” ]]]
Console.WriteLine(html.ToString());
“<html><head>Questo è stile!</head><body>...”
Stackless
●
    Modifiche all'interprete per supportare “tasklets”.
●
    Ovviamente non possiamo modificare XXX.
●
    Il pattern d'uso più comune consiste nell'avere un
    alto numero di tasklets che collaborano.
●
    Twisted fa più o meno la stessa cosa coi generator.
                    Mumble mumble...
My Name is I, IEnumerable
public class Agent007 {
  Public Agent007(Scheduler s, Queue kills) {
      this.kills = kills; this.scheduler = s; s.AddTask(Investigate());
  }
  IEnumerable Investigate() {
      if (LocateSpectreAgent()) {
          this.kills.Push(1); yield return Kill();
      }
      yield return DrinkMartini();
  }
My Name is I, IEnumerable (2)
    IEnumerable Kill() {
        this.schedule.AddTask(new KillAnimation(this).Start());
    }
    IEnumerable DrinkMartini() {
        yield return new Timespan(2);
    }
    IEnumerable MeetBeautifulWoman() {
        yield return new Signal(“randezvous”);


                                                           B
    }
}
multiprocessing
●
    Utilizzo delle caratteristiche esistenti del sistema
●
    API simile a quelle già esistenti (threading)
●
    Rimozione dello stato condiviso
●
    Primitive di sincronizzazione esplicite
                           MA
Di nascosto la libreria fa tutto ciò che voi non fate!
“square-reduce”
def square_range(q, a, b):


                                  D
    for x in xrange(a, b):
      q.put(x*x)


q = Queue()
p1 = Process(target=square_range, args=(q,0,1000))
p2 = Process(target=square_range, args=(q,1000,2000))
…
# Recuperiamo i dati qui...
“square-reduce-faster”
def square_range(q, a, b):
    result = [x * x for x in xrange(a, b)]
    q.put(result)


q = Queue()
p1 = Process(target=square_range, args=(q,0,1000))
p2 = Process(target=square_range, args=(q,1000,2000))
…
# Recuperiamo i dati qui...
“square-reduce-done-right”
●
    Incredibile quanto in passato le librerie per il
    multithreading si siano concentrate sulle primitive.
●
    Semantica che non richieda lock espliciti.


Parallel.Range(1,1000000)
    .Select(x => x * x)
    .Sum();
Duck Typing...

                  PyQuack!
                    PyQuack!




    ...is sexy!
Quack! Quack!



“When I see a bird that walks like a duck and swims
 like a duck and quacks like a duck, I call that bird a
                       duck.”
Hiss! Hiss!


Se vedo un serpente che striscia come un Pytone, che
 sibila come un Pyton e che si programma come un
       Pytone, non é detto che sia un Pytone.
Ma il fatto che ci assomigli mi rende molto, molto,
                    molto felice!
The End

Federico Di Gregorio
   <fog@initd.org>

Mais conteúdo relacionado

Mais procurados

LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsJUG Genova
 
PHP: strutture di controllo e funzioni
PHP: strutture di controllo e funzioniPHP: strutture di controllo e funzioni
PHP: strutture di controllo e funzioniextrategy
 
Puntatori e Riferimenti
Puntatori e RiferimentiPuntatori e Riferimenti
Puntatori e RiferimentiIlio Catallo
 
Pycrashcourse3.1
Pycrashcourse3.1Pycrashcourse3.1
Pycrashcourse3.1rik0
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++Ilio Catallo
 
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Codemotion
 
PHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQLPHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQLextrategy
 
Pycrashcourse3.0
Pycrashcourse3.0Pycrashcourse3.0
Pycrashcourse3.0rik0
 
Corso Python Deltapromo lezione 1
Corso Python Deltapromo   lezione 1Corso Python Deltapromo   lezione 1
Corso Python Deltapromo lezione 1Paolo Ferretti
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéEdmondo Porcu
 

Mais procurados (20)

LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMs
 
Pillole di C++
Pillole di C++Pillole di C++
Pillole di C++
 
2006 Py04 avanzato
2006 Py04 avanzato2006 Py04 avanzato
2006 Py04 avanzato
 
Pycon
PyconPycon
Pycon
 
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
 
PHP: strutture di controllo e funzioni
PHP: strutture di controllo e funzioniPHP: strutture di controllo e funzioni
PHP: strutture di controllo e funzioni
 
Puntatori e Riferimenti
Puntatori e RiferimentiPuntatori e Riferimenti
Puntatori e Riferimenti
 
Pycrashcourse3.1
Pycrashcourse3.1Pycrashcourse3.1
Pycrashcourse3.1
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++
 
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
 
Py t2 python-moduli
Py t2 python-moduliPy t2 python-moduli
Py t2 python-moduli
 
Py t1 python-intro
Py t1 python-introPy t1 python-intro
Py t1 python-intro
 
Corso Python 2020 - Lezione 2
Corso Python 2020 - Lezione 2Corso Python 2020 - Lezione 2
Corso Python 2020 - Lezione 2
 
PHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQLPHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQL
 
Pycrashcourse3.0
Pycrashcourse3.0Pycrashcourse3.0
Pycrashcourse3.0
 
Corso python 2020 - Lezione 1
Corso python 2020 - Lezione 1Corso python 2020 - Lezione 1
Corso python 2020 - Lezione 1
 
PHP 7 - benvenuto al futuro
PHP 7 - benvenuto al futuroPHP 7 - benvenuto al futuro
PHP 7 - benvenuto al futuro
 
Corso Python Deltapromo lezione 1
Corso Python Deltapromo   lezione 1Corso Python Deltapromo   lezione 1
Corso Python Deltapromo lezione 1
 
05 1 intro-struttura
05 1 intro-struttura05 1 intro-struttura
05 1 intro-struttura
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perché
 

Destaque

Feed back report 2010
Feed back report 2010Feed back report 2010
Feed back report 2010PyCon Italia
 
Undici anni di lavoro con Python
Undici anni di lavoro con PythonUndici anni di lavoro con Python
Undici anni di lavoro con PythonPyCon Italia
 
Qt mobile PySide bindings
Qt mobile PySide bindingsQt mobile PySide bindings
Qt mobile PySide bindingsPyCon Italia
 
socket e SocketServer: il framework per i server Internet in Python
socket e SocketServer: il framework per i server Internet in Pythonsocket e SocketServer: il framework per i server Internet in Python
socket e SocketServer: il framework per i server Internet in PythonPyCon Italia
 
Python: ottimizzazione numerica algoritmi genetici
Python: ottimizzazione numerica algoritmi geneticiPython: ottimizzazione numerica algoritmi genetici
Python: ottimizzazione numerica algoritmi geneticiPyCon Italia
 
zc.buildout: "Un modo estremamente civile per sviluppare un'applicazione"
zc.buildout: "Un modo estremamente civile per sviluppare un'applicazione"zc.buildout: "Un modo estremamente civile per sviluppare un'applicazione"
zc.buildout: "Un modo estremamente civile per sviluppare un'applicazione"PyCon Italia
 
Crogioli, alambicchi e beute: dove mettere i vostri dati.
Crogioli, alambicchi e beute: dove mettere i vostri dati.Crogioli, alambicchi e beute: dove mettere i vostri dati.
Crogioli, alambicchi e beute: dove mettere i vostri dati.PyCon Italia
 
Django è pronto per l'Enterprise
Django è pronto per l'EnterpriseDjango è pronto per l'Enterprise
Django è pronto per l'EnterprisePyCon Italia
 
OpenERP e l'arte della gestione aziendale con Python
OpenERP e l'arte della gestione aziendale con PythonOpenERP e l'arte della gestione aziendale con Python
OpenERP e l'arte della gestione aziendale con PythonPyCon Italia
 
Foxgame introduzione all'apprendimento automatico
Foxgame introduzione all'apprendimento automaticoFoxgame introduzione all'apprendimento automatico
Foxgame introduzione all'apprendimento automaticoPyCon Italia
 

Destaque (13)

Feed back report 2010
Feed back report 2010Feed back report 2010
Feed back report 2010
 
Undici anni di lavoro con Python
Undici anni di lavoro con PythonUndici anni di lavoro con Python
Undici anni di lavoro con Python
 
Qt mobile PySide bindings
Qt mobile PySide bindingsQt mobile PySide bindings
Qt mobile PySide bindings
 
socket e SocketServer: il framework per i server Internet in Python
socket e SocketServer: il framework per i server Internet in Pythonsocket e SocketServer: il framework per i server Internet in Python
socket e SocketServer: il framework per i server Internet in Python
 
Python idiomatico
Python idiomaticoPython idiomatico
Python idiomatico
 
Python: ottimizzazione numerica algoritmi genetici
Python: ottimizzazione numerica algoritmi geneticiPython: ottimizzazione numerica algoritmi genetici
Python: ottimizzazione numerica algoritmi genetici
 
zc.buildout: "Un modo estremamente civile per sviluppare un'applicazione"
zc.buildout: "Un modo estremamente civile per sviluppare un'applicazione"zc.buildout: "Un modo estremamente civile per sviluppare un'applicazione"
zc.buildout: "Un modo estremamente civile per sviluppare un'applicazione"
 
Crogioli, alambicchi e beute: dove mettere i vostri dati.
Crogioli, alambicchi e beute: dove mettere i vostri dati.Crogioli, alambicchi e beute: dove mettere i vostri dati.
Crogioli, alambicchi e beute: dove mettere i vostri dati.
 
Os Goodger
Os GoodgerOs Goodger
Os Goodger
 
Django è pronto per l'Enterprise
Django è pronto per l'EnterpriseDjango è pronto per l'Enterprise
Django è pronto per l'Enterprise
 
Effective EC2
Effective EC2Effective EC2
Effective EC2
 
OpenERP e l'arte della gestione aziendale con Python
OpenERP e l'arte della gestione aziendale con PythonOpenERP e l'arte della gestione aziendale con Python
OpenERP e l'arte della gestione aziendale con Python
 
Foxgame introduzione all'apprendimento automatico
Foxgame introduzione all'apprendimento automaticoFoxgame introduzione all'apprendimento automatico
Foxgame introduzione all'apprendimento automatico
 

Semelhante a Spyppolare o non spyppolare

What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018Marco Parenzan
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Marcello Missiroli
 
Pycrashcourse4.0 pdfjam
Pycrashcourse4.0 pdfjamPycrashcourse4.0 pdfjam
Pycrashcourse4.0 pdfjamrik0
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewFrancesco Sciuti
 
Javascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerJavascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerMatteo Magni
 
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014Andrea Telatin
 
Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaRobert Casanova
 
Linux@Unina
Linux@UninaLinux@Unina
Linux@UninaNaLUG
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritornolordarthas
 
Pycrashcourse2.0
Pycrashcourse2.0Pycrashcourse2.0
Pycrashcourse2.0rik0
 
Python - Primi passi
Python - Primi passi Python - Primi passi
Python - Primi passi orestJump
 
5 Strutture Iterative
5   Strutture Iterative5   Strutture Iterative
5 Strutture Iterativeguest60e9511
 
Functional Programming per tutti
Functional Programming per tuttiFunctional Programming per tutti
Functional Programming per tuttiGiancarlo Valente
 

Semelhante a Spyppolare o non spyppolare (20)

What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
 
Pycrashcourse4.0 pdfjam
Pycrashcourse4.0 pdfjamPycrashcourse4.0 pdfjam
Pycrashcourse4.0 pdfjam
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript Overview
 
Rest sdk
Rest sdkRest sdk
Rest sdk
 
R Vectors
R VectorsR Vectors
R Vectors
 
Bash intro
Bash introBash intro
Bash intro
 
Javascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerJavascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesigner
 
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
 
Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguida
 
Linux@Unina
Linux@UninaLinux@Unina
Linux@Unina
 
La Grafica Con Java
La Grafica Con JavaLa Grafica Con Java
La Grafica Con Java
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritorno
 
Pycrashcourse2.0
Pycrashcourse2.0Pycrashcourse2.0
Pycrashcourse2.0
 
Python - Primi passi
Python - Primi passi Python - Primi passi
Python - Primi passi
 
5 Strutture Iterative
5   Strutture Iterative5   Strutture Iterative
5 Strutture Iterative
 
Functional Programming per tutti
Functional Programming per tuttiFunctional Programming per tutti
Functional Programming per tutti
 

Mais de PyCon Italia

Python in the browser
Python in the browserPython in the browser
Python in the browserPyCon Italia
 
PyPy 1.2: snakes never crawled so fast
PyPy 1.2: snakes never crawled so fastPyPy 1.2: snakes never crawled so fast
PyPy 1.2: snakes never crawled so fastPyCon Italia
 
PyCuda: Come sfruttare la potenza delle schede video nelle applicazioni python
PyCuda: Come sfruttare la potenza delle schede video nelle applicazioni pythonPyCuda: Come sfruttare la potenza delle schede video nelle applicazioni python
PyCuda: Come sfruttare la potenza delle schede video nelle applicazioni pythonPyCon Italia
 
New and improved: Coming changes to the unittest module
 	 New and improved: Coming changes to the unittest module 	 New and improved: Coming changes to the unittest module
New and improved: Coming changes to the unittest modulePyCon Italia
 
Monitoraggio del Traffico di Rete Usando Python ed ntop
Monitoraggio del Traffico di Rete Usando Python ed ntopMonitoraggio del Traffico di Rete Usando Python ed ntop
Monitoraggio del Traffico di Rete Usando Python ed ntopPyCon Italia
 
Jython for embedded software validation
Jython for embedded software validationJython for embedded software validation
Jython for embedded software validationPyCon Italia
 
Comet web applications with Python, Django & Orbited
Comet web applications with Python, Django & OrbitedComet web applications with Python, Django & Orbited
Comet web applications with Python, Django & OrbitedPyCon Italia
 
Cleanup and new optimizations in WPython 1.1
Cleanup and new optimizations in WPython 1.1Cleanup and new optimizations in WPython 1.1
Cleanup and new optimizations in WPython 1.1PyCon Italia
 

Mais de PyCon Italia (8)

Python in the browser
Python in the browserPython in the browser
Python in the browser
 
PyPy 1.2: snakes never crawled so fast
PyPy 1.2: snakes never crawled so fastPyPy 1.2: snakes never crawled so fast
PyPy 1.2: snakes never crawled so fast
 
PyCuda: Come sfruttare la potenza delle schede video nelle applicazioni python
PyCuda: Come sfruttare la potenza delle schede video nelle applicazioni pythonPyCuda: Come sfruttare la potenza delle schede video nelle applicazioni python
PyCuda: Come sfruttare la potenza delle schede video nelle applicazioni python
 
New and improved: Coming changes to the unittest module
 	 New and improved: Coming changes to the unittest module 	 New and improved: Coming changes to the unittest module
New and improved: Coming changes to the unittest module
 
Monitoraggio del Traffico di Rete Usando Python ed ntop
Monitoraggio del Traffico di Rete Usando Python ed ntopMonitoraggio del Traffico di Rete Usando Python ed ntop
Monitoraggio del Traffico di Rete Usando Python ed ntop
 
Jython for embedded software validation
Jython for embedded software validationJython for embedded software validation
Jython for embedded software validation
 
Comet web applications with Python, Django & Orbited
Comet web applications with Python, Django & OrbitedComet web applications with Python, Django & Orbited
Comet web applications with Python, Django & Orbited
 
Cleanup and new optimizations in WPython 1.1
Cleanup and new optimizations in WPython 1.1Cleanup and new optimizations in WPython 1.1
Cleanup and new optimizations in WPython 1.1
 

Spyppolare o non spyppolare

  • 1. SPyppolare o non sPyppolare? a script by Federico Di Gregorio Pycon Italia Qu4ttro – Firenze 8,9 maggio 2010
  • 2. A A SPyppolare o non sPyppolare? a script by Federico Di Gregorio Pycon Italia Qu4ttro - Firenze 8,9 maggio 2010
  • 3. A H Nella bella Firenze, dove noi collochiam la nostra scena, molti linguaggi di pari nobiltà; ferocemente gli uni agli altri oppone da vecchia ruggine nuova contesa, onde codice sublime va macchiando chiarissimi fosfori. i
  • 4. Molti Linguaggi ● Perché la azienda (per la quale, ovviamente, lavoriamo) ce lo impone. ● Perché non tutti i problemi sono chiodi. ● Perché non tutti i chiodi sono problemi. ● Perché “Erlang fa ma se vuoi fare questo e quello allora non puoi farne a meno...”
  • 6. Dramatis Personae - Basso Livello C
  • 12. PyPremessa Quelle parti del linguaggio che già sono Pythoniche non ci interessano più di tanto. [x * x for x in get_all_xs()] from x in get_all_xs() select x * x; L
  • 13. PyVantaggi Andiamo ad elencare i vantaggi del Python... ● Compatto e leggibile ● Mix imperativo e funzionale ● Dooolce! (nel senso di zucchero sintattico) ● Se non puoi risolvere un problema: aggiralo! ● “Sei il GIL non si scrosta, scrostiamo i thread.”
  • 14. PyEsempi Tre esempi che a me piacciono molto: ● nevow stan, per la generazione di HTML ● Stackless Python ● multiprocessing, per parallelizzare execnet (solo perché l'ho visto ieri...) Q ●
  • 15. Dominare il DOM head = document.createElement(“head”) title = document.createElement(“title”) title.innerHTML = “Questo NON è stile!” head.appendChild(title) document.rootElement.appendChild(head) body = document.createElement(“body”) document.rootElement.appendChild(body) ...
  • 16. PyStile from nevow import flat, tags as T html = T.html[ T.head[“Questo è Stile!”], T.body[T.p(class=”red”)[ “E questo è un paragrafo rosso e stiloso...”, lambda ctx, data: “...e funzionale!” ]]] print flat.flatten(html) “<html><head>Questo è stile!</head><body>...”
  • 17. PyStile# using Tesseract.Html; var T = new HtmlTemplate(); var html = T.head()[“Questo è Stile#!”], T.body()[T.p(“class”, ”red”)[ “E questo è un paragrafo rosso e stiloso...”, (ctx, data) => “...e funzionale!” ]]] Console.WriteLine(html.ToString()); “<html><head>Questo è stile!</head><body>...”
  • 18. Stackless ● Modifiche all'interprete per supportare “tasklets”. ● Ovviamente non possiamo modificare XXX. ● Il pattern d'uso più comune consiste nell'avere un alto numero di tasklets che collaborano. ● Twisted fa più o meno la stessa cosa coi generator. Mumble mumble...
  • 19. My Name is I, IEnumerable public class Agent007 { Public Agent007(Scheduler s, Queue kills) { this.kills = kills; this.scheduler = s; s.AddTask(Investigate()); } IEnumerable Investigate() { if (LocateSpectreAgent()) { this.kills.Push(1); yield return Kill(); } yield return DrinkMartini(); }
  • 20. My Name is I, IEnumerable (2) IEnumerable Kill() { this.schedule.AddTask(new KillAnimation(this).Start()); } IEnumerable DrinkMartini() { yield return new Timespan(2); } IEnumerable MeetBeautifulWoman() { yield return new Signal(“randezvous”); B } }
  • 21. multiprocessing ● Utilizzo delle caratteristiche esistenti del sistema ● API simile a quelle già esistenti (threading) ● Rimozione dello stato condiviso ● Primitive di sincronizzazione esplicite MA Di nascosto la libreria fa tutto ciò che voi non fate!
  • 22. “square-reduce” def square_range(q, a, b): D for x in xrange(a, b): q.put(x*x) q = Queue() p1 = Process(target=square_range, args=(q,0,1000)) p2 = Process(target=square_range, args=(q,1000,2000)) … # Recuperiamo i dati qui...
  • 23. “square-reduce-faster” def square_range(q, a, b): result = [x * x for x in xrange(a, b)] q.put(result) q = Queue() p1 = Process(target=square_range, args=(q,0,1000)) p2 = Process(target=square_range, args=(q,1000,2000)) … # Recuperiamo i dati qui...
  • 24. “square-reduce-done-right” ● Incredibile quanto in passato le librerie per il multithreading si siano concentrate sulle primitive. ● Semantica che non richieda lock espliciti. Parallel.Range(1,1000000) .Select(x => x * x) .Sum();
  • 25. Duck Typing... PyQuack! PyQuack! ...is sexy!
  • 26. Quack! Quack! “When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”
  • 27. Hiss! Hiss! Se vedo un serpente che striscia come un Pytone, che sibila come un Pyton e che si programma come un Pytone, non é detto che sia un Pytone. Ma il fatto che ci assomigli mi rende molto, molto, molto felice!
  • 28. The End Federico Di Gregorio <fog@initd.org>