Python ilerleme yolu - Çıraktan guruya


659

Bir buçuk yıldır Python ile öğreniyor, çalışıyorum ve oynuyorum. Bir biyolog yavaşça biyo-bilişime yönelirken, bu dil laboratuarda yaptığım tüm önemli katkıların merkezinde yer aldı. Python'un güzel çözümleri ifade etmeme izin verdiği yönteme az çok aşık oldum ve aynı zamanda düşüncelerden uygulanabilir koda kadar böyle doğal bir akış sağlayan dilin anlambilimine de aşık oldum.

Bilmek istediğim şey, bu forumlarda veya diğer forumlarda nadiren gördüğüm bir tür soruya verdiğiniz yanıt. Bu soru benim için Python iyileştirme yolunda olan ama sonraki adımlarının ne olacağını merak eden herkes için merkezi görünüyor.

İlk önce sormak istemediğim şeyi özetleyeyim;)

  • Python'u HIZLI öğrenmeyi bilmek istemiyorum
  • Dil ile tanışmanın en iyi yolunu da bulmak istemiyorum
  • Son olarak, 'hepsini yapan bir numara' yaklaşımı bilmek istemiyorum.

Ne hakkında görüşlerinizi bilmek istiyorum:

Çıraklıktan guru statüsüne (uzmanlığınızın belirlediği her yerde durmaktan çekinmeyin), bir PSThon yolculuğuna, her seferinde bir adım daha iyi ve daha iyi bir Python kodlayıcı olmak için SİZE AÇACAK adımlar nelerdir? SO'daki bazı insanlar neredeyse Python yetenekleri için ibadete layık görünüyor, lütfen bizi aydınlatın :)

Zevk alacağım cevaplar (ama okuyucuyu şaşırtmaktan çekinmeyin: P), şu şekilde biçimlendirilir:

  • Bunu okuyun (örneğin: python eğitimi), bu tür ayrıntılara dikkat edin
  • Pek çok zaman / problem / kod satırı için kod
  • Sonra bunu okuyun (örneğin: şu veya bu kitap), ancak bu sefer buna dikkat edin
  • Birkaç gerçek yaşam sorunuyla başa çıkın
  • Ardından, Y okumaya devam edin.
  • Bu kavramları anladığınızdan emin olun
  • X zamanı için kod
  • Böyle ve bu temellere geri dönün veya ...
  • (anladım :)

SADECE (elbette gerekli çabalarla) ilerlemek için çeşitli aşamalarda tam olarak nelere dikkat edilmesi gerektiğine dair fikrinizi bilmeyi gerçekten önemsiyorum. Belirli bir uzmanlık alanından geliyorsanız, bu alanda uygun gördüğünüz yolu tartışın.

EDIT: Mükemmel girdiniz sayesinde, Python iyileştirme yolunda geri döndüm! Ben gerçekten takdir ediyorum!

Yanıtlar:


471

Python ustalık sürecinin şöyle bir şey olduğunu düşündüm:

  1. Liste kavrayışlarını keşfedin
  2. Jeneratörleri keşfedin
  3. Birleştirin haritası, filtre, iter, aralık, xrange azaltmak için koduna sıklıkla
  4. Dekoratörleri Keşfet
  5. Özyinelemeli fonksiyonlar yaz
  6. Discover itertools ve functools
  7. Oku Real World Haskell ( ücretsiz çevrimiçi okuyun )
  8. Tüm eski Python kodunuzu tonlarca üst düzey işlev, özyineleme ve başka bir şeyle yeniden yazmayın.
  9. Hücre arkadaşlarınızı size bir Python sınıfı sunduklarında kızdırın. Bir sözlük ve bazı fonksiyonlar olarak "daha iyi" uygulanabilir iddia. Fonksiyonel programlamayı kucaklayın.
  10. Yeniden Keşfedin Strateji desen ve sonra tüm bu şeyler zorunlu koddan Eğer Haskell sonra unutmak için çok uğraştım.
  11. Bir denge bulun.

