Temat 2: Funkcje w języku Python

Wstecz; Ostatnia modyfikacja: 2.03.2015
  • Project Euler - problemy matematyczno-obliczeniowe.
  • Słowniki (tablice hasujące)
  • d={}
    d={1:"a",2:"b",3:"c"}
    d[4]="d"
    2 in d
    "b" in d
    d.pop(2)
    for k in d: print(k)
    for v in d.values(): print(v)
    for (k,v) in d.items(): print(k,v)
    
  • Funkcje w języku Python
  • def sq(x):        # nazwa i parametry funkcji
      return x**2     # zwracana wartość (None domyślnie)
    sq(123456)
    
  • Ćwiczenie rozgrzewkowe: napisz funkcje fib(n) liczącą n-ty wyraz ciągu Fibonacciego.
  • Funkcje nienazwane (lambda-abstrakcja)
  • f=lambda x:x**2
    print(f(f(123456)))
    sorted(["aaz","dddd","cc","b"], key=lambda e:e[-1])  # przykład praktycznego zastosowania
    
  • Funkcje rekurencyjne
  • def fact(x):
      if x==0: return 1
      return x*fact(x-1)
    
  • parametry opcjonalne
  • def cipher(t, r=13):
      d = {}       # slownik (tablica hashujaca) - bardzo przydatna struktura
      for c in (ord('a'), ord("A")):
        for i in range(26):
          d[chr(i+c)] = chr((i+r) % 26 + c)
      return "".join([d.get(c, c) for c in t])
    
    cipher("La Bamba", r=1)
    
  • funkcje wyższych rzędów
  • def comp(f, n=1): # n-krotne zlozenie funkcji f
      if n == 0: return lambda x:x
      if n == 1: return f
      return lambda x: f(comp(f, n-1)(x))  # wynikiem jest funkcja
    
    comp(lambda x:x**2,2)(10)   # przyklady
    comp(cipher, 2)("La Bamba")
    
  • też składanie funkcji, ale znacznie szybciej
  • def comp(f, n=1):
      if n == 0: return lambda x:x
      elif n == 1: return f
      elif n % 2 == 0: 
        return lambda x:comp(lambda x: f(f(x)), n/2)(x)
      else: return lambda x: f(comp(lambda x: f(f(x)), n/2)(x))
    
  • Jak policzyć liczbę wywołań funkcji fact?
  • Sposób 1 - funkcje są obiektami - dodajemy atrybut count.
    def fact(x):
      fact.i+=1
      if x<=0: return 1
      return x*fact(x-1)
    fact.i=0
    fact(10)
    fact.i
    
  • Sposób 2 - zmienne globalne.
  • count = 0
    def fact(x):
      global count    # co sie stanie, gdy usuniemy slowo global?
      count+=1 
      if x<=0: return 1
      return x*fact(x-1)
    fact(10)
    count
    
  • Technika spamiętywania
  • def fact(x):
      fact.i += 1
      if not hasattr(fact, "mem"):
        fact.mem = {}
      if x in fact.mem: return fact.mem[x]
      if x<=0: return 1
      fact.mem[x] = x*fact(x-1)
      return fact.mem[x]
    
    fact.i=0
    print(fact(20))
    print(fact.i)  # przeanalizuj zanim uruchomisz - liczba wywolan
    fact.i=0       # resetujemy liczbe wywolan
    print(fact(25))
    print(fact.i)  # a tutaj?
    
  • Ćw 1: napisz funkcję, która dla danego słowa zastępuje wszystkie wystąpienia (poza pierwszym wystąpieniem) pierwszej litery w tym słowie poprzez '*'. Np. f("mama")="ma*a". f("ananas")="an*n*s"
  • Ćw 2: napisz program, który wczytuje plik tekstowy i wypisuje N słów o największej liczbie wystąpień. Przetestuj swój program na (i) Biblii (kopia), (ii) Romeo i Julii (kopia).
  • Ćw 3: (i) zaimplementuj funkcję liczącą n-ty wyraz ciągu Fibonacciego, korzystając ze wzroru rekurencyjnego; (ii) dodaj kod, który policzy liczbę wywołań tej funkcji; (iii) zastosuj technikę spamiętywania by organiczyć liczbę wywołań tej funkcji; (iv) jakie znasz inne algorytmy liczenia n-tego wyrazu tego ciągu? (v) spróbuj rozwiązać: Even Fibonacci numbers
  • Ćwiczenia 1: ćwiczenia ze skryptu 1
  • Ćwiczenia 2: ćwiczenia ze skryptu 2