Subrayado como nombre de variable en Python [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Peter Norvig tiene un ensayo que describe un programa para resolver rompecabezas sudoku , incluso los más difíciles, combinando operaciones lógicas deterministas y un recorrido inteligente de las posibles soluciones. El esto último se hace recursivamente; aquí está esa función (source):

def search(values):
    "Using depth-first search and propagation, try all possible values."
    if values is False:
        return False ## Failed earlier
    if all( len( values[s]) == 1 for s in squares): 
        return values ## Solved!
    ## Chose the unfilled square s with the fewest possibilities
    _,s = min( (len( values[s]), s) 
                for s in squares 
                if len(values[s]) > 1
            )
    return some( search( assign( values.copy(), s, d)) 
                for d in values[s]
            )

(He añadido algunos espacios, CRs y pestañas por el bien de mis ojos; disculpas al Dr. Norvig.)

, Justo debajo del comentario hay una línea que comienza con "_,s". Esa parece ser la tupla sin empaquetar (len(values[s]),s) con el valor mínimo de s. ¿Está el Dr. Norvig usando " _ "como nombre de variable solo para indicar que es un resultado de" no me importa", o está pasando algo más? ¿Hay momentos en los que se recomienda" _" ¿como nombre de variable? En el modo interactivo, "_ " contiene la respuesta de la operación anterior; ¿hay una función similar en el código no interactivo?

Actualización

Gracias por las buenas respuestas. Supongo que la respuesta va a Alex Martelli para "valor añadido"; señala que el idioma"_, vbl_of_interest " es a menudo un efecto secundario del idioma del ESD, que a su vez se ha hecho en gran medida innecesario.

Author: sashkello, 2009-11-16

3 answers

Sí, _ es un nombre tradicional para "don't care" (que desafortunadamente choca con su uso en I18N, pero eso es un tema aparte;-). Por cierto, en Python de hoy, en lugar de:

_,s = min( (len( values[s]), s) 
            for s in squares 
            if len(values[s]) > 1
        )

Podrías codificar

s = min((s for s in squares if len(values[s])>1), 
        key=lambda s: len(values[s]))

(no estoy seguro para qué versión de Python estaba escribiendo Peter, pero el modismo que está usando es un ejemplo de "decorate-sort-undecorate" [[DSU]] excepto con min en lugar de sort, y en Python de hoy el parámetro opcional key= es generalmente la mejor manera de hacer DSU;-).

 65
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-16 00:54:30

Tienes razón. En modo no interactivo _ no tiene un significado especial. De hecho, Norvig solo quiere transmitir que no le importa el valor de esa variable.

Offtopic: Ese artículo de Norvig es muy bonito. Una lectura recomendada.

 8
Author: Stephan202,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-16 00:48:42

Su interpretación es correcta. Fuera del significado especial en el modo interactivo, _ solo se usa como un nombre de variable "no importa", especialmente en el desempaquetado.

 8
Author: mikej,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-16 00:50:53