Sala de Aprendizaje Karinoya

Certificaciones · Laboratorio para aprobar Cloud / IA / Python

Tipos y cadenas en Python

Puedes leer las preguntas y explicaciones en Español. Las lecciones (artículos explicativos) solo están disponibles en japonés.

Ver la versión en japonés (con lecciones) →

Pregunta 1 | Libro de texto principal

¿Cuál es el libro de texto principal correcto para el Examen Básico de Ingeniero Certificado en Python 3?

  1. 『Pythonチュートリアル』(Tutorial de Python), publicado por O'Reilly Japan
  2. 『あたらしいデータ分析の教科書』(El nuevo libro de texto de análisis de datos), publicado por Shoeisha
  3. 『Pythonデータ分析 実践ハンドブック』(Manual práctico de análisis de datos con Python), publicado por Impress
  4. 『Python実践レシピ』(Recetas prácticas de Python), publicado por Gijutsu-Hyoronsha
RespuestaA. 『Pythonチュートリアル』(Tutorial de Python), publicado por O'Reilly Japan

El libro de texto principal (主教材) del examen básico (基礎試験) es 『Pythonチュートリアル』(Tutorial de Python), de O'Reilly Japan, y la página oficial indica que desde el 1 de septiembre de 2021 corresponde a la 4.ª edición. El temario del examen (出題範囲) también se publica con los números y títulos de los capítulos de este libro, por lo que la preparación consiste en cubrir el contenido del libro según el peso de cada capítulo. 『Python実践レシピ』(Recetas prácticas de Python), de Gijutsu-Hyoronsha, es el libro principal del examen práctico; 『Pythonによるあたらしいデータ分析の教科書』(El nuevo libro de texto de análisis de datos con Python), de Shoeisha, el del examen de análisis de datos; y 『Pythonデータ分析 実践ハンドブック』(Manual práctico de análisis de datos con Python), de Impress, el del examen práctico de análisis de datos. Todos ellos corresponden a otros exámenes organizados por la misma asociación. Si se confunden los libros, se acaba estudiando sin fin material que queda fuera del temario, así que conviene confirmarlo desde el principio.

Pregunta 2 | El capítulo con más preguntas

Según el temario del examen básico, ¿de qué capítulo del libro de texto principal salen más preguntas?

  1. Capítulo 5, «Estructuras de datos»
  2. Capítulo 4, «Más herramientas para control de flujo»
  3. Capítulo 3, «Una introducción informal a Python»
  4. Capítulo 8, «Errores y excepciones»
RespuestaB. Capítulo 4, «Más herramientas para control de flujo»

El capítulo con más preguntas es el capítulo 4, «Más herramientas para control de flujo» (制御構造ツール), al que se asignan 9 de las 40 preguntas. Le siguen el capítulo 5, «Estructuras de datos», con 7; el capítulo 3, «Una introducción informal a Python», con 6; y el capítulo 8, «Errores y excepciones», con 4. Solo los capítulos 3, 4 y 5 suman 22 preguntas, más de la mitad del total. Por eso es razonable dedicar más tiempo de estudio a estos tres capítulos; en particular, dejar para después el capítulo 4, que trata la sentencia for y la definición de funciones, puede ser difícil de recuperar.

Pregunta 3 | Distribución por capítulo

Según el temario del examen básico, ¿qué proporción ocupa el capítulo 4, «Más herramientas para control de flujo»?

  1. 17.5%
  2. 10.0%
  3. 22.5%
  4. 15.0%
RespuestaC. 22.5%

El capítulo 4, «Más herramientas para control de flujo», tiene 9 de las 40 preguntas, lo que equivale al 22.5 por ciento. Es el mayor por capítulo, seguido del capítulo 5, «Estructuras de datos», con 7 preguntas, el 17.5 por ciento. El 15.0 por ciento corresponde al capítulo 3, «Una introducción informal a Python», con 6 preguntas, y el 10.0 por ciento al capítulo 8, «Errores y excepciones», y al capítulo 10, «Pequeño paseo por la biblioteca estándar», con 4 preguntas cada uno. Este reparto se publica como parte del propio temario (出題範囲), no como una estadística operativa, así que puede usarse como base para un plan de estudio.

Pregunta 4 | La asignación del capítulo 13

Según el temario del examen básico, ¿cuántas preguntas se asignan al capítulo 13, «¿Y ahora qué?»?

  1. 0 preguntas
  2. 1 pregunta
  3. 4 preguntas
  4. 2 preguntas
