Programar en Python
Programar en Python
• Presentación de la unidad
Características de PythonP
e
Python es un lenguaje: r
• Intrepetado m
• Alto nivel a
• Multiparadigma, ya que soporta orientación a lobjetos, programación
imperativa y programación funcional. i
• Multipltaforma n
• Libre k
1.5
>>> type(num)
<class 'float'>
>>> type(num)
<class 'float'>
>>> cad
'piña'
>>> type(xrange(1,10))
<type 'xrange'>
En pyton3:
>>> range(1,10)
range(1, 10)
>>> type(range(1,10))
<class 'range'>
<type 'str'>
>>> num=input()
123
>>> type(num)
<type 'int'>
En python3:
>>> num=input()
123
>>> type(num)
<class 'str'>
Comparando tiposP
e
Python 3 nos indica un error cuando intentamos comparar tipos de datos diferentes.
r
En python2:
m
>>> [1,2] > "hola"
a
False l
En python3: i
>>> [1,2] > "hola" n
Traceback (most recent call k last):
Instalación en LinuxP
e
r
Python viene preinstalado de serie en la mayoría de las distribuciones GNU/Linux. Si no tenemos a
m
nuestra disposición paquetes para instalarlo.
a
• En Debian 8 Jessie, la versión por defecto es la 3.4.2
• En Debian 9 Stretch, la versión es lal 3.5.3-1
• En Ububtu 16.04 Xenial, la versióni es la 3.5.3-3
n
Para más información
k
Instalación en WindowsP
e
Podemos descargarnos un instalador (paquete MSI) r de las distintas versión de python.
Para más información m
a
Instalación en Mac OS l P
e i
r n Si desas instalar Python3 puedes encontrar el
Mac OS X 10.8 viene con Python 2.7 preinstalado.
m k
paquete de la versión deseada en la página de desrcarga: www.python.org/downloads/.
Para más información a
l
i
n
k
Entornos de desarrollos y editores
de texto
• Presentación de la unidad
Una decisión importante que debes tomar cuando empiezas a trabajar en informática es acerca del
editor o editores de texto que vas a utilizar. Hay muchas opciones y aspectos a considerar. Además en
determinadas entornos es posible que no sea suficiente con utilizar un simple editor de texto y sea el
necesario el uso de un IDE (entorno de desarrollo integrado), que además de la posibilidad de editar el
código, nos ofrezca otras herramientas: depuración de código, generación automático de código, ayuda
integrada, manejo del proyecto, gestión de los sistemas de control de versiones,…
A La hora de decidir en qué entorno trabajar, nos deberíamos hacer las siguientes preguntas:
• ¿Editor gráfico o en consola? Para tareas de administración lo ideal sería saber manejar un
editor de texto en consola, ya que en muchas ocasiones tendrás que hacerlo en un equipo remoto
sin entorno gráfico. Las tres opciones más habituales son vim, nano y emacs-nox Sin embargo,
para tareas de programación, es habitual es utilizar un editor gráfico con más funcionalidades:
emacs, atom, sublime text, notepad++
• ¿Editor simple o IDE?. Habría que considerar que aprender a manejar un IDE lleva más tiempo
que un simple editor y no es adecuado para aplicaciones sencillas como las que vamos a utilizar
nosotros en este curso. Evidentemente el uso de un IDE se hace imprescindible en un entorno
profesional.
• ¿Qué funcionalidades básicas debe tener el editor?: resaltado de sintaxis, numeración de líneas,
control de sangrado (indentación), manejo completo desde teclado Soporte para python.
• ¿Es multiplataforma?. Permite que el mismo editor de texto se utilice en diferentes sistemas
operativos y puede ser un aspecto determinante para nosotros.
>>>
>>> 3 + _
10
Si tenemos nuestro programa en un fichero fuente (suele tener extensión py), por
ejemplo programa.py,lo ejecutaríamos de la siguiente manera.
$ python3 programa.py
Por defecto la codificación de nuestro código fuente es UTF-8, por lo que no debemos tener ningún
problema con los caracteres utilizados en nuestro programaos. Si por cualquier motivo necesitamos
cambiar la codificación de los caracteres, en la primera línea de nuestro programa necesitaríamos
poner:
# -*- coding: encoding -
Por ejemplo:
# -*- coding: cp-1252 -*-
Escribimos un programaP
e
Un ejemplo de nuestro primer programa, podría serreste “hola mundo” un poco modificado:
numero = 5 m
if numero == 5: a
l
i
n
k
print ("Hola mundo!!!")
La indentación de la última línea es importante (se puede hacer con espacios o con tabulador), en
python se utiliza para indicar bloques de instrucciones definidas por las estructuras de control (if,
while, for, …).
Para ejecutar este programa (guardado en hola.py):
$ python3 hola.py
$ Hola mundo!!!
$ ./hola.py
$ Hola mundo!!!
Guía de estiloP
e
r
Puede encontrar la guía de estilos para escribir código python en Style Guide for Python Code.
m
a
l
i
n
k
Estructura del programa
• Presentación de la unidad
• Un programa python está formado por instrucciones que acaban en un caracter de “salto de
línea”.
• El punto y coma “;” se puede usar para separar varias sentencias en una misma línea, pero no se
aconseja su uso.
• Una línea empiza en la primera posición, si tenemos instrucciones dentro de un bloque de una
estrucura de control de flujo habra que hacer una identación.
• La identación se puede hacer con espacios y tabulaciones pero ambos tipos no se pueden
mezclar. Se recomienda usar 4 espacios.
• La barra invertida “\” al final de línea se emplea para dividir una línea muy larga en dos o más
líneas.
• Las expresiones entre paréntesis “()”, llaves “{}” y corchetes “[]” separadas por comas “,” se
pueden escribir ocupando varias líneas.
• Cuando el bloque a sangrar sólo ocupa una línea ésta puede escribirse después de los dos punto.
ComentariosP
e
Se utiliza el caracter # parar indicar los comentarios.
m
Palabras reservadas a P
l e
False class finally isr return
i
None continue nfor m
lambda try
kfrom a
True def nonlocal while
l
and del global not
i with
EjemploP
e
#!/usr/bin/envr python
m
a
# Sangrado con 4 espacios
l
i
edad = 23 n
if edad > =18:k
print('Es mayor de edad')
else:
if num >=0:
while num<10:
print (num)
num = num +1
if azul: print('Cielo')
__import__()
Todas estas funciones y algunos elmentos comunes del lenguaje están definidas
en el módulo builtins.
Ayuda en pythonP
e
Un función fundamental cuandor queremos obtener información sobre los distintos
m Podemos usarla entrar en una sesión interactiva:
aspectos del lenguaje es help.
>>> help() a
l
i
Welcome to Python 3.4's help utility!
n
k
If this is your first time using Python, you should definitely check out
Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
with a one-line summary of what it does; to list the modules whose name
help>
Datos
• Presentación de la unidad
Literales, variables y expresionesP
e
r
LiteralesP m
e
Los literales nos permiten representar valores. Estos valores pueden serade diferentes tipos, de esta
r
manera tenemos diferentes tipos de literales: l
m
Literales numéricos i
a
n
• Para representar números enteros utilizamos cifras enteras (Ejemplos: 3, 12, -23). Si queremos
l
k
representarlos de forma binaria comenzaremos por la secuencia 0b (Ejemplos: 0b10101,
i
0b1100).n La representación octal la hacemos comenzando por 0o (Ejemplos: 0o377, 0o7) y por
último,kla representación hexadecimal se comienza por 0x (Ejemplos: 0xdeadbeef, 0xfff).
• Para los números reales utilizamos un punto para separar la parte entera de la decimal (12.3,
45.6). Podemos indicar que la parte decimal es 0, por ejemplo 10., o la parte entera es 0, por
ejemplo .001, Para la representación de números muy grandes o muy pequeños podemos usar la
representación exponencial (Ejemplos: 3.14e-10,1e100).
• Por último, también podemos representar números complejos, con una parte real y otra
imaginaria (Ejemplo: 1+2j)
Literales cadenas
Nos permiten representar cadenas de caracteres. Para delimitar las cadenas podemos usar el carácter ‘ o
el carácter “. También podemos utilizar la combinación ‘’’ cuando la cadena ocupa más de una línea.
Ejemplos.
'hola que tal!'
"Muy bien"
'''Podemos \n
ir al cine'''
Las cadenas anteriores son del tipo str, si queremos representar una cadena de tipo byte podremos
hacerlo de la siguiente manera:
b'Hola'
B"Muy bien"
VariablesP
e
Una variables es un identificador que referencia a un valor. Estudiaremos más adelante que python
r
utiliza tipado dinámico, por lo tanto no se usa el concepto de variable como almacén de información.
m
Para que una variable referencie a un valor se utiliza el operador de asignación =.
a
El nombre de unal variable, ha de empezar por una letra o por el carácter guión bajo, seguido de letras,
números o guiones
i bajos. No hay que declarar la variable antes de usarla, el tipo de la variable será el
mismo que el deln valor al que hace referencia. Por lo tanto su tipo puede cambiar en cualquier
momento: k
>>> var = 5
>>> type(var)
<class 'int'>
>>> type(var)
<class 'str'>
Hay que tener en cuanta que python distingue entre mayúsculas y minúsculas en el nombre de una
variable, pero se recomienda usar sólo minúsculas.
Definición, borrado y ámbito de variablesP
e
Como hemos comentado anteriormente para crear una variable simplemente tenemos que utilizar un
r
operador de asignación, el más utilizado = para que referencia un valor. Si queremos borrar la variable
m
utilizamos la instrucción del. Por ejemplo:
a
>>> a = 5
l
>>> a i
5 n
>>> del a k
>>> a
Podemos tener también variables que no tengan asignado ningún tipo de datos:
>>> a = None
>>> type(a)
<class 'NoneType'>
El ámbito de una variable se refiere a la zona del programa donde se ha definido y existe esa variable.
Como primera aproximación las variables creadas dentro de funciones o clases tienen un ámbito local,
es decir no existen fuera de la función o clase. Concretaremos cuando estudiamos estos aspectos más
profundamente.
ExpresionesP
e
Una expresión es una combinación de variables, literales, operadores, funciones y expresiones, que tras
r
su evaluación o cálculo nos devuelven un valor de un determinado tipo.
m
Veamos ejemplos de expresiones:
a
a + 7
l
(a ** 2) + b i
n
Operadores.k Precedencia de operadores en pythonP
e
Los operadores que podemos utilizar se clasifican según el tipo de datos con los que trabajen y
r
podemos poner algunos ejemplos:
m
+ - * ** / // %
a
<< >> & | ^ ~ l
< > <= >= == != i
-= *= /= //= %= n
k
Podemos clasificaros en varios tipos:
• Operadores aritméticos
• Operadores de cadenas
• Operadores de asignación
• Operadores de comparación
• Operadores lógicos
• Operadores a nivel de bit
• Operadores de pertenencia
• Operadores de identidad
La procedencia de operadores es la siguiente:
1. Los paréntesis rompen la procedencia.
2. La potencia (**)
3. Operadores unarios (~ + -)
4. Multiplicar, dividir, módulo y división entera (* /% // )
5. Suma y resta (+ -)
6. Desplazamiento nivel de bit (» «)
7. Operador binario AND (&)
Operadores binario OR y XOR (^ )
8. Operadores de comparación (<= < > >=)
9. Operadores de igualdad (<> == !=)
10.Operadores de asignación (= %= /= //= -= += *= **=)
11.Operadores de identidad (is, is not)
12.Operadores de pertenencia (in, in not)
13.Operadores lógicos (not, or, and)
Función eval()P
e
r expresión como una cadena y la ejecuta.
La función eval() recibe una
>>> x=1 m
>>> eval("x + 1") a
l
2
i
n
Tipos de datos k
• Presentación de la unidad
Podemos concretar aún más los tipos de datos (o clases) de los objetos que manejamos en el lenguaje:
• Tipos númericos
• Tipo entero (int)
• Tipo real (float)
• Tipo numérico (complex)
• Tipos booleanos (bool)
• Tipo de datos secuencia
• Tipo lista (list)
• Tipo tuplas (tuple)
• Tipo rango (range)
• Tipo de datos cadenas de caracteres
• Tipo cadena (str)
• Tipo de datos binarios
• Tipo byte (bytes)
• tipo bytearray (bytearray)
• Tipo de datos conjuntos
• Tipo conjunto (set)
• Tipo conjunto inmutable (frozenset)
• Tipo de datos iterador y generador (iter)
• Tipo de datos mapas o diccionario (dict)
En realidad todo tiene definido su tipo o clase:
• Ficheros
• Módulos
• Funciones
• Excepciones
• Clases
Función type()P
e
La función type nos devuelver el tipo de dato de un objeto dado. Por ejemplo:
>>> type(5) m
<class 'int'> a
l
>>> type(5.5)
i
<class 'float'> n
>>> type([1,2]) k
<class 'list'>
>>> type(int)
<class 'type'>
Función isinstance()P
e
r
Esta función devuelve True si el objeto indicado es del tipo indicado, en caso cntrario devuelve False.
>>> isinstance(5,int) m
True a
l
>>> isinstance(5.5,float)
i
True n
>>> isinstance(5,list) k
False
>>> type(var)
<class 'str'>
10771648
>>> id(a)
10771648
Esto es muy distinto a otros lenguajes de programación, donde una variable ocupa un espacio de
memoria que almacena un valor. Desde este punto cuando asigno otro número a la variable estoy
cambiando la referencia.
>>> a = 6
>>> id(6)
10771680
>>> id(a)
10771680
Las cadenas también son un objeto inmutable, que lo sean tiene efectos sobre las operaciones que
podemos efectuar con ellas. La asignación a un elemento de una cadena, por ejemplo está prohibida:
>>> a = "Hola"
>>> a[0]="h"
De los tipos de datos principales, hay que recordar que son inmutables son los números, las cadenas o
las tuplas.
Objetos mutablesP
e
El caso contrario lo tenemos por ejemplo en los objetos de tipo listas, en este caso las listas son
r
mutables. Se puede modificar un elemento de una lista.
m
Ejemplo
a
>>> a = [1,2]
l
>>> b = a i
>>> id(a) n
140052934508488 k
>>> id(b)
140052934508488
Como anteriormente vemos que dos variables referencia a la misma lista e memoria. Pero aquí viene la
diferencia, al poder ser modificada podemos encontrar situaciones como la siguiente:
>>> a[0] = 5
>>> b
[5, 2]
Cuando estudiamos las listas abordaremos este compartiendo de manera completa. De los tipos de
datos principales, hay que recordar que son mutables son las listas y los diccionarios.
Operadores de identidadP
e
r
Para probar esto de otra forma podemos usar los operadores de identidad:
• is: Devuelve True si dos variables u objetos m
están referenciando la misma posición de
memoria. En caso contrario devuelve False. a
l
• is not: Devuelve True si dos variables u objetos no están referenciando la misma posición de
memoria. En caso contrario devuelve False. i
n
Ejemplo
k
>>> a = 5
>>> b = a
>>> a is b
True
>>> b = b +1
>>> a is b
False
>>> b is 6
True
Operadores de asignaciónP
e
r
Me permiten asignar una valor a una variable, o mejor dicho: me permiten cambiar la referencia a un
nuevo objeto. m
El operador principal es =: a
>>> a = 7 l
>>> a i
n
7
k
Podemos hacer diferentes operaciones con la variable y luego asignar, por ejemplo sumar y luego
asignar.
>>> a+=2
>>> a
Otros operadores de asignación: +=, -=, *=, /=, %=, **=, //=
Asignación múltipleP
e
r
En python se permiten asignaciones múltiples de esta manera:
>>> a, b, c = 1, 2, "hola" m
a
l
Entrada y salida estándar i
• Presentación de la unidad n
k
Función inputP
e
r
No permite leer por teclado información. Devuelve una cadena de caracteres y puede tener como
argumento una cadena que semmuestra en pantalla.
Ejemplos a
>>> nombre=input("Nombre:") l
Nombre:jose i
n
>>> nombre
k
'jose'
>>> edad=int(input("Edad:"))
Edad:23
>>> edad
23
Función printP
e
r estándar. Podemos indicar varios datos a imprimir, que por defecto
No permite escribir en la salida
serán separado por un espaciom (se puede indicar el separador) y por defecto se termina con un carácter
a
salto de línea \n (también podemos indicar el carácter final). Podemos también imprimir varias
l
cadenas de texto utilizando la concatenación.
Ejemplos i
>>> print(1,2,3) n
1 2 3 k
>>> print(1,2,3,sep="-")
1-2-3
>>> print(1,2,3,sep="-",end=".")
1-2-3.>>>
0b11111 37 1f
11111 37 1f
n
k
>>> print(format(2.345,".2f"))
2.35
>>> type(entero)
<class 'int'>
<class 'float'
>>> type(complejo)
<class 'complex'>
P
e
Operadores aritméticosr
• +: Suma dos números m
a
l
i
n
k
• -: Resta dos números
• *: Multiplica dos números
• /: Divide dos números, el resultado es float.
• //: División entera
• %: Módulo o resto de la división
• **: Potencia
• +, -: Operadores unarios positivo y negativo
>>> divmod(7,2)
(3, 1)
>>> hex(255)
'0xff'
>>> oct(255)
'0o377'
>>> pow(2,3)
>>> round(7.567,1)
7.6
Conversión de tiposP
e
r
• int(x): Convierte el valor a entero.
m
• float(x): Convierte el valor a float.
• complex(x): Convierte el valor aa un complejo sin parte imaginaria.
• complex(x,y): Convierta el valor l a un complejo, cuya parte real es x y la parte imaginaria y.
i
Los valores que se reciben también puedenn ser cadenas de caracteres (str).
Ejemplos k
>>> a=int(7.2)
>>> a
>>> type(a)
<class 'int'>
>>> a=int("345")
>>> a
345
>>> type(a)
<class 'int'>
>>> b=float(1)
>>> b
1.0
>>> type(b)
<class 'float'>
>>> b=float("1.234")
>>> b
1.234
>>> type(b)
<class 'float'>
Por último si queremos convertir una cadena a entero, la cadena debe estar formada por caracteres
numéricos, sino es así, obtenemos un error:
a=int("123.3")
Tipo booleanoP
e
r
El tipo booleano o lógico se considera en python3 como un subtipo del tipo entero. Se puede
m o false (True, False).
representar dos valores: verdadero
a
¿Qué valores se l interpretan como FALSO?P
i e
Cuando se evalua una expresión,n hay determinados valores que se interpretan como False: r
• None k m
• False a
• Cualquier número 0. (0, 0.0, 0j) l
• Cualquier secuencia vacía ([], (), ‘’) i
• Cualquir diccionario vacío ({}) n
k
Operadores booleanosP
e
Los operadores booleanos se utilizan para operarr sobre expresiones booleanas y se suelen utilizar en las
estructuras de control alternativas (if, while): m
• x or y: Si x es falso entonces y, sino x.a Este operados sólo evalua el segundo argumento si el
primero es False. l
• x and y: Si x es falso entonces x, sinoi y. Este operados sólo evalua el segundo argumento si
el primero es True. n
• not x: Si x es falso entonces True, sinokFalse.
Operadores de comparaciónP
e
== != >= > <= < r
m
Funciones all() y any() P a
e l
• all(iterador): Recibe un iterador,rpor ejemploi una lista, y devuelve True si todos los
m vacío. n
elementos son verdaderos o el iterador está
• any(iterador): Recibe un iterador,apor ejemplokuna lista, y devuelve True si alguno de sus
l
elemento es verdadero, sino devuelve False.
i
n
Ejercicios de programas sencillos k
Escribir un programa que pregunte al usuario su nombre, y luego lo salude.
Solución
#!/usr/bin/env python
nombre=input("Dime tu nombre:")
base=float(input("Dime la base:"))
altura=float(input("Dime la altura:"))
import math
radio=float(input("Dime el radio:"))
num1=float(input("Numero1:"))
num2=float(input("Numero2:"))
print ("Suma:%d,resta:%d,multiplicacion:%d,division:%.2f"%(num1+num2,num1-
num2,num1*num2,num1/num2))
Escribir un programa que le pida una palabra al usuario, para luego imprimirla 1000 veces, con
espacios intermedios.
Solución
#!/usr/bin/env python
Realiza un programa que reciba una cantidad de minutos y muestre por pantalla a cuantas horas y
minutos corresponde.
Por ejemplo: 1000 minutos son 16 horas y 40 minutos.
Solución
#!/usr/bin/env python
minutos=int(input("Minutos:"))
Alternativas simplesP
e
if numero<0: r
print("Número es negativo")m
a
l
Alternativas doblesP i
e
if numero<0: r n
mk
print("Número es negativo")
a
else:
l
print("Número es positivo")
i
n
Alternativas múltiples k P
e
if numero>0: r
print("Número es negativo") m
a
elif numero<0:
l
i
n
k
print("Número es positivo")
else:
print("Número es cero")
• Presentación de la unidad
whileP
e
r while nos permite repetir un bloque de instrucciones mientras al evaluar una expresión
La estructura
m
lógica nos devuelve True. Puede tener una estructura else que se ejecutará al terminar el bucle.
Ejemplo a
año = 2001 l
while añoi <= 2017:
n
print ("Informes del Año", año)
k
año += 1
else:
forP
e
r
La estructura for nos permite iterar los elementos de una secuencia (lista, rango, tupla, diccionario,
cadenamde caracteres,…). Puede tener una estructura else que se ejecutará al terminar el bucle.
a
Ejemplo
for il in range(1,10):
i
print (i)
n
else:
k
print ("Hemos terminado")
Instrucciones break, continue y passP
e
r
breakP m
e
a
Termina la ejecución del bucle, además no ejecuta el bloque de instrucciones indicado por la
r
parte else. l
m
i
continue a P
n
l e
Deja de ejecutar las restantes instrucciones del bucle y vuelve a iterar. k
i r
passP n m
ek a
Indica una instrucción
l nula, es decir no se ejecuta nada. Pero no tenemos errores de sintaxis.
r
m i
Recorriendo
a n
varias secuencias. Función zip()P
e
l k
Con la instrucción for podemos ejecutar más de una secuencia, utilizando la función zip. Esta r
i
función crea una secuencia donde cada elemento es una tupla de los elementos de cada secuencia m que
n
toma cómo parámetro. a
Ejemplo k l
>>> list(zip(range(1,4),["ana","juan","pepe"])) i
[(1, 'ana'), (2, 'juan'), (3, 'pepe')] n
k
Para recorrerla:
>>> for x,y in zip(range(1,4),["ana","juan","pepe"]):
... print(x,y)
1 ana
2 juan
3 pepe
Ejercicios de repetitivas
Pedir un número por teclado y mostrar la tabla de multiplicar
Solución con while
#!/usr/bin/env python
numero = int(input("Número:"))
cont = 1
while (cont<11):
cont += 1
numero = int(input("Número:"))
Crea una aplicación que pida un número y calcule su factorial (El factorial de un número es el producto
de todos los enteros entre 1 y el propio número y se representa por el número seguido de un signo de
exclamación. Por ejemplo 5! = 1x2x3x4x5=120
Solución
#!/usr/bin/env python
num=int(input("Número:"))
fact=1
for i in range(2,num+1):
fact*=i
Crea una aplicación que permita adivinar un número. En primer lugar la aplicación solicita un número
entero por teclado. A continuación va pidiendo números y va respondiendo si el número a adivinar es
mayor o menor que el introducido. El programa termina cuando se acierta el número.
Solución
#!/usr/bin/env python
secreto=int(input("Número secreto:"))
num=int(input("Número:"))
while num!=secreto:
if num>secreto:
else:
num=int(input("Número:"))
print()
Escribe un programa que diga si un número introducido por teclado es o no primo. Un número primo es
aquel que sólo es divisible entre él mismo y la unidad.
Solución
#!/usr/bin/env python
num=int(input("Número:"))
primo = True
if num%cont==0:
primo=False
break
if primo:
print("Es primo")
else:
print("No es primo")
True
True
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
• Indexación: Puedo obtener el dato de una secuencia indicando la posición en la secuencia. Los
conjuntos no tienen implementado esta característica.
>>> lista[3]
• Slice (rebanada): Puedo obtener una subsecuencia de los datos de una secuencia. En los
conjuntos no puedo obtener subconjuntos. Esta característica la estudiaremos más
detenidamente en la unidad que estudiemos las listas.
>>> lista[2:4]
[3, 4]
>>> lista[1:4:2]
[2, 4]
• Con la función len puedo obtener el tamaño de la secuencia, es decir el número de elementos
que contiene.
>>> len(lista)
6
• Con las funciones max y min puedo obtener el valor máximo y mínimo de una secuencia.
>>> max(lista)
>>> min(lista)
>>> lista
[1, 2, 99, 4, 5, 6]
>>> lista
[1, 2, 8, 9, 10, 5, 6]
>>> lista
[1, 2, 8, 9, 10]
>>> lista
>>> lista4
>>> sum(lista1)
150
>>> sorted(lista1)
>>> sorted(lista1,reverse=True)
Veamos con más detenimiento la función enumerate: que recibe una secuencia y devuelve un objeto
enumerado como tuplas:
>>> seasons = ['Primavera', 'Verano', 'Otoño', 'Invierno']
>>> list(enumerate(seasons))
>>> lista1
[1, 2]
>>> lista1[1] = 10
>>> lista2
[1, 10, 3]
¿Cómo se copian las listas?P
e
Por lo tanto si queremos copiar una lista en otra podemos hacerlo de varias formas:
r
>>> lista1 = [1,2,3]
m
>>> lista2=lista1[:] a
>>> lista1[1] = 10 l
>>> lista2 i
n
[1, 2, 3]
k
Listas multidimensionalesP
e
r guardar en ellas datos de cualquier tipo, y
A la hora de definir las listas hemos indicado que podemos
evidentemente podemos guardar listas dentro de listas. m
>>> tabla = [[1,2,3],[4,5,6],[7,8,9]] a
>>> tabla[1][1] l
i
5
n
k
>>> for fila in tabla:
... print(elem,end="")
... print()
123
456
789
lista.sort
lista.clear lista.count lista.index lista.pop lista.reverse
>>> lista.extend(lista2)
>>> lista
[1, 2, 3, 4, 5, 6]
>>> lista.insert(1,100)
>>> lista
[1, 100, 2, 3, 4, 5, 6]
100
>>> lista
[1, 2, 3, 4, 5]
>>> lista.remove(3)
>>> lista
[1, 2, 4, 5]
Métodos de ordenación: reverse, sort,P
e
>>> lista.reverse() r
>>> lista m
a
[5, 4, 2, 1]
l
i
>>> lista.sort() n
>>> lista k
[1, 2, 4, 5]
>>> lista.sort(reverse=True)
>>> lista
[5, 4, 2, 1]
>>> lista=["hola","que","tal","Hola","Que","Tal"]
>>> lista.sort()
>>> lista
>>> lista=["hola","que","tal","Hola","Que","Tal"]
>>> lista.sort(key=str.lower)
>>> lista
>>> lista.index(5)
>>> lista.index(5,1)
4
>>> lista.index(5,1,4)
lista=[]
while num>0:
lista.append(num)
num=int(input("Número:"))
for n in lista:
if n % 2 ==0:
print(n,end=" ")
print()
print(n)
Realizar un programa que, dada una lista, devuelva una nueva lista cuyo contenido sea igual a la
original pero invertida. Así, dada la lista [‘Di’, ‘buen’, ‘día’, ‘a’, ‘papa’], deberá devolver [‘papa’, ‘a’,
‘día’, ‘buen’, ‘Di’].
Solución
#!/usr/bin/env python
print(lista[::-1])
Dada una lista de cadenas, pide una cadenena por teclado e indica si está en la lista, indica cuantas
veces aparece en la lista, lee otra cadena y sustituye la primera por la segunda en la lista, y por último
borra la cadena de la lista
Solución
#!/usr/bin/env python
cadena=input("Cadena:")
if cadena in lista:
else:
print(lista.count(cadena))
cadena2=input("Cadena a reemplazar:")
apariciones=lista.count(cadena)
pos=0
for i in range(0,apariciones):
pos=lista.index(cadena,pos)
lista[pos]=cadena2
print(lista)
Dado una lista, hacer un programa que indique si está ordenada o no.
Solución
#!/usr/bin/env python
lista=[2,3,4,1]
lista2=lista[:]
lista.sort()
if lista==lista2:
print("Lista ordenada")
else:
print("Lista no ordenada")
Función mapP
e
map(funcion,secuencia): r Ejecuta la función enviada por parámetro sobre cada uno de los
elementos de la secuencia. m
Ejemplo a
>>> items = [1, 2, 3, l4, 5]
Función filterP
e
filter(funcion,secuencia): r Devuelve una secuencia con los elementos de la secuencia
m
envíada por parámetro que devuelvan True al aplicarle la función envíada también como parámetro.
Ejemplo a
>>> lista = [1,2,3,4,5]l
Función reduceP
e
reduce(funcion,secuencia): r Devuelve un único valor que es el resultado de aplicar la función
á los lementos de la secuencia. m
Ejemplo a
>>> from functools import lreduce
15
list comprehensionPe
list comprehension nos propociona una alternativa r para la creación de listas. Es parecida a la
m cada elemento de la secuencia, con esta
función map, pero mientras map ejecuta una función por
técnica se aplica una expresión. a
l
i
n
k
Ejemplo
>>> [x ** 3 for x in [1,2,3,4,5]]
[0, 2, 4, 6, 8]
[5, 6, 7, 6, 7, 8, 7, 8, 9]
>>> a
1 P
e
Operaciones básicas con tuplasr
m
En las tuplas se pueden realizar las siguientes operaciones: a
l
i
n
k
• Las tuplas se pueden recorrer.
• Operadores de pertenencia: in y not in.
• Concatenación: +
• Repetición: *
• Indexación
• Slice
Entre las funciones definidas podemos usar: len, max, min, sum, sorted.
>>> tupla.index(2,2)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[0, 3, 6, 9]
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
Recorrido de un rangoP
e
r
Los rangos se suelen usar para ser recorrido, cuando tengo que crear un bucle cuyo número de
m
iteraciones lo se de antemanos puedo usar una estructura como esta:
>>> for i in range(11): a
... print(i,end=" ") l
i
0 1 2 3 4 5 6 7 8 9 10
n
k
Operaciones básicas con rangeP
e
En las tuplas se pueden realizar las siguientes operaciones: r
• Los rangos se pueden recorrer. m
• Operadores de pertenencia: in y not in. a
• Indexación l
• Slice i
n
Entre las funciones definidas podemos usar: len, max, min, sum, sorted.
k
Ademas un objeto range posee tres atributos que nos almacenan el comienzo, final e intervalo del
rango:
>>> rango = range(1,11,2)
>>> rango.start
>>> rango.stop
11
>>> rango.step
2
Codificación de caracteres
Introducción a la codificación de caracteresP
e
r
asciiP
m
e
En los principios de la informática los ordenadores se diseñaron para utilizar sólo caracteres aingleses,
r
por lo tanto se creó una codificación de caracteres, llamada ascii (American Standard Code for l
m
Information Interchange) que utiliza 7 bits para codificar los 128 caracteres necesarios en el ialfabeto
a
inglés. Posteriormente se extendió esta codificación para incluir caracteres no ingleses. Al utilizar
n 8 bits
l
se pueden representar 256 caracteres. De esta forma para codificar el alfabeto latino aparece kla
i
codificación ISO-8859-1 o Latín 1.
n
Unicodek P
e
La codificación unicode nos permite representar todos los caracteres de todos los alfabetos del mundo,
r
en realidad permite representar más de un millón de caracteres, ya que utiliza 32 bits para su
m
representación, pero en la realidad sólo se definen unos 110.000 caracteres.
a
UTF-8P l
e i
UTF-8 es un sistema de codificación de longitud variable para Unicode. Esto significa que los
r n
caracteres pueden utilizar diferente número de bytes.
m k
a
La codificación de caracteres en python3P
l e
i r
En Python 3.x las cadenas de caracteres pueden ser de tres tipos: Unicode, Byte y Bytearray.
n
• El tipo unicode permite caracteres de múltiples lenguajes y cada carácter en una m cadena
k
tendrá un valor inmutable. a
l
• El tipo byte sólo permitirá caracteres ASCII y los caracteres son también inmutables.
• El tipo bytearray es como el tipo byte pero, en este caso, los caracteres de iuna cadena si
son mutables. n
k
Algo que debe entenderse (e insiste Mark Pilgrim en su libro Dive into Python) es que “los bytes no
son caracteres, los bytes son bytes; un carácter es en realidad una abstracción; y una cadena de
caracteres es una sucesión de abstracciones”.
97
>>> ord("Ϭ")
1004
>>> cad2=str(2.45)
>>> cad3=str([1,2,3])
Entre las funciones definidas podemos usar: len, max, min, sorted.
Comparación de cadenasP
e
r
Las cadenas se comparan carácter a carácter, en el momento en que dos caracteres no son iguales se
m unicode y se comparan).
compara alfabéticamente (es decir, se convierte a código
Ejemplos a
>>> "a">"A" l
True i
n
>>> ord("a")
k
97
>>> ord("A")
65
>>> "informatica">"informacion"
True
>>> "abcde">"abcdef"
False
<class 'range'>
>>> ascii("piña")
"'pi\\xf1a'"
'0b11010101'
Métodos de formatoP
e
>>> cad = "hola, como estás?" r
>>> print(cad.capitalize()) m
a
Hola, como estás?
l
i
>>> cad = "Hola Mundo" n
>>> print(cad.lower()) k
hola mundo
>>> print(cad.upper())
HOLA MUNDO
>>> cad = "Hola Mundo"
>>> print(cad.swapcase())
hOLA mUNDO
>>> print(cad.title())
Hola Mundo
>>> print(cad.center(50))
hola mundo
>>> print(cad.center(50,"="))
====================hola mundo====================
>>> print(cad.ljust(50,"="))
hola mundo========================================
>>> print(cad.rjust(50,"="))
========================================hola mundo
>>> print(str(num).zfill(12))
000000000123
Métodos de búsquedaP
e
>>> cad = "bienvenido a mi aplicación"r
>>> cad.count("a") m
a
3
l
>>> cad.count("a",16) i
2 n
>>> cad.count("a",10,16) k
>>> cad.find("mi")
13
>>> cad.find("hola")
-1
>>> cad.rfind("a")
21
El método index() y rindex() son similares a los anteriores pero provocan una
excepción ValueError cuando no encuentra la subcadena.
Métodos de validaciónP
e
>>> cad.startswith("b") r
True m
a
>>> cad.startswith("m")
l
False i
>>> cad.startswith("m",13) n
True k
>>> cad.endswith("ción")
True
>>> cad.endswith("ción",0,10)
False
>>> cad.endswith("nido",0,10)
True
Otras funciones de
validación: isalnum(), isalpha(), isdigit(), islower(), isupper(), isspace(), is
title(),…
Métodos de sustituciónP
e
r
formatP
m
e
a
En la unidad “Entrada y salida estándar” ya estuvimos introduciendo el concepto de formateo de la
r
cadenas. Estuvimos viendo que hay dos métodos ly vimos algunos ejemplos del nuevo estilo con la
m
función predefinida format(). i
a
n
l
k
i
n
k
El uso del estilo nuevo es actualmente el recomendado (puedes obtener más información y ejemplos en
algunos de estos enlaces: enlace1 y enlace2) y obtiene toda su potencialidad usando el
método format() de las cadenas. Veamos algunos ejemplos:
>>> '{} {}'.format("a", "b")
'a b'
'b a'
115.81W')
'1111011 df 12.23'
>>> '{:^10}'.format('test')
>>> print(cadena.strip())
www.eugeniabahit.com
>>> cadena="00000000123000000000"
>>> print(cadena.strip("0"))
123
>>> print("275".join(formato_numero_factura)) m
a
Nº 0000-0275-0000 (ID: 275)
l
i
n
k
>>> hora = "12:23"
>>> print(hora.rpartition(":"))
>>> print(hora.partition(":"))
>>> print(hora.partition(":"))
>>> print(hora.split(":"))
>>> print(hora.rpartition(":"))
>>> print(hora.rsplit(":",1))
['12:23', '12']
>>> print(texto.splitlines())
Ejercicios de cadenas
Crear un programa que lea por teclado una cadena y un carácter, e inserte el carácter entre cada letra de
la cadena. Ej: separar y , debería devolver s,e,p,a,r,a,r
Solución
#!/usr/bin/env python
cadena=input("Cadena:")
caracter=input("Carácter:")
print(caracter.join(cadena))
Crear un programa que lea por teclado una cadena y un carácter, y reemplace todos los dígitos en la
cadena por el carácter. Ej: su clave es: 1540 y X debería devolver su clave es: XXXX
Solución
#!/usr/bin/env python
cadena=input("Cadena:")
caracter=input("Carácter:")
for i in range(10):
cadena=cadena.replace(str(i),caracter)
print(cadena)
Crea un programa python que lea una cadena de caracteres y muestre la siguiente información:
• La primera letra de cada palabra. Por ejemplo, si recibe Universal Serial Bus debe devolver
USB.
• Dicha cadena con la primera letra de cada palabra en mayúsculas. Por ejemplo, si recibe
república argentina debe devolver República Argentina.
• Las palabras que comiencen con la letra A. Por ejemplo, si recibe Antes de ayer debe devolver
Antes ayer.
Solución
#!/usr/bin/env python
cad=input("Cadena:")
# La primera letra de cada palabra. Por ejemplo, si recibe Universal Serial Bus
lista=cad.split(" ")
print (palabra[0],end="")
print()
# Dicha cadena con la primera letra de cada palabra en mayúsculas. Por ejemplo, si
print()
# Las palabras que comiencen con la letra A. Por ejemplo, si recibe Antes de ayer
if palabra.startswith("a") or palabra.startswith("A"):
print (palabra,end=",")
print()
cad1=input("Cadena 1:")
cad2=input("Cadena 2:")
if cad1.find(cad2)>-1:
else:
scribir un programa python que dado una palabra diga si es un palíndromo. Un palídromo Un
palíndromo es una palabra, número o frase que se lee igual hacia adelante que hacia atrás. Ejemplo:
reconocer
Solución
#!/usr/bin/env python
cad1=input("Cadena:")
if cad1.lower()==cad1[::-1].lower():
print("palindromo")
else:
print("no palindromo")
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> byte2=bytes(range(10))
>>> byte2
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t'
>>> byte3
b'.\xf0\xf1\xf2'
BytearrayP
e
El tipo bytearrayres un tipo mutable de bytes.
m
Definición dea bytearray. Constructor bytearrayP
e
l
>>> ba1=bytearray()
r
>>> ba1 i
m
n
bytearray(b'') a
k
>>> ba2=bytearray(10) l
i
>>> ba2
n
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') k
>>> ba3=bytearray(range(10))
>>> ba3
bytearray(b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t')
>>> ba4=bytearray(b"hola")
>>> ba4
bytearray(b'hola')
>>> ba5
bytearray(b'.\xf0\xf1\xf2')
>>> byte[2]=b'g'm
a
Traceback (most recent call last):
l
File "<stdin>",
i line 1, in <module>
n object does not support item assignment
TypeError: 'bytes'
k
>>> ba1=bytearray(b'hola')
>>> ba1[2]=123
>>> ba1
bytearray(b'ho{a')
>>> ba1
bytearray(b'ho{')
byte1.translate k
bytearray1.rstrip
bytearray1.split
bytearray1.splitlines
bytearray1.startswith
bytearray1.strip
bytearray1.swapcase
bytearray1.title
bytearray1.translate
bytearray1.upper
bytearray1.zfill
Si nos fijamos la mayoría de los métodos en el caso de los bytes son los de las cadenas de caracteres,
y en los bytearray encontramos también métodos propios de las listas.
>>> byte1=bytes('piña',"utf-8") k
>>> byte1
b'pi\xc3\xb1a'
>>> len(byte1)
>>> byte1=bytes('piña',"latin1")
>>> byte1
b'pi\xf1a'
Podemos también convertir una cadena unicode a bytes utilizando el método encode:
>>> cad="piña"
>>> byte1=cad.encode("utf-8")
>>> byte1
b'pi\xc3\xb1a'
Para hacer la función inversa, convertir de bytes a unicode utilizamos el método decode:
>>> byte1.decode("utf-8")
'piña'
El problema lo tenemos si hemos codificado utilizando un código e intentamos decodificar usando otro.
>>> byte1=bytes('piña',"latin1")
>>> byte1.decode("utf-8")
continuation byte
>>> byte1.decode("utf-8","ignore")
'pia'
>>> byte1.decode("utf-8","replace")
'pi�a'a'
>>> set3={1,2,3}
>>> set3
{1, 2, 3}
FrozensetP
e
El tipo frozensetres un tipo inmutable de conjuntos.
m
Definición dea frozenset. Constructor frozensetP
e
l
>>> fs1=frozenset()
r
>>> fs1 i
m
n
frozenset() a
k
>>> fs2=frozenset([1,1,2,2,3,3]) l
i
>>> fs2
n
frozenset({1, 2, 3}) k
{1, 2, 3, 4}
>>> set1.remove(2)
>>> set1
{1, 3, 4}
El tipo frozenset es inmutable por lo tanto no posee los métodos add y remove.
set1.clear m
set1.issuperset
a
set1.copy set1.pop
l
set1.difference set1.remove i
set1.difference_update n
set1.symmetric_difference
set1.discard k
set1.symmetric_difference_update
set1.intersection set1.union
set1.intersection_update set1.update
set1.isdisjoint
>>> set2={2,3,4}
>>> set1.difference(set2)
{1}
>>> set1.difference_update(set2)
>>> set1
{1}
>>> set1.symmetric_difference(set2)
{1, 4}
>>> set1.symmetric_difference_update(set2)
>>> set1
{1, 4}
>>> set1.intersection(set2)
{2, 3}
>>> set1.intersection_update(set2)
>>> set1
{2, 3}
>>> set1.union(set2)
{1, 2, 3, 4}
>>> set1.update(set2)
>>> set1
{1, 2, 3, 4}
>>> set1.add(1)
>>> set1.add(2)
>>> set1
{1, 2}
>>> set1.discard(3)
>>> set1.remove(3)
KeyError: 3
>>> set1.pop()
>>> set1
{2}
>>> set1.isdisjoint(set2)
False
>>> set1.issubset(set2)
True
>>> set1.issuperset(set2)
False
>>> set2.issuperset(set1)
True
fset1.intersection fset1.issuperset
>>> next(iter1)
StopIteration
La función reversed() devuelve un iterador con los elementos invertidos, desde el último al
primero.
>>> iter2 = reversed([1,2,3])
>>> next(iter2)
>>> next(iter2)
>>> next(iter2)
>>> next(iter2)
StopIteration
El módulo itertoolsP
e
r
El módulo itertools contiene distintas funciones que nos devuelven iteradores.
Veamos algunos ejemplos: m
count(): Devuelve un iterador infinito. a
>>> from itertools import count l
>>> next(counter)
14
>>> next(colors)
'red'
>>> next(colors)
'white'
>>> next(colors)
'blue'
>>> next(colors)
'red'
... print(x)
white
blue
red
white
GeneradoresP
e
r
Un generador es un tipo concreto de iterador. Es una función que permite obtener sus resultados paso a
m función que cada vez que la llamemos nos de el próximo número par.
paso. Por ejemplo, hacer una
a generadores:
Tenemos dos maneras de crear
1. Realizar una funciónl que devuelva los valores con la palabra reservada yield. Lo veremos con
profundidad cuandoi estudiemos las funciones.
n de las “list comprehension”. Por ejemplo:
2. Utilizando la sintaxis
>>> iter1 = (x kfor x in range(10) if x % 2==0)
>>> next(iter1)
>>> next(iter1)
>>> next(iter1)
Si tenemos un diccionario vacío, al ser un objeto mutable, también podemos construir el diccionario de
la siguiente manera.
>>> dict1 = {}
>>> dict1["one"]=1
>>> dict1["two"]=2
>>> dict1["three"]=3
>>> a["one"]+=1
>>> a
>>> a
{'three': 3, 'two': 2}
True
'three'
P
Los diccionarios son tipos mutablese
r
m podemos encontrar
Los diccionarios, al igual que las litas, son tipos de datos mutable. Por lo tanto
situaciones similares a las que explicamos en su momentos con las listas. a
l
i
n
k
>>> a = dict(one=1, two=2, three=3)
>>> a["one"]=2
>>> del(a["three"])
>>> a
{'one': 2, 'two': 2}
>>> b = a
>>> del(a["one"])
>>> b
{'three': 3, 'two': 2}
>>> b = a.copy()
>>> a["one"]=1000
>>> b
>>> dict.fromkeys(["one","two","three"],100)
>>> dict1.update(dict2)
>>> dict1
>>> dict1.setdefault("four",4)
>>> dict1
>>> dict1.setdefault("one",-1)
>>> dict1
>>> dict1.get("one") m
a
1
l
>>> dict1.get("four")i
>>> n
dict1.get("four","no existe")
'no existe' k
>>> dict1.pop("one")
1
>>> dict1
{'two': 2, 'three': 3}
>>> dict1.pop("four")
KeyError: 'four'
'no existe'
>>> dict1.popitem()
('one', 1)
>>> dict1
{'two': 2, 'three': 3}
>>> dict1.items()
>>> dict1.keys()
>>> i
Recorrido de diccionariosP
e
Podemos recorrer las claves: r
>>> for clave in dict1.keys(): m
... print(clave) a
l
one
i
two n
three k
Podemos recorrer los valores:
>>> for valor in dict1.values():
... print(valor)
... print(clave,"->",valor)
one -> 1
two -> 2
three -> 3
Ejercicios de diccionarios
Escribe un programa que lea una cadena y devuelva un diccionario con la cantidad de apariciones de
cada palabra en la cadena. Por ejemplo, si recibe “Qué lindo día que hace hoy” debe devolver: ‘que’: 2,
‘lindo’: 1, ‘día’: 1, ‘hace’: 1, ‘hoy’: 1
Solución
#!/usr/bin/env python
dict = {}
frase = input("Frase:")
lista_palabras=frase.split(" ")
if palabra in dict:
dict[palabra]+=1
else:
dict[palabra]=1
print (campo,"->",valor)
Tenemos guardado en un diccionario los códigos morse corespondientes a cada caracter. Escribir un
programa que lea una palabra y la muestre usando el código morse.
Solución
#!/usr/bin/env pytho
codigo = {
palabra = input("Palabra:")
lista_codigos = []
if caracter.islower():
caracter=caracter.upper()
lista_codigos.append(codigo[caracter])
Continuar el programa: ahora nos pide un código morse donde cada letra esta separada por espacios y
nos da la cadena correspondiente.
Solución
morse=input("Morse:")
lista_morse=morse.split(" ")
palabra = ""
palabra=palabra+letra
print (palabra)
Suponga un diccionario que contiene como clave el nombre de una persona y como valor una lista con
todas sus “gustos”. Desarrolle un programa que agregue “gustos” a la persona:
• Si la persona no existe la agregue al diccionario con una lista que contiene un solo elemento.
• Si la persona existe y el gusto existe en su lista, no tiene ningún efecto.
• Si la persona existe y el gusto no existe en su lista, agrega el gusto a la lista.
Se deja de pedir personas cuando introducimos el carácter “*”.
Solución
#!/usr/bin/env python
gustos={}
nombre = input("Nombre:")
while nombre!="*":
gusto=input("Gusto:")
lista_gustos=gustos.setdefault(nombre,[gusto])
if lista_gustos!=[gusto]:
gustos[nombre].append(gusto)
nombre = input("Nombre:")
print(gustos)