Ruta de progresión de Python: de aprendiz a gurú

659

He estado aprendiendo, trabajando y jugando con Python durante un año y medio. Como biólogo que lentamente se está volcando a la bioinformática, este lenguaje ha sido el núcleo de todas las principales contribuciones que he hecho en el laboratorio. Me enamoré más o menos de la forma en que Python me permite expresar hermosas soluciones y también de la semántica del lenguaje que permite un flujo tan natural de los pensamientos al código viable.

Lo que me gustaría saber es su respuesta a un tipo de pregunta que rara vez he visto en este u otros foros. Esta pregunta me parece central para cualquier persona en el camino hacia la mejora de Python, pero que se pregunta cuáles deberían ser sus próximos pasos.

Permítanme resumir lo que NO quiero preguntar primero;)

  • No quiero saber cómo aprender rápidamente Python
  • Tampoco quiero encontrar la mejor manera de familiarizarme con el idioma.
  • Finalmente, no quiero conocer el enfoque de 'un truco que lo hace todo'.

De lo que sí quiero saber tu opinión es sobre:

¿Cuáles son los pasos que USTED recomendaría a un viajero de Python, desde el aprendizaje hasta el estado de gurú (siéntase libre de detenerse donde su experiencia lo dicte), para que uno MEJORE CONSTANTEMENTE, convirtiéndose en un mejor y mejor codificador de Python, paso a paso. Algunas de las personas en SO casi parecen dignas de adoración por su destreza en Python, por favor, ilumínanos :)

El tipo de respuestas que disfrutaría (pero no dude en sorprender a los lectores: P), está formateado más o menos de esta manera:

  • Lea esto (por ejemplo: tutorial de Python), preste atención a ese tipo de detalles
  • Código para tantas veces / problemas / líneas de código
  • Luego, lea esto (por ejemplo: este o aquel libro), pero esta vez, preste atención a esto
  • Afronte algunos problemas de la vida real
  • Luego, proceda a leer Y.
  • Asegúrese de comprender estos conceptos
  • Código para el tiempo X
  • Vuelva a lo básico o avance más para ...
  • (tú entiendes :)

Realmente me importa saber su opinión sobre a qué se debe prestar atención, en varias etapas, para progresar CONSTANTEMENTE (con el debido esfuerzo, por supuesto). Si proviene de un campo específico de especialización, discuta la ruta que ve según corresponda en este campo.

EDITAR: Gracias a su gran aporte, ¡estoy de vuelta en la pista de mejora de Python! ¡Realmente lo aprecio!

Morlock
fuente

Respuestas:

471

Pensé que el proceso de dominio de Python fue algo como:

  1. Descubre listas de comprensiones
  2. Descubre generadores
  3. Incorpore mapa, reduzca, filtre, iter, rango, xrange a menudo en su código
  4. Descubre decoradores
  5. Escribe funciones recursivas, mucho
  6. Descubre itertools y functools
  7. Lea el mundo real Haskell ( lea gratis en línea )
  8. Vuelva a escribir todo su antiguo código de Python con toneladas de funciones de orden superior, recursividad y demás.
  9. Molesta a tus compañeros de cubículo cada vez que te presenten una clase de Python. Afirma que podría implementarse "mejor" como un diccionario más algunas funciones. Abraza la programación funcional.
  10. Vuelva a descubrir el patrón de Estrategia y luego todas esas cosas del código imperativo que trató de olvidar después de Haskell.
  11. Encuentra un equilibrio.
trigo
fuente
@wheaties Lista super bonita, ¡me encanta! Parece tener un sesgo hacia la programación funcional y lejos de la orientación a objetos ... ¿hay alguna razón en particular? ¿Te ha redirigido la experiencia de Haskell hacia este enfoque?
Morlock
8
Si y no. Creo que escribo un código mejor y más conciso cuanto más me acerco a la programación funcional. Dicho esto, hay muchos lugares donde las cosas se expresan más claramente de manera imperativa. Hay una razón por la que Real World Haskell está agotado en las convenciones de Python, te hace un mejor programador. Mi consejo, explore todas las facetas de Python que pueda, luego pruebe un lenguaje funcional.
wheaties
@wheaties recibe la respuesta, ya que es más cercana al formato solicitado y muy inspiradora. ¡Gracias por tomarte tu tiempo para responder!
Morlock
1
Principiantes: Diccionario luego más tarde ... Dominio: Metaprogramación
gath
¿Podría dar más detalles >> podría implementarse "mejor" como un diccionario más algunas funciones. <<?
Koobz
108