RespuestaA. 0 preguntas

El capítulo 13, «¿Y ahora qué?», tiene 0 preguntas, por lo que es el único capítulo del temario del que no sale ninguna pregunta. Como su contenido orienta al lector sobre el siguiente paso, queda excluido de un examen que evalúa la gramática del lenguaje. Se asigna 1 pregunta a los capítulos 1, 2, 7, 11, 12 y 14; 2 preguntas a los capítulos 6 y 9; y 4 preguntas al capítulo 8, «Errores y excepciones», y al capítulo 10, «Pequeño paseo por la biblioteca estándar». Como todos los capítulos salvo el 13 tienen al menos 1 pregunta, conviene prepararse aunque sea repasando la terminología incluso en los capítulos con poca asignación.

Pregunta 5 | El sep de print

Al ejecutar el siguiente programa, ¿qué cadena se muestra en la pantalla?

print('Python', 3, 'exam', sep='/')
  1. Python3exam
  2. Python 3 exam
  3. Python/3/exam/
  4. Python/3/exam
RespuestaD. Python/3/exam

print() une los argumentos que recibe usando el argumento de palabra clave (キーワード引数) sep. El valor predeterminado de sep es un solo espacio de ancho medio (半角空白), así que, si no se especifica, el resultado es Python 3 exam; pero aquí se especifica sep='/', por lo que las partes se unen con barras y se obtiene Python/3/exam. Python3exam es la salida cuando sep es una cadena vacía. Se elige Python/3/exam/, con un separador también al final, si se piensa que sep se coloca después de cada elemento; en realidad solo se inserta entre argumentos. Lo que se coloca al final es end.

Pregunta 6 | El end de print

Al ejecutar las siguientes tres líneas en orden de arriba abajo, ¿qué aparece en la pantalla?

print('A', end='')print('B', end='')print('C')
  1. Se muestran AB y C en 2 líneas
  2. Se muestra ABC en una sola línea
  3. Se muestra A B C en una sola línea
  4. Se muestran A, B y C en 3 líneas
RespuestaB. Se muestra ABC en una sola línea

print() añade el argumento de palabra clave (キーワード引数) end al final de su salida. El valor predeterminado es un carácter de salto de línea (改行文字), así que, si no se especifica, se produce un salto de línea cada vez que se llama a print(). Aquí se usa end='' en las dos primeras para evitar el salto de línea, por lo que A y B se muestran seguidas, y la última print() añade el salto de línea predeterminado, de modo que ABC se muestra en una sola línea. A B C, con espacios intercalados, aparece cuando se pasan los tres como argumentos a una sola llamada a print(); la división en 3 líneas ocurre si nunca se especifica end; y la división en 2 líneas ocurre si se quita end='' de solo una de ellas.

Pregunta 7 | Salida con desempaquetado

¿Cuál es la salida del siguiente programa, que desempaqueta una lista para mostrarla?

nums = [10, 20, 30]print(*nums, sep=', ')
  1. Se muestra 10, 20, 30
  2. Se muestra 102030
  3. Se muestra [10, 20, 30]
  4. Se muestra 10 20 30
RespuestaA. Se muestra 10, 20, 30

print(*nums), con un asterisco, pasa cada elemento de la lista a print() como un argumento independiente. Así, los tres argumentos se unen con sep, y como sep=', ', el resultado es 10, 20, 30. Si se escribe print(nums) sin el asterisco, la lista se pasa como un único argumento, por lo que sale tal cual con corchetes: [10, 20, 30]. Si no se especifica sep, el espacio de ancho medio predeterminado da 10 20 30, y con sep='' sale todo junto como 102030.

Pregunta 8 | Marca de comentario

¿Cuál de las siguientes describe correctamente los comentarios de Python?

  1. El rango encerrado entre /* y */ se ignora como comentario
  2. Todo lo que va desde # hasta el final de la línea se ignora como comentario
  3. Todo lo que va desde -- hasta el final de la línea se ignora como comentario
  4. Todo lo que va desde // hasta el final de la línea se ignora como comentario
RespuestaB. Todo lo que va desde # hasta el final de la línea se ignora como comentario

