<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>S4W development blog &#187; python</title>
	<atom:link href="http://www.openserver.eu/index.php/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.openserver.eu</link>
	<description>programowanie - web development - pozycjonowanie - nowości IT</description>
	<lastBuildDate>Fri, 05 Nov 2010 15:44:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Obiekty, referencje i typy danych część 4</title>
		<link>http://www.openserver.eu/index.php/2010/08/27/obiekty-referencje-i-typy-danych-czesc-4/</link>
		<comments>http://www.openserver.eu/index.php/2010/08/27/obiekty-referencje-i-typy-danych-czesc-4/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 13:13:05 +0000</pubDate>
		<dc:creator>solutions</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[poziom podstawowy]]></category>
		<category><![CDATA[python: kurs języka]]></category>

		<guid isPermaLink="false">http://www.openserver.eu/?p=68</guid>
		<description><![CDATA[W ostatniej części artykułu o typach danych opowiemy o podstawowych typach sekwencyjnych jakimi są isty oraz krotki, a także wprowadzimy pojęcie zbioru. Listy (list) oraz krotki (tuple) stanowią uporządkowane zbiory danych w postaci obiektów, przy czym mogą być to obiekty różnych typów. Odpowiednikiem list w innych językach programowania często jest tablica, przy czym w językach [...]]]></description>
			<content:encoded><![CDATA[<p><strong>W ostatniej części artykułu o typach danych opowiemy o podstawowych typach sekwencyjnych jakimi są isty oraz krotki, a także wprowadzimy pojęcie zbioru.</strong></p>
<p>Listy (list) oraz krotki (tuple) stanowią uporządkowane zbiory danych w postaci obiektów, przy czym mogą być to obiekty różnych typów. Odpowiednikiem list w innych językach programowania często jest tablica, przy czym w językach o statycznym typowaniu może ona przechowywać jedynie obiekty jednego, zadeklarowanego typu, lista w Python’ie może przechowywać obiekty różnych typów.<span id="more-68"></span></p>
<p>Listy są mutowalnym typem danych , a więc możliwym do modyfikacji po utworzeniu (można dodawać nowe, modyfikować  oraz usuwać istniejące elementy listy). Listę można utworzyć korzystając z nawiasów kwadratowych lub konstruktora<strong> list(obiekt_iterowalny).</strong> Krotki są z kolei niemutowalne, do  ich tworzenia służą nawiasy okrągłe lub konstruktor <strong>tuple(obiekt_iterowalny)</strong>.</p>
<p>Przykładowo:</p>
<p><code><strong>&gt;&gt;&gt; a=('jednoelementowa krotka',)</strong><br />
<strong>&gt;&gt;&gt; b=’jeszcze jedna jednoelementowa krotka’,</strong><br />
<strong>&gt;&gt;&gt; c=['jednoelementowa lista']</strong></code></p>
<p>Powyższy przykład tworzy jednoelementowe krotki „a”,”b” oraz listę „c”. Należy zwrócić uwagę, na znak przecinka na końcu jednoelementowych krotek:  bez niego utworzone zostałyby łańcuchy znakowe, a nie krotki!Ponieważ krotki oraz listy są uporządkowanymi zbiorami elementów więc można posługiwać się indeksami w celu wybrania odpowiedniego elementu (należy pamiętać iż indeksy zaczynają się od zera) oraz notacją „plastrową”, np.:</p>
<p><code><strong>&gt;&gt;&gt; a=["Chapman","Cleese","Terry","Eric","Terry","Michael"]</strong><br />
<strong>&gt;&gt;&gt; a[0]</strong><br />
<strong>'Chapman'</strong><br />
<strong>&gt;&gt;&gt; a[-1]</strong><br />
<strong>'Michael'</strong><br />
<strong>&gt;&gt;&gt; a[1:3]</strong><br />
<strong>['Cleese', 'Terry']</strong><br />
<strong>&gt;&gt;&gt; a[0:-1]</strong><br />
<strong>['Chapman', 'Cleese', 'Terry', 'Eric', 'Terry']</strong><br />
<strong>&gt;&gt;&gt; a[2:]</strong><br />
<strong>['Terry', 'Eric', 'Terry', 'Michael']</strong><br />
<strong>&gt;&gt;&gt; a[:2]</strong><br />
<strong>['Chapman', 'Cleese']</strong></code></p>
<p>Korzystając z ujemnych indeksów można odwoływać się do elementów od końca. Notacja a[:2] zwraca listę stworzoną z dwóch pierwszych elementów listy „a”, z kolei a[3:] utworzy i zwróci listę złożoną z elementów listy „a” od indeksu 3 do końca.</p>
<p>Charakterystyczna jest własność pakowania/rozpakowania krotek:</p>
<p><code><strong>&gt;&gt;&gt; x=”Graham”,”John”,”Terry”</strong><br />
<strong>&gt;&gt;&gt; x</strong><br />
<strong>(”Graham”,”John”,”Terry”)</strong><br />
<strong>&gt;&gt;&gt; a,b,c=x</strong><br />
<strong>&gt;&gt;&gt; a</strong><br />
<strong>”Graham”</strong><br />
<strong>&gt;&gt;&gt; b</strong><br />
<strong>”John”</strong><br />
<strong>&gt;&gt;&gt; c</strong><br />
<strong>”Terry”</strong></code></p>
<p>Poprzez pakowanie utworzona została krotka „x”, która następnie została rozpakowana w ten sposób, iż kolejne jej  wartości zostały przypisane zmiennym „a”, „b” oraz „c”. Rozpakować w ten sposób można także odpowiednią listę. Przy rozpakowywaniu ilość zmiennych (po lewej stronie) musi być równa ilości elementów danej sekwencji (po prawej).</p>
<p>Listę można utworzyć także na podstawie dowolnego, iterowalnego obiektu:</p>
<p><code><strong>&gt;&gt;&gt; a=[1,2,3,4]</strong><br />
<strong>&gt;&gt;&gt; [i**2 for i in a]</strong><br />
<strong>[1, 4, 9, 16]</strong></code></p>
<p>Jest to tak zwana lista składana.</p>
<p>Przy tak tworzonej liście możliwe jest umieszczenie dodatkowej instrukcji warunkowej:</p>
<p><code><strong>&gt;&gt;&gt; a=(3,4,2,5,7,12)</strong><br />
<strong>&gt;&gt;&gt; [i for i in a if i%2==0]</strong><br />
<strong>[4, 2, 12]</strong></code></p>
<p>Powyższe polecenie utworzy listę z parzystych elementów krotki „a”.</p>
<p>Krotki oraz listy posiadają jedynie dwie wspólne metody:</p>
<table>
<tbody>
<tr>
<td><strong>Metoda</strong></td>
<td><strong>Opis</strong></td>
</tr>
<tr>
<td>zbior.index(element)</td>
<td>Zwraca indeks obiektu <em>element</em> w zbiorze <em>zbior</em>.   Wyrzuca wyjątek jeśli zbiór nie posiada takiego elementu.</td>
</tr>
<tr>
<td>zbior.count(element)</td>
<td>Zwraca ilość wystąpień obiektu <em>element</em> w zbiorze <em>zbior</em>.</td>
</tr>
</tbody>
</table>
<p>Lista posiada szereg charakterystycznych dla typu mutowalnego metod:</p>
<table>
<tbody>
<tr>
<td><strong>Metoda</strong></td>
<td><strong>Opis</strong></td>
</tr>
<tr>
<td>lista.append(element)</td>
<td>Dopisuje <em>element</em> do <em>lista</em>.</td>
</tr>
<tr>
<td>lista.extend(inna)</td>
<td>Dopisuje <em>elementy</em> do <em>lista.</em></td>
</tr>
<tr>
<td>lista.insert(indeks,   element)</td>
<td>Wstawia do <em>lista</em> obiekt <em>element</em> na pozycji <em>indeks</em>. Elementy listy zostaną   przeindeksowane.</td>
</tr>
<tr>
<td>lista.remove(x)</td>
<td>Usuwa element z <em>lista</em>.   Wyrzuca wyjątek jeśli <em>lista</em> nie   posiada takiego elementu.</td>
</tr>
<tr>
<td>lista.pop([indeks])</td>
<td>Usuwa i zwraca element z listy o podanym indeksie.   Jeśli nie podano indeksu usuwa i zwraca ostatni element.</td>
</tr>
<tr>
<td>lista.sort()</td>
<td>Sortuje listę.</td>
</tr>
<tr>
<td>lista.reverse()</td>
<td>Odwraca listę.</td>
</tr>
</tbody>
</table>
<p>Dodatkowo, wbudowana funkcja <strong>sorted(s)</strong> umożliwia utworzenie posortowanej listy z elementów sekwencji „s”.<strong> </strong></p>
<p>Jeszcze kilka przykładów użycia list:</p>
<p><code><strong>a=[‘pierwsza’,’druga’,’trzecia’,123,456,7.0,True]<br />
print a,type(a)<br />
print a[1],type(a[1])<br />
print a[2:4],type(a[2:4])<br />
print a[1][3],type(a[1][3])<br />
print a[1][2:5],type(a[1][2:5])<br />
print a[-3]<br />
print len(a)</strong></code></p>
<p>w odpowiedzi dostajemy:</p>
<p><code><strong>print a,type(a)<br />
['pierwsza', 'druga', 'trzecia', 123, 456, 7.0, True]<br />
print a[1],type(a[1])<br />
druga<br />
print a[2:4],type(a[2:4])<br />
['trzecia', 123]<br />
print a[1][3],type(a[1][3])<br />
g<br />
print a[1][2:5],type(a[1][2:5])<br />
uga<br />
print a[-3]<br />
456<br />
print len(a)<br />
7</strong></code></p>
<p>Python jest językiem bardzo intuicyjnym, z reguły robi to co chcemy:</p>
<ol>
<li>print a : to oczywiście wypisanie zawartości całej tablicy, tablica „a jest typu list.</li>
<li>print a[1] : wypisujemy drugi element tablicy (numeracja od zera!), którym jest łańcuch „druga”.</li>
<li>print  a[2:4] : tu już robi się ciekawiej, wyrażenie a[M,N] tworzy i zwraca nową listę zawierającą elementy z listy „a” od indeksu M do N-1 (a więc w tym przypadku od 2 do 3).</li>
<li>print a[1][3] : do poszczególnych elementów łańcucha (jego liter) mamy dostęp dokładnie w ten sam sposób jak do elementów listy. Wyrażenie a[1] zwraca referencje do drugiego elementu listy „a” (a więc łańcucha ‘druga’), natomiast a[1][3] do czwartegjego elementu &#8211; licząc oczywiście od 0 &#8211;  a tym samym do czwartego znaku czyli litery ‘g’ (zwracany jest 1-elementowy łańcuch).</li>
<li>print a[1][2:5] : analogicznie do dwóch poprzednich przykładów wyrażenie to tworzy nowy łańcuch powstały poprzez wycięcie z łańcucha a[1] liter od 2 do 5-1.</li>
<li>6.	print a[-2] : poprzez użycie znaku minus mamy możliwość dostępu do elementów listy poczynając od jej końca. Ta sama zasada dotyczy również łańcuchów znakowych.</li>
<li>Możemy użyć funkcji len by dowiedzieć się ile elementów liczy lista.</li>
</ol>
<p>Pisząc dalej w konsoli:</p>
<p><code><strong>dir([])</strong></code></p>
<p>Dowiemy się o wszystkich metodach listy:</p>
<p><code><strong>['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']</strong></code></p>
<p>Bardziej szczegółowy opis listy oraz każdej z jej metod  można wywołać korzystając  funkcji pomocy:</p>
<p><code><strong>help([])<br />
help([].sort)</strong></code></p>
<p>Duża ilość metod ze znakami “__” odnosi się do operatorów, przykładowo metoda “__add__” odpowiada za przeładowanie operatora “+”: listy można więc do siebie dodawać. Przykładowo pisząc:</p>
<p><code><strong>x1=[1,2,3,4]<br />
x2=[5,'znaki',False]<br />
x3=x1+x2<br />
print  x3<br />
[1, 2, 3, 4, 5, 'znaki', False]</strong></code></p>
<p>Wyrażenie „x1+x2” tworzy nową listę, będącą złożeniem x1 i x2.</p>
<p><strong>Zbiory</strong></p>
<p><strong>Zbiór – <em>set</em></strong> – jest nieuporządkowaną kolekcją unikalnych obiektów (w przeciwieństwie do list czy krotek dany element może występować tylko raz w zbiorze). Istnieją zbiory mutowalne, tworzone za pomocą polecenia <em>set</em> oraz niemutowalne tworzone poleceniem <em>frozenset</em>. Zbiór można utworzyć na podstawie dowolnego iterowalnego obiektu, np.:</p>
<p><code><strong>&gt;&gt;&gt; a=['pierwszy',2,3.1415]</strong><br />
<strong>&gt;&gt;&gt; s=set(a)</strong><br />
<strong>&gt;&gt;&gt; s</strong><br />
<strong>{'pierwszy', 2, 3.1415000000000002}</strong><br />
<strong>&gt;&gt;&gt; f=frozenset(a)</strong><br />
<strong>&gt;&gt;&gt; f</strong><br />
<strong>frozenset({'pierwszy', 2, 3.1415000000000002})</strong></code></p>
<p>Python 3.0 daje także możliwość użycia nawiasów klamrowych do utworzenia obiektu typu <em>set</em>:</p>
<p><code><strong>&gt;&gt;&gt; a={1,2,3}</strong><br />
<strong>&gt;&gt;&gt; a</strong><br />
<strong>{1, 2, 3}</strong><br />
<strong>&gt;&gt;&gt; type(a)</strong><br />
<strong>&lt;class 'set'&gt;</strong></code></p>
<p>Możliwe jest także utworzenie zbioru składanego (analogicznie do składanych list):</p>
<p><code><strong>&gt;&gt;&gt; a=('x','y','z')</strong><br />
<strong>&gt;&gt;&gt; q={i for i in a}</strong><br />
<strong>&gt;&gt;&gt; q</strong><br />
<strong>{'y', 'x', 'z'}</strong><br />
<strong>&gt;&gt;&gt; type(q)</strong><br />
<strong>&lt;class 'set'&gt;</strong></code></p>
<p>Wprowadzać nowe elementy do zbioru typu <em>set</em> można za pomocą metodą <em>add</em>, a usuwać  metodą <em>discard</em>:</p>
<p><code><strong>&gt;&gt;&gt; s.add('nowy')</strong><br />
<strong>&gt;&gt;&gt; s</strong><br />
<strong>{'pierwszy', 2, 3.1415000000000002, 'nowy'}</strong><br />
<strong>&gt;&gt;&gt; s.discard(2)</strong><br />
<strong>&gt;&gt;&gt; s</strong><br />
<strong>{'pierwszy', 3.1415000000000002, 'nowy'}</strong></code></p>
<p>Do usuwania elementów ze zbioru służy także metoda <em>remove</em>, która wyrzuci wyjątek <em>KeyError</em> przy próbie usunięcia elementu, którego nie ma w zbiorze.</p>
<p><strong><em>Ponieważ zbiór jest nieuporządkowaną kolekcją obiektów tak więc nie wspiera indeksowania ani notacji „plastrowej”</em></strong> .</p>
<p>Zarówno na zbiorach <em>set</em> oraz <em>frozenset</em> można wykonywać szereg operacji za pomocą zdefiniowanych operatorów lub odpowiednich metod:</p>
<table>
<tbody>
<tr>
<td><strong>Operator/metoda</strong></td>
<td><strong>Opis</strong></td>
</tr>
<tr>
<td>len(s)</td>
<td>Zwraca ilość elementów zbioru s</td>
</tr>
<tr>
<td>x in s</td>
<td>Prawda jeśli x jest elementem s, w przeciwnym razie Fałsz</td>
</tr>
<tr>
<td>s.<tt> isdisjoint</tt>(<em>o</em>)</td>
<td>Prawda jeśli s nie ma elementów wspólnych z o, w przeciwnym razie Fałsz</td>
</tr>
<tr>
<td>s.issubset(o)</p>
<p>s &lt; o</td>
<td>Prawda jeśli o jest podzbiorem s</td>
</tr>
<tr>
<td>s &lt;= o</td>
<td>Prawda jeśli  x&lt;o oraz x!=o</td>
</tr>
<tr>
<td>s.issuperset(o)</p>
<p>s &gt; o</td>
<td>Prawda jeśli s jest podzbiorem o</td>
</tr>
<tr>
<td>s &gt;= o</td>
<td>Prawda jeśli s&gt;o oraz s!=o</td>
</tr>
<tr>
<td>s.union(o,…)</p>
<p>s | o | …</td>
<td>Zwraca zbiór będący sumą zbiorów s, o (i kolejnych)</td>
</tr>
<tr>
<td>s.intersection(o,…)</p>
<p>s  &#8211; o &#8211; …</td>
<td>Zwraca zbiór elementów s pomniejszony o elementy zbioru o (i   kolejnych)</td>
</tr>
<tr>
<td>s.symmetric_difference(o,…)</p>
<p>s ^ o ^ …</td>
<td>Zwraca zbiór elementów będący różnicą symetryczną s, o (i kolejnych)</td>
</tr>
<tr>
<td>s.copy()</td>
<td>Zwraca zbiór będący tzw. płytką kopią zbioru s.</td>
</tr>
</tbody>
</table>
<p>Powyższe operatory wymagają aby ich argumenty były zbiorami, w przeciwieństwie do metod, którym można przekazać dowolny iterowalny obiekt:</p>
<p><code><strong>&gt;&gt;&gt; x=set('abcd')<code><strong>&gt;&gt;&gt; y=set('12ac')</strong><br />
<strong>&gt;&gt;&gt; x | y</strong><br />
<strong>{'a', 'c', 'b', 'd', '1', '2'}</strong><br />
<strong>&gt;&gt;&gt; x - y</strong><br />
<strong>{'b', 'd'}</strong><br />
<strong>&gt;&gt;&gt; x ^ y</strong><br />
<strong>{'b', 'd', '1', '2'}</strong><br />
<strong>&gt;&gt;&gt; x.union('AB')</strong><br />
<strong>{'a', 'A', 'c', 'b', 'd', 'B'}</strong><br />
<strong>&gt;&gt;&gt; x.intersection('bc')</strong><br />
<strong>{'c', 'b'}</strong><br />
<strong>&gt;&gt;&gt; x.symmetric_difference('abc')</strong><br />
<strong>{'d'}</strong></code>Można porównywać i łączyć ze sobą, za pomocą operatorów, zbiory <em>set</em> oraz <em>frozenset</em> :<code><strong>&gt;&gt;&gt; set('ABC')==frozenset('BCA')</strong><br />
<strong>True</strong><br />
<strong>&gt;&gt;&gt; frozenset('WXY')|set('XYZ')</strong><br />
<strong>frozenset({'W', 'Y', 'X', 'Z'})</strong></code>Operacje, które łączą instancje typu <em>set</em> z <em>frozenset</em> zwracają typ pierwszego operandu.</strong></code></p>
<p>Typ <em>set</em> jest mutowalny i dlatego też posiada dodatkowo specyficzne operatory i metody umożliwiające różnego rodzaju operacje na zbiorze:</p>
<table>
<tbody>
<tr>
<td><strong>Operator/metoda</strong></td>
<td><strong>Opis</strong></td>
</tr>
<tr>
<td>s.update(o,…)</p>
<p>s |= o |= …</td>
<td>Aktualizuje zbiór s poprzez wprowadzenie elementów ze zbioru o (i   kolejnych jeśli występują) do s</td>
</tr>
<tr>
<td>s.intersection_update(o,…)</p>
<p>s &amp;= o   &amp;= …</td>
<td>Aktualizuje zbiór s pozostawiając elementy wspólne dla s oraz o (i   kolejnych jeśli występują)</td>
</tr>
<tr>
<td>s.difference_update(o,&#8230;)</p>
<p>s -= o -= …</td>
<td>Aktualizuje zbiór s usuwając elementy znalezione w o (i kolejnych   jeśli występują)</td>
</tr>
<tr>
<td>s.symmetric_difference_update(o)</p>
<p>s ^= o</td>
<td>Aktualizuje zbiór s pozostawiając elementy niewspólne dla s i o   (różnica symetryczna)</td>
</tr>
<tr>
<td>s.add(e)</td>
<td>Dodaje element e do zbioru s</td>
</tr>
<tr>
<td>s.remove(e)</td>
<td>Usuwa element e ze zbioru s, wyrzuca wyjątek KeyError jeśli elementu   e nie ma w s.</td>
</tr>
<tr>
<td>s.discard(e)</td>
<td>Usuwa element e ze zbioru s (jeśli istnieje)</td>
</tr>
<tr>
<td>s.pop()</td>
<td>Usuwa i zwraca element ze zbioru s, wyrzuca wyjątek KeyError jeśli   elementu e nie ma w s.</td>
</tr>
<tr>
<td>clear()</td>
<td>Usuwa wszystkie elementy ze zbioru s</td>
</tr>
</tbody>
</table>
<p>Tu także metodom można przekazać iterowalny argument, operatory mogą działać jedynie na obiektach typu <em>set</em>.<strong> </strong></p>
<p><strong>Słowniki</strong></p>
<p><strong> </strong>Słowniki zwane również tablicami asocjacyjnymi lub mapami są typem danych w postaci nieuporządkowanych par klucz-wartość.Przy listach oraz krotkach kluczem jest liczba całkowita, natomiast kluczem słownika może być dowolny niezmienny (<em>immutable</em>), a więc haszowalny (<em>hashable</em>) obiekt.</p>
<p>Ponieważ klucze słownika służą do jednoznacznego wskazania określonego obiektu/wartości, więc muszą być (w obrębie danego słownika) unikalne, w przeciwieństwie do obiektów na jakie wskazują (różne klucze w słowniku mogą wskazywać na ten sam obiekt lub różne obiekty tego samego typu, o takich samych wartościach).</p>
<p>Poniższy przykład tworzy 2-elementowy słownik z kluczami różnych typów, wypisuje go wraz z ilością elementów:</p>
<p><code><strong>&gt;&gt;&gt; s = {1:'ONE','drugi':2.0}</strong><br />
<strong>&gt;&gt;&gt; s</strong><br />
<strong>{1: 'ONE', 'drugi': 2.0}</strong><br />
<strong>&gt;&gt;&gt; s['PI']=3.1415</strong><br />
<strong>&gt;&gt;&gt; s</strong><br />
<strong>{1: 'ONE', 'drugi': 2.0, 'PI': 3.1415000000000002}</strong><br />
<strong>&gt;&gt;&gt; del(s[1])</strong><br />
<strong>&gt;&gt;&gt; s</strong><br />
<strong>{'drugi': 2.0, 'PI': 3.1415000000000002}</strong></code></p>
<p>Tak jak i inne typy tak słowniki posiadają szereg charakterystycznych dla nich metod:</p>
<table>
<tbody>
<tr>
<td><strong>Operacja</strong></td>
<td><strong>Opis</strong></td>
</tr>
<tr>
<td>len(d)</td>
<td>Zwraca ilość elementów słownika <strong>d</strong></td>
</tr>
<tr>
<td>d[key]</td>
<td>Zwraca element  słownika <strong>d </strong>wskazywanym przez klucz <strong>key</strong>, wyrzuca wyjątek KeyError jeśli   takiego klucza nie ma w słowniku.</td>
</tr>
<tr>
<td>d[key]=value</td>
<td>Przypisuje wartość <strong>value</strong> do klucza key słownika d.</td>
</tr>
<tr>
<td>del d[key]</td>
<td>Usuwa element wskazywany przez klucz <strong>key</strong> ze słownika <strong>d</strong>,   wyrzuca wyjątek <em>KeyError</em> jeśli   takiego klucza nie ma w słowniku.</td>
</tr>
<tr>
<td>key in d</td>
<td>Zwraca True jeśli słownik d posiada klucz <strong>key</strong>, w przeciwnym razie False.</td>
</tr>
<tr>
<td>key not in d</td>
<td>Zwraca True jeśli słownik d nie posiada klucza <strong>key</strong>, w przeciwnym razie False.</td>
</tr>
<tr>
<td>clear()</td>
<td>Usuwa wszystkie elementy ze słownika.</td>
</tr>
<tr>
<td>copy()</td>
<td>Tworzy tzw. płytką kopię słownika</td>
</tr>
<tr>
<td>fromkeys(seq[,   value])</td>
<td>Tworzy i zwraca nowy słownik z kluczami z sekwencji seq, ustawiając   ich wartości na <strong>value</strong> (lub None   jeśli nie podano).</td>
</tr>
<tr>
<td>d.get(key[,   default])</td>
<td>Zwraca element  słownika <strong>d</strong> o kluczu <strong>key</strong> jeśli taki istnieje, w przeciwnym razie wartość <strong>default</strong> (domyślnie None)</td>
</tr>
<tr>
<td>d.pop(key[,   default])</td>
<td>Usuwa i zwraca element wskazywany przez klucz <strong>key</strong> słownika <strong>d</strong>, wyrzuca   wyjątek <em>KeyError</em> jeśli takiego   klucza nie ma w słowniku.</td>
</tr>
<tr>
<td>d.popitem()</td>
<td>Usuwa i zwraca krotkę (klucz, wartość) ze słownika <strong>d</strong>. Jeśli słownik jest pusty wyrzuca   wyjątek <em>KeyError</em>.</td>
</tr>
<tr>
<td>d.setdefault(key[,   default])</td>
<td>Jeśli klucz <strong>key</strong> jest w   słowniku <strong>d</strong> zwraca jego wartość.   Jeśli nie do słownika zostaje wstawiony klucz <strong>key</strong> o wartości <strong>default</strong>,   która zostanie zwrócona (domyślnie <strong>default</strong> = None)</td>
</tr>
<tr>
<td>d.update([other])</td>
<td>Aktualizuje słownik d kluczami/wartościami z Rother, nadpisując   istniejące klucze. Parametr other może być słownikiem jak i dowolnym   iterowalnym obiektem zwracającym pary klucz,wartość.</td>
</tr>
</tbody>
</table>
<p>Powyższe metody są wspólne dla Python’a 3.0 oraz 2.6. Ten ostatni posiadał jeszcze (dla zgodności z gałęzią 2) metody <em>iterkeys</em>, <em>itervalues</em> oraz <em>iteritems</em> które zwracały obiekty iterowalne, dzięki którym można było poruszać się odpowiednio po kluczach, wartościach oraz parach klucz/wartość słownika. Te metody nie są już obecne w Python’ie 3.0. Istnieją natomiast metody <em>keys,</em> <em>values oraz items</em> o analogicznym przeznaczeniu (metody te także są obecne w Python’ie 2.6, lecz zwracają tam listy zamiast iterowalnych obiektów).</p>
<p>Poniższy przykład tworzy 2-elementowy słownik z kluczami różnych typów, wypisuje go wraz z ilością elementów. Polecenie <em>dir</em> zwraca listę metod słownika.</p>
<p><code><strong>my_dict = {1:1,'dwa':2.0}</strong><br />
<strong>print my_dict ,  len(my_dict)</strong><br />
<strong>{1: 1, 'dwa’:2.0}</strong></code></p>
<p><code><strong>dir(my_dict)</strong><br />
<strong>['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__str__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']</strong></code></p>
<p>Raz utworzonemu słownikowi można zarówno dodawać, ujmować jak i zastępować elementy:</p>
<p><code><strong><code><strong>&gt;&gt;&gt; </strong></code>my_dict['xxx']=123</strong><br />
<strong><code><strong>&gt;&gt;&gt; </strong></code>print my_dict</strong><br />
<strong>{1: 1, 'xxx': 123, 'dwa': 2.0}</strong><br />
<strong><code><strong>&gt;&gt;&gt; </strong></code>del(my_dict['xxx'])</strong><br />
<strong><code><strong>&gt;&gt;&gt; </strong></code>print my_dict</strong><br />
<strong>{1: 1, 'dwa': 2.0}</strong><br />
<strong><code><strong>&gt;&gt;&gt; </strong></code>print my_dict.keys()</strong><br />
<strong>[1, 'dwa']</strong><br />
<strong>print my_dict.values()</strong><br />
<strong>[1, 2.0]</strong><br />
<strong><code><strong>&gt;&gt;&gt; </strong></code><code><strong>&gt;&gt;&gt; </strong></code>print my_dict.items()</strong><br />
<strong>[(1, 1), ('dwa', 2.0)]</strong></code></p>
<p>W powyższym przykładzie użyte zostały trzy użyteczne metody słownika:</p>
<ul>
<li><strong>keys</strong> : zwraca listę kluczy słownika.</li>
<li><strong>values</strong> : zwraca listę wartości słownika.</li>
<li><strong>items</strong> : zwraca listę, której elementami są krotki (klucz,wartość) słownika.</li>
</ul>
<p>Funkcja dict<strong> </strong>umożliwia utworzenie słownika z krotki lub listy:<strong><code><strong> </strong></code></strong></p>
<p><code><strong>&gt;&gt;&gt; krotka=((1,'jeden'),('2',222))</strong><br />
<strong>&gt;&gt;&gt; lista=[['111',1],[2,'dwa']]</strong><br />
<strong>&gt;&gt;&gt; dict(krotka)</strong><br />
<strong>{1: 'jeden', '2': 222}</strong><br />
<strong>&gt;&gt;&gt; dict(lista)</strong><br />
<strong>{2: 'dwa', '111': 1}</strong></code></p>
<p><strong></p>
<p></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.openserver.eu/index.php/2010/08/27/obiekty-referencje-i-typy-danych-czesc-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obiekty, referencje i typy danych część 3</title>
		<link>http://www.openserver.eu/index.php/2010/08/26/obiekty-referencje-i-typy-danych-czesc-3/</link>
		<comments>http://www.openserver.eu/index.php/2010/08/26/obiekty-referencje-i-typy-danych-czesc-3/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 11:01:04 +0000</pubDate>
		<dc:creator>solutions</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[poziom podstawowy]]></category>
		<category><![CDATA[python: kurs języka]]></category>

		<guid isPermaLink="false">http://www.openserver.eu/?p=60</guid>
		<description><![CDATA[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: &#62;&#62;&#62; znaki='abc' &#62;&#62;&#62; krotka=(1,2,3) &#62;&#62;&#62; lista=[4,5,6] Wbudowana funkcja len(z) zwraca ilość elementów [...]]]></description>
			<content:encoded><![CDATA[<p><strong>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.</strong></p>
<p>Typy sekwencyjne to skończone zbiory uporządkowanych danych indeksowanych poprzez nieujemne liczby.  Podstawowe sekwencyjne typy to łańcuchy znakowe (str), krotki oraz listy:</p>
<p><code><strong>&gt;&gt;&gt; znaki='abc'</strong><br />
<strong>&gt;&gt;&gt; krotka=(1,2,3)</strong><br />
<strong>&gt;&gt;&gt; lista=[4,5,6]<span id="more-60"></span></strong></code></p>
<p>Wbudowana funkcja <strong>len(z)</strong> zwraca ilość elementów zbioru  <strong>z</strong>.  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:</p>
<p><code><strong>&gt;&gt;&gt; print(len(znaki))</strong><br />
<strong>3</strong><br />
<strong>&gt;&gt;&gt; print(znaki[0])</strong><br />
<strong>a</strong><br />
<strong>&gt;&gt;&gt; print(krotka[1])</strong><br />
<strong>2</strong><br />
<strong>&gt;&gt;&gt; print(lista[2])</strong><br />
<strong>6</strong></code></p>
<p>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:</p>
<p><code><strong>&gt;&gt;&gt; lista[0]=7</strong><br />
<strong>&gt;&gt;&gt; print(lista)</strong><br />
<strong>[7, 5, 6]</strong><br />
<strong>&gt;&gt;&gt; znaki[0]='x'</strong><br />
<strong>Traceback (most recent call last):</strong><br />
<strong> File "&lt;stdin&gt;", line 1, in &lt;module&gt;</strong><br />
<strong>TypeError: 'str' object does not support item assignment</strong></code></p>
<p>Dla sekwencyjnych typów danych dostępnych jest szereg użytecznych funkcji i operatorów:</p>
<table>
<tbody>
<tr>
<td><strong>Operator</strong></td>
<td><strong>Opis</strong></td>
</tr>
<tr>
<td>x in s</td>
<td>logiczna prawda jeśli x jest elementem zbioru s, w przeciwnym wypadku   fałsz</td>
</tr>
<tr>
<td>x not in s</td>
<td>logiczny fałsz jeśli x nie jest elementem zbioru s, w przeciwnym   wypadku prawda</td>
</tr>
<tr>
<td>s + t</td>
<td>złączenie zbiorów s oraz t</td>
</tr>
<tr>
<td>s * n</td>
<td>n-powtórzeń s</td>
</tr>
<tr>
<td>s[m]</td>
<td>m-ty element s</td>
</tr>
<tr>
<td>s[m:n]</td>
<td>wycinek s : od m do n</td>
</tr>
<tr>
<td>s[m:n:o]</td>
<td>wycinek s: od m do n z krokiem k</td>
</tr>
<tr>
<td>len(s)</td>
<td>ilość elementów s</td>
</tr>
<tr>
<td>min(s)</td>
<td>najmniejszy element s</td>
</tr>
<tr>
<td>max(s)</td>
<td>największy element s</td>
</tr>
</tbody>
</table>
<p>Typy sekwencyjne wspierają także operatory porównań (==,&gt;,&lt;,&gt;=,&lt;=). 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.</p>
<p><strong>Slicing</strong></p>
<p>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&lt;=x&lt;m (czyli dla wyrażenia z[0:10] mamy do czynienia z elementami zbioru „z” o indeksach od 0 do 9 włącznie).</p>
<p>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&gt;=0 oraz n&lt;=x i n&lt;=x&lt;m.</p>
<p><strong>Typy znakowe</strong></p>
<p>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.</p>
<p><strong>Python 2.6</strong></p>
<p>Python 2.6 podobnie jak jego poprzednicy posiada dwa rodzaje typów znakowych: <em>str</em> oraz <em>unicode</em>.  Oba typy wywodzą się z tej samej klasy <em>basestring</em>, dzięki czemu posiadają szereg wspólnych metod.</p>
<p>Łańcuch znakowy typu <em>str</em> tworzony jest poprzez umieszczenie tekstu w  cudzysłowach lub apostrofach, łańcuch unikodowy (ang. <em>unicode string)</em> powinien być dodatkowo uzupełniony znakiem <strong>u</strong> przed cudzysłowem/apostrofem:</p>
<p><code><strong>&gt;&gt;&gt; text="znaki"</strong><br />
<strong>&gt;&gt;&gt; inny='str'</strong><br />
<strong>&gt;&gt;&gt; unikod=u”tekst unikodowy”</strong></code></p>
<p>Można konwertować pomiędzy typem <em>str</em> a <em>unicode</em> korzystając z dostępnych metod <em>encode</em> oraz <em>decode</em>:</p>
<p><code><strong>&gt;&gt;&gt; unikod=u"żółta kość"</strong><br />
<strong>&gt;&gt;&gt; unikod</strong><br />
<strong>u'\u017c\xf3\u0142ta ko\u015b\u0107'</strong><br />
<strong>&gt;&gt;&gt; </strong><br />
<strong>&gt;&gt;&gt; print(s)</strong><br />
<strong>żółta kość</strong><br />
<strong>&gt;&gt;&gt; string=unikod.encode("cp852")</strong><br />
<strong>&gt;&gt;&gt; string</strong><br />
<strong>'\xbe\xa2\x88ta ko\x98\x86'</strong><br />
<strong>&gt;&gt;&gt; print(string)</strong><br />
<strong>żółta kość</strong><br />
<strong>&gt;&gt;&gt; unikod2=string.decode("cp852")</strong><br />
<strong>&gt;&gt;&gt; unikod2</strong><br />
<strong>u'\u017c\xf3\u0142ta ko\u015b\u0107'</strong><br />
<strong>&gt;&gt;&gt; print(unikod2)</strong><br />
<strong>żółta kość</strong></code></p>
<p>Na początku powyższego przykładu tworzony jest unikodowy obiekt <em>unikod</em> o zawartości „żółta kość”. Następnie za pomocą metody <strong>encode</strong> tworzony jest na jego podstawie obiekt <em>string</em> typu <em>str</em> o określonym kodowaniu (cp852 to domyślne kodowanie konsoli Windows).  Ostatecznie obiekt ten został użyty w metodzie <strong>decode</strong> do utworzenia obiektu unikodowego <em>unikod2</em> (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.</p>
<p><strong>Python 3.0</strong></p>
<p>W Python’ie 3.0 typ <em>str</em> jest już unikodowy, nie ma więc potrzeby by istniał (dostępny jeszcze w wersji 2.6) typ <em>unicode</em> (notacja z prefix’em u” nie istnieje).</p>
<p>Nowością jest natomiast typ bajtowy (<em>bytes</em>). 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 <em>str</em> i <em>unicode</em> z Python’a 2.6 tak i tu można natomiast konwertować <em>str</em> na <em>bytes</em> za pomocą metody <em>str.encode(),</em> do odwrotnej konwersji służy metoda <em>bytes.decode().</em> Można także użyć wyrażeń <em>bytes(s, encoding)</em> oraz <em>str(b, encoding)</em>.</p>
<p>Obiekty tego typu można tworzyć umieszczając znak <strong>b</strong> przed apostrofem lub cudzysłowem:</p>
<p><code><strong>&gt;&gt;&gt; o=b"abc"</strong><br />
<strong>&gt;&gt;&gt; print(o)</strong><br />
<strong>b'abc'</strong></code></p>
<p>Typy <em>str</em> i <em>bytes</em> nie posiadają wspólnej nadklasy i nie mogą być mieszane (przykładowo nie można dodawać do siebie obiektów tych typów).</p>
<p>Nowy jest także typ <em>bytearray </em>: to mutowalny typ o interfejsie podobnym do <em>bytes</em>. Można konwertować pomiędzy obiektami typów <em>bytes</em> i <em>bytearray</em>.</p>
<p>Typy <em>bytes</em> oraz <em>bytearray</em> dostępne są zarówno w Python’ie 3.0 i 2.6.</p>
<p><strong>Metody klasy str</strong></p>
<p>Niezależnie czy mamy do czynienia z Python’em 3.0 czy 2.6 klasa <em>str</em> posiada szereg użytecznych metod  (występują one także w unikodzie Python’a 2.6)</p>
<table>
<tbody>
<tr>
<td><tt><strong>Metoda</strong></tt></td>
<td><strong>Opis</strong></td>
</tr>
<tr>
<td><tt>str.capitalize</tt>()</td>
<td>Zwraca kopię łańcucha <em>str</em>, którego pierwsza litera będzie   duża.</td>
</tr>
<tr>
<td><tt>str.center</tt>(<em>d</em>[,<em>z</em>])</td>
<td>Zwraca wycentrowany łańcuch o   długości <em>d</em> dopełniony spacjami   jeśli nie podano innego znaku w parametrze<strong> </strong><em>z</em><strong>.</strong></td>
</tr>
<tr>
<td><tt>str.count</tt>(<em>l</em>[,<em>p</em>[,<em>k</em>]])</td>
<td>Zwraca ilość wystąpień łańcucha l w <em>str</em> pomiędzy w zakresie od p do k   (indeksy tak jak w notacji „plastrowej” [p: k]).</td>
</tr>
<tr>
<td><tt>str.decode</tt>([<em>encoding</em>[, <em>errors</em>]])</td>
<p>Dekoduje łańcuch do unikodu   używając kodowania <em>encoding</em> (lub   domyślnego jeśli nie jest podane), <em>errors</em> określa reakcję na błędy: domyślnym jest ‘strict’ – w razie błędu wyrzucony   zostanie wyjątek <em>UnicodeError</em>. Inne   możliwości to ‘ignore’ , ‘replace’, a także inne nazwy zarejestrowane poprzez   metodę register_error() modułu codecs.</tr>
<tr>
<td><tt>str.encode</tt>([<em>encoding</em>[, <em>errors</em>]])</td>
<td>Zwraca obiekt unikodowy   reprezentujący zakodowany łańcuch <em>str</em>.  Jeśli nie jest podane kodowanie (poprzez   parametr <em>encoding</em>) to użyte   zostanie kodowanie domyślne, <em>errors</em> ma znaczenie jak w   metodzie str.decode.</td>
</tr>
<tr>
<td><tt>str.endswith</tt>(<em>suffix</em>[, <em>start</em>[, <em>end</em>]])</td>
<td>Zwraca True jeśli łańcuch <em>str</em> kończy się na podanym łańcuchem <em>suffix</em>, w przeciwnym razie False.   Parametr <em>suffix</em> może być także   zbiorem łańcuchów (‘łańcuch 1’,’łańchuch 2’,’…’). Opcjonalne parametry <em>start</em> oraz <em>end</em> określają indeksy od jakiego wyszukiwanie ma się rozpocząć i   zakończyć.</td>
</tr>
<tr>
<td><tt>str.expandtabs</tt>([<em>tabsize</em>])</td>
<td>Zwraca kopię łańcucha <em>str</em>, w którym wszystkie znaki   tabulacji zostały zastąpione jedną lub większą ilością spacji. Parametr <em>tabsize</em> określa ilość spacji na   tabulację, domyślnie jest równy 8.</td>
</tr>
<tr>
<td><tt>str.find</tt>(<em>sub</em>[, <em>start</em>[]]),   <em>end</em></td>
<td>Zwraca indeks pierwszego   wystąpienia łańcucha <em>sub</em> w <em>str</em>.    Opcjonalne argumenty oznaczające początek (<em>start</em>) oraz koniec (<em>end</em>)   wyszukiwania podane są w notacji „plastrowej”. Jeśli łańcuch nie został   znaleziony zwraca -1.</td>
</tr>
<tr>
<td><tt>str.format</tt>(<em>format</em>, <em>*args</em>, <em>**kwargs</em>)</td>
<td>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”.</td>
</tr>
<tr>
<td><tt>str.index</tt>(<em>sub</em>[, <em>start</em>[, <em>end</em>]])</td>
<td>Działa jak find(), lecz wyrzuca wyjątek <em>ValueError</em> gdy łańcuch <em>sub</em> nie został znaleziony.<tt> </tt></td>
</tr>
<tr>
<td><tt>str.isalnum</tt>()</td>
<td>Zwraca True jeśli wszystkie   znaki łańcucha <em>str</em> są   alfanumeryczne i nie jest on pusty, w przeciwnym wypadku False.</td>
</tr>
<tr>
<td><tt>str.isalpha</tt>()</td>
<td>Zwraca True jeśli wszystkie   znaki łańcucha <em>str</em> są literami i   nie jest on pusty, w przeciwnym wypadku False.<tt> </tt></td>
</tr>
<tr>
<td><tt>str.isdigit</tt>()</td>
<td>Zwraca True jeśli wszystkie   znaki łańcucha <em>str</em> są cyframi i nie   jest on pusty, w przeciwnym wypadku False.<tt> </tt></td>
</tr>
<tr>
<td><tt>str.islower</tt>()</td>
<td>Zwraca True jeśli wszystkie   litery w łańcuchu <em>str</em> są małe i   zawiera on choć jedną literę, w przeciwnym wypadku False.<tt> </tt></td>
</tr>
<tr>
<td><tt>str.isspace</tt>()</td>
<td>Zwraca True jeśli łańcuch <em>str</em> zawiera tylko białe znaki i   zawiera on choć jeden taki znak, w przeciwnym wypadku False.<tt> </tt></td>
</tr>
<tr>
<td><tt>str.istitle</tt>()</td>
<td>Zwraca True jeśli łańcuch <em>str</em> zawiera tytuł i ma on choć jeden   znak , w przeciwnym wypadku False.<tt> </tt></td>
</tr>
<tr>
<td><tt>str.isupper</tt>()</td>
<td>Zwraca True jeśli wszystkie   znaki łańcucha <em>str</em> są duże i   zawiera on choć jeden znak, w przeciwnym wypadku False.</td>
</tr>
<tr>
<td><tt>str.join</tt>(<em>seq</em>)</td>
<td>Zwraca łańcuch, który jest   połączeniem łańcuchów podanych w sekwencji <em>seq</em> z użyciem separatora w postaci samego łańcucha <em>str</em>.<tt> </tt></td>
</tr>
<tr>
<td><tt>str.ljust</tt>(<em>width</em>[, <em>fillchar</em>])</td>
<td>Zwraca łańcuch wyjustowany do   lewej o długości <em>width</em>. Łańcuch   dopełniany jest spacją jeśli nie podano innego znaku w parametrze <em>fillchar</em>.<tt> </tt></td>
</tr>
<tr>
<td><tt>str.lower</tt>()</td>
<td>Zwraca łańcuch <em>str</em> skonwertowany do małych liter.<tt></tt></td>
</tr>
<tr>
<td><tt>str.lstrip</tt>([<em>chars</em>])</td>
<td>Zwraca łańcuch będący kopią <em>str</em> z usuniętymi początkowymi  białymi znakami lub znakami podanymi w   parametrze <em>chars</em>.</td>
</tr>
<tr>
<td><tt>str.partition</tt>(<em>sep</em>)</td>
<td>Dzieli łańcuch <em>str</em> po pierwszym wystąpieniu   separatora sep, zwraca   3-elementową krotkę zawierającą część przed separatorem, sam separator oraz   część po nim.</td>
</tr>
<tr>
<td><tt>str.replace</tt>(<em>old</em>, <em>new</em>[, <em>count</em>])</td>
<td>Zwraca kopię łańcucha <em>str</em>, w którym wszystkie (jeśli nie   podano jawnie ilości za pomocą parametru <em>count</em>)   wystąpienia łańcucha <em>old</em> zostały   zamienione na łańcuch <em>new</em>.</td>
</tr>
<tr>
<td><tt>str.rfind</tt>(<em>sub</em>[, <em>start</em>[, <em>end</em>]])</td>
<td>Zwraca największy indeks   wystąpienia łańcucha <em>sub</em> w <em>str</em>. Opcjonalnie można podać początek   oraz koniec wyszukiwania za pomocą paremtrów <em>start</em> oraz <em>end</em> (notacja   „plastrowa”). Zwraca -1 jeśli nie znaleziono.</td>
</tr>
<tr>
<td><tt>str.rindex</tt>(<em>sub</em>[, <em>start</em>[, <em>end</em>]])</td>
<td>Działa jak <em>rfind</em>, lecz wyrzuca wyjątek <em>ValueError</em> jeśli nie znaleziono   wystąpienia łańcucha.</td>
</tr>
<tr>
<td><tt>str.rjust</tt>(<em>width</em>[, <em>fillchar</em>])</td>
<td>Zwraca łańcuch wyjustowany do   prawej strony, o długości <em><em>width</em></em>. Łańcuch dopełniany jest   spacją jeśli nie podano innego znaku w parametrze <em>fillchar</em>.<tt> Zwraca <em>str</em> jeśli podana długość jest mniejsza   niż <em>len(s).</em></tt></td>
</tr>
<tr>
<td><tt>str.rpartition</tt>(<em>sep</em>)</td>
<td>Dzieli łańcuch <em>str</em> po ostatnim wystąpieniu separatora   <em>sep</em>, zwraca 3-elementową krotkę   zawierającą część przed separatorem, sam separator oraz część po nim.</td>
</tr>
<tr>
<td><tt>str.rsplit</tt>([<em>sep</em>[, <em>maxsplit</em>]])</td>
<td>Zwraca listę słów w łańcuchu <em>str</em> używając <em>sep</em> jako separatora (lub białych znaków jeśli nie jest podany).   Wyłączając dzielenie od prawej strony działa jak metoda <em>split</em> opisana poniżej.</td>
</tr>
<tr>
<td><tt>str.rstrip</tt>([<em>chars</em>])</td>
<td>Zwraca łańcuch będący kopią <em>str</em> z usuniętymi końcowymi białymi   znakami lub znakami podanymi w parametrze <em>chars</em>.</td>
</tr>
<tr>
<td><tt>str.split</tt>([<em>sep</em>[, <em>maxsplit</em>]])</td>
<td>Zwraca listę słów powstałą   poprzez podzielenie łańcucha <em>str</em> na   podłańcuchy (zaczynając od lewej strony) z użyciem separatora <em>sep</em> (lub białych znaków jeśli nie jest   podany).  Maksymalną ilość podziałów   można podać za pomocą parametru <em>maxsplit</em>.</td>
</tr>
<tr>
<td><tt>str.splitlines</tt>([<em>keepends</em>])</td>
<td>Zwraca listę linii zawartych w   łańcuchu <em>str</em> ł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 <em>keepend</em> ma wartość True.</td>
</tr>
<tr>
<td><tt>str.startswith</tt>(<em>prefix</em>[, <em>start</em>[, <em>end</em>]])</td>
<td>Zwraca True jeśli łańcuch <em>str</em> zaczyna się od łańcucha <em>prefix</em> w przeciwnym razie False (<em>prefix</em> może być także listą   odpowiednich łańcuchów). Opcjonalne parametry <em>start</em> oraz <em>end</em> umożliwiają określenie odpowiednio początkowych oraz końcowych indeksów   wyszukiwania.</td>
</tr>
<tr>
<td><tt>str.strip</tt>([<em>chars</em>])</td>
<td>Zwraca kopię łańcucha <em>str</em> z usuniętymi początkowymi oraz   końcowymi białymi znakami. Usuwanie innych znaków możliwe jest poprzez   podanie ich w parametrze <em>chars</em>.<tt> </tt></td>
</tr>
<tr>
<td><tt>str.swapcase</tt>()</td>
<td>Zwraca kopię łańcucha <em>str</em> z zamienionymi dużymi znakami na   małe i odwrotnie.</td>
</tr>
<tr>
<td><tt>str.title</tt>()</td>
<td>Zwraca kopię łańcucha <em>str</em> w postaci tytułu: słowa   rozpoczynają się od dużych liter, wszystkie pozostałe litery są małe.</td>
</tr>
<tr>
<td><tt>str.translate</tt>(<em>table</em>[, <em>deletechars</em>])</td>
<td>Zwraca kopię łańcucha <em>str</em>, gdzie wszystkie znaki występujące   w opcjonalnym parametrze <em>deletechars</em> 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.<tt> </tt></td>
</tr>
<tr>
<td><tt>str.upper</tt>()</td>
<td>Zwraca łańcuch, w którym   wszystkie małe litery łańcucha <em>str</em> zostały zamienione na duże.</td>
</tr>
<tr>
<td><tt>str.zfill</tt>(<em>width</em>)</td>
<td>Zwraca łańcuch będący kopią <em>str</em>, dopełniony zerami do długości <em>width</em> lub sam łańcuch <em>str</em> jeśli rozmiar <em>width</em> jest mniejszy od długości łańcucha.</td>
</tr>
</tbody>
</table>
<p><strong>Formatowanie łańcuchów znakowych</strong></p>
<p>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. <em>deprecated</em>), a w przyszłych wydaniach ostatecznie usunięty.</p>
<p>Zalecanym, obecnym także w Python’ie 2.6,  sposobem formatowania łańcuchów znakowych jest metoda <strong>format</strong>. Metoda ta  traktuje łańcuch znakowy jako szablon, a użyte w nim nawiasy klamrowe są znakami o specjalnym przeznaczeniu, np.:</p>
<p><code><strong>&gt;&gt;&gt; szablon1="Witaj {0}"</strong><br />
<strong>&gt;&gt;&gt; szablon2="Data urodzenia:{rok}-{miesiac}-{dzien}"</strong><br />
<strong>&gt;&gt;&gt; print(szablon1.format('Wiktor'))</strong><br />
<strong>Witaj Wiktor</strong><br />
<strong>&gt;&gt;&gt; print(szablon2.format(rok=2000,miesiac=3,dzien=22))</strong><br />
<strong>Data urodzenia:2000-3-22</strong></code></p>
<p>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.</p>
<p>Poniższy przykład pokazuje dostęp do atrybutów <em>day</em>, <em>month</em> oraz <em>year</em> obiektu reprezentującego aktualną datę, a także do wartości słownika poprzez odpowiednie klucze :</p>
<p><code><strong>&gt;&gt;&gt; import datetime</strong><br />
<strong>&gt;&gt;&gt; data = datetime.datetime.now()</strong><br />
<strong>&gt;&gt;&gt; slownik = {"d":"dzien","m":"miesiac","r":"rok"}</strong><br />
<strong>&gt;&gt;&gt; szablon = "Jest {1[d]}:{0.day},{1[m]}:{0.month},{1[r]}:{0.year}"</strong><br />
<strong>&gt;&gt;&gt; &gt;&gt;&gt; print(szablon.format(data,slownik))</strong><br />
<strong>Jest dzien:4,miesiac:1,rok:2009</strong></code></p>
<p>Po indeksie/nazwie pola może wystąpić <strong><em>specyfikator formatu</em> </strong>poprzedzony znakiem dwukropka.</p>
<p>Ogólny format specyfikatora formatu jest następujący:</p>
<p><code><strong>[[wypełnienie]justowanie][znak][#][0][rozmiar].[precyzja][typ]</strong></code></p>
<p>gdzie:</p>
<ul>
<li>wypełnienie :  dowolny znak oprócz }</li>
<li>justowanie :  znak określający rodzaj justowania</li>
<li>znak (+ lub -) dla wartości numerycznej</li>
<li># : oznacza użycie prefix’u dla niedziesiętnej wartości numerycznej</li>
<li>0 : przed rozmiarem oznacza dopełnienie zerami</li>
<li>rozmiar : wartość całkowita określająca rozmiar pola</li>
<li>precyzja : precyzja dla wartości zmiennoprzecinkowej</li>
<li>typ : znak oznaczający typ prezentacji</li>
</ul>
<p>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:</p>
<table>
<tbody>
<tr>
<td><strong>Znak</strong></td>
<td><strong>Znaczenie</strong></td>
</tr>
<tr>
<td><strong>&lt; </strong></td>
<td>Justowanie do lewej (domyślne)</td>
</tr>
<tr>
<td><strong>&gt; </strong></td>
<td>Justowanie do prawej</td>
</tr>
<tr>
<td><strong>^</strong></td>
<td>Centrowanie</td>
</tr>
<tr>
<td><strong>=</strong></td>
<td>Dla wartości numerycznych wymusza dopełnienie po znaku liczby, a   przed samymi liczbami</td>
</tr>
</tbody>
</table>
<p>Przykładowo:</p>
<p><code><strong>&gt;&gt;&gt; s=’wypis’</strong><br />
<strong>&gt;&gt;&gt; "{0:&lt;10}".format(s)</strong><br />
<strong>'wypis     '</strong><br />
<strong>&gt;&gt;&gt; "{0:&gt;10}".format(s)</strong><br />
<strong>'     wypis'</strong><br />
<strong>&gt;&gt;&gt; "{0:^10}".format(s)</strong><br />
<strong>'  wypis   '</strong><br />
<strong>&gt;&gt;&gt; "{0:=10}".format(-123)</strong><br />
<strong>'-      123'</strong></code></p>
<p>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.</p>
<p>Typ prezentacji daje dodatkowe możliwości formatowania wartości numerycznej:</p>
<table>
<tbody>
<tr>
<td><strong>Znak</strong></td>
<td><strong>Znaczenie</strong></td>
</tr>
<tr>
<td><strong>b</strong></td>
<td>Wypis wartości numerycznej w postaci dwójkowej</td>
</tr>
<tr>
<td><strong>c</strong></td>
<td>Konwertuje podaną wartość całkowitą do odpowiedniego znaku unikodu i zwraca    ten znak</td>
</tr>
<tr>
<td><strong>d</strong></td>
<td>Wypis wartości w postaci dziesiętnej</td>
</tr>
<tr>
<td><strong>o</strong></td>
<td>Wypis wartości w formacie ósemkowym</td>
</tr>
<tr>
<td><strong>x</strong></td>
<td>Wypis wartości w formacie szesnastkowym</td>
</tr>
<tr>
<td><strong>e</strong></td>
<td>Notacja naukowa, użyciem znaku ‘e’ do określenia wykładnika</td>
</tr>
<tr>
<td><strong>g</strong></td>
<td>Ogólny format, znak wykładnika zostanie użyty tylko jeśli wartość   jest zbyt duża.</td>
</tr>
<tr>
<td><strong>n</strong></td>
<td>Liczba, oznacza to samo co ‘g’ (dla wartości zmiennoprzecinkowych)   lub ‘d’ (dla całkowitych)</td>
</tr>
<tr>
<td><strong>%</strong></td>
<td>Procentowa, wartość zostanie pomnożona przez 100 i wypisana ze   znakiem % na końcu.</td>
</tr>
</tbody>
</table>
<p>Użycie wybranych typów prezentacji pokazuje poniższy przykład:</p>
<p><code><strong>&gt;&gt;&gt; "123 w postaci binarnej dopełnione zerami : {0:08b}".format(123)</strong><br />
<strong>'123 w postaci binarnej dopełnione zerami : 01111011'</strong><br />
<strong>&gt;&gt;&gt; "123 w postaci ósemkowej : {0:10o}".format(123)</strong><br />
<strong>'123 w postaci ósemkowej :        173'</strong><br />
<strong>&gt;&gt;&gt; "123 w postaci szesnastkowej : {0:2x}".format(123)</strong><br />
<strong>'123 w postaci szesnastkowej : 7b'</strong><br />
<strong>&gt;&gt;&gt; "1.23456 format ogólny : {0:10.4g}".format(1.23456)</strong><br />
<strong>'1.23456 format ogólny :      1.235'</strong><br />
<strong>&gt;&gt;&gt; "0.59 procentowo : {0:2.0%}".format(0.59)</strong><br />
<strong>'0.59 procentowo : 59%'</strong></code></p>
<p>W specyfikatorze formatu można odwoływać się do innych pól poprzez zagnieżdżanie. Przykładowo wpisując w konsoli polecenie:</p>
<p><code><strong>&gt;&gt;&gt; "{0:{1}{2}{3}}".format(123,'#','^',9)</strong><br />
<strong>'###123###'</strong></code></p>
<p>uzyskamy wycentrowany łańcuch z wartością 123 dopełniony znakami # do długości 9 znaków.</p>
<p>W następnej, ostatniej już części opiszemy listy oraz krotki, a także wprowadzimy pojęcie zbioru.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.openserver.eu/index.php/2010/08/26/obiekty-referencje-i-typy-danych-czesc-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obiekty, referencje i typy danych część 2</title>
		<link>http://www.openserver.eu/index.php/2010/08/25/obiekty-referencje-i-typy-danych-czesc-2/</link>
		<comments>http://www.openserver.eu/index.php/2010/08/25/obiekty-referencje-i-typy-danych-czesc-2/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 14:24:00 +0000</pubDate>
		<dc:creator>solutions</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[poziom podstawowy]]></category>
		<category><![CDATA[python: kurs języka]]></category>

		<guid isPermaLink="false">http://www.openserver.eu/?p=51</guid>
		<description><![CDATA[W tej części opisane zostaną wbudowane w Python typy danych. Sam język posiada szereg wbudowanych typów: 1. None None to specyficzne dla Python’a słowo kluczowe oznaczające brak przypisanej wartości (w innych językach często odpowiednikiem jest Null) . 2. Typ logiczny Typem reprezentującym logiczną prawdę (wartość True) lub fałsz (False)  jest bool. Najczęściej wyrażenie zwracające taką [...]]]></description>
			<content:encoded><![CDATA[<p><strong>W tej części opisane zostaną wbudowane w Python typy danych.</strong></p>
<p>Sam język posiada szereg wbudowanych typów:</p>
<p><strong>1. None</strong></p>
<p>None to specyficzne dla Python’a słowo kluczowe oznaczające brak przypisanej wartości (w innych językach często odpowiednikiem jest Null) .</p>
<p><strong>2. Typ logiczny</strong></p>
<p>Typem reprezentującym logiczną prawdę (wartość True) lub fałsz (False)  jest <em>bool</em>. Najczęściej wyrażenie zwracające taką wartość używane jest w instrukcjach warunkowych (if) lub pętlach (while).<span id="more-51"></span></p>
<p>Przykładowo:</p>
<p><code><strong>&gt;&gt;&gt; if not x:<br />
print(„OK”)</strong><br />
</code></p>
<p>Użyty w powyższym przykładzie operator not spowoduje, iż wyraz OK  zostanie wypisany tylko wtedy, gdy  wartość zmiennej „x” NIE jest prawdą.</p>
<p>Testowana wartość zmiennej „x” nie musi być typu logicznego <em>bool</em> – wyrażenie zostanie uznane za fałsz gdy  jest jedną z poniższych wartości:</p>
<ul>
<li>None</li>
<li>Logiczną wartością False</li>
<li>Liczbową wartością zero</li>
<li>Pustą sekwencją (krotką (), listą [], łańcuchem znakowym ””) lub słownikiem {}</li>
<li>Dowolnym obiektem, którego klasa definiuje metodę __len__ lub __bool__ , a metoda ta, dla tego obiektu zwraca wartość numeryczną 0 lub logiczny fałsz (False).</li>
</ul>
<p><em>W Python’ie 2.6 i wcześniejszych  metoda __bool__ nosiła nazwę __nonzero__</em></p>
<p>Podstawowe operatory logiczne to or,and oraz not:</p>
<table>
<tbody>
<tr>
<td><strong>operator</strong></td>
<td><strong>operacja</strong></td>
<td><strong>Rezultat</strong></td>
</tr>
<tr>
<td>or</td>
<td>x or y</td>
<td>jeśli x jest fałszem zwraca y, w   przeciwnym razie x</td>
</tr>
<tr>
<td>and</td>
<td>x and y</td>
<td>jeśli x jest fałszem zwraca x, w   przeciwnym razie y</td>
</tr>
<tr>
<td>not</td>
<td>not x</td>
<td>jeśli x jest fałszem zwraca logiczną   wartość True, jeśli nie to False</td>
</tr>
</tbody>
</table>
<p>Odpowiednie wartości logiczne zwracane są przez używane w rozmaitych wyrażeniach (najczęściej instrukcjach warunkowych „<strong>if</strong>”) operatory porównań:</p>
<table>
<tbody>
<tr>
<td><strong>operator</strong></td>
<td><strong>Opis</strong></td>
</tr>
<tr>
<td>&lt;</td>
<td>mniejsze</td>
</tr>
<tr>
<td>&lt;=</td>
<td>mniejsze lub równie</td>
</tr>
<tr>
<td>&gt;</td>
<td>większe</td>
</tr>
<tr>
<td>&gt;=</td>
<td>większe lub równe</td>
</tr>
<tr>
<td>==</td>
<td>równe</td>
</tr>
<tr>
<td>!=</td>
<td>różne</td>
</tr>
<tr>
<td>is</td>
<td>jest</td>
</tr>
<tr>
<td>in</td>
<td>zawiera się</td>
</tr>
</tbody>
</table>
<p>Począwszy od Python’a 3.0 operacja porównania wartości, która nie ma sensu (np. porównanie 1&lt;”” albo None&gt;None) wyrzuca wyjątek TypeError.</p>
<p>W poprzednich wersjach (włącznie z 2.6) można było wpisać:</p>
<p><code><strong>&gt;&gt;&gt; a=None&gt;""<br />
&gt;&gt;&gt; a<br />
False</strong></code></p>
<p>W Python’ie 3.0 wyrzucony zostanie wyjątek:</p>
<p><code><strong>&gt;&gt;&gt; a=None&gt;""</strong><br />
<strong>Traceback (most recent call last):</strong><br />
<strong> File "&lt;stdin&gt;", line 1, in &lt;module&gt;</strong><br />
<strong>TypeError: unorderable types: NoneType() &gt; str()</strong><br />
</code></p>
<p><strong>Typy numeryczne</strong></p>
<p>Python posiada wbudowanych kilka standardowych typów numerycznych, umożliwiające operacje na liczbach całkowitych, rzeczywistych oraz zespolonych.</p>
<p>Poniższa lista prezentuje operatory i  funkcje typów numerycznych:</p>
<table>
<tbody>
<tr>
<td><strong>Operator/Funkcja</strong></td>
<td><strong>Znaczenie</strong></td>
</tr>
<tr>
<td>X + Y</td>
<td>Suma X i Y</td>
</tr>
<tr>
<td>X &#8211; Y</td>
<td>Różnica X i Y</td>
</tr>
<tr>
<td>X * Y</td>
<td>Iloczyn X i Y</td>
</tr>
<tr>
<td>X / Y</td>
<td>Iloraz X i Y</td>
</tr>
<tr>
<td>X // Y</td>
<td>Iloraz (zaokrąglony w dół) X i Y</td>
</tr>
<tr>
<td>X % Y</td>
<td>Reszta z dzielenia X i Y</td>
</tr>
<tr>
<td>-X</td>
<td>Negacja X</td>
</tr>
<tr>
<td>abs(X)</td>
<td>Wartość bezwględna X</td>
</tr>
<tr>
<td>int(X)</td>
<td>Wartość całkowita X</td>
</tr>
<tr>
<td>float(X)</td>
<td>Wartość zmiennoprzecinkowa X</td>
</tr>
<tr>
<td>complex(RE,IM)</td>
<td>Liczba zespolona z częścią rzeczywistą RE i urojoną IM (domyślnie   zero)</td>
</tr>
<tr>
<td>C.conjugate()</td>
<td>Zwraca liczbę sprzężoną liczby zespolonej C</td>
</tr>
<tr>
<td>divmod(X,Y)</td>
<td>Krotka:  ( X // Y , X % Y )</td>
</tr>
<tr>
<td>pow(X , Y)</td>
<td>X do potęgi Y</td>
</tr>
<tr>
<td>X ** Y</td>
<td>X do potęgi Y</td>
</tr>
</tbody>
</table>
<p><strong>1. int</strong></p>
<p>Liczby całkowite, do wersji 2.6 Python’a były one przechowywane za pomocą wartości 32-bitowych (aby sprawdzić  największą wartość jaką może przyjmować  <em>int</em> można było w Python’ie 2.6 i wcześniejszych użyć metody <em>maxint</em> z modułu <em>sys</em>). Python 3.0 ujednolicił typy <em>int</em> oraz <em>long</em>: istnieje jeden typ <em>int</em> zachowujący się jak <em>long</em> z Python’a 2.6 (a więc jego zakres nie jest ograniczony).</p>
<p>Aby utworzyć zmienną x typu int i przypisać jej wartość  123 wystarczy napisać:</p>
<p><code><strong>&gt;&gt;&gt; x1 = 123</strong></code></p>
<p>Wykorzystując odpowiednie prefix’y możliwe jest także użycie notacji dwójkowej, ósemkowym oraz szesnastkowej:</p>
<p><code><strong>&gt;&gt;&gt; x2=0b1111011</strong><br />
<strong>&gt;&gt;&gt; x3=0o173</strong><br />
<strong>&gt;&gt;&gt; x4=0x7b</strong></code></p>
<p>Wszystkie powyższe zapisy tworzą zmienne o wartości dziesiętnej 123</p>
<p>Dla liczb całkowitych istnieje także możliwość wykonywania operacji bitowych. Poniższa tabela przedstawia operatory bitowe w kolejności rosnącego priorytetu.</p>
<table>
<tbody>
<tr>
<td><strong>Operator</strong></td>
<td><strong>Rezultat</strong></td>
</tr>
<tr>
<td>X | Y</td>
<td>Bitowa sumy (OR)</td>
</tr>
<tr>
<td>X ^ Y</td>
<td>Bitowa różnica symetryczna (XOR)</td>
</tr>
<tr>
<td>X &amp; Y</td>
<td>Bitowy iloczyn (AND)</td>
</tr>
<tr>
<td>X &lt;&lt; N</td>
<td>X przesunięte w lewo o N bitów</td>
</tr>
<tr>
<td>X &gt;&gt; N</td>
<td>X przesunięte w prawo o N bitów</td>
</tr>
<tr>
<td>~X</td>
<td>Inwersja bitowa</td>
</tr>
</tbody>
</table>
<p>Priorytet operacji bitowych jest niższy niż operacji arytmetycznych , a wyższy od porównań.</p>
<p><strong>2. float</strong></p>
<p>To liczby zmiennoprzecinkowe, implementowane za pomocą zmiennych typu <em>double</em> języka C, ich precyzja zależy od konkretnej platformy.</p>
<p>Tworzyć liczby tego typu można  następująco:</p>
<p><code>&gt;&gt;&gt; x = 123.0</code></p>
<p><strong>3. complex</strong></p>
<p>To  liczby zespolone, podobnie jak float implementowane za pomocą wartości double języka C.  Mając liczbę zespoloną x można odwołać się do części rzeczywistej poprzez x.real, a do urojonej przez x.imag.</p>
<p>Liczby urojone można tworzyć następująco:</p>
<p><code><strong>&gt;&gt;&gt; x1=1+2j</strong><br />
<strong>&gt;&gt;&gt; x2=complex(0,4)</strong><br />
<strong>&gt;&gt;&gt; print(x1)</strong><br />
<strong>(1+2j)</strong><br />
<strong>&gt;&gt;&gt; print(x2)</strong><br />
<strong>4j</strong><br />
</code></p>
<p>W następnej części napiszemy o wbudowanych typach sekwencyjnych.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.openserver.eu/index.php/2010/08/25/obiekty-referencje-i-typy-danych-czesc-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programowanie z użyciem Last.fm API</title>
		<link>http://www.openserver.eu/index.php/2010/08/24/37programowanie-z-uzyciem-last-fm-ap/</link>
		<comments>http://www.openserver.eu/index.php/2010/08/24/37programowanie-z-uzyciem-last-fm-ap/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 07:57:07 +0000</pubDate>
		<dc:creator>solutions</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[last.fm]]></category>
		<category><![CDATA[poziom średniozaawansowany]]></category>

		<guid isPermaLink="false">http://www.openserver.eu/?p=37</guid>
		<description><![CDATA[Każdy “poważny” serwis w dzisiejszych czasach posiada swoje API czyli interfejs programistyczny. Nie inaczej jest z last.fm. Ten popularny serwis muzyczny posiada bardzo rozbudowane API umożliwiające między innymi: pobranie listy ostatnio odtwarzanych utworów przez określonego użytkownika pobranie informacji o wykonawcy, albumie czy wydarzeniu w określonej lokalizacji dodanie utworu, albumu czy wykonawcy do własnej biblioteki lub [...]]]></description>
			<content:encoded><![CDATA[<p>Każdy “poważny” serwis w dzisiejszych czasach posiada swoje API czyli interfejs programistyczny. Nie inaczej jest z last.fm. Ten popularny serwis muzyczny posiada bardzo rozbudowane API umożliwiające między innymi:</p>
<ul>
<li> pobranie listy ostatnio odtwarzanych utworów przez określonego użytkownika</li>
<li>pobranie informacji o wykonawcy, albumie czy wydarzeniu w określonej lokalizacji</li>
<li> dodanie utworu, albumu czy wykonawcy do własnej biblioteki lub listy odtwarzania</li>
<li>wysyłanie informacji o odtwarzanych utworach do serwisu (<em>scrobbling</em>)<span id="more-37"></span></li>
</ul>
<p>Możliwości jest dużo więcej, cała dokumentacja dostępna pod adresem <a href="http://www.lastfm.pl/api/intro">http://www.lastfm.pl/api/intro</a></p>
<p>Pierwszym krokiem do korzystania z API (prócz oczywiście samej rejestracji i zalogowania się w serwisie) jest pozyskanie odpowiedniego klucza. Należy przejść na stronę <a href="http://www.lastfm.pl/api/account">http://www.lastfm.pl/api/account</a> , gdzie trzeba określić formę naszej aplikacji (zwykle jest to pierwsza opcja “Non-commercial Use” &#8211; czyli aplikacja do użytku niekomercyjnego) a także jej nazwę oraz krótki opis.</p>
<p>Po wysłaniu formularza od razu dostaniemy dwa klucze opisane jako API Key oraz secret.</p>
<p>W kolejnym kroku pobieramy potrzebne biblioteki z zakładki downloads (<a href="http://www.last.fm/api/downloads">http://www.last.fm/api/downloads</a>), gdzie znajdują się interfejsy do większości popularnych języków programowania. W przypadku Pythona należu pobrać i zainstalować moduł pyLast (<a href="http://code.google.com/p/pylast/">http://code.google.com/p/pylast/</a>), który znajduje się w repozytorium svn. Jeżeli pracujemy pod Linuksem wystarczy (jeśli mamy zainstalowanego klienta svn) wydać komendę:</p>
<p><code>svn checkout http://pylast.googlecode.com/svn/trunk/ pylast-read-only</code></p>
<p>a następnie zainstalować ją odpowiednią dla dystrybucji komendą, np.</p>
<p><code>sudo python setup.py install</code></p>
<p>W przypadku Windows można do pobrania kodu użyć klienta Tortoise SVN lub po prostu pobrać pliki pylast.py i setup.py z <a href="http://pylast.googlecode.com/svn/trunk/">repozytorium</a> i zainstalować komendą<br />
<code>python setup.py install</code></p>
<p>Teraz przetestujemy instalację, początek każdego połączenia będzie identyczny:</p>
<pre class="brush: python;">import pylast
API_KEY = 'tu Twój API KEY'
API_SECRET = 'tu Twoje hasło'
username = 'tu nazwa Twojego użytkownika'
password_hash = pylast.md5('tu hasło Twojego użytkownika')
network = pylast.get_lastfm_network(api_key = API_KEY, api_secret = API_SECRET, username = username, password_hash = password_hash)&lt;/code&gt;</pre>
<p>Utworzony obiekt network posłuży nam do pobierania odpowiednich obiektów zawierających informacje o artystach, albumach czy utworach, a także do wysyłania poleceń do serwisu.</p>
<p>aby teraz pobrać informację o artyście piszemy:</p>
<pre class="brush: python;">artist = network.get_artist('Iron Maiden')</pre>
<p>Teraz pobierzemy listę najpopularniejszych utworów:</p>
<pre class="brush: python;">tracks=artist.get_top_tracks()</pre>
<p>I wyświetlamy pierwsze 10:</p>
<pre class="brush: python;">
i=0
for track in tracks:
print track.item.title
i += 1
if i == 10: break;
</pre>
<p>Run To The Hills<br />
The Number of the Beast<br />
The Trooper<br />
2 Minutes to Midnight<br />
Aces High<br />
Fear of the Dark<br />
Hallowed Be Thy Name<br />
Wasted Years<br />
Can I Play With Madness<br />
The Evil That Men Do</p>
<p>w podobny sposób możemy pobrać listę tagów:</p>
<pre class="brush: python;">tags=artist.get_top_tags()
i=0
for tag in tags:
print tag.item.name
i += 1
if i == 10: break;</pre>
<p>heavy metal<br />
metal<br />
NWOBHM<br />
hard rock<br />
rock<br />
Power metal<br />
british<br />
classic rock<br />
Iron Maiden<br />
New Wave of British Heavy Metal</p>
<p>Oczywiście można także bezpośrednio pobrać informację o określonym utworze:</p>
<pre class="brush: python;">track = network.get_track(&quot;Iron Maiden&quot;, &quot;Rime of the ancient mariner&quot;)</pre>
<p>i wysłać informacje o “polubieniu go”:</p>
<pre class="brush: python;">track.love()</pre>
<p>Pobranie informacji o albumie i jego utworach jest analogiczne, z tym że utwory albumu pobrane za pomocą metody get_tracks są w postaci listy:</p>
<pre class="brush: python;">album = network.get_album('Amorphis','Eclipse')
print album.get_tracks()</pre>
<p><code>[Amorphis - Two Moons, Amorphis - House Of Sleep, Amorphis - Leaves Scar, Amorphis - Born From Fire, Amorphis - Under A Soil And Black Stone, Amorphis - Perkele (The God of Fire), Amorphis - The Smoke, Amorphis - Same Flesh, Amorphis - Brothers moon, Amorphis - Empty Opening, Amorphis - Stonewomen (Bonus Track)]</code></p>
<p>podobnie proste jest otagowanie albumu i pobranie listy tagów:</p>
<pre class="brush: python;">album.add_tags('progressive metal')
album.get_tags()</pre>
<p>[metal, Progressive metal]</p>
<p>Jak widać API jest bardzo proste i przyjemne w użyciu, jedynym problemem może być dokumentacja, w takim przypadku bardzo pomagają polecenia <em><strong>dir</strong></em> oraz <strong><em>help</em></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.openserver.eu/index.php/2010/08/24/37programowanie-z-uzyciem-last-fm-ap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obiekty, referencje i typy danych część 1</title>
		<link>http://www.openserver.eu/index.php/2010/08/23/obiekty-referencje-i-typy-danych-czesc-1/</link>
		<comments>http://www.openserver.eu/index.php/2010/08/23/obiekty-referencje-i-typy-danych-czesc-1/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 16:58:19 +0000</pubDate>
		<dc:creator>solutions</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[poziom podstawowy]]></category>
		<category><![CDATA[python: kurs języka]]></category>

		<guid isPermaLink="false">http://www.openserver.eu/?p=27</guid>
		<description><![CDATA[W tym artykule opisane zostaną podstawowe pojęcia jak obiekty, referencję i dynamiczne typowanie w Python&#8217;ie. 1. Obiekty Dane każdego programu w Python’ie przechowywane są za pomocą obiektów oraz relacji między nimi.  Każdy obiekt posiada trzy własności: unikalny identyfikator (czasem  nazwany  tożsamością), który nigdy się nie zmienia (można go interpretować jako adres obiektu w pamięci), a [...]]]></description>
			<content:encoded><![CDATA[<p><strong>W tym artykule opisane zostaną podstawowe pojęcia jak obiekty, referencję i dynamiczne typowanie w Python&#8217;ie.</strong></p>
<p><strong>1. Obiekty</strong></p>
<p>Dane każdego programu w Python’ie przechowywane są za pomocą obiektów oraz relacji między nimi.  Każdy obiekt posiada trzy własności: unikalny identyfikator (czasem  nazwany  tożsamością), który nigdy się nie zmienia (można go interpretować jako adres obiektu w pamięci), a także typ (również niezmienny w czasie życia obiektu) oraz określoną wartość.<span id="more-27"></span></p>
<p>Jeżeli wartości obiektu po jego utworzeniu także nie można zmienić  to mamy do czynienia z tak zwanym obiektem <strong>niemutowalnym </strong>(ang. <em>immutable</em>), w przeciwnym razie jest to obiekt <strong>mutowalny</strong> (ang. <em>mutable</em>).</p>
<p>Mutowalność określa sam typ obiektu: przykładowo, obiekty typów  numerycznych (jak <em>int</em> czy <em>float</em>), łańcuchów znakowych (<em>str</em>) oraz krotek (<em>tuple</em>) są niemutowalne, natomiast można modyfikować listy (<em>list</em>) oraz słowniki (<em>dict</em>). Obiekty tworzone przez użytkownika (instancje klas) są zwykle mutowalne. Szczegółowo o podstawowych typach danych napiszemy w kolejnych częściach.</p>
<p>Gdy trzeba zmodyfikować wartość zmiennej typu niemutowanego, to tworzony jest po prostu nowy obiekt danego  typu i przypisywany tej zmiennej (tak, by wskazywała na ten nowy obiekt). Mutowalność ma także znaczenie przy przekazywaniu zmiennych do funkcji: możemy przekazywać zmienne zarówno mutowalne jak i niemutowalne, lecz należy pamiętać iż w funkcji tej nie zmodyfikujemy przekazanych  obiektów typów niemutowanych.</p>
<p>Wszystkie typy niezmienne (<em>immutable</em>) są także haszowalne (<em>hashable</em>): oznacza to, że posiadają metodę __hash__, która zwraca określoną wartość, niezmienną przez cały okres „życia” obiektu. Tylko obiekty haszowalne mogą być  użyte jako klucze w słownikach (<em>dict</em>)  oraz elementy zbiorów (<em>set</em>). Z wbudowanych typów Python’a jedynie lista (<em>list</em>) oraz słownik (<em>dict</em>) są niehaszowalne, z kolei obiekty tworzone przez użytkownika domyślnie są haszowalne.</p>
<p><strong>2. Referencje</strong></p>
<p>W Python’ie referencje to byty „wskazujące” na obiekty określonego typu.  Nazwane referencje (o nadanej, określonej nazwie) będą zwane dalej zmiennymi. Referencja „wskazuje” na odpowiedni obszar pamięci w którym znajduje się obiekt określonego typu.  Wspomniane wyżej przekazywanie obiektów  do  funkcji realizowane jest właśnie przez  referencje.</p>
<p>Aby się o tym przekonać wystarczy wpisać w konsoli następujący przykład:</p>
<p><code><strong>&gt;&gt;&gt; def wypisz(a):</strong><br />
<strong>&gt;&gt;&gt;     print("przekazana wartosc a =",a,", id a =",id(a))</strong><br />
<strong>&gt;&gt;&gt; x=123</strong><br />
<strong>&gt;&gt;&gt; print(id(x))</strong><br />
<strong>505306344</strong><br />
<strong>&gt;&gt;&gt; wypisz(x)</strong><br />
<strong>przekazna wartosc a = 123 , id a = 505306344</strong><br />
</code></p>
<p>Powyższy przykład deklaruje funkcje „wypisz” z jednym parametrem, której jedynym zadaniem jest wypisanie przekazanej poprzez parametr „a” wartości. Użyta tu wbudowana funkcja <strong>id</strong> zwraca unikalny identyfikator obiektu, zwykle jest to reprezentacja adresu, pod którym obiekt znajduje się w pamięci operacyjnej. Przed wywołaniem funkcji tworzona jest zmienna „x”, której przypisana jest wartość liczbowa 123. Następnie dwukrotnie wywoływana jest wbudowana funkcja <strong>id</strong>: najpierw bezpośrednio a następnie w samej funkcji  <strong>wypisz</strong>. Widać, że wypisywana przez <strong>id</strong> wartość jest identyczna, a więc  mamy do czynienia z jednym i tym samym obiektem.</p>
<p>W Python’ie nie trzeba martwić się o niszczenie nieużywanych obiektów: działająca na zasadzie zliczania referencji „śmieciarka” (ang. <em>garbage collector</em>) zwolni obszar pamięci jeżeli obiekt, który go zajmował nie jest już używany (w uruchomionym programie nie ma już więcej referencji wskazujących na ten obiekt).</p>
<p><strong>3. Dynamiczne typowanie </strong></p>
<p>Python jest językiem o tak zwanym dynamicznym typowaniu: w przeciwieństwie do języków o typowaniu statycznym (takich jak C/C++ czy Java) nie trzeba w nim jawnie deklarować typu tworzonej zmiennej.  Język sam określi typ korzystając z kontekstu, przykładowo pisząc:</p>
<p><code><strong>&gt;&gt;&gt; a = 3</strong><br />
<strong>&gt;&gt;&gt; x = ‘znaki’</strong><br />
</code></p>
<p>Zostaną utworzone dwie zmienne:  zmienna „a” typu <em>int</em> (liczba całkowita) oraz „x” typu <em>str</em> (łańcuch znakowy) i  zostaną im przypisane odpowiednie wartości.</p>
<p>Referencja nie jest przypisana utworzonemu raz obiektowi aż do jego „śmierci”, w każdej chwili możemy spowodować by wskazywała na obiekt  innego typu, np.</p>
<p><code><strong>&gt;&gt;&gt; a = ‘teraz to zmienna typu str’</strong><br />
</code></p>
<p>W następnej części opiszemy wbudowane w język, podstawowe typy danych i odpowiednie operatory.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.openserver.eu/index.php/2010/08/23/obiekty-referencje-i-typy-danych-czesc-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python &#8211; instalacja i interpeter</title>
		<link>http://www.openserver.eu/index.php/2010/08/23/python-instalacja-i-interpeter/</link>
		<comments>http://www.openserver.eu/index.php/2010/08/23/python-instalacja-i-interpeter/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 16:36:43 +0000</pubDate>
		<dc:creator>solutions</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[poziom podstawowy]]></category>
		<category><![CDATA[python: kurs języka]]></category>

		<guid isPermaLink="false">http://www.openserver.eu/?p=21</guid>
		<description><![CDATA[Ten krótki artykuł ma za zadanie zapoznać z instalacją języka i uruchomieniem interpretera W systemie Windows instalacja Pythona sprowadza się do uruchomienia gotowego programu instalacyjnego, w systemach linuksowych Python zwykle jest już zainstalowany (często jest głęboko zintegrowany z dystrybucją:  przykładowo w  Gentoo polecenie emerge &#8211; będące częścią systemu zarządzania pakietami Portege &#8211; zostało napisane właśnie [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Ten krótki artykuł ma za zadanie zapoznać z instalacją języka i uruchomieniem interpretera</strong></p>
<p>W systemie Windows instalacja Pythona sprowadza się do uruchomienia gotowego programu instalacyjnego, w systemach linuksowych Python zwykle jest już zainstalowany (często jest głęboko zintegrowany z dystrybucją:  przykładowo w  Gentoo polecenie emerge &#8211; będące częścią systemu zarządzania pakietami Portege &#8211; zostało napisane właśnie w tym języku).<span id="more-21"></span></p>
<p>Jeśli jednak Pythona nie ma w systemie, to należy zainstalować go korzystając z pakietów przygotowanych dla danej dystrybucji, np w dystrybucjach opartych na Debianie (jak Ubuntu) będzie to polecenie:</p>
<p><code><strong>sudo apt-get install python</strong><br />
</code></p>
<p>W Linuksie można też spróbować instalacji ze źródeł wykonując następujące polecenia w folderze, w którym znajduje się pobrany z <a href="http://www.python.org">www.python.org</a> plik Python-2.5.1.tar.bz2:</p>
<p><code><strong>tar xfj Python-2.5.1.tar.bz2</strong><br />
<strong>cd Python-2.5.1</strong><br />
<strong>./configure --prefix=/opt/python/2.5.1</strong><br />
<strong>make</strong><br />
<strong>make install</strong><br />
</code></p>
<p>Ostatnie polecenie należy wykonać jako użytkownik <strong>root</strong>.  Jeżeli nie mamy dostępu do konta superużytkownika to alternatywą jest instalacja lokalna, w takim przypadku polecenie <strong>configure</strong> może wyglądać następująco:</p>
<p><code><strong>./configure --prefix=~/python/2.5.1</strong><br />
</code></p>
<p><strong>Uruchomienie</strong></p>
<p>W systemie Windows wybierając opcję „Python (command line)” z menu Programy dostajemy dostęp do konsoli  interpretera języka.  W Linuksie wpisujemy w konsoli  powłoki polecenie python lub python2.5 (jeśli jest on w ścieżce wyszukiwania zawartej w zmiennej środowiskowej PATH, w przeciwnym razie należy użyć pełnej ścieżki – np. <em>/opt/python/2.5.1/bin/python</em> bądź też <em>~/python/2.5.1/bin/python</em> jeśli został zainstalowany lokalnie &#8211; w katalogu użytkownika).</p>
<p>Uruchomiony interpreter powinien wyświetlić informacje o wersji i znak zachęty „&gt;&gt;&gt;”:</p>
<p><code><strong>Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on</strong><br />
<strong>win32</strong><br />
<strong>Type "help", "copyright", "credits" or "license" for more information</strong><br />
<strong>&gt;&gt;&gt;</strong></code><strong> </strong></p>
<p>Python jest językiem interpretowanym, co jest zarówno jego zaletą jak i wadą:</p>
<ul>
<li>zaletą, ponieważ odpada czasochłonny proces kompilacji kodu, który może być natychmiast wykonany. W dodatku ten sam kod, bez żadnych modyfikacji, może być wykonany na różnych platformach.</li>
<li>wadą, ponieważ skompilowany dla konkretnej platformy kod będzie zwykle dużo szybszy od interpretowanego.</li>
</ul>
<p>Wymieniona wada nie tu jednak dużą przeszkodą: moc obliczeniowa komputerów praktycznie podwaja się co rok.  Do pewnych zastosowań (nie tylko web-developmentu ale także pisania prostych gier) Python wydaje się optymalny przede wszystkim ze względu na wspomnianą szybkość tworzenia aplikacji i czytelność.</p>
<p><strong>Dynamiczne typowanie</strong></p>
<p>Python nie wymaga deklarowania typów, co nie oznacza że ich nie posiada: każda wartość jest określonego typu. Język oferuje kilka wbudowanych,  podstawowych typów:</p>
<ul>
<li>int dla wartości całkowitych</li>
<li>float dla zmiennoprzecinkowych</li>
<li>bool dla logicznych (True,False)</li>
<li>str lub unicode dla łańcuchów znakowych</li>
</ul>
<p>Aby przykładowo przypisać zmiennej o nazwie a1 wartość 123 wystarczy napisać:</p>
<p><code><strong>a1=123</strong></code></p>
<p>Takie przypisanie wartości do literału powołuje zmienną do życia – nie jest potrzebne wcześniejsze zadeklarowanie jej typu. W każdej chwili, dokładnie w ten sam sposób można zmiennej a1 przypisać wartość innego typu:</p>
<p><code><strong>a1=’To wskazuje zmienna a1’ </strong></code></p>
<p>Łańcuchy znakowe są niezmienne – raz utworzonego łańcucha nie można zmienić, np. skrócić, czy zamienić część znaków. Można natomiast utworzyć nowy łańcuch na jego podstawie. Python oferuje dużą ilość operacji na łańcuchach. Aby się o tym przekonać wystarczy po utworzeniu zmiennej a1 w pokazany sposób wpisać w konsoli polecenie:</p>
<p><code><strong>dir(a1)</strong></code></p>
<p>Interpreter wypisze listę operacji jaką można wykonać na zmiennej a1:</p>
<p><code>['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__str__', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']</code></p>
<p>Przykładowo, aby dowiedzieć się co robi metoda swapcase można użyć polecenia help:</p>
<p><code>help(a1.swapcase)</code></p>
<p>Powyższe polecenie wypisze odpowiedni tekst pomocy (w języku angielskim):</p>
<p><code>swapcase(...)<br />
S.swapcase() -&gt; string</p>
<p>Return a copy of the string S with uppercase characters<br />
converted to lowercase and vice versa.</code></p>
<p>Co oznacza że metoda swapcase zwraca kopię łańcucha S, w którym duże litery będą zamienione na małe, a małe na duże. Tworzymy zmienną a2, a następnie wypisujemy jej wartość pisząc w konsoli:</p>
<p><code><strong>a2=a1.swapcase()<br />
print a2</strong></code></p>
<p>Wyrażenie a1.swapcase() oznacza wywołanie metody swapcase obiektu a1. Metoda ta tworzy i zwraca odpowiedni łańcuch znakowy, który ostatecznie zostaje przypisany zmiennej a2.<br />
Polecenie print zapisuje swe argumenty (tu wartość zmiennej a2) na standardowe wyjście (zwykle ekran monitora). W rezultacie na konsoli pojawi się napis:</p>
<p><code>tO WSKAZUJE ZMIENNA A1</code></p>
<p>W każdej chwili możemy dowiedzieć się jakiego typu jest wartość przypisana do zmiennej a2 pisząc:</p>
<p><code><strong>type(a2)</strong></code></p>
<p>Odpowiedź będzie zgodna z oczekiwaniami:</p>
<p><code>&lt;type 'str'&gt;</code></p>
<p>Nie musimy się martwić niszczeniem raz utworzonych obiektów, tym zajmuje się wbudowany w język garbate collector (dosłownie:  śmieciarka), który niszczy nieużywane obiekty zwalniając przydzielone im obszary pamięci.</p>
<p><strong>Referencje</strong></p>
<p>Zmienne a1 i a2 z ostatnich przykładów są tak zwanymi referencjami  do obiektów. Referencje  to dane zawierające informacje gdzie wskazywany przez nie obiekt znajduje się w pamięci. Do jednego obiektu może istnieć praktycznie dowolnie duża ilość referencji w aplikacji (na taki obiekt może wskazywać dowolnie wiele utworzonych zmiennych).</p>
<p>Wspomniany mechanizm śmieciarki działa właśnie na zasadzie zliczania referencji: obiekt jest usuwany z pamięci jeżeli w aplikacji nie wskazuje na niego już żadna referencja.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.openserver.eu/index.php/2010/08/23/python-instalacja-i-interpeter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

