Tworzenie własnych funkcji

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 7123 razy

Funkcje jednoargumentowe lambda

Słowo kluczowe lambda umożliwia utworzenie w danym miejscu kodu funkcji jednoargumetnowej, której kod ogranicza się do jednej linijki. Tego typu funkcje wykorzystuje się wszędzie tam, gdzie ma się pewność jednokrotnego jej użycia. Oto jak można zadeklarować taką funkcję:

import math f = lambda x: math.sin(x) print("sin(pi/2) = {f}".format(f = f(math.pi / 2)))

Wynik działania powyższego kodu:

sin(pi/2) = 1.0

Definiowanie funkcji

W Pythonie nie ma możliwości przeciążania funkcji, co spowodowane jest tym, że wszystko, włącznie z funkcjami w Pythonie jest etykietą. Co by się stało, gdybym utworzył jedną funkcję np. przyjmującą jeden argument i drugą o takiej samej nazwie, ale przyjmującą dwa argumenty? Odpowiedź brzmi: pierwsza funkcja zostałaby nadpisana przez drugą. Z tego powodu w Pythonie funkcje definiuje się w dość dziwaczny (jak na mój gust) sposób. Oto prosty pierwszy przykład funkcji:

def silnia(n): if n < 2: return 1 return n * silnia(n - 1)

Jak widać na powyższym kodzie funkcji rekurencyjnej o nazwie silnia (która wiadomo co liczy) słowo kluczowe def rozpoczyna definicję funkcji, następnie standardowo jest nazwa funkcji i pomiędzy nawiasami okrągłymi lista jej argumentów, która w tym przypadku ogranicza się do jednego. Co ciekawe Python automatycznie rozszerza zakres danych, dzięki czemu łatwo można wykonać obliczenie np. silnia(100). Zapewniam, że Python policzy to dokładnie.

Rekurencyjne rozwiązanie jest jednak niezalecane (zwłaszcza w przypadku silni), ponieważ za każdym razem komputer musi zapamiętywać poprzedni krok a to znacząco spowalnia pracę. A więc lepiej napisać funkcję silnia za pomocą iteracji:

def silnia(n): s = 1 if n < 2: return 1 for i in range(2, n + 1): s *= i return s

Nowa wersja funkcji liczącej silnię jest szybsza i umożliwia obliczenie silni np. z 1000 (sprawdźcie, jeżeli nie wierzycie)

Istnieje też możliwość definiowania funkcji, która będzie miała zadeklarowane własne domyślne wartości argumentów. Oto przykład takiej funkcji:

