Sie sind auf Seite 1von 9

PART II

Types and Operations


CAPITULO 4

Presentación de los Tipos de Objetos Python

Este capítulo comienza nuestro recorrido por el lenguaje Python. En un sentido informal, en
Python hacemos cosas con cosas. Las "cosas" toman la forma de operaciones como suma y
concatenación, y las "cosas" se refieren a los objetos sobre los cuales realizamos esas
operaciones. En esta parte del libro, nuestro enfoque está en esas cosas, y en las cosas que
nuestros programas pueden hacer con ellas.

De manera más formal, en Python, los datos toman la forma de objetos - ya sean objetos
incorporados que Python proporciona, u objetos que creamos usando clases de Python o
herramientas de lenguaje externas como las bibliotecas de extensión C. Aunque esta definición
se reafirmará más adelante, los objetos son esencialmente sólo piezas de memoria, con valores
y conjuntos de operaciones asociadas. Como veremos, todo es un objeto en un script Python.
Incluso los números simples califican, con valores (por ejemplo, 99) y operaciones soportadas
(suma, resta, etc.).

Debido a que los objetos son también la noción más fundamental en la programación de Python,
comenzaremos este capítulo con un estudio de los tipos de objetos incorporados de Python. Los
capítulos siguientes proporcionan una segunda pasada que completa los detalles que pasaremos
por alto en esta encuesta. Aquí, nuestra meta es un breve recorrido para introducir lo básico.

La Jerarquía Conceptual de Python

Antes de llegar al código, primero vamos a establecer una imagen clara de cómo encaja este
capítulo en la imagen general de Python. Desde una perspectiva más concreta, los programas
de Python pueden descomponerse en módulos, sentencias, expresiones y objetos, como se
muestra a continuación:

1. Los programas se componen de módulos.

2. Los módulos contienen instrucciones.

3. Las expresiones contienen expresiones.

4. Las expresiones crean y procesan objetos.

1. Disculpe mi formalidad. Soy un informático.

La discusión de los módulos en el Capítulo 3 introdujo el nivel más alto de esta jerarquía. Los
capítulos de esta parte comienzan en la parte inferior, explorando tanto los objetos
incorporados como las expresiones que puedes codificar para usarlos.

Continuaremos con el estudio de las declaraciones en la siguiente parte del libro, aunque
encontraremos que existen en gran parte para manejar los objetos que encontraremos aquí.
Además, cuando lleguemos a las clases de la parte POO de este libro, descubriremos que nos
permiten definir nuevos tipos de objetos propios, tanto usando como emulando los tipos de
objetos que exploraremos aquí. Por todo esto, los objetos incorporados son un punto de
embarque obligatorio para todos los viajes de Python.

Las introducciones tradicionales a la programación a menudo enfatizan sus tres pilares de


