Wywoływanie funkcji w praktyce

Kurs: Wstęp do programowania
Lekcja 2: Podstawy składni języka programowania
Temat 5: Tworzenie funkcji (bez rekurencji)
Podtemat 3: Wywoływanie funkcji w praktyce

⇓ spis treści ⇓


Tworzenie funkcji to jedno, ale równie ważne jest zrozumienie, jak i kiedy je wywoływać, aby uzyskać pożądane rezultaty w programie. Wywoływanie funkcji to proces, w którym „przywołujemy” funkcję w kodzie, aby wykonała swoje zadanie. Dzięki temu możemy organizować kod w bardziej modularny i efektywny sposób, co jest fundamentalne dla programowania strukturalnego i obiektowego. W tej lekcji przyjrzymy się szczegółowo, jak działa wywoływanie funkcji, jakie są różne sposoby ich użycia oraz jak efektywnie korzystać z funkcji w różnych kontekstach.

Podstawy wywoływania funkcji

Wywoływanie funkcji polega na użyciu jej nazwy oraz przekazaniu odpowiednich argumentów, jeśli funkcja ich wymaga. Gdy funkcja zostaje wywołana, program przekazuje kontrolę do ciała funkcji, gdzie instrukcje są wykonywane. Po zakończeniu działania funkcji kontrola wraca do miejsca, w którym funkcja została wywołana, a wynik (jeśli funkcja zwraca wartość) może być używany dalej.

Składnia wywoływania funkcji

W C++:

int wynik = dodaj(3, 5);  // Wywołanie funkcji dodaj z argumentami 3 i 5

W Pythonie:

wynik = dodaj(3, 5)  # Wywołanie funkcji dodaj z argumentami 3 i 5

W obu przypadkach dodaj to nazwa funkcji, a 3 i 5 to argumenty przekazywane do funkcji. Wynik działania funkcji jest przypisany do zmiennej wynik.

Przekazywanie argumentów do funkcji

Argumenty to dane przekazywane do funkcji podczas jej wywołania. W zależności od języka programowania możemy przekazywać argumenty na różne sposoby: przez wartość, przez referencję lub przez wskaźnik.

Przekazywanie przez wartość

Przekazywanie przez wartość oznacza, że kopia wartości argumentu jest przekazywana do funkcji. Wszelkie zmiany dokonane na parametrze wewnątrz funkcji nie wpływają na oryginalną wartość argumentu.

Przykład w C++:

void zmienWartosc(int liczba) {
    liczba = 10;  // Zmiana dotyczy tylko kopii
}

int mojaLiczba = 5;
zmienWartosc(mojaLiczba);
// mojaLiczba nadal wynosi 5

W powyższym przykładzie mojaLiczba nie zmienia swojej wartości, ponieważ funkcja zmienWartosc operuje na kopii argumentu.

Przekazywanie przez referencję

Przekazywanie przez referencję umożliwia modyfikowanie oryginalnej wartości argumentu. W C++ używamy operatora &, aby przekazać argument przez referencję.

Przykład w C++:

void zmienWartosc(int &liczba) {
    liczba = 10;  // Zmiana dotyczy oryginalnej zmiennej
}

int mojaLiczba = 5;
zmienWartosc(mojaLiczba);
// mojaLiczba teraz wynosi 10

W tym przypadku zmiana wartości w funkcji zmienWartosc wpływa na mojaLiczba, ponieważ argument jest przekazywany przez referencję.

Przekazywanie przez wskaźnik

Wskaźniki są używane do przekazywania adresu argumentu, co umożliwia modyfikowanie oryginalnej wartości zmiennej. W C++ wskaźniki są często używane w bardziej zaawansowanych operacjach.

Przykład w C++:

void zmienWartosc(int *liczba) {
    *liczba = 10;  // Zmiana dotyczy oryginalnej zmiennej
}

int mojaLiczba = 5;
zmienWartosc(&mojaLiczba);
// mojaLiczba teraz wynosi 10

Tutaj zmienWartosc przyjmuje wskaźnik do mojaLiczba, co pozwala na modyfikację oryginalnej wartości.

Argumenty w Pythonie

W Pythonie argumenty są przekazywane przez wartość referencyjną. Oznacza to, że jeśli przekażemy zmienne niezmienne (takie jak liczby lub napisy), nie zostaną one zmienione wewnątrz funkcji, ale zmienne zmienne (np. listy) mogą zostać zmienione.

Przykład z liczbą:

def zmien_wartosc(liczba):
    liczba = 10

moja_liczba = 5
zmien_wartosc(moja_liczba)
print(moja_liczba)  # Wciąż 5

Przykład z listą:

def dodaj_element(lista):
    lista.append(4)

moja_lista = [1, 2, 3]
dodaj_element(moja_lista)
print(moja_lista)  # [1, 2, 3, 4]

W przypadku listy oryginalna zmienna została zmieniona, ponieważ lista jest strukturą danych zmienną.

Przekazywanie wielu argumentów

Funkcje mogą przyjmować wiele argumentów, co umożliwia wykonywanie bardziej złożonych operacji. W Pythonie można używać specjalnych konstrukcji, takich jak *args i **kwargs, aby przekazywać zmienną liczbę argumentów.

Przykład w Pythonie:

def wypisz_wszystko(*args):
    for arg in args:
        print(arg)