Una buena manera de ampliar su conocimiento de Python es profundizar en el código fuente de las bibliotecas, plataformas y marcos que ya usa.

Por ejemplo, si está creando un sitio en Django , se pueden responder muchas preguntas que podrían confundirlo al observar cómo Django implementa la función en cuestión.

De esta manera, continuarás aprendiendo nuevos modismos, estilos de codificación y trucos de Python . (Algunos serán buenos y otros serán malos).

Y cuando vea algo de Pythony que no entienda en la fuente, diríjase al canal #python IRC y encontrará muchos "abogados de idiomas" felices de explicar.

Una acumulación de estas pequeñas aclaraciones a lo largo de los años conduce a una comprensión mucho más profunda del lenguaje y todos sus entresijos.

dkamins
fuente
1
Agregaría a esto que en lugar de simplemente instalar una extensión / complemento django, intente agregar el código manualmente usando una rama git. Esto lo obligará a leer el código que está agregando al proyecto.
g33kz0r
14
Tengo curiosidad por qué usar IRC cuando el resto de nosotros podría beneficiarse de la pregunta.
tshepang
1
+1 para "modismos, estilos y trucos". Vivir una CULTURA real hecha por personas reales en contacto (incluso si este contacto significa leer principalmente el código del otro en este caso) es lo que ha hecho que el conocimiento humano EVOLUCIONE con el tiempo.
heltonbiker
92

Comprender (más profundamente) los tipos de datos de Python y sus roles con respecto a la gestión de memoria

Como algunos de ustedes en la comunidad saben, enseño cursos de Python , los más populares son el curso completo Intro + Intermedio, así como un curso "avanzado" que introduce una variedad de áreas de desarrollo de aplicaciones.

Muy a menudo, me hacen una pregunta bastante similar a: "¿Debo tomar tu introducción o curso avanzado? Ya he estado programando Python durante 1-2 años, y creo que la introducción es demasiado simple para mí, así que como para saltar directamente a la avanzada ... ¿Qué curso se recomienda?"

Para responder a su pregunta, investigo para ver qué tan fuertes son en esta área, no es que sea realmente la mejor manera de medir si están listos para un curso avanzado, sino para ver qué tan bien son sus conocimientos básicos de los objetos de Python y modelo de memoria, que es la causa de muchos errores de Python escritos por aquellos que no solo son principiantes sino también aquellos que han ido más allá.

Para hacer esto, les señalo esta simple pregunta de 2 partes: Ex1: x = 42;  y = x;  x + = 1;  imprimir x, y Ex2: x = [1,2,3]; y = x; x [0] = 4; imprimir x, y

Muchas veces, son capaces de obtener el resultado, pero el por qué es más difícil y mucho más importante de una respuesta ... Yo consideraría el resultado como el 20% de la respuesta, mientras que el "por qué" obtiene el 80% de crédito. Si no pueden entender por qué, independientemente de la experiencia de Python que tengan, siempre guiaré a las personas al curso completo de introducción + intermedio porque paso una conferencia sobre objetos y administración de memoria hasta el punto en el que debería poder responder con el salida y el por qué con suficiente confianza. (El hecho de que conozca la sintaxis de Python después de 1-2 años no lo prepara para ir más allá de una etiqueta de "principiante" hasta que tenga una mejor comprensión de cómo Python funciona debajo de las cubiertas).

Una consulta posterior que requiera una respuesta similar es aún más difícil, por ejemplo,

Ejemplo 3

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

