Python: задачки и вопросы
7.75K subscribers
1.19K photos
1 video
1 file
89 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
Что выведет код?
Anonymous Quiz
20%
[4, 5, 6]
17%
[1, 4, 7]
58%
[2, 5, 8]
5%
Error
Мы всегда можем индексировать по строкам и столбцам внутри строк с использованием нормальных операций индексации:

M = [[1, 2, 3], 
[4, 5, 6],
[7, 8, 9]]

М[1] # [4, 5, 6]

М[1][2] # 6 (Строка 2, элемент 3)


Cписковые включения являются мощным инструментом для обработки таких структур, потому что они автоматически просматривают строки и столбцы. Скажем, хотя такая структура хранит матрицы по строкам, для сбора значений второго столбца мы можем просто проходить по строкам и извлекать желаемый столбец или проходить по позициям в строках с индексаций в ходе дела:

[row[1] for row in M] # [2, 5, 8]
Что выведет код?
Anonymous Quiz
14%
[1, 5, 9]
14%
[2, 4, 9]
64%
[3, 5, 7]
8%
Error
С применением функции range() генерируется список смещений и производится индексация с одинаковыми номерами строк и столбцов, выбирающая М[0][0], затем М[1][1] и т.д. Во второй строке индекс столбца уравновешивается для извлечения М[0][2], М[1][1] и т.д. (мы предполагаем, что матрица имеет равное количество строк и столбцов):

M = [[1, 2, 3], 
[4, 5, 6],
[7, 8, 9]]

# Диагональ
[M[i][i] for i in range(len(M))] # [1, 5, 9]

# Обратная диагональ
[M[i][len(M)-1-i] for i in range(len(M))] # [3, 5, 7]
В данном случае однократное списковое включение «сплющивает» матрицу до вектора, т.е. списка чисел. Чтобы понять такой код, его можно преобразовать к виду простых операторов:

res = []
for row in М: # Эквиваленты в виде операторов
for col in row: # Отступ для частей, находящихся дальше справа
res.append(col + 10)


Чтобы сохранить матрицу, достаточно использовать двойное списковое включение:

[[col + 10 for col in row] for row in M]
Мы можем использовать списковые включения для комбинирования значений множества матриц. В задаче выше строится плоский список, который содержит результат попарного перемножения матриц.
Что выведет код?
Anonymous Quiz
13%
('jack', 51, 'cio')
76%
35, 40, 51
3%
35
8%
Error
Списковое включение может применяться также как разновидность операции проецирования столбцов. Стандартный API-интерфейс для работы с базами данных SQL в Python возвращает результаты запросов в форме последовательности последовательностей вроде следующей ниже; список представляет таблицу, кортежи — строки, а элементы в кортежах — значения столбцов:

listoftuples = [('bob', 35, 'mgr'), ('sue', 40, 'dev'), ('jack', 51, 'cio')]


С использованием цикла for можно было бы извлечь все значения из выбранного
«столбца» вручную, но списковые включения способны выполнить такую работу за один шаг, к тому же быстрее:

[age for (name, age, job) in listoftuples] # 35, 40, 52
DataFrame.sort_values(by, *, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)


Булевый параметр ascending отвечает за тип сортировки и по умолчанию равен True, т.е. датафрейм сортируется по умолчанию от меньшего к большему.
Что выведет код?
Anonymous Quiz
45%
0
23%
1
7%
2
25%
Error
Генератор — это специальная функция, которая возвращает итератор, с помощью которого можно обойти некоторую последовательность значений.

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


def gen():
for i in range(10):
X = yield i
print(X)

G = gen()
print(next(G)) # Сначала должен вызываться next(), чтобы запустить генератор


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

Формально yield теперь имеет форму не оператора, а выражения, которое возвращает
элемент, переданный next.