Programación 3
|
|
Título del Test:
![]() Programación 3 Descripción: Programación 3 |



| Comentarios |
|---|
NO HAY REGISTROS |
|
Un programador junior está trabajando en una aplicación de procesamiento de imágenes. Ha definido una variable global CONFIG_BRILLO = 1.2 al inicio de su script. Dentro de una función ajustar_brillo(imagen), intenta modificar este valor con la línea CONFIG_BRILLO = 1.5 para que todas las futuras llamadas a cualquier función usen la nueva configuración. Sin embargo, al ejecutar el código, el valor de la variable global no cambia fuera de la función, y en su lugar se ha creado una nueva variable local. ¿Qué está fallando y qué implicación de diseño tiene esta solución?. Se debe usar la palabra clave local para indicar que, aunque el nombre coincide con una variable global, la intención es trabajar con una versión local. Se debe declarar global CONFIG_BRILLO al inicio de la función. Esto aumenta el acoplamiento y puede generar efectos secundarios difíciles de rastrear. La función debe retornar el nuevo valor y el código fuera de la función debe reasignar la variable global: CONFIG_BRILLO = ajustar_brillo(imagen). Un equipo de desarrollo está trabajando en un sistema de configuración de servidores. Han definido una función configurar_servidor(nombre, ip, so='Linux', ram=8, almacenamiento=256). Un nuevo requisito exige que la configuración se aplique en un orden específico: primero el nombre, luego el sistema operativo y finalmente la IP. Sin embargo, un programador realiza la siguiente llamada: configurar_servidor(ip='192.168.1.10', nombre='db-server-01', so='Ubuntu'). ¿Qué característica de los parámetros de función en Python permite que la llamada anterior funcione correctamente a pesar de no seguir el orden de definición y qué evalúa esta habilidad?. Los parámetros arbitrarios (*args). Los parámetros por nombre (keyword arguments), que permiten pasar valores a una función especificando explícitamente a qué parámetro corresponde cada valor. La coerción de tipos. La validación de precondiciones. Una empresa está desarrollando un sistema de generación de informes personalizables. La función principal generar_informe() debe aceptar una serie de metadatos que pueden variar mucho entre informes (ej: 'autor', 'departamento' vs 'version_software', 'revisor'). ¿Cuál es la forma más idiomática y profesional en Python de definir la función generar_informe para que pueda aceptar cualquier número de estos pares clave-valor como metadatos?. Usar *args para capturar todos los metadatos en una tupla. Definir la función con una gran cantidad de parámetros opcionales. Requerir que todos los metadatos se pasen en un único argumento de tipo string formateado en JSON. Usar un parámetro de tipo argumento arbitrario por nombre (**kwargs), que recogerá todos los argumentos en un diccionario. Un equipo está desarrollando una aplicación que requiere procesar listas de números para obtener el valor más alto, el más bajo y la suma total. Un programador está a punto de escribir tres funciones desde cero. Un compañero le sugiere que no reinvente la rueda. ¿Qué tipo de funciones debería utilizar el programador para resolver esta tarea de forma eficiente y estándar en Python?. Funciones anónimas (lambda). Funciones importadas del módulo math. Funciones integradas (built-in) como max(), min() y sum(), que están disponibles directamente en el intérprete de Python sin necesidad de importaciones. Métodos de la clase lista. Un ingeniero de software está diseñando una función validar_usuario(username, password). La función debe verificar que el nombre de usuario tenga al menos 4 caracteres y que la contraseña no sea una de las 100 contraseñas más comunes. Debe devolver True solo si ambas condiciones se cumplen. ¿Cuál de las siguientes implementaciones utiliza correctamente las funciones integradas y los operadores lógicos para reflejar las reglas de negocio de forma clara y eficiente?. Una implementación con if-elif-else anidados. Usar un bucle for para iterar sobre la lista de contraseñas comunes. Una función lambda que intenta encapsular toda la lógica compleja. Una única sentencia return que combina las condiciones usando operadores lógicos y funciones integradas: return len(username) >= 4 and password not in passwords_comunes. Estás desarrollando una función crítica para un sistema de transacciones bancarias que calcula el interés compuesto. La función calcular_interes(capital, tasa, periodos) debe asegurar bajo cualquier circunstancia que no se procesen valores inválidos. ¿Cuál es la mejor manera de implementar un "contrato" en la función para garantizar que las condiciones de entrada se cumplan antes de ejecutar la lógica principal?. Confiar en que el código que llama a la función siempre proporcionará datos válidos. Usar una serie de sentencias if que impriman mensajes de advertencia. Establecer precondiciones utilizando sentencias assert al inicio de la función (ej. assert tasa > 0...), que detendrán la ejecución con un AssertionError si una condición no se cumple. Envolver toda la lógica de la función en un bloque try...except Exception... Una startup de tecnología financiera está desarrollando una nueva plataforma de análisis de inversiones. El arquitecto de software principal insiste en que la primera fase del proyecto no debe centrarse en escribir código de inmediato, sino en definir los grandes bloques funcionales del sistema (Gestión de Usuarios, Procesamiento, Informes) para luego descomponer cada uno. ¿Qué principio fundamental del diseño de software está aplicando?. El principio de optimización prematura. Una metodología de desarrollo ágil (Scrum) centrada exclusivamente en entrega rápida. El uso de programación extrema (XP). La estrategia de diseño descendente, que consiste en descomponer un sistema complejo en subproblemas más pequeños y manejables de forma jerárquica. Un programador está depurando un sistema complejo y encuentra una función llamada procesar_datos(x, y, z) sin comentarios ni documentación. El líder del equipo le pide que documente adecuadamente la función para que herramientas automáticas y la ayuda interactiva (help()) puedan utilizarla. ¿Cuál es la forma estándar y profesional en Python para añadir esta documentación?. Incluir un docstring (cadena de documentación) delimitado por triples comillas justo debajo del encabezado de la función. Añadir comentarios de una sola línea (#) encima de la definición. Crear un documento de texto separado (README.md). Usar anotaciones de tipo (type hints). En un sistema de gestión de usuarios, existe una variable global intentos_login = 0. Una función verificar_credenciales intenta incrementar esta variable (intentos_login = intentos_login + 1) pero lanza un UnboundLocalError. ¿Por qué se produce este error?. Python asume que intentos_login es una variable local. Al intentar leerla antes de que se le haya asignado un valor en el ámbito local, se produce el error. Se necesita la palabra clave global para resolverlo (Nota: Esto es la solución, pero la pregunta pide el "por qué"). El error ocurre porque las variables globales son de solo lectura por defecto. El UnboundLocalError se debe a un conflicto de tipos. Estás trabajando en el desarrollo de un módulo de utilidades matemáticas. Creas una función potencia(base, exponente). Un compañero intenta llamarla usando potencia(5) y falla. Decides que si el exponente no se especifica, la función debería calcular el cuadrado. ¿Cómo deberías modificar la declaración de la función?. Modificar la declaración de la función para incluir un valor por defecto para el exponente, como def potencia(base, exponente=2):. Utilizar un bloque try-except dentro de la función. Crear una segunda función llamada cuadrado(base). Usar *args en la definición. Una empresa de logística necesita un programa para calcular el coste de envío. Un programador ha escrito el mismo bloque de código if-elif-else para calcular este coste en tres partes distintas del sistema. ¿Cuál es la mejor solución para refactorizar este código y por qué mejora la calidad del sistema?. Crear tres variables globales que almacenen el código repetido. Mover todo el código repetido a un único script que debe ser importado en cada lugar. Definir una función calcular_coste_envio(peso, es_internacional) que encapsule la lógica del cálculo y devuelva el coste total. Implementar una estructura de control switch-case (Python no tiene switch-case nativo, pero se podría simular). Estás desarrollando un módulo de análisis de datos con una función analizar_fichero(). No sabes de antemano cuántas ni cuáles operaciones querrá realizar el usuario en cada llamada (ej: 'contar_palabras', 'buscar_urls'). ¿Qué tipo de parámetro deberías usar para permitir un número indeterminado de operaciones como argumentos posicionales?. Un parámetro operaciones de tipo lista que el usuario debe rellenar. Un parámetro de tipo argumento arbitrario posicional (*args), como def analizar_fichero(ruta_fichero, *operaciones):. Múltiples parámetros con valores por defecto para cada operación posible. Un parámetro de tipo argumento arbitrario por nombre (**kwargs). Durante una revisión de código, se analiza una función de más de 200 líneas que realiza múltiples tareas (base de datos, estadísticas, HTML, email). El líder técnico la marca como "no mantenible". ¿Cuál sería la estrategia correcta para rediseñar esta función?. Añadir comentarios exhaustivos para explicar cada parte. Dividir la función en dos mitades lógicas. Convertir la función en una clase y mover la lógica a sus métodos. Descomponer la función monolítica en varias funciones más pequeñas y con una única responsabilidad (obtener datos, calcular, formatear, enviar). Un programador junior ha creado una función procesar_pago compleja. Un senior sugiere crear una función de más alto nivel, realizar_compra(pedido), que llame a otras funciones específicas (validar, cobrar, enviar), ocultando los detalles. ¿Qué concepto clave de la programación se está utilizando?. La recursividad. La abstracción, que permite ocultar los detalles de implementación de un proceso complejo, permitiendo que otras partes del sistema interactúen con la función sin necesidad de conocer su funcionamiento interno. El polimorfismo. El acoplamiento fuerte. |




