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

659

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

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Благодаря вашему великому вкладу, я вернулся на трек улучшения Python! Я действительно ценю!

Морлок
источник

Ответы:

471

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

  1. Откройте список понимания
  2. Откройте для себя генераторы
  3. Включите в свой код карту, уменьшите, отфильтруйте, итерируйте, выберите диапазон, сделайте xrange
  4. Откройте для себя декораторы
  5. Написать рекурсивные функции, много
  6. Discover itertools и functools
  7. Читайте Real World Haskell ( читайте бесплатно онлайн )
  8. Перепишите весь ваш старый код Python с помощью множества функций более высокого порядка, рекурсии и еще много чего.
  9. Раздражайте своих товарищей по кабинке каждый раз, когда они представляют вам класс Python. Утверждают, что это может быть «лучше» реализовано в виде словаря плюс некоторые функции. Охватите функциональное программирование.
  10. Откройте заново шаблон Стратегии , а затем все эти вещи из императивного кода, который вы так старались забыть после Хаскелла.
  11. Найти баланс.
Wheaties
источник
@wheaties Супер хороший список, люблю его! Похоже, у вас есть склонность к функциональному программированию и отходу от объектно-ориентированного ... есть ли конкретная причина? Опыт Haskell перенаправил вас к этому подходу?
Морлок
8
Да и нет. Я нахожу, что пишу лучше и лаконичнее, чем ближе к функциональному программированию. Тем не менее, есть много мест, где вещи выражаются более четко в императивной манере. Есть причина, по которой Real World Haskell продается на соглашениях Python, это делает вас лучшим программистом. Мой совет, изучите как можно больше аспектов Python, затем попробуйте функциональный язык.
пшеница
@wheaties получает ответ, так как он ближе к запрашиваемому формату и очень вдохновляет. Спасибо, что нашли время ответить!
Морлок
1
Новички: словарь, а потом ... Мастерство: метапрограммирование
gath
Не могли бы вы пояснить, что >> может быть «лучше» реализовано в виде словаря плюс некоторые функции. <<?
Кообз
108

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

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

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

И когда вы увидите что-то Pythony, которого вы не понимаете в источнике, перейдите на IRC-канал #python, и вы найдете множество «языковых адвокатов», которые с удовольствием объяснят.

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

dkamins
источник
1
Я бы добавил к этому, что вместо простой установки расширения / плагина django, попробуйте добавить код вручную, используя ветку git. Это заставит вас фактически прочитать код, который вы добавляете в проект.
g33kz0r
14
Любопытно, зачем использовать IRC, когда остальные могут извлечь пользу из Вопроса?
Чепанг
1
+1 за "идиомы, стили и хитрости". Жить настоящей КУЛЬТУРОЙ, созданной реальными людьми, с которыми мы общаемся (даже если этот контакт подразумевает в основном чтение кода друг друга), это то, что когда-либо заставляло человеческие знания эволюционировать со временем.
Хелтонбайкер
92

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

Как известно некоторым из вас в сообществе, я преподаю курсы Python , наиболее популярными из которых являются комплексный курс Intro + Intermediate, а также «продвинутый» курс, который знакомит с различными областями разработки приложений.

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

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

Чтобы сделать это, я указываю им на этот простой вопрос из двух частей: Ех1: х = 42;  у = х;  х + = 1;  печать 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» к обоим предложениям!

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

wescpy
источник
Уэсли Чун! Морлок, это тот парень, о котором ты говорил в жирной части твоего вопроса. Глубоко знающий парень, который также был очень одаренным учителем, я получил огромный импульс от книги.
размонтировано
спасибо @bvmou! Я мог ответить только на этот вопрос, потому что я должен был пройти этот процесс обучения, как и все остальные ... только мой был 13 лет назад! :-) Спасибо за подключение corepython.com tho! :-)
wescpy
@wescpy Можете ли вы объяснить мне вывод для example3 или указать хороший ресурс для изучения этого материала. Спасибо.
Санкальп
1
Хитрость в том, что копируются только ссылки на объекты, а не сами объекты. Это все, что нужно ... надеюсь, это поможет! Я говорил об этом несколько недель назад, на самом деле в OSCON. Я был приятно удивлен, когда кто-то сказал мне, что это был самый высокий рейтинг Python на конференции! Вы можете скачать слайды здесь: oscon.com/oscon2013/public/schedule/detail/29374
wescpy
Вывод: SyntaxError: неверный синтаксис, не так ли? Почему? Потому что я использовал Python 3, а printне заявление.
Конрад Боровски,
67

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