Los siguientes temas que recomiendo son comprender bien el conteo de referencias, aprender lo que significa "internamiento" (pero no necesariamente usarlo), aprender sobre copias superficiales y profundas (como en el Ejemplo 3 anterior) y, finalmente, las interrelaciones entre los diversos tipos y construcciones en el lenguaje, es decir, listas frente a tuplas, dictados frente a conjuntos, listas de comprensión frente a expresiones generadoras, iteradores frente a generadores, etc .; Sin embargo, todas esas otras sugerencias son otra publicación para otro momento. Espero que esto ayude mientras tanto! :-)

PD. ¡Estoy de acuerdo con las otras respuestas para intimar más con la introspección, así como para estudiar el código fuente de otros proyectos y agregar un fuerte "+1" a ambas sugerencias!

pps. Gran pregunta por cierto. Desearía ser lo suficientemente inteligente al principio para haber preguntado algo como esto, pero eso fue hace mucho tiempo, ¡y ahora estoy tratando de ayudar a otros con mis muchos años de programación Python a tiempo completo!

wescpy
fuente
Wesley Chun! Morlock, este es el tipo de persona del que estabas hablando en la parte en negrita de tu pregunta. Un tipo muy conocedor que también es un maestro muy talentoso, recibí un gran impulso del libro.
desmontado el
gracias @bvmou! Solo pude responder esta pregunta porque tuve que pasar por este proceso de aprendizaje como todos los demás ... ¡solo el mío fue hace 13 años! :-) gracias por conectar corepython.com aunque! :-)
wescpy
@wescpy ¿Puede explicarme la salida, por ejemplo, 3 o señalarme un buen recurso para aprender estas cosas? Gracias.
Sankalp
1
El truco es que solo se copian referencias de objetos, no los objetos en sí. Eso es todo lo que hay que hacer ... ¡espero que ayude! Realicé una charla sobre esto hace unas semanas en realidad, en OSCON. ¡Me sorprendió gratamente cuando alguien me dijo que era la charla de Python mejor calificada en la conferencia! Puede descargar las diapositivas aquí: oscon.com/oscon2013/public/schedule/detail/29374
wescpy
El resultado es SyntaxError: sintaxis no válida, ¿no? ¿Por qué? Porque he usado Python 3, y printno es una declaración.
Konrad Borowski el
67

Echa un vistazo al ensayo de Peter Norvig sobre cómo convertirte en un maestro programador en 10 años: http://norvig.com/21-days.html . Apuesto a que es cierto para cualquier idioma.

twneale
fuente
59

Comprender la introspección

  • escribe un dir() equivalente
  • escribe un type() equivalente
  • averiguar cómo "parche de mono"
  • utilizar el dis módulo para ver cómo funcionan las diversas construcciones de lenguaje

Hacer estas cosas lo hará

  • darle un buen conocimiento teórico sobre cómo se implementa Python
  • darle una buena experiencia práctica en la programación de nivel inferior
  • darle una buena sensación intuitiva para las estructuras de datos de Python
Mark Harrison
fuente
1
¡"Escriba un type()equivalente" que sería muy difícil si toma la especificación completa de metaclases de 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
fuente
44
guru () debe ser aprobado. nada puede describir al gurú, déjalo pasar
inv
1
Si arreglas el GIL, entonces creo que eso te coloca en un nivel MÁS ALTO que el gurú, pero justo debajo del dictador benevolente. ;)
Adam Parkin
41

Te daré el consejo más simple y efectivo que creo que cualquiera podría darte: código .

Solo puedes ser mejor usando un lenguaje (lo que implica entenderlo) codificando . Tienes que disfrutar activamente de la codificación, inspirarte, hacer preguntas y encontrar respuestas por ti mismo.

¿Tienes una hora libre? Escriba código que revierta una cadena y descubra la solución más óptima. ¿Una tarde libre? ¿Por qué no probar un poco de raspado de la web? Lea el código de otras personas. Mira cómo hacen las cosas. Pregúntate qué harías.

Cuando estoy aburrido en mi computadora, abro mi IDE y tormenta de códigos. Anoto ideas que suenan interesantes y desafiantes. ¿Un acortador de URL? Claro, puedo hacer eso. ¡Oh, aprendí cómo convertir números de una base a otra como efecto secundario!

