Byla vydána nová verze 12.0 media serveru Jellyfin (Wikipedie). Přehled novinek v poznámkách k vydání. Pro vyzkoušení je k dispozici Demo Server. Jellyfin je fork media serveru Emby, původně Media Browser.
V MikroTik RouterOS bylo nalezeno šest zranitelností společně pojmenovaných MikroTrick umožňujících útočníkovi, pokud má přístup k SSH, získat plnou kontrolu nad zařízením bez nutnosti autentizace. Ve verzích RouterOS 7.25beta3, 7.24.2, 7.23.4 a 6.49.21 je již opraveno.
Byla vydána verze 9.5 open source unixového operačního systému NetBSD (Wikipedie). Přehled novinek v poznámkách k vydání. Jedná se poslední vydání řady NetBSD 9. Doporučen je přechod na NetBSD 11 nebo NetBSD 10.
Akční adventura State of Mind je na portále GOG.com zdarma, akce trvá do 10. září.
Na Kickstarteru běží kampaň na podporu malého robotický psa Petoi Quaddle. Postaven je na ESP32-S3. V několika variantách. S řadou senzorů. Programovat lze pomocí Pythonu, C++ nebo i vizuálních bloků. Zkoušet a trénovat lze v simulátoru.
Dětem začala škola a nedobrovolně se tak musí vzdělávat. Avšak pro dospělé, kteří se chtějí vzdělávat nebo naopak se o vědomosti podělit, je tu Virtuální Bastlírna - jako každý měsíc si můžete online a zdarma nezávazně popovídat o vědě a technice nejen s bastlíři, ale i s vývojáři, vědci nebo profesory. A čemu se strahováci budou věnovat? Blíží se KiCAD 11 s nespočtem novinek, z nichž zde musí zmínit alespoň možnost kótování a závislostí z
… více »Asahi Linux, tj. Linux pro Apple Silicon, oficiálně podporuje čipy M3 (M3, M3 Pro a M3 Max).
Společnost Acer oslavila 50 let. Na tiskové konferenci next@acer představila řadu novinek. Vypíchnout lze přenosný ePaper displej Acer EP130K, přenosné řešení se třemi displeji Acer PD163Q P3 nebo herní handheld a notebook v jednom DualPlay Mini.
Server SiFive BigSky SF-2U870 2U je založený na jádře SiFive P870-D, zatím je naintegrovaných 32 jader 256 GB RAM 2 GHz, škálovat lze do 256 jader na čip. O něco podrobnější popis serveru v článku SiFive BigSky Ships the First RISC-V Server. Is the GPU Head Node the Prize? na futurumgroup.com. Asi ani tento čip nebude na úrovni nejlepších 64-bit ARMů a AMD Zenů, ale splňuje RVA23 specifikaci a je podporovaný Ubuntu 26.04 LTS a RHEL 10. V článku je
… více »Na YouTube lze zhlédnout nový celovečerní dokumentární film The Story of VS Code | Official Documentary věnovaný Visual Studio Code.
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'))))
.
Pokud už funkcionální programování, tak Lisp, nebo raději Haskel.
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í draci
}
}
A je to, ne?
(dělám si pochopitelně srandu
)
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, v
První 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 ...dvlastně 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, v
Zjišť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()aa = 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 b
Tak seitems = 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 a
Ve 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:
def sorted(seq, **argv):
a = [x for x in seq]
a.sort(**argv)
return a
Máš recht. No jasně. To jsem sám rád, že se ten seznam neduplikuje.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...
Ne, mně spíš překvapuje, že ani jedno z těch pythonovských řešení mi nepřijde nijak supersrozumitelné.
Myslel jsem, že na tohle bude v Pythonu přímo nějaký idiom.
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
Jinak to má ale ten zádrhel, že si to neporadí s ad hoc generovaným dict, nebo
vráceným třeba z funkce a nechci si ho někam ukládat. Když tak nad tím přemýšlím, tak mě nenapadá realný příklad, kde by to bylo potřeba
Krom toho ve 2.5 přichází 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