Caminho de progressão do Python - de aprendiz a guru

659

Estou aprendendo, trabalhando e brincando com o Python há um ano e meio. Como um biólogo que está lentamente se voltando para a bioinformática, essa linguagem tem sido o cerne de todas as principais contribuições que fiz no laboratório. Eu me apaixonei mais ou menos pela maneira como o Python me permite expressar soluções bonitas e também pela semântica da linguagem que permite um fluxo tão natural dos pensamentos para o código viável.

O que eu gostaria de saber é a sua resposta para um tipo de pergunta que raramente vejo neste ou em outros fóruns. Essa pergunta me parece central para qualquer pessoa no caminho para a melhoria do Python, mas que se pergunta quais devem ser seus próximos passos.

Deixe-me resumir o que NÃO quero perguntar primeiro;)

  • Eu não quero saber como aprender rapidamente Python
  • Também não quero descobrir a melhor maneira de me familiarizar com o idioma
  • Finalmente, não quero conhecer uma abordagem de "um truque que faz tudo".

O que eu quero saber sua opinião é:

Quais são as etapas que você recomendaria a um viajante do Python, do estágio ao status de guru (sinta-se à vontade para parar onde quer que sua experiência o exija), para que um MELHOREI CONSTANTEMENTE, tornando-se um codificador Python cada vez melhor. Algumas pessoas no SO quase parecem dignas de adoração por suas proezas em Python, por favor, nos esclareça :)

O tipo de resposta que eu gostaria (mas fique à vontade para surpreender os leitores: P) é formatado mais ou menos assim:

  • Leia isto (por exemplo: tutorial python), preste atenção a esse tipo de detalhes
  • Código para tantas vezes / problemas / linhas de código
  • Então, leia isto (por exemplo: este ou aquele livro), mas desta vez, preste atenção a este
  • Enfrente alguns problemas da vida real
  • Em seguida, continue lendo Y.
  • Certifique-se de entender esses conceitos
  • Código para X tempo
  • Volte a essas e tais noções básicas ou avance para ...
  • (você entendeu :)

Eu realmente me preocupo em conhecer sua opinião sobre o que exatamente alguém deve prestar atenção, em vários estágios, para progredir CONSTANTEMENTE (com os devidos esforços, é claro). Se você vem de um campo específico de especialização, discuta o caminho que você vê como apropriado nesse campo.

EDIT: Graças à sua excelente contribuição, estou de volta à trilha de melhoria do Python! Eu realmente aprecio!

Morlock
fonte

Respostas:

471

Eu pensei que o processo de domínio do Python foi algo como:

  1. Descubra as compreensões da lista
  2. Descubra geradores
  3. Incorpore frequentemente o mapa, reduza, filtre, iter, alcance, xrange no seu código
  4. Discover Decorators
  5. Escreva funções recursivas, muito
  6. Descubra itertools e functools
  7. Leia o Mundo Real Haskell ( leia gratuitamente online )
  8. Reescreva todo o seu código Python antigo com toneladas de funções de ordem superior, recursão e outros enfeites.
  9. Irrite seus companheiros de cubículo toda vez que apresentarem uma classe Python. Afirme que poderia ser "melhor" implementado como um dicionário, além de algumas funções. Aceite a programação funcional.
  10. Redescubra o padrão da estratégia e, em seguida, todas essas coisas do código imperativo que você tentou esquecer depois de Haskell.
  11. Encontre um equilíbrio.
trigo
fonte
@wheaties Lista super agradável, adorei! Você parece ter um viés em direção à programação funcional e longe da orientação a objetos ... existe um motivo específico? A experiência da Haskell o redirecionou para essa abordagem?
quer
8
Sim e não. Acho que escrevo códigos melhores e mais concisos quanto mais chego à programação funcional. Dito isto, há muitos lugares onde as coisas são expressas mais claramente de maneira imperativa. Há uma razão pela qual o Real World Haskell está esgotado nas convenções do Python, faz de você um programador melhor. Meu conselho, explore o máximo possível de facetas do Python e tente uma linguagem funcional.
wheaties
O @wheaties recebe a resposta, pois é o mais próximo do formato solicitado e muito inspirador. Obrigado por tomar o seu tempo para responder!
Morlock
1
Iniciantes: Dicionário então mais tarde ... Domínio: Metaprogramação
gath
Você poderia elaborar >> que poderia ser "melhor" implementado como um dicionário, além de algumas funções. <<?
Koobz
108

