Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.
Byla vydána nová verze R14.1.4 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek i s náhledy v poznámkách k vydání. Podrobný přehled v Changelogu.
Bylo vydáno OpenBSD 7.7. Opět bez písničky.
V Tiraně proběhl letošní Linux App Summit (LAS) (Mastodon). Zatím nesestříhané videozáznamy přednášek jsou k dispozici na YouTube.
Takže z Pythonu postupně zmizí (mimo jiné) map, filter a lambda. No, buďme rádi:
>>> a = range(10) >>> map(lambda x:x*2, a) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> filter(lambda x:x%2, a) [1, 3, 5, 7, 9] >>> [x*2 for x in a] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> [x for x in a if x%2] [1, 3, 5, 7, 9]Tož, pravdaže lambda se hodí i na jiné věci, ale vždycky se jí dá vyhnout.
Tiskni
Sdílej:
Co je to objektove orientovane programovani? Jak bys to vysvetlil sve babicce?Objektově orientované programovaní používá objekty. Objektem je souhrn vlastností a věcí co s ním lze dělat. Například míč může být objekt, ten má třeba barvu a jde ho nakopnout. No a tomu samotnému pojmenování míč, tomu říkáme třída objektů, protože ve skutečnosti, když se řekne míč, tak tím nemyslíme konkrétní míč, ale všechny míče. Pak kdyše řekne tento míč, tak máme na mysli konkrétní míč s jeho aktuální barvou, třeba červenou a když ho nakopneme, tak poletí určitou rychlostí, protože kromě barvy měl třeba konkrétní hmotnost atd. Krom toho mezi míči máme další podskupiny, jako baskedbalový míč, fotbalový míč atd. Těmto třídám říkáme dědičné třídy od třídy míč, protože po třídě míč dědí některé vlastnosti, třeba že jsou kulaté. No a objektově orientované programování na všechno kouká jako na objekty. Tak to by bylo pro babičku a pro tebe bych k tomu dodal, že těm vlastnostem říkáme atributy a jsou to vlastně data. To co s nima jde dělat říkáme metody a tím, že voláme metody nad určitým balíkem dat dosáhneme jejich zapozdření a tomu dohromady říkáme objekt. V určitých případech to zjednodušuje a zpřehedňuje programování. Krom toho bych babičku i tebe odkázal na nějakou učebnici OOP
Upozornuju, ze s kazdou ucebnici ANSI C jsem skoncil tak na strane 6-8 kdy zacli mluvit o pointerech a tak. proste mi to hlava nebere. Ja doted nejsem chopen pochopit, jak, kdyz se progam vykonava po radkach, (asi i binarka pak nejak odpovida tem puvodnim radkum) se muzou dit 2 nebo vic veci "naraz" proste si neumim predstavit, jak to funguje uvnitr, jak se mohou naraz pocitat v jednom bezicim programu 2 a vice uloh, rekneme trebas pocitat 2 faktorialy naraz, nebo v nejake hre vykreslovat grafiku a zaroven pocitat AI protivniku....Tak tohle s tím moc nesouvisí, jinak ten kód se skutečně vykonává na jednom procesoru postupně, to zaráz se dosahuje trikem, třeba, že každý chvilku tahá pilku, nebo se tam těch procesorů strčí víc
rychlost(cekalo_se_na_nej(auto('b'), jelo_rovne(zahlo_doleva(auto('a'))))
function SumOneToN (n : Integer) : Integer; var i,s : Integer; begin s := 0; for i := 1 to n do s := s + i; SumOneToN := s end;Ve funkcionálním jazyce je to postupné zjednodušování nějakého výrazu, nejsou k dispozici proměnné, místo cyklů je rekurze. Haskell:
sumOneToN :: Int -> Int sumOneToN n = if (n <= 0) then 0 else (n + (sumOneToN (n-1)))Dále, ve funkcionálních jazycích jsou funkce "first class citizens", tj. můžou být předávány jiným funkcím jako parametry a také vraceny jako výstupní hodnoty. Třeba zde značí
.
operátor, který vezme 2 funkce a vrátí jejich kompozici (pokud je to typově možné).
sumOneToSqrN :: Int -> Int sumOneToSqrN = sumOneToN . (\n -> n*n)No prostě jsou to samé pěkné věci.
Dále, ve funkcionálních jazycích jsou funkce "first class citizens", tj. můžou být předávány jiným funkcím jako parametry a také vraceny jako výstupní hodnoty. Třeba zde značí .
operátor, který vezme 2 funkce a vrátí jejich kompozici (pokud je to typově možné).
To znamená, že ukazatele v C umožňují funkvionální programování i v něm? public class neco { public static void main (String args []) { //tady jsou procedurální draciA je to, ne?} }
map(lambda x:x*2, a)nahradím
[x*2 for x in a]nebo
filter(lambda x:x%2, a)nahradím
[x for x in a if x%2]ale co třeba
a={'a':1, 'b':3, 'c':2} [ key for key, value in sorted(a.iteritems(), key=lambda x:x[1])]to se dá nahradit kostrbatým
def getValueFromPair(x): return x[1] [ key for key, value in sorted(a.iteritems(), key=getValueFromPair)] del getValueFromPairale proč to dělat jednoduše, když to jde složitě, že. Jen podotýkám, že
[ key for value, key in sorted((value, key) for key, value in a.iteritems())]není totéž, i když skoro.
keys = d.keys() keys.sort(key = d.__getitem__) for key in keys: res = key, d[key]Zatímco druhý způsob (který jsi tehdy nazval opičárnou)
pairs = [(v, k) for (k, v) in d.iteritems()] pairs.sort() for v, k in pairs: res = k, vPrvní způsob je dvakrát rychlejší (což mě celkem překvapuje) a bere míň paměti. Ale zase se mi tam moc nelíbí to __getitem__.
for key in sorted(d.keys(), key= d.__getitem__): res = key, d[key](netvrdím, že je to lepší). S tím druhým (alias opičárnou) se mi nic vymyslet nepodařilo.
d
vlastně neexistuje, ale je to třeba dict(<generátor>)
. To se pak jde funkcionální programování klouzat, protože to nejde udělat bez explicitního uložení toho seznamu.
ad 2) Tak to právě dělá ten poslední příklad na který upozorňuji, že nedělá totéž, zkus si to třeba na na dict((x, len(x)) for x in ('a', 'b', 'c', 'd', 'e'))
, Vtip je v tom, že nechci řadit podle (hodnota, klic), ale jen podle hodnoty ať už z jakéhokoli obskurního důvodu.
A proč je to první méně náročné na paměť? No tak to bych si typnul, že to bude tím, že uložení listu skalárů zabare míň místa, než uložení listu tuple. A proč je to rychlejší, no tak za to může zase betálně rychlé vyhledávání v dict. Si pamatuju jak jsem byl překvapený jak je to rychlé v perlu.
Jenže tady je právě zakopanej pes a dost páchne. ad 1) Co kdyžTo si nějak neumím představit, ale asi máš recht. IMHO bez předchozího uložení je slovník trochu k ničemu, ale třeba jsou výjimky ...d
vlastně neexistuje, ale je to třebadict(<generátor>)
. To se pak jde funkcionální programování klouzat, protože to nejde udělat bez explicitního uložení toho seznamu.
ad 2) Tak to právě dělá ten poslední příklad na který upozorňuji, že nedělá totéž, zkus si to třeba na na dict((x, len(x)) for x in ('a', 'b', 'c', 'd', 'e'))
, Vtip je v tom, že nechci řadit podle (hodnota, klic), ale jen podle hodnoty ať už z jakéhokoli obskurního důvodu.
Jo, aha.def getValueFromPair(x): return x[1] items = d.items() items.sort(key = getValueFromPair) for k, v in items: res = k, vZjišťoval jsem, jak dlouho se vyhodnocují různé varianty a tohle je druhé nejrychlejší (asi o 30% pomalejší než key=d.__getitem__). Je to asi ta nejkostrbatější možnost, ale mě se líbí. Ale já jsem byl vždycky divnej. Dal by se ušetřit řádek, kdybych použil sorted(), ale žere to paměť a byla by škoda zbytečně zahodit ten setříděný seznam.
Dal by se ušetřit řádek, kdybych použil sorted(), ale žere to paměť a byla by škoda zbytečně zahodit ten setříděný seznam.Právě že sorted žádnou paměť navíc nežere, ale musí se použít iterátor, tedy ne
items
, ale iteritems
, případně iterkeys
.
>>> import random >>> a = range(10) >>> random.shuffle(a) >>> b = sorted(a) >>> a [3, 2, 1, 5, 7, 8, 0, 4, 6, 9] >>> b [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a.sort() >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
sorted
na již hotový list je hloupost, já jen tvrdím, že mezi zápisem
a = [<iterátor>] a.sort()a zápisem
a = sorted(<iterátor>)není žádný rozdíl co do spotřeby paměti viz. např.
a = file('<filename>','r').readlines() a.sort()a
a = sorted(file('<filename>','r'))
... já jen tvrdím, že mezi zápisemTo, že je to iterátor, podle mě nemá na nic vliv. Jestliže napíšua = [<iterátor>] a.sort()a zápisema = sorted(<iterátor>)není žádný rozdíl co do spotřeby paměti...
#!/usr/bin/env python import random a = range(5) random.shuffle(a) print a def gimme_next(): for i in a: print 'Yielding: ', i yield i def compare(a, b): print 'Comparing:', a, b return cmp(a,b) b = sorted(gimme_next(), compare) print bTak se
items = sorted(d.iteritems(), key = getValueFromPair)je pomalejší než
items = d.items() items.sort(key = getValueFromPair)
1) pomocí iterátoru se získá celý seznamA pro toto tvrzení v bodě 2) máte nějaký důkaz, nebo jste si to jen tak typnul? No jasně že ne: Bohužel, nemám pro své tvrzení žádný přímý důkaz. Jestli se to tak děje, tak by se autor implementace
2) tento seznam se zkopíruje
3) zkopírovaný seznam se setřídí
4) původní seznam se zahodí, protože už na něj není reference
sorted
měl pověsit za koule do průvanu. Není totiž nejmenší důvod to implementovat jinak, než prostě nekopírovat a jednoduše použít ten seznam získaný v bodě 1). Experimentálně se mi zdá, že je tam drobný rozdíl v rychlosti, ale ten je rozhodně menší než co mi vzniklo, když jsem jsem tu kopii udělal schválně. Rzdíl mezi sorted
a .sort
mi vyšel 4.4% a mezi .sort
a .sort
s kopií navíc je 11.2% tedu více než dvojnásobný.d=dict((x, random.randint(0,100)) for x in xrange(100)) def useSorted(): a = sorted(d.iterkeys(), key=d.__getitem__) def useSort(): a = d.keys() def useSortAndCopy(): a = d.keys() a.sort(d.__getitem__) b = a[:]Jediný důvod co mě napadá je ten, že
a = d.keys()
je rychlejší než a = [x for x in d.iterkeys()]
. Funkce sorted může být (bez reversed) klidně implementována takto:
def sorted(seq, **argv): a = [x for x in seq] a.sort(**argv) return aVe skutečnosti jsou tam ještě nějaké opičky s reversed, ošetření vstupních parametrů a ještě ke všemu implementace možná v C.
Funkce sorted může být (bez reversed) klidně implementována takto:Máš recht. No jasně. To jsem sám rád, že se ten seznam neduplikuje.def sorted(seq, **argv): a = [x for x in seq] a.sort(**argv) return a
d.sort_by{|x| x[1]}.map{|x| x[0]}
Radši to nebudu benchmarkovat, sort_by se slovníkem dělá pěkné neplechy... In [14]: [k for k in sorted(a.keys(), key=a.__getitem__)] Out[14]: ['a', 'c', 'b']Což mi přijde srozumitelné dostatečně
[k for k in sorted(a.iterkeys(), key=a.__getitem__)]ale to je detail
with
, ale moc jsem ho nepochopil, tak nevím jestli to není zrovna lék na tohle.
... mně spíš překvapuje, že ani jedno z těch pythonovských řešení mi nepřijde nijak supersrozumitelné.Záleží na tom, jak je v kdo zvyklý. A především záleží na tom, jak se to napíše. U méně přehledných částí kódu vždy pomůžou komentáře nebo alespoň vhodný název funkce, třeba sort_dict_by_value().![]()
Myslel jsem, že na tohle bude v Pythonu přímo nějaký idiom.Idiom pro to není. Kupodivu se tohle téma řešilo už před pěti lety v PEP 265:
items = d.items(values_first=0)která by obrátila pořadí v tuplech u vytvářeného seznamu. I když je to asi dobrá myšlenka, při přidávání featur do jazyka je potřeba být _VELMI_ opatrný (musí se spravit dokumentace všude možně, zastarají knihy, přestanou platit doporučené způsoby atd.)
Můžu se zeptat proč do diskuze o Pythonu taháš Ruby?Ále, však ho nechme. Sám jsem taky zaplevelil Pythonem několik diskusí o shellu. A nehodlám s tím přestat
def compare(a, b): return cmp(a[1], b[1]) items = d.items() s lambdou: items.sort(lambda x,y:cmp(x[1], y[1])) bez lambdy: items.sort(compare)Lambda dokáže ušetřit jeden řádek kódu, ale v Pythonu vznikla spíš z historických důvodů, aby Python někdo nepomluvil, že není dost funkcionální.
Rád bych podotkl, že zápis s lambdou je sice stručnější, ale lambda je pomalejší než jednořádková funkce.Tak když jsem tohle četl, tak jsem tomu nemohl uvěřit a je to blbost nebo je rozdíl menší než 1%. To by bylo teda pěkně pitomě implementováno. Krom toho přímo v dokumentaci říkají, že lambda je jen zkratka pro takovou jednořádkovou funkci.
import os, itertools, random d=dict((x, random.randint(0,100)) for x in xrange(10000)) def timeItDet(func, n=1000): start = os.times() for x in itertools.repeat(None, n): func() return tuple(x-y for x, y in itertools.izip(os.times(), start)) def doItSmart(): sortedKeysByValues = sorted(d.iterkeys(), key=d.__getitem__) def withLambda(): items = d.items() items.sort(lambda x, y: cmp(x[1], y[1])) def withoutLambda(): def cmpValues(a, b): return cmp(a[1],b[1]) items = d.items() items.sort(cmpValues) timeItDet(doItSmart,100) (2.1699999999999875, 0.020000000000000018, 0.0, 0.0, 2.1899999999995998) timeItDet(withLambda,100) (15.830000000000013, 0.040000000000000036, 0.0, 0.0, 15.859999999999673) timeItDet(withoutLambda,100) (15.829999999999984, 0.010000000000000009, 0.0, 0.0, 15.840000000000146)Měřil jsem to víckrát a ten rozdíl je na hranici měřitelnosti.
def f(): return <expression> <mesure start> <repeat>: test(f) <mesure stop> <mesure start> <repeat>: test(lambda: <expression>) <mesure stop>a
<mesure start> <repeat>: def f(): return <expression> test(f) <mesure stop> <mesure start> <repeat>: test(lambda: <expression>) <mesure stop>V tom prvním případě musí lambda samozřejmě prohrát
Vždy je možné se bez lambdy obejít a napsat jednořádkovou funkci- v Python nejsou funkce vracející funkce (nově vytvořené na základě parametrů)? To mi přijde jako ten případ, kdy se lambda za pojmenovanou funkci nahradit nedá...
#!/usr/bin/env python def nova_funkce(param): def odecti(a, b): return a - b def pricti(a, b): return a + b if param == 'odecti': retvalue = odecti elif param == 'pricti': retvalue = pricti else: raise SystemExit, "Spatny nazev funkce" return retvalue f = nova_funkce('odecti') print f(5, 3) f = nova_funkce('pricti') print f(5, 3)Nebo jde o něco složitějšího?
def pricti_n(n): def pricti(a): return a + n return pricti f = pricti_n(3) print f(5) => 8