Skip to content

Commit 35ff2c1

Browse files
authored
Merge pull request mouredev#6287 from sarismejiasanchez/retos_programacion_5
#5 - Python
2 parents d7045b2 + 9f56146 commit 35ff2c1

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# #05 VALOR Y REFERENCIA
2+
3+
"""
4+
* - Muestra ejemplos de asignación de variables "por valor" y "por referencia", según
5+
* su tipo de dato.
6+
"""
7+
8+
# PASO POR VALOR
9+
# Variables inmutables (se comportan como si fueran "por valor")
10+
# Los tipos de datos inmutables en Python incluyen int, float, bool, str, tuple.
11+
# Si modificas una variable de un tipo inmutable, se crea un nuevo objeto en memoria.
12+
13+
print("PASO POR VALOR")
14+
# Variables inmutables (int, str)
15+
a = 10
16+
b = a # Apunta al mismo valor que a
17+
18+
b = 20 # Se crea un nuevo valor, b apunta a otro lugar en memoria
19+
20+
print(a) # 10 (a no ha cambiado)
21+
print(b) # 20 (b tiene un nuevo valor)
22+
23+
# PASO POR REFERENCIA
24+
# Variables mutables (se comportan como si fueran "por referencia")
25+
# Los tipos de datos mutables incluyen list, dict, set. Modificar una variable mutable afecta
26+
# a todas las referencias que apuntan a ese objeto.
27+
28+
print("PASO POR REFERENCIA")
29+
# Variables mutables (listas)
30+
x = [1, 2, 3]
31+
y = x # y apunta al mismo espacio en memoria de x
32+
33+
y.append(4) # Modifica la lista a la que ambos apuntan
34+
35+
print(x) # Output: [1, 2, 3, 4] (x ha cambiado)
36+
print(y) # Output: [1, 2, 3, 4] (y también ha cambiado)
37+
38+
39+
"""
40+
* - Muestra ejemplos de funciones con variables que se les pasan "por valor" y
41+
* "por referencia", y cómo se comportan en cada caso en el momento de ser modificadas.
42+
* (Entender estos conceptos es algo esencial en la gran mayoría de lenguajes)
43+
*
44+
"""
45+
46+
# Función con inmutables (se comportan como si fueran "por valor")
47+
# Cuando pasas un tipo inmutable a una función, cualquier modificación dentro de la función no # afectará al valor original fuera de la función.
48+
49+
print("\nFunciones: Paso por Valor vs Referencia")
50+
51+
print("PASO POR VALOR")
52+
53+
def modificar_numero(n):
54+
n = 100 # Se asigna un nuevo valor a n
55+
print(f"Valor dentro de la función: {n}") # # Valor dentro de la función: 100
56+
57+
numero = 10
58+
modificar_numero(numero)
59+
print(f"Valor fuera de la función: {numero}") # Valor fuera de la función: 10
60+
61+
# Función con mutables (se comportan como si fueran "por referencia")
62+
# Cuando pasas un tipo mutable a una función, las modificaciones dentro de la función
63+
# afectarán al objeto original.
64+
65+
print("PASO POR REFERENCIA")
66+
67+
def modificar_lista(lista):
68+
lista.append(100) # Modifica la lista original
69+
70+
mi_lista = [1, 2, 3]
71+
modificar_lista(mi_lista)
72+
print(mi_lista) # [1, 2, 3, 100] (la lista ha sido modificada)
73+
74+
75+
"""
76+
* DIFICULTAD EXTRA (opcional):
77+
* Crea dos programas que reciban dos parámetros (cada uno) definidos como variables anteriormente.
78+
* - Cada programa recibe, en un caso, dos parámetros por valor, y en otro caso, por referencia.
79+
* Estos parámetros los intercambia entre ellos en su interior, los retorna, y su retorno
80+
* se asigna a dos variables diferentes a las originales. A continuación, imprime el valor de las
81+
* variables originales y las nuevas, comprobando que se ha invertido su valor en las segundas.
82+
* Comprueba también que se ha conservado el valor original en las primeras.
83+
*/
84+
"""
85+
86+
print("\nEXTRA")
87+
# POR VALOR
88+
print("POR VALOR")
89+
def values_exchange(value1, value2):
90+
temp = value1 # Guarda temporalmente el valor de value1
91+
value1 = value2 # Asigna el valor de value2 a value1
92+
value2 = temp # Asigna el valor temporal (el original de value1) a value2
93+
return value1, value2
94+
95+
num1 = 10
96+
num2 = 15
97+
print(f"Valor original num1: {num1}")
98+
print(f"Valor original num2: {num2}")
99+
100+
inter_num1, inter_num2 = values_exchange(num1, num2)
101+
print(f"Valor intercambio num1: {inter_num1}")
102+
print(f"Valor intercambio num2: {inter_num2}")
103+
104+
# POR REFERENCIA
105+
print("\nPOR REFERENCIA")
106+
107+
def reference_exchange(value1, value2):
108+
# Intercambiar el contenido de los argumentos mutables
109+
value1[:], value2[:] = value2[:], value1[:] # Asignación por slice para modificar in-place
110+
return value1, value2
111+
112+
113+
numbers = [num for num in range(10) if num % 2 == 0] # Numeros pares entre 0 y 10
114+
fruits = ["naranja", "melon", "manzana"] # Lista de frutas
115+
print(f"Valor original numbers: {numbers}")
116+
print(f"Valor original fruits: {fruits}")
117+
inter_value1, inter_value2 = reference_exchange(numbers, fruits)
118+
print(f"Valor intercambio numbers: {inter_value1}")
119+
print(f"Valor intercambio fruits: {inter_value2}")

0 commit comments

Comments
 (0)