Skip to content

Latest commit

 

History

History
528 lines (372 loc) · 26.2 KB

File metadata and controls

528 lines (372 loc) · 26.2 KB

Лекция 3: None. Range, list comprehension, sum, max, min, len, sorted, all, any. Работа с файлами

Оглавление курса

Блок 1 — Python Basic (1–6)
Блок 2 — Git (7–8)
Блок 3 — Python Advanced (9–14)
Блок 4 — SQL (15–17)
Блок 5 — Django (19–26)
Блок 6 — Django Rest Framework (27–30)
Блок 7 — Python async (31–33)
Блок 8 — Deployment (34–35)

Сегодня познакомимся с некоторыми новыми концепциями, но в основном погрузимся в практику.

Давайте познакомимся с ещё одним типом данных — None

В языке Python существует специальное значение, обозначающее отсутствие какого-либо значения — None. Это объект встроенного типа NoneType, который используется для представления «ничего» или «неизвестного» значения.

Основные характеристики None

Уникальность: В Python существует только один экземпляр None. Это означает, что все переменные, которым присвоено значение None, указывают на один и тот же объект.

Булевое значение: None интерпретируется как False в логических операциях.

Не является пустой строкой, нулём или списком: None — это не 0, не '' (пустая строка) и не пустой список []. Это отдельный объект.

Присвоение переменной

some_var = None

Проверка на None

Сравнение с None принято выполнять с помощью операторов is / is not, а не через ==:

x = None
if x is None:
    print("Переменная x содержит None")

range

range() — функция, создающая последовательность чисел, чаще всего применяется в циклах for и его производных.

Принимает до 3 параметров. Один обязательный, и два вспомогательных.

Если введён только один параметр, то генерирует последовательность чисел от 0 до указанного числа, не включительно. Например:

for i in range(5):
    print(i)
# Вывод:
# 0
# 1
# 2
# 3
# 4

Если введены два параметра, то range воспринимает их как начало и конец (конец не включительно).

for i in range(2, 6):
    print(i)
# Вывод:
# 2
# 3
# 4
# 5

Если введены три параметра, то третий воспринимается как шаг между элементами. В качестве шага можно передавать отрицательные значения!

for i in range(2, 10, 3):
    print(i)
# Вывод:
# 2
# 5
# 8

На самом деле для цикла for существует интересная особенность: если нам нет необходимости использовать перебираемые элементы, мы можем указать символ _ вместо переменной цикла:

for _ in range(3):
    print('It will be printed 3 times')
# Вывод:
# It will be printed 3 times
# It will be printed 3 times
# It will be printed 3 times

Встроенные функции в Python: работа с данными и коллекциями

Python — это язык программирования, который предоставляет множество встроенных (built-in) функций для работы с данными и коллекциями. Эти функции упрощают манипуляции с данными и делают код более читаемым и эффективным. Рассмотрим несколько встроенных функций Python, включая all, any, sorted, len, sum, min и max.

Функции для работы с коллекциями

min() и max()

Функция min() находит наименьший элемент в числовой коллекции, а функция max() — наибольший. Рассмотрим пример:

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
min_value = min(numbers)  # Минимум: 1
max_value = max(numbers)  # Максимум: 9

sum()

Функция sum() вычисляет сумму всех элементов числовой коллекции, такой как список или кортеж. Рассмотрим пример:

numbers = [1, 2, 3, 4, 5]
total = sum(numbers)  # Сумма: 15

len()

Функция len() используется для определения длины (количества элементов) коллекции, включая строки, списки, кортежи и другие. Рассмотрим примеры:

text = "Привет, мир!"
length = len(text)  # Длина строки: 12

numbers = [1, 2, 3, 4, 5]
length = len(numbers)  # Длина списка: 5

sorted()

Функция sorted() сортирует элементы коллекции в порядке возрастания (по умолчанию) и возвращает новый список. Она также может принимать дополнительный аргумент reverse=True для сортировки в обратном порядке. Рассмотрим пример:

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = sorted(numbers)  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

Практика

  1. Найти наибольшее и наименьшее значение в списке.
  2. Найти среднее арифметическое из списка чисел.
  3. Найти второе по величине значение в списке ([10, 2, 5, 8, 0] → результат 8).
  4. Проверить, является ли список уже отсортированным.
  5. Заданы два числа, вывести все нечётные значения между ними.
  6. Заданы два числа, найти сумму всех значений между ними.
  7. Заданы два числа, вывести все числа между ними в обратном порядке (10, 6 → [10, 9, 8, 7, 6]).
  8. Сложная! Используя цикл for, range и свойства списков, найти заданное число Фибоначчи.

