Mostrar Mensajes

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - chuidiang

Pages: [1] 2 3 ... 387
1
Pyhton / functools.reduce
« on: Agosto 29, 2024, 08:20:44 am »
functools.reduce permite aplicar una función de forma acumulativa a los elementos de un iterable, reduciéndolo a un solo valor. Por ejemplo

Code: [Select]
from functools import reduce

# Supongamos que tenemos una lista de números
numbers = [1, 2, 3, 4, 5]

# Queremos calcular el producto de todos los números en la lista
product = reduce(lambda x, y: x * y, numbers)

print(product)  # Output: 120


2
Pyhton / functools.partial
« on: Agosto 04, 2024, 05:19:57 pm »
El módulo functools en Python incluye la función partial, que permite crear nuevas funciones con algunos argumentos ya fijados. Esto es útil para simplificar llamadas a funciones y crear versiones especializadas de funciones existentes.

Code: [Select]
from functools import partial

def potencia(base, exponente):
    return base ** exponente

# Crear una función parcial que siempre eleve al cuadrado
elevar_al_cuadrado = partial(potencia, exponente=2)

# Usar la función parcial
print(elevar_al_cuadrado(5))  # Salida: 25
print(elevar_al_cuadrado(10))  # Salida: 100

Hemos definido una función potencia para elevar una base a un exponente. Con partial, creamos a partir de potencia la función elevar_al_cuadrado, donde hemos fijado expornente a 2. Podemos a partir de aquí llamar a elevar_al_cuadrado, que sería equivalente a llamar a potencia donde si el exponente es 2.

3
Pyhton / Leer fichero JSON
« on: Julio 25, 2024, 09:53:32 am »
El módulo JSON de Python permite leer fichero JSON de forma fácil. Por ejemplo, si tenemos el siguiente fichero JSON

Code: [Select]
{
    "nombre": "Ana",
    "edad": 30,
    "correo_electronico": "ana@example.com"
}

Podemos leer fácilmente y tenerlo en un dict con

Code: [Select]
import json

# Leer un archivo JSON
with open('datos.json', 'r') as archivo:
    datos = json.load(archivo)

print(datos)
# Salida: {'nombre': 'Ana', 'edad': 30, 'correo_electronico': 'ana@example.com'}
print(type(datos))
# Salida: <class 'dict'>

4
Java JSE / Re: Acceso a componentes
« on: Julio 24, 2024, 04:55:05 pm »
Se bueno :)

5
Pyhton / enumerados
« on: Julio 24, 2024, 08:38:58 am »
El módulo enum en Python permite definir conjuntos de nombres simbólicos asociados a valores únicos, proporcionando una manera clara y eficiente de manejar constantes relacionadas.

Code: [Select]
from enum import Enum

class EstadoOrden(Enum):
    PENDIENTE = 1
    PROCESANDO = 2
    COMPLETADO = 3
    CANCELADO = 4

# Uso de enumeraciones
estado = EstadoOrden.PENDIENTE

if estado == EstadoOrden.PENDIENTE:
    print("La orden está pendiente.")

podemos también dar el valor automáticamente al enumerado

Code: [Select]
from enum import Enum, auto

class DiaSemana(Enum):
    LUNES = auto()
    MARTES = auto()
    MIERCOLES = auto()
    JUEVES = auto()
    VIERNES = auto()
    SABADO = auto()
    DOMINGO = auto()

# Mostrar todos los días
for dia in DiaSemana:
    print(dia)


6
Java JSE / Re: Acceso a componentes
« on: Julio 23, 2024, 08:09:30 am »
Buenas

Para dependencias, lo mejor es usar maven, gradle o una herramienta similar. En un fichero propio de la  herramienta (pom.xml en maven o build.gradle en gradle) pones las dependencias que necesita y se descargan automáticamente de internet cuando compilas. Esas herramientas te permiten también hacer de forma fácil un zip que tenga dentro tu programa y las dependencias de forma que puedas desempaquetarlo en el ordenador que quieras. No conozco netbeans, pero seguramente soporte este tipo de herramientas. IntelliJ Idea y Eclipse lo hacen.

