SORU
22 Ocak 2011, CUMARTESİ


Ruby öğrenme Python; Farklar ve Benzerlikler

Ben Ruby çok iyi biliyor. Python halen öğrenmeye ihtiyacım olabilir inanıyoruz. Hem bilenler için, kavramlar farklı ne iki ve arasında benzer?

Aradığım bir listesi benzer bir astar yazdım Learning Lua for JavaScripters: basit şeyler gibi boşluk önemi ve döngü yapıları; adı nil Python, ve ne değerleri kabul "truthy"; bu deyimsel kullanım eşdeğeri map each yamumble_somethingaboutlistcomprehensions_mumblenorm?

Eğer cevap iyi bir çeşitlilik alırsam toplumun bir wiki içine onları toplamak için mutluyum. Yoksa hepinizi ve birbirinden tek gerçek kapsamlı bir listesini oluşturmak için denemek için mücadele beşik.

Edit: Açıkça söylemek gerekirse, amacım" ve Python. deyimsel "uygun. Eğer bir Python eşdeğeri inject ama kimse kullanır, çünkü orada daha iyi/farklı bir şekilde elde etmek için ortak işlevselliği yineleme listesi ve birikmesi sonucu yol boyunca, bilmek istiyorum nasıl yaptığın şeyler. Belki Ruby onlara ulaşmak ne kadar ortak hedefler listesi ile bu soru güncelleme, ve eşdeğer Python ne olduğunu soracağım.

CEVAP
22 Ocak 2011, CUMARTESİ


Burada bana bazı önemli farklılıklar

  1. Yakut blokları vardır; Python değil.

  2. Python fonksiyonları vardır; Ruby değil. Python, herhangi bir işlev veya yöntem alıp başka bir işleve geçirebilirsiniz. Ruby, her şeyin bir yöntemi ve yöntemleri doğrudan geçirilebilir. Bunun yerine, Proc. onları geçmek için sarın.

  3. Ruby ve Python kilitler destek, ama farklı şekillerde. Python, başka bir işlev içinde bir işlev tanımlayabilirsiniz. İç dış işlev işlev değişkenleri için okuma erişimi vardır, ama yazma erişimi yok. Ruby, kilitler blokları kullanarak tanımlayın. Bu kapaklar tam okudun ve dış kapsam değişkenleri için yazma erişimi.

  4. Python oldukça etkileyici olan liste üreteçleri vardır. Eğer sayıları bir liste varsa, örneğin, yazabilirsiniz

    [x*x for x in values if x > 15]
    

    tüm kareleri yeni bir liste elde etmek için değerleri 15 daha büyük. Ruby, aşağıdaki sen yazmak zorundasın:

    values.select {|v| v > 15}.map {|v| v * v}
    

    Ruby kod olarak kompakt gelmiyor. Ayrıca önce kısa bir ara dizi değerleri 15'den daha fazla içeren değerler dizisine dönüştürür beri o kadar verimli değil. Sonra, Ara dizi alır ve son bir dizi Ara kareler içeren oluşturur. Ara dizi sonra dışarı atılır. Ruby bellek 3 diziler ile işlem yaparken biter; Python sadece giriş listesi ve sonuç listesi ihtiyacı var.

    Python da benzer göster kapsam sağlar.

  5. Python dizilerini destekler; Ruby değil. Ruby, dizilerini taklit diziler kullanmak zorunda.

  6. Ruby/case ifadeleri anahtarını destekler; Python değil.

  7. Ruby expr ? val1 : val2 üçlü standart operatör destekler; Python değil.

  8. Ruby sadece tek bir miras destekler. Eğer birden çok devralma taklit etmek gerekiyorsa, modülleri tanımlamak ve mix-ins sınıflara modülü yöntemlerden çekmek için kullanabilirsiniz. Python modülü mix-ins ziyade çoklu kalıtımı destekler.

  9. Python destekler tek tek satırlı lambda fonksiyonları. Biraz lambda fonksiyonları/tür olan yakut blokları, keyfi büyük olabilir. Bu nedenle, Ruby kod genellikle Python kodu daha işlevsel bir şekilde yazılmış. Örneğin, Ruby listesinde döngü için genellikle

    collection.each do |value|
      ...
    end
    

    Bloğu çok fazla bir fonksiyon gibi collection.each geçirilen çalışır. Eğer Python ile aynı şeyi yapmak olsaydı, adlı bir iç işlev tanımlamak ve toplama her yöntem eğer liste bu yöntem destekleniyorsa) için geçirin olurdu:

    def some_operation(value):
      ...
    
    collection.each(some_operation)
    

    Çok güzel kafiyeli değil. Bu yüzden, genellikle işlevsel olmayan aşağıdaki yaklaşım Python kullanılacaktır:

    for value in collection:
      ...
    
  10. Güvenli bir şekilde kaynakları kullanarak iki dil arasında oldukça farklıdır. Burada, sorun istediğiniz için tahsis bazı kaynak (open bir dosya, bir veritabanı elde imleç, vb.) gerçekleştirmek, gaddar bir işlem, ve sonra kapatın güvenli bir şekilde olsa bile, bir özel durum oluşur.

    Blok kullanımı çok kolay, çünkü Ruby, #9 (), genellikle keyfi işlem kaynak gerçekleştirmek için bir blok götüren bir yöntem olarak bu model kodu.

    Python, keyfi eylem için bir işlevi geçerken adında, iç işlev (bkz: #9) yazmak zorunda beri biraz clunkier. Bunun yerine, Python güvenli kaynak için with ifadesi işleme kullanır. Daha fazla ayrıntı için How do I correctly clean up a Python object? bkz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • Chanre Joubert

    Chanre Joube

    27 Temmuz 2012
  • Elefant Traks

    Elefant Trak

    5 HAZİRAN 2007