2010-09-19 10 views

Respuesta

168

Por cada pitón contenedor C, la expectativa es que

for item in C: 
    assert item in C 

pasará muy bien - ¿No te encontrarlo sorprendente si uno sentido de in (la cláusula de bucle) tenía una completamente diferente significado del otro (el cheque de presencia)? ¡Seguro que sí! Funciona de forma natural de esa manera por listas, conjuntos, tuplas, ...

lo tanto, cuando C es un diccionario, si in eran para producir tuplas clave/valor en un bucle for, entonces, por el principio de la menor sorpresa, in también tendría que tomar una tupla como su operando de la mano izquierda en la verificación de contención.

¿Qué tan útil sería eso? De hecho bastante inútil, básicamente haciendo if (key, value) in C sinónimo de if C.get(key) == value - que es un cheque Creo que pude haber realizado, o quería realizar, 100 veces más raramente de lo que en realidad if k in Csignifica, comprobando la presencia de la clave única e ignorando por completo el valor.

Por otro lado, con ganas de bucle sólo en claves es bastante común, por ejemplo:

for k in thedict: 
    thedict[k] += 1 

tiene el valor así no ayudaría en particular:

for k, v in thedict.items(): 
    thedict[k] = v + 1 

en realidad un poco menos clara y menos conciso (Tenga en cuenta que items fue la ortografía original de los métodos "adecuados" para usar para obtener pares clave/valor: desafortunadamente, eso se remonta a la época en que dichos accesadores devolvían listas enteras, así que para apoyar "simplemente iterar" tenía que introducido, y iteritems fue - en Python 3, donde las restricciones de compatibilidad con versiones anteriores de Python se debilitaron mucho, se volvió items de nuevo).

+2

Explicación muy clara. Creo que necesito ir un poco más a "mirar debajo del capó" de pitón. Cómo funcionan los operadores 'in' y' for x in' sigue siendo un poco mágico para mí. – Falmarri

+0

@Falmarri, estaré encantado de explicarlo a nivel conceptual (no hay necesidad de profundizar en la fuente C ;-) si haces otra pregunta al respecto! -) –

+0

Bueno, soy un programador de C++, así que probablemente profundice en C podría ser más útil =] Cómo funcionan los operadores en Python es un poco intuitivo para mí (al menos desde un bajo nivel de comprensión). – Falmarri

9

Mi suposición: Uso de la tupla completa sería más intuitivo para recorrer, pero quizá no tanto para las pruebas para membresía usando in.

if key in counts: 
    counts[key] += 1 
else: 
    counts[key] = 1 

Ese código no sería realmente trabajar si tiene que especificar tanto clave y el valor de in. Me está costando imaginar un caso de uso en el que compruebe si la clave Y el valor están en el diccionario. Es mucho más natural probar solo las claves.

# When would you ever write a condition like this? 
if (key, value) in dict: 

Ahora no es necesario que el operador infor ... in y operan en los mismos artículos. En lo que respecta a la implementación, se trata de operaciones diferentes (__contains__ frente a __iter__). Pero esa pequeña inconsistencia sería algo confusa y, bueno, inconsistente.

+0

Dado que para cada otro tipo de iterativo incorporado que puedo pensar, 'x in foo' solo si' i' en 'for i in foo' asume el valor de' x' en algún punto , Diría que sería una muy inconsistente __huge__. – aaronasterling

Cuestiones relacionadas