Otra alternativa que se usa a veces, aunque a mi no me gusta mucho, es hacer un único jar con todo dentro. Un jar no deja de ser como un zip con todas las clases compiladas dentro. Nada te impide desenpaquetarlos todos en un mismo directorio y luego empaquetar todo junto en un solo jar. Puedes hacerlo con el comando "jar" que viene con java o hay herramientas que te permiten hacerlo como https://one-jar.sourceforge.net/ .

Saludos.


7
Pyhton / dataclasses
« on: Julio 22, 2024, 03:55:19 pm »
Las dataclasses fueron introducidas en Python 3.7 para simplificar la creación de clases que son esencialmente "contenedores de datos".

A veces hacemos clases que solo contienen datos y debemos ponerles constructores, métodos para sacar por pantalla, equals, etc. Por ejemplo

Code: [Select]
class Persona:
    def __init__(self, nombre, edad, correo_electronico):
        self.nombre = nombre
        self.edad = edad
        self.correo_electronico = correo_electronico

    def __repr__(self):
        return f'Persona(nombre={self.nombre}, edad={self.edad}, correo_electronico={self.correo_electronico})'

persona = Persona('Ana', 30, 'ana@example.com')
print(persona)

con dataclasesses quedaría más sencillo

Code: [Select]
from dataclasses import dataclass

@dataclass
class Persona:
    nombre: str
    edad: int
    correo_electronico: str

persona = Persona('Ana', 30, 'ana@example.com')
print(persona)

8
Java JSE / Re: Acceso a componentes
« on: Julio 22, 2024, 08:10:17 am »
Buenas

Imagino que te refieres al constructor del componente. Si el componente no está construido no puedes meterlo en ningún lado y por tanto no puedes mirar ahí su jerarquía. Salvo que en el constructor mismo lo añadas donde sea, pero eso ya te obligaría a pasar el padre (el JFrame o lo que sea) como parámetro del constructor.

Saludos.

9
Pyhton / contextlib.contextmanager
« on: Julio 21, 2024, 01:24:05 pm »
Cuando abrimos un archivo en python, podemos usar with para asegurarnos de su cierre

Code: [Select]
with open("fichero.txt") as f:
    print(f.read())

with hace que cuando termine f.read() se cierre el fichero automáticamente, sin necesidad de que lo hagamos explícitamente.

Podemos usar la anotación contextlib.contextmanager para conseguir cosas similares: Con una instrucción with sobre un recurso hacer que se ejecute "algo" que nosotros queramos cuando termine. En el ejemplo del fichero, es cerrarlo, pero puede ser cualquier cosa. Por ejemplo, imagina que quieres medir cuánto tiempo tarda algo en ejecutarse. Podemos hacerlo así

Code: [Select]
import time
from contextlib import contextmanager

@contextmanager
def temporizador():
    inicio = time.time()
    try:
        yield
    finally:
        fin = time.time()
        print(f"Tiempo transcurrido: {fin - inicio} segundos")

# Uso del context manager personalizado
with temporizador():
    # Bloque de código que queremos medir
    time.sleep(2)

Hacemos una función temporizador(), anotada con @contextmanager. Cuando la llamas marca el tiempo de inicio. Con yield hacemos que se pare y devuelva el control al llamante, pero permitiéndole usar un with. Y cuando termine el with, continua la ejecución de nuestra función temporizador que mira el tiempo de fin y saca el resultado.

Luego solo queda llamar con with temporiazador() y hacer el código que tarda en ejecutarse y queremos medir (un sleep(2) en nuestro ejemplo).

10
Pyhton / anotaciones de tipos
« on: Julio 20, 2024, 11:18:46 am »
Python no necesita declarar los tipos de las variables. Pero a la hora de programar puede ser una ayuda si se sabe de qué tipo es cada variable. Python permite anotar las variables para indicar de qué tipo son.
Un detalle importante, aunque pongamos los tipos, no tendremos ningún tipo de error si ponemos un tipo que no es.

Code: [Select]
# La función admite un string y devuelve un string
def saludar(nombre: str) -> str:
    return f"Hola, {nombre}"

# La función admite un int y devuelve un int
def edad_en_dias(edad: int) -> int:
    return edad * 365

# Dos variables, un string y un int
nombre: str = "Carlos"
edad: int = 25

# Los usamos para llamar a las funciones.
print(saludar(nombre))
print(f"Has vivido aproximadamente {edad_en_dias(edad)} días.")

