Para declarar múltiples variables al "mismo tiempo" haría:
a, b = True, False
Pero si tuviera que declarar muchas más variables, se vuelve cada vez menos elegante:
a, b, c, d, e, f, g, h, i, j = True, True, True, True, True, False, True ,True , True, True
¿Hay una manera mejor / elegante / conveniente de hacer esto?
Esto debe ser muy básico, pero si utilizo una lista o una tupla para almacenar las variables, ¿cómo debería enfocarme para ser útil ya que:
aList = [a,b]
No es válido, tendría que hacer:
a, b = True, True
¿O qué me estoy perdiendo?
python
variables
declaration
Trufa
fuente
fuente
Respuestas:
Como otros han sugerido, es poco probable que usar 10 variables locales diferentes con valores booleanos sea la mejor manera de escribir su rutina (especialmente si realmente tienen nombres de una letra :)
Dependiendo de lo que esté haciendo, puede tener sentido usar un diccionario en su lugar. Por ejemplo, si desea configurar valores preestablecidos booleanos para un conjunto de indicadores de una letra, puede hacer esto:
Si lo prefiere, también puede hacerlo con una sola declaración de asignación:
El segundo parámetro
dict
no está completamente diseñado para esto: en realidad está destinado a permitirle anular elementos individuales del diccionario utilizando argumentos de palabras clave comod=False
. El código anterior explota el resultado de la siguiente expresión**
en un conjunto de argumentos de palabras clave que se pasan a la función llamada. Esta es ciertamente una forma confiable de crear diccionarios, y las personas parecen estar al menos aceptando este idioma, pero sospecho que algunos pueden considerarlo poco propicio.</disclaimer>
Otro enfoque, que probablemente sea el más intuitivo si va a utilizar este patrón con frecuencia, es definir sus datos como una lista de valores de bandera (
True
,False
) asignados a nombres de bandera (cadenas de un solo carácter). Luego transforma esta definición de datos en un diccionario invertido que asigna nombres de banderas a valores de banderas. Esto se puede hacer de manera bastante sucinta con una comprensión de lista anidada, pero aquí hay una implementación muy legible:La función
invert_dict
es una función generadora . Se genera , o rendimientos - lo que significa que devuelve repetidamente valores de - pares de valores clave. Esos pares clave-valor son el inverso del contenido de los dos elementos delflags
diccionario inicial . Se alimentan aldict
constructor. En este caso, eldict
constructor funciona de manera diferente al anterior porque se está alimentando de un iterador en lugar de un diccionario como argumento.Basándose en el comentario de @Chris Lutz: si realmente va a usar esto para valores de un solo carácter, en realidad puede hacer
Esto funciona porque las cadenas de Python son iterables , lo que significa que se pueden mover valor por valor. En el caso de una cadena, los valores son los caracteres individuales de la cadena. Entonces, cuando se interpretan como iterables, como en este caso donde se usan en un bucle for,
['a', 'b', 'c']
y'abc'
son efectivamente equivalentes. Otro ejemplo sería cuando se pasan a una función que toma un iterable, comotuple
.Yo personalmente no haría esto porque no se lee intuitivamente: cuando veo una cadena, espero que se use como un valor único en lugar de como una lista. Entonces miro la primera línea y pienso "Bien, entonces hay una bandera verdadera y una bandera falsa". Entonces, aunque es una posibilidad, no creo que sea el camino a seguir. Por el lado positivo, puede ser útil explicar los conceptos de iterables e iteradores más claramente.
Definiendo la función
invert_dict
modo que realmente devuelva un diccionario tampoco es una mala idea; La mayoría de las veces no hice eso porque realmente no ayuda a explicar cómo funciona la rutina.Aparentemente, Python 2.7 tiene comprensión de diccionario, lo que sería una forma extremadamente concisa de implementar esa función. Esto se deja como un ejercicio para el lector, ya que no tengo Python 2.7 instalado :)
También puede combinar algunas funciones del módulo itertools siempre versátil . Como dicen, hay más de una forma de hacerlo . Espera, la gente de Python no dice eso. Bueno, es cierto de todos modos en algunos casos. Supongo que Guido nos ha dado una comprensión del diccionario para que haya una forma obvia de hacerlo.
fuente
['a', 'b', 'c']
se puede acortar alist('abc')
, lo que inspiradef truth_values(trues, falses): d = dict.from_keys(list(trues), True); d.update(dict.from_keys(list(falses), False)); return d
utilizado comovalues = truth_values("abc", "de")
fuente
(d,)
crea una tupla de un elemento, que es un tipo de secuencia. Los tipos de secuencia admiten sumas y multiplicaciones, entre otras operaciones.a, b, c = ([],)*3
no crea 3 instancias de lista, pero hacea
,b
yc
que apunta a la misma instancia.a, b, c = ([] for i in range(3))
. fuente . Para mantener la coherencia, también se puede utilizar una variante de que para esta respuesta, es decir,a,b,c,d,e,g,h,i,j = (True for i in range(9))
f=(False i in range(1))
.Use una lista / diccionario o defina su propia clase para encapsular las cosas que está definiendo, pero si necesita todas esas variables, puede hacer:
fuente
Esta es una elaboración de @ Jeff M 'sy mis comentarios.
Cuando haces esto:
Funciona con tuplas de embalaje y desembalaje. Puede separar los pasos de empaque y desempaque:
La primera línea crea una tupla llamada
_
que tiene dos elementos, el primero con el valor dec
y el segundo con el valor ded
. La segunda línea desempaqueta la_
tupla en las variablesa
yb
. Esto desglosa tu gran línea:En dos líneas más pequeñas:
Le dará exactamente el mismo resultado que la primera línea (incluida la misma excepción si agrega valores o variables a una parte pero olvida actualizar la otra). Sin embargo, en este caso específico, la respuesta de yan es quizás la mejor.
Si tiene una lista de valores, aún puede descomprimirlos. Solo tienes que convertirlo a una tupla primero. Por ejemplo, lo siguiente asignará un valor entre 0 y 9 a cada uno de los
a
pasosj
, respectivamente:EDITAR: truco ordenado para asignarlos a todos como verdadero excepto el elemento 5 (variable
f
):fuente
Cuando las personas sugieren "usar una lista o tupla u otra estructura de datos", lo que dicen es que, cuando tienes muchos valores diferentes que te interesan, nombrarlos a todos por separado como variables locales puede no ser la mejor manera para hacer cosas.
En cambio, es posible que desee reunirlos en una estructura de datos más grande que se pueda almacenar en una sola variable local.
Intuited mostró cómo podría usar un diccionario para esto, y Chris Lutz mostró cómo usar una tupla para el almacenamiento temporal antes de desempaquetar en variables separadas, pero otra opción a considerar es usar
collections.namedtuple
para agrupar los valores de forma más permanente.Entonces podrías hacer algo como:
Por supuesto, el código real usaría nombres más significativos que "DataHolder" y las letras del alfabeto, por supuesto.
fuente
DataHolder
simplemente se vuelve un poco más detallada.¿Cuál es el problema, de hecho?
Si realmente necesita o desea 10 una , b , c , d , e , f , g , h , i , j , no habrá otra posibilidad, en un momento u otro, a escribir una y escritura b y escribir c . ....
Si los valores son todos diferentes, tendrá que escribir por ejemplo
es decir, definir las "variables" individualmente.
O, usando otra escritura, no es necesario usar
_
:o
.
Si algunos de ellos deben tener el mismo valor, es el problema que es demasiado largo para escribir
?
Entonces puedes escribir:
.
No entiendo cuál es exactamente tu problema. Si desea escribir un código, está obligado a utilizar los caracteres requeridos para escribir las instrucciones y definiciones. Qué más ?
Me pregunto si tu pregunta no es la señal de que malinterpretas algo.
Cuando se escribe
a = 10
, no se crea una variable en el sentido de "fragmento de memoria cuyo valor puede cambiar". Esta instrucción:desencadena la creación de un objeto de tipo
integer
y valor 10 y el enlace de un nombre 'a' con este objeto en el espacio de nombres actualo reasigne el nombre 'a' en el espacio de nombres al objeto 10 (porque 'a' estaba previamente vinculado a otro objeto)
Digo eso porque no veo la utilidad para definir 10 identificadores a, b, c ... apuntando a Falso o Verdadero. Si estos valores no cambian durante la ejecución, ¿por qué 10 identificadores? Y si cambian, ¿por qué definir primero los identificadores ?, se crearán cuando sea necesario si no se definieron previamente
Tu pregunta me parece extraña
fuente
Parece que estás abordando tu problema de la manera incorrecta para mí.
Vuelva a escribir su código para usar una tupla o escriba una clase para almacenar todos los datos.
fuente
Me gusta la respuesta más votada; sin embargo, tiene problemas con la lista como se muestra.
Esto se discute en grandes detalles (aquí) , pero la esencia es eso
a
yb
son el mismo objeto cona is b
retornoTrue
(lo mismo paraid(a) == id(b)
). Por lo tanto, si cambia un índice, está cambiando el índice de ambosa
yb
, dado que están vinculados. Para resolver esto puedes hacer (fuente)Esto se puede usar como una variante de la respuesta principal, que tiene los resultados intuitivos "deseados"
fuente
En su caso, usaría YAML.
Ese es un estándar elegante y profesional para tratar con múltiples parámetros. Los valores se cargan desde un archivo separado. Puedes ver información en este enlace:
https://keleshev.com/yaml-quick-introduction
Pero es más fácil buscarlo en Google, ya que es un estándar, hay cientos de información al respecto, puede encontrar lo que mejor se adapte a su comprensión. ;)
Atentamente.
fuente
Al igual que JavaScript , también puede usar varias declaraciones en una línea en Python
a = 1; b = "Hello World"; c += 3
fuente