SORU
23 EYLÜL 2010, PERŞEMBE


Python bir yineleyici Perl sürümü nedir?

Benim iş yerinde Perl öğrenme ve keyfini çıkarıyorum. Ben genellikle Python ben de işimi yapmak ama patron Perl istiyor.

Python ve Perl maç güzel: kavramlar en=Perl hash;=Perl listesi;=dizi Perl Python listesi Python demet; Python sözlük vb.

Soru: Iterator / Jeneratör Python formu Perl sürümü var mı?

Fibonacci sayıları oluşturmak için Klasik Bir Python yoludur: . bir örnek:

#!/usr/bin/python

def fibonacci(mag):
     a, b = 0, 1
     while a<=10**mag:
         yield a
         a, b = b, a b

for number in fibonacci(15):  
     print "d" % number

Kullanımına gerekirse çok daha büyük bir liste bir alt bölüm oluşturmak istiyorsanız da yararlıdır. 'Listeler' daha fazla statik - Python bir demet gibi görünüyor. Perl Perl, foreach dinamik ya da durağan bir listesi dayanır?

Python formu Yineleyici bir form var kazanılmış kullanılan, ve ben bulmak belgelenen Perl... Diğer daha yazma bu döngüler veya ardışık ya da üreten büyük bir statik liste, nasıl yapmak I (eski) yazma Fibonacci yordam içinde Perl? Kaçırdığım bir Perl yield var mı?

Özellikle ... nasıl yazayım:

#!/usr/bin/perl
use warnings; use strict; # yes -- i use those!

sub fibonacci {
   # What goes here other than returning an array or list? 
}

foreach my $number (fibonacci(15)) { print $number . "\n"; }

Acemi için nezaketiniz için şimdiden teşekkür ederim...

CEVAP
23 EYLÜL 2010, PERŞEMBE


Python jeneratörler daha esnek bir çözüm için, rasgele erişim tembel jeneratör diziler sağlayan modül List::Gen CPAN üzerine yazdım:

use List::Gen;

my $fib; $fib = cache gen {$_ < 2  ? $_ : $$fib[$_ - 1]   $$fib[$_ - 2]};

say "@$fib[0 .. 15]";  #  0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610

Jeneratörler diziler gibi bu yana, sorunsuz bir şekilde normal perl kodu ile karıştırın. Ayrıca nesne yönelimli bir yaklaşımdır

my $fib; $fib = cache gen {$_ < 2 ? $_ : $fib->get($_ - 1)   $fib->get($_ - 2)};

say join ' ' => $fib->slice(0 .. 15);

Her durumda, jeneratör tembel, yaratılış üzerine bir şey hesaplamak, ve sonra sadece bu değerleri dilimleri karşılamak için gerekli hesaplama. Fibonacci dizisi özyinelemeli tanımı kendisi birçok kez çağrılar, cache işlevi her değer sadece bir kez hesaplanır emin olmak için kullanılır.

Ayrıca yineleyicisi olarak jeneratörler kullanabilirsiniz

while (my $num = $fib->next) {
    last if $num > 10**15;
    print "$_\n";
}

$fib->next $fib->() yazılabilir. Jeneratör hala random access olduğundan, 17 ** veya $fib->index = 10;

Eğer herhangi bir sorunuz varsa bana bildirin.

Güncelleme:

Daha kolay jeneratörler yinelemeli algoritmalar kullanmak için yapar modülü (0.80) yeni bir sürümünü yayımladı. Burada yakından OP örneğini yansıtan bir örnek:

use List::Gen '*';

sub fibonacci {
    my $limit   = 10**shift;
    my ($x, $y) = (0, 1);

    While {$_ < $limit} gather {
        ($x, $y) = ($y, take($x)   $y)
    }
}

say for @{fibonacci 15};

veya alt üst etmeden önce 20 ** eğer, tabii ki olabilir:

say for @{fibonacci 400}; # or more

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David Tedeyev

    David Tedeye

    20 AĞUSTOS 2011
  • Dylan Dubay

    Dylan Dubay

    10 Temmuz 2013
  • WoodysGamertag

    WoodysGamert

    17 Aralık 2009