Wyrażenia składane i funkcje wbudowane
Napiszą Państwo zwięzłe rozwiązania z użyciem wyrażeń składanych dla list, słowników i zbiorów, a także map, filter, zip, enumerate oraz sorted z funkcjami key.
Wyrażenia składane i funkcje wbudowane to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Wyrażenia listowe: zwięzłe filtrowanie
Wyrażenie listowe zamienia pętlę for połączoną z append w jedną przejrzystą linię: [expr for item in iterable if condition]. Jest nieco szybsze i sygnalizuje biegłość w Pythonie.
# Traditional loop
squares = []
for n in range(1, 6):
squares.append(n * n)
print(squares) # [1, 4, 9, 16, 25]
# List comprehension
squares = [n * n for n in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
# With filter
evens = [n for n in range(10) if n % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]Zagnieżdżone wyrażenia do siatek 2D
Zagnieżdżone wyrażenia tworzą siatki 2D — to standardowy sposób inicjowania tabeli programowania dynamicznego. Należy unikać [[0]*C]*R, ponieważ współdzieli ono tę samą listę wewnętrzną we wszystkich wierszach. Kod pokazuje poprawkę.
# WRONG: all rows are the same object!
bad = [[0] * 3] * 3
bad[0][0] = 9
print(bad) # [[9,0,0],[9,0,0],[9,0,0]] oops!
# CORRECT: each row is a separate list
good = [[0] * 3 for _ in range(3)]
good[0][0] = 9
print(good) # [[9,0,0],[0,0,0],[0,0,0]]Wyrażenia słownikowe i zbiorów
Wyrażenia słownikowe i zbiorów używają nawiasów klamrowych: {k: v for ...} dla słownika oraz {expr for ...} dla zbioru. Oba rodzaje mogą filtrować elementy, dzięki czemu można przekształcać dane lub usuwać duplikaty w jednej linii.
# Dict comprehension: square lookup
sq_map = {n: n**2 for n in range(1, 6)}
print(sq_map) # {1:1, 2:4, 3:9, 4:16, 5:25}
# Set comprehension: unique lengths
words = ['cat', 'dog', 'elephant', 'ant']
unique_lengths = {len(w) for w in words}
print(unique_lengths) # {3, 8} (order varies)Wyrażenia generatorowe: oszczędność pamięci
Umieszczenie wyrażenia w () tworzy generator, który zwraca wartości pojedynczo, oszczędzając pamięć. Można przekazać go bezpośrednio do sum, max lub dowolnej funkcji przetwarzającej ogromne sekwencje.
# List comprehension builds all values at once
total = sum([n**2 for n in range(1_000_000)])
# Generator yields one at a time — lower memory
total = sum(n**2 for n in range(1_000_000))
print(total) # 333332833333500000
# any/all with generators short-circuit early
nums = [4, 6, 8, 3, 10]
has_odd = any(n % 2 == 1 for n in nums)
print(has_odd) # True (stops at 3)map() i filter(): styl funkcyjny
map stosuje funkcję do każdego elementu, a filter pozostawia te, które przechodzą test. Obie funkcje są leniwe, dlatego aby zobaczyć wyniki, należy opakować je w list(). Wyrażenia listowe są często czytelniejsze.
nums = [1, 2, 3, 4, 5]
# map: apply function to each element
doubled = list(map(lambda n: n * 2, nums))
print(doubled) # [2, 4, 6, 8, 10]
# filter: keep elements passing predicate
evens = list(filter(lambda n: n % 2 == 0, nums))
print(evens) # [2, 4]
# Equivalent comprehensions (often preferred)
doubled = [n * 2 for n in nums]
evens = [n for n in nums if n % 2 == 0]zip(): łączenie sekwencji
zip łączy dwie sekwencje i kończy działanie na krótszej z nich — to przejrzysty sposób na jednoczesne przechodzenie po dwóch listach. Sztuczka zip(*matrix) transponuje listę 2D. Szczegóły pokazano w kodzie.
keys = ['a', 'b', 'c']
values = [1, 2, 3]
pairs = list(zip(keys, values))
print(pairs) # [('a',1), ('b',2), ('c',3)]
# Build dict from two lists
d = dict(zip(keys, values))
print(d) # {'a':1, 'b':2, 'c':3}
# Transpose a matrix
matrix = [[1,2,3],[4,5,6],[7,8,9]]
transposed = [list(row) for row in zip(*matrix)]
print(transposed) # [[1,4,7],[2,5,8],[3,6,9]]enumerate(): indeks i wartość
enumerate zwraca podczas iteracji parę (index, value) — to czytelniejsze rozwiązanie niż range(len(lst)) i pozwala uniknąć błędów o jeden. Opcja start pozwala rozpocząć numerowanie od 1.
fruits = ['apple', 'banana', 'cherry']
# Instead of: for i in range(len(fruits)):
for i, fruit in enumerate(fruits):
print(i, fruit)
# 0 apple / 1 banana / 2 cherry
# Start from 1
for i, fruit in enumerate(fruits, 1):
print(f'{i}. {fruit}')
# 1. apple / 2. banana / 3. cherrysorted() z funkcjami key
sorted zwraca nową posortowaną listę i przyjmuje funkcję key do definiowania własnej kolejności. Można sortować według długości, pola krotki lub bez uwzględniania wielkości liter. Kod pokazuje sortowanie wielokryterialne.
# Sort by second element of tuple
intervals = [(1,3),(2,1),(0,5)]
print(sorted(intervals, key=lambda x: x[1]))
# [(2,1),(1,3),(0,5)]
# Sort strings case-insensitively
words = ['Banana', 'apple', 'Cherry']
print(sorted(words, key=str.lower))
# ['apple', 'Banana', 'Cherry']
# Sort by multiple keys: first by length, then alphabetically
words = ['fig', 'apple', 'ant', 'kiwi']
print(sorted(words, key=lambda w: (len(w), w)))
# ['ant', 'fig', 'kiwi', 'apple']min() i max() z key
min i max również przyjmują key, dzięki czemu jednym wywołaniem można pobrać element o najmniejszej lub największej przekształconej wartości — na przykład najdłuższe słowo. Szczegóły pokazano w kodzie.
words = ['banana', 'fig', 'strawberry', 'kiwi']
longest = max(words, key=len)
print(longest) # strawberry
shortest = min(words, key=len)
print(shortest) # fig
# Find interval with earliest end
intervals = [(2,6),(1,3),(4,5)]
earlist_end = min(intervals, key=lambda x: x[1])
print(earlist_end) # (1, 3)any() i all() do szybkiego sprawdzania warunków
any kończy działanie przy pierwszym elemencie prawdziwym, a all przy pierwszym fałszywym. Obie funkcje stosują ewaluację z krótkim spięciem, więc w połączeniu z generatorem sprawdzają warunki szybko i leniwie.
nums = [2, 4, 6, 7, 8]
all_even = all(n % 2 == 0 for n in nums)
print(all_even) # False (7 is odd)
has_large = any(n > 5 for n in nums)
print(has_large) # True (6 qualifies, stops there)
# Practical: check if sudoku row has no duplicates
row = [1, 2, 3, 4, 5, 6, 7, 8, 9]
valid = all(1 <= n <= 9 for n in row) and len(set(row)) == 9
print(valid) # Truesum(), abs() i divmod()
Trzy pomocnicze funkcje matematyczne pojawiają się wszędzie: sum, abs i divmod. divmod(a, b) zwraca jednocześnie iloraz i resztę — doskonale nadaje się do wyodrębniania cyfr.
# sum with generator
print(sum(n**2 for n in range(1, 6))) # 55
# abs for distance problems
print(abs(-7)) # 7
# divmod for digit extraction
num = 1234
digits = []
while num:
num, d = divmod(num, 10)
digits.append(d)
digits.reverse()
print(digits) # [1, 2, 3, 4]Szybki sprawdzian
Szybki sprawdzian — proszę sprawdzić, jak zostały przyswojone wyrażenia i funkcje wbudowane. Jedno pytanie — na pewno dadzą Państwo radę. ✅
Podsumowanie lekcji
Podsumowanie: wyrażenia zamieniają pętle w jednowierszowe konstrukcje, funkcje wbudowane, takie jak zip i sorted, przyjmują funkcje key, a generatory oszczędzają pamięć podczas jednokrotnego przechodzenia po danych.
Często zadawane pytania
Czy lekcja „Wyrażenia składane i funkcje wbudowane” jest bezpłatna?
Tak — pełny tekst „Wyrażenia składane i funkcje wbudowane” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „Wyrażenia składane i funkcje wbudowane”?
Napiszą Państwo zwięzłe rozwiązania z użyciem wyrażeń składanych dla list, słowników i zbiorów, a także map, filter, zip, enumerate oraz sorted z funkcjami key. Ćwiczysz Coding Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Coding Interview Prep?
Nie wymagamy żadnego doświadczenia. Coding Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Wyrażenia składane i funkcje wbudowane”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Coding Interview Prep?
Tak. Każda lekcja Coding Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Listy, krotki i wycinki
- Słowniki i zbiory w Pythonie
- Wyrażenia składane i funkcje wbudowane
- Funkcje, domknięcia i lambda