Python'u kendi dili olarak benzersiz kılan bazı özellikler nelerdir? [kapalı]


12

Python'u kendi dili olarak benzersiz kılan bazı özellikler nelerdir? İyiden kötüye, yararlıdan engellemeye, sözdiziminden gerçek dünya kullanımına kadar her türlü özelliği arıyorum, ancak belirsiz olmayan gözlemler ortalama geliştirici için en yararlı olacaktır.

Burada yeniyim, bu yüzden sezgisel şeylerin açıklanması gerekebilir .....


9
Python benzersiz değildir, başka bir dilde görülmeyen tek bir benzersiz özellik içermez.
SK-logic

10
Monty Python'dan sonra adını bildiğim tek dil ...
yannis

@ SK-mantığı soru, özelliklerin bir alt küme olduğu özellikler hakkındadır . Python'a özgü hiçbir özellik yok mu?
kojiro

@kojiro, "karakteristik" in resmi bir tanımını hiç görmedim, bu yüzden tahmin etmemeyi tercih ederim.
SK-logic

1
@kojiro, PL özellikleri normalde hem sözdizimi hem de anlambilimi olarak anlaşılır. Her ikisi de resmen tanımlanmıştır.
SK-logic

Yanıtlar:


22

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).
  • yieldbu 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 properynesneye 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).

Ruby'de hala biraz yeniyim ama sanırım son nokta dışında her şeyi vuruyor? Her iki şekilde de kabul ediyorum "benzersiz" muhtemelen Python'da bulunmaz, ancak "diğer diller arasında yaygın değildir" olabilir.
Rig

@Rig: Ben Ruby uzmanı değilim, ama ne metasınıflar (Ruby'nin metaprogramlama konusunda kesinlikle o kadar güçlü olduğunu gördüm ve benzer amaçlarla kullanabilirim, ama izlenimim farklı elde edildiğiydi) ne de jeneratörler ne de jeneratör ifadeleri (coroutines var gibi görünüyor) veya Ruby'de yinelenebilir açma (çok hedefli atama var) veya tanımlayıcılar yok. Evet, Ruby ve Python çakışıyor. Ama farklılıklar var .

İyi +1. Bana göre, "steroidler üzerinde atama" aslında "zavallı adamın desen eşleşmesi" dir, ancak yine de inanılmaz derecede faydalıdır :) Ayrıca parametrelerin fonksiyonlarda geçişinin ne kadar esnek olduğunu fark ediyorum: *argsve **kwargs, tuples ve dikteleri parametrelere eşlemenin ağrısız yolu, vb. .
9000

Ben CLOS ile ortak lisp düzeni tabanlı sözdizimi kullanımı dışında tüm noktaları vuruyor inanıyorum. Haskell nesne yönelimli değildir (OO uzantıları olmasına rağmen) ancak metasınıf noktası dışında tüm bu özelliklerle eşleştiğine inanıyorum.
Jules

3

Python'u benzersiz kılan tek şey, ortaya koyduğu özelliklerin belirli bir kombinasyonu olduğunu düşünüyorum. Bu, çoğu programlama dili için geçerli olacaktır.

Ya da küçük bir şey olabilir: Python'un selfbaşka bir dilde yapılan nesne üye işlevlerine açıkça resmi bir parametre olarak geçme biçimini görmedim . Bu küçük bir şey ve bunun gerçekten bir şeyi nasıl değiştirdiğini görmüyorum.

Ama Python'da çok akıcı değilim, bu yüzden kesinlikle eksik olduğum şeyler olabilir!


@delnan: Ah, "açıkça resmi bir parametre olarak kendini geçmeyi" kaçırdım . Sanırım saat 2'de okumak için aldığım şey bu;)
Demian Brecht

4
Açık benlik Oberon, fwiw'de de görülür
grrussel

Ortak lisp nesne sisteminde açık bir self parametresi de kullanılır. Bununla birlikte, CLOS çoklu yöntemler sağlar, yani self parametresi python'da olduğu gibi herhangi bir şekilde özel değildir.
Jules

1

Docstringlerin sahiplerinin mülkiyeti haline gelmesi için otomatik olarak işlenmesi. Genel olarak Python'un tüm parlak içgözlem özellikleri onu help () kullanma yeteneğinden __doc__bir nesnenin birinci sınıf özelliği olarak kullanma yeteneğine kadar çok benzersiz bir dildir . Örneğin:

>>> class DocStringException(Exception):
...     """Error message is the same as docstring"""
...     def __str__(self):
...         return repr(self.__doc__)
... 
>>> class ExampleException(DocStringException):
...     """An example happened"""
... 
>>> raise ExampleException
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.ExampleException: 'An example happened'