@wheaties Süper güzel bir liste, love it! İşlevsel programlamaya karşı önyargınız var ve nesne yönelimli olmaktan uzak ... özel bir neden var mı? Haskell deneyimi sizi bu yaklaşıma yönlendirdi mi?
Morlock

8
Evet ve hayır. Fonksiyonel programlamaya yaklaştıkça daha iyi ve daha kısa kod yazdığımı fark ettim. Bununla birlikte, şeylerin zorunlu olarak daha açık bir şekilde ifade edildiği birçok yer var. Real World Haskell'in Python sözleşmelerinde satılmasının bir nedeni var, bu sizi daha iyi bir programcı yapıyor. Benim tavsiyem, Python'un olabildiğince çok yönünü keşfedin, sonra işlevsel bir dil deneyin.
vahşiler

@wheaties, hem istenen biçime daha yakın hem de çok ilham verici olduğu için yanıtı alır. Yanıtlamak için zaman ayırdığınız için teşekkür ederiz!
Morlock

1
Yeni Başlayanlar: Sözlük sonra sonra ... Ustalık: Metaprogramming
gath

>> üzerinde daha iyi bir sözlük artı bazı fonksiyonlar uygulanabilir daha ayrıntılı olabilir. <<?
Koobz

108

Python bilginizi ilerletmenin iyi bir yolu , zaten kullandığınız kitaplıkların, platformların ve çerçevelerin kaynak kodunu incelemektir.

Örneğin, Django'da bir site oluşturuyorsanız, güdük olabilecek birçok soru , Django'nun söz konusu özelliği nasıl uyguladığına bakarak cevaplanabilir.

Bu şekilde yeni deyimler, kodlama stilleri ve Python hileleri almaya devam edeceksiniz . (Bazıları iyi, bazıları kötü olacak.)

Ve kaynakta anlamadığınız bir şey gördüğünüzde , #python IRC kanalına atlayın ve açıklamaktan mutluluk duyacağınız birçok "dil avukatı" bulacaksınız.

Yıllar boyunca bu küçük açıklamaların birikmesi, dilin ve tüm dillerinin ve çıktılarının çok daha derin bir şekilde anlaşılmasına yol açar.


1
Buna sadece bir django uzantısı / eklentisi yüklemek yerine, bir git dalını kullanarak kodu manuel olarak eklemeyi deneyin. Bu , projeye eklediğiniz kodu gerçekten okumaya zorlar .
g33kz0r

14
Merak ediyorum neden geri kalanımız Sorudan yararlanabilirse IRC'yi kullanmalıyım ?
tshepang

1
+1 "deyimler, stiller ve püf noktaları" için. Temas halindeki gerçek kişiler tarafından yapılan gerçek bir KÜLTÜR yaşamak (bu temas çoğunlukla bu durumda birbirlerinin kodunu okumak anlamına gelse bile) insan bilgisini zamanla EVRİM haline getiren şeydir.
heltonbiker

92

Python'un veri türlerini ve bellek yönetimi ile ilgili rollerini (daha derinden) anlama

Topluluktaki bazılarınızın farkında olduğu gibi, en popüler olanları kapsamlı Giriş + Orta Düzey dersi ve çeşitli uygulama geliştirme alanlarını tanıtan "ileri" bir ders olan Python kursları öğretiyorum .

Oldukça sık, "Giriş ya da ileri kursunuzu almalı mıyım? Python'u 1-2 yıldır zaten programlıyorum ve bence giriş benim için çok basit. gelişmiş ... Tabii hangi doğrudan atlama gibi sen tavsiye?"

Sorularını cevaplamak için, bu alanda ne kadar güçlü olduklarını görmeyi araştırıyorum - herhangi bir ileri kursa hazır olup olmadıklarını ölçmenin en iyi yolu değil, ancak temel bilgilerinin Python'un nesnelerine ve hafıza modeli, sadece yeni başlayanlar değil, bunun ötesine geçenlerin yazdığı birçok Python hatasının sebebidir .

