Ścieżka postępu Pythona - od ucznia do guru


659

Od półtora roku uczę się, pracuję i bawię się w Pythonie. Jako biolog powoli przechodzący na bioinformatykę, język ten stanowi rdzeń wszystkich głównych wkładów, jakie włożyłem w laboratorium. Mniej więcej zakochałem się w sposobie, w jaki Python pozwala mi wyrażać piękne rozwiązania, a także w semantyce języka, który pozwala na tak naturalny przepływ myśli od sprawnego kodu.

Chciałbym poznać twoją odpowiedź na pytanie, które rzadko widywałem na tym lub innych forach. To pytanie wydaje mi się kluczowe dla każdego, kto jest na drodze do ulepszenia Pythona, ale kto zastanawia się, jakie powinny być jego kolejne kroki.

Pozwólcie, że podsumuję to, czego NIE chcę najpierw zapytać;)

  • Nie chcę wiedzieć, jak SZYBKO nauczyć się języka Python
  • Nie chcę też znaleźć najlepszego sposobu na zapoznanie się z językiem
  • Wreszcie, nie chcę znać podejścia „jedna sztuczka, która robi wszystko”.

Chcę poznać Twoją opinię:

Jakie kroki poleciłbyś czeladnikowi Pythona, od stażu do statusu guru (zachęcamy do zatrzymania się tam, gdzie wymaga tego twoja wiedza), aby stale ULEPSZYĆ, stając się coraz lepszym koderem Python, krok po kroku. Niektórzy ludzie na SO wydają się prawie godni czci ze względu na swoją sprawność w Pythonie, proszę oświeć nas :)

Odpowiedzi, które podobałyby mi się (ale mogą zaskoczyć czytelników: P), są sformatowane mniej więcej tak:

  • Przeczytaj to (np. Samouczek Pythona), zwróć uwagę na tego rodzaju szczegóły
  • Kod dla tak wielu razy / problemów / linii kodu
  • Następnie przeczytaj to (np. Tę lub tę książkę), ale tym razem zwróć na to uwagę
  • Podejmij kilka rzeczywistych problemów
  • Następnie przejdź do czytania Y.
  • Zapoznaj się z tymi pojęciami
  • Kod na czas X.
  • Wróć do takich i takich podstaw lub przejdź dalej do ...
  • (dostajesz punkt :)

Naprawdę zależy mi na poznaniu Twojej opinii na temat tego, na co dokładnie należy zwracać uwagę na różnych etapach, aby STAŁO postępować (oczywiście przy należytym wysiłku). Jeśli pochodzisz z określonej dziedziny wiedzy, omów ścieżkę, którą uważasz za odpowiednią w tej dziedzinie.

EDYCJA: Dzięki twojemu wspaniałemu wkładowi wróciłem do ścieżki poprawy Pythona! Naprawdę doceniam!

Odpowiedzi:


471

Myślałem, że proces opanowania Pythona przebiegał mniej więcej tak:

  1. Odkryj listę wyrażeń
  2. Odkryj generatory
  3. Włączenie mapa, zmniejszyć, filtr, ITER, zakres, XRange często w kodzie
  4. Odkryj dekoratorów
  5. Dużo pisz funkcje rekurencyjne
  6. Odkrywanie itertools i functools
  7. Czytaj Real World Haskell ( czytaj online za darmo )
  8. Przepisz cały swój stary kod Python z mnóstwem funkcji wyższego rzędu, rekurencją i tym podobne.
  9. Zirytuj swoich kolegów z kabiny za każdym razem, gdy przedstawiają ci klasę Python. Twierdzę, że może być „lepiej” zaimplementowany jako słownik plus niektóre funkcje. Programowanie funkcjonalne Embrace.
  10. Odkryj na nowo wzorzec strategii , a następnie wszystkie te rzeczy z kodu imperatywnego, którego tak bardzo próbowałeś zapomnieć po Haskell.
  11. Znajdź równowagę.

@wheaties Super ładna lista, uwielbiam to! Wygląda na to, że masz tendencję do programowania funkcjonalnego i nie jesteś zorientowany obiektowo ... czy jest jakiś konkretny powód? Czy doświadczenie Haskell przekierowało cię na takie podejście?
Morlock

8
Tak i nie. Uważam, że piszę lepszy i bardziej zwięzły kod, im bardziej zbliżam się do programowania funkcjonalnego. To powiedziawszy, istnieje wiele miejsc, w których rzeczy są wyrażane jaśniej w sposób rozkazujący. Istnieje powód, dla którego Real World Haskell został wyprzedany na konwencjach Python, dzięki czemu jesteś lepszym programistą. Moja rada, poznaj tyle aspektów Pythona, ile możesz, a następnie wypróbuj funkcjonalny język.
pszenicy

