0% encontró este documento útil (0 votos)
470 vistas

Programar en Python

Manual de programación en Python

Cargado por

Freddy Ticona
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
470 vistas

Programar en Python

Manual de programación en Python

Cargado por

Freddy Ticona
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 71

Introducción a 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

¿Por qué elegir python?P


e
• Porque es fácil de aprender r
• Sintaxis muy limpia y sencilla m
• Hay que escribir menos a
• Obtienes resultados muy rápido l
• Puedes programar con distintos paradígmas: i
• Programación imperativa n
• Orientación a objetos k
• Programación funcional
• Puedes programas deistintos tipos de aplicaciones:
• Aplicaciones de escritorio
• Aplicaciones web
• Scripts
• Muchos usan Python (Google, Nokia, IBM). Es demandado.
• Gran cantidad de módulos, muchísimas funcionalidades.
• Una gran comunidad que apoya el proyecto.
• Viene preinstalado en la mayoría de sistemas
Python2 us Python3
• Presentación de la unidad

python 2.x y python 3.xP


e
La ultima versión 2.x fue la 2.7 de 2010, contandorcon soporte hasta el final de su vida útil. No está en
m la última versión 3.6 salió el 23 de diciembre de
desarrollo. La versión 3.x está bajo desarrollo activo,
a
2016. Las modificaciones que se han incluido en python 3.x en sintaxis y módulos claves han hecho
que no sea compatible con python 2.x. l
i
En el post: What’s New In Python 3.0 escrito por Guido van Rossum podemos encontrar los cambios
introducidos en la versión 3.x. En la documentación n podéis encontrar la página What’s New in
Python donde podéis estudiar las mejoras de cada kuna de las versión que van saliendo.

Entonces, ¿Qué versión debería utilizar?P


e
r vas a utilizar.
Te debes asegurar si las bibliotecas que vas a utilizar son compatibles con la versión que
El problema en los últimos años ha sido que no todas las librerías se habían exportadoma la versión 3.
En los últimos tiempo la versión 3 es suficientemente madura para se utilizada y muchos a de las
l exportados a la
librerías y software más utilizado ya está exportado. Puedes ver la lista de los paquetes
versión 3 en la página http://python3wos.appspot.com/. i
Si es totalmente necesario, porque la librería que necesito no está portada tendríamos nque usar la
k
versión 2, pero hay que tener en cuenta que python 2.x es un lenguaje antiguo con errores, por lo tanto
merece la pena hacer un esfuerzo y buscad alternativas para usar la versión 3. Si tienes código en la
antigua versión, también existen herramientas para realizar la portabilidad: Porting Python Code to 3.x.

Las principales difreencia entre python 2.x y 3.xP


e
r
Print es una función en python3P m
e
a
En python2: r
l
print "hola mundo" m
i
En python3: a
n
print ("Hola mundo") l
k
i
División de números enterosP n
e k
En python 2 al dividir enteros, siempre el resultado era un entero, en python3 el resultado es un número
r
real.
m
En python2:
a
>>> 4/3
l
1 i
n
k
En python3:
>>> 3/2

1.5

>>> num = 3/2

>>> type(num)

<class 'float'>

>>> num = 4/2

>>> type(num)

<class 'float'>

Las “cadenas” (strings) son Unicode de forma predeterminada


en python 3P
e
En python2 existe dos tipos diferenciados de cadenas: str (ascii) y unicode, en python 3 todas las
r
cadenas son unicodes.
m
En python2:
a
>>> cad = "piña"
l
>>> cad i
'pi\xc3\xb1a' n
k
En python3:
>>> cad = "piña"

>>> cad

'piña'

Generación de listas de númeroP


e
En python2 teníamos dos funciones parecidas: range que generaba una lista de números, y xrange que
r
era una función que devolvía un objeto de tipo xrange. La diferencia entre ambas era que utilizar esta
m
última era mucho más eficiente. E python3 sólo tenemos range que ha pasado a ser un tipo de datos.
a
En python2:
l
>>> range(1,10)
i
[1, 2, 3, 4, 5, 6, 7, 8, 9] n
>>> xrange(1,10) k
xrange(1, 10)

>>> type(xrange(1,10))

<type 'xrange'>

En pyton3:
>>> range(1,10)

range(1, 10)

>>> type(range(1,10))

<class 'range'>

Input es una cadena de texto en python 3P


e
En python 2 habían dos funciones para ingresar datos por un teclado raw_input() en que lo ingresado se
r
trataba como una cadena de texto e input() en lo que se ingresaba se evaluaba y se trataba por su tipo.
m
En python 3, se eliminó el input() de python 2 quedando el raw_input() como el nuevo input(). O sea el
a
input() de python 3 siempre devuelve una cadena de texto.
l
En python2:
i
>>> cad=raw_input()
n
123 k
>>> type(cad)

<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):

File "<stdin>", line 1, in <module>

TypeError: unorderable types: list() > str()


Instalación de python3
• Presentación de la unidad
La página principal para descargar las distintas versiones es:www.python.org/downloads/.

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.

IDE para pythonP


e
• Entornos de desarrollo parar python
m
a
Editores de texto l
para pythonP
e
i
• Editores de texto para python r
n m
k a
l
i
n
k
Mi primer programa en python3
• Presentación de la unidad
La documentación de este curso esta escrita usando la distribución GNU/Linux Debian Jessie. Algunas
particularidades pueden cambiar en otras versiones, distribuciones o sistemas operativos.

Uso del interpreteP


e
r
Al instalar python3 el ejecutable del interprete lo podemos encontrar en /usr/bin/python3. Este
directorio por defecto está en el PATH,mpor lo tanto lo podemos ejecutar directamente en el terminal.
a
Por lo tanto para entrar en el modo interactivo, donde podemos ejecutar instrucción por instrucción
interactivamente, ejecutamos: l
$ python3 i
Python 3.4.2 (default, Oct 8 2014, n 10:45:20)
k
[GCC 4.9.1] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>>

En el modo interactivo, la última expresión impresa es asignada a la variable _.


>>> 4 +3

>>> 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!!!

Ejecución de programas usando shebangP


