1 00:00:01,070 --> 00:00:26,910 Ahora vamos a continuar con funciones, ¿vale? Su definición, parámetros y retorno. Bien, para definir una función, recuerdo en C que era obligatorio poner el tipo de elemento que devolvía, ¿vale? Y si había parámetros, que no tiene por qué haberlos siempre, pero si los había, era obligatorio definir el tipo de parámetros que recibían, ¿vale? Eso era obligatorio. 2 00:00:26,910 --> 00:00:48,490 Y también era importante hacer una declaración antes de definir la propia función, ¿vale? Antes de definirla, ¿ok? En Python no es necesario ninguna de estas cosas, ¿vale? Para nosotros crear una función simplemente vamos a poner def, ¿vale? Pero eso no es el tipo, ¿vale? Simplemente es la definición de la función. 3 00:00:48,490 --> 00:00:55,310 Y dentro de los parámetros vamos a poner las variables que queremos utilizar, pero no vamos a poner de qué tipo son, ¿vale? 4 00:00:56,049 --> 00:01:01,649 Porque ya sabéis que el tipado en Python es dinámico, ¿vale? 5 00:01:02,530 --> 00:01:09,890 Bien, sí que es importante, como no vamos a poner qué devuelve y qué recibe, sí que es importante utilizar estos comentarios, ¿vale? 6 00:01:09,890 --> 00:01:12,730 Que ya veis que aparecen entre tres comillas dobles, ¿vale? 7 00:01:12,730 --> 00:01:18,349 En el que expliquemos lo que hace la función y los argumentos o los parámetros que recibe, ¿vale? 8 00:01:18,489 --> 00:01:21,790 Para luego, cuando leamos, sepamos qué está haciendo, ¿vale? 9 00:01:21,810 --> 00:01:23,989 Y también, por supuesto, lo que devuelve, ¿ok? 10 00:01:24,769 --> 00:01:29,469 Bueno, pues aquí veis que esta función recibe una potencia recibida, recibe una potencia de ruido, ¿vale? 11 00:01:29,890 --> 00:01:31,730 Y en dBm, ¿vale? 12 00:01:32,510 --> 00:01:35,849 Y lo que hace es que calcula la SNR, ¿vale? 13 00:01:35,890 --> 00:01:38,010 Que se calcula como la diferencia entre las dos. 14 00:01:38,129 --> 00:01:39,409 Y eso es lo que devuelve, ¿vale? 15 00:01:39,530 --> 00:01:43,349 Y lo va a devolver siempre y cuando la potencia del ruido sea diferente de 0, ¿vale? 16 00:01:43,370 --> 00:01:47,689 Si es diferente de 0, pues nos va a devolver que no hay SNR, ¿vale? 17 00:01:48,489 --> 00:02:07,269 Bien, veis que la definición es muy sencilla, mucho más rápida que definir en Python, en C, perdón, y el uso, sí que esto es destacable, ¿vale? El uso se hace exactamente igual. Fijaros, ¿vale? Solo que aquí no hay que definir el tipo de dato de SNR, pero se usa exactamente igual. 18 00:02:07,269 --> 00:02:29,840 Entonces, podemos tener funciones que dentro de sí mismas utilicen estructuras, ¿vale? Esto ya lo hemos visto, sobra, no voy a perder mucho el tiempo en esto, ¿vale? Es decir, aquí tenemos una estructura condicional, aquí tenemos una estructura de un bucle for, ¿vale? Bueno, y podemos trabajar con ellas con listas, con lo que sea, ¿vale? 19 00:02:29,840 --> 00:02:43,539 Y el uso, pues ya sabéis, aquí por ejemplo, fijaros, estoy definiendo una lista que dentro tiene un diccionario o tres diccionarios y lo que hace es que llama a esa función analizarRed. 20 00:02:44,479 --> 00:02:50,259 Y con lo que me devuelve, luego hago un bucle que recorro para imprimir los valores. 21 00:02:50,780 --> 00:02:54,159 Y aquí veis ese ejemplo, la salida de ese uso de las funciones. 22 00:02:54,159 --> 00:03:02,159 No me voy a entretener, prefiero que vosotros lo busquéis, analicéis el código, porque no puedo estar analizando todos los códigos que voy presentando. 23 00:03:02,259 --> 00:03:02,919 Ejemplos, perdón. 24 00:03:05,120 --> 00:03:13,680 En cuanto al uso de parámetros en Python, sí que aquí me quiero parar, porque hay diferencias, sutiles diferencias respecto de C. 25 00:03:15,719 --> 00:03:22,759 Y el uso de valores por defecto o valores opcionales dentro de una función. 26 00:03:24,159 --> 00:03:34,060 Fijaros, yo defino aquí una función que he llamado estadísticas y esa función estadística pues recibe como parámetro una variable mediciones que va a ser una lista, ¿vale? 27 00:03:34,060 --> 00:03:46,199 Es decir, lo que va a hacer es analizar una lista y luego va a tener dos parámetros opcionales, umbral que por defecto vale menos 75 y verbose que por defecto vale false, ¿vale? 28 00:03:46,199 --> 00:04:13,500 Entonces, si veis, esto lo que va a hacer es una función que simplemente va a coger las mediciones que estén por encima de un umbral, ¿vale? Y si hemos activado el verbose, si el verbose es true, va a imprimir algunos parámetros de información, en este caso el número de mediciones totales y el número de elementos válidos totales y finalmente nos va a devolver una estadística que es la media, ¿vale? Simplemente eso. 29 00:04:13,500 --> 00:04:33,060 Pero fijaros que aquí está lo importante. Es su uso de valores por defecto. Yo a la función estadística voy a poder llamarla de tres formas. La voy a poder llamarla solo con los datos, con los datos y el umbral, con los datos y un verbose diferente. Es decir, estos son por si yo quiero cambiar los valores por defecto. 30 00:04:33,060 --> 00:04:41,220 ¿Vale? O puedo hacer una cuarta opción que aquí no aparece y es que sería utilizar datos y poner un umbral diferente y un verbose diferente. ¿Vale? 31 00:04:42,779 --> 00:04:55,139 ¿Esto qué potencia nos da o qué versatilidad nos da? Pues que haya parámetros que no sea obligatorio ponerlo. En este caso, la función estadística, obligatorio, obligatorio, es simplemente la lista de valores de RSSI. 32 00:04:55,139 --> 00:05:10,060 El resto es completamente opcional, ¿vale? Luego vamos a encontrar que es importante que los primeros elementos que aparezcan en la función sean los obligatorios, ¿vale? Los elementos obligatorios. 33 00:05:10,060 --> 00:05:26,899 Y luego los opcionales, ¿vale? Si lo hacemos al revés nos va a dar un error, ¿vale? Y es importante que sepáis que nunca vamos a poder pasar una lista como valor por defecto, ¿vale? Es decir, como valor que aparezca corchete, abre corchete, cierra corchete. 34 00:05:26,899 --> 00:05:55,519 En el caso de que queramos utilizar una lista, ¿vale? Como valor de parámetro, lo haremos pasando non, ¿vale? Ese será el valor por defecto que pasemos, ¿vale? Y ya está, el orden de los parámetros opcionales, como aparece aquí, no importa, ¿vale? Porque como nosotros vamos a poner el nombre de la variable, lo vamos a poner exactamente igual, ¿vale? No podemos cambiar, tenemos que poner el parámetro exactamente igual, ¿vale? Pues pondremos verbos igual a true, ¿vale? Y umbral, pues el valor que queramos. 35 00:05:55,519 --> 00:06:04,500 Y luego, otra potencia más que nos permite Python es devolver varios valores, no devolver uno solo. 36 00:06:04,699 --> 00:06:09,160 Recordad que en C poníamos return y solo poníamos el elemento que queríamos devolver, 37 00:06:09,519 --> 00:06:11,600 ahora poniendo coma podemos devolver varios. 38 00:06:11,899 --> 00:06:15,259 Y esa devolución de varios al final lo que se convierte en una tupla, 39 00:06:15,399 --> 00:06:18,000 en una tupla que va a devolver varios elementos. 40 00:06:18,439 --> 00:06:23,220 Y cuando nosotros hagamos uso de esa función, fijaros, aquí hago uso de la función, 41 00:06:23,220 --> 00:06:25,680 cada uno de los valores de la tupla 42 00:06:25,680 --> 00:06:27,399 se van a asignar en un sitio u otro 43 00:06:27,399 --> 00:06:32,079 pues entonces el 311,0 se asignará en MED 44 00:06:32,079 --> 00:06:34,319 el 510 se asignará en MX 45 00:06:34,319 --> 00:06:35,879 el 95 en MN 46 00:06:35,879 --> 00:06:37,439 el 1,64 en PK 47 00:06:37,439 --> 00:06:39,680 y así se irán asignando 48 00:06:39,680 --> 00:06:42,199 y si yo hay valores que no me interesan 49 00:06:42,199 --> 00:06:44,360 guardarlos porque por lo que sea 50 00:06:44,360 --> 00:06:46,620 no vaya a hacer uso de ellos en ese momento 51 00:06:46,620 --> 00:06:48,980 puedo poner una barra baja 52 00:06:48,980 --> 00:06:51,459 y eso sería como ignorar 53 00:06:51,459 --> 00:06:52,939 la devolución de esos valores 54 00:06:52,939 --> 00:06:59,839 No habría ningún problema. Entonces, así no creo unas variables que me puedan consumir en un momento dado memoria. 55 00:07:02,209 --> 00:07:05,750 Y, por último, esta parte de funciones, el ámbito de las variables. 56 00:07:07,750 --> 00:07:13,870 Ámbito, ya recordáis, lo que habíamos visto en C eran variables locales y variables globales. 57 00:07:14,889 --> 00:07:22,230 Bueno, pues aquí seguimos teniendo el mismo concepto. El mismo concepto de variable global, que estaría definido en la parte de inicio del código. 58 00:07:22,230 --> 00:07:27,889 una variable local que solo va a ser accesible dentro de la función analizar, ¿vale? 59 00:07:28,269 --> 00:07:33,410 Pero yo voy a poder acceder a un blar como es el global, la voy a poder acceder tanto aquí, ¿vale? 60 00:07:34,290 --> 00:07:37,870 Y si yo quiero escribir en esa variable pondré antes global. 61 00:07:38,029 --> 00:07:42,350 Y una vez que haya escrito global podré sobreescribir su valor, ¿vale? 62 00:07:42,350 --> 00:08:00,389 Y luego también está la posibilidad de modificar una variable local dentro de otro método. ¿Cómo? Pues para eso tendríamos que definir un método, en este caso interna, dentro de externa. 63 00:08:00,389 --> 00:08:19,029 Y así tendríamos lo que se llama un enclosing, ¿vale? Y es que podríamos acceder a una variable que sea local. Y si nosotros quisiéramos modificar esa variable, pues simplemente antes de eso pondríamos non-local, ¿vale? Para que deje de ser local a la función externa y también podemos acceder desde dentro de ella, ¿vale? 64 00:08:19,029 --> 00:08:42,370 Y eso es todo. Aquí os he dejado cosas que tener cuidado de mal diseño para trabajar con variables locales y variables globales, ¿vale? Por lo general tenemos que intentar evitar trabajar con variables globales porque nos pueden dar problemas o puede ser que sobrescribamos elementos que no nos interese sobrescribir, ¿vale? 65 00:08:42,370 --> 00:08:47,850 Es mejor en un momento dado trabajar con variables locales en funciones y devolver esos valores, ¿vale? 66 00:08:48,350 --> 00:08:50,529 Ya está.