@wheaties otrzymuje odpowiedź, ponieważ jest ona zarówno bliższa wymaganemu formatowi, jak i bardzo inspirująca. Dziękujemy za poświęcenie czasu na odpowiedź!
Morlock,

1
Początkujący: Słownik, a potem ...
Mistrzostwo

Czy mógłbyś rozwinąć >> mógł być „lepiej” zaimplementowany jako słownik plus niektóre funkcje. <<?
Koobz

108

Jednym dobrym sposobem na pogłębienie wiedzy o języku Python jest kopanie w kodzie źródłowym bibliotek, platform i frameworków, których już używasz.

Na przykład, jeśli budujesz witrynę na Django , na wiele pytań, które mogą nas zaskoczyć, możesz odpowiedzieć, patrząc, jak Django implementuje tę funkcję.

W ten sposób będziesz nadal zbierać nowe idiomy, style kodowania i sztuczki w języku Python . (Niektóre będą dobre, a niektóre złe).

A kiedy zobaczysz w Pythony coś, czego nie rozumiesz w źródle, przeskocz na kanał IRC #python, a znajdziesz wielu „prawników językowych” chętnych do wyjaśnienia.

Kumulacja tych drobnych wyjaśnień przez lata prowadzi do znacznie głębszego zrozumienia języka i wszystkich jego tajników.


1
Dodałbym do tego, że zamiast po prostu instalować rozszerzenie / wtyczkę django, spróbuj dodać kod ręcznie za pomocą gałęzi git. To zmusi cię do przeczytania kodu, który dodajesz do projektu.
g33kz0r

14
Ciekawe, dlaczego warto korzystać z IRC, gdy reszta z nas może skorzystać z pytania?
tshepang,

1
+1 za „idiomy, style i sztuczki”. Życie prawdziwą KULTURĄ stworzoną przez prawdziwych ludzi w kontakcie (nawet jeśli kontakt ten oznacza w tym przypadku przede wszystkim czytanie kodu drugiej osoby), sprawiło, że ludzka wiedza ewoluowała z czasem.
heltonbiker

92

Zrozumieć (głębiej) typy danych Pythona i ich role w odniesieniu do pamięci mgmt

Jak niektórzy z Was wiedzą, uczę kursów Pythona , z których najpopularniejsze to kompleksowy kurs Intro + Intermediate oraz kurs „zaawansowany”, który wprowadza różnorodne obszary rozwoju aplikacji.

Dość często zadaje mi się pytanie podobne do: „Czy powinienem wziąć udział w kursie wstępnym lub kursie zaawansowanym? Programuję Python już od 1-2 lat i myślę, że wprowadzenie jest dla mnie zbyt proste, więc chciałbym jak skakać prosto do zaawansowanych ... co oczywiście byłoby wy polecacie?”

Aby odpowiedzieć na ich pytanie, badam, czy są silni w tym obszarze - nie dlatego, że jest to naprawdę najlepszy sposób, aby zmierzyć, czy są gotowi na kurs zaawansowany, ale sprawdzić, jak dobrze ich podstawowa wiedza na temat obiektów Pythona i model pamięci, który jest przyczyną wielu błędów Pythona napisanych przez tych, którzy są nie tylko początkującymi, ale i tymi, którzy wykroczyli poza to.

Aby to zrobić, wskazuję je na to proste 2-częściowe pytanie quizu: Ex1: x = 42;  y = x;  x + = 1;  wydrukuj x, y Ex2: x = [1,2,3]; y = x; x [0] = 4; wydrukuj x, y

Wiele razy są w stanie uzyskać wynik, ale dlaczego jest to trudniejsze i ważniejsze od odpowiedzi ... Zważę wynik jako 20% odpowiedzi, podczas gdy „dlaczego” dostaje 80% kredytu. Jeśli nie potrafią zrozumieć, dlaczego, bez względu na to, jakie mają doświadczenie w Pythonie, zawsze poprowadzę ludzi do kompleksowego wstępu + kursu pośredniego, ponieważ spędzam jeden wykład na temat obiektów i zarządzania pamięcią do tego stopnia, że ​​powinieneś być w stanie odpowiedzieć wydajność i dlaczego z wystarczającą pewnością. (Tylko dlatego, że znasz składnię Pythona po 1-2 latach, nie sprawia, że ​​jesteś gotów wyjść poza etykietę „początkującego”, dopóki nie uzyskasz lepszego zrozumienia, w jaki sposób Python działa pod przykryciem).

