Więcej Pythona

Wprowadzenie

Jak dotychczas, poznaliśmy już większość aspektów Pythona, których będziesz używać. W tym rozdziale zajmiemy się jeszcze kilkoma innymi, które mogą się przydać.

Rozmieszczanie wszędzie krotek

Czy marzyłeś kiedyś o tym, żeby funkcja zwracała dwie wartości? W Pythonie wystarczy użyć do tego krotki.

>>> def szczegoly_bledu():
...     return (2, 'dalsze szczegóły')
...
>>> bladnum, bladstr = szczegoly_bledu()
>>> bladnum
2
>>> bladstr
'dalsze szczegóły'

Zauważ, że użycie a, b = <jakieś wyrażenie> interpretuje wynik tego wyrażenia jako dwuelementową krotkę.

Krotka musi zawierać dokładnie tyle elementów, ilu zmiennym chcemy przypisywać wartość. Po wpisaniu na przykład a, b = (1, 2, 3) lub a, b = 'abc', Python nam powie, że jest za dużo wartości do przypisania. Analogicznie przy wpisaniu a, b, c = (1, 2) lub a, b, c = 'ab', Python powie, że wartości jest za mało.

To przy okazji oznacza, że najszybszym sposobem na zamianę zmiennych miejscami w Pythonie jest:

>>> a = 5; b = 8
>>> a, b = b, a
>>> a, b
(8, 5)

Specjalne metody

Istnieją pewne metody, takie jak __init__ lub __del__, które mają specjalne znaczenie w klasach.

Specjalne metody służą do naśladowania konkretnych zachowań wbudowanych typów. Na przykład, gdy chcesz używać w swojej klasie operatora indeksowania obiekt[element] (tak, jak to wygląda w krotkach czy listach), to wszystko, co musisz zrobić, to zaimplementować metodę __getitem__ i gotowe. Gdyby się nad tym zastanowić, Python robi dokładnie to samo dla klasy list.

Kilka użytecznych metod wypisałem w tej tabeli. Jeżeli chcesz poznać wszystkie, zajrzyj do dokumentacji (dokumentacja w jęz. angielskim).

Nazwa Wyjaśnienie
__init__(self, ...) Ta metoda jest wywoływana zaraz przed oddaniem do użytku nowego obiektu tej klasy.
__del__(self) Wywoływana zaraz przed usunięciem obiektu.
__str__(self) Wywoływana przy użyciu print lub str
__lt__(self, other) Wywoływana przy użyciu operatora mniejsze niż (<). Podobnie istnieją też specjalne metody dla pozostałych operatorów (+, >, itd.)
__getitem__(self, key) Wywoływana przy użyciu operatora indeksowania.
__len__(self) Wywoływana przy użyciu funkcji len na obiekcie sekwencyjnym.

Table: Kilka specjalnych metod

Bloki pojedynczych wyrażeń

Jak wiemy z poprzednich lekcji, każdy blok wyrażeń jest oddzielony od reszty programu odpowiednim wcięciem. Jest jednak możliwy wyjątek od tej reguły. Jeżeli twój blok zawiera tylko jedno wyrażenie, możesz zapisać je w tej samej linii, co if, czy def. Ten przykład powinien wszystko wyjaśnić:

>>> flaga = True
>>> if flaga: print 'Tak'
...
Tak

Jak widzisz, pojedyncze wyrażenie nie zostało przeniesione do bloku. Pomimo tego, że to skraca program, szczerze odradzam ci stosowanie tej metody, nie licząc sprawdzania błędów. Program staje się czytelniejszy oraz wiele łatwiej dodać kolejną linijkę, gdy używasz właściwych wcięć.

Wyrażenie lambda

Wyrażenie lambda służy do tworzenia nowych obiektów funkcji i zwracania ich podczas uruchamiania programu.

Przykład:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Nazwa pliku: lambda.py

def powtarzaj(n):
    return lambda s: s*n

dwukrotnie = powtarzaj(2)

print dwukrotnie('słowo')
print dwukrotnie(5)

Rezultat:

$ python lambda.py
słowosłowo
10

Jak to działa:

Tutaj używamy funkcji powtarzaj do utworzenia nowych obiektów funkcji w trakcie działania programu i do zwracania ich. Wyrażenia lambda użyliśmy właśnie do tworzenia nowych obiektów. W gruncie rzeczy, lambda wygląda jak funkcja z parametrem i tylko jednym wyrażeniem. To wyrażenie staje się ciałem nowej funkcji, która zwraca jego wartość. Pamiętaj, że wewnątrz lambdy nie może być nawet polecenia print, jedynie wyrażenia.