Uma boa maneira de aprimorar seu conhecimento em Python é se aprofundar no código-fonte das bibliotecas, plataformas e estruturas que você já usa.

Por exemplo, se você estiver criando um site no Django , muitas perguntas que podem ser difíceis de serem respondidas podem ser respondidas olhando como o Django implementa o recurso em questão.

Dessa forma, você continuará a captar novos idiomas, estilos de codificação e truques em Python . (Alguns serão bons e outros serão ruins.)

E quando vir algo Pythony que você não entende na fonte, vá até o canal #python IRC e você encontrará muitos "advogados de idiomas" felizes em explicar.

Um acúmulo desses pequenos esclarecimentos ao longo dos anos leva a uma compreensão muito mais profunda da linguagem e de todos os seus meandros.

dkamins
fonte
1
Eu acrescentaria que, em vez de simplesmente instalar uma extensão / plugin django, tente adicionar o código manualmente usando um ramo git. Isso forçará você a realmente ler o código que está adicionando ao projeto.
precisa saber é o seguinte
14
Estou curioso por que usar o IRC quando o resto de nós pode se beneficiar da pergunta?
tshepang
1
+1 para "expressões idiomáticas, estilos e truques". Viver uma CULTURA real feita por pessoas reais em contato (mesmo que esse contato signifique principalmente ler o código um do outro nesse caso) é o que sempre fez o conhecimento humano EVOLVER ao longo do tempo.
21813 heltonbiker
92

Entenda (mais profundamente) os tipos de dados do Python e suas funções com relação ao gerenciamento de memória

Como alguns de vocês sabem, eu ensino os cursos de Python , sendo os mais populares o abrangente curso Intro + Intermediário, bem como um curso "avançado", que apresenta uma variedade de áreas de desenvolvimento de aplicativos.

Freqüentemente, recebo uma pergunta bastante semelhante a: "Devo fazer seu curso de introdução ou avançado? Eu já estou programando Python por 1-2 anos e acho que a introdução é muito simples para mim, então eu gostaria de pular direto para o avançado ... qual curso você recomendaria? "

Para responder à pergunta deles, sondo para ver quão fortes eles são nessa área - não que seja realmente a melhor maneira de avaliar se eles estão prontos para um curso avançado, mas para ver quão bem seu conhecimento básico é sobre os objetos do Python e modelo de memória, que é causa de muitos erros do Python escritos por aqueles que não são apenas iniciantes, mas também aqueles que foram além disso.

Para fazer isso, aponto-os para esta simples questão de perguntas em duas partes: Ex1: x = 42;  y = x;  x + = 1;  imprima x, y Ex2: x = [1,2,3]; y = x; x [0] = 4; imprima x, y

Muitas vezes, eles são capazes de obter a saída, mas o porquê é mais difícil e muito mais importante de uma resposta ... Eu consideraria a saída como 20% da resposta, enquanto o "por que" recebe 80% de crédito. Se eles não conseguem entender o porquê, independentemente da experiência que têm em Python, eu sempre direcionarei as pessoas para o curso intro + intermediário abrangente, porque passo uma palestra sobre objetos e gerenciamento de memória até o ponto em que você deve responder com o saída e o porquê com confiança suficiente. (Só porque você conhece a sintaxe do Python após 1-2 anos não o prepara para ir além de um rótulo "iniciante" até que você tenha uma compreensão muito melhor sobre como o Python funciona nos bastidores.)

Uma investigação posterior que exija uma resposta semelhante é ainda mais difícil, por exemplo,

Exemplo 3

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

