Tema Claro 
Lenguajes de programación · Lectura & Comprensión

Python & PHP SKool

Aprende a leer, entender y corregir código real. Dos lenguajes, en paralelo, desde las primeras instrucciones hasta las librerías profesionales. Pulsa ▶ en cualquier bloque para ver la ejecución paso a paso.

🐍 Python real (Pyodide ≈10 MB) · haz clic en ▶ para activarlo
🐘 PHP real (WASM ≈5 MB) · haz clic en ▶ para activarlo · avisa si algo no funciona
01

Variables & Tipos de datos

Una variable es una caja con nombre donde guardamos un valor. En Python el tipo se deduce solo; en PHP toda variable empieza con $. Ambos son tipado dinámico: la caja cambia de tipo según lo que metes.

Concepto clave — Tipado dinámico: no hace falta declarar qué tipo va dentro. El lenguaje lo averigua en tiempo de ejecución. Ventaja: menos código. Riesgo: si metes un número donde esperabas texto, el error aparece al ejecutar, no antes.
Python

        
salida
PHP

        
salida
ConceptoPythonPHP
Declarar variablenombre = "Ana"$nombre = "Ana";
Enteroedad = 25$edad = 25;
Decimalprecio = 3.14$precio = 3.14;
Booleanoactivo = True$activo = true;
Sin valorx = None$x = null;
Saber el tipotype(x)gettype($x)
Imprimirprint(x)echo $x;
Fin de línea— (salto de línea); obligatorio
02

Estructuras de control

Condicionales y bucles son el esqueleto de cualquier programa. En Python el bloque se define por indentación (espacios); en PHP por llaves { }. Ambos funcionan igual en lógica, distinto en forma.