Что такое List Comprehension?

Python — это язык программирования, который известен своей читаемостью и эффективностью в написании кода. Одним из мощных инструментов, предоставляемых Python, является List Comprehension, или генераторы списков. Это синтаксическая конструкция, которая позволяет создавать списки более компактно и эффективно.

List Comprehension (генераторы списков) — это способ создания новых списков в Python на основе существующего списка или другой итерируемой последовательности. Этот метод позволяет сократить количество кода и улучшить читаемость, особенно при создании списков на основе условий.

Синтаксис List Comprehension выглядит следующим образом:

new_list = [expression for item in iterable if condition]

Где:

  • new_list — новый список, который будет создан.
  • expression — выражение, которое определяет, какие элементы будут включены в новый список.
  • item — переменная, которая принимает каждый элемент из итерируемой последовательности.
  • iterable — итерируемая последовательность, например, список или кортеж.
  • condition (опционально) — условие, которому должен соответствовать элемент, чтобы быть включенным в новый список.

Примеры использования List Comprehension

Создание списка чисел от 0 до 9:

numbers = [x for x in range(10)]
# Результат: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Создание списка квадратов чисел от 0 до 9:

squares = [x ** 2 for x in range(10)]
# Результат: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Фильтрация элементов из списка:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = [x for x in numbers if not x % 2]
# Результат: [2, 4, 6, 8, 10]

Преобразование строк в список слов и превращение их в маленькие буквы:

text = "Привет, мир! Давайте изучать Python."
words = [word.lower() for word in text.split()]
# Результат: ['привет,', 'мир!', 'давайте', 'изучать', 'python.']

Метод join() — объединение списка в строку

Метод join() позволяет объединить элементы списка (или другой итерируемой последовательности) в одну строку, используя указанный разделитель:

words = ['Привет', 'мир', 'Python']
result = ' '.join(words)  # Объединение через пробел
# Результат: 'Привет мир Python'

result = ', '.join(words)  # Объединение через запятую с пробелом
# Результат: 'Привет, мир, Python'

result = ''.join(words)  # Объединение без разделителя
# Результат: 'ПриветмирPython'

Вложенные List Comprehension

List Comprehension также поддерживает вложенные конструкции, позволяя создавать списки более сложной структуры.

Развёртывание матрицы в список:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened_matrix = [x for row in matrix for x in row]
# Результат: [1, 2, 3, 4, 5, 6, 7, 8, 9]

Получение диагонали матрицы:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
diagonal = [matrix[i][i] for i in range(len(matrix))]
# Результат: [1, 5, 9]

all() и any()

Функция all() проверяет, все ли элементы итерируемого объекта истинны (после преобразования к булевому значению). Если все элементы истинны, она возвращает True, иначе — False. Рассмотрим пример:

numbers = [1, 2, 3, 4, 5]
result = all([x > 0 for x in numbers])  # True, так как все числа положительные

Применение: all работает со списками, кортежами, множествами и любыми итерируемыми объектами. Эквивалент без создания промежуточного списка (предпочтительнее):

numbers = [1, 2, 3, 4, 5]
all(x > 0 for x in numbers)  # генераторное выражение, без лишнего списка

Функция any() проверяет, есть ли хотя бы один истинный элемент в итерируемом объекте. Если хотя бы один элемент истинен, она возвращает True, иначе — False. Рассмотрим пример:

numbers = [1, 2, 3, -1, -2]
result = any([x < 0 for x in numbers])  # True, так как есть отрицательные числа

Аналогично для any — можно передавать список напрямую или использовать генераторное выражение:

numbers = [1, 2, 3, -1, -2]
any(x < 0 for x in numbers)

Практика (все задания предполагают использование list comprehension)

  1. Создать список чисел от 5 до 100.
  2. Создать список нечётных чисел от 5 до 100.
  3. Есть список слов — создать список, который будет содержать первые буквы из каждого слова.
  4. Не связано с list comprehension. Из прошлого списка сделать строку (используя join()).
  5. Есть список чисел. Создать список на его основе, но взять только отрицательные значения.
  6. Создать список квадратов чисел в указанном пользователем диапазоне.
  7. Используя any, выяснить, есть ли в списке положительные числа.
  8. Используя all, выяснить, все ли числа в списке чётные.

Работа с файлами в Python: чтение и запись

Работа с файлами — важная часть программирования в Python.

Открытие и закрытие файла

