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?
- Ojalá no supiera Java.
- 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.
Muy útil: Sumérgete en Python . Como señala un comentarista, si estás aprendiendo Python 3, Dive Into Python 3 es más aplicable.
Conocido antes: virtualenv .
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
Enumere las comprensiones , si va a venir a Python en forma reciente (no de una versión anterior).
- Para qué
enumerate
es. - Ese
seq = seq.append(item)
yseq = seq.sort()
ambos configuranseq
enNone
. - Usando
set
para eliminar duplicados. -
itertools
todo en los módulositertools
ycollections
. - 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 elzip
. - 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