Шлях прогресування Python - від учень до гуру


659

Я вже півтора року навчаюся, працюю та граю з Python. Оскільки біолог повільно робив поворот до біоінформатики, ця мова лежить в основі всіх основних внесків, які я зробив у лабораторії. Я більш-менш закохався в те, як Python дозволяє мені висловлювати прекрасні рішення, а також із семантикою мови, яка дозволяє такий природний потік від думок до справного коду.

Що я хотів би знати, це ваша відповідь на такий собі питання, який я рідко бачив на тому чи іншому форумі. Це питання мені здається центральним для тих, хто на шляху до вдосконалення Python, але хто цікавиться, якими повинні бути його наступні кроки.

Дозвольте підвести підсумки того, що НЕ хочу спочатку запитати;)

  • Я не хочу знати, як Швидко вивчити Python
  • Я також не хочу з’ясувати найкращий спосіб познайомитися з мовою
  • Нарешті, я не хочу знати підхід «один фокус, який робить все».

Що я хочу знати, про вашу думку, це:

Які кроки ви б рекомендували мандрівникові Python, починаючи від учнівства до статусу гуру (сміливо зупиняйтеся там, де вам це диктує ваш досвід), щоб один ВДОСКОНАЛИВАННЯ СТАЛО, стаючи кращим і кращим кодером Python, крок за часом. Деякі з людей на ЗО майже здаються гідними поклоніння за свою майстерність Python, будь ласка, просвітліть нас :)

Відповіді, які мені сподобаються (але сміливо дивуйте читацьку аудиторію: P), форматовані більш-менш так:

  • Прочитайте це (наприклад: підручник пітона), зверніть увагу на такі деталі
  • Код для стільки часу / проблем / рядків коду
  • Потім прочитайте це (наприклад: та чи інша книга), але цього разу зверніть на це увагу
  • Вирішити декілька проблем із реального життя
  • Потім приступайте до читання Y.
  • Не забудьте зрозуміти ці поняття
  • Код X часу
  • Поверніться до таких і таких основ або рухайтеся далі до ...
  • (Ви отримуєте бал :)

Мені дуже цікаво дізнатися вашу думку про те, на що саме слід звернути увагу на різних етапах, щоб прогресувати КОНСТАНТНО (звичайно, доклавши зусиль). Якщо ви приїжджаєте з певної галузі знань, обговоріть шлях, який ви вважаєте за потрібне в цій галузі.

EDIT: Завдяки вашому великому внеску, я знову на шляху покращення Python! Я дійсно ціную!

Відповіді:


471

Я думав, що процес майстерності Python пройшов приблизно так:

  1. Відкрийте для себе список розумінь
  2. Відкрийте для себе генератори
  3. Включіть у свій код часто карту, зменшіть, фільтруйте, повторіть, діапазон, розмалюйте
  4. Відкрийте для себе декоратори
  5. Пишіть рекурсивні функції, багато
  6. Відкрийте для себе itertools та functools
  7. Читайте реальний світ Haskell ( читати безкоштовно онлайн )
  8. Перезапишіть весь свій старий код Python тоннами функцій вищого порядку, рекурсією та ін.
  9. Роздратуйте своїх товаришів по кабінах щоразу, коли вони представлять вам клас Python. Стверджуйте, що це може бути "краще" реалізовано як словник плюс деякі функції. Отримати функціональне програмування.
  10. Відкрийте для себе шаблон стратегії, а потім усі ті речі з імперативного коду, який ви так важко намагалися забути після Haskell.
  11. Знайдіть баланс.

@wheaties Супер приємний список, люби його! У вас, здається, є ухил до функціонального програмування і в стороні від об'єктно-орієнтованого ... чи є певна причина? Чи направляв вас досвід Haskell на цей підхід?
Морлок

8
Так і ні. Я вважаю, що я пишу кращий і більш стислий код, чим ближче до функціонального програмування. Однак, є багато місць, де речі виразніше виражаються в імперативному порядку. Є причина, що Real World Haskell продається на конвенціях Python, це робить вас кращим програмістом. Моя порада, вивчіть якомога більше граней Python, а потім спробуйте функціональну мову.
пшениці

