Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Filip
Člen
Avatar
Filip:27.5.2020 22:17

Python neovladam, mozno len uplne zaklady. Prosim vysvetlil by mi niekto co robi nasledovny kod? Viem ze funkcia lookup_maint pracuje s polom, prechadza ho cyklom a kontroluje sa nejaka podmienka ("p" je prvy stlpec z pola "pole"?), ale co to presne robi ako celok, tym si niesom isty. Diky.

pole = [
    (   30000,  0.4,       0),
    (  50000,  0.5,      50),
    ( 1000000,  1.0,    1600),
    ( 5000000,  2.1,   11300),
    (10000000,  4.0,  15700),
 ]

def lookup_maint(pos):
    pct,amt = [(mr,ma) for p,mr,ma in pole if pos<p][0]
    return pct/100, amt

Zkusil jsem: google

Chci docílit: Chcem pochopit co dany kod robi. Aku hodnotu vracia funkcia v kode.

 
Odpovědět
27.5.2020 22:17
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:28.5.2020 8:21

Ja bych to chapal takto (python jsem resil jen okrajove, tak to je mozna spatne):

for p,mr,ma in pole
for value0,value1,value2 in pole
pole = [
    (   value0,  value1,  value2),
    (   value0,  value1,  value2),
    (   value0,  value1,  value2),

if pos<value0 then return [value0,  value1]
return [value0,  value1][0] = value0
pct = value0 amt??? a nebo
pct, amt = [value0, value1] z tabulky, kterou vytvori cyklus a z ni vyberes radek 0.
Pak by to hledalo prvni hodnotu, ktera odpovida podmince, to ale mohli ukoncit pomoci break.

amt by mohla byt nejaka globalni promena
amt = amount = mnozstvi, castka (podle google)

 
Nahoru Odpovědět
28.5.2020 8:21
Avatar
ZemiakSK
Člen
Avatar
ZemiakSK:29.5.2020 10:26

Python je celkom dobrý jazyk ale vďaka tomuto ma dokáže veľakrát pekne nahnevať

Tá funkcia prechádza cez list . List sa skladá z trojic (p, mr, ma)
Ak je čislo p menšie ako argument pos , tak ho pridáme do dočasného listu .
Z tohto listu potom vyberieme prvý prvok a ten vrátime

Ten algoritmus ma niekoľko múch

  • Z nejakého dôvodu pokračuje v hľadaní aj keď správnu trojicu už našiel
  • Nezachytáva chyby (číslo väčšie ako 1000000 spôsobí výnimku)
  • Tupé názvy premenných . Absolútne neviem čo jednotlive premenné majú vyjadrovať

Prepísal by som to takto

pole = [
    (30000   ,  0.4,       0),
    (50000   ,  0.5,      50),
    (1000000 ,  1.0,    1600),
    (5000000 ,  2.1,   11300),
    (10000000,  4.0,   15700),
]

def lookup_maint(pos):
    for item in pole:
        p,mr,ma  = item #Rozbijeme trojicu do premených p ,mr a ma
        if(p > pos):
            return (mr/100 ,ma)

    raise Exception

V prípade chyby (mimo rozsah) som dal generickú výnimku .
Ty si tam daj to čo ti vyhovuje , neviem kde sa tá funkcia používa
ps: hodilo by sa premenovať premenné aby bolo zrejme aké údaje obsahujú

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
29.5.2020 10:26
Avatar
ZemiakSK
Člen
Avatar
ZemiakSK:29.5.2020 10:28

Ak by sa mal list v premennej "pole" rozširiť , tak by som to vyčlenil do nového objektu tato

class Triplet:
    def __init__(self, p, mr, ma):
        self.p  = p
        self.mr = mr
        self.ma = ma

    def result(self):
        return (self.mr/100, self.ma)

    @classmethod
    def createList(cls, triplets):
        result = []
        for item in triplets:
            p,mr,ma = item
            result.append(Triplet(p,mr,ma))
        return result

pole = Triplet.createList([
    (30000   ,  0.4,       0),
    (50000   ,  0.5,      50),
    (1000000 ,  1.0,    1600),
    (5000000 ,  2.1,   11300),
    (10000000,  4.0,   15700),
])



def lookup_maint(pos):
    for item in pole:
        if(item.p > pos):
            return item.result()
    raise Exception
 
Nahoru Odpovědět
29.5.2020 10:28
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.5.2020 11:03

Podle mne to budou nejake marketingove, obchodni pojmy, zkratky. Pokud nemas nastudovany ten obor, tak ti to nedava smysl. Takze bych to googloval se slovy: sales compute bussiness Economics Marketing shotcut

pos
p, mr, ma
pct, amt <- mr, ma

amt = amount = mnozstvi
pct = Progressive Consumption Tax = prepocitana cena s dani | price total?
mr = Marginal revenue | Markup Rate
ma = Moving Average
p = price? pieces?
pos = ?

Cili, zatim bych to hadal jako tabulku [cena, ???, mnozstvi (quantity)], ze ktere vybere prvni polozku, ktera ma cenu mensi nez cislo 'pos' a vybere jen sloupce [cena, mnozstvi].
Jinymi slovy, pojmenovani promennych je uplne na prd. Pouziva se min 3-5 znaku, obvykle. Mene se pouziva leda pro takove bezvyznamne nebo proflaknute pojmy, ktere souvisi s tematem, jako treba u fyziky s = v * t. Ale bez tematu se neda urcit, co tim chce vlastne docilit.
Ale, mozna, ze python, pokud je kod spravne, spocita prumerne hodnoty pro vsechny radky, kde to cislo je mensi nez 'pos' :) Spis ne, spis je ten algoritmus uplne spatne. Mozna bych si i tipnul, ze to nekdo strelil od boku a pak se prisel zeptat na forko, zda to dela, co si myslel, ze to bude delat.

 
Nahoru Odpovědět
29.5.2020 11:03
Avatar
Filip
Člen
Avatar
Filip:30.5.2020 1:12

Dakujem za vysvetlenie kodu. Musim sa priznat, ze potom ako som to sem napisal, ma napadlo, ze skusim nejaky online python compiler, kod som spustil cez neho, aby som videl ake hodnoty ta funkcia vracia. Teraz po vysvetleni ten kod chapem uz presnejsie.
A co sa tyka nazvov tych premennych , su to skratky , ta funkcia je len jedna cast z celeho vypoctu kde sa pocita vysledna cena.

 
Nahoru Odpovědět
30.5.2020 1:12
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.6.2020 9:34

"Z nejakého dôvodu pokračuje v hľadaní aj keď správnu trojicu už našiel"
No, ja jsem nad tim jeste premyslel.
Ten kod nevraci prvni nalezenou hodnotu, ale posledni vyhovujici podmince, jak pise Zemiak.
Cili, kdyz to pole mas serazene ASC podle p (prvni sloupec, tak ti to vrati nejblizsi hodnotu, ktera odpovida zadane cene). Coz je mozna presne to, co to ma delat, co aplikace potrebuje.

A ted je otazka

  • je to pole vzdy serazene podle p (sloupce0)? Pokud ano, pak by stacil kod o Zemiaka. Ktery ukonci cyklus, kdyz podminka selze, zkrati cas vyhledavani. Ten algoritmus by sel vylepsit hledanim od stredu pripadne rovnou pouzit algoritmus insert-sortu s porovnanim serazeneho pole s prostredni hodnotou pro kazdou dilci pod-pulku.
  • pokud to pole neni serazene, tak to vrati rekneme nahodnou posledni hodnotu vyhovujici podmince
 
Nahoru Odpovědět
1.6.2020 9:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.