Создайте функцию, которая принимает список чисел от 1 до 10 (исключая одно число) и возвращает недостающее число.
Примеры:
missing_num([1, 2, 3, 4, 6, 7, 8, 9, 10]) ➞ 5 missing_num([7, 2, 3, 6, 5, 9, 1, 4, 8]) ➞ 10 missing_num([10, 5, 1, 2, 4, 6, 8, 3, 9]) ➞ 7
Примечания:
- Список чисел будет несортированным (не по порядку).
- Не будет хватать только одного числа.
Варианты решений:
def missing_num(lst): return 55 - sum(lst)
def missing_num(lst): for n in range(1, 11): if n not in lst: return(n)
def missing_num(lst): return list(set(range(1, 11)) - set(lst))[0]
def missing_num(lst): return sum(range(1, 11)) - sum(lst)
Формально – верны все решения, но их можно улучшить:
1,4) Используют одну и ту же идею “математического” способа, однако вариант 4 в отличие от варианта 1 имеет потенциал для параметризования функции, а именно к аргументам функции добавить n: int = 10, которое будет подставляться в sum(range(1, n + 1)), добавляя универсальности решению. Также сумму чисел оптимально искать по формуле арифметической прогрессии за константное время вместо использования sum+range.
2) Прямо топорное решение того, что требуют, читабельность 10/10 (без сарказма), считаю что улучшению не подлежит.
3) Просто режет глаз выражение list(some_collection)[0], так как ВСЯ коллекция приводится к типу список (вся коллекция дублируется в памяти) и используется только один элемент из неё. Если нужно взять первый элемент из коллекции, то так и можно говорит питону “дай мне следующий (т.е. первый) элемент итерируемого объекта (т.е. коллекции) – next(iter(some_col))”
Ед