Variables y tipos de datos

Concepto de variable

Una variable es un espacio de memoria en donde se almacenará un valor de un tipo de dato determinado susceptible a cambios durante la ejecución del programa. Para declarar una variable es necesario darle un nombre o identificador, es una palabra que empieza por una letra minúscula o mayúscula seguido de letras o números y opcionalmente el caracter especial subrayado (_) si fuera necesario. Ejemplos de nombres de variables válidos:

nombre
Nombre
nom_1
nombre01
Nombre_Apellido
Nom_APELLIDO

Comprobemos su funcionamiento en Python:

nombre='prueba de variable'
Nombre='prueba de variable'
nom_1='prueba de variable'
nombre01='prueba de variable'
Nombre_Apellido='prueba de variable'
Nom_APELLIDO='prueba de variable'
print(f'{nombre}\n{Nombre}\n{nom_1}\n{nombre01}\n{Nombre_Apellido}\n{Nom_APELLIDO}')

Resultado:

prueba de variable
prueba de variable
prueba de variable
prueba de variable
prueba de variable
prueba de variable

Como podemos ver en este sencillo ejemplo las variables declaradas son totalmente válidas en Python. Una nota importante es que a diferencia de otros lenguajes de programación, el tipo de dato no esta definido por el contenedor sino por el contenido de la variable. En el caso anterior todas las variables son de tipo cadena de caracteres por que su contenido así lo es, no por que se hayan definido previamente de ese tipo.

Clasificación de los tipos de datos

Python clasifica los tipos de datos de acuerdo a la naturaleza misma del tipo de dato y de acuerdo a la estructura lógica de su uso. Dando así las siguientes categorías de tipos de datos:

Por su naturaleza

Numéricos enteros
Numéricos de coma flotante o punto flotante
Cadenas de caracteres
Booleanos

Por su estructura

Colecciones o Sets
Tuplas
Diccionarios
Frozen sets

Por su flexibilidad

Inamovibles
Dinámicos

En este punto es necesario mencionar en este punto que en Python los grupos de datos como listas, tuplas, etc, pueden contener tipos de datos de diferente naturaleza como valores enteros, decimales y cadenas de caracteres y combinaciones de ellos como veremos mas adelante.

Tipos de datos numéricos

En Python se clasifican los tipos de datos en numéricos enteros, numéricos de punto flotante y numéricos complejos. Los números enteros como su nombre lo dice, no admiten decimales. Pudiendo ser menores, igual o mayores que cero. Algunos ejemplos de valores numéricos enteros son: -233, -23, 0, 345 y 93474.

Los números de punto flotante son valores reales que incluyen decimales. Este tema en realidad es mas profundo, pero de momento y por mantener la simplicidad lo dejaremos hasta aquí. Algunos ejemplos de valores decimales de punto flotante son 3.14, -45.6 y 234.43434.

También existe otro tipo de dato numérico en Python, el número complejo. Aunque de momento no lo vamos a utilizar es bueno saber de su existencia. El número complejo se compone de 2 partes, una parte real y otra imaginaria

Tipos de datos cadena de caracteres

