Функциональное дополнение/расширение

Методы append и extend в Python не являются функциональными по своей природе, они изменяют вызываемого абонента и возвращают None.

Есть ли альтернативный способ сделать то, что делают эти методы, и получить новый список в качестве возвращаемого значения?

Рассмотрим следующий пример:

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

Очевидно, что это не сработает.

Есть ли способ построить новый список "на месте", вместо того, чтобы быть вынужденным написать следующее?

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

   for elem in all_args:
     print elem

Спасибо.

Ответ 1

>>> 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]

Это то, что вы хотели?

Вы также можете определить свой собственный тип, который возвращает сам список в этих операциях, в дополнение к изменению:

>>> 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

Вы можете переписать это как:

[first] + args