Un comentario de Python se escribe con el signo de almohadilla (#), y todo lo que va desde ahí hasta el final de la línea se ignora. Si se coloca al principio de la línea, toda la línea se convierte en comentario; si se coloca a mitad de línea, lo es todo lo que sigue. No existe una sintaxis específica para abarcar varias líneas, así que se pone una almohadilla en cada línea. A veces se usa el estilo de encerrar el texto entre comillas triples como sustituto de un comentario de bloque, pero sintácticamente es un literal de cadena (文字列リテラル), y si se coloca al principio de una función o clase se conserva en tiempo de ejecución como docstring. La doble barra es el operador de división entera hacia abajo de Python, y el par barra-asterisco o el doble guion son sintaxis de comentario de otros lenguajes.

Pregunta 9 | Sangría

Al guardar el siguiente programa en un archivo y ejecutarlo, ¿qué ocurre?

if True:    print('one')        print('two')
  1. Solo se muestra two y termina el procesamiento
  2. Solo se muestra one y termina el procesamiento
  3. Se muestran one y two en este orden
  4. Se produce un IndentationError y se detiene
RespuestaD. Se produce un IndentationError y se detiene

Como Python representa los bloques mediante la profundidad de la sangría (インデント), las sentencias que pertenecen al mismo bloque deben tener el mismo ancho de sangría. Solo la tercera línea tiene más sangría, y la línea anterior no es una línea que inicie un nuevo bloque (una que termine en dos puntos), así que se produce IndentationError: unexpected indent. Esto se detecta durante el análisis sintáctico (構文解析) que tiene lugar antes de la ejecución, por lo que ni siquiera se ejecuta el print de la segunda línea y no llega a mostrarse ni siquiera one. No sangrar donde se requiere sangría da otro mensaje, expected an indented block, y que el ancho deje de coincidir a mitad de camino da unindent does not match any outer indentation level, pero ambos siguen siendo un IndentationError.

Pregunta 10 | Codificación de caracteres

¿Cuál es la descripción correcta sobre la codificación de caracteres de un archivo fuente de Python 3?

  1. Shift_JIS es la predeterminada y puede cambiarse con una declaración
  2. UTF-8 es la predeterminada y se puede escribir japonés tal cual
  3. EUC-JP es la predeterminada y se puede escribir japonés tal cual
  4. ASCII es la predeterminada y se necesita una declaración para incluir japonés
RespuestaB. UTF-8 es la predeterminada y se puede escribir japonés tal cual

Un archivo fuente de Python 3 se lee como UTF-8 de forma predeterminada, así que se puede escribir japonés tal cual tanto en los comentarios como en los literales de cadena. En Python 2, la codificación predeterminada era ASCII, y para incluir japonés había que escribir una declaración coding (coding 宣言) en la primera o la segunda línea del archivo, pero en Python 3 esa declaración dejó de ser necesaria. Solo hace falta escribirla cuando se quiere que lea un archivo guardado con una codificación de caracteres distinta de UTF-8. Cabe señalar que también se puede usar japonés en los identificadores (識別子; nombres de variables y de funciones), aunque no se recomienda por motivos de legibilidad.

Pregunta 11 | El tipo de la división

El siguiente programa realiza una división entre enteros y muestra un valor en la línea 1 y el nombre de su tipo en la línea 2. ¿Cuál es la combinación correcta?

print(9 / 3)print(type(9 / 3).__name__)
  1. El valor es 3.0 y el tipo es int
  2. El valor es 3.0 y el tipo es float
  3. El valor es 3 y el tipo es int
  4. El valor es 3 y el tipo es float
RespuestaB. El valor es 3.0 y el tipo es float

Una sola barra, /, es la división real (真の除算), y su resultado es siempre un float. Esto se cumple incluso cuando la división es exacta, así que 9 / 3 no es 3 sino 3.0, y su tipo también es float. Si se piensa que da int porque es un cálculo entre enteros, se eligen 3 e int; pero cuando se quiere un int hay que usar la división entera hacia abajo (床除算) y escribir 9 // 3, que da 3 e int. Las combinaciones en las que el aspecto del valor y su tipo no concuerdan, como 3 y float o 3.0 e int, no surgen de esta expresión.

Pregunta 12 | División entera hacia abajo de números negativos

¿Cuál es la salida del siguiente programa, que muestra varias divisiones enteras hacia abajo?

print(9 // 4)print(-9 // 4)
  1. La línea 1 es 2.0 y la línea 2 es -3.0
  2. La línea 1 es 2 y la línea 2 es -3
  3. La línea 1 es 2.25 y la línea 2 es -2.25
  4. La línea 1 es 2 y la línea 2 es -2
RespuestaB. La línea 1 es 2 y la línea 2 es -3

La doble barra, //, es la división entera hacia abajo (床除算): redondea el cociente hacia abajo, es decir, hacia el lado menor de la recta numérica. Como 9 / 4 es 2.25, 9 // 4 es 2; y como -9 / 4 es -2.25, -9 // 4 no da -2 sino -3. La clave es que no redondea hacia 0; se elige -2 si se piensa que trunca hacia 0 como hace C. 2.25 y -2.25 son los valores que se obtienen usando / en lugar de //, y 2.0 y -3.0 son los valores que se obtienen al mezclar un operando float y escribir 9.0 // 4; cuando ambos lados son int, el resultado también es int.

Pregunta 13 | divmod

¿Qué valor devuelve divmod(-11, 3)?

  1. (-4, 1)
  2. (-3, -2)
  3. (-4, -2)
  4. (-3, 2)
RespuestaA. (-4, 1)

divmod(a, b) devuelve la tupla (タプル) (a // b, a % b). Como // en Python redondea hacia abajo, -11 // 3 da -4, y como el signo del resto (剰余) coincide con el del operando derecho, -11 % 3 da 1. Por lo tanto, la respuesta es (-4, 1). Si se piensa en redondear hacia 0, se obtiene un cociente de -3 y un resto de -2, es decir, (-3, -2), pero Python no usa ese criterio. El cociente y el resto siempre mantienen la relación de que el divisor por el cociente más el resto es igual al valor original, así que se puede comprobar con 3 por -4 más 1, que da -11. Si se comprueba con esta relación, ni (-3, 2) ni (-4, -2) vuelven a -11.

Pregunta 14 | Truncamiento con int

¿Cuál es la salida del siguiente programa, que compara direcciones de truncamiento?

print(int(-2.7))print(-2.7 // 1)
  1. La línea 1 es -2 y la línea 2 es -2.0
  2. La línea 1 es -3 y la línea 2 es -3.0
  3. La línea 1 es -2 y la línea 2 es -3.0
  4. La línea 1 es -3 y la línea 2 es -2.0
RespuestaC. La línea 1 es -2 y la línea 2 es -3.0

La función integrada (組み込み関数) int() descarta la parte decimal y redondea hacia 0, así que int(-2.7) no da -3 sino -2. En cambio, // redondea hacia abajo, por lo que -2.7 // 1 va hacia -3, y como interviene un operando float, el resultado también es un float, -3.0. Con números positivos, tanto int(2.7) como 2.7 // 1 van hacia 2, así que la diferencia no se nota, pero con números negativos las direcciones se separan. Ninguno de los dos redondea al más cercano, así que, si se quiere convertir -2.7 en -3, se debe usar round(-2.7).

Pregunta 15 | Error en los números decimales

¿Cuál es la salida del siguiente programa, que muestra valores booleanos en dos líneas?

print(0.1 + 0.7 == 0.8)print(round(0.1 + 0.7, 2) == 0.8)
  1. La línea 1 es False y la línea 2 es False
  2. La línea 1 es True y la línea 2 es True
  3. La línea 1 es True y la línea 2 es False
  4. La línea 1 es False y la línea 2 es True
RespuestaD. La línea 1 es False y la línea 2 es True

Como float guarda los decimales en binario, valores que son sencillos en decimal, como 0.1 o 0.7, no pueden representarse con exactitud. De hecho, al mostrar 0.1 + 0.7 se obtiene 0.7999999999999999, que es ligeramente distinto de 0.8, así que la línea 1 es False. La línea 2 redondea a 2 decimales con round() antes de comparar, por lo que ambos lados quedan en 0.8 y el resultado es True. No es un defecto exclusivo de Python, sino una propiedad de la coma flotante binaria IEEE 754 (二進浮動小数点); por la misma razón 0.1 + 0.2 da 0.30000000000000004 y 1.1 + 2.2 da 3.3000000000000003. Evite las comparaciones de igualdad con float; en su lugar, compare después de redondear al número de dígitos necesario, compare el valor absoluto de la diferencia con una tolerancia o, en casos como el dinero, donde se requiere exactitud, use el módulo decimal.

Pregunta 16 | El redondeo de round

¿Cuál es la salida del siguiente programa, que muestra valores redondeados en una línea?

print(round(1.5), round(2.5), round(3.5))
  1. 2 2 4
  2. 2 3 4
  3. 1 3 3
  4. 1 2 3
RespuestaA. 2 2 4

round() de Python redondea al número par más cercano, lo que se conoce como redondeo bancario (銀行家の丸め). Solo en los valores que están exactamente a la mitad se desplaza al número par más cercano, así que 1.5 da 2, 2.5 da 2 y 3.5 da 4, y la salida es 2 2 4. El redondeo que se enseña en la escuela (四捨五入) daría 2 3 4, pero Python no usa ese método. 1 2 3 es el valor si simplemente se trunca la parte decimal, y 1 3 3 es el valor si se redondea hacia el lado impar; ninguno coincide con el comportamiento real. Tenga en cuenta que round() con el segundo argumento omitido devuelve un int, mientras que si se especifica el número de dígitos, como en round(2.5, 0), devuelve el float 2.0.

Pregunta 17 | bool es int

¿Cuál es la salida del siguiente programa, que trata valores booleanos como números?

print(True + True)print(isinstance(True, int))
  1. La línea 1 es True y la línea 2 es True
  2. La línea 1 es 2 y la línea 2 es False
  3. La línea 1 es 2 y la línea 2 es True
  4. La línea 1 es True y la línea 2 es False
RespuestaC. La línea 1 es 2 y la línea 2 es True

Como bool hereda (継承) de int, True puede usarse directamente en operaciones numéricas como el entero 1, y False como el entero 0. True + True es 1 más 1, que da 2, e isinstance(True, int) devuelve True. Se piensa que la línea 1 es True si se confunde + con el O lógico (論理和); el O lógico de Python es or, y True or True es True. issubclass(bool, int) también es True, y que sum([True, False, True]) dé 2 se debe a la misma razón. Esta propiedad se usa a menudo para contar cuántas condiciones se cumplieron.

Pregunta 18 | Precisión de los enteros

¿Cuál es la descripción correcta del tipo int de Python 3?

  1. No tiene límite superior en el número de dígitos y puede manejar valores tan grandes como permita la memoria
  2. Los valores que superan los 32 bits pueden desbordarse y volverse negativos
  3. Se lanza un OverflowError cuando el número de dígitos supera un límite superior
  4. Más allá de 64 bits se convierte automáticamente a float para el cálculo
RespuestaA. No tiene límite superior en el número de dígitos y puede manejar valores tan grandes como permita la memoria

El int de Python 3 tiene precisión arbitraria (任意精度), sin límite superior en el número de dígitos. 3 ** 40 se calcula exactamente como 12157665459056928801, que supera el rango de un valor de 64 bits con signo, pero su tipo sigue siendo int. También puede manejar un valor como 2 ** 1000, y al contar sus dígitos con len(str(2 ** 1000)) se obtienen 302 dígitos. Como no es un entero de longitud fija como los de C, nunca se desborda hacia un valor negativo ni cambia a float por su cuenta. OverflowError aparece, por ejemplo, al superar el rango que puede representar float; no se lanza solo porque crezca el número de dígitos de un int. Sin embargo, más dígitos sí implican más tiempo de cálculo y más memoria.

Pregunta 19 | Indexación de bytes

¿Cuáles son la línea 1 y la línea 2 de la salida del siguiente programa, que maneja una cadena de bytes?

b = 'abc'.encode()print(b[0])print(b[0:1])
  1. La línea 1 es b'a' y la línea 2 es b'a'
  2. La línea 1 es 97 y la línea 2 es b'a'
  3. La línea 1 es 97 y la línea 2 es 97
  4. La línea 1 es a y la línea 2 es b'a'
RespuestaB. La línea 1 es 97 y la línea 2 es b'a'

Al acceder a bytes con un índice (添字) entero, se devuelve como int el valor del byte en esa posición. El primer byte de b'abc', que es 'abc' codificado en UTF-8, es el punto de código (コードポイント) de 'a', así que es 97. En cambio, al tomar una rebanada se devuelve un objeto bytes de longitud 1, por lo que b[0:1] es b'a'. Con str, tanto s[0] como s[0:1] dan el mismo str, 'a', así que en este punto str y bytes contrastan. Que se muestre b'a' en lugar de a se debe a que print() muestra los bytes en forma repr; para convertirlo de nuevo en cadena, use b.decode().

Pregunta 20 | Base y caracteres

¿Cuál es la salida del siguiente programa, que muestra conversiones de base y de código de carácter?

print(int('1010', 2), bin(10), hex(255), ord('A'))
  1. 10 0b1010 0xff 65
  2. 10 0b1010 0xFF 65
  3. 10 0b1010 0xff 97
  4. 1010 0b1010 0xff 65
RespuestaA. 10 0b1010 0xff 65

El segundo argumento de int() es la base (基数), así que int('1010', 2) lee la cadena en base 2 y devuelve 10. Se piensa que sale 1010 sin cambios si se pasa por alto la base especificada. bin() devuelve una cadena con el prefijo 0b, '0b1010', y hex() devuelve una cadena en minúsculas con el prefijo 0x, '0xff'. Nunca se convierte en 0xFF en mayúsculas; cuando se quiere la notación en mayúsculas, se usa format(255, 'X'). ord() devuelve el punto de código (コードポイント) de un carácter, y el punto de código de la A mayúscula es 65. 97 es el punto de código de la a minúscula; la conversión inversa es chr(65), que devuelve 'A'.

Pregunta 21 | Rebanadas

¿Cuál es la salida del siguiente programa, que maneja rebanadas de cadenas?

s = 'Pythonic'print(s[2:5])print(s[-3:])
  1. La línea 1 es tho y la línea 2 es nic
  2. La línea 1 es tho y la línea 2 es ic
  3. La línea 1 es thon y la línea 2 es nic
  4. La línea 1 es yth y la línea 2 es nic
RespuestaA. La línea 1 es tho y la línea 2 es nic

s[2:5] toma los elementos desde el índice (添字) 2 hasta el índice 5, sin incluir este último. Como el índice 2 de 'Pythonic' es t, los tres caracteres t, h y o dan tho. Como la posición final no se incluye, no resulta thon. Si se lee el índice contando desde 1, como «desde el 2.º carácter», se elige yth, que corresponde a s[1:4]. s[-3:] usa un índice negativo, así que cuenta desde el final: toma el carácter n, el 3.º desde el final, como punto de inicio hasta el final, y da nic. Si se malinterpreta -3 como «hasta el 3.er carácter desde el final», se elige ic, que corresponde a s[-2:]. Recordar que los índices empiezan en 0 y que los índices negativos cuentan desde el final, siendo -1 el último, evita confusiones.

Pregunta 22 | Fuera de rango e in

¿Cuál es la salida del siguiente programa, que muestra dos resultados de comprobación?

s = 'Python'print(s[100:200] == '')print('py' in s)
  1. La línea 1 es True y la línea 2 es False
  2. La línea 1 es True y la línea 2 es True
  3. La línea 1 es False y la línea 2 es True
  4. La línea 1 es False y la línea 2 es False
RespuestaA. La línea 1 es True y la línea 2 es False

Una rebanada (スライス) no lanza una excepción aunque su rango supere la longitud de la cadena; solo devuelve la parte que se superpone. 'Python' tiene solo 6 caracteres, así que s[100:200] es una cadena vacía, y al compararla con una cadena vacía se obtiene True. Esto contrasta con un índice único, s[100], que lanzaría IndexError. En la línea 2, el operador in comprueba la presencia de una subcadena (部分文字列), pero distingue entre mayúsculas y minúsculas, así que 'py' en minúsculas no está contenida en 'Python' y da False. 'Py' o 'th' darían True.

Pregunta 23 | Las cadenas son inmutables

Al escribir el siguiente programa en un archivo y ejecutarlo, ¿qué ocurre?

s = 'abc's[0] = 'z'print(s)
  1. Se produce un TypeError y la asignación falla
  2. Se reemplaza por zbc y se muestra
  3. Se produce un IndexError y la asignación falla
  4. Se muestra sin cambios, como abc
RespuestaA. Se produce un TypeError y la asignación falla

str es inmutable (イミュータブル), es decir, su contenido no puede cambiarse después de crearlo, así que no se puede reescribir un solo carácter mediante un índice. s[0] = 'z' produce TypeError: 'str' object does not support item assignment, y la ejecución se detiene ahí, por lo que ni siquiera se ejecuta print. IndexError es lo que ocurre cuando un índice está fuera de rango, pero aquí 0 está dentro del rango válido, así que es otro caso. Cuando se quiere cambiar el contenido, se crea una cadena nueva y se vuelve a asignar, como en s = 'z' + s[1:]. Una lista es mutable, así que sí se puede reescribir un elemento de la misma manera.

Pregunta 24 | El valor de retorno de un método

¿Cuál es la salida del siguiente programa, que llama a métodos de cadena?

s = 'exam's.upper()print(s)print(s.replace('e', 'E'))
  1. La línea 1 es EXAM y la línea 2 es Exam
  2. La línea 1 es EXAM y la línea 2 es EXAM
  3. La línea 1 es exam y la línea 2 es exam
  4. La línea 1 es exam y la línea 2 es Exam
RespuestaD. La línea 1 es exam y la línea 2 es Exam

Un método de cadena no reescribe la cadena original, sino que crea y devuelve una cadena nueva. En la línea 2, s.upper() crea 'EXAM', pero como no se asigna a nada, ese valor se descarta y s sigue siendo 'exam'. Por eso print(s) muestra exam. La línea 4 muestra directamente el valor de retorno (戻り値) de s.replace('e', 'E'), así que sale Exam, pero esto tampoco cambia s. Para conservar el resultado, se vuelve a asignar, como en s = s.upper(). Esto contrasta con un método como sort() de las listas, que reordena en el mismo lugar y devuelve None.

Pregunta 25 | f-string

¿Cuál es la salida del siguiente programa, que muestra valores con un formato especificado?

n = 2.71828print(f'{n:.2f}')print(f'{"ok"!r}')
  1. La línea 1 es 2.71 y la línea 2 es 'ok'
  2. La línea 1 es 2.72 y la línea 2 es ok
  3. La línea 1 es 2.718 y la línea 2 es ok
  4. La línea 1 es 2.72 y la línea 2 es 'ok'
RespuestaD. La línea 1 es 2.72 y la línea 2 es 'ok'

El especificador de formato (書式指定) :.2f de una f-string redondea a 2 decimales para mostrar el valor, así que 2.71828 se convierte en 2.72. Como no es un truncamiento, no da 2.71, y 2.718 es el valor que se obtendría con :.3f. En la línea 2, !r es un especificador de conversión (変換指定) que muestra el valor en forma repr(). Usado con una cadena, añade comillas y da 'ok'; sin !r, solo sale ok. La sintaxis del especificador de formato es la misma que la de str.format(), así que escribir '{n:.2f}'.format(n=2.71828) da el mismo 2.72.

Pregunta 26 | split

¿Cuál es la salida del siguiente programa, que divide cadenas?

print('a b  c'.split())print('a,b,c'.split(',', 1))
  1. ['a', 'b', 'c'] y ['a', 'b', 'c']
  2. ['a', 'b', '', 'c'] y ['a', 'b,c']
  3. ['a', 'b', 'c'] y ['a', 'b,c']
  4. ['a', 'b', '', 'c'] y ['a', 'b', 'c']
RespuestaC. ['a', 'b', 'c'] y ['a', 'b,c']

Al llamar a split() sin argumentos, las secuencias de espacios en blanco consecutivos se tratan como un único separador y no se crean elementos vacíos. Así, 'a b c'.split() da la lista de 3 elementos ['a', 'b', 'c']. Si se especifica el separador explícitamente y se escribe 'a b c'.split(' '), se divide en cada espacio individual, por lo que queda una cadena vacía y se obtiene la lista de 4 elementos ['a', 'b', '', 'c']. El segundo argumento es maxsplit, que representa el límite superior del número de divisiones; si se pasa 1, solo se divide la primera vez y se obtiene ['a', 'b,c'], con el resto sin dividir como un solo elemento. Si se omite, se divide todo y se obtiene ['a', 'b', 'c'].

Pregunta 27 | strip

¿Cuál es la salida del siguiente programa, que quita caracteres de ambos extremos?

print('xxabxx'.strip('x'))print('xxabxx'.lstrip('x'))
  1. La línea 1 es abxx y la línea 2 es ab
  2. La línea 1 es ab y la línea 2 es abxx
  3. La línea 1 es xabx y la línea 2 es abxx
  4. La línea 1 es ab y la línea 2 es xxab
RespuestaB. La línea 1 es ab y la línea 2 es abxx

El argumento de strip() es «un conjunto de caracteres que se quitarán» (取り除く文字の集合), y sigue quitando caracteres de ambos extremos mientras pertenezcan a ese conjunto. No elimina una sola aparición de la subcadena 'x', así que 'xxabxx'.strip('x') quita todas las x de ambos extremos y da ab. Si se piensa que solo quita un carácter cada vez, se elige xabx. lstrip() actúa solo sobre el extremo izquierdo y da abxx, y rstrip() solo sobre el derecho y da xxab. Si se omite el argumento, se quitan los caracteres de espacio en blanco. Como se trata como un conjunto, escribir 'xxabxx'.strip('xa') quita las xx iniciales y también la a, y solo queda b.

Pregunta 28 | join y repetición

¿Cuál es la salida del siguiente programa, que une cadenas?

print('-'.join('abc'))print('ab' * 3)
  1. La línea 1 es -a-b-c- y la línea 2 es ababab
  2. La línea 1 es abc y la línea 2 es ababab
  3. La línea 1 es a-b-c y la línea 2 es ab ab ab
  4. La línea 1 es a-b-c y la línea 2 es ababab
RespuestaD. La línea 1 es a-b-c y la línea 2 es ababab

join() usa la cadena que lo llama como separador y une cada elemento del iterable (反復可能オブジェクト) que recibe. Una cadena también es un iterable del que se puede tomar un carácter cada vez, así que '-'.join('abc') une 'a', 'b' y 'c' con guiones y da a-b-c. El separador solo se inserta entre elementos, no antes ni después, así que no resulta -a-b-c-. Se obtiene abc, sin separador, si se escribe ''.join('abc'). El operador * repite una cadena un número especificado de veces, así que 'ab' * 3 da ababab, sin espacios intercalados. Si se quiere ab ab ab, se escribe ' '.join(['ab'] * 3).

Pregunta 29 | find e index

¿Cuál es la salida del siguiente programa, que busca una subcadena?

print('banana'.find('z'))print('banana'.index('n'))
  1. La línea 1 es -1 y la línea 2 es 2
  2. La línea 1 es -1 y la línea 2 es 3
  3. La línea 1 es -1 y la línea 2 es 4
  4. La línea 1 es 0 y la línea 2 es 2
RespuestaA. La línea 1 es -1 y la línea 2 es 2

find() devuelve -1 cuando no encuentra la subcadena (部分文字列), y no lanza ninguna excepción. No hay ninguna 'z' en 'banana', así que es -1. 0 es el valor cuando se encuentra justo al principio, así que tenga cuidado de no confundirlo con el caso en que no se encuentra. index() es igual que find() en que devuelve la posición donde se encontró; la primera aparición de 'n' en 'banana' está en el índice 2, así que es 2. Se obtiene 3 si se cuenta el índice desde 1 y se lee como «el 3.er carácter», y 4 es la posición de la última aparición, que se obtendría con rfind() o rindex(). La única diferencia entre ambos es lo que ocurre cuando no se encuentra: index() lanza ValueError: substring not found y detiene el procesamiento.

Pregunta 30 | Cadenas crudas

¿Cuál es la salida del siguiente programa, que cuenta caracteres?

print(len(r'a\nb'), len('a\nb'))
  1. 3 4
  2. 4 4
  3. 3 3
  4. 4 3
RespuestaD. 4 3

En una cadena cruda (raw文字列), que se crea poniendo r delante del literal, la barra invertida no se interpreta como el inicio de una secuencia de escape. r'a\nb' son los 4 caracteres a, barra invertida, n y b, así que su len es 4. En cambio, en la cadena ordinaria 'a\nb', \n se sustituye por un único carácter de salto de línea, así que son los 3 caracteres a, salto de línea y b, y su len es 3. Si se cuentan ambas como escapes se obtiene 3 3, y si se cuentan ambas como caracteres literales se obtiene 4 4, pero la clave es que la presencia de r cambia el tratamiento. Incluso con r, el tipo sigue siendo un str ordinario; no se convierte en un tipo especial. Tenga en cuenta que len('\\') es 1, ya que se necesitan dos barras invertidas para escribir un solo carácter de barra invertida literal.

Práctica: responda las preguntas de esta página

Es una herramienta de práctica con preguntas en orden aleatorio (funciona si JavaScript está activado). Aun sin ella, puede leer todas las preguntas y explicaciones de arriba.

* Las explicaciones son información con fines de estudio. El contenido y el sistema de los exámenes cambian cada año, así que consulta siempre los anuncios oficiales de la entidad organizadora.

Esta página es una traducción del texto original en japonés. Si hay diferencias entre la traducción y el original, prevalece la versión en japonés. Esta traducción se ha hecho con IA y puede contener errores. Informar de un error de traducción Ver el original en japonés