Os próximos tópicos que recomendo são entender bem a contagem de referência, aprender o que significa "internar" (mas não necessariamente usá-lo), aprender sobre cópias rasas e profundas (como no Exemplo 3 acima) e, finalmente, as inter-relações entre os vários tipos e construções na linguagem, isto é, listas vs. tuplas, dictos vs. conjuntos, compreensões de listas vs. expressões geradoras, iteradores x geradores, etc .; no entanto, todas essas outras sugestões são outro post para outra hora. Espero que isso ajude enquanto isso! :-)

ps. Eu concordo com as outras respostas para ficar mais íntimo com a introspecção, além de estudar o código-fonte de outros projetos e adicionar um "+1" forte às duas sugestões!

pps. Ótima pergunta entre. Eu gostaria de ter sido inteligente o suficiente no começo para perguntar algo assim, mas isso foi há muito tempo, e agora estou tentando ajudar outras pessoas com meus muitos anos de programação em Python em tempo integral!

wescpy
fonte
Wesley Chun! Morlock, esse é o tipo de cara que você estava falando na parte em negrito da sua pergunta. Um sujeito profundamente qualificado que também é um professor muito talentoso, recebi um grande impulso do livro.
desmontado
thx @bvmou! só pude responder a essa pergunta porque tive que passar por esse processo de aprendizado como todo mundo ... só o meu era há 13 anos! :-) thx para conectar corepython.com tho! :-)
wescpy
@ wescpy Você pode me explicar a saída por exemplo3 ou me apontar um bom recurso para aprender essas coisas.
precisa saber é o seguinte
1
O truque é que apenas as referências de objetos são copiadas, não os próprios objetos. É só isso ... espero que ajude! Dei uma palestra sobre isso há algumas semanas, na OSCON. Fiquei agradavelmente surpreendido quando alguém me disse que foi a palestra sobre Python mais bem avaliada na conferência! Você pode baixar os slides aqui: oscon.com/oscon2013/public/schedule/detail/29374
wescpy
A saída é SyntaxError: sintaxe inválida, não é? Por quê? Porque eu usei o Python 3 e printnão é uma declaração.
Konrad Borowski
67

Confira o ensaio de Peter Norvig sobre como se tornar um programador mestre em 10 anos: http://norvig.com/21-days.html . Aposto que isso vale para qualquer idioma.

twneale
fonte
59

Entenda a introspecção

  • escreva um dir()equivalente
  • escreva um type()equivalente
  • descobrir como "macaco-patch"
  • use o dismódulo para ver como várias construções de linguagem funcionam

Fazendo essas coisas

  • fornecer um bom conhecimento teórico sobre como o python é implementado
  • dar uma boa experiência prática em programação de nível inferior
  • dar uma boa sensação intuitiva para estruturas de dados python
Mark Harrison
fonte
1
"Escreva um type()equivalente" que seria muito difícil se você tomar as especificações completas de 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?
amit
fonte
4
guru () deve ser aprovado. nada pode descrever o guru, deixe passar
inv
1
Se você consertar o GIL, acho que isso o coloca em um nível MAIS ALTO que o guru, mas logo abaixo do ditador benevolente. ;)
Adam Parkin
41

Darei a você o conselho mais simples e eficaz que eu acho que alguém poderia lhe dar: código .

Você só pode ser melhor usando uma linguagem (o que implica entendê-la) codificando . Você precisa gostar ativamente da codificação, ser inspirado, fazer perguntas e encontrar respostas sozinho.

Tem uma hora de sobra? Escreva um código que inverta uma string e descubra a melhor solução. Uma noite livre? Por que não tentar alguns scraping na web. Leia o código de outras pessoas. Veja como eles fazem as coisas. Pergunte a si mesmo o que você faria.

Quando estou entediado com o computador, abro meu IDE e a tempestade de códigos. Anoto idéias que parecem interessantes e desafiadoras. Um encurtador de URL? Claro, eu posso fazer isso. Ah, eu aprendi como converter números de uma base para outra como efeito colateral!

Isso é válido independentemente do seu nível de habilidade. Você nunca para de aprender. Ao codificar ativamente no seu tempo livre, você vai, com pouco esforço adicional, entender o idioma e, finalmente, se tornar um guru. Você criará conhecimento e código reutilizável e memorizará expressões idiomáticas.

Humphrey Bogart
fonte
24

Se você usa e usa python para a ciência (o que parece que você é), parte disso será aprender e entender bibliotecas científicas, para mim essas

  • entorpecido
  • escamoso
  • matplotlib
  • mayavi / mlab
  • chaco
  • Cython

saber como usar as bibliotecas corretas e vetorizar seu código é essencial para a computação científica.

Eu queria acrescentar que lidar com grandes conjuntos de dados numéricos de formas pitônicas comuns (abordagens orientadas a objetos, listas, iteradores) pode ser extremamente ineficiente. Na computação científica, pode ser necessário estruturar seu código de maneiras que diferem drasticamente da maneira como a maioria dos codificadores python convencionais aborda os dados.

user503635
fonte
Obrigado. Certamente vale a pena reservar um tempo para aprender entorpecido e sofisticado para obter eficiência no uso de memória para grandes conjuntos de dados!
Morlock
1
Provavelmente adicione pandas e IPython à lista.
Eric Wilson
20

Baixe o Twisted e veja o código fonte. Eles empregam algumas técnicas bastante avançadas.

Jason Christa
fonte
12

Compreender completamente todos os tipos e estruturas de dados

Para cada tipo e estrutura, escreva uma série de programas de demonstração que exercitam todos os aspectos do tipo ou estrutura de dados. Se você fizer isso, pode valer a pena fazer anotações no blog de cada uma ... pode ser útil para muitas pessoas!

Mark Harrison
fonte
Isso não seria útil apenas em Python, mas também como em um sentido abstrato.
Humphrey Bogart
1
Isso é algo que eu faço também, sempre que encontro uma nova construção, escrevo um programa de brinquedos mostrando como usá-la. E colocá-lo on-line em um repo github: github.com/pzelnip/MiscPython
Adam Parkin
10

Eu aprendi python primeiro sozinho durante o verão, apenas fazendo o tutorial no site python (infelizmente, não consigo mais encontrar isso, então não consigo postar um link).

Mais tarde, python me foi ensinado em um dos meus primeiros anos de curso na universidade. No verão seguinte, eu pratiquei com PythonChallenge e com problemas do Google Code Jam . A solução desses problemas ajuda a partir de uma perspectiva algorítmica e também da perspectiva de aprender o que o Python pode fazer, bem como de como manipulá-lo para obter o máximo proveito do python.

Por razões semelhantes, ouvi dizer que o código golf também funciona, mas nunca tentei por mim mesmo.

inspectorG4dget
fonte
3
Você quer dizer este tutorial? Python 2: docs.python.org/tutorial/index.html ; Python 3: docs.python.org/py3k/tutorial/index.html .
Humphrey Bogart
10

Algoritmos de aprendizagem / matemática / IO de arquivos / Otimização Pythonic

Isso não fará com que você se divirta, mas, para começar, tente resolver os problemas do Project Euler os Os primeiros 50 ou mais não devem cobrar impostos se você tem matemática decente no ensino médio e sabe como o Google. Quando você resolve uma delas, entra no fórum, onde pode ver as soluções de outras pessoas que o ensinarão ainda mais. Seja decente e não publique suas soluções, pois a idéia é incentivar as pessoas a resolvê-las por si mesmas.

Forçar-se a trabalhar em Python será implacável se você usar algoritmos de força bruta. Isso ensinará como organizar grandes conjuntos de dados na memória e acessá-los de maneira eficiente com os recursos de linguagem rápida, como dicionários.

Ao fazer isso eu aprendi:

  • Arquivo IO
  • Algoritmos e técnicas como Programação Dinâmica
  • Layout de dados Python
    • Dicionários / hashmaps
    • Listas
    • Tuplas
    • Várias combinações dos mesmos, por exemplo, dicionários para listas de tuplas
  • Geradores
  • Funções recursivas
  • Desenvolvendo bibliotecas Python
    • Layout do sistema de arquivos
    • Recarregando-os durante uma sessão de intérprete

