SORU
20 Temmuz 2011, ÇARŞAMBA


Özyinelemeli bir işlev verim

Belirli bir yolun altındaki tüm dosyaları için bir şeyler yapmaya çalışıyorum. Önceden sonra onlarla bir şeyler yapmak, tüm dosya isimleri toplamak istemiyorum, bu yüzden denemedim:

import os
import stat

def explore(p):
  s = ''
  list = os.listdir(p)
  for a in list:
    path = p   '/'   a
    stat_info = os.lstat(path )
    if stat.S_ISDIR(stat_info.st_mode):
     explore(path)
    else:
      yield path

if __name__ == "__main__":
  for x in explore('.'):
    print '-->', x

Ama bu kodu kendi içeriğini oluşturan yerine onları vurduğunda dizinleri üzerinden atlar. Neyi yanlış yapıyorum?

CEVAP
20 Temmuz 2011, ÇARŞAMBA


Kullanımına bu şekilde özyinelemeli olarak çalışmıyor. Yeniden verim için her sonuç, değiştirerek

explore(path)

gibi bir şey ile

for value in explore(path):
    yield value

Python 3.3 sözdizimi bu amaca hizmet etmek için PEP 380, önerilen 7 ** ekledi. Bunu yerine bunu yapabilirsiniz:

yield from explore(path)

Eğer generators as coroutines kullanıyorsanız bu sözdizimi de generator.send() kullanımı değerleri yinelemeli olarak geri çağrılan jeneratörler içine geçmesini destekler. for basit döngü yukarıda olmaz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Best Quality Cartoons

    Best Quality

    10 ŞUBAT 2014
  • REK Roth Productions

    REK Roth Pro

    8 Ocak 2011
  • STITCHLESS TV how to sew your own style tutorials

    STITCHLESS T

    9 HAZİRAN 2011