def introduceYourself(name = None, surname = None): if name is None: name = input("Proszę, podaj swoje imię: ") if surname is None: surname = input("Proszę, podaj swoje nazwisko: ") print("Witaj {name} {surname}!".format(name = name, surname = surname)) introduceYourself("Zenon", "Pietrucha") introduceYourself("Zenon") introduceYourself(surname = "Pietrucha" introduceYourself()

Pierwsze wywołanie funkcji IntroduceYourself z dwoma argumentami spowoduje wyświetlenie:

Witaj Zenon Pietrucha!

Drugie, z jednym argumentem spowoduje wyświetlenie:

Proszę, podaj swoje nazwisko: Pietrucha
Witaj Zenon Pietrucha!

Trzecie wywołanie funkcji:

Proszę, podaj swoje imię: Zenon
Witaj Zenon Pietrucha!

Czwarte natomiast:

Proszę, podaj swoje imię: Zenon
Proszę, podaj swoje nazwisko: Pietrucha
Witaj Zenon Pietrucha!

Przed listą argumentów, które są opcjonalne można umieścić takie, które są obowiązkowe zawsze. I tu mała uwaga, argumenty opcjonalne muszą być umieszczane zawsze na końcu listy argumentów funkcji.

Istnieje też możliwość utworzenia funkcji, która będzie przyjmowała jeden argument zawierający dane różnego typu. Oto prosty przykład:

def write(varible): if isinstance(varible, int): print("Zmienna typu int o wartości równej {v}".format(v = varible)) elif isinstance(varible, str): print("Zmienna typu str zawierająca tekst \apos{s}\apos".format(s = varible)) else: print("Zmienna typu {t}".format(t = type(varible))) write(10) write("tekst") write(10.5)

Efektem działania powyższego kodu będzie:

Zmienna typu int o wartości równej 10
Zmienna typu str zawierająca tekst "tekst"
Zmienna typu float

W powyższym kodzie wykorzystałem dwie dość ciekawe funkcje. Pierwszą z nich jest isinstance, która przyjmuje dwa argumenty: pierwszy to instancja jakiegoś obiektu a drugi to typ obiektu. Funkcja ta zwraca oczywiście True, jeżeli podany obiekt jest instancją podanego typu, False w przeciwnym przypadku.

Druga funkcja to type, zwraca ona tekst, zawierający informacje o typie obiektu.

Istnieje również możliwość utworzenia funkcji, która będzie przyjmowała dowolną liczbę argumentów. Oto przykład:

def introduceYourself(name = None, surname = None, *arg, **kwargs): if name is None: name = input("Proszę, podaj swoje imię: ") if surname is None: surname = input("Proszę, podaj swoje nazwisko: ") print("Witaj {name} {surname}!".format(name = name, surname = surname)) for i in arg: print(i) for i, desc in kwargs.items(): print(i, desc) introduceYourself("Zenon", "Pietrucha", "Zajmuję się budowlanką", "Lubię demolować!", specialization = "Demolka!")

Powyższy kod wyświetli:

Witaj Zenon Pietrucha!
Zajmuję się budowalanką
Lubię demolować
specialization Demolka!

Przerywanie działania funkcji można wykonać na dwa sposoby, pierwszy z użyciem słowa kluczowego pass:

def write(varible): if isinstance(varible, int): print("Zmienna typu int o wartości równej {v}".format(v = varible)) elif isinstance(varible, str): print("Zmienna typu str zawierająca tekst \apos{s}\apos".format(s = varible)) else: pass

Drugi sposób to zwrócenie wartości None:

def silnia(n): if n < 0: return None s = 1 if n < 2: return 1 for i in range(2, n + 1): s *= i return s

Dokumentacja funkcji

Istnieje możliwość tworzenia własnej dokumentacji tworzonych funkcji, która zostanie wyświetlona w ipythonie, gdy po nazwie funkcji zostanie wpisany znak zapytania. Dokumentacje tworzy się poprzez umieszczenie wieloliniowego komentarza zaraz po nagłówku funkcji w następujący sposób:

def silnia(n): ''' Funkcja obliczająca silnię z zadanej liczby całkowitej. ''' if n < 0: return None s = 1 if n < 2: return 1 for i in range(2, n + 1): s *= i return s

Wpisanie w ipythonie następującego tekstu:

silnia?

Spowoduje wyświetlenie następującego tekstu:

Signature: silnia(n)
Docstring: Funkcja obliczająca silnię z zadanej liczby całkowitej.
File:      c:userskrzysiek
Type:      function

Pod Linuksem będzie to wyglądało nieco inaczej, aczkolwiek zasada jest taka sama.

Propozycje książek
tytuł: Python w analizie danych. Przetwarzanie danych za pomocą pakietów pandas i NumPy oraz środowiska Jupyter. Wydanie III autor: Wes McKinney

Tytuł:

Python w analizie danych. Przetwarzanie danych za pomocą pakietów pandas i NumPy oraz środowiska Jupyter. Wydanie III

Autor:

Wes McKinney

tytuł: Machine learning, Python i data science. Wprowadzenie autor: Andreas Müller, Sarah Guido

Tytuł:

Machine learning, Python i data science. Wprowadzenie

Autor:

Andreas Müller, Sarah Guido

tytuł: Python zorientowany obiektowo. Programowanie gier i graficznych interfejsów użytkownika autor: Irv Kalb

Tytuł:

Python zorientowany obiektowo. Programowanie gier i graficznych interfejsów użytkownika

Autor:

Irv Kalb

tytuł: Python na start! Programowanie dla nastolatków autor: Michał Wiszniewski

Tytuł:

Python na start! Programowanie dla nastolatków

Autor:

Michał Wiszniewski

tytuł: Sztuczna inteligencja w finansach. Używaj języka Python do projektowania i wdrażania algorytmów AI autor: Yves Hilpisch

Tytuł:

Sztuczna inteligencja w finansach. Używaj języka Python do projektowania i wdrażania algorytmów AI

Autor:

Yves Hilpisch

tytuł: Python w zadaniach. Programowanie dla młodzieży. Poziom podstawowy autor: Urszula Wiejak, Adrian Wojciechowski

Tytuł:

Python w zadaniach. Programowanie dla młodzieży. Poziom podstawowy

Autor:

Urszula Wiejak, Adrian Wojciechowski

tytuł: Python i praca z danymi. Przetwarzanie, analiza, modelowanie i wizualizacja. Wydanie III autor: Avinash Navlani, Armando Fandango, Ivan Idris

Tytuł:

Python i praca z danymi. Przetwarzanie, analiza, modelowanie i wizualizacja. Wydanie III

Autor:

Avinash Navlani, Armando Fandango, Ivan Idris

tytuł: Black Hat Python. Język Python dla hakerów i pentesterów. Wydanie II autor: Justin Seitz, Tim Arnold

Tytuł:

Black Hat Python. Język Python dla hakerów i pentesterów. Wydanie II

Autor:

Justin Seitz, Tim Arnold

tytuł: Python z życia wzięty. Rozwiązywanie problemów za pomocą kilku linii kodu autor: Lee Vaughan

Tytuł:

Python z życia wzięty. Rozwiązywanie problemów za pomocą kilku linii kodu

Autor:

Lee Vaughan

tytuł: Python i AI dla e-commerce autor: Sebastian Kondracki

Tytuł:

Python i AI dla e-commerce

Autor:

Sebastian Kondracki

W związku z tym, że firma Helion nie wywiązuje się z swoich zobowiązań naliczania prowizji za każdą zakupioną książkę a kontakt z ową frmą jest nie możliwy autor strony zmuszony został do zablokowania linkowania książek. Za wszelkie niedogodności z tym związane z góry przepraszam i obiecuję włączenie linkowania gdy tylko sprawa zostanie wyjaśniona