0% encontró este documento útil (0 votos)
46 vistas

APUNTES - Pensamiento-Computacional-Con-Python

Este documento presenta una introducción al curso de Pensamiento Computacional con Python. El curso se compone de 4 módulos que cubren conceptos como algoritmos, lenguajes de programación, programación básica en Python e introducción a funciones. El objetivo principal es enseñar a resolver problemas de manera computacional y desarrollar las bases para una carrera en Ciencias de la Computación.

Cargado por

Ale
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
46 vistas

APUNTES - Pensamiento-Computacional-Con-Python

Este documento presenta una introducción al curso de Pensamiento Computacional con Python. El curso se compone de 4 módulos que cubren conceptos como algoritmos, lenguajes de programación, programación básica en Python e introducción a funciones. El objetivo principal es enseñar a resolver problemas de manera computacional y desarrollar las bases para una carrera en Ciencias de la Computación.

Cargado por

Ale
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 133

Curso de

Introducción al
Bagde
del curso
Pensamiento
Computacional
con Python
David Aroesti
Objetivos
● Aprender a resolver problemas de manera
computacional

● Entender los puntos en común entre todos los


lenguajes de programación

● Desarrollar las bases para una carrera en


Computer Science
Módulo 1

Introducción a la serie
Introducción al
pensamiento
computacional

Módulo 1
Cómputo y computadoras

● Las computadoras hacen dos cosas: hacen


cálculos y recuerdan el resultado de dichos
cálculos.

● Por la mayoría de la historia humana, estábamos


limitados por la velocidad del cerebro y la mano.

● Aún con las computadoras modernas existen


problemas que no podemos resolver.
Introducción a los
lenguajes de
programación

Módulo 1
¿Cómo dar instrucciones?

● Conocimiento declarativo vs imperativo

● Algoritmos (IMPERATIVOS)
Un algoritmo es una lista finita de
instrucciones que describen un
cómputo, que cuando se ejecuta con
ciertas entradas (inputs) ejecuta
pasos intermedios para llegar a un
resultado (output).

John V. Guttag
def main():
print('hello world!')

if __name__ == '__main__':
main()
Programación

● Turing completeness

● Los lenguajes de programación modernos dan


primitivos que son más convenientes que los
primitivos de Turing.
Lenguajes

● Sintaxis
Define la secuencia de símbolos que está bien
formada.
● Semántica estática
Define qué enunciados con sintaxis correcta
tienen significado
● Semántica
Define el significado. En los lenguajes de
programación sólo hay un significado.
Módulo 2

Introducción a Python
Elementos básicos
de Python
Módulo 2
Lenguajes de programación

BAJO NIVEL MAS CERCANO A LOS 1/0


ALTO NIVEL MAS CERCANO AL LENGUAJE NATURAL

● Bajo nivel vs. alto nivel

● General vs. dominio específico

● Interpretado vs. compilado


INTERPRETADO. MIENTRAS EL PROGRAMA SE
EJECUTA, CADA INSTRUCCION SE VA TRADUCIENDO
A LENGUAJE DE MAQUINA.

COMPILADO. ANTES DE ENTREGARSELO A LA


MAQUINA, DEBE COMPILARSE.
Elementos básicos
de Python
# <literales> = 1, 'abc', 2.0, True
# <operadores> = + / * % ** = ==
# <literal> <operador> <literal>

>>> 1 + 2
>>> 1 3.0 # error sintáctico
>>> 5 / 'Platzi' # error semántico estático
>>> 5 * 'Platzi'

