tutorial resueltos programar español ejercicios diario desde cero blog aprende python

resueltos - ¿Qué desearías haber sabido cuando comenzaste a aprender Python?



programar en python 2 (29)

Decidí aprender Python 3. Para aquellos que han ido antes, ¿qué te pareció más útil en el camino y desearía haber sabido antes?


  1. Ojalá no supiera Java.
  2. Programación más funcional. (ver módulo de itertools, lista de comprensión, mapa (), reducir () o filtrar ())

Aprendí Python antes de la versión 1.5.2, por lo que las cosas que fueron clave para mí en ese momento pueden no ser las claves hoy en día.

Dicho esto, algo crucial que me llevó un poco darme cuenta, pero ahora lo considero crucial: mucha funcionalidad que otros lenguajes harían intrínseca está disponible en la biblioteca estándar y en las incorporadas.

El lenguaje en sí es pequeño y simple, pero hasta que esté familiarizado con los itertools integrados y las "partes centrales" de la biblioteca estándar (por ejemplo, hoy en día, sys , itertools , collections , copy , ...), tendrá reinventar la rueda una y otra vez Entonces, cuanto más tiempo inviertas en familiarizarte con esas partes, mejor será tu progreso. Cada vez que tiene una tarea que desea hacer, que no parece ser directamente compatible con el idioma, primero pregúntese: qué incorporaciones o módulos en la biblioteca estándar harán la tarea mucho más simple, o incluso lo harán todo ¿para mi? Algunas veces no habrá ninguna, pero la mayoría de las veces encontrarás excelentes soluciones al proceder con esta mentalidad.


Aprenda cómo usar iPython Tiene la terminación de pestañas. Ver todos los elementos en su espacio de nombres con ''whos''.

Después de importar un módulo, es fácil ver el código:

>>> import os >>> os?? # this display the actual source of the method >>> help() # Python''s interactive help. Fantastic!

La mayoría de los módulos de Python están bien documentados; en teoría, podría aprender iPython y el resto de lo que necesita saber podría aprenderse a través de la misma herramienta.

iPython también tiene un modo de depuración, pdb (). Finalmente, incluso puede usar iPython como una línea de comando habilitada para Python. Los comandos básicos de UNIX funcionan como% de métodos mágicos. Cualquier comando que no sea comando mágico se puede ejecutar:

>>> os.system(''cp file1 file2'')


Bonita impresión:

>>> print "%s world" %(''hello'') hello world

% s para cadena

% d para entero

% f para flotar

% .xf para exactamente x muchos lugares decimales de un flotante. Si el flotante tiene decimales menores que los indicados, se suman los 0


Cierres Limpio y conciso, sin tener que recurrir al uso de un Patrón de Estrategia a diferencia de los lenguajes como Java


Completar pestaña y soporte de lectura general, incluidos los historiales, incluso en el shell de python normal.

$ cat ~/.pythonrc.py #!/usr/bin/env python try: import readline except ImportError: print("Module readline not available.") else: import rlcompleter readline.parse_and_bind("tab: complete") import os histfile = os.path.join(os.environ["HOME"], ".pyhist") try: readline.read_history_file(histfile) except IOError: pass import atexit atexit.register(readline.write_history_file, histfile) del os, histfile

y luego agrega una línea a tu .bashrc

export PYTHONSTARTUP=~/.pythonrc.py

Estas dos cosas conducen a un estilo de programación exploratoria de "parece que esta biblioteca puede hacer lo que quiero", así que enciendo el shell de python y luego uso el comando de completar tabulador y la ayuda () hasta que encuentre lo que necesitar.

Los generadores y las listas de comprensión son más útiles de lo que piensas. No solo ignóralos.


Cuando comencé con Python, comencé con los métodos principales de los ejemplos. Esto fue porque no sabía más, después de eso encontré this sobre cómo crear un mejor método principal.


Decoradores. Escribir el suyo no es algo que desee hacer de inmediato, pero saber que @staticmethod y @classmethod están disponibles desde el principio (y la diferencia entre lo que hacen) es una verdadera ventaja.


Desearía haber sabido de inmediato cómo codificar idiomáticamente en Python. Puede elegir el idioma que desee y comenzar a codificar en él como C, Java, etc., pero idealmente aprenderá a codificar en "el espíritu" del idioma. Python es particularmente relevante, ya que creo que tiene un estilo definido propio.

Aunque lo encontré un poco más tarde en mi carrera de Python de lo que me hubiera gustado, este excelente artículo resume muchos modismos de Python y los pequeños trucos que lo hacen especial. Varias de las cosas que las personas han mencionado en sus respuestas hasta ahora están contenidas en: .

¡Disfrutar!


Dos cosas que rompen el cerebro. Uno de los cuales no se aplica a Python 3.

a = 095

No funciona ¿Por qué? El cero inicial es un literal octal. El 9 no es válido en un literal octal.

def foo( bar=[] ): bar.append( 1 ) return bar

No funciona ¿Por qué? El objeto predeterminado mutable se vuelve a utilizar.


Ese multinúcleo era el futuro. Todavía me encanta Python. Escribe un poco de mi código para mí.



Herramientas de programación funcional, como all y any


Implementé muchas caminatas de directorio recursivas a mano antes de aprender sobre os.walk ()


Lista de comprensión (hace una lista limpia):

[x for x in y if x > z]

Expansión del generador (igual que la comprensión de la lista, pero no se evalúa hasta que se usa):

