Cómo saber si el valor de una variable es numérico en Python

A la hora de trabajar con datos numéricos en Python nos encontramos con un clásico ¿Cómo se que el valor que estoy recibiendo es un número? Casi todos los lenguages de programación tienen una función que nos permite evaluar si el valor almacenado en una variable es numérico, para el caso de Python vamos a ver dos opciones.

Python por defecto incluye una librería llamada math en todas sus versiones, pensada para realizar operaciones sobre datos escalares y para operaciones de trigonometría. Por otra parte existe una librería externa muy popular llamada numpy, pensada para el trabajo algebraico con matrices. Según el tipo de operaciones que vayas a realizar en tu código deberás importar una u otra.

En cualquier caso, ambas liberías tienen una función para chequear si una variable es numérica: la función isnan(), que devolverá true si el valor que está evaluando es nan (Not a Number). En el caso de usar la importada desde la librería math recibirá una sola variable y devolverá un valor booleano, en caso de usar la de numpy podrá recibir un array y evaluará todos los valores almacenados dentro del mismo, devolviendo según corresponda un valor booleano o un array de valores booleanos. Basta con importarla al principio de vuestro código y comprobarlo:

Con math en este caso devolvería true:

import math
x=float('cadena')
math.isnan(x)

Con numpy podemos trabajar con arrays:

import numpy as np
np.isnan([np.log(-1.),1.,np.log(0)])

Esto devolvería un array con un true para el primer valor evaluado y un false para los dos siguientes.

Anuncios

Ordenación de burbuja en Javascript

El método del intercambio directo, también llamado ordenación de burbuja (bubble sort en inglés), es un algoritmo de ordenamiento extremadamente sencillo que suele ser un ejercicio clásico en los cursos de programación para entender el uso de los bucles anidados en otros bucles. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos de posición si están en el orden equivocado. Esto hace necesario revisar varias veces toda la lista, hasta que no se necesiten más intercambios. Por ello se trata de un algoritmo lento y poco eficiente.

La implementación de dicho algoritmo en una función de Javascript que recibe un array desordenado sería la siguiente:

//la función recibe un array desordenado
function burbuja(arr) {
 //Primer bucle, recore todo el array
 for (var i = 0; i < arr.length; i++) {
   //segundo bucle, va ordenando los elementos.
   for(var j=0; j  arr[j + 1]) {
      var el1 = arr[j];      
      arr[j] = arr[j + 1];
      arr[j + 1] = el1;
     }
   }
  }
  //al acabar la ordenación devulve el array, 
  //ahora ordenado
  return arr;
}

Javascript: convertir una cadena CSV en un array.

Vamos con un tip rápido de Javascript ¿cómo convertimos en un array una cadena de valores separados por comas? (en una entrada antigua hicimos el proceso contrario) Es bastante sencillo lograrlo:

var sabbath = 'ozzy,iommi,bill,geezer';
var sabbath_array = sabbath.split(",")

Basta con usar la función split() pasándole la coma como parámetro para que cree un array con tantas posiciones como valores separados por coma haya en la cadena.

Métodos del objeto Number en Javascript

El lenguaje Javascript tiene una serie de objetos básicos, que a su vez tienen propiedades y métodos. En próximas entradas iremos viendo distintos objetos, hoy vamos a empezar por los de Number, que tiene básicamente cinco métodos:

  • .toExponential(): Esta función nos devuelve una cadena representando el valor del número con el que trabajamos, pero representado en notación exponencial (también llamada notación científica). Opcionalmente puede recibir un parámetro donde le indiquemos el número de decimales que queremos.
  • .toFixed(): Esta función nos devuelve una cadena representando el valor del número con el que trabajamos, pero redondeando el número de decimales a la cantidad que le digamos. Si no recibe parámetro alguno lo interpretará como un 0 y nos dará un valor entero, si recibe parámetros mostrará tantos decimales como el parámetro indique, rellenando con ceros cuando sea necesario.
  • .toPrecision(): Esta función nos devuelve una cadena representando el valor del número con el que trabajamos, pero redondeado a la longitud que le pasemos como parámetro. Si no se le pasa parámetro alguno entonces devuelve el número entero, si el parámetro es mayor que la longitud del número añadirá un separador decimal seguido de ceros hasta complertar dicha longitud.
  • .toString(): Esta función nos devuelve una cadena representando el valor del número con el que trabajamos. Se le puede pasar como parámetro un valor entre 2 y 36, dicho valor es la base en la que queremos que se formatee el número (por ejemplo 16 para conseguir un resultado hexadecimal, 2 para un resultado binario,etc) .
  • .valueOf(): Esta función nos devuelve el tipo primitivo del objeto Number, es decir, un valor numérico. Es un método que generalmente se usa de forma interna en Javascript y pocas veces se invoca desde el código web.

Javascript: eliminar comillas y apóstrofos en una cadena.

El otro día, desarrollando una aplicación en el trabajo, me encontré con la necesidad de eliminar las comillas simples (o apóstrofos) y dobles de un campo de texto. ¿es posible hacerlo con Javascript? Sí, veamos varios ejemplos de expresiones regulares para hacerlo:

La primera opción sería eliminar ambas:

miCadena = miCadena.replace(/["']/g, "");

¿Y si cambiamos el apóstrofo por un acento?

miCadena = miCadena.replace(/[']/g, "`");

¿Y si cambiamos las comillas por dos acentos?

miCadena = miCadena.replace(/["]/g, "``");

Obtener edad desde una fecha en Javascript

Hace un tiempo habíamos visto cómo obtener una edad desde una fecha de nacimiento en PostgreSQL, en MySQL y en MS SQL-Server. ¿Y en javascript? Vamos a ver tres funciones:

En la primera función el parámetro que recibiremos será una cadena con una fecha en formato YYYYMMDD (por ejemplo 20180211 para hoy):

function terIdade(cadeaData) {
    var hoxe = new Date();
    var nacemento = new Date(cadeaData);
    var idade = hoxe.getFullYear() - nacemento.getFullYear();
    var m = hoxe.getMonth() - nacemento.getMonth();
    if (m < 0 || (m === 0 && hoxe.getDate() < nacemento.getDate())) {
        idade--;
    }
    return idade;
}

Otra opción, pasando el mismo parámetro, es conseguir el resultado el milisengundos y operar con él para obtener la edad. Para eso dividiremos la diferencia entre fechas entre 1000*60*60*24*365.25:

function terIdade(cadeaData) {
    var nacemento = new Date(cadeaData);
    var data = new Date();
    var dif = data-birthdate;
    var idade = Math.floor(dif/31536000000);
    return idade;
}

La tercera opción sería no mandar a la función una cadena con la fecha, sino separados el año, el mes y el día (pasándoselos como enteros, no como cadenas). Y para el resto haríamos más o menos la misma operación que en el ejemplo.

function terIdade(ano,mes,dia) {
    var hoxe = new Date();   
    var idade = hoxe.getFullYear() - ano;
    var m = hoxe.getMonth() - mes;
    if (m < 0 || (m === 0 && hoxe.getDate() < dia)) {
        idade--;
    }
    return idade;
}