Pythonic kodunu yazmayı nasıl öğrenebilirim?


46

"Pythonic" için bir google araması yapmak, çok çeşitli yorumlar ortaya çıkarmaktadır. Wikipedia sayfası diyor ki:

Python topluluğundaki yaygın bir neolojizm, program stili ile ilgili geniş bir anlam aralığına sahip olabilen pitoniktir. Kodun pythonic olduğunu söylemek, Python deyimlerini iyi kullandığını, doğal olduğunu veya dilde akıcılık gösterdiğini söylemektir. Benzer şekilde, bir pitonik olduğu bir arayüz veya dil özelliği demek, Python deyimlerle iyi çalıştığını, kullanımının dilin geri kalanı ile iyi örtüldüğünü söylemektir.

Aynı zamanda "unpythonic" terimini tartışıyor:

Bunun aksine, bir unpythonic kodun işareti, Python'da C ++ (veya Lisp, Perl veya Java) kodunu yazmayı denemesidir; yani, başka bir dilden formların deyimsel çevirisi yerine kaba bir transkripsiyon sağlar. Pythonicity kavramı Python'un minimalist okunabilirlik felsefesine sıkı sıkıya bağlıdır ve "bunu yapmanın birden fazla yolu" yaklaşımından kaçınır. Okunamayan kod veya anlaşılmaz deyimler unpythonic.

"Pythonic" terimi ne anlama geliyor? Uygulamada etkili bir şekilde uygulamayı nasıl öğrenebilirim?


6
Sorunuzun herhangi bir programlama diline genişletilebileceğini düşünüyorum. Çok sayıda durumda doğru olabilecek ve revizyon, okunabilirlik ve bakımı iyileştirmek için her zaman önerilen bir programlama yolu vardır. Bence bu önerilere meydan okumak, bir dili geliştirip ilerletebilir ...
Amine

@ Mine çok doğru. Aslında bence dil deyimlerinin tam olarak nerede öğrenileceğini içeren bir topluluk wiki - tüm diller için - dikkate alınmalı.
yati sagade


1
Yorum yapanlar: Lütfen alakasız yorum göndermeyi bırakın; bir nedenden dolayı silindiler. Bir cevabınız varsa, cevap olarak bırakın. Bu sorunun konusunu görüşmek istiyorsanız, lütfen sohbeti kullanın .

1
Python'u uygulayarak!
Dinamik

Yanıtlar:


22

Çoğu insanın "Pythonic" olmanın gerçekte ne anlama geldiğine dair kendi yorumları olduğunu gördüm. Wikipedia'dan:

Python topluluğundaki yaygın bir neolojizm, program stili ile ilgili geniş bir anlam aralığına sahip olabilen pitoniktir. Kodun pythonic olduğunu söylemek, Python deyimlerini iyi kullandığını, doğal olduğunu veya dilde akıcılık gösterdiğini söylemektir. Benzer şekilde, bir pitonik olduğu bir arayüz veya dil özelliği demek, Python deyimlerle iyi çalıştığını, kullanımının dilin geri kalanı ile iyi örtüldüğünü söylemektir.

Bunun aksine, bir unpythonic kodun işareti, Python'da C ++ (veya Lisp, Perl veya Java) kodunu yazmayı denemesidir; yani, başka bir dilden formların deyimsel çevirisi yerine kaba bir transkripsiyon sağlar. Pythonicity kavramı Python'un minimalist okunabilirlik felsefesine sıkı sıkıya bağlıdır ve "bunu yapmanın birden fazla yolu" yaklaşımından kaçınır. Okunamayan kod veya anlaşılmaz deyimler unpythonic.

Daha fazla, daha fazla "pythonic" örneklerinin aslında Python deyimlerle zeki olmaya çalışan (ve yine de değil) kodlarını neredeyse okunamayan ( Pythonic olmayan) hale getiren insanlardan kaynaklandığını buldum.

Python'un deyimlerine sadık kaldığınız ve Python'da C ++ (veya diğer dil) stillerini kullanmaktan kaçındığınız sürece, o zaman Pythonic olursunuz.

WorldEngineer tarafından belirtildiği gibi, PEP8'in izlenmesi iyi bir standarttır (ve VIM kullanıyorsanız, PEP8 astarı için mevcut eklentiler vardır).


Gerçekten de, günün sonunda, çözümünüz işe yararsa ve kesinlikle korkunç bir şekilde sürdürülemez ve yavaş değilse, kimin umrunda? Yapmamaktan çok, işiniz bir işi yapmak, mümkün olan en şık, piton kodunu yazmak değil.


Başka bir not (sadece benim görüşüme göre, bu yüzden aşağı oy vermekten çekinmeyin;)): Python topluluğunu bir ton ego ile doldurulduğunu da tespit ettim (çoğu toplulukta olmadığı için değil , sadece biraz daha yaygın C ve Python gibi topluluklarda). Dolayısıyla, egonun "pitonik" olmanın yanlış yorumlanmış yorumlarıyla birleştirilmesi, çok sayıda temelsiz olumsuzluk yaratma eğiliminde olacaktır. Diğerlerinden okuduklarını bir tuz taneleri ile al. Resmi standartlara ve belgelere uyun ve iyi olacaksınız.


