Traduzioni da un linguaggio a un altro – 2

system76

Il titolo è fuorviante ma è quello per via che sto continuando a qui.
Ho semplificato troppo parlando del passaggio dei parametri a funzione; dando la colpa al Fortran che passa tutto per indirizzo ho messo su questo esempio:

*     main
      n = 5
      call foo(n, nq)
      print *, n, nq
      call foo(n, nq)
      print *, n, nq
      call foo(n, nq)
      print *, n, nq
      end
      
      subroutine foo(k, l)
      k = k + 1
      l = k ** 2
      end

pass

che con Python può diventare

def foo(k):
      k = k + 1
      l = k ** 2
      return l

#  main
n = 5
nq = foo(n)
n += 1
print(n, nq)
n += 1
nq = foo(n)
print(n, nq)
n += 1
nq = foo(n)
print(n, nq)

py-pass2

Però non è sempre così semplice! 😦 Sono stato richiamato, redarguito e allora tento di rimediare.
Inoltre il caso è più generale, non riguarda solo le traduzioni tra linguaggi.

Invece di rifare l’esempio precedente eccone uno nuovo. Secondo me l’esempio dev’essere il più piccolo possibile, eliminare tutto quanto non strettamente necessario; ovvio che poi risulti banale.
Ne approfitto per trattare anche il caso degli arrays; in realtà con Python forse sono meglio le liste. Questione che meriterebbe più attenzione, p.es. ecco i primi due risultati alla query a Stack OverFlow: uno e due.

Supponiamo di avere una serie di dati di temperature relative al processo [fate voi, non sono tanto bravo a inventare]. Purtroppo la macchina è ‘mericana e usa i gradi fahrenheit, quelli che usano solo loro (e, purtroppo, usano solo quelli). Devo inoltre calcolare il valore medio (e in un caso più realistico scarto quadratico e altri valori ancora, l’esempio dev’essere semplice). Ecco come –secondo me– si può fare in modo semplice.

def conv(f):
    return round((f - 32) * 5 / 9, 1)

def celsius(a):
    n = 0
    for c in a:
        a[n] = conv(c)
        n += 1
    media = round(sum(a) / len(a), 1)
    #print(a)
    #print(media)
    r = [a, media]
    return r

#main
t = [120, 110, 112, 125, 113, 117, 109, 121]
retval = celsius(t)
#print(retval)
tc = retval[0]
media = retval[1]
print("temperature:", tc)
print("media: ", media)

f2c

Ho lasciato commentate le print() provvisorie, di debug.

Ma un pythonista serio non scriverebbe mai codice come quello 😦 c’è la list comprehension, più chiara, compatta ed efficiente, ecco la nuova versione (il nuovo è indicato con il commento # ****):

def conv(f):
    return round((f - 32) * 5 / 9, 1)

def celsius(a):
    a = [conv(n) for n in a]           # ***
    media = round(sum(a) / len(a), 1)
    #print(a)
    #print(media)
    r = [a, media]
    return r

#main
t = [120, 110, 112, 125, 113, 117, 109, 121]
retval = celsius(t)
#print(retval)
tc = retval[0]
media = retval[1]
print("temperature:", tc)
print("media: ", media)

:mrgreen:

Posta un commento o usa questo indirizzo per il trackback.

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: