A maioria maneira Pythonic equivalente para: while (! (X = next ()) = END)

votos
9

Qual é a melhor linguagem Python para esta construção C?

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

Eu não tenho a capacidade de recodificar next ().

update: e a resposta do parece ser:

for x in iter(next, END):
    ....
Publicado 26/08/2008 em 17:37
fonte usuário
Em outras línguas...                            


7 respostas

votos
14

A resposta de @ Mark Harrison:

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

Aqui está um trecho da documentação do Python :

iter(o[, sentinel])

Retornar um objeto iterador. ... (snip) ... Se o segundo argumento, sentinelé dado, em seguida, odeve ser um objeto que pode ser chamado. O iterador criado neste caso irá chamar o sem argumentos para cada chamada para o seu next()método; se o valor retornado é igual sentinel, StopIterationserá levantada, caso contrário, o valor será devolvido.

Respondeu 09/01/2009 em 00:06
fonte usuário

votos
5

Depende um pouco o que você quer fazer. Para combinar com seu exemplo, tanto quanto possível, gostaria de fazer ao lado de um gerador e iterar sobre ele:

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

for x in next():
   print x
Respondeu 26/08/2008 em 17:44
fonte usuário

votos
4

Resposta curta: não há nenhuma maneira de fazer atribuição de variável em linha em um loop while em Python. O que significa que eu não posso dizer:

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

Desde que não é possível, há uma série de maneiras "idiomaticamente corretas" de fazer isso:

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

Obviamente, este é tipo de feio. Você também pode usar uma das abordagens "iteradoras" listados acima, mas, mais uma vez, que pode não ser ideal. Finalmente, você pode usar a abordagem "pita bolso" que eu realmente só encontrei enquanto googling:

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

Agora você pode fazer:

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

Obrigado por esta pergunta; aprender sobre o __call__idioma foi muito legal! :)

EDIT: Eu gostaria de dar crédito onde o crédito é devido. Idioma O 'bolso pita' foi encontrado aqui

Respondeu 26/08/2008 em 18:50
fonte usuário

votos
2

Talvez não seja terrivelmente idiomática, mas eu estaria inclinado a ir com

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

... mas isso é porque acho que esse tipo de coisa fácil de ler

Respondeu 26/08/2008 em 17:42
fonte usuário

votos
1

Você pode fornecer mais informações sobre o que você está tentando realizar? Não é claro para mim por que você não pode simplesmente dizer

for x in everything():
    ...

e têm a função de tudo devolver tudo, em vez de escrever uma próxima função para retornar apenas uma coisa de cada vez. Geradores mesmo pode fazer isso de forma bastante eficiente.

Respondeu 26/08/2008 em 19:18
fonte usuário

votos
1

Se você precisa fazer isso mais de uma vez, a maneira Python usaria um iterador

for x in iternext():
    do_something_with_x

onde iternextseriam definidas usando algo como ( explícita é melhor do que implícito! ):

def iternext():
    x = next()
    while x != END:
        yield x
        x = next()        
Respondeu 26/08/2008 em 17:49
fonte usuário

votos
1

O que você está tentando fazer aqui? Se você está interagindo sobre uma lista, você pode usar for e in Londe e é o elemento e L é a lista. Se você está filtrando uma lista, você pode usar compreensões lista (ou seja, [ e for e in L if e % 2 == 0 ]para obter todos os números pares em uma lista).

Respondeu 26/08/2008 em 17:42
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more