Аргументы со звездочкой способны распаковывать итерируемый объект в индивидуальные аргументы. Однако в нашем примере также присутствует генератор.
Генераторы вместо построения результирующего списка в памяти возвращают итерируемый объект. Прием применим также к словарям и представлениям:
None выводится, потому что это означает последний шаг итерирования (StopIteration). Подробнее про это читайте в этом посте.
def f(a, b, c):
print('%s, %s и %s' % (a, b, c))
# Распаковка значений генераторного выражения
f(*(i for i in range(3)))
Генераторы вместо построения результирующего списка в памяти возвращают итерируемый объект. Прием применим также к словарям и представлениям:
D = dict(а='Bob', b='dev', с=40.5)
# Нормальные ключевые аргументы
f(a='Bob’, b='dev’, с=40.5) # Bob, dev и 40.5
# Распаковка словаря: ключ=значение
f(**D) # Bob, dev и 40.5
# Распаковка итератора ключей
f(*D) # b, c и a
# Распаковка итератора представления
f(*D.values()) # Bob, dev и 40.5\nNone
None выводится, потому что это означает последний шаг итерирования (StopIteration). Подробнее про это читайте в этом посте.
Telegram
Python: задачки и вопросы
Объяснение:
Первый шаг к пониманию того, что происходит в этом странном коде — это взглянуть на то, что нам говорит PEP 380⁴⁰ об использовании return с yield. Кратко говоря, return expr в генераторе вызывает исключение StopIteration(expr) при выходе из генератора.…
Первый шаг к пониманию того, что происходит в этом странном коде — это взглянуть на то, что нам говорит PEP 380⁴⁰ об использовании return с yield. Кратко говоря, return expr в генераторе вызывает исключение StopIteration(expr) при выходе из генератора.…
Код выводит S P A M, а не SPAM, потому что используется оператор распаковки *, который распаковывает элементы генератора и передает их как отдельные аргументы в функцию print().
- Генераторное выражение: (x.upper() for x in 'spam') создает генератор, который преобразует каждую букву строки 'spam' в верхний регистр, выдавая S, P, A, M по одному.
- Оператор * (распаковка) передает все отдельные элементы генератора как отдельные аргументы в функцию print(). Это эквивалентно вызову print('S', 'P', 'A', 'M').
- По умолчанию print() разделяет свои аргументы пробелами при выводе. Поэтому получаем итоговый результат: S P A M.
- Генераторное выражение: (x.upper() for x in 'spam') создает генератор, который преобразует каждую букву строки 'spam' в верхний регистр, выдавая S, P, A, M по одному.
- Оператор * (распаковка) передает все отдельные элементы генератора как отдельные аргументы в функцию print(). Это эквивалентно вызову print('S', 'P', 'A', 'M').
- По умолчанию print() разделяет свои аргументы пробелами при выводе. Поэтому получаем итоговый результат: S P A M.
Что будет, если не указать pd.read_csv() явно, какой столбец использовать в качестве индекса?
Anonymous Quiz
59%
Будет сгенерирован безымянный числовой столбец-индекс
18%
Столбец будет выбран автоматически
14%
У таблицы не будет индекса
9%
Код вызовет ошибку
Что выведет код?
Anonymous Quiz
24%
pams amsp mspa
49%
pams amsp mspa spam
13%
sm pa ap ms
14%
Error
L, S = [1, 2, 3], 'spam'
for i in range(len(S)): # Цикл с подсчетом 0.3
S = S[1:] + S[:1] # Перемещение головного элемента в конец
print(S, end=' ')
Функция
Поскольку
zip()
принимает два или более итерируемых объекта (в данном случае, строки) и создает итератор, который генерирует кортежи, содержащие элементы, исходящие от каждого из итерируемых объектов на соответствующих позициях. Это значит, что zip
будет объединять первый элемент S1
с первым элементом S2
, второй элемент S1
со вторым элементом S2
и так далее.Поскольку
S1
содержит 3 элемента, а S2
— 6 элементов, zip()
объединит только столько элементов, сколько есть в наименьшем итерируемом объекте, то есть в S1
.Что выведет код?
Anonymous Quiz
27%
[('a', 'x')]
51%
[('a', 'x'), ('b', 'y'), ('c', 'z')]
13%
[('abc', 'xyz123')]
9%
Error
Код выведет
Функция
Цикл
Очень важно отметить, что оператор возврата (
[(‘a’, ‘x’)]
из-за расположения return.Функция
myzip()
принимает произвольное количество последовательностей (в данном случае строки S1
и S2
).seqs = [list(S) for S in seqs]
преобразует каждую входную последовательность в список — [['a', 'b', 'c'], ['x', 'y', 'z', '1', '2', '3']]
.Цикл
while
продолжает выполняться, пока все списки в seqs
содержат хотя бы один элемент. Входные списки имеют по одному элементу на данный момент (['a', 'b', 'c'] и ['x', 'y', 'z', '1', '2', '3'])
.res.append(...):
внутри цикла создается кортеж из первого элемента каждого списка и добавляется в res
. Первые элементы будут 'a' и 'x', так что в res добавится кортеж ('a', 'x')
.Очень важно отметить, что оператор возврата (
return
) находится внутри цикла while
. Это означает, что функция сразу же вернет res
после первой итерации цикла. Таким образом, функция завершает свое выполнение и возвращает res, который на этом моменте содержит [('a', 'x')]
. После этого выполнение функции прекращается, и дальнейшие итерации не происходят.Код выводит
Строка
С помощью списка включений формируется результирующий список. Для каждой итерации (с каждым индексом i от 0 до 5) создается кортеж:
Это выражение проверяет, есть ли элемент с индексом
- Для
- Для
- Для
- Для
- Для
- Для
[(‘a’, ‘x’), (‘b’, ‘y’), (‘c’, ‘z’), (None, ‘1’), (None, ‘2’), (None, ‘3’)]
, потому что добавляет "заполнители", когда длина последовательностей различается. Строка
maxlen = max(len(S) for S in seqs)
вычисляет максимальную длину среди всех предоставленных последовательностей — в данном случае это 6.index = range(maxlen)
создаёт диапазон от 0 до 5 (включительно), то есть будет 6 итераций.С помощью списка включений формируется результирующий список. Для каждой итерации (с каждым индексом i от 0 до 5) создается кортеж:
tuple((S[i] if len(S) > i else pad) for S in seqs)
Это выражение проверяет, есть ли элемент с индексом
i
в последовательности S
. Если элемент существует, он добавляется в кортеж, если не существует (что происходит, как в случае со строкой S1 на индексах 3, 4 и 5), добавляется значение pad
, которое по умолчанию равно None
.- Для
i = 0
: получаем ('a', 'x')
- Для
i = 1
: получаем ('b', 'y')
- Для
i = 2
: получаем ('c', 'z')
- Для
i = 3
: строка S1 не имеет элемента, поэтому получаем (None, '1')
- Для
i = 4
: строка S1 тоже не имеет элемента, получаем (None, '2')
- Для
i = 5
: строка S1 снова не имеет элемента, получаем (None, '3')