@wheaties отримує відповідь, оскільки це і ближче до запитуваного формату, і дуже надихає. Дякуємо, що знайшли час для відповіді!
Морлок

1
Початківці: Словник, потім пізніше ... Майстерність: Метапрограмування
gath

Чи можете ви детальніше розглянути >> це може бути "краще" реалізовано як словник плюс деякі функції. <<?
Koobz

108

Один хороший спосіб поглибити свої знання Python - це заглибитись у вихідний код бібліотек, платформ та фреймворків, які ви вже використовуєте.

Наприклад, якщо ви створюєте сайт на Django , на багато питань, які можуть зіткнутися, можна відповісти, дивлячись на те, як Django реалізує відповідну функцію.

Таким чином ви продовжуватимете вибирати нові ідіоми, стилі кодування та хитрості Python . (Деякі будуть добрі, а деякі - погані.)

І коли ви побачите щось Pythony, якого ви не розумієте в джерелі, перейдіть на канал #python IRC, і ви знайдете безліч "мовних юристів", які радо пояснять.

Накопичення цих невеликих роз’яснень роками призводить до набагато глибшого розуміння мови та всіх її входів та виходів.


1
Я додам до цього, що замість того, щоб просто встановлювати розширення / плагін django, спробуйте додати код вручну за допомогою гілки git. Це змусить вас насправді прочитати код, який ви додаєте до проекту.
g33kz0r

14
Цікаво, навіщо використовувати IRC, коли решта з нас може отримати користь від питання?
thepang

1
+1 для "ідіоми, стилі та хитрощі". Життя справжньої КУЛЬТУРИ, створене реальними людьми, які контактують (навіть якщо цей контакт означає в основному читання коду одне одного в даному випадку) - це те, що коли-небудь змусило людські знання ЗНАЙТИ З часом.
heltonbiker

92

Зрозумійте (глибше) типи даних Python та їх ролі щодо mgmt пам'яті

Як деякі з вас у громаді знають, я викладаю курси Python , найпопулярнішими з яких є всебічний курс Intro + Intermediate, а також "просунутий" курс, який знайомить із різноманітними напрямками розробки додатків.

Досить часто мені задають запитання, схоже на "Чи варто взяти ваш вступний або прогресивний курс? Я вже програмував Python протягом 1-2 років, і я думаю, що вступне для мене занадто просте, тому я б як би стрибнути прямо на передових ... який курс ти б рекомендував? "

Щоб відповісти на їх запитання, я намагаюся побачити, наскільки вони сильні в цій галузі - не те, що це насправді найкращий спосіб оцінити, чи готові вони до будь-якого прогресивного курсу, а щоб побачити, наскільки їх основні знання щодо об'єктів Python і модель пам'яті, що є причиною багатьох помилок Python, написаних тими, хто не тільки початківці, але й ті, хто вийшов за рамки цього.

Для цього я вказую на це просте запитання з двома частинами: Ex1: x = 42;  у = х;  х + = 1;  print x, y Ex2: x = [1,2,3]; y = x; x [0] = 4; надрукувати x, y

Багато разів вони можуть отримати результат, але чому складніше і набагато важливіше відповідь ... Я б оцінив результат як 20% відповіді, тоді як "чому" отримує 80% кредиту. Якщо вони не можуть зрозуміти, чому, незалежно від досвіду роботи Python, я завжди спрямовуватиму людей на всебічний інтро + проміжний курс, тому що я проводжу одну лекцію про об'єкти та управління пам’яттю до того моменту, коли ви зможете відповісти за допомогою Вихід і чому з достатньою впевненістю. (Тільки тому, що ви знаєте синтаксис Python через 1-2 роки, це не робить вас готовим вийти за межі "початківця", поки ви не зрозумієте, як працює Python під обкладинками.)

Успішний запит, що вимагає подібної відповіді, ще більш жорсткий, наприклад,

Приклад 3

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