Lista składana

Listy składane używamy do tworzenia list z już istniejących list. Przypuśćmy, że masz listę liczb i chcesz z tego stworzyć listę, w której znajdą się wszystkie liczby z listy pierwotnej, które są większe od 2, pomnożone przez 2.

Przykład:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Nazwa pliku: lista_skladana.py

lista1 = [2, 3, 4]
lista2 = [2*i for i in lista1 if i>2]
print lista2

Rezultat:

$ python lista_skladana.py
[6, 8]

Jak to działa:

Tworzymy nową listę, do której wstawiamy działanie (2*i) oraz warunek (if i>2). Możesz sprawdzić, że stara lista pozostaje niezmieniona.

Zaletą używania list złożonych jest to, że w ten sposób zmniejsza się ilość potrzebnego kodu, gdy używamy pętli do przetwarzania każdego elementu z listy i wstawiania go do nowej.

Otrzymywanie krotek i słowników w funkcjach

Istnieje specjalny sposób na zapisanie w funkcji parametrów w formie krotki lub słownika, używając odpowiednio prefiksu * lub **. Przydaje się to, gdy funkcja ma przyjmować różną liczbę parametrów.

Przykład:

>>> def suma_poteg(potega, *argumenty):
...     '''Zwraca sumę argumentów podniesionych do podanej potęgi.'''
...     suma = 0
...     for i in argumenty:
...         suma += pow(i, potega)
...     return suma
...
>>> suma_poteg(2, 3, 4)
25
>>> suma_poteg(2, 10)
100

Ponieważ przed parametrem argumenty daliśmy prefiks *, wszystkie argumenty, poza pierwszym, wylądowały w tym parametrze jako krotka. Gdyby zamiast tego został użyty prefiks **, argumenty (zapisane w postaci klucz = wartość) zostaną uznane za pary klucz–wartość słownika.

Funkcje exec i eval

Funkcja exec (z angielskiego execute — wykonywać) służy do wykonywania Pythonowych poleceń, które są zapisane w tekście lub w pliku, tak, jakby były zapisane normalnie w programie.

Przykład:

>>> exec('print "Ahoj, przygodo!"')
Ahoj, przygodo!

Podobnie, funkcja eval (z angielskiego evaluate — oceniać, szacować) służy do wliczania wyrażeń zapisanych w tekście.

Przykład:

>>> eval('2*3')
6

Wyrażenie assert

Wyrażenie assert służy do upewniania się, że coś jest prawdą. Na przykład, gdy jesteś naprawdę pewien, że lista zawiera co najmniej jeden element i chcesz to sprawdzić, przy czym gdyby to było nieprawdą, ma wyskoczyć błąd, to wtedy właśnie powinieneś użyć tego wyrażenia. Gdy assert wykaże fałsz, wywołany zostaje błąd typu AssertionError.

Przykład:

>>> lista = ['rzecz']
>>> assert len(lista) >= 1
>>> lista.pop()
'rzecz'
>>> lista
[]
>>> assert len(lista) >= 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

To wyrażenie powinno być używane bardzo rozważnie. Zazwyczaj o wiele lepiej jest ustalić wyjątki niż w wypadku problemu pokazać użytkownikowi, że jest błąd i zakończyć program.

Funkcja repr

Dzięki funkcji repr można uzyskać kanoniczną, tekstową reprezentację obiektu. Co ciekawe, najczęściej eval(repr(obiekt)) == obiekt będzie prawdą.

>>> i = []
>>> i.append('rzecz')
>>> repr(i)
"['rzecz']"
>>> eval(repr(i))
['rzecz']
>>> eval(repr(i)) == i
True

Zasadniczo, funkcja repr służy do uzyskiwania reprezentacji obiektu nadającej się do druku. Możesz określić, co zwróci twoja klasa podczas użycia na niej tej funkcji, poprzez określenie w niej metody __repr__.

Podsumowanie

Poznaliśmy w tym rozdziale jeszcze kilka cech Pythona, lecz nadal nie wszystkie. Aczkolwiek, poznaliśmy już większość tego, co ci będzie kiedykolwiek potrzebne. To zdecydowanie wystarczy, żebyś zaczął pracę nad jakimikolwiek programami.

W następnym rozdziale powiemy sobie, jak dalej odkrywać Pythona.

results matching ""

    No results matching ""