11
Java JSE / Re: Acceso a componentes
« on: Julio 19, 2024, 08:41:12 am »
Hola

Cualquier componente tiene el método getParent() que le devuelve dentro de qué "contenedor" está incluido. Llamando a jinternalFrame.getParent() puedes obtener el contenedor en el que está incluido y verificar si es el JFrame o el que necesites. Si no lo es, tienes que seguir "navegando" hacia arriba por el getParent()

Tendrás que apañar el código, pero la idea puede ser algo como esto.
Code: [Select]
Container parent = jinternalframe.getParent()
while (! (parent instanceof JFrame)) {
   parent = parent.getParent();
}

Si quieres el JFrame, el método SwingUtilities.getWindowAncestor(component) te hace este bucle hasta llegar al "window" que contiene el componente. Este puede ser un JFrame, un JDialog, .. Quizás también SwingUtilities.getRoot().

De la misma forma, para ver qué componentes tiene un contenedor, puedes usar getComponents(). Así que del JFrame, si no tienes métodos adecuados para localizar el toolbar, desktop o componente que necesites, puedes ir bajando hasta que localices el que quieras.

Desde luego, no es la forma más eficiente. Quizás puedas guardar los componentes que te interesen en un Map con una key adecuada, ejemplo map.put("toolbar", myToolbar). Para buscarlos, solo consultar en Map y un if por si te devuelve null (caso que comentas de que no haya toolbar).

Saludos.

12
Pyhton / Uso de functools.lru_cache
« on: Julio 14, 2024, 12:28:39 pm »
Cuando llamamos a una función que realiza cuentas muchas veces, es posible que lo hagamos con los mismos parámetros en varias ocasiones, perdiendo tiempo en volver a calcular algo que ya está calculado. Con functools.lru_cache, podemos decirle a una función que memorice resultados en función de los parámetros que le pasemos. Si volvemos a llamar a la misma función con los mismos parámetros, la función no hará el cálculo, simplemente te devolverá el resultado almacendado previamente.

Un ejemplo, cálculo recursivo de fibonnaci

Code: [Select]
# sin lru_cache. Esta llamada tarda bastante tiempo.
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(35))

Code: [Select]
#con lru_cache, la misma llamada tarda bastente menos.
from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(35))

El motivo es que al ser recursivo, llama a fibonnaci(n-1) y fibonacci(n-2). La primera volverá a calcular n-2 y n-3 y así sucesivamente, repitiendose la llamada con los mismos parámetros muchas veces.

13
Pyhton / Uso de la Biblioteca itertools: combinations
« on: Julio 13, 2024, 09:19:36 am »
La biblioteca itertools en Python proporciona una colección de herramientas para la manipulación de iterables. itertools.combinations: Genera todas las combinaciones posibles de un iterable.

Code: [Select]
import itertools

# itertools.combinations: Combinaciones
comb = list(itertools.combinations([1, 2, 3], 2))
print(comb)  # Salida: [(1, 2), (1, 3), (2, 3)]

14
Java JSE / Re: Actualizar contenido de un archivo properties
« on: Julio 09, 2024, 08:25:16 am »
Hola

Con la clase Properties no es posible, puesto que no guarda la información de comentarios/líneas en blanco del fichero original.

Tendrías que hacerlo a mano: leer el fichero a mano linea a linea, ver si es un comentario, línea en blanco o property. Guardarte los comentarios y líneas en blanco para luego escribirlos, etc.

Aquí he encontrado un ejemplo de cómo hacerlo https://es.stackoverflow.com/questions/350356/modificar-archivo-properties-con-java-sin-borrar-los-comentarios , aunque no he revisado si funciona bien o no. Hacen una clase hija de Properties que si analiza las líneas y guarda comentarios y líneas en blanco.

Se bueno.

15
Pyhton / Uso de la Biblioteca itertools: permutations
« on: Julio 06, 2024, 09:32:16 am »
La biblioteca itertools en Python proporciona una colección de herramientas para la manipulación de iterables. itertools.permutations: Genera todas las permutaciones posibles de un iterable

Code: [Select]
import itertools

# itertools.permutations: Permutaciones
perm = list(itertools.permutations([1, 2, 3]))
print(perm)  # Salida: [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

Pages: [1] 2 3 ... 387