Bunu yapmak için, bu basit 2 bölümlü sınav sorusuna işaret ediyorum: Ör 1: x = 42;  y = x;  x + = 1;  baskı x, y Ör2: x = [1,2,3]; y = x; x [0] = 4; x yazdır, y

Birçok kez, çıktı elde edebiliyoruz, ama neden bir yanıttan daha zor ve çok daha önemli ... Çıktının cevabının% 20'si olarak tartılırken, "neden"% 80 kredi alır. Nedenini alamazlarsa, Python deneyimine nasıl sahip olurlarsa olsunlar, insanları her zaman kapsamlı giriş + orta kursa yönlendireceğim çünkü nesneler ve bellek yönetimi üzerine bir dersi cevaplayabileceğiniz noktaya kadar harcıyorum çıktı ve neden yeterli güvenle. (Python'un 1-2 yıl sonra sözdizimini bildiğiniz için, Python'un kapakların altında nasıl çalıştığı konusunda daha iyi bir anlayışa sahip olana kadar sizi bir "başlangıç" etiketinin ötesine geçmeye hazır hale getirmez.)

Benzer bir cevap gerektiren başarılı bir soruşturma daha da zordur, ör.

ÖRNEK 3

x = ['foo', [1,2,3], 10.4]
y = list(x) # or x[:]
y[0] = 'fooooooo'
y[1][0] = 4
print x
print y

Tavsiye ettiğim bir sonraki konu referans sayımını iyi anlamak, "stajyerlik" in ne anlama geldiğini öğrenmek (ancak mutlaka kullanmak zorunda değil), sığ ve derin kopyalar hakkında bilgi edinmek (yukarıdaki Örnek 3'teki gibi) ve son olarak çeşitli türler ve dilde yapılar, yani listeler, tuples, diktler, kümeler, liste kavrayışları, jeneratör ifadeleri, yineleyiciler ve jeneratörler, vb .; ancak diğer tüm öneriler başka bir zaman için başka bir gönderi. Umarım bu arada yardımcı olur! :-)

ps. İçgözlemle daha yakınlaşmanın yanı sıra diğer projelerin kaynak kodlarını incelemek için diğer yanıtlara katılıyorum ve her iki öneriye de güçlü bir "+1" ekliyorum!

pps. Büyük soru BTW. Keşke başlangıçta böyle bir şey soracak kadar zeki olsaydım, ama bu uzun zaman önceydi ve şimdi uzun yıllar tam zamanlı Python programlamamda başkalarına yardım etmeye çalışıyorum !!


Wesley Chun! Morlock, bu senin sorunun cesur bölümünde bahsettiğin türden bir adam. Çok yetenekli bir öğretmen olan derinden bilgili bir adam, kitaptan büyük bir destek aldım.
monte edilmemiş

thx @bvmou! Bu soruyu ancak herkes gibi öğrenme sürecinden geçmek zorunda kaldım çünkü sadece benimki 13 yıl önceydi! :-) corepython.com tho takmak için teşekkürler ! :-)
wescpy

@wescpy Bana örneğin 3 çıktısını açıklayabilir veya bu şeyleri öğrenmek için iyi bir kaynağa yönlendirebilir misiniz?
Sankalp

1
İşin püf noktası, nesnelerin kendilerinin değil, yalnızca nesne referanslarının kopyalanmasıdır. Hepsi bu kadar ... umarım yardımcı olur! Birkaç hafta önce bu konuda OSCON'da bir konuşma yaptım. Birisi bana konferansta en yüksek puan Python konuşma olduğunu söylediğinde hoş bir sürpriz oldu! Slaytları buradan indirebilirsiniz: oscon.com/oscon2013/public/schedule/detail/29374
wescpy

Çıktı SyntaxError: geçersiz sözdizimi, değil mi? Neden? Çünkü Python 3'ü kullandım ve printbir ifade değil.
Konrad Borowski


59

