# Python crash course - LP1 Viernes
## Topics
### Configurando el entorno de trabajo
- [Instalación de herramientas](#Instalación-de-herramientas)
- Windows
### Basic
- Syntax
- Comments
- Variables
- Data Types
- Numbers
- Casting
- Strings
- Booleans
- Operators
- Lists
- Tuples
- Sets
- Dictionaries
- if/else
- While loops
- For loops
- Functions
- Arrays
- POO
- PIP
- Try/Except
- String formatting
### Instalación de herramientas
#### Python
Debemos ir al sitio web oficial de [Python](python.org):

Buscar *Downloads*

Vamos a la carpeta de Descargas y ejecutamos como administrador el instalador, hay que marchar el check de `Add python.exe to PATH` y luego hacer clic sobre *Install Now*:



Podemos hacer clic en *Disable path lenght limit* y finalmente un clic en `Close`
Comprobar si tenes Python instalado en el sistema y si este lo reconoce en la línea de comandos *cmd*:

Cuando aparezca el símbolo del sistema, escribimos `python` y enter:

Saber la versión de Python que estoy usando en el sistema:

#### Git

Vamos al sitio [git-scm](https://www.git-scm.com/downloads) para descargar
#### Vscode
Vamos al sitio [code.visualstudio.com](https://code.visualstudio.com):

Presionamos en `Download for Windows`, :

Vamos a la carpeta de Descargas y ejecutamos el instalador(no hace falta como administrador):

Dejamos las opciones por defecto y siguiente:



Yo suelo escoger el tema oscuro y la opción `Mark Done`:

#### Extensiones



#### Habilitar la ejecución de scripts en Windows
Ejecutar el Powershell como **administrador** y el comando `Set-ExecutionPolicy Unrestricted`
#### Razones para usar Python
1. Es código de Python es fácil de leer.
2. Python viene con una biblioteca estándar.
3. Python es práctico, poderoso y con muchas funciones preconstruidas.
4. Python viene con estructuras de datos preconstruidas.
5. Python viene con un gestor de paquetes llamado PIP(Python Package Index).
#### Sintaxis
Python puede ser ejecutado en la terminal o en un script:
```
>>> print("Holis")
```
Se debe respetar las sangrías:
```python
if 5 > 2:
print("Five is greater than two!")
```
#### Comentarios
Los comentarios inician con `#`
```python
#This is a comment
print("Hello, World!")
```
También se pueden poner al lado:
`print("Hello, World!") #This is a comment`
También para deshabilitar líneas de código:
```python
#print("Hello, World!")
print("Cheers, Mate!")
```
Comentarios multilíneas
```python
#This is a comment
#written in
#more than just one line
print("Hello, World!")
```
o:
```python
"""
This is a comment
written in
more than just one line
"""
print("Hello, World!")
```
#### Creación de variables
En Python como en Javascript no es necesario declarar el tipo:
```python
x = 5
y = "Juan"
print(x)
print(y)
```
Los tipos se asignan automáticamente:
```python
x = 4 # x is of type int
x = "Sally" # x is now of type str
print(x)
```
#### Casting o parseo
```python
x = str(3) # x will be '3'
y = int(3) # y will be 3
z = float(3) # z will be 3.0
```
#### Averiguar el tipo
```python
x = 5
y = "John"
print(type(x))
print(type(y))
```
#### Tipos
Texto: str
Numérico: int, float, complex
Sequence: list, tuple, range
Mapping: dict
Set: set, frozenset
Boolean: bool
Binary: bytes, bytearray, memoryview
None: NoneType
#### Ejercicio
Crear un script en python y obtener los siguientes tipos:
1. "Hello World"
2. 20
3. 20.5
4. 1j
5. ["apple", "banana", "cherry"]
6. ("apple", "banana", "cherry")
7. range(6)
8. {"name" : "John", "age" : 36}
9. {"apple", "banana", "cherry"}
10. frozenset({"apple", "banana", "cherry"})
11. True
12. b"Hello"
13. bytearray(5)
14. memoryview(bytes(5))
15. None
#### Strings
Los string en Python están encerrados en dobles o comillas simples
```python
print("Hello")
print('Hello')
```
```python
a = "Hello"
print(a)
```
Un texto muy largo
```python
a = """Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua."""
print(a)
```
```python
a = '''Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua.'''
print(a)
```
En Python los string son arrays:
```python
a = "Hello, World!"
print(a[1])
```
#### Usando bucles en un string
```python
for x in "banana":
print(x)
```
Y si quiero saber el tamaño de un string:
```python
a = "Hello, World!"
print(len(a))
```
Revisar si hay una palabra en un string:
```python
txt = "The best things in life are free!"
print("free" in txt)
```
Y si No esta:
```python
txt = "The best things in life are free!"
print("free" not in txt)
```
#### Ejercicio:
Buscan en el siguiente string la palabra "helado", y muestra en pantalla:
```python
a = '''Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua.'''
```
#### Mayúsculas
```python
a = "Hello, World!"
print(a.upper())
```
#### Minúsculas
```python=
a = "Hello, World!"
print(a.lower())
```
#### Remover espacios
```python
a = " Hello, World! "
print(a.strip()) # returns "Hello, World!"
```
#### Reemplazar un string
```
a = "Hello, World!"
print(a.replace("H", "J"))
```
#### Dividir o hacer Split
```python
a = "Hello, World!"
print(a.split(",")) # returns ['Hello', ' World!']
```
#### Usar format()
```python
age = 36
txt = "My name is John, and I am {}"
print(txt.format(age))
```
un ejemplo más largo:
```python
quantity = 3
itemno = 567
price = 49.95
myorder = "I want {} pieces of item {} for {} dollars."
print(myorder.format(quantity, itemno, price))
```
Ejercicio
Utilizar el format para implicar 5 veces la palabra:
```python
"Mi casa tiene 1 arbol"
"Mi casa tiene 2 arbol"
"Mi casa tiene 3 arbol"
"Mi casa tiene 4 arbol"
"Mi casa tiene 5 arbol"
```
Investigar en la la [página](https://www.w3schools.com/python/ref_string_find.asp) como hacer para convertir este texto:
```
texto = """
lorem ipsum is simply dummy text of the printing and typesetting industry. lorem ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. it has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. it was popularised in the 1960s with the release of letraset sheets containing lorem ipsum passages, and more recently with desktop publishing software like aldus pagemaker including versions of lorem ipsum.
"""
```
- Convertir el primer carácter a mayuscula de cada palabra
- Convertir a mayúscula
- Encontrar cuantas veces se repite la palabra `ipsum`
- Reemplazar todos los `ipsum` por `pollo frito`
- Convertir todas las palabras en una lista
Cada uno con su archivo por separado
#### A jugar
#### Veamos que tal fácil es leer Python
```python!
# https://es.wikipedia.org/wiki/Baraja_inglesa
import random
cartas = ["Tréboles", "Espadas", "Corazones", "Diamantes"];
rostros = ["Jack", "Reina", "Rey", "Ace"]
numeracion = [2, 3, 4, 5, 6, 7, 8 ,9, 10]
def dibujar():
el_tipo_de_carta = random.choice(cartas)
la_carta = random.choice(rostros + numeracion)
return la_carta, "de", el_tipo_de_carta
print(dibujar())
print(dibujar())
print(dibujar())
```
| Explicación |
|-------------|
| Una librería que provee aleatoriedad |
| Una variable llamada `cartas` es asignada a un array de 4 strings representando las cartas en un juego de cartas |
| Otra variable llamada `rostros` es asignada a un array de 4 cartas |
| Y otro array llamado `numeracion` el cual representa la baraja numerada de cartas |
| --- |
| Empieza con la función `dibujar()` |
| De forma aleatoria se selecciona una carta a la variable `el_tipo_de_carta` |
| De forma aleatoria se selecciona una carta de la combinación de "cartas" y "numeracion", creando `la_carta` |
| Se retorna la carta seleccionada, luego un string conteniendo la palabra "de", luego el tipo de carta |
| --- |
| Se invoca la función "dibujar()" para traer la carta de la baraja, luego mostrar en pantalla usando "print" unas tres veces |
#### Ejercicio 1
1. Escribe este programa en tu visual studio code, pero en vez de cartas, usa frutas, en vez de tipo de rostros pon nombres de persona
2. Imprime en pantalla cinco veces
#### ¿Y si quiero ejecutarla más de una vez?
```python!
import random
cartas = ["Tréboles", "Espadas", "Corazones", "Diamantes"];
rostros = ["Jack", "Reina", "Rey", "Ace"]
numeracion = [2, 3, 4, 5, 6, 7, 8 ,9, 10]
def dibujar():
el_tipo_de_carta = random.choice(cartas)
la_carta = random.choice(rostros + numeracion)
return la_carta, "de", el_tipo_de_carta
for _ in range(5):
print(dibujar())
```
### Y si quiero modularizar?
Cuidado con los nombres de los archivos y las ubicaciones
```python!
from juego_cartas import dibujar
for _ in range(5):
print(dibujar())
```
#### Los cuatro grandes: list, tuple, dictionary y set
Python tiene excelentes estructuras preconstruidas, y esta es otra de las razones por las que se utiliza mucho.
Listas:
```python!
cartas = ["Tréboles", "Espadas", "Corazones", "Diamantes"];
rostros = ["Jack", "Reina", "Rey", "Ace"]
numeracion = [2, 3, 4, 5, 6, 7, 8 ,9, 10]
```
Las listas se pueden modificar, no así las tuplas
Tupla:
`(3, 'de', 'Clubs')`
#### Modela tu baraja de tarjetas con set
Los Sets en Python son como en matemáticas: ellas contienen una colección *única* de valores donde los duplicados no están permitidos.
Los Sets tambié son especialmente convenientes para agregar y remover objetos y otras estructuras de datos.
##### Crear un set
```python!
baraja = set()
```
Si quieres saber el tipo y tamaño:
```python!
type(baraja) # muestra el tipo
len(baraja) # muestra el tamaño
```
#### Llenado de los set con cartas
```python!
cartas = ["Tréboles", "Espadas", "Corazones", "Diamantes"];
rostros = ["Jack", "Reina", "Rey", "Ace"]
numeracion = [2, 3, 4, 5, 6, 7, 8 ,9, 10]
baraja = set()
def dibujar():
for carta in cartas:
for rostro in rostros + numeracion:
baraja.add((rostro, "de", carta))
dibujar()
print(len(baraja))
```
#### Si se puede agregar, también remover
```python!
import random
cartas = ["Tréboles", "Espadas", "Corazones", "Diamantes"];
rostros = ["Jack", "Reina", "Rey", "Ace"]
numeracion = [2, 3, 4, 5, 6, 7, 8 ,9, 10]
baraja = set()
def generar():
for carta in cartas:
for rostro in rostros + numeracion:
baraja.add((rostro, "de", carta))
def dibujar():
card = random.choice(list(baraja))
return card
print(dibujar())
```
## Trabajando con Flask en Python y entornos virtuales
Creando los entornos virtuales por proyecto
`python.exe -m venv venv`
Entrar dentro del entorno virtual
`.\venv\Scripts\activate`
Instalar flask a nuestro entorno virtual
`pip install flask`
Crear un fichero de respaldo con todos los nombres de los paquetes instalados por pip
`pip freeze > paquetes.txt`
En caso de ya tener el fichero paquetes.txt y queremos instalar todo lo que haya dentro:
`python3 -m pip install -r paquetes.txt`
Agregar a nuestro .gitignore
[Cositas para ese archivo](https://www.toptal.com/developers/gitignore/api/python,visualstudiocode)