Kesinlikle benzersiz olan özellikleri bulmakta zorlanacaksınız . Varolan dil özelliklerinin çoğu, kuruluşundan bu yana birden fazla dilde benimsenmiştir. Bazıları daha nadir olabilir, çünkü çoğunlukla ya yeni ve hala belirsizdirler ya da iyi bir nedenle öldüler. Yine de, o zaman bile özellik kombinasyonlarına bakmaktan daha iyi olur.
Bununla birlikte, Python'un çeşitli özelliklerinin nispeten benzersiz bir kombinasyon oluşturması gerekir. En azından çakışan bir özellik seti ile uzaktan popüler (ve pratik) olarak herhangi bir dilin farkında değilim. Yorumlarda belirtildiği gibi, Ruby oldukça yakın, ancak yine de çok sayıda farklılık var.
- Metaclass tabanlı metaprogramlama. Temel olarak, sınıf oluşturmada arbitary kodu çalıştırmak. Alınan uç üzerinde çok az çalışma ile çok güzel bir sınıf özelleştirmesi yapar - örneğin bir Nesne İlişkisel Haritalama (ORM) için, istemci sınıfları her zamanki gibi birkaç ekstra satırla yazılabilir ve otomatik olarak bir ton kod üretilir. Bunun bir örneği Django'nun "modelleri" dir .
attr = SomeDataType()
- Sen için yineleyicileri kullanmaya teşvik ediyoruz her şeyi . Bu özellikle, yineleyici tabanlı bir eşdeğeri olan çoğu liste tabanlı alternatifin ikincisi lehine kaldırıldığı 3.x'te açıkça görülmektedir. Yineleyiciler ayrıca koleksiyonlar için neredeyse evrensel bir arayüz görevi görürler (hem aslında bellekte olanlar hem de sadece bir kez ihtiyacınız olan ve böylece aşağıdaki özelliklerle oluşturduğunuz). Toplama-agnostik, alan etkili (
O(1)
ara sonuçlar için alan genellikle doğal olarak takip edilir, çok az görev aslında bellekteki tüm öğelere aynı anda ihtiyaç duyar), birleştirilebilir veri sıkışması hiç bu kadar kolay olmamıştı.
- Yukarıdakilerle ilgili jeneratör ifadeleri. Birçoğu liste kavrayışlarını duymuş olacak (başka bir yinelenebilir listeden bir liste oluşturma, süreçte filtreleme ve haritalama, çok uygun sözdizimi ile). Unut onları, sözdizimsel şeker, özel bir durum. Jeneratör ifadeleri sözdizimsel olarak çok yakındır ve nihayetinde aynı öğe dizisine neden olur, ancak tembel olarak sonuçlar üretir (ve
O(1)
sonuçları net bir şekilde tutmadıkça alan kaplar).
yield
bu da yazım yineleyicileri (burada jeneratörler olarak adlandırılır) çok daha hoş hale getirir. Yukarıdakilerin ağabeyleri, her türlü kontrol akışını destekliyorlar. C #, aynı anahtar kelimeye benzer bir şeye sahiptir. Ancak yield
, yine de, zor problemler üzerinde çalışan zeki insanlar tarafından iyi bir şekilde kullanılmaya başlanan sınırlı bir tür koroutini (örneğin, Lua daha ayrıntılı bir desteğe sahiptir) desteklemek için aşırı yüklenmiştir. Başımın üstünden iki örnek: Geri çekme ve yığın sınırı ve eşzamansız I / O (uygun sözdizimi ile) ile özyinelemeli iniş ayrıştırma .
- Çok hedefli atama ve tekrarlanabilir açma. Steroid atama. Sadece aynı anda birden fazla değere
for key, value in mapping.items()
atamakla kalmaz ( değerleri değiştirmek ve yinelemek için bile - ), bilinen uzunluktaki herhangi bir yinelemeyi (dürüst olmak gerekirse, çoğunlukla tuples) çoklu değişkenlere açabilirsiniz. Birkaç değişkenler tek ürünleri ve kalan ne olursa olsun bir alma alarak belirleyebilir olarak 3.x beri bilinmeyen uzunluktaki koleksiyonları için bile pratik: first, *everything_in_between, last = values
.
- Tanımlayıcılar , muhtemelen özellik erişimini özelleştirmenin çeşitli yolları arasında en güçlü olanıdır. Tanımlayıcı olarak uygulanan özellikler (C # 'da olduğu gibi, ancak özel dil desteği olmadan), statik yöntemler, sınıf yöntemleri vb. Vardır. Onlar da birinci sınıf nesneler. Sadece bir hafta önce, özelliklerde tekrarlayan ve zor kodlarla karşı karşıya kaldım - bu yüzden tekrarlayan kısmı üreten ve bir
propery
nesneye sarılan küçük bir fonksiyon yazdım .
- Tamamen ofsayt kural (blokları sınırlamak için girinti). Bunu son kasıtlı olarak koydum. Python'u ayırt etse de, alıştıktan sonra günlük programlarda gerçekten göze çarpmıyor (veya en azından bu benim deneyimim).