İçgözlemi Anlayın

  • dir()eşdeğer bir yazı yaz
  • type()eşdeğer bir yazı yaz
  • nasıl "maymun-yama" bulmak
  • disçeşitli dil yapılarının nasıl çalıştığını görmek için modülü kullanın

Bunları yapmak

  • python'un nasıl uygulandığı hakkında bazı iyi teorik bilgiler vermek
  • daha düşük seviyeli programlama konusunda size iyi bir pratik deneyim sunar
  • python veri yapıları için iyi bir sezgisel his verir

1
type()Eğer tam bir metaclassy spec alırsanız çok zor olurdu "eşdeğer yazın " type!
asmeurer

48
def apprentice():
  read(diveintopython)
  experiment(interpreter)
  read(python_tutorial)
  experiment(interpreter, modules/files)
  watch(pycon)

def master():
  refer(python-essential-reference)
  refer(PEPs/language reference)
  experiment()
  read(good_python_code) # Eg. twisted, other libraries
  write(basic_library)   # reinvent wheel and compare to existing wheels
  if have_interesting_ideas:
     give_talk(pycon)

def guru():
  pass # Not qualified to comment. Fix the GIL perhaps?

4
guru () geçmelidir. hiçbir şey guru tanımlayabilir, bu geçmesine izin
inv

1
Eğer GIL düzeltmek o zaman ben bir de o düzeyde koyar düşündüğünüzden daha yüksek gurusu daha, ama sadece hayırsever diktatör altında. ;)
Adam Parkin

41

Sana en basit ve en etkili tavsiyeyi vereceğim, sanırım herkes sana verebilir: kod .

Yalnızca bir dili (anlama anlamına gelir) kullanarak kodlama ile daha iyi olabilirsiniz . Kodlamadan aktif olarak zevk almalı, ilham almalı, sorular sormalı ve cevapları kendiniz bulmalısınız.

Yedeklemek için bir saatin var mı? Bir dizeyi tersine çevirecek kodu yazın ve en uygun çözümü bulun. Ücretsiz bir akşam mı? Neden bazı web kazımalarını denemiyorsunuz? Diğer insanların kodlarını okuyun. Nasıl yaptıklarını görün. Kendinize ne yapacağınızı sorun.

Bilgisayarımda sıkıldığımda IDE ve kod fırtınasını açıyorum. Kulağa ilginç ve zor gelen fikirleri not ediyorum. URL kısaltıcı mı? Tabii, bunu yapabilirim. Oh, yan etki olarak sayıları bir tabandan diğerine dönüştürmeyi öğrendim!

Bu, beceri seviyeniz ne olursa olsun geçerlidir. Öğrenmeyi asla bırakmazsın. Boş zamanlarınızı aktif olarak kodlayarak, az çaba ile dili anlamaya ve sonuçta bir guru olacaksınız. Bilgi ve yeniden kullanılabilir kod oluşturacak ve deyimleri ezberleyeceksiniz.


24

Bilim için python kullanıyorsanız ve kullanıyorsanız (ki öyle görünüyorsunuz) bunun bir kısmı bilimsel kütüphaneleri öğrenmek ve anlamak olacaktır, benim için bunlar

  • dizi
  • scipy
  • matplotlib
  • Mayavi / mlab
  • chaco
  • Cython

doğru kütüphaneleri nasıl kullanacağınızı ve kodunuzu nasıl vektör edeceğinizi bilmek bilimsel bilgi işlem için çok önemlidir.

Büyük sayısal veri kümelerinin ortak pythonic yollarla (nesne yönelimli yaklaşımlar, listeler, yineleyiciler) işlenmesinin son derece verimsiz olabileceğini eklemek istedim. Bilimsel hesaplamada, kodunuzu, en geleneksel python kodlayıcılarının verilere yaklaşımından önemli ölçüde farklı şekillerde yapılandırmanız gerekebilir.


Teşekkürler. Büyük veri kümeleri için bellek kullanımında verimlilik elde etmek için numpy ve scipy öğrenmek kesinlikle zaman almaya değer!
Morlock

