Путь развития питона - от ученика до гуру
Я учусь, работаю и играю с Python уже полтора года. Как биолог, медленно делающий поворот к биоинформатике, этот язык был в самом центре всех основных вкладов, которые я сделал в лаборатории. Я более или менее влюбился в то, как Python позволяет мне выражать красивые решения, а также в семантику языка, которая позволяет такой естественный поток от мыслей к работоспособному коду.
Что я хотел бы знать ваше ответ на такой вопрос, я редко видел на этом или других форумах. Этот вопрос кажется мне центральным для всех, кто находится на пути к улучшению Python, но кто задается вопросом, какими должны быть его следующие шаги.
позвольте мне подвести итог тому, что я не хочу спрашивать в первую очередь;)
- Я не хочу знать, как быстро выучить Python
- и я не хочу, чтобы узнать лучший способ познакомиться с языком
- наконец, я не хочу знать одну хитрость, что это все подход.
то, что я хочу знать Ваше мнение о том, является:
какие шаги вы бы порекомендовали подмастерью Python, от ученичества до статуса Гуру (не стесняйтесь останавливаться там, где это диктует ваш опыт), чтобы постоянно совершенствоваться, становясь все лучше и лучше Python coder, один шаг за раз. Некоторые из людей на так почти кажутся достойными поклонения за их мастерство питона, пожалуйста, просветите нас :)
вид ответов, которые мне понравились бы (но не стесняйтесь удивлять читателей :P ), отформатирован более или менее так:
- прочитайте это (например: python tutorial), обратите внимание на такие детали
- код для так много времени / проблем / строк кода
- затем прочитайте это (например: ту или иную книгу), но на этот раз обратите внимание на это
- решить несколько реальных проблем
- затем перейдите к чтению Я.
- обязательно поймите эти понятия
- код для X раз
- вернитесь к таким-то основам или двигайтесь дальше...
- (вы получите точку :)
Мне очень важно знать Ваше мнение о том, на что именно нужно обращать внимание, на разных этапах, чтобы постоянно прогрессировать (с должными усилиями, конечно). Если вы пришли из определенной области знаний, обсудите путь, который вы видите в этом поле.
EDIT: благодаря вашему большому вкладу, я вернулся на путь улучшения Python! Я действительно ценю!
19 ответов:
Я думал, что процесс Python мастерства пошел что-то вроде:
- открыть списочные включения
- открыть генераторы
- включить map, reduce, filter, iter, range, xrange часто в коде
- открыть декораторы
- писать рекурсивные функции, много
- открыть itertools и functools
- читать Реальный Мир Хаскелл (читать бесплатно онлайн)
- перепишите весь свой старый код Python с тоннами функций более высокого порядка, рекурсии и еще много чего.
- раздражайте своих товарищей по кабине каждый раз, когда они представляют вам класс Python. Утверждают, что это может быть "лучше" реализовано в виде словаря плюс некоторые функции. Объятия функционального программирования.
- открыть стратегия шаблон а потом все эти вещи из императивного кода Вы так старались забыть после Haskell.
- найти баланс.
один хороший способ расширить свои знания Python-это покопаться в исходном коде библиотек, платформ и фреймворков, которые вы уже используете.
например, если вы строите сайт на Джанго, многие вопросы, которые могут поставить вас в тупик, можно ответить, посмотрев, как Django реализует рассматриваемую функцию.
таким образом, вы будете продолжать возьмите новые идиомы, стили кодирования и трюки Python. (Некоторые будут хороши и некоторые будут плохими.)
и когда вы видите что-то питон, что вы не понимаете в источнике, перейти к каналу # python IRC и вы найдете много "языковых юристов", которые будут рады объяснить.
накопление этих небольших разъяснений в течение многих лет приводит к гораздо более глубокому пониманию языка и всех его входов и выходов.
понять (более глубоко) типы данных Python и их роли в отношении памяти mgmt
как некоторые из вас в сообществе известны, Я преподаю курсы по Python, наиболее популярными из них являются комплексный вводный+промежуточный курс, а также "продвинутый" курс, который вводит различные области разработки приложений.
довольно часто мне задают вопрос, очень похожий на: "Должен ли я взять ваше вступление или продвинутый конечно? Я уже программирую Python в течение 1-2 лет, и я думаю, что введение слишком просто для меня, поэтому я хотел бы перейти прямо к advanced... какой курс будет вы рекомендуете?"
чтобы ответить на их вопрос, я исследую, насколько они сильны в этой области-не то, чтобы это действительно лучший способ измерить, готовы ли они к любому продвинутому курсу, но чтобы увидеть, насколько хорошо их базовые знания об объектах Python и модели памяти, что является причиной много ошибки Python написаны теми, кто не только новички, но и те, кто вышел за рамки этого.
чтобы сделать это, я указываю им на этот простой вопрос викторины из 2 частей:
много раз, они могут получить выход, но почему является более сложным и гораздо более важным ответом... Я бы взвесил результат как 20% ответа, А "почему" получает 80% кредита. Если они не могут получить, почему, независимо от того, как питон опыт у них есть, я всегда буду направлять людей на всеобъемлющий вводный + промежуточный курс, потому что я провожу одну лекцию по объектам и управлению памятью до такой степени, что вы должны быть в состоянии ответить с выходом и почему с достаточной уверенностью. (Только потому, что вы знаете синтаксис 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 выше) и, наконец, взаимосвязи между различными типами и конструкциями на языке, т. е. списки против кортежей, дикты против наборов, списки понимания против выражений генератора, итераторы и генераторы и т. д.; однако все эти другие предложения-это еще один пост в другое время. Надеюсь, что это поможет в то же время! : -)
ps. Я согласен с другими ответами для более близкого знакомства с интроспекцией, а также изучения исходного кода других проектов и добавления сильного "+1" к обоим предложениям!
pps. Отличный вопрос кстати. Я хотел бы быть достаточно умным в начале, чтобы спросить что-то вроде этого, но это было давно, и теперь я пытаюсь чтобы помочь другим с моей многолетней полной занятостью программированием на Python!!
ознакомьтесь с эссе Питера Норвига о том, как стать мастером-программистом через 10 лет:http://norvig.com/21-days.html держу пари, что это справедливо для любого языка.
Понимают Самоанализ
- написать
dir()эквивалентно- написать
type()эквивалентно- выяснить, как "обезьяна-патч"
- использовать
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 для науки (что, похоже, так и есть), частью этого будет изучение и понимание научных библиотек, для меня это будет
- включает в себя
- составляющей
- matplotlib
- mayavi / mlab
- Чако
- Cython
знание того, как использовать правильные библиотеки и векторизовать ваш код, имеет важное значение для научных вычислений.
Я хотел добавить, что, обработки больших числовых наборов данных в общие данные способы(объектно-ориентированный подходы, списки, итераторы), может быть крайне неэффективным. В научных вычислениях может быть необходимо структурировать ваш код способами, которые резко отличаются от того, как большинство обычных кодеров python подходят к данным.
Google только недавно выпустила онлайн-класс Python ("класс", как в"курсе обучения").
http://code.google.com/edu/languages/google-python-class/
Я знаю, что это не ответ на ваш полный вопрос, но я думаю, что это отличное место для начала!
скачать Twisted и посмотрите на исходный код. Они используют некоторые довольно продвинутые методы.
полностью понять все типы данных и структуры
для каждого типа и структуры напишите серию демонстрационных программ, которые реализуют каждый аспект типа или структуры данных. Если вы сделаете это, возможно, стоит вести заметки в блоге на каждом из них... это может быть полезно для многих людей!
Я узнал python сначала сам за лето, просто выполнив учебник на сайте python (к сожалению, я больше не могу найти это, поэтому я не могу опубликовать ссылку).
позже python был преподан мне на одном из моих первых курсов в университете. Летом я тренировался с PythonChallenge и с проблемами от Google Code Jam. Решение этих задач помогает как с алгоритмической точки зрения, так и с точки зрения перспектива изучения того, что Python может делать, а также Как манипулировать им, чтобы получить максимальную отдачу от python.
по аналогичным причинам, я слышал, что гольф-кода работает так же, но я никогда не пробовал его для себя.
алгоритмы обучения / математика / файл IO / Pythonic оптимизация
это не поможет вам гуру-капот, но чтобы начать, попробуйте работать через задачи проекта Эйлера Первые 50 или около того не должны облагать вас налогом, если у вас есть приличная математика в средней школе и вы знаете, как Google. Когда вы решаете один, вы попадаете на форум, где вы можете просматривать решения других людей, которые научат вас еще большему. Будьте достойны, хотя и не публикуйте свои решения, поскольку идея заключается в том, чтобы стимулировать людей к работе на себя.
заставлять себя работать на Python будет непростительно, если вы используете алгоритмы грубой силы. Это научит вас, как выкладывать большие наборы данных в памяти и эффективно обращаться к ним с помощью быстрых языковых функций, таких как словари.
сделать это сам я узнал:
- File IO
- алгоритмы и методы, такие как динамическое программирование
- Python структура данных
- словари / хэш-карты
- списки
- ОК
- различные их комбинации, например, словари для списков кортежей
- генераторы
- рекурсивные функции
- разработка библиотек Python
- макет файловой системы
- перезагрузка их во время сеанса интерпретатора
а также очень главное
- когда отказаться и использовать C или c++!
все это должно иметь отношение к биоинформатике
по общему признанию, я не узнал об особенностях ООП Python из этого опыта.
вы видели книгу" биоинформатическое Программирование с использованием Python"? Похоже, ты точно член его фокус-группы.
У вас уже есть много материала для чтения, но если вы можете справиться больше, я рекомендую вам узнайте об эволюции python, прочитав предложения по улучшению Python, особенно "готовые" PEPs и" отложенные, заброшенные, отозванные и отклоненные " PEPs.
увидев, как изменился язык, принятые решения и их обоснования, вы впитаете философию Python и поймете, как приходит " идиоматический Python о.
Попытка http://challenge.greplin.com/ использование Python
обучение кого-то еще, кто начинает изучать Python, всегда является отличным способом прояснить ваши идеи, и иногда я обычно получаю много аккуратных вопросов от студентов, которые заставляют меня переосмыслить концептуальные вещи о Python.
Не совсем то, что вы просите, но я думаю, что это хороший совет.
выучить другой язык, не имеет большого значения, какой именно. Каждый язык имеет свои собственные идеи и соглашения, которые вы можете узнать. Узнайте о различиях в языках и что еще более важно
whyОни разные. Попробуйте чисто функциональный язык, такой как Haskell, и посмотрите на некоторые преимущества (и проблемы) функций, свободных от побочных эффектов. Посмотрите, как вы можете применить некоторые из вещей, которые вы учиться у других языков на Python.
Я рекомендую начать с того, что заставляет вас исследовать выразительную силу синтаксиса. Python позволяет использовать множество различных способов написания одной и той же функциональности, но часто существует один самый элегантный и быстрый подход. Если вы привыкли к идиомам других языков, вы никогда не сможете найти или принять эти лучшие способы. Я провел выходные, тащась через первые 20 или около того Проект Эйлера проблемы и сделал простой веб-приложение с Django на Google App Двигатель. Это только приведет вас от ученика к новичку, может быть, но вы можете продолжать делать несколько более продвинутые веб-приложения и решать более сложные проблемы Project Euler. Через несколько месяцев я вернулся и решил первые 20 проблем PE с нуля за час вместо выходных.
![Ex1: x=42; y=x; x+=1; print x,y Ex2: x=[1,2,3];y=x;x[0]=4;print x,y](/images/content/2573135/ea7ec79015dd7a09f8de4d47879c6fc7.png)
Comments