Diğer kullanışlı içgözlem özellikleri:

  • help / help () - tercümanla yardım / bir nesneyle yardım
  • anahtar kelimeler - python anahtar kelimeleri
  • locals () - yerel adları al
  • globals () - global isimleri edinin
  • dir () - bir nesnenin özelliklerini ve yöntemlerini alır
  • .mro yöntemi. , issubclass - mirasın anlaşılması
  • id () - bir nesnenin bellek adresini alır

Ruby, Common Lisp, Clojure ve inandığım diğer birçok dinamik dilde olduğu gibi hemen hemen aynı güce sahiptir.
Torbjørn

@ Torbjørn hangi güç? Otomatik belgeler mi, içgözlem özellikleri mi?
kojiro

İkisini de düşünüyordum. Tam olarak söylemek değil, ruh olarak. Ruby'nin aynı belge yeteneklerine sahip olduğuna inanmıyorum, ama kesinlikle içgözlem. CL ve Clojure'un her iki özelliği de var - ve buradaki içgözlemin, Python'da bulacağınız şeyin çok ötesine geçtiğine inanıyorum, çünkü homoiconic .
Torbjørn

1
  1. Generator Expressions
  2. input()Açıklamama izin verin, bir şey (şimdiye kadar) görmedim, burada bir şey basan bir ifadeye bir değer atayabilirsiniz, bu yakut gibidir print/gets, ancak bunun yerine baskıya atanmış bir değerle:print "Foo" bar = gets
  3. yield
  4. Birçok veri kümesi türü: ordereddict, namedtuple, array, list, tuple, dictionary

Jeneratör ifadeleri Haskell'de liste kavrayışları kullanılarak uygulanabilir (Haskell listeleri tembeldir, python listelerinin aksine, bunun için özel bir sözdizimi gerekmez). "Girdi" ile bu adın python 3 işlevini kastettiğini varsayıyorum (python 2 işlevi tehlikeli ve kullanılmamalıdır). Bunun alışılmadık bir davranış kombinasyonu olduğu doğrudur (javascript - window.prompt - ve python'un ödünç aldığını tahmin ettiğim BASIC'de mevcut olmasına rağmen), ancak programcı tarafından önemsiz bir şekilde uygulanabilir ("input s = putStrLn s >> getStrLn "haskell için yapacak).
Jules

Haskell gibi tembel bir dilin gerçekten verime ihtiyacı yoktur - sadece normal yöntemler kullanılarak oluşturulmuş bir liste döndürebilir ve talep üzerine öğeler üretilir. Buna rağmen, kütüphane ortak programların açıkça uygulanmasını içerir. Haskell standart kütüphanesi, bahsedilen tüm veri yapılarını ve daha fazlasını içerir.
Jules

-2

Mesele şu ki, Python son derece düşük sözdizimsel yükü ile çok az sayıda ifade arasındadır ve muazzam etkileyici güçler verir: list / set / dict anlama, verim, dekoratörler, eval, meta sınıfı programlama, introspection, optimize edilmiş dahili veri yapıları (listeler, tüm bu şeyler size (geliştirici) düşüncelerinizi neredeyse düşündüğünüz kadar kısa ve özlü bir kodla ifade etme gücü vermek için çok güzel bir şekilde komplo kuruyor. Bu katil özelliklerin bir araya gelmesiyle gerçekten başka bir dil düşünemiyorum.


1
Python'un düşük sözdizimsel yüküne sahip olduğunu düşünüyorsanız (oldukça karmaşık bir dilbilgisi ve nispeten büyük miktarda sözdizimi şekeri olmasına rağmen), Şema hakkında ne düşünüyorsunuz?
Tikhon Jelvis

Eval gerçekten herhangi bir üretim programı için kullanılmamalıdır (hızlı kesmek için kullanışlı olabilmesine rağmen). Diğer soruların yorumlarında gösterildiği gibi, python hiçbir şekilde bu özelliklere sahip değildir. Örneğin, clojure'un listelediğiniz tüm özelliklere sahip olduğuna ve çoğunun ortak lisp ile yapılabileceğine inanıyorum.
Jules

-4

İfadeleri, ifadeleri ve döngüleri içine almak için kullanıldığını söyleyebilirim. Başka bir dilde görmedim.

Bence bu çok kullanışlı çünkü python kodunu gizlemeyi çok daha zorlaştırıyor!

Ayrıca, fonksiyonlar hariç, düzgün bir şekilde satır satır yürütülüyor gibi görünüyor ve bu da güzel olarak yorumlanabilir.


2
Wikipedia, bunu yapan dillerle dolu bir ekran da biliyor. Buna off-side kuralı denir .

3
Anlamıyorum Ayrıca fonksiyonlar hariç düzgün bir şekilde satır satır yürütmek gibi görünüyor ve bu da güzel olarak yorumlanabilir. Bu ne demek?
kojiro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.