e
r se indica el
Podemos ejecutar directamente el fichero utilizando en la primera línea el shebang, donde
ejecutable que vamos a utilizar. m
#!/usr/bin/python3 a
l de python:
También podemos usar el programa env para preguntar al sistema por la ruta el interprete
#!/usr/bin/env python i
n
Por supuesto tenemos que dar permisos de ejecución al fichero. k
$ chmod +x hola.py

$ ./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

as elif if orn yield

assert else import k


pass

break except in raise

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:

print('Es menor de edad')

# Cada bloque de instrucciones dentro de una estructura de control

# debe estar tabulada

if num >=0:

while num<10:

print (num)

num = num +1

# El punto y coma “;” se puede usar para separar varias sentencias

# en una misma línea, pero no se aconseja su uso.

edad = 15; print(edad)

# Cuando el bloque a sangrar sólo ocupa una línea ésta puede

# escribirse después de los dos puntos:

if azul: print('Cielo')

# La barra invertida “\” permite escribir una línea de

# código demasiado extensa en varias líneas:

if condicion1 and condicion2 and condicion3 and \

condicion4 and condicion5:

# Las expresiones entre paréntesis, llaves o corchetes pueden

# ocupar varias líneas:

dias = ['lunes', 'martes', 'miércoles', 'jueves',

'viernes', 'sábado', 'domingo']


Funciones predefinidasP
e
Tenemos una serie de funciones predefinidas
r en python3:
abs() dict() help() min() setattr()
m
all() dir() ahex() next() slice()

any() divmod() l id() object() sorted()


i
ascii() enumerate() input() oct()
n
staticmethod() k
bin() eval() int() open() str()

bool() exec() isinstance() ord() sum()

bytearray() filter() issubclass() pow() super()

bytes() float() iter() print() tuple()

callable() format() len() property() type()

chr() frozenset() list() range() vars()

classmethod() getattr() locals() repr() zip()

compile() globals() map() reversed()

__import__()

complex() hasattr() max() round()

delattr() hash() memoryview() set()

Todas estas funciones y algunos elmentos comunes del lenguaje están definidas
en el módulo builtins.

Algunos ejemplos de funcionesP


e
•La entrada y salida de información se hacen con la función print y la
r
función input: m
•Tenemos algunas funciones matemáticas
a como: abs, divmod, hex, max, min,
… l
•Hay funciones que trabajan con caracteres
i y
cadenas: ascii, chr, format, repr,…n
•Además tenemos funciones que creank o convierten a determinados tipos de
datos: int, float, str, bool, range, dict, list, …
Iremos estudianda cada una de las funciones en las unidades correspondientes.
P
Constantes predefinidase
r
En el módulo builtins se definen las siguientes constantes:
m
•True y False: Valores booleans
a
l
i
n
k
•None especifica que alguna variables u objeto no tiene asignado ningún
tipo.
Hay alguna constante más que veremos a los largo del curso si es necesario.

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

the tutorial on the Internet at http://docs.python.org/3.4/tutorial/.

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

return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type

"modules", "keywords", "symbols", or "topics". Each module also comes

with a one-line summary of what it does; to list the modules whose name

or summary contain a given string such as "spam", type "modules spam".

help>

O pidiendo ayuda de una termino determinado, por ejemplo:


>>> help(print)

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"

Con el carácter /, podemos escapar algunos caracteres, veamos algunos ejemplos:


\\ Backslash (\)

\' Single quote (')

\" Double quote (")

\a ASCII Bell (BEL)

\b ASCII Backspace (BS)

\f ASCII Formfeed (FF)

\n ASCII Linefeed (LF)

\r ASCII Carriage Return (CR)


\t ASCII Horizontal Tab (TAB)

\v ASCII Vertical Tab (VT)

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'>

>>> var = "hola"

>>> 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

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name 'a' is not defined

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

Trabajando con variables


• Presentación de la unidad
Como hemos indicado anteriormente las variables en python no se declaran, se determina su tipo en
tiempo de ejecución empleando una técnica que se lama tipado dinámico.

¿Qué es el tipado dinámico?P


e
r
En python cuando asignamos una variable, se crea una referencia (puntero) al objeto creado, en ese
m vez que asignamos de nuevo la variable
momento se determina el tipo de la variable. Por lo tanto cada
puede cambiar el tipo en tempo de ejecución. a
>>> var = 3 l
>>> type(var) i
n
<class 'int'>
k
>>> var = "hola"

>>> type(var)
<class 'str'>

Objetos inmutables y mutablesP


e
r
Objetos inmutablesP m
e
Python procura no consumir más memoria que la necesaria. Ciertos a objetos son inmutables, es decir,
r
no pueden modificar su valor. El número 2 es siempre el núumerol2. Es un objeto inmutable. Python
m
procura almacenar en memoria una sola vez cada valor inmutable.i Si dos o más variables contienen ese
a
valor, sus referencias apuntan a la misma zona de memoria. n
l
Ejemplo k
i
Para comprobar esto, vamos a utilizar la función id, que nos devuelve el identificador de la variable o
n
el objeto en memoria. k
Veamos el siguiente código:
>>> a = 5

Podemos comprobar que a hace referencia al objeto 5.


>>> id(5)

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"

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: 'str' object does not support item assignment

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.>>>

>>> print("Hola son las",6,"de la tarde")

Hola son las 6 de la tarde

>>> print("Hola son las "+str(6)+" de la tarde")

Hola son las 6 de la tarde

Formateando cadenas de caracteresP


e
r
Existe dos formas de indicar el formato de impresión de las cadenas. En la documentación encontramos
el estilo antiguo y el estilo nuevo. m
Ejemplos del estilo antiguo a
>>> print("%d %f %s" % (2.5,2.5,2.5)) l
2 2.500000 2.5 i
n
k
>>> print("%s %o %x"%(bin(31),31,31))

0b11111 37 1f

>>> print("El producto %s cantidad=%d precio=%.2f"%("cesta",23,13.456))

El producto cesta cantidad=23 precio=13.46


