11 subscribers
38 photos
2 links
Download Telegram
Если ваш код работает, но вы хотите устранить предупреждения:

1. Отключите строгую проверку типов для данного участка
Добавьте комментарий, чтобы анализатор игнорировал это место:

# type: ignore
a[1] = 1828 # type: ignore
Преобразование списка или строки во множество позволяет получить очень интересные результаты. Как вы помните, все элементы множества должны быть уникальны, поэтому при преобразовании списка во множество каждый элемент останется только в одном экземпляре. Таким образом, можно очень легко убрать повторяющиеся элементы и узнать, сколько элементов встречается в списке хотя бы один раз:


a = [1, 2, 1, 1, 2, 2, 3, 3]
print('Количество элементов в списке без повторений: ', len(set(a))) # 3
вероятность событий (чисто для себя)
ДЛЯ СОЗДАНИЯ ПУСТОГО КОРТЕЖА ИСПОЛЬЗУЕТСЯ:

empty_tuple = tuple()
Вложенные списки:
Обход элементов внутри вложенных списков
способ создания вложенного списка на одной строке:
table = [[int(el) for el in input().split()] for _ in range(n)] # [int(el) for el in input().split()] создаётся 1 отдельный вложенный список тем что запрашивается строчный ввод который превращается в целые числа разделённые запятой, который попадает в конец основного списка и далее создаются остальные с помощью for _ in range(n)
first_name = 'Сильвестр'
last_name = 'Сталлоне'
print(actors[first_name + ' ' + last_name])

Если ключа в словаре нет, возникнет ошибка:

print(actors['Несуществующий ключ'])
KeyError: 'Несуществующий ключ'
Удаление, добавление элементов в словари:
6. Нестроковые ключи
Решим следующую задачу. Пусть дан длинный список целых чисел numbers. Мы знаем, что некоторые числа встречаются в этом списке несколько раз. Нужно узнать, сколько именно раз встречается каждое из чисел.

numbers = [1, 10, 1, 6, 4, 10, 4, 2, 2, 1, 10, 1]
counts = {}
for number in numbers:
if number not in counts:
counts[number] = 1
else:
counts[number] += 1


Просто так сделать counts[number] += 1 нельзя: если ключа number в словаре нет, возникнет ошибка KeyError.

В результате работы этой программы все элементы из списка numbers окажутся ключами словаря counts. Значением counts[x] будет количество раз, которое число x встретилось в списке numbers. Как это работает?

Цикл for перебирает все элементы списка numbers и для каждого проверяет, присутствует ли он уже в качестве ключа в counts. Если нет — значит, число встретилось нам впервые и мы инициализируем значение counts[numbers] = 1. Иначе увеличим counts[number] на единицу, поскольку число number встретилось нам повторно.

Почему для этой задачи не стоит использовать список, хотя ключи — обычные целые числа? Потому что, используя словарь, мы можем решить эту задачу и для вещественных чисел, и для очень больших целых чисел, и вообще для любых объектов, которые можно сравнивать.
list(map(int, input().split())))
Возврат из глубины функции
Множественные точки возврата из функции позволяют нам упростить обработку и более сложных структур, например, вложенных списков. Наша следующая программа будет проверять, есть ли в матрице элемент, отличающийся от искомого не больше чем на число eps.

Матрица записывается как список списков. Мы предполагаем, что наша функция будет работать с большими матрицами, поэтому нам не хочется тратить лишнее время на проверку. Мы будем прекращать поиск, как только нашли подходящий элемент. Давайте для начала разберемся, как бы мы действовали без множественных операторов return.

def matrix_has_close_value(matrix, value, eps):
found = False
for row in matrix:
for cell in row:
if abs(cell - value) <= eps:
found = True
break
if found:
break
if found:
return True
else:
return False

Как видите, нам приходится прилагать некоторые усилия, чтобы выйти из нескольких уровней вложенности. Каждый уровень вложенности — дополнительное препятствие на пути к завершению функции. Ему мешают не только циклы, как в этом примере, но и условные операторы.

Перепишем теперь функцию с учетом того, что, как только мы нашли элемент, мы уже знаем, что ответ — True (т. е. элемент содержится в матрице). А если мы закончили перебор элементов и так и не нашли ни одного элемента, ответ False.

def matrix_has_close_value(matrix, value, eps):
for row in matrix:
for cell in row:
if abs(cell - value) <= eps:
return True
return False

Хотя return False не заключен ни в какое условие, выполняется он только тогда, когда элемент не найден. Если элемент найден, мы сразу выходим из функции и до этой строки просто не доходим. Оператор return очень удобен, когда нужно выйти из глубины функции.
Возврат нескольких значений
В задаче про корни квадратного уравнения у нас уже возникала необходимость вернуть несколько значений. Вы видели, что это можно сделать, вернув список значений.

То же самое можно сделать немного проще: если после return написать несколько значений через запятую, Python автоматически поместит эти значения в кортеж и вернет этот кортеж.

def get_coordinates():
return 1, 2


print(get_coordinates())
# => (1, 2)
Мы разобрались, как возвращать значения из функции. Но как программа их получает, когда значений несколько? Оказывается, есть несколько способов. Один вариант вы знаете, можно записать в переменную весь кортеж:

def get_coordinates():
return 1, 2


result = get_coordinates()
print(result)
# => (1, 2)


Можно вместо этого воспользоваться множественным присваиванием, тогда значения автоматически будут распределены по разным переменным:

x, y = get_coordinates()
print(x) # => 1
print(y) # => 2