8 Funkcje

zasada ogólna:

1
2
def nazwa():
    kod

by wywołać tą funkcję
nazwa()

funkcja musi być zdefiniowana przed wywołaniem!

przykład:

1
2
3
4
5
6
7
8
9
def komunikat():
    print('Proszę, podaj następną daną')

komunikat()
a = int(input())
komunikat()
b = int(input())
komunikat()
c = int(input())
w przypadku zmiany komunikatu, zmieniamy go tylko w funkcji.


Funkcja z parametrami:

1
2
3
4
5
6
7
def powitanie(imie,nazwisko):
   print('Dzień dobry, nazywam się ' + \
   nazwisko + '... ' + imie + ' ' + \
   nazwisko + '...')

powitanie('Janusz', 'Pospolity')
powitanie('Zenon', 'Kotwica')

Zmienna parametru z funkcji nie będzie dostępna poza funkcją, jesli jest taka sama jak inna zmienna w programie na czas wykonywania funkcji "przysłania" ją.

Funkcje można przekazywać podając określoną zmienna, wtedy nie trzeba zachowywać kolejności.

1
2
3
4
5
6
7
def powitanie(imie,nazwisko="Nowak"):
   print('Dzień dobry, nazywam się ' + \
   nazwisko + '... ' + imie + ' ' + \
   nazwisko + '...')

powitanie(nazwisko='Bond', imie='James')
powitanie(imie='Skarabeusz',nazwisko='Młotek')
Funkcji można nadać domyślny parametr (nazwisko Nowak) który zostanie nadany w przypadku nie określenia parametru podczas wywołania.

Powyższe przykłady funkcji mają efekt (napis na ekranie). Funkcja może jednak zwracać wynik:

return wyrażenie

przykład:

1
2
3
4
5
def prosta_funkcja():
    return 13

x = prosta_funkcja()
print('Funkcja przekazała swój wynik:', x)


return może zwracać także True/False

1
2
3
4
5
6
def czyparzysta(n):
   if(n % 2 == 0):
     return True

print(czyparzysta(2))
print(czyparzysta(1))

czego wynikiem będzie
True
None

Czemu None? bo return w przypadku niespełnienia warunku nie dostał żadnego parametru


Jako parametr może być przekazana lista:

1
2
3
4
5
6
7
def sumalisty(l):
   suma = 0
   for el in l:
     suma += el
   return suma

print(sumalisty([5,4,3]))

Wynik
12

Polecenie global sprawia, że zmienna staje się globalna i nie jest przysłaniana.

1
2
3
4
5
6
7
8
def funkcja():
   global zmienna
   print("Czy ja znam tę zmienną? ", zmienna)
   zmienna=2

zmienna = 1
funkcja()
print(zmienna)

Wynik:
Czy ja znam tę zmienną? 1
2

czyli zmienna ustawiona poza funkcją (1) dzięki global dostała się do funkcji, a także ustawiona w funkcji na 2, wydostała się poza funkcję


Kolejny przykład:

1
2
3
4
5
6
7
8
def funkcja(n):
   print('Dostałam',n)
   n += 1
   print('Policzyłam sobie',n)

zmienna = 3
funkcja(zmienna)
print(zmienna)
Wynik:
Dostałem 3
Policzyłem sobie 4
3

pokazuje, że bez polecenia global, zmianna zwiększona w funkcji do 4 poza funkcją pozostaje 3



Powyższe nie dotyczy list przekazywanych jako parametr funkcji.
Nawet bez polecenia global:

1
2
3
4
5
6
7
def funkcja(l):
   print(l)
   del l[0]

lista = [1,2,3]
funkcja(lista)
print(lista)
Wynik:
[1,2,3]
[2,3]

Czyli usunięcie elementu listy w funkcji wypływa na listę poza funkcją. Przysłonięta zmienna odwołuje się do tego samego obszaru pamięci w którym mamy listę, co zmienna nieprzysłonięta, dlatego zmiana dokonuje się.