# statement o enunciado
>>> print('Hello, Platzi!)

<LITERALES>. FORMA DE INICIALIZAR OBJETOS DIRECTAMENTE EN MEMORIA


Objetos, expresiones
y tipos numéricos
Objetos

SON OBJETOS EN MEMORIA QUE PUEDEN SER REFERENCIADOS

ES UNA ABSTRACCION DENTRO DEL LENGUAJE.


● Objetos CUALQUIER COSA PUEDE SER OBJETO. DESDE UNA VARIABLE, A UNA CASA...
CUALQUIER COSA ES UN OBJETO.
● Tipos
● Escalares vs. no escalares
PUEDEN SUBDIVIDIRSE (NO ESCALARES), O PUEDEN SUBDIVIDIRSE (ESCALARES)
<objeto> <operador> <objeto> # expresión
>>> <valor>

>>> 'Platzi' + 'Rocks!'


PlatziRocks!

>>> 2 + 2
4

>>> persona + persona


pareja
>>> my_int = 1
>>> my_float = 1.0
>>> my_bool = False
>>> my_none = None

>>> type(my_int)
>>> type(my_float)
>>> type(my_bool)
>>> type(my_none)
>>> 1 + 2
>>> 2 - 5
>>> 2.0 * 3
>>> 6 // 2
>>> 6 // 4
>>> 6 / 4
>>> 7 % 2
>>> 2**3
Asignación de variables
a = 2
x = 4
z = (a * x) / 2
base = 2
altura = 4
area = (base * altura) / 2
>>> my_var = 'Hello, Platzi'
>>> print(my_var)
Hello, Platzi

>>> my_var = 3
>>> print(my_var)
3
... ...

0x0001 ‘Hello, Platzi’


my_var
0x0002 3

... ...
GARBAGE COLLECTOR

... ...

0x0001 ‘Hello, Platzi’


my_var
0x0002 3

... ...

CUANDO CAMBIO EL VALOR EN MEMORIA


(ASIGNAR OTRO VALOR A UNA VARIABLE)
EL "GARBAJE COLECTOR" LIBERA ESE ESPACIO
DE MEMORIA (0X0001) DE MANERA AUTOMATICA.
Variables

● Pueden contener mayúsculas, minúsculas,


números (sin comenzar con uno) y el símbolo _

● No pueden llamarse como las palabras


reservadas
Variables

PALABRAS RESERVADAS EN PYTHON


Variables

● Hacen los programas más comprensibles.

● Son simplemente nombres que apuntan a un


valor en memoria.

● El operador de asignación (=) asocia una


variable con un valor.
Cadenas y entradas

Módulo 2
Cadenas
>>> '123'

>>> '123' * 3

>>> '123' + '456'

>>> ('Hip ' * 3) + ' ' + 'hurra'

>>> f'{"Hip " * 3} hurra'


Cadenas (strings)

● len (longitud)

● Indexing (indexación)

● slicing (rebanadas)
○ my_str[comienzo:fin:pasos]
Cadenas (strings)

● Los objetos de tipo str pueden representarse


con “ ” o ‘ ’.
● El operador + tiene diferente significado según
el tipo de dato (overloaded). Con cadenas
significa concatenación.
● El operador * es el operador de repetición con
cadenas.
● Las cadenas son inmutables.
Entradas
Entradas (inputs)

● Python tiene la función input para recibir datos


del usuario del programa.

● Input siempre regresa cadenas, por lo que si


queremos utilizar otro tipo, tenemos que hacer
type casting.
Programas
ramificados
Módulo 2
>>> 2 == 3
>>> 2 != 3
>>> 2 > 3
>>> 2 < 3
>>> 2 <= 3
>>> 2 >= 3
>>> True and True
>>> False or True
>>> not True

A B A and B A or B Not B

True True True True False

True False False True True

False True False True

False False False False


if <condition>:
<expresion>

if 3 > 2:
print('3 es mayor que 2')
if <condition>:
<expresion>
else:
<expresion>

if 5 <= 10:
...
else:
print('5 no es mayor o igual que 10')
if <condition>:
<expresion>
elif <condition>:
<expresion>
else:
<expresion>

if 4 > 5:
...
elif 4 < 5:
print('4 es menor que 5')

else:
...
Iteraciones

Módulo 2
Iteraciones (loops)

● La mayoría de las tareas computacionales no se


pueden lograr con ramificaciones.
● Cuando queremos que un programa haga lo
mismo varias veces, utilizamos iteraciones.
● Se pueden escribir iteraciones dentro de
iteraciones.
● Podemos utilizar break para salir
anticipadamente de una iteración.
● Tener cuidado de iteraciones infinitas.
while <condicion>:
<expresion>

while <otra condicion>:


<otra expresion>
Módulo 3

Programas numéricos
Enumeración
exhaustiva
Módulo 3
Enumeración exhaustiva
Un algoritmo de fuerza bruta, ya que aprovecha
la velocidad de las computadoras para realizar todas las
verificaciones posibles hasta dar con el resultado.
Ejemplo del calculo de la raiz cuadrada de un numero

● También llamado “adivina y verifica”.

● Las computadoras actuales son muy muy


rápidas.

● Uno de los primeros algoritmos que debes


tratar.
Aproximación de
soluciones y
búsqueda binaria
Módulo 3

Los algoritmos cada vez se hacen mas eficientes. Desde el de


busqueda exhaustiva -el menos- al de busqueda binaria -mayor
eficiencia-
Aproximación de soluciones
Conceptualmente es el algoritmo anterior pero se incorpora un
valor de error (llamado epsilon). Entonces.. cuando la
aproximacion es menor al valor del error, ya puede darse el
resultado aproximado.

● Similar a enumeración exhaustiva, pero no


necesita una respuesta exacta.

● Podemos aproximar soluciones con un margen


de error que llamaremos epsilon.

TIPICO PARA DATA SCIENTIST DONDE NO SE BUSCA EXACTITUD,


SINO UN MARGEN DE ERROR MENOR A EPSILON (definido por el
usuario)
Búsqueda binaria
Conceptualmente voy partiendo el rango en dos y comparo con el
valor buscado. Si es menor tomo el segmento menor y nuevamente
parto en dos y comparo y asi de manera sucesiva

● Cuando la respuesta se encuentra en un


conjunto ordenado, podemos utilizar búsqueda
binaria

● Es altamente eficiente, pues corta el espacio de


búsqueda en dos por cada iteración

FUNCIONA CUANDO EL CONJUNTO DE DATOS TIENE UN ORDEN


Módulo 4

Funciones, alcance y abstracción


Funciones y alcance
de las funciones
Módulo 4
Esta parte de la clase responde a la pregunta de que pasaria si un
programa se escribiera en solo un lugar... cuantas lineas de codigo
(millones)... practicamente no podria ser actualizado por otra persona
que no sea el programador original
NO necesito entender la forma
en que algo opera internamente

Abstracción para poder utilizarlo.


Ejemplo: Uso una calculadora
sin conocer de electronica...
solo se operarla.

Este es el punto de partida


para saber que podemos usar
LIBRERIAS escritas por
otras personas sin saber
su funcionamiento
interno. Solamente le
damos una entrada y
recogemos una
salida.
Decomposición

● Permite dividir el código en componentes que


colaboran con un fin en común.

● Se puede pensar como mini programas dentro


de un programa mayor

COMPONENTES. Unidades logicas. En el ejemplo de la calculadora


tenemos distintos componentes electronicos para llegar una solucion.
Definición de funciones
def <nombre>(<parametros>):
<cuerpo>
def
return <expresion> es la forma en que
se define en python

def suma(a, b):


total = a + b
return total

suma(2, 3)
Argumentos de
Keyword y valores
por defecto
def nombre_completo(nombre, apellido, inverso=False):
if inverso:
return f'{apellido} {nombre}'
else:
return f'{nombre} {apellido}'

nombre_completo('David', 'Aroesti')
nombre_completo('David', 'Aroesti', inverso=True)
nombre_completo(apellido='Aroesti', nombre='David')
Alcance
def func1(un_arg, una_func):
def func2(otro_arg):
return otro_arg * 2

valor = func2(un_arg)
return una_func(valor)

un_arg = 1

def cualquier_func(cualquier_arg):
return cualquier_arg + 5

func1(un_arg, cualquier_func)
Especificaciones
del código
Módulo 4
def suma(a, b):
"""Suma dos valores a y b.

param int a cualquier entero


param int b cualquier entero
returns la sumatoria de a y b
"""
total = a + b
return total
En triple comillas, se lo
denomina docstrings
Recursividad

Módulo 4
Recursividad

● Algorítmica
Una forma de crear soluciones utilizando el
principio de “divide y vencerás.”

● Programática
Una técnica programática mediante la cual una
función se llama a sí misma.
Factoriales
Factoriales
Números Fibonacci
Fibonacci
Módulo 5

Tipos estructurados, mutabilidad


y funciones de alto nivel
Tuplas

Módulo 5
Tuplas

● Son secuencias inmutables de objetos.

● A diferencia de las cadenas pueden contener


cualquier tipo de objeto.

● Puede utilizarse para devolver varios valores en


una función.
Rangos

Módulo 5
Rangos

● Representan una secuencia de enteros.

● range(comienzo, fin, pasos)

● Al igual que las cadenas y las tuplas, los rangos


son inmutables.

● Muy eficientes en uso de memoria y


normalmente utilizados en for loops
Listas y mutabilidad

Módulo 5
Listas y mutabilidad

● Son secuencias de objetos, pero a diferencia de


las tuplas, sí son mutables.

● Cuando modificas una lista, pueden existir


efectos secundarios (side effects)

● Es posible iterar con ellas.


Listas y mutabilidad

● Para modificar una lista podemos:


○ Asignar vía índice (my_lista[0] = 5)
○ Utilizar los métodos de la lista (append, pop,
remove, insert, etc.)
Clonación
Clonación

● Casi siempre es mejor clonar una lista en vez de


mutarla
● Para clonar una lista podemos utilizar
rebanadas (slices) o la función list
List comprehension
List comprehension

● Es una forma concisa de aplicar operaciones a


los valores de una secuencia.
● También se pueden aplicar condiciones para
filtrar.
Diccionarios

Módulo 5
Diccionarios

● Son como listas, pero en lugar de usar índices


utilizan llaves.
● No tienen orden interno.
● Los diccionarios son mutables.
● Pueden iterarse.
Módulo 6

Pruebas y debugging
Pruebas de caja negra

Módulo 6
Pruebas de caja negra

● Se basan en la especificación de la función o el


programa.

● Prueba inputs y valida outputs.

● Unit testing o integration testing.


Unit testing: Es probar que el led funcione.
Integration testing: Es probar que el led funcione en el conjunto de luces
del arbolito de navidad.
Pruebas de caja de
cristal
Módulo 6
Pruebas de caja de cristal

● Se basan en el flujo del programa.

● Prueba todos los caminos posibles de una


función. Ramificaciones, bucles for y while,
recursión.

● Regression testing o mocks.


Debugging
Cambiar el "PORQUE FALLA" por el "PORQUE FUNCIONA ASI".
La maquina no falla... solo hace lo que el código le dice que haga.

Módulo 6
Primer BUGG de la historia
-Literalmente un bicho en una maquina-
Reglas generales
Reglas generales
● No te molestes con el debugger. Aprende a utilizar el print
statement.

● Estudia los datos disponibles.

● Utiliza los datos para crear hipótesis y experimentos.


Método científico

● Ten una mente abierta. Si entendieras el programa,


probablemente no habrían bugs.

● Lleva un registro de lo que has tratado, preferentemente en


la forma de tests.
Diseño de experimentos
Diseño de experimentos

● Debugear es un proceso de búsqueda. Cada


prueba debe acotar el espacio de búsqueda.

● Búsqueda binaria con print statements.


Búsqueda BINARIA:
Divido en dos el programa y veo cual de las dos partes funciona distinto a lo que yo espero. Luego esa
parte, la subdivido en dos y asi sucesivamente hasta dar con la parte de codigo que debo modificar.
Errores comunes
Errores comunes
● Encuentra a los sospechosos comunes.

● En lugar de preguntarte por qué un programa no funciona,


pregúntate por qué está funcionando de esta manera.

● Es posible que el bug no se encuentre donde crees que está.

● Explícale el problema a otra persona. De preferencia que no


tenga contexto.

● Lleva un registro de lo que has tratado, preferentemente en


la forma de tests.

● Vete a dormir.
Módulo 7

Excepciones y afirmaciones
Manejo de
excepciones
Módulo 7
Manejo de excepciones

● Son muy comunes en la programación. No


tienen nada de excepcional.

● Las excepciones de Python normalmente se


relacionan con errores de semántica.

● Se pueden crear excepciones propias.

● Cuando una excepción no se maneja (unhandled


exception), el programa termina en error.
Manejo de excepciones
● Las excepciones se manejan con los keywords:
try, except, finally.

● Se pueden utilizar también para ramificar


programas.

● No deben manejarse de manera silenciosa (por


ejemplo, con print statements)

● Para aventar tu propia excepción utiliza el


keyword raise
Afirmaciones

Módulo 7
Afirmaciones

● Programación defensiva

● Pueden utilizarse para verificar que los tipos


sean correctos en una función

● También sirven para debuguear


# assert <expresion booleana>, <mensaje de error>

def primera_letra(lista_de_palabras):
primeras_letras = []

for palabra in lista_de_palabras:


assert type(palabra) == str, f'{palabra} no es str'
assert len(palabra) > 0, 'No se permiten str vacios'

primeras_letras.append(palabra[0])

return primeras_letras
Cierre del curso

Conclusiones

También podría gustarte