""" Урок 55. Summary session 14 — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/55-summary-session-14/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-55.py """ # ==================================================================== # Пример 1. Режимы open() и безопасное закрытие через with # ==================================================================== with open("report.txt", "w", encoding="utf-8") as file: file.write("первая строка\n") print("Файл создан режимом 'w'") with open("report.txt", "a", encoding="utf-8") as file: file.write("вторая строка\n") print("Дописали режимом 'a'") try: with open("report.txt", "x", encoding="utf-8") as file: pass except FileExistsError as error: print("FileExistsError:", error) # [Errno 17] File exists: 'report.txt' with open("report.txt", "r", encoding="utf-8") as file: print(repr(file.read())) # 'первая строка\nвторая строка\n' # ==================================================================== # Пример 2. read(), readline(), readlines() — три разные формы результата # ==================================================================== with open("report.txt", "r", encoding="utf-8") as file: print("read():", repr(file.read())) # read(): 'первая строка\nвторая строка\n' — вся строка целиком with open("report.txt", "r", encoding="utf-8") as file: print("readline():", repr(file.readline())) # 'первая строка\n' print("readline() ещё раз:", repr(file.readline())) # 'вторая строка\n' with open("report.txt", "r", encoding="utf-8") as file: print("readlines():", file.readlines()) # ['первая строка\n', 'вторая строка\n'] — список строк # ==================================================================== # Пример 3. Запись: write() и writelines() # ==================================================================== lines = ["строка A\n", "строка B\n", "строка C\n"] with open("batch.txt", "w", encoding="utf-8") as file: file.writelines(lines) with open("batch.txt", "r", encoding="utf-8") as file: for line in file: print(line.strip()) # строка A # строка B # строка C # ==================================================================== # Пример 4. iter(), next() и StopIteration # ==================================================================== values = iter([10, 20, 30]) print(next(values)) # 10 print(next(values)) # 20 print(next(values, "конец")) # 30 print(next(values, "конец")) # конец — элементы закончились, но исключения нет values2 = iter([1, 2]) try: next(values2) next(values2) next(values2) # элементов больше нет except StopIteration: print("StopIteration поймали вручную") # ==================================================================== # Пример 5. Итератор одноразовый — список нет # ==================================================================== it = iter([1, 2, 3]) print(list(it)) # [1, 2, 3] print(list(it)) # [] — уже нечего отдавать numbers_list = [1, 2, 3] print(list(numbers_list)) # [1, 2, 3] print(list(numbers_list)) # [1, 2, 3] — список можно обходить сколько угодно раз # ==================================================================== # Пример 6. Генераторное выражение: ленивость, память, без индексации # ==================================================================== numbers = [1, 2, 3, 4, 5] squares_gen = (x ** 2 for x in numbers) squares_list = [x ** 2 for x in numbers] print(type(squares_gen)) # try: squares_gen[0] # индексация недоступна except TypeError as error: print("TypeError:", error) # 'generator' object is not subscriptable print(list(squares_gen)) # [1, 4, 9, 16, 25] — значения вычисляются здесь # ==================================================================== # Пример 6. Генераторное выражение: ленивость, память, без индексации # ==================================================================== import sys big_gen = (x ** 2 for x in range(1, 1_000_001)) big_list = [x ** 2 for x in range(1, 1_000_001)] print(sys.getsizeof(big_gen), "байт — генератор") # 208 байт — генератор print(sys.getsizeof(big_list), "байт — список") # 8448728 байт — список # ==================================================================== # Пример 7. any(), all(), sum() с генераторным выражением # ==================================================================== nums = [3, 7, 12, 5, 9] print(any(n > 10 for n in nums)) # True print(all(n > 0 for n in nums)) # True print(sum(n for n in nums if n % 2 == 0)) # 12 — сумма только чётных def probe(n): print(" проверяю", n) return n > 10 print(any(probe(n) for n in nums)) # проверяю 3 # проверяю 7 # проверяю 12 # True — до 5 и 9 проверка не дошла, результат уже известен # ==================================================================== # Пример 8. itertools.chain: пройти несколько последовательностей как одну # ==================================================================== import itertools fruits = ["apple", "banana"] vegetables = ["carrot", "tomato"] for item in itertools.chain(fruits, vegetables): print(item) # apple # banana # carrot # tomato # ==================================================================== # Пример 9. itertools.count: бесконечный счётчик и как его безопасно ограничить # ==================================================================== counter = itertools.count(start=10, step=5) first_three = list(itertools.islice(counter, 3)) print(first_three) # [10, 15, 20] # ==================================================================== # Пример 10. itertools.product и itertools.permutations: комбинаторика без вложенных циклов # ==================================================================== sizes = ["S", "M"] colors = ["red", "blue"] print(list(itertools.product(sizes, colors))) # [('S', 'red'), ('S', 'blue'), ('M', 'red'), ('M', 'blue')] print(list(itertools.permutations([1, 2, 3], 2))) # [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)] # ==================================================================== # Пример 11. Собираем всё: файл + генераторное выражение (задание 3 урока) # ==================================================================== with open("numbers.txt", "w", encoding="utf-8") as file: for n in range(1, 11): file.write(str(n) + "\n") with open("numbers.txt", "r", encoding="utf-8") as file: total = sum(int(line.strip()) ** 2 for line in file if line.strip()) print("Сумма квадратов:", total) # 385