2011-03-15 23 views
11

Los métodos append y extend en Python no son funcionales por naturaleza, modifican el destinatario y devuelven None.Functional append/extend

¿Hay alguna manera alternativa de hacer lo que hacen estos métodos y obtener una nueva lista como valor devuelto?

Considere este ejemplo:

def myfun(first, *args): 
    for elem in [first].extend(args): 
    print elem 

Obviamente, esto no funcionará.

¿Hay alguna manera de construir una nueva lista "en su lugar", en lugar de tener que escribir lo siguiente?

def myfun(first, *args): 
    all_args = list(first) 
    all_args.extend(args) 

    for elem in all_args: 
    print elem 

Gracias.

Respuesta

14
>>> def append(lst, elem): 
...  return lst + [elem] 
... 
>>> append([1, 2, 3], 4) 
[1, 2, 3, 4] 
>>> def extend(lst1, lst2): 
... return lst1 + lst2 
... 
>>> extend([1, 2], [3, 4]) 
[1, 2, 3, 4]

es eso lo que querías?

También puede definir su propio tipo, que devuelve la propia lista de estas operaciones, además de cambiar:

>>> class MyList(list): 
... def append(self, x): 
...  super(MyList, self).append(x) 
...  return self 
... def extend(self, lst): 
...  super(MyList, self).extend(lst) 
...  return self 
... 
>>> l = MyList([1, 2, 3]) 
>>> l.append(4) 
[1, 2, 3, 4] 
>>> l.extend([5, 6, 7]) 
[1, 2, 3, 4, 5, 6, 7] 
>>> l 
[1, 2, 3, 4, 5, 6, 7]
+2

Ah, gracias. Ahora me doy cuenta, esta era una pregunta realmente tonta. –

5

que puede volver a escribir como:

[first] + args 
+0

Gracias :). No puedo creer que me haya olvidado de este. –

Cuestiones relacionadas