W trzeciej części cyklu opowiemy o wbudowanych w język typach sekwencyjnych oraz metodach operowania na nich. Także i tu uwzględnimy Pythona 3.
Typy sekwencyjne to skończone zbiory uporządkowanych danych indeksowanych poprzez nieujemne liczby. Podstawowe sekwencyjne typy to łańcuchy znakowe (str), krotki oraz listy:
>>> znaki='abc'
>>> krotka=(1,2,3)
>>> lista=[4,5,6]
Wbudowana funkcja len(z) zwraca ilość elementów zbioru z. Dostęp do poszczególnych elementów obiektów dowolnego uporządkowanego typu sekwencyjnego możliwy jest za pomocą nawiasów klamrowych, należy przy tym pamiętać że elementy są indeksowane od zera:
>>> print(len(znaki))
3
>>> print(znaki[0])
a
>>> print(krotka[1])
2
>>> print(lista[2])
6
Typy sekwencyjne można podzielić na mutowalne i niemutowalne. W powyższym przykładzie dwa pierwsze obiekty są niemutowalne, a więc nie można zmieniać ich zawartości po utworzeniu. Próba zmiany kończy się wyrzuceniem wyjątku:
>>> lista[0]=7
>>> print(lista)
[7, 5, 6]
>>> znaki[0]='x'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
Dla sekwencyjnych typów danych dostępnych jest szereg użytecznych funkcji i operatorów:
| Operator | Opis |
| x in s | logiczna prawda jeśli x jest elementem zbioru s, w przeciwnym wypadku fałsz |
| x not in s | logiczny fałsz jeśli x nie jest elementem zbioru s, w przeciwnym wypadku prawda |
| s + t | złączenie zbiorów s oraz t |
| s * n | n-powtórzeń s |
| s[m] | m-ty element s |
| s[m:n] | wycinek s : od m do n |
| s[m:n:o] | wycinek s: od m do n z krokiem k |
| len(s) | ilość elementów s |
| min(s) | najmniejszy element s |
| max(s) | największy element s |
Typy sekwencyjne wspierają także operatory porównań (==,>,<,>=,<=). W szczególności krotki oraz listy porównywane są poprzez porównywanie kolejnych, odpowiadających sobie elementów. Aby dwa takie obiekty były sobie równe muszą zawierać tyle samo elementów odpowiednich typów w określonej kolejności.
Slicing
Typy sekwencyjne posiadają charakterystyczną własność zwaną slicing’iem, co można rozumieć jako „dzielenie na plastry”. Slicing tworzy nowy obiekt danego typu poprzez „okrojenie” podanego zbioru do wybranych elementów. Przykładowo wyrażenie z[n:m] pozwala wybrać wszystkie elementy zbioru „z”, których indeks x spełnia warunek n<=x<m (czyli dla wyrażenia z[0:10] mamy do czynienia z elementami zbioru „z” o indeksach od 0 do 9 włącznie).
Niektóre typy sekwencyjne posiadają także „rozszerzony” slicing z trzecim parametrem określającym krok, wyrażenie z[n:m:o] wybierze wszystkie elementy zbioru „z” o określonym indeksie x, gdzie x=n+p*k dla p>=0 oraz n<=x i n<=x<m.
Typy znakowe
Typy znakowe (łańcuchy znakowe) reprezentują uporządkowaną sekwencję symboli (znaków alfabetu). Jedna z zasadniczych różnic pomiędzy wersjami 3.0 a 2.6 (i wcześniejszymi) jest właśnie implementacja łańcuchów znakowych.
Python 2.6
Python 2.6 podobnie jak jego poprzednicy posiada dwa rodzaje typów znakowych: str oraz unicode. Oba typy wywodzą się z tej samej klasy basestring, dzięki czemu posiadają szereg wspólnych metod.
Łańcuch znakowy typu str tworzony jest poprzez umieszczenie tekstu w cudzysłowach lub apostrofach, łańcuch unikodowy (ang. unicode string) powinien być dodatkowo uzupełniony znakiem u przed cudzysłowem/apostrofem:
>>> text="znaki"
>>> inny='str'
>>> unikod=u”tekst unikodowy”
Można konwertować pomiędzy typem str a unicode korzystając z dostępnych metod encode oraz decode:
>>> unikod=u"żółta kość"
>>> unikod
u'\u017c\xf3\u0142ta ko\u015b\u0107'
>>>
>>> print(s)
żółta kość
>>> string=unikod.encode("cp852")
>>> string
'\xbe\xa2\x88ta ko\x98\x86'
>>> print(string)
żółta kość
>>> unikod2=string.decode("cp852")
>>> unikod2
u'\u017c\xf3\u0142ta ko\u015b\u0107'
>>> print(unikod2)
żółta kość
Na początku powyższego przykładu tworzony jest unikodowy obiekt unikod o zawartości „żółta kość”. Następnie za pomocą metody encode tworzony jest na jego podstawie obiekt string typu str o określonym kodowaniu (cp852 to domyślne kodowanie konsoli Windows). Ostatecznie obiekt ten został użyty w metodzie decode do utworzenia obiektu unikodowego unikod2 (z odpowiednim kodowaniem, w przeciwnym razie użyte byłoby kodowanie domyślne). Jak widać przekształcenia ostatecznie doprowadziły do utworzenia obiektu o typie i zawartości identycznej z obiektem z początku przykładu.
Python 3.0
W Python’ie 3.0 typ str jest już unikodowy, nie ma więc potrzeby by istniał (dostępny jeszcze w wersji 2.6) typ unicode (notacja z prefix’em u” nie istnieje).
Nowością jest natomiast typ bajtowy (bytes). To nowy, niemutowalny typ umożliwiający przechowywanie bajtowych wartości (wartości typu całkowitego z przedziału 0..255). Analogicznie jak przy typach str i unicode z Python’a 2.6 tak i tu można natomiast konwertować str na bytes za pomocą metody str.encode(), do odwrotnej konwersji służy metoda bytes.decode(). Można także użyć wyrażeń bytes(s, encoding) oraz str(b, encoding).
Obiekty tego typu można tworzyć umieszczając znak b przed apostrofem lub cudzysłowem:
>>> o=b"abc"
>>> print(o)
b'abc'
Typy str i bytes nie posiadają wspólnej nadklasy i nie mogą być mieszane (przykładowo nie można dodawać do siebie obiektów tych typów).
Nowy jest także typ bytearray : to mutowalny typ o interfejsie podobnym do bytes. Można konwertować pomiędzy obiektami typów bytes i bytearray.
Typy bytes oraz bytearray dostępne są zarówno w Python’ie 3.0 i 2.6.
Metody klasy str
Niezależnie czy mamy do czynienia z Python’em 3.0 czy 2.6 klasa str posiada szereg użytecznych metod (występują one także w unikodzie Python’a 2.6)
| Metoda | Opis |
| str.capitalize() | Zwraca kopię łańcucha str, którego pierwsza litera będzie duża. |
| str.center(d[,z]) | Zwraca wycentrowany łańcuch o długości d dopełniony spacjami jeśli nie podano innego znaku w parametrze z. |
| str.count(l[,p[,k]]) | Zwraca ilość wystąpień łańcucha l w str pomiędzy w zakresie od p do k (indeksy tak jak w notacji „plastrowej” [p: k]). |
| str.decode([encoding[, errors]]) | |
| str.encode([encoding[, errors]]) | Zwraca obiekt unikodowy reprezentujący zakodowany łańcuch str. Jeśli nie jest podane kodowanie (poprzez parametr encoding) to użyte zostanie kodowanie domyślne, errors ma znaczenie jak w metodzie str.decode. |
| str.endswith(suffix[, start[, end]]) | Zwraca True jeśli łańcuch str kończy się na podanym łańcuchem suffix, w przeciwnym razie False. Parametr suffix może być także zbiorem łańcuchów (‘łańcuch 1’,’łańchuch 2’,’…’). Opcjonalne parametry start oraz end określają indeksy od jakiego wyszukiwanie ma się rozpocząć i zakończyć. |
| str.expandtabs([tabsize]) | Zwraca kopię łańcucha str, w którym wszystkie znaki tabulacji zostały zastąpione jedną lub większą ilością spacji. Parametr tabsize określa ilość spacji na tabulację, domyślnie jest równy 8. |
| str.find(sub[, start[]]), end | Zwraca indeks pierwszego wystąpienia łańcucha sub w str. Opcjonalne argumenty oznaczające początek (start) oraz koniec (end) wyszukiwania podane są w notacji „plastrowej”. Jeśli łańcuch nie został znaleziony zwraca -1. |
| str.format(format, *args, **kwargs) | Nowa (dostępna zarówno w Python’ie 3.0 jak i 2.6) metoda formatująca, szczegółowo opisana w rozdziale „formatowanie łańcuchów znakowych”. |
| str.index(sub[, start[, end]]) | Działa jak find(), lecz wyrzuca wyjątek ValueError gdy łańcuch sub nie został znaleziony. |
| str.isalnum() | Zwraca True jeśli wszystkie znaki łańcucha str są alfanumeryczne i nie jest on pusty, w przeciwnym wypadku False. |
| str.isalpha() | Zwraca True jeśli wszystkie znaki łańcucha str są literami i nie jest on pusty, w przeciwnym wypadku False. |
| str.isdigit() | Zwraca True jeśli wszystkie znaki łańcucha str są cyframi i nie jest on pusty, w przeciwnym wypadku False. |
| str.islower() | Zwraca True jeśli wszystkie litery w łańcuchu str są małe i zawiera on choć jedną literę, w przeciwnym wypadku False. |
| str.isspace() | Zwraca True jeśli łańcuch str zawiera tylko białe znaki i zawiera on choć jeden taki znak, w przeciwnym wypadku False. |
| str.istitle() | Zwraca True jeśli łańcuch str zawiera tytuł i ma on choć jeden znak , w przeciwnym wypadku False. |
| str.isupper() | Zwraca True jeśli wszystkie znaki łańcucha str są duże i zawiera on choć jeden znak, w przeciwnym wypadku False. |
| str.join(seq) | Zwraca łańcuch, który jest połączeniem łańcuchów podanych w sekwencji seq z użyciem separatora w postaci samego łańcucha str. |
| str.ljust(width[, fillchar]) | Zwraca łańcuch wyjustowany do lewej o długości width. Łańcuch dopełniany jest spacją jeśli nie podano innego znaku w parametrze fillchar. |
| str.lower() | Zwraca łańcuch str skonwertowany do małych liter. |
| str.lstrip([chars]) | Zwraca łańcuch będący kopią str z usuniętymi początkowymi białymi znakami lub znakami podanymi w parametrze chars. |
| str.partition(sep) | Dzieli łańcuch str po pierwszym wystąpieniu separatora sep, zwraca 3-elementową krotkę zawierającą część przed separatorem, sam separator oraz część po nim. |
| str.replace(old, new[, count]) | Zwraca kopię łańcucha str, w którym wszystkie (jeśli nie podano jawnie ilości za pomocą parametru count) wystąpienia łańcucha old zostały zamienione na łańcuch new. |
| str.rfind(sub[, start[, end]]) | Zwraca największy indeks wystąpienia łańcucha sub w str. Opcjonalnie można podać początek oraz koniec wyszukiwania za pomocą paremtrów start oraz end (notacja „plastrowa”). Zwraca -1 jeśli nie znaleziono. |
| str.rindex(sub[, start[, end]]) | Działa jak rfind, lecz wyrzuca wyjątek ValueError jeśli nie znaleziono wystąpienia łańcucha. |
| str.rjust(width[, fillchar]) | Zwraca łańcuch wyjustowany do prawej strony, o długości width. Łańcuch dopełniany jest spacją jeśli nie podano innego znaku w parametrze fillchar. Zwraca str jeśli podana długość jest mniejsza niż len(s). |
| str.rpartition(sep) | Dzieli łańcuch str po ostatnim wystąpieniu separatora sep, zwraca 3-elementową krotkę zawierającą część przed separatorem, sam separator oraz część po nim. |
| str.rsplit([sep[, maxsplit]]) | Zwraca listę słów w łańcuchu str używając sep jako separatora (lub białych znaków jeśli nie jest podany). Wyłączając dzielenie od prawej strony działa jak metoda split opisana poniżej. |
| str.rstrip([chars]) | Zwraca łańcuch będący kopią str z usuniętymi końcowymi białymi znakami lub znakami podanymi w parametrze chars. |
| str.split([sep[, maxsplit]]) | Zwraca listę słów powstałą poprzez podzielenie łańcucha str na podłańcuchy (zaczynając od lewej strony) z użyciem separatora sep (lub białych znaków jeśli nie jest podany). Maksymalną ilość podziałów można podać za pomocą parametru maxsplit. |
| str.splitlines([keepends]) | Zwraca listę linii zawartych w łańcuchu str łamiąc je w miejscach wystąpienia znaku końca linii. Znaki końca linii nie są zawarte w powstałych łańcuchach, chyba że opcjonalny parametr keepend ma wartość True. |
| str.startswith(prefix[, start[, end]]) | Zwraca True jeśli łańcuch str zaczyna się od łańcucha prefix w przeciwnym razie False (prefix może być także listą odpowiednich łańcuchów). Opcjonalne parametry start oraz end umożliwiają określenie odpowiednio początkowych oraz końcowych indeksów wyszukiwania. |
| str.strip([chars]) | Zwraca kopię łańcucha str z usuniętymi początkowymi oraz końcowymi białymi znakami. Usuwanie innych znaków możliwe jest poprzez podanie ich w parametrze chars. |
| str.swapcase() | Zwraca kopię łańcucha str z zamienionymi dużymi znakami na małe i odwrotnie. |
| str.title() | Zwraca kopię łańcucha str w postaci tytułu: słowa rozpoczynają się od dużych liter, wszystkie pozostałe litery są małe. |
| str.translate(table[, deletechars]) | Zwraca kopię łańcucha str, gdzie wszystkie znaki występujące w opcjonalnym parametrze deletechars są usunięte, a wszystkie pozostałe znaki są zamapowane z użyciem podanej tabeli przekształceń, którą musi być łańcuch o długości 256 znaków. |
| str.upper() | Zwraca łańcuch, w którym wszystkie małe litery łańcucha str zostały zamienione na duże. |
| str.zfill(width) | Zwraca łańcuch będący kopią str, dopełniony zerami do długości width lub sam łańcuch str jeśli rozmiar width jest mniejszy od długości łańcucha. |
Formatowanie łańcuchów znakowych
Formatowanie łańcuchów znakowych jest jednym z elementów, które ulegają zmianie w Python’ie. Standardowym operatorem formatowania w wersji oraz wcześniejszych był znak %. W wersji 3.0 można się nim także posługiwać, jednak najprawdopodobniej w wersji 3.1 będzie on oznaczony jako niepożądany (ang. deprecated), a w przyszłych wydaniach ostatecznie usunięty.
Zalecanym, obecnym także w Python’ie 2.6, sposobem formatowania łańcuchów znakowych jest metoda format. Metoda ta traktuje łańcuch znakowy jako szablon, a użyte w nim nawiasy klamrowe są znakami o specjalnym przeznaczeniu, np.:
>>> szablon1="Witaj {0}"
>>> szablon2="Data urodzenia:{rok}-{miesiac}-{dzien}"
>>> print(szablon1.format('Wiktor'))
Witaj Wiktor
>>> print(szablon2.format(rok=2000,miesiac=3,dzien=22))
Data urodzenia:2000-3-22
Nazwami pól mogą być zarówno liczby określające ich indeks jak i argumenty o podanej nazwie. Można także odwoływać się do atrybutów obiektów oraz poprzez klucze do odpowiednich wartości słownika.
Poniższy przykład pokazuje dostęp do atrybutów day, month oraz year obiektu reprezentującego aktualną datę, a także do wartości słownika poprzez odpowiednie klucze :
>>> import datetime
>>> data = datetime.datetime.now()
>>> slownik = {"d":"dzien","m":"miesiac","r":"rok"}
>>> szablon = "Jest {1[d]}:{0.day},{1[m]}:{0.month},{1[r]}:{0.year}"
>>> >>> print(szablon.format(data,slownik))
Jest dzien:4,miesiac:1,rok:2009
Po indeksie/nazwie pola może wystąpić specyfikator formatu poprzedzony znakiem dwukropka.
Ogólny format specyfikatora formatu jest następujący:
[[wypełnienie]justowanie][znak][#][0][rozmiar].[precyzja][typ]
gdzie:
- wypełnienie : dowolny znak oprócz }
- justowanie : znak określający rodzaj justowania
- znak (+ lub -) dla wartości numerycznej
- # : oznacza użycie prefix’u dla niedziesiętnej wartości numerycznej
- 0 : przed rozmiarem oznacza dopełnienie zerami
- rozmiar : wartość całkowita określająca rozmiar pola
- precyzja : precyzja dla wartości zmiennoprzecinkowej
- typ : znak oznaczający typ prezentacji
Znak określający wypełnienie może wystąpić przed znakiem określającym justowanie, który może przyjmować następujące wartości:
| Znak | Znaczenie |
| < | Justowanie do lewej (domyślne) |
| > | Justowanie do prawej |
| ^ | Centrowanie |
| = | Dla wartości numerycznych wymusza dopełnienie po znaku liczby, a przed samymi liczbami |
Przykładowo:
>>> s=’wypis’
>>> "{0:<10}".format(s)
'wypis '
>>> "{0:>10}".format(s)
' wypis'
>>> "{0:^10}".format(s)
' wypis '
>>> "{0:=10}".format(-123)
'- 123'
Zawartość zmiennej „s” (łańcuch ‘wypis’) jest wypisywana na 10 polach, kolejno wyjustowana do lewej (domyślne zachowanie), prawej i środka. Numeryczna wartość -123 jest wypisywana również na 10 polach, z dopełnieniem po znaku liczby.
Typ prezentacji daje dodatkowe możliwości formatowania wartości numerycznej:
| Znak | Znaczenie |
| b | Wypis wartości numerycznej w postaci dwójkowej |
| c | Konwertuje podaną wartość całkowitą do odpowiedniego znaku unikodu i zwraca ten znak |
| d | Wypis wartości w postaci dziesiętnej |
| o | Wypis wartości w formacie ósemkowym |
| x | Wypis wartości w formacie szesnastkowym |
| e | Notacja naukowa, użyciem znaku ‘e’ do określenia wykładnika |
| g | Ogólny format, znak wykładnika zostanie użyty tylko jeśli wartość jest zbyt duża. |
| n | Liczba, oznacza to samo co ‘g’ (dla wartości zmiennoprzecinkowych) lub ‘d’ (dla całkowitych) |
| % | Procentowa, wartość zostanie pomnożona przez 100 i wypisana ze znakiem % na końcu. |
Użycie wybranych typów prezentacji pokazuje poniższy przykład:
>>> "123 w postaci binarnej dopełnione zerami : {0:08b}".format(123)
'123 w postaci binarnej dopełnione zerami : 01111011'
>>> "123 w postaci ósemkowej : {0:10o}".format(123)
'123 w postaci ósemkowej : 173'
>>> "123 w postaci szesnastkowej : {0:2x}".format(123)
'123 w postaci szesnastkowej : 7b'
>>> "1.23456 format ogólny : {0:10.4g}".format(1.23456)
'1.23456 format ogólny : 1.235'
>>> "0.59 procentowo : {0:2.0%}".format(0.59)
'0.59 procentowo : 59%'
W specyfikatorze formatu można odwoływać się do innych pól poprzez zagnieżdżanie. Przykładowo wpisując w konsoli polecenie:
>>> "{0:{1}{2}{3}}".format(123,'#','^',9)
'###123###'
uzyskamy wycentrowany łańcuch z wartością 123 dopełniony znakami # do długości 9 znaków.
W następnej, ostatniej już części opiszemy listy oraz krotki, a także wprowadzimy pojęcie zbioru.
Komentarze
Dodaj komentarz Trackback