Наступні теми, які я рекомендую, - це добре зрозуміти підрахунок посилань, вивчити, що означає "інтернування" (але не обов'язково використовувати його), дізнатися про дрібні та глибокі копії (як у прикладі 3 вище) і, нарешті, взаємозв'язки між різними типами та конструкції в мові, тобто списки проти кортежів, дикти проти наборів, розуміння списку проти генераторних виразів, ітератори проти генераторів тощо; проте всі ці інші пропозиції - це ще одна публікація для іншого разу. Сподіваюсь, це тим часом допомагає! :-)

пс. Я погоджуюсь з іншими відповідями для того, щоб стати більш близьким із самоаналізом, а також вивчити вихідний код інших проектів та додати сильний "+1" до обох пропозицій!

pps. Відмінне запитання до речі. Я б хотів, щоб я був досить розумним на початку, щоб запитав щось подібне, але це було дуже давно, і зараз я намагаюся допомогти іншим у своїх багаторічних програмах Python на повний робочий день !!


Веслі Чун! Морлок, це той тип хлопця, про якого ви говорили у підкресленій частині вашого запитання. Хлопець, який добре знає, який також дуже обдарований вчитель, отримав величезний поштовх від книги.
відключено

thx @ bvmou! я могла відповісти лише на це запитання, бо мені довелося пройти цей процес навчання, як і всі ... тільки моє було 13 років тому! :-) THX для підключення corepython.com Тхо! :-)
wescpy

@wescpy Ви можете мені пояснити вихід, наприклад3, або вказати мені на хороший ресурс, щоб вивчити цей матеріал. Дякую.
Санкальп

1
Хитрість полягає в тому, що копіюються лише посилання на об'єкти, а не самі об'єкти. Це все, що там є ... сподіваюся, що це допомагає! Я говорив про це кілька тижнів тому насправді в OSCON. Я був приємно здивований, коли хтось сказав мені, що це найкраща розмова Python на конференції! Завантажити слайди можна тут: oscon.com/oscon2013/public/schedule/detail/29374
wescpy

Вихід SyntaxError: недійсний синтаксис, чи не так? Чому? Тому що я використовував Python 3, і printце не заява.
Конрад Боровський

67

Ознайомтеся з есею Пітера Норвіга про те, як через 10 років стати майстром-програмістом: http://norvig.com/21-days.html . Я б сказав, що це справедливо для будь-якої мови.


59

Зрозумійте інтроспекцію

  • написати dir()еквівалент
  • написати type()еквівалент
  • придумати, як "мавпа-латка"
  • використовуйте disмодуль, щоб побачити, як працюють різні мовні конструкції

Робити ці речі буде

  • дати вам кілька хороших теоретичних знань про те, як реалізується python
  • дасть вам хороший практичний досвід програмування нижчого рівня
  • дають вам гарне інтуїтивне відчуття щодо структур даних python

1
"Напишіть type()еквівалент", що було б дуже важко, якби ви взяли повну специфіку метакласики 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
гуру () слід пройти. ніщо не може описати гуру, нехай це пройде
запрошення

1
Якщо виправити GIL , то я думаю , що ставить вас на рівні вище , ніж гуру, але трохи нижче доброзичливого диктатора. ;)
Адам Паркін

41

Я дам вам найпростішу та найефективнішу пораду, я думаю, хто-небудь міг би вам дати: код .

Ви можете бути краще використовувати мову (що передбачає її розуміння), кодуючи . Вам доводиться активно насолоджуватися кодуванням, надихатися, задавати питання та знаходити відповіді самостійно.

Отримали годину на шкоду? Напишіть код, який оберне рядок, і знайдіть найбільш оптимальне рішення. Вільний вечір? Чому б не спробувати деякі веб-скребки. Прочитайте код інших народів. Подивіться, як вони роблять справи. Запитайте себе, що б ви робили.

Коли мені нудно за комп'ютером, я відкриваю свій IDE і штурм коду. Я записую ідеї, які звучать цікаво та складно. URL-скорочувач? Звичайно, я можу це зробити. О, я навчився перетворювати числа з однієї бази в іншу як побічний ефект!

