User Tools

Site Tools


apuntes:python

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
apuntes:python [2017/09/21 16:35] – [Escribir ficheros de texto] Santiago Faciapuntes:python [2019/06/11 20:40] (current) – [GUI] Santiago Faci
Line 105: Line 105:
  
 <code bash> <code bash>
-santi@zenbook:python programa.py+santi@zenbook:python3 programa.py 
 +</code> 
 + 
 +También es posible ejecutar los scripts de //Python// directamente desde la línea de comandos. Simplemente tenemos que poner la línea ''#!/usr/bin/python3'' al inicio del script para que podamos ejecutarlo sin utilizar el intérprete explicitamente. Por ejemplo, si tenemos el siguiente script de ejemplo: 
 + 
 +<file python hello.py> 
 +#!/usr/bin/python3 
 + 
 +print("Hello!"
 +</file> 
 + 
 +Dándole permisos de ejecución (en el caso de sistemas Linux/OS X), podremos ejecutarlo directamente. 
 + 
 +<code bash> 
 +santi@zenbook:$ chmod u+x hello.py 
 +santi@zenbook:$ ./hello.py 
 +Hello!
 </code> </code>
  
Line 524: Line 540:
 </code> </code>
  
 +<code python>
 +. . .
 +if algopasa:
 +    raise Exception('Ha pasado algo')
 +. . .
 +</code>
 +
 +<code python>
 +class MiExcepcion(Exception):
 +    def __init__(self, valor):
 +        self.valor = valor
 +    def __str__(self):
 +        return repr(self.valor)
 +</code>
 +
 +<code python>
 +. . .
 +try:
 +    raise MiExcepcion('algopasa ha pasado')
 +except MiExcepcion as me:
 +    print("Ha ocurrido un error", e.valor)
 +. . .
 +</code>
 ===== Expresiones Regulares ===== ===== Expresiones Regulares =====
  
Line 536: Line 575:
     * Si un atributo comienza con un guión bajo (''_velocidad'') se considera como protegido (//protected//)     * Si un atributo comienza con un guión bajo (''_velocidad'') se considera como protegido (//protected//)
     * Si el atributo comienza con dos guiones bajos (''<nowiki>__</nowiki>velocidad'') se le considera como privado (//private//     * Si el atributo comienza con dos guiones bajos (''<nowiki>__</nowiki>velocidad'') se le considera como privado (//private//
-  * No existe la sobreescritura de métodos como tal por lo que tendremos que optar por crear un método con parámetros opcionales y decidir qué hacer dentro del mismo:+  * No existe la sobrecarga de métodos como tal por lo que tendremos que optar por crear un método con parámetros opcionales y decidir qué hacer dentro del mismo:
 <code python> <code python>
 # Método con dos casos (simula la sobrecarga) # Método con dos casos (simula la sobrecarga)
Line 980: Line 1019:
  
 <code python> <code python>
-import sqlite3 
- 
-conexion = sqlite3.connect("datos.db") 
-cursor = conexion.cursor() 
- 
 # Ejemplo que muestra como conectar y crear  # Ejemplo que muestra como conectar y crear 
 # una Base de Datos SQLite # una Base de Datos SQLite
Line 1073: Line 1107:
 ==== Módulos ==== ==== Módulos ====
  
 +La programación modular o basada en módulos consiste en dividir una aplicación en varias partes independientes (módulos), capaces de funcionar por separados, pero que juntas funcionan como una sola. La principal idea sobre la programación modular es la de poder crear un código legible, ordenado y que se puedan mantener.
 +
 +Además, disponer de nuestra aplicación programada en módulos, permite que podamos reutilizar esos módulos para construir otras, reutilizando de esa manera nuestro código. Incluso podemos desarrollar librerías simplemente para que otros puedan apoyarse (importando los módulos) en ellas para construir sus aplicaciones.
 +
 +En Python, un módulo es cualquer fichero con extensión .py (fichero de código) con código que pueda ser reutilizado (clases, funciones, . . .).
 +
 +La forma de utilizar esos módulos es utilizando la palabra reservada ''import'' acompañada del nombre del módulo que queremos utilizar en nuestra aplicación.
 +
 +Por ejemplo, supongamos que tengo el módulo 'operaciones.py':
 +
 +<file python operaciones.py>
 +def siguiente(numero):
 +    return numero + 1
 +    
 +def anterior(numero):
 +    if (numero > 0):
 +        numero -= 1
 +    return numero
 +</file>
 +
 +Y ahora quiero importar ese módulo para utilizar algunas de sus funciones. Hay varias posibilidades:
 +
 +Importar el módulo sin más, de forma que tendremos que escribir su nombre cuando queramos utilizar sus funciones:
 +
 +<code bash>
 +>>> import operaciones
 +>>> operaciones.siguiente(3)
 +4
 +</code>
 +
 +Podemos importarlo y renombrarlo, de forma que podremos utilizar el nuevo nombre cuando queramos utilizar sus funciones:
 +
 +<code bash>
 +>>> import operaciones as ops
 +>>> ops.siguiente(3)
 +4
 +</code>
 +
 +También podemos importar todas las funciones del módulo y evitar tener que utilizar su nombre como prefjo antes de invocarlas:
 +
 +<code bash>
 +>>> from operaciones import *
 +>>> anterior(0)
 +0
 +</code>
 +
 +También podemos importar sólo algunas de sus funciones, y utilizarlas entonces sin usar el nombre del módulo como prefijo:
 +
 +<code bash>
 +>>> from operaciones import siguiente
 +>>> siguiente(3)
 +4
 +>>> anterior(1)
 +Traceback (most recent call last):
 +  File "<stdin>", line 1, in <module>
 +NameError: name 'anterior' is not defined
 +</code>
 +
 +Realmente la opción mas aconsejable es importar el paquete tal cual aunque ello nos obligue a escribir su nombre a modo de prefijo cada vez que invoquemos a alguna de sus funciones. En proyectos muy grandes a veces interesa saber de donde salen las funciones y de esa manera podremos distinguir claramente nuestro código del de los módulos que hayamos importado. En ocasiones puede ser recomendable un renombrado del módulo para aquellos que tengan un nombre largo o incómodo de escribir, pero siempre utilizando un segundo nombre que sea lo suficientemente descriptivo como para que sepamos a que módulo se refiere.
 ==== Paquetes ==== ==== Paquetes ====
  
 +En el punto anterior hemos visto que podemos organizar el código en módulos. En Python un módulo es un fichero que contiene código que podremos reutilizar importándolo. En el caso de que tengamos varios módulos y queramos organizarlos todos juntos estaremos hablando de un **paquete**.
 +
 +Utilizar paquetes es la forma en la que podremos organizar nuestros proyectos más grandes en Python. Puesto que podemos almacenar varios módulos en cada paquete, podemos estructurar más todavía nuestro código evitando asi tener módulos demasiado grandes.
 +
 +En Python un paquete es cualquier carpeta que contenga en su interior un fichero vacío con el nombre ''<nowiki>__init__</nowiki>.py''. Todos los módulos que aparezcan en esa carpeta formarán parte de ese paquete, cuyo nombre será el nombre de la carpeta.
 +
 +Al final, la forma de importar los módulos de cada paquete es la misma que la que hemos usado en el apartado anterior a la hora de importar módulos por separado. Ahora, simplemente tendremos que utiliar el nombre del paquete delante del módulo de la forma ''import paquete.modulo''.
 +
 +Imaginemos que tenemos el siguiente paquete, compuesto a su vez de dos paquetes. Cada uno de estos dos paquetes tiene un módulo con varias funciones cada uno (podrían contener más de un módulo y la forma de trabajar con ellos sería la misma).
 +
 +<figure>
 +{{ python_package.png }}
 +<caption>Estructura del paquete calculadora</caption></figure>
 +
 +Cada uno de los ficheros ''operaciones.py'' (se llaman igual pero no es necesario) contiene una serie de funciones, //basicas// por un lado:
 +
 +<file python operaciones.py>
 +def sumar(numero1, numero2):
 +    return numero1 + numero2
 +
 +def restar(numero1, numero2):
 +    return numero1 - numero2
 +
 +def multiplicar(numero1, numero2):
 +    return numero1 * numero2
 +
 +def dividir(numero1, numero2):
 +    return numero1 / numero2
 +
 +def potencia(numero, exponente):
 +    return numero ** exponente
 +</file>
 +
 +y de //funciones// por otro:
 +
 +<file python operaciones.py>
 +import math
 +
 +def seno(valor):
 +    return math.sin(valor)
 +
 +def coseno(valor):
 +    return math.cos(valor)
 +
 +def tangente(valor):
 +    return math.tan(valor)
 +</file>
 +
 +Así, si desde fuera del paquete principal ''calculadora'', queremos importar cualquiera de los módulos, procederemos de la siguiente forma:
 +
 +<code python>
 +>>> import calculadora.basicas.operaciones as operaciones
 +>>> print(operaciones.sumar(3, 4))
 +7
 +>>> |
 +</code>
 +
 +Y a partir de ahi podemos importar los módulos de las diferentes formas que hemos visto en el apartado anterior sobre los mismos.
 ===== GUI ===== ===== GUI =====
  
-[[https://docs.python.org/3/library/tkinter.html|Tkinter]] es la librería estándar para el desarrollo de GUIs en Python +[[https://docs.python.org/3/library/tkinter.html|Tkinter]] es la librería estándar para el desarrollo de GUIs en Python y viene incluida en la instalación de //Python//, por lo que para usarla sólo es necesario importar el paquete ''tkinter''
 + 
 +A continuación se muestra un ejemplo muy sencillo creado con esta librería. Para más información, en la sección [[extra:referencias|Referencias]] hay un par de enlaces interesantes.
  
 <code python> <code python>
Line 1090: Line 1243:
  
     def __crearVentana(self):     def __crearVentana(self):
- 
         self.__tfTexto = tk.Text(self, width=20, height=1)         self.__tfTexto = tk.Text(self, width=20, height=1)
         self.__tfTexto.grid()         self.__tfTexto.grid()
apuntes/python.1506011714.txt.gz · Last modified: 2019/01/04 13:22 (external edit)