lenguaje - Ruta de progresión de Python-De aprendiz a gurú
python tutorial (19)
He estado aprendiendo, trabajando y jugando con Python durante un año y medio. Como un biólogo que está cambiando lentamente a la bioinformática, este lenguaje ha sido el núcleo de todas las contribuciones más importantes que he realizado en el laboratorio. Más o menos me enamoré de la manera en que Python me permite expresar hermosas soluciones y también con 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 cualquiera en el camino hacia la mejora de Python, pero quién se pregunta cuáles deberían ser sus próximos pasos.
Déjame resumir lo que NO quiero preguntar primero;)
- No quiero saber cómo aprender rápidamente Python
- Tampoco quiero descubrir la mejor manera de familiarizarse con el idioma.
- Finalmente, no quiero saber el enfoque de ''un truco que lo hace todo''.
Lo que sí quiero saber de tu opinión, es:
¿Cuáles son los pasos que USTED recomendaría a un oficial de Python, desde el aprendizaje hasta el estado de gurú (no dude en detenerse donde lo requiera su experiencia), para que 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ínense :)
El tipo de respuestas que disfrutaría (pero siéntase libre de sorprender a los lectores: P), se formatea más o menos así:
- Lee esto (por ejemplo: tutorial de Python), presta 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 ese libro), pero esta vez, preste atención a esto
- Enfrenta algunos problemas de la vida real.
- Luego, proceda a leer Y.
- Asegúrate de entender estos conceptos
- Código de tiempo X
- Vuelva a lo básico o muévase más lejos para ...
- (tú entiendes :)
Realmente me importa saber tu opinión sobre a qué se debe prestar atención exactamente, en varias etapas, para progresar CONSTANTEMENTE (con los esfuerzos debidos, por supuesto). Si proviene de un campo específico de experiencia, discuta la ruta que considera apropiada en este campo.
EDITAR: Gracias a su excelente aportación, estoy de vuelta en la pista de mejoras de Python. ¡Realmente lo aprecio!
Algoritmos de aprendizaje / matemáticas / archivo IO / optimización de Pythonic
Esto no le permitirá ser un gurú, pero para comenzar, intente resolver los problemas del Proyecto Euler. Los primeros 50 más o menos no deberían cobrarle impuestos si tiene una buena educación secundaria y sabe cómo hacer 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. Sea decente y no publique sus soluciones, ya que la idea es animar a las personas a que lo hagan por sí mismas.
Forzarte a trabajar en Python será implacable si usas 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.
De hacerlo 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
- Recargarlos durante una sesión de intérprete
Y también muy importante
- ¡Cuándo renunciar y usar C o C ++!
Todo esto debe ser relevante para la bioinformática.
Es cierto que no aprendí sobre las características OOP de Python a partir de esa experiencia.
¿Has visto el libro " Programación bioinformática usando Python "? Parece que eres un miembro exacto de su grupo de enfoque.
Aprendí python primero por mi cuenta 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 . Resolver estos problemas ayuda desde una perspectiva algorítmica, así como desde la perspectiva de aprender qué puede hacer Python y cómo manipularlo para obtener el máximo rendimiento 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.
Descarga Twisted y mira el código fuente. Emplean algunas técnicas bastante avanzadas.
Enseñar a alguien que está empezando a aprender Python es siempre una buena manera de aclarar sus ideas y, a veces, generalmente recibo muchas preguntas ingeniosas de los estudiantes que me tienen que volver a pensar cosas conceptuales sobre Python.
Google acaba de lanzar una clase de Python en línea ("clase" como en "un curso de estudio").
http://code.google.com/edu/languages/google-python-class/
Sé que esto no responde tu pregunta completa, ¡pero creo que es un buen lugar para comenzar!
Intente http://challenge.greplin.com/ utilizando Python
No precisamente lo que estás pidiendo, pero creo que es un buen consejo.
Aprende otro idioma, no importa mucho cual. Cada idioma tiene sus propias ideas y convenciones de las que puedes aprender. Conozca las diferencias en los idiomas y, why
que es más importante, why
qué 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.
Pensé que el proceso de dominio de Python fue algo así como:
- Descubrir lista de comprensiones.
- Descubrir generators
- Incorpore map, reduce, filtre, iter, rango, rango a menudo en su código
- Descubrir Decorators
- Escribir funciones recursivas, mucho
- Descúbrelo en itertools y functools
- Lee Real World Haskell ( lee gratis en línea )
- Reescriba todo su antiguo código Python con toneladas de funciones de orden superior, recursión y todo eso.
- Molesta a tus compañeros de cubículo cada vez que te presentan una clase de Python. Afirmar que podría ser "mejor" implementado como un diccionario más algunas funciones. Abrazar la programación funcional.
- Redescubre el patrón de Strategy y luego todas esas cosas del imperativo código que intentaste olvidar después de Haskell.
- Encuentra un equilibrio.
Recomiendo comenzar con algo que te obligue a explorar el poder expresivo de la sintaxis. Python permite muchas formas diferentes de escribir la misma funcionalidad, pero a menudo existe el enfoque más elegante y rápido. Si está acostumbrado a las expresiones idiomáticas de otros idiomas, nunca podría encontrar o aceptar estas mejores formas. Pasé un fin de semana recorriendo los primeros 20 o más problemas del Proyecto Euler e hice una aplicación web sencilla con Django en Google App Engine. Tal vez esto solo lo llevará de aprendiz a principiante, pero luego puede continuar haciendo aplicaciones web algo más avanzadas y resolver problemas más avanzados de Project Euler. Después de unos meses volví y resolví los primeros 20 problemas de PE desde cero en una hora en lugar de un fin de semana.
Si estás usando Python para la ciencia (lo cual parece que eres) parte de eso será el aprendizaje y la comprensión de las bibliotecas científicas, para mí esto sería
- adormecido
- scipy
- matplotlib
- mayavi / mlab
- chaco
- Cython
Saber cómo usar las bibliotecas adecuadas y vectorizar su código es esencial para la computación científica.
Quería agregar que, el manejo de 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 pitón convencionales abordan los datos.
Te daré el consejo más simple y efectivo que creo que cualquiera podría darte: el código .
Solo puede ser mejor usando un lenguaje (lo que implica entenderlo) mediante la codificación . Tienes que disfrutar activamente de la codificación, inspirarte, hacer preguntas y encontrar respuestas por ti mismo.
¿Tienes una hora de sobra? Escriba un código que invierta una cadena y descubra la solución más óptima. ¿Una tarde libre? ¿Por qué no probar algún raspado web? Lea el código de otros pueblos. Mira cómo hacen las cosas. Pregúntate a ti mismo qué harías.
Cuando me aburro en mi computadora, abro mi IDE y la tormenta de códigos. Anoto las ideas que suenan interesantes y desafiantes. ¿Un acortador de URL? Claro, puedo hacer eso. ¡Oh, aprendí a convertir los números de una base a otra como efecto secundario!
Esto es válido independientemente de su 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ú. Usted acumulará conocimientos y códigos reutilizables y memorizará los modismos.
Una buena manera de ampliar su conocimiento de Python es profundizar en el código fuente de las bibliotecas, plataformas y marcos que ya utiliza.
Por ejemplo, si está construyendo un sitio en Django , muchas preguntas que podrían dejarlo atónito pueden responderse observando cómo Django implementa la función en cuestión.
De esta manera, continuarás recogiendo 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 comprende en la fuente, vaya al canal IRC #python y encontrará un montón de "abogados lingüísticos" 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.
Vea el ensayo de Peter Norvig sobre cómo convertirse en un programador maestro en 10 años: http://norvig.com/21-days.html . Apostaría que es cierto para cualquier idioma.
Ya tienes un montón de material de lectura, pero si puedes manejar más, te recomiendo que aprendas sobre la evolución de python leyendo las Propuestas de mejora de Python, especialmente los PEP "Acabados" y los "Aplazado, Abandonado, Retirado y Rechazado" PEPs.
Al ver cómo ha cambiado el lenguaje, las decisiones que se tomaron y sus razones, absorberás la filosofía de Python y entenderás cómo se produce el "Python idiomático".
Comprender (más profundamente) los tipos de datos de Python y sus roles con respecto a la administración de memoria
Como algunos de ustedes en la comunidad saben, yo imparto cursos de Python , los más populares son el curso Intro + Intermediate completo, así como un curso "avanzado" que presenta una variedad de áreas de desarrollo de aplicaciones.
Muy a menudo, me hacen una pregunta bastante similar a la de "¿Debo tomar su curso de introducción o curso avanzado? Ya he programado Python durante 1 o 2 años, y creo que la introducción es demasiado simple para mí, así que quiere saltar directamente a lo avanzado ... ¿qué curso recomendaría? "
Para responder a su pregunta, intento ver qué tan fuertes son en esta área; no es que realmente sea la mejor manera de medir si están preparados para un curso avanzado, sino para ver qué tan bien conocen sus conocimientos básicos de los objetos de Python y El modelo de memoria, que es la causa de muchos errores de Python escritos por aquellos que no solo son principiantes sino que han ido más allá de eso.
Para hacer esto, les señalo esta sencilla pregunta de dos partes:
Muchas veces, pueden obtener la salida, pero el por qué es más difícil y mucho más importante de una respuesta ... Yo consideraría la salida como el 20% de la respuesta, mientras que el "por qué" obtiene un 80% de crédito. Si no pueden entender el por qué, independientemente de la experiencia de Python que tengan, siempre guiaré a las personas hacia el curso integral de introducción + intermedio porque dedico una clase a la gestión de memoria y objetos hasta el punto en el que debería poder responder con el Salida y el porqué con suficiente confianza. (El hecho de que sepa que la sintaxis de Python después de 1 o 2 años no lo hace listo para ir más allá de la etiqueta de "principiante" hasta que tenga una mejor comprensión de cómo funciona Python bajo las sábanas).
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 recuento de referencias, aprender lo que significa "internar" (pero no necesariamente usarlo), aprender sobre copias superficiales y profundas (como en el Ejemplo 3 anterior) y, finalmente, las interrelaciones entre los distintos tipos y construcciones en el lenguaje, es decir, listas vs. tuplas, dictos vs. conjuntos, listas de comprensión vs. expresiones generadoras, iteradores vs. 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 tener más intimidad 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 como 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 de Python a tiempo completo !!
Comprender a fondo todos los tipos de datos y estructuras
Para cada tipo y estructura, escriba una serie de programas de demostración que ejerzan cada aspecto del tipo o estructura de datos. Si haces esto, podría valer la pena escribir notas en el blog sobre cada una ... ¡puede ser útil para mucha gente!
Entender la introspección
- escribe un
dir()
equivalente - escribe un
type()
equivalente - averiguar cómo "monkey-patch"
- Usa el módulo
dis
para ver cómo funcionan varias construcciones de lenguaje.
Haciendo estas cosas
- Darle un buen conocimiento teórico sobre cómo se implementa Python.
- Darte una buena experiencia práctica en programación de nivel inferior.
- Proporcionar una buena sensación intuitiva de las estructuras de datos de 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?