Vista previa del material en texto
Lenguaje python, aspectos básicos Palabras reservadas en Python Las 30 palabras reservadas (keywords) de Python son: and, as, assert, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield. Cadenas crudas: raw Cualquier cadena que deba interpretarse tal como se escribe es una cadena raw o cruda. En una cadena raw se omiten los caracteres especiales expresados con la barra invertida “\” o escape. Las cadenas raw se escriben entrecomilladas y con el carácter “r” precediéndolas: print('\\5', ' es igual que ', r'\5') Operaciones básicas con variables Con la función type() podemos conocer el tipo de datos de una variable y con la sentencia del() (paréntesis obcionales) borramos una variable de memoria. Una vez borrada si intentamos acceder a su valor se producirá un error. Los métodos upper() y lower() devuelven una cadena en mayúsculas y minúsculas, respectivamente. Por ejemplo: cadena1 = 'Python' # Declara variable con cadena 'Python' cadena2 = 'Lenguaje ' + cadena1.upper() # Lenguaje PYTHON cadena3 = 'Lenguaje ' 'Python' # Lenguaje Python cadena3 = cadena1.lower() * 3 # pythonpythonpython cadena4 = "Python para todos" print(cadena4.title()) # Python Para Todos print(type(cadena1)) # type str="" del cadena1 # Borra la variable de memoria print(cadena1) # Genera un error porque no existe La función ord() devuelve el ordinal entero del carácter indicado y justo lo contrario hace la función chr() que devuelve el carácter (Unicode) que representa al número indicado. ord('$') # 36 ord('@') # 64 ord('A') # 65 ord('ñ') # 241 chr(36) # '$' chr(64) # '@' chr(65) # 'A' chr(241) # 'ñ' Operadores aritméticos Tipo Operación + Suma - Resta * Producto / División ** potencia // Parte entera del cociente % Resto del cociente Los operadores admite concatenación como en C/C++, ejemplos contador += 1 # es equivalente a escribir: contador = contador + 1 porc = 5 # asigna número entero a variable total *= porc / 100 # es equivalente a escribir: total = total * porc / 100 Operadores binarios o de bits Tipo Operación & AND | OR ^ XOR ~ NOT << Desplazar bit a la izquierda >> Desplazar bit a la derecha Por ejemplo: operacion1 = 1 | 2 # 01 OR 10 = 11 3 en decimal→ operacion2 = 1 & 2 # 01 AND 10 = 00 0 en decimal→ operacion3 = operacion1 ^ operacion2 # 11 XOR 00 = 11 3 → Cabe observar que el operador actúa bits por bits apareado. Operadores lógicos Estos son operadores que evalúan predicados no bits como en el caso anterior su resultado es True o False. Tipo Operación AND Y OR O NOT NO Operadores de comparación o relacionales Sólo se usa en comparaciones aritméticas devuelve como resultado True o False. Tipo Operación < Menor que > Mayor que <= Menor o igual >= Mayor o igual == Es igual != Es no igual Control de Flujo Control del flujo: if La sentencia de control if se utiliza para controlar el flujo en la ejecución de un programa por evaluación de predicados. Básicamente, si se cumple una condición puede hacerse que se ejecute un bloque de código, que estará tabulado, y si no se cumple o se dan otras posibilidades puede hacerse que se ejecuten otros bloques. Para ello, se apoya en las clausulas elif que evalúa otras condiciones y en else, que en caso de no cumplirse ninguna de las condiciones anteriores ofrece la solución final. Varios ejemplos: if edad <= 12: # se evalúa la primera condición... precio = 2 # y si edad es menor igual que 12, precio = 2 elif 13 <= edad <= 18: # en caso contrario se evalúa... precio = 3 # y si edad está entre 13 y 18, precio = 3 else: # en cualquier otro caso... precio = 4 # precio = 4 print('par' if edad % 2 == 0 else 'impar') # if condicional en una sola línea tecla = 'S' if tecla in('s', 'S', 'y', 'Y'): # Evalúa si un valor está entre varios posibles print('Ha seleccionado: Sí') if True: # Siempre es True print('Sí, es verdad') else: print('Es falso') Control del flujo con bucles: while El bucle más elemental suele emplearse cuando un programa necesita repetir un número de veces un proceso hasta que una variable alcanza un valor o hasta que se verifique algún predicado. La sentencia while incluye la condición que debe cumplirse para que se ejecute el bloque de código que contiene, aunque en cualquier momento podemos salir de un bucle con break o cancelar el ciclo actual y continuar con continue la ejecución del ciclo siguiente. Ejemplos: x=0 y=0 while True: print(x,y) y+=1 if y<5: continue else: x+=1 if x==5: break print(x,y) Control del flujo con bucles: for...in Otra forma de construir un bucle consiste en recorrer los elementos de un lista con la sentencia for...in. La construcción utiliza una variable que en cada ciclo toma el valor de un nuevo elemento de la lista de la clausula in. El bucle terminará cuando se alcance el último elemento de la lista o cuando se fuerce su fin con break.Con for también puede usarse la clausula in range que, en su uso más elemental, recoge un valor que expresa el número de ciclos del bucle, partiendo del valor 0. Ejemplo: for num in range(10): print(num) # recorre del 0 al 9 Manejo de Excepciones Las excepciones o errores que se pueden producir durante la ejecución de un programa se gestionan con una construcción try- except. Una excepción puede ocurrir al intentar operar con datos de distinto tipo, dividir un número por cero, teclear un tipo de dato no esperado, acceder a un archivo que no existe y en otras situaciones previsibles. Para cuando sucedan es importante decidir qué respuesta dar a cada caso y evitar que el programa suspenda su ejecución de manera inesperada. En el bloque try se incluye el código que puede producir la excepción y en except el código que la tratará convenientemente. En un bloque except TipoError se capturará un tipo de error concreto que habrá que indicarlo. Por ejemplo, si intentamos convertir una cadena de texto a número entero el tipo será ValueError o si operamos con una variable no declarada el tipo será NameError. try: # contiene el código que puede producir la excepción except: # contiene el código que gestionará cualquier error except TipoError: # contiene el código que gestionará un tipo de error concreto else: # contiene el código que se ejecutará en caso de no haber error finally: # contiene el código que se ejecutará en cualquier caso. Ejemplos: try: numero = int(input('Introducir un número: ')) factorial = 1 for num in range(1, numero+1): factorial *= num print(factorial) except: print('Debe introducir un número entero') try: # Bloque de código a “vigilar” texto = input('Teclear :') # introducir un dato except KeyboardInterrupt: # captura excepción de interrupción print('\nSe ha pulsado ctrl+c') # Interrupción al presionar Ctrl+c else: # se ejecuta si no hay error print('Ha tecleado {}'.format(texto)) # muestra la cadena introducida finally: # se ejecuta tanto si hay error como si no print('fin de programa') # muestra mensaje final La clausula assert Con assert se fijan las condiciones que debe cumplir un objeto y si éstas no se cumplen en un momento determinado, producirá una excepción que hay que interceptar y tratar convenientemente. En el siguiente ejemplo se define una lista con seis elementos. A continuación, mediante un bucle se irán eliminando elementos, uno a uno, desde el final de la lista. La condición establecida para que no se produzca la excepción es que la lista tenga al menos dos elementos. Cuando haya dos y se intente borrar de nuevo se producirá la excepción AssertionError. try: # bloque de código a vigilar lista = [1, 2, 3, 4, 5, 6] # define lista print(lista) # muestra lista while True: # bucle infinito hasta error print('Elementoa borrar',lista[-1]) # muestra elemento a borrar lista.pop() # borra elemento assert len(lista) > 1 # la lista debe tener al menos 2 print(lista) # muestra lista después de borrado except AssertionError: # excepción para assert print('Error al intentar borrar elemento ') # muestra mensaje de assert print('La lista debe contener al menos 2') Entrada Estándar: input()/raw_input() La función input()/raw_input() permite a los usuarios introducir datos de distintos tipos desde la entrada estándar que normalmente se corresponde con un teclado. Ejemplo try: # bloque de código a comprobar articulos = int(input('Artículos:')) # entrada de un número precio = int(input('Precio:')) # entrada de un número print('Pagar: ' + str(articulos*precio) + '$') # muestra resultado except: # bloque para captura de error print('error, deben ser números') # muestra mensaje informativo Salida Estándar: print() La función print() se utiliza para mostrar información en la salida estándar que, normalmente, se corresponde con la salida estandar que puede ser la pantalla de la computadora. Ejemplo: correos = {'SJ' : 300, 'LR': 309, 'B': 310} # declara diccionarios for loc, cp in correos.items(): # recorre diccionario print('{0:5}:{1:4d}'.format(loc, cp)) # muestra lista de pares con formato Operaciones con archivos Un archivo es información identificada con un nombre que puede ser almacenada de manera permanente en el directorio de un dispositivo. Abrir archivo Antes de poder realizar cualquier operación de lectura/escritura hay que abrir el archivo con open() indicando su ubicación y nombre seguido, opcionalmente, por el modo o tipo de operación a realizar y la codificación que tendrá el archivo. Si no se indica el tipo de operación el archivo se abrirá en modo de lectura y si se omite la codificación se utilizará la codificación actual del sistema. Si no existe la ruta del archivo o se intenta abrir para lectura un archivo inexistente se producirá una excepción del tipo Ioerror. Ejemplos ObjArchivo = open('/home/archivo.txt') ObjArchivo = open('/home/archivo.txt', 'r'') ObjArchivo = open('/home/archivo.txt', mode='r', encoding='utf-8') Las operaciones de modo permitidas son: Modo Significado r Sólo lectura r+ Lectura/escritura w Sobre escribe, si no existe lo crea a Añadir al final del archivo b Binario + Permite lectura/escritura simultáneas U Salto de línea universal al sistema rb Sólo lectura binaria wb Sobre escritura binaria r+b Lectura/escritura binaria Cerrar archivo Después de terminar de trabajar con un archivo lo cerraremos con el método close. ObjArchivo.close Leer archivo: read, readline, readlines, with-as Con el método read() es posible leer un número de bytes determinados. Si no se indica número se leerá todo lo que reste o si se alcanzó el final de fichero devolverá una cadena vacía. archivo = open('archivo.txt','r') # abre archivo en modo lectura cadena1 = archivo.read(9) # lee los 9 primeros bytes cadena2 = archivo.read() # lee la información restaste print(cadena1) # muestra la primera lectura print(cadena2) # muestra la segunda lectura archivo.close # cierra archivo El método readline() lee de un archivo una línea completa archivo = open('archivo.txt','r') # abre archivo en modo lectura while True: # inicia bucle infinito para... linea = archivo.readline() # … leer línea a línea if not linea: break # … hasta que no haya más que leer print(linea) # muestra la línea leída archivo.close # cierra archivo El método readlines() lee todas las líneas de un archivo como una lista. Si se indica el parámetro de tamaño leerá esa cantidad de bytes del archivo y lo necesario hasta completar la última linea. archivo = open('archivo.txt','r') # abre archivo en modo lectura lista = archivo.readlines() # lee todas la líneas a una lista numlin = 0 # inicializa un contador for linea in lista: # recorre todas los elementos de la lista numlin += 1 # incrementa en 1 el contador print(numlin, linea) # muestra contador y elemento de lista (línea) archivo.close # cierra archivo with-as permite usar los archivos de forma óptima cerrándolos y liberando la memoria al concluir el proceso de lectura. with open("indice.txt") as fichero: # abre archivo (y cierra cuando termine lectura) for linea in fichero: # recorre línea a línea el archivo print(linea) # muestra línea última leída Escribir en archivo: write, writelines El método write() escribe una cadena y el método writelines() escribe una lista a un archivo. Si en el momento de escribir el archivo no existe se creará uno nuevo. cadena1 = 'Datos' # declara cadena1 cadena2 = 'Secretos' # declara cadena2 archivo = open('datos1.txt','w') # abre archivo para escribir archivo.write(cadena1 + '\n') # escribe cadena1 añadiendo salto de línea archivo.write(cadena2) # escribe cadena2 en archivo archivo.close # cierra archivo lista = ['lunes', 'martes', 'miercoles', 'jueves', 'viernes'] # declara lists archivo = open('datos2.txt','w') # abre archivo en modo escritura archivo.writelines(lista) # escribe toda la lista en el archivo archivo.close # cierra archivo Mover el puntero: seek(), tell() El método seek() desplaza el puntero a una posición del archivo y el método tell() devuelve la posición del puntero en un momento dado (en bytes). archivo = open('datos2.txt','r') # abre archivo en modo lectura archivo.seek(5) # mueve puntero al quinto byte cadena1 = archivo.read(5) # lee los siguientes 5 bytes print(cadena1) # muestra cadena print(archivo.tell()) # muestra posición del puntero archivo.close # cierra archivo Leer y escribir cualquier objeto a un archivo: pickle Para leer y escribir cualquier tipo de objeto Python podemos importar el modulo pickle y usar sus métodos dump() y load() para leer y escribir los datos. import pickle # importa módulo pickle lista = ['Perl', 'Python', 'Ruby'] # declara lista archivo = open('lenguajes.dat', 'wb') # abre archivo binario para escribir pickle.dump(lista, archivo) # escribe lista en archivo archivo.close # cierra archivo del lista # borra de memoria la lista archivo = open('lenguajes.dat', 'rb') # abre archivo binario para leer lista = pickle.load(archivo) # carga lista desde archivo print(lista) # muestra lista archivo.close # cierra archivo Funciones Una función es como una caja negra: una vez creada no debemos preocuparnos por lo que tiene en su interior, simplemente, tenemos que recordar su nombre y los datos que necesita para resolver un proceso. Generalmente, devuelven un resultado. La principal virtud de una función está en la reutilización del código, es decir, una vez creada puede ser llamada cada vez que se necesite. Para mejor aprovechamiento debemos procurar que las funciones ofrezcan soluciones a necesidades muy concretas. Funciones con un número fijo de parámetros Para definir la función escribiremos def seguido del nombre de la función y entre paréntesis los dos parámetros que son necesarios para calcular el área del triángulo: base y altura. Con return la función devolverá el resultado de la fórmula matemática expresada. Los dos parámetros son obligatorios. Si alguno falta habrá una excepción. def area_triangulo(base, altura): # define función con dos parámetros ''' Calcular el área de un triangulo''' # cadena de documentación return base * altura / 2 # devuelve el resultado de la expresión print(area_triangulo(6, 4)) # la función retornará el valor 12 Funciones con un número variable de parámetros def distancia(*tramos): # define función con nº variable de parámetros ''' Suma distancia de tramos ''' # cadena de documentación total = 0 # inicializa variable numérica for distancia in tramos: # recorre, uno a uno, todos los tramos... total = total + distancia # … y acumula la distancia return total # devuelve la suma de todos los parámetros tramo1 = 10 print(distancia(tramo1, 20, 30, 40)) # la función retornará el valor 100print(distancia()) # la función retornará el valor 0 Funciones con parámetros con valores por defecto La función pagar tiene el parámetro dto_aplicado con el valor 5 asignado por omisión. Dicho valor se utilizará en la solución en el caso de omitirse este dato cuando sea llamada la función. def pagar(importe, dto_aplicado = 5): ''' La función aplica descuentos ''' return importe - (importe * dto_aplicado / 100) print(pagar(1000)) # 950 print(pagar(1000, 10)) # 900 Funciones con parámetros que contienen diccionarios La función porc_aprobados tiene el parámetro **aulas que es un diccionario que contendrá las aulas de una escuela con el número alumnos de cada una. Cuando es llamada la función se pasa también el número de alumnos que aprobaron el curso. La función suma los alumnos de todas las aulas y calcula el porcentaje de aprobados. def porc_aprobados(aprobados, **aulas): ''' Calcula el % de aprobados ''' total=0 for alumnos in aulas.values(): total += alumnos return aprobados * 100 / total porcentaje_aprobados = porc_aprobados(48, A = 22, B = 25, C = 21) print(porcentaje_aprobados) Funciones que devuelven más de un valor La función elemento_quimico recibe un símbolo químico y devuelve el número atómico del elemento correspondiente y su denominación. Para ello, utiliza un diccionario en el que las claves son los símbolos químicos y los valores son cadenas que contienen para cada elemento su número atómico y denominación, unidos por un guión. Mediante el símbolo se accede a la cadena que luego es dividida con split en dos partes (utilizando como separador el propio guión '-'). split devuelve una lista con las dos partes. En lista[0] queda el número atómico y en lista[1] la denominación, los dos valores que devuelve esta función. def elemento_quimico(simbolo): ''' Devuelve número atómico y denominación del elemento ''' elementos = {'H':'1-Hidrógeno', 'He':'2-Helio', 'Li':'3-Litio'} elemento = elementos[simbolo] lista = elemento.split('-') return (lista[0], lista[1]) num_atomico, denomina = elemento_quimico('He') print('Núm. Atómico:', num_atomico) print('Denominación:', denomina) Funciones sin return Una función sin return devuelve None si es asignada a una variable o llamada desde un print(). Por lo demás, funcionan igual que cualquier otra función. def repite(caracter='-', repite=3): print(caracter * repite) repite('=', 20) Variables locales y variables globales Las funciones locals() y globals() devuelven diccionarios con las variables locales y globales que pueden utilizarse en un programa. Cada diccionario equivale a un espacio de nombre (namespace) donde Python gestiona las variables propias de un ámbito determinado. Si el diccionario es local el ámbito se refiere al espacio de nombre de una función o una clase; y si el diccionario es global el ámbito se corresponde con el módulo. Ejemplo: #!/usr/bin/env python # -*- coding: utf-8 -*- # http://python-para-impacientes.blogspot.com.es/2014/01/cadenas-listas-tuplas-diccionarios-y.html#diccionarios from math import pi global1 = 1 def funcion1(x, y): global global1 total = x + y + global1 global1 = 2 print("funcion1. Dicc. locales.:", locals()) print("funcion1. Dicc. globales:", globals()) return total class clase1: z = 3 print("clase1. Dicc. locales.:", locals()) print("clase1. Dicc. Globales:", globals()) def __init__(self): print("clase1: método __init__") def __call__(self): print("clase1: método __call__") def main(): a = 5 b = 10 if "funcion1" in globals(): if callable(globals()["funcion1"]): print("Rtdo funcion1: ", globals()["funcion1"](a, b)) objeto = clase1() if "objeto" in locals(): if callable(locals()["objeto"]): locals()["objeto"] locals()["a"] = 20 globals()["b"] = 20 print("main(). Dicc. locales.:", locals()) print("main(). Dicc. globales:", globals()) print("a: ", a, "b:", b) return 0 if __name__ == '__main__': main() Evaluar, ejecutar y compilar cadenas Las funciones eval(), exec() y compile() son del grupo de funciones integradas o built-in functions de Python. eval() La función eval() se utiliza para evaluar cadenas de texto que pueden contener expresiones o distintos tipos de estructuras de datos que pueden utilizarse con Python, tales como listas, tuplas, diccionarios y otros objetos que admiten asignación. precio = 5 cadenas = ['(4+5)**2', '(1, 2, 3)', '["I", "II", "III"]', '{"a":1, "b":2, "c":3}', 'len("Python")', '20 * precio', '__import__("platform").python_version()'] for cadena in cadenas: print(cadena, "=>", eval(cadena), "Tipo:",type(eval(cadena))) En el siguiente ejemplo la cadena de la variable entrada contiene una lista a la que le falta el corchete de cierre y este hecho provoca un error de sintaxis: try: entrada = '["castaño","encina","roble"' print(entrada, "=>", eval(entrada)) except SyntaxError: print('Se ha producido un error de sintaxis') exec() La función exec() permite ejecutar código Python contenido en una cadena o en un archivo. Si el código no cumple con las reglas del lenguaje producirá una excepción. exec('secreto = input("Introducir clave secreta: ")') exec('if secreto == "1234": print("¡Eureka!")') exec('print("Clave secreta:", secreto)') Palabras reservadas en Python Cadenas crudas: raw Operaciones básicas con variables Operadores aritméticos Operadores binarios o de bits Operadores lógicos Operadores de comparación o relacionales Control de Flujo Control del flujo: if Control del flujo con bucles: while Control del flujo con bucles: for...in Manejo de Excepciones La clausula assert Entrada Estándar: input()/raw_input() Salida Estándar: print() Operaciones con archivos Abrir archivo Cerrar archivo Leer archivo: read, readline, readlines, with-as Escribir en archivo: write, writelines Mover el puntero: seek(), tell() Leer y escribir cualquier objeto a un archivo: pickle Funciones Funciones con un número fijo de parámetros Funciones con un número variable de parámetros Funciones con parámetros con valores por defecto Funciones con parámetros que contienen diccionarios Funciones que devuelven más de un valor Funciones sin return Variables locales y variables globales Evaluar, ejecutar y compilar cadenas eval() exec()