1
Muhtemelen listeye pandalar ve IPython ekleyin.
Eric Wilson



12

Tüm Veri Türlerini ve Yapılarını Kapsamlı Anlayın

Her tür ve yapı için, türün veya veri yapısının her yönünü kullanan bir dizi demo programı yazın. Bunu yaparsanız, her birine not yazmanız faydalı olabilir ... birçok insan için yararlı olabilir!


Bu sadece Python'da değil, aynı zamanda soyut anlamda da yararlı olacaktır.
Humphrey Bogart

1
Bu da yaptığım bir şey, ne zaman yeni bir yapı bulduğumda, nasıl kullanılacağını gösteren bir oyuncak programı yazıyorum. Ve bir github repo çevrimiçi koymak: github.com/pzelnip/MiscPython
Adam Parkin

10

Sadece bir yaz boyunca python sadece python sitesinde öğretici yaparak öğrendim (ne yazık ki, artık bulamıyorum görünmüyor, bu yüzden bir bağlantı gönderemiyorum).

Daha sonra python bana üniversitedeki ilk yıl derslerimden birinde öğretildi. Takip eden yaz aylarında, PythonChallenge ve Google Code Jam'in sorunları ile pratik yaptım . Bu sorunları çözmek, algoritmik bir bakış açısının yanı sıra Python'un neler yapabileceğini öğrenme ve bunun yanı sıra python'dan en iyi şekilde yararlanmak için nasıl manipüle edileceği bakış açısından da yardımcı olur.

Benzer nedenlerle, kod golf de işe yaradığını duydum , ama kendim için hiç denemedim.


3
Bu öğretici mi demek istiyorsun? Python 2: docs.python.org/tutorial/index.html ; Python 3: docs.python.org/py3k/tutorial/index.html .
Humphrey Bogart

10

Öğrenme algoritmaları / matematik / dosya IO / Pitonik optimizasyon

Bu size guru-hood getirmez, ancak başlamak için Project Euler problemleri üzerinde çalışmayı deneyin . İlk 50 ya da öylesine iyi bir lise matematiğiniz varsa ve Google'a nasıl gideceğinizi biliyorsanız size vergilendirmemelisiniz. Birini çözdüğünüzde, size daha da fazla öğretecek diğer insanların çözümlerini inceleyebileceğiniz foruma girersiniz. Gerçi iyi olun ve fikirlerinizi insanların kendileri için çalışmaya teşvik etmek olduğu için çözümlerinizi yayınlamayın.

Kaba kuvvet algoritmaları kullanırsanız, kendinizi Python'da çalışmaya zorlamak affetmez. Bu, büyük veri kümelerini hafızaya nasıl yerleştireceğinizi ve sözlükler gibi hızlı dil özellikleriyle bunlara verimli bir şekilde nasıl erişeceğinizi öğretecektir.

Bunu kendim yaparak öğrendim:

  • Dosya ES
  • Dinamik Programlama gibi algoritmalar ve teknikler
  • Python veri düzeni
    • Sözlükler / hashmaps
    • Listeler
    • tuples
    • Çeşitli kombinasyonları, örneğin tuples listelerine sözlükler
  • Jeneratörler
  • Özyinelemeli işlevler
  • Python kütüphaneleri geliştirme
    • Dosya sistemi düzeni
    • Tercüman oturumu sırasında yeniden yükleme

Ve ayrıca çok önemli

  • Ne zaman vazgeçmeli ve C veya C ++ kullanmalı!

Tüm bunlar Biyoinformatik ile ilgili olmalıdır

Kuşkusuz Python'un OOP özelliklerini bu deneyimden öğrenmedim.


3
PE sitesini seviyorum, ama dürüst olalım: bir matematik sitesi, bir programlama sitesi değil. Sorunların çoğu (ya da en azından yaptığım şeylerin çoğu), programlama diliyle ilgili herhangi bir şeyden birkaç matematik hilesi bilmekle ilgilidir. Çoğu zaman forumlardaki iyi çözümler naif çözümlerin dalgaları, vb. Tarafından
boğulur

