En Pythonic yolu eşdeğeri: süre (! (x = ()) sonraki = END)

oy
9

Bu C yapı için en iyi Python deyim nedir?

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

I) (sonraki recode yeteneğine sahip değildir.

güncelleme: ve gelen cevabı gibi görünüyor:

for x in iter(next, END):
    ....
Oluştur 26/08/2008 saat 17:37
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
2

Belki de korkunç deyimsel değil, ama ben gitmek eğimli duyarım

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

... ama kolay okunur bu tür bir şey bulmak bunun nedeni

Cevap 26/08/2008 saat 17:42
kaynak kullanıcı

oy
1

Burada ne yapmaya çalışıyorsun? Eğer bir liste üzerinde yineleme ediyorsanız kullanabilirsiniz for e in Le elemanı ve L listesi burada. Bir liste filtreliyorsanız, sen liste türetimi kullanabilirsiniz (yani [ e for e in L if e % 2 == 0 ]bir listedeki tüm bile numaralarını almak için).

Cevap 26/08/2008 saat 17:42
kaynak kullanıcı

oy
5

Size ne yapmak istediğinize biraz bağlıdır. mümkün olduğunca sizin örneğine uygun için önümüzdeki bir jeneratör yapmak ve üzerinde yineleme olacaktır:

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

for x in next():
   print x
Cevap 26/08/2008 saat 17:44
kaynak kullanıcı

oy
1

Eğer bir defadan çok yapmak gerekirse, pythonic yolu bir yineleyici kullanmak istiyorsunuz

for x in iternext():
    do_something_with_x

nerede iternextböyle bir şey kullanılarak tanımlanır olacaktır ( açık örtük daha iyidir! ):

def iternext():
    x = next()
    while x != END:
        yield x
        x = next()        
Cevap 26/08/2008 saat 17:49
kaynak kullanıcı

oy
4

Kısa cevap: Python bir süre döngüde satır içi değişken atama yapmak için hiçbir yolu yoktur. Bunu Anlamı olamaz ki:

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

Bu mümkün olmadığı için, bunu yapmanın "deyimsel doğru" birçok yolu vardır:

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

Açıkçası, bu tür çirkin. Ayrıca İdeal olmayabilir, yine, yukarıda listelenen "yineleyici" yaklaşımlardan birini kullanabilirsiniz, ancak. Son olarak, ben aslında sadece googling ederken buldum "pide cebi" yaklaşımı kullanabilirsiniz:

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

Şimdi yapabilirsiniz:

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

Bu soru için teşekkür ederiz; öğrenmeye __call__deyim gerçekten harikaydı! :)

DÜZENLEME: Kredi vadesi nerede kredi vermek istiyorum. 'Pide cebi' deyim bulunmuştur burada

Cevap 26/08/2008 saat 18:50
kaynak kullanıcı

oy
1

Eğer başarmaya çalıştığını şeyle ilgili daha fazla bilgi verebilir misiniz? Sadece diyemeyiz neden benim için açık değil

for x in everything():
    ...

ve her şey işlevi yerine bir seferde bir şey dönmek için bir sonraki fonksiyonu yazma, herşeyi dönmek var. Jeneratörler bile oldukça verimli yapabilirsiniz.

Cevap 26/08/2008 saat 19:18
kaynak kullanıcı

oy
14

@ Mark Harrison'ın cevap:

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

İşte bir alıntı var Python'un belgelerinde :

iter(o[, sentinel])

Bir yineleyici nesne döndürür. ... (kirt) ... İkinci argüman, varsa sentinelverilir, daha sonra obir çağrılabilir nesnesi olmalıdır. Arayacak Bu durumda oluşturulan yineleyici o onun için her çağrı için hiçbir argümanlarla next()yöntemle; döndürülen değeri eşit ise sentinel, StopIterationyükseltilmiş olacaktır, aksi takdirde değer iade edilir.

Cevap 09/01/2009 saat 00:06
kaynak kullanıcı

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