pass in Python

geek

Il post precedente su continue ha generato un commento che mi sembra il caso di sviluppare. Anche perché voglio enunciare esplicitamente una cosa del blog –dei miei post– che è sempre rimasta tra le cose non dette.

Anche se sono fuori dal mondo del lavoro ogni tanto vedo un vecchio (ma molto più giovane di me) amico con cui si parla anche di programmazione. Niente di eccezionale, anzi l’opposto: non si usa il C/C++, troppo complesso o almeno intimidatorio. Per le cose grosse si usa Java, che secondo me è incasinato come il C++ (o quasi). Io ho proposto Go che mi sembra abbordabile ma forse è troppo nuovo. Poi adesso si è iniziato a usare Octave (e forse Matlab) come fanno al Poli. Un linguaggio, anzi tutto un ambiente, il Visual Basic, usatissimo in passato mi sembra un po’ abbandonato, anche perché limitato a Windows. Per le cose normali adesso si usa Python, anche se ci sono cose che ancora non vanno come si vorrebbe. Ma è comodissimo per i piccoli script, mai più di un centinaio di righe. OK, a volte ci sono moduli importati, e poi il numero di righe non conta, vale la bontà dell’algoritmo.

La programmazione è in ogni caso vista come un mezzo, quello che interessa è trovare il risultato di una procedura, di una simulazione. Caso limite ma reale è quello di ottenere un fattore di sicurezza (pare si chiami davvero così) partendo da una massa di dati enorme ed eterogenea. Dove –importante– conta molto più l’operatore che non la macchina e il programma che c’è dentro.
Inoltre un programma (nel nostro caso si dovrebbe parlare di script) è sempre in beta, si modifica al volo quando si rende necessario. E spesso diventa ingestibile, ma questo sarebbe un altro discorso.
C’è un responsabile ma non è detto che sia l’autore dello script. E nessuno legge come dovrebbe i manuali. Anche perché non è necessario sapere tutto e poi manca il tempo.
Le soluzioni eleganti, classi e metodi razionali, come insegnano la scuola e i libri sono spesso sconosciute. Avete presente gli if kilometrici e le variabili globali? OK, se funziona va bene.

Poi, e vengo al dunque, Python ci mette del suo. Come fa notare Roberto nel commento al post citato si potrebbe usare pass:

pass is a null operation — when it is executed, nothing happens. It is useful as a placeholder when a statement is required syntactically, but no code needs to be executed.

Lo script di ieri diventa così:

#!/usr/bin/python
# -*- coding: utf-8 -*-

n = 0
while n < 6:
	n += 1
	c = n % 3
	if c == 0:
		pass
	elif c == 1:
		print n, c, "*"
	else:
		print n, "**"
print "OK!"

pass

Risultato identico a quello dello script di ieri. In realtà l’unica differenza e la sostituzione di continue con pass.

Ci sono differenze tra le due istruzioni? Ho googlato, cercato in Stack Overflow ma non ho trovato niente; forse devo cercare meglio, o forse qualcuno che ne sa di più ci dirà.
Io personalmente ho sempre usato continue (e il suo fratello break) all’interno dei cicli e pass nella gestione delle eccezioni.
A proposito: con gli ing. di cui sopra mai parlare di errori, è una parolaccia :mrgreen:


Poi ogni tanto faccio anche dei post diversi, per esempio ne sto preparando uno che…
prossimamente 😎

Aggiornamento

al3hex nel commento ha risolto il mistero. Che mistero non era ovviamente 🙄

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • Num3ri  Il 19 febbraio 2014 alle 10:46

    ……lo aspettiamo con ansia e trepidazione 🙂

  • al3hex  Il 19 febbraio 2014 alle 13:42

    continue != pass. pass è semplicemente un placeholder, nel senso che non fa nulla e passa l’esecuzione all’istruzione successiva mentre continue interrompe l’iterazione corrente, forzando il ciclo a ritornare dall’inizio e saltando così, se esistono, il resto delle istruzioni.

    In questo caso, il risultato è identico perché non vi sono altre istruzioni dopo l’if, all’interno del loop.
    Un modo semplice per capire la differenza di comportamento è proprio quella di aggiungere un’istruzione dopo l’if: http://pastie.org/8748354

    Analizzando l’output: quando continue viene eseguita, l’istruzione print alla fine del ciclo non verrà eseguita, invece usando pass, l’istruzione print verrà sempre eseguita.

    • juhan  Il 19 febbraio 2014 alle 13:45

      Grazie al3hex! Caso risolto.

    • Num3ri  Il 19 febbraio 2014 alle 18:55

      Lo segnalo ad un mio amico che si diletta a fare scriptin python !

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: