# Introducción

# Microbit v2 vs v1

<p class="callout info">Página extraída de Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA</p>

La microbit fué lanzada en el 2015 con la versión 1 que tiene los siguientes sensores y actuadores

[![hardware_1_0.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/hardware-1-0.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/hardware-1-0.png)

*Autor[ Federico Coca ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/Miscelanea/about/)Fuente : [Guía de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/)Licencia[ CC-BY-SA](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/Miscelanea/lic/)*

En el 2020 se lanzó la versión 2 que tiene además incorporó estas características

[![hardware_2 (1).png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/hardware-2-1.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/hardware-2-1.png)  
*Autor[ Federico Coca ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/Miscelanea/about/)Fuente : [Guía de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/)Licencia[ CC-BY-SA](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/Miscelanea/lic/)*

Además de estas que no se ven:

- Modo ahorro de energía. Esta nueva función de ahorro o modo de espera detendrá el programa que se esté ejecutando en la micro:bit hasta que se pulse el botón de reinicio.
- Microprocesador cuatro veces más potente que la que tenía la v1
- Ocho veces más memoria que la v1 (512 KB de memoria Flash y 128 KB de memoria RAM)

La alimentación es a través de los 5V del puerto USB o 3V a través del conector JST. También es posible alimentar a la micro:bit desde los anillos 3V/GND en el conector de borde.

##### <span style="color: rgb(22, 145, 121);">**Pinout**</span>

Hay 25 pistas/patillas que incluyen 5 agujeros para usar con clavijas tipo banana de 4 mm o pinzas de cocodrilo. Tres de estos anillos son para entrada y salida de propósito general (GPIO) y también sirven para detección analógica, PWM y táctil, y dos están conectados a la alimentación de la micro:bit.

Solamente tienen conexión las pistas frontales, las posteriores están sin conexión y los anillos posteriores están conectados a los delanteros. Las pistas mas finas están separadas 1,27 mm, algunas son utilizadas por micro:bit y otras están disponibles para su uso mediante cualquiera de los conectores externos existentes, lo que permite un amplio mercado de accesorios externos. En en enlace tenemos una [guia de accesorios para micro:bit](https://cdn.sanity.io/files/ajwvhvgo/production/c6f0a76cbe149f91fb998fba3f76e4816187e575.pdf?dl=AccessoryGuide.pdf)

En la imagen siguiente tenemos la descripción de pines de la micro:bit v2 a la izquierda y de la v1 a la derecha para poder comparar y establecer las diferencias de una forma sencilla.

[![pinout.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/pinout.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/pinout.png)  
*Autor[ Federico Coca ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/Miscelanea/about/)Fuente : [Guía de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/)Licencia[ CC-BY-SA](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/Miscelanea/lic/)*

En [microbit.pinout.xyz](https://microbit.pinout.xyz/) tenemos un fantástico recurso para obtener más información sobre los pines de la micro:bit y de cómo los utilizan algunos accesorios.

<p class="callout info">Página extraída de Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA</p>

# Ventajas y desventajas Python

##### <span style="color: rgb(22, 145, 121);">**Ventajas**</span>

Python es un lenguaje de desarrollo y curva de aprendizaje rápido. Tiene una comunidad amplia con muchas librerías, ejemplos, tutoriales... que para casi todos los problemas, seguro que encuentras una solución escrita en Python

Es un lenguaje de alto nivel, es decir, que se programa igual que los programadores, pero interpretable para los humanos !. Comparándolo con otros lenguajes (Java, C++, etc..) es el más "*humanizado*".

También gestiona la memoria, por ejemplo, si programas en C++, tú eres el responsable de limpiar la memoria de datos que ya no usas, o corres el peligro de quedarte sin memoria. En Python ya lo hace por ti.

##### <span style="color: rgb(22, 145, 121);">**Desventajas**</span>

La gestión de memoria que antes se mencionaba tiene un precio; bajada de velocidad y paradójicamente coste de memoria.

En otros programas, el compilador esta en tu PC, pero en Python está en el dispositivo (por eso se llama lenguaje **Interpretado**), esto hace que ocupa memoria, y en microbit por ejemplo esto hace que no puedes usar Python y código Bluetooh pues no hay suficiente memoria RAM.

[![2024-07-04 18_44_27-(1) Exploring the Arduino Nano ESP32 _ MicroPython & IoT Cloud - YouTube.png](https://libros.catedu.es/uploads/images/gallery/2024-07/scaled-1680-/2024-07-04-18-44-27-1-exploring-the-arduino-nano-esp32-micropython-iot-cloud-youtube.png)](https://libros.catedu.es/uploads/images/gallery/2024-07/2024-07-04-18-44-27-1-exploring-the-arduino-nano-esp32-micropython-iot-cloud-youtube.png)  
<span style="color: rgb(0, 0, 0);">[Fuente vídeo Exploring the Arduino Nano ESP32 | MicroPython &amp; IoT](https://youtu.be/R51tf66es9w?t=1512)</span>

<span style="color: rgb(0, 0, 0);">También hay que tener en cuenta que si Python es un lenguaje **interpretado**, siempre será más lento que un lenguaje **compilado** por ejemplo el C++, pues para ejecutarlo el dispositivo, lo ejecuta, pues lo tiene en binario y en paz, pero en Python cada instrucción necesita ser interpretado, decodificado, en binario antes de ejecutarse.</span>

# Editores

Tienes dos opciones, online o local :

##### <span style="color: rgb(22, 145, 121);">**Programar online con [https://python.microbit.org (recomendado)](https://python.microbit.org/)**</span>

Entramos en [https://python.microbit.org/](https://python.microbit.org/) y el editor online nos permite trabajar ;

1. Una biblioteca de códigos que nos permitirá seleccionar y usar para programar de forma guiada
2. Un simulador para ver cómo se ejecutaría nuestro código
3. Un botón para enviar a la microbit real
4. Botones para guardar nuestro código de forma local y abrir los existentes.

[![2024-09-18 22_40_17-micro_bit Python Editor.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/2024-09-18-22-40-17-micro-bit-python-editor.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/2024-09-18-22-40-17-micro-bit-python-editor.png)

<p class="callout info">En este curso utilizaremos el editor online microbit.org</p>

##### <span style="color: rgb(22, 145, 121);">**Programar en local con MU**</span>

Es un editor muy sencillo, se descarga en [https://codewith.mu/](https://codewith.mu/) y permite su instalación en Windows, Linux y Apple.[![2024-07-04 18_44_27-(1) Exploring the Arduino Nano ESP32 _ MicroPython & IoT Cloud - YouTube.png](https://codewith.mu/img/en/mu.gif)](https://codewith.mu/img/en/mu.gif)  
<span style="color: rgb(0, 0, 0);">Fuente [https://codewith.mu/](https://codewith.mu/) CC-BY-NC-SA  
</span>La primera vez que lo ejecutamos (tarda algo la primera vez) nos pide el **modo** que se puede cambiar en cualquier momento:[![2024-09-18 22_28_05-Configuración.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/2024-09-18-22-28-05-configuracion.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/2024-09-18-22-28-05-configuracion.png)1 Escribimos el código  
2 Lo comprobamos  
3 Flasheamos, es decir enviamos el código al Microbit (conectarlo previamente)  
4 Cuando sale el mensaje *Código copiado al microbit* **procedemos a resetearlo** para que la placa ejecute el programa.

<p class="callout danger">ATENCIÓN ES IMPORTANTE **RESETEAR LA MICRO:BIT** tienes un botón de ***reset*** al lado del conector de USB para no estar desconectando y conectando. Una vez reseteado tu programa funcionará.</p>

[![2024-09-18 22_34_58-Configuración.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/2024-09-18-22-34-58-configuracion.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/2024-09-18-22-34-58-configuracion.png)

```python
from microbit import *

while True:
  display.scroll("Hola Mundo")
```

##### <span style="color: rgb(22, 145, 121);">**OTROS EDITORES DE PYTHON QUE <span style="text-decoration: underline;">NO SON COMPATIBLES CON PYTHON MICROBIT</span>**</span>

Vamos a ver este programa escribo en [https://python.microbit.org/](https://python.microbit.org/)

```
# Imports go at the top
from microbit import *
while True:
    if pin0.is_touched():
        display.show(Image.HEART)
    else:
        display.show(Image.NO)
```

Lo que hace es :

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube.com/embed/uI2p9HazV1Y" width="560"></iframe>

  
<span style="color: rgb(22, 145, 121);">**EL MISMO CÓDIGO EN MAKECODE-PYTHON** </span>Makecode a pesar de que esta orientado a programar con bloques, t**iene su sección de Python**

[![2024-09-23 10_37_07-Microsoft MakeCode for micro_bit.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/2024-09-23-10-37-07-microsoft-makecode-for-micro-bit.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/2024-09-23-10-37-07-microsoft-makecode-for-micro-bit.png)

Al darle en Python (arriba a la derecha), muestra este código

```
def on_forever():
    if pins.digital_read_pin(DigitalPin.P0) == 1:
        basic.show_icon(IconNames.HEART)
    else:
        basic.show_icon(IconNames.NO)
basic.forever(on_forever)

```

Como se puede ver **makecode python no es compatible con [https://python.microbit.org/](https://python.microbit.org/)** ya lo dice en su tutorial [https://microbit-micropython.readthedocs.io/en/v2-docs/](https://microbit-micropython.readthedocs.io/en/v2-docs/)

[![2024-09-23 10_46_05-BBC micro_bit MicroPython documentation — BBC micro_bit MicroPython 2 documentat.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/2024-09-23-10-46-05-bbc-micro-bit-micropython-documentation-bbc-micro-bit-micropython-2-documentat.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/2024-09-23-10-46-05-bbc-micro-bit-micropython-documentation-bbc-micro-bit-micropython-2-documentat.png)

<span style="color: rgb(22, 145, 121);">**EL MISMO CÓDIGO CON PYTHON DE TINKERCAD**</span>

Tinkercad [https://www.tinkercad.com/](https://www.tinkercad.com/) es una herramienta estupenda de simulación pues es muy realístico, igual que Maquecode, este muy orientado a la programación en bloques pero también tiene su sección de código python

[![2024-09-23 10_51_49-Circuit design PIN0-CORE-CREW - Tinkercad.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/2024-09-23-10-51-49-circuit-design-pin0-core-crew-tinkercad.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/2024-09-23-10-51-49-circuit-design-pin0-core-crew-tinkercad.png)

Si le das la opción de bloque+código intenta muestra los bloques traducidos a código, pero si le das la opción sólo código **pierdes** la programación en bloques, Esto ya lo vimos en [https://libros.catedu.es/books/programa-arduino-mediante-codigo/page/software](https://libros.catedu.es/books/programa-arduino-mediante-codigo/page/software) en los párrafos escritos en naranja.

El código generado vemos que **no es compatible con Python microbit**

```
# Python code
#

def on_pulsed_p0_high():
  basic.show_icon(IconNames.Heart)
pins.on_pulsed(DigitalPin.P0, PulseValue.HIGH, on_pulsed_p0_high)

def on_pulsed_p0_low():
  basic.show_icon(IconNames.No)
pins.on_pulsed(DigitalPin.P0, PulseValue.LOW, on_pulsed_p0_low)

```

# Introducción al Python

<p class="callout warning">Esta es **una muy breve introducción al Python** como recordatorio de algunas instrucciones si ya has utilizado este lenguaje.   
Si es la primera vez, te recomendamos que visites nuestro curso [**PYTHON PARA TODOS Python for everybody**](https://libros.catedu.es/books/python-for-everybody) por Charles R. Severance licencia CC-BY-NCSA que empieza desde cero.</p>

##### <span style="color: rgb(22, 145, 121);">**Lenguajes, intérpretes y compiladores**</span>

{{@13364#bkmrk-python-es-un-lenguaj}}

{{@13364#bkmrk-la-cpu-entiende-un-i}}

{{@13364#bkmrk-el-lenguaje-de-m%C3%A1qui}}

{{@13364#bkmrk-estos-traductores-de}}

{{@13364#bkmrk-un%C2%A0int%C3%A9rprete%C2%A0lee-el}}

```python
    >>> x = 6
    >>> print(x)
    6
    >>> y = x * 7
    >>> print(y)
    42
    >>>
```

{{@13364#bkmrk-est%C3%A1-en-la-naturalez}}

##### <span style="color: rgb(22, 145, 121);">**Variables**</span>

Las variables son como cajas que puedes meter valores. Y los valores pueden ser de varios **tipos** :

- **int** si son enteros
- **float** si tienen decimales
- **binario**Deben comenzar por 0b. Por ejemplo: 0b110, 0b11
- **string** son frases, son "***cadenas***" de caracteres entre "
- **bool** Solamente hay dos literales booleanos True o False
- **lista** Se pueden declarar variables que son conjuntos por ejemplo Colores = \["verde", "rojo", "naranja" \]

Para crear una variable puedes usar cualquier palabra, x, y, z o Nombre\_alumno ... pero algunas palabras no puedes usar, [ver](https://libros.catedu.es/books/python-for-everybody/page/2-variables)

Para visualizar variables puedes usar la **instrucción** **print** poniendo entre paréntesis el valor o variable que quieres visualizar.

En la siguiente ventana puedes dar al botón *play* y ver el resultado

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="200" marginheight="0" marginwidth="0" src="https://trinket.io/embed/python/47afa56dd668" width="100%"></iframe>

<p class="callout success">Modifica los valores como quieras, es un **intérprete**, juega y dale al play para ver el resultado </p>

Como puedes ver se ha introducido un operador el + que realiza la suma del valor de x original (43) y se le incrementa una unidad resultando en la impresión un 44.

##### <span style="color: rgb(22, 145, 121);">**Cadenas**</span>

<span style="color: rgb(0, 0, 0);">Cadenas son secuencias de caracteres, por ejemplo la palabra "banana"</span>

<span style="color: rgb(0, 0, 0);">[![2025-04-05 09_29_39-Editing Page 6 Cadenas _ Librería CATEDU.png](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-05-09-29-39-editing-page-6-cadenas-libreria-catedu.png)  
fuente ](https://libros.catedu.es/uploads/images/gallery/2025-04/2025-04-05-09-29-39-editing-page-6-cadenas-libreria-catedu.png)['Python for Everybody'](https://www.py4e.com/book)[ por ](https://libros.catedu.es/uploads/images/gallery/2025-04/2025-04-05-09-29-39-editing-page-6-cadenas-libreria-catedu.png)[Charles R. Severance](http://www.dr-chuck.com/)[ ](https://libros.catedu.es/uploads/images/gallery/2025-04/2025-04-05-09-29-39-editing-page-6-cadenas-libreria-catedu.png)</span>

<span style="color: rgb(0, 0, 0);">Se puede obtener su longitud con la función len, o obtener un carácter ...</span>

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="300" marginheight="0" marginwidth="0" src="https://trinket.io/embed/python/5e023b136db8" width="100%"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Operadores**</span>

*<span style="color: rgb(0, 0, 0);">Este apartado de operadores es adaptado de Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA</span>*

Los **operadores aritméticos** se utilizan para realizar operaciones matemáticas como sumas, restas, multiplicaciones, etc.

<center id="bkmrk-operador-descripci%C3%B3n"><div class="md-typeset__scrollwrap"><div class="md-typeset__table"><table><thead><tr><th align="center">Operador</th><th>Descripción</th><th>Ejemplo</th></tr></thead><tbody><tr><td align="center">+</td><td>Suma o concatenación en textos</td><td>`5+3=8`, `"Hola" + "Mundo" = "Hola Mundo`</td></tr><tr><td align="center">-</td><td>Diferencia</td><td>`6-3=3`</td></tr><tr><td align="center">\*</td><td>Multiplicación</td><td>`3*3=9`</td></tr><tr><td align="center">/</td><td>División</td><td>`6/2=3`</td></tr><tr><td align="center">//</td><td>Parte entera de un cociente</td><td>`10//3=3`</td></tr><tr><td align="center">%</td><td>Resto de un cociente</td><td>`10%3=1`</td></tr><tr><td align="center">\*\*</td><td>Potenciación</td><td>`5**2=25`</td></tr></tbody></table>

</div></div></center>Los **operadores de asignación** se utilizan para asignar valores a variables.

<center id="bkmrk-operador-descripci%C3%B3n-1"><div class="md-typeset__scrollwrap"><div class="md-typeset__table"><table><thead><tr><th align="center">Operador</th><th>Descripción</th><th>Ejemplo</th></tr></thead><tbody><tr><td align="center">=</td><td>Asignación</td><td>`x=4`, `a = a + 1`</td></tr><tr><td align="center">+=</td><td>Suma y asignación</td><td>`x+=1` equivale a `x = x + 1`</td></tr><tr><td align="center">-=</td><td>Diferencia y asignación</td><td>`x-=1` equivale a `x = x - 1`</td></tr><tr><td align="center">\*=</td><td>Multiplicación y asignación</td><td>`x*=3` equivale a `x = x * 3`</td></tr><tr><td align="center">/=</td><td>División y asignación</td><td>`x/=3` equivale a `x = x / 3`</td></tr><tr><td align="center">%=</td><td>Asignación de restos</td><td>`x%=3` equivale a `x = x % 3`</td></tr><tr><td align="center">\*\*=</td><td>Asignación de exponentes</td><td>`x**=3` equivale a `x = x ** 3`</td></tr></tbody></table>

</div></div></center>Los **operadores de comparación** comparan dos valores/variables y devuelven un resultado booleano: Verdadero o Falso `True` o `False`.

<center id="bkmrk-operador-descripci%C3%B3n-2"><div class="md-typeset__scrollwrap"><div class="md-typeset__table"><table><thead><tr><th align="center">Operador</th><th>Descripción</th><th>Ejemplo</th></tr></thead><tbody><tr><td align="center">==</td><td>Igual a</td><td>`2==3` retorna `False`</td></tr><tr><td align="center">!=</td><td>Distinto de</td><td>`2!=3` retorna `True`</td></tr><tr><td align="center">&lt;</td><td>Menor que</td><td>`2<3` retorna `True`</td></tr><tr><td align="center">&gt;</td><td>Mayor que</td><td>`2>3` retorna `False`</td></tr><tr><td align="center">&lt;=</td><td>Menor o igual que</td><td>`2<=3` retorna `True`</td></tr><tr><td align="center">&gt;=</td><td>Mayor o igual que</td><td>`2>=3` retorna `False`</td></tr></tbody></table>

</div></div></center>Los **operadores lógicos** se utilizan para comprobar si una expresión es Verdadera o Falsa. Se utilizan en la toma de decisiones.

<center id="bkmrk-operador-descripci%C3%B3n-3"><div class="md-typeset__scrollwrap"><div class="md-typeset__table"><table><thead><tr><th align="center">Operador</th><th>Descripción</th><th>Ejemplo</th></tr></thead><tbody><tr><td align="center">and</td><td>AND lógica</td><td>`a and b #True si a y b son ciertos`</td></tr><tr><td align="center">or</td><td>OR lógica</td><td>`a or b #True si a o b son ciertos`</td></tr><tr><td align="center">not</td><td>NOT lógica</td><td>`not a #True si el operador a es falso`</td></tr><tr><td>in</td><td>pertenencia</td><td>Devuelve True si pertenece</td></tr><tr><td>no int</td><td>no pertenencia</td><td>Devuelve True si no pertenece</td></tr><tr><td>is</td><td>identidad</td><td>Devuelve True si son iguales</td></tr><tr><td>is not</td><td>no identidad</td><td>Devuelve True si no son inguales</td></tr></tbody></table>

</div></div></center>Los **operadores bit a bit** o bitwise actúan sobre los operandos como si fueran cadenas de dígitos binarios. Operan bit a bit:

<center id="bkmrk-%C2%A0-operador-descripci"><div class="md-typeset__scrollwrap"><div class="md-typeset__table"><table><thead><tr><th align="center">Operador</th><th>Descripción</th><th>Ejemplo</th></tr></thead><tbody><tr><td align="center">&amp;</td><td>AND bit a bit</td><td>`5&6 # 101 & 110 = 110 = 4`</td></tr><tr><td align="center">|</td><td>OR bit a bit</td><td>`5 \| 6 # 101 \| 110 = 111 = 7`</td></tr><tr><td align="center">~</td><td>NOT bit a bit</td><td>`~3 # ~011 = 100 = -4`</td></tr><tr><td align="center">^</td><td>XOR bit a bit</td><td>`5^3 # 101^011 = 110 = 6`</td></tr><tr><td align="center">&lt;&lt;</td><td>Desplazamiento izquierda</td><td>`4<<1 # 100 << 1 = 1000 = 8`</td></tr><tr><td align="center">&gt;&gt;</td><td>Desplazamiento derecha</td><td>`4 >> 1 # 100 >> 1 = 010 = 2`</td></tr></tbody></table>

</div></div></center><p class="callout success">Prueba, juega con este código:</p>

  
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="600" marginheight="0" marginwidth="0" src="https://trinket.io/embed/python/502063b6b44b" width="100%"></iframe>

<p class="callout info">**Comentarios en Python**  
Una sola línea : Escribiendo el símbolo almohadilla (#) delante del comentario.  
Multilínea: Escribiendo triple comillas dobles (“””) al principio y al final del comentario.</p>

##### <span style="color: rgb(22, 145, 121);">**Entradas de teclado**</span>

Ya hemos visto salidas por pantalla con **print**, pero ahora con input puede leer variables del teclado, esto es mejor experimentarlo que leerlo :

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="300" marginheight="0" marginwidth="0" src="https://trinket.io/embed/python/34653253eb52" width="100%"></iframe>

Fíjate que hay que poner las líneas **x = float (x)** e **y = float(y)** para convertirlos a números decimales, en caso contrario las interpreta string y no puede multiplicar en Resultado, pero en el siguiente ejemplo **no es necesario en la variable cel** (celsius) pues se multiplica por números decimales 32.0 5.0 y 9.0

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="250" marginheight="0" marginwidth="0" src="https://trinket.io/embed/python3/5dbec1550b" width="100%"></iframe>

<p class="callout info">**try** y **except** son dos funciones que son *un seguro para el programador* por si el usuario en vez de teclear un número, mete un string o carácter</p>

<p class="callout success">**La sangría es importante en Python**   
La sangría se refiere a los espacios al comienzo de una línea de código. Mientras que en otros lenguajes de programación la sangría en el código es solo para facilitar la lectura, la sangría en Python es muy importante ya que se usa para indicar un bloque de código.</p>

##### <span style="color: rgb(22, 145, 121);">**Condicionales**</span>

Las instrucciones **if: else:** son las que nos permiten realizar operaciones según las condiciones puestas. *Ojo con la sangría*

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="300" marginheight="0" marginwidth="0" src="https://trinket.io/embed/python/cc1aa3f917a7" width="100%"></iframe>

<p class="callout success">**\\n** es un carácter especial que significa "Salto de página"</p>

##### <span style="color: rgb(22, 145, 121);">**Bucles**</span>

- **while** ejecuta lo contenido en la sangría mientras sea verdadero la condición
- **for** ejecuta lo contenido en la sangría mientras y va recorriendo la variable dentro del rango creado

Para verlo mejor vamos a ver estos ejemplos

- EJEMPLO BUCLE WHILE 
    - mientras n sea positivo va ejecutando : imprime n y lo decrementa
    - al decrementar llega un momento que deja de ser positivo y finaliza el bucle
- EJEMPLO BUCLE WHILE INFINITO 
    - Es muy típico en robótica, todo el rato hace el bucle (en robótica para que lea los sensores y realice cosas en los actuadores) pero este ejemplo no esta en un robot sino en tu pc y no queremos que se quede "colgado" luego al teclear "fin" acaba gracias a la instrucción **break**
    - Fíjate que hay una instrucción **continue** para que pase a la siguiente iteración provocando que no imprime lo tecleado
- EJEMPLO BUCLE FOR FRIENDS 
    - Va recorriendo la variable friend dentro del cojunto lista friends
    - como puedes ver la diferencia entre for y while es que for además recorre la variable
- EJEMPLO BUCLE FOR 
    - mientras n este en el rango de 0 a 5 se ejecuta

Venga pruébalo !!!

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="600" marginheight="0" marginwidth="0" src="https://trinket.io/embed/python/f797a1eaea48" width="100%"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Funciones**</span>

No vamos a entrar en detalle, pero observa el siguiente código

- **FUNCIONES PREDEFINIDAS** Si observas, la primera línea llama a importar una librería externa, **import math** donde math es un fichero que tienen funciones predefinidas, vamos a utilizar una de ellas, la raiz cuadrada **sqrt** luego para llamar a esa función que esta definida dentro de math se hace con la instrucción **math.sqrt**
- **FUNCIONES DEFINIDAS POR TI** em este caso, se utiliza la palabra **def** para crear una función, que le vamos a pasar tres argumentos a, b y c y para finalizar la función usamos **return** para devolver el valor que queremos obtener

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="600" marginheight="0" marginwidth="0" src="https://trinket.io/embed/python/900fd133a2a9" width="100%"></iframe>

#### <span style="color: rgb(22, 145, 121);">**Para saber más de Python**</span>

<table id="bkmrk-curso-completo-de-py" style="width: 850px;" width="500"><tbody><tr><td style="width: 671.213px;">CURSO PYTHON FOR EVERYBODY en español</td><td style="width: 167.987px;">[ver](https://libros.catedu.es/books/python-for-everybody)</td></tr><tr><td style="width: 671.213px;">Curso completo de Python 222pag pdf (\*)</td><td style="width: 167.987px;">[Descargar](https://drive.google.com/file/d/1AQc6nuDTxFdC63b1x3weIW3OmedlBcug/view?usp=drive_link)</td></tr><tr><td style="width: 671.213px;">Curso completo de Python 422pag (\*)</td><td style="width: 167.987px;">[Descargar](https://drive.google.com/file/d/1pUxzeBBbpskfIHHtlH68zrOPEIFKR_vE/view?usp=sharing)</td></tr><tr><td style="width: 671.213px;">Curso completo de Python desde 0 (\*)</td><td style="width: 167.987px;">[Ver](http://peremanelv.com/Pro_Python/CursocompletoPython.pdf)</td></tr><tr><td style="width: 671.213px;">Curso de Python desde 0 (\*)</td><td style="width: 167.987px;">[Ver](http://peremanelv.com/Pro_Python/CursoPythonDesde0.pdf)</td></tr><tr><td style="width: 671.213px;">Manual de referencia Python (\*)</td><td style="width: 167.987px;">[Ver](http://peremanelv.com/Pro_Python/MunualPython.pdf)</td></tr><tr><td style="width: 671.213px;">Programación en Python (\*)</td><td style="width: 167.987px;">[Ver](http://peremanelv.com/Pro_Python/CursoPythonDimas.pdf)</td></tr><tr><td style="width: 671.213px;">Trabajando con ficheros en Python (\*)</td><td style="width: 167.987px;">[Ver](http://peremanelv.com/Pro_Python/ArchivosTextoConPython.pdf)</td></tr><tr><td style="width: 671.213px;">Programación orientada a objeto en Python (\*)</td><td style="width: 167.987px;">[Ver](http://peremanelv.com/Pro_Python/PythonPOO.pdf)</td></tr><tr><td style="width: 671.213px;">un manual para aquellos usuarios con previos conocimientos de Python, como la programación modular y orientada a objetos.  
También algunos conocimientos de las librerías **tkinter** (Para crear interfaces gráficos y **SQlite3** (para gestionar bases de datos). (\*)  
</td><td style="width: 167.987px;">[Descargar](https://drive.google.com/file/d/16hvyTSTBs8aFeVvhF-MCQQmKlPP2pYo7/view?usp=sharing)</td></tr></tbody></table>

(\*) Agradecimientos a Pere Manel [http://peremanelv.com](http://peremanelv.com)

# Micropython de microbit

<p class="callout info">Página extraída de Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA</p>

#### [<span style="color: #007575;">**API: El módulo microbit**</span>](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/programacion/python/#api-el-modulo-microbit)

Todo lo necesario para interactuar con el hardware de la micro:bit está en el módulo *microbit* y se recomienda su uso escribiendo al principio del programa:

<center id="bkmrk-from-microbit-import">```
from microbit import *
```

</center>Las funciones disponibles directamente son:

```
sleep(ms) #1
running_time() #2
temperature() #3
scale(valor_a_convertir, from_=(min, max), to=(min, max)) #4
panic(error_code) #5
reset() #6
set_volume(valor) #7 (V2)
'''
1 Esperar el número de milisegundos indicado
2 Devuelve el tiempo en ms desde la última vez que se encendió la micro:bit
3 Devuelve la temperatura en Celcius
4 Convierte un número de una escala de valores a otra
5 La micro:bit entra en modo pánico por falta de memoria y se dibuja una
cara triste en la pantalla. El valor de error_code puede ser cualquier entero.
6 Resetea la micro:bit
7 Estable el volumen de salida con un *valor* entre 0 y 255
'''

```

[<span style="color: #007575;">**Estructuras de datos en Python**</span>](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/programacion/python/#estructuras-de-datos-en-python)

##### **<span style="color: rgb(22, 145, 121);">Las listas (list)</span>**

Se trata de un tipo de dato que permite almacenar series de datos de cualquier tipo bajo su estructura. Se suelen asociar a las matrices o arrays de otros lenguajes de programación.

En Python las listas son muy versatiles permitiendo almacenar un conjunto arbitrario de datos. Es decir, podemos guardar en ellas lo que sea.

Una lista se crea con `[]` y sus elementos se separan por comas. Una gran ventaja es que pueden tener datos de diferentes tipos.

```
lista = [1, "Hola", 3.141592, [1 , 2, 3], Image.HAPPY]
```

Las de principales propiedades de las listas:

- Son ordenadas, mantienen el orden en el que han sido definidas
- Pueden ser formadas por tipos arbitrarios de datos
- Pueden ser indexadas con \[i\]
- Se pueden anidar, es decir, meter una lista dentro de otra
- Son mutables, ya que sus elementos pueden ser modificados
- Son dinámicas, ya que se pueden añadir o eliminar elementos

Hay dos métodos aplicables:

- **`append`**. Permite agregar elementos a la lista.
- **`remove`**. Elimina elementos de la lista.
- **`insert(pos,elem)`**. Inserta el elemento `elem` en la posición `pos` indicada.

En el ejemplo vemos el funcionamiento.

[![ejem_listas.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/ejem-listas.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/ejem-listas.png)  
*Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA*

Con estos conocimientos tendremos suficiente para hacer lo que pretendemos, que no es otra cosa que animar imágenes.

#### [<span style="color: rgb(22, 145, 121);">**Las tuplas (tuple)**</span>](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/programacion/python/#las-tuplas-tuple)

Son muy similares a las listas con una diferencia principal con las mismas y es que las tuplas no pueden ser modificadas directamente, lo que implica que no dispone de los métodos vistos para listas. Una tupla permite tener agrupados un número inmutable de elementos.

Una tupla se crea con `()` y sus elementos se separan por comas.

```
tupla = (1, 2, 3)
```

Principales propiedades:

- Se pueden declarar sin usar los paréntesis, pero no se recomienda. No usarlos puede llevarnos a ambigüedades del tipo print(1, 2, 3) y print((1, 2, 3)).
- Si la tupla tiene un solo elemento esta debe finalizar con coma.
- Se pueden anidar tuplas, por ejemplo `tupla2 = tupla1, 4, 5, 6, 7`.
- Se pueden declarar tuplas vacias, por ejemplo `tupla3 = ()`.
- Las tuplas son *iterables* por lo que sus elementos pueden ser accesados mediante la notación de índice del elemento entre corchetes. Si se quiere acceder a un rango de indices se separan por ":" ambos índices.
- Es posible convertir listas en tuplas simplemente poniendo la lista dentro de los paréntesis de la tupla, por ejemplo, `tupla_lista = ([1, "Hola", 3.141592, [1 , 2, 3], Image.HAPPY])`

A continuación vemos un ejemplo.

[![ejem_tuplas.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/ejem-tuplas.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/ejem-tuplas.png)  
*Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA*

#### <span style="color: rgb(22, 145, 121);">[**Diccionarios (dict)**](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/programacion/python/#diccionarios-dict)</span>

Estas estructuras contienen la colección de elementos con la forma `clave:valor` separados por comas y encerrados entre `{}`. Las claves son objetos inmutables y los valores pueden ser de cualquier tipo. Sus principales características son:

- En lugar de por índice como en listas y tuplas, en diccionarios se acceder al valor por su clave.
- Permiten eliminar cualquier entrada.
- Al igual que las listas, el diccionario permite modificar los valores.
- El método `dicc.get()` accede a un valor por la clave del mismo.
- El método `dicc.items()` devuelve una lista de tuplas `clave:valor`.
- El método `dicc.keys()` devuelve una lista de las claves.
- El método `dicc.values()` devuelve una lista de los valores.
- El método `dicc.update()` añade elemento `clave:valor` al diccionario.
- El método `del dicc` borra el par `clave:valor`.
- El método `dicc.pop()` borra el par `clave:valor`.

A continuación vemos un ejemplo

[![ejem_dicc.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/ejem-dicc.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/ejem-dicc.png)  
*Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA*

#### <span style="color: #007575;">**Bucles**</span>

Los **Bucles** son un tipo de estructura de control muy útil cuando queremos repetir un bloque de código varias veces. En Python existen dos tipos de bloques, el bucle ***for*** para contar la cantidad de veces que se ejecuta un bloque de código, y el bucle ***while*** que realiza la acción hasta que la condición especificada no sea cierta.

- [While](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/programacion/python/#item1)
- [for](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/programacion/python/#item2)
- [Bucle for decontando](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/programacion/python/#item3)
- [Sentencias break y continue](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/programacion/python/#item4)

##### <span style="color: rgb(22, 145, 121);">**While** </span>  
La sintaxis de while es la siguiente:

```
while condicion:
    bloque de codigo

```

donde "*condicion*", que se evalúa en cada iteración, puede ser cualquier expresión realizado con operadores condicionales que devuelva como resultado un valor True o False. Mientra que "bloque de codigo" es el conjunto de instrucciones que se estarán ejecutando mientras la condición sea verdadera (True o '1'). Es lo mismo poner `while true:` que poner `while 1:`.

Para recorrer los bucles se utilizan variables que forman parte de la condición, estableciendose en esta lo que deben cumplir.

Un ejemplo sencillo podría ser el siguiente, controlar el riego de una planta en función del valor de la humedad de la tierra en la que está.

```
from microbit import *

while (humedad() < 45):
    display.scroll(Image.SAD)
    sleep(1000)

display.show(Image.HAPPY)

```

que hará que si la humedad baja por debajo de 45 se muestre una carita triste indicando que hay que regar y si es mayor mostrará una carita feliz. Evidentemente hay que resolver el tema de como obtener la humedad, pero esa es una historia que veremos mas adelante.

El bucle `while` puede tener de manera opcional un bloque `else` cuyas sentencias se ejecutan cuando se han realizado todas las iteraciones del bucle. Un ejemplo lo vemos a continuación:

```
cuenta = 0
while cuenta < 5:
    print("Iteración del bucle")
    cuenta = cuenta + 1
else:
    print("bucle finalizado")

```

##### <span style="color: rgb(22, 145, 121);">**for**</span>

Son también bucles pero su acción está dirigida a contar el número de veces que ocurre algo o realizar una acción un determinado número de veces. Es especialmente útil para recorrer los datos de una lista, tupla o diccionario.

La sintaxis de este tipo de bucles en Python es:

```
for variable in secuencia:
    declaracion

```

Siendo "variable" la variable que se va a recorrer en el bucle de forma que cuando se alcance el valor establecido se sale del bucle.

La variable puede ser una cadena, un rango de valores que se expresa con `range(n)`, siendo n el número de valores del rango que se inicia en 0 y que pueden ser iterados con una variable. Mas ampliamente, la sintaxis de `range()` es `range(start, stop, step)` siendo `start` y `stop` opcionales.

Veamos un primer ejemplo en el que vamos a utilizar un bucle para encender uno a uno por filas los LEDs de la primera y última columna.

```
from microbit import *
for var in range(5): # var puede tomar 5 valores, del 0 al 4
    display.set_pixel(0, var, 9) # Se ilumina el LED de la fila 0 y el valor de var para columna
    sleep(300)
    display.set_pixel(4, var, 9) # Se ilumina el LED de la fila 4 y el valor de var para columna
    sleep(300)

```

Los bucles se pueden anidar, es decir se puede crear un bucle dentro de otro del mismo o diferente tipo, de forma que por cada iteración del bucle mas externo se tienen que producir todas las iteraciones del bucle mas interno. Veamos como ejemplo el de encender todos los LEDs de uno en uno, de izquierda a derecha, utilizando el valor de sus coordenadas x,y. El programa sería:

```
from microbit import *

display.clear()
for y in range(0, 5): # Valor de columna
    for x in range(0, 5): # Valor de fila
        display.set_pixel(x, y, 9) # Encender LED x,y
        sleep(100)

```

En la animación siguiente vemos el programa en funcionamiento.

[![ejem_dicc.png](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/img/programacion/python/uso_for.gif)](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/img/programacion/python/uso_for.gif)  
  
*Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA*

El bucle `for` puede tener de manera opcional un bloque `else` cuyas sentencias se ejecutan cuando se han realizado todas las iteraciones del bucle. Un ejemplo lo vemos a continuación:

```
for var in range(5):
    print(var)
else:
    print("bucle finalizado")

```

##### <span style="color: rgb(22, 145, 121);">**Bucle for decontando**</span>

Se trata del mismo bucle `for` pero ahora la cuenta la realizamos hacia atrás. Hay dos formas sencillas de hacerlo:

- Utilizando la función `range()`. Si queremos darle un enfoque Pythonic simplemente configuramos los argumentos de la función de manera que se indique el principio, el final y el incremento, que será logicamente negativo.

```
for i in range(20, 0, -2): #imprimere 20, 18, 16, ... 0

```

- Utilizando la función `reversed()`. Es una función incorporada en la que hay que indicar como primer argumento el final de la cuenta, como segundo el principio, teniendo en cuenta que se omite, y como tercero el decremento si es ditintos de 1, pero se especifica en módulo. Se utiliza así:

```
for i in reversed(range(0,21,2)): #imprimere 20, 18, 16, ... 0

```

##### <span style="color: rgb(22, 145, 121);">**Sentencias `break` y `continue`**</span>

La sentencia `break` se utiliza para terminar un bucle de forma inmediata al ser encontrada. En la imagen vemos la sintaxis de la sentencia `break` y su funcionamiento.

[![break.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/break.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/break.png)  
*Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA*

La sentencia `continue` se utiliza para saltar la iteración actual del bucle y el flujo de control del programa pasa a la siguiente iteración. En la imagen vemos la sintaxis de la sentencia `continue` y su funcionamiento.

[![continue.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/continue.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/continue.png)  
*Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA*

En la figura siguiente vemos dos ejemplos de esta sentencia

[![ejem_continue.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/ejem-continue.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/ejem-continue.png)  
*Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA*

#### <span style="color: #007575;">**Sentencia condicional `if...else`**</span>

En Python hay tres formas de declaración de `if...else`

> 1. Declaración `if`
> 2. Declaración `if...else`
> 3. Declaración `if...elif...else`

1. Declaración `if`. La sintaxix de esta declaración en Python tiene la forma siguiente:

```
if condicion:
    # Cuerpo de la sentencia if

# Código después del if

```

Si el resultado de evaluar la condición es cierto (True o 1), el código en "Cuerpo de la sentencia if" y lo estará haciendo mientras se cumpla la condición.

En el momento que la condición sea evaluada como falsa (False o 0) el código en "Cuerpo de la sentencia if" se omite y continua la ejecución del programa por "Código después del if". En la figura siguiente vemos la explicación de forma gráfica.

[![f_if.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/f-if.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/f-if.png)  
*Funcionamiento de la sentencia if  
Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA*

<center id="bkmrk--1"></center>1\. Declaración `if...else`. Una sentencia `if` puede tener de manera opcional una clausula `else`. La sintaxix de esta declaración en Python tiene la forma siguiente:

```
if condicion:
    # Bloque de sentencias si condicion es True

    else:
    # Bloque de sentencias si condicion es False

```

La sentencia se evalúa de la siguiente forma: Si `condición` es `True` se ejecuta el código dentro del `if` y el código dentro del `else` se omite. Si `condición` es `False` se ejecuta el código dentro del `else` y el código dentro del `if` se omite. Cuando finaliza bien la parte del `if` o bien la del `else` el programa continua con la siguiente sentencia.

En la figura siguiente vemos la explicación de forma gráfica.

[![f_ifelse.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/f-ifelse.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/f-ifelse.png)  
*Funcionamiento de la sentencia `if...else Federico Coca <a href="https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/" rel="noopener" target="_blank">Guia de Trabajo de Microbit </a>CC-BY-SA`*

1. Declaración `if...elif...else`. La sentencia `if...else` se utiliza para ejecutar un bloque de código entre dos alternativas posibles. Sin embargo, si necesitamos elegir entre más de dos alternativas, entonces utilizamos la sentencia `if...elif...else`. La sintaxis de la sentencia `if...elif...else` es:

```
if condicion_1:
    # Bloque 1
elif condicion_2:
    #Bloque 2

    else:
    # Bloque 3

```

Se evalúa así: Si `condicion_1` es `True`, se ejecuta Bloque 1. Si `condicion_1` es `False`, se evalúa `condicion_2`. Si `condicion_2` es `True`, se ejecuta Bloque 2. Si `condicion_2` es `False`, se ejecuta Bloque 3.

En la figura siguiente vemos la explicación de forma gráfica.

[![f_ifelifelse.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/f-ifelifelse.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/f-ifelifelse.png)  
*`Federico Coca <a href="https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/" rel="noopener" target="_blank">Guia de Trabajo de Microbit </a>CC-BY-SA`*

#### <span style="color: #007575;">**Funciones en Python**</span>

En esta sección vamos a dar solamente una breve introducción a lo que son las funciones y los módulos en Python para estudiar dos funciones concretas definidas en MicroPhyton para micro:bit.

Una función es un bloque de código que realiza una tarea específica.

Supongamos que necesitas crear un programa para crear un círculo y colorearlo. Puedes crear dos funciones para resolver este problema:

- crear una función de círculo
- crear una función de color

Dividir un problema complejo en trozos más pequeños hace que nuestro programa sea fácil de entender y reutilizar.

Existen dos tipos de funciones en Python:

- **Standard library functions (Funciones de biblioteca estándar)**. Son funciones incorporadas en Python que están disponibles para su uso.
- **User-defined functions (Funciones definidas por el usuario)**. Podemos crear nuestras propias funciones para que cumplan con nuestros requisitos.

La sintaxis de una función es la siguiente:

```
def nombre_funcion(argumentos):
    #Cuerpo de la función

    return

```

Donde,

- `def` es la palabra reservada para declarar una función
- `nombre_funcion` es el nombre que le damos a la función
- `argumentos` es el valor o valores pasados a la función
- `return` retorna un valor desde la función. Es opcional

Veamos un ejemplo sencillo que no manda parametros ni retorna nada.

```
def saludo():
    print("Hola Mundo!")

saludo() #Llama a la función
print("Programa")
saludo()
print("Otra vez programa")

```

*Va a generar como salida la cadena "Hola Mundo!" seguida de la cadena "Programa" seguida otra vez de "Hola Mundo!" y finaliza con "Otra vez programa".*

Cuando se llama a la función, el control del programa pasa a la definición de la función, se ejecuta todo el código dentro de la función y despés el control del programa salta a la siguiente sentencia después de la llamada a la función.

Como ya se ha mencionado, una función también puede tener argumentos. Un argumento es un valor aceptado por una función. Cuando creamos una función con argumentos necesitamos pasar los correspondientes valores cuando la llamamos.

De forma genérica una función con argumentos tiene la siguiente sintaxis:

```
def funcion(arg1, arg2, ar3,...):
    #Código

#Llamada a la función
funcion(valor1, valor2, valor3, ...)
#Código

```

Cuando llamamos a la función le pasamos los valores correspondiendo valor1 a arg1, valor2 a arg2 y así sucesivamente.

La llamada a la función se puede hacer mencionando el nombre del argumento, que es lo que se conoce como 'argumentos con nombre', siendo el código totalmente equivalente al anterior.

```
funcion(arg1=valor1, arg2=valor2, arg3=valor3, ...)

```

Una función Python puede o no devolver un valor. Si queremos que nuestra función devuelva algún valor a una llamada realizada a función, utilizamos la sentencia `return`.

En el ejemplo siguiente se llama a la función cuatro veces con valores diferentes.

```
def cal_potencia(base, exponente):
    resultado = base ** exponente
    return resultado

#Llamadas a la función
print('Potencia =', cal_potencia(2,8))
print('Potencia =', cal_potencia(3,3))
print('Potencia =', cal_potencia(4,5))
print('Potencia =', cal_potencia(9,6))

```

El resultado es:

```
Potencia = 256
Potencia = 27
Potencia = 1024
Potencia = 531441

```

En Python, las funciones de la biblioteca estándar son las funciones incorporadas que se pueden utilizar directamente en nuestro programa. Por ejemplo,

- `print()`, imprime la cadena entre comillas
- `sqrt()`, devuelve la raíz cuadrada de un número
- `pow()`, devuelve la potencia de un número

Estas funciones están definidas dentro de un módulo. Y, para utilizarlas debemos incluir dicho módulo en nuestro programa. Por ejemplo, `sqrt()` y `pow()` están definidos en el módulo `math`. Para usar las funciones podemos hacer como en el ejemplo siguiente:

```
import math #Carga el módulo math

raiz = math.sqrt(25)
print("La raiz cuadrada de 25 es ", raiz)

potencia = pow(2, 8)
print("2^8 =", potencia)

```

En el ejemplo la variable raiz contendrá el cálculo de la raiz cuadrada y se define por defecto como variable real o decimal y potencia contendrá el resultado de elevar a 8 el número 2. Los resultados obtenidos son:

```
La raiz cuadrada de 25 es 5.0
2^8 = 256

```

Las principales ventajas de utilizar funciones son:

- **Código reutilizable**. Podemos llamar a la misma función tantas veces en nuestro programa como necesitemos, lo que hace que nuestro código sea reutilizable.
- **Código legible**. Las funciones nos ayudan a dividir nuestro código en trozos para que nuestro programa sea mas legible y fácil de entender.

#### <span style="color: #007575;">**Módulos en Python**</span>

A medida que nuestro programa crece, puede contener muchas líneas de código. En lugar de poner todo en un solo archivo, podemos utilizar módulos para separar por funcionalidad los códigos en varios archivos. Esto hace que nuestro código quede organizado y sea más fácil de mantener.

Un módulo es un archivo que contiene código para realizar una tarea específica. Un módulo puede contener variables, funciones, clases, etc. Veamos un ejemplo, vamos a crear un módulo escribiendo algo como lo siguiente:

```
#Definición del módulo suma

def sumar(a, b):

    resultado = a + b
    return resultado

```

Guardamos este programa en un archivo, por ejemplo `modulo_sumar.py` y tendremos definida una función de nombre `sumar` en ese módulo. La función recibe dos valores y devuelve la suma.

Cuando, en un programa diferente, queramos sumar dos números podemos importar la definición creada utilizando la palabra reservada `import`. Para acceder a la función definida en el módulo tenemos que utilizar el operador `.` (punto). Se parece mucho a que el módulo es una clase y la función una instancia de esa clase.

```
# Programa de sumas
import modulo_sumar

modulo_sumar.sumar(4, 5) #devolverá 9

```

Python tiene mas de 200 módulos estándar que pueden ser importados de la misma manera que importamos los módulos definidos por nosotros. En la documentación de Python en español encontramos la referencia a [La biblioteca estándar de Python](https://docs.python.org/es/3/library/index.html).

#### <span style="color: #007575;">**Números aleatorios**</span>

Este módulo está basado en el módulo `random` de la librería estándar de **Python**. Contiene funciones para generar comportamientos aleatorios.

Para acceder a este módulo es necesario:

```
import random

```

Vamos a ver sus funciones a continuación.

- **`.getrandbits(n)`**. Retorna un entero con "n" bits aleatorios. La función generadora devuelve como máximo 30 bits, por lo tanto "n" tiene que estar comprendido entre 1 y 30.

```
random.getrandbits(n)

```

*\* **`.seed(n)`**. Inicializa el generador de números aleatorios con un número entero conocido "n". Esto le proporcionará una aleatoriedad determinista reproducible a partir de un estado inicial dado (n).*

```
random.seed(n)

```

- **`.randint(a, b)`**. Devuelve un entero aleatorio **N** tal que <span class="arithmatex"><span class="mjx-chtml MathJax_CHTML" data-mathml="<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>a</mi><mtext>&#xA0;</mtext><mo>&#x2264;</mo><mi>N</mi><mo>&#x2264;</mo><mtext>&#xA0;</mtext><mi>b</mi></math>" id="bkmrk-a%C2%A0%E2%89%A4n%E2%89%A4%C2%A0ba%C2%A0%E2%89%A4n%E2%89%A4%C2%A0b" role="presentation" style="box-sizing: inherit; display: inline-block; line-height: 0; text-indent: 0px; text-align: left; text-transform: none; font-style: normal; font-weight: normal; font-size: 20.944px; font-size-adjust: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; margin: 0px; padding: 1px 0px; position: relative;" tabindex="0"><span aria-hidden="true" class="mjx-math" id="bkmrk-a%C2%A0%E2%89%A4n%E2%89%A4%C2%A0b"><span class="mjx-mrow" id="bkmrk-a%C2%A0%E2%89%A4n%E2%89%A4%C2%A0b-1"><span class="mjx-mi" id="bkmrk-a"><span class="mjx-char MJXc-TeX-math-I">a</span></span><span class="mjx-mtext" id="bkmrk-%C2%A0-3"><span class="mjx-char MJXc-TeX-main-R"> </span></span><span class="mjx-mo MJXc-space3" id="bkmrk-%E2%89%A4"><span class="mjx-char MJXc-TeX-main-R">≤</span></span><span class="mjx-mi MJXc-space3" id="bkmrk-n"><span class="mjx-char MJXc-TeX-math-I">N</span></span><span class="mjx-mo MJXc-space3" id="bkmrk-%E2%89%A4-1"><span class="mjx-char MJXc-TeX-main-R">≤</span></span><span class="mjx-mtext MJXc-space3" id="bkmrk-%C2%A0-4"><span class="mjx-char MJXc-TeX-main-R"> </span></span><span class="mjx-mi" id="bkmrk-b"><span class="mjx-char MJXc-TeX-math-I">b</span></span></span></span><span class="MJX_Assistive_MathML" role="presentation">a ≤N≤ b</span></span></span>.

```
random.randint(a, b)

```

- **`.randrange(stop)`**. Devuelve un número entero seleccionado aleatoriamente entre cero y stop, que no está incluido.

```
random.randrange(stop)

```

- **`.randrange(start, stop)`**. Devuelve un número entero seleccionado aleatoriamente comprendido entre start y stop. El límite stop no está incluido.

```
random.randrange(start, stop)

```

- **`.randrange(start, stop, step)`**. Devuelve un número entero aleatorio entre start y stop separando los valores posibles entre si la distancia establecida por step. Por ejemplo `randrange(3, 30, 5)` devolverá un valor aleatorio de los siguientes posibles: 3, 8, 13, 18, 23, 28.

```
random.randrange(start, stop, step)

```

- **`.choice(secuencia)`**. Devuelve un elemento aleatorio de 'secuencia' que no puede estar vacía. Si 'secuencia' está vacía, genera in `IndexError`.

```
random.choice(secuencia)

```

- **`.random()`**. Devuelve un número aleatorio en coma flotante en el rango \[0.0, 1.0).

```
random.random()

```

- **`.uniform(a, b)`**. Devuelve un número aleatorio de coma flotante **N** tal que a≤N≤ba≤N≤b para a≤ba≤b y b≤N≤ab≤N≤a para b&lt;ab&lt;a.

```
random.uniform(a, b)

```

En la imagen vemos ejemplos ejecutados en la shell.

[![func_random.png](https://libros.catedu.es/uploads/images/gallery/2024-09/scaled-1680-/func-random.png)](https://libros.catedu.es/uploads/images/gallery/2024-09/func-random.png)

<p class="callout info">Página extraída de Federico Coca [Guia de Trabajo de Microbit ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/guias/intro/)CC-BY-SA</p>

<center id="bkmrk-%C2%A0-6"></center>

# Hoja de Ruta

¿Dónde encajaría usar Microbit con Python en las etapas educativas? ¿Comparativa con otros robots?

{{@4518}}