Esto es válido sea cual sea tu nivel de habilidad. Nunca dejas de aprender. Al codificar activamente en su tiempo libre, con poco esfuerzo adicional, llegará a comprender el idioma y, en última instancia, se convertirá en un gurú. Desarrollará conocimiento y código reutilizable y memorizará expresiones idiomáticas.

Humphrey Bogart
fuente
24

Si estás usando Python para la ciencia (lo que parece que eres), parte de eso será aprender y comprender las bibliotecas científicas, para mí estas serían

  • numpy
  • escoria
  • matplotlib
  • mayavi / mlab
  • chaco
  • Cython

Saber cómo utilizar las bibliotecas adecuadas y vectorizar su código es esencial para la informática científica.

Quería agregar que manejar grandes conjuntos de datos numéricos en formas pitónicas comunes (enfoques orientados a objetos, listas, iteradores) puede ser extremadamente ineficiente. En computación científica, puede ser necesario estructurar su código de manera que difiera drásticamente de la forma en que la mayoría de los codificadores de python convencionales abordan los datos.

usuario503635
fuente
Gracias. ¡Ciertamente vale la pena tomarse el tiempo para aprender numpy y scipy para ganar eficiencia en el uso de la memoria para grandes conjuntos de datos!
Morlock
1
Probablemente agregue pandas e IPython a la lista.
Eric Wilson
20

Descargar Twisted y mira el código fuente. Emplean algunas técnicas bastante avanzadas.

Jason Christa
fuente
12

Comprenda a fondo todos los tipos y estructuras de datos

Para cada tipo y estructura, escriba una serie de programas de demostración que ejerciten cada aspecto del tipo o estructura de datos. Si haces esto, podría valer la pena escribir notas en el blog sobre cada uno ... ¡podría ser útil para mucha gente!

Mark Harrison
fuente
Esto no solo sería útil en Python, sino también en sentido abstracto.
Humphrey Bogart
1
Esto es algo que hago también, cada vez que encuentro una nueva construcción escribo un programa de juguetes que muestra cómo usarlo. Y ponerlo en línea en un repositorio de github
Adam Parkin
10

Aprendí Python primero solo durante un verano solo haciendo el tutorial en el sitio de Python (lamentablemente, parece que ya no puedo encontrar eso, así que no puedo publicar un enlace).

Más tarde, Python me fue enseñado en uno de mis cursos de primer año en la universidad. En el verano que siguió, practiqué con PythonChallenge y con problemas de Google Code Jam . La solución de estos problemas ayuda desde una perspectiva algorítmica, así como desde la perspectiva de aprender qué puede hacer Python y cómo manipularlo para sacar el máximo provecho de Python.

Por razones similares, he oído que el código de golf también funciona, pero nunca lo he probado por mí mismo.

inspectorG4dget
fuente
3
¿Te refieres a este tutorial? Python 2: docs.python.org/tutorial/index.html ; Python 3: docs.python.org/py3k/tutorial/index.html .
Humphrey Bogart
10

Algoritmos de aprendizaje / matemáticas / archivo IO / optimización Pythonic

Esto no te hará gurú, pero para empezar, intenta resolver los problemas del Proyecto Euler. Los primeros 50 más o menos no deberían gravarte si tienes buenas matemáticas en la escuela secundaria y sabes cómo buscar en Google. Cuando resuelves uno, entras en el foro donde puedes ver las soluciones de otras personas que te enseñarán aún más. Sin embargo, sea decente y no publique sus soluciones, ya que la idea es alentar a las personas a que lo resuelvan por sí mismas.

Obligarse a trabajar en Python será implacable si utiliza algoritmos de fuerza bruta. Esto le enseñará cómo diseñar grandes conjuntos de datos en la memoria y acceder a ellos de manera eficiente con las funciones de lenguaje rápido como los diccionarios.

Al hacer esto yo mismo aprendí:

  • Archivo IO
  • Algoritmos y técnicas como la programación dinámica
  • Diseño de datos de Python
    • Diccionarios / hashmaps
    • Liza
    • Tuplas
    • Varias combinaciones de los mismos, por ejemplo, diccionarios a listas de tuplas.
  • Generadores
  • Funciones recursivas
  • Desarrollando bibliotecas de Python
    • Diseño del sistema de archivos
    • Recargándolos durante una sesión de intérprete