secuencia ("Hacer esto, luego aquello"), selección ("Hacer esto si es cierto") y repetición ("Hacer
esto muchas veces"). Python tiene herramientas en las tres categorías, junto con algunas para
la definición de funciones y clases. Estos temas pueden ayudarle a organizar su pensamiento
desde el principio, pero son un poco artificiales y simplistas. Expresiones como las
comprensiones, por ejemplo, son tanto repetición como selección; algunos de estos términos
tienen otros significados en Python; y muchos conceptos posteriores no parecen encajar en este
molde en absoluto. En Python, el principio unificador más fuerte son los objetos, y lo que
podemos hacer con ellos.

Para ver por qué, siga leyendo.

¿Porque Utilizar Tipos Integrados?

Si ha utilizado lenguajes de bajo nivel como C o C++, sabe que gran parte de sus centros de
trabajo en la implementación de objetos —también conocidos como estructuras de datos—
representan los componentes en el dominio de su aplicación. Necesita diseñar estructuras de
memoria, gestionar la asignación de memoria, implementar rutinas de búsqueda y acceso, etc.
Estas tareas son tan tediosas (y propensas a errores) como suenan, y por lo general distraen de
los objetivos reales de su programa.

En los programas tradicionales de Python, la mayor parte de este tedioso trabajo desaparece.
Debido a que Python proporciona poderosos tipos de objetos como parte intrínseca del lenguaje,
normalmente no hay necesidad de codificar implementaciones de objetos antes de comenzar a
resolver problemas. De hecho, a menos que necesite un procesamiento especial que los tipos
incorporados no proporcionan, casi siempre es mejor usar un objeto incorporado en lugar de
implementar el suyo propio. He aquí algunas razones por las que:

• Los objetos incorporados hacen que los programas sean fáciles de escribir. Para tareas sencillas,
los tipos incorporados suelen ser todo lo que necesita para representar la estructura de los
dominios problemáticos. Debido a que usted obtiene herramientas poderosas como colecciones
(listas) y tablas de búsqueda (diccionarios) de forma gratuita, puede utilizarlas inmediatamente.
Puede hacer mucho trabajo con los tipos de objetos incorporados de Python por sí solos.

• Los objetos incorporados son componentes de las extensiones. Para tareas más complejas, es
posible que necesite proporcionar sus propios objetos utilizando clases Python o interfaces de
lenguaje C. Pero como verá en partes posteriores de este libro, los objetos implementados
manualmente a menudo se construyen sobre tipos incorporados como listas y diccionarios. Por
ejemplo, una estructura de datos de pila puede ser implementada como una clase que maneja
o personaliza una lista incorporada.

• Los objetos incorporados son a menudo más eficientes que las estructuras de datos
personalizadas. Los tipos incorporados de Python emplean algoritmos de estructura de datos ya
optimizados que se implementan en C para la velocidad. Aunque usted puede escribir tipos de
objetos similares por su cuenta, por lo general tendrá dificultades para obtener el nivel de
rendimiento que proporcionan los tipos de objetos incorporados.

• Los objetos incorporados son una parte estándar del lenguaje. De alguna manera, Python toma
prestado tanto de lenguajes que dependen de herramientas incorporadas (por ejemplo, LISP)
como de lenguajes que dependen del programador para proporcionar implementaciones de
herramientas o marcos de trabajo propios (por ejemplo, C++). Aunque puede implementar tipos
de objetos únicos en Python, no necesita hacerlo sólo para empezar. Además, debido a que los
módulos integrados de Python son estándar, siempre son los mismos; por otro lado, los
frameworks propietarios tienden a diferir de un sitio a otro.

En otras palabras, los tipos de objetos incorporados no sólo facilitan la programación, sino que
también son más potentes y eficientes que la mayoría de los que se pueden crear desde cero.
Independientemente de si implementa nuevos tipos de objetos, los objetos incorporados
forman el núcleo de cada programa Python.

Tipos de Datos Básicos de Python

La Tabla 4-1 muestra una vista previa de los tipos de objetos incorporados de Python y algunas
de las sintaxis utilizadas para codificar sus literales, es decir, las expresiones que generan estos
objetos. Algunos de estos tipos probablemente le resultarán familiares si ha utilizado otros
idiomas; por ejemplo, los números y las cadenas representan valores numéricos y textuales,
respectivamente, y los objetos de archivo proporcionan una interfaz para procesar archivos
reales almacenados en el equipo.

Para algunos lectores, sin embargo, los tipos de objetos en la Tabla 4-1 pueden ser más generales
y poderosos de lo que usted está acostumbrado. Por ejemplo, encontrará que las listas y los
diccionarios por sí solos son poderosas herramientas de representación de datos que evitan la
mayor parte del trabajo que realiza para dar soporte a las colecciones y a las búsquedas en
idiomas de nivel inferior. En resumen, las listas proporcionan colecciones ordenadas de otros
objetos, mientras que los diccionarios almacenan los objetos por clave; tanto las listas como los
diccionarios pueden anidarse, crecer y encogerse a petición, y pueden contener objetos de
cualquier tipo.

2. En este libro, el término literal significa simplemente una expresión cuya sintaxis genera un
objeto, a veces también llamado constante. Tenga en cuenta que el término "constante" no
implica objetos o variables que nunca puedan ser cambiados (es decir, este término no está
relacionado con el const de C++ o con el "inmutable" de Python —un tema explorado en la
sección "Inmutabilidad" en la página 101).

Table 4-1. Built-in objects preview


Object type

Numbers

Strings

Lists

Dictionaries

Tuples

Files

Sets

Other core types

Program unit types

Implementation-related types

Exampleliterals/creation

1234, 3.1415, 3+4j, 0b111, Decimal(), Fraction() 'spam', "Bob's", b'a\x01c', u'sp\xc4m'

[1, [2, 'three'], 4.5], list(range(10)) {'food': 'spam', 'taste': 'yum'}, dict(hours=10) (1, 'spam', 4, 'U'),
tuple('spam'), namedtuple open('eggs.txt'), open(r'C:\ham.bin', 'wb') set('abc'), {'a', 'b', 'c'}
Booleans, types, None

Functions, modules, classes(Part IV, Part V, Part VI)

Compiled code, stack tracebacks (Part IV, Part VII)

Como se muestran en la Tabla 4-1, las unidades de programa tales como funciones, módulos y
clases, que encontraremos en partes posteriores de este libro, también son objetos en Python;
se crean con sentencias y expresiones tales como def, class, import, y lambda y pueden ser
pasadas libremente a través de scripts, almacenadas dentro de otros objetos, y así
sucesivamente. Python también proporciona un conjunto de tipos relacionados con la
implementación, como los objetos de código compilado, que generalmente son de interés para
los creadores de herramientas más que para los desarrolladores de aplicaciones; los
exploraremos también en capítulos posteriores, aunque en menor profundidad debido a sus
funciones especializadas.

A pesar de su título, la Tabla 4-1 no está realmente completa, porque todo lo que procesamos
en los programas de Python es una especie de objeto. Por ejemplo, cuando realizamos la
correspondencia de patrones de texto en Python, creamos objetos de patrones, y cuando
realizamos scripts de red, usamos objetos de socket. Estos otros tipos de objetos se crean
generalmente importando y utilizando funciones de los módulos de biblioteca, por ejemplo, en
los módulos re y socket para patrones y socket, y tienen un comportamiento propio.

Usualmente llamamos a los otros tipos de objetos en la Tabla 4-1 tipos de datos centrales, sin
embargo, porque están efectivamente incorporados en el lenguaje Python, es decir, hay una
sintaxis de expresión específica para generar la mayoría de ellos. Por ejemplo, cuando se ejecuta
el siguiente código con caracteres rodeados de comillas:

>>> 'spam'

you are, technically speaking, running a literal expression that generates and returns a new
string object. There is specific Python language syntax to make this object. Simi- larly, an
expression wrapped in square brackets makes a list, one in curly braces makes a dictionary, and
so on. Even though, as we’ll see, there are no type declarations in Python, the syntax of the
expressions you run determines the types of objects you create and use. In fact, object-
generation expressions like those in Table 4-1 are generally where types originate in the Python
language.

estás, técnicamente hablando, ejecutando una expresión literal que genera y devuelve un nuevo
objeto de cadena. Hay una sintaxis específica del lenguaje Python para hacer este objeto. De
manera similar, una expresión envuelta entre corchetes hace una lista, una entre corchetes hace
un diccionario, y así sucesivamente. Aunque, como veremos, no hay declaraciones de tipo en
Python, la sintaxis de las expresiones que ejecute determina los tipos de objetos que cree y use.
De hecho, las expresiones de generación de objetos como las de la Tabla 4-1 son generalmente
de donde se originan los tipos en el lenguaje Python.
De igual importancia, una vez que se crea un objeto, se enlaza su conjunto de operaciones
durante todo el tiempo, se pueden realizar sólo operaciones de cadena en una cadena de texto
y listar operaciones en una lista. En términos formales, esto significa que Python es
mecanografiado dinámicamente, un modelo que realiza un seguimiento de los tipos
automáticamente en lugar de requerir código de declaración, pero también es fuertemente
mecanografiado, una restricción que significa que puede realizar en un objeto sólo operaciones
que son válidas para su tipo.

Estudiaremos cada uno de los tipos de objeto de la Tabla 4-1 en detalle en los próximos capítulos.
Antes de profundizar en los detalles, empecemos por echar un vistazo a los objetos centrales de
Python en acción. El resto de este capítulo proporciona una vista previa de las operaciones que
exploraremos más a fondo en los capítulos siguientes. No espere encontrar la historia completa
aquí; el objetivo de este capítulo es simplemente abrir su apetito e introducir algunas ideas clave.
Aún así, la mejor manera de empezar es empezar, así que vamos a saltar directamente a un
código real.

Numeros

Si ha programado o creado scripts en el pasado, algunos de los tipos de objetos de la Tabla 4-1
probablemente le resultarán familiares. Incluso si no lo ha hecho, los números son bastante
sencillos. El conjunto de objetos centrales de Python incluye los mas habituales: enteros que no
tienen parte fraccionaria, números de coma flotante que sí la tienen, y tipos más exóticos:
números complejos con partes imaginarias, decimales con precisión fija, racionales con
numerador y denominador, y conjuntos con todas las funciones. Los números incorporados son
suficientes para representar la mayoría de las cantidades numéricas, desde su edad hasta su
saldo bancario, pero hay más tipos disponibles como complementos de terceros.

Aunque ofrece algunas opciones más elegantes, los tipos de números básicos de Python son,
bueno, básicos. Los números en Python soportan las operaciones matemáticas normales. Por
ejemplo, el signo más (+) realiza la suma, una estrella (*) se utiliza para la multiplicación, y dos
estrellas (**) se utilizan para la exponenciación:

Observe el último resultado aquí: El tipo entero de Python 3.X proporciona automáticamente
precisión extra para números grandes como éste cuando es necesario (en 2.X, un tipo entero
largo separado maneja números demasiado grandes para el tipo entero normal de manera
similar). Puedes, por ejemplo, calcular 2 a la potencia 1,000,000 como un entero en Python, pero
probablemente no deberías intentar imprimir el resultado - con más de 300,000 dígitos, ¡puedes
estar esperando un rato!

This nested-call form works from inside out—first converting the ** result’s number to a string
of digits with the built-in str function, and then getting the length of the resulting string with len.
The end result is the number of digits. str and len work on many object types; more on both as
we move along.

On Pythons prior to 2.7 and 3.1, once you start experimenting with floating-point numbers,
you’re likely to stumble across something that may look a bit odd at first glance:
>>> 3.1415 * 2

6.2830000000000004

>>> print(3.1415 * 2)

6.283

# repr: as code (Pythons < 2.7 and 3.1) # str: user-friendly

The first result isn’t a bug; it’s a display issue. It turns out that there are two ways to print every
object in Python—with full precision (as in the first result shown here), and in a user-friendly
form (as in the second). Formally, the first form is known as an object’s as-code repr, and the
second is its user-friendly str. In older Pythons, the floating-point repr sometimes displays more
precision than you might expect. The difference can also matter when we step up to using
classes. For now, if something looks odd, try showing it with a print built-in function call
statement.

Mejor aún, actualice a Python 2.7 y a la última versión de 3.X, donde los números en coma
flotante se muestran de manera más inteligente, usualmente con menos dígitos extraños, ya
que este libro está basado en Python 2.7 y 3.3, esta es la forma de visualización que mostraré a
lo largo de este libro para los números en coma flotante:

>>> 3.1415 * 2

6.283

# repr: as code (Pythons >= 2.7 and 3.1)

Además de las expresiones, hay un puñado de módulos numéricos útiles que se envían con los
módulos Python, que son sólo paquetes de herramientas adicionales que importamos para usar:

>>> import math

>>> math.pi

3.141592653589793
>>> math.sqrt(85)

9.219544457292887

El módulo math contiene herramientas numéricas más avanzadas como funciones, mientras que
el módulo random realiza la generación de números aleatorios y selecciones aleatorias (aquí, a
partir de una lista de Python codificada entre corchetes, una colección ordenada de otros
objetos que se presentará más adelante en este capítulo):

>>> import random

>>> random.random()

0.7082048489415967

>>> random.choice([1, 2, 3, 4])

Python también incluye objetos numéricos más exóticos, como números complejos, de precisión
fija y racionales, así como conjuntos y booleanos, y el dominio de extensión de código abierto
de terceros tiene aún más (por ejemplo, matrices y vectores, y números de precisión extendida).
Aplazaremos la discusión de estos tipos hasta más adelante en este capítulo y libro.

Hasta ahora, hemos estado usando Python como una simple calculadora; para hacer mejor
justicia a sus tipos incorporados, vamos a explorar las cadenas.

Das könnte Ihnen auch gefallen