Путь развития Python - от ученика до гуру
=========================================

Я изучаю, работаю и играю с Python уже полтора года. Поскольку биолог медленно превращается в биоинформатику, этот язык лежит в основе всех основных вкладов, которые я сделал в лаборатории. Я более или менее влюбился в то, как Python позволяет мне выражать красивые решения, а также с семантикой языка, которая позволяет такой естественный поток от мыслей к работоспособному коду.

То, что я хотел бы знать, - это ваш ответ на какой-то вопрос, который я редко видел на этом или других форумах. Этот вопрос кажется для меня ключевым для любого на пути улучшения Python, но он задается вопросом, какими должны быть его следующие шаги.

Позвольте мне подвести итог тому, что я НЕ хочу сначала спросить;)

* Я не хочу знать, как БЫСТРО изучить Python
* Я также не хочу найти лучший способ познакомиться с языком.
* Наконец, я не хочу знать, что "один трюк, который делает все это" подходит.

Я хочу знать ваше мнение о том, что:

  **Каковы шаги, которые вы рекомендовали бы подмастерье Python: от ученичества до статуса гуру (не стесняйтесь останавливаться везде, где ваш опыт его диктует), чтобы УЛУЧШИТЬ ПОСТОЯННО, став лучшим и лучшим кодером Python, один шаг за раз. Некоторые из людей на SO почти кажутся достойными поклонения за их мастерство на Python, пожалуйста, просветите нас:)**

Ответы, которые мне понравились (но не стесняйтесь удивлять читателей: P), отформатированы примерно так:

* Прочитайте это (например: учебник python), обратите внимание на такие детали.
* Код для так много времени/проблем/строк кода
* Затем прочитайте это (например: ту или иную книгу), но на этот раз обратите внимание на это.
* Решите несколько реальных проблем.
* Затем перейдите к чтению Y.
* Обязательно возьмите эти понятия.
* Код для X-времени
* Вернитесь к таким-то основам или двигайтесь дальше...
* (вы получаете точку:)

Мне действительно интересно узнать ваше мнение о том, на что именно следует обратить внимание на разных этапах, чтобы продвигаться ПОСТОЯННО (с должными усилиями, конечно). Если вы пришли из определенной области знаний, обсудите путь, который вы видите соответствующим образом в этом поле.

EDIT: благодаря вашему большому вкладу, я вернулся на дорожку улучшения Python! Я действительно ценю!

 

Я думал, что процесс овладения Python прошел примерно так:

* Откройте [список понятий](https://en.wikipedia.org/wiki/List_comprehension#Python)
* Откройте [generators](https://en.wikipedia.org/wiki/Python_syntax_and_semantics#Generators)
* Включайте [карту, уменьшайте, фильтруйте, итера, диапазон, xrange](https://docs.python.org/library/functions.html) часто в свой код.
* Откройте [Decorators](https://wiki.python.org/moin/PythonDecorators)
* Запись рекурсивных функций, много
* Откройте [itertools](https://docs.python.org/library/itertools.html) и [functools](https://docs.python.org/library/functools.html)
* Прочитайте [Real World Haskell](http://rads.stackoverflow.com/amzn/click/0596514980) ([читайте бесплатно онлайн](http://book.realworldhaskell.org/read/))
* Перепишите весь свой старый код Python с тоннами функций более высокого порядка, рекурсии и еще чего-то.
* Раздражайте своих помощников в шкафу каждый раз, когда они представляют вам класс Python. Заявите, что он может быть "лучше" реализован как словарь плюс некоторые функции. Включите функциональное программирование.
* Откройте [Strategy](https://en.wikipedia.org/wiki/Strategy_pattern#Python), а затем [все эти вещи](http://rads.stackoverflow.com/amzn/click/0596007124) из императивного кода, который вы так старались забыть после Haskell.
* Найдите баланс.

 

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

Например, если вы строите сайт на [Django](https://www.djangoproject.com/), на многие вопросы, на которые можно пнуть вас, можно ответить, посмотрев, как Django реализует эту функцию.

Таким образом вы продолжите  **забрать новые идиомы, стили кодирования и трюки Python**. (Некоторые будут хорошими, а некоторые будут плохими.)

И когда вы видите что-то Pythony, которое вы не понимаете в источнике,  **перейдите на #python IRC-канал**, и вы найдете много "юридических юристов", которые рады объяснить.

Накопление этих небольших разъяснений в течение многих лет приводит к гораздо более глубокому пониманию языка и всех его входов и выходов.

 

  **Понимать (более глубоко) типы данных Python и их роли в отношении памяти mgmt**

Как знают некоторые из вас в сообществе, [Я преподаю курсы Python](http://cyberwebconsulting.com), наиболее популярными из которых являются полный курс Intro + Intermediate как "продвинутый" курс, который вводит различные области разработки приложений.

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

Чтобы ответить на их вопрос, я исследую, насколько они сильны в этой области - не то, что это действительно лучший способ оценить, готовы ли они к продвинутому курсу, но чтобы понять, насколько хорошо их базовые знания Python и модель памяти, что является причиной многих ошибок Python, написанных теми, кто не только новичками, но и теми, кто вышел за рамки этого.

Чтобы сделать это, я укажу их на этот простой вопрос из двух частей:
![Ex1: x=42; y=x; x+=1; print x,y Ex2: x=[1,2,3];y=x;x[0]=4;print 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 выше) и, наконец, взаимосвязи между различные типы и конструкции на языке, т.е. списки против кортежей, dicts против наборов, понимание списков по сравнению с генераторными выражениями, итераторы против генераторов и т.д.; однако все эти другие предложения являются еще одной записью в другое время. Надеюсь, это поможет в то же время!: -)

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

ПФС. Большой вопрос BTW. Хотелось бы, чтобы я был достаточно умен в начале, чтобы спросить что-то подобное, но это было давно, и теперь я пытаюсь помочь другим с моим многолетним программированием на Python на полный рабочий день!

 

Ознакомьтесь с эссе П. Норвига о том, как стать программистом через 10 лет: <http://norvig.com/21-days.html>. Я бы сказал, что это верно для любого языка.

 

  **Понять интроспекцию**

* напишите эквивалент `dir()`
* напишите эквивалент `type()`
* выяснить, как  ["monkey-patch"](https://en.wikipedia.org/wiki/Monkey_patch)
* используйте модуль `dis`, чтобы увидеть, как работают различные языковые конструкции.

Выполнение этих действий будет

* предоставим вам хорошие теоретические знания о реализации python.
* дает вам хороший практический опыт программирования на нижнем уровне.
* дает вам хорошее интуитивное представление о структурах данных python.

 

```
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?

```
 

Я дам вам самый простой и эффективный совет, который, как я думаю, может дать вам:  **код**.

Вы можете только лучше использовать язык (который подразумевает его понимание) путем кодирования. Вы должны активно пользоваться кодированием, быть вдохновленным, задавать вопросы и находить ответы сами.

У вас есть час на запас? Напишите код, который изменит строку и найдет наиболее оптимальное решение. Бесплатный вечер? Почему бы не попробовать некоторые веб-соскабливания. Прочтите код других народов. Посмотрите, как они это делают. Спросите себя, что вы будете делать.

Когда мне скучно на моем компьютере, я открываю свои IDE и кодовые бури. Я записываю идеи, которые кажутся интересными и сложными. Укорачивание URL? Конечно, я могу это сделать. О, я научился конвертировать числа из одной базы в другую как побочный эффект!

Это действует независимо от уровня вашего навыка. Вы никогда не прекращаете учиться. Благодаря активному кодированию в свободное время вы с небольшими дополнительными усилиями поймете язык и, в конечном счете, станете гуру. Вы создадите знания и многоразовый код и запомните идиомы.

 

Если вы работаете и используете python для науки (как вам кажется), часть этого будет изучать и понимать научные библиотеки, для меня это будет

* NumPy
* SciPy
* Matplotlib
* MayaVi/MLab
* Чако
* Cython

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

Я хотел добавить, что обработка больших числовых наборов данных в общих питоновых способах (объектно-ориентированные подходы, списки, итераторы) может быть крайне неэффективной. В научных вычислениях может потребоваться структурировать ваш код таким образом, который существенно отличается от того, как большинство обычных кодировщиков python подходят к данным.

 

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

 [http://code.google.com/edu/languages/google-python-class/](https://code.google.com/edu/languages/google-python-class/)

Я знаю, что это не отвечает на ваш полный вопрос, но я думаю, что это отличное место для начала!

 

Загрузите [Twisted](http://twistedmatrix.com/trac/wiki/Downloads) и посмотрите исходный код. Они используют некоторые довольно продвинутые методы.

 

  **Тщательно понять все типы данных и структуры**

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

 

Сначала я изучил python сам по себе летом, просто выполнив учебник на сайте python (к сожалению, я, похоже, больше не могу его найти, поэтому я не могу опубликовать ссылку).

Позже, питон учил меня на одном из моих первых курсов в университете. Летом после этого я практиковал с [PythonChallenge](http://www.pythonchallenge.com/) и с проблемами из [Замятие кода Google](https://code.google.com/codejam/).
Решение этих проблем помогает с точки зрения алгоритма, а также с точки зрения изучения того, что может сделать Python, и как манипулировать им, чтобы получить максимальную отдачу от python.

По тем же причинам, я слышал, что [code golf](http://codegolf.com/) работает, но я никогда не пробовал это для себя.

 

 Изучение алгоритмов/математика/файл Оптимизация IO/Pythonic
------------------------------------------------------------

Это не даст вам гуру-капюшон, но для начала, попробуйте выполнить [проблемы Эйлера проекта](https://projecteuler.net/)
Первые 50 или около того не должны облагать вас налогом, если у вас есть приличная математика средней школы и вы знаете, как Google. Когда вы решаете вопрос, вы попадаете на форум, где вы можете просматривать решения других людей, которые научат вас еще больше. Будьте достойны, хотя и не публикуйте свои решения, так как идея состоит в том, чтобы побудить людей работать над собой.

Принуждение к работе на Python будет неумолимым, если вы используете алгоритмы грубой силы.
Это научит вас размещать большие массивы данных в памяти и эффективно обращаться к ним с помощью быстрых языковых функций, таких как словари.

  **Из этого я узнал:**

* Файл IO
* Алгоритмы и методы, такие как динамическое программирование
* Схема данных Python
	+ Словари /HashMaps
	+ Списки
	+ кортежи
	+ Различные их комбинации, например. словари к спискам кортежей
* Генераторы
* Рекурсивные функции
* Разработка библиотек Python
	+ Макет файловой системы
	+ Перезагрузка их во время сеанса интерпретатора

  **И также очень важно**

* Когда сдавать и использовать C или С++!

  **Все это должно иметь отношение к биоинформатике**

По общему признанию, я не узнал о возможностях OOP Python из этого опыта.

 

Вы видели книгу " [Программирование биоинформатики с использованием Python](https://oreilly.com/catalog/9780596154516/)"? Похоже, вы являетесь точным членом своей фокус-группы.

 

У вас уже есть много материалов для чтения, но если вы можете справиться больше, я рекомендую вам
узнайте об эволюции python, прочитав предложения по улучшению Python, особенно "завершенные" PEP и "отложенные, заброшенные, отложенные и отклоненные" PEP.

Увидев, как изменился язык, принятые решения и их обоснования, вы поймете философию Python и поймете, как происходит "идиоматический Python".

 [http://www.python.org/dev/peps/](https://www.python.org/dev/peps/)

 

Попытка <http://challenge.greplin.com/> с использованием Python

 

Преподавание кому-то еще, кто начинает изучать Python, всегда отличное средство, чтобы ваши идеи были понятны, а иногда я обычно получаю от учеников много опрятных вопросов, которые позволяют мне переосмыслить концептуальные вещи о Python.

 

Не совсем то, о чем вы просите, но я думаю, что это хороший совет.

Изучите другой язык, неважно, слишком много. На каждом языке есть свои идеи и соглашения, из которых вы можете учиться. Узнайте о различиях в языках и, что более важно, `why` они разные. Попробуйте чисто функциональный язык, такой как Haskell, и посмотрите на некоторые из преимуществ (и проблем) функций, свободных от побочных эффектов. Посмотрите, как вы можете применить некоторые вещи, которые вы изучаете на других языках, к Python.

 

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