Lekcje modułu (1/4)
Type hints: adnotacje typów
Podpowiedzi typów lub type hints (anotacje typów) to opcjonalne deklaracje, które mówią: „ta zmienna/parametr ma typ X”. Python NIE weryfikuje ich w czasie wykonywania kodu: są one przeznaczone dla Ciebie, Twojego edytora (autouzupełnianie!) oraz narzędzi takich jak mypy lub pyright, które wykonują statyczną analizę typów.
Anotowanie zmiennych
nome: str = "Ada"
anni: int = 36
attivo: bool = True
prezzi: list[float] = [1.2, 3.4]Składnia to nazwa: typ = wartosc. Bez wartości jest to czysta deklaracja:
risultato: int # nessuna assegnazione, solo "annuncio del tipo"Anotowanie funkcji
def saluta(nome: str, urlante: bool = False) -> str:
s = f"Ciao {nome}"
return s.upper() if urlante else s
def somma(numeri: list[int]) -> int:
return sum(numeri)Składnia: param: typ dla każdego parametru, -> typ dla zwracanej wartości. Funkcja, która nic nie zwraca, używa -> None.
Wbudowane typy generyczne (Python 3.9+)
nomi: list[str] = ["a", "b"]
mappa: dict[str, int] = {"x": 1}
coppia: tuple[int, str] = (1, "ok")
unici: set[int] = {1, 2, 3}Optional i Union
Wartość, która może wynosić None:
def trova_utente(id: int) -> str | None:
if id == 1:
return "Ada"
return NoneX | None to nowoczesna składnia (Python 3.10+). Odpowiednik: Optional[X] z modułu typing. Dla unii wielu typów: int | str | float.
typing: przydatne narzędzia
from typing import Any, Callable
def applica(f: Callable[[int], int], x: int) -> int:
return f(x)
valore: Any = "qualunque cosa" # disabilita il checkAny= „nie sprawdzaj” (używaj oszczędnie).Callable[[arg1, arg2], return]= funkcja przyjmująca podane parametry i zwracająca dany typ.
mypy: parser typów
Instalujesz mypy, uruchamiasz mypy plik.py i informuje Cię, czy typy się zgadzają:
$ mypy script.py
script.py:5: error: Argument 1 to "somma" has incompatible type "str"; expected "int"Sprawdzanie typów za pomocą mypy
Anotacje typów w Pythonie nie są egzekwowane w czasie wykonywania przez interpreter; są ignorowane podczas wykonywania programu. Aby zweryfikować poprawność typów, musisz uruchomić zewnętrzne narzędzie do analizy statycznej, takie jak mypy, wpisując w terminalu polecenie mypy script.py.
Spróbuj sam
Zdefiniuj funkcję `double(numbers: list[int]) -> list[int]`, która zwraca listę z każdym elementem pomnożonym przez 2. Wywołaj ją z argumentem [1, 2, 3] i przypisz wynik do `r`. Oceń `r`.
Pokaż wskazówkę
Użyj wyrażenia listotwórczego (list comprehension) lub pętli for.
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Zdefiniuj funkcję `first_or_none(items: list[int]) -> int | None`, która zwraca pierwszy element, jeśli lista nie jest pusta, w przeciwnym razie None. Przypisz `a = first_or_none([10, 20])` oraz `b = first_or_none([])`. Oceń `(a, b)`.
Pokaż wskazówkę
Warunek `if items` jest prawdziwy, gdy lista NIE jest pusta.
Rozwiązanie dostępne po 3 próbach
Dodatkowe wyzwanie
Napisz funkcję `double_value(n: int) -> int` która przyjmuje liczbę całkowitą, mnoży ją przez 2 i zwraca wynik. Upewnić się, że określasz podpowiedzi typów zarówno dla parametru, jak i dla zwracanej wartości. Na koniec oceń `double_value(5)`.
Pokaż wskazówkę
Użyj n: int jako parametru oraz -> int po sygnaturze funkcji.
Rozwiązanie dostępne po 3 próbach