Sala de Estudos Karinoya

Qualificações · Laboratório de aprovação em Nuvem / IA / Python

Tipos e strings em Python

Você pode ler as perguntas e explicações em português. As aulas (artigos explicativos) estão disponíveis apenas em japonês.

Ver a versão em japonês (com aulas) →

Questão 1 | Material principal

Qual livro é o material principal correto para o Exame Básico de Certificação de Engenheiro Python 3?

  1. 『Pythonチュートリアル』(Tutorial Python), publicado pela O'Reilly Japan
  2. 『あたらしいデータ分析の教科書』(O novo livro didático de análise de dados), publicado pela Shoeisha
  3. 『Pythonデータ分析 実践ハンドブック』(Manual prático de análise de dados com Python), publicado pela Impress
  4. 『Python実践レシピ』(Receitas práticas de Python), publicado pela Gijutsu-Hyoronsha
RespostaA. 『Pythonチュートリアル』(Tutorial Python), publicado pela O'Reilly Japan

O material principal (主教材) do Exame Básico (基礎試験) é o 『Pythonチュートリアル』(Tutorial Python), da O'Reilly Japan, e a página oficial informa que ele corresponde à 4ª edição desde 1º de setembro de 2021. O escopo do exame também é publicado com os números e os títulos dos capítulos desse livro, por isso a preparação consiste em estudar o conteúdo do livro de acordo com o peso de cada capítulo. O 『Python実践レシピ』(Receitas práticas de Python), da Gijutsu-Hyoronsha, é o material principal do Exame Prático; o 『Pythonによるあたらしいデータ分析の教科書』(O novo livro didático de análise de dados com Python), da Shoeisha, é o do Exame de Análise de Dados; e o 『Pythonデータ分析 実践ハンドブック』(Manual prático de análise de dados com Python), da Impress, é o do Exame Prático de Análise de Dados — todos são de outros exames aplicados pela mesma associação. Confundir os materiais significa estudar sem fim conteúdos fora do escopo, por isso vale a pena confirmar isso logo no início.

Questão 2 | O capítulo com mais questões

No escopo do Exame Básico, de qual capítulo do material principal sai o maior número de questões?

  1. Capítulo 5, "Estruturas de dados"
  2. Capítulo 4, "Mais ferramentas de controle de fluxo"
  3. Capítulo 3, "Uma introdução informal ao Python"
  4. Capítulo 8, "Erros e exceções"
RespostaB. Capítulo 4, "Mais ferramentas de controle de fluxo"

O capítulo com mais questões é o Capítulo 4, "Mais ferramentas de controle de fluxo" (制御構造ツール), com 9 das 40 questões atribuídas a ele. Em seguida vêm o Capítulo 5, "Estruturas de dados", com 7, o Capítulo 3, "Uma introdução informal ao Python", com 6, e o Capítulo 8, "Erros e exceções", com 4. Só os Capítulos 3, 4 e 5 somam 22 questões, mais da metade do total. Por isso, é racional dedicar mais tempo de estudo a esses três capítulos e, em especial, deixar para depois o Capítulo 4, que trata do comando for e da definição de funções, pode ser difícil de recuperar.

Questão 3 | Distribuição por capítulo

No escopo do Exame Básico, que proporção ocupa o Capítulo 4, "Mais ferramentas de controle de fluxo"?

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

O Capítulo 4, "Mais ferramentas de controle de fluxo", tem 9 das 40 questões, o que corresponde a 22.5 por cento. É o maior entre os capítulos, seguido pelo Capítulo 5, "Estruturas de dados", com 7 questões, 17.5 por cento. 15.0 por cento corresponde ao Capítulo 3, "Uma introdução informal ao Python", com 6 questões, e 10.0 por cento corresponde ao Capítulo 8, "Erros e exceções", e ao Capítulo 10, "Um breve passeio pela biblioteca padrão", cada um com 4 questões. Essa distribuição é publicada como o próprio escopo do exame (出題範囲), e não como uma estatística operacional, por isso pode servir de base para um plano de estudos.

Questão 4 | A cota do Capítulo 13

