Сведения о вопросе

NOTtoday

10:32, 6th August, 2020

Теги

c   python    

Наиболее подходящие для Python способ эквивалентны: а ((х = next()) != КОНЕЦ)

Просмотров: 441   Ответов: 7

Какая лучшая идиома Python для этой конструкции C?

while ((x = next()) != END) {
    ....
}

У меня нет возможности перекодировать next().

обновление: и ответ от, кажется, будет:

for x in iter(next, END):
    ....



  Сведения об ответе

$DOLLAR

21:06, 1st October, 2020

@Mark ответ Харрисона:

for x in iter(next_, END):
    ....

Вот выдержка из документации Python :

iter(o[, sentinel])

Возвращает объект итератора. ... (надрез). .. Если задан второй аргумент, sentinel, то o должно быть вызываемый объект. Итератор созданный в этом случае вызовет o без аргументов для каждого вызова его next() метод; если значение возвращается равно sentinel , StopIteration будет поднят, в противном случае значение будет возвращено.


  Сведения об ответе

9090

22:15, 11th August, 2020

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

def next():
   for num in range(10):
      yield num

for x in next():
   print x


  Сведения об ответе

COOL

06:23, 11th August, 2020

Короткий ответ: нет никакого способа выполнить встроенное назначение переменной в цикле while в Python. Это значит, что я не могу сказать:

while x=next():
    // do something here!

Поскольку это невозможно, существует ряд "idiomatically correct" способов сделать это:

while 1:
    x = next()
    if x != END:
        // Blah
    else:
        break

Очевидно, это некрасиво. Вы также можете использовать один из "iterator" подходов, перечисленных выше, но, опять же, это не может быть идеальным. Наконец, вы можете использовать подход "pita pocket", который я только что нашел во время поиска в Google:

class Pita( object ):
    __slots__ = ('pocket',)
    marker = object()
    def __init__(self, v=marker):
        if v is not self.marker:
            self.pocket = v
    def __call__(self, v=marker):
        if v is not self.marker:
            self.pocket = v
        return self.pocket

Теперь вы можете сделать:

p = Pita()
while p( next() ) != END:
    // do stuff with p.pocket!

Спасибо за этот вопрос; изучение идиомы __call__ было действительно круто! :)

EDIT: я хотел бы дать кредит, где кредит должен быть. Идиома 'pita pocket' была найдена здесь


  Сведения об ответе

9090

15:57, 6th August, 2020

Может быть, это не очень идиоматично, но я был бы склонен пойти с

x = next()
while x != END:
    do_something_with_x
    x = next()
...

но это потому что я нахожу такие вещи легко читаемыми


  Сведения об ответе

padenie

01:31, 3rd August, 2020

Что ты пытаешься здесь сделать? Если вы повторяете список, вы можете использовать for e in L , где e-элемент, а L-список. Если вы фильтруете список, вы можете использовать понимание списка (т. е. [ e for e in L if e % 2 == 0 ] , чтобы получить все четные числа в списке).


  Сведения об ответе

ITSME

15:56, 13th August, 2020

Если вам нужно сделать это несколько раз, питонический способ будет использовать итератор

for x in iternext():
    do_something_with_x

где iternext будет определено с помощью чего-то вроде (явное лучше, чем неявное! ):

def iternext():
    x = next()
    while x != END:
        yield x
        x = next()        


  Сведения об ответе

P_S_S

12:45, 27th August, 2020

Можете ли вы предоставить дополнительную информацию о том, что вы пытаетесь сделать? Мне непонятно, почему ты не можешь просто сказать

for x in everything():
    ...

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться