daaar
Можете объяснить что делает вот такая конструкция?
Разложи её просто на несколько конструкций
1.
next((i for i, d_s
in enumerate(new_asks)
if d_s.dollars >= price), None)
2.
next((i for i, d_s in enumerate(new_asks) if d_s.dollars >= price), None)
3.
next(x, None)
x = (i for i, d_s in enumerate(new_asks) if d_s.dollars >= price)
Как работает функция next()
>>> help(next)
next(...)
next(iterator[, default])
Return the next item from the iterator. If default is given and the iterator
is exhausted, it is returned instead of raising StopIteration.
Как работает функция enumerate()
>>> help(enumerate)
class enumerate(object)
| enumerate(iterable[, start]) -> iterator for index, value of iterable
|
| Return an enumerate object. iterable must be another object that supports
| iteration. The enumerate object yields pairs containing a count (from
| start, which defaults to zero) and a value yielded by the iterable argument.
| enumerate is useful for obtaining an indexed list:
| (0, seq[0]), (1, seq[1]), (2, seq[2]), ...
daaar
Или же эта конструкция ищет первое вхождение элемента удовлетворяющее условию?
Эта конструкция создаёт генератор. Генератор - это такая конструкция, которая для получения следующего элемента производит какие-то вычисления (не хранит все элементы в памяти). Соответственно, функция next() используется для того, чтобы сказать генератору “дай мне следующий свой элемент, если он есть”. При этом когда ты только создал генератор, ни один элемент из него не взят - просто сам генератор построен и ждёт, когда из него будут элементы брать один за другим.
Пример генератора
>>> def g():
... yield 1
... yield 2
... yield 3
...
>>> gen = g() # генератор только построился, элементы не взяты никакие
>>>
>>> next(gen) # первый элемент взяли, второй - наготове
1
>>> next(gen) # второй элемент взяли, третий - наготове
2
>>> next(gen) # третий элемент взяли, генератор пуст
3
>>>
>>> next(gen) # четвёртый элемент пытаемся взять, генератор говорит "нету"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
>>> next(gen, 'nothing') # генератор говорит 'nothing' вместо "нету"
'nothing'
>>>
Чтобы это всё знать, тебе нужно книжку по питону прочитать.