No escopo do Exame Básico, quantas questões são atribuídas ao Capítulo 13, "E agora?"?

  1. 0 questões
  2. 1 questão
  3. 4 questões
  4. 2 questões
RespostaA. 0 questões

O Capítulo 13, "E agora?", tem 0 questões, sendo o único capítulo do escopo do exame (出題範囲) do qual não sai absolutamente nada. Como seu conteúdo orienta o próximo passo do leitor, ele fica fora do que é cobrado em um exame que avalia a gramática da linguagem. 1 questão é atribuída aos Capítulos 1, 2, 7, 11, 12 e 14; 2 questões aos Capítulos 6 e 9; e 4 questões ao Capítulo 8, "Erros e exceções", e ao Capítulo 10, "Um breve passeio pela biblioteca padrão". Como todos os capítulos, exceto o 13, têm pelo menos 1 questão, vale a pena se preparar ao menos passando os olhos pela terminologia, mesmo nos capítulos com poucas questões.

Questão 5 | O sep de print

Quando o programa a seguir é executado, qual string é exibida na tela?

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

print() une os argumentos que recebe usando o argumento nomeado (キーワード引数) sep. O padrão de sep é um único espaço de meia largura, então, sem especificá-lo, o resultado é Python 3 exam; mas aqui foi especificado sep='/', então as partes são unidas com barras, resultando em Python/3/exam. Python3exam é a saída quando sep é uma string vazia. Escolher Python/3/exam/, com um separador também no final, acontece quando se pensa que sep é colocado depois de cada elemento; na realidade, ele é inserido apenas entre os argumentos. O que vai no final é o end.

Questão 6 | O end de print

Quando as três linhas a seguir são executadas em ordem, de cima para baixo, o que aparece na tela?

print('A', end='')print('B', end='')print('C')
  1. AB e C são exibidos em 2 linhas
  2. ABC é exibido em uma única linha
  3. A B C é exibido em uma única linha
  4. A, B, C são exibidos em 3 linhas
RespostaB. ABC é exibido em uma única linha

print() acrescenta o argumento nomeado (キーワード引数) end ao final da sua saída. O padrão é um caractere de quebra de linha (改行文字), então, sem especificá-lo, uma quebra de linha é adicionada a cada chamada de print(). Aqui, end='' é usado nas duas primeiras chamadas, impedindo a quebra de linha, então A e B são exibidos colados, e o último print() acrescenta a quebra de linha padrão, de modo que ABC é exibido em uma única linha. A B C, com espaços inseridos, acontece quando se passam os três como argumentos de uma única chamada de print(); a divisão em 3 linhas acontece se end nunca for especificado; e a divisão em 2 linhas acontece se end='' for removido de apenas uma delas.

Questão 7 | Saída desempacotada

Qual é a saída do programa a seguir, que desempacota uma lista para exibi-la?

nums = [10, 20, 30]print(*nums, sep=', ')
  1. 10, 20, 30 é exibido
  2. 102030 é exibido
  3. [10, 20, 30] é exibido
  4. 10 20 30 é exibido
RespostaA. 10, 20, 30 é exibido

print(*nums), com um asterisco, passa cada elemento da lista para print() como um argumento separado. Assim, os três argumentos são unidos com sep e, como sep=', ', o resultado é 10, 20, 30. Escrever print(nums) sem o asterisco passa a lista como um único argumento, então ela sai como está, com colchetes: [10, 20, 30]. Sem especificar sep, o espaço de meia largura padrão dá 10 20 30, e com sep='' tudo sai junto, como 102030.

Questão 8 | Marcador de comentário

Qual das alternativas a seguir descreve corretamente os comentários em Python?

  1. O trecho entre /* e */ é ignorado como comentário
  2. Tudo de # até o fim da linha é ignorado como comentário
  3. Tudo de -- até o fim da linha é ignorado como comentário
  4. Tudo de // até o fim da linha é ignorado como comentário
RespostaB. Tudo de # até o fim da linha é ignorado como comentário

