operator logical example assignment python operators

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:

  1. operator.add es (creo) un poco más rápido.
  2. 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