Це дійсно незалежно від рівня вашого вміння. Ви ніколи не припиняєте вчитися. Активно кодуючи у вільний час, ви з невеликими додатковими зусиллями ви зрозумієте мову і, зрештою, станете гуру. Ви нарощуватимете знання та багаторазовий код та запам'ятовуватимете ідіоми.


24

Якщо ви використовуєте пітон для науки (яка, здається, ви є), частиною цього буде вивчення та розуміння наукових бібліотек, для мене це було б

  • онімілий
  • вуха
  • matplotlib
  • майаві / молоб
  • чако
  • Сітон

Знання, як використовувати потрібні бібліотеки та векторизувати свій код, є важливим для наукових обчислень.

Я хотів би додати, що обробка великих числових наборів даних звичайними пітонічними способами (об'єктно-орієнтовані підходи, списки, ітератори) може бути вкрай неефективною. У наукових обчисленнях може бути необхідним структурувати свій код способами, які різко відрізняються від того, як більшість звичайних кодерів пітона наближаються до даних.


Дякую. Безумовно, варто зайняти час, щоб навчитися нуме і науці, щоб досягти ефективності використання пам'яті для великих наборів даних!
Морлок

1
Можливо, до списку додайте панди та IPython.
Ерік Вілсон

23

Google нещодавно випустив онлайн-клас Python ("клас", як у "курсі навчання").

http://code.google.com/edu/languages/google-python-class/

Я знаю, це не відповідає на ваше повне запитання, але я думаю, що це чудове місце для початку!


6
Насправді, ці відео лекції від Google орієнтовані більше на її середній та просунутий, я думаю. code.google.com/intl/fi-FI/edu/languages/…
Том Вілліс


12

Ретельно розумійте всі типи даних та структури

Для кожного типу та структури напишіть серію демонстраційних програм, які здійснюють кожен аспект типу чи структури даних. Якщо ви це зробите, можливо, варто написати блог до кожного з них ... це може бути корисно багатьом людям!


Це було б корисно не лише в Python, але і як в абстрактному розумінні.
Хамфрі Богарт

1
Це я теж роблю, коли я знаходжу нову конструкцію, я пишу програму іграшок, яка показує, як її використовувати. І розмістіть його в Інтернеті у рефінансі
Адам Паркін

10

Першим я навчився python за літо, просто зробивши підручник на сайті python (на жаль, я, здається, вже не зможу цього знайти, тому не можу розмістити посилання).

Пізніше пітон викладав мене на одному з моїх курсів першого курсу в університеті. Влітку, що настало , я займався з PythonChallenge та проблемами з Google Code Jam . Вирішити ці проблеми допомагають як з алгоритмічної точки зору, так і з точки зору того, як дізнатися, що може зробити Python, а також як маніпулювати ним, щоб максимально повно вийти з python.

З подібних причин я чув, що гольф з кодом працює також, але я ніколи його не пробував.


3
Ви маєте на увазі цей підручник? Python 2: docs.python.org/tutorial/index.html ; Python 3: docs.python.org/py3k/tutorial/index.html .
Хамфрі Богарт

10

Алгоритми навчання / математика / файли IO / Пітонічна оптимізація

Це не допоможе вам отримати гуру, але для початку спробуйте вирішити проблеми проекту Euler . Перші 50 або близько того не повинні оподатковувати вас податками, якщо ви маєте гідну математику середньої школи та вмієте користуватися Google. Коли ви вирішите питання, ви потрапляєте на форум, де ви можете переглядати рішення інших людей, які навчать вас ще більше. Будьте пристойні, але не публікуйте своїх рішень, оскільки ідея полягає в тому, щоб заохочувати людей працювати над собою.

Змусити себе працювати в Python буде непростим, якщо використовувати алгоритми грубої сили. Це навчить вас викладати великі набори даних у пам'ять та ефективно отримувати доступ до них за допомогою швидких функцій мови, таких як словники.

З цього я сам навчився:

  • Файл IO
  • Алгоритми та методи, такі як динамічне програмування
  • Макет даних Python
    • Словники / хешмапи
    • Списки
    • Кортежі
    • Різні їх комбінації, наприклад, словники до списків кортежів
  • Генератори
  • Рекурсивні функції
  • Розробка бібліотек Python
    • Макет файлової системи
    • Перезавантажте їх під час сеансу перекладача

А також дуже важливо

  • Коли відмовитись і використовувати C або C ++!

Все це має стосуватися біоінформатики

Правда, я не дізнався про функції OOP Python з цього досвіду.


3
Мені подобається сайт PE, але будьмо чесними: це математичний сайт, а не сайт програмування. Більшість проблем (або, принаймні, більшість із тих, що я робив) дійсно зводяться до знання кількох математичних хитрощів, ніж будь-яка пов'язана мова програмування. Часто хороші рішення на форумах заглушаються хвилями наївних рішень тощо
Адам Паркін

Навпаки, я виявив, що це передбачає застосування як навичок програмування, так і математики, а головне - поєднання двох для вирішення реальних проблем. Ви не можете використовувати PE, щоб вивчити програмування Python, якщо у вас погані навички математики, але ви лише збираєтеся навчитися користуватися мовою, використовуючи її, тому ідеально, якщо ваші математики досить хороші.
Капітан Лептон

7

Ви бачили книгу " Програмування біоінформатики за допомогою Python "? Схоже, ви є точним членом її фокус-групи.


2
Швидко перебравши книгу деякий час тому, я виявив, що ця книга не дуже цікава. Він орієнтований на дуже початківців користувачів Python, а самі проблеми не надто цікаві. Шкода, що це явно область, де використання Python збільшується. Більш стимулююча книга була б чудовою.
Морлок

6

У вас вже є чимало матеріалів для читання, але якщо ви можете впоратися з більшою кількістю, я рекомендую вам дізнатися про еволюцію пітона, прочитавши пропозиції щодо вдосконалення Python, особливо "Готові" PEP та "Відкладені, покинуті, вилучені та відхилені". PEPs.

Побачивши, як змінилася мова, прийняті рішення та їх обгрунтування, ви поглинете філософію Пітона і зрозумієте, як виходить "ідіоматичний Пітон".

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



3

Викладання комусь іншому, хто починає вивчати Python, - це завжди чудовий спосіб зрозуміти свої ідеї, а іноді я зазвичай отримую багато акуратних запитань від студентів, які змушують мене переосмислити концептуальні речі про Python.


2

Не точно те, що ви просите, але я думаю, що це гарна порада.

Вивчіть іншу мову, не має великого значення, яка. Кожна мова має власні ідеї та конвенції, з яких можна дізнатися. Дізнайтеся про відмінності в мовах і, що важливіше, whyвони відрізняються. Спробуйте суто функціональну мову, як Haskell, і перегляньте деякі переваги (та проблеми) функцій, що не мають побічних ефектів. Подивіться, як ви можете застосувати деякі речі, які ви вивчаєте з інших мов на Python.


1
Хаскелл інтригує, і мене тягне до Лісп, але я відчуваю, що мені ще багато чого відкриється в світі Пітона, перш ніж я захочу рухатись далі.
Морлок

2
нещодавно привернув мою увагу landoflisp (.com).
Jiaaro

Якщо хтось думає про Лісп, рекомендую схему
Tharindu Rusira

2

Я рекомендую почати з чогось, що змушує вивчити виразну силу синтаксису. Python дозволяє безліч різних способів написання одного і того ж функціоналу, але часто існує один найелегантніший і найшвидший підхід. Якщо ви звикли до ідіом інших мов, ви ніколи не зможете знайти або прийняти ці кращі способи. Я провів вихідні, розглядаючи перші 20 проблем проекту Project Euler і зробив простий веб-сайт з Django в Google App Engine. Це, можливо, перенесе вас лише від учнів до початківців, але ви можете продовжувати робити дещо більш просунуті веб-карти та вирішувати більш просунуті проблеми Project Euler. Через кілька місяців я повернувся назад і вирішив перші 20 проблем з ПЕ з нуля за годину замість вихідних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.