Um comentário em Python é escrito com o sinal de cerquilha (シャープ記号), e tudo dali até o fim da linha é ignorado. Se colocado no início de uma linha, a linha inteira vira comentário; se colocado no meio, tudo dali em diante. Não existe sintaxe própria para abranger várias linhas, então coloca-se uma cerquilha em cada linha. O estilo de envolver o texto em aspas triplas às vezes é usado como substituto de um comentário de bloco, mas sintaticamente isso é um literal de string e, se colocado no início de uma função ou classe, é mantido em tempo de execução como docstring. A barra dupla é o operador de divisão pelo piso do Python, e o par barra-asterisco ou o hífen duplo são sintaxes de comentário de outras linguagens.

Questão 9 | Indentação

Quando o programa a seguir é salvo em um arquivo e executado, o que acontece?

if True:    print('one')        print('two')
  1. Apenas two é exibido, e o processamento termina
  2. Apenas one é exibido, e o processamento termina
  3. one e two são exibidos nessa ordem
  4. Ocorre um IndentationError e a execução para
RespostaD. Ocorre um IndentationError e a execução para

Como o Python representa um bloco pela profundidade da indentação (インデント), os comandos que pertencem ao mesmo bloco precisam ter a mesma largura de recuo. Apenas a terceira linha está recuada mais profundamente, e a linha anterior não é uma linha que inicia um novo bloco (uma que termina com dois-pontos), então isso resulta em IndentationError: unexpected indent. Isso é detectado durante a análise sintática (構文解析), que acontece antes da execução, então nem o print da segunda linha é executado, e nem mesmo one é exibido. Deixar de indentar onde a indentação é obrigatória gera outra mensagem, expected an indented block, e a largura deixar de coincidir no meio do caminho gera unindent does not match any outer indentation level, mas ambos continuam sendo IndentationError.

Questão 10 | Codificação de caracteres

Qual é a descrição correta sobre a codificação de caracteres de um arquivo-fonte do Python 3?

  1. Shift_JIS é o padrão, e ele pode ser alterado com uma declaração
  2. UTF-8 é o padrão, e é possível escrever japonês diretamente
  3. EUC-JP é o padrão, e é possível escrever japonês diretamente
  4. ASCII é o padrão, e é necessária uma declaração para incluir japonês
RespostaB. UTF-8 é o padrão, e é possível escrever japonês diretamente

Um arquivo-fonte do Python 3 é lido como UTF-8 por padrão, então é possível escrever japonês diretamente tanto em comentários quanto em literais de string. No Python 2, o padrão era ASCII e, para incluir japonês, era preciso escrever uma declaração coding na primeira ou na segunda linha do arquivo, mas no Python 3 essa declaração deixou de ser necessária. Escrever a declaração só é necessário quando se quer que ele leia um arquivo salvo com uma codificação de caracteres (文字コード) diferente de UTF-8. Observe que também é possível usar japonês em identificadores (nomes de variáveis e de funções), embora isso não seja recomendado do ponto de vista da legibilidade.

Questão 11 | O tipo da divisão

O programa a seguir trata de uma divisão entre inteiros, exibindo um valor na linha 1 e o nome do seu tipo na linha 2. Qual é a combinação correta?

print(9 / 3)print(type(9 / 3).__name__)
  1. O valor é 3.0, e o tipo é int
  2. O valor é 3.0, e o tipo é float
  3. O valor é 3, e o tipo é int
  4. O valor é 3, e o tipo é float
RespostaB. O valor é 3.0, e o tipo é float

Uma única barra, /, é a divisão real (真の除算), e seu resultado é sempre um float. Isso vale mesmo quando a divisão é exata, então 9 / 3 não é 3, mas 3.0, e seu tipo também é float. Se você pensar que vira int por ser um cálculo entre inteiros, escolherá 3 e int; mas, quando você quer um int, precisa usar a divisão pelo piso (床除算) e escrever 9 // 3, que dá 3 e int. Combinações em que a aparência do valor e o tipo não coincidem, como 3 e float, ou 3.0 e int, não surgem dessa expressão.

Questão 12 | Divisão pelo piso de números negativos

Qual é a saída do programa a seguir, que reúne divisões pelo piso?

