Найти - Пользователи
Полная версия: next и сложное присваивание в одном из его параметров
Начало » Python для новичков » next и сложное присваивание в одном из его параметров
1
daaar
Можете объяснить что делает вот такая конструкция? Как я понял она пробегает по d_s и ищет индекс последнего элемента который удовлетворяет условию d_s.dollars >= price, а функция next должна вернуть следующий после него? Или же эта конструкция ищет первое вхождение элемента удовлетворяющее условию?
 index1: Optional[int] = next((i for i, d_s
    in enumerate(new_asks)
    if d_s.dollars >= price), None)
doza_and
Формально ничего она не делает так как приведенный фрагмент синтаксически некорректен. И уж тем более недостаточен для запуска.

Скорее всего первый.
py.user.next
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'
>>>

Чтобы это всё знать, тебе нужно книжку по питону прочитать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB