Zapisz jako PDF
Transkrypt
Zapisz jako PDF
Spis treści 1 Wprowadzenie 2 Lista 2.1 Przykład użycia listy 2.2 Przydatne metody klasy lista 2.3 Zadanie: wariancja i odchylenie standardowe średniej 2.4 Zadanie: outliers 2.5 Zadanie: outliers 2 3 Krotka 3.1 Notacja „krotkowa” 3.1.1 Nawiasy 3.1.2 Krotka pusta lub z 1 elementem 4 Sekwencje 4.1 Indeksy 4.2 Jak to działa? 4.2.1 Zadanie 4.2.2 Zadanie 5 Odniesienia 6 Więcej o ciągach znaków 6.1 Jak to działa? Wprowadzenie Struktury danych to typy danych posiadających pewną wewnętrzną organizację/strukturę. Struktury danych tworzymy łącząc w określony sposób prostsze typy danych. Przykładem może być książka telefoniczna, gdzie odpowiednio organizując i łącząc proste typy: napis (zawierający nazwisko) i int (zawierający numer telefonu) tworzymy nowy typ danych określający jak jest zbudowany pojedynczy wpisy do książki telefonicznej. W Pythonie istnieją cztery podstawowe struktury danych — lista, krotka, słownik i zbiór. Tak naprawdę są to klasy — odpowiednio list, tuple, dict, set. Niemniej, aby poprawnie używać obiektów, wystarczy wiedzieć, że obiekty pewnej klasy mają wspólne zachowanie zdefiniowane przez tę klasę. Oznacza to między innymi, że obiekty mają pewien zbiór metod, czyli funkcji które można uruchamiać pisząć obiekt.metoda(). Lista Lista to struktura, która zawiera uporządkowaną sekwencję obiektów. Tych obiektów może być zero, wtedy lista jest pusta, lub dowolnie dużo. Ten sam obiekt może występować na liście wielokrotnie. Dwie najważniejsze operacje, jakie można wykonać na liście, to: 1. sekwencyjne działania na obiektach od zerowego do ostatniego. Dzięki temu można użyć listy do iterowania pętli. Wyrażenie for element in lista: rozpoczyna pętlę, w której dostępny jest kolejno każdy element listy. 2. wydobycie z listy obiektu o danym indeksie. Używamy to tego operatora indeksowania [] Łatwo sobie to wyobrazić za pomocą listy zakupów, na której masz zapisane rzeczy do kupienia. Jedyna różnica jest taka, że na liście zakupów zazwyczaj rzeczy wpisuje się jedną pod drugą, zaś w Pythonie listę zapisuje się rozdzieląc przecinkami obiekty. Najprostszym sposobem uzyskania listy jest właśnie zapisanie w treści programu ciągu „rzeczy“ rozdzielonych przecinkami, wszystko objęte nawiasami kwadratowymi. Innym sposobem jest wywołanie funkcji, która zwróci listę. Do listy można dodawać elementy i je z niej usuwać. Te operacje zmieniają listę, więc mówimy, że lista jest zmiennym typem danych. Przykład użycia listy #!/usr/bin/env python # -*- coding: utf-8 -*# Nazwa pliku: lista.py # To moja lista zakupów: lista = ['jabłko', 'mango', 'marchew', 'kiwi'] print 'Mam', len(lista), 'rzeczy do kupienia.' print 'Te rzeczy to:', for i in lista: print i, print '\nMuszę jeszcze kupić ryż.' lista.append('ryż') print 'Teraz moja lista to:', lista print 'Posortuję moją listę.' lista.sort() print 'Posortowana lista to:', lista print 'Pierwsza rzecz, jaką muszę kupić, to', lista[] rzecz = lista[] del lista[] print 'Kupiłem', rzecz print 'Moja lista teraz to:', lista Rezultat: Mam 4 rzeczy do kupienia. Te rzeczy to: jabłko mango marchew kiwi Muszę jeszcze kupić ryż. Teraz moja lista to: ['jabłko', 'mango', 'marchew', 'kiwi', 'ryż'] Posortuję moją listę. Posortowana lista to: ['jabłko', 'kiwi', 'mango', 'marchew', 'ryż'] Pierwsza rzecz, jaką muszę kupić, to jabłko Kupiłem jabłko Moja lista teraz to: ['kiwi', 'mango', 'marchew', 'ryż'] Jak to działa? Zmienna lista jest listą zakupów kogoś wybierającego się do sklepu. Przechowujemy tam jedynie słowa oznaczające przedmioty do kupienia, ale tak naprawdę lista może zawierać dowolne obiekty, np. liczby czy inne listy. Użyliśmy też pętli for...in... do przejścia po wszystkich elementach listy. W tym momencie można zauważyć, że lista jest przykładem sekwencji. Ale sekwencje poznasz trochę później. Zauważ, że na końcu polecenia print użyliśmy przecinka. Powoduje to, że Python zakończy wypisywanie spacją, a nie przejściem do nowej linii. Następnie dodaliśmy obiekt do listy metodą append, po czym sprawdziliśmy, czy to podziałało, po prostu każąc wypisać nową zawartość listy na ekran. Po tym wszystkim posortowaliśmy listę za pomocą metody sort. Ważne jest to, że wynik powstaje przez przestawianie obiektów wewnątrz tej samej listy. Innymi słowy, żaden nowy obiekt nie zostaje stworzony, zmienia się tylko kolejność elementów na liście, co nazywamy sortowaniem w miejscu. Zamiast sortowania w miejscu, można by stworzyć nową listę zawierającą te same elementy w innej kolejności. Do wykonania takiej operacji można wykorzystać funkcję sorted: Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic posortowana = sorted(lista) Istotna różnica jest taka, że posortowana jest nowym obiektem, a stara lista pozostaje nienaruszona. Z tego przykładu widać, że lista jest typem zmiennym, czyli obiekty tej klasy można modyfikować. W przypadku innych typów, jak krotka (tuple) czy napis (str), dysponujemy tylko tym drugim sposobem sortowania. Mówimy, że są to typy niezmienne, przez co rozumiemy, że obiekt tej klasy, raz stworzony, nie może być zmieniony. Gdy kupiliśmy już jakąś rzecz z listy, chcemy tę pozycję usunąć. Używamy do tego polecenia del — tutaj chcemy wyrzucić pierwszy (czyli w Pythonie zerowy) element, więc piszemy del lista[0]. Przydatne metody klasy lista Poniżej prezentujemy metody dla obiektów klasy list. Niech nasza przykładowa lista nazywa się L: L.append(x) Dodaje element x na koniec listy L. Taki sam efekt daje wyrażenie: L[len(L):] = [x]. L.extend(L2) Wydłuża listę L dodając na jej końcu wszystkie elementy listy L2. Taki sam efekt daje wyrażenie: L[len(L):] = L2. L.insert(i, x) Wstawia element x do listy L na pozycji i. Dotychczasowe elementy listy L o indeksach od i do ostatniego mają teraz indeksy zwiększone o 1. Na przykład L.insert(0, x) wstawia element x na początek listy L natomiast L.insert(len(L), x) dodaje element na koniec listy. L.remove(x) Usuwa z listy L pierwszy napotkany element o wartości x. Uwaga: Jeśli takiego elementu nie ma funkcja generuje błąd! L.pop(i) Usuwa z listy L element o indeksie i i zwraca jego wartość. Jeśli nie podamy argumetu i to domyślnie funkcja zostanie zastosowana do ostatniego elementu listy. L.index(x) Zwraca pierwszy napotkany na liście L element o wartości x. Uwaga: Jeśli takiego elementu nie ma funkcja generuje błąd! L.count(x) Zwraca liczbę wystąpień elementu o wartości x na liście L. L.sort() Sortuje elementy listy L w miejscu. L.reverse() Odwraca kolejność elementów na liście L w miejscu. >>> L = [66.25, 333, 333, 1, 1234.5] >>> print L.count(333), L.count(66.25), L.count('x') 2 1 >>> L.insert(2, -1) >>> L.append(333) >>> L [66.25, 333, -1, 333, 1, 1234.5, 333] >>> L.index(333) 1 >>> L.remove(333) >>> L [66.25, -1, 333, 1, 1234.5, 333] >>> L.reverse() >>> L [333, 1234.5, 1, 333, -1, 66.25] >>> L.sort() >>> L [-1, 1, 66.25, 333, 333, 1234.5] Zadanie: wariancja i odchylenie standardowe średniej Napisz program, który wczytuje wyniki pomiaru pewnej wielkości, czyli po prostu listę liczb. Niech użytkownik wpisuje liczby podając po jednej w każdej linijce „standardowego wejścia” — czyli na przykład wpisując je z klawiatury. Pusta linijka niech oznacza koniec danych. Po wczytaniu wszystkich liczb, wypisz je w kolejności rosnącej, wraz z odchyleniem każdej liczby od średniej. Następnie wypisz nieobciążoną estymatę wariancji i odchylenia standardowego średniej całej sekwencji. Przykład: Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic Wpisz liczby: 1 3 2.5 Dzięki. Posortowane: 1 -1.167 2.5 0.333 3 0.833 wariancja=1.083 odchylenie=0.601 Wskazówka: wariancja oraz odchylenie standardowe oraz odchylenie standardowe średniej Zadanie: outliers Przez outliers rozumie się punkty odstające od reszty danych. W przypadku pomiarów takie punkty mogą na przykład pochodzić z błędnie przeprowadzonych pomiarów — jeśli mierzymy temperaturę termoparą i wszystkie pomiary temperatury dały ok. 30 mV, a tylko jeden 0 mV, to może w tym jednym pomiarze termopara odłączyła się od woltomierza? Niemniej zwyczajny statystyczny rozrzut wyników też może skutkować pomiarami leżącymi daleko od średniej, tyle że z małym prawdopodobieństwem. W przypadku rozkładu Gaussa 99,7% wyników (średnio) pada w przedziale [μ−3σ, μ+3σ], gdzie μ to średnia, a σ to odchylenie standardowe. Napisz program, który tak jak w poprzednim przykładzie wczyta listę liczb, a następnie wypisze te z nich, które leżą poza przedziałem 3σ. Dla każdej z wypisywanych liczb wypisz też jej kolejność na liście. Na końcu napisz jaki procent liczb znalazł się poza przedziałem 3σ. Zadanie: outliers 2 W poprzednim przykładzie liczby były wprowadzane przez użytkownika programu. Wprowadzanie liczb szybko robi się męczące. Na szczęście można użyć generatora liczb losowych, żeby „wprowadzić” liczby. Generator liczb pseudolosowych zazwyczaj zwraca po prostu liczby z pewnego przedziału — np. pomiędzy 0 a 1 — zgodnie z rozkładem płaskim. Innymi słowy, wylosowanie liczby z dowolnego miejsca w całym przedziale jest tak samo prawdopodobne. Takim generatorem jest funkcja random.random. W naszym przykładzie chcemy mieć liczby które przypominają wyniki pomiarów — czyli mają raczej rozkład normalny niż płaski. Jeśli dysponujemy generatorem liczb losowych płaskich, to bez problemu można „przerobić” go na generator liczb z dowolnego rozkładu jeśli tylko znamy dystrybuantę tego rozkładu. Na szczęście ten krok został już za nas wykonany i możemy po prostu skorzystać z funkcji random.normalvariate. Funkcja normalvariate(mu, sigma) z modułu random ma dwa parametry — środek rozkładu i jego szerokość. Zwraca pojedynczą liczbę wylosowaną zgodnie z rozkładem normalnym. Zmodyfikuj program z poprzedniego przykładu tak, by zamiast wczytywać liczby, generował je automatycznie. Od użytkownika pobierz tylko liczbę liczb n, i pożądane parametry μ, σ, a następnie posłuż się funkcją random.normalvariate by wygenerować n liczb z rozkładu normalnego. Przykład: Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic >>> python outliers2.py N= 100 μ= 3 σ= 1 liczby: 2.93313883, 4.27443167, 3.91314826, 2.85697077, ... 3.90344627, 2.07056563, outliers: 100: -0.469027334 poza 3σ: 1% # 100 wpisane przez użytkownika # 3 wpisane przez użytkownika # 1 wpisane przez użytkownika 3.02747082, 3.72747457, 3.74820712, 0.83560025, 1.67385955, 2.60574017, 2.01952891, 2.81624163, -0.469027334 Pamiętaj, że oczekiwana częstość występowania liczb spoza przedziału to tylko 3‰. Krotka Krotka to niemodyfikowalna lista. Podobnie jak listy, krotki można wygodnie tworzyć, wykorzystując specjalną notację: krotkę definiuje się przez wypisanie jej elementów oddzielonych przecinkami. Często, dla czytelności, warto zamknąć definicję krotki w nawias. Krotki używa się w sytuacji, gdy chcemy przechowywać niezmienną sekwencję obiektów. Przykład: #!/usr/bin/env python # -*- coding: utf-8 -*# Nazwa pliku: krotka.py zoo = ('pyton', 'słoń', 'pingwin') # Pamiętaj, że nawiasy są opcjonalne. print 'Liczba zwierząt w zoo:', len(zoo) nowe_zoo = ('małpa', 'wielbłąd', zoo) print print print print print 'Liczba klatek w nowym zoo:', len(nowe_zoo) 'Wszystkie zwierzęta w nowym zoo to:', nowe_zoo 'Zwierzęta sprowadzone ze starego zoo to:', nowe_zoo[2] 'Ostatnim zwierzęciem sprowadzonym ze starego zoo jest', nowe_zoo[2][2] 'Liczba zwierząt w nowym zoo:',len(nowe_zoo)-1+len(nowe_zoo[2]) Rezultat: Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic Liczba zwierząt w zoo: 3 Liczba klatek w nowym zoo: 3 Wszystkie zwierzęta w nowym zoo to: ('małpa', 'wielbłąd', ('pyton', 'słoń', 'pingwin')) Zwierzęta sprowadzone ze starego zoo to: ('pyton', 'słoń', 'pingwin') Ostatnim zwierzęciem sprowadzonym ze starego zoo jest pingwin Liczba zwierząt w nowym zoo: 5 Jak to działa? Zmienna zoo odnosi się do krotki złożonej ze zwierząt. Jak widać, dzięki funkcji len możemy sprawdzić długość krotki. To dodatkowo pokazuje, że krotka jest sekwencją. Z powodu zamknięcia starego zoo, przenosimy zwierzęta do nowego. Dlatego też krotka nowe_zoo zawiera kilka zwierząt, które były już tam wcześniej, a także zwierzęta przeniesione ze starego zoo. Wracając do rzeczywistości, zauważ, że krotka w krotce nie traci swojej tożsamości. Możemy odnieść się do pojedynczego elementu krotki poprzez podanie pozycji tego elementu w nawiasach kwadratowych, zupełnie jak przy listach. Nazywamy to operatorem indeksowania. Uzyskujemy trzeci element w krotce nowe_zoo przez wpisanie nowe_zoo[2] oraz trzeci element w trzecim elemencie tej krotki dzięki nowe_zoo[2][2]. Notacja „krotkowa” Nawiasy Pomimo, że są opcjonalne, warto często użyć nawiasów, by podkreślić, że tworzy się krotkę. Np. Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic a = (1, 2, 3) # zamiast a = 1, 2, 3 Z tych dwóch równoważnych wersji, pierwsza wydaje się czytelniejsza. Odmienna sytuacja występuje w przypadku wypisywania zmiennych. Wyrażenia print 1,2,3 oraz print (1,2,3) mają różne znaczenia. Za pierwszym razem uzyskamy trzy cyfry oddzielone przecinkami, a za drugim krotkę (czyli te same trzy liczby oddzielone przecinkami, ale jeszcze dodatkowo otoczone nawiasami). Krotka pusta lub z 1 elementem Krotkę pustą tworzy się za pomocą pustej pary nawiasów: Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic pusta = () Krotka jednoelementowa to już większy problem. Jeśli napiszesz wyrażenie zawierające pojedynczą zmienną w nawiasach okrągłych, to (teoretycznie), można by to rozumieć jako 1. krotkę jednoelementową 2. jedno-elementowe wyrażenie wzięte w nawias Z tych dwóch możliwości twórcy języka wybrali tą drugą. Dlatego aby stworzyć krotkę, należy użyć przecinka po pierwszym (i jedynym) jej elemencie. Na przykład: Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic samotnik = (2, ) Uwaga dla programujących w Perlu Listy w listach nie tracą swojej tożsamości. Nie są one spłaszczane, jak w Perlu. To samo odnosi się do krotki w krotce, krotki w liście, listy w krotce itd. Dla Pythona to po prostu obiekty przechowywane w innym obiekcie, to wszystko. Sekwencje Listy, krotki i napisy określamy mianem sekwencji. Kolejność elementów w sekwencji jest ustalona i elementy te są ponumerowane. Jest to cecha wspólna wszystkich sekwencji. Numer elementu w sekwencji jest nazywany indeksem. Podstawową operacją dla sekwencji jest pobranie wartości elementu o zadanym indeksie. Ponadto możemy sprawdzić czy dany obiekt jest elementem danej sekwencji (operatory in i not in). Wymienione wcześniej trzy typy sekwencji — lista, krotka i ciąg znaków, mogą być dodatkowo pocięte, dzięki czemu uzyskujemy wycinek, czyli pod-sekwencję zawierającą część obiektów z oryginalnej sekwencji. Wybieranie elementów przez indeksowanie lub wycinanie pokażemy dokładniej na przykładzie napisu. Napisy są również przykładem sekwencji elementów (liter). Indeksy Indeksując napis odwołujemy się do wybranego znaku. Znaki mogą być liczone od początku napisu (pierwszy ma numer 0) lub od jego końca (ostatni ma numer –1). 1 ↓ T 0 ↓ tekst = " S ↑ [ 2 ↓ R ... ↓ I –2 ↓ N –1 ↓ G " ↑ ] Na powyższym rysunku czerwone indeksy są liczone od początku napisu, a niebieskie od jego końca. Teraz przykłady: tekst[0] → "S" tekst[1] → "T" tekst[2] → "R" tekst[−2] → "N" tekst[−0] → "S" tekst[20] → IndexError Nie ma indeksu −0, bo w Pythonie −0 == 0, więc −0 również wskazuje na początek napisu. Numery wskazujące na miejsca poza końcem napisu lub przed jego początkiem są błędne, Python zwróci informację o błędzie, tzw. IndexError. Przykład drugi: #!/usr/bin/env python # -*- coding: utf-8 -*# Nazwa pliku: sekwencja.py lista = ['jabłko', 'mango', 'marchew', 'kiwi'] imie = 'Juliusz' # Indeksowanie print 'Rzecz 0 to', lista[] print 'Rzecz 1 to', lista[1] print 'Rzecz 2 to', lista[2] print 'Rzecz 3 to', lista[3] print 'Rzecz -1 to', lista[-1] print 'Rzecz -2 to', lista[-2] print 'Litera 0 to', imie[] # Cięcie listy. print 'Rzeczy od print 'Rzeczy od print 'Rzeczy od print 'Rzeczy od 1 do 3 to', lista[1:3] 2 do końca to', lista[2:] 1 do -1 to', lista[1:-1] początku do końca to', lista[:] # Cięcie ciągu znaków. print 'Litery od 1 do 3 to', imie[1:3] print 'Litery od 2 do końca to', imie[2:] print 'Litery od 1 do -1 to', imie[1:-1] print 'Litery od początku do końca to', imie[:] Rezultat: Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic Rzecz 0 to jabłko Rzecz 1 to mango Rzecz 2 to marchew Rzecz 3 to kiwi Rzecz -1 to kiwi Rzecz -2 to marchew Litera 0 to J Rzeczy od 1 do 3 to ['mango', 'marchew'] Rzeczy od 2 do końca to ['marchew', 'kiwi'] Rzeczy od 1 do -1 to ['mango', 'marchew'] Rzeczy od początku do końca to ['jabłko', 'mango', 'marchew', 'kiwi'] Litery od 1 do 3 to ul Litery od 2 do końca to liusz Litery od 1 do -1 to ulius Litery od początku do końca to Juliusz Jak to działa? Najpierw używamy indeksów do pobrania wartości poszczególnych elementów sekwencji. Nawiasy kwadratowe są operatorem indeksowania — gdy przy sekwencji podasz liczbę w nawiasach kwadratowych to uzyskasz element z danej pozycji. Pamiętaj, że w Pythonie, podobnie jak w C i wielu innych językach programowania, sekwencje czy tablice numeruje się od 0, dlatego lista[0] to pierwszy element, a lista[3] to czwarty. Indeks może też być ujemny, wtedy liczenie zaczyna się od końca sekwencji. Dlatego lista[-1] to ostatni element, a lista[-2] to przedostatni. Operacja pobierania wycinka jest wykonywana przez podanie obiektu do pocięcia, a następnie dwóch liczb w nawiasie kwadratowym, przedzielonych dwukropkiem. Pierwsza liczba (przed dwukropkiem) w operacji pobrania wycinka oznacza pozycję startową, zaś druga (za dwukropkiem) wyznacza dokąd cięcie ma zostać wykonane. Jeżeli nie ma pierwszej liczby, to Python zacznie wycinać od początku. Gdy nie ma drugiej, to wytnie aż do końca. Zauważ, że cięcie zaczyna się równo z pozycją startową, ale kończy się przed pozycją końcową. To znaczy, że pozycja startowa jest zawarta w wyciętym fragmencie, ale pozycja końcowa już nie jest. W związku z tym, lista[1:3] zwraca elementy 1 i 2, ale nie zwraca już trzeciego, zaś lista[:] (tzw. pełny wycinek) zwraca kopię sekwencji. Możesz także podać trzeci argument, którym jest krok cięcia (domyślnie 1). >>> lista = ['jabłko', 'mango', 'marchew', 'kiwi'] >>> lista[::1] ['jabłko', 'mango', 'marchew', 'kiwi'] >>> lista[::2] ['jabłko', 'marchew'] >>> lista[::3] ['jabłko', 'kiwi'] >>> lista[::-1] ['kiwi', 'marchew', 'mango', 'jabłko'] Jak widzisz, gdy krok wynosi 2, uzyskujemy elementy numer 0, 2, ..., zaś gdy wynosi 3, uzyskujemy elementy numer 0, 3, ... itd. Wypróbuj różne kombinacje używając interpretera w trybie interaktywnym. Najlepsze jest to, że możesz dokładnie to samo robić na każdym typie sekwencji, czy to lista, czy krotka, czy ciąg znaków! Zadanie Wytwórz listę liczb naturalnych od 1 do 20. Następnie pobierz z tej sekwencji wycinek zawierający wyłącznie liczby parzyste oraz wycinek zawierający liczby nieparzyste od ostatniej do pierwszej. Wybierz co trzecią liczbę zaczynając od 10 i nie przekraczając 20.}} Zadanie Masz pewien napis zawierający poszukiwane hasło w nawiasach klamrowych. napis = "dane_użytkownika = {tajne hasło} login=użytkownik " Napisz funkcję która weźmie napis jako parametr i zwróci samo hasło bez nawiasów klamrowych. Odniesienia Gdy tworzysz obiekt i przypisujesz go do zmiennej, zmienna jedynie odnosi się do tego obiektu, a nie reprezentuje go. Nazywamy to związywaniem (ang. binding) nazwy z obiektem. Tak więc, nazwa zmiennej jedynie wskazuje miejsce w pamięci komputera, w którym znajdują się określone dane. Pociąga to za sobą pewne konsekwencje, które ilustruje poniższy przykład. Przykład: #!/usr/bin/env python # -*- coding: utf-8 -*# Nazwa pliku: odniesienie.py print 'Proste Przypisywanie' lista = ['jabłko', 'mango', 'marchew', 'kiwi'] mojalista = lista # mojalista to tylko inna nazwa dla tej samej zmiennej! del lista[] # Kupiłem pierwszą rzecz, więc ją usuwam z listy. print 'Lista zakupów:', lista print 'Moja lista:', mojalista # Obydwie listy będą zawierać dokładnie to samo, czyli trzy pozycje. # W żadnej z nich nie pojawi się "jabłko", bo dotyczą tego samego obiektu. print 'Kopiowanie za pomocą pełnego wycinka' mojalista = lista[:] # Stwórz kopię za pomocą pełnego wycinka... del mojalista[] # Usuń pierwszą rzecz... print 'Lista zakupów:', lista print 'Moja lista:', mojalista # Teraz te listy będą się różniły. Rezultat: Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic Proste Przypisywanie Lista zakupów: ['mango', 'marchew', 'kiwi'] Moja lista: ['mango', 'marchew', 'kiwi'] Kopiowanie za pomocą pełnego wycinka Lista zakupów: ['mango', 'marchew', 'kiwi'] Moja lista: ['marchew', 'kiwi'] Pamiętaj, że jak chcesz zrobić kopię jakiejś złożonej zmiennej (nie prostej, jak ciąg znaków), to musisz przypisać mu pełny wycinek. Jeżeli zamiast tego po prostu przypiszesz zmiennej inną nazwę, obydwie nazwy będą się odnosić do tego samego obiektu. Uwaga dla programujących w Perl Pamiętaj, że przypisanie listy do zmiennej nie tworzy kopii! Zawsze do skopiowania sekwencji potrzebne jest pobranie pełnego wycinka. Więcej o ciągach znaków Już wcześniej omówiliśmy dogłębnie ciągi znaków, więc co jeszcze można dodać? Cóż... Czy wiedziałeś, że to też są obiekty i również mają swoje metody, jak na przykład sprawdzanie, czy w danym tekście jest określone słowo? Wszystkie ciągi znaków, jakie używasz, mają przypisaną klasę str. Poniżej zaprezentowane jest użycie kilku ciekawych metod tej klasy. Więcej informacji znajdziesz wywołując help(str). Przykład: #!/usr/bin/env python # -*- coding: utf-8 -*# Nazwa pliku: str_metody.py imie = 'Aleksander' # To obiekt klasy str. if imie.startswith('Ale'): print 'Tak, to imię zaczyna się od "Ale"' if 'a' in imie: print 'Tak, to imię zawiera literę "a"' if imie.find('san') != -1: print 'Tak, w tym imieniu jest ciąg "san"' separator = ' do ' mojalista = ['Brazylii', 'Rosji', 'Indii', 'Chin'] print 'Wielka podróż z', separator.join(mojalista) Rezultat: Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic $ python str_metody.py Tak, to imię zaczyna się od "Ale" Tak, to imię zawiera literę "a" Tak, w tym imieniu jest ciąg "san" Wielka podróż z Brazylii do Rosji do Indii do Chin Jak to działa? Tu widzimy wiele metod w akcji. Metoda startswith sprawdza, czy tekst się zaczyna od podanego ciągu znaków. Operator in sprawdza, czy dany ciąg znaków znajduje się w tym tekście. Metoda find sprawdza pozycję podanego ciągu znaków w tekście. Zwraca ona -1, gdy nic nie znajdzie. Klasa str ma też ciekawą metodę join, która łączy elementy sekwencji w jeden długi ciąg znaków, używając podanego ciągu jako separatora.