Podmínka jako parametr – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Podmínka jako parametr – Python – Fórum – Programujte.comPodmínka jako parametr – Python – Fórum – Programujte.com

 

tomino
~ Anonymní uživatel
20 příspěvků
14. 2. 2021   #1
-
0
-

Ahoj,

nevíte někdo, jak udělat funkci které by šlo předávat v parametrech podmínku podobně jako v numpy?

np.where(a==2, a, 0)
Nahlásit jako SPAM
IP: 85.135.75.–
gna
~ Anonymní uživatel
1891 příspěvků
14. 2. 2021   #2
-
0
-

Do toho where nejde podmínka, ale výsledek toho porovnání. 

a=np.array([1,2,3])

a==2
# a: [1,2,3]
# 2: [2,2,2]
# => [False, True, False]

np.where(a==2, a, 0)
# cond: [False, True, False]
#    x: [1, 2, 3]
#    y: [0, 0, 0]
# => [0, 2, 0]

Pokud potřebuješ předávat něco jako podmínku, tak můžeš předávat funkci a tu v té cílové funkci volat.

Nahlásit jako SPAM
IP: 213.211.51.–
tomino
~ Anonymní uživatel
20 příspěvků
14. 2. 2021   #3
-
0
-

Děkuji, to dává smysl. Možnost s funkcí znám, ale někdo říkal, že by to šlo i nějak udělat jakoby lambdu bez toho slova lambda a psát jen jakoby podmínku. Tak jsem myslel, že to je právě v numpy.

Nahlásit jako SPAM
IP: 85.135.75.–
gna
~ Anonymní uživatel
1891 příspěvků
14. 2. 2021   #4
-
0
-

Můžeš přetěžovat operátory. Pokud máš v tom výrazu svůj objekt, tak máš kontrolu nad jeho výsledkem. Takže můžeš vyrábět i funkci, ale je lepší neměnit význam operátorů, aby tě to pak někde nepřekvapilo.

class Filter:
    def __gt__(self, other):  # Greater Than
        return lambda x: x > other

    def __lt__(self, other):  # Less Than
        return lambda x: x < other


x = Filter()
data = [1, 2, 3, 4, 5]

print(*filter(x > 2, data))  # 3 4 5
print(*filter(x < 4, data))  # 1 2 3
Nahlásit jako SPAM
IP: 213.211.51.–
tomino
~ Anonymní uživatel
20 příspěvků
14. 2. 2021   #5
-
0
-

Znova děkuji. Zkouším to ještě upravit aby fungovaly i vícenásobné podmínky (a > 2 and a < 5) a jestli to správně chápu tak z první podmínky musím zase vrátit svůj objekt abych na něm udělal tu další podmínku. Dá se nějak poznat jestli následuje další podmínka abych věděl jestli vrátit funkci nebo objekt?

Nahlásit jako SPAM
IP: 85.135.75.–
gna
~ Anonymní uživatel
1891 příspěvků
14. 2. 2021   #6
-
0
-

Můžeš vracet pořád objekt a definovat mu __call__, takže bude použitelný i jako funkce. To ve skutečnosti jsou i "normální" funce - volatelné objekty. Všechny tyhle speciální metody jsou popsané tady.

Akorát and nejde přetížit, můžeš to zřetězit bez něj, nebo použít podobný & (ten ale má ale jinou prioritu, tak to musíš správně ozávorkovat) 

class Filter:
    def __init__(self, func=lambda x: True):
        self.func = func

    def __gt__(self, other):
        return Filter(lambda x: self(x) and x > other)

    def __lt__(self, other):
        return Filter(lambda x: self(x) and x < other)

    def __and__(self, other):  # &
        return Filter(lambda x: self(x) and other(x))

    def __call__(self, x):
        return self.func(x)


x = Filter()
data = [1, 2, 3, 4, 5]

print(*filter(x > 2, data))              # 3 4 5
print(*filter((x > 2) < 5, data))        # 3 4
print(*filter((x > 2) & (x < 5), data))  # 3 4

Na hraní pěkné, ale nikde to proboha nepoužívej :-)

Nahlásit jako SPAM
IP: 213.211.51.–
tomino
~ Anonymní uživatel
20 příspěvků
14. 2. 2021   #7
-
0
-

Super díky moc. Já to nebudu používat a právě jen si tak hraju.
 

Nahlásit jako SPAM
IP: 85.135.75.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 26 hostů

Podobná vlákna

Objekt jako parametr funkce — založil xJakubS

C# pole jako parametr funkce — založil Geralt

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý