11 maggio, 2019

List comprehension - 2


La list comprehension, ho iniziato a parlarne qui, sembra un argomento che fa discutere. Forse per via della sintassi diversa da quella solita cui siamo abituati.

Cosa meglio allora di un altro esempio, un classico rivisto in chiave list comprehension. Poi, in futuro, credo occorrerà tirare le fila ma intanto questo script che può indurre perplimazioni.

#!/usr/bin/python3

def fb(num):
    string = ''
    if num % 3 == 0:
        string = 'Fizz'
    if num % 5 == 0:
        string += 'Buzz'
    if num % 3 != 0 and num % 5 != 0:
        string = str(num)
    return string

# usando map()
result = list(map(fb, range(1, 21)))
print(result)
print()

#usando l.c.
resultlc = [fb(num) for num in range(1, 21)]
print(resultlc)
print()

st = ' | '.join(str(ele) for ele in result)
print(st)


È il classico tormentone fizz-buzz, consistente nel contare fino a 20 ma se il numero è multiplo di 3 sostituirlo con Fizz, se multiplo di 5 sostituirlo con Buzz e, di conseguenza, se multiplo di 3 * 5...

Lo script è ridondante, calcola due volte la lista dei numeri con sostituzioni. Il calcolo usando map() ci è sembrato più facile da costruire anche se poi la versione l.c. (mica devo continuare a dire tutta la spell? (come si traduce spell?)) risulta più semplice.

map() applica una funzione a un'iterable, nel nostro caso una lista. Per noi la funzione è fb() e la lista i numeri in [1..20].

Da notare che map() restituisce on oggetto:

$ py3
>>> def fb(num):
...     string = ''
...     if num % 3 == 0:
...         string = 'Fizz'
...     if num % 5 == 0:
...         string += 'Buzz'
...     if num % 3 != 0 and num % 5 != 0:
...         string = str(num)
...     return string

...
>>> map(fb, range(1, 21))
<map object at 0x7f4235236e10>


per cui lo esplicito con list().

>>> list(map(fb, range(1, 21)))
['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz', '11', 'Fizz', '13', '14', 'FizzBuzz', '16', '17', 'Fizz', '19', 'Buzz']
>>>


Passare dalla versione con map() a quella l.c. è (quasi) immediato. Almeno facilitato secondo i miei nerd chaps e me che tanto nerd non sono (ma ci aspiro).

Eseguendo si ottiene, come previsto, questo:

$ py3 fblc
['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz', '11', 'Fizz', '13', '14', 'FizzBuzz', '16', '17', 'Fizz', '19', 'Buzz']

['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz', '11', 'Fizz', '13', '14', 'FizzBuzz', '16', '17', 'Fizz', '19', 'Buzz']

1 | 2 | Fizz | 4 | Buzz | Fizz | 7 | 8 | Fizz | Buzz | 11 | Fizz | 13 | 14 | FizzBuzz | 16 | 17 | Fizz | 19 | Buzz
$


Continua. Prossimamente. Forse 🧐

🔴

Nessun commento:

Posta un commento