Differenze tra le versioni di "Python Lezione 11 Giugno 2008"

Da GolemWiki.
Jump to navigation Jump to search
m (info prontuario python3)
 
(8 versioni intermedie di 4 utenti non mostrate)
Riga 1: Riga 1:
 +
{{Note
 +
|type=info
 +
|text=La lezione fa riferimento a Python2! Dai un'occhiata anche al [[Pillole_Python | prontuario]] Python3
 +
 +
La versione 2 sarà dichiarata deprecata a gennaio 2020.
 +
}}
 +
 
QUESTI APPUNTI SONO UNA BOZZA IN ATTESA DI CORREZIONE E, PER QUESTO, NON ATTENDIBILI.
 
QUESTI APPUNTI SONO UNA BOZZA IN ATTESA DI CORREZIONE E, PER QUESTO, NON ATTENDIBILI.
  
Riga 12: Riga 19:
 
   while a < 10:
 
   while a < 10:
 
         print a
 
         print a
         a = a + 1
+
         a = a + 1 #oppure si può scrivere a += 1 (mi sembra ma verifico pu tardi su "IMPARARE PYTHON" ;-) )
  
 
che è del tutto equivalente a  
 
che è del tutto equivalente a  
Riga 25: Riga 32:
 
che ha come effetto quello del programma ''yes'' dei sistemi *nix, ovvero stampa 'y' finchè non viene interrotto
 
che ha come effetto quello del programma ''yes'' dei sistemi *nix, ovvero stampa 'y' finchè non viene interrotto
  
