De fleste Pytonske måte tilsvarende for: while (! (X = next ()) = END)

stemmer
9

Hva er den beste Python idiom for C konstruere?

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

Jeg har ikke muligheten til å recode neste ().

oppdatering: og svaret fra synes å være:

for x in iter(next, END):
    ....
Publisert på 26/08/2008 klokken 16:37
kilden bruker
På andre språk...                            


7 svar

stemmer
14

@Mark Harrison svar:

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

Her er et utdrag fra Python dokumentasjon :

iter(o[, sentinel])

Returnere en iterator objekt. ... (snip) ... Dersom den andre argumentet, sentinel, er gitt, da omå være et kallbart objekt. Iteratoren opprettet i dette tilfellet vil ringe o uten argumenter for hver samtale til sin next()metode; Hvis verdien returneres er lik sentinel, StopIterationvil bli hevet, ellers vil verdien bli returnert.

Svarte 08/01/2009 kl. 23:06
kilden bruker

stemmer
5

Det avhenger litt hva du vil gjøre. For å matche ditt eksempel så langt som mulig, vil jeg gjøre neste en generator og iterere over det:

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

for x in next():
   print x
Svarte 26/08/2008 kl. 16:44
kilden bruker

stemmer
4

Kort svar: det er ingen måte å gjøre inline variabel oppdrag på en stund sløyfe i Python. Noe som betyr at jeg ikke kan si:

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

Siden det ikke er mulig, er det en rekke "idiomatisk riktige" måter å gjøre dette på:

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

Dette er selvsagt litt stygg. Du kan også bruke en av de "iteratorknapper" tilnærminger som er nevnt ovenfor, men igjen, det kan ikke være ideelt. Til slutt kan du bruke "pita pocket" tilnærming som jeg faktisk bare funnet mens 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

Nå kan du gjøre:

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

Takk for dette spørsmålet; lære om __call__idiom var kult! :)

EDIT: Jeg vil gjerne gi kreditt der kreditt skyldes. The 'pita lomme' idiom ble funnet her

Svarte 26/08/2008 kl. 17:50
kilden bruker

stemmer
2

Kanskje det er ikke veldig idiomatisk, men jeg vil være tilbøyelig til å gå med

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

... men det er fordi jeg synes den slags ting lett å lese

Svarte 26/08/2008 kl. 16:42
kilden bruker

stemmer
1

Kan du gi mer informasjon om hva du prøver å oppnå? Det er ikke klart for meg hvorfor du ikke kan bare si

for x in everything():
    ...

og har alt funksjon tilbake alt, i stedet for å skrive en neste funksjon å bare returnere en ting om gangen. Generatorer kan selv gjøre dette ganske effektivt.

Svarte 26/08/2008 kl. 18:18
kilden bruker

stemmer
1

Hvis du trenger å gjøre dette mer enn én gang, ville Pytonske måte bruke en iterator

for x in iternext():
    do_something_with_x

der iternextville bli definert bruke noe sånt ( eksplisitt er bedre enn implisitt! ):

def iternext():
    x = next()
    while x != END:
        yield x
        x = next()        
Svarte 26/08/2008 kl. 16:49
kilden bruker

stemmer
1

Hva er det du prøver å gjøre her? Hvis du gjentar over en liste, kan du bruke for e in Lder e er element og L er listen. Hvis du filtrerer en liste, kan du bruke liste oppfattelser (dvs. [ e for e in L if e % 2 == 0 ]å få alle partall i en liste).

Svarte 26/08/2008 kl. 16:42
kilden bruker

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