logical - python// operator double slash
¿En qué situación debería usarse el módulo "operador" incorporado en python? (4)
Un ejemplo es en el uso de la función reduce()
:
>>> import operator
>>> a = [2, 3, 4, 5]
>>> reduce(lambda x, y: x + y, a)
14
>>> reduce(operator.add, a)
14
Estoy hablando de este módulo: http://docs.python.org/library/operator.html
Del artículo:
El módulo operador exporta un conjunto de funciones implementadas en C correspondientes a los operadores intrínsecos de Python. Por ejemplo, operator.add (x, y) es equivalente a la expresión x + y. Los nombres de las funciones son los que se usan para los métodos de clases especiales; Las variantes sin encabezado y final __ también se proporcionan por conveniencia.
No estoy seguro de entender el beneficio o el propósito de este módulo.
Posiblemente el uso más popular es operator.itemgetter. Dada una lista la lst
de las tuplas, puede ordenar por el i-ésimo elemento mediante: lst.sort(key=operator.itemgetter(i))
Ciertamente, podría hacer lo mismo sin operador definiendo su propia función clave, pero el módulo operador lo hace un poco más ordenado.
En cuanto al resto, Python permite un estilo funcional de programación, por lo que puede aparecer, por ejemplo, el ejemplo de reducción de Greg.
Podría argumentar: "¿Por qué necesito operator.add
cuando puedo hacer lo siguiente: add = lambda x, y: x+y
?" Las respuestas son:
-
operator.add
es (creo) un poco más rápido. - Hace que el código sea más fácil de entender para usted, u otra persona más tarde, mirándolo. No necesitan buscar la definición de agregar porque saben lo que hace el módulo de operador.
El módulo es útil cuando necesita pasar una función como argumento a algo. Entonces hay dos opciones: usar el módulo de operator
o definir una nueva función (usando def
o lambda
). Si define una función sobre la marcha, esto puede crear un problema si necesita recuperar esta función, ya sea para guardarla en el disco o pasarla entre procesos. Aunque itemgetter
es seleccionable, las funciones definidas dinámicamente (ya sea con def
o lambda
) no lo son. En el siguiente ejemplo, reemplazar itemgetter
con una expresión lambda
dará como resultado un PicklingError
.
from operator import itemgetter
def sort_by_key(sequence, key):
return sorted(sequence, key=key)
if __name__ == "__main__":
from multiprocessing import Pool
items = [([(1,2),(4,1)], itemgetter(1)),
([(5,3),(2,7)], itemgetter(0))]
with Pool(5) as p:
result = p.starmap(sort_by_key, items)
print(result)
por ejemplo, obtener una columna en la lista cuyo miembro es una tupla, ordenar secuencia por columna:
def item_ope():
s = [''h'', ''e'', ''l'', ''l'', ''o'']
print operator.getitem(s, 1)
# e
print operator.itemgetter(1, 4)(s)
# (''e'', ''o'')
inventory = [(''apple'', 3), (''banana'', 2), (''pear'', 5), (''orange'', 1)]
get_count = operator.itemgetter(1)
print map(get_count, inventory)
# [3, 2, 5, 1]
print sorted(inventory, key=get_count)
# [(''orange'', 1), (''banana'', 2), (''apple'', 3), (''pear'', 5)]
ver un ejemplo más práctico, queremos ordenar un dict por clave o valor:
def dict_sort_by_value():
dic_num = {''first'': 11, ''second'': 2, ''third'': 33, ''Fourth'': 4}
# print all the keys
print dic_num.keys()
# [''second'', ''Fourth'', ''third'', ''first'']
# sorted by value
sorted_val = sorted(dic_num.items(), key=operator.itemgetter(1))
# [(''second'', 2), (''Fourth'', 4), (''first'', 11), (''third'', 33)]
print sorted_val
# sorted by key
sorted_key = sorted(dic_num.items(), key=operator.itemgetter(0))
print sorted_key
# [(''Fourth'', 4), (''first'', 11), (''second'', 2), (''third'', 33)]
otro ejemplo cuando queremos obtener el valor máximo y su índice en la lista:
def get_max_val_idx():
lst = [1, 7, 3, 5, 6]
max_val = max(lst)
print max_val
# 7
max_idx = lst.index(max_val)
print max_idx
# 1
# simplify it by use operator
index, value = max(enumerate(lst), key=operator.itemgetter(1))
print index, value
# 1 7
otra demo como a continuación:
import operator
def cmp_fun():
a, b = 5, 3
print operator.le(a, b)
# False
print operator.gt(a, b)
# True
def lst_ope():
lst = [1, 2, 3]
print operator.indexOf(lst, 2)
# 1
lst1 = [1, 2, 3, 2]
print operator.countOf(lst1, 2)
# 2
def cal_ope():
lst1 = [0, 1, 2, 3]
lst2 = [10, 20, 30, 40]
print map(operator.mul, lst1, lst2)
# [0, 20, 60, 120]
print sum(map(operator.mul, lst1, lst2))
# 200
a, b = 1, 3
print operator.iadd(a, b)
# 4
ver más de python doc