Función format()P
e
r tenemos una función format y un método format en la
Para utilizar el nuevo estilo en python3
m
clase str. Vamos a ver algunos ejemplos utilizando la función format, cuando estudiemos los
a
métodos de str lo estudiaremos con más detenimiento.
Ejemplos l
i
>>> print(format(31,"b"),format(31,"o"),format(31,"x"))

11111 37 1f
n
k

>>> print(format(2.345,".2f"))

2.35

Tipo de datos numéricos


• Presentación de la unidad
Python3 trabaja con tres tipos numéricos:
• Enteros (int): Representan todos los números enteros (positivos, negativos y 0), sin parte
decimal. En python3 este tipo no tiene limitación de espacio.
• Reales (float): Sirve para representar los números reales, tienen una parte decimal y otra
decimal. Normalmente se utiliza para su implementación un tipo double de C.
• Complejos (complex): Nos sirven para representar números complejos, con una parte real y otra
imaginaria.
Como hemos visto en la unidad anterior son tipos de datos inmutables.
Ejemplos
>>> entero = 7

>>> type(entero)

<class 'int'>

>>> real = 7.2

>>> type (real)

<class 'float'

>>> complejo = 1+2j

>>> 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

Funciones predefinidas que trabajan con


números:P
e
• r
abs(x): Devuelve al valor absoluto de un número.
• divmod(x,y): m Toma como parámetro dos números, y devuelve una tubla con dos valores, la
a y el módulo o resto de la división.
división entera,
• l
hex(x): Devuelve una cadena con la representación hexadecimal del número que recibe como
parámetro. i
• n
oct(x): Devuelve una cadena con la representación octal del número que recibe como
parámetro. k
• bin(x): Devuelve una cadena con la representación binaria del número que recibe como
parámetro.
• pow(x,y): Devuelve la potencia de la base x elevedao al exponete
y. Es similar al operador **`.
• round(x,[y]): Devuelve un número real (float) que es el redondeo del número recibido
como parámetro, podemos indicar un parámetro opcional que indica el número de decimales en
el redondeo.
Ejemplos
>>> abs(-7)

>>> divmod(7,2)

(3, 1)

>>> hex(255)

'0xff'

>>> oct(255)

'0o377'

>>> pow(2,3)

>>> round(7.567,1)
7.6

Operadores a nivel de bitP


e
• x | y: x OR y r
• x ^ y: x XOR y m
• x & y: a AND y a
• x << n: Desplazamiento a la izquierda n bits.l
• x >> n: Desplazamiento a la derecha n bits. i
n
• ~x: Devuelve los bits invertidos.
k

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")

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: invalid literal for int() with base 10: '123.3'

Tipo de datos booleanos


• Presentación de la unidad

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:")

print ("Hola %s" % nombre)

Calcular el perímetro y área de un rectángulo dada su base y su altura.


Solución
#!/usr/bin/env python

base=float(input("Dime la base:"))

altura=float(input("Dime la altura:"))

perimetro = 2*base + 2*altura

area = base * altura

print ("Resultado: Area=%.2f Perimetro=%.2f" % (area,perimetro))

Calcular el perímetro y área de un círculo dado su radio.


Solución
#!/usr/bin/env python

import math

radio=float(input("Dime el radio:"))

print ("Resultado: Area=%.2f Perimetro=%.2f" % (math.pi*radio**2,2*math.pi*radio))

Dados dos números, mostrar la suma, resta, división y multiplicación de ambos.


Solución
#!/usr/bin/env python

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

palabra=input("Dime una palabra:")

print ((palabra+" ")*1000)

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:"))

print ("Horas:%d - Minutos:%d" % (minutos/60,minutos%60))

Estructura de control: Alternativas


• Presentación de la unidad
Si al evaluar la expresión lógica obtenermos el resultado True ejecuta un bloque de instrucciones, en
otro caso ejecuta otro bloque.

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")

Expresión reducida del ifP


e
>>> lang="es" r
m
>>> saludo = 'HOLA' if lang=='es' else 'HI'
a
>>> saludo
l
'HOLA' i
n

Estructura de control: Repetitivas k

• 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:

print ("Hemos terminado")

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):

print ("%d * %d = %d" % (cont, numero, cont * numero))

cont += 1

Solución con for


#!/usr/bin/env python

numero = int(input("Número:"))

for cont in range(1,11):

print ("%2d * %d = %2d" % (cont, numero, cont * numero))

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

print("El resultado es %d" % fact)

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:

print("El número es menor")

else:

print("El número es mayor")

num=int(input("Número:"))

print ("Has acertado")

Programa que muestre la tabla de multiplicar de los números 1,2,3,4 y 5.


Solución
#!/usr/bin/env python

for numero in range(1,6):

for cont in range(1,11):

print ("%2d * %d = %2d" % (cont, numero, cont * numero))

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

for cont in range(2,num):

if num%cont==0:

primo=False

break

if primo:

print("Es primo")

else:

print("No es primo")

Tipo de datos secuencia


• Presentación de la unidad
Los tipos de datos secuencia me permiten guardar una sucesión de datos de diferentes tipos. Los tipos
de datos secuencias en python son:
• Las listas (list): Me permiten guardar un conjunto de datos que se pueden repetir y que
pueden ser de distintos tipos. Es un tipo mutable.
• Las tuplas (tuple): Sirven para los mismo que las listas, pero en este caso es un tipo
inmutable.
• Los rangos (range): Es un tipo de secuencias que nos permite crear secuencias de números. Es
un tipo inmutable y se suelen utilizar para realizar bucles.
• Las cadenas de caracteres (str): Me permiten guardar secuencias de caracteres. Es un tipo
inmutable.
• Las secuencias de bytes (byte): Me permite guardar valores binarios representados por
caracteres ASCII. Es un tipo inmutable.
• Las secuencias de bytes (bytearray): En este caso son iguales que las anteriores, pero son de
tipo mutables.
• Los conjuntos (set): Me permiten guardar conjuntos de datos, en los que no se existen
repeticiones. Es un tipo mutable.
• Los conjuntos (frozenset): Son igales que los anteriores, pero son tipos inmutables.
Características principales de las secuencias P
e
Vamos a ver distintos ejemplos partiendo de una lista, que es una secuencia mutable. r
lista = [1,2,3,4,5,6] m
• Las secuencias se pueden recorrer a
>>> for num in lista: l
i
... print(num,end="")
n
123456 k
• Operadores de pertenencia: Se puede comprobar si un elemento pertenece o no a una secuencia
con los operadores in y not in.
>>> 2 in lista

True

>>> 8 not in lista

True

• Concatenación: El operador + me permite unir datos de tipos secuenciales. No se pueden


concatenar secuencias de tipo range y de tipo conjunto.
>>> lista + [7,8,9]

[1, 2, 3, 4, 5, 6, 7, 8, 9]

• Repetición: El operador * me permite repetir un dato de un tipo secuencial. No se pueden


repetir secuencias de tipo range y de tipo conjunto.
>>> lista * 2

[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)

Además en los tipos mutables puedo realizar las siguientes operaciones:


• Puedo modificar un dato de la secuencia indicando su posición.
>>> lista[2]=99

>>> lista

[1, 2, 99, 4, 5, 6]

• Puedo modificar un subconjunto de elementos de la secuencia haciendo slice.


>>> lista[2:4]=[8,9,10]

>>> lista

[1, 2, 8, 9, 10, 5, 6]

• Puedo borrar un subconjunto de elementos con la instrucción del.


>>> del lista[5:]

>>> lista

[1, 2, 8, 9, 10]

• Puedo actualizar la secuencia con el operador *=


>>> lista*=2

>>> lista

[1, 2, 8, 9, 10, 1, 2, 8, 9, 10]

Tipo de datos secuencia: listas


• Presentación de la unidad
Las listas (list) me permiten guardar un conjunto de datos que se pueden repetir y que pueden ser de
distintos tipos. Es un tipo mutable.

Construcción de una listaP


e
Para crear una lista puedo usar varias formas: r
• Con los caracteres [ y ]: m
>>> lista1 = [] a
>>> lista2 = ["a",1,True] l
i
• Utilizando el constructor list, que toma como
n parámetro un dato de algún tipo secuencia.
>>> lista3 = list()
k
>>> lista4 = list("hola")

>>> lista4

['h', 'o', 'l', 'a']

Operaciones básicas con listasP


e
Como veíamos en el apartado “Tipo de datos secuencia” podemos r realizar las siguientes operaciones:
• Las secuencias se pueden recorrer. m
• Operadores de pertenencia: in y not in. a
• Concatenación: + l
• Repetición: * i
• Indexación: Cada elemento tiene un índice, empezamos ancontar por el elemento en el índice 0.
k que no existe obtenemos una
Si intento acceder a un índice que corresponda a un elemento
excepción IndexError.
>>> lista1[6]

Traceback (most recent call last):

File "<stdin>", line 1, in <module

IndexError: list index out of range

Se pueden utilizar índices negativos:


>>> lista[-1]

• Slice: Veamos como se puede utilizar


• lista[start:end] # Elementos desde la posición start hasta end-1
• lista[start:] # Elementos desde la posición start hasta el final
• lista[:end] # Elementos desde el principio hata la posición end-1
• lista[:] # Todos Los elementos
• lista[start:end:step] # Igual que el anterior pero dando step saltos.

Se pueden utilizar también índices negativos, por ejemplo: lista[::-1]

Funciones predefinidas que trabajan con listasP


e
>>> lista1 = [20,40,10,40,50] r
>>> len(lista1) m
a
5
l
>>> max(lista1) i
50 n
>>> min(lista1) k
10

>>> sum(lista1)

150

>>> sorted(lista1)

[10, 20, 30, 40, 50]

>>> sorted(lista1,reverse=True)

[50, 40, 30, 20, 10]

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))

[(0, 'Primavera'), (1, 'Verano'), (2, 'Otoño'), (3, 'Invierno')]

>>> list(enumerate(seasons, start=1))

[(1, 'Primavera'), (2, 'Verano'), (3, 'Otoño'), (4, 'Invierno')]

Las listas son mutablesP


e
r tipo de datos mutable. Eso tiene para nostros
Como hemos indicado anteriormente las listas es un
m resultados como se los que se muestran a
varias consecuencias, por ejemplo podemos obtener
continuación: a
>>> lista1 = [1,2,3] l
>>> lista1[2]=4 i
n
>>> lista1
k
[1, 2, 4]

>>> del lista1[2]

>>> lista1

[1, 2]

>>> lista1 = [1,2,3]

>>> lista2 = lista1

>>> 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

>>> lista2 = list(lista1)

>>> lista2 = lista1.copy()

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:

... for elem in fila:

... print(elem,end="")

... print()

123

456

789

Métodos principales de listas


• Presentación de la unidad
Cuando creamos una lista estamos creando un objeto de la clase list, que tiene definido un conjunto
de métodos:
lista.append lista.copy lista.extend lista.insert lista.remove

lista.sort
lista.clear lista.count lista.index lista.pop lista.reverse

Métodos de inserción: append, extend, insertP


e
>>> lista = [1,2,3] r
>>> lista.append(4) m
a
>>> lista
l
[1, 2, 3, 4] i
n
>>> lista2 = [5,6] k

>>> lista.extend(lista2)

>>> lista

[1, 2, 3, 4, 5, 6]

>>> lista.insert(1,100)

>>> lista

[1, 100, 2, 3, 4, 5, 6]

Métodos de eliminación: pop, removeP


e
>>> lista.pop() r
6 m
a
>>> lista
l
[1, 100, 2, 3, 4, 5] i
n
>>> lista.pop(1) k

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

['Hola', 'Que', 'Tal', 'hola', 'que', 'tal']

>>> lista=["hola","que","tal","Hola","Que","Tal"]

>>> lista.sort(key=str.lower)

>>> lista

['hola', 'Hola', 'que', 'Que', 'tal', 'Tal']

Métodos de búsqueda: count, indexP


e
>>> lista.count(5) r
1 m
a
l
>>> lista.append(5) i
>>> lista n
[5, 4, 2, 1, 5] k

>>> lista.index(5)

>>> lista.index(5,1)

4
>>> lista.index(5,1,4)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: 5 is not in list

Método de copia: copyP


e
>>> lista2 = lista1.copy() r
m
Ejercicios de listas a
Lee por teclado números y guardalo en una lista,l el proceso finaliza cuando metamos un número
i
negativo. Muestra el máximo de los números guardado en la lista, muestra los números pares.
Solución n
#!/usr/bin/env python k
num=int(input("Número:"))

lista=[]

while num>0:

lista.append(num)

num=int(input("Número:"))

print("Maáximo: %d" % max(lista))

for n in lista:

if n % 2 ==0:

print(n,end=" ")

print()

# con list comprehension

for n in [x for x in lista if x % 2 == 0]:

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

lista=['Di', 'buen', 'dia', 'a', 'papa']

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

lista=['Di', 'buen', 'dia', 'a', 'papa',"hola","papa","buen","dia"]

cadena=input("Cadena:")

if cadena in lista:

print("La cadena está en la lista")

else:

print("La cadena no está en la lista")

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")

Operaciones avanzadas con


secuencias
• Presentación de la unidad
Las funciones que vamos a estudiar en esta unidad nos acercan al paradigna de la programación
funcional que también nos ofrece python. La programación funcional es un paradigma de programación
declarativa basado en el uso de funciones matemáticas, en contraste con la programación imperativa,
que enfatiza los cambios de estado mediante la mutación de variables.

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]

>>> def sqr(x): returni x ** 2


n
>>> list(map(sqr, items))
k
[1, 4, 9, 16, 25]

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

>>> def par(x): return ix % 2==0


n
>>> list(filter(par,lista))
k

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

>>> lista = [1,2,3,4,5] i


n
>>> def add(x,y): return x + y
k
>>> reduce(add,lista)

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]]

[1, 8, 27, 64, 125]

>>> [x for x in range(10) if x % 2 == 0]

[0, 2, 4, 6, 8]

>>> [x + y for x in [1,2,3] for y in [4,5,6]]

[5, 6, 7, 6, 7, 8, 7, 8, 9]

Tipo de datos secuencia: Tuplas


Las tuplas (tuple): Sirven para los mismo que las listas (me permiten guardar un conjunto de datos
que se pueden repetir y que pueden ser de distintos tipos), pero en este caso es un tipo inmutable.

Construcción de una tuplaP


e
Para crear una lista puedo usar varias formas: r
• Con los caracteres ( y ): m
»> tupla1 = () »> tupla2 = (“a”,1,True) a
l
• Utilizando el constructor tuple, que toma como parámetro un dato de algún tipo secuencia.
>>> tupla3=tuple() i
>>> tuple4=tuple([1,2,3]) n
k

Empaquetado y desempaquetado de tuplasP


e
Si a una variable se le asigna una secuencia de valores separados por comas, el valor de esa rvariable
será la tupla formada por todos los valores asignados. m
>>> tuple = 1,2,3 a
>>> tuple l
i
(1, 2, 3)
n
Si se tiene una tupla de longitud k, se puede asignar la tupla a k variables distintas y en cadakvariable
quedará una de las componentes de la tupla.
>>> a,b,c=tuple

>>> 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.

Las tuplas son inmutablesP


e
>>> tupla = (1,2,3) r
>>> tupla[1]=5 m
a
Traceback (most recent call last):
l
File "<stdin>", line 1, in <module> i
n assignment
TypeError: 'tuple' object does not support item
k
Métodos principalesP
e
Métodos de búsqueda: count, index r
>>> tupla = (1,2,3,4,1,2,3) m
>>> tupla.count(1) a
l
2
i
n
>>> tupla.index(2) k
1

>>> tupla.index(2,2)

Tipo de datos secuencia: Rangos


Los rangos (range): Es un tipo de secuencias que nos permite crear secuencias de números. Es un tipo
inmutable y se suelen utilizar para realizar bucles.

Definición de un rango. Constructor rangeP


e
Al crear un rango (secuencia de números) obtenemos un objeto que es de la clase range:r
>>> rango = range(0,10,2) m
>>> type(rango) a
l
<class 'range'>
i
n
k
Veamos algunos ejemplos, convirtirndo el rango en lista para ver la secuencia:
>>> list(range(10))

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> list(range(1, 11))

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> list(range(0, 30, 5))

[0, 5, 10, 15, 20, 25]

>>> list(range(0, 10, 3))

[0, 3, 6, 9]

>>> list(range(0, -10, -1))

[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”.

Funciones chr() y ord()P


e
r que representa el código i.
• chr(i): Nos devuelve el carácter Unicode
>>> chr(97) m
'a' a
l
>>> chr(1004)
i
'Ϭ' n
k
• ord(c): recibe un carácter c y devuelve el código unicode correspondiente.
>>> ord("a")

97

>>> ord("Ϭ")

1004

Tipo de datos cadenas de caracteres


• Las cadenas de caracteres (str): Me permiten guardar secuencias de caracteres. Es un tipo
inmutable. Como hemos comentado las cadenas de caracteres en python3 están codificada con
Unicode.

Definición de cadenas. Constructor strP


e
Podemos definir una cadena de caracteres de distintas formas: r
>>> cad1 = "Hola" m
>>> cad2 = '¿Qué tal?' a
l
>>> cad3 = '''Hola,
i
que tal?''' n
También podemos crear cadenas con el constructor str a partir de otros tipos de kdatos.
>>> cad1=str(1)

>>> cad2=str(2.45)

>>> cad3=str([1,2,3])

Operaciones básicas con cadenas de caracteresP


e
Como veíamos en el apartado “Tipo de datos secuencia” podemos realizar las siguientes operaciones:r
• Las cadenas se pueden recorrer. m
• Operadores de pertenencia: in y not in. a
• Concatenación: + l
• Repetición: * i
• Indexación n
• Slice k

Entre las funciones definidas podemos usar: len, max, min, sorted.

Las cadenas son inmutablesP


e
>>> cad = "Hola que tal?" r
>>> cad[4]="." m
a
Traceback (most recent call last):
l
i
n
k
File "<stdin>", line 1, in <module>

TypeError: 'str' object does not support item assignment

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

Funciones repr, ascii, binP


e
r
• repr(objeto): Devuelve una cadena de caracteres que representa la información de un
objeto. m
>>> repr(range(10)) a
'range(0, 10)' l
i
>>> repr("piña")
n
"'piña'" k
La cadena devuelta por repr() debería ser aquella que, pasada a eval(), devuelve el mismo
objeto.
>>> type(eval(repr(range(10))))

<class 'range'>

• ascii(objeto): Devuelve también la representación en cadena de un objeto pero en este


caso muestra los caracteres con un código de escape . Por ejemplo en ascii (Latin1) la á se
presenta con \xe1.
>>> ascii("á")
"'\\xe1'"

>>> ascii("piña")

"'pi\\xf1a'"

• bin(numero): Devuelve una cadena de caracteres que corresponde a la representación


binaria del número recibido.
>>> bin(213)

'0b11010101'

Métodos principales de cadenas


Cuando creamos una cadena de caracteres estamos creando un objeto de la clase str, que tiene
definido un conjunto de métodos:
cadena.capitalize cadena.isalnum cadena.join cadena.rsplit

cadena.casefold cadena.isalpha cadena.ljust cadena.rstrip

cadena.center cadena.isdecimal cadena.lower cadena.split

cadena.count cadena.isdigit cadena.lstrip cadena.splitlines

cadena.encode cadena.isidentifier cadena.maketrans cadena.startswith

cadena.endswith cadena.islower cadena.partition cadena.strip

cadena.expandtabs cadena.isnumeric cadena.replace cadena.swapcase

cadena.find cadena.isprintable cadena.rfind cadena.title

cadena.format cadena.isspace cadena.rindex cadena.translate

cadena.format_map cadena.istitle cadena.rjust cadena.upper

cadena.index cadena.isupper cadena.rpartition cadena.zfill

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

>>> cad = "hola mundo"

>>> print(cad.upper())

HOLA MUNDO
>>> cad = "Hola Mundo"

>>> print(cad.swapcase())

hOLA mUNDO

>>> cad = "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

>>> num = 123

>>> 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'

>>> '{1} {0}'.format("a", "b")

'b a'

>>> 'Coordenadas: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-

115.81W')

'Coordenadas: 37.24N, -115.81W'

>>> '{0:b} {1:x} {2:.2f}'.format(123, 223,12.2345)

'1111011 df 12.23'

>>> '{:^10}'.format('test')

' test '

Otros métodos de sustituciónP


e
>>> buscar = "nombre apellido"
r
>>> reemplazar_por = "Juan Pérez" m
a
>>> print ("Estimado Sr. nombre apellido:".replace(buscar, reemplazar_por))

Estimado Sr. Juan Pérez: l


i
n
>>> cadena = " www.eugeniabahit.com k "

>>> print(cadena.strip())

www.eugeniabahit.com

>>> cadena="00000000123000000000"

>>> print(cadena.strip("0"))

123

De forma similar lstrip(["caracter"]) y rstrip(["caracter"]).

Métodos de unión y divisiónP


e
r (ID: ", ")"
>>> formato_numero_factura = ("Nº 0000-0", "-0000

>>> print("275".join(formato_numero_factura)) m
a
Nº 0000-0275-0000 (ID: 275)
l
i
n
k
>>> hora = "12:23"

>>> print(hora.rpartition(":"))

('12', ':', '23')

>>> print(hora.partition(":"))

('12', ':', '23')

>>> hora = "12:23:12"

>>> print(hora.partition(":"))

('12', ':', '23:12')

>>> print(hora.split(":"))

['12', '23', '12']

>>> print(hora.rpartition(":"))

('12:23', ':', '12')

>>> print(hora.rsplit(":",1))

['12:23', '12']

>>> texto = "Linea 1\nLinea 2\nLinea 3"

>>> print(texto.splitlines())

['Linea 1', 'Linea 2', 'Linea 3']

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

debe devolver USB.

lista=cad.split(" ")

for palabra in lista:

print (palabra[0],end="")

print()

# Dicha cadena con la primera letra de cada palabra en mayúsculas. Por ejemplo, si

recibe república argentina debe devolver República Argentina.

for palabra in lista:

print (palabra.capitalize(),end=" ")

print()

# Las palabras que comiencen con la letra A. Por ejemplo, si recibe Antes de ayer

debe devolver Antes ayer.

for palabra in lista:

if palabra.startswith("a") or palabra.startswith("A"):

print (palabra,end=",")

print()

Escribir funciones que dadas dos cadenas de caracteres:


• Indique si la segunda cadena es una subcadena de la primera. Por ejemplo, cadena es una
subcadena de subcadena.
• Devuelva la que sea anterior en orden alfabético. Por ejemplo, si recibe kde y gnome debe
devolver gnome.
Solución
#!/usr/bin/env python

cad1=input("Cadena 1:")

cad2=input("Cadena 2:")

if cad1.find(cad2)>-1:

print ("cad2 es subcadena de cad1")

else:

print ("cad2 no es subcadena de cad1")

print(cad1 if cad1<cad2 else cad2)

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")

Tipo de datos binarios: bytes,


bytearray
BytesP
e
r es una secuencia inmutable de bytes. Solo admiten caracteres ASCII. También se
El tipo bytes
m
pueden representar los bytes mediante números enteros cuyo valores deben cumplir 0 <= x < 256.
a
Definición l de bytes. Constructor bytesP
i e
Podemos definir un tipo bytes de distintas formas:
r
>>> byte1 n= b"Hola"
k m
>>> byte2 = b'¿Qué tal?' a
>>> byte3 = b'''Hola, l
que tal?'''
i
n
También podemos crear cadenas con el constructor bytes a partir
k de otros tipos de datos.
>>> byte1=bytes(10)
>>> byte1

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=bytes.fromhex('2Ef0 F1f2')

>>> 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.fromhex('2Ef0 F1f2')

>>> ba5

bytearray(b'.\xf0\xf1\xf2')

Operaciones básicas con bytes y bytearrayP


e
r
Como veíamos en el apartado “Tipo de datos secuencia” podemos realizar las siguientes operaciones:
• Recorrido m
• Operadores de pertenencia: in y not in. a
• Concatenación: + l
i
n
k
• Repetición: *
• Indexación
• Slice
Entre las funciones definidas podemos usar: len, max, min, sum, sorted.

Los bytes son inmutables, los bytearray son


mutablesP
e
>>> byte=b"hola"r

>>> 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')

>>> del ba1[3]

>>> ba1

bytearray(b'ho{')

Métodos de bytes y bytearrayP


e
byte1.capitalize byte1.index byte1.join r byte1.rindex byte1.strip

byte1.center byte1.isalnum byte1.ljust m byte1.rjust


a
byte1.swapcase
l
byte1.count byte1.isalpha byte1.lower i byte1.rpartition byte1.title

byte1.decode byte1.isdigit byte1.lstrip n byte1.rsplit

byte1.translate k

byte1.endswith byte1.islower byte1.maketrans byte1.rstrip byte1.upper

byte1.expandtabs byte1.isspace byte1.partition byte1.split byte1.zfill

byte1.find byte1.istitle byte1.replace byte1.splitlines

byte1.fromhex byte1.isupper byte1.rfind byte1.startswith


bytearray1.append bytearray1.index bytearray1.lstrip

bytearray1.rstrip

bytearray1.capitalize bytearray1.insert bytearray1.maketrans

bytearray1.split

bytearray1.center bytearray1.isalnum bytearray1.partition

bytearray1.splitlines

bytearray1.clear bytearray1.isalpha bytearray1.pop

bytearray1.startswith

bytearray1.copy bytearray1.isdigit bytearray1.remove

bytearray1.strip

bytearray1.count bytearray1.islower bytearray1.replace

bytearray1.swapcase

bytearray1.decode bytearray1.isspace bytearray1.reverse

bytearray1.title

bytearray1.endswith bytearray1.istitle bytearray1.rfind

bytearray1.translate

bytearray1.expandtabs bytearray1.isupper bytearray1.rindex

bytearray1.upper

bytearray1.extend bytearray1.join bytearray1.rjust

bytearray1.zfill

bytearray1.find bytearray1.ljust bytearray1.rpartition

bytearray1.fromhex bytearray1.lower bytearray1.rsplit

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.

Métodos encode y decodeP


e
Los caracteres cuyo código es mayor que 256 no se pueden usar para representar los bytes, sin embargo
r
si podemos indicar una codificación de caracteres determinada para que ese carácter se convierte en un
m
conjunto de bytes.
a
>>> byte1=b'piña'
l
File "<stdin>", line 1 i
SyntaxError: bytes can only containn ASCII literal characters.

>>> 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")

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 2: invalid

continuation byte

>>> byte1.decode("utf-8","ignore")

'pia'

>>> byte1.decode("utf-8","replace")

'pi�a'a'

Tipo de datos conjuntos: set,


frozenset
setP
e
r
Los conjuntos (set): Me permiten guardar conjuntos (desornedos) de datos (a los que se puede
m
calcular una función hash), en los que no existen repeticiones. Es un tipo de datos mutable.
a
Normalmente se usan para comprobar si existe un elemento en el conjunto, eliminar duplicados y
l
cálculos matématicos, como la intersección, unión, diferencia,…
i
n
k
Definición de set. Constructor setP
e
Podemos definir un tipo set de distintas formas:
r
>>> set1 = set()
m
>>> set1 a
set() l
>>> set2=set([1,1,2,2,3,3])
i
n
>>> set2
k
{1, 2, 3}

>>> 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

Operaciones básicas con set y frozensetP


e
r
De las operaciones que estudiamos en el apartado “Tipo de datos secuencia” los conjuntos sólo aceptan
las siguientes: m
• Recorrido a
• Operadores de pertenencia: in y not in. l
i
Entre las funciones definidas podemos usar: len, max, min, sorted.
n
k
Los set sonP mutables, los frozenset son
inmutablese
r
>>> set1={1,2,3}
m
>>> set1.add(4) a
l
i
n
k
>>> set1

{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.

Métodos de set y frozensetP


e
set1.add r
set1.issubset

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

Veamos algunos métodos, partiendo siempre de estos dos conjuntos:


>>> set1={1,2,3}

>>> 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}

Veamos los métodos de añadir y eliminar elementos:


>>> set1 = set()

>>> set1.add(1)

>>> set1.add(2)

>>> set1

{1, 2}

>>> set1.discard(3)

>>> set1.remove(3)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

KeyError: 3

>>> set1.pop()

>>> set1

{2}

Y los métodos de comprobación:


>>> set1 = {1,2,3}

>>> set2 = {1,2,3,4}

>>> set1.isdisjoint(set2)

False

>>> set1.issubset(set2)

True

>>> set1.issuperset(set2)

False
>>> set2.issuperset(set1)

True

Por último los métodos de frozenset:


fset1.copy fset1.isdisjoint fset1.symmetric_difference

fset1.difference fset1.issubset fset1.union

fset1.intersection fset1.issuperset

Tipo de datos: iterador y generador


IteradorP
e
Un objeto iterabler es aquel que puede devolver un iterador. Normalmente las colecciones que hemos
m
estudiados son iterables. Un iterador me permite recorrer los elementos del objeto iterable.
a
Definición lde iterador. Constructor iterP
e
i
>>> iter1 = iter([1,2,3])
r
>>> type(iter1) n
m
k
<class 'list_iterator'> a
>>> iter2 = iter("hola") l
i
>>> type(iter2)
n
<class 'str_iterator'> k

Función next(), reversed()P


e
Para recorrer el iterador, utilizamos la función next():r
>>> next(iter1) m
1 a
l
>>> next(iter1)
i
2 n
>>> next(iter1) k
3

>>> next(iter1)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

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)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

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

>>> counter = count(start=13) i


n
>>> next(counter)
k
13

>>> next(counter)

14

cycle(): devuelve una secuencia infinita.


>>> from itertools import cycle

>>> colors = cycle(['red', 'white', 'blue'])

>>> next(colors)

'red'

>>> next(colors)

'white'

>>> next(colors)

'blue'

>>> next(colors)

'red'

islice(): Retorna un iterador finito.


>>> from itertools import islice

>>> limited = islice(colors, 0, 4)

>>> for x in limited:

... 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)

Tipo de datos mapa: diccionario


Los diccionarios son tipos de datos que nos permiten guardar valores, a los que se puede acceder por
medio de una clave. Son tipos de datos mutables y los campos no tienen asignado orden.

Definición de diccionarios. Constructor dictP


e
>>> a = dict(one=1, two=2, three=3) r
>>> b = {'one': 1, 'two': 2, 'three': 3} m
a
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
l
>>> d = dict([('two', 2), ('one', 1), ('three', 3)]) i
>>> e = dict({'three': 3, 'one': 1, 'two': 2}) n
>>> a == b == c == d == e k
True

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

Operaciones básicas con diccionariosP


e
>>> a = dict(one=1, two=2, three=3) r
• len(): Devuelve número de elementos del diccionario. m
>>> len(a) a
l
3
i
• Indexación: Podemos obtener el valor de un campo o cambiarlo (si no existe
n el campo nos da
una excepción KeyError): k
>>> a["one"]

>>> a["one"]+=1

>>> a

{'three': 3, 'one': 2, 'two': 2}

• del():Podemos eliminar un elemento, si no existe el campo nos da una


excepción KeyError:
>>> del(a["one"])

>>> a

{'three': 3, 'two': 2}

• Operadores de pertenencia: key in d y key not in d.


>>> "two" in a

True

• iter(): Nos devuelve un iterador de las claves.


>>> next(iter(a))

'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}

>>> a = dict(one=1, two=2, three=3)

>>> b = a

>>> del(a["one"])

>>> b

{'three': 3, 'two': 2}

En este caso para copiar diccionarios vamos a usar el método copy():


>>> a = dict(one=1, two=2, three=3)

>>> b = a.copy()

>>> a["one"]=1000

>>> b

{'three': 3, 'one': 1, 'two': 2}

Métodos principales de diccionarios


dict1.clear dict1.get dict1.pop dict1.update

dict1.copy dict1.items dict1.popitem dict1.values

dict1.fromkeys dict1.keys dict1.setdefault

Métodos de eliminación: clearP


e
>>> dict1 = dict(one=1, two=2, three=3) r
>>> dict1.clear() m
a
>>> dict1
l
{} i
n
Métodos de agregado y creación: k Pcopy,
dict.fromkeys, update, setdefaulte
r
>>> dict1 = dict(one=1, two=2, three=3) m
>>> dict2 = dict1.copy() a
l
i
n
k
>>> dict.fromkeys(["one","two","three"])

{'one': None, 'two': None, 'three': None}

>>> dict.fromkeys(["one","two","three"],100)

{'one': 100, 'two': 100, 'three': 100}

>>> dict1 = dict(one=1, two=2, three=3)

>>> dict2 = {'four':4,'five':5}

>>> dict1.update(dict2)

>>> dict1

{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}

>>> dict1 = dict(one=1, two=2, three=3)

>>> dict1.setdefault("four",4)

>>> dict1

{'one': 1, 'two': 2, 'three': 3, 'four': 4}

>>> dict1.setdefault("one",-1)

>>> dict1

{'one': 1, 'two': 2, 'three': 3, 'four': 4}

Métodos de retorno: get, pop, popitem, items,


keys, valuesP
e
>>> r two=2, three=3)
dict1 = dict(one=1,

>>> 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")

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

KeyError: 'four'

>>> dict1.pop("four","no existe")

'no existe'

>>> dict1 = dict(one=1, two=2, three=3)

>>> dict1.popitem()

('one', 1)

>>> dict1

{'two': 2, 'three': 3}

>>> dict1 = dict(one=1, two=2, three=3)

>>> dict1.items()

dict_items([('one', 1), ('two', 2), ('three', 3)])

>>> dict1.keys()

dict_keys(['one', 'two', 'three'])

El tipo de datos dictviewsP


e
r
Los tres últimos métodos devuelven un objeto de tipo dictviews.
m
Esto devuelve una vista dinámica del ciccionario, por ejemplo:
>>> dict1 = dict(one=1, two=2, three=3) a
>>> i = dict1.items() l
i
>>> i
n
dict_items([('one', 1), ('two', 2), ('three', k 3)])
>>> dict1["four"]=4

>>> i

dict_items([('one', 1), ('two', 2), ('three', 3), ('four', 4)])

Es este tipo de datos podemos usar las siguientes funciones:


• len(): Devuelve número de elementos de la vista.
• iter(): Nos devuelve un iterador de las claves, valores o ambas.
• x in dictview: Devuelve True si x está en las claves o valores.

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)

O podemos recorrer ambos:


>>> for clave,valor in dict1.items():

... 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(" ")

for palabra in lista_palabras:

if palabra in dict:

dict[palabra]+=1
else:

dict[palabra]=1

for campo,valor in dict.items():

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 = {

'A': '.-', 'B': '-...', 'C': '-.-.',

'D': '-..', 'E': '.', 'F': '..-.',

'G': '--.', 'H': '....', 'I': '..',

'J': '.---', 'K': '-.-', 'L': '.-..',

'M': '--', 'N': '-.', 'O': '---',

'P': '.--.', 'Q': '--.-', 'R': '.-.',

'S': '...', 'T': '-', 'U': '..-',

'V': '...-', 'W': '.--', 'X': '-..-',

'Y': '-.--', 'Z': '--..', '1': '.----',

'2': '..---', '3': '...--', '4': '....-',

'5': '.....', '6': '-....', '7': '--...',

'8': '---..', '9': '----.', '0': '-----',

'.': '.-.-.-', ',': '--..--', ':': '---...',

';': '-.-.-.', '?': '..--..', '!': '-.-.--',

'"': '.-..-.', "'": '.----.', '+': '.-.-.',

'-': '-....-', '/': '-..-.', '=': '-...-',

'_': '..--.-', '$': '...-..-', '@': '.--.-.',

'&': '.-...', '(': '-.--.', ')': '-.--.-'

palabra = input("Palabra:")

lista_codigos = []

for caracter in palabra:

if caracter.islower():
caracter=caracter.upper()

lista_codigos.append(codigo[caracter])

print (" ".join(lista_codigos))

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 = ""

for cod in lista_morse:

letra=[key for key,valor in codigo.items() if valor==cod][0]

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)

También podría gustarte