twneale
источник
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

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

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

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

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

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

Хамфри Богарт
источник
24

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

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

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

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

user503635
источник
Спасибо. Конечно, стоит потратить время на то, чтобы научиться наглому и проницательному, чтобы повысить эффективность использования памяти для больших наборов данных!
Морлок
1
Возможно, добавьте панд и IPython в список.
Эрик Уилсон
23

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

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

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

dkamins
источник
6
на самом деле, эти видео-лекции от Google, как мне кажется, больше ориентированы на промежуточные и продвинутые. code.google.com/intl/fi-FI/edu/languages/…
Том Уиллис,
20

Скачайте Twisted и посмотрите на исходный код. Они используют довольно продвинутые методы.

Джейсон Криста
источник
12

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

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

Марк Харрисон
источник
Это было бы полезно не только в Python, но и в абстрактном смысле.
Хамфри Богарт
1
Это то, что я делаю также, всякий раз, когда я нахожу новую конструкцию, я пишу игрушечную программу, показывающую, как ее использовать. И поместите это онлайн в репозитории github: github.com/pzelnip/MiscPython
Адам Паркин
10

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

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

По тем же причинам я слышал, что Code Golf тоже работает, но я никогда не пробовал это для себя.

inspectorG4dget
источник
3
Вы имеете в виду этот урок? Python 2: docs.python.org/tutorial/index.html ; Python 3: docs.python.org/py3k/tutorial/index.html .
Хамфри Богарт
10

Алгоритмы обучения / математика / файловый ввод-вывод / оптимизация Pythonic

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

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

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

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

А также очень важно

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

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

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

Капитан лептон
источник
3
Мне нравится сайт PE, но давайте будем честны: это математический сайт, а не сайт программирования. Большинство проблем (или, по крайней мере, большинство из тех, что я делал) на самом деле сводятся к знанию нескольких математических трюков, чем что-либо связанное с языком программирования. Часто хорошие решения на форумах заглушаются волнами наивных решений и т. Д.
Адам Паркин
Напротив, я обнаружил, что это связано с применением навыков программирования и математики и, что наиболее важно, сочетанием этих двух факторов для решения реальных задач. Вы не можете использовать PE для изучения программирования на Python, если у вас плохие навыки математики, но вы только научитесь использовать язык, используя его, поэтому он идеально подходит, если ваши математики достаточно хороши.
Капитан Лептон
7

Вы видели книгу " Программирование в биоинформатике с использованием Python "? Похоже, вы точный член его фокус-группы.

Тим Питцкер
источник
2
Некоторое время назад, быстро изучив книгу, я обнаружил, что эта книга не очень интересна. Он ориентирован на очень начинающих пользователей Python, и сами проблемы не очень интересны. Жаль, это явно область, где использование Python увеличивается. Более стимулирующая книга была бы великолепна.
Морлок
6

У вас уже есть много материалов для чтения, но если вы можете справиться с большим количеством вопросов, я рекомендую вам узнать об эволюции Python, прочитав предложения по улучшению Python, особенно «Законченные» PEP и «Отложенные, оставленные, изъятые и отклоненные» ВПД.

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

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

Грег Болл
источник
3

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

Марк-Оливье Титё
источник
2

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

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

Davy8
источник
1
Haskell интригует, и меня тянет к Lisp, но я чувствую, что мне еще многое предстоит открыть в мире Python, прежде чем я захочу двигаться дальше.
Морлок
2
landoflisp (.com) недавно привлек мое внимание.
Джиаро
Если кто-то думает о Лиспе, я рекомендую Scheme
Tharindu Rusira
2

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

hus787
источник