print(9 // 4)print(-9 // 4)
  1. Linha 1 é 2.0, linha 2 é -3.0
  2. Linha 1 é 2, linha 2 é -3
  3. Linha 1 é 2.25, linha 2 é -2.25
  4. Linha 1 é 2, linha 2 é -2
RespostaB. Linha 1 é 2, linha 2 é -3

A barra dupla, //, é a divisão pelo piso (床除算), e ela arredonda o quociente para baixo, ou seja, para o lado menor na reta numérica. Como 9 / 4 é 2.25, 9 // 4 é 2; e como -9 / 4 é -2.25, -9 // 4 não é -2, mas -3. O ponto-chave é que ela não arredonda em direção a 0; escolher -2 acontece se você pensar que ela trunca em direção a 0, como faz a linguagem C. 2.25 e -2.25 são os valores obtidos usando / em vez de //, e 2.0 e -3.0 são os valores obtidos se você misturar um operando float e escrever 9.0 // 4 — quando os dois lados são int, o resultado também é int.

Questão 13 | divmod

Que valor divmod(-11, 3) retorna?

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

divmod(a, b) retorna a tupla (タプル) (a // b, a % b). Como o // do Python arredonda para baixo, -11 // 3 se torna -4 e, como o sinal do resto acompanha o lado direito, -11 % 3 se torna 1. Portanto, a resposta é (-4, 1). Se você pensar em termos de truncamento em direção a 0, obterá um quociente de -3 e um resto de -2, resultando em (-3, -2), mas o Python não usa essa abordagem. O quociente e o resto sempre mantêm a relação de que o divisor vezes o quociente mais o resto é igual ao valor original, então você pode conferir com 3 vezes -4 mais 1 igual a -11. Conferindo com essa relação, nem (-3, 2) nem (-4, -2) voltam a -11.

Questão 14 | Truncamento com int

Qual é a saída do programa a seguir, que compara direções de truncamento?

print(int(-2.7))print(-2.7 // 1)
  1. Linha 1 é -2, linha 2 é -2.0
  2. Linha 1 é -3, linha 2 é -3.0
  3. Linha 1 é -2, linha 2 é -3.0
  4. Linha 1 é -3, linha 2 é -2.0
RespostaC. Linha 1 é -2, linha 2 é -3.0

A função embutida (組み込み関数) int() descarta a parte fracionária e arredonda em direção a 0, então int(-2.7) não se torna -3, mas -2. Já // arredonda para baixo, então -2.7 // 1 vai para -3 e, como há um operando float envolvido, o resultado também é um float, -3.0. Para números positivos, tanto int(2.7) quanto 2.7 // 1 vão para 2, então a diferença não aparece, mas, para números negativos, as direções se separam. Nenhum dos dois arredonda para o mais próximo, então, se você quiser transformar -2.7 em -3, deve usar round(-2.7).

Questão 15 | Erro com decimais

Qual é a saída do programa a seguir, que exibe valores booleanos em duas linhas?

print(0.1 + 0.7 == 0.8)print(round(0.1 + 0.7, 2) == 0.8)
  1. Linha 1 é False, linha 2 é False
  2. Linha 1 é True, linha 2 é True
  3. Linha 1 é True, linha 2 é False
  4. Linha 1 é False, linha 2 é True
RespostaD. Linha 1 é False, linha 2 é True

Como o float guarda decimais em binário, valores simples em decimal, como 0.1 ou 0.7, não podem ser representados exatamente. De fato, exibir 0.1 + 0.7 dá 0.7999999999999999, que é ligeiramente diferente de 0.8, então a linha 1 é False. A linha 2 arredonda para 2 casas decimais com round() antes de comparar, então os dois lados se tornam 0.8 e o resultado é True. Isso não é um defeito exclusivo do Python, mas uma propriedade do ponto flutuante binário (二進浮動小数点) do IEEE 754, a mesma razão pela qual 0.1 + 0.2 se torna 0.30000000000000004 e 1.1 + 2.2 se torna 3.3000000000000003. Evite comparações de igualdade entre floats; em vez disso, compare depois de arredondar para o número de dígitos necessário, compare a diferença absoluta com uma tolerância ou, em casos como valores monetários, em que a exatidão é necessária, use o módulo decimal.

Questão 16 | O arredondamento de round

Qual é a saída do programa a seguir, que exibe valores arredondados lado a lado em uma linha?

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
RespostaA. 2 2 4

O round() do Python arredonda para o par mais próximo, o chamado arredondamento bancário (銀行家の丸め). Somente para valores que estão exatamente no meio ele vai para o número par mais próximo, então 1.5 se torna 2, 2.5 se torna 2 e 3.5 se torna 4, dando a saída 2 2 4. O arredondamento ensinado na escola (四捨五入) daria 2 3 4, mas o Python não usa esse método. 1 2 3 é o valor obtido truncando simplesmente a parte fracionária, e 1 3 3 é o valor obtido arredondando para o lado ímpar; nenhum dos dois corresponde ao comportamento real. Observe que round() com o segundo argumento omitido retorna um int, enquanto especificar o número de dígitos, como em round(2.5, 0), retorna o float 2.0.

Questão 17 | bool é int

Qual é a saída do programa a seguir, que trata valores booleanos como números?

print(True + True)print(isinstance(True, int))
  1. Linha 1 é True, linha 2 é True
  2. Linha 1 é 2, linha 2 é False
  3. Linha 1 é 2, linha 2 é True
  4. Linha 1 é True, linha 2 é False
RespostaC. Linha 1 é 2, linha 2 é True

Como bool herda (継承) de int, True pode ser usado diretamente em operações numéricas como o inteiro 1, e False como o inteiro 0. True + True é 1 mais 1, dando 2, e isinstance(True, int) retorna True. Pensar que a linha 1 é True acontece se você confundir + com o OU lógico (論理和); o OU lógico do Python é or, e True or True é True. issubclass(bool, int) também é True, e sum([True, False, True]) se tornar 2 tem a mesma razão. Essa propriedade é muito usada para contar quantas condições foram satisfeitas.

Questão 18 | Precisão dos inteiros

Qual é a descrição correta do tipo int do Python 3?

  1. Não tem limite superior de dígitos e pode lidar com valores tão grandes quanto a memória permitir
  2. Valores acima de 32 bits podem estourar e se tornar negativos
  3. Um OverflowError é lançado quando o número de dígitos ultrapassa um limite superior
  4. Acima de 64 bits, ele é convertido automaticamente para float no cálculo
RespostaA. Não tem limite superior de dígitos e pode lidar com valores tão grandes quanto a memória permitir

O int do Python 3 tem precisão arbitrária (任意精度), sem limite superior de dígitos. 3 ** 40 é calculado exatamente como 12157665459056928801, valor que ultrapassa o intervalo de um inteiro de 64 bits com sinal, mas seu tipo continua sendo int. Ele também consegue lidar com um valor como 2 ** 1000 e, contando seus dígitos com len(str(2 ** 1000)), obtêm-se 302 dígitos. Como não é um inteiro de tamanho fixo como o da linguagem C, ele nunca estoura para um valor negativo, nem passa para float por conta própria. O OverflowError ocorre em situações como ultrapassar o intervalo que um float consegue representar; ele não é lançado só porque a quantidade de dígitos de um int aumenta. No entanto, mais dígitos significam mais tempo de cálculo e mais memória.

Questão 19 | Índices em bytes

Quais são a linha 1 e a linha 2 da saída do programa a seguir, que trata de uma sequência de bytes?

b = 'abc'.encode()print(b[0])print(b[0:1])
  1. Linha 1 é b'a', linha 2 é b'a'
  2. Linha 1 é 97, linha 2 é b'a'
  3. Linha 1 é 97, linha 2 é 97
  4. Linha 1 é a, linha 2 é b'a'
RespostaB. Linha 1 é 97, linha 2 é b'a'

Acessar bytes com um índice (添字) inteiro retorna o valor do byte naquela posição como um int. O primeiro byte de b'abc', que é 'abc' codificado em UTF-8, é o ponto de código (コードポイント) de 'a', então é 97. Já ao extrair uma fatia (スライス), retorna-se um objeto bytes de comprimento 1, então b[0:1] é b'a'. Com str, s[0] e s[0:1] dão a mesma str, 'a', então este é um ponto em que str e bytes contrastam. A exibição sair como b'a', e não como a, deve-se ao fato de print() mostrar bytes na forma repr; para convertê-lo de volta em string, use b.decode().

Questão 20 | Base numérica e caracteres

Qual é a saída do programa a seguir, que reúne conversão de base e conversão de código de caractere?

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
RespostaA. 10 0b1010 0xff 65

O segundo argumento de int() é a base (基数), então int('1010', 2) lê a string em base 2 e retorna 10. Pensar que sai como 1010, sem alteração, acontece se você deixar passar a base especificada. bin() retorna uma string com o prefixo 0b, '0b1010', e hex() retorna uma string em minúsculas com o prefixo 0x, '0xff'. Ela nunca vira maiúscula, 0xFF; quando você quiser notação em maiúsculas, use format(255, 'X'). ord() retorna o ponto de código (コードポイント) de um caractere, e o ponto de código do A maiúsculo é 65. 97 é o ponto de código do a minúsculo; a conversão inversa é chr(65), que devolve 'A'.

Questão 21 | Fatiamento

Qual é a saída do programa a seguir, que trata do fatiamento de strings?

s = 'Pythonic'print(s[2:5])print(s[-3:])
  1. Linha 1 é tho, linha 2 é nic
  2. Linha 1 é tho, linha 2 é ic
  3. Linha 1 é thon, linha 2 é nic
  4. Linha 1 é yth, linha 2 é nic
RespostaA. Linha 1 é tho, linha 2 é nic

s[2:5] extrai os elementos a partir do índice (添字) 2 até o índice 5, sem incluí-lo. Como o índice 2 de 'Pythonic' é t, os três caracteres t, h e o dão tho. Como a posição final não é incluída, não vira thon. Se você ler o índice como contado a partir de 1, como em "a partir do 2º caractere", escolherá yth, que corresponde a s[1:4]. s[-3:] usa um índice negativo, então conta a partir do final, tomando o 3º caractere a partir do final, n, como ponto de partida até o fim, dando nic. Ler -3 erroneamente como "até o 3º caractere a partir do final" leva a escolher ic, que corresponde a s[-2:]. Tendo em mente que os índices começam em 0 e que os índices negativos contam a partir do final, com -1 sendo o último, não há confusão.

Questão 22 | Fora do intervalo e in

Qual é a saída do programa a seguir, que exibe dois resultados de verificação?

s = 'Python'print(s[100:200] == '')print('py' in s)
  1. Linha 1 é True, linha 2 é False
  2. Linha 1 é True, linha 2 é True
  3. Linha 1 é False, linha 2 é True
  4. Linha 1 é False, linha 2 é False
RespostaA. Linha 1 é True, linha 2 é False

Uma fatia (スライス) não lança exceção mesmo que seu intervalo ultrapasse o comprimento da string; ela apenas retorna a parte que se sobrepõe. 'Python' tem só 6 caracteres, então s[100:200] se torna uma string vazia (空文字列), e compará-la com uma string vazia dá True. Isso contrasta com um índice isolado, s[100], que lançaria IndexError. Na linha 2, o operador in verifica a presença de uma substring, mas diferencia maiúsculas de minúsculas, então o 'py' minúsculo não está contido em 'Python' e dá False. 'Py' ou 'th' dariam True.

Questão 23 | Strings são imutáveis

Quando o programa a seguir é gravado em um arquivo e executado, o que acontece?

s = 'abc's[0] = 'z'print(s)
  1. Ocorre um TypeError e a atribuição falha
  2. É substituído por zbc e exibido
  3. Ocorre um IndexError e a atribuição falha
  4. É exibido sem alteração, como abc
RespostaA. Ocorre um TypeError e a atribuição falha

str é imutável (イミュータブル), ou seja, seu conteúdo não pode ser alterado depois de criado, então não é possível reescrever apenas um caractere usando um índice. s[0] = 'z' resulta em TypeError: 'str' object does not support item assignment, e a execução para ali, então nem o print é executado. IndexError é o que ocorre quando um índice está fora do intervalo, mas aqui 0 está dentro do intervalo válido, então isso é outra questão. Quando você quiser mudar o conteúdo, crie uma nova string e reatribua-a, como em s = 'z' + s[1:]. Uma lista é mutável (ミュータブル), então é possível reescrever um elemento da mesma forma.

Questão 24 | O valor de retorno de um método

Qual é a saída do programa a seguir, que chama métodos de string?

s = 'exam's.upper()print(s)print(s.replace('e', 'E'))
  1. Linha 1 é EXAM, linha 2 é Exam
  2. Linha 1 é EXAM, linha 2 é EXAM
  3. Linha 1 é exam, linha 2 é exam
  4. Linha 1 é exam, linha 2 é Exam
RespostaD. Linha 1 é exam, linha 2 é Exam

Um método de string (文字列メソッド) não reescreve a string original; ele cria e retorna uma nova string. Na linha 2, s.upper() cria 'EXAM', mas, como não é atribuído a nada, esse valor é descartado e s continua sendo 'exam'. Assim, print(s) exibe exam. A linha 4 exibe diretamente o valor de retorno de s.replace('e', 'E'), então sai Exam, mas isso também não altera o próprio s. Para guardar o resultado, reatribua, como em s = s.upper(). Isso contrasta com um método como o sort() de uma lista, que reordena no próprio lugar e retorna None.

Questão 25 | f-string

Qual é a saída do programa a seguir, que exibe valores com um formato especificado?

n = 2.71828print(f'{n:.2f}')print(f'{"ok"!r}')
  1. Linha 1 é 2.71, linha 2 é 'ok'
  2. Linha 1 é 2.72, linha 2 é ok
  3. Linha 1 é 2.718, linha 2 é ok
  4. Linha 1 é 2.72, linha 2 é 'ok'
RespostaD. Linha 1 é 2.72, linha 2 é 'ok'

O especificador de formato (書式指定) da f-string :.2f arredonda para 2 casas decimais na exibição, então 2.71828 se torna 2.72. Como não é truncamento, não vira 2.71, e 2.718 é o valor que se obteria com :.3f. Na linha 2, !r é um especificador de conversão (変換指定) que exibe o valor na forma repr(). Usado em uma string, ele acrescenta aspas, dando 'ok'; sem !r, sai apenas ok. A sintaxe do especificador de formato é compartilhada com str.format(), então escrever '{n:.2f}'.format(n=2.71828) dá o mesmo 2.72.

Questão 26 | split

Qual é a saída do programa a seguir, que divide strings?

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

Chamar split() sem argumentos trata sequências de espaços em branco consecutivos como um único separador e não cria elementos vazios. Assim, 'a b c'.split() se torna a lista de 3 elementos ['a', 'b', 'c']. Quando você especifica o separador explicitamente e escreve 'a b c'.split(' '), a divisão é feita a cada espaço, então sobra uma string vazia, resultando na lista de 4 elementos ['a', 'b', '', 'c']. O segundo argumento é maxsplit, que representa o limite superior do número de divisões; passar 1 divide apenas na primeira vez, dando ['a', 'b,c'], com o restante mantido sem divisão como um só elemento. Omiti-lo divide tudo, dando ['a', 'b', 'c'].

Questão 27 | strip

Qual é a saída do programa a seguir, que remove caracteres das duas extremidades?

print('xxabxx'.strip('x'))print('xxabxx'.lstrip('x'))
  1. Linha 1 é abxx, linha 2 é ab
  2. Linha 1 é ab, linha 2 é abxx
  3. Linha 1 é xabx, linha 2 é abxx
  4. Linha 1 é ab, linha 2 é xxab
RespostaB. Linha 1 é ab, linha 2 é abxx

O argumento de strip() é "um conjunto de caracteres a remover" (取り除く文字の集合), e ele continua removendo das duas extremidades enquanto houver caracteres desse conjunto. Não se trata de remover uma única ocorrência da substring 'x', então 'xxabxx'.strip('x') elimina todos os x das duas extremidades, dando ab. Se você pensar que ele remove apenas um caractere de cada vez, escolherá xabx. lstrip() atua apenas na extremidade esquerda, dando abxx, e rstrip() apenas na direita, dando xxab. Omitindo o argumento, são removidos os caracteres de espaço em branco. Como o argumento é tratado como um conjunto, escrever 'xxabxx'.strip('xa') elimina o xx inicial e também o a, deixando apenas b.

Questão 28 | join e repetição

Qual é a saída do programa a seguir, que une strings?

print('-'.join('abc'))print('ab' * 3)
  1. Linha 1 é -a-b-c-, linha 2 é ababab
  2. Linha 1 é abc, linha 2 é ababab
  3. Linha 1 é a-b-c, linha 2 é ab ab ab
  4. Linha 1 é a-b-c, linha 2 é ababab
RespostaD. Linha 1 é a-b-c, linha 2 é ababab

join() usa a string que o chama como separador, unindo cada elemento do iterável (反復可能オブジェクト) recebido. Uma string também é um iterável do qual se pode tirar um caractere de cada vez, então '-'.join('abc') une 'a', 'b' e 'c' com hífens, dando a-b-c. O separador é inserido apenas entre os elementos, e não antes nem depois, então não vira -a-b-c-. Obter abc, sem separador, acontece se você escrever ''.join('abc'). O operador * repete uma string um número especificado de vezes, então 'ab' * 3 dá ababab, sem espaço inserido entre as repetições. Se você quiser ab ab ab, escreva ' '.join(['ab'] * 3).

Questão 29 | find e index

Qual é a saída do programa a seguir, que procura uma substring?

print('banana'.find('z'))print('banana'.index('n'))
  1. Linha 1 é -1, linha 2 é 2
  2. Linha 1 é -1, linha 2 é 3
  3. Linha 1 é -1, linha 2 é 4
  4. Linha 1 é 0, linha 2 é 2
RespostaA. Linha 1 é -1, linha 2 é 2

find() retorna -1 quando a substring (部分文字列) não é encontrada, e não lança exceção. Não há 'z' em 'banana', então o resultado é -1. 0 é o valor quando ela é encontrada logo no início, então cuidado para não confundir isso com o caso de não ser encontrada. index() é igual a find() no sentido de retornar a posição em que foi encontrada; a primeira ocorrência de 'n' em 'banana' está no índice 2, então o resultado é 2. Obter 3 acontece se você contar o índice a partir de 1 e lê-lo como "o 3º caractere", e 4 é a posição da última ocorrência, que você obteria com rfind() ou rindex(). A única diferença entre os dois é o que acontece quando não se encontra: index() lança ValueError: substring not found e interrompe o processamento.

Questão 30 | Strings brutas

Qual é a saída do programa a seguir, que conta caracteres?

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

Em uma string bruta (raw文字列), criada colocando r antes do literal, a barra invertida não é interpretada como o início de uma sequência de escape (エスケープ). r'a\nb' são os 4 caracteres a, barra invertida, n e b, então seu len é 4. Já na string comum 'a\nb', \n é substituído por um único caractere de quebra de linha, então são os 3 caracteres a, quebra de linha e b, dando um len de 3. Contar os dois como escapes dá 3 3, e contar os dois como caracteres brutos dá 4 4, mas o ponto-chave é que a presença de r muda o tratamento. Mesmo com r, o tipo continua sendo uma str comum; não se torna um tipo especial. Observe que len('\\') é 1, pois são necessárias duas barras invertidas para escrever um único caractere de barra invertida literal.

Prática: responda às perguntas desta página

Esta é uma ferramenta de prática com perguntas em ordem aleatória (funciona quando o JavaScript está ativado). Mesmo sem ela, você pode ler todas as perguntas e explicações acima.

* As explicações são informações para fins de estudo. O conteúdo e o sistema dos exames mudam de ano para ano, por isso confira sempre os comunicados oficiais da entidade organizadora.

Esta página é uma tradução do texto original em japonês. Em caso de diferença entre a tradução e o original, prevalece a versão em japonês. Esta tradução foi feita com IA e pode conter erros. Informar um erro de tradução Ver o original em japonês