2
Güzel bir cevap için +1 (OP’de kullandığımdan beri alıntı hariç).

Ugh .. Shoulda alıntı yapmadan önce OP'yi tekrar okudu: P
Demian Brecht

3
Aksine, ego ile çevrimiçi olmak arasında herhangi bir toplulukta görüşlerini dile getiren yüksek bir korelasyon var . Temel olarak egoist olmayan insanları pek görmüyorsunuz, çünkü o kadar fazla yazmıyorlar.
isarandi

17

Pythonic, Python'da deyimsel olarak kodlamaktır. Python için programlama açısından, aynı zamanda topluluk okuma açısından da işe yarayan yapıları ve biçimlendirmeleri kullanmak demektir. K&R'nin C programlama stili için uzun süre standart belirlediği gibi. Bu kılavuz , Python'da deyimsel olarak kodlamanız gerektiğini gösterir. PEP 8 bu rehberde referans olarak verilmiştir, bu yüzden muhtemelen okumaya değer.


1
@MattFenwick Programlamanın yaklaşık olarak% 90'ı bu değil mi? İyi programcılar kod okumak için çok fazla zaman harcarlar ve kalan sürede çok fazla kod yazarlar. Pythonic kodu ne kadar çok okursanız ve Python'da ne kadar çok yazarsanız, kodunuz o kadar Pythonic olacaktır. Burada herhangi bir kısayol olduğunu sanmıyorum.
Kris Harper,

2
Mükemmel bağlantı!
Ethan Furman,

13

"Pythonic" kodunu yazmak IMHO, dilin sağladığı (V) HLL özelliklerini etkili bir şekilde kullanıyor. Her yerde bir örnek olarak,

x, y = 7, 'fuhrer'

Bu çok Pythonic. Sadece Python aylarca sonra C # öğrenmeye başladığımı hatırlıyorum.

int x, y = 10, z;

her nasılsa kafam karıştı ama benim C / C ++ köklerime geri dönmem bir dakika sürdü.

Başka bir Pythonic yolu da lambda kullanıyor.

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

aslında lazalan sırayla sıralanmış yazdırır .

Sonra çok kullanılan, ancak çok az anlaşılan "ördek yazarak" var - Bir ördek gibi yürür ve konuşursa, bir ördek gibi davranırsınız. Bu, diğer OO dillerindeki arayüzlerle gevşek bir şekilde ilgilidir.

Ayrıca, harita kullanımı ve azaltma gibi uygulanabilir olduğunda fonksiyonel programlama yöntemlerinin kullanılması pitonik olarak kabul edilir.

Yazarken yazılan bir cevabı gördüm ve hoş bir bağlantı içeriyordu. Not: Python hakkındaki bilgileriniz sınırlı değil. Bahse girerim Python'un ilk diliniz olmadığını ve bu nedenle (çoğumuz pythonistas gibi) yılanla "aptalca" olmayı öğrenmeniz gerekecek! Şerefe!


Bağlantıyı daha önce yazdığım gibi eklememiştim - WorldEngineer'in cevabı :) Siz ve başkalarının iyiliği için dil özelliklerini "kullanmayı" düşünün ve yolda Pythonic'i elde edin. o bağlantı
yati sagade

4
Aslında, birçok anlaşmazlık olduğunu map, reduce, lambdave bu tür se başına deyimsel bulunmaktadır. Liste anlama ve üreteç ifadesi bir alternatiftir ve birçoğu makul olarak mümkün olduğunda onları tercih eder (özellikle de bir lambdaya ihtiyacınız olduğunda daha az gürültülüdür). Kesinlikle kendi kullanımları vardır ve diğer deyimlerdeki işlevsel programlama şovları (örneğin, dekoratör).

@delnan kabul etti - ve hatta daha böylece 3. Sonuç fonksiyonel özellikler kullanılması gerektiğini olup Python gelince tam gerektiğinde. Ve (Bunu yapmanın tek bir açık yolu var) deyimsel :)
yati sagade

Şahsen, ilk örneğiniz için insanların tercihlerini hiç anlamadım. Bu (hangisi zihinsel ayrıştırma çok daha kolaydır olduğunu Python Zen, kod daha sık yazılır daha okunur): (x, y) = (7, 'fuhrer')- Henüz neredeyse her zaman Pars olmadan yazmak için en iyi yol olduğuna "düzeltilmiş" ediyorum!
Izkata

2
Özel sıralama örneğinizin pitonik olmadığını savunuyorum. print(sorted(l, reverse=True))Okuyucunun ne olup bittiğini açıkça söyleyen, eğer yapabiliyorsanız , neden bir lambda ile yeniden düzenlemeyi yeniden başlatıyorsunuz ? İlk örneğinizi de tartışmalı bulabilirim. Bire sıkıştırılmış iki ödev; Sorun değil, ama ben çok Pythonic demezdim. Okuyucular iki ödev yapmaktan çok daha uzun süre bakmak zorundalar.
phresnel

