Wykład 5

Transkrypt

Wykład 5
Podstawy programowania
Python – wykład 5
Funkcje
●
lambda tworzy funkcje anonimowe;
●
map uruchamia funkcję poza sekwencją i zbiera wyniki;
●
funkcje zwracają None, jeśli nie używają instrukcji return;
●
funkcje dają możliwość wyboru projektu;
●
funkcje są obiektami, podobnie jak liczby i łańcuchy.
Wyrażenia lambda
●
Oprócz instrukcji def w języku Python istnieje wyrażenie, które
generuje obiekty funkcji – to wyrażenie lambda.
●
Zapisuje się to jako słowo kluczowe lambda, po którym nastepuje
jeden lub więcej argumentów zakończonych dwukropkiem, a za tym
następuje wyrażenie:
lambda arg1, arg2, …, argN: wyr używające arg
lambda
●
●
●
●
lambda jest wyrażeniem, a nie instrukcją – dlatego może
pojawiać się wszędzie tam, gdzie nie może występować def,
np. wewnątrz stałej listy.
lambda jako wyrażenie zwraca wartość (czyli nową
funkcję), której może być opcjonalnie przypisana nazwa.
(Instrukcja def zawsze przypisuje nową funkcję do nazwy w
nagłówku, a nie zwraca ją jako wynik).
Ciało wyrażenia lambda jest pojedynczym wyrażeniem, a
nie blokiem instrukcji – podobne jest do tego, co wstawia się
w ciele def w instrukcji return.
W wyrażeniu lambda można zawrzeć tylko takie działania,
w których nie są wymagane instrukcje podobne do if.
Przykład 1
def F(x,y,z): return x + y + z
print(F(2,3,4))
f = lambda x, y, z: x + y + z
print(f(2,3,4))
x = lambda a='ala', b='ola', c='ela': a + b + c
print(x(c='zbyszek'))
Przykład 2
Wprowadzenie wyrażenia lambda do stałej listy:
L = ( lambda x: x**2,
lambda x: x**3,
lambda x: x**4 )
for i in L:
print(i(2))
print(L[0](3))
Wbudowana funkcja map
●
●
●
Jedną z najczęściej spotykanych sytuacji przy przetwarzaniu
list przez programy jest wykonanie operacji w każdym
węźle i zebranie wyników – służy do tego wbudowana
funkcja map.
Ponieważ map spodziewa się funkcji, to właśnie z nią
stosowane są często wyrażenia labda, przykład 6.
map jest najprostszą spośród funkcji wbudowanych języka
Python, używanych w programowaniu funkcjonalnym
(w większości przypadków oznacza to narzędzia, które
uruchamiają funkcje w sekwencji).
Przykład 3
Aktualizacja wszystkich liczników z danej listy:
liczniki = [1,2,3,4]
poprawione = []
for i in liczniki:
poprawione.append(i+10)
print(poprawione)
Przykład 4
Funkcja map wywołuje przekazaną funkcję dla każdej pozycji w obiekcie
sekwencyjnym i zwraca listę, zawierającą wszystkie wyniki wywołania tej funkcji.
liczniki = [1,2,3,4]
def przyrost(x): return x + 10
s = list(map(przyrost, liczniki))
print(s)
w = list(map(lambda x: x+3, liczniki))
print(w)
Zasady projektowania funkcji
●
●
●
Dla wejść należy używać argumentów, a dla wyjść
instrukcji return – powinniśmy starać się zbudować
funkcję niezależnie od czynników na zewnątrz funkcji.
Zmiennych globalnych należy używać tylko wtedy, gdy
jest to absolutnie konieczne.
Nie należy modyfikować argumentów zmiennych, jeśli
wywołanie tego nie oczekuje – uwaga ta dotyczy
obiektów zmiennych.
Wywołania pośrednie
●
●
●
Funkcje w fazie działania programu są obiektami,
można tworzyć takie programy, które przetwarzają je w
sposób obiektowy.
Obiekty funkcji mogą być przypisane, przekazane do
innych funkcji, zapisane w strukturach danych, itd., tak,
jakby były prostymi liczbami lub łańcuchami.
Obiekty funkcji mogą eksportować specjalne operacje,
są one wówczas wywołane z argumentami podanymi w
nawiasach po wyrażeniu funkcji.
Przykład 5
Nazwa funkcji jest odwołaniem do obiektu, który można ponownie przypisać do
innych nazw i wywołać go przez dowolne odwołanie, a nie tylko przez jego
pierwszą nazwę.
def drukuj(komunikat):
print(komunikat)
x = drukuj
x('Hello world!')
Przykład 6
Ponieważ argumenty są przekazywane przez przypisania do obiektów, to
przekazanie funkcji do innych funkcji jest tak samo proste, jak przekazanie
argumentów.
def F(func,arg):
func(arg)
F(drukuj,'Hello world!')
Moduły
●
●
●
Moduł to najwyższa jednostka organizacyjna programu.
Moduły przybierają postać plików z programami języka
Python.
Moduły są przetwarzane za pomocą:
–
import – pozwala klientowi na pobranie modułu
w całości;
–
from – pozwala klientowi na pobranie
specyficznych nazw z modułu;
Dlaczego używa się modułów?
●
Pozwalają w prosty sposób zorganizować składniki
w jeden system.
●
Ponowne użycie kodu.
●
Podział systemowej przestrzeni nazw.
●
Wprowadzanie współdzielonych usług lub danych.
UWAGI
●
●
●
●
●
Modułu można nazywać dowolnie, ale nazwy plików
modułowych powinny mieć rozszerzenie py.
Do nazw modułów stosuje się reguły nazywania
zmiennych.
Instrukcja import pobiera moduł jako całość, więc
trzeba używać kwalifikacji, aby pobrać jego nazwy.
from pobiera specyficzne nazwy z modułu.
Użycie * w instrukcji from powoduje, że uzyskuje się
kopie wszystkich nazw przypisanych na najwyższym
poziomie wskazanego modułu.
Przykład 7
funkcje.py
def wypisz(x): print(x)
def suma(x,y): return x + y
def roznica(x,y): return x – y
def iloczyn(x,y): return x * y
def iloraz(x,y): return x / y
Przykład 8
import funkcje
funkcje.wypisz('Ala ma kota')
print(funkcje.suma(10,20))
print(funkcje.roznica(10,20))
print(funkcje.iloczyn(10,20))
print(funkcje.iloraz(10,20))
Przykład 9
from funkcje import wypisz
wypisz('Ala ma kota')
print(suma(10,20))
Przykład 10
from funkcje import *
wypisz('Ala ma kota')
print(suma(10,20))
UWAGI
●
●
●
●
●
●
Moduły są ładowane i uruchamiane po pierwszej
instrukcji import lub from.
Uruchomienie kodu modułu tworzy jego nazwy na
najwyższym poziomie.
Późniejsze wywołania import i from dotyczą modułu
załadowanego wcześniej.
import przypisuje cały obiekt modułowy do nazwy.
from przypisuje jedną lub więcej nazw do obiektów
o tych samych nazwach w innym module.
import musi być wykonana po instrukcji from.
Przykład 11
from funkcje import zm1,zm2 #tworzy kopie dwóch nazw
print(zm1)
print(zm2)
zm1 = 12
#zmienia tylko lokalne zm1
zm2[0] = 123
#modyfikuje współdzielony obiekt zmienny
import funkcje
#pobiera nazwę modułu (from tego nie robi)
print(funkcje.zm1)
#zm1 z obiektu funkcje
print(funkcje.zm2)
#zm2 obiekt współdzielony i zmieniony

Podobne dokumenty