La división en Python 3 da un resultado diferente que en Python 2

En el siguiente código, quiero calcular el porcentaje de caracteres G y C en una secuencia. En Python 3 obtengo correctamente 0.5 , pero en Python 2 obtengo 0 . ¿Por qué los resultados son diferentes?

 def gc_content(base_seq): """Return the percentage of G and C characters in base_seq""" seq = base_seq.upper() return (seq.count('G') + seq.count('C')) / len(seq) gc_content('attacgcg') 

/ es un operador diferente en Python 3; en Python 2 / altera el comportamiento cuando se aplica a 2 operandos enteros y devuelve el resultado de una división de piso en su lugar:

 >>> 3/2 # two integer operands 1 >>> 3/2.0 # one operand is not an integer, float division is used 1.5 

Añadir:

 from __future__ import division 

en la parte superior de tu código para hacer / usar la división flotante en Python 2, o usa // para forzar a Python 3 a usar la división entera:

 >>> from __future__ import division >>> 3/2 # even when using integers, true division is used 1.5 >>> 3//2.0 # explicit floor division 1.0 

El uso de cualquiera de estas técnicas funciona en Python 2.2 o más reciente. Vea PEP 238 para los detalles esenciales de por qué se cambió esto.

En python2.x / realiza la división de enteros.

 >>> 3/2 1 

Para obtener el resultado deseado, puede cambiar cualquiera de los operandos a un flotador usando float() :

 >>> 3/2. #3/2.0 1.5 >>> 3/float(2) 1.5 

o use la division de __future__ :

 >>> from __future__ import division >>> 3/2 1.5 

Para Python2 / es una división entera cuando el numerador y el denominador están ambos int , debes asegurarte de forzar la división de punto flotante

p.ej.

 return (seq.count('G') + seq.count('C')) / float(len(seq)) 

alternativamente, puedes poner

 from __future__ import division 

en la parte superior del archivo