Прежде чем начать работать с файлом, необходимо его открыть с помощью функции open(). Эта функция принимает два аргумента: имя файла и режим доступа (чтение, запись и т. д.). Например, чтобы открыть файл для чтения, используйте следующий код:

file = open("example.txt", "r")

После завершения работы с файлом его следует закрыть с помощью метода close():

file.close()

Закрытие файла важно, чтобы освободить ресурсы и обеспечить целостность данных. На практике явный вызов close() применяется редко — ниже я опишу, почему.

Чтение из Файла

Чтение всего файла

Для чтения всего содержимого файла можно использовать метод read():

file = open("example.txt", "r")
content = file.read()
file.close()

Чтение по строкам

Чтение файла по строкам можно выполнить с помощью итерации:

В Python файл — итерируемый объект!

file = open("example.txt", "r")
for line in file:
    print(line)
file.close()

Чтение определённого количества символов

Можно прочитать определённое количество символов из файла с помощью метода read() с аргументом:

file = open("example.txt", "r")
partial_content = file.read(50)  # Прочитать первые 50 символов файла
file.close()

Автоматическое закрытие файла (контекстный менеджер)

Python предоставляет удобный способ автоматического закрытия файла после завершения работы с ним, используя контекстный менеджер (with):

Этот способ используется на практике гораздо чаще, чем обычные open и close. Почему эта «магия» так работает, расскажу дальше по курсу.

with open("example.txt", "r", encoding="utf-8") as file:
    content = file.read()
# Файл автоматически закроется после завершения блока with

Чтение чисел из файла

При чтении из файла данные всегда возвращаются как строки. Если в файле хранятся числа, их нужно преобразовать с помощью int() или float():

# Файл numbers.txt содержит числа, каждое на новой строке:
# 10
# 25
# 7

with open("numbers.txt", "r") as file:
    numbers = []
    for line in file:
        number = int(line.strip())  # strip() убирает символы переноса строки
        numbers.append(number)

    print(max(numbers))  # Найти максимальное число

Или с использованием list comprehension:

with open("numbers.txt", "r") as file:
    numbers = [int(line.strip()) for line in file]
    print(max(numbers))

Метод strip() удаляет пробельные символы (включая \n) с начала и конца строки.

Запись в Файл

Запись текста в файл

Для записи текста в файл используйте режим доступа "w" (запись) с функцией write():

file = open("example.txt", "w")
file.write("Привет, мир!")
file.close()

Если файл не существует, он будет создан. Если файл существует, его содержимое будет заменено.

Добавление текста в файл

Чтобы добавить текст к существующему файлу, используйте режим доступа "a" (добавление):

file = open("example.txt", "a")
file.write("\nДополнительная строка")
file.close()

Работа с бинарными файлами

Все вышеупомянутые операции могут быть выполнены как с текстовыми, так и с бинарными файлами. Для работы с бинарными файлами используются режимы доступа "rb" (чтение бинарного файла) и "wb" (запись бинарного файла).

Бинарные файлы — это все файлы, которые нельзя прочитать как текст (картинки, исполняемые файлы и т. д.).

# Чтение бинарного файла
with open("binary_file.bin", "rb") as file:
    binary_data = file.read()

# Запись бинарного файла
with open("binary_file.bin", "wb") as file:
    binary_data = b'\x00\x01\x02\x03\x04'
    file.write(binary_data)

Практика

  1. Чтение файла и вывод его содержимого: создайте текстовый файл sample.txt с несколькими строками текста. Напишите программу, которая открывает файл и выводит его содержимое на экран.

  2. Запись в файл: напишите программу, которая запрашивает у пользователя несколько строк текста и записывает их в файл с именем output.txt.

  3. Копирование файла: создайте текстовый файл source.txt. Напишите программу, которая читает содержимое source.txt и записывает его в новый файл destination.txt.

  4. Анализ файла: создайте текстовый файл со списком чисел (каждое число на новой строке). Напишите программу, которая читает файл и печатает самое большое число.

  5. Конвертация файлов: создайте текстовый файл с температурами в градусах Цельсия (каждая на новой строке). Напишите программу, которая читает файл, конвертирует температуры в градусы Фаренгейта и записывает результаты в новый файл.

  6. Подсчёт слов в файле: напишите программу, которая считает количество слов в текстовом файле.

  7. FizzBuzz: реализуйте FizzBuzz с прошлого занятия, но записывайте результаты в файл.


← Лекция 2: Обработка исключений. Списки, строки детальнее, срезы, циклы. | Лекция 4: Хэш таблицы. Set, frozenset. Dict. Tuple. Немного об импортах. Namedtuple, OrderedDict →