""" Урок 43. Summary session 11 — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/43-summary-session-11/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-43.py """ # ==================================================================== # Пример 1. Измерение времени # ==================================================================== import time start = time.time() values = range(1_000_000) elapsed_range = time.time() - start start = time.time() values_list = list(range(1_000_000)) elapsed_list = time.time() - start print(f"range: создаётся мгновенно (лениво)") print(f"list: требует заполнить память, elapsed_list > 0: {elapsed_list > 0}") # range: создаётся мгновенно (лениво) # list: требует заполнить память, elapsed_list > 0: True # ==================================================================== # Пример 2. OrderedDict как очередь задач # ==================================================================== from collections import OrderedDict od = OrderedDict() od["a"] = 1 od["b"] = 2 od["c"] = 3 print(od.popitem(last=False)) # первый вставленный элемент print(od) # ('a', 1) # OrderedDict([('b', 2), ('c', 3)]) queue = OrderedDict([ ("task1", "low"), ("task2", "high"), ("task3", "low"), ]) for key, value in list(queue.items()): if "high" in value: queue.move_to_end(key, last=False) elif "low" in value: queue.move_to_end(key) print(queue) # OrderedDict([('task2', 'high'), ('task1', 'low'), ('task3', 'low')]) # ==================================================================== # Пример 3. LRU-кэш на практике # ==================================================================== from functools import lru_cache @lru_cache(maxsize=128) def fibonacci(n): if n < 2: return n return fibonacci(n - 1) + fibonacci(n - 2) print(fibonacci(35)) print(fibonacci.cache_info()) # 9227465 # CacheInfo(hits=33, misses=36, maxsize=128, currsize=36) # ==================================================================== # Пример 4. frozenset как ключ словаря # ==================================================================== frozen = frozenset(["read", "write"]) permissions = {frozen: "editor"} print(permissions[frozen]) # editor # ==================================================================== # Пример 5. Counter: подсчёт частоты элементов # ==================================================================== from collections import Counter votes = ["red", "blue", "red", "green", "blue", "red"] tally = Counter(votes) print(tally) print(tally.most_common(2)) # Counter({'red': 3, 'blue': 2, 'green': 1}) # [('red', 3), ('blue', 2)] # ==================================================================== # Пример 6. deque: быстрое добавление и удаление с обоих концов # ==================================================================== from collections import deque recent_events = deque(maxlen=3) for event in ["login", "click", "scroll", "logout"]: recent_events.append(event) print(recent_events) # deque(['click', 'scroll', 'logout'], maxlen=3) history = deque([1, 2, 3]) history.appendleft(0) history.append(4) print(history) # deque([0, 1, 2, 3, 4]) # ==================================================================== # Пример 7. defaultdict: группировка без ручной проверки ключа # ==================================================================== from collections import defaultdict words = ["apple", "banana", "avocado", "blueberry", "cherry"] by_letter = defaultdict(list) for word in words: by_letter[word[0]].append(word) print(dict(by_letter)) # {'a': ['apple', 'avocado'], 'b': ['banana', 'blueberry'], 'c': ['cherry']} # ==================================================================== # Пример 8. Основные операции со словарём # ==================================================================== profile = {"name": "Alice", "age": 30} profile["city"] = "Berlin" profile.update({"age": 31, "email": "alice@example.com"}) if "email" in profile: print(profile["email"]) removed = profile.pop("email") print(f"Удалено: {removed}") print(profile) # alice@example.com # Удалено: alice@example.com # {'name': 'Alice', 'age': 31, 'city': 'Berlin'} # ==================================================================== # Пример 9. Передача функции в функцию # ==================================================================== def double(x): return x * 2 def apply(func, data): return [func(x) for x in data] print(apply(double, [1, 2, 3])) # [2, 4, 6] # ==================================================================== # Пример 10. Lambda с сортировкой # ==================================================================== people = [("Mike", 19), ("Nancy", 35), ("Oscar", 33), ("Frank", 33)] by_age = sorted(people, key=lambda p: p[1]) by_age_name = sorted(people, key=lambda p: (-p[1], p[0])) print(by_age) print(by_age_name) # [('Mike', 19), ('Oscar', 33), ('Frank', 33), ('Nancy', 35)] # [('Nancy', 35), ('Frank', 33), ('Oscar', 33), ('Mike', 19)] # ==================================================================== # Пример 11. Парадигмы программирования: функциональный подход # ==================================================================== # функциональный подход: новый список вместо изменения старого numbers = [1, 2, 3] doubled = [x * 2 for x in numbers] print(doubled) # [2, 4, 6] # ==================================================================== # Пример 12. Ловушка: забытый list() и попытка изменить frozenset # ==================================================================== numbers = [1, 2, 3] doubled_iterator = map(lambda x: x * 2, numbers) print(doubled_iterator) # — это не список print(list(doubled_iterator)) # только так виден результат # # [2, 4, 6] frozen = frozenset([1, 2, 3]) try: frozen.add(4) except AttributeError as error: print(f"Ошибка: {error}") # Ошибка: 'frozenset' object has no attribute 'add' try: wrong_key = {1, 2} lookup = {wrong_key: "value"} except TypeError as error: print(f"Ошибка: {error}") # Ошибка: unhashable type: 'set'