Как вернуть несколько значений из функции? [закрыто]

Диаграмма может помочь:

Illustration of collapsing margins for nested divs [/g0]

Если это не было очевидно: синий = внешний div, красный = внутренний div; Я рисовал их с постоянной высотой и горизонтальным позиционированием. Вы можете решить, что произойдет, если высота будет соответствовать содержимому и т. Д.

В столбце «Перед свертыванием» показано, что вы получаете, если поля не считаются смежными, например. если вы нарисуете границу синего / внешнего div; но если границы нет, то вы получите столбец «После свертывания». Верхняя строка переключает два поля вокруг примера, потому что я считаю, что поведение в этом случае более интуитивное; нижний показывает пример в howtocreate и соответствует верхней строке.

961
задан Peter Mortensen 20 June 2019 в 02:00
поделиться

8 ответов

На языках как Python я обычно использовал бы словарь, поскольку он включает меньше служебное, чем создание нового класса.

Однако, если я возвращаю постоянно тот же набор переменных, тогда это, вероятно, включает новый класс, который я факторизую.

4
ответ дан fluffels 20 June 2019 в 02:00
поделиться

+1 на предложении S.Lott именованного контейнерного класса.

Для Python 2.6 и, названный кортежем обеспечивает полезный способ легкого создания этих контейнерных классов, и результаты являются "легким весом и не требуют больше памяти, чем регулярные кортежи".

16
ответ дан Peter Mortensen 20 June 2019 в 02:00
поделиться

Обычно "специализированная структура" на самом деле ЯВЛЯЕТСЯ разумным текущим состоянием объекта с его собственными методами.

class Some3SpaceThing(object):
  def __init__(self,x):
    self.g(x)
  def g(self,x):
    self.y0 = x + 1
    self.y1 = x * 3
    self.y2 = y0 ** y3

r = Some3SpaceThing( x )
r.y0
r.y1
r.y2

мне нравится находить названия анонимных структур, если это возможно. Понятные имена делают вещи более ясными.

18
ответ дан tzot 20 June 2019 в 02:00
поделиться

Я предпочитаю использовать кортежи каждый раз, когда кортеж чувствует себя "естественным"; координаты являются типичным примером, где отдельные объекты могут стоять самостоятельно, например, только в масштабирующихся вычислениях с одной осью, и порядок важен.Примечание: если я могу отсортировать или переставить объекты без отрицательного воздействия к значению группы, то я, вероятно, не должен использовать кортеж.

я использую словари в качестве возвращаемого значения только, когда сгруппированные объекты являются не всегда тем же. Думайте дополнительные почтовые заголовки.

Для остальной части случаев, где сгруппированные объекты имеют свойственное значение в группе или абсолютном объекте с его собственными методами, необходим, я использую класс.

28
ответ дан tzot 20 June 2019 в 02:00
поделиться

Я голосую за словарь.

я нахожу что, если я делаю функцию, которая возвращает что-либо больше чем 2-3 переменные, я сложу их в словаре. Иначе я склонен забывать порядок и содержание того, что я возвращаю.

кроме того, представляя 'специальную' структуру делает Ваш код более трудным следовать. (Кто-то еще должен будет перерыть код для обнаружения то, что это)

, Если соответствующие о типе ищут, используйте описательные ключи словаря, например, 'x-значения перечисляют'.

def g(x):
  y0 = x + 1
  y1 = x * 3
  y2 = y0 ** y3
  return {'y0':y0, 'y1':y1 ,'y2':y2 }
69
ответ дан monkut 20 June 2019 в 02:00
поделиться

Для маленьких проектов я нахожу самым легким работать с кортежами. Когда это становится слишком твердым для управления (и не прежде) я начинаю группировать вещи в логические структуры, однако я думаю, что предложенное использование словарей и объектов ReturnValue является неправильным (или слишком упрощенным).

Возврат словаря с ключами y0, y1, y2, и т.д. не предлагает преимущества перед кортежами. При возврате экземпляра ReturnValue со свойствами .y0, .y1, .y2, и т.д. не предлагает преимущества перед кортежами также. Необходимо начать называть вещи, если Вы хотите добраться где-нибудь, и можно сделать то использование кортежи так или иначе:

def getImageData(filename):
  [snip]
  return size, (format, version, compression), (width,height)
size, type, dimensions = getImageData(x)

, по моему скромному мнению, единственная хорошая техника вне кортежей должна возвратить реальные объекты с правильными методами, и свойства, как Вы добираются от re.match() или open(file).

199
ответ дан Peter Mortensen 20 June 2019 в 02:00
поделиться

Я предпочитаю:

def g(x):
  y0 = x + 1
  y1 = x * 3
  y2 = y0 ** y3
  return {'y0':y0, 'y1':y1 ,'y2':y2 }

кажется, что все остальное - просто дополнительный код, чтобы сделать то же самое.

26
ответ дан Peter Mortensen 20 June 2019 в 02:00
поделиться

Именованные кортежи были добавлены в 2,6 с этой целью. Также см. os.stat для подобного встроенного примера.

>>> import collections
>>> Point = collections.namedtuple('Point', ['x', 'y'])
>>> p = Point(1, y=2)
>>> p.x, p.y
1 2
>>> p[0], p[1]
1 2

В последних версиях Python 3 (3.6 +, я думаю), новое typing библиотека заставила NamedTuple класс делать названным кортежами легче создать и более мощный. Наследование от typing.NamedTuple позволяет Вам использовать docstrings, значения по умолчанию, и ввести аннотации.

Пример (Из документов):

class Employee(NamedTuple):  # inherit from collections.NamedTuple
    name: str
    id: int = 3  # default value

employee = Employee('Guido')
assert employee.id == 3
604
ответ дан Ben 20 June 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: