Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
UBA - CBC - Pensamiento Computacional Cátedra: Camejo. Profesores: - Días de cursada: Asincrónico. Aula: - Comisión: Sede Central UBA XXI (Ciudad de Buenos Aires) Definiciones Algoritmos Manejo de errores Tablas “Aprender a programar o pensar como un programador no sólo implica conocer ciertos modelos, herramientas y técnicas, también es importante aprender a hablar como ellos.” Definiciones ● Computadora: dispositivo físico de procesamiento de datos con propósito general. Es capaz de procesar datos y obtener nueva información o resultados. ● Software: conjunto de herramientas abstractas (programas). Se lo llama como el componente lógico de un modelo computacional. Es lo que puedes ver pero no tocar. ● Hardware: es el componente físico del dispositivo. Es decir que, el Software dirá qué hacer y el Hardware lo hará. Es lo que puedes ver y tocar. ● Modelo de Von Neumann:modelo de arquitectura de una Computadora que consta de tres componentes o subsistemas a través de los cuales fluye la información de una manera determinada. ○ Entrada - Salida (E/S): es donde la información entra y sale. Es el primer y último paso del modelo. ○ Memoria Interna (MI): es donde se alojan los datos, incluyendo los programas y los datos temporales que se generen. ○ Unidad Central de Proceso (UCP): es quien realiza todas las transformaciones de datos, es decir, el proceso en sí. ● Modelo de Funcionamiento de Programa Almacenado: es el concepto que implica que para poder ser ejecutado un programa debe ser cargado previamente en la memoria interna (MI). ● Sistema Operativo (SO): programa encargado de la administración de los recursos y la solución a la disputa entre solicitudes de diferentes procesos. Administra el equipo y responde a los programas que piden servicios. Ejemplos de SOs sonWindows, Linux,macOS, Android, iOS, Fuchsia, ChromeOS, TempleOS, etc.. ● Programa: es un Algoritmo escrito en un Lenguaje de Programación. También se lo puede describir como la suma de algoritmos (A) y datos (D) tal que P = A + D. ● Dato: en el mundo de las Tecnologías de la Información, un dato es una representación simbólica ya sea numérica o alfabética, cuyo valor está listo para ser procesado por un ordenador y mostrarlo a un usuario en modo de información. ● Algoritmo: serie finita de pasos precisos para alcanzar un objetivo. ● Lenguaje: es un protocolo de comunicación. ● Compilación: técnica de traducción de lenguaje el cual consiste en traducir completamente un programa y sólo entonces puede ser ejecutado. ● Interpretación: técnica de traducción de lenguaje el cual consiste en traducir sentencia a sentencia a medida que se solicita su ejecución. ● Programa fuente: es un archivo de instrucciones escrito en un lenguaje de alto nivel. Se denominan así debido a que desde allí parten los traductores para generar una versión ejecutable. Generalmente se pueden editar con cualquier editor, por muy básico que sea. ● Multi paradigma: un lenguaje con esta característica es equivalente a decir que puedes construir programas con distintos enfoques o modelos de resolución de problemas usando el mismo lenguaje. ● Multiplataforma: un lenguaje capaz de ser ejecutado en distintos sistemas operativos. ● Flujo de control de un programa (FCP): la secuencia en que las sentencias se ejecutan (la ejecución de la primera a la última línea, una por una, es un Flujo de Control Estándar en Python). ● Invocar: usar (ej: invocar una función = usar una función). ● Cuerpo de la función: las líneas que indican qué va a hacer una función. ● Sentencias estructuradas: sentencias que tienen una o varias líneas de encabezado. ● Ámbito de la función: la memoria que dispone una función para ser ejecutada (con sus sentencias, datos y resultados). ● Ciclos: cantidad constante de repeticiones. Sus componentes son la invariante y el cuerpo. ○ Invariante: es la parte de la sentencia que permite decidir si se ejecutará el Cuerpo de ese Bucle una vez más o se abandonará el mismo para proseguir con la sentencia siguiente al Ciclo. Normalmente se escribe como una condición válida. ○ Cuerpo: es la parte del Bucle que se ejecutará repetidamente hasta que la evaluación de la Condición o Invariante diga lo contrario. ● Aspectos relevantes del bucle: ○ Cuerpo: Bloque de sentencias que se ejecuta por vuelta. ○ Condición o Invariante: Puerta de entrada/salida al Ciclo. ○ Estado Previo: Valores de las variables de la Condición antes del Bucle. ○ Paso: Posibilidad de cambio de valor en alguna de las variables de la Condición. ● Secuencias (type sequence): en Python es un grupo de elementos con una organización interna; que se alojan de manera contigua en la memoria. ● String: es una Subclase de secuencia que sólo admite caracteres como elementos. ● Tuplas (type tuple): son una secuencia inmutable y heterogénea de objetos que pueden ser de cualquier tipo, a diferencia de las string que sólo pueden tener caracteres. ● Listas (type list): son una secuencia genérica heterogénea mutable. ● Diccionario (type dict): es una Estructura que permite mapear un valor (clave) con un grupo de datos. ● Estructuras de Datos persistentes: (perduran más allá de la vida de quien las genera) se conocen genéricamente como archivos. Un archivo debe guardarse en algún dispositivo que administre datos no volátiles (es decir, no desaparecen cuando se apaga el equipo). ● Algoritmos La creación de un algoritmo, para programadores, habitualmente consiste en los siguientes pasos: 1. Análisis del problema. 2. Primer esbozo de solución. 3. División del problema en partes. 4. Ensamble de las partes. Manejo de errores Cuando de Sistemas y Programas hablamos: ● El ingreso de datos es uno de los puntos de mayor frecuencia de errores. ● El ingreso de datos es el lugar más económico donde se pueden detectar y salvar errores. Para intentar disminuir la tasa de errores en el ingreso podemos: ● Simplificar el formato de los datos o adaptarlos a sistemas de lectura automática (códigos de barra, QR, etc.). ● Validar los ingresos. A la hora de testear algo, como cuando se usa un while loop, hay que utilizar como condición un ingreso inválido para que ofrecerle al usuario cuantas oportunidades sean necesarias para que ingrese un dato válido. Un ejemplo sería: par = int(input('Ingresá un número par: ')) while par < 0 or par % 2 != 0: # También te serviría la condición # par < 0 or par % 2. par = int(input('Ingresá un número par: ')) print('Tu número es',par) Una ejecución ejemplo podría ser: Ingresá un número par: 11 Ingresá un número par: 8 Tu número es 8 >>> Hay otros casos donde el usuario puede ingresar un tipo inválido de dato, como un string en vez de un int. Estas situaciones podrían causar errores fatales en el programa, por lo que también se recomienda validar ante estas situaciones. Una forma de manejar elegantemente esta situación sería aceptar el ingreso como string, validar que el ingreso sea compatible con un número y recién castear: # Solicita el ingreso de un string (aunque se espera un número). num = input('Ingresá un número: ') # ¿Es compatible con un número? # Si no es así, vuelve a pedirle un número al usuario. while not num.isnumeric(): num = input('Ingresá un número: ') # Si es compatible con un número, imprímelo junto a un mensaje. print('Tu número es',int(num)) Miremos una probable ejecución: Ingresá un número: cxc Ingresá un número: 3.66 Ingresá un número: 22 Tu número es 22 >>> Disponemos de la sentencia estructurada try/except que funciona básicamente intentando realizar una acción (con try, intento con recaudos) y si tiene éxito, el programa prosigue relajadamente, sin embargo, si en el intento emerge un error, la sentencia lo captura y lo trata de una manera conveniente en la cláusula except. La sintaxis es: try: <código a probar> except: <código a ejecutar si hay un error> Un ejemplo de uso sería: sigue = True while sigue: try: num = int(input('Ingresá un número entero: ')) sigue = False except: print('Debe ser un númeroentero') print('Tu número es',num) Una ejecución posible sería: Ingresá un número entero: hola Debe ser un número entero Ingresá un número entero: 1.33 Debe ser un número entero Ingresá un número entero: -77 Tu número es -77 >>> Nota: Los errores deben escribirse exactamente como los identifica Python. En el ejemplo, el Código de error que pretendemos capturar es: ValueError. Debe anotarse tal cual. sigue = True while sigue: try: num = int(input('Ingresá un número entero: ')) sigue = False except ValueError: print('Debe ser un número entero') print('Tu número es',num) En este caso la excepción se activará únicamente si el error que se produce es de ese tipo. Tablas Tipo de dato Ejemplos entero (int) 1, 2, 3, 4… real (float) 0.55, 0.23897, 2.569, 0.0, -2.4… complejo (complex) (10,9j) la componente con j del par indica la parte imaginaria lógico (bool) true, false texto (str) “¡Hola mundo!” Operadores aritméticos Símbolo(s) Nombre Ejemplo(s) + Suma 10 + 10 = 20 - Resta 10 - 5 = 5 * Multiplicación 5 * 2 = 10 / División con precisión decimal 10 / 3 = 3.33 // División entera 10 / 3 = 3 % Resto 10 % 3 = 1 || 10 % 4 = 2 += Suma abreviada, agrega 10 += 10→ 20 -= Resta abreviada, quita 10 -=5→ 5 *= Multiplicación abreviada 5 *=2→ 10 /= División abreviada 10 /=3→ 3.33 //= División entera abreviada 10 //= 3→ 3 %= Resto abreviado 10 %= 3→ 1 || 10 %= 4→ 2 Operadores de texto Símbolo(s) Nombre Ejemplo + Concatenación ‘Hola, ‘ + ‘Juan.’→ ‘Hola Juan.’ * Repetición ‘ja’*3→ ‘jajaja’ [k] o [-k] Selección de carácter ‘Hola’[0]→ ‘H’ [i:j:p] Selección de texto ‘Hola’[0:2]→ ‘Hol’ += Concatenación abreviada ‘Hola’ += ' y chau.'→ ‘Hola y chau.’ *= Repetición abreviada ‘Hola’ *= 2→ ‘HolaHola’ >, <, >=, <=, !=, == Comparación de textos 1 > 2→ False 400 != 399→ True len(s) Devuelve la longitud de la secuencia len([1, 2, 3, 4])→ 3 min(s) Devuelve el mínimo elemento de “s”. min([10, 50, 100, 5, 20, -2])→ -2 max(s) Devuelve el máximo elemento de “s”. max([10, 50, 100, 5, 20, -2])→ 100 sorted(s) Devuelve “s” ordenada en forma de lista. sorted([10, 50, 100, 5, 20, -2])→ [-2, 5, 10, 20, 50, 100] reversed(s) Devuelve “s” invertida. reversed([10, 50, 100, 5, 20, -5]) [100, 50, 20, 10, 5, -2] s.count(eleme Devuelve la cantidad de veces que “Hello world!”.count(“o”)→ 2 nto|substring[, desde[,hasta]]) aparece el elemento|substring en la secuencia “s”. s.index(eleme nto|substring[, desde[,hasta]]) Devuelve la posición de la primera ocurrencia elemento o del comienzo de substring en “s”. “Hello world!”.index(“o”)→ 4 Operadores lógicos Símbolo Nombre Ejemplo and Conjunción isOver5 and isOdd or Disyunción isOver2 or isEven not Negación not isPositive == Igual 1 == 2/2→ True != Distinto 1 != 2→ True < Menor 1 < 2→ True <= Menor o igual 2 <= 2→ True > Mayor 1 > 2→ False >= Mayor o igual 1 >= 2→ False in Pertenece 4 in evenNumbers→ True not in No pertenece 3 not in evenNumbers→ True Métodos de una lista Nombre Descripción Ejemplo lista.copy() Copia la lista original en una variable distinta. a = [1, 2, 3] b = a.copy() print(b)→ [1, 2, 3] lista.append(valor). Agrega el elemento valor al final de “lista”. [1, 2, 3].append(4) [1, 2, 3, 4] lista.insert(p, v) Inserta el elemento “v” en la posición “p”. [1, 2, 3, 5].insert(3, 4) [1, 2, 3, 4, 5] lista.remove(valor) Quita de la lista el elemento “valor”. [1, 2, 3, 4, 5].remove(4) [1, 2, 3, 5] lista.pop([índice]) Quita de “lista” el elemento de la posición “índice”. Si no se usa este parámetro, quita el último elemento. [1, 2, 3, 4, 5].pop() [1, 2, 3, 4] [1, 2, 3, 4, 5].pop(3) [1, 2, 3, 5] lista.extend(otraLista) Agrega “otraLista” al final de “lista”. a = [1, 2, 3] b = [“a”, “b”, “c”] a.extend(b) [1, 2, 3, “a”, “b”, “c”] lista.sort([reverse=Tru e][,key=función]) Ordena la lista. Si se emplea el parámetro “reverse”, en orden descendente, si se usa “key”, con criterio de ordenamiento “función”. [1, 3, 2].sort()→ [1, 2, 3] [1, 2, 3].sort(reverse=True)→ [3, 2, 1] lista.reverse() Invierte el orden de la lista (el primero pasa a ser último). [1, 2, 3].reverse→ [3, 2, 1] lista.count(valor) Cuenta la cantidad de apariciones de valor en la lista. [1, 0, 1, 1, 0, 1].count(1) → 4 lista.index(valor) Devuelve la posición de la primera aparición de valor en la lista. [“H”, “e”, “l”, “l”, “o”].index(“l”)→ 2 Métodos de una cadena (string) Nombre Descripción Ejemplo s.capitalize() Devuelve una copia del string con la primera letra en mayúscula y el resto en minúscula. ‘hello world’→ ‘Hello world’ s.center(ancho[,relleno]) String centrado con ese relleno a los costados. ‘hello world’.center(3, ‘a’)→ ‘aaahello worldaaa’ s.find(substring[,from[,to]]) Devuelve la primera posición de comienzo del substring en s. ‘hello world’.substring(‘e’, ‘r’)→ ‘ello wor’ s.rfind(substring[,from[,to]]) Devuelve la última posición de comienzo del substring en s. s.format(args, *) Devuelve s formateada texto = "Bienvenido a mi sustituyendo dinámicamente un texto. aplicación{0}" print(texto.format(" en Python")) Retorna: “Bienvenido a mi aplicación en Python” texto = "Bruto: ${bruto} + IVA: ${iva} = Neto: ${neto}" print(texto.format(bruto = 100, iva = 21, neto = 121)) Retorna: “Bruto: $100 + IVA: $21 = Neto: $121” s.join(iterable) Arma una string uniendo los elementos de iterable e intercalándolos con s. tup = (‘a’, ’b’, ’c’) print(‘-‘.join(tup)) Retorna: a-b-c s.rindex(substring[,from[,to]]) idem a s.rfind s.ljust(ancho[,relleno]) Justifica hacia la izquierda. s.rjust(ancho[,relleno]) Justifica hacia la derecha. s.lower() Devuelve s en minúsculas. s.upper() Devuelve s en mayúsculas. s.maketrans(x[,y[,z]]) Asocia en un diccionario los correspondientes caracteres de las cadenas x e y. vocales = "aeiou" numeros = "12345" 12 texto = "murcielagos" print(texto.maketrans(vocal es, numeros)) Retorna: {97: 49, 111: 52, 117: 53, 101: 50, 105: 51} s.translate(pares) Devuelve s con los caracteres asociados en el diccionario pares reemplazados. vocales = "aeiou" acentos = "áéíóú" texto = "murcielagos" parejas = texto.maketrans(vocales, acentos) print(texto.translate(parej as) Retorna: múrcíélágós s.replace(antes,ahora[,cantida d]) Reemplaza el substring de antes por el de ahora. s.strip() Elimina los espacios del inicio y fin del string. s.lstrip() Elimina los espacios del inicio. s.rstrip() Elimina los espacios del final. s.swapcase() Devuelve s con las mayúsculas convertidas en minúsculas y viceversa. “Hello World”.swapcase()→ “hELLO wORLD” s.split([separador[,maximaDivi sion]]) Devuelve una lista cuyos elementos son las partes del texto separadas por separador. Si se omite separador toma blancos. s.rsplit([separador[,maximaDiv ision]]) ídem a derecha. s.startswith(prefijo[,desde[,ha sta]) Devuelve True si s comienza con prefijo, si no False. “Hello”.startswith(“He”)→ True s.endswith(sufijo[,desde[,hast a]) Devuelve True si s termina con sufijo, si no False. “Hello”.endswith(“lo”)→ True s.zfill(ancho) Rellena con ceros a la izquierda hasta el ancho. s.title() Devuelve s en minúsculas con cada palabra inicializada en mayúsculas. “hello guys we eat meat”→ “Hello Guys We Eat Meat” s.isnumeric() Devuelve True si s es numérico, si no False. 1.isnumeric()→ True “lol”.isnumeric()→ False s.isalnum() Devuelve True si s es alfanumérico, si no False. “abc123”.isalnum()→ True [“a”, 1, “e”].isalnum()→ False s.isalpha() Devuelve True si s es alfabético, si no False. s.isdecimal() Devuelve True si s tiene sólo dígitos decimales (0-9), si no False. s.isdigit() Devuelve True si s tiene sólo números (los dígitos decimales de 0 a 9), si no False. 2648248376.isdigit()→ True s.isprintable() Devuelve True si s es un carácter imprimible, si no False. s.isspace() Devuelve True si s es espacio, si no False. “ ”.isspace()→ True “ a “.isspace()→ False s.istitle() Devuelve True si s es un título, si no False. “We jump together”→ False “We Jump Together”→ True s.isidentifier() Devuelve True si s es un nombreválido de objeto, si no False. s.isupper() Devuelve True si s está en mayúsculas, si no False. “HELLO”→ True “HELLo”→ False s.islower() Devuelve True si s está en minúsculas, si no False. “hello”→ True “hellO”→ False Métodos de un diccionario Nombre Descripción Ejemplo d.clear() Elimina todos los elementos de d. foo = {“one”: 1, “two”: 2, “three”: 3} foo.clear()→ {} d.pop(clave) Remueve el par clave, valor del diccionario y devuelve valor. Si la clave no está da error. {“Name”: “Tobias”, “Apellido”: “Alcaraz”}.pop(“Name”)→ {“Apellido”: “Alcaraz”} (devuelve “Tobias”) d.popitem() Remueve y devuelve cualquier par clave, valor. Si d está vacío da error d.copy() devuelve una copia de d en otra región de memoria. {“Name”: “Tobias”, “Apellido”: “Alcaraz”}.popitem(“Name”)→ {“Apellido”: “Alcaraz”} (devuelve {“Name”: “Tobias”}) d.fromkeys(secuencia) Crea el diccionario d, tomando las claves de una secuencia d.get(clave) devuelve el valor asociado a clave. d.items() Crea el diccionario d, tomando las claves de una secuencia d.get(clave) devuelve el valor asociado a clave. d.keys() Devuelve una lista con las claves de d. foo = { “Nombre”: “Tobias” “Edad”: 21 “Turno”: “Tarde” } foo.keys()→ [“Nombre”, “Edad”, “Turno”] d.update(b) Agrega los pares clave,valor de b a d. Si alguna clave existe actualiza su valor. Métodos de manejo de archivos Nombre Descripción Ejemplo open(nombre[,modo])) No es un método sino una función; abre un archivo para leer/editar. Elmodo hará que varíe lo que pueda hacer el programador: ● r: lectura. ● r+: lectura/escritura. ● w: sobreescritura (crea el archivo si no existe). ● a: añadir. Escribe al final del archivo. Un tercer argumento llamado encoding determina la codificación de grabado del archivo. Dos ejemplos son utf+8 o ansi. foo = open(“foo.txt”, “r+”, encoding = ”'utf_8”) close() Cierra el archivo y guarda los cambios. foo.close() .read() Permite leer una determinada cantidad de bytes, si no se pone nada, lee hasta el final. .readline() Lee la siguiente línea (caracteres hasta el próximo \n). .readlines() Permite leer varias líneas, si no se indica nada, lee todas las que falten. .write() Permite escribir en el archivo lo que se envía como argumento. .writelines() Permite escribir varias líneas en un archivo. .splitlines() No se menciona en el PDF, pero devuelve una lista con cada línea en el documento sin los \n al utilizar junto con .read() (a comparación de utilizar sólamente .readlines(), el cual te devuelve una lista con cada línea del documento pero incluye los saltos de línea en los elementos de la lista). foo.txt: Horacio Juana María bar.py: bar foo = open(“foo.txt”, “r+”) print(foo.readlines()) [“Horacio\n”, “Juana\n”, “María”] print(foo.read().splitlin es()) [“Horacio”, “Juana”, “María”]
Compartir