""" Урок 31. Summary session 8 — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/31-summary-session-8/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-31.py """ # ==================================================================== # Пример 1. Ссылка на объект и id() # ==================================================================== numbers = [1, 2, 3] alias = numbers alias.append(4) print(numbers) # [1, 2, 3, 4] print(alias) # [1, 2, 3, 4] print(id(numbers) == id(alias)) # True # ==================================================================== # Пример 2. Неизменяемые объекты ведут себя иначе # ==================================================================== text1 = "hello" text2 = text1 text2 += " world" print(text1) # hello print(text2) # hello world print(id(text1) == id(text2)) # False # ==================================================================== # Пример 3. Вложенные списки: чтение и изменение через несколько индексов # ==================================================================== matrix = [[1, 2], [3, 4], [5, 6]] print(matrix[1][0]) # 3 for row_index, row in enumerate(matrix): for col_index, value in enumerate(row): matrix[row_index][col_index] = value + 1 print(matrix) # [[2, 3], [4, 5], [6, 7]] # ==================================================================== # Пример 4. del: элемент, срез и имя # ==================================================================== numbers = [10, 20, 30, 40, 50] del numbers[1] print(numbers) # [10, 30, 40, 50] del numbers[1:3] print(numbers) # [10, 50] old_numbers = [1, 2, 3] new_numbers = old_numbers del old_numbers print(new_numbers) # [1, 2, 3] — объект жив, пока есть другая ссылка # ==================================================================== # Пример 5. Поверхностная и глубокая копия # ==================================================================== import copy original = [[1, 2], [3, 4]] shallow = original.copy() deep = copy.deepcopy(original) shallow[0][0] = 99 deep[1][0] = 0 print(original) # [[99, 2], [3, 4]] print(shallow) # [[99, 2], [3, 4]] print(deep) # [[1, 2], [0, 4]] # ==================================================================== # Пример 6. List comprehension: преобразование и фильтр # ==================================================================== numbers = [1, 4, 6, 7, 9] squares = [number ** 2 for number in numbers] print(squares) # [1, 16, 36, 49, 81] print(numbers) # [1, 4, 6, 7, 9] — исходный список не тронут even_numbers = [number for number in range(10) if number % 2 == 0] print(even_numbers) # [0, 2, 4, 6, 8] # ==================================================================== # Пример 7. Условное выражение if-else и вложенный обход # ==================================================================== numbers = [2, 7, 5, 4, 1, 1, 7, 8] modified = [number if number % 2 == 0 else -1 for number in numbers] print(modified) # [2, -1, -1, 4, -1, -1, -1, 8] matrix = [[1, 2, 3], [4, 5, 6]] flattened = [value for row in matrix for value in row] print(flattened) # [1, 2, 3, 4, 5, 6] # ==================================================================== # Пример 8. zip(): параллельный обход и ограничение по короткой последовательности # ==================================================================== names = ["Alice", "Bob", "Charlie"] ages = [25, 30, 35, 40] for name, age in zip(names, ages): print(f"{name} is {age} years old.") # Alice is 25 years old. # Bob is 30 years old. # Charlie is 35 years old. print(list(zip(names, ages))) # [('Alice', 25), ('Bob', 30), ('Charlie', 35)] # ==================================================================== # Пример 9. Стек и очередь: LIFO против FIFO # ==================================================================== from collections import deque stack = [] stack.append("open") stack.append("edit") stack.append("save") print(stack.pop()) # save — последним пришёл, первым ушёл print(stack) # ['open', 'edit'] queue = deque(["print", "scan", "send"]) queue.append("archive") print(queue.popleft()) # print — первым пришёл, первым ушёл print(queue) # deque(['scan', 'send', 'archive']) # ==================================================================== # Пример 10. Устойчивая сортировка # ==================================================================== words = ["orange", "mango", "apple", "banana", "kiwi", "cherry"] for word in sorted(words, key=len): print(f"{len(word)}: {word}") # 4: kiwi # 5: mango # 5: apple # 6: orange # 6: banana # 6: cherry data = [("b", 2), ("a", 1), ("a", 0)] print(sorted(data, key=lambda pair: pair[0])) # [('a', 1), ('a', 0), ('b', 2)] # ==================================================================== # Пример 11. Практика: удаление хвоста после первого нуля # ==================================================================== numbers = [1, 2, 0, 3, 4, 5] if 0 in numbers: zero_index = numbers.index(0) del numbers[zero_index:] print("Список после удаления:", numbers) # Список после удаления: [1, 2] # ==================================================================== # Пример 12. Практика: конвейер zip + comprehension # ==================================================================== names = ["Alice", "Bob", "Charlie"] ages = [25, 30, 35] people = [f"{name} ({age})" for name, age in zip(names, ages)] print(people) # ['Alice (25)', 'Bob (30)', 'Charlie (35)'] list1 = [1, 2, 3] list2 = [4, 5, 6] products = [left * right for left in list1 for right in list2] print(products) # [4, 5, 6, 8, 10, 12, 12, 15, 18] # ==================================================================== # Пример 12. Практика: конвейер zip + comprehension # ==================================================================== from itertools import product print([left * right for left, right in product(list1, list2)]) # [4, 5, 6, 8, 10, 12, 12, 15, 18] — тот же результат