[07:00] ¯¯ Modes[#wyklady] Regedit (+m) [07:00] <@Regedit> no dobra w takim razie witam wszystkich [07:00] <@Regedit> na wykladzie z jezyka Python [07:00] <@Regedit> ja nazywam sie Adam Sawicki i wiecej info o mnie na mojej stronie www.regedit.risp.pl [07:01] <@Regedit> wyklad natomiast bedzie dotyczyl jezyka Python [07:01] ¯¯ Joins[#wyklady] defc0n (~defc0n@agd50.internetdsl.tpnet.pl) [07:01] <@Regedit> wymagania systemowe do wykladu sa takie: [07:01] <@Regedit> - znac jakis jezyk programowania [07:01] <@Regedit> inaczej umiec programowac :) [07:01] <@Regedit> bo wyklad obejmuje skladnie pythona (praktycznie cala) i to bedzie taki szybki przeglad [07:01] <@Regedit> wiec trzeba juz wiedziec co to zmienna, funkcja itd. [07:01] <@Regedit> slowem wstepu najpierw powiem co to jest python [07:02] <@Regedit> a wiec jest to jezyk programowania skryptowy [07:02] <@Regedit> wniosek z tego taki ze mozna w nim pisac programy [07:02] <@Regedit> zapisywac algorytmy itp [07:02] <@Regedit> a ze skryptowy to znaczy ze nie sluzy do pisania pelnoprawnych aplikacji tylko skryptow [07:02] <@Regedit> i ze jest interpretowany [07:03] <@Regedit> a raczej tlumaczony do kodu binarnego, ktory jest potem wykonywany w wirtualnej maszynie [07:03] <@Regedit> skad go wziac? strona to chyba www.python.org [07:03] <@Regedit> Python jest open source, darmowy nawet do zastosowan komercyjnych [07:03] ¯¯ Joins[#wyklady] phoenix (~phoenix@cgw162.neoplus.adsl.tpnet.pl) [07:03] <@Regedit> a ze strony mozna sciagnac jego instalke na rozne systemy, np. windows i linux [07:03] <@Regedit> razem z interpreterem instaluje sie takie male IDE o nazwie IDLE [07:04] <@Regedit> ktore zawiera linie komend w ktorej mozna na zywi kodzic, tzn wpisywac polecenia ktore od razu sie wykonuja [07:04] <@Regedit> bardzo fajne :) [07:04] <@Regedit> teraz ostatnia rzecz ze wstepu, do czego python moze sie przydac [07:04] ¯¯ Joins[#wyklady] nameee (~kangurx@aev122.neoplus.adsl.tpnet.pl) [07:04] <@Regedit> zastosowan ma wiele [07:04] <@Regedit> - jako skrypty powloki do zadan administracyjnych [07:05] <@Regedit> w windowsie plik .py i klikamy 2 razy, w linuxie #!/bin/python czy cos takiego [07:05] <@Regedit> - jako jezyk, w ktorym mozna skrypcic programy [07:05] <@Regedit> bo wiele programow uzywa wlasnie jego tak jak MS Office ma swoj VBA :) [07:05] <@Regedit> np. Blender, QuArK i wiele innych [07:05] <@Regedit> - jako jezyk, ktory mozna osadzic w swojej aplikacji zeby ja oskrypcic [07:05] <@Regedit> - i wreszcie do pisania calkiem powaznych programow, bo tez sie da [07:06] <@Regedit> i jeszcze krotko jaki jest ten python [07:06] <@Regedit> przede wszystkim to jest jezyk naprawde duzego kalibru [07:06] <@Regedit> ma klasy, wyjatki itd [07:06] <@Regedit> dlatego tez nie jest tak maly ani szybki jak np. LUA [07:06] <@Regedit> poza tym ma bardzo pokrecona skladnie! [07:06] <@Regedit> niepodobna do zadnego innego jezyka [07:06] <@Regedit> choc nie w tym kierunku pokrecona, co np. Bash, TCL, Perl i inne jezyki linuksowe [07:07] <@Regedit> wiec jak sie go pozna to okazuje sie, ze kodzi sie w nim bardzo szybko, przyjemnie i malo bledow sie popelnia [07:07] <@Regedit> wlasnie poznawaniem tej dziwnej skladni sie zajmiemy [07:07] <@Regedit> koniec wstepu, sa jakies pytania? :) [07:07] ¯¯ Modes[#wyklady] Regedit (-m) [07:07] podbna skladnia do c [07:07] <@Regedit> nie powiedzialbym :) [07:07] Regedit: do ktorej bedzie wyklad? [07:07] <@Regedit> do 21 [07:07] a ja bym powiedzial :) [07:07] ant_: na przyklad to, ze nie ma { i } ? [07:08] sa [07:08] ;p [07:08] <@Regedit> nie ma [07:08] sa [07:08] dajcie mi przyklad w pythonie to wam powiem ;P [07:08] nie ma? [07:08] tylko odpowiednie zastosowanie wciec [07:08] hmm... [07:08] ant_: moze i sa, ale znacza co innego :P [07:08] nie teraz te dyskusje ;] [07:08] ¯¯ Modes[#wyklady] Regedit (+m) [07:08] <@Regedit> ok w takim razie podstawy skladni [07:08] <@Regedit> po pierwsze komentarze [07:08] <@Regedit> pisze sie jak to w linuksowych jezykach bywa, za pomoca # [07:08] <@Regedit> w osobnej linii albo w tej samej co jakies polecenie np.: [07:09] <@Regedit> # a tu wywoluje funkcje: [07:09] <@Regedit> funkcja() # no i wywolalem [07:09] <@Regedit> nastepna sprawa i tu uwaga [07:09] <@Regedit> kazde polecenie ma byc w osobnej linii, tu nie ma wolnego formatu zapisu jak w innych jezykach [07:09] ¯¯ Joins[#wyklady] artpoz (artpoz@poznanski.net.autocom.pl) [07:09] <@Regedit> moze byc wiecej polecen w jednej linii ale wtedy trzeba pisac po kazdym ; [07:09] <@Regedit> normalnie nie trzeba [07:09] <@Regedit> wiec mozna tak: [07:09] <@Regedit> funkcja1(); [07:10] <@Regedit> funkcja2() [07:10] ¯¯ Modes[#wyklady] ChanServ (+o G0blin) [07:10] <@Regedit> albo funkcja1(); funkcja2(); [07:10] <@Regedit> bloki zaznacza sie samymi wcieciami [07:10] <@Regedit> nie ma ani begin/end ani {}, w ogole nic [07:10] <@Regedit> wciecia to np. tabulacje, spacje itp [07:10] <@Regedit> np.: [07:10] <@Regedit> if x > 0: [07:10] <@Regedit> funkcja(); [07:10] <@Regedit> nie ma tez roznicy czy wewnatrz takiego bloku jest jedna czy wiecej instrukcji [07:11] <@Regedit> teraz zmienne [07:11] <@Regedit> jak to w jezykach skryptowych bywa, zmiennych sie nie deklaruje a typy sa dynamiczne [07:11] <@Regedit> po prostu sie przypisuje np. tak: [07:11] <@Regedit> x = 1; [07:11] <@Regedit> y = x [07:11] <@Regedit> itd. [07:11] <@Regedit> typy danych sa takie: [07:11] <@Regedit> - typ logiczny, dopuszczalne wartosci to True i False (to sa slowa kluczowe) [07:11] <@Regedit> - typ liczbowy [07:12] <@Regedit> liczby sie zapisuje jak w C++ [07:12] <@Regedit> - typ dlugiej liczby - o dowolnej dlugosci, samo sie przelacza na taki jak bnastepuje przepelnienie [07:12] <@Regedit> sa funkcje matematyczne np.: [07:12] ¯¯ Joins[#wyklady] Prus (~skrzyp_@cnn148.neoplus.adsl.tpnet.pl) [07:12] <@Regedit> pow itp. [07:13] <@Regedit> operatory arytmentyczne to standardowo + - * / [07:13] <@Regedit> a ponadto: [07:13] <@Regedit> x // y to dzielenie calkowite z obcieciem reszty (zaokragleniem w dol) [07:13] <@Regedit> x ** y to podniesienie do potegi [07:13] <@Regedit> jest tez % jak w C++ czyli reszta z dzielenia [07:14] <@Regedit> sa operatory bitowe | & ~ << >> jak w C++ [07:14] <@Regedit> ^ jak w C++ to bitowy XOR [07:14] <@Regedit> sa tez operatory += itd. [07:14] <@Regedit> np. x += 2; zwieksza x o 2 [07:14] ¯¯ Joins[#wyklady] ryjcio (~ryjcio@ntwklan-62-233-167-54.devs.futuro.pl) [07:14] <@Regedit> opeatory porownania to == < > <= >= [07:14] <@Regedit> rozny to != lub <> jak kto woli [07:14] <@Regedit> operatory logiczne to pisane slownie: and or not [07:15] <@Regedit> dodatkowo sa operatory is oraz not is [07:15] <@Regedit> ktore wskazuja czy dwie zmienne typu referencyjnego wskazuja na ten sam obiekt [07:15] <@Regedit> bedzie o tym pozniej, w kazdym razie chodzi o to [07:15] <@Regedit> ze zwykle == porownuje wartosci obiektow a nie to czy wskazuja na ten sam [07:15] <@Regedit> i jeszcze ciekawostka, mozna pisac np. tak: [07:15] <@Regedit> a < b == c [07:16] <@Regedit> i to zadziala zgodnie z intuicja czyli zwroci True jesli b > a oraz b == c [07:16] <@Regedit> czego nie ma w innych jezykach :) [07:16] <@Regedit> teraz lancuchy krotko, bo obszerniej bedzie pozniej [07:16] <@Regedit> lancuchy zapisujemy w '' lub "", np. "Hello world!" [07:16] <@Regedit> znaki specjalne, czyli escape sequences sa tak samo jak w C/C++ [07:17] ¯¯ Joins[#wyklady] nobody_ (~nob@ds2.pwsz.elblag.pl) [07:17] <@Regedit> natomiast jest kilka dodatkowych rzeczy [07:17] <@Regedit> raw string to taka skladnia to dluzszych lancuchow [07:17] <@Regedit> zapisywane sa w """...""" lub r"..." [07:17] <@Regedit> lub '''...''' lub r'...' [07:17] <@Regedit> i wtedy w miejscu ... moga byc dowolne znaki oprocz tych ktore koncza ten string, lacznie ze znakami konca wiersza [07:18] <@Regedit> lancuchy unikodowe z kolei, bo to osobny typ od zwyklych, zapisuje sie u"..." lub u'...' [07:18] <@Regedit> konkatenacja (laczenie) lancuchow robi sie za pomoca operatora + [07:18] <@Regedit> i jest jeszcze operator * :) [07:18] ¯¯ Joins[#wyklady] adam_i (~adam@ana193.neoplus.adsl.tpnet.pl) [07:18] <@Regedit> ktory mnozy lancych przez liczbe np. "bla" * 3 wyjdzie "blablabla" [07:19] <@Regedit> szerzej o lancuchach bedzie pozniej [07:19] <@Regedit> a teraz jeszcze o wartosci None [07:19] <@Regedit> wiele jezykow ma specjalny typ "pusty" o jednej wartosci, ktory oznacza cos w rodzaju "nic", "niewiadomo", "niezdefiniowane" itp. [07:19] <@Regedit> zeby odroznic od innych np. od liczby, jesli kazda liczba moze byc dozwolona [07:19] <@Regedit> takie cos ma SQL, PHP i wiele innych [07:19] <@Regedit> nazywa sie to roznie, nil, null itp. [07:20] <@Regedit> a w Pythonie dla odmiany sluzy do tego slowo kluczowe None [07:20] <@Regedit> tak wiec x = None podstawi do zmiennej x wartosc None typu None [07:20] <@Regedit> slucham pytan [07:20] ¯¯ Modes[#wyklady] Regedit (-m) [07:20] <@Regedit> [19:12:10] powiedz ze jak ktos jest zainteresowany to: http://www.poznan.linux.org.pl/wyklad/materialy/20050615/ [07:20] <^Klocek> i zapadla niezreczna cisza :) [07:20] pod wrazeniem jestem rozbudowania tego jezyka ^^ [07:20] ¯¯ Joins[#wyklady] Pabox (~pawelmc@cmx231.neoplus.adsl.tpnet.pl) [07:20] <@Regedit> czyli wszystko jasne rozumiem :) [07:21] <@Regedit> no owszem jezyk jest wypasiony [07:21] ¯¯ Modes[#wyklady] Regedit (+m) [07:21] <@Regedit> teraz instrukcje sterujace [07:21] <@Regedit> instrukcja warunkowe if wyglada tak [07:21] <@Regedit> if x > 0: [07:21] <@Regedit> print "Tak, x jest wieksze od 0" [07:21] <@Progigy> w8 mam pytanie :P [07:21] <@Progigy> moge? [07:21] <@Regedit> no jasne slucham [07:22] <@Progigy> slyszalem, ze pythona jakos da sie kompilowac [07:22] <@Progigy> to true? [07:22] <@Regedit> i tak i nie [07:22] <@Regedit> jest cos co robi EXEka [07:22] <@Regedit> ale to tak naprawde interpreter polaczony z kodem binarnym pythona wychodzi :) [07:22] <@Progigy> i ze da sie robic w nim strasznie duze rzeczy takie jak komunikatory itd... [07:22] <@Progigy> aha --; [07:22] <@Regedit> tak, da sie bo jezyk jest potezny [07:23] <@Regedit> ale pytanie jak to bedzie chodzilo :) [07:23] <@Regedit> niektorzy nawet gry probuja robic [07:23] ¯¯ Joins[#wyklady] fr3` (freesher@be.666.tc) [07:23] <@Progigy> glupio troche z ta kompilacja :P:P [07:23] <@Regedit> zwroccie uwage na ten dwukropek, on musi tam zawsze byc [07:23] <@Regedit> aha i sekcja wewnatrz if nie moze byc psuta [07:23] <@Regedit> chociaz jedna instrkcja musi byc w tym bloku [07:23] <@Regedit> jak ma nie byc zadnej to polecam slowo pass - ono do tego sluzy [07:23] <@Regedit> np. [07:23] <@Regedit> if x > 0: [07:23] <@Regedit> print "tak" [07:23] <@Regedit> else [07:23] <@Regedit> # sory, zle [07:23] <@Regedit> else: [07:23] <@Regedit> pass [07:24] <@Regedit> jest tez tak jak w PHP slowo elif, np.: [07:24] <@Regedit> if x < 0 [07:24] <@Regedit> # sory :) [07:24] <@Regedit> if x < 0: [07:24] <@Regedit> print "x < 0" [07:24] <@Regedit> elif x > 0: [07:24] <@Regedit> print "x > 0" [07:24] <@Regedit> else [07:24] ¯¯ Joins[#wyklady] Prus (~skrzyp_@cnn148.neoplus.adsl.tpnet.pl) [07:24] <@Regedit> print "albo to jest 0 albo juz sam nie wiem" [07:24] <@Regedit> mozna tez zapisac tak w jednej linii: [07:24] <@Regedit> if x > 0: print "x > 0" [07:25] <@Regedit> teraz petle [07:25] <@Regedit> petla while jest i wyglada tak: [07:25] <@Regedit> while x > 0: [07:25] <@Regedit> print "costam" [07:25] <@Regedit> x = x - 1 [07:25] ¯¯ Joins[#wyklady] d0b0c0p (d0b0c0p@byl245.neoplus.adsl.tpnet.pl) [07:25] <@Regedit> jest tez petla for, ale nie tak skomplikowana jak w C++ [07:25] ¯¯ Joins[#wyklady] SlimAway (slimfast@byl245.neoplus.adsl.tpnet.pl) [07:25] <@Regedit> a dziala np. tak: [07:26] <@Regedit> for i in (1, 2, 3): [07:26] <@Regedit> print i [07:26] <@Regedit> czyli ma byc zmienna i sekwencja, kolejne elementy tej sekwencji beda podstawiane pod ta zmienna w kolejnych przebiegach petli [07:26] <@Regedit> a co to jest to w nawiasach to powiem pozniej [07:26] <@Regedit> tam moze byc np. tablica [07:26] <@Regedit> i wtedy przeleci przez wszystkie elementy tablicy np.: [07:27] <@Regedit> for element in tablica: [07:27] <@Regedit> print element [07:27] <@Regedit> w Pythonie jak w wiekszosci jezykow jest instrukcja break, ktora przerywa natychmiasat najbardziej wewnetrzna petle [07:27] <@Regedit> i continue, ktora natychmiast rozpoczyna nowy przebieg najbardziej wewnetrznej petli [07:27] <@Regedit> jest tez ciekawa konstrrukcja ktora wyglada tak: [07:27] <@Regedit> for element in tablica: [07:28] <@Regedit> if CosZNimNieTak(element): [07:28] <@Regedit> break; [07:28] <@Regedit> else: [07:28] <@Regedit> print "wszystko OK" [07:28] <@Regedit> czyli else ale do petli :))) [07:28] <@Regedit> i ten kod w else wykona sie wtedy, kiedy petla sie skonczy ALE tylko jesli nie zostala przerwana za pomoca break [07:28] <@Regedit> tylko skonczyla sie w sposob naturalny :) [07:28] ¯¯ Joins[#wyklady] maxbog (maxbog@bvy2.neoplus.adsl.tpnet.pl) [07:28] <@Regedit> ot, taka ciekawostka :) [07:29] <@Regedit> dla tych bardziej zaawansowanych wspomne tez, bo o tym nie powiem dokladnie, ze Python ma tak jak C# instrukcje yield [07:29] <@Regedit> co sie do petli for moze przydac [07:29] <@Regedit> i teraz jeszcze moze od razu wyjatki, chociaz nie... [07:29] <@Regedit> to pozniej :) [07:29] <@Regedit> pytania? [07:29] ¯¯ Modes[#wyklady] Regedit (-m) [07:29] <@Progigy> print? [07:29] <@Regedit> hm [07:30] <@mulander> tak jedno pytanko [07:30] ¯¯ Joins[#wyklady] mosquito|aw (1000@Bot.Underground) [07:30] siema [07:30] <@Progigy> i instrukcja yeld :P [07:30] <@Regedit> ok omowie print zaraz bo faktyzcnie to wazne :) [07:30] <@mulander> mozesz z najbardzeij zagniezdzonej petli przerwac petle np. 2 poziomy wyzej ? [07:30] czesc afro [07:30] <@Progigy> hi mulander :] [07:30] <@mulander> ello Progigy [07:30] <@Regedit> mulander: niestety nie, to potrafi tylko PHP z jezykow ktore znam [07:30] <@Regedit> n. break 3; [07:30] <@mulander> Perl tez potrafi :P [07:30] <@Progigy> mulander: brake wystepuje po ifie nie? [07:30] <@mulander> w czym ? [07:31] <@Progigy> mulander: zazwyczaj sie robi w petli [07:31] <@Progigy> brake po ifie [07:31] <@Regedit> break :P [07:31] <@Progigy> bo inaczej to raczej nonsens :P [07:31] <@Progigy> :P [07:31] <@Regedit> zgadza sie [07:31] <@Progigy> kij z tym :P [07:31] Progigy: sprawe mam [07:31] <@Progigy> wlasnie [07:31] <@Progigy> wiec: [07:31] <@Progigy> Karql: zaraz [07:31] <@Regedit> sprawe to poza wykladem :) [07:31] nie kickaj irysa czy tam banuj chyba ze mam nie logowac to powiedz [07:31] <@Progigy> i zarzaz dasz mi jeszcze raz tego linka [07:31] <@Progigy> mozesz do tego bloku po ifie dorzucic jakas zmienna [07:32] <^Klocek> Progigy ale mulander napewno o tym wie [07:32] <@Progigy> znaczy zmienic jakas dodatkowa zmienna [07:32] <@Regedit> dobra dalej lecimy [07:32] <@Progigy> a w sumie :P [07:32] <@Progigy> moze i tak :P [07:32] ¯¯ Modes[#wyklady] Regedit (+m) [07:32] <@Regedit> teraz funkcje [07:32] <@Regedit> tak jak w PHP i innych jezykach skryptowych plik zawiera bezposrednio kod i ten kod wykonuje sie podczas uruchomienia skryptu [07:33] <@Regedit> a moze byc swobodnie przeplatany z definicjami funkcji [07:33] <@Regedit> funkcje definiuje sie tak i trzeba definiowac przed uzyciem: [07:33] <@Regedit> def funkcja(s): [07:33] <@Regedit> print s [07:33] <@Regedit> czyli funkcja ktora wypisuje na ekran to co sie jej przekaze :) [07:33] <@Regedit> funkcje wywoluje sie tradycyjnie czyli [07:33] <@Regedit> funkcja('Hello world!') [07:34] <@Regedit> natomiast samo [07:34] <@Regedit> funkcja [07:34] <@Regedit> zwraca cos co jest typu "user defined function" [07:34] <@Regedit> i co mozna przypisac np.: [07:34] <@Regedit> f2 = funkcja [07:34] <@Regedit> f2('Hello world!'); [07:34] <@Regedit> inne kombinacje z funkcjami sa takie: [07:34] <@Regedit> def funkcja(s1, s2, s3): [07:34] <@Regedit> # costamrobie... [07:34] <@Regedit> i wywolywac moge tak: [07:35] <@Regedit> funkcja(s1 = "costam", s2 = "costam", s3 = "costam") [07:35] <@Regedit> czyli podawac nazwy parametrow i ich wartosci jawnie [07:35] <@Regedit> w dowolnej kolejnosci a jesli jakis parametr ma wartosc domyslna (to robi sie tak samo jak w C++) to nie trzeba go podawac [07:35] <@Regedit> jeszcze wiekszy odjazd: [07:35] <@Regedit> def funkcja(a, b, **keywords): [07:35] <@Regedit> # costam... [07:36] <@Regedit> jesli taka funkcje wywolam z parametrami takimi na przyklad: [07:36] <@Regedit> funkcja(1, b = 2, c = 3, d = 4) [07:36] <@Regedit> to funkcja dostanie jako a 1, jako b 2, a jako keywords slownik (bedzie pozniej) o tresci {c:3, d:4} [07:36] <@Regedit> czyli pozostale (dodatkowe) parametry tam dostanie [07:37] <@Regedit> podobna kombinacja wyglada tak: [07:37] <@Regedit> def funkcja(a, b, *args): [07:37] <@Regedit> # costam... [07:37] <@Regedit> i jesli taka funkcje wywolam tak: [07:37] <@Regedit> funkcja(1, 2, 3, 4) [07:37] <@Regedit> to funkcja dostanie jako a 1, jako b 2, a jako args krotke (bedzie nizej) o wartosci (3, 4) [07:37] <@Regedit> czyli pozostale argumenty ale juz bez nazw, w kolejnosci w jakiej zostaly podane [07:37] <@Regedit> to mozna porownac do konstrukcji (...) w C/C++ [07:37] <@Regedit> czyli dowolna ilosc dowolnych argumentow [07:38] <@Regedit> i jeszcze wiekszy odlot: [07:38] <@Regedit> Python nie tylko pozwala programowac strukturalnie i obiektowo ale i funkcyknie [07:38] <@Regedit> ma notacje lambda! [07:38] <@Regedit> co prawda raczej szczatkowa ale zawasze to jakas ciekawostka, przyda sie do krotkich funkcji inline, np.: [07:38] <@Regedit> lambda x, y, x*y [07:39] <@Regedit> to wyrazenie zwraca funkcje, ktora przyjmuje dwa argumenty i zwraca ich ilocznym [07:39] <@Regedit> przyklad: [07:39] <@Regedit> funkcja = lambda x, y, x*y [07:39] <@Regedit> print funkcja(1, 2) [07:39] <@Regedit> ot, taka ciekawostka :) [07:39] <@Regedit> pytania? [07:39] ¯¯ Modes[#wyklady] Regedit (-m) [07:39] Co są notacje lambda? [07:39] <@Regedit> takie pojecie z programowania funkcyjnego [07:40] <@Regedit> nikt normalny nie programuje funkcyjnie ale sa takie jezyki pol albo w pelni funkcyjne [07:40] <@Regedit> np. Haskell [07:40] <^Klocek> sadol [07:40] <^Klocek> :> [07:40] <@Regedit> tak, tez [07:40] <@Regedit> wszystko jasne? [07:40] <^Klocek> spytaj ile osob Cie slucha [07:40] <^Klocek> :) [07:40] <@Regedit> proste co nie? :) [07:41] <@Regedit> zasneli pewnie [07:41] <^Klocek> ;-) [07:41] <@Regedit> albo sie wystraszyli i ucielki [07:41] <@Regedit> no nic, zawsze to log zostanie :) [07:41] ¯¯ Modes[#wyklady] Regedit (+m) [07:41] <@Regedit> chcieliscie print i macie racje [07:41] <@Regedit> bo to wazne a ja zapomnialem dodac do sciagi :) [07:41] <@Regedit> otoz do wypisywania na ekran konsoli sluzy instrukcja print, to nie jest funkcja bo nie ma nawiasow [07:41] <@Regedit> tylko pisze sie tak [07:41] <@Regedit> print "dupa" [07:41] <@Regedit> i teraz jak zwykle wariacje na temat [07:42] <@Regedit> wypisanie kilku wartosci: [07:42] <@Regedit> print x, y, z [07:42] <@Regedit> same oddziela sie spacja! [07:42] <@Regedit> natomiast taka konstrukcja: [07:42] <@Regedit> print x, [07:42] <@Regedit> czyli przecinek na koncu [07:42] ¯¯ Joins[#wyklady] Ishikawa (ishikawa@ciq179.neoplus.adsl.tpnet.pl) [07:42] <@Regedit> zapobiegnie dopisaniu na koncu znaku nowego wiersza [07:43] <@Regedit> natomiast cos takiego jak znany z C printf mozna otrzymac za pomoca ciekawego operatora % dla stringow [07:43] <@Regedit> ktorego byc moze znaja wielbiciele biblioteki boost dla C++ [07:43] <@Regedit> otoz uzywa sie tego tak: [07:43] ¯¯ Joins[#wyklady] d0b0c0p (d0b0c0p@byl245.neoplus.adsl.tpnet.pl) [07:43] <@Regedit> print "wyszlo mi tyle: %d" % x [07:43] <@Regedit> do lancucha w miejsce %d podstawiona zostanie wartosc zmiennej x zamieniona oczywiscie na lancuch [07:43] <@Regedit> bo moze byc dowolnego typu [07:44] <@Regedit> kilka wartosci wpisuje sie tak: [07:44] <@Regedit> print "%d + %d = %d" % (x, y, x+y) [07:44] <@Regedit> mam nadzieje ze jasne co to robi :) [07:44] <@Regedit> teraz idziemy dalej, wyjatki [07:44] <@Regedit> Python ma wyjaki, pozwala na nich realizowac obsluge bledow i sam je rzuca jak cos mu nie pasuje [07:44] <@Regedit> (np. dzielenie przez 0 czy inne bledy) [07:45] <@Regedit> wyjatek rzuca sie tak: [07:45] <@Regedit> raise 1 [07:45] <@Regedit> gdzie w miejsce 1 moze byc dowolna wartosc dowolnego typu [07:45] <@Regedit> zwykle jednak korzysta sie z klasy Exception lub klas pochodnych [07:45] <@Regedit> ta klasa przechowuje lancuch z komunikatem bledu a Python ma dodatkowa skladnie do podawania tego komunikatu podczas rzucania w taki sposob: [07:46] <@Regedit> raise Exception, "costam sie zlego stalo" [07:46] <@Regedit> natomiast lapie sie wyjatki tak: [07:46] <@Regedit> try: [07:46] <@Regedit> ... [07:46] <@Regedit> except Exception: [07:46] <@Regedit> ... [07:46] <@Regedit> except: [07:46] <@Regedit> ... [07:46] <@Regedit> else: [07:46] <@Regedit> ... [07:46] <@Regedit> finally: [07:46] <@Regedit> ... [07:46] <@Regedit> to oczywiscie full rozpisane, nie trzeba uzywac wszystkich tych sekcji [07:46] <@Regedit> w try wykonuje sie jakis kod [07:47] <@Regedit> i jesli on rzuci wyjatek to ten wyjatek moze sie zlapac w jedna z sekcji except [07:47] <@Regedit> po except sa typy wyjatkow, zlapie sie w pierwszy pasujacy [07:47] <@Regedit> jesli zaden nie pasuje to zlapie sie w to ostatnie except, bez typu [07:47] <@Regedit> kod po else wykona sie jesli wyjatku nie bylo [07:47] <@Regedit> a kod po finally wykona sie zawsze, tak czy siak - sluzy do zwalaniania pamieci zamykania plikow itp. zasobow [07:48] <@Regedit> podczas lapania wyjatku czyli w sekcji except mozna wyjatek "podac dalej" za pomoca samego: [07:48] <@Regedit> raise [07:48] ¯¯ Parts[#wyklady] Pabox (~pawelmc@cmx231.neoplus.adsl.tpnet.pl)- [07:48] <@Regedit> ot i cala filozofia, koniec przegladu skladni i zaraz sie zacznie najciekawsza czesc :D [07:48] <@Regedit> pytania? [07:48] ¯¯ Modes[#wyklady] Regedit (-m) [07:48] <^Klocek> i w takim przypadku przydaje sie piekna rzecz nazwana formatowaniem kodu [07:48] <^Klocek> :) [07:48] elo :D [07:48] jaka czesc? ;> [07:48] <@mulander> perldoc camel code? [07:48] link do Camel Code: http://www.perlmonks.com/?displaytype=displaycode;node_id=45213 [07:49] <@Regedit> struktury danych beda [07:49] <@mulander> zerknijcie na tego linka :P [07:49] <@mulander> to jest dopiero formatowanie kodu :P [07:49] <@Regedit> lol [07:49] <@Regedit> a znacie obfuscated code contest? [07:49] Regedit: zarzuc opem bo na serwie sshd wylaczone [07:49] <@mulander> jasne ^^ [07:49] i gripowi nie chce sie wlaczyc [07:49] <@Regedit> opem? ja nie daje opa, ja tu jestem tylko wykladowca [07:49] <@Regedit> z takim pytaniami to do szefa :) [07:49] <^Klocek> Regedit [07:49] ¯¯ Joins[#wyklady] radmen (radmen@afo201.neoplus.adsl.tpnet.pl) [07:50] ¯¯ Parts[#wyklady] radmen (radmen@afo201.neoplus.adsl.tpnet.pl)- [07:50] <^Klocek> ale on jest pomyslodawca tego kanalu [07:50] <^Klocek> ... [07:50] Regedit:no kurde [07:50] ¯¯ Modes[#wyklady] mulander (+o phoenix) [07:50] <@Regedit> przykro mi nie orientuje sie kto jest kto :) [07:50] ¯¯ Modes[#wyklady] Regedit (+m) [07:50] <@Regedit> widze ze nie ma pytan :) [07:50] <@Regedit> zaczniemy teraz omawiac struktury danch [07:50] <@phoenix> thx [07:50] <@Regedit> czyli jakie sa kontenery itp. rzeczy [07:50] <@Regedit> moim zdaniem to jest najwazniejszy wyznacznik dobrego jezyka programowania [07:51] <@Regedit> a Python ma naprawde dobre [07:51] <@Regedit> najpierw: STRINGI (tym razem dokladnie) [07:51] <@Regedit> pamietamy to co bylo wyzej, a teraz dowiemy sie np. [07:51] <@Regedit> ze mozna sie odwolywac do znakow lancucha np. [07:51] <@Regedit> znak_pierwszy = lancuch[0] [07:51] <@Regedit> znaki sa indeksowane od 0 [07:52] <@Regedit> nie ma typu znakowego, znak_pierwszy bedzie 1-znakowym lancuchem [07:52] <@Regedit> i tutaj jak zwykle Python oferuje ciekawe rozszerzenia, np.: [07:52] <@Regedit> s2 = s[1:2] [07:52] <@Regedit> przypisze do s2 wycinek lancucha s poczawszy od znaku drugiego, razem dwa znaki [07:53] <@Regedit> przekroczenie zakresu tutaj jest samoczynnie ograniczane, tzn jesli string jest krotszy to sie po prostu przypisze mniej [07:53] <@Regedit> podczas indeksowania s[128] bez ':' natomiast rzuca wyjatek [07:53] <@Regedit> inne kombinacje z tym: [07:53] <@Regedit> s2 = s[1:] [07:53] <@Regedit> przypisze wycinek od znaku drugiego do konca [07:53] ¯¯ Modes[#wyklady] Progigy (-o Progigy) [07:53] <@Regedit> s2 = s[:2] przypisze 2 pierwsze znaki [07:54] <@Regedit> s[-1] zwraca ostatni znaki, s[-2] przedostatni itd. [07:54] <@Regedit> co ciekawe natomiast, nie mozna zmieniac znakow! [07:54] <@Regedit> s[0] = 'A' to blad!!! [07:54] <@Regedit> dziwne, ale ma swoj sens, w C# i innych jezykach w .NET jest podobnie [07:54] <@Regedit> optymalizacja po prostu :) [07:54] <@Regedit> tylko tam to sie samo rzutuje na cos co sie nazywa StringBuilder [07:55] <@Regedit> a tutaj nie, wiec chcac zmienic znak trzeba stworzyc nowy lancuch jakos z wycinkow tego [07:55] <@Regedit> innymi slowy, lancuchy sa niezmienne (immutable) [07:55] <@Regedit> raz stworzone nie moga zmieniac swoich fragmentow [07:55] ¯¯ Joins[#wyklady] Spigniev (~chapel1@xdsl-311.bielsko.dialog.net.pl) [07:55] <@Regedit> druga struktura danych to KROTKI (ang. tuple) [07:56] <@Regedit> krotke tworza nawiasy np. [07:56] <@Regedit> (1, 2, 3) [07:56] <@Regedit> zwraca 3-elementowa krotke [07:56] <@Regedit> () [07:56] <@Regedit> to krotka pusta [07:56] <@Regedit> a tak naprawde to nie nawiasy tylko operator przecinka, bo mozna tez tak: [07:56] <@Regedit> krotka = 1, 2, 3 [07:56] <@Regedit> 1, stworzy krotke jednoelementowa [07:56] <@Regedit> krotka = 1, [07:57] <@Regedit> jak juz mamy krotke to mozemy sie odwolywac do jej elementow przez indeksowanie [07:57] <@Regedit> pierwszy_element = krotka[0] [07:57] <@Regedit> itd [07:57] <@Regedit> krotka moze przechowywac elementy roznych typow [07:57] <@Regedit> krotka2 = 1, 2, "foo", None, False [07:57] <@Regedit> krotki sa rowniez immutable, nie mozna zmieniac im elementow [07:58] <@Regedit> wiec krotka[0] = costam; bedzie bledem [07:58] <@Regedit> raz stworzona nie podlega zmianom, chcac cos zmienic trzeba stworzyc nowa [07:58] <@Regedit> ograniczenie, ale to jest optymalizacja [07:58] <@Regedit> przy okazji jeszcze ciekawa sprawa - unpacking [07:58] <@Regedit> byc moze znacie z LUA takie cos: [07:58] <@Regedit> x, y = GetPos [07:58] <@Regedit> tfu [07:58] <@Regedit> x, y = GetPos() [07:59] <@Regedit> jesli funkcja GetPos zwraca 2-elementow krotke to sie jej elementy przypisza do tych dwoch zmiennych [07:59] <@Regedit> podobnie mozna napisac tak: [07:59] <@Regedit> x, y = 1, 2 [07:59] <@Regedit> co sie tu stalo? [07:59] <@Regedit> 1, 2 zostalo spakowane do krotki, a potem ona zostala rozpakowana do dwoch zmiennych [07:59] <@Regedit> czyli do x przypisalo sie 1 a do y 2 [07:59] <@Regedit> 3/4 struktura danych to LISTA [07:59] <@Regedit> listy tworza nawiasty kwadratowe [08:00] <@Regedit> [1, 2, 3] to 3-elementowa lista [08:00] <@Regedit> [] to pusta lista [08:00] <@Regedit> lista = [1, 2, 3] [08:00] <@Regedit> odwolanie do elementow j/w, czyli przez indeksowanie, np.: [08:00] <@Regedit> element_ostatni = lista[2] [08:00] <@Regedit> a teraz uwaga [08:00] <@Regedit> listy sa mutable [08:00] <@Regedit> czyli mozna zmieniac ich elementy, np.: [08:00] <@Regedit> lista[2] = 4; [08:01] <@Regedit> ale jednoczesnie co za tym idzie, sa typami nie traktowanymi bezposrednio [08:01] <@Regedit> tylko przez referencje [08:01] <@Regedit> wiec jesli przypisze [08:01] <@Regedit> lista2 = lista; [08:01] <@Regedit> to obydwie zmienne odwoluja sie do tej samej listy [08:01] <@Regedit> modyfikacja elementow ktorejkolwiek z tych list modyfikuje ta jedyna [08:01] <@Regedit> i zmiany sa widocznie przez obydwie zmienne [08:01] <@Regedit> trzeba o tym pamietac [08:02] <@Regedit> chcac stworzyc osobna kopie listy mozna zrobic tak: [08:02] <@Regedit> lista2 = lista[:] [08:02] <@Regedit> tutaj wychodzi do czego przydaja sie operatory is [08:02] <@Regedit> bo lista1 == lista2 zwraca True, jesli dwie listy maja takie same elementy [08:02] <@Regedit> na tej samej pozycji [08:02] <@Regedit> a lista2 is lista1 zwraca True jesli to referancja do tej samej listy [08:02] <@Regedit> o 21 :) [08:03] <@Regedit> lista ma szereg metod [08:03] <@Regedit> len(lista) zwraca dlugosc, czyli liczbe elementow listy [08:03] <@Regedit> l.append(x) dodaje element do listy na koniec [08:03] <@Regedit> l.extend(l2) dodaje na koniec listy l elementy listy l2 [08:03] <@Regedit> l.insert(i, x) wstawia do listy l na pozycji i element x [08:03] <@Regedit> wszystkie dalsze przesuwa [08:03] <@Regedit> l.remove(x) usuwa pierwszy element o podanej wartosci [08:04] <@Regedit> l.pop() zwraca i usuwa ostatni element listy [08:04] <@Regedit> niestety przykladow nie przygotowalem :) [08:04] <@Regedit> ma byc hardcorowo ;) [08:04] <@Regedit> l.pop(i) j/w ale z wybranej pozycji listy [08:04] <@Regedit> l.index(x) zwraca indeks pierwszej znalezionej pozycji elementu o wartosci x [08:04] <@Regedit> jesli nie znajdzie to rzuca wyjatek [08:05] <@Regedit> l.count(x) zwraca ile razy na liscie l wystepuje element x [08:05] <@Regedit> l.sort() sortuje liste na miejscu [08:05] <@Regedit> a l.reverse() odwraca kolejnosc [08:05] <@Regedit> Python ma tez szczatkowe algorytmy [08:05] <@Regedit> cos jak te znane z STL z C++ [08:05] <@Regedit> m.in. filter, map, reduce [08:05] <@Regedit> ale nie bede ich dokladnie omawial [08:06] <@Regedit> del lista[0] usuwa pierwszy element listy [08:06] <@Regedit> oczywiscie pozostale przesuwa w dol :) [08:06] <@Regedit> del l[2:4] usuwa zakres elementow - cztery poczaawszy od trzeciego [08:06] <@Regedit> a teraz ciekawostka [08:06] <@Regedit> Python ma tez cos co nam przypomina SQL :))) [08:06] <@Regedit> jak chcecie przyklad to odpalcie IDLE i sami wpiszcie takie cos: [08:06] <@Regedit> vec = [2, 4, 6] [08:07] <@Regedit> print [3*x for x in vec if x > 3] [08:07] <@Regedit> albo: [08:07] <@Regedit> vec1 = [2, 4, 6] [08:07] <@Regedit> vec2 = [4, 3, -9] [08:07] <@Regedit> print [x*y for x in vec1 for y in vec2] [08:07] <@Regedit> pytania? [08:07] ¯¯ Modes[#wyklady] Regedit (-m) [08:08] ktos to czyta ? [08:08] :) [08:08] <@mulander> :) [08:08] ja ;] [08:08] o co chodzi? :D [08:08] ale spie ;p [08:08] ja czekam na ten o 21 [08:08] <@phoenix> ja tez ale czasami [08:08] bo za malo (a raczej brak) przykladow praktycznego zastosowania ;) [08:08] <@phoenix> Regedit: przejdz do Hello ... starczy juz [08:09] <@Regedit> print "Hello world!" [08:09] <@Regedit> macie :) [08:09] <@phoenix> loooooooollllllllll [08:09] ¯¯ Modes[#wyklady] Regedit (+m) [08:09] <@Regedit> eh [08:10] <@Regedit> to teraz ostatnia struktura danych - slowniki (ang. dictionaries) [08:10] ¯¯ Modes[#wyklady] Regedit (-m) [08:10] <@Regedit> slucham [08:10] now iec tak: :) [08:10] czy sa jakies liby ktore umozliwjaja zastosowanie pyhona we wlasnych alpikacjach ? [08:10] <@Regedit> tak [08:10] <@Regedit> sam python ma taka mozliwosc [08:10] ¯¯ Joins[#wyklady] Nome (Mirand@pc108-196.cable.tmark.pl) [08:10] <@Regedit> trzeba poczytac, jest rozdzial o tym jak sie osadza [08:10] <@Regedit> w dokumentacji [08:11] dzieki :) [08:11] ¯¯ Modes[#wyklady] Regedit (+m) [08:11] <@Regedit> a wiec slownik tworza dla odmiany nawiasy... klamrowe [08:11] <@Regedit> {} to pusty slownik [08:11] <@Regedit> slownik to kolekcja skojarzonych par klucz-wartosc [08:11] <@Regedit> kolejnosc nie jest zachowywana [08:11] <@Regedit> za to mozemy sie domyslac, ze wewnetrznie slownik realizowany jest jako drzewo tak [08:11] <@Regedit> ze wyszukiwanie wartosci pod danym kluczem jest szybkie [08:11] <@Regedit> przykladowy slownik wyglada tak: [08:12] <@Regedit> {1:"costam", 2:"costam"} itd [08:12] <@Regedit> oczywiscie typy dowolne z tym, ze uwaga [08:12] <@Regedit> kluczem moga byc tylko wartosci typow immutable [08:12] <@Regedit> a wiec typy podstawowe (liczby itp.) oraz string i krotka (tuple) [08:12] <@Regedit> a nie lista ani inny slownik [08:13] <@Regedit> odwolywac sie do elementow slownika mozna za pomoca indeksowania, przy czym jako indeks podaje sie klucz [08:13] <@Regedit> a wiec nie musi to byc liczba, np,: [08:13] <@Regedit> slownik['AAA'] = 'BBB'; [08:13] <@Regedit> slownik ma tez metody: [08:13] <@Regedit> d.keys() zwraca wszystkie klucze i same klucze jako liste [08:13] <@Regedit> d.values() zwraca same wartosci [08:13] <@Regedit> d.items() zwraca liste par (klucz, wartosc) [08:14] <@Regedit> d.has_key(k) sprawdza, czy slownik zawiera podany klucz [08:14] <@Regedit> del d['x'] usuwa element o kluczu 'x' [08:14] <@Regedit> bo ze slownika mozna usuwac i w ogole zmieniac go w czasie istnienia, slowniki sa mutable jak listy [08:14] <@Regedit> jeszcze dict() przerabia liste par (czyli 2-elementowych krotek) na slownik [08:14] <@Regedit> czyli odwrotnie do items [08:15] <@Regedit> zip(l1, l2) laczy dwie kolekcje (np. krotki, listy) w slownik traktujac elementy pierwszej z nich jako klucze a drugiej jako odpowiadajace im wartosci [08:15] <@Regedit> w ogole jedne kolekcje mozna przerabiac na inne za pomoca rzutowania [08:15] <@Regedit> list() [08:15] <@Regedit> tuple() [08:15] <@Regedit> tak samo jak i int(), string() itd. [08:15] <@Regedit> np. [08:15] <@Regedit> i = 1; [08:16] <@Regedit> s = string(i) [08:16] <@Regedit> no i koniec struktur danych, teraz zaczniemy klasy [08:16] <@Regedit> pytania? :) [08:16] ¯¯ Modes[#wyklady] Regedit (-m) [08:16] <@phoenix> nie [08:16] <@Regedit> juz nieduzo zostalo do konca :) [08:16] <@Regedit> wiec zaraz bedziecie sobie mogli spokojnie pogadac :) [08:17] <@phoenix> jeszcze 45 min [08:17] <@Regedit> nie, wczesniej skonczymy [08:17] jaki jest wynik meczu? ;-) [08:17] <@Regedit> o, i to jest dobre pytanie :) [08:17] <@Regedit> wie ktos? [08:17] ¯¯ Modes[#wyklady] Regedit (+m) [08:17] <@Regedit> ok [08:18] <@Regedit> wiec Python ma tez programowanie obiektowe full wypas [08:18] <@Regedit> czyli mozna definiowac wlasne klasy [08:18] <@Regedit> a robi sie to tak: [08:18] <@Regedit> class Klasa: [08:18] <@Regedit> i = 1 [08:18] <@Regedit> __pole_prywatne = 2 [08:18] <@Regedit> def __init__(self, x, y): [08:18] <@Regedit> costam... [08:19] <@Regedit> def metoda(self) [08:19] <@Regedit> costam... [08:19] <@Regedit> no itp. [08:19] <@Regedit> a wiec klasa ma jakas nazwe [08:19] <@Regedit> pola i metody, jak to klasa :) [08:19] <@Regedit> i to jest pierwsze pole [08:19] <@Regedit> a 1 to jego wartosc poczatkowa [08:19] <@Regedit> __pole_prywatne to drugie pole [08:19] <@Regedit> a 2 to jego wartosc poczatkowa [08:19] <@Regedit> __init__ i metoda to metody [08:20] <@Regedit> metoda jest podobna do funkcji tylko ze jako pierwszy parametr musi miec self [08:20] <@Regedit> (w sumie nazwa jest dowolna) [08:20] <@Regedit> a metoda ktora ma nazwe __init__ to nie zwykla metoda tylko konstruktor [08:20] <@Regedit> czyli metoda ktora wywoluje sie sama przy tworzeniu obiektu [08:20] <@Regedit> dobra, szczegoly pomine :)) [08:20] <@Regedit> obiekt tworzy sie tak: [08:21] <@Regedit> obiekt = Klasa() [08:21] <@Regedit> do pol odwoluje sie tak: [08:21] <@Regedit> obiekt.i = 2 [08:21] <@Regedit> metody wywoluje sie tak: [08:21] <@Regedit> obiekt.metoda() [08:21] ¯¯ Joins[#wyklady] Jacek (~jacek@tetra-n46.netp0wer.net) [08:21] <@Regedit> obiekty jako typ danych sa rowniez mutable, a wiec: [08:21] <@Regedit> - mozna zmieniac wartosci ich elementow (pol) [08:21] <@Regedit> - nie moga byc kluczami slownika [08:22] <@Regedit> - przypisane sprawia ze dwie zmienne maja referencje na jeden i ten sam obiekt [08:22] <@Regedit> (chyba :) [08:22] <@Regedit> co ciekawe, pola mozna sobie dodawac i usuwac, nie jest powiedziane ze sie je deklaruje jakie maja byc [08:22] <@Regedit> zupelnie jak w JavaScript [08:22] <@Regedit> jesli pole nie ma wartosci poczatkowej to sie go nie pisze i po prostu mozna zrobic takie cos: [08:22] <@Regedit> class Vector: [08:22] <@Regedit> pass [08:22] <@Regedit> czyli jakby pusta klasa [08:22] <@Regedit> a uzywac jej jak wektora: [08:23] <@Regedit> v = Vector() [08:23] <@Regedit> v.x = 1; [08:23] <@Regedit> v.y = 2; [08:23] <@Regedit> new_pos = (v.x, v.y) [08:23] <@Regedit> v2 = Vector() [08:23] <@Regedit> v2.x, v2.y = new_pos [08:23] <@Regedit> itd. [08:23] <@Regedit> proste :) [08:23] <@Regedit> i tyle o klasach [08:23] ¯¯ Joins[#wyklady] Samlis (~Xelos@ppp23.dialup.zelnet.pl) [08:23] <@Regedit> teraz na zakonczenie jeszcze kilka drobiazkow [08:23] <@Regedit> moduly [08:24] <@Regedit> zeby dalo sie pisac wieksze programy to kod mozna dzielic miedzy wiele plikow [08:24] <@Regedit> ktore stanowia moduly [08:24] <@Regedit> ktore maja swoje nazwy [08:24] <@Regedit> i moduly mozna importowac [08:24] <@Regedit> cos jak #include z C/C++, choc dzieki Bogu tutaj jest jak w Delphi, C# i calym .NET i wszystkich cywilizowanych jezykach programowania [08:24] <@Regedit> czyli nie ma naglowkow :) [08:25] <@Regedit> i sie po prostu importuje w danym module inny modul i mozna uzywac tego co on udostepnia [08:25] <@Regedit> jedna opcja jest taka: [08:25] <@Regedit> jesli mam modul Gfx i w nim funkcje Render, to moge zaimportowac go w innym module: [08:25] <@Regedit> import Gfx [08:26] <@Regedit> i od tej pory wywolywac ta funkcje przez kwalifikacje [08:26] <@Regedit> Gfx.Render() [08:26] <@Regedit> czyli cos jakby kazdy modul wyznaczal wlasna przestrzen nazw (namespace z C++ i innych jezykow) [08:26] <@Regedit> albo opcja 2, mozna zaimportowac pojedynczy symbol (zmienna globalna, klase, funkcje): [08:27] ¯¯ Joins[#wyklady] Livien (Livien@Damned.Angels) [08:27] <@Regedit> from Gfx import Render [08:27] <@Regedit> albo kilka na raz: [08:27] <@Regedit> from Gfx import Render, RenderWireframe [08:27] ¯¯ Parts[#wyklady] Livien (Livien@Damned.Angels)- [08:27] <@Regedit> i wtedy nie trzeba kwalifikowac, wywoluje sie bezposrednio: [08:27] <@Regedit> Render() [08:27] <@Regedit> czyli cos jakby odpowiednik deklaracji using z C++ [08:27] ¯¯ Joins[#wyklady] d3a7h (~d3a7hx1@cqj16.neoplus.adsl.tpnet.pl) [08:28] <@Regedit> mozna tez zasmiecic sobie globalna przestrzen nazw wszystkimi symbolami z innego modulu tak zeby go zainportowac calego ale nie trzwba bylo kwalifikowawc: [08:28] <@Regedit> from Gfx import * [08:28] <@Regedit> ale to oczywiscie jest niezalecane :) [08:28] <@Regedit> jest jeszcze cos wiekszego od modulu - pakiety, ale tego juz nie bede omawial [08:28] <@Regedit> bo to trzebaby pisac naprawde spore rzeczy :) [08:28] <@Regedit> powiem jeszcze o takim drobiazgu jak dokumentacja kodu [08:29] ¯¯ Joins[#wyklady] m471d2 (~matidz@bgd129.neoplus.adsl.tpnet.pl) [08:29] ¯¯ Joins[#wyklady] Karql (~Karql@where.is.my.host) [08:29] <@Regedit> niektore jezyki zaczynaja wprowadzac taki bajer np. C# [08:29] <@Regedit> inne musza sie wspomagac zewnetrznymi narzedziami np. Doxygen [08:29] <@Regedit> a w Pythonie mozna robic cos takiego jak np.: [08:29] <@Regedit> def Funkcja(): [08:29] <@Regedit> "Ta funkcja sluzy do tego i tego" [08:29] ¯¯ Joins[#wyklady] nameee (~kangurx@agg243.neoplus.adsl.tpnet.pl) [08:29] <@Regedit> # tutaj kod.... [08:30] <@Regedit> taki ni z tad ni z owad lancuch jako instrukcja wiadomo ze nic nie robi ale i nie jest bledem [08:30] <@Regedit> ot, zwraca wartosc lancuchowa ktora nie jest dalej uzywana [08:30] <@Regedit> ale jesli on jest pierwsza instrukcja to stanowi dokumentacje tej funkcji [08:30] <@Regedit> tak samo z klasami, metodami itd. [08:30] <@Regedit> i Python automatycznie potrafi z tego zrobic uzytek :) [08:30] <@Regedit> jeszcze taka sprawa jest [08:30] <@Regedit> ze Python ma potezna biblioteke standardowa! [08:31] <@Regedit> kto ma to niech otworzy sobie dokumentacje [08:31] <@Regedit> rozdzial "Global Module Index" [08:31] <@Regedit> i jest masa standardowych modulow do wszystkiego, do bardzo powaznych rzeczy [08:31] <@Regedit> np. do xml, sieci, wielowatkowosci [08:31] <@Regedit> dzieki nim mozna pisac naprawde powazne programy w pythonie [08:31] <@Regedit> ja wspomne tutaj o jednym z tych modulow godnym uwagi nawet jak sie pisze male skrypty - struct [08:32] <@Regedit> nazwa moze malo mowic a warto go znac bo on sluzy do obslugi danych binarnych [08:32] <@Regedit> reprezentowanych jako stringi [08:32] <@Regedit> a tym samym pozwoli na obsluge plikow binarnych, co inaczej jest niemozliwe raczej [08:32] <@Regedit> i na koniec bedzie ten praktyczny przyklad :) [08:32] <@Regedit> tylko chwila, niech go wgram... [08:32] ¯¯ Joins[#wyklady] Drake79 (~krzysztof@nat1.telkonet.pl) [08:33] <@Regedit> www.regedit.risp.pl/pliki/Game.py [08:33] <@Regedit> oto gra w Pythonie ;) [08:33] <@Regedit> prosta bo prosta, konsolowa, ale gra [08:33] <@Regedit> w zgadywanie liczby [08:33] <@Regedit> i to koniec, mozna powiedziec ze z pominieciem pewnych szczeglow omowilismy CALA skladnie jezyka Python [08:33] ¯¯ Modes[#wyklady] Regedit (-m)