¡Ojo con la indentación en Python! Si un bloque if tiene 4 espacios, todo su contenido debe tenerlos. Un espacio de más o de menos y el código falla. Es el error más común para quien llega del HTML.
Python
salida
PHP
salida
EstructuraPythonPHP
if / sinoif x > 0: / else:if ($x > 0) { / } else {
else ifelifelseif
Bucle contadofor i in range(5):for ($i=0; $i<5; $i++) {
Bucle mientraswhile condicion:while ($cond) {
Recorrer listafor item in lista:foreach ($arr as $item) {
Bloque de códigoindentación (4 espacios)llaves { }
03

Funciones

Una función es un bloque de código con nombre que puedes reutilizar. Recibe parámetros (entradas) y puede devolver un valor (salida). El principio DRY: Don't Repeat Yourself — si copias código, convierte eso en función.

Anatomía de una función: def (Python) o function (PHP) · nombre · paréntesis con parámetros · bloque de código · return opcional. Si no hay return, devuelve None / null.
Python
salida
PHP
salida
04

Listas & Arrays

Las listas (Python) y arrays (PHP) son colecciones de valores bajo un mismo nombre. Se accede a cada elemento por su índice, que empieza siempre en 0. Son la estructura de datos más usada junto con los diccionarios/arrays asociativos.

Índice base 0 — muy importante: si una lista tiene 5 elementos, los índices son 0, 1, 2, 3, 4. El elemento 5 no existe y da error. En Python el índice -1 accede al último elemento: truco muy útil.
Python
salida
PHP
salida
OperaciónPython (lista)PHP (array)
Crearnums = [1, 2, 3]$nums = [1, 2, 3];
Accedernums[0]$nums[0]
Añadir al finalnums.append(4)$nums[] = 4;
Longitudlen(nums)count($nums)
Eliminar últimonums.pop()array_pop($nums)
¿Contiene?3 in numsin_array(3, $nums)
Ordenarnums.sort()sort($nums)
Clave → valor{"a": 1} dict["a" => 1] assoc array
05

Clases & Objetos

Una clase es una plantilla. Un objeto es una instancia de esa plantilla. Si "Perro" es la clase, "Laika" y "Rex" son objetos. Cada objeto tiene sus propios atributos (datos) y métodos (funciones). Este paradigma se llama POO — Programación Orientada a Objetos.

self (Python) vs $this (PHP): dentro de un método, self / $this es la forma de referirse al objeto actual. Es como decir "yo mismo". Sin él no puedes acceder a los atributos del objeto desde dentro.
Python
salida
PHP
salida
06

Librerías: NumPy, Pandas & más

Una librería es código escrito por otros que importas para no reinventar la rueda. NumPy trabaja con números y matrices; Pandas con tablas de datos (piensa en Excel programable). En PHP las librerías más usadas son las propias del lenguaje para web: base de datos, JSON, fechas.

import vs require/include: en Python import numpy as np carga la librería y le da un alias corto. En PHP require incluye otro fichero PHP (una librería, una clase) en el programa actual. El concepto es el mismo: traer código externo al tuyo.

NumPy — cálculo numérico

Python · NumPy
salida

NumPy no tiene equivalente en PHP

PHP no se usa para cálculo científico. Para ese trabajo existen Python + NumPy, R, o MATLAB.


PHP sí tiene array_sum(), array_map() y funciones matemáticas básicas — pero no operaciones vectorizadas.

Pandas — tablas de datos

Python · Pandas
salida
PHP · Arrays + JSON
salida

Mapa rápido de librerías por uso:

UsoPythonPHP
Cálculo numériconumpy— (no aplica)
Tablas de datospandasarrays asociativos
Gráficasmatplotlib / seaborn— (JS en frontend)
Web / APIflask / fastapinativo + slim
Base de datossqlalchemy / pymysqlPDO / mysqli
JSONjson.loads()json_decode()
FechasdatetimeDateTime / date()
IA / MLscikit-learn / torch— (no aplica)
Peticiones HTTPrequestscurl / file_get_contents
07

Buscar & Filtrar en listas

Buscar un elemento, comprobar si existe y filtrar por condición son las operaciones más frecuentes cuando un LLM te devuelve datos en forma de lista. Python tiene sintaxis muy expresiva para esto; PHP usa funciones de librería estándar.

List comprehension (Python): [x for x in lista if condicion] es la forma pythonica de filtrar en una línea. Equivale a un bucle for + if + append. Cuando veas corchetes con for dentro, es esto.
Python
salida
PHP
salida
OperaciónPythonPHP
¿Contiene?x in listain_array($x, $arr)
Buscar índicelista.index(x)array_search($x, $arr)
Filtrar[x for x in l if cond]array_filter($arr, fn)
Transformar[f(x) for x in l]array_map(fn, $arr)
Contar coincidenciaslista.count(x)array_count_values($arr)
08

Cadenas de texto (Strings)

El texto es el tipo de dato más frecuente cuando trabajas con LLMs. Limpiar, buscar, dividir y recomponer strings es imprescindible. Python trata los strings como objetos con métodos; PHP usa funciones con prefijo str_.

f-strings vs interpolación: f"Hola {nombre}" inserta variables en Python. En PHP las comillas dobles también interpolan: "Hola $nombre". Para concatenar, PHP usa el punto .. Ambas formas aparecen constantemente en código generado por IA.
Python
salida
PHP
salida
OperaciónPythonPHP
Longitudlen(s)strlen($s)
Mayúsculas / Minúsc.s.upper() / s.lower()strtoupper($s) / strtolower($s)
¿Contiene?"sub" in sstr_contains($s, "sub")
Reemplazars.replace("a","b")str_replace("a","b",$s)
Dividirs.split(",")explode(",", $s)
Unir lista",".join(lista)implode(",", $arr)
Quitar espacioss.strip()trim($s)
Interpolaciónf"Hola {var}""Hola $var"
Subcadenas[2:5]substr($s, 2, 3)
09

Manejo de errores

Cuando algo falla, el programa lanza una excepción. Si no la capturas, el programa se detiene. El bloque try/except (Python) o try/catch (PHP) intercepta el error y permite continuar. El código que generan los LLMs casi siempre incluye esto.

Anatomía del try/except: en try va el código que puede fallar. En except/catch va qué hacer si falla. finally se ejecuta siempre — ideal para cerrar archivos o conexiones de base de datos.
Python
salida
PHP
salida
ConceptoPythonPHP
Bloque protegidotry:try {
Capturar errorexcept Exception as e:catch (Exception $e) {
Siempre ejecutarfinally:finally {
Lanzar errorraise ValueError("msg")throw new Exception("msg")
Mensaje del errorstr(e)$e->getMessage()
División por ceroZeroDivisionErrorException (manual)
Tipo incorrectoTypeErrorTypeError
10

JSON & APIs

JSON es el formato universal de intercambio de datos en la web. Cuando un LLM te genera código que llama a una API — o cuando tú llamas a un LLM por API — los datos viajan en JSON. Entender cómo convertir entre JSON y estructuras nativas es esencial.

Serializar vs Deserializar: convertir un objeto/array a texto JSON se llama serializar (json.dumps / json_encode). El proceso inverso — texto JSON a estructura de datos — es deserializar (json.loads / json_decode). Cuando ves estos nombres en código de IA, ya sabes qué hacen.
Python
salida
PHP
salida
OperaciónPythonPHP
JSON → datosjson.loads(texto)json_decode($texto)
Datos → JSONjson.dumps(datos)json_encode($datos)
JSON bonitojson.dumps(d, indent=2)json_encode($d, JSON_PRETTY_PRINT)
Petición GETrequests.get(url)file_get_contents($url)
Petición con cabecerasrequests.get(url, headers={})curl + CURLOPT_HTTPHEADER
Leer respuestar.json()json_decode($respuesta)
11

Expresiones regulares (Regex)

Las expresiones regulares son patrones para buscar, validar y extraer texto. Un LLM las genera con frecuencia para limpiar datos o validar formularios. No hace falta memorizarlas — sí hace falta reconocerlas y saber qué buscar.

Anatomía de una regex: /patron/flags. El patrón describe qué buscar: . cualquier carácter, * cero o más, + uno o más, ^ inicio, $ fin, [abc] uno de esos, \d dígito, \w letra/número, \s espacio. Los flags más comunes: i ignora mayúsculas, g busca todas las ocurrencias.
Python · módulo re
salida
PHP · preg_*
salida
OperaciónPythonPHP
¿Coincide?re.search(pat, s)preg_match($pat, $s)
Todas las coincidenciasre.findall(pat, s)preg_match_all($pat, $s, $m)
Reemplazarre.sub(pat, repl, s)preg_replace($pat, $repl, $s)
Dividirre.split(pat, s)preg_split($pat, $s)
Formato patrónr"patron" (raw string)"/patron/flags"
12

Anatomía de un modelo de IA

Cuando un LLM genera código de machine learning con Keras o TensorFlow, aparecen siempre los mismos bloques. No necesitas ejecutarlo — sí necesitas reconocer qué hace cada parte: dónde están los datos, dónde se define la red, dónde se entrena y dónde se predice.

El flujo siempre es el mismo: datos → modelo → compilar → entrenar → predecir. Si identificas esos 5 pasos en cualquier código de IA, ya entiendes su estructura, aunque no entiendas cada línea.
Python · Keras / TensorFlow
salida
Python · scikit-learn
salida
¿Y PHP? PHP no se usa para entrenar modelos de IA. Su papel en el ecosistema IA es otro: recibir la petición del usuario, llamar a una API de IA (OpenAI, Anthropic, Gemini…), recibir la respuesta en JSON y devolverla al navegador. El entrenamiento y la inferencia pesada ocurren en Python.
Bloque de códigoQué hacePalabras clave
Importar libreríasCargar herramientasimport keras, from tensorflow, import sklearn
Preparar datosCargar, limpiar, dividir train/testtrain_test_split, fit_transform, X_train, y_train
Definir modeloArquitectura de la redSequential(), Dense(), layers, activation
CompilarConfigurar aprendizajemodel.compile(), optimizer, loss, metrics
EntrenarAprender de los datosmodel.fit(), epochs, batch_size
Evaluar / PredecirComprobar y usar el modelomodel.predict(), model.evaluate(), score()
13

Ficheros, buffers & entorno

Leer y escribir archivos es una tarea básica en cualquier backend. Python usa el gestor de contexto with open(); PHP tiene fopen/fclose y funciones de alto nivel. Además veremos el buffer de salida, control de errores, locale y zona horaria — y las cookies en PHP.

Regla de oro — cierra siempre el fichero. En Python el bloque with lo hace automáticamente al salir. En PHP llama a fclose() o usa file_put_contents() que no deja nada abierto.
Python
salida
PHP
salida
Modos de apertura de fichero — el segundo argumento de fopen() / open():
ModoDescripciónPythonPHP
rSolo lectura. El fichero debe existir.open(f,"r")fopen($f,"r")
wSolo escritura. Crea o vacía el fichero.open(f,"w")fopen($f,"w")
aAñadir al final. Crea si no existe.open(f,"a")fopen($f,"a")
r+Lectura y escritura. El fichero debe existir.open(f,"r+")fopen($f,"r+")
w+Lectura y escritura. Crea o vacía.open(f,"w+")fopen($f,"w+")
xCrea exclusivo. Falla si el fichero ya existe.open(f,"x")fopen($f,"x")
rb/wbBinario. Añade b a cualquier modo.open(f,"rb")fopen($f,"rb")
Python · buffer, errores & entorno

io.StringIO() — fichero en memoria, sin disco. Útil para tests y parseo.

try / except / finally — captura FileNotFoundError, PermissionError

import locale
locale.setlocale(locale.LC_TIME, 'es_ES.UTF-8')


from datetime import datetime
from zoneinfo import ZoneInfo
dt = datetime.now(ZoneInfo('Europe/Madrid'))
print(dt.strftime('%A %d de %B de %Y'))
PHP · buffer, errores, locale & cookie

ob_start() — activa buffer de salida (todo echo queda en RAM).
ob_get_clean() — obtiene el buffer y lo vacía.
ob_end_flush() — vacía y desactiva el buffer.

error_reporting(E_ALL);
ini_set('display_errors', '1');
— muestra todos los errores (solo en desarrollo).

setlocale(LC_TIME, 'es_ES.UTF-8');
date_default_timezone_set('Europe/Madrid');
echo strftime('%A %d de %B de %Y');


Cookies:
setcookie('usuario', 'Ana', time()+86400, '/');
echo $_COOKIE['usuario'] ?? 'sin cookie';
Las cookies se envían ANTES de cualquier echo (en las cabeceras HTTP).
TareaPythonPHP
Leer fichero completoopen(f).read()file_get_contents($f)
Escribir fichero completoopen(f,'w').write(txt)file_put_contents($f, $txt)
Añadir al finalopen(f,'a').write(txt)file_put_contents($f,$txt,FILE_APPEND)
Línea por líneafor linea in f:while($l=fgets($f))
Buffer en memoriaio.StringIO()ob_start() … ob_get_clean()
Zona horariaZoneInfo('Europe/Madrid')date_default_timezone_set('Europe/Madrid')
Locale de fechaslocale.setlocale(LC_TIME,'es_ES.UTF-8')setlocale(LC_TIME,'es_ES.UTF-8')
Leer cookieno aplica (server-side)$_COOKIE['clave']
Escribir cookiesetcookie('c','v',time()+86400,'/')
14

Variables Superglobales: $_POST y $_GET

En PHP, $_POST y $_GET son arrays superglobales que permiten acceder a los datos enviados a través de los métodos HTTP POST y GET, respectivamente.

$_GET: Los datos se envían a través de la URL (ej: pagina.php?nombre=Sergio). Son visibles y se usan para consultas simples.
$_POST: Los datos se envían en el cuerpo de la petición HTTP (no visibles en la URL). Se usan para formularios con información sensible (ej: contraseñas).

⚠️ Seguridad: Siempre valida y sanitiza los datos de $_GET y $_POST con funciones como htmlspecialchars() o filter_var() para evitar ataques como XSS o inyección SQL.
PHP
// Ejemplo de $_GET
if (isset($_GET['nombre'])) {
    echo "Hola, " . htmlspecialchars($_GET['nombre']);
} else {
    echo "No se recibió el parámetro 'nombre' en la URL.";
}

// Ejemplo de $_POST (simulado para el editor)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['edad'])) {
    echo "Tu edad es: " . intval($_POST['edad']);
} else {
    echo "No se recibió el parámetro 'edad' por POST.";
}
          
salida
15

TensorFlow.js: Inteligencia Artificial en el Navegador

TensorFlow.js es una librería de JavaScript que permite ejecutar modelos de Machine Learning directamente en el navegador. Aquí tienes un ejemplo sencillo con tensores locales (sin necesidad de descargar modelos externos).

💡 Tip: Este ejemplo usa tensores simples. Si quieres cargar modelos pre-entrenados, alojalos en tu servidor y actualiza la URL en el código.
JavaScript (TensorFlow.js)
// Ejemplo de TensorFlow.js con tensores locales
async function runTFJSExample() {
  const outputDiv = document.getElementById('out-tfjs');
  outputDiv.innerHTML = '
Cargando TensorFlow.js...
'; try { // Crear un tensor simple const tensor = tf.tensor2d([[1, 2], [3, 4]]); const result = tensor.mul(2); // Multiplicar por 2 // Mostrar resultado en el HTML outputDiv.innerHTML = `
salida
Tensor original: [[1, 2], [3, 4]]
Resultado (x2): [[${result.get(0, 0)}, ${result.get(0, 1)}], [${result.get(1, 0)}, ${result.get(1, 1)}]]
`; } catch (error) { outputDiv.innerHTML = `
Error
${error.message}
`; } }
salida
16

Lectura de CSV con Pandas

Con pandas, puedes leer y manipular archivos CSV directamente en el navegador usando Pyodide. Aquí tienes un ejemplo con datos de ejemplo generados en el código.

💡 Tip: Usa StringIO para simular un archivo CSV sin necesidad de subir ficheros.
Python
import pandas as pd
from io import StringIO

data = "nombre,edad,ciudad\nAna,25,Madrid\nLuis,30,Barcelona"
df = pd.read_csv(StringIO(data))
repr(df)  
# Esto devuelve una cadena con la representación del DataFrame
          
salida
Progreso
0 / 14 secciones
Certifica que
ha completado el curso
Lectura & Comprensión de código · Python & PHP
14 secciones · desde variables hasta ficheros y entorno
Código de verificación · SHA-256 en binario
Hexadecimal
Código completo (base64 · verificable)

🔍 Verificar diploma

Pega el código base64 de cualquier diploma para comprobar su autenticidad y ver los datos originales.