Notas Clase 03 PDF
Notas Clase 03 PDF
Notas Clase 03 PDF
Los objetos de tipo str se utilizan para representar caracteres. Los literales de tipo str se pueden escribir usando
comillas simples o dobles, por ejemplo, 'abc' o "abc". El literal '123' denota una cadena de tres caracteres, no el
número 123.
Intente escribir las siguientes expresiones en el intérprete de Python:
'a'
3*4
3*'a'
3+4
'a'+'a'
Se dice que el operador + está sobrecargado porque tiene diferentes significados dependiendo de los tipos de objetos
a los que se aplica. Por ejemplo, el operador + significa suma cuando se aplica a dos números y concatenación cuando
se aplica a dos cadenas. El operador * también está sobrecargado. Significa lo que se espera que signifique cuando sus
operandos son ambos números. Cuando se aplica a un int y a str, es un operador de repetición: la expresión n*s,
donde n es un int y s es un str, se evalúa como un str con n repeticiones de s. Por ejemplo, la expresión 2*'Juan'
tiene el valor 'JuanJuan'. Hay una lógica en esto. Así como la expresión matemática 3*2 es equivalente a 2+2+2, la
expresión 3*'a' es equivalente a 'a'+'a'+'a'.
Que exista el chequeo de tipos es algo bueno. Convierte errores por descuido (y a veces sutiles) en errores que detienen
la ejecución, en lugar de errores que llevan a los programas a comportarse de maneras misteriosas. El chequeo de tipos
en Python no es tan sólido como en otros lenguajes de programación (por ejemplo, Java), pero es mejor en Python 3
que en Python 2. Por ejemplo, está claro qué debe significar < cuando se usa para comparar dos cadenas o dos números.
Pero, ¿cuál debería ser el valor de '4' <3? De manera bastante arbitraria, los diseñadores de Python 2 decidieron que
debería ser False, porque todos los valores numéricos deberían ser menores que todos los valores de tipo str. Los
diseñadores de Python 3 y de la mayoría de los demás lenguajes modernos decidieron que, dado que tales expresiones
no tienen un significado obvio, deberían generar un mensaje de error.
Las cadenas son uno de varios tipos de secuencias en Python. Comparten las siguientes operaciones con todos los tipos
de secuencia.
La longitud de una cadena se puede encontrar usando la función len. Por ejemplo, el valor de len('abc') es
3.
La indexación se puede utilizar para extraer caracteres individuales de una cadena. En Python, toda la indexación
arranca en cero. Por ejemplo, escribir 'abc'[0] en el intérprete hará que muestre la cadena 'a'. Al escribir
'abc'[3] se producirá el mensaje de error IndexError: string index out of range (índice de cadena
fuera de rango). Dado que Python usa 0 para indicar el primer elemento de una cadena, se accede al último
elemento de una cadena de longitud 3 usando el índice 2. Los números negativos se usan para indexar desde el
final de una cadena. Por ejemplo, el valor de 'abc'[-1] es 'c'.
El seccionamiento se utiliza para extraer subcadenas de longitud arbitraria. Si s es una cadena, la expresión
s[inicio:fin] denota la subcadena de s que comienza en el índice inicio y termina en el índice fin-1.
Por ejemplo, 'abc'[1:3] se evalúa como 'bc'. ¿Por qué terminar en el índice fin-1 en lugar de fin? Para
que expresiones como 'abc'[0:len('abc')] tengan el valor esperado. Si se omite el valor antes de los dos
puntos, el valor predeterminado es 0. Si se omite el valor después de los dos puntos, el valor predeterminado
es la longitud de la cadena. En consecuencia, la expresión 'abc'[:] es semánticamente equivalente a la más
detallada 'abc'[0:len('abc')]. También es posible proporcionar un tercer argumento para seleccionar un
segmento no contiguo de una cadena. Por ejemplo, el valor de la expresión '123456789'[0:8:2] es la cadena
'1357'.
A menudo resulta conveniente convertir objetos de otros tipos en cadenas utilizando la función str. Consideremos, por
ejemplo, el código:
num = 30000000
fraccion = 1/2
print(num*fraccion, 'es el', fraccion*100, '%', 'de', num)
print(num*fraccion, 'es el', str(fraccion*100) + '%', 'de', num)
que imprime:
La primer sentencia print inserta un espacio entre 50 y % porque Python inserta automáticamente un espacio entre los
argumentos a print. La segunda sentencia print produce un resultado más apropiado al combinar 50 y % en un solo
argumento de tipo str. Las conversiones de tipos se utilizan con frecuencia en el código Python. Usamos el nombre
de un tipo para convertir valores a ese tipo. Entonces, por ejemplo, el valor de int('3')*4 es 12. Cuando un float
se convierte en un int, el número se trunca (no se redondea), por ejemplo, el valor de int(3.9) es 3 . Volviendo al
resultado de nuestras sentencias print, es posible que se pregunte acerca del .0 al final del primer número impreso.
Eso aparece porque 1/2 es un número de punto flotante y el producto de un int y un float es un float. Se puede
evitar convirtiendo num*fraccion en un int. El código:
produce el mismo resultado que la la sentencia print anterior. Si desea incluir una llave en la cadena indicada por
una cadena-f, utilice dos llaves. Por ejemplo, print(f'{{{3*5}}}') imprime {15}. La expresión dentro de una
cadena-f puede contener modificadores que controlan la apariencia de la cadena de salida. Estos modificadores están
separados de la expresión que indica el valor que se va a modificar mediante dos puntos. Por ejemplo, la cadena-f
f'{3.14159:.2f}' se evalúa como la cadena '3.14' porque el modificador .2f le indica a Python que trunque la
representación de cadena de un número de punto flotante a dos dígitos después del punto decimal. Y la sentencia:
imprime 15,000,000 es el 50.0 % de 30,000,000 porque el modificador le indica a Python que utilice comas
como separadores de miles. Introduciremos otros modificadores según sea conveniente más adelante.
2.3.1 Entrada
Python 3 tiene una función, input, que se puede utilizar para obtener información directamente de un usuario. La
función input toma una cadena como argumento y la muestra como un mensaje en el shell. Luego, la función espera
a que el usuario escriba algo y presione la tecla Intro. La línea escrita por el usuario se trata como una cadena y
se convierte en el valor devuelto por la función. Ejecutando el código nombre = input('Ingrese su nombre:
') mostrará la línea Ingrese su nombre: en la ventana de la consola. Si luego escribe Lionel Messi y presiona
Intro, se asignará la cadena 'Lionel Messi' a la variable nombre. Si luego ejecuta print('¿De verdad eres',
nombre, '?'), la línea:
se mostraría. Observe que la función print introduce un espacio antes del «?». Lo hace porque cuando a print se le
dan múltiples argumentos, coloca un espacio entre los valores asociados con los argumentos. El espacio podría evitarse
ejecutando print('¿De verdad eres ' + nombre + '?') o print(f'¿De verdad eres {nombre}?'), cada
uno de los cuales genera una cadena y pasa esa cadena como único argumento a print. Ahora considere el código:
<class 'str'>
porque input siempre devuelve un objeto de tipo str, incluso si el usuario ha ingresado algo que parece un número
entero. Por ejemplo, si el usuario hubiera ingresado 3, n estaría vinculado a la cadena '3' y no al entero 3. Luego, el
valor de la expresión n*4 sería '3333' en lugar de 12. La buena noticia es que siempre que una cadena es un literal
válido de algún tipo, se le puede aplicar una conversión de tipo.
Mencionamos que la mayoría de las tareas computacionales no se pueden realizar usando programas ramificados.
Considere, por ejemplo, escribir un programa que solicite el número de cruces X a imprimir en la pantalla. Podrías
pensar en escribir algo como:
Pero rápidamente se haría evidente que necesitarías tantos condicionales como números enteros positivos existen, y
hay un número infinito de ellos.
Cuando queremos que un programa haga lo mismo muchas veces, podemos usar la iteración. En la Figura Diagrama
de flujo para la iteración se muestra un mecanismo de iteración genérico (también llamado bucle). Como en una
declaración condicional, comienza con una prueba. Si la prueba se evalúa como True, el programa ejecuta el cuerpo
del bucle una vez y luego vuelve a evaluar la prueba. Este proceso se repite hasta que la prueba se evalúa como False,
después de lo cual el control pasa al código que sigue a la declaración de iteración.
Podemos escribir el tipo de bucle que se muestra en la Figura Diagrama de flujo para la iteración usando una sentencia
while. Considere el código Calculando el cuadrado de forma complicada.
El código comienza vinculando la variable x al número entero 3. Luego procede a elevar al cuadrado x mediante la
suma repetitiva. La tabla Prueba de escritorio de un programa pequeño muestra el valor asociado con cada variable
cada vez que se llega a la prueba del inicio del bucle. Construimos la tabla simulando manualmente el código, es decir,
fingimos ser un intérprete de Python y ejecutamos el programa con lápiz y papel. Usar lápiz y papel puede parecer
extraño, pero es una excelente manera de comprender cómo se comporta un programa.
La cuarta vez que se llega a la condición de prueba, se evalúa como False y el flujo de control continúa con la sentencia
print que sigue al bucle. ¿Para qué valores de x terminará este programa? Hay tres casos a considerar: x == 0, x >
0 y x < 0.
Supongamos que x == 0. El valor inicial de num_iterations también será 0 y el cuerpo del bucle nunca se ejecutará.
Supongamos que x > 0. El valor inicial de num_iterations será menor que x y el cuerpo del bucle se ejecutará al
menos una vez. Cada vez que se ejecuta el cuerpo del bucle, el valor de num_iterations aumenta exactamente en 1.
Esto significa que dado que num_iterations comenzó con menos de x, después de un número finito de iteraciones del
bucle, num_iterations será igual a x. En este punto, la condición del bucle se evalúa a False y el control continúa
con el código que sigue a la sentencia while.
Supongamos que x < 0. Sucede algo muy malo. El control entrará en el bucle y cada iteración moverá
num_iterations más lejos de x en lugar de acercarse a él. Por lo tanto, el programa continuará ejecutando el bu-
cle para siempre (o hasta que ocurra algo malo, por ejemplo, un error de desbordamiento). ¿Cómo podríamos eliminar
este falla en el programa? Cambiar la prueba a num_iterations < abs(x) casi funciona. El ciclo termina, pero
imprime un valor negativo. Si la sentencia de asignación dentro del bucle también se cambia a ans = ans + abs(x),
el código funciona correctamente.