Kolejne zapytanie wymagające podobnej odpowiedzi jest jeszcze trudniejsze, np.

Przykład 3

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

Kolejne tematy, które zalecam, to dobre zrozumienie liczenia odniesień, poznanie znaczenia „internowania” (ale niekoniecznie jego użycie), poznanie płytkich i głębokich kopii (jak w przykładzie 3 powyżej), a także wzajemne powiązania między różnymi typami i konstrukcje w języku, tj. listy vs. krotki, dykty vs. zbiory, interpretacja list a wyrażenia generatora, iteratory vs. generatory itp .; wszystkie te sugestie są jednak kolejnym postem na inny czas. Mam nadzieję, że tymczasem to pomaga! :-)

ps. Zgadzam się z innymi odpowiedziami na to, aby uzyskać bardziej intymną introspekcję, a także studiować kod źródłowy innych projektów i dodać mocne +1 do obu sugestii!

pps. Świetne pytanie BTW. Chciałbym być na tyle mądry na początku, żeby zapytać o coś takiego, ale to było dawno temu, a teraz staram się pomagać innym w moim wieloletnim programowaniu w języku Python !!


Wesley Chun! Morlock, to jest facet, o którym mówiłeś w odważnej części twojego pytania. Bardzo dobrze poinformowany facet, który jest również bardzo utalentowanym nauczycielem, dzięki książce zyskałem ogromny impuls.
odmontowano

dzięki @bvmou! mogłem tylko odpowiedzieć na to pytanie, ponieważ musiałem przejść ten proces uczenia się, jak wszyscy inni ... tylko moje było 13 lat temu! :-) thx za podłączenie corepython.com tho! :-)
wescpy,

@wescpy Czy możesz wyjaśnić mi dane wyjściowe na przykład3 lub wskazać dobry zasób, aby nauczyć się tego.
Sankalp,

1
Sztuka polega na tym, że kopiowane są tylko odwołania do obiektów, a nie same obiekty. To wszystko. Mam nadzieję, że to pomoże! Rozmawiałem o tym kilka tygodni temu w OSCON. Byłem mile zaskoczony, gdy ktoś powiedział mi, że to najwyżej oceniana rozmowa w języku Python na konferencji! Możesz pobrać slajdy tutaj: oscon.com/oscon2013/public/schedule/detail/29374
wescpy

Dane wyjściowe to SyntaxError: nieprawidłowa składnia, prawda? Dlaczego? Ponieważ użyłem Pythona 3 i printnie jest to stwierdzenie.
Konrad Borowski


59

Zrozumienie introspekcji

  • napisz dir()ekwiwalent
  • napisz type()ekwiwalent
  • dowiedzieć się, jak „łatać małpy”
  • użyj dismodułu, aby zobaczyć, jak działają różne konstrukcje językowe

Robienie tych rzeczy będzie

  • dać ci dobrą wiedzę teoretyczną na temat implementacji Pythona
  • dać ci dobre doświadczenie praktyczne w programowaniu niższego poziomu
  • daje intuicyjne wyczucie struktur danych w języku Python

1
„Napisz type()odpowiednik”, co byłoby bardzo trudne, jeśli weźmiesz pełną specyfikację metaclassy 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 () powinien przejść. nic nie może opisać guru, niech to minie
inw

1
Jeśli naprawisz GIL, to myślę, że stawia cię to na WYŻSZYM poziomie niż guru, ale tuż poniżej życzliwego dyktatora. ;)
Adam Parkin

41

Dam ci najprostszą i najskuteczniejszą radę, którą, jak sądzę, każdy może ci dać: kod .

Możesz być lepszy w posługiwaniu się językiem (co oznacza jego zrozumienie) poprzez kodowanie . Musisz aktywnie cieszyć się kodowaniem, czerpać inspirację, zadawać pytania i znajdować odpowiedzi samodzielnie.

Masz godzinę do stracenia? Napisz kod, który odwróci ciąg, i znajdź najbardziej optymalne rozwiązanie. Wolny wieczór? Dlaczego nie spróbować skrobania stron internetowych? Przeczytaj kod innych ludzi. Zobacz, jak oni to robią. Zadaj sobie pytanie, co byś zrobił.

Kiedy nudzę się przy komputerze, otwieram IDE i burzę szyfrów. Zapisuję pomysły, które brzmią interesująco i stanowią wyzwanie. Skracacz URL? Jasne, mogę to zrobić. Och, nauczyłem się konwertować liczby z jednej bazy na drugą jako efekt uboczny!