Y también muy importante

  • ¡Cuándo darse por vencido y usar C o C ++!

Todo esto debería ser relevante para la bioinformática

Es cierto que no aprendí sobre las características OOP de Python de esa experiencia.

Capitán Lepton
fuente
3
Me gusta el sitio de educación física, pero seamos honestos: es un sitio de matemáticas, no un sitio de programación. La mayoría de los problemas (o al menos la mayoría de los que he hecho) realmente se reducen a conocer algunos trucos matemáticos que cualquier cosa relacionada con el lenguaje de programación. A menudo, las buenas soluciones en los foros se ven ahogadas por las oleadas de soluciones ingenuas, etc.
Adam Parkin
Por el contrario, descubrí que implicaba la aplicación de habilidades de programación y matemáticas y, lo más importante, la combinación de ambos para resolver problemas reales. No puede usar PE para aprender la programación de Python si tiene pocas habilidades matemáticas, pero solo aprenderá a usar un lenguaje usándolo, por lo que es ideal si su matemática es lo suficientemente buena.
Capitán Lepton
7

¿Has visto el libro " Programación de bioinformática usando Python "? Parece que eres un miembro exacto de su grupo de enfoque.

Tim Pietzcker
fuente
2
Después de revisar rápidamente el libro hace algún tiempo, descubrí que este libro no es muy interesante. Está dirigido a usuarios de Python muy novatos y los problemas en sí mismos no son extremadamente interesantes. Lástima, esta es claramente un área donde el uso de Python está aumentando. Un libro más estimulante hubiera sido genial.
Morlock
6

Ya tiene mucho material de lectura, pero si puede manejar más, le recomiendo que aprenda sobre la evolución de Python leyendo las Propuestas de mejora de Python, especialmente las PEP "Terminadas" y las "Diferidas, Abandonadas, Retiradas y Rechazadas" PEP

Al ver cómo ha cambiado el lenguaje, las decisiones que se tomaron y sus fundamentos, absorberá la filosofía de Python y comprenderá cómo surge la "Python idiomática".

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

Greg Ball
fuente
3

Enseñar a alguien más que está comenzando a aprender Python siempre es una excelente manera de aclarar sus ideas y, a veces, generalmente recibo muchas preguntas interesantes de los estudiantes que me obligan a repensar cosas conceptuales sobre Python.

Marc-Olivier Titeux
fuente
2

No es exactamente lo que estás pidiendo, pero creo que es un buen consejo.

Aprende otro idioma, no importa demasiado cuál. Cada idioma tiene sus propias ideas y convenciones de las que puedes aprender. Aprenda sobre las diferencias en los idiomas y, lo whyque es más importante , son diferentes. Pruebe un lenguaje puramente funcional como Haskell y vea algunos de los beneficios (y desafíos) de las funciones sin efectos secundarios. Vea cómo puede aplicar algunas de las cosas que aprende de otros idiomas a Python.

Davy8
fuente
1
Haskell es intrigante, y me siento atraído por Lisp, pero siento que aún me queda mucho por descubrir en el mundo de Python antes de seguir adelante.
Morlock
2
Landoflisp (.com) me ha llamado la atención recientemente.
Jiaaro
Si alguien está pensando en Lisp, recomiendo Scheme
Tharindu Rusira
2

Recomiendo comenzar con algo que lo obligue a explorar el poder expresivo de la sintaxis. Python permite muchas formas diferentes de escribir la misma funcionalidad, pero a menudo existe un enfoque único, más elegante y rápido. Si está acostumbrado a las expresiones idiomáticas de otros idiomas, es posible que nunca encuentre o acepte estas mejores formas. Pasé un fin de semana caminando por los primeros 20 problemas del Proyecto Euler y creé una aplicación web sencilla con Django en Google App Engine. Esto solo lo llevará de aprendiz a novato, tal vez, pero luego puede continuar creando aplicaciones web algo más avanzadas y resolver problemas más avanzados del Proyecto Euler. Después de unos meses volví y resolví los primeros 20 problemas de EP desde cero en una hora en lugar de un fin de semana.

hus787
fuente