Pregunta

En python, usted puede tener una función devolver varios valores.He aquí un ejemplo inventado:

def divide(x, y):
    quotient = x/y
    remainder = x % y
    return quotient, remainder  

(q, r) = divide(22, 7)

Esto parece muy útil, pero parece que también puede ser objeto de abuso ("Bueno..la función de X ya calcula lo que necesitamos como un valor intermedio.Vamos a tener X devolver ese valor también").

Cuándo se debe trazar la línea y definir un método diferente?

¿Fue útil?

Solución

Absolutamente (por el ejemplo que se proporciona).

Las tuplas son ciudadanos de primera clase en Python

No es una función integrada divmod() que hace exactamente eso.

q, r = divmod(x, y) # ((x - x%y)/y, x%y) Invariant: div*y + mod == x

Hay otros ejemplos: zip, enumerate, dict.items.

for i, e in enumerate([1, 3, 3]):
    print "index=%d, element=%s" % (i, e)

# reverse keys and values in a dictionary
d = dict((v, k) for k, v in adict.items()) # or 
d = dict(zip(adict.values(), adict.keys()))

Por CIERTO, los paréntesis no son necesarios más de la época.Cita de De Referencia De La Biblioteca De Python:

Tuplas puede ser construido en un número de maneras:

  • El uso de un par de paréntesis para indicar el vacío tupla:()
  • El uso de una coma detrás de un singleton tupla:un, o (a,)
  • La separación de los elementos con comas:a, b, c o (a, b, c)
  • El uso de la tupla() integrado en:tuple() o tupla(iterable)

Funciones que debe servir el único propósito de

Por lo tanto, se debe devolver un único objeto.En el caso de que este objeto es una tupla.Considere la posibilidad de tupla como un ad-hoc compuesto de estructura de datos.Hay lenguas donde casi cada función devuelve varios valores de la lista se encuentra en Lisp).

A veces es suficiente para volver (x, y) en lugar de Point(x, y).

Nombre tuplas

Con la introducción de tuplas con nombre en Python 2.6 es preferible en muchos casos, para volver tuplas con nombre en lugar de la llanura de tuplas.

>>> import collections
>>> Point = collections.namedtuple('Point', 'x y')
>>> x, y = Point(0, 1)
>>> p = Point(x, y)
>>> x, y, p
(0, 1, Point(x=0, y=1))
>>> p.x, p.y, p[0], p[1]
(0, 1, 0, 1)
>>> for i in p:
...   print(i)
...
0
1

Otros consejos

En primer lugar, tenga en cuenta que Python permite la siguiente (no es necesario el paréntesis):

q, r = divide(22, 7)

Respecto a tu pregunta, no hay ninguna regla dura y rápida de cualquier manera.Para simple (y por lo general se las ingenió) ejemplos, puede parecer que siempre es posible para una determinada función tiene un único propósito, lo que resulta en un valor único.Sin embargo, cuando se utiliza Python para aplicaciones del mundo real, rápidamente ejecutar en muchos casos en los que devolver varios valores es necesario, y los resultados en un código más limpio.

Así, yo diría que hacer lo que tiene sentido, y no tratan de ajustarse a una artificial de la convención.Python soporta múltiples valores de retorno, por lo que uso cuando sea apropiado.

El ejemplo que doy es en realidad un python función integrada, llamado divmod.Por lo tanto, alguien, en algún momento, pensó que se trataba de python suficiente para que se incluya en el núcleo de la funcionalidad.

Para mí, si lo que hace el código más limpio, que es python.Comparar estos dos bloques de código:

seconds = 1234
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)

seconds = 1234
minutes = seconds / 60
seconds = seconds % 60
hours = minutes / 60
minutes = minutes % 60

Sí, devolver varios valores (es decir, una tupla) es, sin duda python.Como otros han señalado, hay un montón de ejemplos en la biblioteca estándar de Python, así como en la muy respetada Python proyectos.Dos comentarios adicionales:

  1. Devolver varios valores a veces es muy, muy útil.Tomemos, por ejemplo, un método que, opcionalmente, maneja un evento (que devuelve algún valor en hacerlo) y también devuelve el éxito o el fracaso.Esto podría surgir en una cadena de modelo de responsabilidad.En otros casos, usted desea devolver múltiples, estrechamente vinculado piezas de datos---como en el ejemplo dado.En esta configuración, devolver varios valores es similar a la de regresar de una sola instancia de una clase anónima con varias variables miembro.
  2. Python es el manejo de los argumentos del método requiere la capacidad de devolver directamente varios valores.En C++, por ejemplo, el método se pueden pasar argumentos por referencia, por lo que usted puede asignar valores de salida para ellos, además de la formal valor de retorno.En Python, los argumentos se pasan "por referencia" (pero en el sentido de Java, no en C++).Usted no puede asignar nuevos valores a los argumentos de método y que se reflejen fuera del ámbito del método.Por ejemplo:

    // C++
    void test(int& arg)
    {
        arg = 1;
    }
    
    int foo = 0;
    test(foo); // foo is now 1!
    

    Comparar con:

    # Python
    def test(arg):
        arg = 1
    
    foo = 0
    test(foo) # foo is still 0
    

Es, definitivamente, python.El hecho de que usted puede devolver varios valores de una función repetitivo en un lenguaje como C, donde es necesario definir una estructura para cada combinación de tipos de regresar en algún lugar.

Sin embargo, si se llega al punto en donde se están volviendo algo loco como 10 valores a partir de una sola función, usted debería considerar seriamente la posibilidad de agrupación de ellos en una clase, ya que en ese punto se vuelve difícil de manejar.

Devuelve una tupla es genial.También tenga en cuenta el nuevo namedtuple que se añadió en python 2.6, que puede hacer que esto sea más apetecible para usted:http://docs.python.org/dev/library/collections.html#collections.namedtuple

OT:RSRE del Algol68 tiene la curiosa"/: = operador".por ejemplo.

INT quotient:=355, remainder;
remainder := (quotient /:= 113);

Dando un cociente de 3, y el resto de los 16.

Nota:normalmente, el valor de "(x/:=y)" se descarta como coeficiente de "x" es asignado por referencia, pero en RSRE caso, el valor devuelto es el resto.

c.f. Aritmética De Enteros - Algol68

Me parece bien que devolver varios valores mediante una tupla de funciones simples, tales como divmod.Si hace el código más legible, es Python.

Si el valor de retorno empieza a ser confuso, comprobar si la función está haciendo demasiado y dividir si lo es.Si una gran tupla está siendo utilizado como un objeto, hacen de él un objeto.También, considere el uso de nombre tuplas, que formará parte de la biblioteca estándar de Python 2.6.

Soy bastante nuevo en Python, pero la tupla técnica parece muy python para mí.Sin embargo, he tenido otra idea que puede mejorar la legibilidad.El uso de un diccionario permite el acceso a los diferentes valores por nombre en lugar de la posición.Por ejemplo:

def divide(x, y):
    return {'quotient': x/y, 'remainder':x%y }

answer = divide(22, 7)
print answer['quotient']
print answer['remainder']
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top