de-vraag
  • Otázky
  • Značky
  • Používatelia
Oznámenia
Odmeny
Registrácia
Po registrácii budete informovaní o odpovediach a komentároch na vaše otázky.
Prihlásiť sa
Ak už máte konto, prihláste sa a skontrolujte nové oznámenia.
Za pridané otázky, odpovede a komentáre budú udelené odmeny.
Viac na
Zdroj
Upraviť
 saffsd
saffsd
Question

Ako môžem z funkcie vrátiť viacero hodnôt?

Kanonickým spôsobom vrátenia viacerých hodnôt v jazykoch, ktoré to podporujú, je často tupling.

Možnosť: Použitie tuple

Zoberme si tento triviálny príklad:

def f(x):
  y0 = x + 1
  y1 = x * 3
  y2 = y0 ** y3
  return (y0, y1, y2)

Tento postup sa však rýchlo stáva problematickým, keď sa zvyšuje počet vrátených hodnôt. Čo ak chcete vrátiť štyri alebo päť hodnôt? Iste, mohli by ste ich ďalej tuplovať, ale ľahko by ste zabudli, ktorá hodnota je kde. Takisto je dosť škaredé ich rozbaľovať, kamkoľvek ich chcete dostať.

Možnosť: Použitie slovníka

Ďalším logickým krokom sa zdá byť zavedenie nejakého 'zápisu záznamu'. V jazyku Python je zrejmým spôsobom, ako to urobiť, použitie slovníka dict.

Uvažujme nasledujúce:

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

(Aby bolo jasné, y0, y1 a y2 sú myslené len ako abstraktné identifikátory. Ako bolo zdôraznené, v praxi by ste použili zmysluplné identifikátory.)

Teraz máme mechanizmus, pomocou ktorého môžeme premietnuť konkrétny člen vráteného objektu. Napríklad,

result['y0']

Možnosť: Použitie triedy

Existuje však aj iná možnosť. Namiesto toho by sme mohli vrátiť špecializovanú štruktúru. Uviedol som to v kontexte jazyka Python, ale som si istý, že to platí aj pre iné jazyky. Ak by ste pracovali v jazyku C, mohla by to byť skutočne jediná možnosť. Takto:

class ReturnValue:
  def __init__(self, y0, y1, y2):
     self.y0 = y0
     self.y1 = y1
     self.y2 = y2

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

V jazyku Python sú predchádzajúce dve možnosti možno veľmi podobné z hľadiska inštalácie - veď { y0, y1, y2 } sú nakoniec len položky v internom __dict__ ReturnValue.

Pre drobné objekty však Python poskytuje jednu dodatočnú funkciu, atribút __slots__. Trieda by mohla byť vyjadrená ako:

class ReturnValue(object):
  __slots__ = ["y0", "y1", "y2"]
  def __init__(self, y0, y1, y2):
     self.y0 = y0
     self.y1 = y1
     self.y2 = y2

Z Referenčnej príručky jazyka Python:

Deklarácia __slots__ preberá postupnosť inštančných premenných a v každej inštancii vyhradzuje práve toľko miesta, aby sa do nej zmestila hodnota pre každú premennú. Miesto sa ušetrí, pretože __dict__ sa nevytvára pre každú inštanciu.

Možnosť: Použitie dataclass (Python 3.7+)

Použitie nových dátových tried Pythonu 3.7'vráti triedu s automaticky pridanými špeciálnymi metódami, typovaním a ďalšími užitočnými nástrojmi:

@dataclass
class Returnvalue:
    y0: int
    y1: float
    y3: int

def total_cost(x):
    y0 = x + 1
    y1 = x * 3
    y2 = y0 ** y3
    return ReturnValue(y0, y1, y2)

Možnosť: Použitie zoznamu

Ďalší návrh, ktorý som prehliadol, pochádza od Billa the Lizarda:

def h(x):
  result = [x + 1]
  result.append(x * 3)
  result.append(y0 ** y3)
  return result

Toto je však moja najmenej obľúbená metóda. Asi som poznačený skúsenosťami s Haskellom, ale myšlienka zmiešaných typových zoznamov mi vždy bola nepríjemná. V tomto konkrétnom príklade zoznam nie je zmiešaného typu, ale pravdepodobne by mohol byť.

Takto použitý zoznam naozaj nič nezískava vzhľadom na tuple, pokiaľ viem. Jediný skutočný rozdiel medzi zoznamami a tuplami v jazyku Python je ten, že zoznamy sú mutovateľné, zatiaľ čo tuply nie.

Ja osobne sa prikláňam k tomu, aby som preniesol konvencie z funkcionálneho programovania: zoznamy používam pre ľubovoľný počet prvkov rovnakého typu a tuply pre pevný počet prvkov vopred určených typov.

Question

Po dlhšej úvodnej časti prichádza nevyhnutná otázka. Ktorá metóda (podľa vás) je najlepšia?

Zvyčajne som sa rozhodol pre slovníkovú metódu, pretože si vyžaduje menej práce s prípravou. Z hľadiska typov však možno bude lepšie ísť cestou triedy, pretože vám to môže pomôcť vyhnúť sa zámene toho, čo slovník predstavuje.

Na druhej strane, v komunite Pythonu sú ľudia, ktorí sa domnievajú, že implicitné rozhrania by sa mali uprednostňovať pred explicitnými rozhraniami, pričom v takom prípade typ objektu naozaj nie je dôležitý, pretože sa v podstate spoliehate na konvenciu, že rovnaký atribút bude mať vždy rovnaký význam.

Ako teda v Pythone vrátite viacero hodnôt?

