2014/06/06
Juan V. Capella
Contenido
● Objetivo
●
Introducción
● Operadores
● Tipos de datos
● Funciones
● Excepciones
● Módulos
● E/S y ficheros
● GPIO
● Networking
● GUI
armpower.blogs.upv.es
2
Objetivo
●
Introducirse en la programación en python con la Raspberry Pi
armpower.blogs.upv.es
3
Introducción
● Creado a finales de los 80 por Guido van Rossum
● El nombre viene de los humoristas británicos Monty Python
● Lenguaje interpretado (script)
● Prototipado y desarrollo rápido de aplicaciones
● Paradigma multiprogramación (orientada a objetos, programación
imperativa y programación funcional)
● Tipado dinámico: la misma variable puede contener valores de
diferentes tipos.
● No es necesario declarar el tipo de dato que va a contener una variable
– éste se determina en tiempo de ejecución según el valor asignado
● Fuertemente tipado
● No se permite tratar a una variable como si fuera de un tipo distinto al que tiene
– Hay que convertir de forma explícita el tipo de la variable
armpower.blogs.upv.es
4
Introducción
● Libre
● Muy alto nivel
● Python standard library (Librería muy completa)
●
https://docs.python.org/2/library/
● Referencia sobre todas las funciones de librería podemos encontrarlas en la documentación
oficial, disponible en la web..
– Cadenas, listas, tablas hash, pilas, colas
– Cálculo científico
– Serialización, y Persistencia de Objetos
– Programación Concurrente
– Acceso a BD, Ficheros Comprimidos...
– Networking
● CGIs, URLs, HTTP, FTP,
● pop3, IMAP, telnet
● Cookies, Mime, XML, XDR
– Diversos formatos multimedia
– Criptografía
armpower.blogs.upv.es
5
Introducción
● Lenguaje de propósito general
● Sencillo, compacto
● Sintaxis clara
●
Identación obligatoria:
def factorial(x):
if x == 0:
return 1
else:
return x * factorial (x - 1)
● Un bloque es un conjunto de instrucciones que se ejecutan secuencialmente
● Python utiliza el indentado para reconocer las líneas que forman un bloque de
instrucciones
● http://www.python.org/about/success/
armpower.blogs.upv.es
6
Introducción
● Hola mundo en Python
print ”¡Hola Mundo!” #esto es un comentario
● Hola mundo en C
#include <stdio.h>
int main (void) {
printf(”¡Hola Mundo!”);
return 0;
}
● Hola mundo en Java
public class HolaMundo {
public static void main(String [] args) {
System.out.println(”¡Hola Mundo!”);
}
}
●
armpower.blogs.upv.es
7
Ejecutando nuestros programas
● python fichero.py
● #!/usr/bin/env python
● chmod +x fichero.py
●
●
./fichero.py
IDLE
armpower.blogs.upv.es
8
Funciones built-in
armpower.blogs.upv.es
9
Operadores
● ==
● !=
● >
● <
● <=
● >=
● not
● and
● or
armpower.blogs.upv.es
10
Tipos de datos
● Numéricos: integers, floats, longs, complex …
●
●
●
●
a = 3 b = 4 a/b int(0.75) pi = 3.14 round(2.8) b = 3L c = 2+1j
a,b = 6,4
a = 3
a + z → Error
a = b = 7
● Cadenas: string stuffing → \
●
●
●
●
●
cad = “Hola” ca = 'Hola' ”””
print cad
print “Saludo” + cad
print “Saludo”, cad
print “Saludo %s” %cad
● Print “Saludo %s y %s” % (cad, ca)
●
●
cad[0]
upper() lower() strip()
● Subcadenas: “o” in cad
“Hola amigos”.find(“la”) len(“Adios”)
●
armpower.blogs.upv.es
11
Tipos de datos
● Vectores: listas, tuplas
● Puede haber listas de cualquier tipo de elementos (incluso de diferentes tipos),
un elemento de una lista es mutable (se puede modificar)
lista_tiendas=["depor","infor","vest","rest"]
for tienda in lista_tiendas: print tienda
● Acceso a listas:
lista=[3,5+1j,"hola"] lista[0]
len(lista) lista.append(8) lista.insert(7,1) lista.remove(3) del lista[3]
3 in lista 5 not in lista lista.index(3)
● Elevamos al cuadrado todos los números de una lista
a = [1, 5, 3, 7, 6, 3, 2, 4]
[x ** 2 for x in a]
→ [1, 25, 9, 49, 36, 9, 4, 16]
● Y ahora sólo aquellos que son pares
a = [1, 5, 3, 7, 6, 3, 2, 4]
[x ** 2 for x in a if x % 2 == 0]
→ [36, 4, 16] Tachán!!
armpower.blogs.upv.es
12
Tipos de datos
● Vectores: listas, tuplas
● Puede haber listas de cualquier tipo de elementos (incluso de diferentes tipos),
un elemento de una lista es mutable (se puede modificar)
lista_tiendas=["depor","infor","vest","rest"]
for tienda in lista_tiendas: print tienda
● Acceso a listas:
lista=[3,5+1j,"hola"] lista[0]
len(lista) lista.append(8) lista.insert(7,1) lista.remove(3) del lista[3]
3 in lista 5 not in lista lista.index(3)
● Otros: diccionarios (hashes), objetos ..
● Hash, conjunto de pares ordenados {clave:valor}
dic_ej = {'Nombre': 'Jose', 'Eslora': 20, 'Manga': 6};
dict_ej['Eslora'] = 8
print "Eslora: ", dict_ej['Eslora']
armpower.blogs.upv.es
13
Estructuras de control
● Cuando necesitamos modificar el flujo de ejecución del
programa:
● if
● for
● while
armpower.blogs.upv.es
14
if
if 4 < 0:
print “negativo!”
elif 4 == 0:
print “nada!”
else:
print “positivo!”
armpower.blogs.upv.es
15
for
●
Itera sobre los elementos de una secuencia:
for i in [1, 2, 3]:
print i
● Generando listas:
●
●
●
range(7) → [0,1,2,3,4,5,6]
range(4,7) → [4,5,6]
range(ini, n, step) range(1,11,2) → [1,3,5,7,9]
for i in range(3)
● No se usan condiciones de inicio, parada e incremento, sino
que se especifica claramente qué elementos se utilizan
– Más expresivo
numeros = [2, 4, 5]
for i in range(len(numeros)):
print i
armpower.blogs.upv.es
16
while
while x < 10:
x = x + 1
print x
● continue / break
armpower.blogs.upv.es
17
Funciones
● Se definen con: 'def'
def saludo():
print ”Hola!”
● Parámetros:
def saludo1 (nombre):
print ”Muy buenas D. %s!” % (nombre)
def saludo2 (nombre=”Pepito”):
print ”Muy buenas D. %s!” % (nombre)
● Para devolver valores utilizaremos 'return'
def suma(a,b):
return a+b
armpower.blogs.upv.es
18
Excepciones
● Una excepción se lanza cuando ha ocurrido algún error que Phyton
no ”sabe” como manejar, y termina el programa
● Podemos capturarlas:
●
try:
division(10,0)
except ZeroDivisionError:
print ”No se puede
except:
print ”Error inesperado”
finally:
print division(10,1)
armpower.blogs.upv.es
19
Módulos y paquetes
● Módulo: Conjunto de funciones, clases y variables guardadas en un fi
chero .py
● Paquete: Colección de módulos situados en un mismo directorio.
● Formas de usarlos:
import pygame
●
pygame.draw.rect(playSurface,whiteColour,Rect(position[0], position[1], 20, 20))
●
●
from socket import *
clientSocket = socket(AF_INET, SOCK_STREAM)
import Tkinter as tk
tk.mainloop
armpower.blogs.upv.es
20
Listas
● Listas
● elevamos al cuadrado todos los números
>>> a = [1, 5, 3, 7, 6, 3, 2, 4]
>>> [x ** 2 for x in a]
[1, 25, 9, 49, 36, 9, 4, 16]
● Y ahora sólo aquellos que son pares
>>> a = [1, 5, 3, 7, 6, 3, 2, 4]
>>> [x ** 2 for x in a if x % 2 == 0]
[36, 4, 16]
Tachán!!
●
●
armpower.blogs.upv.es
21
Acceso a bajo nivel: GPIO
● Biblioteca con básicamente funciones para la GPIO
● Viene ya instalada con python en raspbian
● Ejemplo:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(12, GPIO.IN)
GPIO.output(11, False)
input_value = GPIO.input(12)
if input_value == False:
print "Se ha pulsado el boton"
armpower.blogs.upv.es
22
Un caso práctico: montaje
● Material: LED, pulsador, 2 resistencias de 220 Ohms y cables.
armpower.blogs.upv.es
23
Un caso práctico: montaje
● Apagar la RPi, quitar la alimentación, montar con cuidado.
armpower.blogs.upv.es
24
Acceso a bajo nivel: wiringPi
● Biblioteca con funciones para la GPIO, I2C, SPI, que soporta las
placas de extensión más populares: piface, gertboard, …
www.wiringpi.com
$ sudo apt-get update
$ sudo apt-get install python-dev python-pip
$ sudo pip install wiringpi2
armpower.blogs.upv.es
25
E/S y ficheros
● print
● Convierte a strnig lo que le pases y lo saca por la salida estándar:
● print "Python esta chulo", "verdad?"
● Hay dos funciones para leer de la entrada estándar (normalmente el
teclado):
●
raw_input (siempre devuelve una cadena de texto → podemos necesitar hacer
una conversión al tipo de dato que necesitemos)
str = raw_input("Enter your input: ");
print "Received input is : ", str
●
input
str = input("Enter your input: ");
print "Received input is : ", str
armpower.blogs.upv.es
26
E/S y ficheros
● Antes de leer o escribir ficheros hay que abrirlos: open()
●
file object = open(file_name [, access_mode])
● Crea un objeto “file”
● Parámetros:
●
●
file_name: nombre del fichero
access_mode: modo debe ser abierto (lectura, escritura, etc.)
● close() vuelva (flush) todas la información no escrita y cierra el
fichero .
●
fileObject.close();
armpower.blogs.upv.es
27
E/S y ficheros
●
Leyendo ficheros:
fo = open("foo.txt", "r+")
str = fo.read(10);
print "Cadena ledia : ", str
# posicion actual
position = fo.tell();
print "Posicion actual : ", position
# Vamos al principio de nuevo
position = fo.seek(0, 0);
str = fo.read(10);
print "Cadena leida: ", str
fo.close()
● Escribiendo ficheros:
fo = open("foo.txt", "wb")
fo.write( "Practicando la escritura en ficheros.\n");
fo.close()
armpower.blogs.upv.es
28
Gestionando ficheros
● Renombrando ficheros:
import os
# Renombrando test1.txt a test2.txt
os.rename( "test1.txt", "test2.txt" )
● Borrando ficheros:
import os
# Borrando test2.txt
os.remove("text2.txt")
●
Llamar a otro programa:
import subprocess
subprocess.call(['miprogram', 'hola'])
armpower.blogs.upv.es
29
Directorios en Python
● Crear directorios:
import os
# Creamos el directorio “test”
os.mkdir("test")
● Borrar directorios:
os.rmdir('test')
● Etc.
armpower.blogs.upv.es
30
E/S y ficheros
● Modos de apertura:
armpower.blogs.upv.es
31
Networking: Un sencillo servidor
import socket # Importamos el módulo socket
s = socket.socket() # Creamos un objeto socket
host = s
Comentarios de: Programando en Python Raspberry Pi (0)
No hay comentarios