7
--> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Pythonic kodu:

  • Okunabilir
  • Basit (mümkün olduğunca basit, ancak daha basit değil)
  • İyi düşünülmüş

1
+1. Python'un Zen'i, piton kodunu yazmak için bir deyimler listesini izlemekten daha önemlidir; ikincisi tüm koşulları kapsamaz.
Doval

6

Ne zaman yeni bir dil öğrenmeye çalıştım, ellerinin arkası gibi dili bilen insanlar tarafından okuma kodu, garip görünen bir şey ararken / sorduktan sonra stillerini taklit etmeye çalışıyorum. yapılacak en iyi şey. Örnekler:

Python'da konuya girdiğimizden beri, Dive Into Python'dan örnekleri başlamak için inanılmaz derecede faydalı buldum . Sadece Python'un temellerini öğretmekle kalmıyor, aynı zamanda deyimsel Python'u da gerçekten vurgulıyorlar .

D öğrenirken, belgeler o zamanlar mükemmeldi çünkü belgeler o kadar mükemmeldi ki, kodu standart kütüphaneye, özellikle Andrei Alexandrescu'nun başyapıtlarından bazılarına okuyarak öğrendim .

C ++ öğrenirken çok iyi bir C ++ programlayıcısından bir kod temeli aldım ve idiomatik C ++ programlaması hakkında STL kapsayıcılarını referans olarak geçirme konusundaki ısrarından çok şey öğrendim.

Her dilde, StackOverflow sorularına göz atmanın, dille ilgili sorulara göz atmanın ve insanların temel işleri başarmak için genellikle neler yaptıklarına bakmanın yardımcı olduğunu biliyorum.


+1 Bir dilin temellerini öğrendikten sonra, kod okumak kitap okumaktan çok daha fazla yardımcı olacaktır.
Pace

3

Python Java değil , size bazı yararlı tavsiyeler verebilir. Ne tür meselelere maruz kaldığınızı bilmeden daha fazlasını söyleyemem, ancak programcıların başka bir dilden (özellikle java'da) java'yı programlamanın farklı bir şekilde nasıl yapılacağına dair temel önerileridir.


2

Birisi, Pythonic'in ne olduğunu öğrenmek için, parantezde bulunmaktan bahsetti. Buna katılmıyorum. Çok yoğun bir kod yazmayı seviyorsanız, bu daha Pythonic yapmaz.

Pythonic'in neye benzediğini tanımlamanıza yardım etmenin bir yolu, kendi kendinize "Python dilini neden (benimle ifade edeyim ki?") Diye sorun. Bu konuda size ne çekici geliyor?

Benim için okunabilirlik ve derleme ve açık kaynak eksikliği (hemen hemen hepsi). Tonlarca kütüphaneyi yükleyebilir ve diğer birçok dilde lisanslama konusunda daha az stresli kaynak kodunu okuyabilirim.

Bana göre Python görsel olarak güzel. Guido (Python'un yaratıcısı) da bana, PEPS ve tartışmalardaki cevaplarıyla cevap verirken, dili nasıl yapacağı konusundaki seçimlerinin nasıl yaratılması gerektiğine dair kendi fikirlerimden daha üstün olduğunu kanıtlamaya devam ediyor.

Bana göre harika bir programcı, kodlama yaparken hangi yöne gideceğiniz konusunda çok bilinçli karar verme becerisine sahip bir kişi. Bana göre Python bu seçimleri hızlıca yapmamıza yardımcı oluyor.

Açık kodlu tür döküm yerine ördek yazmaya izin vererek kaynak kod sözdizimini basitleştirerek ve kodunuzu inceleyen kodlayıcıların "iyi kodlanmış kodlayıcılar olması gerektiği" beklentisini "Pythonic" dediğim bir şeye götürür.

Yani Pythonic olanın iki yüzü var. Biri sözdizimsel, diğeri ise pratiktir. "Pythonic" ın daha derin tarafını nasıl açıklayabilirim?

Python'da bunu yapmak önemli değil: alist = ['bir', 'iki', 'üç \ n'] alist.append ((1234, 'Atuple'))

ve demet, nesne türleri için endişelenmeden listeye eklenecektir. Pythonic kısmı bunu yapabileceğinizi değil, kodunuzun BEKLENMESİ gerektiği ve sadece çalışması / uyarlanması gerektiğidir.

-Alist nesnesi üzerinde ne işe yararsa, başka bir kodlayıcının girebileceği ve listeye dize olmayan bir ip ekleyebileceği ve yeni kodlayıcı tarafından kaynak koduna adapte edilmesinin zor olmadığı düşüncesiyle yazılmalıdır. Ne de olsa ördek türünün yararı bu.


-2

Önerilen bir kitap alın. Oku onu. Size dili kullanma konusunda ve topluluk stilini karşılaması gereken bir mekanizmada iyi bir temel vermelidir.

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.