== LE FUNZIONI ==
+
== Le funzioni ==
  
 
quando noi abbiamo fatto il [[http://golem.linux.it/index.php/Lezione_4_Giugno#ESEMPIO_DELLA_SERATA: programma per calcolare le potenze]], abbiamo scritto diverse righe di codice.
 
quando noi abbiamo fatto il [[http://golem.linux.it/index.php/Lezione_4_Giugno#ESEMPIO_DELLA_SERATA: programma per calcolare le potenze]], abbiamo scritto diverse righe di codice.
per evitare ogni volta di riscrivere quelle righe, potremmo creare una funzione che fa esattamente quella cosa.
+
Alcune di queste erano per recuperare e controllare l'input dell'utente, altre proprio per calcolare la potenza del numero.
La funzione di definisce ''def''.
+
Se nel corso del nostro programma ci servisse ripetere il calcolo della potenza base**esponente (facendo finta che non ci sia l'operatore ** che fa esattamente quello che vogliamo) potremmo
 +
semplicemente fare copia-incolla di quelle righe ogni volta che ci servono. Poi ci accorgiamo che c'è un errore, che abbiamo quindi ripetuto n volte. E dobbiamo correggere n volte.
 +
Se avessimo creato una funzione, invece, ci sarebbe una sola definizione e n chiamate: una volta trovato l'errore basta correggerlo una volta sola.
 +
 
 +
La funzione di definisce usando ''def''.
 
Per crere una funzione dobbiamo scrivere: def -il nome della funzione- (-variabile1-,-variabile2-) :  
 
Per crere una funzione dobbiamo scrivere: def -il nome della funzione- (-variabile1-,-variabile2-) :  
 
es.
 
es.
 +
 
   def potenza (base,esponente):
 
   def potenza (base,esponente):
           result-1
+
           result = 1
           for I in xrange(esponente):
+
           for i in xrange(esponente):
 
                   result=result*base
 
                   result=result*base
 
           return result
 
           return result
  
base è un parametro quindi quando chiamo potenza lui mi da type error
+
return "ritorna" al chiamante il contenuto della variabile result.
potenza (2,8)
+
 
lui mi da 256 altrimenti mi da il type error
+
quindi il nostro programma diviene
 +
 
 +
  def potenza(base, esponente):
 +
      result=1
 +
      for i in xrange(esponente):
 +
          result = result * base
 +
      return result
 +
 
 +
  base= raw_input (“inserisce la base:”)
 +
  esponente=raw_input ('inserisci l\' esponente')
  
se io do pot= potenza(2,8)
+
  base=int(base)
ora pot è il risultato della potenza di due all'ottava.
+
  result=int(result)
  
Posso usare I parametri di default che devono stare dopo queli non di default
+
  print potenza(base, esponente)
   def potenza (esponent, base=2):
+
 
          result-1
+
Vediamo come, se si omette anche uno o entrambi i parametri, viene generata una eccezione di tipo TypeError:
          for I in xrange(esponent):
+
 
                  result=result*base
+
  >>> potenza()
          return result
+
  Traceback (most recent call last):
 +
    File "<stdin>", line 1, in <module>
 +
  TypeError: potenza() takes exactly 2 arguments (0 given)
 +
 
 +
  >>> potenza(2)
 +
  Traceback (most recent call last):
 +
    File "<stdin>", line 1, in <module>
 +
  TypeError: potenza() takes exactly 2 arguments (1 given)
 +
 
 +
  >>> potenza (2,8)
 +
  256
 +
  >>>
 +
 
 +
Se si desiderasse avere il comportamento del tipo "se manca uno dei due parametri allora si intende che la base è 2 e il parametro presente è l'esponente",
 +
potrei usare i paramatri di default:
 +
 
 +
  def potenza(esponente, base=2):
 +
      result=1
 +
      for i in xrange(esponente):
 +
          result = result * base
 +
      return result
 +
 
 +
quindi a questo punto
 +
  >>> potenza(8)
 +
  256
 +
  >>>
 +
 
 +
Da notare come i parametri di default devono necessariamente stare '''dopo''' i parametri che non hanno il valore di default.
 +
 
 +
Potrei anche mettere entrambi i paramentri di default
 +
 
 +
   def potenza(base=2, esponente=1):
 +
      result=1
 +
      for i in xrange(esponente):
 +
          result = result * base
 +
      return result
  
lui mi da l'errore solo quando eseguo, non me la da prima, in un linguaggio compilato se io lo compilo l'operatore me lo da subito.
+
In questo caso la chiamata
Potenza(8)
+
  >>> potenza()
lui ha valore di default due
+
  2
se do due valori lui usa il secondo valore e se ne strafrega del primo.
+
non genera l'eccezione perchè, avendo specificato per entrambi un valore di default l'interprete esegue 2**1 = 2
  
I parametri hanno la keyword
+
Quando effettuo chiamate di funzione posso usare la keyword per rendere più chiaro il mio programma:
potenza(base=2,esponente=8)
 
questo modo di scrivere è un pò più chiaro meglio di
 
potenza(2,8) che poi magari uno non ha chiaro cosa significhino quei due numeri.
 
  
Se base ce l'ho di default non posso scrivere
+
  >>> potenza(base=2, esponente=8)
potenza(8, base)
+
  256
lui mi da errore lui la prende come variabile.
 
  
Upper lower e questa cose qui sono funzioni.
+
In questo modo non mi devo ricordare l'ordine in cui sono stati definiti i parametri, e, rileggendo dopo mesi o anni il pezzo di codice, questo sarà sicuramente più chiaro.
 +
Certe volte, per certi moduli, l'utilizzo delle keyword è indispensabile.
  
== IMPORTARE UN FILE ==
+
== Moduli e import ==
  
 
ammetto che qui mi sono persa.
 
ammetto che qui mi sono persa.
Riga 80: Riga 133:
 
Abbiamo fatto un esempio con un file chiamato python.tmp.py,
 
Abbiamo fatto un esempio con un file chiamato python.tmp.py,
 
abbiamo detto come fare ad importarlo e abbiamo fatto un esempio pratico che ci faceva capire che, poichè il file era importato, non esguiva il main.Purtroppo mi sono persa l'esempio.
 
abbiamo detto come fare ad importarlo e abbiamo fatto un esempio pratico che ci faceva capire che, poichè il file era importato, non esguiva il main.Purtroppo mi sono persa l'esempio.
 
  
 
== MODULI GANZI ==
 
== MODULI GANZI ==
Riga 103: Riga 155:
 
   for elem in reversed(a):
 
   for elem in reversed(a):
 
           print elem
 
           print elem
 +
 +
[[Category:Corsi]]

Versione attuale delle 11:46, 9 mag 2019

Golem-template-note-info.png La lezione fa riferimento a Python2! Dai un'occhiata anche al prontuario Python3

La versione 2 sarà dichiarata deprecata a gennaio 2020.


QUESTI APPUNTI SONO UNA BOZZA IN ATTESA DI CORREZIONE E, PER QUESTO, NON ATTENDIBILI.


while

Simile al for, si usa per effettuare un ciclo di cui non sappiamo la lunghezza esatta, ovvero si cicla finché la condizione specificata non risulta vera. Torna utile quando vogliamo fare cicli infiniti, che con il for non possiamo fare in maniera "pulita" Può essere usato (a discapito della chiarezza) come un ciclo for: ad esempio, se volessimo ciclare 10 volte possiamo scrivere

  a = 0
  while a < 10:
       print a
       a = a + 1 #oppure si può scrivere a += 1 (mi sembra ma verifico pu tardi su "IMPARARE PYTHON" ;-) )

che è del tutto equivalente a

  for a in xrange(10):
      print a

Altrimenti, per ciclare all'infinito

 while True:
     print "y"

che ha come effetto quello del programma yes dei sistemi *nix, ovvero stampa 'y' finchè non viene interrotto

Le funzioni

quando noi abbiamo fatto il [programma per calcolare le potenze], abbiamo scritto diverse righe di codice. Alcune di queste erano per recuperare e controllare l'input dell'utente, altre proprio per calcolare la potenza del numero. Se nel corso del nostro programma ci servisse ripetere il calcolo della potenza base**esponente (facendo finta che non ci sia l'operatore ** che fa esattamente quello che vogliamo) potremmo semplicemente fare copia-incolla di quelle righe ogni volta che ci servono. Poi ci accorgiamo che c'è un errore, che abbiamo quindi ripetuto n volte. E dobbiamo correggere n volte. Se avessimo creato una funzione, invece, ci sarebbe una sola definizione e n chiamate: una volta trovato l'errore basta correggerlo una volta sola.

La funzione di definisce usando def. Per crere una funzione dobbiamo scrivere: def -il nome della funzione- (-variabile1-,-variabile2-) : es.

 def potenza (base,esponente):
         result = 1
         for i in xrange(esponente):	
                 result=result*base
         return result

return "ritorna" al chiamante il contenuto della variabile result.

quindi il nostro programma diviene

 def potenza(base, esponente):
     result=1
     for i in xrange(esponente):
         result = result * base
     return result
 base= raw_input (“inserisce la base:”)
 esponente=raw_input ('inserisci l\' esponente')
 base=int(base)
 result=int(result)
 print potenza(base, esponente)

Vediamo come, se si omette anche uno o entrambi i parametri, viene generata una eccezione di tipo TypeError:

 >>> potenza()
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 TypeError: potenza() takes exactly 2 arguments (0 given)
 >>> potenza(2)
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 TypeError: potenza() takes exactly 2 arguments (1 given)
 >>> potenza (2,8)
 256
 >>>

Se si desiderasse avere il comportamento del tipo "se manca uno dei due parametri allora si intende che la base è 2 e il parametro presente è l'esponente", potrei usare i paramatri di default:

 def potenza(esponente, base=2):
     result=1
     for i in xrange(esponente):
         result = result * base
     return result

quindi a questo punto

 >>> potenza(8)
 256
 >>>

Da notare come i parametri di default devono necessariamente stare dopo i parametri che non hanno il valore di default.

Potrei anche mettere entrambi i paramentri di default

 def potenza(base=2, esponente=1):
     result=1
     for i in xrange(esponente):
         result = result * base
     return result

In questo caso la chiamata

 >>> potenza()
 2

non genera l'eccezione perchè, avendo specificato per entrambi un valore di default l'interprete esegue 2**1 = 2

Quando effettuo chiamate di funzione posso usare la keyword per rendere più chiaro il mio programma:

 >>> potenza(base=2, esponente=8)
 256

In questo modo non mi devo ricordare l'ordine in cui sono stati definiti i parametri, e, rileggendo dopo mesi o anni il pezzo di codice, questo sarà sicuramente più chiaro. Certe volte, per certi moduli, l'utilizzo delle keyword è indispensabile.

Moduli e import

ammetto che qui mi sono persa.

tutto è nato dalla domanda di raffaele:Quando creiamo il file, ecc....le variabili che validità hanno?

abbiamo parlato del main, che non viene esguito se il file viene importato. Abbiamo fatto degli esempi che io non ho avuto il tempo di copiare.

Abbiamo anche parlato di dove il sistema va a cercare un file, del path, ecc... Abbiamo fatto un esempio con un file chiamato python.tmp.py, abbiamo detto come fare ad importarlo e abbiamo fatto un esempio pratico che ci faceva capire che, poichè il file era importato, non esguiva il main.Purtroppo mi sono persa l'esempio.

MODULI GANZI

abbiamo parlato di alcuni moduli con cui fare cose carine, mi sono persa la maggior parte degli esempi, ma metterò l'elenco dei moduli: os walk mkdir

SOTTODIRECTORY

qui ero in stato comatoso.Mi sono veramente eclissata.


ESERCIZIO DELLA SERATA

Funzione che rivolta le stringhe. abbiamo fatto vari tentativi ma poi ci siamo accorti che esiste la funzione reversed

  • mi sono persa la parte prima*
 reversed(a)
 for elem in reversed(a):
         print elem