python: Por favor, cuidado con estos lugares.

El autor:Elídan, Creado: 2016-12-29 13:46:12, Actualizado:

python: Por favor, cuidado con estos lugares.

python是一门非常有趣的语言。它提供了许多非常方便的标准库和许多内置命令是我们轻松完成任务.但是好东西太多了就有选择恐惧症了,以至于我们不能很好第利用这个标准库和它的基本机构。下面列出了一些对python新手来说很简单有效的陷阱。

  • No hay ninguna versión de Python.

    Este es un problema que se plantea constantemente en StackOverflow. Cuando tu código perfecto se ejecuta en la computadora de otra persona, es una experiencia de error, por lo que es un momento para comprobar si tus versiones de python son iguales. Asegúrate de que el código se ejecuta en la versión de python que conoces.

    $ python --version
    Python 2.7.9
    

    Gestión de versiones de python

    pyenv es una buena herramienta de administración de versiones de python. Desafortunadamente, solo funciona en *nix. En Mac OS, puedes instalar pyenv simplemente con brew install. En los sistemas Linux, hay un instalador automático.

  • Enfrentado a resolver todos los problemas con una sola línea de código

    Muchas personas se jactan de que los problemas que resuelven con una sola línea de código, incluso cuando su código es menos eficiente que el normal, es más difícil de leer e incluso ambiguo. Por ejemplo:

    l = [m for a, b in zip(this, that) if b.method(a) != b for m in b if not m.method(a, b) and reduce(lambda x, y: a + y.method(), (m, a, b))]
    

    La verdad es que el código que he escrito es para ilustrar esto. Pero he visto a muchas personas que lo han hecho. Si simplemente te presentas como un solucionador de problemas complejos agregando cosas a una lista o a un conjunto, entonces puedes perderte.

    Una sola línea de código no es un gran logro, aunque a veces parezca muy inteligente. El código bueno es breve, pero se centra más en la eficiencia y la facilidad de lectura.

  • Set initializado incorrectamente

    这是一个更加微妙的问题,有时候会让你措手不及。set推导式起来有点像list推导式.

    >>> { n for n in range(10) if n % 2 == 0 }
    {0, 8, 2, 4, 6}
    >>> type({ n for n in range(10) if n % 2 == 0 })
    

    El ejemplo anterior lo demuestra. Las diferencias son que el conjunto no tiene valores repetidos y es desordenado.

    >>> {}
    {}
    >>> type({})
    

    Así que si queremos initializar un conjunto vacío, podemos usar el conjunto directamente.

    >>> set()
    set()
    >>> type(set())
    

    Note que un conjunto vacío puede ser representado como un conjunto (((), pero es un conjunto que contiene elementos para ser definido como un conjunto (([1, 2]) ).

  • El GIL está mal entendido

    GIL (global interpreter lock) significa que solo un hilo puede ejecutarse en un programa de Python en cualquier momento. Esto significa que cuando no podemos crear un hilo y esperar que se ejecute en paralelo. Lo que hace un intérprete de Python es cambiar rápidamente entre diferentes hilos de ejecución.

    Muchas personas tratan de justificar a Python diciendo que estos son todos hilos reales.3. Esto es cierto, pero no cambia el hecho de que Python trata los hilos de una manera diferente a la que usted espera.

    La solución establecida es utilizar un módulo de multiprocesamiento. Los procesos ofrecidos por un módulo de multiprocesamiento pueden cubrir las diferencias básicamente bien. Sin embargo, las diferencias son mucho más altas que el costo del hilo. Por lo tanto, no siempre es bueno funcionar en paralelo.

    Sin embargo, este problema no se encuentra en todos los programas de Python. PyPy-stm es un ejemplo de una implementación de Python que no está afectada por GIL. Las implementaciones que se construyen en otras plataformas como JVM (Jython) o CLR (IronPython) no tienen problemas con GIL.

    En resumen, tenga cuidado con las clases de hilos, puede que no obtenga lo que desea.

  • Usar clases de estilo obsoletas

    En Python 2 hay dos tipos de clases, las claves de estilo antiguo y las claves de estilo nuevo. Si usas Python 3, estás usando la claves de estilo nuevo por defecto. Para asegurarte de que usas las claves de estilo nuevo en Python 2, necesitas heredar objetos o cualquier clase nueva que creas que no siempre herede la instrucción de construcción int o list. En otras palabras, tu clase base siempre debe heredar objetos.

    class MyNewObject(object): # stuff here
    

    Estos nuevos archivos de clases solucionan algunos problemas muy básicos que aparecen en las clases antiguas, si estás interesado puedes ver la documentación.

  • Irradiación equivocada

    Los siguientes errores son muy comunes para los principiantes:

    for name_index in range(len(names)):
      print(names[name_index])
    

    Obviamente, no es necesario usar len, en realidad, recorrer la lista se puede hacer con una frase muy simple:

    for name in names:
       print(name)  
    

    Además, hay una gran cantidad de otras herramientas que pueden ayudarte a simplificar la iteración. Por ejemplo, zip puede usarse para recorrer dos listas:

    for cat, dog in zip(cats, dogs):
       print(cat, dog)
    

    Si queremos considerar las variables de la lista de índices y valores, podemos usar el enumerate.

    for index, cat in enumerate(cats):
       print(cat, index)
    

    También hay muchas funciones que puedes elegir en iTools. Si iTools tiene una función que deseas, es fácil de obtener. Pero no la uses demasiado para usarla.

    El uso indebido de itertools hizo que un gran dios en StackOverflow tardara mucho tiempo en solucionarlo.

    Se utilizan parámetros por defecto variables

    En la actualidad, la mayoría de los blogs que he visto son los siguientes:

    def foo(a, b, c=[]):
       # append to c
       # do some more stuff
    

    No utilice los parámetros por defecto variables, sino:

    def foo(a, b, c=None):
     if c is None:
       c = []
       # append to c
       # do some more stuff 
    

    El siguiente ejemplo puede ayudarnos a entender esto de una manera muy intuitiva:

    In[2]: def foo(a, b, c=[]):
    ...     c.append(a)
    ...     c.append(b)
    ...     print(c)
    ...
    In[3]: foo(1, 1)
    [1, 1]
    In[4]: foo(1, 1)
    [1, 1, 1, 1]
    In[5]: foo(1, 1)
    [1, 1, 1, 1, 1, 1]
    

    La misma c es citada una y otra vez cada vez que se llama la función. Esto puede tener algunas consecuencias muy innecesarias.


Más.