Programación orientada a objetos en PHP 2: Constructores y destructores

Y aquí va la segunda entrega del minicurso de programación orientada a objetos en PHP. Esta vez toca el turno a los constructores y a los destructores. Si todo va bien mañana publicaré el enlace al vídeo.

Programación orientada a objetos en PHP 2: Constructores y destructores

Python. Convertir un string en una tupla, lista o diccionario

El método más conocido para convertir una cadena (o string) en una tupla, lista o diccionario es usar la función eval():

texto = "((1, 2), (3, 4))"
print eval(texto)[0]

Que dará como resultado:

(1, 2)

que es el resultado que buscamos (el primer elemento).

Por curiosidad podemos probar a imprimir el primer elemento con:

print texto[0]

Y ahora podemos hacer lo mismo con un diccionario:

texto = "{ 'uno': 1, 'dos': 2 }"
print eval(texto)['uno']

y el resultado será:

1

Si probásemos a usar la cadena sin eval tendríamos un error:

print texto['uno']

dará como resultado:

TypeError: string indices must be integers, not str

Una forma más segura de convertir cadenas a tuplas, listas o diccionarios

La función eval() puede ser una fuente de problemas si el texto proviene, por ejemplo, de un usuario malintencionado. Para hacer la conversión de manera más segura es más conveniente usar la función literal_eval():

import ast
texto = "{ 'uno': 1, 'dos': 2 }"
print ast.literal_eval(texto)['uno']

Respuesta a la pregunta #2. ¿Cómo hacer un bucle infinito?

Hoy vamos a ver la respuesta a la pregunta ¿Cómo hacer un bucle infinito?.

Teníamos el código:

#include <stdio.h>
 
int main() {
	char i;
	for (i=0; i>=0; i++) {
		printf("Soy un bucle infinito (ciclo %d)\n", i);
	}
 
	return 0;
}

y se trataba de convertirlo en un bucle infinito sin modificar el for y usando números enteros. Una posible solución es:

#include <stdio.h>
 
int main() {
	unsigned char i;
	for (i=0; i>=0; i++) {
		printf("Soy un bucle infinito (ciclo: %d)\n", i);
	}
 
	return 0;
}

El problema era que el bucle no era infinito porque cuando la variable i llega a 127 y le sumamos 1 se convierte en -128. Como este es un número negativo la condición del for ya no se cumple.

Al usar un unsgined, cuando la variable i llega a 255 si la incrementamos pasa al siguiente número válido que es el 0. De esta forma ya tenemos uno de los incómodos bucles infinitos.

Pregunta de examen en C: ¿Cómo hacer un bucle infinito?

Siguiendo con la pregunta de examen de hace unos días “¿Es un bucle infinito?” hoy toca una nueva pregunta:

¿Cómo modificarías este código para que sí fuera un bucle infinito?

NOTA: No se puede cambiar nada en la línea del for y se deben usar números enteros.

#include <stdio.h>
 
int main() {
	char i;
	for (i=0; i>=0; i++) {
		printf("Soy un bucle infinito (ciclo %d)\n", i);
	}
 
	return 0;
}

¿Existe substring, substr o algo similar en python?

En Python hay algunas cosas que sorprenden a los recién llegados que tienen experiencia en otros lenguajes de programación. Una habitual es que no hay switch en Python. Otra que también despista bastante es que no existe una función como substr.

¿Cómo se puede extraer parte de una cadena o string en Python?

La solución para hacer esto es usar el siguiente método:

cadena[comienzo:fin]

Donde cadena es una variable que contiene una cadena, comienzo es un entero con el que indicamos desde qué posición queremos a extraer y con fin marcamos el final. La cadena extraída será desde comienzo hasta fin-1.

Nota: la primera posición de la cadena es la posición 0.

Por ejemplo:

cadena = "Hola amiguetes"
print(cadena[0:1]) # Esto dará como resultado 'H'

El resultado es ‘H’ porque estamos pidiendo desde el elemento 0 (el primero) hasta el elemento 0 (recordemos que es fin-1).

cadena = "Hola amiguetes"
print(cadena[1:1]) # Esto dará como resultado ''

Aquí el resultado es una cadena vacía puesto que empezamos en 1 y terminamos en 0 (1-1).

cadena = "Hola amiguetes"
print(cadena[1:2]) # Esto dará como resultado 'o'

Aquí recogemos desde la posición 1 hasta la 1 (2-1). Por eso sale sólo la ‘o’. A veces resulta confuso porque el segundo número (fin) no indica la longitud de la subcadena que queremos sino la posición del último elemento de la misma.

Y aquí os dejo otros ejemplos:

print(cadena[0:6]) # 'Hola a'
print(cadena[0:]) # Si no indicamos fin recogemos la cadena hasta el final 'Hola amiguetes'
print(cadena[5:]) # 'amiguetes'
print(cadena[:5]) # 'Hola'
print(cadena[:]) # 'Hola amiguetes'
print(cadena[-8]) # 'm' recoge el octavo elemento empezando por el final
print(cadena[-8:]) # 'miguetes' desde el octavo empezando por el final hasta el final
print(cadena[:-4]) # 'Hola amigu' Desde el principio hasta el cuarto elemento empezando por el final

Más información: http://docs.python.org/release/2.3.5/whatsnew/section-slices.html