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.
Dle analýzy na blogu časopisu Communications of the ACM (Wikipedia) je Python nejčastěji používaným programovacím jazykem pro výuku programování (první programovací jazyk) na nejprestižnějších amerických univerzitách nabízejících studium informatiky (Computer science). Následuje Java, MATLAB, C++, C, Scheme a Scratch.
Tiskni
Sdílej:
inženýrsky výborně použitelný jazyk/prostředí nejen pro hrubé výpočty, ale obecně pro prototyping hlavně v oblasti zpracování a vizualizace datNa tohle je to dobre, ale na vyuku programovani opravdu nic moc, stejne jako Java nebo C++. Vetsina lidi bude zapasit s jazykem (casto jen se syntaxi) a k samotne podstate programovani se dostane jen okrajove.
+1, proto se mi nelíbí výuka prvních kroků programování v C. Lidi mají ze začátku problém vůbec nějakým způsobem analyzovat zadání a ujasnit si, co vlastně chtějí udělat a jak to chtějí udělat. Místo aby se soustředili na tohle, což je imho důležitější, snaží se z hlavy vylovit nějakou konkrétní syntaxi něčeho. V tomhle je python skvělý. Přitom si ani nemyslím, že by oproti C učil nějakým špatným návykům (teda až na odsazování mezerama, ale to je na nekonečný flame).Na IT vysoke skole je vyuka v C na miste. C je potreba v kurzech o operacnich systemech a hardware, takze je dobre ho studenty naucit co nejdrive.
Jenze na VS by se mely ucit pokrocily techniky a ne "zaciname s C/..."proč, to se jako nějak vylučuje? považuju za samozřejmost, že mně škola věc, kterou učí, naučí od základu, pokud vstup na ní není omezen nějakou prerekvizitou, která zaručuje, že ten základ již umím
jenze to by 90% gymplaku bylo na technikach vprdeli, protoze to nevideli ani z rychliku.a negympláci? - to by bylo 99%, že? já jsem sice proti devalvaci vzdělání, ale na druhou stranu, opravdu je nutné někoho vylučovat z řádného vzdělávacího procesu jen protože si coby děcko špatně vybral (nebo dokonce byl rodiči natlačen) střední školu?
a negympláci? - to by bylo 99%, že?Ne imho tak 20%. Z mé zkušenosti z VŠ, obor Informační technologie plyne to samé - gympláci se plácají v programování, protože ho vidí poprvé v životě, nemají kontext a v podstatě je ani moc nezajímá. Celá VŠ je tomu přizpůsobena a studium bakaláře se dá v podstatě shrnout do "pět úvodů do programování a nějaký ten shit kolem". Naproti tomu třeba matematika se rovnou bere na gympl úrovni a lidi ze střední se moc nechytají. Tzn. pokud jde někdo na VŠ a očekává, že se tam naučí programovat a po škole může rovnou nastoupit do práce jako programátor/analytik, nebo tak něco, tak s vysokou pravděpodobností tvrdě narazí, protože málokterý předmět půjde dál než za naučení syntaxe. V Liberci byl vrchol ve třeťáku Softwarové inženýrství, kde se v rychlosti proberou vývojové techniky (katedrála, vodopád atp) a šmytec. Nějaké algoritmy, to možná lehce v rámci teorie grafů a her, taky jen takové škrtnutí v rámci jednoho semestru a ani se to nijak nehrotí. V podstatě se nelze divit firmám, že se pak zdráhají přijmout uchazeče co právě dostudoval, protože se právem dá říct, že nic neumí. Má pár úvodů do něčeho, ale pokud se silně neangažoval sám o sobě, tak je na dost podobné úrovni, jako lidé co právě vylezli z technické střední. Netvrdím, že je to problém všude, ale u lidí, kteří očekávají že VŠ jim nějak pomůže v IT to problém dost často je, co tak mám vlastní zkušenost a možnost pozorovat známé, kteří šli stejnou cestou. Určitě byly na VŠ i velmi zajímavé předměty, otázkou však je, jestli to za ty 3 roky života stálo a kde by člověk byl, kdyby si rovnou začal nějak zařizovat život, který do té doby prakticky neměl.
proč, to se jako nějak vylučuje?V podstatě ano, protože se to prostě nedá stihnout, když všechny pořád uvádíš do něčeho.
Ale pravdou je, že jsem vystudoval vysokou školu před 20 lety, to znamená ještě poctivou vysokou školu. Ne dnešní flákárnu. (Mohu srovnávat, protože jsem vystudoval ještě druhou, kterou jsem dokončil loni. A dnes jsou požadavky na studenty tak setinové.)Tak ono zase nejsou všechny vysoké školy stejné a pokud někdo vystuduje třeba matfyz, tak to má pořád nemalou úroveň. Minimálně Liberec a Ostrava na tom ale jsou tak, jak jsem popisoval, to mám reportované od vícero lidí.
Ale co jsem chtěl říci, to módní nadávání na školy je chyba studentů. Jestliže chtějí něco umět, nechť si vyberou KVALITNÍ školu. Je zbytečné vinit z toho školy. Jak psal už Werich, zlobí se na zrcadlo ten, kdo má křivou hubu.Jak poznáš jako student kvalitu? Osobně jsem v té době ani netušil, co za kvalitu hledat, natožpak abych dokázal zjistit, jestli jí daná škola splňuje. Věděl jsem prostě že chci vědět víc a šel jsem to vědění hledat tam, kde podle všeho mělo být.
Vidím v celé této diskusi, že lidé nevědí co chtějí. Hlavně si neuvědomují, že když se chtějí něco naučit a umět, musejí pro to něco obětovat, a to je NÁMAHA.Tak zase nebudu tvrdit, že bych se tam nic nenaučil - naopak, setkal jsem se tam se spoustou zajímavých věcí, názorů, technologií i lidí. Ale co do programátorské praxe to bylo v podstatě bezcenné, to jsem se musel všechno naučit sám. Dodneška mě děsí myšlenka, že třeba někdo z lidí kterým jsem tam pomáhal s programováním jdou dělat někam programátora, nebo nedej bože vedoucího a na tuhle pozici se dostanou jen kvůli titulu.
Pokud o to stojíš, způsoby najdešTo je větička kterou se v českým školství omlouvá kdejaký šlendrián. Dotaženo do důsledku, pokud si někdo umí najít ty slavný způsoby, tak se na nějaký školy může vykašlat.
Jak psal už Werich, zlobí se na zrcadlo ten, kdo má křivou hubu.Werich to mozna psal taky, ale ten citat je puvodem z Revizora od Nikolaje Gogola.
můžeš to nějak rozvést? já mám docela čerstvou zkušenost ze SŠ, a ... no, nechci být nějak neuctivý (ti lidi jsou machři zas na jiný věci), ale řekl bych, že učitel, co tam jedinej byl schopen přemýšlet nad nějakou algoritmizací, byl tak na úrovni mejch spolužáků z gymplu (myslim ten šedej průměr, co chodil na programování), tedy co asi tak mohl naučit ty žáky ...a negympláci? - to by bylo 99%, že?Ne imho tak 20%. Z mé zkušenosti z VŠ ...
no, i tady se naše zkušenosti zásadně rozchází ...proč, to se jako nějak vylučuje?V podstatě ano, protože se to prostě nedá stihnout, když všechny pořád uvádíš do něčeho.
já mám docela čerstvou zkušenost ze SŠ, a ... no, nechci být nějak neuctivý (ti lidi jsou machři zas na jiný věci), ale řekl bych, že učitel, co tam jedinej byl schopen přemýšlet nad nějakou algoritmizací, byl tak na úrovni mejch spolužáků z gymplu (myslim ten šedej průměr, co chodil na programování), tedy co asi tak mohl naučit ty žáky ...To je sice možná pravda, ale na rozdíl od gymplu na vysokou potom nejde celý ročník, ale jen jeden nebo dva lidi, které to opravdu baví a kterým to často doporučí přímo učitelé. Pokud se tam náhodou vydá víc lidí, tak tam jdou jen aby si prodloužili prázdniny a mohli semestr/dva prochlastat za peníze rodičů, než je vyhodí a na přednáškách/cvičeních je moc neuvidíš. Tohle jsou prostě moje zkušenosti, nevím jak moc se dá na jejich základě generalizovat, ale odpovídá to tomu, co slyším od ostatních.
hm, máš pocit, že z gymplu jde celý ročník na jednu vysokou? nebo je to spíše tak, že na tu konkrétní (kde se programuje) jdou jenom lidi, které to baví nebo kterým to někdo doporučí?To je imho docela jedno. Více méně všichni z gymplu jdou na nějakou. Buď to a nebo prodávat párky.
a pokud počítáš s tím, že to někoho baví natolik, že se to naučí mimo školu, pak nechápu, proč to s tou školou spojuješSubjektivní zkušenosti.
já jsem reagoval z toho hlediska, jak která škola umí žáky připravit, a co se programování týče, vskutku nemám pocit, že by technické SŠ byly nějak na výšiTak s tím souhlasím, ale nemám pocit, že by to na gymplech obecně bylo lepší.
Na IT skolu nas slo z meho gymplu 5 a uvodni programovaci kurz byl pro nas o nicem. Ja jsem se naucil v C sam z knizek a ze cteni OSS kodu mezi 14. - 16. rokem a podobne na tom byli dalsi 2 a z toho jeden umel cist x86 kod primo v hexaeditoru. Zbyvajici 2 umeli programovat v pascalu.a negympláci? - to by bylo 99%, že?Ne imho tak 20%. Z mé zkušenosti z VŠ, obor Informační technologie plyne to samé - gympláci se plácají v programování, protože ho vidí poprvé v životě, nemají kontext a v podstatě je ani moc nezajímá.
Jenze na VS by se mely ucit pokrocily techniky a ne "zaciname s C/..." jenze to by 90% gymplaku bylo na technikach vprdeli, protoze to nevideli ani z rychliku.No... To nemusí platit... U nás na gymplu jsme měli Pascal někdy v prváku nebo max. v druháku, brali jsme takový věci jako spojový seznamy, sortovacá algoritmy, procházení koně šachovnicí a podobný kravinky. Bohužel o rok později to trochu zabili s Javou v BlueJ, což je tak stupidní prostředí, že by jeden plakal. (Možná, že právě vinou tohohle prostředí nemam rád Javu
No... To nemusí platit...Nemyslím si, že by těch (alespoň) 90% neplatilo, ale je pravda, že sám nejsem nadšený z čistě statistických argumentů, ať už jsou statistické hodnoty reálné nebo vycucané z prstu.
Tady se ovšem nabízí otázka, jestli by se v IT oboru na VŠ mělo počítat s tím, že studenti přijdou do prvního ročníku programováním zcela nepolíbeni.No, mozna se neco za 15 let zmenilo, a deti se dnes uci programovani na stredni bezne. (Ja osobne povazuji programovani za dalsi gramotnost, a myslim, ze kazdy by se to mel naucit uz na zakladni skole.) Ale v roce 1996, kdyz jsem sel na VS (FJFI), mel jsem v rocniku spoluzaka, ktery nedokazal ani zapnout PC (nicmene matematiku znal asi nejlepe z rocniku, takze nebyl blbec). Podle me predpokladat znalost programovani, aniz by bylo aspon z 90% soucasti vyuky na strednich skolach, je ponekud diskriminacni. Ale jinak ja bych v prvaku ucil ten Python prave proto, ze si myslim, ze pokud uz si nekdo ma vystacit s jednim jazykem, Python je asi nejpraktictejsi volba. Takze kdyz ti lide po prvaku odejdou z VS, zbyde jim aspon tohle.
ktery nedokazal ani zapnout PCTak ale to už je znalost hardware ;).
Ale jinak ja bych v prvaku ucil ten Python prave proto, ze si myslim, ze pokud uz si nekdo ma vystacit s jednim jazykem, Python je asi nejpraktictejsi volba. Takze kdyz ti lide po prvaku odejdou z VS, zbyde jim aspon tohle.To je velmi dobrý argument. Těch lidí, co se nepřenesou přes první ročník je hromada a děje se to z různých důvodů včetně finančních, kde by Python mohl být rychlejší pomocí než některé jiné jazyky. Na druhou stranu se mi nelíbí, že je Python relativně komplexní ve srovnání s jazyky jako je C a Pascal.
Komplexni? Jako ze ma komplexni cisla?Předpokládám, že slovo komplexní znáš. Kdybych napsal složité, tak mi zas bude nadávat, že v céčku je práce složitější.
Jestli se tim mysli pomerne bohata standardni knihovnaMám namysli věci, které se týkají samotného jazyka.
jednak ti tu nebudu vypisovat referenci obou jazyků a dělat kvantitativní srovnáníO to nestojim. Jen jsem si myslel, ze by tvoje zkusenost mohla byt zajimava, kdyz uz to ucis.
To mi zní jako klasický projev víry ve školu. Prostě přístup, že když přečtu předepsané knihy, složím předepsané zkoušky a dostanu příslušný papír (ať už maturitní vysvědčení nebo vysokoškolský diplom), přičemž za celou dobu se nepodívám nalevo napravo a nebudu se zajímat o nic nad rámec školní výuky, tak umím všechno, co je potřeba.
IMHO je to nesmysl. Stejně jako se člověk nestane dobrým řidičem v okamžiku, kdy absolvuje autoškolu, nestane se dobrým programátorem ve chvíli, kdy vystuduje odpovídající obor na VŠ. Naše základní a střední školství (a bohužel někdy i vysoké) bohužel podporuje právě tu uniformitu a nepodporuje ve studentech snahu samostatně se vzdělávat nad rámec výuky. To je podle mne chyba a v tak rychle se vyvíjejícím oboru jako IT, chyba přímo osudná.
Můj oblíbený aforismus říká, že vzdělání je to, co člověku zůstane, když zapomene všechno, co se naučil ve škole. To je samozřejmě jen vtip, ale jeho podstata je IMHO moc důležitá: přínos dobré školy není jen v těch znalostech, které si student odnese, ale hlavně v tom, že ho naučí pracovat s informacemi a samostatně se vzdělávat.
Proto nejsem přesvědčen, že je správné koncipovat výuku na VŠ tak, aby s ní v žádném případě nemohl mít problémy student kterékoli střední školy, který ji řádně absolvoval a naučil se všechno, co se po něm chtělo, ale ani o chloupek víc.
Proste VS nema predpokladat, ze lide znaji neco navic oproti tomu, co se bezne uci na SS, to je podle me spatne.
Podle mne je špatně naopak ten přístup "naučte se, co vám vyložíme, nic víc potřebovat nebudete" Podle mne by škola měla naopak vést studenty k tomu, aby se snažili učit a hledat nové věci sami. Ne "…will be sufficient to get you through your examinations, which, after all, is what school is all about".
Stejne tak, deti by mely mit pravo ve svem volnem case delat jine veci nez co se pak rozhodnou studovat na VS.
To právo jim rozhodně upírat nechci. Co jim chci upírat, je právo na to, aby ti, kdo na rozdíl od nich tu snahu vyvinou, z toho nemohli mít žádnou výhodu. Mimochodem, používání termínu "děti" pro středoškolské studenty mi připadá krajně zavádějící.
Co jim chci upírat, je právo na to, aby ti, kdo na rozdíl od nich tu snahu vyvinou, z toho nemohli mít žádnou výhodu.Me prijde, ze tu vyhodu nemaji uz implicitne. Vzdycky budou mit vyhodu ti, kteri to bokem studovali proti tem, co to bokem nestudovali. A pokud by se to vyresilo zpusobem, ktery jsem naznacil - VS by na to mela nejaky dalsi kurz, ktery lze preskocit - pak je ta nevyhoda dokonce explicitni.
Pokud ma nekdo pocit, ze se mu VS nevyplati, at na ni nechodi.Já znám osobně minimálně 3 lidi (na víc si v současnosti konkrétně nevzpomenu), kteří na konci druháku či ve třeťáku odešli, protože jim to konečně došlo a dál už jim škola neměla kromě titulu co nabídnout. Všichni jsou velmi technicky schopní, a někteří z nich se dají vidět i tady. Kdo naopak vždy zůstal jsou lidi, kterým šlo jen o titul a fungovali stylem "nauč se, udělej zkoušku, zapomeň". Hlášky jako "nasdílej prosím ten úkol, mě programování nezajímá a stejně to dělám jen kvůli titulu" jsem měl tu možnost slyšet dokonce osobně. Nevím, nepřijde mi to, že je to tak, jak by to mělo fungovat, ale co já vím.
Jestli si cetl tu diskusi na Root.czSorry, skončil jsem poměrně brzo a nemá to fulltext.
Nevidim duvod, proc by mel stat platit z dani vzdelavani, ktere si muze platit zamestnavatel.Počkej, a co si zaměstnavatel platit nemůže, tedy co se může na VŠ učit?
Navic je pro zamestnavatele zcela nezajimavej absolvent VS ... kterej toho umi min, nez stredoskolak s 5ti lety praxe. Pritom financni pozadavky obou budou nejspis srovnatelny.no, požadavky ... řekl bych, že ten absolvent VŠ se typicky bude cejtit tak na desetkrát víc
Znamená to: „Že si Bystousak nechce přiznat, že chyba je v něm. Tak je lépe to okecat a zachovat si vlastní sebeúctu a ego tím, že to svede na někoho jiného.“Já jsem nad tím přemýšlel, ale není to tak, protože já měl problémy jen s matematikou a ta chyba byla zcela jistě ve mě. Studium mě jinak docela dost bavilo. Ten zbytek co jsem tu prezentoval jsou vesměs nářky, které poslouchám od známých z IRC a z mé pracovní zkušenosti, se kterou jsem díky vlastní iniciativě a opensource na githubu také problém neměl.
a deti se dnes uci programovani na stredni bezneNe.
Ja osobne povazuji programovani za dalsi gramotnost, a myslim, ze kazdy by se to mel naucit uz na zakladni skole.Já bych spíš než programování učil skriptování, protože když vidím, jak uživatelé ručně zpracovávají sto stejných souborů/řádků/whatever pomocí sta opakování téhož klikání, když bych to dal jedním one-linerem v bashi… Ale to by vyžadovalo nějaký větší úvod do operačních systémů.
Ale v roce 1996, kdyz jsem sel na VS (FJFI), mel jsem v rocniku spoluzaka, ktery nedokazal ani zapnout PC1996? Jako naswitchovat do feritové paměti loader, nastavit na jeho začátek IP a nahrát monitor z pásky? Ne, vážně, ale tak tehdy prostě mohl mít smůlu a k počítači se nedostal, nebyly ještě na každém rohu, že jo. (teda myslím, byly mi 3)
Já bych spíš než programování učil skriptování, protože když vidím, jak uživatelé ručně zpracovávají sto stejných souborů/řádků/whatever pomocí sta opakování téhož klikání, když bych to dal jedním one-linerem v bashi… Ale to by vyžadovalo nějaký větší úvod do operačních systémů.To s tebou souhlasim. Bohuzel zatim nikdo neprisel na to, jak to uzivatelum prilis zpristupnit. Shell byl takovy zpusob nekdy v 70. letech, a pochybuji, ze ucit lepe OS je ta spravna cesta. Spis se proste lepe prodava MS Word nez Emacs. Ono elitarstvi programatoru je castecne problem (a muze myslim za ty snahy o "falesnou" uzivatelskou privetivost, ktera prave automatizaci zcela opomiji). Ja bych rad, aby vice lidi nahlizelo na programovani prave jako na to vareni - je to neco, co muze usnadnit praci, i kdyz ten program/skript pak nebude mit zadnou architekturu. Ted existuje jista nadeje v hudebni produkci, to by mohlo programovani priblizit vic "masam", ale uvidime.
Ted existuje jista nadeje v hudebni produkci, to by mohlo programovani priblizit vic "masam", ale uvidime.O co jde?
Ja bych rad, aby vice lidi nahlizelo na programovani prave jako na to vareniTesim se na zaplavu televiznich poradu o programovani: 1) Zdenek Pohlraich: Kurva, chlapi, v tom kodu mate ale bordel, [pip], [pip]. 2) Jirka Babica: Dneska si ukazeme, jak udelat quicksort. Budeme k tomu potrebovat jedno pole hodnot. Kdo nevi, jak se dela pole, pouzije spojovy seznam. 3) Jarda Hruska: Dnes si v televiznich novinach ukazeme, jak v JavaScriptu rychle a levne otestovat prvociselnost. Kazdy vi, ze prvocisla jsou licha cisla. Staci nam tedy overit, ze cislo je delitelne dvema. Nefunguje to vzdy uplne spravne, ale hlavni je, ze je to rychle a levne naprogramovane. 4) Prostreno: Dnes si pozveme bandu psychopatu, aby neco naprogramovali a pak si ten kod pomluvili. Vysledna hadka bude priblizne stejne zabavna jako tato diskuze.
Tesim se na zaplavu televiznich poradu o programovaniMne je to jedno, ja televizi nemam. A je mi jasne, ze si z toho lide delaji legraci, protoze jim to dnes pripada absurdni, stejne jako stredovekym mnichum pripadalo nejspis absurdni, ze skoro kazdy umi cist a psat. Ale vazne si myslim, ze by to mohlo pomoct. Treba prave informace o tom, jak zpracovat velke mnozstvi fotek soucasne.
protoze jim to dnes pripada absurdni, stejne jako stredovekym mnichum pripadalo nejspis absurdni, ze skoro kazdy umi cist a psatMne to absurdni zase tak neprijde. Znam nekolik lidi z vekove kategorie 50+, kteri se diky RaspberryPI pustili do programovani, mimochodem, i kvuli pouzitemu Pythonu, ktery je pro ne docela pristupny. Aby lidi zacali programovat, musi pro to mit nejakou motivaci. Premek podlaha svuj uspech postavil na tom, ze za minuleho rezimu nebylo nic dostani a kde chtel neco extra, tak si to musel SAM ubastlit. V pripade programovani je velka vyhoda v tom, ze staci jeden clovek, co uz podobny problem resil a dal sve reseni sdilet na net. Rada beznych problemu je takto pokryta, tudiz jeste vic klesa motivace ucit se programovat... Z pohledu pristupnosti pro neprogramatory mne paradoxne prisly asi nejlepsi Windows s jejich podporou OLE Automation (nebo jak se to jmenovalo), ktere de facto umoznovaly skriptovat aplikace z libovolneho jazyka a vytvaret zajimave celky. Ale nejak se to nechytlo...
Kazdy vi, ze prvocisla jsou licha cisla.Vážně? Já to teda nevím.
Ne, vážně, ale tak tehdy prostě mohl mít smůlu a k počítači se nedostal, nebyly ještě na každém rohu, že jo.No ne zcela, byl v tomhle asi jediny z rocniku. Rekl bych, ze nejaky pocitac melo tak mozna 30-40% domacnosti. Na druhou stranu, usetril spousta volneho casu, ktery mohl venovat cteni Jarnika, takze se v prvnim rocniku ponekud nudil..
Já bych spíš než programování učil skriptování, protože když vidím, jak uživatelé ručně zpracovávají sto stejných souborů/řádků/whatever pomocí sta opakování téhož klikání, když bych to dal jedním one-linerem v bashi… Ale to by vyžadovalo nějaký větší úvod do operačních systémů.+1. Trochu bych to zobecnil - ono nejde ani tak konkrétně o bash nebo linux, ale spíš o určitý přístup k řešení problémů - obecnost, znovupoužitelnost, rozšiřitelnost apod. (asi v podstatě unixová filosofie). Bohužel, řada lidí to řeší tak, že si stáhnou FooBarVendor® AwesomeFileRenamer™ (který je shareware a obsahuje toolbar do prohlížeče od Ask.com) a mají pocit, že jsou guru
:-/
Pokud clovek vystuduje fyziku/matematiku, tak je Matlab mnohem pristupnejsi nez jine jazyky.Nez python ci haskell? Pokud ano, jsou uz brain damaged a je lepsi se jich vyvarovat.
Cti co pisu, ne to co si myslis ze pisu.To plati i pro vas. Muj druhy odstavec se tyka vaseho tvzeni o dokumentovanosti Matlabu, kde cela rada algoritmu ma specifikovany jen interface, ale co je uvnitr nevite.
Co si vůbec místní jazykobijci myslí o MATLABu jako jazyku?no, nejsem jazykobijec, dokonce jsem se kdysi zařeknul, že programovat už nikdy nebudu, nicméně když jsem zprávičku četl, tak jsem nad umístěním matlabu silně zarazil - jestli jde o ten matlab, ve kterém jsem byl kdysi nucen spáchat nějaké úložky, tak bych řekl, že je k výuce programování vhodný asi jako Quarantine k výuce pravidel silničního provozu ...
az bude mit Python operator nasobeni matic, i to asi prestane byt zajimavenumpy
hlavni sila MATLABu je v tech toolboxechAno.
i++
? Sorry, asi nejsem moc dobrý filozof na programovací jazyky.
Skvělá je hlavně interaktivní práce - to je trochu možné i v pythonu, ale přijde mi to podstatně slabší, ...IPython Notebook znáte?
Ale když si vezmu některé (nejen) místní diskuse o návrhové čistotě, kultuře a designu "standardních" jazyků, tak MALTLAB by v tom všem snad totálně propadnul.To bude tím, že nemá návrhovou čistotu ani kulturu :D Ne, vážně - proprietární jazyk pro výpočty a simulace uzamčený na jedno (z hlediska programování tragicky špatné) vývojové prostředí s velmi dobrou podporou interaktivní práce (grafický repl s debuggerem). K tomu hnusná, ukecaná syntaxe kombinující funkcionální a procedurální kód. Imho kdyby se to neučilo na vysokých školách, tak po tom imho ani pes neštěkne.
import numpy as np
a pak prostě kdekoli np.dot(a, b)
(+ asi milion dalších funkcí co numpy má).
a co o wolfram language?Onehdá jsem na to koukal, přijde mi, že se jedná o další "God project" (analogie s God object). Čas od času se objeví nějaký takový projekt, typicky se vyznačuje tím, že se snaží vyřešit a umět úplně všechno, nebo alespoň úplně všechno v nějaké oblasti. Nedávno se objevila zprávičkao Xiki - to je další takový případ, ale existují další. Proč lidé tohle dělají?
Kdybych si měl zpětně vybrat svůj první programovací jazyk, tak bych asi volil Ruby. Bohužel za nás se ale začínalo na Pascalu nebo Basicu...
Mě zase přišel Python špatně čitelný. Každému holt vyhovuje něco jiného...
Myslím, že není potřeba to rozebírat. Jak jsem psal... Každému vyhovuje něco jiného.
I mně přijde Python nečitelný.A ani vy nebudete konkrétní?
K tomu si přidejte to, že v Pythonu jsou knihovny každý pes, jiná ves a rozhodně nedrží nějaké stejné základní principy.Jake zakladni principy by mely dodrzovat? Jedine, co si dokazu predstavit je pozadavek na vetsi objektovost. Coz muze a nemusi byt vyhoda.
Z hlediska přehlednosti a udržovatelnosti navíc trochu vadí, že proměnné jsou dynamické a nenapovídají ve zdrojáku na různých místech alespoň typ.A tohle pise nekdo, kdo ma rad Lisp? Vazne?
Pokud vím, tak Brainfuck a Python jsou jediné dva jazykyNevite, protoze v Brainfucku mezera neni. Bile znaky maji vyznam napriklad v Haskellu nebo v make. Pak jsem videl nejaky wtf-vyznam i v JavaScriptu, ale to asi nebyl zamer.
Prostě každý jazyk, který si vynucuje určitý code style, je z definice méně přehledný.Můj názor je přesně opačný.
K tomu si přidejte to, že v Pythonu jsou knihovny každý pes, jiná ves a rozhodně nedrží nějaké stejné základní principy. Co se posbíralo někde ve zbytcích kódu, z toho jsou Python knihovny.To jsou nekonkrétní řeči, které nic neznamenají.
Z hlediska přehlednosti a udržovatelnosti navíc trochu vadí, že proměnné jsou dynamické a nenapovídají ve zdrojáku na různých místech alespoň typ.Tohle nijak nesouvisí s čitelností, to je jen o tom, že vy jste zvyklý na jiné programovací paradigma.
Python mě nutí pokud možno dát jeden příkaz na jeden řádek.Nenuti, na jeden riadok je mozne zapisat aj viacero prikazov, ale takyto zapis povazujem za prasenie (zneprehladnuje debugging).
Prostě každý jazyk, který si vynucuje určitý code style, je z definice méně přehledný. V jazycích s volnou úpravou kódu můžete udělat prasečtější i přehlednější jazyk, můžete ho udělat velmi čitelný a udržovatelný.Nesuhlasim. Python definuje urcity coding style, ale je to len doporucenie, prasit sa tam da nehlade na vynutene odsadenie (ktore plni funkciu bloku kodu). Dany coding style ovsem dodrzuje vacsina Python programatorov a ked pozriete na cudzi kod, lahsie sa v nom zorientujete.
K tomu si přidejte to, že v Pythonu jsou knihovny každý pes, jiná ves a rozhodně nedrží nějaké stejné základní principy. Co se posbíralo někde ve zbytcích kódu, z toho jsou Python knihovny.Toto si dovolim tvrdit, ze je strasny nezmysel. Rovnako ako kazdy iny popularny jazyk, aj Python ma kniznice, ktorych kvalita sa pohybuje od shitu az po top uroven. V Pythone existuje kniznica snad na uplne vsetko a subjektivne hodnotim kvalitu popularnych kniznic viac nez velmi dobru.
Z hlediska přehlednosti a udržovatelnosti navíc trochu vadí, že proměnné jsou dynamické a nenapovídají ve zdrojáku na různých místech alespoň typ.Tak toto snad o dynamicky typovom jazyku asi ani nema zmysel komentovat.
Python mě nutí pokud možno dát jeden příkaz na jeden řádek.
To uz v pythone zrusili bodkociarku? Neviem ako python3, ale v python2 mi 'print 1;print 2' stale funguje.
Z hlediska přehlednosti a udržovatelnosti navíc trochu vadí, že proměnné jsou dynamické a nenapovídají ve zdrojáku na různých místech alespoň typ.
To uz zrusili aj 'type'? Ked uz clovek chce, tak si na typy moze hrat aj v pythone. ('if type(a) == int:' a pod.).
Python vnucuje určitou úpravu zdrojáku. Pokud vím, tak Brainfuck a Python jsou jediné dva jazyky, kde záleží na počtu mezer ve zdrojáku.Prdlajs. Jediný na čem záleží je aby byl blok odasezenej stejně, kolik mezer tam dáš je putna. Ani není problém roztáhnout něco komplikovaného na více řádek – dokud interpret nenajde konec výrazu tak odsazení ignoruje. Dokonce se s tím počítá a interpret schválně ignoruje nadbytečný koncový čárky (tam kde je to nesporný) aby se dal snadno kopírovat kód když si takhle rozpitváš třeba nějaký tučný volání funkce.
Python mě nutí pokud možno dát jeden příkaz na jeden řádek.Taky prdlajs. Pythonisti jsou naopak nechvalně známí tím co všechno dokážou natlačit na jeden řádek. Pokud ti pajtní kód přijde moc roztahanej, tak je to spíš tím že otrocky přepisuješ céčkový myšlení.
Prostě každý jazyk, který si vynucuje určitý code style, je z definice méně přehledný.Tuplovaný prdlajs. Céčko si vynucuje oddělený deklarace/definice. Java si vynucuje všude tlačit objekty, každej ve vlastním souboru. Pascal si vynucuje i určitý rozvržení kódu. Jestli nejsi prase tak zjistíš že si toho python vynucuje spíš méně. Navíc je to celý nesmysl, kdyby volnější styl byl přehlednější tak by nejpřehlednější jazyk na světě byl Perl.
K tomu si přidejte to, že v Pythonu jsou knihovny každý pes, jiná ves a rozhodně nedrží nějaké stejné základní principy. Co se posbíralo někde ve zbytcích kódu, z toho jsou Python knihovny.To je naprostá pravda… pokud všechno co tě zajímá je pohled z rychlíku. Když se podíváš blíž tak uvidíš že pajtní knihovna je taky o hodně větší než má většina jiných jazyků. Pokud nataháš do C nebo Javy externí knihovny se srovnatelnou funkčností, tak mezi nimi taky bude spousta různých stylů a bude to vypadat jako bordel. BTW taky ten bordel dobře dokumentuje to hrozný vynucování coding style, že?
Z hlediska přehlednosti a udržovatelnosti navíc trochu vadí, že proměnné jsou dynamické a nenapovídají ve zdrojáku na různých místech alespoň typ.Nikdo ti přece nebrání si je srozumitelně pojmenovat. Nic víc ani nepotřebuješ, naopak, nějak typy vynucovat v tom jazyce nedává smysl a spíš to škodí. Prostě z tebe mluví nezvyk. V práci máme spousty přeučených céčkařů který měli stejný obavy. Nikdo s tím neměl problém – štábní kulturu musí držet i v céčku. Pokud má někdo problém s odsazováním tak je prostě prase. V jakémkoliv jazyce.
Ale pascal z toho nejhorší, protože učí věci který je pak potřeba se zase odnaučit pokud má být z člověka programátor.Konkrétně?
... nápad mít středníky jako oddělovače.To je z dnešního pohledu skutečně divné, ale na druhou stranu v novějších verzích jazyka nic nebrání tomu naučit se dělat středníky za každým příkazem. Pascalisti to tak obvykle stejně dělají, protože si tím zjednoduší připisování kódu na konec.
... kdysi jsem četl pojednání tuším od Denise ...Byl to Brian Kernighan, ale jeho připomínky z velké části neplatí pro současné verze Pascalu.
Byl to Brian Kernighan, ale jeho připomínky z velké části neplatí pro současné verze Pascalu.Jinými slovy, "nalakovali jsme to hovno tak tlustě že vypadá jako koláč". Z toho je právě vidět že tvrzení že pascal je navržený v k výuce je kravina – pokud se nějaká současná verze pascalu skutečně dá učit, tak je to naopak proto že s tím jak byl ten jazyk navržen už nemá mnoho společného.
Z toho je právě vidět že tvrzení že pascal je navržený v k výuce je kravina – pokud se nějaká současná verze pascalu skutečně dá učit, tak je to naopak proto že s tím jak byl ten jazyk navržen už nemá mnoho společného.Tak to máš pravdu, ale zas je potřeba pamatovat, že doba se vyvíjí a jazyky s ní. Prakticky každý trochu šířeji používaný jazyk prošel podobným vývojem. Viz třeba historický vývoj jazyka C, C++, Java, Python a dalších. Originální podoba těchto jazyků je z dnešního pohledu taky naprosto nevyhovující.
Zatímco stále platný jádro tý brianovy kritiky pascalu je něco jako "no escape" – ten jazyk s žádným vývojem nepočítá a opravit některý zásadní vady znamená defacto vytvořit novej jazyk.Brian napsal: "The language is closed," a pro tebe zřejmě tehdy Pascal skončil, uvázl jsi v minulosti. Ale bez ohledu na to se jazyk někam vyvinul, ty escape mechanismy dnes existují. Nebavíme se o verzi roku 1981.
Rád bych ale tento důvod podepřel i argumenty na konkrétní problémy jazyka.Takovou analyzu je mozne provest, ale chtelo by to konkretni referenci Pascalu, ktery se pouziva (nejsem v tom odbornik). Protoze jinak se opravdu budeme tocit v kruhu kolem toho, co napsal ten Kerninghan. (Ale obavam se, ze ten Pascal, ktery uci ucitele nijak standardizovan neni, takze je i tezke to objektivne vyvratit.)
Brian napsal: "The language is closed," a pro tebe zřejmě tehdy Pascal skončil, uvázl jsi v minulosti.
Je tu ale podstatný rozdíl: zatímco v případě céčka jsou nové verze standardizované (C90, C99), u Pascalu AFAIK žádná nová norma neexistuje (poslední se zdá být ta z roku 1990 a ta to, co tvrdíte, zdaleka nesplňuje), takže ten "vývoj" jsou ve skutečnosti jen rozšíření jazyka implementovaná různými autory překladačů; v případě Borland Pascalu a Delphi už bych spíš mluvil o novém jazyce založeném na Pascalu.
V céčku se od standartizace jen pilujou hrany.No jo, ale kdy ta standardizace proběhla, že? Skoro 20 let od vzniku jazyka. I C++ se dost vyvíjelo, třeba abstraktní metody, statické metody, vícenásobná dědičnost, protected, const metody byly přidané v roce 89. Templates v roce 91 a exception handling až někdy v r. 93 nebo tak nějak...
Na C++ běžně používám příručky dvacet let starý.No to neděláš dobře, např. o exception safety nebo o smart pointerech tam asi nic moc nebude... O featurách C++11 ani nemluvě...
Deklarace jsou ostatně další věc – mít všechny proměnné globální a na jedný hromadě je nejen pitomost, ale přímo antiteze programování kterou se člověk musí naopak odnaučit pokud chce opravdu programovat.Toto nechápu. Všechny proměnné globální rozhodně nejsou, proč by měly? Samozřejmě si můžete nadeklarovat globální proměnnou, záleží jen na Vás. Ale všechny? Mluvíme o dnešní výuce. Bylo by lepší srovnávat stávající verzi ObjectPascalu a ne vzpomínat na něco, co platilo před XX lety.
Ale stojím si za tím že pokud se někdo chce naučit slušně psát céčko, tak se tuhle úžasnou vymoženost musí odnaučit.Proc je to problem?
Nejsi ty nahodou profesi ucitel?Nejsem, to bych byl jiz ve vezeni za mlaceni studentu.
A nepamatuju ze by to nekdy bylo nutnyStarsi standardy vyzadovali deklaraci lokalnich promennych na zacatku bloku (ANSI, C89, C90) a zakazovali mixovat deklaci a kod. I dnes u gcc staci pouzit
-ansi -pedantic
a jste v tom:
void fnc() {} int main() { fnc(); int a; return 0; }a pak dostanete:
test.c:9:5: warning: ISO C90 forbids mixed declarations and code [-Wpedantic] int a; ^Takze bud jste pouzival novejsi nebo tolerantnejsi kompilatory a nebo kaslal na standardy jazyka.
radon@xenon ~ $ cat test.c void fnc() {} int main(void) { fnc(); { int a; return 0; } } radon@xenon ~ $ gcc -ansi -pedantic -o test test.c radon@xenon ~ $To je prave ta tragedie ze "vyukovy" jazyk misto aby ti vysvetlil k cemu jsou dobry obory platnosti, tak te naucil ze to neexistuje.
"na začátku programu/funkce/třídy"A ja jsem psal na zacatku bloku v C, Pascal mi byl vzdy ukradeny a byl jste to vy, kdo z toho zacal delat tragedii a tahat do toho i C. Telo funkce je z hlediska C standardu take blok a pravidla se aplikovala i na nej. Napsal jsem pomerne dost certifikovaho kodu podle C89, jakykoliv warning od kompilatoru byl blocker a nikdy nebyla nutnost mit lokalni promenne definovane na zacatku problem, spise naopak.
To je prave ta tragedie ze "vyukovy" jazyk misto aby ti vysvetlil k cemu jsou dobry obory platnosti, tak te naucil ze to neexistuje.To je pravda, nicméně Pascal se už dnes neučí. Dnes je to ještě horší. Učí se Java, ve které obory platnosti už vůbec nejsou a správa paměti se řeší tak, že se neřeší, navíc je stuedntům vtlučeno do hlavy, že OOP = objekty v Javě a že společně s GC to je nejvíc nejlepší věc v programování
:-/
procedure Foo; var i: Integer; procedure Subfoo; begin //code end; var j: Integer; begin //code end;může ta nested procedura používat i, ale ne j. Důvod je, že Pascal kompiluje jen na jeden průchod, proto jsou kompilery hodně rychlý. Vývojář FPC nedávno uváděl, že FPC zkompiluje sebe (je to self-hosting) 300 000 řádek za 4,2s na Core i7.
Myslím, že kolega měl na mysli spíš proměnné s omezeným scope, např.
while (...) { const struct device *dev = a[i].dev; ... }
nebo (v C99) rovnou
for (unsigned i = 0; i < N; i++) { ... }
Programator by se mel naucit ty nejcastejsi (Java, C, C++)Bylo by dobre rozlisovat dva vyznamy "ucit se programovat". (1) Ucit se programovat per se (obecne vytvaret programy). (2) Ucit se programovat v konkretnim jazyce. V pripade (1) je zadouci, aby se programovaci jazyk pletl do programovani co nejmene. Tohle dobre splnuje prave Python nebo dialekty Lispu. V pripade (2) je zadouci, aby clovek pochopil poradne jazyk, ve kterem programuje vcetne detailu. Delat obe veci soucasne sice jde, ale je to silenost. Mnohem rozumnejsi je jit od bodu (1) k (2). Jazyky Java, C, C++ jsou naprosto nevhodne pro "ucit se programovat" ve vyznamu (1). Java (obzvlast ve verzi 8) -- vnitrne nekonzistentni jazyk, aby clovek pochopil radu nelogicnostni, musi pochopit vyvoj tohoto jazyka, takze vedle programovani se clovek musi naucit i neco z dejepisu. Z tohoto pohledu by zajimavym resenim mohla byt Scala. C -- pro pochopeni i tak elementarnich operaci jako je prace s retezci nebo poli, musi clovek pochopit, jak vlastne funguje procesor a pamet. Tohle muze byt bug i feature. ;-] C++ -- takovy jeden velky programatorsky eintopf.
A co deti? Chces je ucit programovat tim, ze jim nejdrive predepises dva semestry algoritmizace?Celkove je ta myslenka ujeta. A je jedno, jestli jsou to deti nebo dospeli, s takovym pristupem by byli demotivovani uplne vsichni. Ucit se programovat bez programovaciho jazyku je zhruba tak efektivni jako ucit se plavat na sousi a pak zkouset preplavat kanal La Manche. Vylozene mne to pripomnelo.
jisty kolega opsal pri zkousce pozadovanou definici ze sript, jejiz autorem byl dotycny zkousejici a presto ho zacal prcat za to, ze je to spatne
Vynechal jste dost podstatnou informaci: jestli ta definice byla špatně. Bez ní tu historku lze jen těžko hodnotit.
Ale ano, jistě, i na vysokých školách se může člověk setkat s tím, že matematiku vyučuje někdo, kdo by pokud možno neměl vyučovat vůbec nic. Mně se třeba stalo, že mi ve třetím ročníku na matfyzu zkoušející řekla něco ve smyslu: "No, je sice hezké, že si to dokážete odvodit, ale já bych radši, kdybyste se to naučil." Jenže na rozdíl od vás to beru jako problém té vyučující, ne vědního oboru.
Mně se třeba stalo, že mi ve třetím ročníku na matfyzu zkoušející řekla něco ve smyslu: "No, je sice hezké, že si to dokážete odvodit, ale já bych radši, kdybyste se to naučil." Jenže na rozdíl od vás to beru jako problém té vyučující, ne vědního oboru.vynechal jste dost podstatnou informaci ... jestli tam ta vyučující seděla v pátek odpoledne třikrát tak dlouho než by stačilo, kdybyste se nezdržoval odvozováním - bez ní tu historku lze jen těžko hodnotit :-p
Toto sa skutocne dialo? Aj na matfyze? Zacinam byt celkom rad, ze som sa s niecim takym pocas mojich studii nestretol a to som dokazy zasadne odvodzoval (u zlozitejsich s tym, ze som si zapamatal zbeznu ideu) a neucil sa ich naspamat. Ta osoba by v mojich ociach zrejme po niecom podobnom klesla velmi vyrazne.
Co sa tyka povodneho pribehu od j, tak by som kludne veril tomu, ze skusajuci povedal, 'keby aspon ta ciarka pred ale bola spravne, tak vam tu druhu chybu v definicii odpustim, ale takto...', co si j transformoval na vlastnu verziu 'bolo to blbo kvoli ciarke'. Inak povedane: neverim tomu, ze by ho od skusky vyhodil ten clovek len kvoli chybajucej ciarke, ta ciarka bola pravdepodobne uz len posledny klinec do rakvy. Podobnych verzii pribehov som uz pocul pozehnane a nevybavujem si ani jeden pripad, kedy neslo o skratenu/skomolenu/nepochopenu verziu povodneho vyroku skusajuceho.
Co sa tyka druheho pribehu od j, tak tiez by som to videl na chybu v skriptach. V skriptach byva chyb neurekom, aj preto byvaju skripta casto oznacovane len za pomocne materialy (na prednaske to snad bolo odprednasane spravne). Osobne som sa niekolkokrat stretol s tym, ze ucitel vyslovene na prednaske povedal -- v pripade nezrovnalosti medzi skriptami a odprednasanym ucivom je rozhodujuce odprednasane ucivo.
Toto sa skutocne dialo? Aj na matfyze?
Za celou dobu studia se mi něco takového stalo jen jednou a samozřejmě mi to vyrazilo dech. Naopak, při jiné příležitosti udělalo přednášejícímu zjevnou radost, když jsem mu předvedl jiný důkaz, než ukazoval na přednášce (ale to byla nějaká složitější věta a důkaz jsem si rozmýšlel doma, jenže jsem na té přednášce nebyl a zapomněl jsem si od někoho půjčit poznámky). A při zkoušce z míry dokonce přednášející razil zásadu, že kdo chce jeničku, musí být schopen něco sám vymyslet.
v pripade nezrovnalosti medzi skriptami a odprednasanym ucivom je rozhodujuce odprednasane ucivo
Takhle bych to asi neformuloval. I v tom odpřednášeném mohou být chyby, aniž by si jich kdokoli z přítomných všiml.
Za celou dobu studia se mi něco takového stalo jen jednou a samozřejmě mi to vyrazilo dech. Naopak, při jiné příležitosti udělalo přednášejícímu zjevnou radost, když jsem mu předvedl jiný důkaz, než ukazoval na přednášce (ale to byla nějaká složitější věta a důkaz jsem si rozmýšlel doma, jenže jsem na té přednášce nebyl a zapomněl jsem si od někoho půjčit poznámky). A při zkoušce z míry dokonce přednášející razil zásadu, že kdo chce jeničku, musí být schopen něco sám vymyslet.
S tymto pristupom som sa uz stretaval castejsie. Aj ked, ked som teraz zavrtal v pamati, tak sa sem-tam stalo, ze nejaky doktorand (na bakalarskom stupni) nieco opravil v style 'asi mas pravdu, ale na prednaske sa to robi inak'.
Takhle bych to asi neformuloval. I v tom odpřednášeném mohou být chyby, aniž by si jich kdokoli z přítomných všiml.
To, ze obe tie verzie su az za ich formalne spravnou definiciou je ocakavane implicitne (aspon ja som to tak vzdy bral, nejaka mensia chyba (hlavne preklep) sa tam najde, vacsiu by si uz mal prednasajuci snad vsimnut). V tychto pripadoch slo skor o to, ze skripta boli zastarale, pripadne pisane inymi ludmi alebo pre inak koncipovane predmety. Vysledkom bolo, ze tam boli tie rozdiely dost vyrazne a neslo len o nejake male preklepy a pod.
btw: Tie chyby tam mozu byt aj ked si ich niekto vsimne, aspon ja som na trivialne chyby na prednaskach neupozornoval.
Nevsim sem si, ze by se za poslednich rekneme 50let v matematice udalo neco zasadniho.To snad ne ...
Pokud chces vychovavat programatory, nema smysl je ucit Pascal. Programator by se mel naucit ty nejcastejsi (Java, C, C++) a pak jazyky ruznych paradigmat (Lisp, Haskell, Prolog, Erlang, Forth, assembler..). Pascal neni dost odlisny od tech bezne pouzivanych na to, aby melo smysl ho ucit jako dalsi jazyk navic.Souhlasím. Podle mě by bylo taky dobré, aby ten programátor v té které zemi našel práci, až vypadne ze školy. Zrovna v pascalu bych se bál, že bude mít silný problém a pokud už něco najde, bude to z většiny jen údržba existujícího hororového systému vzniklého v době, kdy se nepoužívalo nic z dnešních vymožeností (například git a unittesty).
Je to o cca 30 klíčových slovech a několika pravidlech gramatiky. To je celý programovací jazyk.Wow! A kam se podela semantika a pragmatika? A to nemluvim o operacni semantice jazyka, kterou je taky dobre znat.
Je to o cca 30 klíčových slovech a několika pravidlech gramatiky. To je celý programovací jazyk. Plus mít před sebou otevřenou nápovědu s referenční příručkou ke standardní knihovně.Super, chci videt jak s touto vybavou naucite ceckare Haskell a C#-pistu Lisp.
Nic, co by Kaťule, pokud už nějaký programovací jazyk zná a něco naprogramovala, nezvládla za den, v nejhorším za dva, když bude tupá a nenadaná.Měl byste uznat, že vás setřel. Nevěřím tomu že Kaťule, byť třeba geniální slečna, ostřílená v C, by byla schopná se za "den, přinejhorším za dva" naučit Haskell.
Zvládl jste kdy alespoň jeden programovací jazyk? Víte o čem to je?Já dělám sedmým rokem v Pythonu (od února na fulltime) a taky občas v D a v C. Škrtl jsem si i o lisp, rebol, matlab, C#, javu, c++, php, javascript, pascal (na něm jsem začínal) a pár dalších (momentálně se chci zaměřit na smalltalk). Takže ano.
Je to o cca 30 klíčových slovech a několika pravidlech gramatiky. To je celý programovací jazyk. Plus mít před sebou otevřenou nápovědu s referenční příručkou ke standardní knihovně.Ne, to je syntaxe. Naučit se myslet v tom kterém jazyce a psát idiomaticky a efektivně, to je potom úplně o něčem jiném a trvá to dlouhá léta. Pěkně to jde vidět třeba u lidí, co přejdou z javy na python, jeden takový hororový příběh jsem v nedávné době pozoroval podstatně blíž než je mi libo a ještě po něm přepisoval pár hrůz.
Ja by som to az tak cierne nevidel, samozrejme sa clovek nenauci programovat v jazyku perfektne za dva dni, ale ak ma za sebou dostatok teorie, tak ho v podstate ziadna konstrukcia jazyka neprekvapi a pochopi ju takmer okamzite. Vysledok je, ze sa nauci v jazyku programovat celkom schopne velmi rychlo a obvzlast moznost prispievat novy kod do existujuceho projektu pre takeho cloveka zacina takmer okamzite (rychlo odkuka aka je pozadovana uroven projektu).
Já si hned říkal, že to nebude tak horké…
dnes 17:15 Miloslav Ponkrác
Tato debata opravdu nikam nevede. Končím.
Nerozumím proto, jak Ván neznalost C zamezila přístupu k linuxu.Presne! Prave proto, ze neznate moji osobni historii, nemuzete vynaset soudy nad tim, co mi Pascal dal ci nedal. Do VS jsem byl s prostredim DOS/Pascal celkem spokojeny. Byl to az nastup Windows 95, ktery me donutil hledat jinou, otevrenejsi platformu (Linux). Ale jsem si temer jisty, ze kdybych umel C driv, dostal bych se i k Linuxu driv - ta moznost v mem okoli existovala. Nevim, v cem by mel v te dobe Pascal "udelat v me hlave poradek". Uz predtim jsem znal dost slusne assembler (jak Z80 tak x86), a Pascal jsem pouzival v podstate jen proto, ze byl vysokourovnovy (a mel graficke knihovny, atd.). Stejne dobre by dnes poslouzil Python (skoda, ze jsem nic takoveho tehdy nemel!).
Daleko podstatnejsi je naucit se snadno algoritimizovat problem a nasledne prevest do implementace. Volba jazyka je druhotna a od urcite urovne je uplne jedno v cem to pisete. V praxi je pak daleko dulezitejsi znalost knihoven a prostredi.
S ohledem na vyvoj smerem k paralelnimu a distribuovanemu zpracovani uloh bych spis uvital posun smerem k funkcionalnimu paradigmatu, pro ktere je zrovna Python nevhodny. Vim o univerzite, kde byl jako vyukovy jazyk Scheme a ve vyssich rocnicich computer science vladnul Haskell a o absolventy se tam velke firmy a banky perou. Je jen otazka casu, kdy se presune poptavka i do jinych odvetvi. Python, Ruby, Perl nebo C++ uz maji obdobi slavy zrejme za sebou.Uplne bych ObjectPascal na vyuku nezatracoval. Algoritmizace i principy OOP se daji na tom naucit stejne dobre a navic ma vyhodu oproti Pythonu ve staticke analyze a typove kontrole kodu prekladacem. To muze hodne pomahat zacatecnikum, bez nutnosti psat ke kazdemu programu jeste jednotkove testy, ktere navic nejsou 100% spolehlive.Má ale jednu nevýhodu - je k ničemu. Až potom absolvent ze školy odejde, může se celý zbytek života věnovat jeho zapomínání, protože je to asi stejné jako naučit programátora místo angličtiny latinu.
Daleko podstatnejsi je naucit se snadno algoritimizovat problem a nasledne prevest do implementace. Volba jazyka je druhotna a od urcite urovne je uplne jedno v cem to pisete. V praxi je pak daleko dulezitejsi znalost knihoven a prostredi.Souhlas.
S ohledem na vyvoj smerem k paralelnimu a distribuovanemu zpracovani uloh bych spis uvital posun smerem k funkcionalnimu paradigmatu, pro ktere je zrovna Python nevhodny.To je imho blbost. Python je funkcionální docela dost, ale nebere to jako náboženství.
Vim o univerzite, kde byl jako vyukovy jazyk Scheme a ve vyssich rocnicich computer science vladnul Haskell a o absolventy se tam velke firmy a banky perou. Je jen otazka casu, kdy se presune poptavka i do jinych odvetvi. Python, Ruby, Perl nebo C++ uz maji obdobi slavy zrejme za sebou.Tak jedna z těhle univerzit je například MIT. Osobně bych určitě komukoliv kdo se chce programováním zabývat naordinoval nějaký lisp, protože to je jak kdyby se člověku otevřelo třetí oko.
Taky díky za link ;)
Taká Java, ale 100rýchlejšia.dal jsem necetl
Keď zoberiem otvorené implementácie Javy, tak som to ani neprehnal. Pokiaľ zoberieme tie od Oracle, to je ináTohle nedava uplne smysl. Referencni implementace Javy (OpenJDK) je otevrena a Oracle Java je od oka tak z 99% postavena na OpenJDK.
Konvertor audia, videa som v tom napísal za večer, neviem či by som to dokázal v niečom inom.Takové to pythoní Qt, dobrá ukázka je brmbar3.
Takové to pythoní QtPython s nejakým widgets a nemusí to byť zrovna QT mi príde vysoko použiteľné, aj ako nepythonista si to dokážem upraviť. Osobne používam LinuxCNC, PyCAM a určite som na niečo zabudol. Osobne mi to príde easy, napr. oproti Jave & niečo.
Pokud by první učený jazyk byl Haskell (či jiný čistě funkcionální jazyk), odpadla by fixace na imperativní paradigma a tím pádem by nečinilo problém zvládnout funkcionální paradigma které bude v budoucnu klíčové.Roky se ucil na univerzitach Lisp a jeho derivaty, a predpokladany efekt to nemelo. O superiorite funkcionalnich jazyku se blaboli roky a kde nic tu nic. Mozna proto ze pod kapotou mame stale von Neumannovskou architekturu a na brzkou zmenu to nevypada.
AFAIK cast frontendu je porad v Ruby. Asi stoji za pripomenuti, ze v dobe kdy opustili Ruby tak bezeli na verzi 1.8.x a od te doby prosel VM i GC zasadnima zmenama smerem ke skalovatelnosti (YARV a generacni RGenGC). Nemluve o JRuby. Kod primo ve Scale nebo Jave je ale obecne rychlejsi, o tom zadna.
Funkcionální jazyky se více nerozšířili protože v nich nikdo neumí dělat (díky prvně učenému imperativnímu paradigmatu).To je blabol, lide se uci. Ve skutecnosti je to jinak - ciste funkcionalni programovani nema v soucasnosti zasadni prakticke vyhody a kecy teoretiku nechme stranou.
To je blabol, lide se uci. Ve skutecnosti je to jinak - ciste funkcionalni programovani nema v soucasnosti zasadni prakticke vyhody a kecy teoretiku nechme stranou.To je blabol, funkcionalni programovani ma prakticke vyhody a kecy little.owla nechme stranou. Jen to neni nastroj delniku jako Java, C# nebo C ale inteligence.
funkcionalni ≠ ciste funkcionalni, prakticke ≠ zasadni prakticke
Jen to neni nastroj delniku jako Java, C# nebo C ale inteligence.Vyborne, a ted zavedeme tridni boj i do programovacich jazyku
jen si nemyslim ze je to panaceaV tom souhlas a snad jsem to nikde ani netvrdil.
To už je ale trochu stará finta: prohlásit něco za "jen pro inteligentní", aby se nikdo neodvážil to kritizovat ze strachu, že bude vypadat jako blbec.To mi připomíná jednu pohádku.
Důvod proč všechny monády nemají garantováno že jsou applicative je ten že monády byly vymyšleny dříve než applicative.Ano, a to prave dobre vystihuje problem statickych typovych systemu. Pokud se neco takoveho stane, je problem to zmenit. Jelikoz ma Haskell striktnejsi typovy system nez jine jazyky, trpi timto problemem jeste vice. Abstrakce Haskellu jsou fajn. Je pekne, ze tomu programovani dava matematicky zaklad. Urcite to otevira cestu spouste novych optimalizaci. Ale budoucnost primo v tom nevidim. Myslim, ze to nakonec skonci pod kapotou - bude se dal programovat "imperativne" (i kdyz na vysi urovni), a kompilator si to prebere, to co zvladne zfunkcionalizovat, zfunkcionalizuje. O tomhle mluvi treba Erik Meijer. Ma to i realne vysledky - treba LINQ v .NET jsou ve skutecnosti monady, ale nerika se tomu tak.
kdyz napsal, ze se u Haskellu musi na zacatku dost premyslet, jak definovat typy v programuTo je mozna problem uplnych zacatecniku, kteri se snazi priohnout svuj styl mysleni nauceny z dynamickych imperativnich jazyku. Navic je neni potreba vetsinou ani deklarovat diky typove inferenci.
To je mozna problem uplnych zacatecniku, kteri se snazi priohnout svuj styl mysleni nauceny z dynamickych imperativnich jazyku.Jiste, nad type classes neni treba vubec premyslet - a pritom tomu samotni haskelliste venuji cele state.
U imperativnich jazyku usnadnuje programovani inkrementalni pristup, dekompozice na mensi casti.A funkcionalnich jazyku dekompozice a inkrementalni pristup nepomaha?
Efektivne programovat v ciste funkcionalnich jazyzich je obecne narocnejsi na IQZajimave. A mate to podlozeno jak?
Efektivne programovat v ciste funkcionalnich jazyzich je obecne narocnejsi na IQHm, v cem je tedy pak jejich vyhoda, krome masochismu? Takhle, nic proti, ja mam rad dobry hlavolam. Ale kdyz chces resit prakticky problem? Neni to spis na prekazku, kdyz je ten jazyk narocnejsi?
Dve tretiny jsou zoufalosti jako tohlePsst, nemusis na sebe tolik upozornovat ze tomu vubec nerozumis
Psst, nemusis na sebe tolik upozornovat ze tomu vubec nerozumisJa chapu, ze my delnici, na vas, pracujici inteligenci, proste nemame.
Na tu analyzu 2/3 projektu bych se ale rad podival. Das sem link ?Stacilo mi nahodne samplovat cca 15 projektu - a je to stejne jako u vetsiny techto repositaru - casto spise sbirka polofunkcniho poloudrzovaneho semestralniho/diplomkoveho srotu po par lekcich, ktery se kumuloval roky. Pokud mate pocit, ze tomu tak neni, ukazte mi par [desitek] pilotnich vzorovych nematematickych projektu. Navic, pokud mozno nejakou knihu se vzorovymi Haskell design patterns a pristup k reseni fundamentalnich problemu spojenych s time/space costs u lazy FP.
Samplovani je ve statistice regulerni cesta k analyze datZacinas me bavit. Jak ten vyber probehl ? Jaka byla hladina vyznamnosti ? Pocet opakovani (nula?) ? Tohle je neseriozni tvrdit nasamploval jsem 15 vzorku a vyslo mi tohle - bez relevantniho podkladu.
% prvku ktere maji vlastnost | pravdepodobnost ze ani jeden nevytahnu --------------------------------------------------------------------- 50 | 0.5 ^ 15 = 0.003 % 20 | 0.8 ^ 15 = 3.5 % 10 | 0.9 ^ 15 = 21 % 5 | 0.95 ^ 15 = 46 %Takze ze vzorku 15 muzes rict ze pravdepodobne (> 50%), 95% projektu nema danou vlastnost
Skoda ze vic nepochoplapila extremni lama. Jeho nastrel zacal vypadat hodne vyzivne. Smich pry prodluzuje zivot
Nez teoretizovani o "idealnim" jazyku a implementaci je asi lepsi si nejdriv polozit otazku k cemu ho budu potrebovat. Pokud jde jen o konicek a rozsireni prehledu nebo jak zabit volny cas, pak je to prakticky jedno.
Obsahuje GC, což je ale nástroj původně vytvořen pro čistě funkcionální jazyky.A to ho nemohou pouzivat jine jazyky? GC ma treba i SmallTalk...
GC v OO jazyku účinně pohřbívá výhody objektového systému
Oblíbenost GC je důkazem oblíbenosti vysoké úrovně abstrakce.GC je pouze nastroj a s urovni abstrakce nema nic spolecneho. Pokud chces, muzes mit GC i v C.
Imperativní paradigma je co se týče abstrakce velice nízko a nepodporuje optimalizace vyšších úrovní (call by need, call by future).To, ze to soudobe imperativni jazyky nepodporuji, neznamena, ze to nejde v ramci celeho paradigmatu, jen proste o to neni vyraznejsi zajem.
rekurzivní datové struktury v imperativním jazyku. Lze to, ale má to dopad na rychlost nebo na čistotu paradigmatuTomu nerozumim. V imperativnich jazycich pouzivam bezne rekurzivni datove struktury a na vykon nebo nejakou cistotu to vliv nema. Nebo se snazis rict, ze v imperativnich jazycich je prasarna pouzivat spojove seznamy, stromy, atd.?
GC souvisí s úrovní abstrakce.Jak?
Implicitní call by need optimalizace je podmíněna referenční transparentností. Tu mají čistě funkcionální jazyky ale nikoli imperativní jazyky. Implicitní call by future vyžaduje taktéž referenční transparentnost.To jen pouze v tom nejobecnejsim pripade. Referencni transparentnosti lze dosahnout i v imperativni jazycich.
Imperativní nástroje patří prostě do imperativního paradigmatu. To samé s funkcionálními nástroji.Toto je hodne omezene videni sveta. Treba v takovem Lispu spojenim funcionalniho a imperativniho programovani lze dosahnout peknych vysledku, ktere by nebyly ani v jednom z techto svetu mozne. Mimoto, vetsina main-streamovych (imperativnich/objektovych) jazyku prejima prvky z funkcionalniho sveta a take je to posun k lepsimu, zajimave...
Přijde mi skutečně nepohodlný a nekonzistentní (True, False, and, or ...).Co jen na tom nekonzistentního?
No jestli je na Pythonu něco skutečně zpraseného, tak je to právě to odsazování. Jazyk sám o sobě fajn, ale určovat hloubku vnoření podle pozice prvního znaku na řádku je poněkud dementní a vede to k obtížně nalezitelým chybám, které tu asi většina lidí zná.Já si myslím, že kecáš voloviny. Za celých 7 let, co dělám v pythonu se mi tohle stalo v naprosto zanedbatelném počtu případů a chyba byla okamžitě nalezena. Python má svoje chyby, ale určení kódu odsazením mezi ně rozhodně nepatří. Prostě to není problém, ten v tom vidí jen lidi, co se rozhodli, že to pro ně problém bude a tak se mu radši vyhýbají.
Navíc jsem nemluvil o tom, že by se to mělo stát tobě, ale zkus si poslepovat dohromady pár kusů kódu, na kterých spolupracovalo víc lidí.To dělám, dokonce je to součástí mojí práce. Nechci tě shazovat, je určitě možné, že jsi odborník na slovo vzatý, ale imho ne na python. V pythonu se považuje za standard úprava kódu pomocí PEP8 a za sebe musím říct, že ačkoliv občas pracuji i s různými amatérskými projekty, které jsou rády že mají stránku na githubu a nestojí za nimi nikdo podstatný, tak většina lidí jí z velké většiny skutečně používá.
BTW, programuju v různých systémech a jazycích skoro 30 let a troufám si říct, že o tomhle oboru něco málo vím. Pythonu se nevyhýbám, má spoustu fajn vlastností, ale některé věci Kvído prostě zkonil a není ostuda to přiznat.Většinu vlastností nezkonil zrovna on, probíhá to komunitním rozhodováním už několik desítek let. Jak jsem psal, python má nepěkné vlastnosti, ale syntaxe mezi ně nepatří. Například problémy s konverzemi unicode (
ordinal not in range(128)
horor), cyklické importy a používání dokumentace ve sphinxu, který je všechno jen ne jednoduchý a intuitivní.
Možná to zkusme otočit a říct, v čem jsou ty mezery výhodné. Já na to nepřišel.Myslim, ze hlavni vyhoda je eliminace zbytecnych radku obsahujicich 'end' nebo neco podobneho. Tim se zvysuje citelnost, protoze se vejde vic kodu na stranku.
lol ... chci videt aspon jedinyho cloveka, pro kteryho se citelnozt zlepsi tim, ze chybi zahajovaci/ukoncovaci tagy segmentuMojí fotku na netu jistě najdeš.
lol ... chci videt aspon jedinyho cloveka, pro kteryho se citelnozt zlepsi tim, ze chybi zahajovaci/ukoncovaci tagy segmentu ...Mojí fotku nenajdeš, ale pokud se někdy potkáme, tak si mě můžeš důkladně prohlédnout. BTW: Nezlepší se tím jen čitelnost, ale taky zapisovatelnost a celkově se snižuje opruz ohledně věcí, které musíš dělat a jsou přitom dokonale zbytečné.
Možná to zkusme otočit a říct, v čem jsou ty mezery výhodné. Já na to nepřišel.V tom že blok je definován odsazením a ne nějakým znakem, který si můžeš napsat kamkoliv, nebo zapomenout. Když koukneš na kód, tak prostě vidíš, zatímco všude jinde musíš studovat chlupaté závorky a beginy a endy a celou tuhle vatu kolem a běda jak jí někde zapomeneš, nebo jestli je ten po kom to upravuješ prase.
Viz napr. pythonosvska parodie na lambda funkce.No, já jsem googlil proč to tak je a údajně je to prostě proto, že Guido lambda funkce nepovažuje za dobrý nápad, který by se měl cpát všude. Osobně je ale používám docela často.
PARTITION (A, p, r) 1 x = A[r] 2 i = p - 1 3 for j = p to r - 1 4 if A[j] ≤ x 5 i = i + 1 6 exchange A[i] with A[j] 7 exchange A[i + 1] with A[r] 8 return i + 1Zvyk je zelezna kosile
V tom že blok je definován odsazením a ne nějakým znakem, který si můžeš napsat kamkoliv, nebo zapomenoutV jazycich kde blok je sam o sobe objekt je ale ukoncovaci symbol prakticka nutnost. Napr. nasledujici kod:
kolekce.reduce(init) {|elem|
...
}.permutation(n) { ... }.transpose
by se bez pouziti ukoncovaciho symbolu nesmyslne komplikoval a muselo by se obchazet vytvarenim pomocnych promenych nebo funkci.
U odsazovani v pythonu me jeste stve, a setkavam se s tim celkem casto, ze musim hledat k jakemu predchozimu kodu se aktualni radka vztahuje, pokud je clenity a dlouhy:
def rbt_search(...):
if podm1 or podm2:
...
if podm3 and not podm4:
...
if podm5:
...
elif podm6:
...
else:
# predchozi else: by mohlo byt klidne omylem zde a python nebude
# protestovat, ale program se bude chovat jinak
...
Ta fukce je dlouha treba na celou obrazovku a mezi podminkama je dost kodu. Sice muzu pouzit editor ktery podporuje sloupcovy kurzor, ale ne vsude je k dispozici tak nezbyva nez pocitat a porovnavat pocet odsazeni. To uz je lepsi proletnout explicitni endy a prinejhorsim na me zarve syntax checker ze neni blok uzavreny.
Ta fukce je dlouha treba na celou obrazovku a mezi podminkama je dost kodu.A napadlo te, ze by mohl byt problem v tom kodu samotnem a ne v jazyce?
V jazycich kde blok je sam o sobe objekt je ale ukoncovaci symbol prakticka nutnost.To je pravda. Python tohle explicitne nema, jeho primitivou jsou funkce, nikoli bloky. Tim se lisi napr. od Lispu a Ruby. Temer zcela jde o estetickou volbu, z praktickeho hlediska je to ekvivalentni.
musim hledat k jakemu predchozimu kodu se aktualni radka vztahuje, pokud je clenity a dlouhyMne prijde, ze tohle je problem u vsech jazyku? Jak ti presne pomaha jazyk, kde musis mit endy? Python v tomhle pomaha tim, ze takovy kod je kratsi (protoze se konce bloku nepisou na samostatny radek).
Treba ve vimu muzu pomoci % preskakovat z jedny zavorky na druhou.Pak se nabizi otazka, proc by neco takoveho nemohl umet i u Pythonu..
Naprogramovat to pro python by bylo podstatne slozitejsi (v podstate bys tam musel mit parser pythonu) a je to pouzitelny jen pro jeden jazyk.Python má v sobě parser pythonu (ast modul).
Temer zcela jde o estetickou volbu, z praktickeho hlediska je to ekvivalentni.Z praktickeho hlediska se to musi obchazet a zhorsit tim srozumitelnost kodu.
Jak ti presne pomaha jazyk, kde musis mit endy?Tim ze explicitne vyzaduje ukonceni bloku nemuze dojit k nejednoznacnosti u vyse uvedeneho prikladu. Parser na to upozorni, stejne tak na neukonceny blok. Pomaha proti zaludnycm chybam, ktere vzniknou omylem pri vetsim nebo mensim odsazeni.
Z praktickeho hlediska se to musi obchazet a zhorsit tim srozumitelnost kodu.Kde se to musi obchazet? Muzes dat konkretni priklad, kde jsou funkce problematicke? Jinak zavedenim jak funkci tak bloku se jazyk stane ponekud mene ortogonalni. Lisp to resi tak, ze defun je makro. Jazyky bez maker si tenhle luxus dovolit nemuzou.
Tim ze explicitne vyzaduje ukonceni bloku nemuze dojit k nejednoznacnosti u vyse uvedeneho prikladu.Nevim, jestli si spravne rozumime. Pokud chces napsat jen jedno else u dvou vnorenych podminek, bude to vzdycky nejednoznacne, s endy i bez endu. V podstate to co rikas je: S endem se musim ujistit na dvou mistech, zda jsem to napsal dobre, a tim spis to napisu dobre. Nicmene nic ti nebrani se 2x ujistit i v Pythonu. V obou pripadech ale kompilator kontroluje jen jeden zpusob - u Pythonu odsazeni, u jinych jazyku existenci endu. Navic, Python je optimalizovany pro cteni, na zaklade predstavy, ze kod cteme mnohokrat, ale piseme jen jednou.
Kde se to musi obchazet?Zkus si prepsat ten uvodni priklad do pythonu a uvidis. Pokud neznas ruby, tak bloky jsou vymezeny '{' a '}', nazvy metod jsou samovysvetlujici.
Nevim, jestli si spravne rozumime. Pokud chces napsat jen jedno else u dvou vnorenych podminek, bude to vzdycky nejednoznacne, s endy i bez endu.Vtip je v tom, ze kazda podminka musi mit uzavreny blok a pokud ho uzavru u te vnitrni, nemuze se mi stat ze by nasledujici kod do neho vstoupil a hlavne zacatek a konec bloku jsou parove a kdyz opomenu uzavrit tak to za me parser zkontroluje a vyhodi chybu. U pythonu takova kontrola chybi a nezamyslene ukonceni bloku chybnym odsazenim projde a program se pak chova chybne.
Zkus si prepsat ten uvodni priklad do pythonu a uvidis.Ja tomu prikladu rozumim, jen ho povazuji za hure citelny nez to, jak by se to napsalo v Pythonu (definovala by se vnitrni funkce).
U pythonu takova kontrola chybi a nezamyslene ukonceni bloku chybnym odsazenim projde a program se pak chova chybne.To je uplne stejny argument jako pro statickou typovou kontrolu. Ano, interpretr to "kontroluje", ale jen za cenu, ze to tam sam napises. Python se holt rozhodl, ze to lide psat navic nemusi, a muzou cas usetreny psanim "end" venovat tomu, aby si to po sobe lepe precetli.
Ja tomu prikladu rozumim, jen ho povazuji za hure citelny nez to, jak by se to napsalo v Pythonu (definovala by se vnitrni funkce).Jiste, zavede se nova promenna - funkce do ktere se ulozi obsah bloku a na tu se pak bude odkazovat. A pak jeste jedna a jeste jedna. Tak misto prirozeneho zapisu algoritmu cteneho zleva do prava budeme postupne volat krome knihovnich funkci jeste tri vlastni a odskakovat k jejich definicim, abychom vedeli co delaji. Tomu rikam lepsi citelnost. Bravo
Python se holt rozhodl, ze to lide psat navic nemusi, a muzou cas usetreny psanim "end" venovat tomu, aby si to po sobe lepe precetli.Lepe po sobe cist ! Ze me to hned nenapadlo
Například problémy s konverzemi unicode (ordinal not in range(128)
horor), ...
Odpověď zní Python 3. Ale je mi jasné, že tím začínají zase jiné problémy.
často procházím keys() nebo nový vytvořený list a něco s objekty dělám.Na to je snad právě iterátor určený a není potřeba kvůli tomu stavět seznam. Anebo si pod procházením představuješ něco jiného než já.
Vůbec mi nejde do hlavy koho napadlo, že teď musím každé procházení vylepšit o jeden list(obj...) navíc.Pokud při procházení zadáváš
list(d.keys())
, tak to zkus nahradit za d.keys()
a pochopíš.
an_iterator_object.__length_hint__()ale je to neportovatelny implementacni detail.
Iteratory umoznuji celou radu vnitrnich optimalizaci, takze pristup chapu.Já to taky chápu. Co nechápu je použití dementních iterátorů, které mě o možnosti připravují, místo aby mi nějaké daly. Přitom by stačilo přidat pár magických metod, které má každé pole. Iterátory ta data stejně k dispozici mají, jen bude trvat pár let, než to někomu dojde a s velkou slávou to začlení do pythonnu 3.6, nebo tak něco.
Pokud musite porad pretypovavat, videl bych to spise na problem jinde.Problém je ve vývojářích jazyka, kteří tohle všem nacpali do chřtánu a nedomysleli přitom, že by bylo hezké mít možnost si zvolit, jestli chci pole, nebo iterátor, jako to bylo v 2.7. Docela si dokážu představit, jak to probíhalo; "oni ty iterátory moc nepoužívají, přitom je to geniální, co jim je pro dobro věci nacpat všude a pro jistotu jim sebrat možnost zvolit si, jestli je chtějí, nebo ne? Celé to pak bude optimální & shit." Nechci působit jako nějaký hater - iterátory a generátory jsou geniální součást jazyka, jen mě pěkně vytáčí, když je cpou všude jen proto, že by to šlo, když mi to nedá žádnou novou možnost, naopak mi to spoustu možností sebere a jediné řešení je přetypování na list, čímž výkon ztrácím, místo abych ho získával. Je to předčasná optimalizace jak prase a ještě navíc "inteligentní" ve stylu pana sponky z Windows.
d.iterkeys()
d.keys()
mame:
d.keys()
list(d.keys()) nebo d.keys()[:]
Mne to druhe pripada lepsi (a vidis, ze to neni o tolik kratsi). Za prve, zbavis se te metody keys(), ktera vraci seznam. Dale, tim, ze explicitne volis, co chces, napr. muzes udelat set(d.items())
a dostat tak mnozinu. Vysledek je ortogonalnejsi API - dict podporuje vsechny enumerovatelne datove struktury stejne.
Za druhe, ono to trochu souvisi s filozofii Pythonu, "Explicit is better than implicit". Existuje myslim v navrhu Pythonu jedno nevyrcene pravidlo (ktere vyplyva take trochu z "There should be one obvious way to do it"), ktere zhruba rika, ze pokud lze nejakeho efektu dosahnout trivialni kombinaci dvou, mozna tri metod, nema smysl kvuli tomu do jazyka zavadet dalsi metodu. Protoze lide si zkratka tyhle nove metody nebudou pamatovat. Tohle pravidlo dost odlisuje Python od jinych jazyku (Perl, PHP, Common Lisp), ktere bezstarostne pridavaji dalsi metody jen proto, ze "lide tohle chteji casto delat" nebo "dava to logicky smysl".
A mne osobne tohle vyhovuje, protoze po pravde, daleko casteji pouzivam iteratory nez seznamy. Dela to program mene zavislym na objemu dat, co tecou skrz. A pokud te zajima nejaka vlastnost mnoziny dat vracene pres iterator, neni treba to hned prevadet na seznam - doporucuji se podivat na modul itertools.
for k in d.keys()
a ne for k in d.iterkeys()
, cimz zbytecne ztraceli vykon (podobne jako pouzivali range tam, kde staci xrange).
d.keys() list(d.keys()) nebo d.keys()[:]Až na to, že tohle imho musí projít iterátorem a vytvořit z něj nové pole. Což není ekvivalentní ani omylem.
Dale, tim, ze explicitne volis, co chces, napr. muzes udelat set(d.items()) a dostat tak mnozinu. Vysledek je ortogonalnejsi API - dict podporuje vsechny enumerovatelne datove struktury stejne.To jsem mohl udělat předtím taky, jen bych k tomu musel zavolat jinou metodu.
Tohle pravidlo dost odlisuje Python od jinych jazyku (Perl, PHP, Common Lisp), ktere bezstarostne pridavaji dalsi metody jen proto, ze "lide tohle chteji casto delat" nebo "dava to logicky smysl".S tím se dá skoro souhlasit, až na to, že tohle bylo v py2 dost dlouho a nic se nepřidává, ale ubírá. Dokonce to má za následek složitější portování kódu, který bude padat na tom, že najednou je z toho iterátor (true story).
Až na to, že tohle imho musí projít iterátorem a vytvořit z něj nové pole. Což není ekvivalentní ani omylem.Pak nechapu, v cem je tvuj problem. Jaky je tvuj use case pro pristup k tem prvkum jako k poli? Prijde mi, ze pokud pozadujes pristup do internich struktur dict (nebo cehokoliv jineho), rozbijis modularitu za ucelem optimalizace. Ne, ze by to bylo spatne, ale v takovem pripade asi udelas lepe, kdyz si zkonstruujes vlastni datovou strukturu, ktera se lepe hodi pro tvuj specificky problem.
S tím se dá skoro souhlasit, až na to, že tohle bylo v py2 dost dlouho a nic se nepřidává, ale ubírá.A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away. -- Antoine de Saint-Exupery
Jaky je tvuj use case pro pristup k tem prvkum jako k poli?Tak jednak je to testování na prázdnost, jak už jsem psal, pak zjištění počtu prvků. Když pracuješ s ordered dictem, tak se hodí mít například možnost zjistit index, který v něm daný prvek má (to jsem reálně použil například včera).
Prijde mi, ze pokud pozadujes pristup do internich struktur dict (nebo cehokoliv jineho), rozbijis modularitu za ucelem optimalizace. Ne, ze by to bylo spatne, ale v takovem pripade asi udelas lepe, kdyz si zkonstruujes vlastni datovou strukturu, ktera se lepe hodi pro tvuj specificky problem.Proč bych to dělal? Na pythonu je pěkné, že díky dynamickým polím, slovníkům a setům se tomuhle můžu ve většině případů vyhnout, než abych trávil půlku doby vynalézáním neoptimálních zabugovaných ekvivalentů běžných datových struktur.
A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away. -- Antoine de Saint-ExuperyJo, proto teď musíš přidat přetypování na list :].
Tak jednak je to testování na prázdnost, jak už jsem psal, pak zjištění počtu prvků.Pokud vim, standardni dict ma funkci len(), ktera ti pomuze zjistit oboji.
Když pracuješ s ordered dictem, tak se hodí mít například možnost zjistit index, který v něm daný prvek má (to jsem reálně použil například včera).Co se tyce usporadaneho slovniku, to jsem snad nikdy nepouzival. Ale prijde mi, ze si pak stezujes na neco jineho. Mozna by bylo uzitecne, aby usporadany slovnik mel metodu, ktera ten index vrati (i kdyz zase, troufam si trochu zpochybnit, k cemu by to mohlo byt dobre - napis co konkretne jsi delal). Ale to pak neni problem s dict API, protoze tam ten index nema vyznam, jelikoz je to hashtabulka.
Na pythonu je pěkné, že díky dynamickým polím, slovníkům a setům se tomuhle můžu ve většině případů vyhnout, než abych trávil půlku doby vynalézáním neoptimálních zabugovaných ekvivalentů běžných datových struktur.To si povime, az mi vysvetlis, k cemu potrebujes ten index.
To si povime, az mi vysvetlis, k cemu potrebujes ten index.Ordered dict používám jako lookup tabulku. Tohle je případ, kdy potřebuji prohodit pořadí dvou prvků v té tabulce. Ordered to musí být proto, že později jí celou serializuji do textu a záleží tam na pořadí, dict proto, že v ní hledám podle klíčů. Celý ten projekt sem časem hodím do vlastního blogpostu.![]()
Pokud vim, standardni dict ma funkci len(), ktera ti pomuze zjistit oboji.Pravda. V té implementaci pythonu kterou jsem použil to nešlo, ale když jsem to teď testoval v cpythonu, tak ano, takže to bude bug v interpretru brythonu.
Když pracuješ s ordered dictem, tak se hodí mít například možnost zjistit index, který v něm daný prvek má (to jsem reálně použil například včera).Pokud vím, tak je to vcelku nová datová struktura, která tak nějak kombinuje vlastnosti seznamu a slovníku. Nejspíš nemá smysl nadávat na Python 3 jako takový, ale soustředit se na absenci obdoby
.index()
u OrderedDict nebo ItemsView.
Jo, proto teď musíš přidat přetypování na list :].No to je toho. Kvůli absenci
.index
někde jednou necháš vylistovat slovník a pokud nepočítáš s velkými daty, jednoduše uděláš list(d).index(key)
nebo list(d.values()).index(key)
, popřípadě dokopeš pythonisty, ať .index()
vyspecifikují a přidají a kvůli zpětné kompatibilitě pak dáš do kódu něco ve smyslu...
if not hasattr(collections.OrderedDict, "index"): collections.OrderedDict.index = lambda self, key: list(self).index(key)
No to je toho. Kvůli absenci .index někde jednou necháš vylistovat slovník a pokud nepočítáš s velkými daty, jednoduše uděláš list(d).index(key) nebo list(d.values()).index(key), popřípadě dokopeš pythonisty, ať .index() vyspecifikují a přidají a kvůli zpětné kompatibilitě pak dáš do kódu něco ve smyslu...To moc nepatří k věcem, které bych chtěl do smrti držet v paměti.if not hasattr(collections.OrderedDict, "index"): collections.OrderedDict.index = lambda self, key: list(self).index(key)
To moc nepatří k věcem, které bych chtěl do smrti držet v paměti.Ty se chystáš držet zpětnou kompatibilitu až do smrti?
filter()
tam, kde chci dostat jen jeden prvek a z vráceného iterátoru mám opravdu negativní radost.
first,* = filter(d.keys(), op)
first, *rest = 1,2,3,4,5
next(filter(...))
Dost často používám filter()
tam, kde chci dostat jen jeden prvek
next(filter(...))
> a = {1:2}.keys() > next(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'dict_keys' object is not an iterator
next(iter(a))ale ted to nemohu otestovat ...
Samozrejme, protoze jsi v Pythonu 2 - musis pouzit iterkeys().Ne, nejsem.
TypeError: 'dict_keys' object is not an iterator
; v pythonu 2 to nevrací dict_keys, ale pole a to je trochu jiný error :)
<<< a = {1:2}.keys() <<< next(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: list object is not an iterator
next(iter(d)) next(iter(d.keys()))
next()
, potřebuješ iterátor, nikoliv pole nebo view. Pokud chceš seznam, je lepší použít list()
. To všechno je podle mě v pořádku. Proč nemají ty views list API, to mi ale úplně jasné není, nechtěl bys jim poslat dotaz?
Proč nemají ty views list API, to mi ale úplně jasné není, nechtěl bys jim poslat dotaz?Komu? Nemám úplně náladu vést anglické konverzace s vývojáři.
Proč nemají ty views list API, to mi ale úplně jasné není, nechtěl bys jim poslat dotaz?Duvod by mohl byt, ze oni jsou z hlediska uzivatele immutable, ale mohou se dynamicky menit pokud se zmeni odkazovany dictionary objekt, coz je jine chovani, ktere muze mit mnou ted nedomyslene dopady.
/* TODO(guido): The views objects are not complete: * support more set operations * support arbitrary mappings? - either these should be static or exported in dictobject.h - if public then they should probably be in builtins */
bool()
vracel, zda jsme na konci, tak to už jde mimo generátorové API a vyžaduje to být o krok napřed. Je fakt, že u iterátorů nad seznamy by to smysl dávalo.
d.keys()[:]Explicit is better than implicit - The Zen of Python
list.copy()
nadbytečné, když lze použít list()
.
Ja to pouzivam, je to kratsi nez copy(). Nevidim na tom nic implicitniho.Jednak jsou pouzity implicitni pocatecni a koncovy index slice a hlavne se explicitni vytvoreni seznamu konstruktorem maskuje vytvarenim vysece ze vsech prvku.
Aby toho nebylo malo ten priklad se slice mi v Pythonu 3.4 ani nechodi: {}.keys()[:]
hodi TypeError: 'dict_keys' object is not subscriptable
Jo, na to jsme tady uz narazili, ze keys() nevraci primo iterator.Ani seznam, který by byl v tomto případě vyžadován.
Myslel jsem, ze se chova jako iterkeys() v Pythonu 2.A on se přitom chová jako
viewkeys()
(nebo spíše viewkeys()
je jeho název v pozdějších verzích dvojky). Proč to nejde indexovat ale docela chápu, vzhledem k tomu, že pořadí u slovníku nedává smysl. Proč to nejde indexovat u OrderedDict
už je jiná věc. On ani není důvod, aby to byl iterátor, hlavně když je to iterable.
On ani není důvod, aby to byl iterátor, hlavně když je to iterable.Spis jaky je duvod k tomu, aby to iterator nebyl? Prijde mi, ze to nemuze nicemu uskodit.
Spis jaky je duvod k tomu, aby to iterator nebyl? Prijde mi, ze to nemuze nicemu uskodit.Takto je
d.keys()
objekt svázaný s d
, který dává API k přístupu ke klíčům slovníku. Nechová se jako seznam, protože klíče nemají dané pořadí. Chová se spíše blíže množině. Ale narozdíl od iterátoru se nevyčerpá a dá se používat opakovaně. Iterátory a iterovatelné objekty je potřeba striktně rozlišovat, až na pár výjimek, mezi které patří iterátory samotné a různé generátory na jedno použití.
>>> d = {x**2: x for x in range(10)} >>> keys = d.keys() >>> list(keys) [0, 1, 4, 49, 16, 25, 64, 9, 81, 36] >>> list(keys) [0, 1, 4, 49, 16, 25, 64, 9, 81, 36]Pokud by
keys()
a values()
byly iterátory, tak by takto nefungovalo. Už takto si lidé stěžují na změněné chování oproti seznamům, ale seznam klíčů slovníku skutečně pořadí nemá.
>>> keys = iter(d.keys()) >>> list(keys) [0, 1, 4, 49, 16, 25, 64, 9, 81, 36] >>> list(keys) []
vymysleli novou vec (view), ktera neni ani iterator, ani list.Ale to je podle mě úplně mylný pohled, view podle mě nemá vůbec znamenat konkrétní datovou strukturu ale obecné slovo, tak jak se v programování (a třeba v databázích) používá. Někdy se tomu taky říká proxy nebo proxy object. Podle mě je to navrženo správně: 1) Nemá to být seznam ani se to chovat jako seznam, protože na pořadí klíčů nezáleží. 2) Nemá to být množina, aby nebylo nutné ji vždy konstruovat, ale má se to jako množina navenek chovat, proto i to TODO. 3) Určitě to nemá být iterátor, protože pak by se to nechovalo jako kolekce. Seznam, množina a jiné kolekce taky nejsou iterátory. Jasně, mohlo by se prostě zadefinovat, že ty metody iterátory vracet budou, ale to mi přijde jako hrozná prasárna. Na příkladu jsem jen ukazoval, že kolekce a iterátor mají skutečně odlišné chování.
má se to jako množina navenek chovatOK, dejme tomu. To ale porad neodpovida na otazku, k cemu je to dobre, a uz vubec ne, zda je to dobre rozhodnuti. Konkretne, bude ta pseudo-mnozina mutable? Predpokladam, ze ne (v opacnem pripade to dava dalsi otazky ohledne semantiky). V takovem pripade ovsem nevidim moc vyhod oproti konstrukci mnoziny z iteratoru. Ano, dokazu si predstavit, ze nektere algoritmy (treba prunik klicu dvou slovniku) budou mirne rychlejsi. Ale mam dost pochybnost, ze to vyvazi tu nevyhodu s tim psat vsude iter() navic. Myslim, ze by bylo uzitecnejsi dat takovy algoritmus mimo slovnik, a udelat z keys() regulerni iterator.
.keys()
, .values()
a .items()
nevrací seznam, množinu ani iterátor, ale dynamický read-only pohled na množinu klíčů, hodnot nebo jejich dvojic. Z tvého zápisu mi ani není jasné, se kterými body přesně nesouhlasíš a proč, ani jaké řešení je podle tebe lepší a proč.
Ale mam dost pochybnost, ze to vyvazi tu nevyhodu s tim psat vsude iter() navic.Mám takové podezření, že jsem viděl víckrát
iter()
v této diskuzi než ve skutečném kódu.
Podle me by bylo nejlepsi, kdyby proste d.keys() v Pythonu 3 vracelo primo iterator.A ted vam vraci view, ktere reflektuje dynamicky zmeny v pameti, vcetne poradi a v pripade potreby si z nej muzete udelat iterator ci list.
Ano, to chapu, a na prvni pohled to vypada uzitecne.I na druhy.
a seznam klicu se me pri tom nenapadne meni...Pak si tedy vytvorte list nebo set. Vyhodu vidim treba v tomto:
if dict1.keys() == dict2.keys(): ...pripadne i jine operace. Nebo ciste z duvodu efektivity:
dv = dict.items() for x, y in dv: ... for x, y in dv: ... for x, y in dv: ... fs = set(dict.keys()) ... if fs == dict.keys(): ...Tyto operace s vyjimkou vytvoreni setu jsou asi rychle - vytvari se maly objekt a prinasi to IMHO mene problemu v asynchronnim ci multithreadovem prostredi nez iteratory se stavem ci kopie v listech.
Idea dynamic view jako set mi prijde lepsi - muzete provadet operace prunik, sjednoceni, testovat bezpecne existenci snapshotu klicu i kdyz se puvodni objekt zmenil.Ano, to chapu, a na prvni pohled to vypada uzitecne. Ale proc si proste nemuzu, ve chvili, kdy chci provest tu operaci treba pruniku, pozadat o aktualni iterator nad tim slovnikem? Proc to nestaci? Proste fakt nevidim ten use case - zkus schvalne nejaky vymyslet. Dokazal bych si predstavit, ze by bylo uzitecne, kdyby treba i ten prunik byl dynamicky view. Ale jak to chapu, tak v momente, kdy udelas treba prunik, ti stejne vznikne kopie, ktera se uz k puvodnim objektum vazat nebude. Proste porad se snazim prijit na to, k cemu je ta "dynamicnost" toho view dobra?
.keys()
u pythoních slovníků začala vracet iterátor. Pak bys to tedy měl podle svých vlastních slov měl umět zdůvodnit.
Ale konecne, po deseti prispevcich, z tebe vypadlo neco rozumneho.K čemu další zbytečná urážka?
Protoze se celou dobu tvaris, jako by to byla ocividna vec.Tak pavlix vam dal tri koncepcni duvody proc je pristup korektni.
ktery je ale i tak diskutabilniVyborne, proc?
if dictionary.keys() & {'key1', 'key2', 'key3'}: ...Jak byste to udelal lepe?
Pokud potrebujete iterator nebo list se souvisejicim overheadem a limitacemi - uvazujte o dictionaries s tisici zaznami - tak si je explicitne vytvorite, jedno nebo druhe, no biggie.Biggie je, že to kurví kompatibilitu a přináší teoretickou úsporu čehosi ne úplně definovaného, kterou se to snaží vecpat každému, i když o ní vůbec nemá zájem. Py2 je v tomhle funkcionálně nadřazen py3, protože má metody které vrací jak iterátor, tak pole, kdežto py3 vrací jen tuhle ošklivku a ještě se to snaží prezentovat jako výhodu.
kurvi kompatibilitu a přináší teoretickou úsporu čehosi ne úplně definovaného, kterou se to snaží vecpat každému, i když o ní vůbec nemá zájem.Python 3 je nova revize jazyka Python a zmeny nejsou kompatibilni s prechozi radou. Python 3 je IMHO celkove lepe navrzen a takovehle procisteni jazyka jednou za par let neni na skodu. U noveho kodu neni problem a pokud 2to3 migracni tool umi +/- prevest stary kod, neni v podstate co resit, zejmena kdyz obe verze jsou dlouho soubezne podporovane.
ještě se to snaží prezentovat jako výhodu.Ona to je vyhoda. Vytvoreni velkeho pole neni levna zalezitost a s iteratorem nemuzete delat plno veci, navic se zjednodusi iterface.
Py2 je v tomhle funkcionálně nadřazen py3Neni, jen se nektere veci delaji jinak.
dictionary.keys() <-> list(dictionary.keys()) dictionary.iterkeys() <-> iter(dictionary.keys())
Python 3 je IMHO celkove lepe navrzen a takovehle procisteni jazyka jednou za par let neni na skodu.Já si tím pomalu přestávám být jistý a čím dál víc mi přijde, že tohle splitnutí komunity za to nestálo.
U noveho kodu neni problem a pokud 2to3 migracni tool umi +/- prevest stary kod, neni v podstate co resit, zejmena kdyz obe verze jsou dlouho soubezne podporovaneJo, ale 2to3 nepřevede mozky programátorů, speciálně ne v těhle případech, kdy se něco co perfektně fungovalo zákeřně změní.
Ona to je vyhoda. Vytvoreni velkeho pole neni levna zalezitost a s iteratorem nemuzete delat plno veci, navic se zjednodusi iterface.Čtu: Je to výhoda pro tebe, v některých pro mě okrajových případech.
Znovu, v cem je problem explicitniho vytvoreni listu nebo iteratoru, v okamziku kdy set nestaci?Je to otrava. S tímhle přístupem by se rovnou mohlo používat C API, protože to přece bude efektivnější.
splitnutí komunity za to nestáloSplitnuti komunity? Jake? Na Python 3 se roky hledal konsensus, nasel se a bylo jasne receno, ze to je budoucnost.
Jo, ale 2to3 nepřevede mozky programátorů, speciálně ne v těhle případech, kdy se něco co perfektně fungovalo zákeřně změní.(a) Co je na dokumentovane zmene zakerne? (b) Prechod na Python 3 probiha vice nez patym rokem - s tim by nemel mit problem zadny mozek - proboha, kolik let bude jeste potreba zmenit nektere navyky? Tech par skutecne nekompatibilnich veci je otazka studia jednoho vikendu.
Čtu: Je to výhoda pro tebe, v některých pro mě okrajových případech.Pokud to nekde potrebujete skutecne casto, neni lepsi se zamyslet na architekturou/designem aplikace a vytvorit vlastni class/funkci, ktera problemy nejak genericky resi, i kdyby se mely pouzivat decorators/metaclasses a podobne "dirty" techniky?
Splitnuti komunity? Jake? Na Python 3 se roky hledal konsensus, nasel se a bylo jasne receno, ze to je budoucnost.Viz reddit rage z poslední doby. Že někdo něco jasně řekl ještě neznamená, že se to stane/stalo.
Co je na dokumentovane zmene zakerne?Že je to zcela nečekané, podle mě i nesmyslné a zbytečné. Něco co skvěle fungovalo a vracelo triviální interní datovou strukturu teď vrací cosi co prakticky nikam nepasuje a musí se to konvertovat, aby to bylo co k čemu. Je to složitost, která podle mě nemá své opodstatnění. Vůbec se mi nelíbí, že půlka v py2 triviálních funkcí najednou vrací vlastní a od sebe navzájem různě odlišné objekty s různým API, místo polí, tuplů a setů.
Prechod na Python 3 probiha vice nez patym rokem - s tim by nemel mit problem zadny mozek - proboha, kolik let bude jeste potreba zmenit nektere navyky?No a přesto i po pěti letech je majorita projektů a troufám si tvrdit i programátorů pořád na 2.7. V podstatě kdybych k tomu nebyl nucený, tak mě ani nenapadne psát to v py3 a hádám, že nejsem jediný.
Pokud to nekde potrebujete skutecne casto, neni lepsi se zamyslet na architekturou/designem aplikace a vytvorit vlastni class/funkci, ktera problemy nejak genericky resi, i kdyby se mely pouzivat decorators/metaclasses a podobne "dirty" techniky?A pak tím zaplevelovat všechny svoje projekty, specifikovat to jako externí závislost, abych opravil jednu z nejpoužívanějších interních datových struktur. Do toho se mi ani moc nechce.
Viz reddit rage z poslední doby.Jako pri kazde zmene.
Že někdo něco jasně řekl ještě neznamená, že se to stane/stalo.Alespon vidite, ze vyvojari Python drzi sve slovo.
a musí se to konvertovat, aby to bylo co k čemu.Pouzitelne je to v rade pripadu i bez konverze.
odlišné objekty s různým API, místo polí, tuplů a setůSmeruje to k set-u a vnitrni implemtace je diametralne jina.
No a přesto i po pěti letech je majorita projektů a troufám si tvrdit i programátorů pořád na 2.7.(a) to je v kontradikci s tvrzenim, ze nekdo nekoho nuti, stejne jako dlouha podpora Python2 (2020+). (b) minimalne podle poctu stazeni zacina mit Python3 navrch (tusim od 3.3) - kdyz ho uvedli mluvili o peti letech a to celkem sedlo.
kdybych k tomu nebyl nucenýPokud je to rozhodnuti vaseho zamestnavatele, placete na spatnem hrobe.
abych opravil jednu z nejpoužívanějších interních datových strukturNic neni treba opravovat, je treba to dodelat. Opravit musite programovaci navyky, ale to se tyka pripadu kazde revize jazyka.
if any(( k in dictionary for k in {'key1','key2','key3'} )):
...
iter()
ci list()
jen kosmeticka zmena.
To neni IMHO to "lepe".Proc? Muj nazor je, ze je to s tim v podstate srovnatelne, a tudiz si ten tvuj priklad nezaslouzi mit specialni metodu v dict().
Myslim, ze uz jsem svoji pozici v teto diskusi vysvetlil dostatecne.Myslite "I tak se mi to rozhodnuti ale moc nelibi."? To jsme s Pavlixem nabidli padnejsi argumenty.
Vlastne i ten priklad s tou rovnosti se da myslim udelat lepe zpusobem, jaky jsem naznacil.Tam uz by pripadna uspora nebyla vyrazna a sla by na ukor prehlednosti. V podstate byste rikal, ze set-y a mnozinove operace jsou k nicemu a vse udelam same lepe treba pres generatory.
kdyby mnozinove operace umely efektivne pracovat s mnozinou a iteratorem.Ale oni umi. Jak spravne poznamenal Pavlix, ekvivalentni metody setu, narozdil od operatoru, akceptuji iteratory. U operatoru v podminkach se muze zkusit spolehat na zkracene vyhodnocovani, ktere python dela, ale ktere nemusi IMHO vzdy pracovat spolehlive. U generators/comprehensions zadna rozumna optimalizace neni a je to na programatorovi.
a ty view by nebyly vubec potreba.View je ve sve podstate koncepcne jiny typ.
To jsme s Pavlixem nabidli padnejsi argumenty.Nepovazuji ten vas zpusob pouziti za neco prilis casteho. A uz vubec to neadresuje moji namitku ohledne items() a values(). Pokud bys neco takoveho delal casto, a chtel to rychleji, muzes si napsat helper. Sam jsi videl, ze tvoje "mnozinova" implementace byla pomalejsi. To neni neobvykla situace.
Ale oni umi. Jak spravne poznamenal Pavlix, ekvivalentni metody setu, narozdil od operatoru, akceptuji iteratory.Tim spis je to argument proti. Navic nevidim duvod, proc nemit mnozinove operatory primo nad slovniky. To by IMHO casto bylo uzitecnejsi.
View je ve sve podstate koncepcne jiny typ.Ano, a proto jsem proti. Jsem proti tomu, aby Python obsahoval zbytecne mnoho ruznych typu, vymenou za zrychleni v marginalnim poctu pripadu. Je na to obecne tlak, ale myslim si, ze ten jazyk dela spravne, ze tomu odolava. Proste, neni to idealni navrh. Ale myslete si co chcete, uz se o tom nechci prit.
Ano, a proto jsem proti. Jsem proti tomu, aby Python obsahoval zbytecne mnoho ruznych typu, vymenou za zrychleni v marginalnim poctu pripadu.To mi prijde jako nejpadnejsi argument proti. Ne skutecnost, ze nekdy musim pouzit
iter()
ci list()
. Pokud ten koncept nedopracuji, nedodelaji vsechny set operace a nebude to vice nez tupa proxy do dictionary, bez moznosti vytvoreni instance, asi to nema skutecne smysl. Podle TODO v kodu a diskuzi okolo to vedi, cas ukaze, co z toho nakonec bude.
ale ta moje implementace bude mirne rychlejsi,To je fakt, zejmena pro velke sety, i kdyz python ma optimalizaci empty set()/list()/dict() v podminkach. Jenze tady mate i dalsi set-ove operace, ktere potom maji trivialni notaci a zacne se to zejmena projevovat az zacnete pracovat s vice dictionaries - i kdyz tyhle operace ted nejsou optimalizovane.
>>> d = {'a': 'z', 's': 'x', 'd': 'c', 'f': 'v'} >>> s = {"key1", "key2", "key3"} >>> not d.keys().isdisjoint(s) FalsePřičemž argumentem
.isdisjoint()
je libovolný iterable.
#1 {x for x in set1 | set2 if (x not in set1) or (x not in set2)} #2 set1.symmetric_difference(set2) #3 set1 ^ set2Z duvodu prehlednosti bych opet volil to posledni. Tohle presne duvod, proc si myslim, ze dictview jako set neni az takova tragedie.
proč okolo toho nebylo víc humbuku.Humbuk okolo toho nebyl a neni to dodelane, nebot to neni zasadni problem.
Nebylo by proste lepsi delat ty operace primo na tech slovnicich, s tim, ze se rovnou i zachovaji ty hodnoty?To jako ze by dictionary mela navic interface set-u? Byl bych proti.
Jinak zase to lze nejspis prepsat lepe - kdyz prvek nenajdes v te prvni mnozine, uz ho nemusis hledat v te druhe..Huh, znova - Python pouziva zkracene vyhodnocovani, pokud se najde v prvni mnozine, v druhe se nehleda a interne provadeji dalsi kupu optimalizaci, takze to neni tak tragicke, aby se tupe iterovalo pres vse pokud to neni nutne.
Zase když je potřeba (někde uvnitř smyčky), může to mít smysl:
$ python2 -m timeit -n 1000000 -r 3 -s 'from copy import copy; baz = range(10)' 'bar = copy(baz)'
1000000 loops, best of 3: 0.802 usec per loop
$ python2 -m timeit -n 1000000 -r 3 -s 'baz = range(10)' 'bar = list(baz)'
1000000 loops, best of 3: 0.245 usec per loop
$ python2 -m timeit -n 1000000 -r 3 -s 'baz = range(10)' 'bar = baz[:]'
1000000 loops, best of 3: 0.104 usec per loop
$ python3 -m timeit -n 1000000 -r 3 -s 'from copy import copy; baz = range(10)' 'bar = copy(baz)'
1000000 loops, best of 3: 0.558 usec per loop
$ python3 -m timeit -n 1000000 -r 3 -s 'baz = range(10)' 'bar = list(baz)'
1000000 loops, best of 3: 0.432 usec per loop
$ python3 -m timeit -n 1000000 -r 3 -s 'baz = range(10)' 'bar = baz[:]'
1000000 loops, best of 3: 0.355 usec per loop
Mě zrovna dneska python3 naštval tím vracením iterátorů ze všeho možného.Narozdíl od Pythonu 2 to dělá vcelku konzistentně, takže zpravidla víš, co máš čekat. Jak sám píšeš dál, není problém to vylistovat, když potřebuješ.
Takhle mám na každém druhém řádku přetypovávání zpět na listTo se mi děje jen v interaktivním Pythonu, kde si potřebuju výsledky vylistovat, abych na ně viděl. Ve skriptech používám vylistování jen tam, kde seznam potřebuju.
protože autory asi nenapadloMožná autory nenapadlo, že si vývojáři potřebujou nutně komplikovat život.
map/filterMáš nějaký důvod používat map/filter místo comprehentions?
comprehensionsComprehensions v hranatých závorkách vrací seznam.
>>> [a**2 for a in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
.keys()U klasických slovníků vylistování vrací seznam klíčů a neprázdnost lze kontrolovat přímo.
>>> d = {a: a**2 for a in range(10)} >>> list(d) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> bool(d) True
Vzhledem k tomu jak často to musím přetypovávat mi to přijde nehorázně otravné.
Show me the code!
>>> bool(d) TrueHezke!
Máš nějaký důvod používat map/filter místo comprehentions?Přijde mi to přirozenější a podstatně čitelnější. U comprehentions vždy do příště zapomenu, jak udělat filter.
U klasických slovníků vylistování vrací seznam klíčů a neprázdnost lze kontrolovat přímo.Tohle mě třeba trochu děsí:
>>> a = map(lambda x: x, []) >>> list(a) [] >>> bool(a) True >>> d = {a for a in []} >>> list(d) [] >>> bool(d) FalseChápu, že to druhé vytváří set, ale stejně mi není jasné, proč bool nad prázdným setem funguje a nad polem ne.
Show me the code!Bude časem blogpost, až to dodělám (což by mohlo být brzo).
Chápu, že to druhé vytváří set, ale stejně mi není jasné, proč bool nad prázdným setem funguje a nad polem ne.Protoze to prvni je iterator, a ne pole? A na nem se bool() chova jinak? Prazdnost iteratoru totiz nejde zjistit nedestruktivne.
No, celé mi to ale přijde silně matoucí pro přecházející programátory.To, ze ma Python dynamicke typy, tudiz se nezapisuji do zdrojaku, neznamena, ze nemusis vedet, co ma kde jaky typ. Beztak, to co chces delat je patrne
bool(d)
a nikoli bool(d.keys())
.
To, ze ma Python dynamicke typy, tudiz se nezapisuji do zdrojaku, neznamena, ze nemusis vedet, co ma kde jaky typ.Tak to já samozřejmě chápu. Problém je, pokud mám v hlavě udržovat dvě verze, které se v detailech chovají jinak, ale jinak jsou prakticky totožné. Na to moc nemám ani čas, ani náladu a akorát mi to zvedá level frustrace, který byl do téhle doby v pythonu úplně nejnižší.
Beztak, to co chces delat je patrne+1 Mimochodem bojí funguje a dává stejné výsledky.bool(d)
a nikolibool(d.keys())
.
No, celé mi to ale přijde silně matoucí pro přecházející programátory.Mně přišel Python 2 matoucí mnohem víc, takže tam vidím to celkové zlepšení.
Zde by bylo imho naprosto logické, kdyby si bool() z toho udělal list.Jakože by
bool()
při absenci .__bool__()
používal list()
a zkoušel přes objekty iterovat? To se mi nezdá jako dobrý nápad. To už je snad lepší naučit programátory si to vylistovat.
Jakože by bool() při absenci .__bool__() používal list() a zkoušel přes objekty iterovat? To se mi nezdá jako dobrý nápad. To už je snad lepší naučit programátory si to vylistovat.Tohle ti v podstatě brání používat jeden idiom, který říká, že nemáš používat
if len(pole) > 0:
, ale if pole:
.
g=(i for i in range(10))
bool(g) # True
list(g) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list(g) # []
next(g) # StopIteration exception
bool(g) # True (!?)
Jestli to chapu dobre, tak objekty tridy generator jsou vzdycky True a nema nad nima smysl volat fci bool(). Test na prazdnou kolekci nejde teda provadet jako u seznamu, slovniku nebo n-tice, kde [], {}, () jsou vsechny False.
Podle me ten idiom podminky if generator_exhausted:
pada a bud se musi z ni ten seznam stejne vytvorit nebo se musi iteracne projit.
class peekiter: def __init__(self, iterable): self.iterator = iter(iterable) self.queue = [] def __iter__(self): return self def __next__(self, *args, **kwargs): if self.queue: return self.queue.pop(0) return next(self.iterator, *args, **kwargs) def peek(self): item = next(self.iterator) self.queue.append(item) return item
A mimochodem - tady ti iter() taky vraci primo ten objekt, a nikoli kopii.Souvislost?
def create_generator():
while podminka:
res = calculate()
yield res
my_gen = create_generator()
type(my_gen) # <class 'generator'>
# logicky nic nebude vedet o metode peek
my_gen.peek() # AttributeError: 'generator' object has no attribute 'peek'
Jak donutim, aby mi nize uvedena funkce vytvorila instanci tve tridy peekiter misto standardni generator ?Viz. dole, decorator.
peekiter()
použít nad jakýmkoli iterátorem/generátorem. Než začneš kritizovat, je dobré zkusit použít hlavu.
my_gen = peekiter(create_generator())
yield
vracela ten vas generator misto vychoziho.
Stacilo mi potvrdit, ze to nejde, ze je ta trida pro yield natvrdo zadratovana v jazyce a nelze ji zmenit.
Misto jedne instance generatoru musite vytvaret dve.Jasne jsem psal, ze me zajima jak donutit generatorovou funkci aby pomoci yield vracela ten vas generator misto vychoziho.Psal jsem, jak docílit požadované funkcionality, sračky neřeším.
Stacilo mi potvrdit, ze to nejde, ze je ta trida pro yield natvrdo zadratovana v jazyce a nelze ji zmenit.Jednak jsem to považoval za samozřejmé, jednak to vůbec není potřeba.
Jednak jsem to považoval za samozřejmé, jednak to vůbec není potřeba.Misto aby to slo udelat primo, a nevidim jediny duvod co tomu brani, tak se musi provadet dve inicializace a udrzovat dve instance misto jedne.
Asi mame kazdy jine predstavy o efektivite a co je potreba. K racionalizaci obchazeni omezeni se ale neuchyluju.
a nevidim jediny duvod co tomu braniZa to ovšem nemůžu nést zodpovědnost. Ale jsem rád, že se ode mě u každé implementace iterátoru neočekává, že budu implementovat ještě peek cache.
p=peekiter(iterator)
a bude se to chovat jako normalni iterator, a navic to bude umet ten peek().
Test na prazdnou kolekci nejde teda provadet jako u seznamu, slovniku nebo n-tice, kde [], {}, () jsou vsechny False.Kolekce samotna nemusi byt iterator. Staci, kdyz implementuje __iter__(). Aby se chovala jako zabudovane kolekce, muze naimplementovat __bool__() tak, aby vracel False, pokud je prazdna.
Pak ale nechapu souvislost bool API s idiomem na test (ne)prazdne kolekce.Idiom na test (ne)prázdné kolekce není nic jiného než konverze na
bool
u objektu, který to podporuje.
Vim ze generator neni kolekce ale hodnoty ziskavane z generatoru kolekci tvori.Nemusi nutne, vzdyt jsi to sam psal.
ve smyslu datové struktury udržující množství hodnotNevkladejte mi do ust co jsem nikdy nerekl. Diky.
.__next__()
. Aby byly iterátory zároveň iterovatelné, ještě definují metodu .__iter__()
, která vrací ten stejný iterátor. Pokud někdo chce iterátor s pamětí, .peek()
a případně i .__bool__()
(a vyřešit kolize mezi nimi), je to věc na pár řádků a může ji použít kdykoliv potřebuje mít tyto metody k dispozici.
Nevidím jediný důvod vyžadovat něco takového od implementátorů iterátorů a ani nevidím důvod, aby to uměly pythoní generátory. Od toho lze v pythonu všechno používat jako objekt s určitým API, aby si člověk mohl nástroje podle potřeby pospojovat.
Přikládám naivní implementaci obalovacího iterátoru s podporou nezávisle volaných .peek()
a bool()
, public domain.
class peekiter: def __init__(self, iterable): self._iterator = iter(iterable) self._bool_queue = [] self._peek_queue = [] def __iter__(self): return self def __next__(self, *args, **kwargs): if self._bool_queue: return self._bool_queue.pop(0) if self._peek_queue: return self._peek_queue.pop(0) return next(self._iterator, *args, **kwargs) def __bool__(self): if self._bool_queue or self._peek_queue: return True try: self._bool_queue.append(next(self._iterator)) return True except StopIteration: return False def peek(self): if self._bool_queue: item = self._bool_queue.pop(0) else: item = next(self._iterator) self._peek_queue.append(item) return item
On si asi clovek zvykne na vsechno vcetne dopisovani funkcionality, ktera je jinde out-of-the-box jako Enumerator z ruby.
>>> for i, v in enumerate('asdf'): ... print(i, v) ... 0 a 1 s 2 d 3 f
Dalsi vec ze takove naivni implementace muzou byt radove pomalejsi nez kdyby byly soucasti standardni knihovny a napsane v C.Nic ti nebrání přepsat to do C.
Ani trida enumerate z vaseho prikladu ktery je uplne mimo, obdobu teto metody nema.
Daval jsem odkaz na dokumentaci k cele tride generatoru v ruby, kde je mj. definovana metoda #peek kterou se tu snazite implementovat v pythonu.Popravdě se o nic nesnažím. Poslal jsem dvě různé implementace iterátoru s metodou
.peek()
, druhá navíc uměla bool()
. Ty implementace se mi zdají zcela v pořádku a podle mě by se klidně něco takového mohlo stát součástí standardní knihovny a pomoct těm, kteří něco takového potřebují. Samozřejmě si to může kdokoli vylepšit či zoptimalizovat, když bude chtít.
Ani trida enumerate z vaseho prikladu ktery je uplne mimoK tomu už jsem se vyjádřil výše. Něco z toho kódu mi připomínalo use case pro enumerate, ale jinak je ta dokumentace z mého pohledu značně nepřehledná a není z ní na první pohled jasné, k čemu ta věc je. Prakticky všechny příklady, co tam byly vypadaly jako use case pro běžný for cyklus.
peek → object Returns the next object in the enumerator, but doesn’t move the internal position forward. If the position is already at the end, StopIteration is raised.Kod Ruby se mi zda ve srovnani s Python pekny binec, a s ohledem na i diskuzi zde - oni pouzivaji i ve vyse uvedenem souboru mezery a i taby pro formatovani, takze kdyz si nastavite ve vim
set tabstop=2
cele se to rozpadne, coz situaci je ilustruje.
a s ohledem na i diskuzi zde - oni pouzivaji i ve vyse uvedenem souboru mezery a i tabyMichate hrusky s jablkama. Rec byla o formatovani jako soucasti syntaxe jazyka, nikoli o zdrojaku ext. knihovny. Jo michaji tam taby s mezerama, ale maximalne se "rozpadne" formatovani kdyz si tab zmensite, ale na funkcnost to nema vliv a normalne se prelozi. Na rozdil od pythonu.
Rec byla o formatovani jako soucasti syntaxe jazyka,Kouknete se nahoru, resila se tu i IDE, taby a coding standards.
nikoli o zdrojaku ext. knihovny.enumerator.c je soucasti Ruby a stejne problemy jsou i jinde.
ale na funkcnost to nema vliv a normalne se prelozi.Ilustruje to stav kodu Ruby - chapu ze s takovym pristupem k mezeram a tabum je Python neprekonatelny problem
enumerator.c je soucasti Ruby a stejne problemy jsou i jinde.Zdojak te C knihovny ale nema zadnou souvislost s tim jak se pise v ruby, ktere ji pouzije.
Ilustruje to stav kodu Ruby - chapu ze s takovym pristupem k mezeram a tabum je Python neprekonatelny problemIlustrace otresneho stavu kodu v Pythonu:
find Python-3.4.1 -name '*.c' -or -name "*.h"|xargs grep -lP "^\t"|xargs egrep -l "^ "|wc -l
210
Namatkou:
callbacks.c
_datetimemodule.c
Hruza, co ? Vyvojari pythonu si s michanim tabu a mezer moc hlavu nelamou. Ale to jste si mohl sam overit, nez sem neco napisete.
Namatkou: callbacks.c _datetimemodule.c210? Tak to je jeste dobre, evidentne release prochazi nejakym QA, normalne je to horsi. Kouknete se na screenshot souboru o kterych jsme tady mluvili a pochopite rozdil, mne to trochu zaskocilo a hadam, ze release kod snad bude lepsi.
for f in $(find Python-3.4.1 -name '*.c' -or -name "*.h"|xargs grep -lP "^\t"|xargs grep -l "^ "); do
printf "%04d\n" $(grep -P "^\t" $f|wc -l)
done | paste -sd+ | bc
9153
9.153 radku kodu zacinajicich tabem u zdrojaku pravdepodobne pouzivajici mezery k odsazovani
Nejpocetnejsi vyskyt tabu s michanym odsazovanim je z modulu ctypes:
pocet cesta k souboru
radku
=====================================================================
0070 Python-3.4.1/Modules/unicodedata_db.h
0073 Python-3.4.1/Modules/_ctypes/libffi/src/moxie/ffi.c
0074 Python-3.4.1/Modules/_ctypes/libffi/src/x86/ffi.c
0076 Python-3.4.1/Modules/_ctypes/libffi/src/raw_api.c
0077 Python-3.4.1/Modules/_ctypes/libffi/src/m68k/ffi.c
0081 Python-3.4.1/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c
0084 Python-3.4.1/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium.c
0084 Python-3.4.1/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium2.c
0086 Python-3.4.1/Modules/_ctypes/libffi/src/frv/ffi.c
0091 Python-3.4.1/Modules/_ctypes/libffi/src/alpha/ffi.c
0093 Python-3.4.1/Modules/_ctypes/libffi/src/m32r/ffi.c
0100 Python-3.4.1/Modules/_ctypes/libffi/src/java_raw_api.c
0102 Python-3.4.1/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large.c
0105 Python-3.4.1/Modules/_ctypes/libffi_osx/ffi.c
0105 Python-3.4.1/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large2.c
0123 Python-3.4.1/Modules/_ctypes/libffi/src/cris/ffi.c
0132 Python-3.4.1/Modules/_ctypes/libffi/src/arm/ffi.c
0168 Python-3.4.1/Modules/_ctypes/libffi/src/sh64/ffi.c
0195 Python-3.4.1/Modules/_ctypes/libffi/src/metag/ffi.c
0226 Python-3.4.1/Modules/_ctypes/libffi/src/ia64/ffi.c
0229 Python-3.4.1/Modules/_ctypes/libffi/src/pa/ffi.c
0233 Python-3.4.1/Modules/_ctypes/libffi/src/microblaze/ffi.c
0246 Python-3.4.1/Modules/_ctypes/libffi/src/sparc/ffi.c
0260 Python-3.4.1/Modules/_ctypes/libffi/src/x86/ffi64.c
0265 Python-3.4.1/Modules/_ctypes/libffi/src/s390/ffi.c
0276 Python-3.4.1/Modules/_ctypes/libffi/src/aarch64/ffi.c
0291 Python-3.4.1/Modules/_ctypes/libffi/src/mips/ffi.c
0296 Python-3.4.1/Modules/_ctypes/libffi/testsuite/libffi.call/huge_struct.c
0307 Python-3.4.1/Modules/_ctypes/libffi/src/sh/ffi.c
0503 Python-3.4.1/Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c
0532 Python-3.4.1/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c
0694 Python-3.4.1/Modules/_ctypes/libffi/src/powerpc/ffi.c
1211 Python-3.4.1/Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c
To je vsechno jen ne sporadicky zasah To je vsechno jen ne sporadicky zasahTo je tak kdyz nekdo dela analyzu a nezamysli se nad vysledky. Modul v Python-3.4.1/Modules/_ctypes/libffi/ pochazi od treti strany, a ano, je to nekonzistentni bordel. IMHO ho pouziva i samotna Ruby, i kdyz tam to nenapadne zapadne. Soubor unicodedata_db.h je strojove generovany skryptem a podle vseho u generatoru jednoho pole
static const change_record change_records_3_2_0[]
udelali a do generovane kodu dali vyjmecne taby.
for f in $(find ruby-2.1.2 -name '*.c' -or -name "*.h"|xargs grep -lP "^\t"|xargs grep -l "^ "); do printf "%04d\n" $(grep -P "^\t" $f|wc -l); done | paste -sd+ | bc
94846
Prijde mi, ze se snazis predevsim presvedcit sebe, jak je Python spatny.To je omyl, jen me stve nekriticky obdiv k cemukoliv. Delal jsem na vic nez desitce projektu postavenych nad pythonem 2 a narazil na limity a urcitou koncepcni roztristenost, ktere me stvaly a zchladily moje puvodni nadseni. Stavely se mezi napad a jeho implementaci a musel jsem navic vymyslet jak to obejit, udelat jinak. Ruby se mi do cesty tolik nestavi, ale zase ma jine mouchy. O pythonu 3 uz takovy prehled nemam a nebyl jsem si jisty co vsechno tam vylepsili a jak.
To co dela ten Enumerator jsem z toho popisu nepochopil, Ruby neznam. Mozna bys to mohl lepe vysvetlit.. Trida Enumerator vytvari instanci generatoru podobnou tomu pythonnimu, s nekterymi sikovnymi featurami navic jako nahleduti nebo vlozeni nasledujici hodnoty, reset generatoru, pocet prvku, iterace s indexem a killer featuru - verzi generatoru s linym vyhodnocovanim. Na rozdil od pythonu ho umoznuje a jakoukoli jinou tridu modifikovat nebo z ni primo odvozovat vlastni.
Ale troufam si tvrdit, ze Python ma podobnou funkcionalitu, nebo si ji aspon muzes snadno dodat, jak ukazuje Pavlix - neni vubec tezke najit podobny kod na Internetu.Muzu, vzdyt je turingove kompletni. A nekdy to jde primo a snadno, nekdy se to musi resit zbytecne komplikovane. Jde jen o to, jestli ta namaha a cas kterou tim stravim bude umerna ocekavanemuvysledku.
To je omyl, jen me stve nekriticky obdiv k cemukoliv.Zvláštní, že jsi zatím jediný člověk v diskuzi, u kterého jsem získal dojem, že takový nekritický obdiv brání.
Trida Enumerator vytvari instanci generatoru podobnou tomu pythonnimu, s nekterymi sikovnymi featurami navic jako nahleduti nebo vlozeni nasledujici hodnoty, reset generatoru, pocet prvku, iterace s indexem a killer featuru - verzi generatoru s linym vyhodnocovanim.Hezké vysvětlení, teď se alespoň máme o čem bavit. Mám dojem, že se jedná o funkcionalitu, jejíž podmnožinu jsem zde ukazoval v Pythonu.
Na rozdil od pythonu ho umoznuje a jakoukoli jinou tridu modifikovat nebo z ni primo odvozovat vlastni.Parse error. Bylo by dobré přesně specifikovat, co z toho v Pythonu nejde implementovat a proč. Zatím mám dojem, že je Enumerator věc plně reimplementovatelná v Pythonu a zjevně by z toho bylo v některých případech užitečné rozšíření.
Protoze to prvni je iterator, a ne pole? A na nem se bool() chova jinak?Ah, pravda. Ta diskuze se tu tak rozpukla, že začínám ztrácet přehled.
[...], kdy se hloubka vnoření označovala příslušným počtem teček na začátku řádku. Sice taky žádný zázrak, ale na první pohled bylo vidět, kde člověk je.Zkoušel jsi v Pythonu odsazovat tabem a v editoru si zapnout jeho zobrazování? Většinou to pak dělá právě takovou pěknou tečku
:-/
Predevsim je problematicka ta graficka nerozlisitelnost od mezery.To mi není jasný, v čem ta problematičnost spočívá - když odsazuju taby, tak vím, že tam jsou taby
No to mi přijde právě jako výhodaOsobně taky rád považuju jeden kus odsazení za jednu entitu, ideálně realizovanou jedním znakem. Asi bylo praktičtější na to zneužít zavedený TAB (ač je jeho účelem zarovnání, nikoliv odsazení) než vymýšlet znak nový. Na druhou stranu to nepovažuju za nijak důležité, u nových projektů dodržuju mezerový standard, u stávajících projektů samozřejmě standard daného projektu. Co mi přijde mnohem horší, je že si někteří vymysleli pravidla, že se kód bude nejen odsazovat, což je nezbytné pro elementární čitelnost a u Pythonu to je navíc součástí syntaxe, ale i zarovnávat, což mi přijde fajn jen v případě, že se jedná o vedlejší efekt odsazení, jinak to považuju za věc úchylnou a škodlivou. Paradoxně se pak k zarovnávání používají mezery (protože TABy ve své primární funkci selhávají) a na odsazování TABy. Navíc se na jednom řádku sejde i odsazení i zarovnání, čímž pádem je nutné dodržovat správný počet obou dvou typů znaků (což pravidla některých projektů nedodržují a to stejné platí i pro logiku některých editorů). V případě nedodržení správného počtu obou typů znaků dochází k rozházení kódu už při zobrazení v závislosti na konfiguraci velikosti TABu v editoru. Já osobně jsem vyrostl převážně na open source a VCS, později jsem se dostal k patchům, takže považuju minimalizaci změn za naprosto klíčovou. Změna logiky programu nebo dat v textovém formátu by z tohoto pohledu měla vždy zasahovat do minimálního počtu řádků, kterých se změna přímo netýká. Zarovnávání kódu tomuto přímo odporuje. To stejné platí pro různé oddělovače, které se týkají víceřádkových konstrukcí. Příklad:
int moje_funkce(int a, int b, int c) { return a + b + c; }Přejmenování funkce:
@@ -1,7 +1,7 @@ int -moje_funkce(int a, - int b, - int c) +tvoje_funkce(int a, + int b, + int c) { return a + b + c; }Skutečná změna v jediném řádku může způsobit kosmetickou změnu hned v několika řádcích.
protože TABy ve své primární funkci selhávajíHistorická vsuvka: Tab sloužil původně k posunu na následující tab stop... I dnešní emulátory terminálu většinou podporují nastavování tab stopů, ačkoli to nikdo nepoužívá (viz sekvence
\eH
a spol.). Čili používání tabu na zarovnání v textových souborech není o nic menší zneužití než odsazování, naopak, spíš větší, protože spoléhá na default nastavení pocházející z DEC VT terminálů nebo buhví odkud...
Změna logiky programu nebo dat v textovém formátu by z tohoto pohledu měla vždy zasahovat do minimálního počtu řádků, kterých se změna přímo netýká. Zarovnávání kódu tomuto přímo odporuje.Workaround:
diff -w
Horší jsou jazyky, kde výčet položek (v poli, v objektu apod.) nesmí končit čárkou (búno oddělovačem), takže když přidáš nějakou novou položku/y na konec, předchozí řádek se zcela zbytečně musí změnit.
Čili používání tabu na zarovnání v textových souborech není o nic menší zneužití než odsazování, naopak, spíš většíChápu to správně, že jenom potvrzuješ, co jsem výše napsal?
Workaround: diff -wNesmysl, to by vytvořilo špatný patch.
Horší jsou jazyky, kde výčet položek (v poli, v objektu apod.) nesmí končit čárkou (búno oddělovačem)O tom jsem psal hned v další větě.
patch
. Že může často druhá strana ten patch přečíst a pochopit jej i bez zbytku zdrojového kódu je jedna z příjemných vlastností kontextových patchů.
Predevsim je problematicka ta graficka nerozlisitelnost od mezery.To je problém i s mezerou, ta třeba není vidět, když je na konci řádku.
Predevsim je problematicka ta graficka nerozlisitelnost od mezery.To zalezi dost na tom jestli mas inteligentni editor. Ja mam treba ve vimu nastavy zobrazeni tabu jako roury ('|') a prvni mezeru za tabem mam jinou barvou. Tim jasne vidim kde me pokracuje radek. Viz obrazek v priloze. (btw. license GPL kdyby to nekdo chtel pouzit
set list listchars=tab:»·,trail:·
Existuje dost editoru (tusim mi to delal treba Eclipse), ktere maji tendenci michat taby a mezery prazvlastnimi zpusoby.Doporucoval bych poslat bug report / prestat editor pouzivat.
Ne vzdy mas k dizpozici editor, ktery s taby umi nejak normalne nakladat.Nevim jestli ma smysl celorocni sebemrskactvi s mezerama jenom proto ze jednou za rok mozna budu muset neco editovat v nejakym nedodelanym editoru...
Dalsim duvodem je to, ze pokud prohlasim ze odsazeni jsou ctyri mezery, tak vsichni vedi ze to sou ctyri mezery ... kdyz necham odsazeni v tabech, tak mi nekdo odsadi o dva, protoze ma nastaveno ze tab jsou 2 znaky, jinej o jeden, protoze ma nastaveno ze tab sou 4 znaky ...Jednoduse nadefinuju odsazeni == 1 tab a kdo to udela spatne tak si to po sobe opravi
Dtto zobrazeni kodu - s mezerama ho zobrazej vsechny editory +- stejne.To je podle me prave nevyhoda. Napr. pro me je kod s odsazenim 2 velice spatne citelnej. Odsazeni 4 je na hrane a 8 je akroat. Nekdo treba radsi pouziva 4. Kdyz pouzivas taby tak si to kazdej muze zobrazit jak mu to vyhovuje.
co kdybychom to udělali tak, že budeme odsazovat pomocí mezer a nastavíme si prostředí tak, aby se chovalo úplně přesně, jako bychom použili tabyJen tato část platí a v současné situaci, kdy se na různé projekty používá obojí odsazení to považuju za maximálně užitečné.
Mimochodem, jestli je pro tebe odsazeni 8 "tak akorat", tak to koncis nekde u 3ti urovne vnoreni, protoze pak uz ti to vytece z monitoru.Ono je totiz vetsinou lepsi skoncit u 3 urovne vnoreni
Kód: 5897
1 tab: 1653
2 taby: 1856
3 taby: 752
4 taby: 178
5 tabov: 41
6 tabov: 13
7 tabov: 5
8 a viacej tabov: 0
(áno som prasa)
> type(doit)
<type 'function'>
> object.reflect = doit
TypeError: can't set attributes of built-in/extension type 'object'
> class MyClass(object):
> pass
> MyClass.reflect = doit
> MyClass.reflect
<unbound method MyClass.reflect>
nebo nepodpora uzaver (nested scoping):
> def outer():
> x = 0
> def inner():
> x = x +1
> return x
> return inner
> clos = outer()
> clos()
UnboundLocalError: local variable 'x' referenced before assignment
Sice to jde obejit napsanim dekoratoru, referenci na prvek seznamu nebo v Pythonu 3 nove pridanym keywordem nonlocal, ale prijde mi to jako drbani se levou rukou za pravym uchem.
Ja na Pythonu "miloval" nekonzistenci mezi zakladnimi tridami a odvozenymi:Chápu, že to překvapí, ale jedná se o optimalizaci, jejímž důsledkům se člověk vyhne tím, že nebude očekávat, že může instancím libovolných vestavěných či knihovních tříd volně přidávat atributy.
nebo nepodpora uzaver (nested scoping):Co konkrétně není podporováno? Co je účelem ukázky kódu výše?
Sice to jde obejit napsanim dekoratoru, referenci na prvek seznamu nebo v Pythonu 3 nove pridanym keywordem nonlocal, ale prijde mi to jako drbani se levou rukou za pravym uchem.V čem se funkčně liší následující ukázka od požadovaného výsledku?
def outer(): y = 0 def inner(): x = y + 1 return x return inner clos = outer() clos()
V čem se funkčně liší následující ukázka od požadovaného výsledku?Tedy kromě výsledků opakovaného volání, ale to v příkladu není.
Chápu, že to překvapí, ale jedná se o optimalizaciHmm, tak ze to je nekonzistentni. Omlouva se to optimalizaci. Zajimavy ze srovnatelne Ruby timhle omezenim netrpi.
Co konkrétně není podporováno? Co je účelem ukázky kódu výše?Vazne je potreba tak hluboko klesat ? uzavery a PEP #3104
Hmm, tak ze to je nekonzistentni.Není, jen musí člověk chápat logiku kódu.
Omlouva se to optimalizaci.Nepoužití slovníku u pythoních objektů je optimalizace a je k dispozici každému i u jeho vlastních tříd. Lze argumentovat zda je ta optimalizace užiteční či nikoliv, ale argument, že Ruby takovou optimalizaci nepoužívá mi přijde mimo mísu.
Vazne je potreba tak hluboko klesat?Jen jsem se ptal, co konkrétně Python nepodporuje a ideálně bych se držel jen nejnovější verze Pythonu, pokud jde o obecné tvrzení, že Python něco neumí.
nove pridanym keywordem nonlocal, ale prijde mi to jako drbani se levou rukou za pravym uchem.Vzhledem k tomu, že Python zapisuje do lokálních proměnných, pokud programátor neřekne jinak, přijde mi nonlocal jako správná cesta. Dokonce mi to snad i přijde robustnější než aby místo zápisu odvozoval od existence nelokální proměnné.