Supongamos que tenemos dos listas a y b de Python y queremos calcular una lista d tal que:
d = a – b #diferencia de conjuntos.
Utilizando las construcciones funcionales de Python (en particular List Comprehension), resulta muy sencillo:
d = [x for x in a if x not in b]
Vean como la construcción del lenguaje prácticamente se lee como la definición formal de diferencia de conjuntos: “d es igual a x para todo x que pertenece a a y x no pertenece a b“.
Si comparamos esto con el equivalente imperativo, es fácil ver que estamos expresando mediante el lenguaje lo que queremos que se haga y no cómo hacerlo exactamente.
Esta sutileza nos permite ahorrar mucho código y ser más productivos desarrollando aplicaciones cuando no es crítico el mantener el control sobre cada instrucción exacta a ser ejecutada.
¿Qué otros ejemplos interesantes de manejo de listas sueles utilizar?
En el UML Almighty seria algo asi:
d := a difference: b.
Si vas al metodo #difference: de la clase Collection.
difference: comperand
^self reject: [:each | comperand includes: each]
“Devuelve una nueva coleccion que rechaza los elementos de la coleccion actual que tambien estan en la coleccion ”
En el UML Almighty #reject: (lo mismo para #select:) es una primitiva, pero se puede poner como codigo (pero es menos performante).
select: discriminatorBlock
| newCollection |
newCollection := self newSpecie.
self do: [:each | (discriminatorBlock value: each) ifTrue: [newCollection add: each]].
^newCollection
Aqui nuevamente se llama al metodo #do:, que es parecido al “for each”, digo parecido pq el uso de Bloques lo cambia todo.
Bloque es algo asi (3 bloques):
[:eachCliente | eachCliente valorTotalCompras >= 150000].
[:eachNumero | eachNumero * 2].
[:eachCliente |
eachCliente actualizarSaldo: Date today.
eachCliente calcularNuevoPorcentajeDeDescuentos].
Saludos,
Bruno
Debio decir:
^self reject: [:each | comperand includes: each]
“Devuelve una nueva coleccion que rechaza los elementos de la coleccion actual [self] que tambien estan en la coleccion [comperand]”