Wyrażenia i instrukcje

https://docs.python.org/3/reference/expressions.html

INSTRUKCJE PRZYPISANIA

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]

WYRAŻENIA PRZYPISANIA

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]

INSTRUKCJE WYRAŻEŃ

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 PUSTA (PASS)

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

INSTRUKCJA DEL

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.