(x for x in y if x > z)


Lo que realmente me gustó: Lista de comprensiones, cierres (y funciones de alto orden), tuplas, funciones lambda, bignumbers indoloros.

Lo que desearía haber sabido antes: el hecho de que usar modismos de Python en código (por ejemplo, listas de comprensión en lugar de bucles sobre listas) era más rápido.



No tiene nombres de variables que son tipos. Por ejemplo, no nombre una variable "archivo" o "dict"


Ojalá supiera bien un lenguaje funcional. Después de jugar un poco con Clojure, me di cuenta de que muchas de las ideas funcionales de Python se toman prestadas de Lisp u otros lenguajes funcionales.


Que una tupla de un solo elemento debe terminar con una coma, o no se interpretará como una tupla.

pprint() es muy útil (sí, 2 p)

reload() es útil cuando vuelve a probar un módulo mientras realiza muchos cambios rápidos en un módulo dependiente.

Y aprende tantos "modismos" comunes como puedas, de lo contrario te golpearás la cabeza buscando una mejor manera de hacer algo, cuando el idioma realmente se considera la mejor manera (por ejemplo, expresiones feas como '' ''.join() , o la respuesta a por qué no hay una función isInt(string) .... la respuesta es que puede simplemente envolver el uso de un entero "posible" con una prueba: y luego capturar la excepción si no es una int válida. La solución funciona bien, pero suena como una respuesta terrible cuando la encuentras por primera vez, por lo que puedes perder mucho tiempo convenciéndote de que realmente es un buen enfoque.

Esas son algunas cosas que desperdiciaron varias horas de mi tiempo para determinar que mi primer borrador de un código que se sentía mal, realmente era aceptable.

Lecturas de python.org:

http://wiki.python.org/moin/BeginnerErrorsWithPythonProgramming http://wiki.python.org/moin/PythonWarts


Realmente me gusta la comprensión de listas y todas las demás construcciones semifuncionales. Ojalá los hubiera conocido cuando estaba en mi primer proyecto de Python.


Si aprendes de un buen libro, no solo te enseñará el idioma, sino que también te enseñará las expresiones comunes. Los modismos son valiosos.

Por ejemplo, aquí está el modismo estándar para inicializar una instancia de clase con una lista:

class Foo(object): def __init__(self, lst=None): if lst is None: self.lst = [] else: self.lst = lst

Si aprendes esto como un modismo de un libro, no tienes que aprender de la peor manera por qué este es el modismo estándar. @ S.Lott ya explicó esto: si intenta hacer que el inicializador predeterminado sea una lista vacía, la lista vacía se evalúa solo una vez (en tiempo de compilación) y cada instancia inicializada por defecto de su clase obtiene la misma instancia de lista, que no era lo que se pretendía aquí.

Algunas expresiones lo protegen de los efectos no intencionales; algunos lo ayudan a obtener el mejor rendimiento fuera del idioma; y algunos son solo pequeños puntos de estilo, que ayudan a otros entusiastas de Python a comprender mejor su código.

Aprendí del libro Learning Python y me presentó algunos de los modismos.

Aquí hay una página web dedicada a las expresiones idiomáticas:

El código PS Python que sigue las mejores prácticas idiomáticas de Python a menudo se llama código "Pythonic".


Sobreescritura secuencial de importaciones:

Si importa dos archivos como este:

from foo import * from bar import *

Si tanto foo.py como bar.py tienen una función llamada fubar (), habiendo importado los archivos de esta manera, cuando llame a fubar, se ejecutará fubar como se define en bar.py. La mejor manera de evitar esto es hacer esto:

import foo import bar

y luego llame a foo.fubar o bar.fubar. De esta forma, SIEMPRE sabrá qué definición de archivo de fubar se ejecutará.


Suelta al modo interactivo en IPython

from IPython.Shell import IPShellEmbed ipshell = IPShellEmbed() ipshell()


Tal vez un toque más avanzado, pero me gustaría saber que no usas hilos para aprovechar los múltiples núcleos en (C) python. Utiliza la biblioteca de multiprocessing .


Una de las cosas más geniales que aprendí recientemente fue el módulo de comandos:

>>> import commands >>> commands.getoutput(''uptime'') ''18:24 up 10:22, 7 users, load averages: 0.37 0.45 0.41''

Es como os.popen o os.system pero sin todas las Warnings de Deprecation.

Y no nos olvidemos de PDB (Python Debugger):

% python -m pdb poop.py



  • Para qué enumerate es.
  • Ese seq = seq.append(item) y seq = seq.sort() ambos configuran seq en None .
  • Usando set para eliminar duplicados.
  • itertools todo en los módulos itertools y collections .
  • Cómo funcionan los prefijos * y ** para los argumentos de la función.
  • Cómo funcionan los argumentos predeterminados para las funciones internamente (es decir, qué f.func_defaults es).
  • Cómo (por qué, realmente) diseñar funciones para que sean útiles junto con el map y el zip .
  • El papel de __dict__ en las clases.
  • ¿Qué import realmente hace?

  • usando help() en el shell en cualquier objeto, clase o ruta
  • puedes ejecutar el import code; code.interact(local=locals()) import code; code.interact(local=locals()) en cualquier parte de tu código y se iniciará un shell de python en ese punto exacto
  • puede ejecutar python -i yourscript.py para iniciar un shell al final de yourscript.py