Otro tipo de dato muy usado en Python es el tipo de dato cadena de caracteres. Básicamente una cadena de caracteres es una secuencia fija de caracteres individuales en formato unicode. Para definir una cadena de caracteres basta con escribir la secuencia de caracteres entre comillas simples (') o dobles ("). Lo importante es recordar que se debe usar el mismo tipo de comillas tanto al pricipio como al final de la cadena de caracteres. En caso de necesitar almacenar en una variable una cadena de caracteres que incluya una comilla simple, habría que iniciar y cerrar la cadena de caracteres con comillas dobles para que Python pueda identificar bien el inicio y el final de la cadena de caracteres.

Veamos el siguiente ejemplo:

sCadena = "Cadena de caracteres con 'comillas simples'"
print(sCadena)
sCadena = 'Cadena de caracteres con "comillas dobles"'
print(sCadena)

Da como resultado:

Cadena de caracteres con 'comillas simples'
Cadena de caracteres con "comillas dobles"

Como se puede observar, aunque no se mencionó antes, el mismo principio aplica al uso de las comillas dobles dentro de una cadena de caracteres.

También es posible lograr el mismo resultado con el uso de los caracteres especiales a través de las secuencias de escape. En este caso para incluir el carácter especial comilla simple (') o doble (") basta con usar el caracter barra invertida ("\") y a continuación el caracter especial de comilla simple o doble según sea el caso.

Veamos el siguiente ejemplo:

sCadena = 'Cadena de caracteres con \'comillas simples\''
print(sCadena)
sCadena = 'Cadena de caracteres con \"comillas dobles\"'
print(sCadena)

Cadena de caracteres con 'comillas simples'
Cadena de caracteres con 'comillas dobles"

Como podemos comprobar funciona de la misma manera usando el método con comillas combinadas y con la secuencia de escape y el caracter especial comilla simple o doble, siendo esta otra manera de lograr el mismo resultado.

En Python a diferencia de otros lenguajes de programación no existe el tipo de dato character, en este caso se puede usar una cadena de caracteres de 1 solo caracter. Por ejemplo consideremos el siguiente fragmento de código:

sCaracter = 'x'

print(f"El valor de la cadena de caracteres"\
    f" de 1 solo elemento es: {sCaracter}")

Con este código obtendremos el siguiente resultado:

El valor de la cadena de caracteres de 1 solo elemento es: x

Como es obvio, para emular el uso de una variable tipo char o character, muy común en otros lenguajes de programación, en Python basta con usar una cadena de caracteres de 1 solo elemento.


Comillas triples """ o '''
En Python el uso de las comillas triples (tres comillas seguidas) ya sean simples o dobles, sirve para definir literales o cadenas de texo que incluyan los saltos de línea. Veamos el siguiente ejemplo:

prueba='''Esta es una
prueba de literal que respeta saltos
de lineas'''

prueba2= """Esta
es otra prueba de saltos
de línea
pero con comillas triples"""
print(f'{prueba}\n\n{prueba2}')
Resultado:

Esta
es otra prueba de saltos
de línea
pero con comillas triples

Como podemos comprobar con el uso de comillas triples Python mantiene los saltos de línea en las cadenas de caracteres.

Tipos de datos booleanos

Los tipos de datos booleanos son un tipo de dato que almacenan solamente 2 posibles estados, verdadero o falso, (true o false), de ahí su nombre, ya que esta condición limitada a solo 2 estados establece las bases para la implementación de la lógica binaria en la programación.

Las palabras reservadas para los 2 posibles valores booleanos son tal cual como su palabra en inglés pero con la primera letra en mayúscula, es decir True (true=cierto) y False (false=falso).

Consideremos el siguiente ejemplo del uso básico de una variable booleana:

bValor = True
print(bValor)

En el código anterior hemos inicializado una variable llamada bValor con el valor booleano TRUE. Para luego mostrar por pantalla su contenido. Obteniendo el siguiente resultado:

True

Para asegurarnos que esta mostrando el valor booleano asignado vamos a cambiar su estado binario a FALSE.

bValor = False
print(bValor)

Al obtener el siguiente resultado comprobamos que su estado binario ha cambiado como lo habíamos programado:

False

Es importante destacar que en Python cualquier objeto puede tener un estado de verdadero o falso, por lo tanto, en un contexto booleano se puede evaluar su estado. Por defecto todos los objetos son verdaderos excepto aquellos a los que específicamente se les cambia el estado booleano a FALSE o cuyos valores son 0. Tambien tienen el valor booleano FALSE aquellos objetos que se le haya implementado el método LEN() y la este devuelva 0, es decir secuencias y colecciones vacías. Para información mas detallada puede ver las funciones incorporadas en Python.

Desde el punto de vista de la construcción del tipo de dato booleano en Python, en realidad los valores TRUE y FALSE hacen referencia a los números enteros 1 y 0 respectivamente, como era de esperarse al solo tener 2 posibles valores. Lo que nos lleva a la conclusión que si el contenido de un objeto es igual a 0 Python lo considera desde el punto de vista booleano como FALSE, y como TRUE si su valor es distinto a 0.

Veamos el siguiente ejemplo:

bValor=0
print(f'Con la variable en 0 al preguntar si es falsa devuelve: {bValor==False}')
bValor = 1
print(f'Con la variable en 1 al preguntar si es falsa devuelve: {bValor==False}')
bValor = 2
print(f'Con la variable en 2 al preguntar si es falsa devuelve: {bValor==False}')
bValor = -1
print(f'Con la variable en -1 al preguntar si es falsa devuelve: {bValor==False}')

el código anterior devuelve el siguiente resultado:

Con la variable en 0 al preguntar si es falsa devuelve: True
Con la variable en 1 al preguntar si es falsa devuelve: False
Con la variable en 2 al preguntar si es falsa devuelve: False
Con la variable en -1 al preguntar si es falsa devuelve: False

Como podemos observar todos los estados booleanos de la variable bValor son TRUE excepto cuando esta posee un valor entero de 0. Es por ello que las cadenas y colecciones vacías son FALSE ya que su valor entero de LEN() es 0. Mas adelante se verá con detalle el uso específico de la función LEN().

Las funciones TYPE() e ISINTANCE()


En Python existe una función específica llamada type(), que acepta como argumento un objeto y devuelve el tipo al que pertenece, es decir el tipo de variable. Veamos el siguiente código:

iValorEntero = 23
fValorDecimal = 2.233
sCadenaCaracteres = 'abcdefghijk'
bBooleano = False


print(f'La variable iValorEntero es de tipo {type(iValorEntero)}')
print(f'La variable fValorDecimal es de tipo{type(fValorDecimal)}')
print(f'La variable sCadenaCaracteres es de tipo{type(sCadenaCaracteres)}')
print(f'La variable bBooleano es de tipo {type(bBooleano)}')

Este código devuelve el siguiente resultado:

La variable iValorEntero es de tipo <class 'int'>
La variable fValorDecimal es de tipo<class 'float'>
La variable sCadenaCaracteres es de tipo<class 'str'>
La variable bBooleano es de tipo <class 'bool'>

Entendiendo lo siguiente:

int=integer= entero
float = flotante
str= string= cadena de caracteres
bool=boolean=booleano

Podemos ver como la función TYPE() devuelve el tipo al que pertenece cada una de las variables que hemos definido en el programa.

Nótese que para Python todo es un objeto, esto se puede confirmar cuando la función TYPE() devuelve junto al tipo de variable queevalúa, la palabra "class". Una clase, como se verá mas adelante es la definición de un objeto en Python.

Ahora bien, existe otra función que devuelve un valor booleano TRUE o FALSE si le pasamos como parámetros el nombre del objeto y el tipo al que deseamos consultar si pertenece o no. Sería como preguntar si la variable x es de tipo entero, decimal o cadena de caracteres y la función nos respendiera con un si o no. Esta función se llama ISINSTANCE() y sus argumentos son primero el objeto y luego la clase a la que pertenece. Veamos el siguiente ejemplo:

iValorEntero = 23
fValorDecimal = 2.233
sCadenaCaracteres = 'abcdefghijk'
bBooleano = False

if isinstance(iValorEntero,int):
    print('El objeto iValorEntero es de tipo entero')
else:
    print('El objeto iValorEntero no es de tipo entero')

if isinstance(fValorDecimal,int):
    print('El objeto fValorDecimal es de tipo entero')
else:
    print('El objeto fValorDecimal no es de tipo entero')

El código anterior arroja el siguiente resultado:

El objeto iValorEntero es de tipo entero
El objeto fValorDecimal no es de tipo entero

Operaciones con distintos tipos de datos

Como ya se había mencionado anteriormente, Python es un lenguaje dinámico, lo que implica que no es necesario declarar el tipo de variable antes de usarse, de hecho una variable de un tipo puede almacenar un dato de otro tipo, adaptándose de manera automática a cada situación.

Como casi cualquier otro lenguaje de programación, Python admite las operaciones básicas con variables. Para ilustrar lo anterior consideremos el siguiente código:

sNombre = "Cesar"
sApellido = 'Gamboa'
iEdad = "Cuarenta y nueve" #Tipo de dato cadena de caracteres
fEstatura = 1.7 #Tipo de dato punto flotante

print("Tipos de datos\n")
print('Nombre: ',sNombre)
print('Apellido: ',sApellido)
print('Edad: ', iEdad)
iEdad=49
print('Edad: ', iEdad)
print("Nombre completo: ",sNombre + " " + sApellido)

El código da el siguiente resultado:

Tipos de datos


Nombre:  Cesar

Apellido:  Gamboa

Edad:  Cuarenta y nueve

Edad:  49

Nombre completo:  Cesar Gamboa

Como se pudo comprobar, a pesar que la variable iEdad originalmente almacenaba un valor tipo cadena de caracteres ("Cuarenta y nueve"), sin necesidad de haber declarado su tipo previamente, incluso luego admitió la asignación de un valor numérico entero sin problema alguno, (49) pudiendo mostrar el valor entero por pantalla. Esto es posible gracias a la característica de dinamismo de Python previamente mencionada.

Otra cosa destacable del código anterior es el uso del operador suma (+) en cadenas de caracteres, en cuyo caso se utiliza para concatenar dichas cadenas de caracteres. A efectos de legibilidad en la salida por pantalla, se ha incluido un caracter de espacio en blanco " " entre el nombre y el apellido usando el operador de concatenación de cadenas (+). De igual manera, para ejemplificar el uso indiferente de comillas simples o dobles, se han usado de manera intencionada ambas opciones. Es importante recalcar que, a pesar que Python reconoce el uso de ambas comillas para definir cadenas de caracteres, se debe mantener el mismo tipo de comilla tanto en la apertura como en el cierre de la cadena.

Por último, en esta sección se ha introducido el uso de caracteres especiales, a pesar que no son indispensables para ejemplificar el uso de variables y tipos de datos, es importante conocerlos para darle un formato mas legible a la salida por pantalla. En el ejemplo mostrado se uso el carácter especial "salto de línea" que en Python se invoca haciendo uso de la secuencia de escape \n, haciendo que en pantalla aparezca una linea vacía adicional luego del ultimo PRINT(). Otros tipos de caracteres especiales de uso frecuente son las comillas simples y dobles, barra inversa, tabulador y retroceso que luego se verán mas a detalle. De momento lo importante es recordar que para usar los carateres especiales siempre es necesario usar las secuencias de escape con la barra invertida (\).

Ámbito y durabilidad de las variables 

Se consideran ámbitos diferentes el entorno de variables dentro de la función y fuera de ella, considerándose a las variables usadas fuera de las funciones como variables globales y a las variables usadas dentro de las funciones como variables locales. Esto implica que las variables globales solo sean visibles fuera de las funciones y las variables locales solo sean visibles dentro de las funciones que las usan. Llegando incluso a darse el caso en el que si se usan nombres iguales para variables de diferentes ámbitos, éstas no camben su valor fuera del ámbito donde fueron creadas. Veamos el siguiente ejemplo para ilustrarlo mejor.

def ambito_A(x):
    print(f'Ambito A recibio por parámetro: {x}')
    x=20
    print(f'x Vale {x} dentro del ámbito A')
def ambito_B(x):
    print(f'Ambito B recibio por parámetro: {x}')
    x=30
    print(f'x vale {x} dentro del ámbito B')
x= 10
ambito_A(x)
ambito_B(x)
print(f'x vale {x} en el ámbito global')

Resultado:

Ambito A recibio por parámetro: 10
x Vale 20 dentro del ámbito A
Ambito B recibio por parámetro: 10
x vale 30 dentro del ámbito B
x vale 10 en el ámbito global

Como podemos comprobar, un mismo nombre de variable maneja diferentes valores en diferentes ámbitos. Llegando a no verse afectado el valor de la variable en un ámbito, aún si se llegara a modificar el valor de la variable en otro ámbito diferente, ya sea éste otra función o el ámbito global (fuera de todas las funciones).

Tiempo de vida de las variables dentro de un ámbito

Si bien las funciones se verán a detalle en el apartado funciones definidas por el usuario, de momento vale decir que las variables usadas dentro de un ámbito solo pueden ser usadas dentro de la duración de ese ámbito. Si se intenta accesar a una variable fuera de su ámbito, el intérprete de Python arrojará un error.

Consideremos el siguiente ejemplo:

def Funcion_A():
    y=10
    print(f'Desde dentro de la funcion: {y}')
Funcion_A()
print(f'Desde fuera de la funcion: {y}')

Desde dentro de la funcion: 10
Traceback (most recent call last):
  File "E:\Documentos\Desarrollos\Python\Curso-Python\10 Funciones definidas por el usuario.py", line 93, in <module>
    print(f'Desde fuera de la funcion: {y}')
NameError: name 'y' is not defined

Como podemos ver se ha creado una función llamada Funcion_A() en donde se usa una variable llamada <y> y se le da un valor de 10 para posteriormente mostrar por pantalla un mensaje con el valor de la variable dentro de la función. Al retornar al bloque principal de código del programa se intenta mostrar por pantalla el valor de <y>, lo cual como podemos ver por el resultado genera error, a diferencia de cuando se mostró por pantalla desde dentro de la función donde fue creada la variable. De hecho el intérprete de Python devuelve el error "name 'y' is not defined" lo que indica que no encuentra ninguna definición a una variable llamada 'y' dentro del ámbito en que se pretende usar.

Sin embargo, las variables creadas en el bloque principal del programa, es decir, fuera de todas las funciones tienen un ámbito global, lo que significa que pueden ser usadas dentro de las funciones. Veamos el siguiente ejemplo:

def Funcion_B():
    print(f'Valor de variable global: {variable_Global}')

variable_Global = 10
Funcion_B()

Resultado:

Valor de variable global: 10

Como podemos comprobar se puede usar una variable de ámbito global dentro de una función. Sin embargo no se puede hacer al revés, es decir, usar una variable de ámbito local en un ámbito global, ya que, como se dijo anteriormente, el tiempo de vida de las variables de ámbito local terminan al finalizar la función donde fueron creadas. También es importante destacar que dentro de las funciones solo es posible consultar las variables globales, no modificarlas, al menos no directamente. Para poder hacer esta operación es necesario hacer una declaración especial dentro de la función, pero esto se verá con mas detalle mas adelante.

Comentarios

Entradas populares