Jest to ważne bez względu na poziom umiejętności. Nigdy nie przestajesz się uczyć. Aktywnie kodując w wolnym czasie, bez większego wysiłku, zrozumiesz język i ostatecznie staniesz się guru. Zdobędziesz wiedzę i kod wielokrotnego użytku oraz zapamiętasz idiomy.


24

Jeśli używasz Pythona do nauki (wydaje się, że nim jesteś), częścią tego będzie nauka i rozumienie bibliotek naukowych, dla mnie byłyby to

  • numpy
  • scipy
  • matplotlib
  • mayavi / mlab
  • chaco
  • Cython

umiejętność korzystania z odpowiednich bibliotek i wektoryzowania kodu jest niezbędna w obliczeniach naukowych.

Chciałem dodać, że obsługa dużych liczbowych zestawów danych w typowych pythonowych sposobach (podejścia obiektowe, listy, iteratory) może być wyjątkowo nieefektywna. W informatyce naukowej może być konieczne ustrukturyzowanie kodu w sposób drastycznie różniący się od sposobu, w jaki większość konwencjonalnych koderów pythonowych podchodzi do danych.


Dzięki. Z pewnością warto poświęcić trochę czasu na naukę numpy i scipy, aby uzyskać większą wydajność wykorzystania pamięci dla dużych zestawów danych!
Morlock,

1
Prawdopodobnie dodaj do listy pandy i IPython.
Eric Wilson,



12

Dokładnie poznaj wszystkie typy i struktury danych

Dla każdego typu i struktury napisz serię programów demonstracyjnych, które wykorzystują każdy aspekt struktury typu lub danych. Jeśli to zrobisz, warto umieścić na blogu notatki o każdym z nich ... może być przydatne dla wielu osób!


Byłoby to przydatne nie tylko w Pythonie, ale także w sensie abstrakcyjnym.
Humphrey Bogart

1
To też robię, za każdym razem, gdy znajduję nowy konstrukt, piszę program zabawkowy pokazujący, jak go używać. I umieść go online w repozytorium github: github.com/pzelnip/MiscPython
Adam Parkin

10

Nauczyłem się Pythona po raz pierwszy przez lato, wykonując samouczek na stronie Pythona (niestety, nie jestem już w stanie go znaleźć, więc nie mogę opublikować linku).

Później nauczono mnie pytona na jednym z kursów pierwszego roku na uniwersytecie. Następnego lata ćwiczyłem z PythonChallenge i problemami z Google Code Jam . Rozwiązanie tych problemów pomaga z perspektywy algorytmicznej, a także z perspektywy uczenia się, co potrafi Python, a także sposobów manipulowania nim, aby w pełni wykorzystać możliwości Pythona.

Z podobnych powodów słyszałem, że golf działa również, ale nigdy nie próbowałem go sam.


3
Masz na myśli ten samouczek? Python 2: docs.python.org/tutorial/index.html ; Python 3: docs.python.org/py3k/tutorial/index.html .
Humphrey Bogart

10

Uczenie się algorytmów / matematyki / optymalizacji plików IO / Pythonic

To nie sprawi, że poczujesz się jak guru, ale na początek spróbuj przepracować problemy z Project Euler . Pierwsze 50 osób nie powinno cię opodatkowywać, jeśli masz przyzwoitą matematykę i wiesz, jak Google. Po rozwiązaniu jednego z nich wchodzisz na forum, na którym możesz przeglądać rozwiązania innych osób, które nauczy Cię jeszcze więcej. Bądź jednak przyzwoity i nie publikuj swoich rozwiązań, ponieważ chodzi o to, aby zachęcić ludzi do samodzielnego wypracowania.

Zmuszenie się do pracy w Pythonie będzie bezlitosne, jeśli zastosujesz algorytmy brute-force. Nauczy Cię to, jak układać duże zestawy danych w pamięci i uzyskiwać do nich skuteczny dostęp dzięki szybkim funkcjom językowym, takim jak słowniki.

Z robienia tego sam nauczyłem się:

  • Plik IO
  • Algorytmy i techniki, takie jak programowanie dynamiczne
  • Układ danych w języku Python
    • Słowniki / mapy skrótów
    • Listy
    • Krotki
    • Różne ich kombinacje, np. Słowniki do list krotek
  • Generatory
  • Funkcje rekurencyjne
  • Opracowywanie bibliotek Python
    • Układ systemu plików
    • Ponowne ładowanie ich podczas sesji tłumacza

