https://docs.python.org/3/reference/expressions.html
Instrukcje przypisania tworzą referencje do obiektów.
Zmienne tworzone są przy pierwszym przypisaniu.
Przed odniesieniem się do zmiennych trzeba je najpierw przypisać.
word = "qwerty" # forma podstawowa x, y = 23, 45 # przypisanie krotki (pozycyjne) [x, y] = ["ab", "cd"] # przypisanie listy (pozycyjne) x, y, z = "abc" # przypisanie sekwencji [x, y, z] = (1, 2, 3) # przypisanie sekwencji x = y = z = 0 # przypisanie z wieloma celami # x = (y = (z = 0)) # SyntaxError, to nie działa jak w C/C++! x += 5 # przypisane rozszerzone (x = x + 5) L += 5 # odpowiada L.append(5), IN PLACE L += sequence # odpowiada L.extend(sequence), IN PLACE L += [sequence] # dołączenie sekwencji w całości, L.append(sequence)
L = [1, 2, 3, 4] front, L = L[0], L[1:] # odcięcie początku # Python 3, rozszerzona składnia rozpakowania. # M to sekwencja (string, lista, krotka). # Gdy zabraknie elementów, to L może być pustą listą! front, *L = M # M[0], M[1:] first, *L, last = M # M[0], M[1:-1], M[-1]
PEP 572 - Assignment Expressions (walrus operator)
W Pythonie 3.8 pojawiły się wyrażenia przypisania i nowa składnia ':=', która przypisuje wartości do zmiennych jako część większego wyrażenia. W wielu przypadkach nowa składnia pozwala stworzyć krótszy kod, uniknąć dwukrotnego obliczania tego samego wyrażenia, uniknąć głębokiego zagnieżdżania kodu, itp. Na ogół wymagane są nawiasy otaczające wyrażenie przypisania.
Warto pamiętać, że ':=' tworzy wyrażenie (expression), a '=' tworzy instrukcję (statement), przez co ich dozwolone zakresy występowania tylko częściowo się pokrywają.
# The assignment expression helps avoid calling len() twice. if (n := len(a)) > 10: print("List is too long ({} elements, expected <= {})".format(n, 10))
# Handle a matched regex. if (match := pattern.search(data)) is not None: process(match)
# Loop over fixed length blocks. while (block := f.read(256)) != '': process(block) # 'block' is needed twice
# Reuse a value that's expensive to compute. [y := f(x), y**2, y**3] # zamiast [f(x), f(x)**2, f(x)**3]
# Share a subexpression between a comprehension filter clause and its output. filtered_data = [y for x in data if (y := f(x)) is not None] # zamiast [f(x) for x in data if f(x) is not None]
Wyrażenia można użyć jako instrukcji, ale ma to sens jedynie wtedy, gdy efekt uboczny działania wyrażenia będzie przydatny. W trybie interaktywnym możemy zobaczyć wartość wyrażenia.
Instrukcje nie mogą być używane jako wyrażenia.
2 + 5 # wyrażenie arytmetyczne lub logiczne L[idx] # dla listy, krotki, słownika [f(x) for x in iterable] # list|dict|set comprehension some_function() # wywołanie funkcji some_object.method() # wywołanie metody name # zmienna #print word # instrukcja prosta w Pythonie 2! print(word) # funkcja w Pythonie 3 yield x ** 2 # zwracanie wyniku częściowego (generator) lambda x: x ** 2 # funkcja anonimowa y := f(x) # wyrażenie przypisania
Instrukcja pass nie robi nic. Jest wykorzystywana tam, gdzie syntaktycznie powinna być jakaś instrukcja. Czasem przy tworzeniu programu tymczasowo można wstawić pass w miejsce brakującego kodu, który będzie napisany później.
while True: pass # czekamy na przerwanie z klawiatury
def dummy_function(): pass # kod do uzupełnienia w przyszłości
class EmptyClass: pass # kod do uzupełnienia w przyszłości
# https://stackoverflow.com/questions/13886168/how-to-use-the-pass-statement # Ignorowanie pewnych typów wyjątków. try: self.version = "Expat %d.%d.%d" % expat.version_info except AttributeError: pass # unknown # Definiowanie wyjątków bez nowego zachowania. # Nazwa wyjątku niesie informację o zdarzeniu. class CompileError(Exception): pass
Podstawowe zastosowanie instrukcji del to usuwanie zmiennej (dokładniej: usunięcie referencji do obiektu). Po usunięciu zmiennej próba odczytania zmiennej prowadzi do błędu (aż nastąpi nowe przypisanie wartości do tej zmiennej).
Drugim częstym zastosowaniem instrukcji del jest usuwanie elementu o danym indeksie z listy lub usuwanie wycinka z listy.