wypisz_wszystko(1, 2, 3, "Hello", True)

Tutaj *args przechowuje wszystkie przekazane argumenty jako krotkę.

Wywoływanie funkcji w różnych kontekstach

Funkcje mogą być wywoływane w różnych częściach programu, w zależności od tego, jakie zadanie chcemy wykonać. Oto kilka przykładów:

Wywoływanie funkcji w instrukcjach warunkowych

Funkcje mogą być używane w instrukcjach warunkowych, aby podjąć decyzję na podstawie zwracanej wartości.

C++:

bool czyJestDorosly(int wiek) {
    return wiek >= 18;
}

if (czyJestDorosly(20)) {
    std::cout << "Jesteś dorosły." << std::endl;
} else {
    std::cout << "Nie jesteś dorosły." << std::endl;
}
Wywoływanie funkcji w pętlach

Funkcje mogą być wielokrotnie wywoływane w pętlach, co jest przydatne przy operacjach na dużych zestawach danych.

Python:

def kwadrat(liczba):
    return liczba ** 2

for i in range(5):
    print(kwadrat(i))  # Wywołuje funkcję kwadrat dla wartości od 0 do 4
Rekursywne wywoływanie funkcji

Chociaż ten temat koncentruje się na funkcjach bez rekurencji, warto wspomnieć, że funkcje mogą wywoływać same siebie, co jest znane jako rekursja. Rekursja jest używana do rozwiązywania problemów, które można podzielić na mniejsze, podobne podproblemy, ale omówimy ją szczegółowo w przyszłej lekcji.

Zastosowania wywoływania funkcji w praktyce

Modułowość i organizacja kodu

Dzięki funkcjom możemy podzielić kod na mniejsze fragmenty, które są łatwiejsze do zrozumienia i utrzymania. Wywoływanie funkcji w różnych miejscach programu sprawia, że kod staje się bardziej modularny.

Przykład w C++:

void witaj() {
    std::cout << "Witaj!" << std::endl;
}

void zegnaj() {
    std::cout << "Do zobaczenia!" << std::endl;
}

int main() {
    witaj();
    // Inne operacje
    zegnaj();
    return 0;
}

W powyższym przykładzie witaj i zegnaj to funkcje, które można wywoływać w różnych miejscach w kodzie, aby uzyskać odpowiedni komunikat.

Funkcje jako argumenty innych funkcji

W wielu językach programowania funkcje mogą być przekazywane jako argumenty do innych funkcji, co umożliwia tworzenie bardziej elastycznego kodu. W Pythonie funkcje są „pierwszej klasy obywatelami”, co oznacza, że można je traktować jak zmienne.

Przykład w Pythonie:

def wykonaj_funkcje(funkcja, liczba):
    return funkcja(liczba)

def podwoj(liczba):
    return liczba * 2

wynik = wykonaj_funkcje(podwoj, 5)
print(wynik)  # 10

Tutaj funkcja podwoj jest przekazywana jako argument do funkcji wykonaj_funkcje.

Obsługa wyjątków podczas wywoływania funkcji

Czasami podczas wywoływania funkcji mogą wystąpić błędy, zwane wyjątkami. W Pythonie możemy użyć bloków try-except, aby obsłużyć te sytuacje.

Przykład w Pythonie:

def dziel(a, b):
    return a / b

try:
    wynik = dziel(10, 0)
except ZeroDivisionError:
    print("Nie można dzielić przez zero!")

W tym przykładzie funkcja dziel generuje wyjątek ZeroDivisionError, gdy próbujemy podzielić przez zero.

Podsumowanie

Wywoływanie funkcji jest podstawowym mechanizmem w programowaniu, który umożliwia wykonywanie operacji w sposób modularny i uporządkowany. Omówiliśmy różne sposoby przekazywania argumentów, takie jak przez wartość, referencję i wskaźnik, oraz zastosowania wywoływania funkcji w różnych kontekstach, takich jak instrukcje warunkowe i pętle. Zrozumienie, jak działa wywoływanie funkcji i jakie są jego praktyczne zastosowania, jest kluczowe dla pisania efektywnego i czytelnego kodu. W kolejnych lekcjach będziemy dalej rozwijać te koncepcje, aby lepiej wykorzystywać funkcje w programowaniu.

Następny podtemat ==> Zmienne lokalne i ich zakres



Spis Treści - Wstęp do programowania

Lekcja 3: Rozwiązywanie problemów i poprawność programów Lekcja 4: Praca z różnymi typami danych Lekcja 5: Obsługa plików i pamięci Lekcja 6: Zaawansowane techniki programistyczne Lekcja 7: Wskaźniki i pamięć dynamiczna Lekcja 8: Struktura kodu i abstrakcja Lekcja 9: Rekurencja i jej zastosowania Lekcja 10: Analiza wydajności algorytmów Lekcja 11: Technika "dziel i zwyciężaj" Lekcja 12: Struktury danych o dynamicznej budowie Lekcja 13: Struktury hierarchiczne: Drzewa Lekcja 14: Struktury danych z bibliotek Lekcja 15: Algorytmy z nawrotami Lekcja 16: Programowanie dynamiczne Lekcja 17: Programowanie zachłanne Lekcja 18: Praca z grafami

Jeśli chciałbyś być poinformowany o następnych kursach to zapisz się do naszego newslettera: