Skip to content

Commit

Permalink
checkpoint commit
Browse files Browse the repository at this point in the history
  • Loading branch information
HX-CZamorano2 committed May 24, 2023
1 parent 4975e74 commit ce0848b
Show file tree
Hide file tree
Showing 56 changed files with 2,678 additions and 0 deletions.
292 changes: 292 additions & 0 deletions M02_introprogramación/1README.md

Large diffs are not rendered by default.

219 changes: 219 additions & 0 deletions M03_variablesydatos/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,219 @@
![HenryLogo](https://d31uz8lwfmyn8g.cloudfront.net/Assets/logo-henry-white-lg.png)


## Variables

Una variable es un espacio de memoria donde guardamos un dato, ese espacio de memoria a la vez recibe un nombre y esto conforma la estructura de datos más simple que podemos encontrar.

![unaImagenConBoxShadow](../_src/assets/02_imagen01.jpg)

Por otro lado existen ciertas normas a la hora de nombrar variables:

* El nombre no puede empezar con un número<br>
Por ejemplo "mi_variable" sería correcto, pero "123mi_variable" sería erróneo
* No se permite el uso de guiones del medio -<br>
Por ejemplo "mi-variable" sería erróneo
* No se permite el uso de espacios.<br>
Por ejemplo "mi variable" sería erróneo
* No usar nombres reservados para Python. Las palabras reservadas son utilizadas por Python internamente, por lo que no podemos usarlas para nuestras variables o funciones.<br>
Por ejemplo, a veces podríamos usar "int" ó "for" y esto nos daría error, porque como se verá más adelante, esas palabras son parte de la sintaxis de Python.

### Constantes

Sin embargo, cuando ese dato no lo alojamos en una variable y lo utilizamos directamente, recibe el nombre de constante.

### Tipos de Datos

Es importante notar, que podemos encontrarnos con datos de tipos distintos, es decir numéricos, alfanuméricos o booleanos.

En Python tenemos los siguientes:
* Enteros: el conjunto de números enteros
* Floats: el conjunto de números reales o de punto flotante
* Cadenas o Strings: es texto, caracteres alfanuméricos que se introducen entre comillas dobles o simples
* Booleanos: representan Verdadero ó Falso
* Complejos: el conjunto de números complejos

Todo valor que pueda ser asignado a una variable tiene asociado un tipo de dato y esto establece qué operaciones se pueden realizar sobre la misma.

<hr width="75%">
<p align="center">
Tip: En Python hay algunas funcionalidades ya presentes por defecto, como por ejemplo la funcion **print()** que permite mostrar una salida por pantalla y la función range() que devuelve un rango numérico según los parámetros que recibe y con la función **type()** es posible ver el tipo de dato de una variable
</p>
<hr width="75%">

### Operaciones entre Variables

Con diferentes tipos de datos podemos hacer diferentes tipos de operaciones. Y hay operaciones no permitidas entre variables de diferentes tipos de datos.

**Operaciones aritméticas:**

| Operación | Operador | Ejemplo |
| :--- | :----: | ---: |
| Suma | + | 3 + 5.5 = 8.5 |
| Resta | - | 4 - 1 = 3 |
| Multiplicación | * | 4 * 2 = 8 |
| Potenciación | 4<sup>2</sup> | 4**2 = 16 |
| División (Cociente) | / | 4 / 2 = 2 |
| División (parte entera) | // | 14 // 3 = 4 |
| División (resto) | % | 14 % 3 = 2 |

**Operadores relacionales:**

| Operación | Operador | Ejemplo |
| :--- | :----: | ---: |
| == | Igual | 10 == 3 = False |
| != | Distinto | 10 != 3 = True |
| > | Mayor | 10 > 3 = True |
| < | Menor | 10 < 3 = False |
| >= | Mayor o igual | 10 >= 3 = True |
| <= | Menor o igual | 10 <= 3 = False |

**Operaciones de asignación:**

| Operación | Operador | Ejemplo |
| :--- | :----: | ---: |
| = | x=7 | x=7 |
| += | x+=2 | x=x+2 = 9 |
| -= | x-=2 | x=x-2 = 5 |
| *= | x*=2 | x=x*2 = 14 |
| /= | x/=2 | x=x/2 = 3.5 |
| %= | x%=2 | x=x%2 = 1 |
| //= | x//=2 | x=x//2 = 3 |
| **= | x**=2 | x=x**2 = 49 |
| &= | x&=2 | x=x&2 = 2 |
| ^= | x^=2 | x=x^2 = 5 |
| >>= | x>>=2 | x=x>>2 = 1 |
| <<= | x<<=2 | x=x<<=2 = 28 |


Operación: |= <br>
Operador: x|=2 <br>
Ejemplo: x=x|2 = 7 <br>

Cuando tratamos con texto, podemos hacer otras operaciones:

| Operación | Operador | Ejemplo |
| :--- | :----: | ---: |
| Concatenar | + | 'hola ' + 'mundo !' = 'hola mundo!' |
| Multiplicar | * | 'ja ' * 3 = 'ja ja ja' |

Algunos ejemplos en Python:

```python
>>> a = 'Hola '
>>> b = 'Mundo !'
>>> print(a + b)
Hola Mundo !

>>> x = 3
>>> y = 12
>>> print(x + y)
15

>>> print(a + x)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_18232/136165486.py in <module>
----> 1 print(a + x)

TypeError: can only concatenate str (not "int") to str
```

Notar que en las operaciones que no están permitidas arroja un error, que es muy descriptivo. En este caso no es posible sumar un valor entero con un valor alfanumérico.

```python
>>> # Dividir "y" entre "x"
>>> y = 9
>>> x = 3
>>> print(y/x)
3.0

>>> # Potencia de "y" elevado a la "x"
>>> y = 2
>>> x = 4
>>> print(y**x)
16

>>> # Devolver el resto de la división
>>> y = 13
>>> x = 3
>>> print(y%x)
1

>>> # Imprimir el tipo de dato de una variable y una constante
>>> y = 2.5
>>> type(y)
float
>>> type(2.5)
float
```

Notar que anteponiendo el carácter numeral (#) es posible agregar comentarios en el código. Por otra parte, la función **type()** es muy útil para saber a qué tipo de dato corresponde un elemento.

**Operaciones Lógicas**

Son operaciones en las que entran en uso el tipo de datos booleano, es decir, que nos permiten representar valores verdadero o falso. Para verlo mejor, es necesario recurrir a lo que llamamos tablas de verdad.
Veremos muy comúnmente representar verdadero con un "1" y falso con un "0".

Tabla del operador lógico "and", se verifican que A y B sean verdaderas.
| A | B | A and B |
| :- | :--: | -: |
| 1 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |

Tabla del operador lógico "or", se verifican que A o B sean verdaderas.
| A | B | A or B |
| :- | :--: | -: |
| 1 | 0 | 1 |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 1 | 1 |

Tambien es posible representar la negación, con el operador not()

Tabla del operador lógico "Or Exclusiva", se verifica ((A and not(B)) or (not(A) and B))
| A | B | A "or exclusiva" B |
| :- | :--: | -: |
| 1 | 0 | 1 |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 1 | 0 |

```python
>>> a = True
>>> b = False
>>> print(a or b)
True
```

<hr width="75%">
<p align="center">
Tips: Notar que las constantes "True" y "False" se escriben con la primer letra mayúscula y el resto minúsculas, de otra forma arrojaría un error
</p>
<hr width="75%">

### Conversión de tipos de datos

Puede haber ocasiones en las que desee especificar un tipo en una variable. Esto se puede hacer con lo que se denomina **casting**.
La conversión de tipo de dato en python se realiza mediante funciones:

int(): construye un número entero a partir de un literal entero, un literal flotante (eliminando todos los decimales) o un literal de cadena (siempre que la cadena represente un número entero)
float(): construye un número flotante a partir de un literal entero, un literal flotante o un literal de cadena (siempre que la cadena represente un flotante o un entero)
str(): construye una cadena a partir de una amplia variedad de tipos de datos, incluidas cadenas, literales enteros y literales flotantes

```python
>>> x = '2'
>>> print(type(x))
<class 'str'>
>>> x = int(x)
>>> print(type(x))
<class 'int'>
>>> y = int(2.8)
>>> print(y)
2
```

Si tienes dudas sobre este tema, puedes consultarlas en el canal **#m3_variablesydatos** de Slack

143 changes: 143 additions & 0 deletions M04_flujosdecontrol/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
![HenryLogo](https://d31uz8lwfmyn8g.cloudfront.net/Assets/logo-henry-white-lg.png)

## Flujos de Control

### Condicionales

Los condicionales son bloques de código que se ejecutan únicamente si se cumple una condición.
El resultado de esta condición debe ser booleano (True o False).
Esto se logra mediante la sentencia **if**.
Con la sentencia **elif** se puede agregar un número arbitrario de condiciones.
Por otra parte, se puede ejecutar código si la/s condición/es no se cumple/n con la sentencia **else**.


```python
>>> valor = 0
>>> if (valor < 0):
>>> print('El número es negativo')
>>> elif (valor > 0):
>>> print('El número es positivo')
>>> else:
>>> print('El número es igual a cero')
El número es igual a cero
```

### Ciclos Iterativos o Loops

Son bloques de código que se repiten una cierta cantidad de veces en función de ciertas condiciones.

Un ciclo **for** repite un bloque de código tantas veces como elementos haya dentro del rango entre 1 y 10:

```python
>>> for n in range(1,10):
>>> print(n)
1
2
3
4
5
6
7
8
9
```

Un ciclo **while** repite un bloque de código mientras que cierta condición se cumpla:

```python
>>> n = 1
>>> while (n < 10):
>>> print(n)
>>> n = n + 1
1
2
3
4
5
6
7
8
9
```

<hr width="75%">
<p align="center">
Hemos llegado hasta este punto y se repasaron algunos de los conceptos más fundamentales de la programación y de Python, pero es necesario detenerse en algunos detalles, que tienen que ver precisamente con el lenguaje que estamos utilizando:

* En Python es importante la indentación, notar que el código que se ejecuta dentro de una sentencia if, for o while está indentado.
* También es importante notar los ":"
* En Python, cada vez que hagamos referencia a un rango, por ejemplo "1,10" el primer número se incluye y el último no.
</p>
<hr width="75%">

### Sentencia Break

La sentencia break permite alterar el comportamiento de los bucles while y for. Concretamente, permite terminar con la ejecución del bucle. Esto significa que una vez se encuentra la palabra break, el bucle se habrá terminado.
Veamos cómo podemos usar el break con bucles for. El range(5) generaría 5 iteraciones, donde la i valdría de 0 a 4. Sin embargo, en la primera iteración, terminamos el bucle prematuramente.
El break hace que nada más empezar el bucle, se rompa y se salga sin haber hecho nada.

```python
>>> for i in range(5):
>>> print(i)
>>> break
0
```

Un ejemplo un poco más útil, sería el de buscar una letra en una palabra. Se itera toda la palabra y en el momento en el que se encuentra la letra que buscábamos, se rompe el bucle y se sale. Esto es algo muy útil porque si ya encontramos lo que estábamos buscando, no tendría mucho sentido seguir iterando la lista, ya que desperdiciaríamos recursos.

```python
>>> cadena = 'Python'
>>> for letra in cadena:
>>> if letra == 'h':
>>> print("Se encontró la h")
>>> break
>>> print(letra)
P
y
t
Se encontró la h
```

El break también nos permite alterar el comportamiento del while. En el ejemplo, la condición while True haría que la sección de código se ejecutará indefinidamente, pero al hacer uso del break, el bucle se romperá cuando x valga cero.

```python
>>> x = 5
>>> while True:
>>> x -= 1
>>> print(x)
>>> if x == 0:
>>> break
>>> print("Fin del bucle")
4
3
2
1
0
Fin del bucle
```

Por norma general, y salvo casos muy concretos, si ves un while True, es probable que haya un break dentro del bucle.

### Sentencia Continue

El uso de continue al igual que el ya visto break, permite modificar el comportamiento de de los bucles while y for.
Concretamente, la sentencia continue se salta todo el código restante en la iteración actual y vuelve al principio en el caso de que aún queden iteraciones por completar.
La diferencia con la sentencia break es que el continue no rompe el bucle, si no que pasa a la siguiente iteración saltando el código pendiente.
En el siguiente ejemplo vemos como al encontrar la letra P se llama al continue, lo que hace que se salte el print(). Es por ello por lo que no vemos la letra P impresa en pantalla.

```python
>>> cadena = 'Python'
>>> for letra in cadena:
>>> if letra == 'P':
>>> continue
>>> print(letra)
y
t
h
o
n
```


* Si tienes dudas sobre este tema, puedes consultarlas en el canal **#m4_flujosdecontrol** en Slack

Loading

0 comments on commit ce0848b

Please sign in to comment.