1007 2008-12-10T01:55:50+00:00 3
Peter Mortensen
Peter Mortensen
Edited question 20 jún 2019 в 2:00
Programovanie
coding-style
python
return
return-value
Popular videos
Section 6
Section 6
pred 7 rokmi
24. zasadnutie Mestského zastupiteľstva v Žiline | 29.06.2021
24. zasadnutie Mestského zastupiteľstva v Žiline | 29.06.2021
pred 10 mesiacmi
26. zasadnutie Mestského zastupiteľstva v Žiline | 20.9.2021
26. zasadnutie Mestského zastupiteľstva v Žiline | 20.9.2021
pred 8 mesiacmi
22. zasadnutie Mestského zastupiteľstva v Žiline | 27. 04. 2021
22. zasadnutie Mestského zastupiteľstva v Žiline | 27. 04. 2021
pred rokom
Excel - Funkcie - Ako v Exceli vytvoriť vnorené funkcie? Kedy ich používať?
Excel - Funkcie - Ako v Exceli vytvoriť vnorené funkcie? Kedy ich používať?
pred 4 rokmi
Jak použít funkci SVYHLEDAT v MS Excel
Jak použít funkci SVYHLEDAT v MS Excel
pred 9 rokmi
How to return multiple values from a function in JavaScript
How to return multiple values from a function in JavaScript
pred rokom
Excel - Funkcie - XLOOKUP - Zabudnite na VLOOKUP, HLOOKUP, INDEX, MATCH, IFERROR. Prichádza Kráľ.
Excel - Funkcie - XLOOKUP - Zabudnite na VLOOKUP, HLOOKUP, INDEX, MATCH, IFERROR. Prichádza Kráľ.
pred 2 rokmi
Excel - Funkcie - Ako v Exceli spojiť tabuľky? Funkcia VLOOKUP - Priraďovanie údajov
Excel - Funkcie - Ako v Exceli spojiť tabuľky? Funkcia VLOOKUP - Priraďovanie údajov
pred 5 rokmi
Excel - Funkcie  - Ako v Exceli vyhodnotiť podmienku? Funkcia IF
Excel - Funkcie - Ako v Exceli vyhodnotiť podmienku? Funkcia IF
pred 4 rokmi
Excel - Funkcie - Porovnanie VLOOKUP vs. INDEX a MATCH - Spájanie tabuliek pre pokročilých
Excel - Funkcie - Porovnanie VLOOKUP vs. INDEX a MATCH - Spájanie tabuliek pre pokročilých
pred rokom
Oxytocín – hormón lásky, ale aj liečby (Jaroslava Babková)
Oxytocín – hormón lásky, ale aj liečby (Jaroslava Babková)
pred 6 mesiacmi
Funkcie | Part 3 | Python - 26/48
Funkcie | Part 3 | Python - 26/48
pred rokom
Excel - Kontingenčné tabuľky - Ako vytvoriť kontingenčnú tabuľku v Exceli?
Excel - Kontingenčné tabuľky - Ako vytvoriť kontingenčnú tabuľku v Exceli?
pred 5 rokmi
Excel - Funkcie - Ako vylepšiť funkciu VLOOKUP? Pridajte do nej funkciu MATCH
Excel - Funkcie - Ako vylepšiť funkciu VLOOKUP? Pridajte do nej funkciu MATCH
pred 4 rokmi
28. zasadnutie Mestského zastupiteľstva v Žiline | 13.12.2021
28. zasadnutie Mestského zastupiteľstva v Žiline | 13.12.2021
pred 5 mesiacmi
« Predchádzajúci
Ďalšie »
This question has 1 odpoveď in English, to read them log in to your account.
 UnkwnTech
UnkwnTech
10 december 2008 в 2:00
2008-12-10T02:00:49+00:00
Viac na
Zdroj
Upraviť
#8682007

Dávam prednosť:

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

Zdá sa, že všetko ostatné je len dodatočný kód, ktorý robí to isté.

Peter Mortensen
Peter Mortensen
Edited answer 20 jún 2019 в 2:00
27
0
 S.Lott
S.Lott
10 december 2008 в 2:15
2008-12-10T02:15:34+00:00
Viac na
Zdroj
Upraviť
#8682009

Všeobecne platí, že "špecializovaná štruktúra" v skutočnosti JE rozumný aktuálny stav objektu s vlastnými metódami.

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

Rád hľadám názvy pre anonymné štruktúry, kde je to možné. Významné názvy robia veci prehľadnejšími.

 tzot
tzot
Edited answer 10 december 2008 в 2:33
19
0
 fluffels
fluffels
10 december 2008 в 2:02
2008-12-10T02:02:37+00:00
Viac na
Zdroj
Upraviť
#8682008

V jazykoch, ako je Python, by som zvyčajne použil slovník, pretože to znamená menšiu réžiu ako vytváranie novej triedy.

Ak však zistím, že neustále vraciam tú istú sadu premenných, potom to pravdepodobne zahŕňa novú triedu, ktorú budem vylučovať.

4
0
Pridať otázku
Kategórie
Všetky
Technológia
Kultúra / Rekreácia
Život / Umenie
Veda
Profesionálne
Obchod
Používatelia
Všetky
New
Popular
1
Zuxriddin Muydinov
Registered pred 13 hodinami
2
Денис Анненский
Registered pred 2 dňami
3
365
Registered pred týždňom
4
True Image
Registered pred týždňom
5
archana agarwal
Registered pred týždňom
DA
DE
EL
ES
FR
HU
ID
IT
JA
KO
NL
PT
RU
SK
TR
ZH
© de-vraag 2022
Zdroj
stackoverflow.com
na základe licencie cc by-sa 3.0 s uvedením autora