""" Урок 39. Summary session 10 — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/39-summary-session-10/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-39.py """ # ==================================================================== # Пример 1. Базовый набор методов словаря: fromkeys, get, setdefault # ==================================================================== data = dict.fromkeys(["x", "y", "z"], 0) print(data) user = {"name": "Alice", "age": 30} print(user.get("age")) print(user.get("city", "Unknown")) counters = {} counters.setdefault("visits", 0) counters["visits"] += 1 counters.setdefault("visits", 0) counters["visits"] += 1 print(counters) # {'x': 0, 'y': 0, 'z': 0} # 30 # Unknown # {'visits': 2} # ==================================================================== # Пример 2. Ловушка dict.fromkeys(): общая ссылка на изменяемый объект # ==================================================================== keys = ["x", "y"] shared_list = [] shared = dict.fromkeys(keys, shared_list) shared["x"].append(1) print(shared) independent = {key: [] for key in keys} independent["x"].append(1) print(independent) # {'x': [1], 'y': [1]} # {'x': [1], 'y': []} # ==================================================================== # Пример 3. keys(), values(), items() — динамические view, а не снимок # ==================================================================== data = {"name": "Alice", "age": 30} live_keys = data.keys() print(live_keys) data["city"] = "New York" print(live_keys) snapshot = list(data.keys()) data["country"] = "USA" print(snapshot) print(list(data.keys())) # dict_keys(['name', 'age']) # dict_keys(['name', 'age', 'city']) # ['name', 'age', 'city'] # ['name', 'age', 'city', 'country'] # ==================================================================== # Пример 4. Вложенные словари: доступ по цепочке ключей и обход # ==================================================================== school = { "class1": {"students": ["Alice", "Bob"], "teacher": "Mrs. Smith"}, "class2": {"students": ["Carol"], "teacher": "Mr. Lee"}, } print(school["class1"]["students"][0]) for class_name, info in school.items(): print(class_name, "-", info["teacher"], "-", len(info["students"]), "students") # Alice # class1 - Mrs. Smith - 2 students # class2 - Mr. Lee - 1 students # ==================================================================== # Пример 5. copy() против copy.deepcopy() # ==================================================================== import copy original = {"name": "Alice", "scores": [90, 85]} shallow = original.copy() deep = copy.deepcopy(original) original["name"] = "Bob" original["scores"].append(80) print(shallow) print(deep) # {'name': 'Alice', 'scores': [90, 85, 80]} # {'name': 'Alice', 'scores': [90, 85]} # ==================================================================== # Пример 6. Dict comprehension: преобразование и фильтрация # ==================================================================== words = ["cat", "elephant", "dog", "hippopotamus"] lengths = {word: len(word) for word in words} print(lengths) long_words = {word: length for word, length in lengths.items() if length > 3} print(long_words) # {'cat': 3, 'elephant': 8, 'dog': 3, 'hippopotamus': 12} # {'elephant': 8, 'hippopotamus': 12} # ==================================================================== # Пример 7. def, pass, позиционные и именованные аргументы, значения по умолчанию # ==================================================================== def stub(): pass def greet(name, greeting="Hello"): return f"{greeting}, {name}!" print(greet("Alice")) print(greet("Bob", "Hi")) print(greet(name="Carol", greeting="Hey")) # Hello, Alice! # Hi, Bob! # Hey, Carol! # ==================================================================== # Пример 8. *args и **kwargs: упаковка лишних аргументов # ==================================================================== def describe(*args, **kwargs): print("args:", args) print("kwargs:", kwargs) describe(1, 2, 3, name="Alice", age=30) def total(*numbers): return sum(numbers) print(total(1, 2, 3, 4)) # args: (1, 2, 3) # kwargs: {'name': 'Alice', 'age': 30} # 10 # ==================================================================== # Пример 9. return и None, правило LEGB # ==================================================================== def no_return(): print("done") result = no_return() print(result) x = 10 def show_value(): x = 5 return x print(show_value()) print(x) # done # None # 5 # 10 # ==================================================================== # Пример 10. global против параметров и return # ==================================================================== counter = 0 def increment_global(): global counter counter += 1 increment_global() increment_global() print(counter) def increment(value): return value + 1 counter2 = 0 counter2 = increment(counter2) counter2 = increment(counter2) print(counter2) # 2 # 2 # ==================================================================== # Пример 11. Практика: валидация скобок стеком и словарём соответствий # ==================================================================== def is_valid_brackets(text): pairs = {")": "(", "]": "[", "}": "{"} stack = [] for char in text: if char in pairs.values(): stack.append(char) elif char in pairs: if not stack or stack.pop() != pairs[char]: return False return not stack print(is_valid_brackets("([)]")) print(is_valid_brackets("({[]})")) # False # True # ==================================================================== # Пример 12. Практика: словарь + функция вместе — реверс словаря и группировка # ==================================================================== def reverse_dictionary(data): result = {} for key, value in data.items(): result.setdefault(value, []).append(key) return result print(reverse_dictionary({"a": 1, "b": 2, "c": 1, "d": 3})) def group_students(students): groups = {"Отличники": {}, "Хорошисты": {}, "Троечники": {}, "Не сдали": {}} for name, score in students.items(): if score >= 85: groups["Отличники"][name] = score elif score >= 70: groups["Хорошисты"][name] = score elif score >= 50: groups["Троечники"][name] = score else: groups["Не сдали"][name] = score return groups students = {"Аня": 92, "Боря": 76, "Ваня": 65, "Галя": 48} print(group_students(students)) # {1: ['a', 'c'], 2: ['b'], 3: ['d']} # {'Отличники': {'Аня': 92}, 'Хорошисты': {'Боря': 76}, 'Троечники': {'Ваня': 65}, 'Не сдали': {'Галя': 48}}