Aksine, hem programlama hem de Matematik becerilerinin uygulanmasını ve en önemlisi gerçek problemleri çözmek için bu ikisinin birleşimini içerdiğini buldum . Zayıf Matematik becerileriniz varsa Python programlamasını öğrenmek için PE'yi kullanamazsınız, ancak sadece bir dili nasıl kullanacağınızı öğreneceksiniz, bu nedenle Math'larınız yeterince iyi ise idealdir.
Kaptan Lepton

7

" Python Kullanarak Biyoinformatik Programlama " kitabını gördünüz mü ? Odak grubunun tam bir üyesisiniz.


2
Bir süre önce kitaptan hızla geçtikten sonra bu kitabın çok ilginç olmadığını gördüm. Çok acemi Python kullanıcılarına yöneliktir ve problemlerin kendisi son derece ilginç değildir. Çok kötü, bu açıkça Python kullanımının arttığı bir alandır. Daha teşvik edici bir kitap harika olurdu.
Morlock

6

Zaten çok fazla okuma materyaliniz var, ancak daha fazlasını halledebiliyorsanız, Python Geliştirme Tekliflerini, özellikle "Bitmiş" PEP'leri ve "Ertelenmiş, Terk Edilmiş, Geri Alınmış ve Reddedilmiş" i okuyarak python'un evrimini öğrenmenizi tavsiye ederim. PEP'ler.

Dilin nasıl değiştiğini, alınan kararları ve gerekçelerini görünce Python'un felsefesini özümseyecek ve "deyimsel Python" un nasıl ortaya çıktığını anlayacaksınız.

http://www.python.org/dev/peps/



3

Python'u öğrenmeye başlayan bir başkasına öğretmek her zaman fikirlerinizi netleştirmenin harika bir yoludur ve bazen Python hakkında kavramsal şeyleri yeniden düşünmemi sağlayan öğrencilerden genellikle çok güzel sorular alırım.


2

Tam olarak ne istediğini değil, ama bunun iyi bir tavsiye olduğunu düşünüyorum.

Başka bir dil öğrenin, hangisinin fazla olduğu önemli değil. Her dilin öğrenebileceğiniz kendi fikirleri ve kuralları vardır. Dillerdeki farklılıklar hakkında bilgi edinin ve daha da önemlisi whyfarklılar. Haskell gibi tamamen işlevsel bir dil deneyin ve yan etkisiz işlevlerin bazı faydalarını (ve zorluklarını) görün. Diğer dillerden öğrendiğiniz bazı şeyleri Python'a nasıl uygulayabileceğinizi görün.


1
Haskell merak uyandırıyor ve Lisp'e çekildim, ama devam etmek istemeden önce Python dünyasında keşfetmem gereken çok şey olduğunu hissediyorum.
Morlock

2
landoflisp (.com) son zamanlarda dikkatimi çekti.
Jiaaro

Herkes Lisp hakkında düşünüyorsa, Scheme
Tharindu Rusira

2

Sizi sözdiziminin etkileyici gücünü keşfetmeye zorlayan bir şeyle başlamanızı öneririm. Python, aynı işlevselliği yazmanın birçok farklı yoluna izin verir, ancak genellikle tek bir en zarif ve en hızlı yaklaşım vardır. Diğer dillerin deyimlerine alışkınsanız, asla bu daha iyi yolları bulamaz veya kabul edemezsiniz. Bir hafta sonu ilk 20 kadar Project Euler sorununu aşarak geçirdim ve Google App Engine'de Django ile basit bir web uygulaması yaptım. Bu, sizi sadece çıraktan acemiye götürecektir, ancak daha sonra biraz daha gelişmiş webapps yapmaya ve daha gelişmiş Project Euler sorunlarını çözmeye devam edebilirsiniz. Birkaç ay sonra geri döndüm ve ilk 20 PE problemini hafta sonu yerine bir saat içinde sıfırdan çözdüm.

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.