E também muito importante

  • Quando desistir e usar C ou C ++!

Tudo isso deve ser relevante para a Bioinformática

É certo que não aprendi sobre os recursos OOP do Python com essa experiência.

Capitão Lepton
fonte
3
Gosto do site de PE, mas vamos ser honestos: é um site de matemática, não um site de programação. A maioria dos problemas (ou pelo menos a maioria dos que eu já fiz) se resume a conhecer alguns truques de matemática do que qualquer coisa relacionada à linguagem de programação. Muitas vezes as boas soluções nos fóruns se afogado por ondas de soluções ingênuas, etc.
Adam Parkin
Pelo contrário, descobri que envolvia a aplicação das habilidades de programação e matemática e, mais importante, a combinação das duas para resolver problemas reais. Você não pode usar o PE para aprender programação em Python se tiver poucas habilidades em matemática, mas só aprenderá a usar uma linguagem usando-a, por isso é ideal se sua matemática for boa o suficiente.
Captain Lepton
7

Você já viu o livro " Programação em Bioinformática usando Python "? Parece que você é um membro exato do grupo de foco.

Tim Pietzcker
fonte
2
Depois de analisar rapidamente o livro há algum tempo, descobri que este livro não é muito interessante. Ele é voltado para usuários muito iniciantes de Python e os problemas em si não são extremamente interessantes. Pena que esta é claramente uma área em que o uso do Python está aumentando. Um livro mais estimulante teria sido ótimo.
Morlock
6

Você já tem muito material de leitura, mas se puder lidar com mais, recomendo que você aprenda sobre a evolução do python lendo as Propostas de aprimoramento do Python, especialmente as PEPs "concluídas" e as "adiadas, abandonadas, retiradas e rejeitadas" PEPs.

Ao ver como a linguagem mudou, as decisões que foram tomadas e suas razões, você absorverá a filosofia do Python e entenderá como o "Python idiomático" acontece.

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

Greg Ball
fonte
3

Ensinar a alguém que está começando a aprender Python é sempre uma ótima maneira de deixar suas idéias claras e, às vezes, geralmente recebo muitas perguntas interessantes de alunos que me levam a repensar coisas conceituais sobre Python.

Marc-Olivier Titeux
fonte
2

Não é exatamente o que você está pedindo, mas acho que é um bom conselho.

Aprenda outro idioma, não importa muito qual. Cada idioma tem suas próprias idéias e convenções que você pode aprender. Aprenda sobre as diferenças nos idiomas e, mais importante, whyeles são diferentes. Tente uma linguagem puramente funcional como Haskell e veja alguns dos benefícios (e desafios) de funções livres de efeitos colaterais. Veja como você pode aplicar algumas das coisas que aprendeu de outros idiomas ao Python.

Davy8
fonte
1
Haskell é intrigante e sou atraído por Lisp, mas sinto que ainda há muito a descobrir no mundo Python antes de seguir em frente.
quer
2
O landoflisp (.com) chamou minha atenção recentemente.
Jiaaro
Se o pensamento de ninguém sobre Lisp, eu recomendo Esquema
Tharindu Rusira
2

Eu recomendo começar com algo que o force a explorar o poder expressivo da sintaxe. O Python permite muitas maneiras diferentes de escrever a mesma funcionalidade, mas geralmente existe uma abordagem mais elegante e rápida. Se você está acostumado com os idiomas de outros idiomas, nunca poderá encontrar ou aceitar essas maneiras melhores. Passei um fim de semana vasculhando os primeiros 20 problemas do Project Euler e fiz um webapp simples com o Django no Google App Engine. Isso só o levará de aprendiz a iniciante, talvez, mas você poderá continuar a criar aplicativos da Web um pouco mais avançados e resolver problemas mais avançados do Project Euler. Depois de alguns meses, voltei e resolvi os primeiros 20 problemas de EP em uma hora, em vez de um fim de semana.

hus787
fonte