A także bardzo ważne

  • Kiedy się poddać i użyć C lub C ++!

Wszystko to powinno odnosić się do bioinformatyki

Trzeba przyznać, że z tego doświadczenia nie dowiedziałem się o funkcjach OOP Pythona.


3
Lubię stronę PE, ale bądźmy szczerzy: to strona matematyki, a nie strona programowania. Większość problemów (a przynajmniej większość z tych, które zrobiłem) naprawdę sprowadza się do znajomości kilku sztuczek matematycznych niż cokolwiek związanego z językiem programowania. Często dobre rozwiązania na forach zagłuszają fale naiwnych rozwiązań itp.
Adam Parkin

Przeciwnie, stwierdziłem, że dotyczyło to zarówno umiejętności programowania, jak i matematyki, a co najważniejsze połączenia tych dwóch umiejętności w celu rozwiązania prawdziwych problemów. Nie możesz używać PE do nauki programowania w języku Python, jeśli masz słabe umiejętności matematyczne, ale nauczysz się, jak używać języka, używając go, więc jest to idealne rozwiązanie, jeśli Twoja matematyka jest wystarczająco dobra.
Kapitan Lepton,

7

Czy widziałeś książkę „ Programowanie bioinformatyczne przy użyciu Pythona ”? Wygląda na to, że jesteś dokładnym członkiem jego grupy fokusowej.


2
Po szybkim przejrzeniu książki jakiś czas temu odkryłem, że ta książka nie jest zbyt interesująca. Jest skierowany do bardzo początkujących użytkowników Pythona, a same problemy nie są wyjątkowo interesujące. Szkoda, to wyraźnie obszar, w którym rośnie użycie Pythona. Bardziej stymulująca książka byłaby świetna.
Morlock,

6

Masz już dużo materiałów do czytania, ale jeśli możesz poradzić sobie z większą ilością, zalecamy zapoznanie się z ewolucją Pythona, czytając Propozycje ulepszeń Pythona, zwłaszcza „Zakończone” PEP i „Odroczone, porzucone, wycofane i odrzucone” PEP.

Widząc, jak zmienił się język, podjęte decyzje i ich uzasadnienia, wchłoniesz filozofię Pythona i zrozumiesz, jak powstaje „idiomatyczny Python”.

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



3

Nauczanie kogoś, kto zaczyna się uczyć języka Python, jest zawsze świetnym sposobem na wyjaśnienie twoich pomysłów, a czasami zazwyczaj otrzymuję wiele ciekawych pytań od studentów, które zmuszają mnie do ponownego przemyślenia koncepcyjnych zagadnień dotyczących Python.


2

Nie dokładnie o to prosisz, ale myślę, że to dobra rada.

Naucz się innego języka, który nie ma większego znaczenia, który. Każdy język ma swoje własne pomysły i konwencje, z których możesz się uczyć. Dowiedz się o różnicach między językami, a co ważniejsze, whysą one różne. Wypróbuj czysto funkcjonalny język, taki jak Haskell, i zobacz niektóre zalety (i wyzwania) funkcji wolnych od skutków ubocznych. Zobacz, jak możesz zastosować w Pythonie niektóre rzeczy, których uczysz się z innych języków.


1
Haskell jest intrygujący i pociąga mnie Lisp, ale czuję, że jest jeszcze wiele do odkrycia w świecie Python, zanim chcę przejść dalej.
Morlock,

2
landoflisp (.com) zwrócił ostatnio moją uwagę.
Jiaaro,

Jeśli ktoś myśli o Lisp, polecam Schemat
Tharindu Rusira,

2

Polecam zacząć od czegoś, co zmusza cię do zbadania ekspresyjnej mocy składni. Python pozwala na wiele różnych sposobów pisania tej samej funkcjonalności, ale często istnieje jedno najbardziej eleganckie i najszybsze podejście. Jeśli jesteś przyzwyczajony do idiomów innych języków, możesz nigdy nie znaleźć lub zaakceptować tych lepszych sposobów. Spędziłem weekend, przeszukując około 20 pierwszych problemów z Project Euler i stworzyłem prostą aplikację internetową z Django w Google App Engine. Może to tylko poprowadzić od ucznia do początkującego, ale możesz nadal tworzyć nieco bardziej zaawansowane aplikacje internetowe i rozwiązywać bardziej zaawansowane problemy z Project Euler. Po kilku miesiącach wróciłem i rozwiązałem pierwsze 20 problemów WF ​​od zera w godzinę zamiast w weekend.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.