TGViewer
Channel Public Channel
Python: задачки и вопросы

Python: задачки и вопросы

@quiz_python

Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

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

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

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

Другие наши проекты: https://tprg.ru/media
Subscribers
6.91K
Photos
1.4K
Videos
1
Links
126

Showing posts older than #3665 · Back to latest

Older Posts 20 shown
Post #3663 1.1K
#ловушка
Post #3662 1.25K
Генераторные выражения вместо построения результирующего списка в памяти возвращают объект генератора — автоматически созданный итерируемый объект. В свою очередь этот итерируемый объект поддерживает протокол итерации, чтобы выдавать по одной порции результирующего списка за раз в любом итерационном контексте.

Итерируемый объект также сохраняет состояние генератора, пока он действует — переменную х в предшествующих выражениях наряду с местоположением в коде генератора. Мы получаем обратно объект, который запоминает оставленное им место после возвращения каждой части результата:


G = (х ** 2 for х in range (4))
next(G) is G # 0
next(G) is G # 1
next(G) is G # 4
next(G) is G # 9
next(G) is G # Остановка итерации


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


for num in (х ** 2 for х in range (4)): # Автоматически вызывает next ()
print (’%s, %s’ % (num, num / 2.0))


Так поступает каждый итерационный контекст: циклы for, встроенные функции sum, map и sorted, списковые включения и другие итерационные контексты, в том числе встроенные функции any, all и list. Будучи итерируемыми объектами, генераторные выражения могут появляться в любом итерационном контексте подобного рода в точности как результат вызова генераторной функции.
Post #3659 1.32K
В задаче используется генератор, и происходит разбивка строки по запятой.

1. Разбивка строки:


"ааа,bbb,ссс".split(",") # ["ааа", "bbb", "ссс"]


Этот метод разбивает строку на список строк по разделителю.

2. Генератор:


(х + "\n" for х in ...)


Здесь создается генератор, который перебирает каждую строку из полученного списка ["ааа", "bbb", "ссс"] и добавляет к каждой строке символ новой строки "\n":

— Для х = "ааа" будет "ааа\n"
— х = "bbb" будет "bbb\n"
— Для х = "ссс" будет "ссс\n"

3. Распаковка значений:


а, b, с = (х + "\n" for х in "ааа,bbb,ссс".split(","))


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

— а получит значение "ааа\n"
— b получит значение "bbb\n"
— с получит значение "ссс\n"
Post #3657 1.17K
#размяться
Post #3656 1.27K
Понятия итерируемых объектов и списковых включений были объединены в инструмент — генераторные выражения. Синтаксически они похожи на нормальные списковые включения и поддерживают весь их синтаксис, в том числе фильтры if и вложение циклов, но они помещаются в круглые скобки, а не в квадратные (подобно кортежам объемлющие круглые скобки часто необязательны):


>>> (х ** 2 for х in range(4)) # Генераторное выражение создает итерируемый объект
... <generator object <genexpr> at 0x10250ab50>


Для принудительного вырабатывания всех результатов сразу можно использовать list():


>>> list(x ** 2 for х in range(4))
... [О, 1, 4, 9]
Post #3654 1.14K
#размяться
Post #3653 4.01K
1. Создание генератора:


G = gen()


В этой строке создается объект генератора G, но код внутри функции gen() не начинает выполняться, пока не будет вызван next(G).

2. Первый вызов next(G):


print(next(G)) # 0


Когда вы вызываете next(G) в первый раз, генератор начинает выполнение с начала функции gen(). Внутри функции запускается цикл for и выполняется первая итерация, где i становится равным 0. Затем происходит yield i, что означает, что значение 0 возвращается, и генератор приостанавливается. Значение 0 выводится на экран.

3. Второй вызов next(G):


print(next(G)) # None 1


Теперь, когда вы вызываете next(G) во второй раз, генератор продолжает выполнение с той точки, где он был приостановлен (после yield). В этот момент выполнение доходит до X = yield i, и так как вызывается next(G) без передачи аргумента, X будет установлено в значение None. Затем срабатывает print(X), и выводится None.

Затем генератор продолжает выполнение, и значение X становится равным 1.
Post #3651 4.19K
#ловушка
Post #3650 1.26K
Эта задача — логическое продолжение предыдущей. Мы имеем дело с генераторной функцией.

Значения отправляются генератору G путем вызова G.send(значение). Затем код генератора возобновляет выполнение, и выражение yield в генераторе возвращает значение, переданное send. Если вызывается обычный метод G.__next_() (или его эквивалент next(G)) для продвижения вперед, тогда yield просто возвращает None.


>>> next(G) # Сначала должен вызываться next(), чтобы запустить генератор
... 0
>>> G.send(77)
... 77
... 1
Post #3647 1.16K
#ловушка
Post #3646 1.27K
Генератор — это специальная функция, которая возвращает итератор, с помощью которого можно обойти некоторую последовательность значений.

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


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

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


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

Формально yield теперь имеет форму не оператора, а выражения, которое возвращает
элемент, переданный next.
Post #3644 1.22K
#размяться
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →